使用Readline

时间:2015-05-01 10:30:50

标签: linux macos bash unix terminal

情况

我正在用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 个答案:

答案 0 :(得分:1)

替代方案:

  1. 在长行的末尾按 Ctrl + u
  2. mkdir some_path
  3. Ctrl + y 继续工作。