[分享]终极Shell——Zsh

仅仅用于软件推荐,不适合发求软件或软件使用问题方面的贴子
回复

心动VS行动?

行动
87
44%
心动
21
11%
以静制动
91
46%
 
总计票数: 199
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#16

帖子 kardinal » 2008-07-26 23:48

hubert_star 写了:光顾着看楼主给的配置了,忘记FAQ这个好东西了!
在.zshrc里面加入如下的代码就可以即时更改标题了:

代码: 全选

  chpwd() {
    [[ -t 1 ]] || return
    case $TERM in
      sun-cmd) print -Pn "\e]l%~\e\"
        ;;
      *xterm*|rxvt|(dt|k|E)term) print -Pn "\e]2;%~\a"
        ;;
    esac
  }

刚才正在搜索,没想起FAQ这茬儿
不过我比较倾向于用Tiling window manager (现在用awesome),标题栏不是必需的
所以从来也没有注意过标题栏 :lol:
不过搞上也不错 我也弄下试试
头像
hubert_star
论坛版主
帖子: 5373
注册时间: 2007-10-29 22:12
系统: OSX 10.9 + Ub 1304
来自: 江苏南京

#17

帖子 hubert_star » 2008-07-26 23:56

代码: 全选


case $TERM in (*xterm*|rxvt|(dt|k|E)term)
	precmd () { print -Pn "\e]0;%n@%~\a" }
	preexec () { print -Pn "\e]0;%n@%~\ $1\a" }
	;;
esac

当前我用的标题样式
上次由 hubert_star 在 2008-07-27 0:00,总共编辑 1 次。
佛经说,人有八苦: 生、老、病、死、求不得、怨憎、爱别离、五阴盛 故我苦!
圣经说,人有七罪: 饕餮、贪婪、懒惰、淫欲、傲慢、嫉妒和暴怒  故我有罪!

我这篇帖子里面没有任何攻击我们伟大的中华人民共和国政府和任劳任怨的人民公仆(和本论坛高素质的版主)的文字和含义;

特此声明!

有些事,我们明知道是错的,也要去坚持,因为不甘心;有些人,我们明知道是爱的,也要去放弃,因为没结局;有时候,我们明知道没路了,却还在前行,因为习惯了。

欢迎来我的新浪微博@me
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#18

帖子 kardinal » 2008-07-26 23:58

eexpress 写了:半年测试啊。这还算认真的哦。
路径别名
这个听着倒是不错。我在bash还专门用一个ccdd脚本作这事。不知道这别名后,还补全等正常不。

建议再说说不爽的地方,给大家参考哦。
难为我了
我还真的不记得有什么不爽的地方

如果操作习惯也算的话,这算一个吧
候选菜单使用“高亮选中”的时候,确认选中的项还要再按一下回车之类的
如果不使用“高亮选中”则没有这个问题,但是我还是喜欢高亮选中的风格

Zsh的可配置性极强,如果需要什么功能,Zsh都可以通过脚本来实现吧
有句话这样说
zsh: The last shell you’ll ever need!
Z是最后一个字母,所以是终极Shell

我曾经搜索到一个比较各种Shell的文章
Zsh交互性是A+级别的,远高于其它Shell
在编程方面,Zsh是A级的吧,也是最高的
只是不知道出于什么原因,Zsh被严重的低估了
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#19

帖子 kardinal » 2008-07-27 0:10

eexpress 写了:半年测试啊。这还算认真的哦。
路径别名
这个听着倒是不错。我在bash还专门用一个ccdd脚本作这事。不知道这别名后,还补全等正常不。

建议再说说不爽的地方,给大家参考哦。
补全基本是正常的,起码路径,文件这些肯定没有问题
我所知道的,有问题的是启动脚本
比如
/etc/init.d/gdm [tab]
可以补全出 start stop restart等
~I/gdm [tab]
补全出的是当前目录下的文件名
这个肯定是可以配置好的,不过我觉得应该尽量的保持配置文件的简单,这样迁移到其它系统上出问题的几率比较小
而且这命令我用的不多,宁愿多打几个字母,多数人应该一样的吧 :lol:

另:建议路径别名使用大写字母
因为Zsh自带了几个,都是小写字母的,这样容易区别
输入~时要按Shift,不用松开,顺便按下字母键和TAB就可以了
上次由 kardinal 在 2008-07-27 0:44,总共编辑 1 次。
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#20

帖子 kardinal » 2008-07-27 0:30

zhuqin_83 写了:加精了
三克油 :lol:
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

★★★★★★★★★★★compctl★★★★★★★★★★★

#21

帖子 kardinal » 2008-07-27 1:43

zsh还有一个比较强大而实用的功能 compctl
例如:
compctl -g '*.tar.gz *.gz*.tgz' + -g '*(-/)' tar zxvf
过滤候选项

tar zxvf [tab]
候选菜单中只出现扩展名为 .tar.gz .gz .tgz 的文件

不过这个功能比较复杂,容易引起混乱,通常需要脚本配合

代码: 全选

compctl -g '*.tar.bz2 *.tar.gz *.bz2 *.gz *.jar *.rar *.tar *.tbz2 *.tgz *.zip *.Z' + -g '*(-/)' extract


extract() {
   if [[ -z "$1" ]] ; then
       print -P "usage: \e[1;36mextract\e[1;0m < filename >"
       print -P "       Extract the file specified based on the extension"
   elif [[ -f $1 ]] ; then
       case ${(L)1} in
           *.tar.bz2)  tar -jxvf $1    ;;
           *.tar.gz)   tar -zxvf $1    ;;
           *.bz2)      bunzip2 $1       ;;
           *.gz)       gunzip $1       ;;
           *.jar)      unzip $1       ;;
           *.rar)      unrar x $1       ;;
           *.tar)      tar -xvf $1       ;;
           *.tbz2)     tar -jxvf $1    ;;
           *.tgz)      tar -zxvf $1    ;;
           *.zip)      unzip $1          ;;
           *.Z)        uncompress $1    ;;
           *)          echo "Unable to extract '$1' :: Unknown extension"
       esac
   else
       echo "File ('$1') does not exist!"
   fi
}


考虑到使用的不多,配置又麻烦,我没有配置这个功能
不过我想肯定有人愿意配置一下
最好弄个符合国情的标准出来,大家共享之 :lol:
上次由 kardinal 在 2008-07-28 22:16,总共编辑 1 次。
头像
roylez
帖子: 1928
注册时间: 2005-10-04 10:59
来自: 上海

#22

帖子 roylez » 2008-07-27 9:33

动态screen title,需要与screen配合。

代码: 全选

#screen integration to set caption bar dynamically
function title {
if [[ $TERM == "screen" || $TERM == "screen.linux" ]]; then
    # Use these two for GNU Screen:
    print -nR $'\033k'$1$'\033'\\\

    print -nR $'\033]0;'$2$'\a'
elif [[ $TERM == "xterm" || $TERM == "urxvt" ]]; then
    # Use this one instead for XTerms:
    print -nR $'\033]0;'$*$'\a'
    #trap 'echo -ne "\e]0;$USER@$HOSTNAME: $BASH_COMMAND\007"' DEBUG
fi
}

#set screen title if not connected remotely
function precmd {
    title "`print -Pn "%~" | sed "s:\([~/][^/]*\)/.*/:\1...:"`" "$TERM $PWD"
    echo -ne '\033[?17;0;127c'
}

function preexec {
    emulate -L zsh
    local -a cmd; cmd=(${(z)1})
    if [[ $cmd[1]:t == "ssh" ]]; then
        title "@"$cmd[2] "$TERM $cmd"
    elif [[ $cmd[1]:t == "sudo" ]]; then
        title "#"$cmd[2]:t "$TERM $cmd[3,-1]"
    elif [[ $cmd[1]:t == "for" ]]; then
        title "()"$cmd[7] "$TERM $cmd"
    elif [[ $cmd[1]:t == "svn" ]]; then
        title "$cmd[1,2]" "$TERM $cmd"
    else
        title $cmd[1]:t "$TERM $cmd[2,-1]"
    fi 
}
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#23

帖子 kardinal » 2008-07-27 15:37

roylez 写了:动态screen title,需要与screen配合。

代码: 全选

#screen integration to set caption bar dynamically
function title {
if [[ $TERM == "screen" || $TERM == "screen.linux" ]]; then
    # Use these two for GNU Screen:
    print -nR $'\033k'$1$'\033'\\\

    print -nR $'\033]0;'$2$'\a'
elif [[ $TERM == "xterm" || $TERM == "urxvt" ]]; then
    # Use this one instead for XTerms:
    print -nR $'\033]0;'$*$'\a'
    #trap 'echo -ne "\e]0;$USER@$HOSTNAME: $BASH_COMMAND\007"' DEBUG
fi
}

#set screen title if not connected remotely
function precmd {
    title "`print -Pn "%~" | sed "s:\([~/][^/]*\)/.*/:\1...:"`" "$TERM $PWD"
    echo -ne '\033[?17;0;127c'
}

function preexec {
    emulate -L zsh
    local -a cmd; cmd=(${(z)1})
    if [[ $cmd[1]:t == "ssh" ]]; then
        title "@"$cmd[2] "$TERM $cmd"
    elif [[ $cmd[1]:t == "sudo" ]]; then
        title "#"$cmd[2]:t "$TERM $cmd[3,-1]"
    elif [[ $cmd[1]:t == "for" ]]; then
        title "()"$cmd[7] "$TERM $cmd"
    elif [[ $cmd[1]:t == "svn" ]]; then
        title "$cmd[1,2]" "$TERM $cmd"
    else
        title $cmd[1]:t "$TERM $cmd[2,-1]"
    fi 
}
截个图瞅瞅效果
screen这种东东我一般不用
容易晕脑
我还有更好的办法 赶明个儿发个贴介绍下我的秘密武器 :lol:
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#24

帖子 kardinal » 2008-07-27 15:39

配置文件里的提示符有点问题
似乎有特殊字符粘贴的时候给粘歪了
我回去看看再说

整了个投票
大家没事投一票
每人限投一票,多投系统不允许 :lol:
头像
roylez
帖子: 1928
注册时间: 2005-10-04 10:59
来自: 上海

#25

帖子 roylez » 2008-07-28 12:06

kardinal 写了:
截个图瞅瞅效果
screen这种东东我一般不用
容易晕脑
我还有更好的办法 赶明个儿发个贴介绍下我的秘密武器 :lol:
如你所愿。附件是录像。
附件
zshscreen.tar.gz
(738.66 KiB) 已下载 451 次
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#26

帖子 BigSnake.NET » 2008-07-28 12:45

代码: 全选

       CDPATH  命 令 cd 的搜索路径。这是一个冒号分隔的目录列表,shell 从中查找
              cd 命令的目标目录。可以是这样: ".:~:/usr".
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#27

帖子 BigSnake.NET » 2008-07-28 12:51

其实bash也有可编程补全
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#28

帖子 eexpress » 2008-07-28 13:08

金,就喜欢搞这些的。合口味了。

球猫说的对,bash_completion就是脚本,应该可以扩展出很多功能的。反正根据软件补全相应文件类型的文件名,都有了。够好了。
● 鸣学
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#29

帖子 bones7456 » 2008-07-28 13:10

其实shell这种东西,够用就好
关注我的blog: ε==3
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#30

帖子 kardinal » 2008-07-28 14:12

eexpress 写了:金,就喜欢搞这些的。合口味了。

球猫说的对,bash_completion就是脚本,应该可以扩展出很多功能的。反正根据软件补全相应文件类型的文件名,都有了。够好了。
一个细节:
Bash补全后,菜单出现在当前命令的上方
Zsh补全后,菜单出现在当前命令的下方,是动态的
这就是说,猛按N次TAB之后,BASH已经刷了M屏了,而ZSH还是那一行
差别不算大,但是感觉上完全不一样 :lol:

这个是SHELL自身的功能,通过配置是不能实现的吧?如果能请告诉我


BASH也可以补全变量啊用户啊什么的,但是要按特殊的组合键,看过王垠那篇火星文的都知道
ZSH会自动根据上下文补全,所有可能出现的东西

bash_completion我也不是没有用过(用的时间挺长的应该说)
如果够好了,我为什么要用ZSH

另:
我一点都不怀疑阿姨选了第三个选项
上次由 kardinal 在 2008-07-28 14:20,总共编辑 1 次。
回复