如何将所有选项卡completitions添加到当前命令?

时间:2015-01-21 23:23:54

标签: zsh

所以我输入了一个命令(pacman -S perl-),然后我点击了tab,看到有一大堆完成(大约40个),我意识到我想运行每一个完成(所以我不要意外地从CPAN安装已经内置的东西。)

如何运行命令的所有完成?

BONUS:如何运行多个且少于所有命令(不单独输入)?

示例情况(实际情况):

XXXXXXXXXXXXXXXXX ❯❯❯ pacman -S perl-<Tab>                     ⏎
-- packages --
perl                       perl-IPC-Run3
perl-ack                   perl-libwww
perl-Archive-Zip           perl-Locale-Gettext
perl-Authen-SASL           perl-LWP-MediaTypes
perl-Benchmark-Timer       perl-LWP-Protocol-https
perl-Capture-Tiny          perl-MailTools
perl-common-sense          perl-MIME-tools
perl-Compress-Bzip2        perl-Mozilla-CA
perl-Convert-BinHex        perl-Net-DNS
perl-Crypt-SSLeay          perl-Net-HTTP
perl-DBI                   perl-Net-IP
perl-Digest-HMAC           perl-Net-SMTP-SSL
perl-Encode-Locale         perl-Net-SSLeay
perl-Error                 perl-Path-Class
perl-Exporter-Lite         perl-Probe-Perl
perl-ExtUtils-Depends      perl-Regexp-Common
perl-ExtUtils-PkgConfig    perl-Socket6
perl-File-Copy-Recursive   perl-Sys-CPU
perl-File-Listing          perl-TermReadKey
perl-File-Next             perl-Test-Pod
perl-File-Which            perl-Test-Script
perl-Getopt-Tabular        perl-TimeDate
perl-HTML-Parser           perl-Try-Tiny
perl-HTML-Tagset           perl-URI
perl-HTTP-Cookies          perl-WWW-RobotRules
perl-HTTP-Daemon           perl-XML-LibXML
perl-HTTP-Date             perl-XML-NamespaceSupport
perl-HTTP-Message          perl-XML-Parser
perl-HTTP-Negotiate        perl-XML-SAX
perl-IO-HTML               perl-XML-SAX-Base
perl-IO-Socket-INET6       perl-XML-Simple
perl-IO-Socket-SSL         perl-YAML
perl-IO-stringy            perl-YAML-Syck

2 个答案:

答案 0 :(得分:2)

这是我自己的解决方案,

  • 为完成结果应用匹配。
  • 将所有完成匹配项插入命令行。
  • 激活菜单选择并选择多个完成。

要对完成结果应用匹配,可以使用_match完成。
以下是~/.zshrc示例:

# below is same as the zsh default effect
# zstyle ':completion:*::::' completer _complete _ignored
zstyle ':completion:*::::' completer _complete _match _ignored

# I don't like expand-or-complete to <Tab>, so I moved it to <C-x><Tab>
bindkey '^I' complete-word
bindkey '^X^I' expand-or-complete

现在,可以使用*来获得这样的效果:

% ls m*e* ;# I have some local files that matches the glob.
main.epro    mem.c     mem.pro       modentry.c   module.o     modules.stamp
makepro.awk  mem.epro  mem.syms      module.c     module.pro
math.epro    mem.o     mkmakemod.sh  module.epro  module.syms

% git m*e*<Tab>
;# This prompts completions rather than expands the local files
;# like this:
% git merge
merge  -- join two or more development histories together
merge-base  -- find as good a common ancestor as possible for a merge
merge-file   -- run a three-way file merge
merge-index  -- run merge for files needing merging
merge-one-file  -- standard helper-program to use with git merge-index
merge-tree  -- show three-way merge without touching index
mergetool  -- run merge conflict resolution tools to resolve merge conflicts
mktree       -- build tree-object from git ls-tree formatted text
m*e*

要将所有compliteon匹配项插入命令行,云计算将使用all-matches完成。如果您的~/.zshrc

中包含以下代码段
zle -C all-matches complete-word _my_generic
zstyle ':completion:all-matches::::' completer _all_matches
zstyle ':completion:all-matches:*' old-matches only
_my_generic () {
  local ZSH_TRACE_GENERIC_WIDGET=  # works with "setopt nounset"
  _generic "$@"
}
bindkey '^X^a' all-matches

输入 Tab 然后 Control-x Control-a 将完成匹配插入命令行。
例如:

% vim string.<Tab>
string.c     string.epro  string.syms
;# then hit <C-x><C-a>
% vim string.c string.epro string.syms

要激活菜单选择并选择多个完成,可以通过自定义menuselect键盘映射来完成。 (From zhmodules(1) 22.7.3 Menu selection

zstyle ':completion:*' menu select=0
zmodload zsh/complist
bindkey -M menuselect "^[a" accept-and-hold
bindkey -M menuselect '^[^[' vi-insert

此完成结果的activete菜单选择。在菜单选择激活期间,键入 M-a (或 Esc-a )会插入所选条目并前进&#34;菜单光标&#34;到下一个入口。
例如会话:

% ls sig*
sigcount.h    signals.h    signals.syms   signames.o     signames1.awk
signals.c     signals.o    signames.c     signames.pro   signames2.awk
signals.epro  signals.pro  signames.epro  signames.syms

% vim sig<Tab> ;# this lists the matches
sigcount.h     signals.epro   signals.syms   signames.epro  signames1.awk
signals.c      signals.h      signames.c     signames.syms  signames2.awk

;# hitting <Tab> second time, the "menu cursor" appears and
;# the first entry will be activated
;# Note: "[[]]" denotes the "menu cursor" here
% vim sigcount.h
[[sigcount.h]] signals.epro   signals.syms   signames.epro  signames1.awk
signals.c      signals.h      signames.c     signames.syms  signames2.awk

;# then  hit <M-a>(Esc a)
;# "sigcount.h" is now in the command line and
;# the "menu cursor" points "signals.c" now.
% vim sigcout.h signals.c
sigcount.h     signals.epro   signals.syms   signames.epro  signames1.awk
[[signals.c]]  signals.h      signames.c     signames.syms  signames2.awk

;# then <Tab><Tab>
% vim sigcount.h signals.h
sigcount.h     signals.epro   signals.syms   signames.epro  signames1.awk
signals.c    [[signals.h]]    signames.c     signames.syms  signames2.awk

因此,您可以在完成结果中选择多个条目,以根据需要点击 M-a (或 Esc-a )。

以下段落也不错。
在这个示例配置中,点击 Esc Esc (我们在上面的片段中我们bindkey -M menuselect '^[^[' vi-insert),当菜单选择处于活动状态时,它允许我们以交互方式限制完成结果基于输入模式。

;# activate "menu selection" and hit <Esc><Esc>,
;# the "interacitve:" mode will be shown at this point.
% vim sig*
interactive: sig[]
[[sigcount.h]] signals.epro   signals.syms   signames.epro  signames1.awk
signals.c      signals.h      signames.c     signames.syms  signames2.awk

;# hitting "*awk" while interactive is activetad,
;# it colud limit the completion to "sig*awk"
% vim sig*awk
interactive: sig[]
[[signames1.awk]]signames2.awk
sig*awk

我不确定我的描述是否正确,所以这里是菜单选择&#34;交互模式&#34;的部分zsh文档。

  

VI-插入

     

这在正常模式和交互模式之间切换;在交互模式下,键入自动插入和自插入 - 取消符号的键插入命令行,如在正常编辑模式下,但不离开菜单选择;再次尝试每个字符完成后,列表将更改为仅包含新匹配;完成小部件使最长的明确字符串插入命令行,undo和backward-delete-char返回上一组匹配

     

- zhmodules(1) 22.7.3 Menu selection


同样可以看到edit-command-line处理相当大的命令行缓冲区。


现在在我的debian系统上,我可以得到以下效果:

# apt-get install perl-*<Tab><C-x><C-a><C-w>
;# ⇓
# apt-get install perl-base perl-byacc perl-cross-debian perl-debug perl-depends perl-doc perl-doc-html perl-modules perl-stacktrace perl-tk

答案 1 :(得分:0)

我找到了解决问题的方法,并完成了工作,但这不是我想要的那种解决方案。

我在屏幕上选择了完成文本(我使用mintty)并将其复制到我的编辑器中。然后我重新格式化它:

perl perl-IPC-Run3 \
perl-ack perl-libwww \
perl-Archive-Zip perl-Locale-Gettext \
perl-Authen-SASL perl-LWP-MediaTypes \
perl-Benchmark-Timer perl-LWP-Protocol-https \
perl-Capture-Tiny perl-MailTools \
perl-common-sense perl-MIME-tools \
perl-Compress-Bzip2 perl-Mozilla-CA \
perl-Convert-BinHex perl-Net-DNS \
perl-Crypt-SSLeay perl-Net-HTTP \
perl-DBI perl-Net-IP \
perl-Digest-HMAC perl-Net-SMTP-SSL \
perl-Encode-Locale perl-Net-SSLeay \
perl-Error perl-Path-Class \
perl-Exporter-Lite perl-Probe-Perl \
perl-ExtUtils-Depends perl-Regexp-Common \
perl-ExtUtils-PkgConfig perl-Socket6 \
perl-File-Copy-Recursive perl-Sys-CPU \
perl-File-Listing perl-TermReadKey \
perl-File-Next perl-Test-Pod \
perl-File-Which perl-Test-Script \
perl-Getopt-Tabular perl-TimeDate \
perl-HTML-Parser perl-Try-Tiny \
perl-HTML-Tagset perl-URI \
perl-HTTP-Cookies perl-WWW-RobotRules \
perl-HTTP-Daemon perl-XML-LibXML \
perl-HTTP-Date perl-XML-NamespaceSupport \
perl-HTTP-Message perl-XML-Parser \
perl-HTTP-Negotiate perl-XML-SAX \
perl-IO-HTML perl-XML-SAX-Base \
perl-IO-Socket-INET6 perl-XML-Simple \
perl-IO-Socket-SSL perl-YAML \
perl-IO-stringy perl-YAML-Syck

pacman -S之后将其粘贴回我的终端。

我已经说过这不是我想要的那种解决方案,所以我应该提一下我正在寻找的那种解决方案。

我正在寻找像pacman -S perl-*这样的东西,看起来它可能会完成所有的完成或其他东西(它没有)。