Как я могу трактовать цитаты LaTeX как текстовый объект?

29

Кавычки в LaTeX отличаются от обычного текста тем, что они отформатированы ``like this''(или `like this'для одинарных кавычек). Это затрудняет навигацию по ним в Vim.

Я обычно использую что-то вроде T`ct'(назад, до `, изменить до '). Однако это неуклюже и неестественно. Я бы предпочел , чтобы иметь возможность использовать что - то вдоль линий ciq( «изменения в кавычках»), так же , как я могу сделать ciw, ca), ci", ca'и т.д.

Есть ли какой-нибудь способ сказать Vim рассматривать ``LaTeX'' `quotes'как текстовые объекты? (Как плюс, есть ли способ вызвать это только при редактировании .texфайла?)

Дверная ручка
источник

Ответы:

10

Я не знаю LaTeX, но это, кажется, работает:

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

Я основал это на информации здесь: http://vim.wikia.com/wiki/Creating_new_text_objects

Вы также можете добавить поддержку для aq:

vnoremap aq :<C-U>silent! normal! f'vF`<CR>
omap aq :normal vaq<CR>
superjer
источник
Это работает iq, но, похоже, не работает, например, с daq.
Дверная ручка
Правильно. Вы можете также заставить его работать с aqдополнительным подобным сопоставлением. Я отредактировал ответ. Я также поменял местами T` с t 'в отображении, чтобы он сначала искал вперед, что мне кажется более естественным.
Супергерой
Это работает для одинарных кавычек, но daqна ``foo''только привожу `foo'.
дверная ручка
Я не думаю, что этот метод может работать больше, чем в одиночных кавычках. Вам нужно будет глубже изучить текст, чем позволяют операторы fи t, что потребует написания целой функции с переменными и всего остального. У меня нет времени, чтобы сделать это прямо сейчас.
Супергерой
7

Изменить : я только что обнаружил плагин vim-textobject-latex , который добавляет именно ту функциональность, которую вы ищете (в дополнение к нескольким другим вещам). Из плагина README:

В настоящее время поддерживаются следующие текстовые объекты:

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

Таким образом, вы можете использовать caqи тому подобное, как вы хотели. Я испытал это, и она работает как рекламируется, но обратите внимание , что это зависит от ВИМ-textobject пользователей плагина. Также обратите внимание, что вы должны убедиться, что textobject-userплагин загружается первым , иначе все не будет работать.


Если вы не хотите связываться с плагинами, мой оригинальный ответ остается полезным:

Добавление этих двух строк к вашей .vimrcбудет охватывать большую часть того, что вы хотите.

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

Они создают новые текстовые объекты ( aqи iq), которые возвращаются к предыдущему `, переходят в режим визуального выбора, а затем выбирают до следующего '.

Эта функция будет работать для ciq, caq, yiq, и diq. Тем не менее, yaqи daqне будет дергать / удалять внешние кавычки, поэтому я создал еще один текстовый объект a", чтобы обрабатывать это ( i"не требуется, но я добавил, чтобы держать вещи согласованными:

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

Основным недостатком здесь является то, что это нарушит нормальное ca"и т. Д. Использование. Если вы введете их в качестве предисловия au FileType tex, у вас будет только эта проблема в .texфайлах, но это все же может иногда вызывать раздражение. Вы можете также назвать объект как ad/ id(«d» для «двойной» кавычки), но это показалось мне менее интуитивным (я стремился к наименьшему отличию от нормальной работы).

Единственный способ обернуть их в два текстовых объекта - написать функцию, которая проверяет другую кавычку за пределами первого набора и установить aqтекстовые объекты для ее вызова.

Примечание : есть несколько других незначительных проблем с ними:

  1. Янкинг может оставить ваш курсор в неожиданном месте (это можно исправить, добавив метку в командах (например ma2F`v2f'<cr>`a, просто не используйте тот, который вы часто используете вручную)
  2. Курсор должен быть внутри кавычек; странные вещи случаются, если это в кавычках.

Чтобы завершить все это, я лично добавил бы к .vimrcэтому вопросу:

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

Как вы можете видеть, я решил нарушить нормальную функциональность ca'/ ya"/ etc, поэтому мне не пришлось бы изучать новые команды для них, так как я бы не использовал обычную функциональность в LaTeX в любом случае. Это просто личное предпочтение; не сложно поменять имена объектов. Я также добавил в определение типа файла и отметки.

SnoringFrog
источник
2

Это старый вопрос, но в интересах будущих посетителей: мне легче менять латексные кавычки с помощью:

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

И тогда This thing is "Foobar"!будет отлично работать в Vim и латексе.

user10607
источник
0

Plugin vim-sandwich

Другой полезный плагин для этого, vim-sandwichкоторый определил фут-специфическое окружение

  • l`или l'для `text',
  • l"для ``text''и
  • текстовые объекты легко оперируют ими.

С отображениями по умолчанию после работы

  • textobject: заменить внутренний текст `text'с cisl'или , если автоматическое определение ближайшего окружения прекрасно cib(например , курсор на hв `a (phony) text'требуется нажимать vibibc). Тем не менее, вы можете определить следующий дополнительный текстовый объект iq(пример 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" Теперь просто нажмите ciqили ciQработает.
  • добавить к textс saiwl'одиночными апострофами , чтобы получить `text'
    Узор команды является sa{motion/textobject}{surrounding}и средство Invoke оператора add surroundingна inner wordи объемный типом является latex single quote.
  • удалить с sdl'илиsdb
  • изменить с srl'l"илиsrbl"

Поддерживает

Hotschke
источник