Vim: В чем разница между этими двумя методами установки переменной?

В моем .vimrc я определил следующую переменную:

let $VIMFILES = "~/.vim"

Далее в моем .vimrc я пытаюсь установить backupdir вариант вроде так:

set backupdir=$VIMFILES/backup
" `set backupdir?` will return: backupdir=~/.vim/backup

Однако это не работает. Пытаться :w файл потерпит неудачу и вернет следующее:

"foo" E510: Can't make backup file (add ! to override)

Как ни странно, настройка backupdir использование следующего метода работает просто отлично...

exec "set backupdir=" . $VIMFILES . "/backup"
" Like the first method, `set backupdir?` will
" also return: backupdir=~/.vim/backup

Может кто-нибудь пролить свет на то, почему первый метод дает сбой, а второй работает, несмотря на backupdir имея желаемое значение в обоих случаях? Использую ли я какие-либо неподходящие методы, и если да, что я должен использовать вместо этого?

1 ответ

Решение

Я могу воспроизвести это, и действительно, это выглядит довольно загадочно. Одна хитрость в том, что :set backupdir? не обязательно печатать фактическое значение опции; он выполняет некоторые преобразования, поэтому то, что вы видите, не всегда используется.

Я думаю, что проблема заключается в использовании ~/ в $VIMFILES переменная. Когда вы напрямую :set вариант (как эмулировал последний :execute попытка), Vim, кажется, автоматически расширяет это. Но когда вы присваиваете это переменной среды, она сохраняется дословно, и из-за отсутствия расширения, :write выходит из строя. Обратите внимание, что вывод идентичен, потому что Vim, по-видимому, автоматически переводит /home/username вернуться к ~ в выходной.

Я бы решил это путем явного расширения значения переменной:

let $VIMFILES = expand("~/.vim")
Другие вопросы по тегам