Vimscript: erro ao verificar substring

0

No momento, estou tentando vincular uma função para fazer algo, dependendo do caminho do arquivo atual, acionado sempre que eu altero o buffer atual com autocmd BufEnter

No meu .vimrc

autocmd BufEnter * call SayLocation()


Mais abaixo no meu .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

No entanto, a alteração do buffer gera o seguinte erro

Linha 3:
E33: Nenhuma expressão regular substituta anterior
Linha 7:
E33: Nenhuma expressão regular substituta anterior
Eu estou em outro lugar


Parece que estou executando o comparador substring = ~ errado. Alguma pista?

    
por krystah 18.12.2013 / 10:52

1 resposta

3

Você precisa escapar do caractere ~ :

if str =~ '\~/dir1'

O :help E33 já explica muito bem o problema:

E33 No previous substitute regular expression

When using the '~' character in a pattern, it is replaced with the previously used pattern in a ":substitute" command. This fails when no such command has been used yet. See |/~|. This also happens when using ":s/pat/%/", where the "%" stands for the previous substitute string.

Crítica adicional

  • Você provavelmente deseja ancorar a correspondência ao início: str =~ '^\~/dir1' . Provavelmente, também defina um separador de caminho no final: str =~ '^\~dir1/ , senão ~/dir10/file também seria contado como dir1 !
  • O operador =~ match (como a comparação literal == ) obedece à configuração 'ignorecase' . Portanto, é aconselhável tornar a comparação independente do valor atual dessa opção via =~# ou =~? .
  • A menos que você precise usar a notação de chave especial, é melhor usar aspas simples 'string' , porque a barra invertida não tem nenhum significado especial e não precisa ser escapada (mais uma vez).
  • Você deve agrupar seu :autocmd em :augroup ; sem isso, cada recarregamento de ~/.vimrc adicionará outra execução:
augroup SayLocation
    autocmd! " Clear existing
    autocmd BufEnter * ...
augroup END
    
por 18.12.2013 / 11:02