TL; DR
Bash memiliki fungsi yang mirip dengan zsh
's bindkey
melalui bind
, tetapi tidak memiliki beberapa vi
mode seperti zsh
. Setelah set -o vi
Anda bisa melakukannya:
bind '"jk":vi-movement-mode'
yang setara zsh
denganbindkey -M <all vi modes> jk vi-movement-mode
The vi-movement-mode
fungsi berasal dari inputrc
(lihat /etc/inputrc
untuk daftar mereka).
Teks lengkap
Seperti yang ditunjukkan Stephen Harris dalam komentarnya:
.bashrc
disebut dengan bash
selalu (dan terutama tidak oleh shell lain).
.bash_profile
hanya dipanggil di shell login (dan sekali lagi, hanya bash).
Beberapa distro hadir dengan .bash_profile
kerangka yang terlihat seperti berikut:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Yang merupakan konten yang bagus .bash_profile
karena Anda bisa melupakannya.
Sekarang, untuk memetakan jkke Escdalam sesi shell, itu tidak benar-benar mungkin. Saat kamu melakukan:
inoremap jk <esc>
Di Vim, setelah Anda mengetik j, Vim tahu perlu menunggu sedikit untuk melihat apakah Anda mengetik kberikutnya dan itu harus memanggil pemetaan (atau Anda mengetik kunci lain dan pemetaan tidak boleh dipicu). Sebagai tambahan, ini dikendalikan oleh :set timeoutlen=<miliseconds>
dalam Vim (lihat :h timeoutlen
).
Beberapa shell atau X11 tidak memiliki kontrol batas waktu dan tidak memungkinkan untuk memetakan banyak karakter. Hanya pemetaan satu kunci yang diizinkan (Tetapi lihat catatan dukungan di bawah ini.).
set -o vi
Tidak membaca .vimrc
, itu hanya meniru beberapa kombinasi tombol vi
(bahkan tidak vim
) yang dapat digunakan dalam shell. Hal yang sama dapat dikatakan tentang -o emacs
, itu tidak datang dengan kekuatan penuh emacs
.
Dukungan zsh
zsh
sebenarnya mendukung timeout peta. Dan Anda dapat menggunakan yang berikut untuk memetakan jk
ke <esc>
:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Itu harus pergi ke ~/.zshrc
tidak ~/.bashrc
)
Namun, saya menyarankan hal ini. Saya menggunakan vim
dan zsh
sebagian besar waktu. Saya miliki inoremap jk <esc>
di saya vimrc
dan saya memang mencoba menggunakan bindkey
kombinasi di atas. zsh
menunggu terlalu lama untuk dicetak j
saat menggunakannya, dan itu sangat mengganggu saya.
dukungan bash
bash
mendukung readline
bind
. Saya percaya bahwa bash
dapat dikompilasi tanpa readilne
karena itu mungkin ada beberapa sistem langka yang memiliki bash yang tidak mendukung bind
(waspada). Untuk memetakan jk
ke <esc>
dalam bash
Anda perlu melakukan:
set -o vi
bind '"jk":"\e"'
(ya itu tingkat ganda mengutip, itu diperlukan)
Sekali lagi, ini membuat mengetik j
cukup mengganggu. Tapi entah kenapa kurang mengganggu daripada zsh
solusi di mesin saya (mungkin batas waktu default lebih pendek).
Penanganan masalah (untuk cangkang non-bash dan non-zsh)
Alasan untuk memetakan kembali Esckunci adalah karena letaknya cukup jauh pada keyboard, dan mengetiknya membutuhkan waktu. Trik yang dapat dipinjam dari emacs
orang - orang adalah untuk memetakan kembali CapsLockkarena itu adalah kunci yang tidak berguna. emacs
kalian remap ke Ctrltapi kami akan remap ke Esc.
Mari kita gunakan xev -event keyboard
untuk memeriksa kode kunci 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
Dan untuk memeriksa fungsi 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
Sangat bagus, CapsLockkode kunci 66 dan Escfungsinya disebut "Escape". Sekarang kita bisa melakukan:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
Hal di atas harus dilakukan dalam urutan ini. Sekarang setiap kali Anda menekannya CapsLockberfungsi seperti Esckunci.
Bagian yang sulit adalah di mana mengatur ini. File ~/.Xmodmap
dengan konten:
remove lock = Caps_Lock
keycode 66 = Escape
Harus dihormati oleh sebagian besar distro (sebenarnya menampilkan manajer, tapi saya katakan distro untuk kesederhanaan), tetapi saya melihat yang tidak menghormati beberapa ~/X*
file. Untuk distro semacam itu Anda dapat mencoba sesuatu seperti:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
Di Anda .bashrc
.
(Secara teori itu akan lebih baik ditempatkan ~/.xinitrc
tetapi jika seorang manajer tampilan tidak menghormati .Xmodmap
itu pasti tidak akan menghormati ~/.xnintrc
.)
Ekstra Catatan: ini hanya remaps CapsLockke Escdalam sesi X11, karena peta hanya akan bekerja di emulator terminal. Sebenarnya tty
tidak akan melihat peta.
Referensi dan bacaan tambahan:
jk
? Apakah itu beberapa tombol khusus pada keyboard Anda?