2013-02-01 178 views
3

我開始使用Mark Dotto的這個代碼(http://markdotto.com/2013/01/13/improved-terminal-hotness/)來讓我的終端更具性感。 我剛纔複製的代碼,而無需編輯它,所以在我.bash_profile我說:mac os x終端的怪異行爲

export PS1='\[\e[0:35m⌘\e[m \e[0:36m\w/\e[m \e[0:33m`git branch 2> /dev/null | grep -e ^* | sed -E s/^\\\\\*\ \(.+\)$/\(\\\\\1\)\ /`\e[m\]' 

一切的工作,但有一個奇怪的事情:當我輸入3個字符以內,然後我打退格鍵,它刪除一切,甚至左側的信息(路徑和git分支)。 這可能是好的,但問題是,當我繼續打字後,我開始輸入的命令仍然在這裏(但隱藏)。 我想你不明白,所以我會盡量展現一些代碼:

# this is what my prompt looks like 
~/my/path/ (branch) | 

# I start typing a command 
~/my/path/ (branch) ls| 

# now I hit backspace once 
| 

# everything is removed 
# but if I type something else then hit return 
git st| 

# it throws an error as the `l` from the previous command is still here 
-bash: lgit: command not found 

我完全知道想法如何.bash_profile中的作品,任何人都可以幫忙嗎?謝謝

回答

2

似乎有一些不正確的語法在您的PS1變量,這是導致一些意外的錯誤。試試這個版本來代替:

export PS1='\[\e[36m\]\w \[\e[33m\]`git branch 2> /dev/null | grep -e ^* | sed -E s/^\\\\\*\ \(.+\)$/\(\\\\\1\)\ /` \[\e[0m\]' 

(注:我獨自一人離開了git ... grep ... sed管道,只有編輯相關提示本身的部分。)

編輯 - 取出0:部件和顏色的實際工作。 (即\[\e[36m\]而不是\[\e[0:36m\]

,這裏是發生了什麼事情在那裏的一個細分:

  • \[\e[36m\] - 此塊設置前景文本顏色(淡藍色/ tealish)
  • \w - 當前工作目錄
  • \[\e[33m\] - 設置不同的文本顏色(黃色)
  • git ... grep ... sed - 檢索您當前的Git分支
  • \[\e[0m\] - 重置文本顏色爲白色,你不是在黃

鍵入命令,如果你不在乎顏色,提示是相當瑣碎的事情。顏色塊使它更復雜一點,並且(如你所見)容易出錯。

3

首先:確保您使用的是BASH外殼。

我在山貓上的MacBook和PS1命令的種類,作品。我的提示是這樣的:

⌘ ~/SVN-Precommit-Kitchen-Sink-Hook.git/ (master) _ 

我想問題是你想讓你的提示做什麼。 BASH提示可以嵌入一大堆轉義序列,這些序列可以完成各種在Kornshell中進行少量黑客入侵的整潔事情。

在命令行上輸入man bash,然後找到PROMPTING標題。你應該看到類似這樣的東西:

When executing interactively, bash displays the primary prompt PS1 when it is ready to read a com- 
    mand, and the secondary prompt PS2 when it needs more input to complete a command. Bash allows these 
    prompt strings to be customized by inserting a number of backslash-escaped special characters that 
    are decoded as follows: 
      \a  an ASCII bell character (07) 
      \d  the date in "Weekday Month Date" format (e.g., "Tue May 26") 
      \D{format} 
       the format is passed to strftime(3) and the result is inserted into the prompt string; 
       an empty format results in a locale-specific time representation. The braces are 
       required 
      \e  an ASCII escape character (033) 
      \h  the hostname up to the first `.' 
      \H  the hostname 
      \j  the number of jobs currently managed by the shell 
      \l  the basename of the shell's terminal device name 
      \n  newline 
      \r  carriage return 
      \s  the name of the shell, the basename of $0 (the portion following the final slash) 
      \t  the current time in 24-hour HH:MM:SS format 
      \T  the current time in 12-hour HH:MM:SS format 
      \@  the current time in 12-hour am/pm format 
      \A  the current time in 24-hour HH:MM format 
      \u  the username of the current user 
      \v  the version of bash (e.g., 2.00) 
      \V  the release of bash, version + patch level (e.g., 2.00.0) 
      \w  the current working directory, with $HOME abbreviated with a tilde 
      \W  the basename of the current working directory, with $HOME abbreviated with a tilde 
      \!  the history number of this command 
      \#  the command number of this command 
      \$  if the effective UID is 0, a #, otherwise a $ 
      \nnn the character corresponding to the octal number nnn 
      \\  a backslash 
      \[  begin a sequence of non-printing characters, which could be used to embed a terminal 
       control sequence into the prompt 
      \]  end a sequence of non-printing characters 

讓我們來看一個簡單的提示。我想顯示我的用戶名,我正在使用的系統和當前目錄。我可以設置PS1這樣的:

PS1="\[email protected]\h:\w$ " 

這會給我:

[email protected]:~$ _ 

\u我的用戶名(大衛),該\h是我的機器名(davebook),以及\w顯示器當前目錄我與我的$HOME目錄有關。

您也可以在提示中嵌入命令太:

PS1="\$(date) \[email protected]\h:\w$ " 

現在的日期和時間將被嵌入在我的提示:

Fri Feb 1 09:45:53 EST 2013 [email protected]:~ 

排序傻(我應該已經格式化的日期另外,BASH已經建立了日期序列),但你明白了。

我建議你建立你自己該死的提示。如果你是一個git的用戶,並且你使用的命令行很舒服,那麼你可以自己做出一個很好的提示,讓它看起來像你想要的樣子。您可以使用\$(command)語法來包含每個新PS命令都執行的交互式命令。您可以使用ANSI escape codes對提示的不同部分進行着色,或者讓它們做很棒的事情。

慢慢地逐個構建您的提示。創建一個shell腳本,將設置PS1,和源它是這樣的:

$ echo "PS='\[email protected]\h:\w\$ " > prompt.sh 
$ chmod a+x prompt.sh 
$ . prompt.sh 

然後,添加越來越多的功能,以您的提示,直到你得到它的工作您想要的方式。

就我個人而言,我避免過於花哨的提示,只是因爲它們在你最不期待的時候傾向於分崩離析。例如,我使用VI序列進行編輯,並且只要我嘗試編輯我的命令行,該提示就會完全分開。

花式提示讓我想起像Talking Moose這樣的程序,這些程序在開始的幾分鐘內真的很酷,然後開始變得真的很煩人。

+0

我接受了其他答案,因爲它解決了我的問題,但如果我能我會+1000您的答案。我已經使用了這個片段,因爲我不知道這是如何工作的,並且感謝你我現在做的!我基本上想要的是git分支,所以我一定會在稍後做出自己的提示以刪除無用的部分。再次感謝! – romainberger

+0

我總是同意這個答案的結論。適應你的提示通常工作正常。根據我的經驗,只要您將顏色序列帶入其中,就會在提示中提到有關退格,歷史和換行符的奇怪行爲。我喜歡色彩繽紛的提示幾天,然後再次刪除顏色控制序列,現在bash再次正常工作。雖然着色「ll」輸出完全沒有問題。 –