TL; DR
Bash ha una funzionalità simile a zsh's bindkeyattraverso bind, ma non avere diverse vimodalità come zsh. Dopo set -o viche puoi fare:
bind '"jk":vi-movement-mode'
che è l'equivalente di zsh'sbindkey -M <all vi modes> jk vi-movement-mode
Le vi-movement-modefunzioni provengono da inputrc(vedi /etc/inputrcper un elenco di esse).
Testo intero
Come sottolinea Stephen Harris nel suo commento:
.bashrcviene chiamato da bashsempre (e in particolare non da altre shell).
.bash_profile viene chiamato solo sulle shell di login (e ancora, solo bash).
Diverse distribuzioni sono dotate di uno .bash_profilescheletro che ha il seguente aspetto:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Il che è un buon contenuto, .bash_profiledal momento che puoi semplicemente dimenticare che esiste.
Ora, per mappare jkper Escla sessione di shell, che non è davvero possibile. Quando lo fai:
inoremap jk <esc>
In Vim, dopo aver digitato j, Vim sa che è necessario attendere un po 'per vedere se si digita ksuccessivamente e dovrebbe invocare la mappatura (o che si digita un'altra chiave e la mappatura non deve essere attivata). Come addendum, questo è controllato da :set timeoutlen=<miliseconds>in Vim (vedi :h timeoutlen).
Diverse shell o X11 non dispongono di tale controllo di timeout e non consentono più mapping di caratteri. È consentita solo la mappatura di una singola chiave (ma vedi le note di supporto di seguito).
set -o vi
Non legge .vimrc, imita solo alcune combinazioni di tasti vi(nemmeno pari vim) che possono essere utilizzate nella shell. Lo stesso si può dire -o emacs, non arriva con il pieno potere di emacs.
supporto zsh
zshin realtà supporta il timeout della mappa. E puoi usare quanto segue per mappare jka <esc>:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Questo dovrà andare a ~/.zshrcnon ~/.bashrc)
Tuttavia, sconsiglio. Uso vime il zshpiù delle volte. Ho inoremap jk <esc>nel mio vimrce ho provato a usare la bindkeycombinazione sopra. zshaspetta troppo tempo per stamparlo jquando lo uso, e questo mi ha infastidito molto.
bash support
bashsupporta readline bind. Credo che bashpossa essere compilato senza readilnequindi potrebbero esserci alcuni rari sistemi che hanno bash che non supportano bind(attenzione). Per mappare jka <esc>in bashquello che devi fare:
set -o vi
bind '"jk":"\e"'
(sì, è un doppio livello di quotazione, è necessario)
Ancora una volta, questo rende la digitazione jabbastanza fastidiosa. Ma in qualche modo meno fastidioso della zshsoluzione sulla mia macchina (probabilmente il timeout predefinito è più breve).
Soluzione alternativa (per shell non bash e non zsh)
Il motivo per rimappare il Esctasto è che si trova abbastanza lontano sulla tastiera e digitarlo richiede tempo. Un trucco che può essere preso in prestito dai emacsragazzi è rimappare CapsLockpoiché è comunque una chiave inutile. emacsragazzi lo rimappiamo Ctrlma lo rifaremo a Esc.
Usiamo xev -event keyboardper controllare il codice chiave di 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
E per controllare la funzione di 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
Molto buono, CapsLockè il keycode 66 e Escla funzione si chiama "Escape". Ora possiamo fare:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
Quanto sopra deve essere fatto in questo ordine. Ora ogni volta che premi CapsLockfunziona come una Escchiave.
La parte difficile è dove impostare questo. Un file ~/.Xmodmapcon il contenuto:
remove lock = Caps_Lock
keycode 66 = Escape
Dovrebbe essere rispettato dalla maggior parte delle distro (in realtà i display manager, ma sto dicendo distro per semplicità), ma ho visto quelli che non rispettano diversi ~/X*file. Per tali distro potresti provare qualcosa del tipo:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
Nel tuo .bashrc.
(In teoria sarebbe meglio posizionarlo ~/.xinitrcma se un display manager non lo rispetta .Xmodmapsicuramente non lo rispetterà ~/.xnintrc.)
Nota Extra: Questo rimappa solamente CapsLockad Escuna sessione di X11, quindi, la mappa sarà solo lavoro in emulatori di terminale. Actual ttynon vedrà la mappa.
Riferimenti e letture extra:
jk? È un tasto speciale sulla tastiera?