2013-03-07 19 views
6

Próbuję utworzyć prostą funkcję skryptu vim i mam problemy. Ta funkcja musi pobrać dwa ciągi wejściowe i uruchomić wyszukiwanie oraz zastąpić wszystkie ich wystąpienia. Mam następujący teraz:Parametr funkcji VIM Przekazywanie

function! FindAndReplaceAll(from, to)           
    echo a:from                 
    :%s/a:from/a:to/gc                
    endfunction 

Kiedy zrobić:

:call FindAndReplaceAll("test", "test2") 

Echo a: z działa poprawnie, ale z:% s ... działa na zi do literałów zamiast. Zauważyłem, że moje wysokie oświetlenie składni vim nie podkreśla ich jako zmiennych, więc wydaje mi się, że mam podstawowy problem z składnią.

Moje pytania są następujące:

  1. Jaka jest poprawna składnia z tym? Byłbym wdzięczny za wyjaśnienie, dlaczego, a nie tylko odpowiedź. Dlaczego powyższe jest nieprawidłowe?
  2. W każdym razie, aby umożliwić to nazywać jak

    call FindAndReplaceAll (testy, test2)

Więc nie trzeba dodawać cytaty ...

Odpowiedz

12

trzeba zmienić

:%s/a:from/a:to/gc

do:

exe '%s/' . a:from . '/' . a:to . '/gc'

Twoja wypowiedź jest interpretowany dosłownie. tj. zastąpi ciąg "a: od" ciągiem "a: to" w bieżącym buforze.

Ale zamiarem jest zastąpienie ciągu znaków ocenionego przez a:from ciągiem ocenionym przez a:to. Można to osiągnąć za pomocą wbudowanej funkcji exe[cute] (można uzyskać pomoc, wpisując: :h exe w trybie wiersza poleceń).

Jeśli chodzi o drugie pytanie, należy użyć cudzysłowów, w przeciwnym razie będą one traktowane jako zmienne.

1

Komenda linia powinna być wywołana z `wykonać”, zamiast bezpośredniego tekstem:

function! FindAndReplaceAll(from, to)           
    echo a:from                 
    execute "%s/" . a:from . "/" . a:to . "/gc"                
endfunction