Как мне установить backupdir и поменять местами каталог, хранящийся локально, в рабочий каталог, используя ./ относительный путь в Vim?

#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 вызывается.