如何在提示中使用这些类型的代码?

时间:2015-01-23 23:06:33

标签: bash command-prompt

我的提示效果很好,看起来像这样:

export PS1="\[${ORANGE}\]\u \[${DARK}\]@ \[${YELLOW}\]\h \[${DARK}\]in \[${CYAN}\]\[$CUR_DIR\] \[${LIGHT}\]\$ "

我希望能够在前面或后面添加以下\ 342 \ 203 \ 240代码。

我无法使其正常工作。停止符号看起来是正确的,但每当我有一个长命令和退格键来删除长命令(一个足够长的命令将终端包装到一个新行)时,提示会覆盖自己。这些线条不会互相覆盖,但当我退回到命令的末尾时...不知何故,我可以再退格2次......如果这是有道理的。据推测,我错过了逃脱序列或其他东西,但我无法弄清楚什么是readline(?)不喜欢/理解。我想修复的破碎的例子:

export PS1="\[${BLDRED}\]\[\342\203\240\] \[${LIGHT}\]: \[${ORANGE}\]\u \[${DARK}\]@ \[${YELLOW}\]\h \[${DARK}\]in \[${CYAN}\]\[$CUR_DIR\] \[${LIGHT}\]\$ "

OSX Yosemite:GNU bash,版本3.2.53(1)-release(x86_64-apple-darwin14)

我做错了什么?

更新

完整提示:

理想情况下,注释掉的行就是提示符。

ORANGE="\[\e[38;5;214m\]"
YELLOW="\[\e[38;5;228m\]"
CYAN="\[\e[0;36m\]"

BLDGRN="\[\e[1;32m\]" # Green - Bold
BLDRED="\[\e[1;31m\]" # Red - Bold

WHITE="\[\e[1;37m\]"
LIGHT="\[\e[0;37m\]"
DARK="\[\e[38;5;240m\]"

function lastc() {

  status=$? 

  CUR_DIR=$(basename "$PWD")

  if test $status -ne 0 ; then
    #export PS1="\[${BLDRED}\]\[\342\203\240\] \[${LIGHT}\]: \[${ORANGE}\]\u \[${DARK}\]@ \[${YELLOW}\]\h \[${DARK}\]in \[${CYAN}\]\[$CUR_DIR\] \[${LIGHT}\]\$ "
    export PS1="\[${ORANGE}\]\u \[${DARK}\]@ \[${YELLOW}\]\h \[${DARK}\]in \[${CYAN}\]\[$CUR_DIR\] \[${LIGHT}\]\$ "
  else
   # export PS1="\[${BLDGRN}\]\[\342\234\223\] \[${LIGHT}\]: \[${ORANGE}\]\u \[${DARK}\]@ \[${YELLOW}\]\h \[${DARK}\]in \[${CYAN}\]\[$CUR_DIR\] \[${LIGHT}\]\$ "
   export PS1="\[${ORANGE}\]\u \[${DARK}\]@ \[${YELLOW}\]\h \[${DARK}\]in \[${CYAN}\]\[$CUR_DIR\] \[${LIGHT}\]\$ "
  fi

}

PROMPT_COMMAND = lastc

2 个答案:

答案 0 :(得分:0)

问题是你用{/ 1>告诉bash

\[\342\203\240\]

当命令行实际占用一个空格时,预期字符占用空间。一个(不那么优雅)修复只包含\[...\]中的两个UTF-8字节:

\[\342\203\]\240

告诉bash只忽略3个"字符中的2个"计算提示的长度时。 \[ / \]对本身实际上并未输出到终端,因此它根本不会影响提示的显示,只是bash对其长度的解释

答案 1 :(得分:0)

实际上,答案最终是:

export PS1="\[${BLDRED}\]\342\203\240 \[${LIGHT}\]: \[${ORANGE}\]\u \[${DARK}\]@ \[${YELLOW}\]\h \[${DARK}\]in \[${CYAN}\]\[$CUR_DIR\] \[${LIGHT}\]\$ "