Cara lain untuk keluar dari mode Sisipkan selain Escape


74

Alasan utama saya suka vim daripada emacs adalah bahwa jarak gerakan tangan saya jauh dari baris rumah sangat rendah (bahkan sebagai programmer). Namun, satu-satunya waktu utama saya melakukan ini adalah meninggalkan mode insert, dengan menekan Escape.

Saya baru-baru ini belajar bahwa saya dapat menggunakan Ctrl + C untuk meninggalkan mode penyisipan juga. Namun, ini bukan perbaikan.

Bagaimana saya bisa keluar dari mode penyisipan tanpa harus meninggalkan barisan rumah, dan tanpa memengaruhi kemampuan saya untuk mengetik secara masif? Catatan: Saya menggunakan sebagian besar vanilla vim dengan tata letak keyboard dvorak, meskipun saya ingin mendengar solusi untuk tata letak qwerty juga.


1
Anda dapat memetakan kombinasi tombol apa saja di mana saja, dan Anda tidak bisa melakukan apa pun. Apakah itu yang Anda maksud?
yo '

3
Mempelajari Ctrl + c pintas THX!
Philippe Gachoud

Bagaimana dengan pemetaan Caps Lock sebagai Esc?
Kolob Canyon

@PhillippeGachaud: Jangan gunakan Ctrl-C sebagai pengganti Esc. Ctrl-C tidak sama dengan Escape, itu adalah Escape yang dipaksakan dan mungkin berperilaku berbeda dalam beberapa keadaan.
Lie Ryan

Jawaban:


60

Ikatan umum yang akan Anda lihat adalah jj , karena itu berfungsi dengan baik untuk tata letak QWERTY jika Anda menggunakan pemosisian baris rumah.

inoremap jj <ESC>

Dalam hal itu, untuk mengetik literal jj- Anda harus menunggu 1 detik (secara default) antara mengetik karakter kedua. (lihat :help 'timeout'detailnya)

Ada juga c-oyang akan membawa Anda keluar dari memasukkan, membiarkan Anda melakukan satu perintah normal, dan kemudian menempatkan Anda kembali ke masukkan.

http://vim.wikia.com/wiki/Avoid_the_escape_key


1
Dalam dvorak, jadalah ckuncinya. Jadi ini tidak terlalu buruk (untuk mengetik cc). Saya juga bisa mengikat hh(qwerty jkey = dvorak h), yang hanya akan mem-boot saya jika saya sedang mengetik shhhhhhhatau sesuatu.
durron597

7
cc adalah kombinasi kunci dua huruf yang jauh lebih umum, setidaknya dalam bahasa Inggris. Jadi itu mungkin bukan pilihan terbaik
Nick J Adams

4
Bagaimana dengan meniru jk? Temukan dua tombol yang berdekatan di Dvorak tetapi bukan kombinasi umum dalam bahasa pilihan Anda. tn, misalnya, adalah posisi yang setara dengan jk.
David Lord

1
Saya agak suka memiliki jk/ kjkeluar dari mode normal bahkan di Dvorak; mereka adalah tombol "c" dan "v" pada keyboard QWERTY, jadi mudah untuk pointer kiri dan jari tengah saya.
alxndr

2
Saya pikir kita bisa melakukan yang lebih baik - gunakan iisaja. Ya, Anda harus memindahkan jari-jari Anda dari barisan rumah tetapi masih nyaman. Dan yang lebih penting lagi, Anda dapat beralih antar mode tanpa menggerakkan jari Anda.
Sridhar Sarnobat

38

Selain built-in alternatif <C-[>dan <C-c>untuk <Esc>kunci dikutip oleh orang lain, solusi lain yang populer adalah untuk remap <CapsLock>sebagai Luput tambahan. Ini baik pada keyboard Qwerty dan Dvorak.

Dengan cara ini Anda dapat menekan Esc dengan sangat mudah dengan jari kelingking kiri, tanpa melepaskan tangan dari HomeRow (kebetulan, CapsLock adalah tempat Escape dulu berada di keyboard saat vi diciptakan).

Remapping dapat dilakukan:

  • pada Windows menggunakan utilitas AutoHotKey ;
  • pada Mac menggunakan utilitas KeyRemap4MacBook dan lainnya;
  • di Linux, bervariasi sesuai dengan Lingkungan Desktop. Misalnya pada Linux Mint / Cinnamon hanya masalah memilih opsi yang tepat di Menu-> Keyboard-> Layout Keyboard-> perilaku Caps Lock. Atau, tetapi kurang mudah, ini dapat dipetakan ulang di tingkat Xorg menggunakan program xmodmap dan menjalankannya dengan .Xmodmapfile berikut :

    clear Lock
    keycode 0x42 = Escape
    

    Sistem ini dapat diatur untuk menjalankannya secara otomatis di setiap login dengan menempatkan secara strategis baris skrip shell berikut (seandainya .Xmodmapada di direktori home Anda ~) dalam rantai file-file bersumber otomatis login:

    if [ -s ~/.Xmodmap ]; then
      xmodmap ~/.Xmodmap
    fi
    

    Namun rumit, karena sebenarnya file yang bersumber bervariasi sesuai dengan lingkungan (desktop) yang digunakan. Sebagai contoh, saya memiliki xmodmap disebut sebagai entri di Cinnamon "Aplikasi Startup" (yang memungkinkan saya untuk melakukan lebih dari penyesuaian kustomisasi kunci GUI standar).

Beberapa orang bahkan melangkah lebih jauh dan memprogram kunci CapsLock untuk berperilaku:

  • sebagai Ctrlkunci dengan menekan dan menahannya,
  • sebagai Esckunci dengan menekan dan melepaskannya dengan cepat.

Ini dapat dilakukan pada Windows dan Mac dengan mengatur / memprogram dengan benar utilitas remap yang sesuai (khusus untuk petunjuk AutoHotkey dapat ditemukan di sini dan untuk memeriksa KeyRemap4MacBook di sini ). Di Linux menggunakan program xcape .


2
Sangat setuju. Memiliki tombol ctrl pada baris rumah meningkatkan banyak kegunaan (menggulir melalui penyelesaian dengan ctrl + n, menggulir file dengan ctrl + f / ctrl + b, melarikan diri dengan ctrl +] dll. Semua kombo kunci ini lebih mudah dilakukan cara ini.
John O'M.

1
Tentang menekan Ctrltombol (pada posisi biasa) tanpa memutar jari kelingking: Anda dapat menekannya dengan telapak tangan eksternal, seperti yang dijelaskan dengan baik di sini (saya menemukan trik pintar yang bagus di 'Net, saatnya memberikannya kembali :) dan pujian kepada siapa yang menciptakannya)
Giovanni Maggiorani

FWIW KeyRemap4MacBook telah diganti namanya Karabiner: pqrs.org/osx/karabiner/index.html.en
alxndr

Saya mencoba solusi ini, tetapi menemukan bahwa saya menekan Caps Lock secara tidak sengaja ketika menekan Shift beberapa kali, yang mengganggu. Jadi jarak tempuh Anda mungkin berbeda-beda tergantung seberapa tangkas kelingking kiri Anda. :)
Godsmith

2
Jika Anda memetakan kembali Ctrlke Alt( Cmd) dan sebaliknya, maka <C-[> benar-benar bersinar. Pinky lemah, ibu jari kuat. Pada QWERTY Anda bahkan tidak perlu meninggalkan rumah baris untuk itu, pada Dvorak itu tidak begitu baik, tetapi dapat diterima.
Nash Bridges

28

Pemetaan yang saya gunakan adalah:

inoremap jk <esc>
inoremap kj <esc>

Dengan cara ini, Anda cukup menekan jdan kpada saat yang sama, tanpa harus khawatir yang mana yang Anda tekan terlebih dahulu.


70
Tapi saya sedang menulis buku tentang bermain Edsgar Dijkstra bermain blackjack di Reykjavik! ;)
durron597

Keduanya mengerikan jika Anda ingin menulis bahasa Belanda.
Hielke Walinga

12

<C-[>dan <C-c>dua alternatif asli untuk <Esc>.

Lihat :help i_<esc>dan :help i_ctrl-cyang menjelaskan perbedaan antara <C-c>dan <Esc>.


Sekali lagi, ini bukan perbaikan, karena Ctrl hanya sejauh dari baris home seperti Escape.
durron597

4
@ durron597 Pada keyboard QWERTY, Ctrl mungkin jauh dari baris home, tetapi memang memiliki perbedaan penting: itu di bawah baris home. Anda hanya perlu menggerakkan jari Anda untuk menekannya, sedangkan dengan Esc Anda harus memutar sedikit tangan Anda. Juga, <C-[>memiliki simetri yang bagus untuk itu (kedua jari kecil bergerak berlawanan arah).
wchargin

6
Perhatikan bahwa <C-c> tidak persis sama dengan<Esc> .
wchargin

2
Sepakat. Penggunaan kebiasaan <C-c>dapat secara halus memecah plugin dan autocmds.
David Lord

Di mesin saya, ini <C - [> berhasil, tetapi butuh setengah detik lebih lama untuk mendaftar daripada <Cc>
Alexander Mills

4

Anda dapat memetakan Caps Lockke Control tanpa menggunakan program eksternal :

  • Di Mac OS X kunjungi System Preferences> Keyboard -> Modifier Keys
  • Di Linux jalankan:setxkbmap -option caps:ctrl_modifier
  • Di Windows, edit registri Anda.

Ini membawa Controlke baris rumah, membuatnya lebih mudah untuk menekan semua stroke yang dimodifikasi Kontrol, termasuk Ctrl-[dan Ctrl-Cyang keduanya keluar dari mode Sisipkan di Vim.

Atau, di bagian bawah jawabannya, Giovanni menyarankan untuk memetakan Caps Lockuntuk melakukan keduanya Control dan Escape tergantung pada lama pers, tetapi ini membutuhkan menginstal perangkat lunak tambahan.

Ctrl-[adalah alternatif yang disukai , karena selalu berfungsi seperti Escape.

Salah satu perbedaan yang nyata dengan Ctrl-Cadalah bahwa ketika meninggalkan edit di modus visual blockwise , Ctrl-Cakan membuat perubahan yang Anda buat pada baris saat ini, tetapi tidak akan mengulangi perubahan atas garis lain di blok, yang merupakan titik modus itu.

Itu juga tidak akan memeriksa singkatan, atau memicu acara InsertLeave. Lihat:help i_CTRL-C


4

Saya sarankan menggunakan plugin saya vim-easyescape .

Plug "zhou13/vim-easyescape"
let g:easyescape_chars = { "j": 1, "k": 1 }
let g:easyescape_timeout = 100
cnoremap jk <ESC>
cnoremap kj <ESC>

Masalah dengan urutan peta sederhana inoremap jj <ESC>adalah bahwa Vim akan berhenti setiap kali Anda mengetik jatau kdalam mode sisipkan (menunggu tombol berikutnya untuk menentukan apakah akan menerapkan pemetaan). Jeda tersebut menyebabkan gangguan visual yang mungkin atau tidak Anda sadari. vim-easyescape tidak memiliki masalah seperti itu dan mendukung batas waktu khusus.


3

Pada terminal vi dan Vim, alt+ single-normal-mode-keyakan bekerja untuk pengeditan cepat di sebagian besar terminal.

Ini berfungsi karena sebagian besar terminal mengirim alt pengubah sebagai karakter pelarian. Misalnya, ketika Anda mengetik alt+kemulator terminal mengirimkan dua karakter ke program yang sedang berjalan: esc, k. Vi dan Vim menafsirkan ini seperti yang Anda harapkan; ia meninggalkan mode penyisipan (karena pelarian) dan menjalankan perintah mode normal (dalam contoh, memindahkan kursor ke atas satu baris).

Ini bisa menjadi cara yang nyaman untuk keluar dari mode penyisipan jika keyboard Anda memiliki tombol alt di sebelah bilah spasi (sehingga dapat ditekan dengan ibu jari, meninggalkan jari-jari Anda di baris rumah), selama Anda menggunakan emulator terminal dengan perilaku ini dan tidak keberatan menjalankan perintah mode normal.


2
Bisakah Anda menguraikan apa itu single-normal-mode-key? Maksudmu Escape?
kenorb

Satu penekanan tombol yang akan Anda gunakan dalam mode normal dapat digunakan dalam mode insert dengan tombol alt. misal Alt + x untuk menghapus karakter.
ewatt

2
Saya juga tidak mengerti jawaban ini; Alt + x sebenarnya tampaknya melakukan sesuatu yang berbeda dari Alt dalam mode normal? Dan beberapa kunci lain sepertinya tidak berfungsi? Tapi mungkin saya salah menggunakannya? Mungkin Anda bisa sedikit memperluas jawaban Anda untuk menjelaskan cara kerjanya, dan tautan ke beberapa dokumen Vim juga bagus :-) Terima kasih! :-)
Martin Tournoij

yang sebenarnya tergantung pada konfigurasi terminal Anda dan umumnya tidak diatur seperti yang Anda sarankan.
Christian Brabandt

1
Saya membenarkan ini, kemudian memeriksa sejarah dan menyadari bahwa karena alasan tertentu seorang moderator telah mengeditnya untuk menambahkan 99% teks dari udara kosong, daripada hanya meninggalkan komentar seperti yang diharapkan kita lakukan. Jadi saya harus membalikkan suara saya. Tentunya apa yang terjadi di sini melampaui lingkup suntingan yang masuk akal? Saya menolak suntingan jauh lebih sedikit mengganggu. Konten baru itu bagus, pasti, tetapi tidak termasuk dalam jawaban ini. Seharusnya itu miliknya sendiri.
underscore_d

3

FWIW saya gunakan:

:map! ;l ^[
:vmap ;l ^[

Rasanya mirip dengan memukul Return. Saya menggunakan ;sebagai pemimpin untuk pemetaan mode Insert lainnya juga.

Satu-satunya waktu saya perlu mengetikkan ';' + huruf adalah saat kode golf; Saya tidak punya konflik apa pun sebaliknya.


mungkin lebih baik memetakannya untuk melarikan diri daripada memetakannya ke ^ [kan? :)
Alexander Mills

2

Saya telah menggunakan Ctrl+ 3sejak beberapa waktu, saya merasa lebih mudah untuk mengetik daripada kebanyakan alternatif dan tampaknya berfungsi dengan baik (setidaknya di Linux). Saya Caps Lockdipetakan ke Ctrl, jadi sangat nyaman untuk mengetiknya.

Saya mencoba menggunakan Ctrl+ cuntuk beberapa waktu, tetapi saya memiliki beberapa masalah dengan itu yang saya tidak ingat sekarang, tapi saya tidak mendapatkan perilaku yang sama persis seperti Esc, seperti yang saya dapatkan sekarang dengan Ctrl+ 3.


2
Apa yang seharusnya dilakukan Ctrl-3?
Christian Brabandt

Saya tidak tahu cara kerjanya, tetapi berfungsi seperti Escdi vanilla Vim. Saya menemukannya secara empiris dengan menguji kombinasi, tidak tahu detail tentang cara kerja internal.
elias

1
Ini bukan hal yang vi, bekerja juga pada shell. Sangat berguna jika Anda memiliki mode vi diaktifkan di shell Anda dengan bindkey -v
golfadas

1

Jika Anda memiliki keyboard US English, menekan Ctrl- [sama dengan menekan Esc. Ini memberikan cara mudah untuk keluar dari mode penyisipan. Atau gunakan Ctrl- c.

Jika Anda telah vim dalam mode mudah ( -y), maka Anda harus menekan Ctrl- l(Control-L) untuk keluar dari mode insert.

Ada juga Ctrl+ oyang hanya akan keluar sementara dari mode penyisipan hanya untuk menjalankan satu perintah dan kembali ke mode penyisipan (lihat :help i_CTRL-O:)

Atau Ctrl+ r, tapi itu hanya untuk memasukkan konten register atau ekspresi, misalnya Ctrl+ r, =5*5(lihat: :help i_CTRL-R, :help c_CTRL-Rdan posting stackoverflow ).

Baca lebih lanjut di: Hindari kunci pelarian di vim wikia


3
FYI: Ctrl+runtuk memasukkan register (termasuk =reg ekspresi ). Jika Anda ingin menjalankan sementara gunakan perintah off Ctrl+o.
Sukima

1

Saya telah bersiap untuk <A-e>melarikan diri:

noremap  <A-e> <Esc>
snoremap <A-e> <Esc>
inoremap <A-e> <Esc>
tnoremap <A-e> <Esc>

" For some reason in command line mode '\e' is interpreted as Enter.
cnoremap <A-e> <C-c>

Sunting: Baru ditemukan <C-\><C\n>yang mengirim Anda ke mode normal dari mode lainnya. Ini juga memiliki perilaku keseluruhan yang lebih baik. Pemetaan menjadi:

noremap <A-e> <C-\><C-n>
noremap! <A-e> <C-\><C-n>

0
nnoremap <C-I> <C-I>
vnoremap <Tab> <Esc>gV
onoremap <Tab> <Esc>
inoremap <Tab> <Esc>`^

Saya remap tab untuk keluar. Saya pikir secara historis di situlah kunci esc dulu, jadi saya menggunakannya dan tidak pernah melihat ke belakang. Saya hampir tidak pernah perlu memasukkan tab dalam dokumen, dan ketika saya melakukannya saya cukup tekan shift + tab. Saya belum pernah melewatkan tab asli yang mengikat.


Paragraf tentang vim dan emacs sama sekali tidak perlu ...
D. Ben Knoble
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.