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


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

1 ответ1

3

Вам нужно экранировать символ ~ :

if str =~ '\~/dir1'

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

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

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

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

  • Вы, вероятно, хотите привязать совпадение к началу: str =~ '^\~/dir1' . Возможно также установить разделитель пути в конце: str =~ '^\~dir1/ , иначе ~/dir10/file также будет считаться как внутри dir1 !
  • Оператор =~ match (как и буквальное сравнение == ) подчиняется настройке 'ignorecase' . Поэтому рекомендуется сделать сравнение независимым от текущего значения этого параметра с помощью =~# или =~? ,
  • Если вам не нужно использовать специальные обозначения клавиш, лучше использовать 'string' в одинарных кавычках, потому что обратный слеш не имеет особого значения и его не нужно экранировать (еще раз).
  • Вы должны обернуть ваш :autocmd в :augroup ; без этого каждая перезагрузка ~/.vimrc будет добавлять еще один запуск:
augroup SayLocation
    autocmd! " Clear existing
    autocmd BufEnter * ...
augroup END

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .