FreeBSD Daily Topics

2009年1月16日≪注目≫コンソールを活用する方法: jfbterm(1)、uim-fep(1)、screen(1) 日本語表示と入力にも対応

tips

CUI Platform - jfbterm(1), uim-fep(1) and screen(1)

tips - GnomeやKDEのアップグレード、X.Orgのアップグレードなどウィンドウシステムの基幹に関連するアプリケーションやライブラリ、ツールキットのアップグレード時にはウィンドウシステム関連のアプリケーションは終了させておいて、コンソールからアップグレード作業を行ったほうが良い場合があります。

こういった場合はコンソールで日本語閲覧や日本語入力ができるようにし、さらにscreen(1)を併用して複数の仮想コンソールを使えるようにしておくと便利です。ウィンドウシステムのアップグレード中にも日本語表示や入力を伴う作業をコンソールで作業できます。ここでは jfbterm(1), uim-fep(1), screen(1)のツールを使った高解像度日本語対応のコンソールプラットフォームの構築方法を紹介します。

まず次のアプリケーションをインストールします。

  • jfbterm(sysutils/jfbterm)コンソール向け多言語対応システム
  • uim-fep(japanese/uim-anthy)UIM-FEPとAnthyモジュール
  • screen(sysutils/screen)仮想ターミナルマネージャ

jfbtermでコンソールで日本語や他の言語を表示できるようにし(さらに高解像度の描画を実現し⁠⁠、uim-fepでコンソールにおける日本語入力を実現、screenで複数の画面を切り替えて作業できるようにします。jfbtermは描画にフレームバッファを使うためLinuxのみで動作していましたが、FreeBSDへの移植が実施され使えるようになりました。

jfbtermをインストールしたらtermcapにjfbtermを登録する必要があるため次のように作業を行います。vesaカーネルモジュールを使った画面描画実施するためvesaカーネルモジュールの読み込み、設定ファイルのコピーも行います。システム起動時にvesaカーネルモジュールを自動的に読み込ませるには/boot/loader.confに「vesa_load="YES"」を追加しておきます。

jfbtermインストール後に実施する作業
# kldload vesa
# cat /usr/local/share/jfbterm/termcap.jfbterm >> /usr/share/misc/termcap
# cap_mkdb /usr/share/misc/termcap
# cp /usr/local/etc/jfbterm.conf.sample /usr/local/etc/jfbterm.conf
リスト /boot/loader.confに追加する設定
vesa_load="YES"

jfbtermでM+ビットマップフォントを使いたい場合は、M+ビットマップフォント(japanese/mplusfonts)をインストールしてから/usr/local/etc/jfbterm.confの設定ファイルでD. Font and Encoding configurationの1)の設定をコメントして、代わりに2)の設定をコメントアウトして有効にします。

jfbtermを実行する場合、環境変数LANGが設定されている必要があります。コンソールではLANGをCに設定したり、そもそも設定しないで使うこともありますので、次のように実行すると良いでしょう。aliasで設定しておくと便利です。デフォルトの設定では1024×768の16depthで起動されます。

jfbtermを実行する場合、環境変数LANGも設定
env LANG=ja_JP.UTF-8 jfbterm

jfbtermを起動したらuim-fepを実行して日本語入力を実現します。日本語入力の開始と終了のキーは${HOME}/.uim設定ファイルで設定します。

たとえば、次のような設定を追加しておくと便利です。この設定ではCtrl-\、Alt-全角半角、全角半角、変換、Shift-Spaceのそれぞれが切り替えキーとして使えるようになります。

リスト ${HOME}/.uim - 日本語入力のキー切り替えをCtrl-\、Alt-全角半角、全角半角、変換、Shift-Spaceに設定
;; toggle input method key configuration
(define-key generic-on-key?
    '("<Control>\\" "<Alt>zenkaku-hankaku" "zenkaku-hankaku"
      "Henkan_Mode" "<Shift> "))

(define-key generic-off-key?
    '("<Control>\\" "<Alt>zenkaku-hankaku" "zenkaku-hankaku"
      "Henkan_Mode" "<Shift> "))

jfbtermを起動し、uim-fepを起動したら、最後にscreenを起動します。screenを起動してからuim-fepを起動して日本語入力を実施するターミナルを区別するという使い方もできます。

screen(1)は環境変数TERMをscreenに設定しますが、この設定ではscreenでバックスペースキーが機能しないといった状況になります。これはTERMをjfbterm-colorやjfbtermに設定することで回避できます。このあたりはシェルの設定ファイルで自動的に切り替えるようにしておくと便利です。

たとえば、zsh, bash, tcshを使っているなら次のようにターミナルごとの切り替え設定を追加しておきます(procstat(1)を使っているので最近のFreeBSDが必要です。procstat(1)が存在しない場合はps(1)で同様の処理を実施する必要があります⁠⁠。

リスト screen(1)がjfbterm(1)で実行されている場合はTERMをjfbterm-colorに設定 - ${HOME}/.zshrcと${HOME}/.bashrc用設定
case "${TERM}" in
screen)
    pcmd=$(procstat -ch $$ | awk '{print $2}')
    ppid=$(procstat -h $$ | awk '{print $2}')
    while [ "0" != "${ppid}" ]
    do
        if [ "jfbterm" = "${pcmd}" ]
        then
            TERM=jfbterm-color
            break
        fi
        pcmd=$(procstat -ch "${ppid}" | awk '{print $2}')
        ppid=$(procstat -h "${ppid}" | awk '{print $2}')
    done
    unset pcmd ppid
    ;;
esac
リスト screen(1)がjfbterm(1)で実行されている場合はTERMをjfbterm-colorに設定 - ${HOME}/.tcshrc用設定
if ( ${?TERM} ) then
    switch ( "${TERM}" )
    case screen:
        set pcmd=`procstat -ch $$ | awk '{print $2}'`
        set ppid=`procstat -h $$ | awk '{print $2}'`
        while ( ! "0" == "${ppid}" )
            if ( "jfbterm" == "${pcmd}" ) then
                TERM=jfbterm-color
                break
            endif
            set pcmd=`procstat -ch "${ppid}" | awk '{print $2}'`
            set ppid=`procstat -h "${ppid}" | awk '{print $2}'`
        end
        unset pcmd ppid
        breaksw
    endsw
endif

コンソールは背景が黒ですが、xtermやgnome-terminal、konsoleはデフォルトでは背景色は白です。このためエディタやls(1)などのハイライトの設定を状況に応じて変更した方が便利です。上記のようにTERMをjfbterm-colorに設定するようにした場合、TERMがcons25やjfbterm-colorである場合には背景色が黒、それ以外の場合には白と仮定して設定するといったことができるようになります。ls(1)やシェルカラーの変更は上記例のようにTERMで切り替えて実施すると便利です。

リスト 背景色が黒い場合にはハイライト設定を切り替える Vimの場合 - ${HOME}/.vimrc
" set background color and text color (for black display)
if "cons25" == $TERM || "jfbterm-color" == $TERM || "jfbterm" == $TERM
    hi Normal ctermbg=black ctermfg=white
endif

screen(1)と類似した操作を行うアプリケーションにtmux(misc/tmux)があります。こちらはscreen(1)のようにTERMを設定しなくてもバックスペースが使えますが、起動された段階で親プロセスから分かれてPID 1を親にします。このためtmuxがどこで起動されたか判定できず、カラー設定が難しいという問題があります。

screen(1)ではCtrl-aで新しいウィンドウの作成、Ctrl-"で一覧の表示、Ctrl-数値で指定したウィンドウへ移動、Ctrl-nで次のウィンドウへ移動、Ctrl-?でコマンド一覧の表示を実施できます。Ctrl-aはシェルやEmacsでは行頭へのジャンプに割り当てられていますので、気になる場合にはscreen(1)かシェル/エディタかどちらかの設定を変更する必要があります。⁠Ctrl-a a」「Ctrl-a」本来の動作になるので、これを覚えてしまうという方法もあります。

Finch (net-im/finch)のようにCUIで動作するメッセンジャーもあり(PidginのCUI版のようなもの⁠⁠、CUIで動作するアプリケーションを併用することでウィンドウシステムを使っているときと同じような操作をCUIでも実現できます。CUIでの操作に慣れておくとssh(1)でリモートログインしてさまざまな作業ができるようになって便利です。

おすすめ記事

記事・ニュース一覧