2022年12月26日

【薙刀式】Vimと編集と文字

エンジニアの間でよく使われているVimというエディタがある。
僕が昔使ってたemacsより使われてる気がする。

配列を変えようぜ、というときにVimが障壁になるのが、
自作キーボード界隈でよく話題になるので、
一体どういうエディタなのか調べてみた。
これは面白い操作法だ。



まず基本が、
アルファベットを打つとカーソルが動いたり、
編集したりするモードだ。
ctrlとかカーソルなどの遠いほうに手を伸ばす必要がなく、
アルファベット(qwerty前提の配置)で、
カーソルを中心とした操作をする。
一文字だけでなく二文字アルファベットによるコマンドもある。

有名なのはhjklで←↓↑→になるカーソル移動だけど、
gj、gkで、表示行単位での移動をする。
ほう、これは使いやすそうやん。

WindowsではPgUpとPgDnだけど、
ページ先頭で止まる仕様だから、
いっそ「表示行単位での移動」のほうが使いやすそう。

で、文字入力に入るにはiを押して、
ようやく文字入力モード(インサートモード)になる。
文字を入力し終えたらEscでまた元のモード
(ノーマルモード。編集の方がデフォルト)になる。


つまり、
アルファベットによる編集操作をデフォルトとして、
文字入力はひとつの特殊モード、
という基本思想があるようだ。

ほほう。
これは斬新な考え方だと思った。


デフォルトで文字打ち、
ctrlを押しながら編集操作だと、
編集操作のショートカットが豊富になればなるほど、
ctrlうっとおしいな、ってなるんだよね。

emacsではA横にctrlがある前提で、
ショートカットのバインドが組み立てられているが、
編集操作しまくればしまくるほど、
小指が痛くなるんだよ。
それが欠点だと思っていた。


Windowsでは余計ctrlが遠く、
あんな位置でショートカットを使いまくれるはずがない。

Macの文字操作では、
A横のctrlを前提としたemacsバインドが使えて、
流石に使いやすいと思ったが、
emacsの抱えている問題、
A横のctrl使いすぎて小指痛くなる問題を思い出した。

これらに比べると、
デフォは編集モード、
文字入力は特殊モードに入ります、escで抜けます、
という編集操作メインの、
いわばコードの切り貼りのしやすいエディタのほうが、
コーティングには合理的だなあと思った。

ちなみにVimの操作体系はこんな感じ。
http://archiva.jp/web/tool/vim_basic.html
%で対応する括弧へ移動とか便利そう。


エンジニアが「文字なんてそんなに打たないよ」
っていうのはよく聞く。
変数名やコマンドは、
補完入力があるからだ。

これはemacsでもあったな。
この文書内にある、スペースや記号で区切られたすべてのものを、
単語として記憶していて、
数文字打ってtab打ったら補完してくれるんだよね。
複数候補があるときはtab連打なのは、
Windowsの予測変換と同じ。

あと多くはコピペでコードを持ってくるからだ。
Githubはエンジニアたちのコードを集めたサイトで、
無料ライブラリ集であると考えることもできる。
こうしたオープンソースの考え方が、
僕は社会主義的でおもしろいと思っている。

これらが前提だと、
コーティングでの文字打ちなんてほとんどない。


だから、
アルファベット数文字を打ちながら、
escとtabさえ押せればよく、
あとはqwertyバインドのアルファベットで編集をひたすらする、
というのがVimコーティングであると言って良いわけだ。

自作キーボードにおいて、
親指位置にescとtabを持ってきているのは、
間違いなくVimmerである。

僕はそんな使わないキーなのにと思ったが、
「Vimでは生命線、ctrlとかshiftより」
と聞いたので、今回ちゃんと調べて成程と理解した。

自作キーボードでも、
小指の左列を削らずに、escとtabとctrlとshiftを、
頑なに置いてある例が多いけど、
これが前提なんだな。




編集操作メインであれば、
こういうキーボードの使い方があるんだなあ、
と非常に興味深い。

文字入力がデフォルトで、
辺境のctrlを押しながらえっちらおっちらしながら、
編集操作にかまけるのと、
対照的な世界だと思った。


ちなみに薙刀式では、
編集モードに入るには、
「人差し指と中指(中段、下段)を押したまま」
というルールがあり、
ctrlみたいな遠い位置よりも、
DF、JK、CV、M,のほうが近いよな?
という立場を取っている。

で、編集モードの中の動線も、
コーディング用ではないにせよ、
縦書き文章を切り貼りするのにめちゃくちゃ便利なので、
Vimmerほど編集を理解してる人なら、
逆に普及できるのでは、などと思ってしまった。



今後は、
「Vimが…」という人に出会ったら、
IMEオンで日本語配列に切り替えて、
EscでIMEオフしてqwertyに戻るようにすれば?
と提案してみるか。
日本語を使う時は注釈を書き込む時だけだから、
そんなに使わないのだろうけれど、
コーティングだけが仕事じゃないから、
日本語のみの配列を変えることは、
受け入れられやすいかも知れない。
posted by おおおかとしひこ at 11:04| Comment(2) | TrackBack(0) | カタナ式 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
> 「Vimが…」という人に出会ったら、IMEオンで日本語配列に切り替えて、EscでIMEオフしてqwertyに戻るようにすれば?と提案してみるか。

そこは「日本語の入力に関しては Google IME / mozc を使って新下駄配列などを提案してみるか」ではないでしょうか\(^o^)/

…というのは半分ぐらい冗談なのですが、残り半分は本気だったりします。以下は日常的にターミナル (シェル) 環境と Vim を使っている人間としてのコメントです:

> IMEオンで日本語配列に切り替え
> EscでIMEオフしてqwertyに戻る

* その方法だと (IME の前の段階で実装する場合) コンテクストのスイッチとの兼ね合いが難しくなるかと。例えばウィンドウ A で Vim を起動して日本語を入力していて、Alt-Tab でウィンドウ B に移動したけれど、そこでは日本語の IME がオンになっているかは分からない、といった状況が考えられるかと (例えば ASCII なファイル名を入力するとか、ブラウザーでナビゲーションを行うなど)。逆も然りで、ウィンドウ A が非日本語をになっている状態でウィンドウ B に移動したけれど、そこでは既に日本語の入力がオンになっているというのも考えられます。
* Vim ではネイティブに "Ctrl-[" で normal mode に戻ることができますし、それ以外にもユーザーが独自に normal mode へ戻るバインドを設定することができます (有名かも知れないのは jj を素早く押すことで normal mode に戻るなど)。同じユーザーが複数のバインドを使うことも考えられるため (例えば私自身がそうです)、このようなバインド全てを QWERTY モードに戻るスイッチとする必要がありますが、それはつまりこれらのバインドが本来の日本語の入力では使えないことを意味します。
* ソフトウェアとして key-code を変更するというソリューション (私が key-code hack と呼んでいる手法) だと、日本語の IME がオンになっているかどうか調べることもできはする (例えば oyainput の実装) のですが個人的にはこれにも問題があると考えていて…
** IME の状態を調べにいく計算機的なコストが (多分) 高い -- 例えば oyainput では調べるためのプロセスを作っているのですが、これってストローク毎に作るのは (多分ストレスなく使えるのでしょうが) 大変なのではないかなと考えたり (https://github.com/inwskatsube/oyainput/blob/master/src/functions.c#L138)
** そもそも日本語 IME に備わっている「直接入力」のことを完全に無視している -- このような手法は IME 内部の直接入力モードに全く対応いていなくて、IME 側でその時の入力モードを教えるようなインターフェースを提供していない場合 key-code hack 側のプログラムがどんなに頑張っても「日本語 IME のオンオフだけ」で配列の判断を強いられることになります。これは個人的に辛い (なぜかと言うと、日本語の IME がオフになると確定前のひらがなが削除されてしまうという実装を見てきているから)。

このような考え/経験は私が mozc のソースコードを読み始める前に (改造した xkeysnail で新下駄配列を実装して使っていた時に) 得たものだったりします。結論としては「やっぱり IME に手を出さないといけない」というものでした。上記の問題は IME/IMF に任せると全て解決する類のものであると私は認識しており、実際 mozc ベースの新下駄配列にしてから IME の状態とコンテクスト関連で悩むことはなくなりました。
Posted by Akira K. at 2022年12月27日 09:59
>Akira K.さん

まあ結論はそうなりますよねえ。

DvorakJでも定期的にIMEの状態を読みに行っていて、
モードずれを適宜修正しています。
当然負荷があって、50msおきにすると動作がモッサリして、
200msだと動作は軽くなるけど、
IMEオンオフしたときの返しが遅くなります。
ここは痛し痒しなところ。
最近LANG1と2の明示的オンオフがWindowsで対応したので、
モードずれの心配がだいぶ無くなりましたね。

自分で設定できるなら、
escに、escかつIMEオフ(qwertyにもどる)、
iでIMEオフのまま何かしらの配列オン、
iiでIMEオンで何かしらの配列オン、
などのようにすればいいのかな。

qmkならダブルタップを認識するのでiiとしたけど、
自作キーボードなら親指に3つ並べるなどもできるか。


てなことを考えると、IMEで全部やってよ、
という方が実装面では優れるでしょうねえ。

そもそも「Vimが」という需要を分かってなかったので、
そういうことだったのか、が分かってスッキリな感じです。
Posted by おおおかとしひこ at 2022年12月27日 12:38
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック