TL; DR
Bash ha una funzionalità simile a zsh
's bindkey
attraverso bind
, ma non avere diverse vi
modalità come zsh
. Dopo set -o vi
che puoi fare:
bind '"jk":vi-movement-mode'
che è l'equivalente di zsh
'sbindkey -M <all vi modes> jk vi-movement-mode
Le vi-movement-mode
funzioni provengono da inputrc
(vedi /etc/inputrc
per un elenco di esse).
Testo intero
Come sottolinea Stephen Harris nel suo commento:
.bashrc
viene chiamato da bash
sempre (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_profile
scheletro che ha il seguente aspetto:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Il che è un buon contenuto, .bash_profile
dal 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
zsh
in realtà supporta il timeout della mappa. E puoi usare quanto segue per mappare jk
a <esc>
:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Questo dovrà andare a ~/.zshrc
non ~/.bashrc
)
Tuttavia, sconsiglio. Uso vim
e il zsh
più delle volte. Ho inoremap jk <esc>
nel mio vimrc
e ho provato a usare la bindkey
combinazione sopra. zsh
aspetta troppo tempo per stamparlo j
quando lo uso, e questo mi ha infastidito molto.
bash support
bash
supporta readline
bind
. Credo che bash
possa essere compilato senza readilne
quindi potrebbero esserci alcuni rari sistemi che hanno bash che non supportano bind
(attenzione). Per mappare jk
a <esc>
in bash
quello che devi fare:
set -o vi
bind '"jk":"\e"'
(sì, è un doppio livello di quotazione, è necessario)
Ancora una volta, questo rende la digitazione j
abbastanza fastidiosa. Ma in qualche modo meno fastidioso della zsh
soluzione 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 emacs
ragazzi è rimappare CapsLockpoiché è comunque una chiave inutile. emacs
ragazzi lo rimappiamo Ctrlma lo rifaremo a Esc.
Usiamo xev -event keyboard
per 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 ~/.Xmodmap
con 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 ~/.xinitrc
ma se un display manager non lo rispetta .Xmodmap
sicuramente 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 tty
non vedrà la mappa.
Riferimenti e letture extra:
jk
? È un tasto speciale sulla tastiera?