Come posso trattare le citazioni di LaTeX come un oggetto di testo?


29

Le virgolette in LaTeX sono diverse rispetto al testo normale, in quanto sono formattate ``like this''(o `like this'per virgolette singole). Questo rende difficile navigare attraverso di loro in Vim.

Di solito uso qualcosa del tipo T`ct'(indietro fino a `, cambio fino a '). Tuttavia, questo è goffo e innaturale. Io preferirei essere in grado di usare qualcosa sulla falsariga di ciq( "cambiamento tra virgolette"), proprio come posso fare ciw, ca), ci", ca', etc.

C'è un modo per dire a Vim di trattare ``LaTeX'' `quotes'come oggetti di testo? (Inoltre, esiste un modo per attivarlo solo durante la modifica di un .texfile?)

Risposte:


10

Non conosco LaTeX ma questo sembra funzionare:

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

Ho basato questo sulle informazioni qui: http://vim.wikia.com/wiki/Creating_new_text_objects

Puoi anche aggiungere supporto per aq:

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

Questo funziona per iq, ma non sembra funzionare, ad esempio daq.
Maniglia della porta

Destra. Puoi farlo funzionare aqanche con un'ulteriore mappatura simile. Ho modificato la risposta. Ho anche scambiato T` con t 'nella mappatura in modo che prima cerchi in avanti, il che mi sembra più naturale.
superjer,

Questo funziona per le virgolette singole, ma daqil ``foo''solo risultato a `foo'.
Doorknob,

Non penso che questo metodo possa funzionare per più di virgolette singole. Dovresti fare un'ispezione più approfondita del testo di quanto gli operatori fe tconsentano, il che richiederebbe di scrivere un'intera funzione con variabili e tutto il resto. Non ho tempo per farlo adesso.
superjer,

7

Modifica : ho appena scoperto il plug-in vim-textobject-latex , che aggiunge l'esatta funzionalità che stai cercando (oltre a poche altre cose). Dal README del plug-in:

Gli oggetti di testo attualmente supportati sono:

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

Quindi puoi usare caqe simili come volevi. L'ho provato e funziona come pubblicizzato, ma nota che dipende dal plug-in vim-textobject-user . Nota anche che devi textobject-userprima caricare il plugin , altrimenti le cose non funzioneranno.


Se non vuoi scherzare con i plugin, tuttavia, la mia risposta originale rimane utile:

L'aggiunta di queste due righe al tuo .vimrccoprirà la maggior parte di ciò che desideri.

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

Questi creano nuovi oggetti di testo ( aqe iq) che tornano al precedente `, accedono alla modalità di selezione visiva, quindi selezionano fino al successivo '.

Questo lavoro per ciq, caq, yiq, e diq. Tuttavia, yaqe daqnon strapperò / eliminerò le virgolette esterne, quindi ho creato un altro oggetto di testo a", per gestirlo ( i"non è necessario, ma ho aggiunto per mantenere le cose coerenti:

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

Il principale svantaggio qui è che questo interromperà l'uso normale ca", ecc. Se li prefiggi au FileType tex, avrai solo quel problema nei .texfile, ma a volte potrebbe ancora essere un fastidio. Potresti anche nominare l'oggetto come ad/ id('d' per virgoletta 'doppia'), ma questo mi è sembrato meno intuitivo (miravo alla minima differenza rispetto al normale funzionamento).

L'unico modo in cui mi viene in mente di racchiuderli in soli due oggetti di testo sarebbe quello di scrivere una funzione che controlli un'altra citazione al di fuori del primo set e impostare gli aqoggetti di testo per chiamarlo.

Nota : ci sono un paio di altri problemi minori con questi:

  1. Lo strappo potrebbe lasciare il cursore in un posto inaspettato (questo potrebbe essere corretto aggiungendo un segno nei comandi (ad es. ma2F`v2f'<cr>`a), Assicurati solo di non usarne uno che usi frequentemente manualmente)
  2. Il cursore deve trovarsi tra virgolette; accadono cose strane se è tra virgolette.

Per concludere, questo è ciò che aggiungerei personalmente al mio .vimrcper questo 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

Come puoi vedere, ho optato per la rottura della normale funzionalità ca'/ ya"/ etc, quindi non avrei dovuto imparare nuovi comandi per loro dato che non avrei comunque usato la normale funzionalità in LaTeX. Questa è solo una preferenza personale; non è difficile cambiare i nomi degli oggetti. Ho anche aggiunto il rilevamento del tipo di file e i segni.


2

Questa è una vecchia domanda ma a beneficio dei futuri visitatori: trovo più facile cambiare le citazioni in lattice con:

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

E poi This thing is "Foobar"!funzionerà bene in vim e latex.


0

Collegare vim-sandwich

Un altro plugin utile per questo è vim-sandwichche ha definito un ambiente specifico per ft

  • l`o l'per `text',
  • l"per ``text''e
  • textobjects per operare facilmente su di essi.

Con i mapping predefiniti che seguono funzionano

  • textobject: sostituisce il testo interno di `text'con cisl'o se il rilevamento automatico dell'ambiente circostante più vicino va bene cib(ad es. cursore on hin `a (phony) text'richiede di premere vibibc). Tuttavia, è possibile definire il seguente textobject aggiuntivo iq(esempio 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" Ora è sufficiente premere ciqo ciQfunziona.
  • aggiungere a textcon saiwl'singoli apostrofi per ottenere `text'
    il modello del comando è sa{motion/textobject}{surrounding}e mezzi invocano operatore add surroundingsul inner wordtipo e surround latex single quote.
  • cancellare con sdl'o consdb
  • cambia con srl'l"o consrbl"

Supporta

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.