0

カスタム Perl スクリプトを使用して、クラッシュや停電の後に残った Vim スワップ ファイルをクリーンアップします。このスクリプトは、変更されていないファイルのスワップ ファイルを自動的に削除し、スワップ ファイルに保存されていない変更が残っているファイルのリストを出力します。これは、別のエンコーディングでファイルを復元する場合を除いて、うまく機能します。

私の環境、端末、およびすべては、デフォルトのエンコーディングとして UTF-8 を使用するように設定されています。1 つのレガシー プロジェクトでは、ファイルが Latin-1 (実際には Latin-9) として保存されます。そのプロジェクトからファイルを復元すると、バッファを保存するとエンコーディングが変更されます。

動作を再現するための最小限の例を次に示します。

ステップ 1: Latin-1 エンコーディングでファイルを作成する

$ echo égal > latin.txt

$ file -i latin.txt
latin.txt: text/plain; charset=utf-8

$ recode utf8..latin1 latin.txt

$ file -i latin.txt
latin.txt: text/plain; charset=iso-8859-1

ステップ 2: Vim でファイルを開き、クラッシュをシミュレートする

$ vim latin.txt

# (in Vim: Ctrl-Z to send to background)

[1]+  Stopped                 /usr/bin/vim latin.txt

$ ls -a
.  ..  .latin.txt.swp  latin.txt

$ jobs -l
[1]+  7294 Stopped                 /usr/bin/vim latin.txt

$ kill -KILL 7294

$
[1]+  Killed                  /usr/bin/vim latin.txt

ステップ 3: ファイルを回復し、バッファーを「recovered.txt」として保存します。

$ vim -r .latin.txt.swp

  ,--[in Vim]
  | Using swap file ".latin.txt.swp"
  | Original file "~/tmp/enctest/latin.txt"
  | Recovery completed. Buffer contents equals file contents.
  | You may want to delete the .swp file now.
  |
  | Press ENTER or type command to continue
  | :sav recovered.txt
  | "recovered.txt" [New] 1L, 6C written
  | :q

結果:

$ file -i recovered.txt
recovered.txt: text/plain; charset=utf-8

ご覧のとおり、元は Latin-1 ですが、ファイルはUTF-8 で復元され、保存されていますvim -rsav[eas]

これは、回復ステップなしで、つまり、直接開いlatin.txtて使用する場合には発生しません。saveas

Vim に元のエンコーディングを復元させるにはどうすればよいですか?


編集: の値fileencoding

# When editing the original file:
    set fenc? -> latin1
    setlocal fenc? -> latin1
# During recovery:
    set fenc? -> ""
    setlocal fenc? -> ""
# During recovery, after `sav[eas] recovered.txt`:
    set fenc? -> ""
    setlocal fenc? -> ""
# When opening recovered.txt in a fresh Vim instance:
    set fenc? -> utf-8
    setlocal fenc? -> utf-8

vim --noplugin -u /dev/nullこのテストに関しては、Vim を実行しています。

4

0 に答える 0