如何在不使用鼠标的情况下使用命令的输出?

如何在不使用鼠标的情况下使用命令的输出?

想象一下,您发出了一条find命令,现在您想要使用结果输出中的一行作为参数。

$ find ..
fileA
fileB
$ vi <CURSOR>   # now do what to achive:
$ vi fileB      

目前的解决方法: 双击文件B(自动扩展选择)并按鼠标中键(粘贴到 X 上)。可以工作,但需要使用鼠标。

可能的解决方案:

  1. Tab 补全 — 适用于大多数 shell,但仅适用于文件。
  2. 钩住贝壳——就像scm_微风;这几乎就是我所寻求的,但它仅限于 git。
  3. 使用screen——非常接近,但仍然有很多击键。并且它需要screen....
  4. 将输出存储在 bash 变量 (GMaster) 中 — 仅当 find 命令输出一行时才有效。如何像示例中那样访问第二行?
  5. 将命令发送到编辑器 (jasonwryan) — 可以工作,但执行该命令两次。这可能很耗时,甚至不可能。
  6. 使用 emacs Dynamic Abbrev Expansion (Arkadiusz Drabczyk, Michael Vehrs) — 这就是我正在寻找的,但我不想从 emacs 开始。

对我来说解决方案: “动态缩写扩展”。现在我知道了我正在寻找的这个功能的名称。我将开始一个关于如何在其他软件中获取他的“dabbrev-expand”的新问题:

https://unix.stackexchange.com/questions/281298/list-of-sofwares-inspired-by-emacs-dabbrev-expand

对我来说最佳解决方案的愿景: 类似提示模式的东西毒蛇或者易动在 Vim 中,从当前终端的输出中提取文本。

答案1

使用emacs,启动一个较差的 shell 并发出您的命令。输出将在 shell 缓冲区中可用,并且可以使用常用命令进行选择。或者,

select file in $(find <whatever>); do vi $file; break; done

emacs如果您已经认识编辑器,那么该方法会更实用。Emacs可以运行任意“劣等进程”,即。交互式命令,其输入和输出连接到 emacs 缓冲区。因此,M-x shell-mode启动一个较差的 shell,您键入find命令,并且该命令的输出在缓冲区中可用

$ find .. -name "*.sh"
../self.sh
../scheme/random.sh
../scheme/sample.sh

现在,您将光标移动到您感兴趣的文件,然后键入M-x find-file-at-point以在不同的缓冲区中编辑该文件。

答案2

如果您不介意重新运行需要输出的命令,请将其添加到您的.zshrc文件中:

# Load completion menu feature.
zmodload zsh/complist

# `fc -e :` re-runs the last history entry.
# ${(f)…} splits the string on newlines.
copy-output() compadd ${(f)"$( fc -e : 2> /dev/null )"}

# Create a completion menu widget & bind it.
zle -C copy-output menu-select copy-output 
bindkey '^[!' copy-output

现在,您可以按Alt!重新运行上一个命令并获得一个菜单,您可以从中选择要在新命令行中插入的内容。

所以,对于你的例子:

% find ..
fileA
fileB
% vi <ALT-!>
fileA  fileB

输出显示在命令行下方,您可以使用Tab或 箭头键选择所需的输出。要选择多个,请按AltA

答案3

创建了一个 Zsh 插件来专门执行您的请求:https://github.com/psprint/ztrace

相关内容