13

使用 zsh 的 zpty 模块

 3 years ago
source link: https://blog.lilydjwg.me/2011/6/29/using-zpty-module-of-zsh.27677.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用 zsh 的 zpty 模块

本文来自依云's Blog,转载请注明。

Zsh 的模块真多呀,最初文档时知道有 ztcp 模块时已惊叹,最近又在邮件列表看到竟然有 zpty 模块,解决了困扰我良久的一个小问题。

会往终端输出彩色字符的程序都知道,如果输出的目的地不是终端,通常彩色转义字符是不需要的,比如重定向到文件,或者通过管道传给 grep 之类的程序。所以不少程序会有个--color=WHEN选项,你可以指定是程序自己决定,还是总是要彩色或者不要彩色。Linux 总是善于提供一堆选项来满足不同的需要。可是,除此之外,ls 还会根据输出目的地是不是终端来确定要不要一行显示多个文件名。更囧的是,只有办法强制 ls 一行显示一个文件名,却没有选项强制它把管道当成终端进行多栏显示。结果就是,当文件比较多时,ls | less会一行一个文件名,即使右边还有大把的空间。强制显示彩色也需要--color=always这么长的参数(而 tree 只需要-C就可以了)。

很早就想写个程序利用专门的伪终端来给 ls 的彩色多栏输出加上翻页器了。现在我终于把它实现了,而且简单很多:

ptyrun () {
local ptyname=pty-$$
zmodload zsh/zpty
zpty $ptyname ${1+"$@"}
if [[ ! -t 1 ]]; then
setopt local_traps
trap '' INT
fi
zpty -r $ptyname
zpty -d $ptyname
}
ptyless () {
ptyrun $@ | less
}

另外,这个用于 yaourt 查找时也是不错的 ;-)


2014年8月22日更新:采纳评论中的建议,使用管道取代了临时文件。另外,在 Dropbox 可以下载我的 zshrc


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK