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

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

vim和等编辑器中emacs,可以使用C-p(vim) 或M-/(emacs) 等热键使用同一缓冲区中的其他单词对当前单词执行自动补全。

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

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

$ ls
Desktop/  Mail/  music/  osx@  something_with_a_pretty_long_name

$ someth

从这里,我希望能够按下热键并让它自动完成我正在输入的内容something_with_a_pretty_long_name

编辑:拍摄。对于我所追求的,使用文件名是一个很糟糕的例子。考虑以下第二个示例:

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

$ happ

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

答案1

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

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

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

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

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

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

答案2

http://www.iterm2.com/#/section/features/autocomplete

iterm2 正是您所需要的。糟糕的是它适用于 mac。

但由于它是终端,你可以 ssh 到 linux/unix 并且它仍然可以工作。

答案3

你可以这样做外加它使用 tmux 捕获输出,并让您使用 fzf 进行模糊选择:

外加

答案4

这可能不是您期望的答案,但它可能会满足您的某些需求。

您可以使用 TAB 自动完成 $PATH 中的命令(或内部命令),因此如果您的文件名是可执行文件并且它位于 $PATH 中,它将自动完成。

如果您想自动完成不可执行的文件名,您可以输入“ .” -点,然后输入空格(或任何代替点的内容),然后输入文件名和制表符的部分。这样,您将欺骗 shell 相信您正在执行命令并将文件名作为命令的参数。按 T​​AB 键将自动完成文件名,但您可能必须删除前面的点+空格。

另一种可能性是使用BASH补全功能。这可以自动完成的不仅仅是文件名。

相关内容