我使用自定义 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 步:恢复文件,并将缓冲区保存为“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-8vim -r
并sav[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 --noplugin -u /dev/null
为这个测试运行 Vim。