автоматично перезаписувати рядки під час написання розмітки у VIM


11

Дуже часто я пишу розмітку у 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 робити це автоматично?

Відповіді:


7

Ще простіше: 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. Найбільш релевантні з них, ймовірно, є підрубриками "різні".


одне слово: блискуче!
Jason Hu

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'для отримання додаткової інформації.


Дякуємо за ваш обмін. Перевіряючи налаштування, під час введення він не форматується автоматично, правильно? Якщо так, то це все-таки субоптимальне рішення, ні?
Джейсон Ху

textwidthавтоматично вводиться під час введення. Моя функція не буде. Я вважаю за краще контролювати, коли vim обгортає речі, тому це працює на мене. Але якщо ви спеціально шукаєте формат під типовий тип, так; це не зовсім відповідає вашому робочому процесу.
Тумблер41

1

Для повноти хотілося б згадати варіант на основі плагіна.

Якщо ви використовуєте щось на кшталт ALE, яке підтримує запуск ваших буферів через красуню при збереженні, ви можете дозволити Prettier впоратися з перев’язкою коду.

Я домігся цього, ввівши це ~/.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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.