Dalam vim, cari mundur untuk kawat gigi / paren yang cocok

9

Karena sebagian besar dari Anda mungkin tahu, Anda dapat menggunakan %untuk mencari maju pada baris untuk menemukan penjepit / braket / paren berikutnya dan pindah ke pasangan yang cocok:

|a|rray[index] = value;
" |e| is the cursor; hit %:
array[index|]| = value;

Saya berharap ada kunci serupa yang mencari mundur di telepon, misalnya:

array[index] = value|;|
" |;| is the cursor again, hit the key I'm looking for:
array|[|index] = value;

Kebanyakan perintah vim memiliki perintah mundur dan maju, jadi sepertinya ini harus dilakukan. Apakah itu tidak memiliki pasangan? Jika demikian, apakah itu karena setelah itu pada karakter dipasangkan mereka akan bertindak sama?

Kevin
sumber
Perlu dicatat bahwa %tidak hanya mencari braket berpasangan pada baris yang sama, tetapi lebih jauh ke bawah file. Saya menyukainya terutama untuk loop dll dalam bahasa pilihan program.
Bernhard
1
@ Bernhard Ya, tetapi hanya ketika menemukan salah satu kawat gigi di telepon.
Kevin
Jika Anda tidak menentang skrip addon, addon matchit menyediakan g%perintah yang tampaknya mirip dengan yang Anda cari.
jw013
Tapi konyol, pertanyaan Anda menyatakan bahwa Anda ingin tahu mengapa tidak ada pasangan. Apakah maksud Anda "adakah pasangan yang tidak saya kenal?" :)
rjewell
@ rjewell OK, saya sudah membaginya sehingga tidak lagi secara teknis menanyakan itu.
Kevin

Jawaban:

4

Jika Anda benar - benar ingin mencari ke belakang untuk menemukan karakter umum yang cocok, Anda dapat menggunakan salah satu dari vimperintah - spesifik ini :

  • [(... (buka (karakter sebelumnya yang tidak cocok )
  • [{... (buka {karakter sebelumnya yang tidak cocok )

Dua perintah ini memiliki mitra penyerang yang cocok:

  • ])... (buka )karakter berikutnya yang tidak cocok )
  • ]}... (buka }karakter berikutnya yang tidak cocok )

Ada perintah serupa lainnya untuk #ifdefdan untuk komentar C.

Anda dapat menemukan lebih banyak ketika masuk vimdengan menggunakan perintah :help %.

Mei
sumber
Saya tahu ini, masalahnya adalah mereka menemukan tak tertandingi pasangan, saya harus mencari cocok pasang.
Kevin
@Kevin: Saya salah mengerti dokumen (menghela nafas). Tentu saja, setelah Anda menggunakannya, %maka keduanya berjalan - menemukan pasangan yang cocok. Juga, jika di dalam blok, maka perintah di atas akan menemukan kecocokan yang sesuai.
Mei
3

% menemukan braket yang cocok. Jadi jika Anda aktif (atau {itu akan mencari maju.

Jika Anda menggunakan} atau) itu akan mencari mundur.

% bukan arah, itu hanya menemukan braket yang cocok.

Richard Holloway
sumber
Jika saya berada di belakang satu sisi pasangan,% akan menemukan pasangannya. Jika saya berada di ujung garis, itu tidak akan menemukan pasangan sebelumnya di garis.
Kevin
Bukankah ini harus dipilih jawaban yang benar?
Jack
2

Saya baru saja mencoba :map ^] ^%%(dengan ^]= Ctrl+ v Ctrl+ di 5sini, sebagai analogi dengan %= Shift+ 5).

Ini berfungsi untuk kasus tertentu yang diberikan, tetapi karena ia tidak mencari mundur dari kursor, itu akan selalu memilih kurung buka pertama di baris, dan meninggalkan kursor Anda di awal baris jika tidak menemukan kecocokan apa pun .


Ini adalah solusi yang lebih baik; itu jelek dan mungkin ada banyak ruang untuk disederhanakan, tapi saya pikir semantiknya benar (tidak memindahkan kursor jika tidak ada paren terbuka, dan pindah ke paren terbuka pertama sebelum kolom saat ini).

:map ^] ^[:call search("[({[]", "bes", line("."))^M

untuk

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return
Tak berguna
sumber
Ini tidak akan sama jika ada dua pasangan yang tidak bersarang pada satu baris, tetapi tentu saja ini adalah saran terbaik sejauh ini, terima kasih.
Kevin
Ini hanya akan berfungsi dalam satu blok, bukan? Jika demikian, maka [(akan berfungsi dengan baik dan tidak memerlukan map.
Mei
Harus ada blok yang dimulai pada baris saat ini, ya. Saya telah menemukan solusi yang lebih lengkap, edit datang ...
berguna