自动完成终端缓冲区中的单词

nof*_*fle 8 shell autocomplete

在像编辑vimemacs,可以使用像热键C-p(VIM)或M-/(emacs)可使用换言之在相同缓冲液当前字执行自动完成功能。

是否可以在 shell 中实现相同的功能?如果我在上一个命令的输出中看到一些单词,并且我想在输入另一个命令时快速自动完成它。

为了清楚起见,举个例子:

$ ls
Desktop/  Mail/  music/  osx@  something_with_a_pretty_long_name

$ someth
Run Code Online (Sandbox Code Playgroud)

从这里开始,我希望能够点击一个热键并让它自动完成我正在输入的内容something_with_a_pretty_long_name

编辑:射击。使用文件名是我所追求的一个糟糕的例子。考虑以下第二个示例:

$ cat /var/log/something.log
[19:30] Service started
[19:35] Something else happened

$ happ
Run Code Online (Sandbox Code Playgroud)

仅仅因为它出现在我的终端缓冲区中,我就可以自动完成“happ”到“happened”。我希望这能澄清我所追求的。

Ulr*_*gel 4

简短的回答:不,不适合经典 shell,如zshbash通常您的 shell 和终端是不同的实体。

长答案:也许吧。典型的情况是您输入命令并按Enter- 现在您的 shell会分叉并执行指定的命令。然后 shell知道发生了什么,shell 不知道将写入终端的内容或执行的程序做了什么,如果它启动了其他程序,写入您的终端或其他任何内容。

您的问题有两种可能的解决方案:

  1. 捕获执行命令的所有输出,并以某种方式使用它来完成目的(可以完成,但可能不应该完成)
  2. 使用不同的终端支持“shell 缓冲区”中的“完成” 。

2 的解决方案是例如使用 emacs 和multi-term只是使用M-/就像你平常从终端完成事情一样。其他终端可能提供类似的解决方案。

但你真的需要这样的完成吗?现在的 shell 补全可以补全手册页、命令、pid、套接字、命令选项、远程系统的文件路径等等。这可能已经足以满足您的用例,或者可以针对您的特定问题进行增强。