Vimscript: Fehler beim Prüfen auf Teilzeichenfolge

2466
krystah

Ich versuche gerade, eine Funktion zusammenzubinden, um abhängig vom aktuellen Dateipfad etwas zu tun, das ausgelöst wird, wenn ich den aktuellen Puffer mit autocmd BufEnter ändere

In meiner .vimrc

autocmd BufEnter * call SayLocation() 


Weiter unten in meiner .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 

Das Ändern des Puffers führt jedoch zu dem folgenden Fehler

Zeile 3:
E33: Kein vorheriger regulärer Ausdruck als Ersatz
Zeile 7:
E33: Kein vorheriger regulärer Ausdruck als Ersatz
Ich bin woanders


Es scheint, dass ich den Teilstring-Komparator = ~ falsch laufe. Irgendeine Ahnung?

0

1 Antwort auf die Frage

3
Ingo Karkat

Du musst dem Charakter entkommen~ :

if str =~ '\~/dir1' 

Das :help E33erklärt das Problem schon sehr gut:

E33 Kein vorheriger regulärer Ausdruck

Wenn Sie das Zeichen "~" in einem Muster verwenden, wird es durch das zuvor verwendete Muster in einem Befehl ": substituieren" ersetzt. Dies schlägt fehl, wenn noch kein solcher Befehl verwendet wurde. Siehe | / ~ |. Dies geschieht auch bei der Verwendung von ": s / pat /% /", wobei "%" für die vorherige Ersatzzeichenfolge steht.

Zusätzliche Kritik

  • Sie wollen wahrscheinlich zu verankern, um das Spiel zu Beginn: str =~ '^\~/dir1'. Wahrscheinlich auch am Ende ein Pfadtrennzeichen setzen:, str =~ '^\~dir1/oder ~/dir10/filewürde sonst auch als innen gezählt dir1!
  • Der =~Übereinstimmungsoperator (wie der Literalvergleich ==) gehorcht der 'ignorecase'Einstellung. Daher ist es ratsam, den Vergleich über den Wert von =~#oder unabhängig vom aktuellen Wert dieser Option zu machen =~?.
  • Wenn Sie keine spezielle Schlüsselnotation verwenden müssen, ist es besser, einfache Anführungszeichen zu verwenden 'string', da der Backslash dort keine besondere Bedeutung hat und nicht erneut maskiert werden muss.
  • Sie sollten Ihre :autocmdin ein einwickeln :augroup; Ohne diese Option ~/.vimrcwird bei jedem erneuten Laden ein weiterer Lauf hinzugefügt:
augroup SayLocation autocmd! " Clear existing autocmd BufEnter * ... augroup END 
Es scheint, ich habe eine winzige Ladung von Dingen verpasst, haha, danke ein bisschen :) Das Muster wird jetzt erkannt und das ist alles gut und lustig, aber es scheint, dass die Funktion bei jedem Pufferwechsel zweimal ausgeführt wird: S Haben Sie irgendwelche Hinweise? krystah vor 10 Jahren 0
Haben Sie Ihre .vimrc neu geladen? Verwenden Sie besser eine `: augroup`; Ich habe das zu meiner Antwort hinzugefügt. Ingo Karkat vor 10 Jahren 0
Das hat den Trick gemacht. Du bist unglaublich. Danke noch einmal! krystah vor 10 Jahren 0