An interesting quirk in ksh, the default shell for OpenBSD
22 March 2023
Today I discovered a quirk in
ksh, the default shell for OpenBSD.
EDITOR=vim in my
.profile "broke" the way I navigate history in my shell.
Up and down arrows no longer worked, nor did
ctrl-r—it would simply echo the terminal bell (ding!).
The change in behavior was entirely unexpected. Neither of the two shells I am used to–
zsh–exhibit this behavior.
I didn't notice it at first either.
Fortunately I had two servers to compare, one that had the change and one that didn't.
When I finally determined that my
EDITOR change was the culprit, I did some manpage diving.
VISUAL, this helps
ksh determine which command-line editing mode it should
use. It uses
emacs mode by default (analogous to
set -o emacs).
vi-like command-line editing
to be enabled for the shell (analogous to
set -o vi).
Relevant man page excerpts
EDITOR If the VISUAL parameter is not set, this parameter controls
the command-line editing mode for interactive shells. See the
VISUAL parameter below for how this works.
Note: traditionally, EDITOR was used to specify the name of an
(old-style) line editor, such as ed(1), and VISUAL was used to
specify a (new-style) screen editor, such as vi(1). Hence if
VISUAL is set, it overrides EDITOR.
VISUAL If set, this parameter controls the command-line editing mode
for interactive shells. If the last component of the path
specified in this parameter contains the string "vi", "emacs",
or "gmacs", the vi(1), emacs, or gmacs (Gosling emacs) editing
mode is enabled, respectively. See also the EDITOR parameter,
Interactive input line editing
The shell supports three modes of reading command lines from a tty(4) in
an interactive session, controlled by the emacs, gmacs, and vi options
(at most one of these can be set at once). The default is emacs.
Editing modes can be set explicitly using the set built-in, or implicitly
via the EDITOR and VISUAL environment variables. If none of these
options are enabled, the shell simply reads lines using the normal tty(4)
driver. If the emacs or gmacs option is set, the shell allows emacs-like
editing of the command; similarly, if the vi option is set, the shell
allows vi-like editing of the command. These modes are described in
detail in the following sections.
The behavior I want is my original expectation: having
vim as my default editor without
affecting the command-line editing mode (I did play a bit with the vi-mode, but I don't want to relearn decades of muscle memory).
Fortunately, this is easy enough by explicitly setting the desired mode in
set -o emacs
- Why not just use a shell you're familiar with?
- I am exploring OpenBSD as a stranger in a strange land. When in Rome...