2012-02-29 3 views
4

Я хотел бы открыть NERDTree при запуске vim с определенным корнем каталога в зависимости от переменной среды.Как правильно использовать неопределенные переменные среды в .vimrc?

Установить переменные среды, которые будут правильно расширены, например $HOME. documentation states undefined variables will expand to an empty string.

Таким образом, это правильно работает с NERD_TREE_ROOT, установленным в существующий каталог. Но не будет, если он не определен. Вместо этого $NERD_TREE_ROOT будет использоваться как строка.

autocmd VimEnter * NERDTree $HOME/$NERD_TREE_ROOT 

Как я могу использовать неопределенные переменные среды правильно как пустую строку?

РЕДАКТИРОВАТЬ: немного уточнить. Этого я и хотел избежать:

if empty($NERD_TREE_ROOT) 
    autocmd VimEnter * NERDTree $HOME 
else 
    autocmd VimEnter * NERDTree $HOME/$NERD_TREE_ROOT 
endif 

Если это невозможно, это будет сделано.

ответ

5

Что вы наблюдаете не имеет ничего общего с Eval или выражениями: echo eval('$HOME/$NERD_TREE_ROOT') результатов в -2147483648 так же, как echo 0/0, потому что оба переменных при выполнении числовой операции оказывается нули. Расширение $HOME выполняется vim из-за наличия -complete=dir в определении команды :NERDTree. Это довольно неожиданно и, кстати, является третьим типом расширения: :echo expand('$HOME/$NERD_TREE_ROOT') приводит к $HOME/$NERD_TREE_ROOT, а :echo expand('$HOME/$HOME') - результат /home/zyx//home/zyx. Я не вижу никакого способа исправить это, но вы всегда можете сделать это

execute 'autocmd VimEnter * NERDTree '.fnameescape($HOME.'/'.$NERD_TREE_ROOT) 

. Это единственный случай, когда расширение работает, как описано в документе, потому что это единственный способ, когда есть какие-либо выражения.

+0

Ах, очень хорошо, exec сделал трюк. Спасибо за объяснение. –

4

Теста является ли он пуст до того autocmd:

if !empty($NERD_TREE_ROOT) 
    autocmd VimEnter * NERDTree $HOME/$NERD_TREE_ROOT 
endif 
+0

Это то, чего я хотел избежать, так как он вытащил пятилиний из ожидаемого однострочного лайнера. –

+0

вы можете использовать ** '|' (bar) **, чтобы сделать его одним слоем – kev

+0

Na, то есть обманывать;) –