Wie kann ich LaTeX-Anführungszeichen als Textobjekt behandeln?

29

Anführungszeichen in LaTeX unterscheiden sich von normalem Text darin, dass sie formatiert sind ``like this''(oder `like this'für einfache Anführungszeichen). Dies erschwert die Navigation in Vim.

Ich benutze normalerweise so etwas wie T`ct'(rückwärts bis `, ändern bis '). Dies ist jedoch klobig und unnatürlich. Ich würde es vorziehen, um etwas entlang der Linien von verwenden ciq( „change in Anführungszeichen“), so wie ich tun kann ciw, ca), ci", ca'etc.

Gibt es eine Möglichkeit, Vim anzuweisen, sie ``LaTeX'' `quotes'als Textobjekte zu behandeln ? (Gibt es eine Möglichkeit, dies nur beim Bearbeiten einer .texDatei auszulösen ?)

Türknauf
quelle

Antworten:

10

Ich kenne LaTeX nicht, aber das scheint zu funktionieren:

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

Ich habe dies anhand der Informationen hier begründet: http://vim.wikia.com/wiki/Creating_new_text_objects

Sie können auch Unterstützung hinzufügen für aq:

vnoremap aq :<C-U>silent! normal! f'vF`<CR>
omap aq :normal vaq<CR>
superjer
quelle
Dies funktioniert zum Beispiel für iq, scheint aber nicht damit zu funktionieren daq.
Türknauf
Recht. Sie können es aqauch mit einer zusätzlichen ähnlichen Zuordnung zum Laufen bringen. Ich habe die Antwort bearbeitet. Ich habe auch T` mit t 'im Mapping vertauscht, damit es zuerst nach vorne sucht, was mir natürlicher erscheint.
Superjer
Dies funktioniert für einfache Anführungszeichen, aber daqauf ``foo''nur Ergebnisse in `foo'.
Türknauf
Ich denke nicht, dass diese Methode für mehr als einfache Anführungszeichen arbeiten kann. Sie müssten den Text genauer untersuchen, als die Operatoren fund dies tzulassen. Dazu müssten Sie eine ganze Funktion mit Variablen und allem schreiben. Ich habe momentan keine Zeit dafür.
Superjer
7

Bearbeiten : Ich habe gerade das Plugin vim-textobject-latex entdeckt , das genau die Funktionalität hinzufügt, nach der Sie suchen (neben ein paar anderen Dingen). Aus der README des Plugins:

Derzeit unterstützte Textobjekte sind:

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{...}``

So können Sie caqund dergleichen verwenden, wie Sie wollten. Ich habe es getestet und es funktioniert wie angekündigt, beachte aber, dass es vom vim-textobject-user- Plugin abhängt . Beachten Sie auch, dass Sie sicherstellen müssen, dass das textobject-userPlugin zuerst geladen wird, sonst funktionieren die Dinge nicht.


Wenn Sie sich jedoch nicht mit Plugins herumschlagen möchten, bleibt meine ursprüngliche Antwort nützlich:

Wenn Sie diese beiden Zeilen hinzufügen, .vimrcwird das meiste abgedeckt, was Sie möchten.

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

Diese erstellen neue Textobjekte ( aqund iq), die zum vorherigen zurückkehren `, in den visuellen Auswahlmodus wechseln und dann zum nächsten wechseln '.

Dies funktioniert für ciq, caq, yiq, und diq. Allerdings yaqund daqnicht yank / die äußeren Anführungszeichen löschen, so dass ich einen anderen Textobjekt erstellt, a", dass behandeln ( i"nicht benötigt wird, aber ich hinzugefügt Dinge konsistent zu halten:

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

Der Hauptnachteil hier ist, dass dies den normalen ca"Gebrauch usw. stört. Wenn Sie sie mit einem Vorwort versehen au FileType tex, haben Sie nur dieses Problem in den .texDateien, aber es kann gelegentlich dennoch ärgerlich sein. Sie könnten das Objekt auch so benennen wie ad/ id('d' für 'double' quote), aber das erschien mir weniger intuitiv (ich habe den geringsten Unterschied zum normalen Betrieb angestrebt).

Die einzige Möglichkeit, diese in nur zwei Textobjekte zu packen, besteht darin, eine Funktion zu schreiben, die nach einem anderen Anführungszeichen außerhalb des ersten Satzes sucht und die aqTextobjekte so einstellt, dass sie das aufrufen.

Hinweis : Es gibt einige kleinere Probleme mit diesen:

  1. Durch Ruckeln kann der Cursor an einer unerwarteten Stelle stehen (dies kann durch Hinzufügen einer Markierung in den Befehlen behoben werden. Verwenden Sie nur keine Markierung, die ma2F`v2f'<cr>`aSie häufig manuell verwenden.)
  2. Der Cursor muss sich innerhalb der Anführungszeichen befinden. seltsame Dinge passieren, wenn es in Anführungszeichen steht.

Um das alles zusammenzufassen, ist dies, was ich persönlich zu meinem .vimrcfür diese Ausgabe hinzufügen würde :

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

Wie Sie sehen, habe ich mich dafür entschieden, die normale ca'/ ya"/ etc-Funktionalität zu unterbrechen, damit ich keine neuen Befehle für sie lernen muss, da ich die normale Funktionalität in LaTeX sowieso nicht so oft verwenden würde. Das ist nur eine persönliche Präferenz. nicht schwer, die Objektnamen zu wechseln. Ich habe auch in der Dateityperkennung und Marken hinzugefügt.

Schnarchfrosch
quelle
2

Dies ist eine alte Frage, aber zum Nutzen der zukünftigen Besucher: Ich finde es einfacher, die Latex-Zitate zu ändern mit:

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

Und dann This thing is "Foobar"!wird in Vim und Latex gut funktionieren.

user10607
quelle
0

Plugin vim-sandwich

Ein weiteres nützliches Plugin hierfür ist vim-sandwichdas, welches ft-spezifische Umgebungen definiert hat

  • l`oder l'für `text',
  • l"für ``text''und
  • Textobjekte, um sie einfach zu bearbeiten.

Mit den voreingestellten Zuordnungen funktioniert folgendes

  • Textobjekt: ersetzen Innentext `text'mit cisl'oder wenn die automatische Erkennung der nächsten Umgebung ist in Ordnung cib(zB Cursor hin `a (phony) text'erfordert zu drücken vibibc). Sie können jedoch folgendes zusätzliches Textobjekt definieren iq(OP-Beispiel). 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" Drücken Sie nun einfach ciqoder ciQfunktioniert.
  • add to textwith saiwl'single apostrophes to get `text'
    Das Muster des Befehls lautet sa{motion/textobject}{surrounding}und bedeutet, dass der Operator add surroundingon aufgerufen wird inner wordund der Surround-Typ lautet latex single quote.
  • löschen mit sdl'oder mitsdb
  • ändern mit srl'l"oder mitsrbl"

Es unterstützt

Hotschke
quelle