Vimscript: Błąd podczas sprawdzania podciągów

0

Obecnie próbuję powiązać funkcję, aby zrobić coś w zależności od bieżącej ścieżki pliku, uruchamianej za każdym razem, gdy zmieniam bieżący bufor za pomocą autocmd BufEnter

W moim .vimrc

autocmd BufEnter * call SayLocation()


Dalej w moim .vimrc

fun SayLocation()
  let str = expand("%p:~")

  if str =~ "~/dir1"
    echo "I am in dir 1!"

  elseif str =~ "~/dir2"
    echo "I am in dir 2!"

  else 
    echo "I am somewhere else"

  endif
endf

Jednak zmiana bufora powoduje następujący błąd

Wiersz 3:
E33: brak poprzedniego zastępczego wyrażenia regularnego
Wiersz 7:
E33: brak poprzedniego zastępczego wyrażenia regularnego
Jestem gdzieś indziej


Wygląda na to, że źle używam komparatora podłańcuchów. Jakieś wskazówki?

krystah
źródło

Odpowiedzi:

3

Musisz uciec od ~postaci:

if str =~ '\~/dir1'

To :help E33już bardzo dobrze wyjaśnia problem:

E33 Żadne poprzednie nie zastąpiło wyrażenia regularnego

Gdy używasz znaku „~” we wzorcu, jest on zastępowany wcześniej używanym wzorcem w poleceniu „: substitute”. To kończy się niepowodzeniem, gdy nie użyto jeszcze takiego polecenia. Zobacz | / ~ |. Dzieje się tak również podczas używania „: s / pat /% /”, gdzie „%” oznacza poprzedni ciąg zastępczy.

Dodatkowa krytyka

  • Prawdopodobnie chcesz zakotwiczyć mecz do początku: str =~ '^\~/dir1'. Prawdopodobnie zapewnij również separator ścieżek na końcu: str =~ '^\~dir1/w przeciwnym razie ~/dir10/filebędzie również liczony jako wewnątrz dir1!
  • =~Operator mecz (jak dosłownego ==porównania) przestrzega 'ignorecase'ustawienia. Dlatego wskazane jest uniezależnienie porównania od bieżącej wartości tej opcji za pomocą jednego =~#lub dwóch =~?.
  • O ile nie musisz używać specjalnego zapisu klucza, lepiej używać cudzysłowu 'string', ponieważ odwrotny ukośnik nie ma tam specjalnego znaczenia i nie trzeba go uciekać (jeszcze raz).
  • Powinieneś owinąć się :autocmdw :augroup; bez niego każde przeładowanie ~/.vimrcdoda kolejny przebieg:
augroup SayLocation
    autocmd! " Clear existing
    autocmd BufEnter * ...
augroup END
Ingo Karkat
źródło
Wygląda na to, że przegapiłem malutką ciężarówkę rzeczy, haha, dziękuję :) Wzór jest teraz rozpoznawany i to wszystko jest dobre i wesołe, ale wydaje się, że funkcja działa dwa razy przy każdej zmianie bufora: S Zdarza się, że masz jakieś wskaźniki?
krystah
Czy przeładowałeś swój .vimrc? Lepiej użyj :augroup; Dodałem to do mojej odpowiedzi.
Ingo Karkat,
To załatwiło sprawę. Jesteś niesamowity. Dzięki jeszcze raz!
krystah