Перейти к содержимому

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

0

В настоящее время я пытаюсь связать вместе функцию, чтобы сделать что-то в зависимости от текущего пути к файлу, срабатывает всякий раз, когда я меняю текущий буфер с помощью 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: нет предыдущего замещающего регулярного выражения
Я где-то еще


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

2 505 просмотров
krystah спросил 12 лет назад
K 682

1 ответ

3
Принятый ответ

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

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 · 12 лет назад · 0

Вы перезагрузили свой .vimrc? Лучше использовать : augroup; Я добавил это к своему ответу.

Ingo Karkat · 12 лет назад · 0

Это добилось цели. Ты восхитителен. Еще раз спасибо!

krystah · 12 лет назад · 0
Ingo Karkat ответил 12 лет назад
I 17 213