سؤال

عند تعطل جلسة 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

انتقل إلى الدليل أولاً

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top