I don't understand how to allow syntax highlighting in files I'm editing via vi when using sudo. When I sudo vi <filename> the terminal is only black & white of my terminal settings. In vi if I enter :syntax on nothing changes.

When I vi <filename> all the syntax is properly colored. Using RHEL 5.4, relevant env:



  • 3
    vi doesn't support color, so anything showing color is running vim or similar. – Chris S Oct 8 '13 at 13:30

Larks answer is probably the most likely. You may not wish to change your root accounts vi to vim permanently as if your resources are low vi is almost guaranteed to always work, I'm not so sure about vim.

You are probably using (color)


under your normal user and


under sudo or root. You can check by using:

which vi

once under your normal user and the other via sudo

sudo which vi

Do a

man which 

if you need more details

| improve this answer | |
  • I didn't change the root account to use vim but just knowing that which showed that vi was aliased to vim as my user tells me to use sudo vim <file> instead of sudo vi <file> – Scott Lundgren Dec 16 '10 at 21:06

On a RHEL system, /bin/vi is typically a minimal version of vim, without any syntax highlighting support. /usr/bin/vim is the full-featured editor. It is very likely that in your user environment, vi is an alias for vim. Try this:

sudo vim /some/file

Do you get syntax highlighting now?

| improve this answer | |
  • Yes! and it seems sinping's answer was the one I needed to get the behaviour I wanted – Scott Lundgren Dec 16 '10 at 21:04

Your vi is probably /bin/vi from package vim-minimal which does not support syntax highlighting. sudo vi launches /bin/vi for you.

Bash only does alias expansion on the first word in your command line, so in:

sudo vi

vi is not substituted to vim even if you have that alias defined.

The solution is define another alias (for the user invoking sudo):

alias sudo='sudo '

Note the space after the second sudo.

Using this sudo, bash will do alias expansion for vi in sudo vi. In the alias section of Bash doc it says:

If the last character of the alias value is a blank, then the next command word following the alias is also checked for alias expansion.

After you enter your command, You can press Ctrl+Alt+E in bash to see the expansion result.




Simply aliasing vi in /root/.bashrc will not work.

It may also be noted that vi is not aliased for root on some distros in /etc/profile.d/vim.sh:

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

Changing this will not solve the problem either.

| improve this answer | |
  • Awesome trick to have aliases with sudo! – Corey Henderson Feb 8 '13 at 17:05
  • Love this - simple and elegant!!! This IS the correct answer. – FilmJ Jun 25 '13 at 16:41

By default in 5.4 vi is default. I forget what version that started in. This will add the necessary alias for you:

cat <<_EOF >>/root/.bashrc

alias "vi"="/usr/bin/vim"
| improve this answer | |

i found that in my version of vim (install with sudo apt-get install vim on debian 7) the syntax on command is defined on a per-user basis in ~/.vimrc. however by default the install did not create a /root/.vimrc file for sudo vito load. so i just copied ~/.vimrc into the /root/ dir and this did the trick: sudo cp ~/.vimrc /root/

| improve this answer | |

1) Check if you're really using vim and not vi (which unfortunately is default often on fresh installed systems)

2) Check that your /etc/vim/vimrc has the line syntax on

3) Not all kinds of files have syntax-highlighting info available by default....

| improve this answer | |
  • There was no /etc/vim/vimrc, but /etc/vimrc did have syntax highlighting by default: if &t_Co > 2 || has("gui_running") syntax on set hlsearch endif – Scott Lundgren Dec 16 '10 at 21:02

For those still looking for help, try these commands.

  • sudovi = which sudo vi
  • usrvi = which vi
  • If these two locations are the same, then don't continue.


  • mv $sudovi $sudovi.save
  • ln -s $usrvi $sudovi (symbolic link)
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.