4

Mark Dotto(http://markdotto.com/2013/01/13/improved-terminal-hotness/)からこのコードを使用して、端末を少しセクシーにしました。コードを編集せずにコピーしたので、次のよう.bash_profileに追加しました。

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がどのように機能するかを完全に知っています、誰かが助けることができますか?ありがとう

4

2 に答える 2

3

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\]-このブロックは前景のテキストの色を設定します(水色/ティール)
  • \w-現在の作業ディレクトリ
  • \[\e[33m\]-異なるテキストの色を設定します(黄色)
  • git ... grep ... sed-現在のgitブランチを取得します
  • \[\e[0m\]-テキストの色を白にリセットして、コマンドを黄色で入力しないようにします

色を気にしないのであれば、プロンプトはかなり些細なことです。カラーブロックを使用すると、少し複雑になり、(これまで見てきたように)エラーが発生しやすくなります。

于 2013-02-01T14:38:14.677 に答える
3

まず第一に:BASHシェルを使用していることを確認してください。

私はMacBookのMountainLionにいて、PS1コマンドのようなものです。私のプロンプトは次のようになります。

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

問題は、プロンプトに何をさせたいかということだと思います。BASHプロンプトは、Kornshellではちょっとしたハッキン​​グが必要なあらゆる種類のきちんとしたことを実行できる一連のエスケープシーケンスを埋め込むことができます。

コマンドラインで入力し、 PROMPTINGman bashの見出しを見つけます。次のように表示されます。

   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="\u@\h:\w$ "

これは私に与えるでしょう:

 david@davebook:~$ _

\u私のユーザー名(david)、\hは私のマシン名(davebook)であり、\w私の$HOMEディレクトリに関連する現在のディレクトリが表示されます。

プロンプトにコマンドを埋め込むこともできます。

PS1="\$(date) \u@\h:\w$ "

これで、日付と時刻がプロンプトに埋め込まれます。

Fri Feb  1 09:45:53 EST 2013 david@DaveBook:~

ちょっとばかげています(私は日付をフォーマットする必要がありました。さらに、BASHはすでに日付のシーケンスを組み込んでいます)が、あなたはその考えを理解します。

独自のプロンプトを作成することをお勧めします。あなたがgitユーザーであり、コマンドラインを快適に使用しているのであれば、あなたはおそらくあなたが望むように見えるようにあなた自身に素晴らしいプロンプトを出すことができます。構文を使用して、\$(command)新しいPSコマンドごとに実行される対話型コマンドを含めることができます。ANSIエスケープコードを使用して、プロンプトのさまざまな部分に色を付けたり、すばらしい機能を実行させたりすることができます。

プロンプトをゆっくりと少しずつ作成します。を設定するシェルスクリプトを作成し、PS1次のようにソースします。

$ echo "PS='\u@\h:\w\$ " > prompt.sh
$ chmod a+x prompt.sh
$ . prompt.sh

次に、プロンプトが希望どおりに機能するようになるまで、プロンプトに機能を追加します。

個人的には、派手なプロンプトは、予想外のときにバラバラになる傾向があるという理由だけで避けています。たとえば、私は編集にVIシーケンスを使用していますが、コマンドラインを編集しようとすると、そのプロンプトは完全にバラバラになります。

ファンシーなプロンプトは、最初の数分間は本当にクールなTalking Mooseのようなプログラムを思い出させ、その後は本当に、本当に迷惑になり始めます。

于 2013-02-01T15:01:09.220 に答える