Как сохранить кодировку файла при восстановлении файла подкачки Vim?

Я использую собственный 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, но файл восстановлен с vim -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 как vim --noplugin -u /dev/null для этого теста.

0 ответов

Другие вопросы по тегам