Зачем vim возвращать ненулевой код выхода, если я выхожу сразу после открытия?

15

У меня возникла странная проблема с vimSnow Leopard: я получаю ненулевой код выхода, просто запустив его vimи выйдя из него.

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

Однако, если я использую полный путь к vim, я не вижу этого поведения

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

Сначала я подумал, что vimэто происходит откуда-то раньше на моем пути, но:

$ which vim
/usr/bin/vim

Так что я в растерянности. Что может быть причиной этого?

ОБНОВЛЕНИЕ: Эта проблема волшебным образом решена сама, что делает меня очень подозрительным. Моя лучшая теория заключается в том, что у меня была проблема с моим .vimrcили плагином, который я исправил случайно, когда настраивал свою установку каким-либо другим способом. Если я смогу точно отследить, что я сделал, чтобы исправить это, я обязательно обновлю эту информацию. Спасибо за ответы.

Хэнк Гей
источник
Я исправил это в Makefile, добавив -u NONE, что говорит vim вообще не загружать конфигурационный файл. Может помочь в некоторых ситуациях.
Болдевин

Ответы:

14

У вас есть filetype offв вашем vimrc? Попробуйте заменить его на:

filetype on
filetype off

У меня была эта проблема с использованием Pathogen Тима Попа на OS X. Эта статья помогла мне решить эту проблему. Если вы используете патоген ...

call pathogen#runtime_append_all_bundles()

... сделать это вместо этого:

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

Брэндон Блум
источник
Это хороший момент. Я уже исправил эту конкретную проблему, но именно это заставило меня заподозрить, что я случайно исправил ошибку где-то еще в моем .vimrc.
Хэнк Гэй,
Это исправило ту же проблему для меня, за исключением Vundle, а не Pathogen.
Иона Браун
Точно так же, как добавить еще +1, это старое исправление, но оно помогло мне решить эту проблему с помощью Vundle в системе OSX. Просто выкинул filetype onвыше существующего filetype off.
Майки ТК,
8

Я могу придумать два возможных объяснения.

  1. vimна самом деле псевдоним. Обратите внимание, что whichпсевдонимы не отображаются, вы должны использовать typeвместо этого (если вы не используете csh или tcsh).

  2. Vim ищет какой-либо файл в пути относительно своего установочного каталога, который он определяет по просмотру argv[0](имя исполняемого файла, переданное из оболочки), и каким-то образом не может найти этот путь, если он вызывается через относительный путь. Это было бы технически возможно, но я не думаю, что Вим на самом деле это делает.

Жиль "ТАК - прекрати быть злым"
источник
7

Я получаю ненулевой код выхода, просто запустив vim и выйдя из него.

Этого не происходит здесь с похожей системой: Snow Leopard и стоковой версией Vim.

Попробуйте эту команду:

$ sudo dtruss vim +q

Это даст вам список всех системных вызовов, которые Vim делает во время инициализации, а затем немедленно выключается. ( dtrussэквивалентно straceLinux, если вы использовали это раньше.)

То, что вы ищете, это строка ближе к концу, которая показывает код ошибки, обычно -1. Просмотр аргументов системного вызова должен привести вас к проблеме. Одна высокая вероятность - это отсутствующий файл, который, вероятно, будет отображаться при open()вызове.

Если при запуске таким способом Vim завершает работу корректно, возможно, у вас есть проблема с правами доступа, которую sudoнеобходимо разрешить dtrussдля запуска. В этом случае вы, вероятно, сможете это исправить, восстановив разрешения .

Уоррен Янг
источник
Извините - я сейчас на своей рабочей машине, и у меня такого поведения нет. Я обязательно проверю это, как только я снова буду на своей домашней машине.
Хэнк Гей
Если вы не можете понять это, добавьте dtrussвывод к вашему вопросу. (Или, по крайней мере, последние 25 строк или около того.) То, что вам непонятно, может привести другого к правильному ответу.
Уоррен Янг
@nlucaroni: Рад это слышать. Для потомков, какая из двух идей в моем ответе исправила это? То есть, у вас была проблема с разрешениями, которая sudo«исправлена», давая вам знать, что вам нужно запустить разрешения на восстановление? Или, скорее, это dtrussпоказало вам ошибку системного вызова, и если да, то какая и почему она не сработала?
Уоррен Янг
Ошибки системного вызова при открытии файлов, которых там не было. Мой коллега только что взял кто-то другой .vimкаталог zipp'd .vimrc, и у него были полные пути и отсутствующие файлы из неиспользуемых плагинов.
Nlucaroni
2

Я столкнулся с этой проблемой кодов возврата. Я проследил это до тихо выполняющейся loadviewкоманды в моем vimrc, которая обеспечивает постоянные представления:

" 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

При вводе буфера без имени файла silent! loadviewбудет выполняться, скрывая ошибку

E32: нет имени файла

что также привело к тому, что код возврата был установлен в единицу.

Дэвид Томас
источник