在屏幕上完成单词的翻译,如VIM(Bash或Tmux)


10

如何配置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

我如何才能issue547在CLI上轻松完成Bash / Zsh / Tmux ?当我Tab$ git checkout isGit有用地完成后按下时issue,但我必须自己完成数字,因为所有先前的数字实际上都与现有的Git分支匹配

在VIM中,按Ctrl+ P表示完整完成将在之前的匹配中完成,因此在这种情况下issue547314实际上将完成。如何在Bash,Zsh或Tmux中获得这种行为

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

编辑:只要使用起来不难,我不介意使用Bash,Zsh或Tmux的任何解决方案。所以Tabor Ctrl+ P或其他一些这样的捷径就可以了,但是Alt+ Meta+ Super+ Shift+ 却不行א


可以肯定的是,这将对bash源代码进行相当大的修订。
凯文2014年

@Kevin:我想了很多,但是希望惊人的zsh可以处理它,或者tmux。
dotancohen

Answers:


4

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

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

xterm它还具有dabbrev-expand功能,但是比Emacs的功能要聪明一些,但是对我来说非常有用,这也是我改用的原因之一xterm。在xterm窗口内部,可以使用中指定的自定义键绑定~/.Xresources来调用dabbrev-expand给定的字符串。例如,我有以下条目~/.Xresources(我使用uxterm,xterm的Unicode版本):

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

xterm窗口内部,我可以使用M-/ALT + /)进行调用dabbrev-expandxterm将会查找屏幕上所有以我键入的字母开头的字符串。例:

$ echo a_very_long_string bye by
$ a_v

如果我按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-expand内部xterm功能不如Emacs(我想是Vim)好,但它仍然比手动重写长字符串且错字少的速度要快。而且在大多数情况下,它将直接扩展为所需的字符串,而无需删除多余的部分。您只需要习惯它-查看您想在光标处使用的字符串,看看它是否没有其他前缀,以及是否键入前一个部分并在扩展后将其删除。

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


谢谢Arkadiusz,这似乎已经足够接近我所需要的了。请注意,我无法使其正常工作!也许我的xtermuxterm并未针对dabbrev-expand进行编译,我在中找不到有关此功能的信息-help。如何查看编译标志(如vim --version)?请注意,我也尝试过在配置行~/.Xresources作为Meta <KeyPress> /: dabbrev-expand() \n\ 为找到这里,但没有帮助,无论是。
dotancohen 2014年

可能是您的xterm已在没有dabbrev-expand的情况下进行了编译。您是如何安装xterm的?修改〜/ .Xresources后,xrdb -merge .Xresources在xterm中执行。
2014年

可以肯定的是,Arkadiusz!谢谢!
dotancohen 2014年

在悬赏期结束之前,我将再提出几个小时的问题,但是我很确定您可以参加。唯一的问题是对xterm的需求,这太糟糕了!但是现在我知道了该功能的专有名称,我可以用谷歌搜索其他应用程序了。谢谢!
dotancohen 2014年

谢谢Arkadiusz!尽管我不会使用xterm解决方案,但是您肯定为我指明了正确的方向。显然zsh有此功能。
dotancohen 2014年

1

Bash与bash完善类似。您可以通过Tab在键入命令时为命令提供参数时按下键来使用它。

如果我先输入ls然后再按Tab两次,您将得到Bash来提供与要尝试使用的任何命令匹配的文件列表(以及命令行开关):

$ ls <---- hit Tab x 2
Display all 232 possibilities? (y or n)

这是带有开关的示例:

$ ls -- <---- hit Tab x 2
--all                 --format=                                  --quote-name
--almost-all          --group-directories-first
....
....

设定?

我的安装已经包含以下规则git

/etc/bash_completion.d/git

我安装git软件包时已完成此文件的安装。我正在使用Fedora 19,但其他发行版也应该这样做。

$ rpm -qf /etc/bash_completion.d/git
git-1.8.3.1-1.fc19.x86_64

查看规则文件将说明在以下情况下它将有助于自动完成:

# The contained completion routines provide support for completing:
#
#    *) local and remote branch names
#    *) local and remote tag names
#    *) .git/remotes file names
#    *) git 'subcommands'
#    *) tree paths within 'ref:path/to/file' expressions
#    *) file paths within current working directory and index
#    *) common --long-options
#

因此,这应该对您“有效”。


2
Bash完成和Git完成工作(如我在OP中所述)。我要执行的更改是在第一个选项卡上按屏幕上显示的最后一个合法值完成此更改。这就是VIM Omnicompletion的工作方式。
dotancohen 2014年

@dotancohen-我现在看不到超出我所描述的范围。
slm

1

您可以使用extrakto执行以下操作

  • 按tmux prefix + tab开始Extrakto
  • 模糊查找文本/路径/网址
    • tab 将其插入当前窗格,
    • enter 拷贝到剪贴板上
    • ctrl-o 打开路径/ URL或
    • ctrl-e 用编辑 $EDITOR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.