在每個目錄下,經常用到的命令是不一樣的比如在源碼目錄下常用的是 make xxx ,在配置文件目錄下常用的是 vi xxx …… 這種情況下,每個目錄使用獨立的歷史紀錄就比較方便(似乎有發行版中的 bash 默認如此設置) 實現方式很簡單: 1. 在 $HOME/.zshhistory 目錄下創建與工作目錄層級相同的目錄,並在使用該目錄下的 zhistory 作為歷史紀錄文件 2. 由於切換目錄總是使用 cd 命令,因此在 cd 的時候重新設定 $HISTFILE 變量即可 ($HISTFILE 指定 zsh 使用的歷史紀錄文件) # 定義函數,替換原來的 cd
cd() {
builtin cd "$@" # 執行原來的 cd 命令
fc -W # 寫歷史紀錄文件,默認參數為 $HISTFILE 。初始值為 #2 處的定義;執行了 cd 命令後為 #1 處的定義
# 實際上,你不可能在每個目錄下都執行個把命令,很多目錄你沒有去過,只要為你去過的目錄建立歷史紀錄就可以了
local HISTDIR="$HOME/.zsh
history$PWD" # 定義歷史紀錄目錄。每次 cd 後,$PWD 對應與工作目錄層級相同的目錄
if [ ! -d "$HISTDIR" ] ; then # 如果不存在這個目錄,則建立一個
mkdir -p "$HISTDIR"
fi
export HISTFILE="$HISTDIR/zhistory" #1 定義歷史紀錄文件
touch $HISTFILE # 先 touch 一下,如果不存在的話就會新建一個
# 清空原來的歷史紀錄
local ohistsize=$HISTSIZE # 設定一個變量臨時存儲原歷史紀錄大小
HISTSIZE=0 # 通過禁用歷史紀錄清空
HISTSIZE=$ohistsize # 重新設定歷史紀錄大小
fc -R #讀歷史紀錄文件,默認參數為 $HISTFILE 。也就是 #1 處的定義
}
# 啟動 zsh 的時候,並沒有執行 cd 命令,因此 $HOME 目錄對應的歷史紀錄目錄可能不存在,先建立它
mkdir -p $HOME/.zshhistory$PWD
#2 同樣,啟動 zsh 的時候, 還沒有定義 $HOME 目錄對應的 $HISTFILE ,所以先定義它
export HISTFILE="$HOME/.zshhistory$PWD/zhistory"
這樣翻歷史紀錄是方便了,但要查看全部的歷史紀錄可能有點麻煩了
# 使用 setopt EXTENDED_HISTORY 選項,為命令添加時間戳 # 這非常重要,匯總到一起的歷史紀錄比較混亂,時間戳是重新排序的依據# 定義 allhistory ,將所有的歷史紀錄匯總到一起 function allhistory { cat $(find $HOME/.zsh_history -name zhistory) } # 針對歷史紀錄的格式進行轉換 function convhistory { sort $1 | #排序 uniq | #合並相同行。 #由於時間戳精確到秒,所以幾乎不可能有相同的紀錄 #出現相同的紀錄是因為 zsh 的處理方式,每次 cd 會在兩個紀錄文件中產生相同的 cd 命令 sed 's/^:([ 0-9]*):[0-9]*;(.*)/\1::::::\2/' | #去掉歷史紀錄中不需要的字段。添加自定義的分隔符,方便下一步處理 awk -F"::::::" '{ $1=strftime("%Y-%m-%d %T",$1) "|"; print }' # 將 UNIX 時間戳轉換成可以看懂的格式 }
#使用 histall 命令查看全部歷史紀錄 function histall { convhistory =(allhistory) | sed '/^.{20} *cd/i\' } # 在每個 cd 命令前添加空行,判斷工作目錄比較容易 # 可能會有一點不准確。因為啟動和退出時不執行 cd 命令,沒有相應的紀錄。尤其是同時運行多個 zsh 的時候 #使用 hist 查看當前目錄歷史紀錄 function hist { convhistory $HISTFILE }
#全部歷史紀錄 top20 #統計單詞出現的次數 function top20 { allhistory | awk -F':[ 0-9]:[0-9];' '{ $1="" ; print }' | sed 's/ /\n/g' | # 根據空格拆分單詞,可能不准確,比如 "\ " 之類的。但是以這類單詞出現的頻率,應該不會進入 top20 # 本著我不會的就是不需要的原則,不作相應的處理了 sed '/^$/d' | sort | uniq -c | sort -nr | head -n 20 }
切換目錄時輸入 cd 還是比較麻煩的,下面的腳本實現在沒有輸入任何內容的情況下按 TAB ,自動填入 "cd [TAB]"
user-complete(){ if [[ -n $BUFFER ]] ; then # 如果該行有內容 zle expand-or-complete # 執行 TAB 原來的功能 else # 如果沒有 BUFFER="cd " # 填入 cd(空格) zle end-of-line # 這時光標在行首,移動到行末 zle expand-or-complete # 執行 TAB 原來的功能 fi } zle -N user-complete bindkey "\t" user-complete #將上面的功能綁定到 TAB 鍵
有時候輸完了一個命令,才想起這個命令需要管理員權限,這時最快的步驟為: Ctrl+a s u d o (空格)[Ctrl+e] 按兩下 ESC 鍵完成上面的過程:
sudo-command-line() { [[ -z $BUFFER ]] && zle up-history [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER" #光標移動到行末 zle end-of-line } zle -N sudo-command-line #定義快捷鍵為: [Esc] [Esc] bindkey "\e\e" sudo-command-line
以下配置文件供參考 WP會自動把引號轉換為成對的,可以復制這裡的配置文件:
#命令提示符 {{{ RPROMPT=$(echo '%{33[31m%}%D %T%{33[m%}') PROMPT=$(echo '%{33[34m%}%M%{33[32m%}%/ %{33[36m%}%n%{33[01;33m%} >>> %{33[m%}') #}}}#關於歷史紀錄的配置 {{{ #歷史紀錄條目數量 export HISTSIZE=10000 #注銷後保存的歷史紀錄條目數量 export SAVEHIST=10000 #歷史紀錄文件 #export HISTFILE=~/.zhistory #以附加的方式寫入歷史紀錄 setopt INCAPPENDHISTORY #如果連續輸入的命令相同,歷史紀錄中只保留一個 setopt HISTIGNOREDUPS
#為歷史紀錄中的命令添加時間戳 setopt EXTENDED_HISTORY#啟用 cd 命令的歷史紀錄,cd -[TAB]進入歷史路徑 setopt AUTOPUSHD #相同的歷史路徑只保留一個 setopt PUSHDIGNORE_DUPS
#在命令前添加空格,不將此命令添加到紀錄文件中 #setopt HISTIGNORESPACE #}}}
#每個目錄使用獨立的歷史紀錄{{{ cd() { builtin cd "$@" # do actual cd fc -W # write current history file local HISTDIR="$HOME/.zshhistory$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/.zshhistory$PWD export HISTFILE="$HOME/.zsh_history$PWD/zhistory"
function allhistory { cat $(find $HOME/.zsh_history -name zhistory) } function convhistory { sort $1 | uniq | sed 's/^:([ 0-9]*):[0-9]*;(.*)/\1::::::\2/' | awk -F"::::::" '{ $1=strftime("%Y-%m-%d %T",$1) "|"; print }'
} #使用 histall 命令查看全部歷史紀錄 function histall { convhistory =(allhistory) | sed '/^.{20} *cd/i\' } #使用 hist 查看當前目錄歷史紀錄 function hist { convhistory $HISTFILE }#全部歷史紀錄 top44 function top44 { allhistory | awk -F':[ 0-9]:[0-9];' '{ $1="" ; print }' | sed 's/ /\n/g' | sed '/^$/d' | sort | uniq -c | sort -nr | head -n 44 }
#}}}
#雜項 {{{ #允許在交互模式中使用注釋 例如: #cmd #這是注釋 setopt INTERACTIVE_COMMENTS
#啟用自動 cd,輸入目錄名回車進入目錄 #稍微有點混亂,不如 cd 補全實用 #setopt AUTO_CD
#禁用 core dumps limit coredumpsize 0
#Emacs風格 鍵綁定 bindkey -e #設置 [DEL]鍵 為向後刪除 bindkey "\e[3~" delete-char
#以下字符視為單詞的一部分 WORDCHARS='*?_-[]~=&;!#$%^(){}<>' #}}}
#自動補全功能 {{{ setopt AUTOLIST setopt AUTOMENU #開啟此選項,補全時會直接選中菜單項 #setopt MENU_COMPLETE
autoload -U compinit compinit
#自動補全緩存 #zstyle ':completion::complete:' use-cache on #zstyle ':completion::complete:' cache-path .zcache #zstyle ':completion::cd:' ignore-parents parent pwd
#自動補全選項 zstyle ':completion::match:' original only zstyle ':completion::prefix-1:' completer _complete zstyle ':completion:predict:' completer _complete zstyle ':completion:incremental:*' completer _complete _correct zstyle ':completion:*' completer _complete _prefix _correct _prefix _match _approximate
#路徑補全 zstyle ':completion:' expand 'yes' zstyle ':completion:' squeeze-shlashes 'yes' zstyle ':completion::complete:*' '\'
zstyle ':completion:' menu select zstyle ':completion::*:default' force-list always
#彩色補全菜單 eval $(dircolors -b) export ZLSCOLORS="${LSCOLORS}" zmodload zsh/complist zstyle ':completion:*' list-colors ${(s.:.)LSCOLORS} zstyle ':completion:::kill::processes' list-colors '=(#b) #([0-9]#)=0=01;31'
#錯誤校正 zstyle ':completion:' completer _complete _match _approximate zstyle ':completion::match:' original only zstyle ':completion::approximate:*' max-errors 1 numeric
#kill 命令補全 compdef pkill=kill compdef pkill=killall zstyle ':completion:::kill:' menu yes select zstyle ':completion:::::processes' force-list always zstyle ':completion::processes' command 'ps -au$USER'
#補全類型提示分組 zstyle ':completion::matches' group 'yes' zstyle ':completion:' group-name '' zstyle ':completion::options' description 'yes' zstyle ':completion::options' auto-description '%d' zstyle ':completion::descriptions' format $'\e[01;33m -- %d --\e[0m' #' zstyle ':completion::messages' format $'\e[01;35m -- %d --\e[0m' #' zstyle ':completion:*:warnings' format $'\e[01;31m -- No Matches Found --\e[0m' #' #}}}
##行編輯高亮模式 {{{ # Ctrl+@ 設置標記,標記和光標點之間為 region zle_highlight=(region:bg=magenta #選中區域 special:bold #特殊字符 isearch:underline)#搜索時使用的關鍵字 #}}}
##空行(光標在行首)補全 cd {{{ 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 #}}}
##在命令前插入 sudo {{{ #定義功能 sudo-command-line() { [[ -z $BUFFER ]] && zle up-history [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER" #光標移動到行末 zle end-of-line } zle -N sudo-command-line #定義快捷鍵為: [Esc] [Esc] bindkey "\e\e" sudo-command-line #}}}
#命令別名 {{{ alias cp='cp -i' alias mv='mv -i' alias rm='rm -i' alias ls='ls -F --color=auto' alias ll='ls -l' alias grep='grep --color=auto' alias ee='emacsclient -t'
#[Esc][h] man 當前命令時,顯示簡短說明 alias run-help >&/dev/null && unalias run-help autoload run-help
#歷史命令 top10 alias top10='print -l ${(o)history%% *} | uniq -c | sort -nr | head -n 10' #}}}
#路徑別名 {{{ #進入相應的路徑時只要 cd ~xxx hash -d WWW="/home/lighttpd/html" hash -d ARCH="/mnt/arch" hash -d PKG="/var/cache/pacman/pkg" hash -d E="/etc/env.d" hash -d C="/etc/conf.d" hash -d I="/etc/rc.d" hash -d X="/etc/X11" hash -d BK="/home/r00t/config_bak" #}}}
##for Emacs {{{ #在 Emacs終端 中使用 Zsh 的一些設置 不推薦在 Emacs 中使用它 if [[ "$TERM" == "dumb" ]]; then setopt No_zle PROMPT='%n@%M %/ >>' alias ls='ls -F' fi
#}}}####{{{ function timeconv { date -d @$1 +"%Y-%m-%d %T" }
zstyle ':completion::ping:' hosts 129.27.2.3 www.tugraz.at \ 10.16.17.1{{7..9},} # }}}
## END OF FILE ################################################################# # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4
(下載 Zsh 配置文件)
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2012年資料/8月/9日/Zsh使用心得三則