Frage

Wenn eine vorherige Vim Sitzung abgestürzt ist, werden Sie mit der gegrüßt „Swap-Datei ... existiert bereits!“ für jede Datei, die offen in der vorherige Sitzung war.

Können Sie diese Vim Wiederherstellungsaufforderung smarter machen? (Ohne Abschalten Genesung!) Insbesondere denke ich an:

  • Wenn die getauscht Version nicht gespeicherte Änderungen enthält und der Bearbeitungsprozess nicht mehr ausgeführt wird, können Sie machen Vim automatisch die Auslagerungsdatei gelöscht?
  • Können Sie den vorgeschlagenen Prozess automatisieren, die wiederhergestellte Datei unter einem neuen Namen zu speichern, es mit Datei auf der Festplatte Zusammenführung und dann die alte Auslagerungsdatei zu löschen, so dass nur minimale Interaktion erforderlich ist? Vor allem, wenn die Swap-Version und die Disk-Version gleich ist, sollte alles automatisch.

Ich entdeckte die SwapExists automatischen Befehl, aber ich weiß nicht, ob es sich bei diesen Aufgaben helfen können.

War es hilfreich?

Lösung

Ich habe vim speichert meine Swap-Dateien in einem einzigen lokalen Verzeichnis, indem diese in meinem .vimrc mit:

set directory=~/.vim/swap,.

Neben anderen Vorteilen, macht dies die Swap-Dateien einfach auf einmal zu finden. Nun, wenn mein Laptop mit Strom versorgt wird oder was auch immer und ich fange wieder nach oben mit einem Bündel von Swap-Dateien rumliegen, ich habe gerade meinen cleanswap Skript ausführen:

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

Dadurch werden alle Swap-Dateien entfernen, die up-to-date mit den realen Dateien sind. Alle, die nicht übereinstimmen, werden in einem vimdiff Fenster gebracht, so kann ich in meiner ungesicherte Änderungen zusammenführen.

- Chouser

Andere Tipps

Ich habe gerade entdeckt dies:

http://vimdoc.sourceforge.net/htmldoc/diff.html#: DiffOrig

ich kopiert und eingefügt den DiffOrig Befehl in meine .vimrc Datei und es funktioniert wie ein Charme. Dies erleichtert erheblich die Wiederherstellung von Auslagerungsdateien. Ich habe keine Ahnung, warum es nicht standardmäßig in VIM enthalten ist.

Hier ist der Befehl für diejenigen, die in Eile sind:

 command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
    \ | wincmd p | diffthis

Die akzeptierte Antwort ist für einen sehr wichtigen Anwendungsfall gesprengt. Sagen wir, Sie, ohne jemals zu speichern, dann Ihren Laptop stürzt ab, einen neuen Puffer und Typ 2 Stunden erstellen. Wenn Sie die vorgeschlagene Skript ausführen wird es Ihre einzige Datensatz, die .swp Auslagerungsdatei löschen. Ich bin mir nicht sicher, was die richtige Lösung ist, aber es sieht aus wie der Befehl diff in diesem Fall selbst die gleiche Datei zu vergleichen landet. Die bearbeitete Version unter Kontrollen für diesen Fall und gibt dem Benutzer die Möglichkeit, die Datei irgendwo zu speichern.

#!/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

Große Spitze DiffOrig ist perfekt. Hier ist ein Bash-Skript Ich benutze es auf jeder Auslagerungsdatei im aktuellen Verzeichnis auszuführen:

#!/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

Wahrscheinlich etwas mehr Fehler verwenden könnte Überprüfung und unter Angabe aber bisher gearbeitet hat.

Ich bevorzuge es nicht mein VIM Arbeitsverzeichnis in der .vimrc gesetzt. Hier ist eine Modifikation von chouser Skript, das kopiert die Auslagerungsdateien auf den Swap-Pfad auf der Nachfrage nach Dubletten überprüft und diese dann in Einklang bringt. Dies wurde geschrieben gehetzt, stellen Sie sicher, es zu bewerten, bevor es in der Praxis setzen.

#!/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

Ich habe diese auf meinem .bashrc. Ich möchte entsprechende Gutschrift auf einen Teil dieses Codes geben, aber ich habe vergessen, wo ich es aus.

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 }

Ich betreibe nur diese auf die Wurzel meines Projekts und, wenn die Datei unterschiedlich ist, es vim diff öffnet. Dann wird die letzte Datei gespeichert werden soll gehalten werden. Um es perfekt machen würde ich nur das letzte anderes ersetzen müssen:

else echo "Backup file kept as:" $bakf

durch so etwas wie

else vim $bakf -c ":wq! $orif" && echo "Backup file kept and saved as:" $orif

aber ich habe nicht Zeit, um es richtig zu testen.

Hoffe, es hilft.

finden ./ -type f -name "* sw [klmnop]" -delete

Credit: @Shwaydogg https://superuser.com/ Fragen / 480.367 / was-the-einfach-Weg-to-delete-vim-swapfiles-ive-schon-gewonnenes von

Verzeichnis Navigieren erste

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top