Bastr'de Ctrl-Backspace ve Ctrl-Delete


14

Debian'ı Kurma 8.3

stty werase '^H'

veya Arch Linux 2/2016'da

stty werase '^?'

in .bashrc(örneğin) yapar Ctrl- Backspaceterminaldeki son sözcüğü siler. Yine de modern GUI uygulamalarında olduğu gibi aynı davranış değildir (örn. Firefox): Son boşluk- ayrılmış sözcüğü siler, boşluk veya karakterlerle ayrılmış son sözcüğü silmez . : , ; " ' & / ( ).

Bunu yapmak mümkün mü Ctrl- Backspacedavranacaksan Modern GUI uygulamalarına terminali benzer mi? Ayrıca yapmak için herhangi bir yol yoktur Ctrl- Deleteimlecin hemen önce kelimesini silin?


1
Kabuğunuz belirli bir anahtara bağlı olabilecek eylemleri destekleyebilir.
Thomas Dickey

@ThomasDickey: Ben bash kullanıyorum. Sadece bash'da çalışıyorsa sorun yok.
wolf-revo-cats

Yanıtlar:


27

Burada iki çizgi editör vardır: çekirdek tarafından sağlanan temel çizgi editörü (kanonik mod tty line editörü) ve bash'ın line editörü (readline kütüphanesi aracılığıyla uygulanır). Her ikisinde de varsayılan olarak Ctrl+ işaretine bağlı olan bir önceki kelimeyi sil komutu bulunur W. Anahtar, kanonik mod tty satır düzenleyicisi için stty werase; bash, kendi yapılandırmasında geçersiz kılınmadıkça, tty ayarında bulduğu anahtar bağlamayı taklit eder.

weraseTty düzenleyicide eylem yapılandırılamaz. Her zaman boşlukla sınırlandırılmış kelimeleri (ASCII) siler. Tty line editörü ile etkileşim kurmak nadirdir - örneğin catargüman olmadan yazdığınızda elde edeceğiniz şey budur . Orada süslü tuş bağlamaları istiyorsanız, komutu readline kullanan rlwrap gibi bir aracın altında çalıştırabilirsiniz .

Bash , önceki kelimeyi silmek için iki komut sağlar : unix-word-rubout( Ctrl+ wveya üzerinden ayarlandığı gibi stty werase) ve backward-kill-word( M-DELyani Esc Backspace) bir kelimeyi geçerli yerel ayardaki alfasayısal karakter dizisi olarak ele alır ve_ . Ctrl+ Backspace'Nın önceki alfasayısal karakter dizisini silmek istiyorsanız , ayarlamayın stty weraseve bunun yerine aşağıdaki satırı ekleyin .inputrc:

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

Bu terminali için Ctrl + H karakterini gönderdiği varsayar Not Ctrl+ Backspace. Ne yazık ki, standart bağları olmayan anahtarlardan biridir (ve Backspaceözellikle tarihsel nedenlerden dolayı bir karmaşa ).

Varsayılan kill-wordolarak M-d( Alt+ D) işaretine bağlı simetrik bir komut da vardır . Ctrl+ İşaretine bağlamak için Deleteönce terminalinizin hangi kaçış dizisini gönderdiğini bulmanız, sonra da ilgili bir satırı eklemeniz gerekir .inputrc. Tür Ctrl+ Vsonra Ctrl+ Delete; bu ^[[3;5~, ilk ^[harfin kaçış karakterinin görsel bir temsili olduğu gibi bir şey ekleyecektir . Sonra bağlama

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

Bir sözcüğün her iki tanımından da memnun değilseniz, bash'de kendi sözcüğünüzü sağlayabilirsiniz: bash'de emacs tarzı tuş bağlamalarının kafa karıştırıcı davranışına bakın


2
mükemmel açıklama! İyi Ctrl+Delçalıştı. Ancak, Ctrl+Backspaceiş bulamıyorum. İçin Ctrl+v, Ctrl+Backspacebenim terminali diyor ^?. Ne koymalıyım .inputrc? Thank you
Ciprian Tomoiagă

3
@CiprianTomoiaga "\C-?": backward-kill-wordveya istediğiniz readline işlevi. Ancak, Ctrl + Backspace için yalnızca farklı karakterler gönderdikleri takdirde Backspace için olandan farklı bir ciltleme tanımlayabilirsiniz. Terminaliniz ^?Backspace ve Ctrl + Backspace için gönderirse , terminalde çalışan uygulamanın bunları ayırt etmesinin bir yolu yoktur. Bazı terminaller yapılandırılabilir (örn. Xterm, urxvt), diğerleri (örn. VTE tabanlı terminal emülatörleri) yapamaz.
Gilles 'SO- kötü olmayı bırak'

4
tanımlamanın ~/.inputrcvarsayılan ayarı devre dışı bıraktığına dikkat etmek önemlidir /etc/inputrc. bunu düzeltmek için şu dosyayı eklemeniz gerekir: $include /etc/inputrc( buradan )
Ciprian Tomoiagă

Esc + Backspace için +1
Celal Ergün

7

Deneyin

alt+backspace

Temel işletim sisteminde istediğiniz gibi çalışır (tıpkı ctrl+ gibi backspace)


1

Pişmiş mod terminali işlemedeki WERASE karakterinin davranışı , en azından Linux'ta sabit kodlanmıştır :

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

Yani kelimeler harf, rakam ve alt çizgi. Kendi pişmiş mod işlemeyi yapan bir uygulama çalışmadığında, Linux üzerindeki bir terminalde her zaman böyle olacaktır.

readline'ın sürümü (bash ve diğerleri tarafından kullanılır) çekirdeğin sürümünden biraz farklı görünüyor, ancak aynı zamanda sabit kodlanmış gibi görünüyor :

Kelimeler harf ve rakamlardan oluşur.

Ama bu bashbenim için gerçekte ne yaptığına benzemiyor : foo+bar^Wsadece değil, her şeyi siler bar. Burada daha fazla bilgi var .


1. vi kullanıcı muhtemelen yerine backward-kill-word(varsayılan ciltleme M-DEL) arıyor unix-word-rubout.
Gilles 'SO- kötü olmayı bırak'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.