#vim
#vim
Вопрос:
Резюме: я пытаюсь заставить Vim хранить файлы резервных копий, файлы подкачки и файлы отмены в каталоге относительно рабочего каталога, чтобы я мог перемещать эти файлы с помощью рабочего каталога (например, на USB-накопителе).
Предыстория: я написал функцию, которая устанавливает параметры backupdir
, directory
, и undodir
при первом запуске Vim. Я установил настройки так, чтобы сначала сначала искать относительные пути в рабочем каталоге (который будет на USB-накопителе), а затем искать централизованный каталог в ~/vim/scratch_files/
централизованном каталоге, который я бы предпочел не использовать, если доступен относительный путь.
Однако, независимо от того, какие относительные пути я указываю, Vim просто настаивает на использовании централизованного пути, будь то тестирование на установках Linux или Windows Vim.
Исследование: я проверил файлы справки (in :help backupdir
), страницы фэндома Vim и Stack Exchange, искал решения и не смог найти ничего, что заставило бы это работать.
ПРИМЕР: Вот минимально рабочий пример того, о чем я говорю. У меня есть строка в моем .vimrc, которая добавляет файл, скажем, например scratchfiles.vim
, в переменную runtimepath со следующим кодом:
function! SetLocalScratchFiles()
" Turn the settings on
set backup
set writebackup
set swapfile
if has("win32") || has("win64")
" The // gets replaced with a %-substituted path for a filename in the destination scratch file in Windows as per :h backupdir (i.e., C%%path%to%file.txt.swp)
set backupdir^=.\_scratch\backup//,.\.scratch\backup//,$HOME\.vim\scratch_files\backup//,.
set directory^=.\_scratch\swap//,.\.scratch\swap//,$HOME\.vim\scratch_files\swap//,.
else
set backupdir^=./_scratch/backup//,./.scratch/backup//,~/.vim/scratch_files/backup//,.
set directory^=./_scratch/swap//,./.scratch/swap//,~/.vim/scratch_files/swap//,.
endif
" Undo Directory:
if has('persistent_undo')
if has("win32") || has("win64")
set undodir^=.\_scratch\undo//,.\.scratch\undo//,$HOME\.vim\scratch_files\undo//,.
else
set undodir^=./_scratch/undo//,./.scratch/undo//,~/.vim/scratch_files/undo//,.
endif
set undofile
endif
endfunction
autocmd VimEnter * call SetLocalScratchFiles()
Предполагается (а) искать локальный каталог относительно текущего рабочего каталога, вызываемого ./_scratch/
для подкаталогов /backup/ , /swap/ и /undo/ . Затем, если это не найдено, (b) найдите те же подкаталоги в ./.scratch/
. ЗАТЕМ, если это не найдено, используйте ~/.vim/scratch_files/
.
ВОПРОС:
Проблема в том, что независимо от того, сколько разных типов относительных путей я передаю этим настройкам, Vim всегда выбирает один централизованный каталог. Как я могу заставить его сначала распознать эти относительные пути? Возможно, что-то не так с тем, как я отформатировал пути?
Комментарии:
1.
./{_,.}scratch/{backup/,swap/,undo/}
Существуют ли каталоги?vim
не создает их, он будет использовать первый существующий. Также убедитесь, что послеvim
запуска и загрузки файла для редактирования параметры имеют правильные значения::set backupdir? directory? undodir?
2. Спасибо, что спросили. Да, они существуют в рабочем каталоге и во всех подкаталогах, а все каталоги scratch имеют одинаковые 3 подкаталога, и все они пусты, когда я открываю кучу файлов и вношу изменения в один и тот же каталог.
3.Вот аналогичный вывод после выполнения
:redir @a
set [setting]?
всех 3 настроек, затем:redir END
:backupdir=._scratchbackup//,..scratchbackup//,~.vimtemp_dirsbackup//,.,.,~AppDataLocalTemp,c:tmp,c:temp
directory=._scratchswap//,..scratchswap//,~.vimtemp_dirsswap//,.,.,~AppDataLocalTemp,c:tmp,c:temp
undodir=._scratchundo//,..scratchundo//,~.vimtemp_dirsundo//,.,.
4. Я думаю
backupdir
, иundodir
не должен заканчиваться//
, толькоdirectory
должен. Какие каталогиvim
используются в ваших настройках?5. Он использует последний, ~.vimscratch_files (в моем предыдущем комментарии temp_dirs, но в этом примере scratch files ). Вы уверены? Потому что он говорит о // в разделе справки для
backupdir
иundodir
поэтому я использовал его. Однако я могу извлечь его и посмотреть, устраняет ли это проблему.
Ответ №1:
Проблема заключалась в том, что эти настройки помещались внутри функции, которая вызывается с помощью autocmd VimEnter * ...
— после удаления первой и последних двух строк из предыдущего кода локальные каталоги распознаются и задаются правильные относительные пути. Я полагаю, это связано с порядком, в котором Vim обрабатывает autocmd. Он должен отключить их после просмотра настроек ванили в vimrc.
Суть в том, чтобы не устанавливать backupdir
, undodir
, или directory
via VimEnter
, поскольку их нужно устанавливать раньше, чем когда VimEnter
вызывается.