fbterm&jfbterm:不需要 X 服务也能运行的终端模拟器……

为君一笑 提交于 2019-11-30 10:00:58

-- 这儿的博文已不再更新。

-- fbtermjfbterm运行在核心控制台上,是一种 shell 程序(类似于图形界面下的终端模拟器),依靠 freetypefontconfig 来提供基本的字体渲染,不需要 X 服务也可以支持基本的中文显示。当然了,fbterm 的功能不仅仅只有这点:如果你打算使用它并希望能获得GUI下终端模拟器般的体验,那还要尝试对fbterm终端的字体等进行调整和配置并搭配tmux。不仅如此,如果您需要的话,还可以在上面进行播放多媒体、输入中文、浏览网页等工作……

-- 但遗憾的是:控制台版本的网络浏览器功能还不够完善。它们还不提供某些图形界面的网络浏览器的某些功能,而且 Arch Linux 的官方源中已经不再包含它们了(可能是因为开发已经停止或者开发进度滞后了,这个项目貌似已经从 google code 上移除了),因此要使用它们只能选择从 AUR 上或者从其它地方获取源码后手动编译。


-- 尴尬的是:虽然我从AUR上获取到了fbterm的源代码并能成功构建运行,但最终却发现位于 AUR 上的 fbterm 也不是很友好(它会让 Linux Console 在运行了 fbterm 之后就会进行某些环境的自动配置,比如设定终端类型(即设置 TERM 变量)为 fbterm(理论上 fbterm 已经支持 256 色,而 Linux Console 仅支持 16 色),但这并不是我想要的结果或者说是那些基于 ncurses 库的伪图形界面程序(比如 mocp 和 alsamixer 以及 mc,偏偏它们又是我所喜欢的几个程序)不希望的,它们都非常依赖于终端类型的设定,在没有 X 环境时它们通常希望终端类型是 linux,如果终端类型被设置成了 fbterm,它们虽然可以正常启动但是界面显得有些凌乱甚至不能正常响应键盘输入(尽管这可以通过临时设定 TERM 来更改,但每次都要这样让我觉得很厌烦)。除了 vim 之外。

-- 一个好消息是:不管是使用位于AUR上的还是从其它地方编译而来的,我都发现:如果在fbterm上运行了 tmux,那么终端类型会被改变为 screen,不仅上面的几个问题直接迎刃而解,貌似还多了一些特性(除了少数程序运行不正常,大多数都可以正常运行并具有不错的显示)。因此,如果你打算使用tmux,那么手动编译就不再是唯一选择……


如果你希望使用fbterm并打算手动编译安装(假如这儿的这个地址已经不可用,而你又表示愿意相信我,那么你可以尝试去我在git上的备份看看).....

fbterm 依赖:
  • 必须依赖:freetype2 fontconfig
  • 可选依赖 libx86(vesa) gpm(mouse support)
  • gcc <= 5.4

fbterm 在编译时不能使用版本太新(fbterm 1.7 及以下的版本用 6.1 及以上的 gcc,g++ 编译貌似会失败)的编译器进行编译,某些特性在新版本的编译器中可能已经被取消了。

如果你的系统中存在多个不同版本的编译器,那么可以在手动编译时通过 configure 脚本从命令行上传递变量给 make 来告诉 make 在编译时到底使用系统中的哪一个编译器来作为实际编译。允许传递的变量和所有的选项可以通过源码包下的 ./configure --help 来得到:
  • --enable-FEATURE[=ARG] include FEATURE [ARG=yes] .......
  • --disable-gpm disable gpm mouse support [[default=auto]] 是否禁用控制台鼠标功能支持,默认会自动检测,如果已经安装了 gpm 就启用否则就不启用。如果不需要,显式禁用(--disable-gpm=yes)
  • --disable-vesa disable VESA video card support [[default=auto]] 是否禁用 vesa 支持

一些对 make 有效的环境变量:
  • CXX C++ compiler command # 指定 c++ 编译器的位置
  • CXXFLAGS C++ compiler flags # 指定 c++ 编译器编译标志,比如头文件和库的路径
  • LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a anonstandard directory <lib dir>
  • LIBS libraries to pass to the linker, e.g. -l<library>
  • CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> If you have headers in a nonstandard directory <include dir>
  • CC C compiler command # 指定 C 编译器的位置
  • CFLAGS C compiler flags # 指定 c 编译器编译标志,比如头文件和库的路径
  • PKG_CONFIG path to pkg-config utility
  • .........

在我的Arch Linxu系统上,gcc 版本已是 >= 6.1,因此很自然的,编译 fbterm 1.7 没有成功。

我尝试在编译过程指定了在其它系统上已经编译好的编译器,版本稍旧(如果是在 Arch Linux 上,你可以到它的存档库里下载旧版本的 gcc 及其依赖包然后尝试将 gcc 降级 1~2 个版本( < 6.1 >= 4.9)后再编译,但这种方式并不推荐,因为如果你没有在编译完成后及时恢复 gcc 的版本到原来的版本,那些依赖于特定编译器库的应用可能都无法启动而导致整个系统都无法启动……)。

tmp=/usr/local/tmp-tools/gcc-4.9.2/bin CC=$tmp/gcc CXX=$tmp/g++ \
./configure && make -j5 && sudo make install 

配置 fbterm

默认安装好未做任何配置的 fbterm 直接用普通用户运行可能会失败(虽然可以使用根用户来运行,但这并不推荐),fbterm 已经提供了解决方案并对其做出了解释:
  • fbterm 在运行时需要临时使用根用户的权限来存取内核(据说这是为了映射某些键),也许给 fbterm 设置 uid 位是最合适的方法,就像 passwd 程序一样。不然以普通用户运行的 fbterm 会收到一个 can't change kernel keymap.....一样的消息,这时你也许会发现 fbterm 的某些快捷键也用不上,比如fbterm用于新建终端窗口的 Ctrl+Meta+C 和切换终端窗口的 Shift ←,Shift →)等。
#  普通用户需要加入 video 组才能有打开 fbdev 的权限。
gpasswd -a $USER video
# fbterm 设置键盘映射时需要临时具有存取内核的权限。
chmod u+s $(which fbterm)
  • 如果是编译的话,fbterm 的 terminfo 文件可能也要放到合适的位置(比如 /usr/share/terminfo/f/ $HOME/.terminfo/f/ )下。
# fbterm 的 terminfo 文件 fbterm 需要放到合适的位置。不然在 fbterm 下,某些应用(比如 vim)可能不会正常工作。
# 如果你在系统中没有找到 fbterm 的 terminfo 文件,那可以尝试手动编译:
# 首先进入 fbterm 源码下的 terminfo 目录中:
# 除非以根用户执行,否则 tic 会将编译出来的 terminfo 文件放到用户级目录中($HOME/.terminfo/f/),如果要编译的 terminfo 文件已经存在了将会导致 tic 命令执行失败。
tic fbterm

fbterm 运行时配置及基本快捷键

可以通过传递参数给 fbterm 或者在配置文件中定义选项来更改它的行为。注:配置文件不是 shell 脚本,shell 指令无效。

============ file ~/.fbtermrc ===========

font-names=DejaVu\ Sans\ Mono\ for\ Powerline:Style=Bold
font-size=19
# ......
color-foreground=7
color-background=0
text-encodings=UTF-8
cursor-shape=1 # fbterm 光标形状
cursor-interval=0 # fbterm 光标闪烁时差,0 即为不闪烁
input-method=fcitx-fbterm # fbterm 输入法
# .....

fbterm基本组合键列表
  • Ctrl+Meta+C 新建一个窗口
  • Shift <- 或者 Shfit -> 在窗口之间切换
  • ……

如果你觉得在 fbterm 上使用背景图片能增加一些点缀的话,那就给 fbterm 设置背景图片。不过在使用背景图片之前,你可能需要先安装 fbv。

假如你希望每次启动 fbterm 时使用不同的背景图片,那么背景图片的路径可以使用位置参数的形式传递给 fbv),如果写成了 shell 脚本又没有设置 fbterm 在登录 tty 时自动启动的话。如果 X 用的少,shell 又是 Bash,那么可以选择在登录 tty 时自动进入 fbterm,如果你希望如此的话。

下面的技巧来源于 Wiki:

============== file: ~/.bashrc ===============

[ "$TERM" = "linux" ] && echo -en "\e]P7ffffff"
if [[ `tty` = \/dev\/tty[1-6]  ]] && type fbterm &> /dev/null;then 
  tmp=/home/external
  echo -en "\e[?25l" #hide cursor
  fbv -ciuker "$tmp/usr/share/backgrounds/fbterm.jpg" << EOF
q
EOF
  shift
  unset tmp
  export FBTERM_BACKGROUND_IMAGE=1
  LANG="zh_CN.UTF-8" fbterm
fi

fbterm 中文输入法:fcitx-fbterm? yong? ibus-fbterm?

如果你希望在 fbterm 上输入中文,那么安装一个 fbterm 中文输入法并激活它就是必要的。
  • 据说:fcitx 框架的 fcitx-fbterm 已经停止开发了,但还能在 git 上找到。另外,部分 Linux 发行系统源中也还没有移除这个软件包。
  • fcitx-fbterm 是用 cmake 来配置的,因此在编译之前可能需要先安装 cmake。最简单的安装方法可以从 INSTALL 文档取得。
  • 如果你要编译安装fcitx-fbterm,首先进入源码目录,开发者推荐在单独的目录中进行编译:
mkdir build;cd build
cmake .. && make && sudo make install

如果你已经运行桌面环境并且 fcitx 在桌面环境自动启动的条目中,那可以直接通过 Ctrl Space(这可以在 fcit 配置中更改)切换(如果不能运行,可以先尝试执行一遍 fcitx-fbterm-helper 脚本)了。

如果你没有运行 X 或者是没有安装 X 可能需要先后台启动 fcitx 然后直接使用 Ctrl Space 切换。然而不幸的是,搜狗拼音 for Linux 在 fbterm 上使用时出来的候选框文字全是乱码(其它的 fcitx 框架输入法(如 fcitx-googlepinyin,fcitx-sunpinyin 似乎并没有发现这个问题))的问题一直没有解决。
LANG="zh_CN.UTF-8" fcitx &>/dev/null & # 屏蔽输出与错误消息并在后台运行 fcitx,一些 Linux 发行要求同时启动 dbus。

另外一个候选是小小输入法(yong)。安装与配置都不是很难,虽然能正确显示候选文字也能输入汉字但还是存在 bug。

你也许会希望在那上面播放多媒体,但遗憾的是我也只晓得用mocp或者cmus可以播放音频;如果您想要在那上面播放视频(哦,天哪!我都不知道你为什么会有这么bt、恐怖而又无聊至极的想法),那我就没什么办法了(我也不想产生这种想法),但是说真的:我的确见过别人在那上面看电影……

jfbterm 和 fbterm 是一类东西,不过无论是从 AUR 上构建安装还是使用起来都存在着问题(一个因为依赖而从网站上下载的内核包可能会通不过 gpg 检查导致 jfbterm 编译无法开始,而实际只用到了其中的部分代码)……

ljca 2017-?

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!