【问题标题】:Using awk with gedit external tools将 awk 与 gedit 外部工具一起使用
【发布时间】:2021-06-09 08:07:24
【问题描述】:

我在 Ubuntu 上使用了很多 gedit,现在在 Macos 上进行转换。我注意到 Macos 版本中的一些插件丢失了。例如,没有(AFAIK)评论/取消注释代码的开箱即用选项。但是,可以定义一个外部工具来基本上拥有你想要的任何东西。

我只想以 R/python 样式评论文本选择(在输入的每一行之前添加 #)。我去了工具 -> 管理外部工具并以这种方式定义了一个“注释代码”工具:

#!/bin/bash
awk '{print "#" $0}'

并将输入设置为“当前选择”,输出设置为“替换当前选择”。

如果您选择文本,它会起作用;但是,如果您不选择任何内容,它将永远停止,因为(据我所知)awk 正在等待输入。

如何避免这个问题?当然,我不需要awk(或其他)解决方案,只要可行就行。我对bash 工具(如awksed)不太熟悉,所以很可能我遗漏了一些非常简单的东西。

【问题讨论】:

  • 在 Bash 中没有任何优雅的方法可以检查脚本是否在标准输入上接收到任何内容。您可以简单地添加一个timeout,但具体如何做到这一点在某种程度上取决于平台。参见例如stackoverflow.com/questions/526782/…
  • 感谢您的评论。理想情况下,如果在没有选择的情况下调用脚本,则不应等待任何内容。我不知道gedit 是如何将输入选择传递给脚本的,并且找不到在没有选择时什么都不做的解决方案。
  • 我会假设它将区域作为标准输入传递。 Bash 脚本没有简单的方法来确定标准输入是否为空(它总是在您开始时,然后您等待),但也许在 gedit 方面可以有一种方法来控制它。

标签: macos awk gedit


【解决方案1】:

请参阅https://www.gnu.org/software/gawk/manual/html_node/Read-Timeout.html,了解如何使用 GNU awk 实现读取超时。

从标准输入输入(输入 7 然后 Enter/Return 然后 Control-D):

$ gawk 'BEGIN{PROCINFO["-", "READ_TIMEOUT"]=5000} {print "#" $0}'
7
#7

或通过管道输入:

$ seq 2 | gawk 'BEGIN{PROCINFO["-", "READ_TIMEOUT"]=5000} {print "#" $0}'
#1
#2

或来自文件:

$ seq 2 > file
$ gawk 'BEGIN{PROCINFO["-", "READ_TIMEOUT"]=5000} {print "#" $0}' file
#1
#2

但如果您不提供任何输入并等待 5 秒:

$ gawk 'BEGIN{PROCINFO["-", "READ_TIMEOUT"]=5000} {print "#" $0}'
gawk: cmd. line:1: fatal: error reading input file `-': Connection timed out
$

如果您不想看到超时消息,您始终可以按照通常的方式重定向 stderr:

$ gawk 'BEGIN{PROCINFO["-", "READ_TIMEOUT"]=5000} {print "#" $0}' 2>/dev/null
$

但这当然会掩盖所有错误消息,因此您可能希望这样做只是掩盖一条消息:

{ gawk 'BEGIN{PROCINFO["-", "READ_TIMEOUT"]=5000} {print "#" $0}' 2>&1 >&3 |
    grep -v 'fatal: error reading input file'; } 3>&1

例如:

$ { gawk 'BEGIN{print "other error" >"/dev/stderr";
        PROCINFO["-", "READ_TIMEOUT"]=5000} {print "#" $0}' 2>&1 >&3 |
    grep -v 'fatal: error reading input file'; } 3>&1
other error
$

显然将5000 更改为您希望脚本等待输入的毫秒数。

【讨论】:

  • 感谢您的回复。看起来,在 macos 上,gawk 没有定义,所以我无法检查你的答案。也许我的问题具有误导性,但我不需要awk 来读取超时;我正在尝试找到一种方法,在有选择时将# 字符添加到选择的每一行,否则什么也不做。
  • 你可以在macos上安装gawk(我有)。了解您的需求,我认为只是向您展示一种获得您想要工作的功能的方法。当然可能还有其他工具等的其他方式。
  • 谢谢。我将安装gawk 并测试您的解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多