Ctrl-Backspace dan Ctrl-Delete di bash

14

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?

serigala-revo-kucing
sumber
1
Shell Anda mungkin mendukung tindakan tersebut, yang dapat diikat ke kunci yang diberikan.
Thomas Dickey
@ThomasDickey: Saya menggunakan bash. Tidak apa-apa jika berfungsi hanya dalam bash.
wolf-revo-cats

Jawaban:

27

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 werasetindakan 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 mengetik cattanpa 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 melalui stty werase), dan backward-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 setel stty werase, dan sebaliknya letakkan baris berikut di Anda .inputrc:

"\C-h": backward-kill-word

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-wordyang terikat ke M-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 adalah

"\e[3;5~": kill-word

Jika Anda tidak puas dengan salah satu definisi kata, Anda dapat memberikannya sendiri di bash: lihat perilaku membingungkan dari ikatan kunci gaya emacs di bash

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
penjelasan yang sangat baik! Itu Ctrl+Delbekerja dengan baik. Namun, saya tidak bisa mulai Ctrl+Backspacebekerja. Untuk Ctrl+v, Ctrl+Backspaceterminal saya kata ^?. Apa yang harus saya masukkan .inputrc? Terima kasih
Ciprian Tomoiagă
3
@CiprianTomoiaga "\C-?": backward-kill-wordatau 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.
Gilles 'SANGAT berhenti menjadi jahat'
4
Penting untuk dicatat bahwa mendefinisikan ~/.inputrcmenonaktifkan default /etc/inputrc. untuk memperbaikinya, Anda harus memasukkan file itu: $include /etc/inputrc(dari sini )
Ciprian Tomoiagă
+1 untuk Esc + Backspace
Celal Ergün
6

Mencoba

alt+backspace

Di OS dasar ini berfungsi seperti yang Anda inginkan (seperti ctrl+ backspace)

Ahmed Elkoussy
sumber
1

Perilaku karakter WERASE dalam pemrosesan terminal mode dimasak adalah hardcode , setidaknya di Linux:

           if (kill_type == WERASE) {
                   /* Equivalent to BSD's ALTWERASE. */
                   if (isalnum(c) || c == '_')
                           seen_alnums++;
                   else if (seen_alnums)
                           break;
           }

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 :

Kata-kata terdiri dari huruf dan angka.

Tetapi ini sepertinya tidak sesuai dengan apa yang bashsebenarnya terjadi pada saya: foo+bar^Wmenghapus semuanya, bukan hanya bar. Ada informasi lebih lanjut tentang itu di sini .

Celada
sumber
1. vi pengguna mungkin hanya mencari backward-kill-word(pengikatan default M-DEL) alih-alih unix-word-rubout.
Gilles 'SO- stop being evil'