Comment puis-je traiter les guillemets LaTeX comme un objet texte?

29

Les guillemets dans LaTeX sont différents de ceux du texte normal, en ce sens qu'ils sont formatés ``like this''(ou `like this'pour des guillemets simples). Cela rend difficile leur navigation dans Vim.

J'utilise habituellement quelque chose comme T`ct'(en arrière jusqu'à `, changer jusqu'à '). Cependant, c'est maladroit et contre nature. Je préférerais être en mesure d'utiliser quelque chose le long des lignes de ciq( « changement entre guillemets »), tout comme je peux le faire ciw, ca), ci", ca', etc.

Existe-t-il un moyen de dire à Vim de traiter ``LaTeX'' `quotes'comme des objets texte? (En plus, existe-t-il un moyen de déclencher cela uniquement lors de la modification d'un .texfichier?)

Poignée de porte
la source

Réponses:

10

Je ne connais pas LaTeX mais cela semble fonctionner:

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

J'ai basé cela sur les informations ici: http://vim.wikia.com/wiki/Creating_new_text_objects

Vous pouvez également ajouter un support pour aq:

vnoremap aq :<C-U>silent! normal! f'vF`<CR>
omap aq :normal vaq<CR>
superjer
la source
Cela fonctionne pour iq, mais ne semble pas fonctionner avec, par exemple daq,.
Poignée de porte
Droite. Vous pouvez également le faire fonctionner aqavec un mappage similaire supplémentaire. J'ai édité la réponse. J'ai également échangé T` avec t 'dans le mappage afin qu'il recherche en premier, ce qui me semble plus naturel.
superjer
Cela fonctionne pour des guillemets simples, mais daqsur ``foo''seulement les résultats dans `foo'.
Poignée de porte
Je ne pense pas que cette méthode puisse fonctionner pour plus que des guillemets simples. Vous auriez besoin de faire une inspection plus approfondie du texte que les opérateurs fet tpermettent, ce qui nécessiterait d'écrire une fonction entière avec des variables et tout. Je n'ai pas le temps de le faire pour le moment.
superjer
7

Edit : je viens de découvrir le plugin vim-textobject-latex , qui ajoute la fonctionnalité exacte que vous recherchez (en plus de quelques autres choses). Depuis le fichier README du plugin:

Les objets texte actuellement pris en charge sont:

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

Ainsi, vous pouvez utiliser caqet similaires comme vous le vouliez. Je l'ai testé et cela fonctionne comme annoncé, mais notez qu'il dépend du plugin vim-textobject-user . Notez également que vous devez vous assurer que le textobject-userplugin se charge d'abord , sinon les choses ne fonctionneront pas.


Si vous ne voulez pas jouer avec les plugins, ma réponse originale reste utile:

L'ajout de ces deux lignes à votre .vimrccouverture couvrira la plupart de vos souhaits.

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

Ceux-ci créent de nouveaux objets texte ( aqet iq) qui reviennent au précédent `, passent en mode de sélection visuelle, puis sélectionnent jusqu'au suivant '.

Cela fonctionne pour ciq, caq, yiqet diq. Cependant, yaqet daqne tirera pas / ne supprimera pas les guillemets externes, j'ai donc créé un autre objet texte a", pour gérer cela ( i"n'est pas nécessaire, mais j'ai ajouté pour garder les choses cohérentes:

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

L'inconvénient majeur ici est que cela va casser l'utilisation normale ca", etc. Si vous les faites précéder au FileType tex, vous n'aurez ce problème que dans les .texfichiers, mais cela pourrait parfois être un problème. Vous pouvez également nommer l'objet quelque chose comme ad/ id('d' pour 'double' citation), mais cela me semblait moins intuitif (je visais la moindre différence par rapport au fonctionnement normal).

La seule façon de penser à les regrouper en deux objets texte serait d'écrire une fonction qui vérifie une autre citation en dehors du premier ensemble et de définir les aqobjets texte pour appeler cela.

Remarque : Il y a quelques autres problèmes mineurs avec ceux-ci:

  1. Yanking pourrait laisser votre curseur dans un endroit inattendu (cela pourrait être résolu en ajoutant une marque dans les commandes (par exemple ma2F`v2f'<cr>`a), assurez-vous simplement de ne pas en utiliser une que vous utilisez fréquemment manuellement)
  2. Le curseur doit être à l'intérieur des guillemets; des choses étranges se produisent si c'est sur les guillemets.

Pour conclure tout cela, voici ce que j'ajouterais personnellement à .vimrcce problème:

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

Comme vous pouvez le voir, j'ai opté pour la rupture de la fonctionnalité normale ca'/ ya"/ etc afin de ne pas avoir à apprendre de nouvelles commandes pour eux car je n'utiliserais pas autant la fonctionnalité normale dans LaTeX. C'est juste une préférence personnelle; pas difficile de changer les noms des objets. J'ai également ajouté la détection de type de fichier et les marques.

SnoringFrog
la source
2

C'est une vieille question mais pour le bénéfice des futurs visiteurs: je trouve plus facile de changer les citations en latex avec:

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

Et This thing is "Foobar"!cela fonctionnera bien dans le vim et le latex.

user10607
la source
0

Brancher vim-sandwich

Un autre plugin utile pour cela est celui vim-sandwichqui a défini un environnement spécifique à ft

  • l`ou l'pour `text',
  • l"pour ``text''et
  • des objets texte pour les manipuler facilement.

Avec les mappages par défaut après le travail

  • textobject: remplacer le texte intérieur `text'avec cisl'ou si la détection automatique de la plus proche entourant est très bien cib(par exemple , le curseur sur hen `a (phony) text'nécessite la mise sous presse vibibc). Cependant, vous pouvez définir l'objet de texte supplémentaire suivant iq(exemple 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" Maintenant, appuyez simplement sur ciqou ciQfonctionne.
  • ajouter à textdes saiwl'apostrophes simples pour obtenir `text'
    le modèle de la commande est sa{motion/textobject}{surrounding}et des moyens Invoke opérateur add surroundingsur inner wordet le type Surround est latex single quote.
  • supprimer avec sdl'ou avecsdb
  • changer avec srl'l"ou avecsrbl"

Ça supporte

Hotschke
la source