創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

2019年5月6日 星期一

在Linux tty以fbterm與小小輸入法來輸入中文

前言

之前在Ubuntu機器上使用tty1-tty6時發現無法正常顯示與輸入中文,於是使用fbterm與ucimf的組合來暫時解決這問題。當時其實對fbterm不甚熟悉,並未深入去了解它,後來才發現有人在fbterm使用小小輸入法或是fcitx。於是心想何不改成自己已使用多年而且相當順手的小小輸入法,這樣做的話整個安裝與設置工作也會比舊的作法簡化些,可以寫個不用太長的說明。這想法就這樣放在心中許久,但一直沒去實現,做〈小小輸入法臺灣包2018年版使用說明〉時也忘了這件事,直到最近才強迫自己寫下這篇。

提醒:一般使用者不會用到tty(或稱console),如果看倌用不著tty,建議直接路過就好。

摘要

在Ubuntu機器使用tty1-tty6時無法正常顯示中文,在這情況下可使用framebuffer terminal,fbterm是其中一種。在fbterm中也能輸入中文,本文將小小輸入法平台為例。

本文以下將假定已先安裝好小小輸入法Linux版,且在桌面環境已能正常使用,如果要給多人使用的,別裝在家目錄,可裝在/opt/下。展示的作業系統環境為Ubuntu MATE 18.04。

fbterm可支援雙位元文字,像中、日文,還有其他功能,本文主要僅涉及中文與部分功能,其他未提到功能的使用可見man fbterm。

觀念釐清

這裡的所稱的tty[1]與桌面環境中所用的terminal並不同,別混淆了,雖然兩者都是文字模式。

如果依一般預設方式安裝好Ubuntu Desktop版,並裝了中文語言支援,桌面環境中的terminal是可以正常顯示與輸入中文的,因為它用的是桌面環境所提供的中文功能。

而按Ctrl+Alt+F1(或者F2至F6)時所切換到tty1(或者tty2至tty6)的畫面中並無法顯示中文訊息(除非用了像本文所述fbterm這類東西)。

類似的情況如裝Ubuntu Server版,並沒裝桌面環境,只能使用本機的tty(即本機console)時;如果Server上有裝了桌面環境與中文支援可顯示中文系統訊息,此時在遠端機器以桌面環境的terminal連線進來,因遠端桌面環境支援中文,可以顯示從服務器傳回來的中文訊息,這就不同於tty的使用情況。

總之,fbterm是用在tty而不是terminal;所以別為terminal安裝fbterm,且在teminal也無法執行fbterm,會出現錯誤:
stdin isn't a interactive tty!
沒有桌面環境的Server可能也沒安裝中文語言支援,也用不著裝fbterm;換句話說,如果裝fbterm的主要用途是為了可在tty能顯示或輸入中文,若這機器根本沒中文語言支援,那就沒有必要裝fbterm。

安裝fbterm

在安裝fbterm之前,請先確定小小輸入法已可正常使用再來繼續以下工作。

$ sudo apt install fbterm
fbterm的使用說明可以直接看man fbterm,其中可見fbterm的參數、快速鍵、設置檔位置,還有一些其他相關設置,以下逐步來說明比較常用的部分。

執行fbterm

裝好後先來小試一下,按Ctrl+Alt+F2切換到tty2畫面,登入後執行fbterm:

$ sudo fbterm -s 16 -i yong
稍解釋一下:
  • -s:指定字型大小,本例用比一般稍大的字型大小16。
  • -i:指定輸入法程式,本例是小小輸入法yong。如果只是要顯示中文而不輸入,就用不著指定-i參數。
以Ctrl+SPACE切換輸入法(即啟用/關閉中文輸入,但以此方式回到英文時但會出現兩個問號符號,故建議可利用小小輸入法所設置的Ctrl鍵來切換中/英文狀態即可)。

雖然不會顯示目前使用的是哪種輸入法,依小小輸入法所設置來變換輸入法的按鍵方式是可以正常作用的(除了Ctrl+`,原因並不清楚,但對小小輸入法而言, ` 這鍵似有特殊用途)。

要離開fbterm可輸入exit或是用快捷鍵Ctrl+Alt+E。

fbterm常用的快捷鍵,像是輸入法有問題時,可kill input method server讓它重啟:Ctrl+Alt+E。其他的可見man fbterm,這裡就不贅錄。

fbterm設置檔

如果每回執行fbterm都要像上述般自行指定選項,未免太累人,可以在fbterm的設置檔中做好必要的設定。設置檔為:$HOME/.fbtermrc

如果沒這檔案,fbterm啟動時會以預設選項來建立這檔案。

若以上述測試時所用選項為例,修改:

font-size=16
input-method=yong
你也可以指定其他像字型或是顏色、文字編碼等等……,設置檔本身附有說明文字,這裡就不多寫。

存檔後再執行fbterm時,若沒指定選項,就會採用設置檔中該選項的設定;若有指定選項,則採用該設定。

其他方面的設置

前面我們用sudo來執行fbterm,如果不以root權限來執行時則會看到這樣的錯誤訊息:
can't open buffer frame device!
mmap /dev/zero: Operation not permitted
Using VESA requires root privilege
如果想讓某個非root的使用者能使用fbterm,將該帳號名稱,如user_name加入video群組(/dev/fb0所屬群組):

$ sudo adduser user_name video
還要再做一個設定,否則執行時會出現另一種錯誤訊息:
[input] can't change kernel keymap table, all shortcuts will NOT work! see SECURITY NOTES section of man page for solution

$ sudo setcap 'cap_sys_tty_config+ep' /usr/bin/fbterm
或者這樣也可以,但較不建議,可以的話用前者:

$ sudo chmod u+s /usr/bin/fbterm
以上兩個設定是為了讓非root使用者能使用fbterm才需要做的。

如果想在登入tty後自動執行fbterm,在~/.bashrc的後面加入:

if [ "$TERM" = "linux" ]; then
    alias fbterm='LC=zh_TW.UTF-8 fbterm'
    fbterm
fi
這裡使用了alias別名,這樣在退出fbterm之後,再重新執行時不必重複指定LC[2]。

這是假定該帳號使用bash,如果他用的是其他shell,請自行做相對應的調整。

設了這項之後,在tty登入時會出現前面出現過的訊息:
stdin isn't a interactive tty!
不過還是可以使用,可不理會它。

其他已知問題

在VirtualBox中的Ubuntu機器執行fbterm時,會出錯誤訊息,這點與video driver有關。

其他framebuffer terminal

fbterm已有數年沒再更新,開發工作也許已停止[3],以下是幾個類似的東西,自己並沒有實際深入了解,他們的說明文件中也沒提到有輸入法的功能:
  • bterm
  • yaft (yet another framebuffer terminal):這個看來是較新的東西。

參考

  1. https://baike.baidu.com/item/TTY
  2. https://www.cnblogs.com/haotianbeidou/p/3821770.html
  3. https://wiki.archlinux.org/index.php/Fbterm

沒有留言:

張貼留言