Как я могу запретить Vim оставлять слишком много файлов (например, swap, backup, undo)?

13

По умолчанию vimоставляет файлы подкачки в каталоге моего проекта, а при сбоях оставляет файлы резервных копий.

Могу ли я предотвратить это? Или мне нужно обновить .VCSignoreфайл всех моих проектов ?

Мартин Турной
источник

Ответы:

16

Резервные файлы

По умолчанию Vim не оставляет файлов резервных копий. Это просто временные файлы, которые существуют, пока Vim сохраняет буфер на диск. Как описано в :help backup-tableэтом поведении, можно управлять параметрами 'backup'и 'writebackup':

'backup' 'writebackup'  action  ~
   off       off    no backup made
   off       on     backup current file, deleted afterwards (default)
   on        off    delete old backup, backup current file
   on        on     delete old backup, backup current file

Обмен файлами

Что касается файлов подкачки, может быть полезно собрать их в выделенном каталоге. Это можно сделать с помощью 'directory'опции. Например

:set directory^=$HOME/.vim/tmp//

добавит $HOME/.vim/tmpв начало списка каталогов, которые Vim попытается использовать при создании файла подкачки. Трейлинг //заставляет Vim кодировать полное имя пути к файлу, чтобы не было конфликтов с файлами с одинаковыми именами из разных каталогов.

Предупреждение : это фактически отключает возможность для Vim замечать, если несколько пользователей пытаются редактировать один и тот же файл, поскольку файлы подкачки хранятся в разных местах.

Приведенный ниже фрагмент (адаптированный из vimrc из tpope ) также отключит файл подкачки для буфера, если он не был изменен. Таким образом, если Vim / ваш компьютер выйдет из строя, когда у вас откроется куча файлов, оставленные позади файлы подкачки будут только для измененных файлов.

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

Предупреждение : поскольку файл подкачки существует только при изменении буфера, это имеет эффект, аналогичный настройке 'directory'. Если буфер не изменен, другой Vim может начать его редактирование без уведомления. Если второй Vim сохраняет до того, как первый внесет дополнительные изменения, они не будут замечены, пока пользователь не попытается сохранить или что-то не вызовет Vim, чтобы проверить, изменен ли файл.

jamessan
источник
5

Я использую мой .vimrcна нескольких машинах, включая общие серверы. Я не обязательно хочу, чтобы люди могли видеть файлы, над которыми я работаю, и мне нравится, чтобы мой домашний каталог был относительно чистым. Так что это мое решение, которое будет отлично работать на Linux и Mac OS X.

" Sets central temp file location, to prevent local default behavior.
if isdirectory($HOME . '/.vim/.tmp') == 0
  :silent !mkdir -m 700 -p ~/.vim/.tmp > /dev/null 2>&1
endif

set backupdir=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,
set directory=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,

Обратите внимание, что это создаст .tmpкаталог, ~/.vimесли он еще не существует. Это будет новый дом ваших файлов подкачки. Для файлов отмены у меня также есть следующее .vimrc(что очень похоже):

if exists("+undofile")
  " undofile -- This allows you to use undos after exiting and 
  "             restarting. NOTE: only present in 7.3+
  "             :help undo-persistence
  if isdirectory( $HOME . '/.vim/.undo' ) == 0
    :silent !mkdir -m 700 -p ~/.vim/.undo > /dev/null 2>&1
  endif
  set undodir=~/.vim/.undo
  set undofile
endif
HAL 9001
источник
1

Вот что я делаю в моем vimrc:

fun! MkdirIfNeeded(dir, flags, permissions)
    if !isdirectory(a:dir)
        call mkdir(a:dir, a:flags, a:permissions)
    endif
endfun

" Set (& create if needed) a temp directory to keep backup & swap files
if has('win32')
    let whoami = substitute(system("whoami /LOGONID"), '\n', '', '')
    let tmpdir = 'C:/tmp/vim_' . whoami
else
    let whoami = substitute(system("whoami"), '\n', '', '')
    let tmpdir = '/var/tmp/vim_' . whoami
endif
call MkdirIfNeeded(tmpdir, 'p', 0700)

let &backupdir = tmpdir
let &dir = tmpdir
let &undodir = tmpdir

Он создаст /var/tmp/vim_<username>и использует его для хранения всех файлов, связанных с vim. Поддержание вашей директории проекта в чистоте.

Использование whoamiгарантирует, что вы можете использовать vimrc глобально (то есть для пользователя и пользователя root), в то же время используя отдельные каталоги; если вам это не нужно, вы можете заменить его жестко закодированным каталогом для более быстрого запуска. Вы также можете использовать ~/.vim/каталог, но мне нравится использовать, /var/tmpпотому что это обычно отдельная файловая система.

Я пользуюсь /var/tmpпотому что /tmpчасто очищается при перезагрузке. Вы, вероятно, не хотите, чтобы этот каталог был доступен для записи, поскольку люди могли бы размещать файлы там, чтобы делать потенциально опасные вещи, когда вы открываете файл.

Мартин Турной
источник
1
/var/tmpвсегда доступен для записи во всем мире - это системный временный каталог. (Ну, вы можете изменить это, чтобы не быть, но это одна из тех вещей, где Unix-подобные системы рады позволить вам сохранить кусочки после того, как вы их сломаете). Если у вас есть другой пользователь в системе, он / она может создавать /var/tmp/vim_«your_username»с разрешениями по своему выбору. А затем заполните его символическими ссылками на ваши важные файлы, которые, вероятно, будут уничтожены временными файлами vim.
Дероберт
@derobert Только если его не существует. Если вы используете это в масштабе всей системы и у вас много пользователей, вы, вероятно, захотите добавить создание этого каталога adduserили все, что вы используете для создания пользователей. В любом случае, большинство людей используют Vim на доверенных компьютерах (но ваш комментарий, как таковой).
Мартин Турной
Правильно, только если его не существует. Что, находясь в системном временном каталоге, происходит непредсказуемо в зависимости от того, когда эти временные файлы очищены. Не уверен, почему ты просто не вставил это $HOMEкуда-то.
Дероберт
@derobert Ну, /var/это другая файловая система. Теория заключается в том , что это предотвратит много записей на /, /usrили /home, что приводит к уменьшению фрагментации и риске повреждения файлов в случае аварии ... Вот почему почтовые ящики и прочие находятся на /varпо умолчанию, а не в homedir ...
Мартин Турной