команду vim “gq}” для повторного перенесення абзацу та LaTeX


5

Як я можу зробити цю команду не обернути подібні речі \item?

Наприклад:

\begin{enumerate}
\item this might be a long paragraph that spans multiple lines 
\item blah
\end{enumerate}

якщо я запускаю "gq}" з курсором на першому елементі (перша буква this ), він видає цей вивід:

\begin{enumerate}
\item this might be a long 
paragraph that spans multiple 
lines \item blah \end{enumerate}

Ось що я хочу:

\begin{enumerate}
\item this might be a long 
paragraph that spans multiple 
lines 
\item blah
\end{enumerate}

Якщо я можу якось отримати vim визнати, що маркер \item означає кінець абзацу, я думаю, він буде працювати правильно. Але як я можу це зробити?

Відповіді:


6

Я думаю, що ви можете зробити це за допомогою параметра 'formatlistpat', який буде містити теги для розділення абзаців. Для цього потрібно включити 'n' у 'formatoptions'. Подивитися

:help 'formatlistpat'
:help 'formatoptions'

Наприклад, з

:set formatlistpat=^\\s*\\\\\\(end\\\\|item\\)\\>
:set formatoptions+=n
:set textwidth=40

форматування вашого прикладу створює це:

\begin{enumerate}
\item this might be a long paragraph
     that spans multiple lines 
\item blah
\end{enumerate}

Зверніть увагу, що другий рядок першого елемента відступає від довжини \item тег, так що це не зовсім те, що ви хотіли, але це може бути досить близько. Також можна експериментувати \ze як згадувалося в довідці, щоб побачити, чи можна отримати Vim для розпізнавання тега без відступу наступних рядків. Я не спробував цього.

Оновлення

"Formatlistpat" трохи чіткіше, і легше редагувати, якщо він встановлений за допомогою :let замість :set.

:let &l:flp = '^\s*\\\(end\|item\)\>'

The l: частина вказує, що вона є локальною буфером.

Оновлення

Щоб зменшити відступ до 1 символу, виконайте такі дії:

:let &l:flp = '^\s*\\\ze\(end\|item\)\>'

Зверніть увагу, що якщо є будь-які пробіли перед \item, відступ стає числом + 1. Я не знаю, чи можна зменшити відступ до 0, використовуючи \ze.


Cool! Чи є спосіб використовувати лише спеціальний формат для розширення конкретних файлів? Я відчуваю, що це може бути чистіше, щоб тільки визнати \item як тег розмежування абзаців у файлах, які закінчуються символом .tex розширення. Також, чому так багато символів?
orryowr

1
:help 'formatlistpat' говорить, що опція є локальною для буфера, тому ви можете помістити цю настройку в ~ / .vim / after / ftplugin / tex.vim та використовувати setlocal замість set і це вплине тільки на .tex файли. Символи - це саме те, яким чином спеціальні символи повинні бути виділені на rhs a set команду. Якщо б я зробив більше з цим налаштуванням, я б налаштував його використовувати let &flp = "stuff" а не set flp=stuff. Цитування і втеча на rhs a let набагато простіше. Подивитися :help :let-&. Роздільник гілок \|. Це має врятуватися з якоїсь причини, як \\|. The set набір вимагає
garyjohn

кожен з тих, кого потрібно втекти, так що ви закінчите \\\\|. У мене немає хорошого пояснення чому.
garyjohn

Я не можу відтворити виконане форматування. Ви використовували vim і команду gq}, правда? Поки що я роблю :set tw=40 і :set formatlistpat=^\\s*\\\\\\(end\\\\|item\\)\\>, але він все ще діє так само, як і раніше. (Також, що робить \\> наприкінці робити?)
orryowr

1
Добре, я відкрив новий буфер, скопіював ваш текст у нього, скопіював налаштування "formatlist" з моєї відповіді вище, :set fo+=n tw=40, перемістив курсор до \beginі набрали gq}. Він працював як і раніше. Я використовував gvim 7.3.487 на Linux.
garyjohn

0

Ось рішення, яке працює для мене. Я написав зовнішній сценарій для обробки форматування тексту латексу ( https://github.com/elmanuelito/par-latex )

Приклад використання в vim:

  • Виберіть певний текст (наприклад, Vj або ggVG )
  • введіть ":! par-latex" (командна лінія vim виглядає так: '<,'>!par-latex )
  • введіть enter

З параметрами за замовчуванням, він буде обробляти ваш приклад, якщо ви виберете текст у середовищі деталізації. Щоб він працював, коли ви вибрали більше тексту, потрібно активувати цю опцію format_inside_group на початку сценарію.

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