【问题标题】:Comment out a command line in bash using Readline使用 Readline 注释掉 bash 中的命令行
【发布时间】: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


【解决方案1】:

另一种选择:

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

【讨论】:

  • 这是一个与Tom 建议的解决方案类似(并且更短)的解决方案,但是我需要在切换到mkdir some_path 后让命令在屏幕上可见。
  • 接受作为唯一相关答案 ;)
猜你喜欢
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2019-04-12
  • 2010-11-30
  • 2014-03-15
  • 2021-11-28
  • 2016-06-30
相关资源
最近更新 更多