📝

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が含まれています。

sudo apt install build-essential libncurses-dev

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

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

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

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

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

ソースコードを展開したいディレクトリに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の定義がコメントアウトされており、Atari ST向けにビルドされる形になっているのでアンコメントします。
ATARI、UNIXPC、TCAPの全てがアンコメントされる形になりますが、
TCAPが定義済みになるようにMakefileで指定がされているので問題ありません。

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

hexchars.cについては、次の差分を適用します。
この箇所は、制御文字などの表示ができない文字を[ASCIIコード]の形式で表示するための文字列を組み立てている箇所になりますが、
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を実行するだけです。
Makefileのあるディレクトリに移動し、次のコマンドを実行します。

make

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

src/stevie

動作確認

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

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/

脚注
  1. 第一引数のファイルパスは必須です。 ↩︎

  2. 表示が崩れている場合、描画範囲が不足している可能性があります。STEVIEは横80縦25を描画範囲として必要とするので、それ以上の横幅縦幅が必要です。 ↩︎

Discussion