vim의 {} 동작이 접기를 건너 뜁니다.


3

나는 다음과 이전의 빈 줄로 점프하는 vim {}모션을 좋아 합니다.

나는 최근에 더 많이 접는 것을 사용하고 있으며 훌륭한 기능이지만 모션 {}모션 과 관련하여 기대하는 것을 수행하지 않습니다 . 겹의 빈 줄이있는 경우, 다음 {}이렇게 배를 열고, 거기에 착륙합니다.

접기 를 다시 매핑 {하고 }건너 뛸 수 있는 방법이 있습니까? 즉 거기에 배 내부에 빈 줄이 있었다하더라도,이다 {}멈추지 않을 것이다 그러나 다음 펼쳐진 빈 줄을 추구 것인가? 이것은 내가 기대하는 것과 더 잘 맞을 것입니다.

답변:


8

첫 번째 질문 :

block기본값 인 'foldopen'다음을 제거해야합니다 .

set foldopen-=block

참조하십시오 :help 'foldopen'.

두 번째 질문 :

이 매핑을 시도해 볼 수 있습니다

nnoremap <expr> } foldclosed(search('^$', 'Wn')) == -1 ? "}" : "}j}"
nnoremap <expr> { foldclosed(search('^$', 'Wnb')) == -1 ? "{" : "{k{"

이것은 훨씬 낫습니다, 감사합니다! 그러나 그것은 내가 요구 한 것이 아닙니다. 빈 줄이 있어도 커서가 {또는에서 멈추지 않도록 접는 부분을 모두 건너 뛰고 싶습니다 }.
Jeff Terrell 박사

내 대답은 첫 번째 질문을 해결했습니다. 여러 질문이있는 경우 별도로 문의하십시오. 그것들이 모두 공통의 주제로 연결되어 있다면, 그 주제에 대해 대신 물어보십시오.
romainl

@ JeffTerrellPh.D. 내 편집 내용을 참조하십시오.
romainl

후속 감사합니다. 이 nnoremap명령을 사용하면 접힌 빈 줄이 더 적어 커서를 잡을 수 있지만 단일 접기에 두 개의 빈 줄이 있으면 두 번째 줄은 여전히 ​​커서를 잡습니다. 일부가 아닌 접힌 빈 줄을 모두 건너 뛰고 싶습니다 . 또한 한 가지 질문 만하려고했습니다. 위의 두 번째 질문은 새로운 질문이 아니라 첫 번째 질문의 의도를 명확히하기위한 것입니다. 감사!
Jeff Terrell 박사

현재 수퍼 유저에 관한 두 가지 질문이 있습니다.
romainl

1

이 방법은 여러 개의 연속 접기를 고려합니다.

function! s:SkipFold(direction) abort
  let l:currentLine = line('.')
  while foldclosed(l:currentLine) != -1
    let l:currentLine = search('^$', (a:direction ? 'Wn' : 'Wnb'))
    if l:currentLine == 0
      if a:direction
        call cursor(line('$'), strlen(getline(line('$'))))
      else
        call cursor(1, 1)
      endif
      break
    endif
    call cursor(l:currentLine, 0)
  endwhile
endfunction

nnoremap <silent>} }:call <SID>SkipFold(1)<cr>
nnoremap <silent>{ {:call <SID>SkipFold(0)<cr>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.