VISUAL vs. EDITOR – what’s the difference?

I generally set both VISUAL and EDITOR environment variables to the same thing, but what’s the difference? Why would I set them differently? When developing apps, why should I choose to look at VISUAL before EDITOR or vice versa?

Asked By: xenoterracide

||

The EDITOR editor should be able to work without use of “advanced” terminal functionality (like old ed or ex mode of vi). It was used on teletype terminals.

A VISUAL editor could be a full screen editor as vi or emacs.

E.g. if you invoke an editor through bash (using C-x C-e), bash will try first VISUAL editor and then, if VISUAL fails (because terminal does not support a full-screen editor), it tries EDITOR.

Nowadays, you can leave EDITOR unset or set it to vi -e.

Answered By: andcoz

Since there don’t seem to be any environments where vi or similar would fail, I’ve taken to setting VISUAL to something that needs an X DISPLAY, and EDITOR to ex.

Mostly, that just seems to cause me problems when some program doesn’t use VISUAL.

Answered By: Mike William Meyer

Some tools only accept EDITOR, for example the shell builtin fc:

-e ENAME  select which editor to use.  Default is FCEDIT, then EDITOR, then vi
Answered By: Zombo

$VISUAL is a more capable and interactive preference over $EDITOR. If undefined, anything seeking $VISUAL should then try $EDITOR next.

Some people have adopted a modern convention denoting $VISUAL as graphical and $EDITOR as an interactive terminal. Historically, $VISUAL (like vi) referred to an interactive terminal display while $EDITOR (like ed) was a line editor incapable of handling (text) cursor movement. See robla’s answer for more historical notes.

At the moment, I have stuff like this in my ~/.bashrc and ~/.zshrc:

# Prefer vim or else fail over to vi
EDITOR="$(command -v vim 2>/dev/null || command -v vi)"

# we have gvim, not in an SSH term, and the X11 display number is under 10
if command -v gvim >/dev/null 2>&1 
&& [ "$SSH_TTY$DISPLAY" = "${DISPLAY#*:[1-9][0-9]}" ]; then
  export VISUAL="$(command -v gvim) -f"
  SUDO_EDITOR="$VISUAL"
else
  SUDO_EDITOR="$EDITOR"
fi

gvim without -f won’t work with programs that expect to act on your edits. This definitely includes sudoeditor (sudo -e).

This may break if you have whitespace in the path to vim. If that’s a problem, either install it properly or else consider symlinks like /usr/local/bin/gvim

Answered By: Adam Katz

The accepted answer is probably a good, short treatment, but this will be an attempt to go deeper on when the distinction between VISUAL and EDITOR might still matter (building on Adam Katz’s answer).

The POSIX spec still distinguishes between visual mode editors and line editors. This really mattered back in the days when cursor positioning over serial connections was hard (especially because of the speed of the serial connection). The Wikipedia article for vi gives some useful background on the distinction between vi (a visual mode editor) and ex (a line editor). If you dig deep enough down the research, you’ll find the "RATIONALE" section of the "ex" spec, which gives a reason for the distinction still being in the spec:

It is recognized that portions of vi would be difficult, if not
impossible, to implement satisfactorily on a block-mode terminal, or a
terminal without any form of cursor addressing, thus it is not a
mandatory requirement that such features should work on all terminals.
It is the intention, however, that a vi implementation should provide
the full set of capabilities on all terminals capable of supporting
them.

I haven’t needed this since giving up my 300 baud modem, but I can imagine that people who use slow serial lines to connect to embedded systems (and/or over really dicey connections) might still appreciate being able to have a preferred line mode editor distinct from a "visual" editor like vi. VT100-style terminal codes over a lossy, laggy, narrow connection might be "bloat" in limited applications.

For the rest of us, it seems the "correct" answer seems to be "set them both to be your preferred editor". It might be ok to co-opt this distinction for graphical editor (e.g. Sublime, gvim or emacs) vs a terminal editor (e.g. vi/vim or emacs with -nw option), but there’s likely a mountain of legacy reasons why that probably won’t work as hoped.

Answered By: robla

In general, you shouldn’t have to worry about EDITOR or VISUAL, because the default for EDITOR is "vi" and for VISUAL it is EDITOR.

  • Only set EDITOR if you want stone cold ex or ed
  • Set VISUAL only to override EDITOR and if a graphical environment exists and emacs, vim, nano etc. are installed

In short, if you really want to set these variables, you have to have a good reason, because their concept is default-proof. Don’t bother and you always get vi. That’s tough for younglings but this way there are no surprises ever. For example, on remote systems where you don’t have your fancy tools and initialization files (.emacs .vimrc) and therefore would suffer, you are not really suffering because you get the reliable vi. Back on your own system you’ll get vi too unless you set VISUAL.

BTW, both should be set in $HOME/.bash_profile, so only for login shells and only overridden in $HOME/.bashrc if (and only if) there are good reasons. The latter file is only executed for interactive shells, and each interactive shell can only be run under a login shell whose variables interactive shells inherit.

If you want to override them in $HOME/.bashrc then you most likely want to query the TERM variable ("dumb") and make sure DISPLAY is not empty (i.e. there is a graphical environment). This is one more reason not to worry about both variables and to leave it on your system with the defaults. Just learn to edit commit messages with vi and start your editor or IDE directly from the command line and you’ll be fine.

But to really understand what’s been said here and why the recommendation not to care about these variables was made, look at how Git uses these variables:

https://github.com/git/git/blob/master/editor.c

All you need to know.

Answered By: Andreas Spindler
Categories: Answers Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.