🖼️

あらためて FbTerm (と周辺の諸々)

2021/05/03に公開

私は Ubuntu をよく使います。 メイン機では GNOME デスクトップを利用しています。 サブ機でもデスクトップを利用したいものですが、力不足故に CUI (CLI) で動作させています。

ところで、デフォルトの仮想端末では日本語を表示できません[1]。 これを解決する方法のひとつが FbTerm です。 FbTerm はフレームバッファを利用した端末エミュレータで[2]、256 色表示にも対応しています。

インストール・初期設定

Ubuntu では apt(8) だったり apt-get(8) だったりでインストールできます。

$ sudo apt update
$ sudo apt install fbterm

ここで fbterm としても起動できないでしょう。 ユーザがグループ video に属している必要があります。

$ sudo usermod -aG video user-name

さて、ようやく起動できるようになりましたが、起動時に何か文句を言われているようです。 これを解決するには FbTerm の実行ファイルに setuid モードをつけます。

$ sudo chmod u+s `which fbterm`

これで問題なく FbTerm を起動できるようになります。

起動・使い方

コマンドラインから fbterm と実行すると起動できます。 特にこれといったことはなく端末エミュレータが利用できます。

FbTerm は GNU Screen や tmux などのように複数の端末セッションを利用できます。 FbTerm では端末セッションのことをウィンドウ (window) というようです。 ショートカットキーは次のように割り当てられています:

キー 機能
[Ctrl]+[Alt]+[E] FbTerm を終了
[Ctrl]+[Alt]+[C] 新しいウィンドウを生成
[Ctrl]+[Alt]+[D] 現在のウィンドウを終了
[Ctrl]+[Alt]+[1] 1 番目のウィンドウに切り替え
[Ctrl]+[Alt]+[2] 2 番目
[Ctrl]+[Alt]+[n] n 番目 (1 \le n \le 9)
[Ctrl]+[Alt]+[0] 10 番目
[Shift]+[Left] 1 つ前のウィンドウに切り替え
[Shift]+[Right] 1 つ先にウィンドウに切り替え
[Shift]+[PageUp] 1 画面上スクロール
[Shift]+[PageDown] 1 画面下スクロール
[Ctrl]+[Alt]+[F1] テキストエンコードを現在のロカールに設定
[Ctrl]+[Alt]+[Fn] …を n 番目のロカールに設定 (2 \le n \le 6)
[Ctrl]+[Space] IME を切り替え
[Ctrl]+[Alt]+[K] IME サーバをキルする

また、マウスを利用することもできますがここでは割愛します[3]。 詳細は man fbterm を実行してください。

.bashrc と .profile の設定

FbTerm は 256 色の色表示ができますが、デフォルトの .bashrc と .profile の設定ではほとんど色が付きません。 殺風景な端末画面をカラフルに彩りましょう。 また、ログイン時に FbTerm を自動的に起動するように設定します。

.bashrc の編集

38 行目辺りです。

.bashrc
--- .bashrc.org
+++ .bashrc
@@ -37,6 +37,8 @@
 
 # set a fancy prompt (non-color, unless we know we "want" color)
 case "$TERM" in
+    linux) [ "$FBTERM" ] && export TERM=fbterm && color_prompt=yes;;
+    fbterm) color_prompt=yes;;
     xterm-color|*-256color) color_prompt=yes;;
 esac
 

.profile の編集

最後に追加します。 sleep 2 のおかげでログインできなくなっても 2 秒間のうちに [Ctrl]+[C] を押下して FbTerm の起動をキャンセルできるようになっています。

.profile
--- .profile.org
+++ .profile
@@ -25,3 +25,11 @@
 if [ -d "$HOME/.local/bin" ] ; then
     PATH="$HOME/.local/bin:$PATH"
 fi
+
+# for FbTerm
+if [ "$TERM" = "linux" ]; then
+    # If you are unable to log in,
+    # you can cancel the launch of FbTerm by Pressing <C-c>.
+    sleep 2
+    FBTERM=1 exec fbterm
+fi

フォントの設定

ここまでの流れですでに日本語などの文字は表示されていると思います。 されていませんか? もしかしたらフォントがインストールされていないのかも知れません。 フォントをインストールしましょう。 例えば、更紗ゴシックRictyRicty Diminished なんかがあります。 フォントをダウンロードしたら ~/.fonts/ 配下にフォントファイルを配置します。

FbTerm の設定ファイルは ~/.fbtermrc にあります。 これを編集しましょう。 これは更紗ゴシックを利用する例です。

.fbtermrc
--- .fbtermrc.org
+++ .fbtermrc
@@ -6,12 +6,12 @@
 
 # font family names/pixelsize used by fbterm, multiple font family names must be seperated by ','
 # and using a fixed width font as the first is strongly recommended
-font-names=mono
-font-size=12
+font-names=Sarasa\ Fixed\ J,mono
+font-size=16
 
 # force font width (and/or height), usually for non-fixed width fonts
 # legal value format: n (fw_new = n), +n (fw_new = fw_old + n), -n (fw_new = fw_old - n)
-#font-width=
+font-width=8
 #font-height=
 
 # default color of foreground/background text

利用可能なフォント名を列挙するには仮想端末で起動されたシェルから fbterm -v と実行します。

日本語を入力する

日本語を表示できたので次は入力です。 uim-fep を利用して日本語を入力します。 インストールするには次のように実行します:

$ sudo apt update
$ sudo apt install uim-fep uim-anthy

ユーザ用の設定ファイルは ~/.uim です。 作成します。

.uim
;; デフォルトの IME を Anthy に
(define default-im-name 'anthy)
(require-module "anthy")
;; IME 切り替えは [Ctrl]+[Space]
(define-key generic-on-key? '("<Control> "))
(define-key generic-off-key? '("<Control> "))
;; Vi 協調モード
(define anthy-use-with-vi? #t)
(define-key anthy-vi-escape-key? '("escape" "["))
;; スペース入力はいつでも半角
(require "japanese.scm")
(define ja-space '(" " " " " "))
(define ja-alnum-space '(" " " "))

ログイン時の FbTerm 起動と同時に uim-fep を起動するように .profile を編集します。

.profile
--- .profile.org2
+++ .profile
@@ -31,5 +31,5 @@
     # If you are unable to log in,
     # you can cancel the launch of FbTerm by Pressing <C-c>.
     sleep 2
-    FBTERM=1 exec fbterm
+    FBTERM=1 exec fbterm -- uim-fep
 fi

ウェブブラウズ (w3m)

パソコンといえばウェブブラウズですね。 ここでは w3m という日本製テキストブラウザを利用します。 テキストブラウザといっていますが、画像が表示できるすぐれものです。 インストールします。

$ sudo apt update
$ sudo apt install w3m w3m-img

起動するには引数に URL を渡してあげます。 HTML ならほとんど表示できますが、CSS には対応していないので表示が崩れるものもあるかも知れません。 Wikipedia などのテキストベースのサイトなら問題なく閲覧できるでしょう。 試しに w3m https://www.google.com/ とすると次のように表示されます。

Google にアクセスしてみる
Google にアクセスしてみる

少し前までは fbterm で画像を表示するには w3m-img を手前でビルドする必要があったのですが、今では修正されているようです。

スクリーンショット

上の画像のように画面を画像として保存できます。 fbcat というパッケージに入っている fbgrab を利用しています。 詳細は man fbcatman fbgrab してください。

背景画像

FbTerm そのものに背景画像を表示する術はありませんが、man ページに紹介されている方法で実現することができます。 しかし、そこれ利用される fbv コマンドを手前でビルドする必要がある上、そのソースコードが古く (本当にとても古く) 現在のライブラリと互換性がないことなどから、この方法をそのまま実行することは現実的ではなさそうです。

FbTerm は環境変数 FBTERM_BACKGROUND_IMAGE が定義された状態で起動されると、その時点のスクリーンショットを背景画像として利用します。 つまり、起動時に背景画像を表示できればそれを背景画像として利用できます。 フレームバッファはファイルとして読み書き可能ですので、起動前にフレームバッファに画像を書き込むことができれば良いことになります。

まずは fbi をインストールします。 fbi はフレームバッファを利用して画像を表示するアプリケーションです。

$ sudo apt update
$ sudo apt install fbi

fbi は FbTerm と同時に実行できません。 fbi を使って画像を表示するには仮想端末から実行する必要があります。 ~/.profile に記述した sleep 2 の間に [Ctrl]+[C] を押下して FbTerm の起動をキャンセルしましょう。 画像を表示するには次のように実行します。 fbi には様々なオプションがあるようですが、ここでは取り上げません。 気になったら man fbi してください。

$ fbi image-file

画像が画面に等倍率で表示されます。 縮小したい場合は [-] を、拡大したい場合は [+] を押下します。 表示倍率を n% にしたい場合は [n], [S] と押下します (30% なら 30s)。 画面下部に表示される画像の情報を表示/非表示するには [V] を押下します。 ここで背景画像に設定したい画面を表示してください。

次に別の端末を起動します。 [Alt]+[左右矢印] がおすすめです。 ここでは FbTerm を起動しても良いです。 この端末では次のように実行します。 ここで、sleep 5 の実行中に先程の画像を表示している端末に切り替え、5 秒以上経過した後にこの端末に戻ってきてください。

$ sleep 5; cat /dev/fb0 > ~/.bgimg.raw

成功すると画像を表示しているフレームバッファのコピーが ~/.bgimg.raw に保存されます。 確認するには cat ~/.bgimg.raw > /dev/fb0 してみてください。 画像が表示されるはずです。 この作業をログイン時の FbTerm 起動の直前に行われるように .profile を編集します。 .bgimg.raw のサイズが気になる場合は何か圧縮を施すのも良いかも知れません (その際は .profile に展開の処理を記述する必要があります)。

.profile
--- .profile.org
+++ .profile
@@ -31,5 +31,10 @@
     # If you are unable to log in,
     # you can cancel the launch of FbTerm by Pressing <C-c>.
     sleep 2
+    if [ -f $HOME/.bgimg.raw ]; then
+        echo -ne '\e[?25l'    # カーソル非表示
+        cat $HOME/.bgimg.raw > /dev/fb0
+        export FBTERM_BACKGROUND_IMAGE=1
+    fi
     FBTERM=1 exec fbterm -- uim-fep
 fi

背景画像を利用した例です。 背景画像を結構暗くしているので分かりづらいかも知れませんが、実際にディスプレイ越しに見るといい感じの明るさです。

背景画像の例
背景画像を表示した例 (画像元)

おわりに

おわりです。

FbTerm はそれ自身で IME のクライアントになれるような記述がありますが、文献を見つけられませんでした。 無念。


参考文献

脚注
  1. xterm のような端末エミュレータではなく getty(8) などによるそれです。 デスクトップが立ち上がっているマシンで [Ctrl]+[Alt]+[F3] あたりを押下すると姿を現します。 ↩︎

  2. フレームバッファとは、うーん、VRAM のようなものでしょうか。 画面に表示されているグラフィカルな情報を保持しているスペシャルファイルです。 大抵の環境では /dev/fb0 や /dev/fb/0 といった名前で存在しています。 ↩︎

  3. 私がマウスを使わないからです。 私がマウスを使い始めるとこの記事が更新されます。 ↩︎

Discussion