2010-05-13 65 views
5

我希望在zsh shell中達到與Saving current directory to bash history中所述相同的效果。我沒有做任何的zsh trickry之前,但到目前爲止,我有:將當前目錄保存到zsh歷史中

function precmd { 
hpwd=$history[$((HISTCMD-1))] 
if [[ $hpwd == "cd" ]]; then 
cwd=$OLDPWD 
else 
cwd=$PWD 
fi 
hpwd="${hpwd% ### *} ### $cwd" 
echo "$hpwd" >>~/.hist_log 
} 

現在我保存的目錄名到一個日誌文件註釋的命令。這對我來說很好。只是認爲可能有辦法在歷史緩衝區中進行替換。

+3

可能的重複[我如何(從腳本)添加一些東西到zsh命令的歷史?](http://stackoverflow.com/questions/2816225/how-can-i-from-a-script-add - 什麼東西到這個zsh命令歷史) – 2010-05-13 11:02:53

回答

6
function _-accept-line() { 
    [[ -z "${BUFFER" ]] || [[ "${BUFFER}" =~ "### ${(q)PWD}\$" ]] || BUFFER="${BUFFER} ### ${PWD}" 
    zle .accept-line 
} 
zle -N accept-line _-accept-line 

將添加### ${PWD}到您的命令行。不是你可以使用的最好的解決方案,但它的工作原理。

UPD:基於@Dennis威廉姆森的評論答案:

function zshaddhistory() { 
    print -sr "${1%%$'\n'} ### ${PWD}" 
    fc -p 
} 
+0

謝謝丹尼斯和Zyx。它按預期工作。丹尼斯,這是重複的。不知何故,這個問題沒有在我的搜索過程中顯示出來。你關於bash/zsh歷史的文章很有幫助,而且內容翔實。 – Sandeep 2010-05-13 20:06:46

+0

有人可以向我解釋爲什麼'fc -p'需要?爲什麼當我不在這裏放置'fc -p'時,歷史列表爲每個命令獲得兩個條目(第一個是包含路徑的條目,第二個條目是簡單的)? – 2013-07-08 21:30:20

+0

我一直在努力解析'#'字符,但開啓'setopt interactivecomments'解決了這個問題,我現在對這個設置很滿意。當你遍歷它時,它擴大了命令歷史,這讓我很難過。 – 2013-07-09 01:55:27

3

而不是將其存儲在我增加了以下我PRECMD的beginging()函數來存儲它,當我更改目錄的每一個命令:

if [ "$LAST_DIR" != "$PWD" ] 
    then 
      print -s "##dir## $PWD" 
      LAST_DIR=$PWD 
    fi 

添加一個「## DIR DIR ##名」獨立線到歷史中的每個命令是從一個新的目錄中運行時間。

+1

我喜歡'print -s「$ PWD#Path」',這樣我可以調出這個歷史記錄全部正常,並且它已經準備就緒對我來說,按Enter鍵自動切換到該路徑(這是'zsh'的一個特性,如果你只是提供'cd' /'pushd'的路徑)。 **然而,**我確實相信這種方法存在根本上的缺陷:如果你有兩個開放的術語,每個術語都在不同的目錄中,然後保留它們各自的目錄,但在它們之間切換髮出命令,不可能知道哪些目錄發生了這些命令在!這是失敗:( – 2013-07-09 01:50:49