TL; DR
Bash имеет такую же функциональность, zsh
«S bindkey
через bind
, но он не имеет несколько vi
режимов , таких как zsh
. После set -o vi
вы можете сделать:
bind '"jk":vi-movement-mode'
что эквивалентно zsh
'sbindkey -M <all vi modes> jk vi-movement-mode
В vi-movement-mode
функции происходит от inputrc
(см /etc/inputrc
для списка из них).
Полный текст
Как отмечает Стивен Харрис в своем комментарии:
.bashrc
вызывается bash
всегда (и особенно не другими оболочками).
.bash_profile
вызывается только в оболочках входа в систему (и опять же, только в bash).
Несколько дистрибутивов поставляются со .bash_profile
скелетом, который выглядит следующим образом:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Это хороший контент, .bash_profile
потому что вы можете просто забыть о его существовании.
Теперь на карту , jkчтобы Escв сессии оболочки, которая на самом деле не возможно. Когда вы делаете:
inoremap jk <esc>
В Vim после ввода jVim знает, что ему нужно немного подождать, чтобы увидеть, печатаете ли вы kдалее, и должен ли он вызывать сопоставление (или что вы набираете другую клавишу, и сопоставление не должно запускаться). В качестве дополнения это контролируется :set timeoutlen=<miliseconds>
в Vim (см. :h timeoutlen
).
Некоторые оболочки или X11 не имеют такого контроля времени ожидания и не допускают сопоставления нескольких символов. Допускается только сопоставление одного ключа (но см. Примечания по поддержке ниже.).
set -o vi
Не читает .vimrc
, он только имитирует некоторые vi
(даже не vim
) комбинации клавиш, которые можно использовать в оболочке. То же самое можно сказать о -o emacs
, это не приходит с полной силой emacs
.
поддержка Zsh
zsh
фактически поддерживает тайм-аут карты. И вы можете использовать следующую команду, чтобы отобразить jk
на <esc>
:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Это нужно будет пойти ~/.zshrc
не ~/.bashrc
)
Тем не менее, я советую против этого. Я использую vim
и zsh
большую часть времени. У меня inoremap jk <esc>
по моему , vimrc
и я стараюсь , используя bindkey
комбинацию выше. при его использовании zsh
слишком долго ждет печати j
, и это меня сильно раздражало.
поддержка bash
bash
поддерживает readline
bind
. Я считаю, что это bash
может быть скомпилировано без, readilne
поэтому могут быть некоторые редкие системы, которые имеют bash, которые не поддерживают bind
(будьте внимательны). Для сопоставления jk
с <esc>
в bash
вам нужно сделать:
set -o vi
bind '"jk":"\e"'
(да, это двойной уровень цитирования, это необходимо)
Опять же, это делает набор текста j
довольно раздражающим. Но как-то менее раздражает, чем zsh
решение на моей машине (вероятно, время ожидания по умолчанию короче).
Обходной путь (для оболочек не bash и не zsh)
Причина переназначения Escклавиши заключается в том, что она лежит довольно далеко от клавиатуры, и для ее набора требуется время. Хитрость, которую можно позаимствовать у emacs
ребят, состоит в том, чтобы переназначить, CapsLockтак как в любом случае это бесполезный ключ. emacs
ребята переназначить его, Ctrlно мы переназначим его Esc.
Давайте использовать, xev -event keyboard
чтобы проверить код ключа 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
И проверить функцию 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
Очень хорошо, CapsLockэто код клавиши 66 и Escфункция называется «Escape». Теперь мы можем сделать:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
Выше должно быть сделано в этом порядке. Теперь каждый раз, когда вы нажимаете, CapsLockон работает как Escключ.
Сложная часть, где это установить. Файл ~/.Xmodmap
с содержанием:
remove lock = Caps_Lock
keycode 66 = Escape
Должны уважаться большинством дистрибутивов (фактически диспетчерами дисплеев, но я говорю дистрибутивы для простоты), но я видел те, которые не уважают несколько ~/X*
файлов. Для таких дистрибутивов вы можете попробовать что-то вроде:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
По вашему .bashrc
.
(Теоретически это было бы лучше, ~/.xinitrc
но если менеджер дисплеев не уважает, .Xmodmap
он точно не будет уважать ~/.xnintrc
.)
Дополнительное примечание: Это только перераспределяет , CapsLockчтобы Escв сеансе X11, поэтому карта будет работать только в эмуляторах терминала. Актуальные tty
не увидят карту.
Рекомендации и дополнительное чтение:
jk
? Это какая-то специальная клавиша на клавиатуре?