Jak traktować cytaty LaTeX jako obiekt tekstowy?

29

Znaki cudzysłowu w LaTeX różnią się od zwykłego tekstu tym, że są sformatowane ``like this''(lub w `like this'przypadku pojedynczych cudzysłowów). Utrudnia to poruszanie się po nich w Vimie.

Zwykle używam czegoś takiego T`ct'(do tyłu `, zmieniam do '). Jest to jednak niezręczne i nienaturalne. Wolałbym, aby móc użyć coś wzdłuż linii ciq( „zmiany w cudzysłowie”), podobnie jak mogę zrobić ciw, ca), ci", ca', itd.

Czy jest jakiś sposób, aby powiedzieć Vimowi, aby traktował ``LaTeX'' `quotes'jak obiekty tekstowe? (Na plus, czy jest jakiś sposób, aby uruchomić to tylko podczas edycji .texpliku?)

Klamka
źródło

Odpowiedzi:

10

Nie znam LaTeXa, ale wydaje się, że działa:

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

Oparłem to na informacjach tutaj: http://vim.wikia.com/wiki/Creating_new_text_objects

Możesz także dodać obsługę aq:

vnoremap aq :<C-U>silent! normal! f'vF`<CR>
omap aq :normal vaq<CR>
superjer
źródło
Działa to na przykład iq, ale wydaje się, że nie działa daq.
Klamka
Dobrze. Możesz sprawić, że będzie działał aqrównież z dodatkowym podobnym mapowaniem. Zredagowałem odpowiedź. Zamieniłem również T` z t 'na mapowaniu, aby najpierw przeszukiwał do przodu, co wydaje mi się bardziej naturalne.
superjer
To działa dla pojedynczych cytatów, ale daqon ``foo''tylko skutkuje `foo'.
Klamka
Nie sądzę, że ta metoda może działać dla więcej niż pojedynczych cytatów. Będziesz musiał przeprowadzić głębszą kontrolę tekstu niż pozwalają na to operatory fi t, co wymagałoby napisania całej funkcji ze zmiennymi i wszystkim innym. Nie mam teraz na to czasu.
superjer
7

Edycja : Właśnie odkryłem wtyczkę vim-textobject-latex , która dodaje dokładnie tę funkcjonalność, której szukasz (oprócz kilku innych rzeczy). Z pliku README wtyczki:

Aktualnie obsługiwane obiekty tekstowe to:

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

Możesz więc używać caqi tym podobnych, jak chcesz. Przetestowałem to i działa zgodnie z reklamą, ale pamiętaj, że zależy to od wtyczki vim-textobject-user . Pamiętaj też, że musisz się upewnić, że textobject-userwtyczka ładuje się pierwsza , w przeciwnym razie nic nie będzie działać.


Jeśli jednak nie chcesz zadzierać z wtyczkami, moja oryginalna odpowiedź pozostaje przydatna:

Dodanie tych dwóch wierszy do większości.vimrc obejmuje wszystko, co chcesz.

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

Tworzą one nowe obiekty tekstowe ( aqi iq), które wracają do poprzedniego `, wchodzą w tryb selekcji wizualnej, a następnie wybierają do następnego '.

Będzie to działać na ciq, caq, yiq, i diq. Jednak yaqi daqnie będzie szarpać / usuwać zewnętrznych cytatów, więc stworzyłem inny obiekt tekstowy a", aby sobie z tym poradzić ( i"nie jest to konieczne, ale dodałem, aby zachować spójność:

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

Główną wadą jest to, że złamie to normalne ca"itp. Jeśli je przedmówisz au FileType tex, będziesz mieć tylko ten problem w .texplikach, ale czasami może to być irytujące. Mógłbyś też nazwać obiekt czymś w rodzaju ad/ id(„d” dla „podwójnego” cytatu), ale wydawało mi się to mniej intuicyjne (dążyłem do jak najmniejszej różnicy od normalnego działania).

Jedynym sposobem, w jaki mogę wymyślić, aby zawinąć je w dwa obiekty tekstowe, byłoby napisanie funkcji, która sprawdza inny cudzysłow poza pierwszym zestawem i ustawienie aqobiektów tekstowych na wywołanie tego.

Uwaga : Istnieje kilka innych drobnych problemów z nimi:

  1. Yanking może pozostawić kursor w nieoczekiwanym miejscu (można to naprawić, dodając znak w poleceniach (np. ma2F`v2f'<cr>`a), Po prostu upewnij się, że nie używasz tego, którego często używasz ręcznie)
  2. Kursor musi znajdować się w cudzysłowie; dziwne rzeczy zdarzają się, jeśli jest w cytatach.

Podsumowując, to osobiście dodałbym do mojego .vimrctego problemu:

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

Jak widać, zdecydowałem się na zerwanie normalnej funkcjonalności ca'/ ya"/ etc, więc nie musiałbym uczyć się nowych poleceń dla nich, ponieważ i tak nie używałbym normalnej funkcjonalności w LaTeX-ie. To tylko osobiste preferencje; nietrudnie zmieniać nazwy obiektów. Dodałem także w wykrywaniu i typach plików.

SnoringFrog
źródło
2

To stare pytanie, ale z korzyścią dla przyszłych gości: łatwiej jest mi zmienić cytaty lateksowe za pomocą:

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

A potem This thing is "Foobar"!będzie działał dobrze w vimie i lateksie.

użytkownik10607
źródło
0

Podłącz vim-sandwich

Inną przydatną wtyczką do tego jest vim-sandwichśrodowisko specyficzne dla ft

  • l`lub l'za `text',
  • l"dla ``text''i
  • obiekty tekstowe do łatwej obsługi na nich.

Przy domyślnych mapowaniach po pracy

  • textobject: wymienić wewnętrzny tekst `text'z cisl'lub jeśli automatyczna detekcja z najbliższego otoczenia jest w porządku cib(np kursor na hw `a (phony) text'wymaga prasie vibibc). Można jednak zdefiniować następujący dodatkowy obiekt tekstowy iq(przykład 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" Teraz wystarczy nacisnąć ciqlub ciQdziała.
  • dodaj do za textpomocą saiwl'pojedynczych apostrofów, aby uzyskać `text'
    Wzorzec polecenia jest sa{motion/textobject}{surrounding}i oznacza, że ​​operator inwokacji jest add surroundingwłączony, inner worda typ surround to latex single quote.
  • usuń za pomocą sdl'lub za pomocąsdb
  • zmienić za pomocą srl'l"lub za pomocąsrbl"

To wspiera

Hotschke
źródło