在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,如zsh
或bash
通常您的 shell 和终端是不同的实体。
长答案:也许吧。典型的情况是您输入命令并按Enter- 现在是您的 shell叉子并执行指定的命令。然后外壳有不知道发生了什么,shell 不知道将写入终端的内容或执行的程序做了什么,如果它启动了其他程序,写入您的终端或其他任何内容。
您的问题有两种可能的解决方案:
- 捕获执行命令的所有输出,并以某种方式使用它来完成目的(可以完成,但可能不应该完成)
- 使用不同的终端支持‘完成’来自你的“外壳缓冲区”。
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 相信您正在执行命令并将文件名作为命令的参数。按 TAB 键将自动完成文件名,但您可能必须删除前面的点+空格。
另一种可能性是使用BASH补全功能。这可以自动完成的不仅仅是文件名。