Bash vi modunda, ekleme modundan çıkmak için jk'yi eşleyin


12

Ben bash kabuk ile, ubuntu 16.04 yeni bir yükleme kullanıyorum. Yapmak istediğim iki şey var:

  1. Terminalden vim benzeri hareketler yapabilmem için vi modunu ayarla
  2. yazarak ekleme modundan çık jk

Başka bir gönderide bunun nasıl yapılabileceğini okudum zsh, nasıl yapabilirim bash?

tl; Dr.

koymak bind '"jk":vi-movement-mode'senin içine .bashrcdosyanın sonra set -o vi:)

server@thinkpad:~$ tail -n 2 .bashrc
set -o vi
bind '"jk":vi-movement-mode'

daha ayrıntılı bir açıklama için lütfen @ grochmal'ın cevabına bakınız.


1
Yeniden eşleştirerek ne demek istiyorsun jk? Klavyenizdeki özel bir tuş mu bu?
Stephen Harris

bakınız düzenleme
mbigras

Birinciniz için .bashrc, genellikle her kabukta çağrılır (örneğin kabuk dışına çıkarsanız vi), ancak .bash_profileyalnızca giriş kabuklarında çağrılır. Yani .bashrciçin doğru yerdir set -o vi. Gözden geçirilmiş 2. sorunuz için bir cevabım yok :-(
Stephen Harris

Bash kabuğuna nasıl başlıyorsun? İşte .bashrc ve .bash_profile
the_velour_fog

Yanıtlar:


11

TL; DR

Bash benzer işlevsellik vardır zsh's bindkeyaracılığıyla bind, ancak birkaç yok vigibi modları zsh. Sonra set -o viyapabilirsin:

bind '"jk":vi-movement-mode'

ki zsh'nin eşdeğeribindkey -M <all vi modes> jk vi-movement-mode

vi-movement-modeFonksiyonlar geliyor inputrc(Bkz /etc/inputrcbunların listesi için).

Tam metin

Stephen Harris'in yorumunda belirttiği gibi:

  • .bashrcbashher zaman çağrılır (ve diğer kabuklar tarafından değil).

  • .bash_profile yalnızca giriş kabuklarında çağrılır (ve yine yalnızca bash).

Birkaç dağıtım .bash_profileaşağıdaki gibi görünen bir iskeletle gelir:

# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc

Bu .bash_profilesadece var olduğunu unutabileceğiniz için iyi bir içerik .

Şimdi, kabuk oturumunda eşlemek jkiçin Esc, bu gerçekten mümkün değil. Yaptığınızda:

inoremap jk <esc>

Vim'de, yazdıktan sonra Vim, bir sonraki jyazıp yazmadığınızı görmek için biraz beklemesi gerektiğini bilir kve eşlemeyi çağırması gerekir (veya başka bir anahtar yazmanız ve eşlemenin tetiklenmemesi gerekir). Bir zeyilname olarak bu :set timeoutlen=<miliseconds>Vim tarafından kontrol edilir (bakınız :h timeoutlen).

Birçok kabuğun veya X11'in böyle bir zaman aşımı kontrolü yoktur ve çoklu karakter eşlemelerine izin vermez. Yalnızca tek bir anahtarın eşlenmesine izin verilir (Ancak aşağıdaki destek notlarına bakın.).

set -o vi

Okumuyor mu .vimrc, yalnızca bazı taklit vi(hatta vimkabukta kullanılabilir) tuş kombinasyonları. Aynı şey söylenebilir -o emacs, tam gücü ile gelmez emacs.


zsh desteği

zshaslında harita zaman aşımını destekler. Ve aşağıdakileri eşlemek jkiçin aşağıdakileri kullanabilirsiniz <esc>:

bindkey -v  # instead of set -o vi
bindkey -e jk \\e

(Yani gitmek gerekir ~/.zshrcdeğil ~/.bashrc)

Yine de buna karşı tavsiyede bulunuyorum. Kullandığım vimve zshçoğu zaman. Ben inoremap jk <esc>benim, vimrcve ben kullanmayı deneyin vermedi bindkeyyukarıdaki kombinasyonu. kullanırken zshyazdırmak için çok uzun süre bekler jve bu beni çok rahatsız etti.


bash desteği

bashdestekler readline bind. Bunun basholmadan derlenebileceğine inanıyorum, readilnebash'ı desteklemeyen bind(dikkatli olun) bazı nadir sistemler olabilir . Eşleştirmek için jkhiç <esc>de bashyapmanız gereken:

set -o vi
bind '"jk":"\e"'

(evet, bu iki kat tekliflidir, gereklidir)

Yine, bu yazmayı joldukça can sıkıcı hale getirir . Ancak bir şekilde zshmakinemdeki çözümden daha az can sıkıcı (muhtemelen varsayılan zaman aşımı daha kısadır).


Geçici çözüm (bash olmayan ve zsh olmayan kabuklar için)

EscTuşun yeniden eşlenmesinin nedeni , klavyede oldukça uzakta olması ve yazmanın zaman almasıdır. Adamlardan ödünç alınabilecek bir hile, yine de işe yaramaz bir anahtar emacsolduğu için yeniden tanımlamaktır CapsLock. emacsçocuklar bunu yeniden eşleştireceğiz Ctrlama yeniden eşleştireceğiz Esc.

Şu xev -event keyboardkodları kontrol etmek için kullanalım CapsLock:

KeyPress event, serial 25, synthetic NO, window 0x1c00001,
    root 0x496, subw 0x0, time 8609026, (764,557), root:(765,576),
    state 0x0, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

Ve işlevini kontrol etmek için Esc:

KeyPress event, serial 25, synthetic NO, window 0x1c00001,
    root 0x496, subw 0x0, time 9488531, (571,525), root:(572,544),
    state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
    XLookupString gives 1 bytes: (1b) "
    XmbLookupString gives 1 bytes: (1b) "
    XFilterEvent returns: False

Çok iyi, CapsLock66 tuş kodudur ve Escişlevine "Escape" denir. Şimdi yapabiliriz:

# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"

Yukarıda gerekir bu sırada yapılması. Şimdi her vurduğunuzda CapsLockbir Escanahtar gibi çalışıyor .


Zor kısmı bunu nereye ayarlayacağınız. ~/.Xmodmapİçeriği olan bir dosya :

remove lock = Caps_Lock
keycode 66 = Escape

Çoğu dağıtım tarafından saygı duyulmalıdır (aslında ekran yöneticileri, ancak basitlik için dağıtımlar söylüyorum), ancak birkaç ~/X*dosyaya saygı duymayanları gördüm . Bu tür dağıtımlar için aşağıdakileri deneyebilirsiniz:

if [ "x" != "x$DISPLAY" ]; then
    xmodmap -e "remove lock = Caps_Lock"
    xmodmap -e "keycode 66 = Escape"
fi

Sizin .bashrc.

(Teorik olarak daha iyi yerleştirilir, ~/.xinitrcancak bir ekran yöneticisi saygı .Xmodmapduymazsa kesinlikle saygı göstermez ~/.xnintrc.)

Ekstra not: Bu sadece remaps CapsLockiçin Esc, bir X11 oturumda dolayısıyla haritası olacak terminal emülatörlerine sadece eser. Güncel ttyharita görmeyecek.

Kaynaklar ve ek okuma:


Detaylı açıklama için teşekkürler. Eşleme jkyerine aynı işlemi açıklamak ister misiniz CapsLock? Osx makinemde ayarladım; Ancak, hafta sonu geri kalanı için yok ve nasıl yaptığımı hatırlayamıyorum :)
mbigras

@mbigras - Bunu bash'de yaptığınızdan emin misiniz? Bash'in belirsiz haritası yok. Ben bunu yapmanın bir yol biliyor zsh: bindkey -v; bindkey -s jk \\e. Ama bu geri gelmek ve ihtiyacınız olduğunda geri seni ısıracak bir şeydir jkzamanlayıcı yapılandırılabilir değildir ve hiçbir çünkü, <leader>içinde zsh.
grochmal

Kesinlikle içeri girdim zshve değil bash, bash'de mümkün değil mi?
mbigras

@mbigras - Bekle, yanılmışım! Okuma man bashbuldum bindoldukça benzer o işi zshs' bindkey. Cevabı güncelleyeceğim. İşte, zshçok kullanıyorum .
grochmal

2
@Jason - Hey, bu Vi SE, Burada herkes TÜM CAPS kelimesini şöyle yazıyor: "type word" <Esc> viwU :). Tamamlanmasına gerek yok
grochmal

2

Teşekkürler, önceki cevaplar için bunu terminalimdeki vi benzeri kısayollar için ~ / .zshrc içinde kullanıyorum. Umarım birine yardım eder.

bindkey -v
bindkey 'jk' vi-cmd-mode

Buraya vi-etkin zsh içinde "normal mod" girmek için '^ G' tuşunu bağlamak için çalışan cevap arıyor geldi ve bu işe yarayan tek.
Dalker
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.