한 줄에 한 문장으로 Vim을 설정하는 방법은 무엇입니까?


17

나는 현재 많은 일반 텍스트 (및 단락에서 최소한의 서식을 가진 LaTeX)를 작성하고 있으며 각 문장을 유지하기 위해 vim을 설정할 수 있다면 좋을 것입니다 (간단히 말하면 텍스트는 '.', '!' , 또는 '?'; 즉, 문장 부호로 끝나는 문장 부호 다음에 공백이 붙어서 VCS diff가 더 유용합니다.

최소한 gq텍스트를 다음 과 같이 형식화 하고 싶습니다 .

He lay flat on the brown, pine-needled floor of the forest, his chin on his
folded arms, and high overhead the wind blew in the tops of the pine trees.
The mountainside sloped gently where he lay; but below it was steep and he
could see the dark of the oiled road winding through the pass. There was a
stream alongside the road and far down the pass he saw a mill beside the
stream and the falling water of the dam, white in the summer sunlight. 

에:

He lay flat on the brown, pine-needled floor of the forest, his chin on his folded arms, and high overhead the wind blew in the tops of the pine trees.
The mountainside sloped gently where he lay; but below it was steep and he could see the dark of the oiled road winding through the pass.
There was a stream alongside the road and far down the pass he saw a mill beside the stream and the falling water of the dam, white in the summer sunlight.

그러나 vim이 입력 할 때이 형식을 수행하면 좋을 것입니다 (textwidth reflow와 마찬가지로). 이게 가능해?

내 현재 솔루션은로 단락에 참여한 J다음 :'<,'>s/\. /.\r/g느낌표와 물음표가 거의 없기 때문에 실행 하는 것이 좋지만 gq를 조금 더 똑똑하게 만들면 훨씬 좋습니다.

답변:


23

'formatexpr'옵션

'formatexpr'옵션을 사용하여이를 달성 할 수 있습니다 . 도움에서 :

gq 연산자 또는 자동 형식에 대한 행 범위를 형식화하기 위해 평가되는 표현식입니다 ( 'formatoptions'참조). 이 옵션이 비어 있으면 'formatprg'가 사용됩니다.

텍스트를 'formatexpr'사용 gq하거나 삽입 할 때 올바르게 설정 하면 작동 합니다.

간단한 예

다음은 간단한 VimScript 함수 및 해당 'formatexpr'작업을 수행 하는 해당 값입니다. 모든 엣지 케이스를 테스트하지는 않았지만 간단한 테스트에서는 훌륭하게 작동했습니다.

function! MyFormatExpr(start, end)
    silent execute a:start.','.a:end.'s/[.!?]\zs /\r/g'
endfunction

set formatexpr=MyFormatExpr(v:lnum,v:lnum+v:count-1)

설명

표현식은 함수를 호출 MyFormatExpr()하여 서식이 적용될 시작 및 끝 줄을 전달합니다. 이 행은 자동으로 채워진 변수 v:lnum(서식을 지정할 첫 번째 행)와 v:count( 서식을 지정할 행 수)를 사용하여 계산됩니다 .

MyFormatExpr()기능이 구축 :substitute범위와 명령을 전달하고 (문장의 끝에 구두점 다음 공백 대체 ., !또는 ?개행로 () \r).

경고

  • MyFormatExpr()함수는 들여 쓰기를 유지하지 않습니다. 이를 해결하려면 좀 더 정교한 논리가 필요합니다.
  • 다른 경우가있을 수 있습니다. 테스트 드라이브를 제공하고 필요에 따라 조정하십시오!

그래, 이건 완전히가는 길 이야 내 대답은 무시해
Sukima

대단해! 어떻게 내가 좋아하는, IS 함수 매크로를 실행 한 할 수있는 "다음 문장 앞으로 이동 )과 줄 바꿈을 삽입, 반복 당신이 범위의 끝에 도달 할 때까지." 그런 다음 들여 쓰기 규칙을 적용합니다. 그러나 내 Vim-fu는 너무 약합니다. :)
Nathan Long

이 예에서 분할 e.g. blah하고 Blah et al. 2018있는 약간 성가신입니다. 이와 같은 패턴을와 같은 것으로 일치시킬 수 없습니다 's/\(e\.g\|\<al\)\@<![.!?]\zs /\r/g'. 첫 번째 그룹에 더 많은 패턴을 추가하여 분리하고 싶지 않은 다른 것을 피하십시오. 그렇지 않으면 감사합니다. 나는 gq전에 오지 않았으며 gqip공동 저자의 텍스트 편집기가 엉망인 텍스트의 서식을 지정하는 데 매우 유용합니다.
naught101

이 동작을 기본 동작에 추가하는 방법이 있습니까? 주어진 텍스트 너비로 줄 바꿈하고 문장의 끝에서 나누기를
원합니다

1

다음과 같은 일부 맵과 자동 명령을 설정할 수 있습니다.

function! AddSentenceMaps()
  imap .<Space> .<CR>
  imap !<Space> !<CR>
  imap ?<Space> ?<CR>
  exec "nmap gq vipJ:s/\\([.!?]\\)\\s\\+/\\1\\r/g<CR>"
endfunction

autocmd Filetype customtxt call AddSentenceMaps()

그런 다음 파일 형식을 customtxt로 설정하거나 AddSentenceMaps함수를 수동으로 호출하십시오 .


0

이 문제에 대한 생각을 추가하고 싶습니다. 와 코드를 탐색들 때 보통 사람들 때문에 이상 포장 라인 점프의 기능이 종류를 원하는 jk빔의 기본 동작 명령이다. 줄 바꿈을 통해 탐색하려면 gj아래 gk로 이동하고 위로 이동하십시오. 또한 g- 접두어 대응 ​​부분에 표준 jk명령을 다시 매핑 할 가능성이 있지만 IMHO는 너무 과도합니다.


또는 그 remaping 할 수있는 키가 jk에를 gj하고 gk;-) 당신이 그것을 할 때
안토니

0

형식 재 포맷에 대한 특정 질문에 대한 답변은 아니지만 '줄 바꿈'과 함께 '줄 바꿈'을 사용하면 긴 줄을 훨씬 더 편하게 편집 할 수 있습니다. 이것을 gj 및 gk와 결합하여 줄 바꿈 내에서 탐색하십시오. 위쪽 및 아래쪽 화살표를 각각 gj 및 gk에 매핑하여 실제 선 또는 시각적 선을 위아래로 이동할 수 있습니다. Home / End to g0 / g $와 마찬가지로 현명합니다.

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