2013-11-04 8 views
6

Pisałem funkcję usuwania nadmiaru spacje w pliku:Jak zapisać bieżącą pozycję kursora i załadować ją później w programie Vimscript?

let g:trim_whitespace = 1 

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

Problem jest taki, że pozycja kursora jest ustawiony na [1, 1] po komendzie substytucyjnego. Nie chcę, aby przesunąć kursor w ogóle, więc starałem się zapisać pozycję kursora i przywrócić go po zmiennika polecenia:

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

ale nadal dokładnie to samo dzieje się, jakby miał wezwanie do cursor bez efektu. Jakieś pomysły?

Odpowiedz

8
  1. :execute jest do oceny Ex nakazuje, ale cursor() jest wbudowany funkcji. Musisz wywołać go pod numerem :call cursor(a:cursor_pos[1], a:cursor_pos[2]). Ponadto nie potrzebujesz :normal w swojej funkcji do wykonania polecenia :substitute; po prostu napisz %s/\s\+$//e.
  2. Jest odpowiedni setpos() funkcji, które jest prostsze do wywoływania: :call setpos('.', a:cursor_pos)
  3. skoki w buforze, mogą jeszcze zmieniać widok, to znaczy co część bufora jest widoczny. Aby tego uniknąć, musisz użyć winsaveview()/winrestview() (która zawiera pozycję kursora).
  4. Twoja funkcja nadal blokuje historię wyszukiwania i ma inne niedostatki, takie jak błąd w przypadku niemodowionych buforów. Specjalnie dla tej konkretnej, bardzo powszechnej funkcjonalności istnieje kilka rozwiązań, na przykład moja DeleteTrailingWhitespace plugin. (Strona z wtyczkami zawiera linki do alternatywnych wtyczek). Nie (słabo) wymyślaj koła, gdy nie musisz!
+0

Czy nie wymyśla się na nowo koła dobrego do nauki? :) Dzięki za świetne wyjaśnienie. – Hubro

+0

W porządku (ale możesz/powinnaś wspomnieć, że znasz te inne rozwiązania). Zwróć uwagę, że nie opublikowałem rekomendacji wtyczki, ale wyraźnie zaadresowałem Twój kod, aby pomóc Ci się uczyć. Baw się dobrze! –

3

spróbować umieścić znak:

mark ` 
%s/\s\+$//e 
normal `` 
Powiązane problemy