📝

Vimの元となったテキストエディタ、STEVIEをLinuxで動かす

2024/12/21に公開

この記事はVim Advent Calendar 2024の21日目の記事です。

STEVIEというテキストエディタがあります。
STEVIEは1987年にTim Thompsonさんという方が開発したAtari ST用のviクローンのテキストエディタで、VimはこのSTEVIEを元に開発されたテキストエディタとなっています。

https://timthompson.com/tjt/stevie/
https://vim-jp.org/vimdoc-ja/intro.html#credits

STEVIEはどのような機能を有するテキストエディタなのでしょう。
STEVIEのソースコードは作者の方のホームページ上で公開されていて、
少しの変更を加えることでLinuxで動かすことができます。
この記事ではSTEVIEを動かすにあたっての手順、およびSTEVIEの機能について紹介します。

ビルド手順

コンパイラ、依存ライブラリ、ビルドツールの入手

STEVIEのソースコードはCで書かれているのでgccを、
また、依存ライブラリとしてcursesとtermcapに依存しているのでその2つを、
そして、ビルドツールとしてmakeが使われているのでmakeを入れます。
入手方法はLinuxのディストリによって異なりますが、
Ubuntu24.04であれば、次のコマンドでbuild-essentialとlibncurses-devをインストールすると揃います。build-essentialにはgccとmake、libncurses-devにはcursesとtermcapが含まれています。

apt install build-essential libncurses-dev

ソースコードのダウンロード

STEVIEのソースコードは次のページのリンクにある、
stevie.orig.1of2stevie.orig.2of2の2つに入っています。
この2つをダウンロードします。

https://timthompson.com/tjt/stevie/

2つはシェルスクリプトになっていて、
2つとも次のようなコードが連続したスクリプトとなっていて、
実行することでソースコードがカレントディレクトリに展開されます。

if test -f 'ファイル名'
then
  echo shar: will not over-write existing file "'ファイル名'"
else
cat << \SHAR_EOF > 'ファイル名'
ここにファイルの中身
fi # end of overwriting check

ソースコードを展開したいディレクトリにて、
stevie.orig.1of2stevie.orig.2of2の2つをそのディレクトリに配置し、
次のコマンドを同じディレクトリにて実行してソースコードを展開します。
内容については確認済みですが、一応内容を確認の上実行ください。

sh stevie.orig.1of2
sh stevie.orig.2of2

展開すると次のファイルが展開されるはずです。
これらのファイルが展開されていれば成功です。

Makefile
README
cmdline.c
edit.c
help.c
hexchars.c
linefunc.c
main.c
misccmds.c
normal.c
stevie.h
window.c

ソースコードの微調整

stevie.h、hexchars.hを微調整する必要があります。
stevie.h、hexchars.hに対して次の差分を適用します。

stevie.hについては、動作環境に応じて#defineの部分をコメント・コメントアウトする箇所があり、
ATARI、UNIXPC、TCAPのいずれか1つだけをコメントアウトする形になっているのですが、
デフォルトではATARIがコメントアウトされておりAtari ST向けにビルドされる形になっているので、
次のようにATARIとある行をコメントアウトします。
ATARI、UNIXPC、TCAPの全てがコメントアウトされる形になりますが、
MakefileのCFLAGS = -DTCAPの部分の指定でTCAPが定義済みの状態になるので、
stevie.hについてはコメントアウトするだけで大丈夫です。

stevie.h
9c9
< #define ATARI   1 /* For the Atari 520 ST */
---
> /* #define ATARI    1 /* For the Atari 520 ST */

次にhexchars.c、こちらはSegmentation Faultで落ちる箇所があるので該当部分をコメントアウトします。
この部分は、制御文字などの表示ができない文字を[文字コード]の形式で表示するためのテキストを埋めているところになりますが、この部分はコメントアウトしてしまっても、制御文字などの表示が[XXX]固定になるだけなので、ちょっと動作確認する分には問題無いです。

hexchars.c
287c287
< 		sprintf(++p,"%03o]",n);
---
> 		// sprintf(++p,"%03o]",n);
305c305
< 		sprintf(++p,"x%02X]",n);
---
> 		// sprintf(++p,"x%02X]",n);
323c323
< 		sprintf(++p,"%3d]",n);
---
> 		// sprintf(++p,"%3d]",n);

ビルド

Makefileがあるのでmakeを実行するだけです。
次のコマンドでビルドします。

make

次の場所にバイナリができていれば成功です。

src/stevie

動作確認

次のコマンドを実行します。第一引数にはファイルパスを指定します。

src/stevie hello.txt

早速Hello World!と書いてみましょう。
挿入モードに入ってHello World!と入力し:wqで保存終了します。
動かなくなってしまったら<C-c>を連打して抜ければ大丈夫です。


あとは終了後にファイルの内容を確認して大丈夫であれば大丈夫です。

大丈夫そうですね。

機能

STEVIEの実行中にHキーを入力するとヘルプを確認できます。
ヘルプはページが分かれていて、スペースキーを入力で次のページへ、他のキーを入力でヘルプを閉じるようになっています。全ページの内容を展開すると次のようになっています。

   Cursor movement commands
   ========================
   control-l         Redraw screen
   control-d         Cursor down 1/2 screen
   control-u         Cursor up 1/2 screen
   control-f         Cursor forward 1 screen
   control-b         Cursor back 1 screen
   control-g         Give info on file

      h              Cursor left 1 char
      j              Cursor down 1 char
      k              Cursor up 1 char
      l              Cursor right 1 char
      $              Cursor to end of line
      ^ -or- 0       Cursor to beginning of line
      b              Cursor back 1 word
      w              Cursor forward 1 word
      [#]G           Goto line # (or last line if no #)

    Modification commands
    =====================
    x           Delete 1 char
    dw          Delete 1 word
    D           Delete rest of line
    [#]dd       Delete 1 (or #) lines
    C           Change rest of line
    cw          Change word
    cc          Change line
    r           Replace single character
    [#]yy       Yank 1 (or #) lines
    p           Insert last yanked or deleted line(s)
    P              below (p) or above (P) current line
    J           Join current and next line
    [#]<<          Shift line left 1 (or #) tabs
    [#]>>          Shift line right 1 (or #) tabs
    i           Enter Insert mode (<ESC> to exit)
    a           Append (<ESC> to exit)
    o           Open line (<ESC> to exit)

    Miscellaneous
    =============
    .           Repeat last insert or delete
    u           Undo last insert or delete
    /str/       Search for 'str'
    ?str?       Search backward for 'str'
    n           Repeat previous search
    :.=         Print current line number
    :$=         Print number of lines in file
    H           Help

    File manipulation
    =================
    :w          Write file
    :wq         Write and quit
    :e {file}   Edit a new file
    :e!         Re-read current file
    :f          Print file into (current line and total # of lines)
    :f {file}   Change current file name
    :q          Quit
    :q!         Quit (no save)

VimにあってSTEVIEに無い操作はもちろんいくつかありますが、
基本的に同じになっていますね。Vimの操作が分かればすぐ把握できると思います。

また、回数指定、 モーション、ドットリピートなどはそれぞれ、
回数指定はddやyyなど一部操作についてのみ、モーションはwとして限定的に存在、ドットリピートは挿入削除についてのみと、
いずれもVimで概念として一般化された操作になっていることが伺えます。

まとめ

このように、STEVIEは少しの変更でビルドし実際に試せるものとなっています。
試してみると、変わっていないところや共通点が見れて、きっと面白いと思います。

STEVIEの作者のTim Thompsonさんは、
ソフトウェアエンジニア、ミュージシャン、インスタレーションアーティストの方なのだとか。
ホームページには様々な作品が載せられているので、ぜひお立ち寄りください。

https://timthompson.com/

Discussion