سؤال
عند تعطل جلسة Vim السابقة، يتم الترحيب بك بملف "Swap file..."موجود بالفعل!" لكل ملف تم فتحه في الجلسة السابقة.
هل يمكنك جعل مطالبة استرداد Vim هذه أكثر ذكاءً؟(بدون إيقاف تشغيل الاسترداد!) على وجه التحديد، أفكر في:
- إذا كانت النسخة التي تم تبديلها لا تحتوي على تغييرات غير محفوظة ولم تعد عملية التحرير قيد التشغيل، فهل يمكنك جعل Vim يحذف ملف المبادلة تلقائيًا؟
- هل يمكنك أتمتة العملية المقترحة لحفظ الملف المسترد تحت اسم جديد، ودمجه مع الملف الموجود على القرص ثم حذف ملف المبادلة القديم، بحيث يكون الحد الأدنى من التفاعل مطلوبًا؟خاصة عندما يكون إصدار المبادلة وإصدار القرص متماثلين، يجب أن يكون كل شيء تلقائيًا.
لقد اكتشفت SwapExists
الأمر التلقائي ولكني لا أعرف ما إذا كان يمكن أن يساعد في هذه المهام.
المحلول
لقد قمت بتخزين ملفات المبادلة الخاصة بي في دليل محلي واحد، من خلال وجود هذا في ملف .vimrc الخاص بي:
set directory=~/.vim/swap,.
ومن بين المزايا الأخرى، يجعل هذا من السهل العثور على ملفات المبادلة مرة واحدة.الآن عندما يفقد جهاز الكمبيوتر المحمول الخاص بي الطاقة أو أي شيء آخر وأبدأ في النسخ الاحتياطي بمجموعة من ملفات المبادلة الموجودة حولي، أقوم فقط بتشغيل جهازي cleanswap
النصي:
TMPDIR=$(mktemp -d) || exit 1
RECTXT="$TMPDIR/vim.recovery.$USER.txt"
RECFN="$TMPDIR/vim.recovery.$USER.fn"
trap 'rm -f "$RECTXT" "$RECFN"; rmdir "$TMPDIR"' 0 1 2 3 15
for q in ~/.vim/swap/.*sw? ~/.vim/swap/*; do
[[ -f $q ]] || continue
rm -f "$RECTXT" "$RECFN"
vim -X -r "$q" \
-c "w! $RECTXT" \
-c "let fn=expand('%')" \
-c "new $RECFN" \
-c "exec setline( 1, fn )" \
-c w\! \
-c "qa"
if [[ ! -f $RECFN ]]; then
echo "nothing to recover from $q"
rm -f "$q"
continue
fi
CRNT="$(cat $RECFN)"
if diff --strip-trailing-cr --brief "$CRNT" "$RECTXT"; then
echo "removing redundant $q"
echo " for $CRNT"
rm -f "$q"
else
echo $q contains changes
vim -n -d "$CRNT" "$RECTXT"
rm -i "$q" || exit
fi
done
سيؤدي هذا إلى إزالة أية ملفات مبادلة محدثة بالملفات الحقيقية.يتم عرض أي تغييرات غير متطابقة في نافذة vimdiff حتى أتمكن من دمج التغييرات غير المحفوظة.
--Chouser
نصائح أخرى
لقد اكتشفت هذا للتو:
http://vimdoc.sourceforge.net/htmldoc/diff.html#:DiffOrig
لقد قمت بنسخ ولصق أمر DiffOrig في ملف .vimrc الخاص بي وهو يعمل كالسحر.وهذا يسهل إلى حد كبير استعادة ملفات المبادلة.ليس لدي أي فكرة عن سبب عدم تضمينه افتراضيًا في VIM.
وإليك الأمر لأولئك الذين هم في عجلة من أمرهم:
command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
\ | wincmd p | diffthis
تم ضبط الإجابة المقبولة لحالة استخدام مهمة جدًا.لنفترض أنك أنشأت مخزنًا مؤقتًا جديدًا وكتبت لمدة ساعتين دون حفظ أي شيء، ثم يتعطل الكمبيوتر المحمول لديك.إذا قمت بتشغيل البرنامج النصي المقترح فإنه سيتم حذف السجل الوحيد الخاص بك، ملف المبادلة .swp.لست متأكدًا من الحل الصحيح، ولكن يبدو أن الأمر diff ينتهي بمقارنة نفس الملف بنفسه في هذه الحالة.تتحقق النسخة المعدلة أدناه من هذه الحالة وتمنح المستخدم فرصة لحفظ الملف في مكان ما.
#!/bin/bash
SWAP_FILE_DIR=~/temp/vim_swp
IFS=$'\n'
TMPDIR=$(mktemp -d) || exit 1
RECTXT="$TMPDIR/vim.recovery.$USER.txt"
RECFN="$TMPDIR/vim.recovery.$USER.fn"
trap 'rm -f "$RECTXT" "$RECFN"; rmdir "$TMPDIR"' 0 1 2 3 15
for q in $SWAP_FILE_DIR/.*sw? $SWAP_FILE_DIR/*; do
echo $q
[[ -f $q ]] || continue
rm -f "$RECTXT" "$RECFN"
vim -X -r "$q" \
-c "w! $RECTXT" \
-c "let fn=expand('%')" \
-c "new $RECFN" \
-c "exec setline( 1, fn )" \
-c w\! \
-c "qa"
if [[ ! -f $RECFN ]]; then
echo "nothing to recover from $q"
rm -f "$q"
continue
fi
CRNT="$(cat $RECFN)"
if [ "$CRNT" = "$RECTXT" ]; then
echo "Can't find original file. Press enter to open vim so you can save the file. The swap file will be deleted afterward!"
read
vim "$CRNT"
rm -f "$q"
else if diff --strip-trailing-cr --brief "$CRNT" "$RECTXT"; then
echo "Removing redundant $q"
echo " for $CRNT"
rm -f "$q"
else
echo $q contains changes, or there may be no original saved file
vim -n -d "$CRNT" "$RECTXT"
rm -i "$q" || exit
fi
fi
done
نصيحة رائعة DiffOrig مثالية.إليك برنامج نصي bash أستخدمه لتشغيله على كل ملف مبادلة ضمن الدليل الحالي:
#!/bin/bash
swap_files=`find . -name "*.swp"`
for s in $swap_files ; do
orig_file=`echo $s | perl -pe 's!/\.([^/]*).swp$!/$1!' `
echo "Editing $orig_file"
sleep 1
vim -r $orig_file -c "DiffOrig"
echo -n " Ok to delete swap file? [y/n] "
read resp
if [ "$resp" == "y" ] ; then
echo " Deleting $s"
rm $s
fi
done
ربما يمكن استخدام المزيد من التحقق من الأخطاء والاقتباس ولكنها نجحت حتى الآن.
أفضل عدم تعيين دليل عمل VIM الخاص بي في .vimrc.فيما يلي تعديل للبرنامج النصي للمختار الذي ينسخ ملفات المبادلة إلى مسار المبادلة عند الطلب للتحقق من التكرارات ثم التوفيق بينها.تمت كتابة هذا على عجل، تأكد من تقييمه قبل وضعه موضع الاستخدام العملي.
#!/bin/bash
if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
echo "Moves VIM swap files under <base-path> to ~/.vim/swap and reconciles differences"
echo "usage: $0 <base-path>"
exit 0
fi
if [ -z "$1" ] || [ ! -d "$1" ]; then
echo "directory path not provided or invalid, see $0 -h"
exit 1
fi
echo looking for duplicate file names in hierarchy
swaps="$(find $1 -name '.*.swp' | while read file; do echo $(basename $file); done | sort | uniq -c | egrep -v "^[[:space:]]*1")"
if [ -z "$swaps" ]; then
echo no duplicates found
files=$(find $1 -name '.*.swp')
if [ ! -d ~/.vim/swap ]; then mkdir ~/.vim/swap; fi
echo "moving files to swap space ~./vim/swap"
mv $files ~/.vim/swap
echo "executing reconciliation"
TMPDIR=$(mktemp -d) || exit 1
RECTXT="$TMPDIR/vim.recovery.$USER.txt"
RECFN="$TMPDIR/vim.recovery.$USER.fn"
trap 'rm -f "$RECTXT" "$RECFN"; rmdir "$TMPDIR"' 0 1 2 3 15
for q in ~/.vim/swap/.*sw? ~/.vim/swap/*; do
[[ -f $q ]] || continue
rm -f "$RECTXT" "$RECFN"
vim -X -r "$q" \
-c "w! $RECTXT" \
-c "let fn=expand('%')" \
-c "new $RECFN" \
-c "exec setline( 1, fn )" \
-c w\! \
-c "qa"
if [[ ! -f $RECFN ]]; then
echo "nothing to recover from $q"
rm -f "$q"
continue
fi
CRNT="$(cat $RECFN)"
if diff --strip-trailing-cr --brief "$CRNT" "$RECTXT"; then
echo "removing redundant $q"
echo " for $CRNT"
rm -f "$q"
else
echo $q contains changes
vim -n -d "$CRNT" "$RECTXT"
rm -i "$q" || exit
fi
done
else
echo duplicates found, please address their swap reconciliation manually:
find $1 -name '.*.swp' | while read file; do echo $(basename $file); done | sort | uniq -c | egrep '^[[:space:]]*[2-9][0-9]*.*'
fi
لدي هذا في ملف .bashrc الخاص بي.أود أن أمنح الفضل المناسب لجزء من هذا الرمز ولكني نسيت من أين حصلت عليه.
mswpclean(){
for i in `find -L -name '*swp'`
do
swpf=$i
aux=${swpf//"/."/"/"}
orif=${aux//.swp/}
bakf=${aux//.swp/.sbak}
vim -r $swpf -c ":wq! $bakf" && rm $swpf
if cmp "$bakf" "$orif" -s
then rm $bakf && echo "Swap file was not different: Deleted" $swpf
else vimdiff $bakf $orif
fi
done
for i in `find -L -name '*sbak'`
do
bakf=$i
orif=${bakf//.sbak/}
if test $orif -nt $bakf
then rm $bakf && echo "Backup file deleted:" $bakf
else echo "Backup file kept as:" $bakf
fi
done }
أنا فقط أقوم بتشغيل هذا على جذر مشروعي، وإذا كان الملف مختلفًا، فإنه يفتح vim diff.وبعد ذلك، سيتم الاحتفاظ بالملف الأخير الذي سيتم حفظه.لجعله مثاليًا، سأحتاج فقط إلى استبدال آخر شيء آخر:
else echo "Backup file kept as:" $bakf
بشيء مثل
else vim $bakf -c ":wq! $orif" && echo "Backup file kept and saved as:" $orif
ولكن لم أحصل على الوقت لاختباره بشكل صحيح.
نأمل أن يساعد.
العثور على ./ - نوع f -name ".*sw[klmnop]" -حذف
ائتمان:@ شوايدوجhttps://superuser.com/questions/480367/whats-the-easiest-way-to-delete-vim-swapfiles-ive-already-recovered-from
انتقل إلى الدليل أولاً