像 VIM 一样在屏幕上完成单词(Bash 或 Tmux)

dot*_*hen 10 bash zsh tmux autocomplete oh-my-zsh

如何配置 Bash、Zsh 或 Tmux 以完成屏幕上最后一个匹配的标识符?考虑这个常见的场景:

$ git fetch
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From /opt/git/thunder
 * [new branch]      issue540   -> origin/issue547314
   e9204cf..4d42c3f  v2.1       -> origin/v2.1
Run Code Online (Sandbox Code Playgroud)

如何让 Bash/Zsh/Tmuxissue547在 CLI 上轻松完成?当我Tab$ git checkout isGit 帮助完成 to后按下时issue,但我必须自己完成数字,因为所有前面的数字实际上都匹配现有的 Git 分支

在 VIM 中,按Ctrl+ Pfor omnicomplete 将作为前一个匹配完成,因此在这种情况下issue547314实际上会完成。如何在 Bash、Zsh 或 Tmux 中获得这种行为

我目前在 Ubuntu Server(通常是 12.04 LTS)上使用 Bash 4.2 和 Tmux 1.10。如果需要,我可以更新到最新的 Ubuntu Server LTS (14.04)。

编辑:只要不难使用,我不介意使用 Bash、Zsh 或 Tmux 的任何解决方案。所以TabCtrl+P或其他一些这样的快捷方式会很好,但不是Alt+ Meta+ Super+ Shift+ ?

Ark*_*zyk 5

我认为 OP 正在寻找的功能在 Emacs 世界中称为dabbrev-expand

通过在缓冲区中搜索以该缩写 (v-expand) 开头的单词,将 point 之前缓冲区中的单词扩展为动态缩写。

xterm也有dabbrev-expand功能,但它不如 Emacs 智能,但它对我非常有用,这也是我切换到xterm. 在xterm窗口内可以使用指定的自定义键绑定~/.Xresources来调用dabbrev-expand给定的字符串。例如,我的~/.Xresources(我使用uxterm的是 xterm 的 Unicode 版本)中有以下条目:

UXTerm*VT100.Translations: #override \n\
     Meta <Key>/:dabbrev-expand() \n\
Run Code Online (Sandbox Code Playgroud)

xterm窗口内,我可以使用M-/( ALT + /) 来调用dabbrev-expand. xterm将查找屏幕上所有以我输入的字母开头的可见字符串。例子:

$ echo a_very_long_string bye by
$ a_v
Run Code Online (Sandbox Code Playgroud)

如果我M-/现在按下xterm会扩展a_va_very_long_string. 不幸的是,正如我所说xterm的并不那么聪明,它的dabbrev-expand功能只适用于完整的字符串。因此,在您的情况下,is将扩展为issue540而不是issue547314因为issue547314是的一部分origin/issue547314(将其视为\b正则表达式中的一部分,尽管大多数正则表达式引擎会同时捕获 中的两个issue字符串,但它有点相似\bissue.+\b)。但是,您可以键入or然后按M-/xterm将首先扩展ororigin/v2.1,这不是我们想要的所以M-/再次按下xterm并将其扩展到origin/issue547314。现在,如果你使用bash,那么你可以做的M-bC-wC-e删除origin/部分。总而言之,dabbrev-expandinsidexterm不如 Emacs(我猜也是 Vim),但它仍然比手动重写长字符串要快,而且不容易出错。而且在大多数情况下,它会直接扩展到所需的字符串,而无需删除多余的部分。你只需要习惯它 - 查看你想要在光标处拥有的字符串,看看它前面是否没有其他东西,如果它是输入前面的部分并在扩展后将其删除。

请注意,默认情况下xterm不使用dabbrev-expand功能编译,您必须显式启用它。但是,xterm在 Ubuntu 存储库中的版本是编译的dabbrev-expand,您可以立即使用它。