Bagaimana saya bisa mendapatkan 'n' untuk maju bahkan jika saya mulai mencari dengan '?' atau '#'?


19

Vim memiliki (setidaknya) dua set perintah yang mencari di arah yang berlawanan. Mengetik /dan kemudian suatu pola akan mencari ke depan melalui dokumen untuk pola tersebut; mengetik ?dan kemudian sebuah pola akan mencari mundur. Hubungan yang sama ada antara perintah *dan #.

Yang tidak saya sukai adalah bahwa perintah ini juga mengatur arah pencarian untuk ndan Nperintah. Setelah menggunakan /, nmaju terus ke dokumen dan Nmundur; setelah menggunakan ?, nmundur dan Nmaju. (Dengan kata lain, nselalu berjalan ke arah yang sama dengan pencarian asli dan Nselalu berjalan ke arah lain.)

Bagaimana saya bisa nmaju melalui dokumen, dan Nuntuk mundur, terlepas dari arah mana saya mulai mencari?

Jawaban:


29

Anda dapat mengubah perilaku ndan Nuntuk mencari secara konsisten ke bawah / ke atas dengan menggunakan yang berikut ini:

nnoremap <expr> n 'Nn'[v:searchforward]
nnoremap <expr> N 'nN'[v:searchforward]

Pembaruan: Bagaimana cara kerjanya?

Ini menggunakan ekspresi-peta, yang memetakan lhs peta ke ekspresi yang akan dievaluasi, setiap kali lhs ditemukan. Lihat :h map-expressiondi bantuan.

Apa yang terjadi adalah, bahwa variabel v: searchforward (yang menentukan keadaan internal ke arah mana pencarian terakhir itu, lihat :h v:searchforward) digunakan sebagai indeks untuk string di depannya. Jadi dalam kasus peta pertama, jika arah pencarian terakhir adalah maju, n akan dipetakan ke 'n' (indeks 1, yang berarti mengembalikan karakter kedua) dan jika itu mundur, 'n' akan dipetakan ke 'N' (karena variabel v: searchforward adalah 0 dan oleh karena itu 'N' akan dikembalikan.

Cara alternatif untuk menulis peta tersebut adalah (yang mungkin lebih jelas):

nnoremap <expr> n (v:searchforward ? 'n' : 'N')
nnoremap <expr> N (v:searchforward ? 'N' : 'n')

Ada juga beberapa plugin, yang melakukan itu (yaitu plugin SearchRepeat dan mungkin yang lain juga).


Terima kasih telah menyebutkan plugin saya; Saya baru saja akan merekomendasikan itu sebagai alternatif :-)
Ingo Karkat

2
Penggunaan langganan yang cerdas!
wchargin

6
Bisakah Anda menambahkan penjelasan? Saya belum pernah melihat sintaks ini sebelumnya, dan saya ingin tahu cara kerjanya.
EvergreenTree

1
@EvergreenTree: Menambahkan beberapa penjelasan lagi
Christian Brabandt

2
@ChristianBrabandt Itu sangat pintar. Saya tidak pernah menganggap Anda menggunakan v:searchforwardsebagai indeks.
EvergreenTree

1

Berdasarkan solusi Christian Brabandt saya datang dengan

nnoremap <expr> n 'Nn'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')
nnoremap <expr> N 'nN'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')

Pemetaan ini juga mematuhi foldopenpengaturan


0

Saya menggunakan plugin SearchIndex . Untuk menggunakan jawaban Christian Brabandt tetapi tetap menggunakan fungsi plugin untuk menampilkan nomor pertandingan setiap kali saya mengetik natau N, saya memasukkan ini ke vimrc saya:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
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.