Linux 使用Readline注释掉bash中的命令行
形势 我正在用bash编写一个很长的命令,最终意识到我忘记满足该命令的先决条件。我想把这个命令存储在某个地方,执行所有的需求,恢复命令并执行它 注意:我希望命令保持在屏幕上 以下是一个例子:Linux 使用Readline注释掉bash中的命令行,linux,macos,bash,unix,terminal,Linux,Macos,Bash,Unix,Terminal,形势 我正在用bash编写一个很长的命令,最终意识到我忘记满足该命令的先决条件。我想把这个命令存储在某个地方,执行所有的需求,恢复命令并执行它 注意:我希望命令保持在屏幕上 以下是一个例子: $ a very long command --path some_path and more arguments 因此,假设此命令要求some_路径是现有目录。但是,在编写命令时,我意识到我没有创建该目录,因此在执行命令之前,我必须mkdir一些路径 要求 我希望能够做到以下几点: $ a very l
$ a very long command --path some_path and more arguments
因此,假设此命令要求some_路径是现有目录。但是,在编写命令时,我意识到我没有创建该目录,因此在执行命令之前,我必须mkdir一些路径
要求
我希望能够做到以下几点:
$ a very long command --path some_path and more arguments [keystroke -> comment]
$ mkdir some_path
$ [up] [up] [keystroke -> 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"'
最后……问题
你能推荐一个更好的解决方案吗?我可以使用一个映射?主要的重点是消除第二个映射
注释
我了解了插入注释
,但它不适用于我,因为它只适用于一个方向。我还想使用相同的快捷方式取消对该行的注释。另一种选择:
mkdir一些路径
在你正在写的行上使用Ctrl-a Ctrl-k,然后再使用Ctrl-y将其粘贴回,这难道不能实现吗?汤姆,我支持你。或者控制a,
#
,输入,命令,向上,向上,控制a,删除#。似乎是为了一个容易实现的结果付出了巨大的努力。这是一个选择。至少我可以将Ctrl-A Ctrl-K
组合映射到另一个快捷方式。在这种情况下,我不会将命令存储在历史记录中,但同时我也不必返回历史记录来取消对它的注释。谢谢!!无论如何,在演示过程中想象一下这个问题,您需要演示命令语法,但不实际执行它,因此,您希望命令保持在屏幕上。您可以通过按Alt+#Off-topic将一行前缀始终设置为
,但可能需要注意的是:zsh
中的命令行编辑器支持命令堆栈。您将当前命令行推到堆栈上,执行mkdir命令,原始命令行将按原样弹出。这是一个与建议类似(且更短)的解决方案,但我需要的是在切换到mkdir some_path
后,让命令在屏幕上可见。接受作为唯一相关答案;)
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"'