linux 在bash中使用Readline注解掉命令行

ni65a41a  于 2023-08-03  发布在  Linux
关注(0)|答案(2)|浏览(123)

情况

我在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 bind工具,并通过以下方式将Control-P字符Map到自定义脚本:

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"'

最后...问题

你能建议一个更好的解决方案,我可以去一个单一的Map?主要焦点是消除第二Map。

注意事项

我学习了insert-comment绑定函数,但它对我不起作用,因为它只在一个方向上工作。我还想使用相同的快捷方式取消对该行的注解。

dwthyt8l

dwthyt8l1#

另一种选择:
1.在长行的末尾按Ctrl+u。
1.第一个月
1.按Ctrl+Y并继续您的工作。

wwodge7n

wwodge7n2#

您需要的是向insert-comment传递一个数值参数。如果insert-command接收到一个数字参数(任何数字,值并不重要),则该命令充当切换:

  • 如果该行没有注解,它将添加一个#
  • 如果该行被注解,它将删除#

举例来说:M-3 M-#Alt-3 Alt-#

相关问题