Perché vim restituisce un codice di uscita diverso da zero se esco immediatamente dopo l'apertura?


15

Sto riscontrando un po 'di uno strano problema con vimSnow Leopard: ottengo un codice di uscita diverso da zero semplicemente eseguendo vime quindi chiudendo.

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

Tuttavia, se utilizzo il percorso completo per vim, non vedo questo comportamento

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

All'inizio ho pensato che vimvenisse da qualche parte prima nel mio percorso, ma:

$ which vim
/usr/bin/vim

Quindi sono in perdita. Che cosa potrebbe causare questo?

AGGIORNAMENTO: Questo problema si è risolto magicamente, il che mi rende molto sospettoso. La mia migliore teoria attuale è che ho avuto un problema con il mio .vimrco un plugin che ho risolto accidentalmente mentre ottimizzavo la mia configurazione in qualche altro modo. Se riesco a rintracciare esattamente cosa ho fatto per risolverlo, aggiornerò sicuramente con quelle informazioni. Grazie per le risposte


L'ho corretto in un Makefile aggiungendo -u NONE, che dice a Vim di non caricare alcun file di configurazione. Potrebbe aiutare in alcune situazioni.
Boldewyn,

Risposte:


14

Hai filetype offnel tuo vimrc? Prova a sostituirlo con:

filetype on
filetype off

Ho avuto questo problema usando il Pathogen di Tim Pope su OS X. Questo articolo mi ha aiutato a risolvere il problema. Se si utilizza Pathogen ...

call pathogen#runtime_append_all_bundles()

... fallo invece:

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


Questo è un buon punto. Avevo già risolto questo particolare problema, ma è ciò che mi ha portato a sospettare di aver accidentalmente corretto un errore altrove nel mio .vimrc.
Hank Gay,

Questo risolto un problema identico per me, tranne con Vundle piuttosto che Pathogen.
Jonah Braun,

Proprio come aggiungere un altro +1, questa è una vecchia correzione, ma ha funzionato per me risolvendo questo problema usando Vundle su un sistema OSX. Ha appena gettato filetype onsopra l'esistente filetype off.
Mikey TK,

8

Mi vengono in mente due possibili spiegazioni.

  1. vimè in realtà un alias. Nota che whichnon mostra gli alias, dovresti typeinvece usare (a meno che tu non stia eseguendo csh o tcsh).

  2. Vim cerca un file in un percorso relativo alla sua directory di installazione, che determina guardando argv[0](il nome dell'eseguibile passato dalla shell), e in qualche modo non riesce a trovare quel percorso se viene chiamato attraverso un percorso relativo. Sarebbe tecnicamente possibile, ma non credo che Vim lo faccia davvero.


7

Ottengo un codice di uscita diverso da zero semplicemente eseguendo vim e quindi chiudendo.

Questo non succede qui, con un sistema simile: Snow Leopard e la versione stock di Vim.

Prova questo comando:

$ sudo dtruss vim +q

Questo ti fornirà un elenco di tutte le syscalls che Vim fa mentre si inizializza e quindi si spegne immediatamente. ( dtrussequivale a stracesu Linux, se l'hai già usato prima.)

Quello che stai cercando è una riga vicino alla fine che mostra un codice di errore, in genere -1. Osservare gli argomenti della chiamata di sistema dovrebbe portare al problema. Una possibilità ad alta probabilità è un file mancante, che probabilmente verrà visualizzato durante una open()chiamata.

Se Vim esce in modo pulito quando viene eseguito in questo modo, probabilmente hai un problema di autorizzazione, che è sudonecessario dtrussaggirare. In tal caso, probabilmente puoi risolverlo riparando le autorizzazioni .


Siamo spiacenti, ora sono sulla mia macchina di lavoro e non ha questo comportamento. Sarò sicuro di verificarlo una volta che sarò di nuovo sulla mia macchina di casa, però.
Hank Gay,

Se non riesci a capirlo, aggiungi l' dtrussoutput alla tua domanda. (O almeno, le ultime 25 righe o giù di lì.) Ciò che ti è incomprensibile può portare un altro alla risposta giusta.
Warren Young

@nlucaroni: felice di sentirlo. Per i posteri, quale delle due idee nella mia risposta l'ha risolto? Cioè, hai avuto un problema di autorizzazione che sudo"risolto", facendoti sapere che era necessario eseguire le autorizzazioni di riparazione? O è stato piuttosto che dtrussti ha mostrato un errore syscall, e in caso affermativo, quale e perché non ha funzionato?
Warren Young,

errori syscall nell'apertura di file che non c'erano. Il mio collega aveva appena preso la .vimdirectory zipp'd di qualcun altro .vimrce le cose avevano percorsi completi e file mancanti da plugin inutilizzati.
nlucaroni,

2

Ho riscontrato questo problema con i codici di ritorno. L'ho rintracciato in un loadviewcomando di esecuzione silenziosa nel mio vimrc che fornisce visualizzazioni persistenti:

" 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

Quando si immette un buffer senza un nome file, silent! loadviewverrà eseguito nascondendo l'errore

E32: nessun nome file

che aveva anche causato l'impostazione del codice di ritorno su uno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.