[分享]终极Shell——Zsh

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

心动VS行动?

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

Re: [分享]终极Shell——Zsh

#91

帖子 kardinal » 2009-01-08 9:36

lcg_music 写了:还是看不到图片,呵呵!!!
开源世界旅行手册 => 地理 => 命令系统

见以下页面
http://linuxtoy.org/docs/guide/ch14s07.html
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#92

帖子 kardinal » 2009-01-08 9:55

启用 auto_cd 后
光标在行首时,按 Tab 不缩进,而是出 cd 的候选菜单

这个功能如果能实现,auto_cd 就比较实用了,谁会弄? :em09

还有一个功能就是类似 fish 的 交互模式下的语法高亮
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#93

帖子 kardinal » 2009-01-08 10:12

搜索 zsh Interactive Syntax highlighting ,无意中发现一个好东东

代码: 全选

#less语法高亮。需要安装 source-highlight
PAGER='less -X -M'
export LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s"
export LESS=' -R '

#让 cat 命令也语法高亮
hlcat() { less $* | cat }
#不过这样一来,cat 重定向到文件时会产生许多控制字符。所以用其它名字
alias tom='hlcat'
头像
roylez
帖子: 1928
注册时间: 2005-10-04 10:59
来自: 上海

Re: [分享]终极Shell——Zsh

#94

帖子 roylez » 2009-01-08 14:36

kardinal 写了:搜索 zsh Interactive Syntax highlighting ,无意中发现一个好东东

代码: 全选

#less语法高亮。需要安装 source-highlight
PAGER='less -X -M'
export LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s"
export LESS=' -R '

#让 cat 命令也语法高亮
hlcat() { less $* | cat }
#不过这样一来,cat 重定向到文件时会产生许多控制字符。所以用其它名字
alias tom='hlcat'
less pipe,idea很好,不知道为什么维护得不是很规矩。说得啥能干的,语法高亮,看word/pdf,看压缩包内容……我下的几个less pipe的脚本都有毛病。后来就死了这门心思了……
弄个dropbox空间来备份文件或者做私人代码服务器
配置:[url]git://github.com/roylez/dotfiles.git[/url]
主页:http://roylez.heroku.com
各种稀奇玩意儿:http://dooloo.info
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#95

帖子 kardinal » 2009-01-08 15:22

我就看个语法高亮,凑合着还能用 :em06

关于
光标在行首时,按 Tab 不缩进,而是出 cd 的候选菜单
我抄了几句(可能有点丑,凑合看吧……shell 编程一窍不通,现查的)

代码: 全选

begin-of-line-complete(){
	zle up-history 
}
zle -N begin-of-line-complete
user-complete(){
	[[ -z $BUFFER ]] && zle begin-of-line-complete
	[[ -n $BUFFER ]] && zle expand-or-complete
}
zle -N user-complete

bindkey "\t" user-complete
现在的光标在行首(当前行为空),按 tab 能上翻历史纪录
光标在其它位置能补全

关键是在没有输入任何字符的情况下,按 tab 怎么出补全菜单
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [分享]终极Shell——Zsh

#96

帖子 eexpress » 2009-01-08 16:16

入魔道了。shell熟悉了都好用啊。为了点点小功能,要修修补补的,是折腾。那 fish 的功能不更强哦,不也是有bug而已。
都是金带的。
● 鸣学
头像
roylez
帖子: 1928
注册时间: 2005-10-04 10:59
来自: 上海

Re: [分享]终极Shell——Zsh

#97

帖子 roylez » 2009-01-08 17:48

kardinal 写了:我就看个语法高亮,凑合着还能用 :em06

关于
光标在行首时,按 Tab 不缩进,而是出 cd 的候选菜单
我抄了几句(可能有点丑,凑合看吧……shell 编程一窍不通,现查的)

代码: 全选

begin-of-line-complete(){
	zle up-history 
}
zle -N begin-of-line-complete
user-complete(){
	[[ -z $BUFFER ]] && zle begin-of-line-complete
	[[ -n $BUFFER ]] && zle expand-or-complete
}
zle -N user-complete

bindkey "\t" user-complete
现在的光标在行首(当前行为空),按 tab 能上翻历史纪录
光标在其它位置能补全

关键是在没有输入任何字符的情况下,按 tab 怎么出补全菜单
比我强,我一个zle的函数也没写过。如果你仅仅要看语法高亮,在你的vim安装目录里面找找看,有个叫less.vim的,就是专门干这个的。

查出来了:

代码: 全选

alias vless='vim -u /usr/share/vim/macros/less.vim'
弄个dropbox空间来备份文件或者做私人代码服务器
配置:[url]git://github.com/roylez/dotfiles.git[/url]
主页:http://roylez.heroku.com
各种稀奇玩意儿:http://dooloo.info
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#98

帖子 kardinal » 2009-01-08 21:24

eexpress 写了:入魔道了。
说的太对了 :em09 为什么俺非得要利用 auto_cd 这个功能呢?俺想到了一个很猥琐的实现方法 :em05

代码: 全选

user-complete(){
    [[ -n $BUFFER ]] && zle expand-or-complete
    [[ -z $BUFFER ]] && BUFFER="cd "
    zle end-of-line
    zle expand-or-complete
}
zle -N user-complete
bindkey "\t" user-complete

在新行直接 [tab] 就相当于 “cd [tab]”
试了几下,还挺爽的
eexpress 写了:那 fish 的功能不更强哦,不也是有bug而已。
都是金带的。
fish 的提示太详细了,提示参数用法到是不错,但大部分情况下不是很爽 ,比如 ls 一下就成这样的了

代码: 全选

a (Directory) b (Directory) c (Directory) d (Directory) e (Directory) ……
这是最直观的

还有就是运行效率不怎么高,定制能力不强(可能很强,不过俺不会;PS: ee 兄那么喜欢定制,用 zsh 绝对合你的胃口啊)
总之是不爽……

不过它的交互模式语法高亮到是不错,要在 zsh 中实现应该很麻烦……
eexpress 写了:为了点点小功能,要修修补补的,是折腾。
大腕 Linux 版: 你得清楚 linux 用户的心理,不求顺手,但求折腾……
eexpress 写了:shell熟悉了都好用啊。
这个俺不能认同。举几个例子
ls > a > b > c > d > e
这样的多重重定向,整个 bash 版的瞅瞅
当然,这种用法不实用,但是 zsh 里面管道重定向之类的组合很 BT

$() 这个也比 bash 里的 `` 好用多了
上面的返回内容, =() 返回文件名
比如
diff =(ls a/) =(ls b/) 比较 a b 两个文件夹的文件列表
用 bash 可以么?这些可都是不用任何设置就有的功能哦 :em09
上次由 kardinal 在 2009-01-08 21:33,总共编辑 1 次。
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#99

帖子 kardinal » 2009-01-08 21:30

roylez 写了: 比我强,我一个zle的函数也没写过。
也是没办法,要是能抄的话谁自个写啊 :em20
roylez 写了:
如果你仅仅要看语法高亮,在你的vim安装目录里面找找看,有个叫less.vim的,就是专门干这个的。

查出来了:

代码: 全选

alias vless='vim -u /usr/share/vim/macros/less.vim'

就是看个语法高亮,其它的还是用专门的工具好了

话说, lesspipe 查看到是不错,要是重定向到文件,会产生很多控制彩色显示的转义序列……看来也不是特别实用……
用 less.vim 是调用 vim 显示的吧? 应该不会有这个问题……不过好像不是标准输出,不能重定向啥的……
俺的要求是 1.标准输出 2.重定向不会产生转义序列
不知道现实不? :em06
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#100

帖子 kardinal » 2009-01-08 21:44

上面字太多了,再贴一遍

代码: 全选

##空行(光标在行首)补全 cd
#在行首按 tab ,出现 cd 命令和候选菜单
user-complete(){
    [[ -n $BUFFER ]] && zle expand-or-complete
    [[ -z $BUFFER ]] && BUFFER="cd "
    zle end-of-line
    zle expand-or-complete
}
zle -N user-complete
bindkey "\t" user-complete
大伙儿试试这个实用不,要是觉得还行的话就加到一楼配置文件里
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#101

帖子 kardinal » 2009-01-09 13:38

x了,觉得有点不对劲……
不知道下面哪种看起来比较不那么猥琐 :em06

代码: 全选

user-complete(){
    if [[ -n $BUFFER ]] ; then
        zle expand-or-complete
    else
        BUFFER="cd "
        zle end-of-line
        zle expand-or-complete
    fi }
zle -N user-complete
bindkey "\t" user-complete

代码: 全选

user-complete(){
    [[ -n $BUFFER ]] && zle expand-or-complete
    [[ -z $BUFFER ]] && {
	BUFFER="cd " 
	zle end-of-line
	zle expand-or-complete }
    }
zle -N user-complete
bindkey "\t" user-complete
上次由 kardinal 在 2009-01-09 15:01,总共编辑 1 次。
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#102

帖子 kardinal » 2009-01-09 15:01

Alt+h man 当前命令
先显示以下信息。按除了 q 的任意键继续
ls is an alias for ls -F --color=auto
ls is /bin/ls

代码: 全选

alias run-help >&/dev/null && unalias run-help
autoload run-help
设置交互模式高亮

代码: 全选

zle_highlight=(region:bg=magenta #选中区域 (\C-@ 设置标记)
               special:bold      #特殊字符
               isearch:underline)#搜索关键字
历史命令 TOP10

代码: 全选

alias top10='print -l  ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
头像
roylez
帖子: 1928
注册时间: 2005-10-04 10:59
来自: 上海

Re: [分享]终极Shell——Zsh

#103

帖子 roylez » 2009-02-13 9:16

改了下,把alt-p,alt-n重新定义了下,比默认的稍微舒服点。

代码: 全选

bindkey "^[p" history-beginning-search-backward
bindkey "^[n" history-beginning-search-forward
当然,"^[p"是在vim里面按ctrl-v alt-p弄出来的。
弄个dropbox空间来备份文件或者做私人代码服务器
配置:[url]git://github.com/roylez/dotfiles.git[/url]
主页:http://roylez.heroku.com
各种稀奇玩意儿:http://dooloo.info
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#104

帖子 kardinal » 2009-02-28 10:30

试了半天,没有发现有什么特别的 :em06

突然想起来前面有位兄弟说的,每个目录使用单独的历史纪录,这功能好像不错

俺问了问 google , 找到一个 bash 版的

代码: 全选

function mycd()
{
   history -w # write current history  file
   builtin cd "$@"  # do actual c d
   local HISTDIR="$HOME/.dir_bash_history$PWD" # use& nbsp;nested folders for history
   if  [ ! -d "$HISTDIR" ]&n bsp;; then # create folder if neede d
      mkdir -p "$HISTDIR"
   fi
   export HISTFILE="$HISTDIR/bash_history.txt" # set& nbsp;new history file
   history -c  # clear memory
   history -r #read from current histfile
}

shopt -s histappend
alias cd="mycd"
export HISTFILE="$HOME/.dir_bash_history$PWD/bash_history.txt"
思路不错,但是不能直接在 zsh 中用

google 又提供了 zsh 版的

代码: 全选

 chpwd() {
	local ohistsize=$HISTSIZE
    	fc -W ~-/.history.$UID
	HISTSIZE=0		# Discard previous dir's history
	HISTSIZE=$ohistsize	# Prepare for new dir's history
	fc -R ./.history.$UID
    }
……比较天马行空,不过说明了具体的实现方式
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#105

帖子 kardinal » 2009-02-28 10:33

最后,经过反复的捣鼓捣鼓再捣鼓……,俺捣鼓出 zsh 版的,可以正常使用的。试试这个咋样 :em11

代码: 全选

#每个目录使用独立的历史纪录
cd() {
    builtin cd "$@"                             # do actual cd
    fc -W                                       # write current history  file
    local HISTDIR="$HOME/.zsh_history$PWD"      # use nested folders for history
        if  [ ! -d "$HISTDIR" ] ; then          # create folder if needed
            mkdir -p "$HISTDIR"
        fi
        export HISTFILE="$HISTDIR/zhistory"     # set new history file
    touch $HISTFILE
    local ohistsize=$HISTSIZE
        HISTSIZE=0                              # Discard previous dir's history
        HISTSIZE=$ohistsize                     # Prepare for new dir's history
    fc -R                                       #read from current histfile
}
mkdir -p $HOME/.zsh_history$PWD
export HISTFILE="$HOME/.zsh_history$PWD/zhistory"
上次由 kardinal 在 2009-03-01 9:39,总共编辑 4 次。
回复