如果喜欢使用终端应用的朋友, 肯定存在一个需求, 就是在终端界面上显示图片. 可能有时候需要显示一个本地磁盘的图片, 也有可能在使用 ​​w3m​​ 时需要显示网页的图片. 现在我们就基于这两个点, 如何实现在 osx 进行显示图片.

终端显示本地磁盘图片

viu 命令行客户端

viu 是一个很好用的终端图片显示工具, 兼容多种终端协议, 比如 ​​iterm2​​ 和 ​​kitty​​ , 在这些终端下可以显示出全真色的图片. 对于 ​​tmux​​ 来说, 只能支持基于 ASCII 的 ​​half block​​ 图片(基于字符效果不太好).

osx 下安装:

brew install viu

安装时间可能会比较久, 因为 ​​viu​​ 工具是基于 ​​rust​​ 语言开发, 还需要安装 ​​rust​​ 相关的依赖库. 安装完成以后, 可以使用如下命令显示图片.

# 显示单张图片
viu xxx.png何

# 以设定的宽显示图片
viu -w 80 xxx.png

需要注意的是, viu 直接在 ​​iterm2​​ 和 ​​kitty​​ 的命令行终端下, 显示效果比较好, 因为使用了终端的图片协议, 但在 ​​tmux​​ 下会 ​​fallback​​ 到 ​​half block​​ 的方式显示.

kitty 下的 icat

如果你是使用 ​​kitty​​ 的终端, 可以直接使用终端本身的图片命令行 ​​icat​​(不支持 iterm 或 tmux). 由于 ​​icat​​ 依赖 ​​imagemagick​​ 库, 依赖安装时间也会比较久. 安装命令如下:

brew install imagemagick

安装完成后, 就可以使用 ​​kitty +kitten icat​​ 命令显示图片了, 由于命令比较长, 可以自己的shell环境中 ​​alias​​ 一下别名.

# 如果 kitty 命令没有加入到path环境变量中, 需要使用实际的kitty命令的路径
alias icat="/Applications/kitty.app/Contents/MacOS/kitty +kitten icat"

W3M 终端浏览器显示图片

w3m 是一款传统的基于终端的文本浏览器, 可以用于终端下简单的网页浏览. 如果使用在 osx 下使用 brew 进行安装的 w3m 版本, 默认会不支持图片的浏览, 并且安装的版本也特别老. 所以我们要基于最新的源码进行编译.

基于源码编译我也喜欢使用 brew 进行管理, 这里介绍一下如何使用 brew 进行 w3m 的源码编译.

  1. 进入到本地 brew-core 缓存目录.
cd $(brew --repository homebrew/homebrew-core)
  1. 复制​​w3m.rb​​文件到个人下载目录.
cp Formula/w3m.rb ~/Downloads/
  1. 修改 w3m.rb 文件, 修改基于最新的源码编译, 以及开启图片编译选项. 最终修改为如下:
class W3m < Formula
desc "Pager/text based browser"
homepage "https://w3m.sourceforge.io/"
revision 7
head "https://github.com/tats/w3m.git", branch: "master"

stable do
url "file:///Users/XXXX/Downloads/w3m_0.5.3.orig.tar.gz"
sha256 "e2bcc6027121ae2bcb079f14b2d348c9206440f87a52c6d54872824e97cb87af"

# Upstream is effectively Debian https://github.com/tats/w3m at this point.
# The patches fix a pile of CVEs
# patch do
# url "https://salsa.debian.org/debian/w3m/-/raw/debian/0.5.3-38/debian/patches/010_upstream.patch"
# sha256 "39e80b36bc5213d15a3ef015ce8df87f7fab5f157e784c7f06dc3936f28d11bc"
# end

# patch do
# url "https://salsa.debian.org/debian/w3m/-/raw/debian/0.5.3-38/debian/patches/020_debian.patch"
# sha256 "08bd013064dc544dc2e70599ea1c9e90f18998bc207dd8053188417fbdaeefb2"
# end
end

livecheck do
url "https://deb.debian.org/debian/pool/main/w/w3m/"
regex(/href=.*?w3m[._-]v?(\d+(?:\.\d+)+)\.orig\.t/i)
end

bottle do
sha256 arm64_monterey: "471292d0ec7637d96304cbb61301909681057dfdf78172ca13f94c2a6f6fc173"
sha256 arm64_big_sur: "ca603325cc6d0904d5d709f6e9407b26fd22e3eeb3984d38e11c21d8f45e7b3a"
sha256 monterey: "5e8f410d2f2942a76602d88a71eee516e43d21164e0e1e41855827ae6f226fa0"
sha256 big_sur: "9865fb7a43e8732bb7d309502c3de3410d05aeb093ba8916462b5aab36563a5a"
sha256 catalina: "5b752461983a608c684bae9efa13a0a5e37a456def0b368c8b0706b35fd480a3"
sha256 mojave: "a77f9a7ceee4dbb2a7288ecfad9c903c489ce4a60ff10056cd735433986df901"
sha256 x86_64_linux: "425cc2d1f5e1c4dff0f4f70c916322e55e95d50b18a003c9ff065cb982fc90e9"
end

depends_on "pkg-config" => :build
depends_on "bdw-gc"
depends_on "openssl@1.1"
depends_on "imlib2"

uses_from_macos "ncurses"
uses_from_macos "zlib"

on_linux do
depends_on "gettext"
depends_on "libbsd"
end

def install
# Work around configure issues with Xcode 12
ENV.append "CFLAGS", "-Wno-implicit-function-declaration"

system "./configure", "--prefix=#{prefix}",
"--with-termlib=ncurses",
"--enable-image",
"--with-imagelib=imlib2",
"--with-ssl=#{Formula["openssl@1.1"].opt_prefix}"
system "make", "install"
end

test do
assert_match "DuckDuckGo", shell_output("#{bin}/w3m -dump https://duckduckgo.com")
end
end

注意:

  1. url 的路径变更为最新从 github 下载下来的最新 zip 包, 重新打包为 tar.gz 文件.
    下载地址: ​​https://github.com/tats/w3m/archive/refs/heads/master.zip​
  2. sha256 需要变更为 tar.gz 对应的文件摘要. 可以使用 ​​shasum -a 256 ​​ 命令.
  3. 注释掉 patch 相关的配置.
  4. 增加 ​​--enable-image​​ 和​​--with-imagelib=imlib2​​. 后面这个库貌似在mac下也没有必要.
  1. 使用 brew 安装相关依赖
brew deps w3m.rb  |  xargs brew install
  1. 使用brew命令进行源码生新安装(如果之前没有安装过, 使用 install 替换 reinstall).
brew reinstall -s -v -d w3m.rb
  1. 在终端使用 w3m 显示图片. 可以选择基于 kitty, iterm, sixel 协议.
# 基于 sixel(仅 iterm2 终端支持)
w3m -o inline_img_protocol=2 www.baidu.com
# 基于 iterm2 终端
w3m -o inline_img_protocol=3 www.baidu.com
# 基于 kitty 终端
w3m -o inline_img_protocol=4 www.baidu.com