Apa perbedaan antara "urutan kunci yang dipetakan" dan "kode kunci"? (timeoutlen v ttimeoutlen)

20

The pengguna vim mengatakan kita bisa menggunakan timeoutlenuntuk menentukan panjang batas waktu urutan kunci dipetakan dan dapat menggunakan ttimeoutlenuntuk menentukan panjang batas waktu kode kunci :

Pengaturan yang bermanfaat adalah

:set timeout timeoutlen=3000 ttimeoutlen=100

(batas waktu pada pemetaan setelah tiga detik, batas waktu pada kode-kode kunci setelah sepersepuluh detik).

Apa itu kode kunci ? Bagaimana mereka berbeda dari urutan kunci yang dipetakan ?

Saya tahu contoh urutan kunci yang dipetakan adalah jkdari pemetaan di bawah ini:

inoremap jk <esc>

Dalam contoh ini, ketika saya dalam mode dan jenis penyisipan j, vim akan menunggu timeoutlenmilidetik untuk saya tekan ksebelum memutuskan apa maksud saya.

Tetapi apa itu kode kunci dan bagaimana ttimeoutlenpengaruhnya? Terimakasih.

Niko Bellic
sumber

Jawaban:

22

Pendeknya:

  • kode kunci adalah cara untuk mewakili kunci
  • Urutan kunci yang dipetakan adalah serangkaian kode kunci yang memicu suatu tindakan

Sekarang saya pikir pertanyaan Anda lebih tentang perbedaan antara timeoutlendan ttimeoutlenbukannya perbedaan antara urutan kunci yang dipetakan dan kode kunci.

Jawaban saya didasarkan pada artikel wikia ini yang harus Anda baca karena membahas beberapa poin yang tidak saya sebutkan di sini untuk menjaga jawaban sesingkat dan sejelas mungkin.


Pertama mari kita bicara tentang kode kunci. Artikel ini mendefinisikan dua jenis kode kunci:

  • Kode kunci terminal:

    Mereka adalah bagaimana terminal mewakili kunci.

    Kode-kode ini yang dikirim oleh terminal ke Vim.

    Untuk mendapatkan daftar kode kunci ini, Anda harus menggunakan dokumentasi terminal Anda. Anda juga dapat melihatnya dengan mengetikkan perintah catdi terminal Anda dan mengetikkan kunci yang ingin Anda ketahui kode kunci. Misalnya pada terminal saya kode kunci untuk ShiftF1terlihat seperti:

    ^[[23~

  • Kode kunci Vim:

    Mereka adalah bagaimana vim mewakili kunci.

    Vim membutuhkan cara yang konsisten untuk mewakili kunci karena kode kunci terminal berubah dari terminal ke terminal lain. Daftar kode akses Vim dapat diakses di :h t_ku. Kode kunci Vim untuk ShiftF1terlihat seperti:

    <S-F1>

Jadi ketika saya menekan ShiftF1keyboard saya, driver dan OS akan membiarkan terminal tahu bahwa saya menekan tombol-tombol ini yang akan ditafsirkan sebagai ^[[23~. Terminal akan mengirimkannya ke Vim yang akan mengerti artinya <S-F1>dan akan memicu tindakan yang dipetakan ke kode kunci ini.

Kami dapat menetapkan kode kunci Vim, jadi jika terminal Anda mengirim kode kunci yang tidak dimengerti oleh Vim, <S-F1>misalnya Anda bisa menggunakan perintah berikut. Ini akan memberi tahu Vim ketika Anda menerima kode kunci ^[[24~, terjemahkan <S-F1>:

set <S-F1> ^[[24~

Jadi, apa urutan kunci yang dipetakan?

Urutan kunci yang dipetakan akan menjadi lhs pemetaan dan dapat berupa kode kunci Vim atau kode kunci Terminal. Sebagai contoh:

:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>

Pemetaan pertama akan memetakan kode kunci terminal sementara yang kedua memetakan kode kunci Vim.

Sekarang untuk perbedaan antara timeoutlendan ttimeoutlen?

  • ttimeoutlenadalah waktu Vim akan menunggu untuk bagian-bagian yang berbeda dari kode kunci terminal (dalam contoh kita sebelumnya yang akan ^[kemudian [kemudian 2, dll ...

    Karena kode kunci ini dikirim oleh terminal, seharusnya tidak ada penundaan di antara input ini (karena mereka dikirim 'sekaligus' oleh terminal). Inilah sebabnya mengapa dokter merekomendasikan nilai yang sangat kecil untuk pengaturan ini.

  • timeoutlen adalah waktu Vim akan menunggu kode kunci Vim berturut-turut yang dimasukkan secara manual oleh pengguna dan dengan demikian lebih lama untuk dimasukkan daripada kode kunci terminal.

Untuk menggunakan contoh katakanlah:

  • Anda memetakan ^[[1;6Bsuatu tindakan
  • ^[1;6B adalah kode kunci terminal Anda ctrlshiftdown
  • ^[adalah kode kunci terminal Anda Escape.

Perilaku yang harus Anda harapkan:

  • Jika Anda menetapkan besar ttimeoutlen, setiap kali Anda mengetik Escape, Vim akan menunggu untuk melihat apakah yang Anda maksudkan ^[(yaitu Escape) atau ^[1;6B(yaitu ctrlshiftdown)
  • Jika Anda menetapkan kecil ttimeoutlen, Anda tidak akan memiliki penundaan ketika Anda mengetik Escapekarena Vim akan tahu bahwa itu adalah kode kunci lengkap.

Dan timeoutlenakan bertindak pada 'tingkat yang lebih tinggi', jika Anda memiliki pemetaan berikut:

inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>

Ketika Anda mengetik jvim akan menunggu timeoutlenbukan karena awal kode kunci terminal jtidak lengkap tetapi karena menunggu kode kunci Vim berikutnya.


Saya harap penjelasan saya masuk akal, perhatikan bahwa beberapa pemetaan yang saya gunakan tidak masuk akal dalam sudut pandang fungsional tetapi di sini untuk kenyamanan penjelasan.

statox
sumber