使用 Readline 注释掉 bash 中的命令行

Comment out a command line in bash using Readline

情况

我在 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-comment bind function,但它对我不起作用,因为它只适用于一个方向。我还想使用相同的快捷方式取消注释该行。

备选方案:

  1. 在长行结束时按 Ctrl+u.
  2. mkdir some_path
  3. Ctrl+y 并继续您的工作。