Vimscript: ошибка при проверке подстроки

2372
krystah

В настоящее время я пытаюсь связать вместе функцию, чтобы сделать что-то в зависимости от текущего пути к файлу, срабатывает всякий раз, когда я меняю текущий буфер с помощью autocmd BufEnter

По моему .vimrc

autocmd BufEnter * call SayLocation() 


Дальше в моем .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 

Однако изменение буфера приводит к следующей ошибке

Строка 3:
E33: нет предыдущего замещающего регулярного выражения
Строка 7:
E33: нет предыдущего замещающего регулярного выражения
Я где-то еще


Кажется, я запускаю компаратор подстроки = ~ неправильно. Любая подсказка?

0

1 ответ на вопрос

3
Ingo Karkat

Вам нужно убежать от ~персонажа:

if str =~ '\~/dir1' 

:help E33Уже объясняет проблему очень хорошо:

E33 Нет предыдущего замещающего регулярного выражения

При использовании символа '~' в шаблоне он заменяется ранее использованным шаблоном в команде ": substitute". Это терпит неудачу, когда такая команда еще не использовалась. Смотрите | / ~ |. Это также происходит при использовании «: s / pat /% /», где «%» обозначает предыдущую замещающую строку.

Дополнительная критика

  • Вы, вероятно, хотите привязать матч к началу str =~ '^\~/dir1'. Возможно также установить разделитель пути в конце:, str =~ '^\~dir1/иначе ~/dir10/fileтакже будет учитываться как внутри dir1!
  • Оператор =~сопоставления (как и буквальное ==сравнение) подчиняется 'ignorecase'настройке. Поэтому желательно, чтобы сделать сравнения независимо от текущего значения этого опциона либо через =~#или =~?.
  • Если вам не нужно использовать специальные обозначения клавиш, лучше использовать одинарные кавычки 'string', потому что обратная косая черта там не имеет особого значения и не нуждается в экранировании (еще раз).
  • Вы должны завернуть :autocmdв :augroup; без этого каждая перезагрузка ~/.vimrcдобавит еще один прогон:
augroup SayLocation autocmd! " Clear existing autocmd BufEnter * ... augroup END 
Кажется, я пропустил крошечную кучу вещей, ха-ха, спасибо большое :) Шаблон теперь распознан, и это все хорошо и весело, но кажется, что функция запускается дважды при каждом изменении буфера: S Бывает ли иметь какие-либо указатели? krystah 10 лет назад 0
Вы перезагрузили свой .vimrc? Лучше использовать `: augroup`; Я добавил это к своему ответу. Ingo Karkat 10 лет назад 0
Это добилось цели. Ты восхитителен. Еще раз спасибо! krystah 10 лет назад 0