Como tratar as cotações do LaTeX como um objeto de texto?


29

As aspas no LaTeX são diferentes das do texto normal, pois estão formatadas ``like this''(ou `like this'entre aspas simples). Isso dificulta a navegação por eles no Vim.

Eu costumo usar algo como T`ct'(para trás até `, mude até '). No entanto, isso é desajeitado e antinatural. Eu preferiria ser capaz de usar algo ao longo das linhas de ciq( "mudança entre aspas"), assim como eu posso fazer ciw, ca), ci", ca', etc.

Existe alguma maneira de dizer ao Vim para tratar ``LaTeX'' `quotes'como objetos de texto? (Além disso, existe alguma maneira de acionar isso apenas ao editar um .texarquivo?)

Respostas:


10

Não conheço o LaTeX, mas isso parece funcionar:

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

Baseei isso nas informações aqui: http://vim.wikia.com/wiki/Creating_new_text_objects

Você também pode adicionar suporte para aq:

vnoremap aq :<C-U>silent! normal! f'vF`<CR>
omap aq :normal vaq<CR>

Isso funciona iq, mas não parece funcionar, por exemplo daq,.
Doorknob

Direita. Você pode fazê-lo funcionar aqcom um mapeamento similar adicional. Eu editei a resposta. Também troquei T` por t 'no mapeamento para que ele procure primeiro, o que me parece mais natural.
Super

Isso funciona para aspas simples, mas daqem ``foo''apenas resulta em `foo'.
Doorknob

Eu não acho que esse método possa funcionar para mais do que aspas simples. Você precisaria fazer uma inspeção mais profunda do texto do que os operadores fe tpermitem, o que exigiria escrever uma função inteira com variáveis ​​e tudo. Não tenho tempo para fazê-lo agora.
Super

7

Edit : Acabei de descobrir o plugin vim-textobject-latex , que adiciona a funcionalidade exata que você está procurando (além de algumas outras coisas). No arquivo LEIA-ME do plug-in:

Os objetos de texto atualmente suportados são:

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

Então você pode usar caqe afins como quiser. Eu testei e funciona como anunciado, mas observe que depende do plug - in vim-textobject-user . Observe também que você deve garantir que o textobject-userplug - in seja carregado primeiro , caso contrário, as coisas não funcionarão.


Se você não quiser mexer com plugins, no entanto, minha resposta original permanece útil:

A adição dessas duas linhas ao seu .vimrcabrange a maior parte do que você deseja.

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

Eles criam novos objetos de texto ( aqe iq) que retornam ao anterior `, entram no modo de seleção visual e, em seguida, selecionam até o próximo '.

Isto irá funcionar para ciq, caq, yiqe diq. No entanto, yaqe daqnão arrancar / excluir as aspas externas, criei outro objeto de texto a"para lidar com isso ( i"não é necessário, mas adicionei para manter as coisas consistentes:

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

A principal desvantagem aqui é que isso quebrará o ca"uso normal , etc. Se você os anteceder au FileType tex, você só terá esse problema nos .texarquivos, mas ainda assim pode ser um aborrecimento. Você também pode nomear o objeto com algo como ad/ id('d' para aspas 'duplas'), mas isso me pareceu menos intuitivo (eu estava buscando a menor diferença em relação à operação normal).

A única maneira de pensar em agrupá-los em apenas dois objetos de texto seria escrever uma função que verifique outra citação fora do primeiro conjunto e defina os aqobjetos de texto para chamar isso.

Nota : Existem alguns outros problemas menores com estes:

  1. Puxar pode deixar o cursor em um local inesperado (isso pode ser corrigido adicionando uma marca nos comandos (por exemplo ma2F`v2f'<cr>`a), apenas certifique-se de não usar uma que você usa frequentemente manualmente)
  2. O cursor deve estar dentro das aspas; coisas estranhas acontecem se estiver entre aspas.

Para encerrar tudo isso, é isso que eu pessoalmente acrescentaria ao meu .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 você pode ver, optei por quebrar a funcionalidade normal ca'/ ya"/ etc para não precisar aprender novos comandos para eles, pois não usaria tanto a funcionalidade normal no LaTeX. Essa é apenas uma preferência pessoal; não é difícil mudar os nomes dos objetos. Também adicionei marcas e detecção de tipo de arquivo.


2

Esta é uma pergunta antiga, mas para o benefício de futuros visitantes: acho mais fácil alterar as aspas de látex com:

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

E então This thing is "Foobar"!funcionará bem no vim e no látex.


0

Plugar vim-sandwich

Outro plugin útil para isso é o vim-sandwichque definiu um ambiente específico para pés

  • l`ou l'para `text',
  • l"para ``text''e
  • textobjects para operar facilmente sobre eles.

Com os mapeamentos padrão após o trabalho

  • textobject: substitua o texto interno de `text'por cisl'ou se a detecção automática do ambiente mais próximo estiver correta cib(por exemplo, o cursor ativado hem `a (phony) text'exige que seja pressionado vibibc). No entanto, você pode definir o seguinte textobject adicional iq(exemplo 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" Agora, basta pressionar ciqou ciQfuncionar.
  • adicione para textcom saiwl'apóstrofos único para `text'
    o padrão do comando é sa{motion/textobject}{surrounding}e meios invoke operador add surroundingem inner worde tipo envolvente é latex single quote.
  • excluir com sdl'ou comsdb
  • mudar com srl'l"ou comsrbl"

Suporta

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.