2013-11-04 3 views
6

나는 파일에 여분의 공백을 제거하는 기능을 작성했습니다 :어떻게 현재 커서 위치를 저장하고 나중에 Vimscript에로드합니까?

let g:trim_whitespace = 1 

function! TrimWhitespace() 
    if g:trim_whitespace 
     normal :%s/\s\+$//e 
    endif 
endfunction 

문제는 커서의 위치가 대체 명령 후 [1, 1]로 설정되어 있다는 점이다. 나는 커서가 전혀 이동하지 않으려는, 그래서 나는 커서 위치를 저장하고 대체 명령 한 후에 다시 시도 :

let a:cursor_pos = getpos(".") 
normal :%s/\s\+$//e 
exec cursor(a:cursor_pos[1], a:cursor_pos[2]) 

하지만 여전히 똑같은 일이 발생 cursor에 대한 호출이 것처럼 효과 없음. 어떤 아이디어? 마크를 배치

답변

8
  1. :execute 명령의 평가이지만, cursor()가 내장 기능. :call cursor(a:cursor_pos[1], a:cursor_pos[2])으로 호출해야합니다. 또한 :substitute 명령을 실행하기 위해 함수에 :normal이 필요하지 않습니다. %s/\s\+$//e으로 작성하십시오. 버퍼 :call setpos('.', a:cursor_pos)
  2. 점프를 여전히 볼 을 변경할 수 있고, 즉, 표시 버퍼의 어느 부분 :
  3. 호출 할 간단 대응 setpos() 기능이있다. 이를 방지하려면 winsaveview()/winrestview() (커서 위치 포함)을 사용해야합니다.
  4. 귀하의 기능은 여전히 ​​검색 기록을 오가며 수정 불가능한 버퍼에 실패하는 등의 다른 단점이 있습니다. 특히 매우 일반적인 기능의 경우에는 여러 솔루션이 있습니다 (예 : DeleteTrailingWhitespace plugin). (플러그인 페이지에는 다른 플러그인에 대한 링크가 있습니다.) 할 필요가 없을 때 바퀴를 재충전하지 마십시오!
+0

학습을 위해 휠을 다시 혁신하지 않습니까? :) 큰 설명에 감사드립니다. – Hubro

+0

그렇다면 괜찮습니다 (하지만 다른 해결책을 알고 있다고 언급 할 수도 있습니다). 어떻게하면 플러그인 권장 사항을 게시하는 것이 아니라 배울 수 있도록 코드를 명시 적으로 언급했는지 주목하십시오. 재미있어! –

3

시도 :

mark ` 
%s/\s\+$//e 
normal `` 
관련 문제