Por que o vim retornaria um código de saída diferente de zero se eu saísse imediatamente após a abertura?

15

Estou com um problema estranho vimno Snow Leopard: recebo um código de saída diferente de zero simplesmente executando vime saindo .

$ vim
# exit immediately using :q
$ echo $?
1

No entanto, se eu usar o caminho completo para vim, não vejo esse comportamento

$ /usr/bin/vim
# exit immediately using :q
$ echo $?
0

No começo, pensei que vimestava vindo de algum lugar mais cedo no meu caminho, mas:

$ which vim
/usr/bin/vim

Então, eu estou perdida. O que poderia estar causando isso?

ATUALIZAÇÃO: Esse problema resolveu-se magicamente, o que me deixa altamente desconfiado. Minha melhor teoria atual é que tive um problema com meu .vimrcplug-in ou com um plug-in que corrigi acidentalmente enquanto aprimorava minha configuração de alguma outra maneira. Se eu puder rastrear exatamente o que fiz para corrigi-lo, definitivamente atualizarei com essas informações. Obrigado pelas respostas.

Hank Gay
fonte
Corrigi-o em um Makefile adicionando -u NONE, o que diz ao vim para carregar nenhum arquivo de configuração. Pode ajudar em algumas situações.
Boldewyn

Respostas:

14

Você tem filetype offno seu vimrc? Tente substituí-lo por:

filetype on
filetype off

Eu tive esse problema usando o Pathogen de Tim Pope no OS X. Este artigo me ajudou a resolver o problema. Se você estiver usando o Pathogen ...

call pathogen#runtime_append_all_bundles()

... faça isso:

filetype on
filetype off
call pathogen#runtime_append_all_bundles()
call pathogen#helptags()
filetype plugin indent on

http://andrewho.co.uk/weblog/vim-pathogen-with-mutt-and-git

Brandon Bloom
fonte
Este é um bom argumento. Eu já havia corrigido esse problema em particular , mas foi o que me levou a suspeitar que corrigi acidentalmente um erro em outro lugar do meu .vimrc.
Hank Gay
Isso corrigiu um problema idêntico para mim, exceto no Vundle, e não no Pathogen.
Jonah Braun
Assim como adicionar outro +1, essa é uma correção antiga, mas funcionou para corrigir o problema usando o Vundle em um sistema OSX. Apenas jogou filetype onacima do existente filetype off.
Mikey TK
8

Eu posso pensar em duas explicações possíveis.

  1. vimé realmente um apelido. Note-se que whichnão mostra aliases, você deve usar typeem vez (a menos que você estiver executando csh ou tcsh).

  2. O Vim procura algum arquivo em um caminho relativo ao seu diretório de instalação, que ele determina ao olhar argv[0](o nome do executável como passado no shell) e, de alguma forma, falha em encontrar esse caminho se for chamado por um caminho relativo. Isso seria tecnicamente possível, mas não acho que o Vim realmente faça isso.

Gilles 'SO- parar de ser mau'
fonte
7

Eu recebo um código de saída diferente de zero simplesmente executando o vim e depois saindo.

Isso não acontece aqui, com um sistema semelhante: Snow Leopard e a versão de estoque do Vim.

Tente este comando:

$ sudo dtruss vim +q

Isso fornecerá uma lista de todos os syscalls que o Vim faz enquanto inicializa e, em seguida, é encerrado imediatamente. ( dtrussé equivalente ao straceLinux, se você já usou isso antes.)

O que você procura é uma linha próxima ao final que mostre um código de erro, normalmente -1. Examinar os argumentos para a chamada do sistema deve levar você ao problema. Uma possibilidade de alta probabilidade é um arquivo ausente, que provavelmente aparecerá em uma open()chamada.

Se o Vim sair corretamente quando for executado dessa maneira, você provavelmente terá um problema de permissão, o que é sudonecessário para permitir dtrussa execução. Nesse caso, você provavelmente pode corrigi-lo reparando permissões .

Warren Young
fonte
Desculpe - estou na minha máquina de trabalho agora e não tem esse comportamento. Certifico-me de verificar quando estiver novamente na minha máquina doméstica.
Hank Gay
Se você não conseguir descobrir, anexe o dtrussresultado à sua pergunta. (Ou, pelo menos, as últimas 25 linhas, mais ou menos.) O que é incompreensível para você pode levar outro à resposta certa.
21811 Warren Young
@nlucaroni: Fico feliz em ouvir isso. Para a posteridade, porém, qual das duas idéias na minha resposta a corrigiu? Ou seja, você teve um problema de permissão sudo"corrigido", informando que precisava executar as Permissões de reparo? Ou foi isso que dtrusslhe mostrou um erro de syscall e, em caso afirmativo, qual e por que estava falhando?
22813 Warren Young
erros de syscall na abertura de arquivos que não estavam lá. Meu colega de trabalho tinha acabado de pegar o .vimdiretório zipp'd de alguém e .vimrc, e as coisas tinham caminhos completos e arquivos ausentes de plugins não utilizados.
Nlucaroni
2

Eu havia atingido esse problema de códigos de retorno. Rastreei-o de volta a um loadviewcomando de execução silenciosa no meu vimrc, que fornece visualizações persistentes:

" Persistent views
if has("mksession")
    set viewdir=$HOME/.vimviews
    if has("unix")
        silent execute '!mkdir -p $HOME/.vimviews'
    endif
    au BufWinLeave * silent! mkview "make vim save view (state) (folds, cursor, etc)
    au BufWinEnter * silent! loadview "make vim load view (state) (folds, cursor, etc)
endif

Ao inserir um buffer sem um nome de arquivo, silent! loadviewele executaria, ocultando o erro

E32: nenhum nome de arquivo

o que também fez com que o código de retorno fosse definido como um.

David Thomas
fonte