Bagaimana saya bisa memperlakukan kutipan LaTeX sebagai objek teks?

29

Tanda kutip di LaTeX berbeda dari pada teks normal, karena diformat ``like this''(atau `like this'untuk tanda kutip tunggal). Ini membuatnya sulit untuk dinavigasi melalui mereka di Vim.

Saya biasanya menggunakan sesuatu seperti T`ct'(mundur sampai `, ganti sampai '). Namun, ini kikuk dan tidak wajar. Saya lebih suka untuk dapat menggunakan sesuatu di sepanjang baris ciq( "perubahan dalam tanda kutip"), seperti yang saya bisa lakukan ciw, ca), ci", ca', dll

Apakah ada cara untuk memberitahu Vim untuk memperlakukan ``LaTeX'' `quotes'sebagai objek teks? (Sebagai nilai tambah, apakah ada cara untuk hanya memicu ini saat mengedit .texfile?)

Gagang pintu
sumber

Jawaban:

10

Saya tidak tahu LaTeX tetapi ini sepertinya berhasil:

vnoremap iq :<C-U>silent! normal! t'vT`<CR>
omap iq :normal viq<CR>

Saya mendasarkan ini dari informasi di sini: http://vim.wikia.com/wiki/Creating_new_text_objects

Anda juga dapat menambahkan dukungan aq:

vnoremap aq :<C-U>silent! normal! f'vF`<CR>
omap aq :normal vaq<CR>
superjer
sumber
Ini berfungsi untuk iq, tetapi tampaknya tidak bekerja dengan, misalnya daq,.
Gagang pintu
Kanan. Anda dapat membuatnya bekerja dengan aqjuga dengan pemetaan serupa yang serupa. Saya mengedit jawabannya. Saya juga bertukar T` dengan t 'dalam pemetaan sehingga mencari terlebih dahulu, yang tampaknya lebih alami bagi saya.
superjer
Ini bekerja untuk tanda kutip tunggal, namun daqpada ``foo''hanya hasil dalam `foo'.
Gagang pintu
Saya tidak berpikir metode ini dapat bekerja lebih dari satu tanda kutip. Anda akan perlu untuk melakukan pemeriksaan lebih dalam teks dari fdan toperator mengizinkan, yang akan membutuhkan menulis seluruh fungsi dengan variabel dan segala sesuatu. Saya tidak punya waktu untuk melakukannya sekarang.
superjer
7

Sunting : Saya baru saja menemukan plugin vim-textobject-latex , yang menambahkan fungsionalitas tepat yang Anda cari (selain beberapa hal lainnya). Dari README plugin:

Objek teks yang didukung saat ini adalah:

a   i   Description
a\\ i\\ Inline math surrounded by ``\\(`` and ``\\)``.
a$  i$  Inline math surrounded by dollar signs.
aq  iq  Single-quoted text ``\`like this'``.
aQ  iQ  Double-quoted text ``\``like this''``.
ae  ie  Environment ``\begin{...}–\end{...}``

Jadi Anda bisa menggunakan caqdan sejenisnya seperti yang Anda inginkan. Saya mengujinya, dan berfungsi seperti yang diiklankan, tetapi perhatikan bahwa itu tergantung pada plugin vim-textobject-user . Perhatikan juga Anda harus memastikan bahwa textobject-userplugin memuat terlebih dahulu , jika tidak semuanya tidak akan berfungsi.


Namun, jika Anda tidak ingin mengacaukan plugin, jawaban asli saya tetap berguna:

Menambahkan dua baris ini ke Anda .vimrcakan mencakup sebagian besar yang Anda inginkan.

onoremap aq :<c-u>normal! F`vf'<cr>
onoremap iq :<c-u>normal! T`vt'<cr>

Ini membuat objek teks baru ( aqdan iq) yang kembali ke sebelumnya `, masuk ke mode pemilihan visual, lalu pilih ke yang berikutnya '.

Ini akan bekerja untuk ciq, caq, yiq, dan diq. Namun, yaqdan daqtidak akan mencabut / menghapus tanda kutip luar, jadi saya membuat objek teks lain a",, untuk mengatasinya ( i"tidak diperlukan, tapi saya menambahkan agar semuanya konsisten:

onoremap a" :<c-u>normal! 2F`v2f'<cr>
onoremap i" :<c-u>normal! 2T`v2t'<cr>

Kelemahan utama di sini adalah bahwa ini akan merusak penggunaan normal ca", dll. Jika Anda mendahului mereka au FileType tex, Anda hanya akan memiliki masalah dalam .texfile, tetapi kadang-kadang masih menjadi gangguan. Anda juga bisa memberi nama objek seperti ad/ id('d' untuk 'double' quote), tapi itu sepertinya kurang intuitif bagi saya (saya bertujuan untuk perbedaan paling sedikit dari operasi normal).

Satu-satunya cara saya bisa memikirkan untuk membungkus ini menjadi hanya dua objek teks adalah dengan menulis fungsi yang memeriksa kutipan lain di luar set pertama dan mengatur aqobjek teks untuk memanggil itu.

Catatan : Ada beberapa masalah kecil lainnya dengan ini:

  1. Yanking mungkin meninggalkan kursor Anda di tempat yang tidak terduga (ini bisa diperbaiki dengan menambahkan menggunakan tanda pada perintah (mis. ma2F`v2f'<cr>`a), Pastikan untuk tidak menggunakan kursor yang sering Anda gunakan secara manual)
  2. Kursor harus berada di dalam tanda kutip; hal-hal aneh terjadi jika ada di kutipan.

Untuk mengakhiri semua itu, inilah yang secara pribadi akan saya tambahkan ke saya .vimrcuntuk masalah ini:

augroup filetype_latex
    au!
    au FileType tex,plaintex onoremap a' :<c-u>normal! muF`vf'<cr>`u
    au FileType tex,plaintex onoremap i' :<c-u>normal! muT`vt'<cr>`u
    au FileType tex,plaintex onoremap a" :<c-u>normal! mu2F`v2f'<cr>`u
    au FileType tex,plaintex onoremap i" :<c-u>normal! mu2T`v2t'<cr>`u
end augroup

Seperti yang Anda lihat, saya memilih untuk melanggar fungsionalitas normal ca'/ ya"/ etc jadi saya tidak perlu belajar perintah baru karena saya tidak akan menggunakan fungsionalitas normal sebanyak di dalam LaTeX. Itu hanya preferensi pribadi; tidak sulit untuk berganti nama objek. Saya juga menambahkan deteksi filetype dan tanda.

SnoringFrog
sumber
2

Ini adalah pertanyaan lama tetapi untuk kepentingan pengunjung masa depan: Saya merasa lebih mudah untuk mengubah kutipan lateks dengan:

\usepackage{csquotes} % change " " into nice double quotes  
\MakeOuterQuote{"}

Dan kemudian This thing is "Foobar"!akan berfungsi dengan baik dalam vim dan lateks.

pengguna10607
sumber
0

Plugin vim-sandwich

Plugin lain yang bermanfaat untuk ini adalah vim-sandwichyang telah menentukan lingkungan khusus-ft

  • l`atau l'untuk `text',
  • l"untuk ``text''dan
  • objek teks agar mudah dioperasikan.

Dengan pemetaan default, pekerjaan berikut

  • textobject: ganti teks dalam `text'dengan cisl'atau jika deteksi otomatis di sekitar terdekat baik-baik saja cib(mis. kursor hmasuk `a (phony) text'perlu ditekan vibibc). Namun, Anda dapat menentukan objek teks tambahan berikut iq(contoh OP) omap <unique> iq <Plug>(textobj-sandwich-query-i)l' xmap <unique> iq <Plug>(textobj-sandwich-query-i)l' omap <unique> aq <Plug>(textobj-sandwich-query-a)l' xmap <unique> aq <Plug>(textobj-sandwich-query-a)l' omap <unique> iQ <Plug>(textobj-sandwich-query-i)l" xmap <unique> iQ <Plug>(textobj-sandwich-query-i)l" omap <unique> aQ <Plug>(textobj-sandwich-query-a)l" xmap <unique> aQ <Plug>(textobj-sandwich-query-a)l" Sekarang cukup dengan menekan ciqatau ciQberfungsi.
  • tambahkan ke textdengan saiwl'apostrof tunggal untuk mendapatkan `text'
    Pola perintah adalah sa{motion/textobject}{surrounding}dan sarana Invoke Operator add surroundingdi inner worddan jenis surround adalah latex single quote.
  • hapus dengan sdl'atau dengansdb
  • ubah dengan srl'l"atau dengansrbl"

Ini mendukung

Hotschke
sumber