Файлы swp Vim мешают репозиторию vimdiff

Моя настройка состоит в том, чтобы использовать vim (в частности, MacVim в графическом режиме) для редактирования исходных файлов, а затем я делаю (mercurial) различия в репозитории, используя vimdiff (снова в графическом режиме). Иногда, когда я делаю diff, vim выдает ошибку:

Файл подкачки "~/nn/src/imm/model/injector_node/.values_table.py.swp" уже существует!

Как это исправить? Могу ли я приказать vim прекратить создавать swp-файлы, или vimdiff игнорировать их, или записать свои swp-файлы в другое место?


person Neil G    schedule 29.06.2012    source источник


Ответы (3)


Да (возможно) и да.

Чтобы отключить файлы подкачки:

set nobackup
set nowritebackup
set noswapfile

Чтобы изменить расположение файлов подкачки (мой предпочтительный выбор):

" Set the directory of the swap file
" The // indicates that the swap name should be globally unique
set directory=~/.vim/tmp//,/tmp

Здесь я установил его в каталоге tmp под .vim. См. :h 'directory', чтобы узнать, что представляет собой каждая часть опции.

Что касается того, чтобы заставить Vimdiff игнорировать файлы подкачки, я не совсем уверен. Но ошибка, вероятно, возникает из-за того, что когда вы проверяете различия с помощью Mercurial, у вас уже есть те же файлы, открытые в MacVim. Если вы просто закроете файлы перед выполнением сравнения, все будет в порядке.

person voithos    schedule 29.06.2012
comment
Спасибо, я думаю, что это решило мою проблему! Я не хочу закрывать файлы перед выполнением сравнения, но гарантирует ли //, что если два редактора откроют один и тот же файл, они не попытаются использовать один и тот же файл подкачки? - person Neil G; 29.06.2012
comment
@NeilG: Нет, не будет. Глобально уникальный означает, что каждый файл будет иметь полное имя. Обычно файл подкачки будет просто именем файла (поскольку по умолчанию Vim создает файлы подкачки в том же каталоге, что и исходный файл), поэтому, если у вас есть файл в /home/foo, который называется bar, и другой файл в /home/baz, который называется под названием bar, то они не будут конфликтовать по глобально-уникальной схеме. Файлы подкачки — это механизм безопасности, поэтому, если вы не хотите закрывать другое окно, вы можете либо отключить подкачку, либо просто выбрать «Редактировать», когда вам будет предложено. - person voithos; 29.06.2012
comment
@NeilG Лучше не использовать «Редактировать в любом случае», а «Открыть только для чтения». - person ZyX; 29.06.2012
comment
@ZyX: Но что, если ему нужно объединить свои изменения? Ему ведь придется сохранить файл, не так ли? - person voithos; 29.06.2012
comment
@voithos Спасти их не запретишь, правда хлопнуть перед :w придется. Но в вопросе предлагается просматривать дифы репозитория, а не редактировать их, и сообщения типа «файл был отредактирован в другом месте» раздражают. Собственно, я всегда предпочитаю использовать в этом случае свой аурум: нет проблем с файлами подкачки или открытием двух файлов в разных местах: вы просто просматриваете изменения в том же vim, где их создаете. - person ZyX; 29.06.2012
comment
@ZyX: А, понятно. Я не знал, что вы можете заставить писать. - person voithos; 29.06.2012

Я бы предложил другой подход: вместо того, чтобы использовать интерфейс командной строки mercurial для просмотра различий между файлами, используйте один из плагинов vim, который добавляет поддержку VCS, в этом случае вам не нужно ничего закрывать или что-то делать с файлом подкачки.

Например, с моим aurum вы можете использовать <leader>aD (сопоставленный с :AuVimDiff) для просмотра различий между текущим открытым буфером и свою версию в репозиторий, а затем <Leader>X, чтобы вернуться к обычному виду (если вы ничего не редактировали, он даже восстановит открытые/закрытые складки). Если вы сделаете let g:aurum_vimdiffusewin=1 и используете вертикальные или горизонтальные (в зависимости от 'diffopt') разделения одинакового размера, тогда мой скрипт будет повторно использовать одно из соседних окон.

С помощью <leader>agD вы можете просматривать все изменения во всех файлах в репозитории на нескольких вкладках в разделе vimdiff (за исключением добавленных и удаленных файлов): он сопоставлен с :AuVimDiff full. Насколько я знаю, эта функциональность почти уникальна: есть скрипт для mercurial, который делает то же самое, но он не интегрирован с другими плагинами VCS. Снова нажмите <leader>X, чтобы закрыть все вкладки. Буферы, которые уже были открыты, не закроются, в отличие от других.

Другой плагин, который я могу порекомендовать, это VCSCommand.

person ZyX    schedule 29.06.2012

Я знаю, что этому вопросу уже больше года, но могу ли я порекомендовать lawrencium, плагин, интегрирующий mercurial в vim, вдохновленный фантастическим плагином fugitive для git. Они значительно упрощают то, что вы делаете (и многое другое в CVS), с помощью нескольких простых команд. Мне платили не за то, чтобы я это говорил; плагины просто супер!

person sinisterstuf    schedule 02.09.2013