【发布时间】:2015-05-01 10:30:49
【问题描述】:
情况
我正在用 bash 编写一个很长的命令,最终意识到我忘记满足该命令的先决条件。我想将此命令存储在某处,执行所有要求,恢复命令并执行它。
注意:我希望命令留在屏幕上
这是一个例子:
$ a very long command --path some_path and more arguments
因此假设此命令要求 some_path 是现有目录。但是,在编写命令时,我意识到我没有创建那个目录,所以在执行命令之前我必须mkdir some_path。
要求
我希望能够做到以下几点:
$ a very long command --path some_path and more arguments [keystroke -> comment]
$ mkdir some_path
$ [up] [up] [keystroke -> uncomment]
或者...
$ a very long command --path some_path and more arguments [keystroke -> comment]
$ mkdir some_path
$ [keystroke -> bring back, uncomment]
我的解决方案
为了解决这个问题,我使用了 Readline 绑定工具,并通过以下方式将 Control-P 字符映射到自定义脚本:
function postpone {
if [[ ${#READLINE_LINE} -gt 0 ]]
then
if [[ "${READLINE_LINE::1}" == "#" ]]
then
READLINE_LINE="${READLINE_LINE:1}"
else
READLINE_LINE="#$READLINE_LINE"
fi
else
HIST_SIZE=`history | wc -l | tr -s ' ' | cut -d \ -f 2`
for i in $(seq 1 $HIST_SIZE)
do
LINE=`history | sort -r | head -n $i | tail -n 1 | tr -s ' ' | cut -d \ -f 3-`
if [[ "${LINE::1}" == "#" ]]
then
READLINE_LINE="${LINE:1}"
break
fi
done
fi
}
bind -x '"\C-b": postpone'
bind '"\C-p":"\C-b\n"'
最后……问题
您能否建议一个更好的解决方案,让我可以使用单个映射?重点是消除二次映射。
备注
我了解了insert-commentbind function,但它对我不起作用,因为它只适用于一个方向。我还想使用相同的快捷方式取消注释该行。
【问题讨论】:
-
不能在你正在写的那一行上使用 Ctrl-a Ctrl-k ,然后再按 Ctrl-y 将其粘贴回去吗?
-
我和你在一起,汤姆。要么,要么控制a,
#,输入,命令,向上,向上,控制a,删除#。似乎需要付出巨大的努力才能轻松获得结果。 -
这是一个选项。至少我可以将
Ctrl-A Ctrl-K组合映射到另一个快捷方式。在这种情况下,我不会将命令存储在历史记录中,但同时我不必返回历史记录来取消注释。非常感谢!!无论如何,在演示期间想象这个问题,您需要演示命令语法,但不实际执行它,因此您希望命令留在屏幕上。 -
您可以通过按 Alt+# 始终为一行添加
#前缀。 -
离题但可能感兴趣:
zsh中的命令行编辑器支持命令堆栈。您将当前命令行压入堆栈,执行 mkdir 命令,原始命令行会按原样弹回。
标签: linux macos bash unix terminal