VIM에서 마크 다운을 작성할 때 자동으로 줄 바꿈


11

종종 VIM에 마크 다운을 작성하면 해당 마크 다운에 단락이 생깁니다. 편집을 돕기 위해 Vim을 80 자로 줄 바꿈하도록 설정했습니다. 타이핑을 계속하면 잘 작동하지만 문제는 약간의 수정이 필요한 경우 매우 성가신 것입니다.

데모 (wikipedia first order logic에서 가져온) :

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'추가 정보를 원하시면.


공유해 주셔서 감사합니다. 설정을 확인할 때 입력 할 때 자동으로 포맷되지 않습니다. 맞습니까? 그렇다면 여전히 차선책 일 것입니다.
Jason Hu

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.