如何让vim将BOM显示为<feff>?

10
当我查看服务器上的文件时,会看到类似于以下内容:
<feff>sku;qty
productsku;1

当我下载文件并使用vi打开时,我看不到 <feff>
当我执行:e ++bin时,我可以看到 <feff>,但现在我也看到了^M。
<feff>sku;qty^M
productsku;1^M

但我不想设置^M,我只想看到<feff>。另一个例子是<80>,它在另一个文件中。

我该如何设置vim来显示这些特殊字符?

~编辑~

命令vi --version告诉我以下信息:

VIM - Vi IMproved 7.0 (2006 May 7, compiled Aug  4 2010 07:21:08)

它还说系统vimrc文件是/etc/vimrc,其内容如下:
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
   set fileencodings=utf-8,latin1
endif

set term=builtin_ansi
set nocompatible    " Use Vim defaults (much better!)
set bs=indent,eol,start     " allow backspacing over everything in insert mode
"set ai         " always set autoindenting on
"set backup     " keep a backup file
set viminfo='20,\"50    " read/write a .viminfo file, don't store more
            " than 50 lines of registers
set history=50      " keep 50 lines of command line history
set ruler       " show the cursor position all the time

" Only do this part when compiled with support for autocommands
if has("autocmd")
  augroup redhat
    " In text files, always limit the width of text to 78 characters
    autocmd BufRead *.txt set tw=78
    " When editing a file, always jump to the last cursor position
    autocmd BufReadPost *
    \ if line("'\"") > 0 && line ("'\"") <= line("$") |
    \   exe "normal! g'\"" |
    \ endif
  augroup END
endif

if has("cscope") && filereadable("/usr/bin/cscope")
   set csprg=/usr/bin/cscope
   set csto=0
   set cst
   set nocsverb
   " add any database in current directory
   if filereadable("cscope.out")
      cs add cscope.out
   " else add database pointed to by environment
   elseif $CSCOPE_DB != "" 
      cs add $CSCOPE_DB
   endif
   set csverb
endif

" Switch syntax highlighting on, when the terminal has colors
" Also switch on highlighting the last used search pattern.
if &t_Co > 2 || has("gui_running")
  syntax on 
  set hlsearch
endif

if &term=="xterm"
     set t_Co=8
     set t_Sb=^[[4%dm
     set t_Sf=^[[3%dm
endif

我将此内容复制并添加到我的~/.vimrc文件中,但这些更改都无法实现我想要的效果。其中有几个部分在if语句中,因此我可能还需要做一些调整。

请问是否有其他文件会在编辑文件时被读取,而不仅限于vi --version中所述的文件?


2
在我看来,你所期望的功能是合理的,但不幸的是据我所知目前并没有任何方法可以实现它。 Vim 尝试隐藏行尾和 BOM(如果存在),这样你就可以专注于文本。最好的选择可能是研究 'bomb' 选项;你可以将其作为自定义 'statusline' 的一部分。 - bgoldst
奇怪的是,这一定是可能的,因为我们大多数服务器上都有这种行为。但我不知道是哪个配置文件。~/.vimrc与我的相同,因此必须加载另一个文件,该文件具有我需要的设置。 - Eydamos
嗯,有趣。我想到的一个可能性是您的服务器上可能有旧版本的vim,它们不支持BOM,因此最终会显示为普通文本。我记得以前在IBM工作时,我们有很多服务器使用非常老的vim/vi版本(例如vi 3.1),功能非常有限,令人失望。 - bgoldst
在我们的服务器上,我们有VIM - Vi IMproved 7.0(2006年5月7日,编译于2010年8月4日07:21:08),而在我的Mac上,我有VIM - Vi IMproved 7.3(2010年8月15日,编译于2015年7月9日23:58:42),因此它们之间相差不太大。 - Eydamos
1个回答

8

:help 'bomb' 解释了 Vim 的行为:

当 Vim 读取一个文件并且 'fileencodings' 以 "ucs-bom" 开头时,会检查 BOM 是否存在,然后相应地设置 'bomb'。除非设置了 'binary',否则它将从第一行中删除,这样在编辑时就看不到它。

因此,

:set fencs-=ucs-bom

虽然关闭此功能可以解决问题,但编码检测也会失效。通过我的实验发现,显式设置编码(通过:edit ++enc=ucs2-le)也会设置'bomb'并移除<feff>标记。因此,这条路没有出路。

替代方案

  • 像你已经发现的那样,在二进制模式下编辑。我不建议这样做,因为它有缺点。
  • 状态栏中包含指示。虽然你需要在其他地方查看,但它总是可见的,而不仅仅在文档开头。作为Vim中正确的方式™,强烈推荐。而且很容易实现:
set statusline+=\ %{&bomb?'BOM':''}

1
你知道有哪些编辑器可以在文本中显示BOM吗? - john c. j.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接