автоматически перематывать строки при записи разметки в VIM

10

Очень часто я пишу уценку в VIM, и в этой уценке будут абзацы. Чтобы помочь моему редактированию, я настроил свой Vim для переноса строки на 80 символов. Это хорошо работает, если я просто продолжаю печатать, но проблема в том, что если мне нужно внести некоторые исправления, это становится очень раздражающим.

Демо (взято из Википедии логика первого порядка):

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments. In first-order 
theories, predicates are often associated with sets. In interpreted higher-order 
theories, predicates may be interpreted as sets of sets.

Все идет нормально. Но когда я пересматриваю статью, я могу решить добавить что-то посередине, скажем:

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments,
or in which one or both of predicate quantifiers or function quantifiers are permitted.
In first-order theories, predicates are often associated with sets. In interpreted higher-order
theories, predicates may be interpreted as sets of sets.

строка уведомления 3 - это та, которую я хочу обернуть. Если я сделаю это в VIM, мне нужно будет вручную соединить строки и перевернуть весь абзац.

Кто-нибудь понял, как заставить VIM делать это автоматически?

Джейсон Ху
источник

Ответы:

6

Еще проще: aфлаг для 'formatoptions'включает автоматическое форматирование абзацев, когда текст вставляется или удаляется. Смотрите :help fo-tableподробности о 'formatoptions'флагах и :help autoformat.

:set formatoptions+=a

gqи gwотформатирует линии, по которым движется следующее движение.

Formatting is done with one of three methods:
                1. If 'formatexpr' is not empty the expression is
                   evaluated.  This can differ for each buffer.
                2. If 'formatprg' is not empty an external program
                   is used.
                3. Otherwise formatting is done internally.

                In the third case the 'textwidth' option controls the
                length of each formatted line

Разница между ними заключается в том gq, что курсор будет оставлен на первой непустой последней отформатированной строке. gwвернет курсор туда, где он начался.

Вы можете легко перевернуть абзац, с которым в данный момент находится ваш курсор gwap, или весь документ gggwG, хотя это переместит ваш курсор благодаря ведущему gg.

С помощью автокоманды вы можете автоматически выполнять форматирование. Вот пример, который форматирует текущий абзац при выходе из режима вставки:

augroup myformatting
    autocmd!
    autocmd InsertLeave * normal gwap<CR>
augroup END

Существуют и другие триггеры автокоманд, которые могут вам подойти. Вы можете изучить варианты в :help autocmd-events. Наиболее важные из них, вероятно, подпадают под «различные» подзаголовки.

8bittree
источник
одним словом: гениально!
Джейсон Ху,
1

Я бы посмотрел :help 'textwidth'. Он будет автоматически разбивать строки при вводе. Однако это не работает, если вы редактируете середину строки.

Я лично предпочитаю textwidthпрекратить, поэтому я создал функцию, которая будет автоматически объединять и разбивать абзац. (В основном это автоматически форматирует до 80 символов) Это выглядит так:

function! ParagraphToEightyChars()
   while (len(getline(".")) > 80)
      normal! 0
      " Find the first white-space character before the 81st character.
      call search('\(\%81v.*\)\@<!\s\(.*\s.\{-}\%81v\)\@!', 'c', line('.'))
      " Replace it with a new line.
      exe "normal! r\<CR>"
      " If the next line has words, join it to avoid weird paragraph breaks.
      if (getline(line('.')+1) =~ '\w')
         normal! J
      endif
   endwhile
   " Trim any accidental trailing whitespace
   :s/\s\+$//e
endfunction

Затем у меня есть отображение для вызова, когда мне это нужно:

nnoremap <silent><A-J> :call ParagraphToEightyChars()<CR>

Эта функция отлично formatoptions+=jrподходит для форматирования комментариев в коде! Просто наведите курсор на первую строку длиной более 80 символов и вызовите функцию.

(Примечание: я не сделал эту функцию общей, чтобы делать длины, отличные от 80, но я думаю, что вам нужно изменить только 80 и 81, если вы хотите сделать это чем-то другим)

Смотрите :help 'textwidth'и :help 'formatoptions'для получения дополнительной информации.

Tumbler41
источник
Спасибо, что поделились Когда я проверяю ваши настройки, они не форматируются автоматически, когда я печатаю, правильно? Если так, то это все еще неоптимальное решение, не так ли?
Джейсон Ху,
textwidthбудет автоматически форматировать при вводе. Моя функция не будет. Я предпочитаю контролировать, когда vim оборачивает вещи, так что это работает для меня. Но если вы специально ищете форматировщик типа «как вы», то да; это не совсем подходит для вашего рабочего процесса.
Tumbler41
1

Для полноты картины я бы хотел упомянуть вариант на основе плагинов.

Если вы используете что - то вроде ALE , которая поддерживает запуск ваших буферов через Beautifier на экономию, вы могли бы позволить похорошела ручку rewrapping кода.

Я достиг этого, поместив это в ~/.vim/ftplugin/markdown.vim:

let b:ale_fixers = ['prettier', 'remove_trailing_lines', 'trim_whitespace']
let b:ale_javascript_prettier_options = '--prose-wrap always'

... и положить это в ~/.vimrc:

let g:ale_fix_on_save = 1
ssokolow
источник