2011-08-11 1 views
7

Vim이 커서를 터치하면 자동으로 접기를 확장 할 수 있습니까?커서를 올려 놓았을 때 Vim 접기를 자동으로 확장 할 수 있습니까?

+1

한 이유를 당신은 또한 커서 이동을위한 자동 명령을 할 수 당신은 Eelvex의 대답을 받아 들일 뿐이지? 개정 내역에서 명백한 바와 같이이 솔루션 (그리고 훨씬 더 우아한 버전,'au CursorMoved, CursorMovedI * sil! foldo') *을 제안 할뿐만 아니라 문제를보다 일관되게 해결할 수있는 방법을 개발했습니다. –

+0

죄송합니다. 왜 내가 그랬는지 기억이 안납니다. 결정된. – dan

답변

4

foldopen 옵션을 참조하십시오. 커서가 닫힌 폴드로 이동되는 경우 어떤 그룹의 명령이 으로 이어지는 지 제어합니다.

수직 이동은 닫힌 폴드를 열지 않습니다. 또한 이 동작을 사용하려면 foldopen에 설정이 없습니다. hor 항목이 인 경우 , l 또는 기타 수평 이동 명령을 사용하여 foldopen 옵션을 설정할 수 있습니다. 에 접하는 커서 이동을 자동으로 열어야하는 경우 아래와 같이 수직 이동 명령의 일부 하위 집합을 다시 매핑하여 문제에 접근 할 수 있습니다.

nnoremap <silent> j :<c-u>call MoveUpDown('j', +1, 1)<cr> 
nnoremap <silent> k :<c-u>call MoveUpDown('k', -1, 1)<cr> 
nnoremap <silent> gj :<c-u>call MoveUpDown('gj', +1, 1)<cr> 
nnoremap <silent> gk :<c-u>call MoveUpDown('gk', -1, 1)<cr> 
nnoremap <silent> <c-d> :<c-u>call MoveUpDown("\<lt>c-d>", +1, '&l:scroll')<cr> 
nnoremap <silent> <c-u> :<c-u>call MoveUpDown("\<lt>c-u>", -1, '&l:scroll')<cr> 
nnoremap <silent> <c-f> :<c-u>call MoveUpDown("\<lt>c-f>", +1, 'winheight("%")')<cr> 
nnoremap <silent> <c-b> :<c-u>call MoveUpDown("\<lt>c-b>", -1, 'winheight("%")')<cr> 
function! MoveUpDown(cmd, dir, ndef) 
    let n = v:count == 0 ? eval(a:ndef) : v:count 
    let l = line('.') + a:dir * n 
    silent! execute l . 'foldopen!' 
    execute 'norm! ' . n . a:cmd 
endfunction 

열등하지만, 약간은 thriftier 솔루션은 모든 커서 움직임에 배를 열 것입니다.

autocmd CursorMoved,CursorMovedI * silent! foldopen 

불행히도,이 해결책은 일반적인 해결책이 아닙니다. 커서 아래의 접기가 열리면 커서는 해당 접기의 첫 번째 줄에 배치됩니다. 이 동작이 바람직하지 않은 경우 의 수직 방향을 따라 이동하고 커서 이 아래 위로 이동하면 접기의 마지막 줄에 커서를 놓습니다.

autocmd CursorMoved,CursorMovedI * call OnCursorMove() 
function! OnCursorMove() 
    let l = line('.') 
    silent! foldopen 
    if exists('b:last_line') && l < b:last_line 
     norm! ]z 
    endif 
    let b:last_line = l 
endfunction 

그러나 이동이 폴드 위로 이동하면 폴드가 열리지 않습니다. 예를 들어, 의 경우 접힌 부분 바로 위에있는 행의 2j은 두 번째 줄이 아닌 해당 접기 직후의 줄에 커서를 놓습니다.

+0

이전 버전의'CursorMoved' 솔루션을 되돌립니다. –

1

:help fdo 그리고 아마도 :help fcl이 도움이 될 수 있습니다.

set foldopen=block,hor,insert,jump,mark,percent,quickfix,search,tag,undo 
3
set foldopen=all 

당신이 원하는 것을 할 것 : 내 .vimrc 파일에서이 라인을 가지고있다.

au CursorMoved * call AutoOpen() 

함수처럼 호출 :이 또한 삽입 모드에서 작업 할 경우

function! AutoOpen() 
    if foldclosed(".") == line(".") 
    call feedkeys("zo") 
    endif 
endfunction 

, 사용 :

au CursorMoved,CursorMovedI * call AutoOpen() 
+0

불행히도,이 접근법에는 단점이 있습니다 (제 답변 참조). –

+0

@ib : 완벽한 것은 아니지만 단점을 이해하지 못합니다. 당신은 정교 할 수 있습니까? 감사. – Eelvex

+0

그것은 명백합니다 (그리고 이미 내 대답에 설명되어 있습니다).닫힌 폴드 옆의 줄로 커서를 이동하고 한 줄 위로 이동합니다 (예 : 'k'사용). 접히는 부분이 열리 며 커서는 마지막 부분이 아닌 논리적으로 (줄 단위로 수직 이동의 의미를 의미하는) 해당 접기의 첫 번째 줄에있게됩니다. 또 다른 단점을 보려면 닫힌 접기 바로 위의 줄에 커서를 놓고'2j'를 입력하십시오. 커서는 전체 폴드 위로 뛰어 오를 것입니다. 두 줄 아래로 이동하지 만 폴드만큼 많은 줄이 있습니다. –

관련 문제