TL; DR
Bash має функціонал, подібний до zsh
" 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_profile
скелетом, який виглядає так:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Це хороший зміст, .bash_profile
оскільки ви можете просто забути, що він існує.
Тепер, щоб зробити карту jkна Escсеанс оболонки, це насправді неможливо. Коли ви робите:
inoremap jk <esc>
У Vim, після введення j, Vim знає, що потрібно трохи почекати, щоб побачити, чи ви введете 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
тому можуть бути деякі рідкісні системи, які мають баш, які не підтримують bind
(будьте уважні). Для зіставлення jk
з <esc>
в bash
вам потрібно зробити:
set -o vi
bind '"jk":"\e"'
(так, це подвійний рівень цитування, це потрібно)
Знову ж таки, це робить набриднення j
досить дратівливим. Але якось менш дратівливо, ніж 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функція 'називається "Втеча". Тепер ми можемо зробити:
# 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
? Це якась спеціальна клавіша на вашій клавіатурі?