Как определить, содержат ли SWP-файлы несохраненные изменения?

11

При редактировании исходного кода с использованием gvim (v.7.4.488) я хочу зафиксировать некоторые изменения в vcs (я использую git 2.1.4 из командной строки в Ubuntu linux).

git --status

показывает, какие файлы я изменил. Тем не менее, он также показывает vim .*.swpвидимого в данный момент буфера (ов) (как если файл содержит несохраненные изменения, так и когда отредактированный файл совпадает с .*.swp-file). Конечно, git может игнорировать эти файлы или vim может хранить файлы подкачки в другом месте (см. Vim.wikia или этот вопрос в stackoverflow ). Но мне нравится, когда .*.swpфайлы -файлы git --statusсодержат несохраненные изменения, так как они сигнализируют мне, что я фиксирую файлы в другом состоянии, чем то, в котором они находятся.

Как можно избежать ложных срабатываний .*.swp-files, отображаемых в том git --statusслучае, если сохраненный файл совпадает с .*.swp-file, и при этом возможность увидеть, что файл для фиксации находится в другом состоянии, чем те, которые я редактирую с помощью vim?

  • Возможно ли иметь только .*.swp-files, когда файл на диске и файл в vim различаются?
  • Есть ли другой способ обнаружить несохраненные файлы?

Объединение комментариев @elyashiv и @VanLaser приводит к более простому методу, чем определение, подразумевают ли файлы подкачки несохраненные файлы:

  1. не позволяйте git игнорировать файлы. *. sw [po];
  2. при совершении, если git --statusобнаруживаются какие-либо .*.sw[po]файлы, делайте a :waв vi; и,
  3. добавить и зафиксировать.
Каспер ван ден Берг
источник
1
вы можете использовать , :waчтобы убедиться , что нет никаких несохраненных файлов.
Эльяшив
2
действительно, гораздо разумнее убедиться, что все ваши файлы сохранены перед вами git commit...
VanLaser

Ответы:

8

vim -rв командной строке будут перечислены все файлы подкачки в текущем каталоге и временных каталогов, и содержат ли они все несохраненные изменения. Посмотрите на строку , которая говорит modified: no/YES.

Я не знаю , как сказать Vim заглянуть в другом каталоге, так что вам нужно изменить для каждого каталога , который содержит файл подкачки и запустить vim -r. Вы можете придумать сценарий , который разобранный выход git status, или используются find -name '.*.sw[po]', а затем побежал vim -rв каждом каталоге, чтобы показать все файлы подкачка с несохраненными изменениями.

(Я использую .*.sw[po]вместо .*.swp, потому что иногда .swoфайлы создаются в дополнение к .swpфайлам, когда вы редактируете файл, у которого уже есть файл подкачки. .swnФайлы могут быть созданы также, если вы редактируете файл с двумя существующими файлами подкачки, но я не думаю, что Я когда-либо видел в дикой природе. Если вы действительно параноик, вы можете использовать .*.sw[a-p]или просто .*.sw?.)

См. :help -r(Немного) дополнительную информацию о -rпараметре или :help recover.txtдополнительную информацию о восстановлении и смене имен файлов.

Lithis
источник
1
Что ж, файлы подкачки Vim - это скрытые файлы (ведущие .в имени файла), так что правильный шаблон будет .*.sw[a-p](хотя в патологических случаях вы действительно можете получить весь путь .foo.saa). Это также должно исключать совпадение файлов Flash, так как я сомневаюсь, что это, как правило, скрытый файл.
jamessan
@jamessan Ведущее .требуется в Glob оболочки, но *.swpработает в качестве аргумента find. Но ведущие .делает вещи проще. Спасибо!
Lithis
8
  • Возможно ли иметь только .*.swp-files, когда файл на диске и файл в vim различаются?

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

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

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

jamessan
источник