Geri-kill kelimesini Ctrl + w'ye bağlama


23

Uzun süredir Tcsh kullanımından Bash'in yakın zamanda keşfedilmesine geçmeye çalışıyorum.

Boşlukları ve eğik çizgileri kelime sınırları olarak ele alan, büyük olasılıkla geriye dönük-öldürme kelimesi olan Ctrl + w hariç tüm favori özelliklerimde bağlantı kurmayı başardım. Ancak Bash'de readline, ilk boşluğa kadar siler, aralarındaki tüm boşlukları siler.

Her ikisi de .inputrc ve .bashrc'deki birçok Cd: backward-kill-word kombinasyonunu denedim, ancak bind kullandım ancak istediğim gibi çalışmasını sağlayamıyorum.

Yeterince komik, iş yerindeki Windows'tan Macun üzerinden Alt + Backspace'i kullanabilirim, bu da kılavuzun istediğim tam davranışı üretmek için varsayılan ciltleme olduğunu söyler. Ancak Mac'imdeki evdeki Terminal.app'ta bu çalışmıyor. Aynı Terminal.app'dan giriş yaptığım FreeBSD ya da Linux serverlar için de geçerli.

Bu yüzden yardım almak için süper kullanıcıya gidiyorum.

Yanıtlar:


40

readlinebağlanmıyor Ctrl- Wterminal sürücüsü tarafından varsayılan olarak kullanıldığı için:

$ stty -a
(...) werase = ^W; (...)

Bunu devre dışı bırakmak için (in ~/.bashrc) çalıştırmanız gerekir :

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrcCtrl- Whala atandığında - okunduğundan beri burada yardımcı olmayacaktır werase.

Ayrıca, \C-wbiçim tuşlarının yukarıdaki gibi çift tırnak içine alınması gerektiğini de unutmayın .


Farklı terminaller işleyebilir Alt- Backspacefarklı şekilde.

  • PuTTY ve GNOME Terminali (varsayılan ayarlarla) send 1b 7f( ESC DEL)
  • Xterm ile metaSendsEscape: truegönderir 1b 08( ESC BS).
  • Xterm olmadan metaSendsEscape gönderir 88( HTSveya BSen yüksek bit kümesiyle).

Xterm, Alttuşun davranışını kontrol etmek için birkaç ayara sahiptir ( Metagenel olarak Xterm ve X11 olarak adlandırılır ). İle metaSendsEscapetutma Alt, tuşa basışını ESC(hex 1b) ile ön ekleyecektir . Ayar olmadan (varsayılan mod), Altgiriş karakterinin en yüksek bitini ayarlayarak özel karakterlerle sonuçlanacaktır. (Örneğin, Alt- Nsonuçlanır ESC nve îtemsil eder.)

Hatırlayabildiğim kadarıyla, Terminal.app Meta / Alt / her neyse Mac kullanım davranışını kontrol etmek için de benzer bir ayara sahip.


Bu sadece en iyi cevap değil, aynı zamanda son derece bilgilendirici, teşekkür ederim!
Stefan M

1
@shurane: Normal silme (Geri Alma) gibi "word erase" eylemi, "tty device" sürücüsünde işletim sistemi tarafından uygulanır - örneğin stdin'den sadece kör bir şekilde okunan programlarda bile mevcut olduklarına dikkat edin. cat. Tüm Unixlerde, sttybu özel anahtarlar dahil olmak üzere çeşitli tty parametrelerini kontrol etmek için kullanılır. (İşte UNIX 7th Edition’ınstty nasıl göründüğü.)
12’de

1
@shurane: Bu arada, readline asıl bash kabuğu için yazılmış bir kullanıcı alanı kütüphanesidir (şu anda birçok program tarafından kullanılmasına rağmen). Diğer sürücülerin (sürücünün el kitabında görüldüğü gibi önemli miktarda bayrak ve geçişi olan ) şişirilmemesi için okuma hattında uygulanması mümkündür stty. Ayrıca, bash aslen GNU işletim sistemi için tasarlandı ve daha sonra diğer Unix'lere aktarıldı; Düzenleme özelliklerini tek bir kütüphanede saklamak, çok farklı çekirdeklerden çok daha kolaydır.
Grawity

3
@shurane: Teknik olarak, word silme dahil tüm bu eylemler readline tarafından gerçekleştirilir - aktif olduğunda, terminal sürücüsü tarafından Backspace ve Ctrl + W işlemlerini tamamen devre dışı bırakır. readlinestty basitlik için yapılan yapılandırmaya saygı duyuyor , ancak readline'ın kendi ayarları tarafından geçersiz kılınabiliyor (Matt Day'in cevabında açıklandığı gibi).
Grawity

4
Bu bilgi için harika bir cevap, oy. Bununla birlikte, bunun muhtemelen hiç kimsenin istediği bir şey olmadıkça, readline kullanmıyorsa, tüm programlar için Ctrl-w'yi devre dışı bıraktığına dikkat edilmelidir, bu yüzden @fjarlq 'in cevabını deneyin.
temmuz

19

Grawity, bunun .inputrcdosyada kontrol edilemeyeceğini yazdı , ancak bu yanlış.

Eğer varsa set bind-tty-special-chars offSepetinde .inputrc, daha sonra özel terminali karakter davranışını özelleştirebilirsiniz.

Örneğin:

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word

2
Bunun, okuma çizgisini kullanan tüm programlar için çalışmanın yararı vardır, örneğin python.
wchargin

3

Kayıt için iTerm2 için geçerli olan cevap, Hex Kodları göndermek ve alfanümerik olmayan karakterleri sınırlayıcı olarak işleyen eylemi gerçekleştirmek için Alt- Backspace(veya Opt ⌥- Mac'te) ayarlamaktır .0xb10x7fbackward-kill-word

Farklılık için, işte tarif ettiğim davranış, buradaki presleme Opt ⌥- bir kez bunu değiştirir:

echo "/example/filepath/with_non-alpha.characters@blah:meh

buna:

echo "/example/filepath/with_non-alpha.characters@blah:

Ve sonraki basımlar Opt ⌥- :

echo "/example/filepath/with_non-alpha.characters@

echo "/example/filepath/with_non-alpha.

echo "/example/filepath/with_non-

echo "/example/filepath/with_

echo "/example/filepath/

İşte iTerm2'de ayarların nasıl göründüğü: görüntü tanımını buraya girin

Yani, Putty ve Terminal'e özgü olarak, Grawity'nin cevabı harika. Ancak, iTerm2'deki ayarın nasıl uygulanacağını aramak için utanç verici bir zaman harcadıktan sonra, bu süper kullanıcı yazısı en sık ortaya çıkmış gibi görünüyor, bu nedenle bu Sorunun ekinde bulunan iTerm2 için geçerli bilgiyi sağlamaktan sorumlu görünüyordu.


Bunu çözmem gerçekten uzun zaman aldı ve bu çözüm uzak bir bash kabuğuna giriş yaparken OS X'te (iTerm2 ile) çalıştı. Teşekkürler!
Martijn
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.