2010-02-01 7 views
7

zadanie Tło

Aby wyeliminować problemy XY powiem co robię: Staram się używać :perldo w VIM 7.2 wypełnić dwa zadania:VIM problemem 7,2 skryptów z `: perldo` i wiele wyrażeń

  • Wyczyść wszystko końcowe białe znaki, w tym (nie wyczyszczenie usuwanie) wiersze tylko mają spacje
    • s/\s+$//;
  • usunięcia nie-tab spacje, który istnieje przed pierwszym non spacją
    • s/^ (\s*) (?=\S)/s#[^\t]##g;$_ /xe;

Chciałbym zrobić to wszystko z jednym przejściem. Obecnie, używając :perldo, mogę uruchomić to za pomocą dwóch przebiegów. (Przy użyciu: perldo dwukrotnie)

Komenda powinna wyglądać następująco:

:perldo s/\s+$//; s/^ (\s*) (?=\S)/s#[^\t]##g;$_ /xe; 

Perl tło

Aby zrozumieć ten problem, trzeba wiedzieć trochę o Perl s/// automagicznie wiąże się z domyślna zmienna $_, którą regex można dowolnie modyfikować. Większość podstawowych funkcji działa domyślnie na $_.

perl -e'$_="foo"; s/foo/bar/; s/bar/baz/; print' # wypisze baz

Założenie jest takie, że można wyrażenia łańcuchowe wykorzystujące :perldo w VIM i że będzie działać logicznie.

VIM nie jest miły

Teraz mój problem VIM jest lepiej wykazać z kodem - Mam go zredukowana do prostego testu. Otworzyć nowe miejsce buforowania następujący tekst do niego:

aa bb 
aa 
bb 

teraz uruchomić ten :perldo s/a/z/; s/b/z/; Bufor ma teraz:

za zb 
aa 
zb 

dlaczego pierwszy regex nieudaną w drugim rzędzie, i jeszcze drugi regex odniósł sukces sam w sobie i w pierwszym rzędzie?

Odpowiedz

6

Wygląda na to, że całe wyrażenie w Perlu przekazywane do :perldo musi zwracać wartość true/defined lub wyniki są odrzucane, za linię.

Spróbuj tego, nic się nie dzieje na każdej linii:

:perldo s/a/z/; s/b/z/; 0 

spróbować, to działa na wszystkich 3 liniach zgodnie z oczekiwaniami:

:perldo s/a/z/; s/b/z; 1 

Przykładem w dokumentacji :perldo wskazuje na to:

:perldo $_ = reverse($_);1 

ale niestety nie mówi wprost o co chodzi.

+1

Tak, który wyjaśniłby wyniki OP: Ostatnia instrukcja w' perldo' musi zwrócić wartość true lub cały wynik 'perldo' jest odrzucane. –

+0

Przełączam to na moją odpowiedź, ponieważ ma to sens. Wyobrażam sobie, że drugą odpowiedzią było wykorzystanie '0 + 0 = 0 (bez wymiany)', a 1 + 0 lub 0 + 1 spowodowałoby zastąpienie. To jest dość głupia rzecz, której nie udokumentowano. –

0

Wydaje mi się, że tylko ostatnia komenda działa na wszystkich liniach w [zakresie].

5

nie wiem, co jest dokładnie :perldo robi, ale jeśli uruchomić coś podobnego

:perldo s/a/z/+s/b/z/ 

następnie dostać coś bardziej jak można się spodziewać.

+0

Dzięki! Nie jestem pewien, jak to się robi, ale tak jest. –

+0

Nadal nie wiem, jak to działa, ale podejrzewałam, że zachowałby się lepiej z pojedynczym wyrażeniem. – mob

+0

powinien prawdopodobnie zostać dodany do reguły ': he' –