Joe's Own Editor (joe) に行コピーと行複製を追加する

投稿日:

Joe's Own Editor (joe) に、行コピーと行複製のキーシークエンスを追加する方法について。

Symptom

発端はエディタ上で日々 C-k (kill-line) + C-y (yank) を叩いていることに気づいたから。カーソル行をコピー(もしくは複製)するという操作は意外と多いが、そのために一度行を消したり、あるいはMarkを付けなければならないのは非効率だ。

そうして考えてみると C-w に対する M-w のように、 M-k 相当のコマンドがないというのは意外な話だ。同じ事を考えている人は多いようで、 emacs の場合はこちらに copy-line-as-kill 相当の関数と duplicate-line 関数を定義する方法が示されている: https://www.emacswiki.org/emacs/CopyingWholeLines

というわけで joe (jmacs) にも実装してみよう。

Resolution

私は emacs-like なモードである jmacs を利用しているので、 ~/.jmacsrc を編集することになる。まだ作成したことのない場合は、最初に /etc/joe/jmacsrc をコピーして用意する必要がある。

cp /etc/joe/jmacsrc ~/.jmacsrc

このファイルは単なる設定ファイルというよりも、キーシークエンスに対するマクロの定義が全て記載されているファイルという方が正しい。このファイルの :main セクションの中に以下のようなマクロを追加すればいい。

:main           Text editing window
:inherit windows
  :                                      # (snip)
delch   .kD Delete character
delch   ^D
deleol  ^K  Delete to end of line
markl,copy,nmark            ^[ k    Copy line       # これを追加 (M-k)
markl,copy,nmark,bol,yank   ^[ K    Duplicate line  # これを追加 (M-K)
delw    ^[ d    Delete word
delw    ^[ D    Delete word
dnarw   .kd Go down

コマンド、キーシークエンス、コメントは タブ区切り でなければいけないことに注意。
上記の記載はスペースに変換されてしまっているので修正が必要になる。

Detail

文法としては、コマンドを追加したいセクションに対して、タブ区切りで以下の内容を記述する。

  1. joe が認識できるコマンド列(カンマ区切りで実行順に並べる)
  2. キーシークエンス
  3. コメント

今回追加したキーシークエンスのうち、後者を具体的に解説すれば以下のようになる。

markl,copy,nmark,bol,yank   ^[ K    Duplicate line
-------------------------------------------------------
markl : カーソル行をマーク
copy  : コピー
nmark : マーク解除
bol   : 行頭 (beginning of line) にカーソルを移動
yank  : ペースト
^[ K  : マクロを割り当てるキーシークエンス (M-K)
Duplicate line : コメント

このコマンド列は M-x のミニバッファに直接入力するものと同等だ。試したいときも M-x で入力すればいい。

というか最近 joe (jmacs) に構い過ぎな気がする。