为什么我在 sudo vi <filename> 时没有语法高亮?

Sco*_*ren 30 linux sudo vi

我不明白在使用 sudo 时如何允许在我通过vi编辑的文件中突出显示语法。当我sudo vi <filename>的终端只是我的终端设置的黑白时。在 vi 如果我输入:syntax on什么都没有改变。

当我vi <filename>所有的语法都正确着色时。使用 RHEL 5.4,相关环境:

LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;
33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;
32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;
32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;
31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;
31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;
35:*.png=01;35:*.tif=01;35:
Run Code Online (Sandbox Code Playgroud)
SHELL=/bin/bash
Run Code Online (Sandbox Code Playgroud)
TERM=xterm-color
Run Code Online (Sandbox Code Playgroud)

use*_*673 31

Larks 的回答可能是最有可能的。您可能不希望将您的 root 帐户 vi 永久更改为 vim,因为您的资源很少 vi 几乎可以保证始终有效,我对 vim 不太确定。

您可能正在使用(颜色)

/usr/bin/vim 
Run Code Online (Sandbox Code Playgroud)

在您的普通用户和

/bin/vi
Run Code Online (Sandbox Code Playgroud)

在 sudo 或 root 下。您可以使用以下方法进行检查:

which vi
Run Code Online (Sandbox Code Playgroud)

一次在您的普通用户下,另一个通过 sudo

sudo which vi
Run Code Online (Sandbox Code Playgroud)

做一个

man which 
Run Code Online (Sandbox Code Playgroud)

如果您需要更多详细信息


lar*_*sks 18

在 RHEL 系统上,/bin/vi通常是 的最小版本vim,没有任何语法高亮支持。 /usr/bin/vim是功能齐全的编辑器。在您的用户环境中,很可能vivim. 尝试这个:

sudo vim /some/file
Run Code Online (Sandbox Code Playgroud)

你现在有语法高亮吗?


Fis*_*tor 14

vi可能/bin/vi来自vim-minimal不支持语法突出显示的包。为您sudo vi启动/bin/vi

Bash 只对命令行中的第一个单词进行别名扩展,因此在:

sudo vi
Run Code Online (Sandbox Code Playgroud)

vivim即使您定义了该别名,也不会被替换。

解决方案是定义另一个别名(为用户调用sudo):

别名 sudo='sudo '

注意第二个后面的空格sudo

使用这个sudo,bash 将为viin做别名扩展sudo vi。在aliasBash 文档的部分中,它说:

如果别名值的最后一个字符是空白,则还检查别名之后的下一个命令字的别名扩展。

输入命令后,您可以按Ctrl+ Alt+ Einbash查看扩展结果。

学分:

https://bbs.archlinux.org/viewtopic.php?id=36796

http://www.shellperson.net/using-sudo-with-an-alias


简单的别名vi/root/.bashrc行不通的。

还需要注意的vi是,在 /etc/profile.d/vim.sh 中的某些发行版上,root 没有别名:

if [ -n "$BASH_VERSION" -o -n "$KSH_VERSION" -o -n "$ZSH_VERSION" ]; then
  [ -x /usr/bin/id ] || return
  ID=`/usr/bin/id -u`
  [ -n "$ID" -a "$ID" -le 200 ] && return
  # for bash and zsh, only if no alias is already set
  alias vi >/dev/null 2>&1 || alias vi=vim
fi
Run Code Online (Sandbox Code Playgroud)

改变这个也不能解决问题。