Testando vimscript

1

Eu estou hackeando uma estrutura de teste para o vimscript (um exercício de futilidade, eu sei; humor-me). Alguns plugins vim fazem chamadas para o shell (com a função system() ou o comando ! ). Eu quero que o driver de teste consiga pegar essas chamadas e retornar dados pré-fabricados.

Até onde eu sei, o system() do vim faz um fork e executa o comando em um subshell. Em teoria, deveria ser possível fazer algo como

alias ls="echo one\ntwo\nthree"

para que possamos fazer um teste nos seguintes moldes:

:.!ls

e verifique se a saída é

one
two
three

Na prática, o vim parece estar bifurcando um subshell que não respeita nenhum alias temporário. Em outras palavras, ele cria um novo ambiente shell limpo usando o shell do usuário (zsh, bash, whatever), mas não as configurações do shell do usuário (global nem local).

Você conhece alguma maneira de executar o vim em um ambiente em que determinadas chamadas do sistema sejam controladas pelo usuário?

    
por So8res 31.01.2013 / 19:32

1 resposta

3

Os shells não interativos não passam por toda a inicialização que um shell interativo faz. Consulte a seção INVOCATION da página de manual bash (ou qualquer shell que você esteja segmentando) para obter detalhes.

Por outro lado, o bash irá procurar por um script chamado $BASH_ENV e executá-lo antes de iniciar um shell não interativo. Use isso para configurar seu ambiente para escapes do shell do vim. Demonstração de linha de comando:

% bash -c 'alias'
<no output>
% export BASH_ENV=./special.aliases 
% bash -c 'alias'
this=that

Mas, na verdade, você pode fazer muito melhor: defina a variável SHELL como um programa de sua escolha, talvez apenas /bin/echo , e o vim a chamará em vez de lançar um shell de difícil controle. Isso funciona mesmo se o seu comando incluir um pipeline ou outros metacaracteres do shell, então eu recomendo strongmente. (Você obterá o -c que o vim insere ao bifurcar o "shell", mas tenho certeza de que você pode lidar com isso).

    
por 31.01.2013 / 20:57