2015-05-11 38 views
0

我意識到,當我在我的終端中時,我希望在空輸入時按Enter,以在我使用git回購時產生lsgit statusZSH:輸入行爲

我該如何做到這一點?我的意思是,在zsh上有Empty input -> Enter的自定義行爲?


編輯:謝謝你的幫助。這裏是我採取與preexec ...

precmd() { 
    echo $0; 
    if ["${0}" -eq ""]; then 
    if [ -d .git ]; then 
     git status 
    else 
     ls 
    fi; 
    else 
    $1 
    fi; 
} 
+0

嘗試改變'[ 「$ 1」 -eq 「」]]''到[ 「$ 1」 -eq 「」]'並把代碼放到'precmd',而不是'preexec'。 – user12341234

+0

謝謝。更新。如果我使用'$ 1',它始終是空的,如果我使用'$ 0',我仍然得到'壞模式:[zsh' ... –

+0

所以我贊同的'$ 0'內容,'$ 1'和'$ 2' 。這裏就是我有'preexec:$ 0 = preexec,$ 1 = 11,$ 2 = LS --color = tty的-lh'和'PRECMD:$ 0 = zsh中,$ 1 = $ 2 = 「」'。同樣重要的是要注意:按空字符串時不會調用「preexec」。而'precmd'不知道以前的命令。不知道我能在這裏實現我想要的... –

回答

0

輸入zsh的調用accept-line插件,這會導致緩衝器作爲命令被執行。

你可以寫你自己的小工具,以實現你想要的行爲,並重新綁定輸入

my-accept-line() { 
    # check if the buffer does not contain any words 
    if [ ${#${(z)BUFFER}} -eq 0 ]; then 
     # put newline so that the output does not start next 
     # to the prompt 
     echo 
     # check if inside git repository 
     if git rev-parse --git-dir > /dev/null 2>&1 ; then 
      # if so, execute `git status' 
      git status 
     else 
      # else run `ls' 
      ls 
     fi 
    fi 
    # in any case run the `accept-line' widget 
    zle accept-line 
} 
# create a widget from `my-accept-line' with the same name 
zle -N my-accept-line 
# rebind Enter, usually this is `^M' 
bindkey '^M' my-accept-line 

雖然這將是足以運行zle accept-line只在那裏實際上是一個命令的情況下,輸出後zsh不會放置新的提示。雖然可以用zle redisplay重新繪製提示,但如果使用多行提示,則可能會覆蓋輸出的最後一行。 (當然也有針對的解決方法了,但是沒有像剛纔使用zle accept-line簡單

警告:這redfines你的shell的(最)重要組成部分雖然沒有什麼不妥每? SE(否則我就不會在這裏貼吧),它具有非常現實的機會,使你的shell不可用,如果my-accept-line不完美運行。例如,如果zle accept-line人失蹤,你不能使用輸入確認任何命令(例如重新定義my-accept-line或啓動編輯器),請在將它放入您的~/.zshrc之前對其進行測試

此外,默認情況accept-line勢必Ctrl鍵 + Ĵ,太。我會建議離開它,以便有一個簡單的方法來運行默認accept-line

+0

感謝您的詳細解答。不幸的是,這個小部件似乎沒有被執行:如果我手動調用'zle -N my-accept-line',並且之前有一些'echo'test'',它就不會顯示出來。調用'my-accept-line'會執行,但在'zle accept-line'上失敗''只有當ZLE處於活動狀態時才能調用'widgets'(這在一些Google搜索後是正常的)... –

+0

在此處找到解決方案:http ://sgeb.io/articles/zsh-zle-closer-look-custom-widgets/更新了你的答案。 –

+1

我在腳本的最後一行錯誤地將'^ M'綁定到原來的'accept-line'而不是'my-accept-line'。這就是爲什麼它不起作用。你建議的編輯(使用'zle .accept-line'而不是'zle accept-line'並用'zle -N accept-line my-accept-line'而不是'zle -N my-accept覆蓋'accept-line' -line')也可以工作。雖然它會阻止使用** Ctrl + J **作爲後備。 – Adaephon