Як я можу ставитися до цитат LaTeX як до текстового об'єкта?


29

Лапки в LaTeX відрізняються, ніж у звичайному тексті, тим, що вони відформатовані ``like this''(або `like this'для одиничних лапок). Це ускладнює навігацію по них у Vim.

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

Чи є спосіб сказати Віму трактуватись ``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>

Це працює для iq, але, схоже, не працює, наприклад, з daq.
Doorknob

Правильно. Ви можете змусити його працювати aqі з додатковим подібним відображенням. Я відредагував відповідь. Я також поміняв T` на t 'у картографуванні, щоб воно спочатку шукало вперед, що мені здається більш природним.
superjer

Це працює для одинарних лапок, але daqна ``foo''тільки привожу `foo'.
Doorknob

Я не думаю, що цей метод може працювати більше, ніж окремі цитати. Ви повинні були б зробити глибокий огляд тексту , ніж fта tоператори дозволяють, що потребують написання цілої функції зі змінними і все. У мене немає часу на це зараз.
superjer

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і подібне, як хотіли. Я перевірив його, і він працює як рекламований, але зауважте, що він залежить від плагіна vim-textobject-user . Також врахуйте, що ви повинні переконатися, що 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"/ і т.д. функціонал, тому мені не доведеться вивчати нові команди для них, так як я б не використовував нормальну функціональність так само в LaTeX. Це лише особисті переваги; не важко переключити назви об’єктів. Я також додав у файлі виявлення та позначки.


2

Це старе питання, але на користь майбутніх відвідувачів: мені здається, що простіше змінити латексні цитати на:

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

І тоді This thing is "Foobar"!буде добре працювати в vim та латексе.


0

Підключати vim-sandwich

Ще один корисний для цього плагін - це те, vim-sandwichщо визначає специфіку для ft

  • l`або l'для `text',
  • l"за ``text''і
  • textobjects легко працювати з ними.

Зіставленням за замовчуванням слід наступна робота

  • 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}означає, що оператор виклику add surroundingвключений inner wordі тип оточення є latex single quote.
  • видалити за допомогою sdl'або зsdb
  • зміни з srl'l"або зsrbl"

Він підтримує

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.