Используя Vim, нет ли более эффективного способа форматирования абзацев LaTeX в соответствии с этой передовой практикой? - PullRequest
7 голосов
/ 18 апреля 2011

Лучшая практика, упомянутая в названии, - , предложенная Ури :

При написании абзацев начинайте каждый предложение в начале строки, и если это перетекает, каждый последующий строка с вкладками.

Я использую gVim с Vim-LaTeX , который поставляется с файлом indent/tex.vim, для редактирования файлов LaTeX. В настоящее время я реализую упомянутую выше практику следующим образом:

  1. I :set textwidth=79 для автоматического разрыва строк до того, как они станут слишком длинными.
  2. Я вручную нажму Введите после того, как я закончу вставлять каждое предложение.
  3. Если я закончил редактирование и редактирование предложения, я вручную перенесу любые побочные эффекты, используя > > , добавив при необходимости префикс с количеством.

Иногда этот последний шаг заставит один или несколько вторичных эффектов пройти по максимальной ширине линии. В этом случае я

  1. г q q неисправная линия.
  2. J мой путь до конца предложения.
  3. при необходимости повторите шаги 1 и 2.

Как вы можете себе представить, это может стать утомительным. Разве нет более эффективного способа достижения того же результата? В конечном счете, я хочу иметь возможность писать предложения, не заботясь об их формате, а затем использовать g q a p или g q i p , до автоматически выводить результат, который я в данный момент выдаю вручную.

Я подозреваю, что для этого мне нужно написать formatexpr, но я не уверен, что делать дальше. Я нашел несколько плагинов, Латексный форматировщик текста и Форматировщик текста (особенно LaTeX) и подсказка , но ни один из них, похоже, не соответствует моим потребностям, и я не уверен, как изменить их для этого.

Ответы [ 6 ]

4 голосов
/ 19 апреля 2011

Возможно, я слишком упрощаю проблему, но делает ли это отображение то, что вы хотите?

nnoremap \z (j>>gq)

Так что нажатие \ z в обычном режимеследующее: с позиции курсора перейти к началу предложения.Затем перейдите к следующей строке и сделайте отступ.Затем переформатируйте эту строку до конца предложения.Переформатирование по предложениям - это путь, а не переформатирование каждой строки по отдельности, как, кажется, делает ваш метод.

Конечно, вы можете использовать отображение в режиме вставки, если хотите, или даже попытаться переопределить поведение введите , чтобы сделать это автоматически (хотя я не знаю, будет ли это иметь непредвиденные последствия ...).

2 голосов
/ 09 мая 2011

Один из способов сделать это - не разрывать строки в файле, а сделать следующее:

set wrap linebreak
let &showbreak='===>  '

Опция wrap позволяет переносить длинные строки вместо расширения за пределы экрана и linebreak делает разрывы строк только на символах, указанных в опции breakat.

Вы можете установить showbreak на все, что нравится вашему глазу.Мой любимый, когда я использую vim, где правильные символы юникода работают правильно:

let &showbreak="\u21aa "

Это помещает символ at в начале каждой обернутой строки.цифры (set number), чтобы дать еще один показатель того, что в действительности представляют собой строки в файле.

Чтобы упростить навигацию по файлу, вы можете использовать

noremap j gj
noremap k gk
noremap gj j
noremap gk k

.* k и j перемещаются вверх и вниз по отображаемым строкам, а не по строкам файла.Для воздействия на клавиши курсора также замените k на <Up> и j на <Down>.

1 голос
/ 20 февраля 2015

Я нахожу предложение от @kev (и людей, прокомментировавших) на этом посте наиболее удовлетворительным.

Там это объясняется установкой

:set fo+=n

, за которым следует либо

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

или

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

позволяет набирать gg gqG для переформатирования всего файла.

1 голос
/ 16 августа 2011

Этот совет также привлек мое внимание. Вот как я решил проблему (разница измененных строк в tex.vim):

*** tex.vim.old 2011-08-16 08:26:56.845046457 +0200
--- tex.vim 2011-08-16 08:59:14.736306930 +0200
***************
*** 90,95 ****
--- 90,96 ----
    " LH modification : \begin does not always start a line
    if line =~ '\\begin{\(.*\)}'  && line !~ 'verbatim'
          \ && line !~ 'document'
+       \ || line =~ '^\s*[A-Z].*[a-zA-Z0-9,]\s*$\C'

      let ind = ind + &sw

***************
*** 105,110 ****
--- 106,112 ----
    " Subtract a 'shiftwidth' when an environment ends
    if cline =~ '^\s*\\end' && cline !~ 'verbatim'
          \&& cline !~ 'document'
+       \|| line =~ '\.\s*$'

      if g:tex_indent_items == 1
        " Remove another sw for item-environments

По существу, он выравнивает новые строки, когда предыдущая строка начинается с заглавной буквы и заканчивается буквой, цифрой или запятой, а новые строки с "отступом", когда предыдущая строка заканчивается точкой.

Определенно, есть место для улучшений (лучшие критерии), но для меня это пока работает хорошо.

1 голос
/ 19 апреля 2011

Одной из опций, которая требует другой тактики, чем табуляция последующих строк, было бы установить флаг w в форматах.Когда вы делаете это, он меняет способ, которым Vim идентифицирует новые абзацы, и строки, заканчивающиеся пробелом, понимаются как продолжение новой строки как часть того же абзаца.Смотри :h fo-table.

Если вы установите флаг w и введете свой текст таким образом, чтобы единственные строки, оканчивающиеся пробелом, оставались только строки предложений (и полностью отказались от ввода табуляции в начале любых текстовых строк), то я думаю, что вам следуетвозможность использовать gqap для форматирования текстовых абзацев, как вы хотите.Чтобы получить визуальные подсказки к логической структуре, вы можете затем установить listchars для отображения символа eol (то есть, <cr>) и установить различные выделения для <space><cr> и для <non-space><cr>, чтобы концы предложения / абзаца были легко обнаружены.

Еще одним преимуществом этого метода является то, что вы можете просто набирать текст естественным образом и разрешать вводы разрывов строк автоматически с помощью настройки ширины текста.(Просто убедитесь, что строки форматирования LaTeX не разбиваются автоматически в области текстовой ширины; вы хотите, чтобы в качестве последнего символа в строке они использовали символ без пробелов.)

0 голосов
/ 07 марта 2016

Я использую плагин vim-textobj-usr для определения текстового объекта "LaTeXPar". Тогда я могу использовать gwal для форматирования.

Уже существует плагин vim-textobj-latex , но самым большим текстовым объектом, который он определяет, является "среда". Это не то, что я (и ОП) хочу.

"LaTeXPar" ограничивается

  • пустая строка
  • строка начинается с \[, \], \begin, \end, }
  • конец строки с {

это адаптировано к моей привычке письма: у меня всегда есть пустая строка после \section, всегда используйте \[ \] в одной строке и так далее. Вы можете легко написать один для себя.

Вот относительная часть в моем ~/.vim/ftplugin/tex.vim.

call textobj#user#plugin('latexpar', {
            \   'par': {
            \     'select-a-function': 'LaTeXPar',
            \     'select-a': 'al',
            \   },
            \ })

function! LaTeXPar()
    let pattern='\v^$|^\s*(\\\[|\\\]|\\begin|\\end|\})|\{$'
    if search(pattern,"bW")
        normal! j
    else
        normal! gg
    endif
    let head_pos = getpos('.')
    if search(pattern,"W")
        normal! k
    else
        normal! G
    endif
    let tail_pos = getpos('.')
    " echo head_pos[2]
    " echo tail_pos[2]
    return ["V", head_pos, tail_pos]
endfunction
...