使用 sudoedit 时 vim 颜色方案显示不正确

VTC*_*VTC 2 vim sudo 12.04

我一直在努力成为一个好的小系统管理员,并在更改根拥有的文件(例如 /etc/profile)时使用 sudoedit,而不是 sudo vim 或 sudo -i;vim,但我的 vim colorcheme 似乎没有使用 sudoedit 时正确显示。

colorceme 加载正确(通过 :color 检查)。我已经确认它没有为 root 提取颜色方案,因为从 root 执行 sudoedit 时也会出现问题,颜色不同,即使它显示相同的方案。

使用:

  • 12.04 长期支持
  • vim: 2:7.3.429-2ubuntu2.1
  • 须藤:1.8.3p1-1ubuntu3.4

编辑:

VIM 正在运行:

ubuntu@ip-10-0-0-104:~$ ps -f -u ubuntu
UID        PID  PPID  C STIME TTY          TIME CMD
ubuntu    4433  4345  0 19:18 ?        00:00:00 sshd: ubuntu@notty
ubuntu    6109  6021  0 20:47 ?        00:00:00 sshd: ubuntu@pts/0
ubuntu    6110  6109  0 20:47 pts/0    00:00:00 -bash
ubuntu    6233  6232  0 20:48 pts/0    00:00:00 /usr/bin/vim /var/tmp/profile.XXQiLoee
ubuntu    6322  6234  0 20:49 ?        00:00:00 sshd: ubuntu@pts/1
ubuntu    6323  6322  0 20:49 pts/1    00:00:00 -bash
ubuntu    6461  6323  0 20:50 pts/1    00:00:00 ps -f -u ubuntu
Run Code Online (Sandbox Code Playgroud)

这是我正在谈论的一个例子。(其他亮点效果不太好,但我认为一张图片就足够了)

vim 与 sudoedit

Mic*_*ler 5

屏幕截图的差异是由于 Vim 对filetype正在编辑的两个文件使用了不同的文件。其原因很可能是sudoedit编辑时创建的临时文件的名称。

当比较两个 Vim 实例之间的语法高亮差异时,首先要查找的是filetypeVim 自动设置的变量。filetype您可以通过执行来检查当前是什么

:set filetype?
Run Code Online (Sandbox Code Playgroud)

在维姆中。ft您也可以参考简称设置。Vim 应该在状态行上显示结果,例如

  filetype=sh
Run Code Online (Sandbox Code Playgroud)

Vim 有一个大型启发式脚本,用于filetype根据文件名(有时根据文件内容)自动设置。/etc/profile例如,如果文件名是,Vim 自动filetype将设为sh

当您使用sudoeditedit时/etc/profile,会创建一个临时文件,如ps清单中所示。由于该文件的名称与 Vim 的任何脚本规则都不匹配,因此它尝试filetype根据内容进行设置。根据屏幕截图,我猜测 Vim 已设置filetypeto conf,表示通用配置文件。

可能的解决方案

手动的

有几种方法可以解决这个问题。首先,您可以filetype在每次编辑文件时手动设置。要强制sh使用语法,请执行

:set filetype=sh
Run Code Online (Sandbox Code Playgroud)

应立即重新加载并应用语法突出显示规则。

语法提示

另一种方法是在您经常编辑的文件内容中向 Vim 添加提示,提示filetype应设置特定内容。例如,如果文件的第一行是#!/bin/sh,则无论文件名是什么,Vim 都会使用适当的语法。请注意,这看起来/etc/profile像是一个可执行的 shell 脚本,尽管它不是,所以您可能想也可能不想在您的系统上执行类似的操作。

Vim 模型行

filetype第三种方法是使用 Vim 所谓的“modelines”强制 Vim 设置变量。请参阅:help modeline获取更多信息。这涉及到向文件添加注释,其中包含 Vim 可以解析命令的字符串。回到您的示例/etc/profile,添加注释,例如

# vim: set filetype=sh
Run Code Online (Sandbox Code Playgroud)

filetype会指示 Vim在编辑文件时正确设置,无论其名称如何。