Cara mencari baris yang cocok dengan baris saat ini di vim

11

Saya biasanya mencari kata-kata :/string, tetapi jika saya harus mencari seluruh baris saat ini, bagaimana melakukannya.

event: 1  beacon: 0x02              //line 1
event: 19 beacon: 0x02              //line 2
event: 1  beacon: 0x03              //line 3
event: 1  beacon: 0x02              //line 4
event: 8  beacon: 0x01              //line 5
event: 19 beacon: 0x02              //line 6
event: 1  beacon: 0x02              //line 7

Misalnya, jika cursorsaat ini pada line 1cara mencari sama seperti :/untuk teks yang mengandung seluruh baris saat ini. Kursor harus melompat kemudian ke pencocokan line 4, dan lagi keline 7

manav mn
sumber

Jawaban:

7

Begini cara saya melakukannya:

  1. Tarik baris (ke register yang tidak disebutkan namanya), tanpa menyertakan baris baru di akhir: 0y$
  2. Lakukan pencarian yang sangat nomagik :/\V
  3. Tambahkan baris menarik: <c-r>"
  4. Matikan pencarian: <cr>

Seperti yang ditunjukkan oleh @EvergreenTree dalam komentar , Anda tentu saja dapat membuat pemetaan untuk melakukan semua langkah sekaligus:

nnoremap <leader>* 0y$/\V<c-r>"<cr>

Topik bantuan yang relevan:

:help registers
:help /magic
:help c_CTRL-R

NB Jika garis yang Anda cari mengandung garis miring terbalik, Anda masih harus melewati dan menghindarinya (dengan menambahkan garis miring terbalik lainnya), bahkan dengan pencarian yang sangat nomagik .

Kaya
sumber
4
Tentu saja, Anda juga dapat membuat pemetaan untuk ini: nnoremap {key} 0y$/\V<c-r>"<cr>
EvergreenTree
9

Khusus untuk keperluan pemetaan, saya menemukan menggunakan getline()lebih elegan daripada melakukan menarik sendiri. Memanggil getline()dengan string '.'mengembalikan garis di bawah kursor. Ada dua opsi yang baik untuk menggunakan ini:

:exec '/' . getline('.')

yang mem-parsing string '/'dan apa yang dikembalikan dari getline()bersama dan mengeksekusi itu sebagai perintah vim.

atau

/<C-r>=getline('.')<CR>

yang menggunakan register ekspresi @=. Ekspresi berikut =dievaluasi setelah yang pertama <CR>dan ditempatkan di baris perintah.

Sakari Cajanus
sumber
Bagus! Ketika baris berisi karakter suka /atau 'tidak bekerja dengan baik. Bagaimanapun, saya belajar sesuatu hari ini! Terima kasih
Luc M
4

Secara pribadi saya akan mendapatkan plugin bintang visual ( ada beberapa di luar sana ). Ada Vimcast yang bagus tentang ini: Cari teks yang dipilih . Ini berarti Anda dapat memilih jalur secara visual dan kemudian tekan *.

Jika sebuah plugin bukan pilihan Anda, Anda dapat menambahkan pemetaan berikut ke vimrc:

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>

Catatan: Visual-block ( <c-v>) tidak didukung untuk pemetaan ini.

Peter Rincker
sumber
Saya menambahkan pemetaan tetapi sebenarnya itu melompat ke kata yang cocok pertama dan TIDAK memilih seluruh baris.
manav mn
Jika cocok dengan kata maka saya menganggap Anda menggunakan *dari mode normal atau tidak memiliki pemetaan yang diinstal dengan benar.
Peter Rincker
4

Semua jawaban yang ada gagal jika baris Anda berisi item tertentu yang ditafsirkan sebagai bagian dari suatu pola. The \VTitik mendapat sebagian besar jalan di sana tapi masih mengacaukan dengan garis miring terbalik.

Coba ini untuk melarikan diri dari garis miring terbalik ...

/\V<C-R>=escape(getline('.'), '\')

Dan kemudian jika Anda menggunakannya dalam pemetaan, Anda akan membutuhkan satu atau dua <Enter>s pada akhirnya tergantung pada bagaimana Anda ingin itu berfungsi.

dash-tom-bang
sumber
Jawaban yang sangat bagus! Garis sering berisi kedua jenis garis miring yang membingungkan jawaban lainnya. Argumen terakhir untuk melarikan diri itu harus mencakup tebasan ke depan juga:escape(…, '/\')
bobbogo
2

Dengan vim-asterisk terinstal, gunakan saja V$*(atau 0v$*) untuk memilih jalur saat ini dan mencarinya.

Pada perintah kedua 0tidak perlu jika kursor sudah di awal baris.

adelarsq
sumber
1
Tidak *hanya mencari kata di bawah kursor, dan bukan pilihan visual saat ini?
EvergreenTree
1
@ EvergreenTree Saya memang lupa menyebutkan plugin. Terima kasih atas pemberitahuannya
adelarsq
2

Satu lagi cara untuk melakukan ini adalah menggunakan jendela baris perintah: yy/<Ctrl-F>p<Enter>

  • Tarik seluruh baris yang Anda butuhkan yy
  • Tekan /lalu Ctrl-F untuk membuka jendela baris perintah
  • Tekan puntuk menempelkan garis
  • Tekan Enter untuk memulai pencarian
Boris Serebrov
sumber
5
Anda juga dapat menggunakan q/untuk mendapatkan efek yang sama seperti/<c-f>
evilsoup
2

http://vim.wikia.com/wiki/Searching_for_expressions_which_include_slashes menunjukkan bahwa register pencarian dapat diatur secara langsung, seperti ini:

:let @/='/abc/def/ghi/'

Ini memungkinkan pencarian pada baris dan bekerja bahkan ketika baris menyertakan garis miring.

Jadi untuk membuat, katakanlah, \*petakan pencarian garis:

nnoremap <leader>* :set hlsearch<cr>:let @/=getline('.')<cr>
Bernard Ogden
sumber