恢复Vim交换文件时如何保留文件编码?

时间:2014-05-04 11:46:52

标签: vim encoding swapfile

我使用自定义Perl脚本在崩溃或停电后清理剩余的Vim交换文件。该脚本会自动删除未更改文件的交换文件,并打印交换文件中保留未修改的文件列表。这种方法很有效,除非我使用不同的编码恢复文件。

我的环境,终端和所有内容都设置为使用UTF-8作为默认编码。一个遗留项目将文件存储为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步:恢复文件,并将缓冲区保存为" recover.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,但使用vim -rsav[eas]恢复的文件存储为UTF-8。

如果没有恢复步骤,即在打开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 vim --noplugin -u /dev/null

0 个答案:

没有答案