Mengenakan Debian 8.3
stty werase '^H'
atau di Arch Linux 2/2016
stty werase '^?'
di .bashrc
(misalnya) make Ctrl- Backspacehapus kata terakhir di terminal. Tetap saja itu bukan perilaku yang sama seperti dalam aplikasi GUI modern (mis. Firefox): Ini menghapus kata spasi terpisah -terpisah, dan bukan kata terakhir yang dipisahkan oleh spasi putih atau karakter seperti . : , ; " ' & / ( )
.
Apakah mungkin untuk membuat Ctrl- Backspaceberperilaku dalam mirip terminal untuk aplikasi GUI modern? Juga, apakah ada cara untuk membuat Ctrl- Deletemenghapus kata segera sebelum kursor?
bash
terminal
keyboard-shortcuts
line-editor
serigala-revo-kucing
sumber
sumber
Jawaban:
Ada dua editor baris yang dimainkan di sini: editor baris dasar yang disediakan oleh kernel (editor mode tty line), dan editor baris bash (diimplementasikan melalui perpustakaan readline). Keduanya memiliki perintah hapus-ke-kata sebelumnya yang terikat ke Ctrl+ Wsecara default. Kunci dapat dikonfigurasikan untuk editor tty line mode kanonik melalui
stty werase
; bash meniru pengikatan kunci yang ditemukan dalam pengaturan tty kecuali diganti dalam konfigurasinya sendiri.The
werase
tindakan dalam baris editor tty tidak dapat dikonfigurasi. Itu selalu menghapus (ASCII) kata-kata yang dibatasi spasi. Jarang berinteraksi dengan editor baris tty - itulah yang Anda dapatkan misalnya ketika Anda mengetikcat
tanpa argumen. Jika Anda ingin binding kunci mewah di sana, Anda dapat menjalankan perintah di bawah alat seperti rlwrap yang menggunakan readline.Bash menyediakan dua perintah untuk menghapus kata sebelumnya :
unix-word-rubout
( Ctrl+ watau sebagaimana diatur melaluistty werase
), danbackward-kill-word
(M-DEL
, yaitu Esc Backspace) yang memperlakukan kata sebagai urutan karakter alfanumerik di lokal saat ini dan_
. Jika Anda ingin Ctrl+ Backspacemenghapus urutan karakter alfanumerik sebelumnya, jangan setelstty werase
, dan sebaliknya letakkan baris berikut di Anda.inputrc
:Perhatikan bahwa ini mengasumsikan bahwa terminal Anda mengirimkan karakter Ctrl + H untuk Ctrl+ Backspace. Sayangnya itu salah satu kunci tanpa ikatan standar (dan Backspacekhususnya berantakan karena alasan historis).
Ada juga perintah simetris
kill-word
yang terikat keM-d
( Alt+ D) secara default. Untuk mengikatnya ke Ctrl+ Delete, pertama-tama Anda harus mencari tahu urutan keluar apa yang dikirim terminal Anda, kemudian tambahkan baris yang sesuai di Anda.inputrc
. Ketik Ctrl+ Vlalu Ctrl+ Delete; ini akan memasukkan sesuatu seperti di^[[3;5~
mana inisial^[
adalah representasi visual dari karakter escape. Maka yang mengikat adalahJika Anda tidak puas dengan salah satu definisi kata, Anda dapat memberikannya sendiri di bash: lihat perilaku membingungkan dari ikatan kunci gaya emacs di bash
sumber
Ctrl+Del
bekerja dengan baik. Namun, saya tidak bisa mulaiCtrl+Backspace
bekerja. UntukCtrl+v, Ctrl+Backspace
terminal saya kata^?
. Apa yang harus saya masukkan.inputrc
? Terima kasih"\C-?": backward-kill-word
atau fungsi readline apa pun yang Anda inginkan. Tetapi Anda hanya dapat mendefinisikan ikatan untuk Ctrl + Backspace yang berbeda dari mengikat untuk Backspace jika mereka mengirim karakter yang berbeda. Jika terminal Anda mengirim^?
untuk Backspace dan Ctrl + Backspace, maka aplikasi yang berjalan di terminal tidak memiliki cara untuk membedakannya. Beberapa terminal dapat dikonfigurasi (mis. Xterm, urxvt), yang lain (mis. Emulator terminal berbasis VTE) tidak bisa.~/.inputrc
menonaktifkan default/etc/inputrc
. untuk memperbaikinya, Anda harus memasukkan file itu:$include /etc/inputrc
(dari sini )Mencoba
alt+backspace
Di OS dasar ini berfungsi seperti yang Anda inginkan (seperti ctrl+ backspace)
sumber
Perilaku karakter WERASE dalam pemrosesan terminal mode dimasak adalah hardcode , setidaknya di Linux:
Jadi kata-kata adalah huruf, angka, dan garis bawah. Ini adalah cara yang akan selalu ada di terminal di Linux ketika aplikasi yang melakukan pemrosesan mode yang dimasak sendiri tidak berjalan.
versi readline (digunakan oleh bash dan lain-lain) tampaknya sedikit berbeda dari versi kernel, tetapi juga tampaknya hardcoded :
Tetapi ini sepertinya tidak sesuai dengan apa yang
bash
sebenarnya terjadi pada saya:foo+bar^W
menghapus semuanya, bukan hanyabar
. Ada informasi lebih lanjut tentang itu di sini .sumber
backward-kill-word
(pengikatan defaultM-DEL
) alih-alihunix-word-rubout
.