我一直在努力成为一个好的小系统管理员,并在更改根拥有的文件(例如 /etc/profile)时使用 sudoedit,而不是 sudo vim 或 sudo -i;vim,但我的 vim colorcheme 似乎没有使用 sudoedit 时正确显示。
colorceme 加载正确(通过 :color 检查)。我已经确认它没有为 root 提取颜色方案,因为从 root 执行 sudoedit 时也会出现问题,颜色不同,即使它显示相同的方案。
使用:
编辑:
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 对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 脚本,尽管它不是,所以您可能想也可能不想在您的系统上执行类似的操作。
filetype第三种方法是使用 Vim 所谓的“modelines”强制 Vim 设置变量。请参阅:help modeline获取更多信息。这涉及到向文件添加注释,其中包含 Vim 可以解析命令的字符串。回到您的示例/etc/profile,添加注释,例如
# vim: set filetype=sh
Run Code Online (Sandbox Code Playgroud)
filetype会指示 Vim在编辑文件时正确设置,无论其名称如何。