Change default editor to vim for _ sudo systemctl edit [unit-file] _

First method, you can add this line to ~/.bashrc:

export SYSTEMD_EDITOR=vim

And then sudo visudo and add this line:

Defaults  env_keep += "SYSTEMD_EDITOR"

Start new bash session to take effect, then run sudo systemctl edit <foo> as usual.

Second method is use update-alternatives:

Install your desired editor, e.g. vim.gtk3:

$ which editor
editor is /usr/bin/editor
$ sudo update-alternatives --install "$(which editor)" editor "$(which vim.gtk3)" 15

Then choose your desired editor:

$ sudo update-alternatives --config editor
There are 7 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
  0            /usr/bin/vim.gtk3    50        auto mode
  1            /bin/ed             -100       manual mode
* 2            /bin/nano            40        manual mode
  3            /usr/bin/code        0         manual mode
  4            /usr/bin/gedit       5         manual mode
  5            /usr/bin/vim.basic   30        manual mode
  6            /usr/bin/vim.gtk3    50        manual mode
  7            /usr/bin/vim.tiny    15        manual mode

Press <enter> to keep the current choice[*], or type selection number: 6
update-alternatives: using /usr/bin/vim.gtk3 to provide /usr/bin/editor (editor) in manual mode

Third method is direct set the EDITOR on runtime:

sudo EDITOR=vim systemctl edit <foo>

The precedence are first method > third method > second method.

Don't try to set "GUI" editor such as gedit because Why don't gksu/gksudo or launching a graphical application with sudo work with Wayland? and Gedit uses 100% of the CPU while editing files


You are setting the variables for your own user, but are running the systemctl command as root (sudo). Therefore, the variables you've set for your user are irrelevant.

To fix this, you can either (but go with 1):

  1. Run sudo with -E so it exports the current environment:

    sudo -E systemctl edit _unit_
    
  2. Add the variable (you only need SYSTEMD_EDITOR for this) to root's ~/.profile:

    export SYSTEMD_EDITOR="/bin/vi" 
    

    Then run with

    sudo -i systemctl edit _unit_ 
    

Finally, note that you need to specify the full path to your editor, not just its name. So it's /bin/vi and not vim.


I use a shell alias:

sc='sudo SYSTEMD_EDITOR=/bin/vi /usr/bin/systemctl'

Then just:

sc edit service-name

It's also useful for generally avoiding typing 7 out of the 9 characters of systemctl in cases like restart, etc.