Vim alternatives on OpenBSD

       2315 words, 11 minutes

I’ve been using vi like forever. I was never an Emacs guy and I can’t stand nano and alike. The only other editors I use are Mousepad and Vim.

Vim already got on my nerve when they enabled mouse support and made it the default. It’s also a big fat mama (4.7M binary, 7.1M configuration directory) and I don’t really fancy this. Then, Vim started accepting LLM-based AI submits and I decided it was too much for my linkings.

So I decided to have a look at alternatives to use on my OpenBSD laptop and various servers. I checked this particular AI-free FOSS Alternatives list to select alternatives that I would look for, or not. This is why neovim, for example, was not considered.

Years of using Vim

Quoting Vim dot org

Vim is a highly configurable text editor built to make creating and changing any kind of text very efficient. It is included as “vi” with most UNIX systems and with Apple OS X.

Installation on OpenBSD is done like pkg_add vim and incantation is vim. I’m using the simplest Vim package. No GTK3, no Lua, Perl or Python flavor. At the time of writing, on OpenBSD 8.0-current, the version is vim-9.2.1178.

My usage of the editor is quite simple:

The features I actually use and consider a must for any long-term alternative are:

Some extra configuration that will be nice to replicate are:

This is what it looks like when I’m editing a fancy script.

Identified vi clones

vi

Refering to the OpenBSD vi manpage

vi is a screen-oriented text editor.

On OpenBSD, a stock vi binary is available. If I read the CVS repository properly, it should be based on nvi 1.81.5.

It doesn’t seem to support UTF-8 characters which is a major issue when writing French email. Also, I find it more difficult to read code when syntax highlighting is not available. Those appart, I really like it and found myself using it pretty often.

With a faily small configuration file such as

# cat .exrc
set autoindent
set flash
set number
set ruler
set showfilename
set showmatch
set showmode
set windowname
set wraplen=78
map #5 : !aspell check %

it renders this way:

Nvi

Quoting the GitHub nvi2 project

This is version 2.2.2 (2025-10-08) of nex/nvi, a reimplementation of the ex/vi text editors originally distributed as part of the Fourth Berkeley Software Distribution (4BSD), by the University of California, Berkeley.

On OpenBSD, the installation goes like pkg_add nvi and starting the program uses the nvi or nview commands.

It does provide UTF-8 support but still lacks things like syntax highlighting and split display.

Using the exact same configuration as the stock vi, it looks like this:

Neatvi

The neatvi GitHub page explains that

Neatvi is a small vi/ex editor for editing UTF-8 text. It supports syntax highlighting, multiple windows, right-to-left languages, keymaps, and the language server protocol.

It is not available in OpenBSD’s port but can be compile from sources.

# git clone https://github.com/aligrudi/neatvi.git
# cd neatvi
# make

My exploration of the software didn’t last long because, by default, UTF-8 characters would not display properly and only the historical hjkl keys work. I could never make myself using the original letter keys. I always used the lazy learner arrow ones ;-)

Vim-Classic

The Vim Classic website advertises

a fork of Vim 8.x for long-term maintenance, providing a stable, dependable editor — maintained entirely by humans.

On OpenBSD, it is installed using pkg_add vim-classic and is run using vim. Note that vim and vim-classic are mutually exclusive as they both use the same binary names.

Once ran, I found that it behaves in the same way as vim. The only difference I found was it didn’t seem to support the ModeChanged autocmd. I use this to switch the accent color depending on the current mode (Insert, Replace, Visual, …).

Vis

According to the Vis GitHub page , it presents itself as

a modern, legacy-free, simple yet efficient editor, combining the strengths of both vi(m) and sam.

On OpenBSD, one can install it using pkg_add vis and run as vise. As explained in the package details

vis is installed as vise(1) to avoid conflicts with vis(1).

The really annoying (missing) feature is the vi/ex classic search and replace syntax. You seem to have to use the sam’s structural language. This means you can’t use “:%s/foo/bar/g”, you have to “Use :x/pattern/ c/replacement/ instead”.

The split feature also works quite differently. You don’t specify the split when starting the command, like “vim -O”. Vis will split horizontally with all files passed in arguments. If you need a vertical split, you’d have to start vis and use :split or :vsplit accordingly.

The vis-spellcheck plugin enables syntax aware spellchecking.

The vis-colorizer plugin highlights hex colors inline.

There are many more plugins that can be used to extend vis.

The sam’s structural language annoys me and I am not well versed into Lua. So I didn’t dig for a long time and ended up with a ~/.config/vis configuration file that is probably filled with “could do better”… I’m just storing it here in case I ever have to deal with it again :p

require('vis')

vis.events.subscribe(vis.events.INIT, function()
    vis:command('set autoindent')
    vis:command('set number')
    vis:command('set cursorline')
    vis:command('set colorcolumn 78')
    vis:command('set theme default')
    vis:command('set ignorecase')
    vis:command('set wrapcolumn 78')
end)

local modes = {
	[vis.modes.NORMAL]           = ' NORMAL ',
	[vis.modes.OPERATOR_PENDING] = '',
	[vis.modes.VISUAL]           = '󰩭 VISUAL ',
	[vis.modes.VISUAL_LINE]      = '󰩭 VISUAL ',
	[vis.modes.INSERT]           = ' INSERT ',
	[vis.modes.REPLACE]          = '󰬳 RPLACE ',
}

local function encoding(file)
	local content = file:content(0, file.size)
	if content and content:find("\r\n", 1, true) then
		return "dos"
	else
		return "unix"
	end
end

vis.events.subscribe(vis.events.WIN_STATUS, function(win)
	local left_parts = {}
	local right_parts = {}

	local file   = win.file
	local size   = file.size or 0
	local sel    = win.selection
	local pos    = sel.pos or 0

	local mode = modes[vis.mode]
	if mode ~= '' and vis.win == win then
		table.insert(left_parts, mode)
	end

	table.insert(left_parts, (file.name or '[No Name]') ..
		(file.modified and ' [+]' or '') .. (vis.recording and ' @' or ''))

	table.insert(right_parts, ' ' .. (win.syntax or 'undefined') .. ',' ..
		encoding(win.file) .. ' ')
	table.insert(right_parts, '󰉢 ' .. (size == 0 and "0" or math.ceil(pos/size*100)) .. '% ')
	table.insert(right_parts, '('.. sel.line .. ',' .. sel.col .. ')')

	local left = ' ' .. table.concat(left_parts, "") .. ' '
	local right = ' ' .. table.concat(right_parts, "") .. ' '
	win:status(left, right);
end)

local spellcheck = require('plugins/vis-spellcheck')
spellcheck.default_lang = "en_US"

--local colorizer = require('plugins/vis-colorizer')
--colorizer.three = true -- (optional) diables three digit hex colors
--colorizer.six   = true  -- (enabled by default) six digit hex colors

That configuration renders my script this way:

Vile

Quoting vile website

vile retains the “finger-feel”, if you will, of vi, while adding the multiple buffer and multiple window features of emacs and other editors.

On OpenBSD, the installation goes pkg_add vile and running the software is as simple as using vile.

vile lacked proper UTF-8 rendering, on my computer™. Also providing horizontal split only and no visual mode selection annoys me a bit. That said, it seems to provides options for massive customization.

The configuration is located in ~/.vilerc.

set ruler
set showmode

" Enable Syntax Highlighting
source filters.rc

" Enable Spell Checker
source "spell.rc"

" Custom status bar
setv $modeline-format="%i %f %= %M 󰉢 %p%% (%l,%c)"

and looks like this:

Elvis

According to The Elvis Text Editor website

Elvis is a very powerful vi/ex clone providing a remarkable number of bells and whistles.

OpenBSD provides version 2.2.0 via pkg_add elvis than can be run using elvis.

During my testings, it only partially rendered UTF-8 characters. Some glyphs were properly displayed, some not. Also accented characters rendering is not that stable. That’s a pity ‘cause that would really have rocked the house!

To avoid mixing configuration between vi and elvis, configuration should go into ~/.elvisrc.

set guidewidth=80
set number
set ruler
set showmode
set show=file
set textwidth=78

" Vim accent inspired
set background=dark

color normal    default
color idle      default
color bottom    default
color lnum      gray
color showmode  green boxed
color ruler     like showmode
color selection yellow boxed
color hlsearch  like selection
color hlobjectn like selection
color spell     red boxed
color fold      blue boxed
color header    magenta

color specialkey magenta
color nontext    like specialkey
color extends    like specialkey

color comment   gray
color string    green
color char      like string
color regexp    yellow
color regsub    yellow
color number    like string
color keyword   like normal
color other     like normal
color function  like normal
color variable  like normal
color prep      like normal
color prepquote cyan
color doc       gray
color docmarkup like doc
color docindent like doc
color kindk     cyan
color libk      cyan

The rendering of my test script goes like this:

EVi

The EVi Codeberg project page states

EVi is an advanced modal text editor designed for programmers and system administrators. It is a hard fork from Vim v9.1.0 (Jan 2024), created to build further upon the foundations of Vim while avoiding the use of AI entirely.

It is not available in OpenBSD’s port at the time of writting. But it seems to be compiling with ease.

# git clone git clone https://codeberg.org/evi-editor/evi.git
# cd evi
# ./configure --prefix=$HOME/.local --enable-gui=no
# make

Running it from the source directory makes it miss some default configuration files and features. But when run using the -u ~/.vimrc, it basically mimics vim behaviour and customizations.

Once installed, it renders and behave the exact same way as LLM tainted Vim.

Comparison table

Displayed in not particular order, this is how those editor match my requirements, likings and interest points:

VimViNviElvisVisVileNeatviVim-ClassicEVi
vi compatibleYYYYYYYYY
UTF-8YNY~Y~NYY
SyntaxYNNYYYYYY
Basic RegExYYYY~Y.YY
Visual ModeYNNYYY.YY
StatusBarYYYYYY.~Y
Split ViewYNNN~~.YY
Diff ViewYNNNNN.YY
SpellCheckYYYYYY.YY
Color CodesYNNNYN.YY
Mouse free~YYYYYY~~

Legend for this table goes: Y(es, working on my computer), N(ot featured), ~(kinda supported), .(untested).

Hope this helped you. Make your own mind. I already made mine. Cheers!