¿Cómo puedo tratar las citas de LaTeX como un objeto de texto?

29

Las comillas en LaTeX son diferentes a las del texto normal, ya que están formateadas ``like this''(o `like this'para comillas simples). Esto hace que sea difícil navegar a través de ellos en Vim.

Usualmente uso algo como T`ct'(hacia atrás hasta `, cambio hasta '). Sin embargo, esto es torpe y antinatural. Yo prefiero ser capaz de usar algo en la línea de ciq( "el cambio entre comillas"), al igual que yo puedo hacer ciw, ca), ci", ca', etc.

¿Hay alguna forma de decirle a Vim que lo trate ``LaTeX'' `quotes'como objetos de texto? (Como ventaja, ¿hay alguna manera de activar esto solo mientras se edita un .texarchivo?)

Perilla de la puerta
fuente

Respuestas:

10

No sé LaTeX pero parece que esto funciona:

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

Basé esto en la información aquí: http://vim.wikia.com/wiki/Creating_new_text_objects

También puede agregar soporte para aq:

vnoremap aq :<C-U>silent! normal! f'vF`<CR>
omap aq :normal vaq<CR>
superjer
fuente
Esto funciona para iq, pero no parece funcionar con, por ejemplo daq,.
Pomo
Correcto. Puede hacer que funcione aqtambién con una asignación similar adicional. Edité la respuesta. También cambié T` con t 'en el mapeo para que busque primero, lo que me parece más natural.
superjer
Esto funciona para comillas simples, pero daqen ``foo''sólo da como resultado `foo'.
Pomo
No creo que este método pueda funcionar para más que comillas simples. Usted tendría que hacer una inspección más profunda del texto que el fy tlos operadores permiten, lo que requeriría escribir una función entera con variables y todo. No tengo tiempo para hacerlo ahora.
superjer
7

Editar : Acabo de descubrir el complemento vim-textobject-latex , que agrega la funcionalidad exacta que estás buscando (además de algunas otras cosas). Desde el archivo README del complemento:

Los objetos de texto admitidos actualmente son:

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

Para que pueda usar caqy hacer lo que quisiera. Lo probé y funciona como se anuncia, pero tenga en cuenta que depende del complemento vim-textobject-user . También tenga en cuenta que debe asegurarse de que el textobject-usercomplemento se cargue primero , de lo contrario las cosas no funcionarán.


Sin embargo, si no desea meterse con los complementos, mi respuesta original sigue siendo útil:

Agregar estas dos líneas a tu .vimrccubrirá la mayor parte de lo que deseas.

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

Estos crean nuevos objetos de texto ( aqy iq) que vuelven al anterior `, ingresan al modo de selección visual y luego seleccionan hasta el siguiente '.

Esto funcionará para ciq, caq, yiq, y diq. Sin embargo, yaqy daqno tiraré / eliminaré las comillas externas, así que creé otro objeto de texto a", para manejar eso ( i"no es necesario, pero agregué para mantener las cosas consistentes:

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

El principal inconveniente aquí es que esto romperá el ca"uso normal , etc. Si los introduces au FileType tex, solo tendrás ese problema en los .texarchivos, pero de vez en cuando puede ser una molestia. También podría nombrar el objeto de manera similar a ad/ id('d' para la cita 'doble'), pero eso me pareció menos intuitivo (buscaba la menor diferencia con respecto al funcionamiento normal).

La única forma en que puedo pensar en envolverlos en solo dos objetos de texto sería escribir una función que verifique si hay otra cita fuera del primer conjunto y establecer los aqobjetos de texto para llamar a eso.

Nota : Hay otros problemas menores con estos:

  1. Yanking puede dejar el cursor en un lugar inesperado (esto se puede solucionar agregando usando una marca en los comandos (por ejemplo ma2F`v2f'<cr>`a), solo asegúrese de no usar uno que usa con frecuencia manualmente)
  2. El cursor debe estar dentro de las comillas; Suceden cosas raras si está entre comillas.

Para concluir todo esto, esto es lo que personalmente agregaría a mi .vimrcpara este problema:

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

Como puede ver, opté por romper la funcionalidad normal ca'/ ya"/ etc. para no tener que aprender nuevos comandos para ellos, ya que de todos modos no estaría usando la funcionalidad normal dentro de LaTeX. Eso es solo una preferencia personal; No es difícil cambiar los nombres de los objetos. También agregué en la detección de tipo de archivo y las marcas.

Ronquidos
fuente
2

Esta es una vieja pregunta, pero para el beneficio de los futuros visitantes: me resulta más fácil cambiar las citas de látex con:

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

Y luego This thing is "Foobar"!funcionará bien en vim y latex.

usuario10607
fuente
0

Enchufar vim-sandwich

Otro complemento útil para esto es el vim-sandwichque ha definido un entorno específico para ft

  • l`o l'para `text',
  • l"para ``text''y
  • objetos de texto para operarlos fácilmente.

Con las asignaciones predeterminadas después del trabajo

  • textobject: reemplazar texto interior de `text'con cisl'o si la detección automática de más cercana circundante está bien cib(por ejemplo cursor en hen `a (phony) text'requiere a prensa vibibc). Sin embargo, puede definir el siguiente objeto de texto adicional iq(ejemplo de 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" Ahora simplemente presionando ciqo ciQfunciona.
  • añadir a textcon saiwl'apóstrofes individuales para obtener `text'
    el patrón de la orden es sa{motion/textobject}{surrounding}y medios de invocación del operador add surroundingsobre inner wordy tipo envolvente es latex single quote.
  • eliminar con sdl'o consdb
  • cambiar con srl'l"o consrbl"

Es compatible

Hotschke
fuente