本文来自依云'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。
Jun 30, 2011 07:20:29 AM
请问一下这个函数怎么使用?
Jun 30, 2011 07:32:59 AM
了解是怎么作的了
Aug 19, 2014 12:41:24 AM
假如,用ptyless執行某命令:
$ ptyless ll -Ria /
咱猜測這樣會花很長很長很長一段時間,然後纔能在翻頁器中顯現出來……稍微改了一下,咱覺得這樣會更好:https://wiki.archlinux.org/index.php/Core_utilities#Colored_output_when_reading_from_stdin
不過很好奇為何直接用管道會行不通……難道是zpty的bug?
Aug 22, 2014 07:12:57 PM
非常感谢,我更新一下!