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")