Membalik pencarian riwayat di bash diikuti oleh tombol panah menyebabkan kursor ditampilkan di lokasi yang salah

10

Saya perhatikan bahwa berkali-kali ketika saya membalikkan pencarian sejarah dari baris perintah melalui CTRL+ r, jika saya ingin mengedit perintah, kadang-kadang kursor melompat ke posisi yang salah ketika saya menekan tombol panah atau memasukkan CTRL+ aatau CTRL+ e. Posisi spesifik yang dilompati tampaknya merupakan offset yang sama dengan ukuran prompt baris perintah saya sebagaimana diatur dalam PS1.

Ini menyebabkan kesulitan karena lokasi sebenarnya dari kursor berbeda dari apa yang ditampilkan di layar; pengeditan selanjutnya pada perintah diberikan seolah-olah kursor adalah tempat lompatannya, tetapi perintah aktual mempertahankan lokasi yang benar tanpa lompatan apa pun.

Adakah yang tahu apa yang menyebabkan ini atau bagaimana cara memperbaikinya?

EDIT: Jika saya menambahkan baris baru di akhir PS1masalah sepertinya hilang. Namun, saya lebih suka memasukkan perintah pada baris yang sama dengan prompt.

jonderry
sumber

Jawaban:

6

Ini sering disebabkan oleh perintah dalam riwayat Anda yang lebih dari 1 baris. Ketika Anda memilih item yang lebih pendek dari histori, sepertinya tidak memperhitungkan lebar prompt dalam rendering ulang baris perintah, jadi semuanya setelah perintah panjang itu kacau.

Solusi mudah yang saya temukan adalah dengan menekan tombol home, masukkan "echo" dan tekan enter. Kemudian ingat perintah terakhir dan edit dari sana. (Pertama menghapus gema. :)

taksi
sumber
Terima kasih, saya benar-benar mencobanya beberapa saat yang lalu. Dalam kasus saya, saya ceroboh dan meniup file karena ada pipa dalam perintah yang menelan gema. Anda benar, ini sepertinya hanya memengaruhi perintah panjang menurut eksperimen saya.
jonderry
Solusi yang lebih baik daripada gema yang baru saja saya temukan: Tambahkan '#' ke awal baris daripada gema. Dengan cara ini bash memperlakukan seluruh baris seperti komentar.
jonderry
1
Namun lebih baik: masalahnya tampaknya hilang jika garis saat ini digambar ulang. Baik Cl untuk menghapus layar dan menggambar ulang garis saat ini atau membuat kunci yang mengikat untuk fungsi yang tidak terikat redraw-arus-garis.
jonderry
Saya lupa menyebutkan solusi Cl karena saya benar-benar benci kehilangan buffer gulir, tapi ya, ini adalah kesalahan rendering sementara dari navigasi riwayat, jadi memaksa redraw akan memperbaikinya. redraw-current-line terdengar seperti solusi yang lebih baik!
cabbey
13

Mungkin Anda memiliki urutan pelarian non-cetak di PS1 yang tidak disertakan dalam \ [dan \].

Pastikan Anda melampirkan semuanya seperti ini:

\[\e[33m\]\w\[\e[31m\] $ \[\e[0m\]
Aleksandr Somov
sumber
1
Berfungsi bagus jika Anda hanya menyertakan urutan non-cetak di \[dan \](jadi Anda perlu beberapa grup dari kutipan blok ini)
Andomar