2013-11-04 49 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. :executeEx命令的評價,但cursor()是一個內置功能。你需要用:call cursor(a:cursor_pos[1], a:cursor_pos[2])來調用它。另外,你的函數中不需要:normal來執行:substitute命令;只寫%s/\s\+$//e
  2. 有一個相應的setpos()函數是簡單的調用::call setpos('.', a:cursor_pos)
  3. ,緩衝區中的跳躍仍然可以改變視圖,即什麼樣的緩衝區的一部分是可見的。爲了避免這種情況,您需要使用winsaveview()/winrestview()(其中包含光標位置)。
  4. 你的函數仍然會破壞搜索歷史,並且還有其他缺點,例如在不可修改的緩衝區上失敗。特別是對於這個特殊的,非常常見的功能,有幾種解決方案,例如我的DeleteTrailingWhitespace plugin。 (插件頁面有鏈接到其他插件。)當你不需要(不好)重新發明輪子!
+0

是不是重新發明輪子好學習? :)謝謝你的一個很好的解釋。 – Hubro

+0

那很好(但你可以/應該?提到你知道那些其他解決方案)。請注意,我並沒有發佈插件建議,而是明確寫出了您的代碼以幫助您學習。玩的開心! –

3

試着將一個標誌:

mark ` 
%s/\s\+$//e 
normal `` 
相關問題