2015年04月03日

1 ページの爽快感 - 屏風のような仮想端末ユーティリティ tcvt

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

tcvt のインストールと設定


tcvt は screen(byobu)、tmux のようなターミナル・マルチプレクサではありません。 仮想的に端末を分割しますがそれらは独立してはおらず常に1ページとして動作します。 うーん、よくわからないかもしれませんね。

使ってみるのが一番わかりやすいかも。 早速 GitHub からコードをクローン、インストールしてみましょうか。

# 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カラムに分割されたら準備完了ですよ。

run_tcvt


tcvt の使い方と日本語(マルチバイト)対応


まず、今ボクが抱えている問題を見て下さい。 次の例では apache2.conf をエディタで開き、編集を始めようとしているのですが、端末右側にデッドスペースが存在しており、縦方向に長く伸びるドキュメントを効率良く表示できていません。

tcvt-empty_space


(僕は tmux 派なんですが)ターミナル・マルチプレクサを使いウインドウを分割したとしても縦方向の有効活用という本質的な問題の解決にはなりません。

edit_python_code_by_using_tmux


同じ理由で、エディタ(例えば vim)を使いファイルやシンボル・ブラウザを左右に配置する、という方法にも不満が残ります。

VIM file and symbol browser


そこで tcvt。 次の例では tcvt 上でファイルを編集しているのですが、左右のカラムは連続した 1 つのページとして表示されています。

tcvt_edit_python_code


えーっと、このメソッドの実装はどうなってるんだっけ?などと思い複数のウインドウを移動する必要が無くなるわけです。

また、貴方がより広大なデスクトップ環境を持っているのであれば tcvt 起動時に -c オプションで 2 つ以上のカラム数を指定することもできます。
 
$ tcvt -c4


上の例では 4 つのカラムを設定しており、僕の環境では top コマンドで表示されるプロセス・リストを 1 ウインドウで見ることができます(生まれて初めて対話モードの top を 1 ページで見たゾ・・・)。

tcvt_4columns


5 分割すれば冒頭で例として紹介した apache2.conf も 1 ページで編集が可能。

tvct_edit_apache2conf


ペア・プログラミング、コード・プレゼンの機会でも役に立ちそうですね(適当)。

ここまで紹介した tcvt の概要・特長を動く動画でどうぞ。




さて、僕は普段からコーディングや Linux システム管理でマルチバイト文字は使わないようしているので然程ショックは受けなかったのですが、 tcvt では日本語(マルチバイト)には対応していない、と説明されています。

理由は(少なくとも 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_open_multi_bytes_file


tcvt それ自体はシンプルで主役になるものでは無いかもしれませんが、知っておくと便利なソフトウェアですよね(作者さんの創造力にも感服)。

それは、より効率的な端末ライフを。


達人プログラマー―システム開発の職人から名匠への道
アンドリュー ハント デビッド トーマス
ピアソンエデュケーション
売り上げランキング: 71,046

Posted by netbuffalo at 20:00│Comments(0)TrackBack(0)Python | ユーティリティ


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

http://trackback.blogsys.jp/livedoor/netbuffalo/4998032

コメントする

名前
URL
 
  絵文字