Bisakah saya menggunakan mode edit Vim di baris perintah tanpa kehilangan pencarian riwayat rekursif?

8

Saya menggunakan zsh dan, karena saya pengguna Vim yang rajin, saya baru saja beralih menggunakan pengeditan gaya Vim pada baris perintah. (Itu berarti jika saya mengetik ls foo/bardan memutuskan saya ingin cdsebaliknya, saya dapat menekan Esc ^untuk melompat kembali ke awal dan cw cdmengubah lske cd.

Itu semua bagus, tetapi masalahnya adalah saya tidak bisa lagi menggunakan Ctrl+Runtuk melakukan pencarian riwayat rekursif. Apakah ada cara lain untuk melakukannya, atau bisakah saya entah bagaimana mengesampingkan penguncian kunci Vim untuk mendapatkannya kembali?

Nathan Long
sumber
Pilihan yang sulit! garyjohnmenunjukkan cara Vim untuk melakukannya, dan JdeBPmenunjukkan cara mendapatkan kembali keybinding untuk Ctrl + R! Saya akan bermain dengan kedua metode dan menerima jawaban nanti. Saya akan memutuskan berdasarkan pada 1) metode mana yang tampaknya lebih mudah bagi saya dan 2) yang mendapat lebih banyak upvotes. Terima kasih untuk kalian berdua!
Nathan Long

Jawaban:

6

Tentu saja Anda tidak bisa lagi menggunakan Ctrl+ R. Jika Anda membaca manual Z Shell, Anda akan melihat bahwa hanya ada kunci yang mengikat untuk history-incremental-search-backwardwidget di emacskeymap. Tidak ada ikatan utama untuk itu di vi keymaps.

Tetapi seperti yang juga akan Anda temukan dari membaca manual (Ini bab 18.), menambahkan pengikatan kunci adalah latihan yang cukup sederhana dalam penggunaan bindkeyperintah:

bindkey "^R" history-incremental-search-backward

Anda bahkan tidak perlu menggunakan zleperintah untuk memetakan widget ke fungsi shell, karena ini adalah widget standar.

Jika Anda membaca jawaban untuk pertanyaan yang sama yang ada di wiki Z Shell , Anda akan melihat perintah untuk menambahkan ini secara khusus ke vi "command" dan "insert mode" keymaps:

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward

Juga catat bahwa, seperti yang ditunjukkan garyjohn , dalam keymap "perintah" vi, /karakter terikat ke vi-history-search-backwardwidget. Perbedaan antara widget ini dan history-incremental-search-backwardwidget adalah perilaku widget yang berlaku setelah seseorang dalam mode pencarian riwayat. Berikut adalah beberapa perbedaan yang akan Anda perhatikan:

  • Beralih mode vi:
    • Mode pencarian di history-incremental-search-backwardmatikan antara maindan vicmdkeymaps ketika Anda mengaktifkan vi-cmd-modewidget sementara masih dalam mode pencarian. yaitu dari emacsmode menekan Esctombol atau Ctrl+ XCtrl+ untuk mengaktifkan mode Vpencarian antara emacsdan vicmdkeymaps. (Meminta history-incremental-search-backwarddari vicmdkeymap dengan demikian merepotkan, kecuali Anda mengikat sesuatu ke vi-cmd-modedalam vicmdkeymap juga.)
    • Mode pencarian dalam vi-history-search-backwardmemperlakukan vi-cmd-modewidget sebagai accept-linedan akan mengakhiri pencarian, memasukkan kembali mode perintah yang Anda masukkan pencarian. yaitu (dengan binding default) /memasuki mode pencarian dari mode perintah dan Esckembali ke mode perintah.
  • Mengulangi pencarian:
    • Di history-incremental-search-backward, keduanya history-incremental-search-backwarddan vi-rev-repeat-searchwidget dikenali. yaitu (dengan anggapan bahwa Anda telah mengubah binding seperti di atas) baik Ctrl+ Rdan Nakan mencari baris yang cocok sebelumnya.
    • Di vi-history-search-backward, hanya vi-rev-repeat-searchwidget yang dikenali. yaitu (dengan anggapan bahwa Anda telah mengubah binding seperti di atas) Ctrl+ Rakan menyebabkan bunyi bip dan diabaikan.
JdeBP
sumber
Memori otot saya memberkati Anda!
Nathan Long
4

Dalam mode vi bash, mengetik <Esc>/<string><Enter>akan mencari riwayat perintah <string>. nakan mencari lebih jauh ke belakang dalam sejarah; Nakan mencari ke depan. zshell mungkin sama.

garyjohn
sumber
1
Itu menarik, meskipun - saya sering menggunakan pencarian sebagai gerakan di Vim. Saya kira saya tidak bisa menggunakannya untuk bergerak di dalam perintah yang sedang saya edit, karena ini dipatok untuk mencari riwayat, eh?
Nathan Long
Baik. Tetapi Anda dapat (setidaknya dalam bash) menggunakan f, F, t, T, ';' (titik koma), dan perintah ',' (koma) untuk bergerak maju dan kembali ke karakter tertentu di baris.
garyjohn
1

Saya lebih suka menggunakan:

bindkey -M vicmd '/' history-incremental-search-backward

Dengan cara ini saya bisa mengetik ESC /textdan melihat baris perintah. Jika saya ingin pergi pertandingan berikutnya saya ketikESC n

Jonas Fagundes
sumber