232

I believe I can do something like export EDITOR=vi, but I'm not sure what exactly to enter, and where.

How can I set "vi" as my default editor?

Donny P
  • 2,531

4 Answers4

277

You should add it to your shell’s configuration file. For Bash, this is ~/.bashrc or ~/.bash_profile (see detailed comparison). You should also set $VISUAL, as some programs (correctly) use that instead of $EDITOR (see VISUAL vs. EDITOR). Additionally, unless you know why, you should set it to vim instead of vi.

TL;DR, add the following to your shell configuration (probably ~/.bashrc):

export VISUAL=vim
export EDITOR="$VISUAL"
  • Not working for me! I still see a number after: "sudo crontab -e" instead of editing crontab! – محسن عباسی Jun 26 '18 at 09:34
  • 1
    @MohsenAbasi What do you mean “I still see a number?”. Check that EDITOR is in both your environment (env | grep EDITOR) and is passed to sudo (sudo env | grep EDITOR), as your system’s sudo security policy may prohibit it (see man sudo for more details). – Andrew Marshall Jun 26 '18 at 17:18
  • I mean that I still see just a number (not opening 'vim' editor) after executing: 'sudo crontab -e'. Since there is no default editor for editing cron jobs in my Ubuntu. To have a default editor, your solution does nothing for me. Only solution of 'DobesVandermeer' works. – محسن عباسی Jun 27 '18 at 06:08
  • 2
    Once it is done, reload the config with . ~/.bashrc – Jona Feb 18 '21 at 20:47
  • I had to use /usr/bin/vi rather than vim otherwise crontab -e failed with the error crontab /bin/sh: 1: vim: not found. – SharpC Jan 28 '23 at 13:24
  • @AndrewMarshall given this is such a noob question it's probably a good idea to point out that a restart of bash or source ~/.bashrc, whatever, is required to update the environment after you've edited the file. As Jona points out. – NeilG Jun 21 '23 at 19:45
177

On Ubuntu and other Ubuntu/Debian-based Linux systems, you can explicitly set the default text editor at the system level by providing its path to update-alternatives:

Automatic, Scripted

sudo update-alternatives --set editor /usr/bin/vim.basic
sudo update-alternatives --set vi /usr/bin/vim.basic

Note

If your distro doesn't call it /usr/bin/vim.basic, you can find out which path to use with the --list argument:

sudo update-alternatives --list editor
/bin/ed
/bin/nano
/usr/bin/vim.basic
/usr/bin/vim.tiny

Manual, Interactive

Or, to see all options and choose interactively:

sudo update-alternatives --config editor
Chris Davies
  • 116,213
  • 16
  • 160
  • 287
Rick
  • 2,013
  • 6
    This set the default for git too, which was exactly what I needed. – Kzqai Mar 09 '16 at 18:26
  • 2
    This set the default for ranger too, which was exactly what I needed. PS: just for helping index for people who is trying to do the same. – wviana Dec 06 '16 at 16:42
  • 1
    Only this worked for me on Ubuntu server 18.04 – user3751385 Sep 17 '18 at 17:55
  • Not within FreeBSD https://www.freebsd.org/cgi/man.cgi?query=update-alternatives&apropos=0&sektion=0&manpath=FreeBSD+12.2-RELEASE but within the port of dkpg https://www.freshports.org/archivers/dpkg/ – Graham Perrin Dec 25 '20 at 09:05
  • This works with my version of WSL2/Ubuntu on Windows 10. – staylorx Apr 11 '22 at 21:27
45

In recent versions of Ubuntu you use the alternatives system to manage the default, editor, e.g.:

update-alternatives --set editor /usr/bin/vim.basic

To see which editors are available for use:

update-alternatives --list editor

Some UNIX distributions might provide a select-editor command:

select-editor

And it will ask you which editor to use.

Make sure you actually have vim installed before trying to set it as your default editor.

3

If bash is your shell, then insert it into .bash_profile in your home directory; if zsh is your shell, then insert it into .zprofile; for other shells see the according documentation.

countermode
  • 7,533
  • 5
  • 31
  • 58
  • On zsh I recommend putting it into .zshenv instead. – pepoluan Oct 20 '20 at 09:23
  • 1
    @pepoluan If you see this, could you please elaborate? The .zprofile file will be read for each and every shell invocation. It seems odd to want to set the editor for shell sessions that aren't even interactive. – Kusalananda Dec 28 '20 at 19:02
  • @Kusalananda it's just setting an env var anyways, so not harmful. If you need to, say su into your account, .zshenv will be sourced. – pepoluan Dec 29 '20 at 04:55
  • 1
    Why not put it in .zshrc for zsh as the top-vote opts for .bashrc? – Timo May 03 '23 at 11:57
  • You shouldn't go around putting it into things like that. – NeilG Jun 21 '23 at 19:45