【发布时间】:2013-11-25 10:42:46
【问题描述】:
如果命令的输出不是以\n 结尾,那么接下来会尴尬地立即出现下一个提示:
$ echo -n hai
hai$
我刚刚注意到一位同事的外壳(zsh,值得一提)被配置为在这种情况下打印%(背景色和前景色反转以强调),然后是\n:
$ echo -n hai
hai%
$
我也想这样做。我使用 Bash。这可能吗?如果是这样,我会在我的 ~/.bashrc 中添加什么?
更新
我花了几个小时来了解 gniourf_gniourf 的解决方案是如何工作的。我会在这里分享我的发现,以防它们对其他人有用。
ESC[6n是用于访问光标位置的控制序列引入器 (http://en.wikipedia.org/wiki/ANSI_escape_code)。在 OS X (https://superuser.com/q/33914/176942) 上使用
echo时,\e不是 ESC 的有效表示。可以改用\033。IFS 是 Bash 的内部字段分隔符 (http://tldp.org/LDP/abs/html/internalvariables.html#IFSREF)。
read -sdR看起来像read -s -d -R的简写,但实际上“R”不是标志,它是-d(分隔符)选项的值。我决定改写read -s -d R以避免混淆。双括号结构
(( ... ))允许算术扩展和求值 (http://tldp.org/LDP/abs/html/dblparens.html)。
这是来自我的.bashrc 的相关sn-p:
set_prompt() {
# CSI 6n reports the cursor position as ESC[n;mR, where n is the row
# and m is the column. Issue this control sequence and silently read
# the resulting report until reaching the "R". By setting IFS to ";"
# in conjunction with read's -a flag, fields are placed in an array.
local curpos
echo -en '\033[6n'
IFS=';' read -s -d R -a curpos
curpos[0]="${curpos[0]:2}" # strip leading ESC[
(( curpos[1] > 1 )) && echo -e '\033[7m%\033[0m'
# set PS1...
}
export PROMPT_COMMAND=set_prompt
注意:curpos[0]="${curpos[0]:2}" 行是不必要的。我将其包含在内,因此可以在行也相关的上下文中使用此代码。
【问题讨论】:
-
何不问问他是怎么做到的。您的
~/.bashrc中的sn-p 很可能与他的~/.zshrc相同。这个问题可能更适合Server Fault,但是您只想追加到没有\n 中断的行? -
我确实问过他,我们查看了他的 ~/.zshrc 但找不到负责的代码。是的,我只想附加到不以
\n结尾的输出。 -
这是我昨晚在 Google 上找不到的东西,而且似乎是 zch 特有的,因为它确实有很多新的线路处理信息。我今晚晚些时候会调查这个,因为我现在想知道如何自己做。
-
"我要在 ~/.bashrc 中添加什么?"
exec zsh. -
zsh 在内部使用
$COLUMN - 1spaces then\rtrick,如果有人仍然好奇为什么他们在朋友的.zshrc 中找不到它。