Bash: dapatkah saya mengatur Ctrl-Backspace untuk menghapus kata mundur?

19

Ketika di shell (bash) - Saya ingin Ctrl-Backspace diikat ke "delete word backward". Apa itu mungkin?

Edit :

Saya menggunakan konsole- terminal di KDE.

Adobe
sumber
2
Pertanyaannya lurus ke depan, jangan mengeluh tentang itu. Saya hanya ingin berkomentar bahwa sering kali bernilai banyak untuk memfasilitasi ikatan standar "standar" yang sudah ada di banyak aplikasi, alih-alih menyesuaikannya tanpa keuntungan nyata dan kepastian tidak pernah melihat perilaku pada sistem asing. Ctrl+wadalah apa yang Anda harus terbiasa, imho.
Daniel Andersson
@ Daniel Andersson: atau sebagai alternatif - Anda dapat mengembangkan cara untuk mentransfer pengaturan Anda ke mesin asing.
Adobe
Berbagi dotfile adalah masalah yang sudah dipecahkan, tetapi itu tidak banyak membantu selain komputer lokal yang kurang lebih di mana Anda memiliki hak istimewa yang cukup terbuka. Jika Anda menggunakan sistem asing, kemungkinan besar Anda tidak memiliki kebebasan untuk mengkonfigurasi ulang hal-hal seperti itu (setidaknya tidak dihancurkan oleh kolega yang juga menggunakan mesin yang sama :-)). Juga, setiap aplikasi baru akan membutuhkan perawatan khusus.
Daniel Andersson
6
Saya memiliki masalah terbalik, saya terbiasa dengan Ctrl-w"hapus kata sebelumnya" di konsol, dan lakukan dengan insting bahkan di Eclipse atau Chrome yang artinya tutup tab / tutup file saat ini. Cukup mengganggu.
Ezequiel Muns
1
Saya memiliki masalah yang sama dengan Chrome SShInATab. Bagaimana saya melakukan ctrl-W tanpa ctrl-W? :)
Riccardo SCE

Jawaban:

11

Mengapa tidak menggunakan Alt+ Backspaceatau Ctrl+ Wyang sudah dipetakan di sebagian besar terminal. Tidak yakin tentang Konsol. Xmodmap (man xmodmap) dapat digunakan untuk memetakan kembali kunci khusus lainnya. (Paradoksnya, xmodmap tidak dapat memetakan kembali Spasied dengan sangat baik karena terminal menimpa pemetaan, tetapi ia bekerja dengan baik dengan sebagian besar kunci ...).

hellork
sumber
9
Karena saya terbiasa dengan Ctrl-Backspace di Emacs saya. Saya tahu tentang Ctrl-w. Alt-Backspace baru bagi saya (+1).
Adobe
1
Poin bagus, @hellork. Anda dapat mencegat control + backspace di server X (melalui xmodmap) dan memetakannya ke beberapa karakter yang tidak digunakan (seperti alt-backspace).
4
Yang mengganggu tentang hal ini adalah ctrl + backspace adalah pemetaan yang sangat umum untuk "hapus kata mundur" di sebagian besar aplikasi GUI pada sebagian besar sistem operasi utama. Demikian juga, Ctrl + W tersebar luas untuk "tutup jendela". Alt + w jarang digunakan untuk apa pun di GUI, yang bisa saya pikirkan. Standarisasi akan bagus. Saya bertanya-tanya apa gangguan yang lebih besar, mengubah terminal, atau mengubah GUI?
naught101
1
Oh ya, Control-W sudah menjadi kunci penghapusan kata default pada terminal unix. Ya itu bertentangan dengan konvensi Windows / GUI, tetapi sebenarnya itu datang lebih dulu - bertahun-tahun. Salahkan Microsoft!
alexis
11

Saya menemukan utas ini melalui google, tetapi jawabannya bukan yang ingin saya dengar. Jadi saya bermain-main:

Di terminal saya, backspace normal mengirim ^H, sementara ctrl + backspace mengirim ^?. Jadi seharusnya sederhana menjadi kasus rebinding ^?untuk menghapus kata, yang secara default tersedia melalui Ctrl + W.

Pertama (percobaan yang gagal):

$ bind -P | grep 'C-w'
unix-word-rubout can be found on "\C-w".

Jadi karena itu ini harus bekerja:

$ bind '"\C-?":unix-word-rubout'

Namun itu tidak ... ada yang bisa menjelaskan?

Percobaan kedua (berhasil):

$ bind '"\C-?":"^W"'

Di mana ^Wliteral / mentah ^W(tekan ctrl + V lalu ctrl + W untuk membuatnya muncul).

daurnimator
sumber
Solusi pertama Anda berhasil bagi saya, sebenarnya! Kedua tidak.
Drew Hoskins
Percobaan kedua tampaknya menggantikan backspace itu sendiri daripada Ctrl-Backspace?
user541686
7

Edit saja ~/.inputrc(Anda mungkin perlu membuat atau menyalin yang /etc/inputrcada di sana) sehingga mengandung:

# Ctrl-Delete: delete next word
"\e[3;5~": shell-kill-word

# Ctrl-Backspace
"\C-H": shell-backward-kill-word

Ini juga akan memetakan Ctrl+ Deleteuntuk menghapus kata di sebelah kursor.

Treviño
sumber
Tidak bekerja untuk saya.
Jonathan
6

Ada beberapa jawaban yang bagus di sini, tetapi saya menyelesaikannya di Konsole dengan Pengaturan-> Edit Profil Saat Ini-> Keyboard-> Edit, kemudian tambahkan pemetaan dari Backspace+Controlke \x17. (Saya menemukan kode ASCII untuk Ctrl-w menggunakan showkey --ascii.)

Braden Anderson
sumber
Terima kasih telah menunjukkan masalahnya showkey. Jadi saya menemukan bahwa ALT+Duntuk menghapus kata di depan kursor akan sesuai \x1b\x64.
loki
Terima kasih, itu menyelesaikan masalah saya. Dalam kasus saya, saya perlu memetakan ulang Alt + Backspace dan urutannya \x1b\x7f.
DDMC
3

Itu tergantung pada apa yang dilihat bash. Pada interaksi terminal reguler, bash tidak melihat pengubah tombol apa yang Anda tekan, hanya karakter yang dihasilkan. Backspace sudah sama dengan control-H, misalnya. Menahan shift atau kontrol tidak ada bedanya.

NAMUN, aplikasi terminal Anda (xterm? Cmd? Terminal? Putty? Tergantung pada OS Anda) dapat melihat penekanan tombol Anda, dan mungkin memiliki cara untuk memetakan kombinasi tombol kontrol-mundur ruang ke sesuatu yang oleh bash dapat membedakan dari backspace.

Alexis
sumber
Saya menemukan bahwa bash saya tidak melihat backspace. Tapi mungkin itu membuatnya melihatnya.
Adobe
@ adobe, apa maksudmu? Ketik 'stty' di terminal Anda dan kemudian baca manual tentang itu. Jika ^ H disetel menjadi karakter hapus Anda, Anda dapat mengaturnya ke sesuatu yang lain ... jika Anda memiliki alasan yang bagus.
1
Ada contoh yang baik tentang bagaimana melakukan ini di github.com/calj/gtconf/blob/master/zsh/zshrc . Konsole memungkinkan Anda melakukannya. Salin salah satu file * .keytab dari / usr / share / kde4 / apps / konsole / ke ~ / .kde / share / apps / konsole dan modifikasi dengan saran di tautan di atas, hapus baris "key Backspace" dan menambahkan: key Backspace-Shift-Control : "\x7f"dan key Backspace-Shift+Control : "\E[9;3~"Juga mengubah baris judul saat Anda berada di:, keyboard "Xfree4 Modlist"misalnya. Anda kemudian dapat menambahkan "\e[9;3~": backward-kill-word"ke ~ / .inputrc
Adam
2

Coba ini:

bind '"\C-_":backward-kill-word'

Secara opsional tambahkan yang berikut ke ~ / .inputrc untuk membuatnya permanen:

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

Bekerja pada bash 4.3.11 di Kubuntu 14.04

Fitzy
sumber
2
Control-backspace tidak mungkin sama dengan Control-underscore.
Thomas Dickey
1
Dari semua hal yang saya coba di utas ini, ini berhasil! Menggunakan "GNU bash, versi 4.3.48 (1) -release (x86_64-pc-linux-gnu)" di bash di windows / WSL
Markus Jevring
Ini berfungsi baik bagi saya di cygwin, menggunakan GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin).
zagyi
1

Dalam Konsole:

  • klik Settings -> Edit current profile
  • klik tab 'Keyboard' -> [Edit...]
  • klik [Add]tombol dan di bawah Key Combinationjenis kolom Backspace+Ctrl. Dalam Outputjenis kolom 0x08(yang secara konvensional merupakan karakter backspace)

Sekarang Anda harus dapat memetakan kunci itu backward-kill-wordmelalui

# ~/.bashrc

bind '"\x08":backward-kill-word'
aaaaaa
sumber
Terima kasih. Bekerja untuk saya, setidaknya di xfce4-terminal.
limon
0

Pada sebagian besar terminal, CTRL + W seharusnya sudah menghapus sebuah kata mundur. Ini berfungsi dengan xterm dan saya kira itu bekerja dengan konsole. CTRL + W adalah kunci standar yang mengikat pada program berbasis teks yang akan bekerja dengan vim dalam mode insert, emacs, dan setiap shell.


sumber
5
Saya telah Ctrl-w diikat ke "tutup tab" di Emacs, FireFox, Krusader - jadi saya mengaturnya untuk menjadi kombinasi penutupan tab di Konsole juga.
Adobe