テキスト配置ツール

字下げツール貼付ツール を作ったときの部品を使っての、テキストを配置するツールです。

この手のCUIなテキスト物のツールは、漢字の扱いの敷居が高かったりします。 4年前に作ってた CUI14 でも、ASCIIコードの範囲内に留まっていました。

字下げツール では、nkfコマンドのお力を借りてpythonから実行するなど、 ボチボチと漢字チャレンジの機運が高まってきました。 ここらで、漢字でもOKな「使えるツール」を目標に作ってみました。

端末や保存するテキストファイルの漢字のエンコーディングは、UTF-8 以外でもOK。 当然ながらnkfコマンドが使える環境が前提です。

一応、python2でもpython3でも動くよう気をつけてます。

字下げツールの時の部品は、以前のAPIは残しつつ、ちょこちょこ機能追加してます。



バージョン1

$ tar xzf argmnt_v1.tgz
$ cd argmnt

データファイルは毎度お馴染みのYAML形式。

最初は種になる文字列のリストだけです。

txt.yaml

$ cat txt.yaml | nkf -g
ISO-2022-JP

$ cat txt.yaml | nkf -u
- 資料1
- 連邦
- - ホワイト
  - ぺース
- ガンダム
- ガンキャノン
- カンタンク
- アムロ・レイ
- ジオン
- ザク
- グフ
- ドム
- |
  シャア・
  アズナブル
# EOF

「ホワイトべース」の箇所のように、リストのリストにすると 複数行の「かたまり」になります。

「シャア・アズナブル」の箇所のように、 YAML形式で文字列に「改行」を入れても同様です。

ツール本体は argmnt.py で、このYAMLデータを標準入力で受けとります。

YAMLデータの漢字エンコーディングと、端末の漢字エンコーディングが異なるときは、 貼付ツール と同様に-oのあとにnkfのオプションに従った1文字で指定します。

$ cat txt.yaml | ./argmnt.py -ou > save.yaml

argmnt.py を実行すると、文字列が表示されるので、編集します。

操作は基本的に、 矢印キーでカーソル'+'を移動して、 ENTERキーかスペースキーで選択。 終了は'Q'キー。

編集結果のデータは、YAML形式で標準出力に出されるので、 リダイレクトで保存用のファイルに落とします。

貼付ツール のように、ファイルを指定して上書き保存するようにしたいところですが、 未だ対応できてません。

編集の操作「移動」

文字列データの途中追加

結果のテキスト出力

枠の追加

枠の種類の定義は argmnt.py 冒頭の frm_info の箇所

$ head -20 argmnt.py
#!/usr/bin/env python

import sys
  :
import txview
#import dbg

frm_info = {
        '': '   ',
        'a': '+-|',
        'b': ' -|',
        'c': '===',
}

枠のリサイズ

枠内の文字列の配置

複数行の文字列のときの寄せ

TODO


バージョン2

v2.patch

$ cat v2.patch | patch -p1

カーソル移動でpage up/downキー対応

page up/downキーで、画面ビューの見えてる範囲で上下の端まで移動。

'^'と'$'、C-aとC-eで、同様に左右の端まで移動。

v1で処理は入ってましたが、矢印キーの扱いの都合で封印されていました。

スペースキーは決定の扱いに専念してもらい、page downは'F'キーに変更しました。

key.py でスペースキーの扱いをちょっと変えましたので、ins.py で操作性にちょっとだけ影響が出ます。

選択動作時、カーソルが枠と文字列の間のスペースにあるときは、反応しないようにする

対応してみました。

これで下に重なってる部品でも、見えていれば選択できるようになりました。

重なってるときは見えてる方が選択されるようにする

下に隠れている側が選択されていましたが、 表示順と、選択時のサーチ順が、逆になるようにして対応してみました。

データYAMLファイルを上書き更新できるように

貼付ツール と同様に、コマンド引数でファイルパスを指定可能にしました。

ファイルパスに'-'を指定したり、指定が無ければこれまで通り、標準入力を使います。

編集後のYAMLデータは基本的に、標準出力に出しますが、 これまた 貼付ツール 同様に -i オプションを付けると、標準出力には出さずに入力ファイルを上書きします。

TODO


バージョン3

v3.patch

$ cat v3.patch | patch -p1

移動やリサイズで不要な描画を省く

ちょっとトライしてみたのですが、描画がかえって遅くなってしまいました。 ( v2_5_rects_heavy.tgz )

画面表示の更新が必要な領域を、重複しない複数の矩形に細かく分割し、 なるべく不要な描画を避けるようにして試してみましたが、明らかに動作が重くなってしまいました。

細かな矩形ごとにtxbufを生成して、全オブジェクトから領域にかかるものを判定して、描画させてたので、さすがに重かったようです。

なので一旦バージョン2の描画処理に戻し、端末に出力するところだけ、まとめて出すようにして、少しだけキビキビ感を出してみました。

直線を描けるように

対応を少しだけ入れてみました。

直線の平行移動

TODO


バージョン4

v4.patch

$ cat v4.patch | patch -p1

"-iでファイルを上書きするときにバックアップファイルを作るように"

貼付ツール の "-i" と同様にバックアップファイルを残すようにしてみました。

上書きするときは、オリジナルのファイルを xxx.0 のファイル名で残します。 もし xxx.0 があれば xxx.1, 2, 3... と増えます。

"-txtでも直線を出力できるように"

対応しました。

直線の始点、終点で、矢印表示を選べるように

直線を削除できるように

まとめて対応してみました。

TODO


バージョン5

v5.patch

$ cat v5.patch | patch -p1

単独の「枠」だけを追加できるように

単独の「枠」の平行移動

単独の「枠」の種類の変更、削除

単独の「枠」のリサイズ

単独の「枠」のリサイズで、カーソルの最初の位置が頂点じゃなときは、 ちょっと独特な動作になってしまいました。

頂点まで移動してしまうと、「頂点以外な状態」に戻れません...

が、さほど害は無さそうなのでOK

- p:

TODO


バージョン6

v6.patch

$ cat v6.patch | patch -p1

直線を上か左向きに描き始めると、始点がズレるバグの対策

対策しました。

その他コードを整理して rect.py txbuf.py へのれん分け。

直線を変形できるように

単独の「枠」のリサイズの時と同様に、 カーソルの最初の位置が頂点じゃなときは、 ちょっと独特な動作になってしまいました。

作った本人ですら、どう変形するのかピンときてません。 変形させるより、削除して作りなおした方が簡単かも...

TODO


バージョン7

v7.patch

$ cat v7.patch | patch -p1

枠サイズ変更のとき裏でカーソルも移動させておく

対応してみました。

オブジェクトがコピぺできるように

対応してみました。

ペースト直後は、移動不要の場合でも、 矢印キーで多少移動して位置を決めた方が、モード遷移が少なく楽です ;-p)

TODO


バージョン8

v8.patch

$ cat v8.patch | patch -p1

直線の変形で始点、終点の移動で頂点を通り過ぎると表示が乱れるバグの対策

対応しました。 ちょっと怪しいので、まだ他にも何か出るかも...

重なったときの前後関係を調整できるように

対応してみました。

ESCキーでいろいろキャンセルできるように

対応してみました。

これで選択解除状態にするのに、ENTERキーかスペースキーを連打して、モード遷移しまくっていたのが、 ESCキー一発で済むようになりました。

直線や単独の矩形の削除についても バージョン7 で「カット」に対応しているので、 種別を「なし」の状態に設定しなくても選択して'x'キー一発でOKです。

TODO


状態遷移図

せっかくなので、本ツールで本ツールの状態遷移図を描いてみました。

このサイズ感だと作成はかなり困難で、くたびれました。

カーソル移動の範囲が広いと、なかなか辛いものがありますね。

テキストの追加が「その場」で出来ないので、 いちいち「終了」「YAMLの編集」「起動しなおし」しなければならず。 改善の余地ありですね。

preタグでテキストを貼り付けて試してみたのですが、 手持ちの環境のブラウザで見ると、 フォントのスペースの幅が等幅になっておらず、 表示が揃いませんでした。orz

端末の画面の動画でお茶を濁しておきます。;-p)


バージョン9

v9.patch

$ cat v9.patch | patch -p1

"-oのあとにnkfのオプションに従った1文字指定の不具合対策"

対策しました。

直線の種類選択で最初の1つ矢印は終点側の方に

対応しました。

カーソルやオブジェクの移動やリサイズの刻み幅を可変に

ただし、タブキーで刻み幅変更モードに移れるのは、次のモードからだけにしました。

また、これらのモード以外では、矢印キーによる動作は従来通りです。

なので例えば、刻み幅を2に変更してる状態でも、 種類の変更で矢印キーで、2ついっぺんに種類の候補が進められる事はありません。

TODO


バージョン10

v10.patch

$ cat v10.patch | patch -p1

オブジェクトをグループ化してまとめて移動できるように

かなり盛大に変更してしまいました。

エスケープキーによるキャンセルの動作が、 従来のものから多少変わってしまってます。

エスケープキー1回ではカーソル移動モードまで戻らず、 各種の選択モードまで戻って、やり直せます。

逆に、操作がややこしくなってしまいましたが、 エスケープキー連打でキャンセルすると、カーソル移動モードに戻れるはずです。

TODO


バージョン11

v11.patch

$ cat v11.patch | patch -p1

複数選択後にグループ化したり、解除したりできるように

'g'キーによるグループ化や、'u'キーによる解除は、次の状態のとき有効になります。

既にグループ化されたものと、グループ化されていないものを複数選択して'g'キーを押すと、 入れ子の状態にグループ化されます。

解除のときは、複数選択しなくても、単にグループ化されたオブジェクトを1つ選択して'u'キーでOK。

グループ化されたいくつかのオブジェクトを複数選択して'u'キーを押すと、それぞれのグループが解除されます。

グループ化されたもの、されてないものをおりまぜんて複数選択して'u'キーを押すと、 グループ化されているものだけ解除されます。

入れ子でグループ化されているものは、一度では解除できません。 上のレベルから順に解除の操作を繰り返します。

動的に(漢字の)文字列の追加が出来るように

起動するとncコマンドでポート番号44317で待つようにしてみました。

別の端末から、ncコマンドでこのポートにつないで文字列を書き込み、接続を切ると文字列が追加されます。

改行が含まれていると反映されます。

ncコマンドなのでネットワーク上の別のマシンからでもOK

ポート番号はコマンド引数の -p xxxx で指定すれば変更できます。

デフォルトのポート番号は「適当」です。(バース、掛布、真弓)

TODO


バージョン12

pythonのユーティリティ・プログラム 2020冬 にterm.pyを追加してみました。

kon_utのソースを使うようにバージョン12として少し書き換えてみました。

v12.patch

$ cat v12.patch | patch -p1 ]]

などのkon_utに既に吸収されているファイルは、 kon_ut側を使うので廃止です。

ここまでの最新版をダウンロードしてして生成するスクリプトを用意しました。

dl.sh

実行するとカレントディレクトリに、argmnt/ ができます。

$ cd $SOME_WHERE
$ wget http://kondoh.html.xdomain.jp/argmnt/dl.sh
$ chmod +x dl.sh
$ ./dl.sh

$ cd argmnt
  :