Saya menggunakan vim untuk mengedit dokumen lateks. Seringkali, saya ingin mengubah nama variabel menjadi sesuatu yang lain. Namun, agak menyebalkan harus mengarungi pertandingan yang tidak relevan ketika saya mencari nama variabel. Saya ingin mencari hanya di "zona matematika" sebagaimana didefinisikan dalam file sintaks tex. Apakah ada cara mudah untuk membatasi pencarian ke wilayah sintaksis tertentu?
10
synIDattr()
untuk mendapatkan grup sintaks untuk karakter di bawah kursor. Anda dapat menulis fungsi yang melakukan pencarian (atau tidaknormal n
) dan kemudian gunakansynIDattr()
untuk memutuskan apakah akan tetap di lokasi ini, atau melanjutkan pencarian ke depan.Jawaban:
Ini adalah fungsi yang bisa Anda coba. Saya hanya mengujinya sedikit tetapi tampaknya berfungsi baik.
Fungsi memanggil fungsi pencarian Vim dalam satu lingkaran sampai menemukan kecocokan 'biasa' yang juga merupakan kecocokan 'terkualifikasi' dengan item sintaksis tertentu, atau sampai mencapai akhir buffer.
Dibutuhkan dua argumen. Yang pertama adalah pola pencarian dan diteruskan tidak berubah ke
search()
fungsi Vim . Lihat:help search()
bagaimana fungsi itu bekerja. Argumen kedua adalah nama item sintaks di mana Anda ingin memfilter pertandingan ini. Ini juga bisa menjadi pola dan dibandingkan sebagai ekspresi reguler yang tidak peka terhadap huruf besar-kecil.Untuk menemukan pola 'alpha' di zona matematika yang bisa Anda lakukan
Pada
.
akhirnya adalah atom pola untuk setiap karakter tunggal, lihat:help /.
. Ini karena ada banyak item sintaks zona matematika yang dipanggiltexMathZoneA
,texMathZoneB
dll.The
search()
Fungsi memindahkan kursor ke pertandingan berikutnya 'biasa'. Kemudian fungsi kami mendapatkan semua ID item sintaks untuk posisi kursor baru tersebutsynstack()
. Melongok melalui mereka, itu mengambil nama setiap item pada gilirannya dan mengujinya terhadapsyntaxitem
argumen. Lihat:help synstack()
dan:help synIDattr()
. Jika ada kecocokan 'terkualifikasi', ia mengembalikan nomor baris. Jika mencapai akhir buffer tanpa menemukan kecocokan yang 'memenuhi syarat' itu kembali0
. Maksud dari fungsi ini adalah untuk mengarahkan kursor ke kecocokan 'terkualifikasi' berikutnya sehingga Anda dapat melakukan beberapa operasi di sana, tetapi akan berguna untuk mengembalikan "nomor baris atau 0" untuk menunjukkan apakah memanggil fungsi itu berarti, karena Misalnya jika Anda ingin memanggil fungsi berulang kali dari fungsi lain atau makro.Saya memilih untuk menggunakan
W
flagsearch()
karena mencegah 'membungkus' ujung buffer. Kalau tidak, fungsi tersebut mungkin macet karena terus menemukan kecocokan 'biasa' yang sama tetapi tidak ada kecocokan 'berkualitas'.sumber
Jika "zona matematika" Anda memenuhi syarat oleh beberapa pola sintaksis, misalnya, string "matematika", maka Anda setidaknya dapat menggunakan urutan pola untuk menemukan garis dengan pola yang cocok, seperti pada:
(Catatan: kedua pola mungkin berada pada garis yang berbeda!)
Ini mungkin tidak membatasi kecocokan Anda ke zona - untuk itu Anda perlu mengidentifikasi akhir zona -, tetapi itu hanya akan menampilkan kecocokan tersebut setelah pola / matematika / awal. Anda dapat mengulangi pencarian untuk kejadian berikutnya dengan menggunakan riwayat mode-ex (
:
up-arrow
enter
).Catatan: ISTR yang pada versi vim / vi sebelumnya saya juga dapat menggunakan metode itu secara langsung sebagai perintah pencarian (sebagai lawan dari perintah mode ex)
/math//your pattern/
dengan keuntungan dari kurang mengetik dan menggunakan perintahn
danN
, tetapi saya tidak dapat mengkonfirmasi itu untuk versi vim saya saat ini.sumber
Jika Anda mencari string
foo
di dalam$...$
atau$$...$$
, ini seharusnya berfungsi:Ini mengaitkan kecocokan dengan
$
karakter tetapi hanya memilih stringfoo
.Ini sebenarnya bukan solusi yang mudah, tetapi orang dapat menggunakan tanda
:global
+:substitute
untuk menemukan "zona matematika" dan mencari di dalamnya:Berpura-pura itu
:substitute
adalah perintah pencarian, Anda bisa pergi ke kejadian berikutnya dengann
dan keluar denganq
. Jika Anda mengkonfirmasi penggantian secara tidak sengaja seharusnya tidak ada masalah.Anda harus mengatur daftar di dalam
%(
...)
ke nama-nama lingkungan matematika yang Anda gunakan (daftar lengkapnya lumayan:)align|alignat|displaymath|eqnarray|equation|flalign|gather|math|multline|subequations|xalignat|xxalignat
. Perhatikan bahwa saya menggunakan pola sangat ajaib (\v
) di sini.Penjelasan:
:global
menjalankan perintah Ex (:s
) pada setiap baris di mana pertandingan pola (:help :global
)/\v
mulai pola yang sangat ajaib (:h /
,:h pattern
,:h magic
)\\begin\{
cocok dengan literal\begin{
%(align|alignat|displaymath)
setiap pertandingan dari kata-kata ini (:h /\%(
,:h /bar
)\}/
cocok dengan literal}
dan mengakhiri pola.+1,/\\end/-1
rentang yang terdiri dari baris berikutnya (dihitung dari yang ditemukan oleh:global
) hingga baris sebelum yang ditemukan oleh pola pencarian/\\end
. Dalam kisaran itu,s/foo/&/gc
cari dan ganti setiap kemunculan literalfoo
dengan dirinya sendiri, setelah konfirmasi (:h :substitute
)sumber
\mathit
sekitar nama variabel, menemukannya jauh lebih mudah.Jika Anda mencari string 'pagi' di dalam file
/morning
lalu entertekan nuntuk bergerak majusumber
I would like to search only in "math zones"
metode Anda mencari seluruh file yang tidak membatasi zona penelitian.Tidak ada pilihan selain menulis fungsi khusus untuk ini. Saya menulis fungsi yang mencari string yang Anda inginkan dan hanya berhenti jika:
Anda cukup menyebutnya dengan string yang ingin Anda cari.
Saya bermaksud untuk menulis fungsi serupa untuk GrammerousCheck yang hanya berhenti pada kesalahan tata bahasa di luar matematika.
sumber