6
29
2011
4

使用 zsh 的 zpty 模块

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

Category: shell | Tags: zsh
5
24
2010
8

将du的输出按文件大小排序

du命令的输出结果要么是不人性化的全部以千字节为单位,要么加上-h参数,显示为1K 234M 2G这样易读的数据。可是,我通常想查看那些大文件/目录,或者那些小文件/目录。单单只用sort命令的话,就不得不在脑海转换那些千字节单位的数据了。做为一个Linux用户,电脑能做的我可不想让人脑来做。Google了一下,发现这个帖子提供了一段代码可行,但是输出效果并不理想,于是我略作更改,写出了以下代码:

sdu () {
  du -sk $@ | sort -n | awk '
BEGIN {
  split("K,M,G,T", Units, ",");
  FS="\t";
  OFS="\t";
}
{
  u = 1;
  while ($1 >= 1024) {
    $1 = $1 / 1024;
    u += 1
  }
  $1 = sprintf("%.1f%s", $1, Units[u]);
  sub(/\.0/, "", $1);
  print $0;
}'
}

这段代码使用sort排序原始数据后,再使用awk来转换数字的单位。使用方法为sdu后加要查看大小的文件/目录就可以了。注意我在代码中加了-s参数,如果希望同时查询子目录的话,需要去掉这个参数。

Category: shell | Tags: shell linux
4
23
2010
0

统计自己的Vim脚本行数

一行 zsh 命令搞定:

grep -l "Author.*`whoami`" ~/.vim/**/*[^~](.^@)|while read i; do cat $i; done|cat - ~/.vimrc|sed '/^\s*$/d'|sed '/^\s*"/d'|wc -l

解释一下:

grep -l "Author.*`whoami`"
选取包含匹配正则表达式Author.*`whoami`的文件,其中whoami命令当然就是取得当前用户名啦。如果你的Vim脚本里标明的作者和你的系统的用户名不同,请自行修改之。
~/.vim/**/*[^~]
Vim配置目录下的所有文件,但以~结尾的备份文件除外。
(.^@)
前面的条件还不够哦。文件要是非软链接^@的普通文件.。也不知道只用一个.可不可以。
|while read i
将前面管道中的那些文件名,一行行地读到变量i里面来。
cat $i
把文件$i的内容显示出来。
done|cat - ~/.vimrc
把前面的内容-和vimrc文件连接到一起输出。
sed '/^\s*$/d'
空行不算数。
sed '/^\s*"/d'
以引号开头的行是注释,也不算数。
wc -l
数数总共多少行。

我的结果:

1915

看到这个结果,我自己都大吃一惊。没想到一年多以来,自己写了这么多行配置了啊。

不过可能不准确哦。反正我这里竟然算不算软链接都是这么多。哪位有更好的命令不妨留言呀。

Category: shell | Tags: zsh vim shell

| Theme: Aeros 2.0 by TheBuckmaker.com