我只是好奇是否有一种方法可以从 vim、nano、emacs 甚至非命令行编辑器(MacVim/TextMate)获取StdIn
输入$EDITOR
。有哪些选项/解决方法/最佳实践?
基本上我希望有一个与heredoc
- 但来自 $editor 的工作流程。
$ sort -nr << FOO | uniq -c
pipe heredoc> foo
pipe heredoc> bar
pipe heredoc> baz
pipe heredoc> foo
pipe heredoc> FOO
2 foo
1 baz
1 bar
答案1
vipe
包中的命令更多实用程序允许您在管道中间启动 $EDITOR。
您可以获得所需的行为,如下所示:
$ </dev/null vipe |sort -nr | uniq -c
答案2
我想让它与任何类型的编辑器一起工作的唯一机会是使用临时文件:
FILE=$(mktemp); $EDITOR "$FILE"; <"$FILE" …command… ; rm "$FILE"
(但是,这不允许在提供完整输入之前启动命令。)
您也可以echo "# please insert your input bellow" >"$FILE"
在调用之前使用来$EDITOR
插入将显示在编辑器中的注释。确保它不会影响命令的行为(或要求用户显式删除它)。
答案3
Emacs 可以在其缓冲区之一中运行 shell(使用 MX shell)。但是启动的进程仍然会从标准输入获取输入,它们的标准输入只是一个伪终端,其另一端是 emacs。
答案4
在 Emacs 中,您可以运行任何命令并将 Emacs 缓冲区之一(准确地说是所选区域)的内容作为标准输入提供给应用程序。
例如,如果您的 Emacs 缓冲区的内容是ls
,并且您将其标记为区域(使用C-SPC
),然后运行shell-command-on-region
( M-|
) 并键入命令bash
(完整组合:M-| command RET
),则将ls
在其中执行bash
,并且输出将作为新缓冲区打开。
如果您C-u M-| command RET
在区域上使用,输出将替换当前缓冲区中标记的命令。