Saya menggunakan instalasi baru ubuntu 16.04, dengan bash shell. Ada dua hal yang ingin saya lakukan:
- Atur mode vi sehingga saya dapat memiliki gerakan seperti vim dari terminal
- keluar dari mode penyisipan dengan mengetik
jk
Saya membaca di posting lain bagaimana ini bisa dilakukan zsh
, bagaimana saya bisa melakukannya bash
?
tl; dr
dimasukkan bind '"jk":vi-movement-mode'
ke dalam .bashrc
file Anda setelah set -o vi
:)
server@thinkpad:~$ tail -n 2 .bashrc
set -o vi
bind '"jk":vi-movement-mode'
silakan lihat jawaban @ grochmal untuk penjelasan yang lebih terperinci
bash
keyboard-shortcuts
vi
mbigras
sumber
sumber
jk
? Apakah itu beberapa tombol khusus pada keyboard Anda?.bashrc
biasanya dipanggil pada setiap shell (misalnya jika Anda keluar darivi
) tetapi.bash_profile
hanya dipanggil pada shell login. Jadi.bashrc
adalah tempat yang tepat untukset -o vi
. Saya tidak punya jawaban untuk pertanyaan kedua Anda yang telah direvisi :-(set -o vi
masuk.bashrc
, lihat Mengapa ~ / .bash_profile saya tidak berfungsi?Jawaban:
TL; DR
Bash memiliki fungsi yang mirip dengan
zsh
'sbindkey
melaluibind
, tetapi tidak memiliki beberapavi
mode sepertizsh
. Setelahset -o vi
Anda bisa melakukannya:yang setara
zsh
denganbindkey -M <all vi modes> jk vi-movement-mode
The
vi-movement-mode
fungsi berasal dariinputrc
(lihat/etc/inputrc
untuk daftar mereka).Teks lengkap
Seperti yang ditunjukkan Stephen Harris dalam komentarnya:
.bashrc
disebut denganbash
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: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:
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.).
Tidak membaca
.vimrc
, itu hanya meniru beberapa kombinasi tombolvi
(bahkan tidakvim
) yang dapat digunakan dalam shell. Hal yang sama dapat dikatakan tentang-o emacs
, itu tidak datang dengan kekuatan penuhemacs
.Dukungan zsh
zsh
sebenarnya mendukung timeout peta. Dan Anda dapat menggunakan yang berikut untuk memetakanjk
ke<esc>
:(Itu harus pergi ke
~/.zshrc
tidak~/.bashrc
)Namun, saya menyarankan hal ini. Saya menggunakan
vim
danzsh
sebagian besar waktu. Saya milikiinoremap jk <esc>
di sayavimrc
dan saya memang mencoba menggunakanbindkey
kombinasi di atas.zsh
menunggu terlalu lama untuk dicetakj
saat menggunakannya, dan itu sangat mengganggu saya.dukungan bash
bash
mendukungreadline
bind
. Saya percaya bahwabash
dapat dikompilasi tanpareadilne
karena itu mungkin ada beberapa sistem langka yang memiliki bash yang tidak mendukungbind
(waspada). Untuk memetakanjk
ke<esc>
dalambash
Anda perlu melakukan:(ya itu tingkat ganda mengutip, itu diperlukan)
Sekali lagi, ini membuat mengetik
j
cukup mengganggu. Tapi entah kenapa kurang mengganggu daripadazsh
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:Dan untuk memeriksa fungsi Esc:
Sangat bagus, CapsLockkode kunci 66 dan Escfungsinya disebut "Escape". Sekarang kita bisa melakukan:
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: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: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:
.bashrc
vs..bash_profile
sumber
jk
bukanCapsLock
? Saya sudah mengaturnya di mesin osx saya; Namun, saya tidak memilikinya selama sisa akhir pekan dan saya tidak ingat bagaimana saya melakukannya :)zsh
:bindkey -v; bindkey -s jk \\e
. Tapi itu adalah sesuatu yang akan datang kembali dan menggigit Anda kembali ketika Anda membutuhkanjk
, karena timer tidak dikonfigurasi dan Anda tidak<leader>
dizsh
.zsh
dan tidakbash
, apakah itu tidak mungkin di bash?man bash
Saya menemukanbind
bahwa pekerjaan sangat mirip denganzsh
'sbindkey
. Saya akan memperbarui jawabannya. Ini dia, saya menggunakanzsh
terlalu banyak.Terima kasih, untuk jawaban sebelumnya, saya menggunakan ini di ~ / .zshrc saya untuk pintasan mirip-vi di terminal saya. Saya harap ini akan membantu seseorang.
sumber