2015年04月03日
1 ページの爽快感 - 屏風のような仮想端末ユーティリティ tcvt
仮想端末(ターミナル)でコーディングやシステム管理を行うとき、1 ウインドウがもっと縦に広ければ見通しが良くて作業が捗るのにな、と思ったことありませんか? 今日ご紹介する tcvt は1つのページを複数のカラムで構成してくれる Python で記述された仮想端末ユーティリティなんですよ。

tcvt のインストールと設定
tcvt は screen(byobu)、tmux のようなターミナル・マルチプレクサではありません。 仮想的に端末を分割しますがそれらは独立してはおらず常に1ページとして動作します。 うーん、よくわからないかもしれませんね。
使ってみるのが一番わかりやすいかも。 早速 GitHub からコードをクローン、インストールしてみましょうか。
これでインストールはおしまいなのですが、僕の環境(Ubuntu MATE/14.04)では tcvt のシバン(Shebang) で指定している python3 ランタイムでは tcvt が上手く動きません。 そこで単純な python、つまり Python 2.7 系へ変更しておきます。
まず、今ボクが抱えている問題を見て下さい。 次の例では apache2.conf をエディタで開き、編集を始めようとしているのですが、端末右側にデッドスペースが存在しており、縦方向に長く伸びるドキュメントを効率良く表示できていません。
上の例では 4 つのカラムを設定しており、僕の環境では top コマンドで表示されるプロセス・リストを 1 ウインドウで見ることができます(生まれて初めて対話モードの top を 1 ページで見たゾ・・・)。
ほらね。
# clone code.
$ git clone https://github.com/muflax/tcvt
Cloning into 'tcvt'...
remote: Counting objects: 121, done.
remote: Total 121 (delta 0), reused 0 (delta 0), pack-reused 121
Receiving objects: 100% (121/121), 23.11 KiB, done.
Resolving deltas: 100% (68/68), done.
# install tcvt
$ cd tcvt
tcvt $ sudo make install
[sudo] password for netbuffalo:
install -d "/usr/local/bin"
install -d "/usr/local/share/man/man1"
install -m755 tcvt.py "/usr/local/bin/tcvt"
install -m755 optcvt.sh.transformed "/usr/local/bin/optcvt"
install -m644 tcvt.1.gz "/usr/local/share/man/man1/tcvt.1.gz"
ln -sf tcvt.1.gz "/usr/local/share/man/man1/optcvt.1.gz"
これでインストールはおしまいなのですが、僕の環境(Ubuntu MATE/14.04)では tcvt のシバン(Shebang) で指定している python3 ランタイムでは tcvt が上手く動きません。 そこで単純な python、つまり Python 2.7 系へ変更しておきます。
$ sudo vi /usr/local/bin/tcvt
#!/usr/bin/python
... tcvt codes...
お好みの端末を開き、tcvt と入力して端末が2カラムに分割されたら準備完了ですよ。
tcvt の使い方と日本語(マルチバイト)対応
まず、今ボクが抱えている問題を見て下さい。 次の例では apache2.conf をエディタで開き、編集を始めようとしているのですが、端末右側にデッドスペースが存在しており、縦方向に長く伸びるドキュメントを効率良く表示できていません。
(僕は tmux 派なんですが)ターミナル・マルチプレクサを使いウインドウを分割したとしても縦方向の有効活用という本質的な問題の解決にはなりません。
同じ理由で、エディタ(例えば vim)を使いファイルやシンボル・ブラウザを左右に配置する、という方法にも不満が残ります。
そこで tcvt。 次の例では tcvt 上でファイルを編集しているのですが、左右のカラムは連続した 1 つのページとして表示されています。
えーっと、このメソッドの実装はどうなってるんだっけ?などと思い複数のウインドウを移動する必要が無くなるわけです。
また、貴方がより広大なデスクトップ環境を持っているのであれば tcvt 起動時に -c オプションで 2 つ以上のカラム数を指定することもできます。
$ tcvt -c4
上の例では 4 つのカラムを設定しており、僕の環境では top コマンドで表示されるプロセス・リストを 1 ウインドウで見ることができます(生まれて初めて対話モードの top を 1 ページで見たゾ・・・)。
5 分割すれば冒頭で例として紹介した apache2.conf も 1 ページで編集が可能。
ペア・プログラミング、コード・プレゼンの機会でも役に立ちそうですね(適当)。
ここまで紹介した tcvt の概要・特長を動く動画でどうぞ。
さて、僕は普段からコーディングや Linux システム管理でマルチバイト文字は使わないようしているので然程ショックは受けなかったのですが、 tcvt では日本語(マルチバイト)には対応していない、と説明されています。
理由は(少なくとも 2013 年ごろの) Python におけるマルチバイト(utf-8)の取り扱いに問題が多い・多かったからだそうで。
理由は(少なくとも 2013 年ごろの) Python におけるマルチバイト(utf-8)の取り扱いに問題が多い・多かったからだそうで。
それでも日本語を取り扱えたらハッピーですよね。 日本語を取り扱いたい場合、/usr/local/bin/tcvt を編集して先頭 import 付近に locale 周りの定義と、180 行目付近にある Columns クラスの addstr メソッドへ入出力文字のエンコード処理を追加すれば上手くいきますよ。
$ sudo vi /usr/local/bin/tcvt
... snip ...
import curses
import errno
import time
import optparse
import locale # netbuffalo
locale.setlocale(locale.LC_ALL, '') # netbuffalo
... snip ...
def addstr(self, char):
char = char.encode(locale.getpreferredencoding()) # netbuffalo
if self.xpos == self.columnwidth - 1:
self.curwin.insstr(self.curypos, self.curxpos, char, self.attrs)
if self.ypos + 1 == 2 * self.height:
self.scroll()
self.move(self.ypos, 0)
else:
self.move(self.ypos + 1, 0)
else:
self.curwin.addstr(self.curypos, self.curxpos, char, self.attrs)
self.xpos += 1
... snip ...
ほらね。
tcvt それ自体はシンプルで主役になるものでは無いかもしれませんが、知っておくと便利なソフトウェアですよね(作者さんの創造力にも感服)。
それは、より効率的な端末ライフを。
もっと知りたい長谷川等伯―生涯と作品 (アート・ビギナーズ・コレクション)
posted with amazlet at 15.04.03
黒田 泰三
東京美術
売り上げランキング: 87,299
東京美術
売り上げランキング: 87,299
達人プログラマー―システム開発の職人から名匠への道
posted with amazlet at 15.04.03
アンドリュー ハント デビッド トーマス
ピアソンエデュケーション
売り上げランキング: 71,046
ピアソンエデュケーション
売り上げランキング: 71,046