Why Syntax Highlighting Disappears When Using sudo vi and How to Fix It


1 views

When you use sudo vi, you're actually running Vim with root's environment instead of your user's environment. This means several critical configuration files aren't loaded:

# Normal user's vim loads these:
~/.vimrc
~/.vim/colors/

# But sudo vi only loads these:
/etc/vimrc
/usr/share/vim/vimfiles/

Your TERM variable shows xterm-color, but when using sudo, important environment variables might not be preserved. Check the difference:

# As normal user:
echo $TERM
xterm-color

# With sudo:
sudo bash -c 'echo $TERM'
xterm

1. Preserve Environment Variables

Use sudo -E to preserve your environment:

sudo -E vi filename.txt

2. Configure Root's Vim Settings

Copy your syntax settings to root's configuration:

sudo cp ~/.vimrc /root/
sudo mkdir -p /root/.vim/colors
sudo cp -r ~/.vim/colors /root/.vim/

3. System-wide Vim Configuration

Edit the system vimrc to enable syntax highlighting globally:

sudo vi /etc/vimrc

# Add these lines:
syntax on
filetype plugin indent on
set background=dark
colorscheme default

For RHEL systems, edit the sudoers file to preserve specific environment variables:

sudo visudo

# Add this line:
Defaults env_keep += "TERM LS_COLORS"

If syntax still doesn't work, check:

# Verify filetype detection
:set ft?

# Force syntax
:set syntax=python

# Check available color schemes
:colorscheme [space]+[TAB]

Instead of sudo vi, try sudoedit which preserves more of your user environment:

sudoedit filename.txt

When you run sudo vim filename, Vim loses its syntax highlighting because of environment variable inheritance issues. The sudo command typically resets certain environment variables for security reasons, including those related to terminal capabilities and Vim configurations.

# Check current terminal settings
$ echo $TERM
xterm-color

# After sudo:
$ sudo bash -c 'echo $TERM'
xterm

The key variables affected are:

  • TERM: Defines terminal capabilities
  • VIMRUNTIME: Points to Vim's runtime files
  • HOME: Determines where Vim looks for configuration files

Method 1: Using sudo -E

The simplest solution is to use the -E flag with sudo to preserve the user's environment:

sudo -E vim /etc/nginx/nginx.conf

Method 2: Explicitly Setting TERM

If -E isn't permitted by your sudoers configuration:

sudo TERM=xterm-256color vim /etc/httpd/conf/httpd.conf

Method 3: Permanent Configuration

Add this to your ~/.bashrc or ~/.zshrc:

alias sudo='sudo '
alias vi='vim'
alias sudoedit='sudo -E vim'

For systems where you can't modify sudo behavior, configure Vim to force syntax highlighting:

" Add to /etc/vimrc or ~/.vimrc
if !exists("g:syntax_on")
    syntax enable
    set background=dark
    colorscheme default
endif
  1. Verify terminal capabilities: tput colors
  2. Check effective environment under sudo: sudo env | grep TERM
  3. Test with minimal Vim config: sudo vim -u NONE

For RHEL/CentOS systems specifically, you might need to install additional packages:

sudo yum install vim-enhanced