Як виявити, чи файли swp містять незбережені зміни?


11

Редагуючи вихідний код за допомогою gvim (v.7.4.488), я хочу внести деякі зміни vcs (я використовую git 2.1.4 з командного рядка в Linux Ubuntu).

git --status

показує, які файли я змінив. Однак він також показує vim .*.swpпоточного видимого буфера (ів), як якщо файл містить незбережені зміни, так і коли відредагований файл такий самий, як і .*.swp-файл). Звичайно, git може ігнорувати ці файли, а vim може зберігати файли swap в іншому місці (див. Vim.wikia або це питання у stackoverflow ). Але мені подобаються .*.swpфайли-файли, які відображаються, git --statusколи вони містять незбережені зміни, оскільки це сигналізує мені про те, що я створюю файли в іншому стані, ніж те, що я думаю, що вони є.

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

  • Чи можна мати лише .*.swpфайли, коли файл на диску та файл у vim різняться?
  • Чи є інший спосіб виявлення збережених файлів?

Поєднання коментарів @elyashiv та @VanLaser призводить до більш простого методу, ніж виявлення, чи мають файли підкачки, що мають на увазі збережені файли:

  1. не дозволяйте git ігнорувати файли. *. sw [po];
  2. при вчиненні, якщо git --statusвиявляє будь-які .*.sw[po]файли, роблять a :wain vi; і,
  3. додавати та виконувати.

1
ви можете використовувати, :waщоб переконатися, що немає збережених файлів.
elyashiv

2
Дійсно, набагато "безпечніше", щоб переконатися, що всі ваші файли збережені перед вами git commit...
VanLaser

Відповіді:


8

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

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

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

Див. :help -r(Трохи) додаткову інформацію про -rопцію, або :help recover.txtдля отримання додаткової інформації про відновлення та заміну файлових файлів.


1
Добре, що файли swap Vim - це приховані файли (що ведуть .у назві файлу), тому правильний зразок був би .*.sw[a-p](хоча в патологічних випадках ви насправді зможете отримати весь шлях .foo.saa). Це також повинно виключати збіг Flash-файлів, оскільки я сумніваюся, що це, як правило, прихований файл.
Jamessan

@jamessan Ведучий .потрібен у глобальній оболонці, але він *.swpпрацює як аргумент find. Але ведучий .робить речі простішими. Дякую!
Літіс

8
  • Чи можна мати лише .*.swpфайли, коли файл на диску та файл у vim різняться?

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

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

Caveat : Оскільки файл swap існує лише тоді, коли буфер модифікований, ви втрачаєте використання файлу swap як дорадчий замок. Якщо буфер немодифікований, то інший Vim може розпочати його редагування, не помітивши, що він уже відкритий. Якщо другий Vim зберігає до того, як перший внесе більше змін, вони не будуть помічені, поки користувач не спробує зберегти або щось не запустить Vim, щоб перевірити, чи файл змінено.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.