TL; DR
Bash ma podobną funkcjonalność zsh
„s bindkey
dzięki bind
, ale nie posiada kilka vi
trybów, takich jak zsh
. Po set -o vi
tym, jak możesz:
bind '"jk":vi-movement-mode'
co jest odpowiednikiem zsh
'sbindkey -M <all vi modes> jk vi-movement-mode
Te vi-movement-mode
funkcje pochodzi inputrc
(patrz /etc/inputrc
na listy z nich).
Pełny tekst
Jak zauważa Stephen Harris w swoim komentarzu:
.bashrc
jest wywoływany przez bash
always (a zwłaszcza nie przez inne powłoki).
.bash_profile
jest wywoływany tylko w powłokach logowania (i ponownie, tylko bash).
Kilka dystrybucji ma .bash_profile
szkielet wyglądający następująco:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Jest to dobra treść, .bash_profile
ponieważ można po prostu zapomnieć, że istnieje.
Teraz do mapy jk, aby Escw sesji powłoki, to nie jest w ogóle możliwe. Kiedy to zrobisz:
inoremap jk <esc>
W Vimie po wpisaniu jVim wie, że musi trochę poczekać, aby sprawdzić, czy piszesz kdalej, i powinien wywołać mapowanie (lub że wpiszesz inny klucz i mapowanie nie powinno zostać uruchomione). Jako dodatek jest to kontrolowane przez :set timeoutlen=<miliseconds>
Vima (patrz :h timeoutlen
).
Kilka powłok lub X11 nie ma takiej kontroli limitu czasu i nie pozwala na mapowanie wielu znaków. Dozwolone jest tylko mapowanie jednego klucza (ale patrz uwagi pomocy technicznej poniżej).
set -o vi
Nie czyta .vimrc
, imituje tylko niektóre vi
(nawet vim
) kombinacje klawiszy, które mogą być użyte w powłoce. To samo można powiedzieć -o emacs
, nie ma pełnej mocy emacs
.
obsługa zsh
zsh
faktycznie obsługuje limit czasu mapy. Możesz użyć następujących map jk
do <esc>
:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Trzeba będzie przejść do ~/.zshrc
nie ~/.bashrc
)
Jednak odradzam to. Używam vim
i przez zsh
większość czasu. Mam inoremap jk <esc>
w sobie vimrc
i próbowałem użyć bindkey
powyższej kombinacji. zsh
zbyt długo czeka na wydrukowanie j
, a to mnie bardzo denerwuje.
wsparcie bash
bash
obsługuje readline
bind
. Wierzę, że bash
można to skompilować bez, readilne
dlatego mogą istnieć niektóre rzadkie systemy, które mają bash, które nie obsługują bind
(bądź czujny). Aby odwzorować jk
aby <esc>
w bash
trzeba zrobić:
set -o vi
bind '"jk":"\e"'
(tak, to podwójny poziom cytowania, jest potrzebny)
Ponownie sprawia to, że pisanie jest j
dość denerwujące. Ale w jakiś sposób mniej irytujące niż zsh
rozwiązanie na moim komputerze (prawdopodobnie domyślny limit czasu jest krótszy).
Obejście (dla powłok innych niż bash i nie-zsh)
Powodem ponownego przypisania Escklawisza jest to, że leży on dość daleko na klawiaturze, a wpisanie zajmuje trochę czasu. Sztuką, którą można pożyczyć od emacs
facetów, jest remap, CapsLockponieważ i tak jest to bezużyteczny klucz. emacs
chłopaki to odwzorowujemy, Ctrlale my zmienimy to Esc.
Użyjmy, xev -event keyboard
aby sprawdzić kod 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
I aby sprawdzić funkcję 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
Bardzo dobrze, CapsLockma kod 66 i Escjego funkcja nazywa się „Escape”. Teraz możemy zrobić:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
Powyższe należy wykonać w tej kolejności. Teraz za każdym razem, CapsLockgdy naciskasz , działa jak Escklucz.
Trudną częścią jest to, gdzie to ustawić. Plik ~/.Xmodmap
z zawartością:
remove lock = Caps_Lock
keycode 66 = Escape
Powinny być respektowane przez większość dystrybucji (tak naprawdę menedżery wyświetlania, ale mówię o dystrybucji dla uproszczenia), ale widziałem takie, które nie szanują kilku ~/X*
plików. W przypadku takich dystrybucji możesz wypróbować coś takiego:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
W twoim .bashrc
.
(Teoretycznie byłoby lepiej, ~/.xinitrc
ale jeśli menedżer wyświetlania nie przestrzega .Xmodmap
go, to na pewno nie uszanuje ~/.xnintrc
.)
Dodatkowa uwaga: Ten remaps tylko CapsLockaby Escw sesji X11, dlatego że mapa będzie działać tylko w emulatory terminali. Rzeczywiste tty
nie zobaczą mapy.
Referencje i dodatkowe lektury:
jk
? Czy to jakiś specjalny klawisz na klawiaturze?