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

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

Решение

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

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
Другие вопросы по тегам