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

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

Как сделать так, чтобы эта команда не оборачивала такие вещи, как \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обозначает конец абзаца, я думаю, он будет работать правильно. Но как бы мне это сделать?

решение1

Я думаю, вы можете сделать это с помощью опции 'formatlistpat', которая включает теги-разделители абзацев. Вам нужно включить 'n' в 'formatoptions', чтобы это сработало. Смотрите

:help 'formatlistpat'
:help 'formatoptions'

Например, с

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

форматирование вашего примера дает следующее:

\begin{перечислить}
\item это может быть длинный абзац
     который охватывает несколько строк
\item бла
\end{перечислить}

Обратите внимание, что вторая строка первого пункта отступлена на длину тега \item, так что это не совсем то, что вы хотели, но может быть достаточно близко. Вы также можете поэкспериментировать с \zeтем, что указано в справке, чтобы посмотреть, сможете ли вы заставить Vim распознать тег без отступа последующих строк. Я этого не пробовал.

Обновлять

«Formatlistpat» немного понятнее и его легче редактировать, если его задать с помощью :letвместо :set.

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

В этой l:части указано, что это локальная настройка буфера.

Обновлять

Чтобы уменьшить отступ до 1 символа, сделайте следующее:

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

Обратите внимание, что если перед , есть пробелы \item, то отступ становится равным этому числу + 1. Я не знаю, можно ли уменьшить отступ до 0 с помощью \ze.

решение2

Вот решение, которое работает для меня. Я написал внешний скрипт для обработки форматирования текста Latex (https://github.com/elmanuelito/par-latex)

Пример использования в vim:

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

С параметрами по умолчанию он обработает ваш пример, если вы выберете текст в среде itemize. Чтобы он сработал, когда вы выберете больше текста, вам нужно будет активировать опцию format_inside_groupв начале скрипта.

Связанный контент