通过交互,我的意思是更新每个按键。

类似Emacs counsel-git-的东西grep,请参阅:示例演示。

评论

我个人没有使用它,所以我不确定100%,但是我认为ctrl-p或类似的插件是您要寻找的。注意unite.vim也应该能够做到这一点,但我不建议这样做,因为在我看来,这是一个非常繁琐且易于创建错误的插件。

ctrl-p是否可以交互式搜索文件内容?我只用它来根据文件名交互式搜索文件。

我认为有可能,但正如我所说,我不使用它,所以也许我错了

#1 楼

我不确定这不是您要寻找的东西,但是也许您可以尝试fzf和fzf.vim。

如果您使用vim-plug作为插件管理器,那么您应该做的所有事情要安装它们,就是将这些线添加到您的vimrc中:

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'


...在两行之间的某个位置:

call plug#begin('~/.vim/plugged')


和:

call plug#end()


然后执行:PlugInstall


fzf.vim提供的各种命令和映射(其唯一的目的似乎是安装要求fzf进行模糊搜索以通过预定义源进行的映射和命令),这里有:Ag命令。在基于debian的发行版上,可以使用以下命令完成:

apt-get install silversearcher-ag


github上的项目说明了如何在MacOS上安装它:

brew install the_silver_searcher



:Ag$ ag的包装,可让您在当前目录的文件(键入:pwd时显示的文件)中模糊搜索模式。每次击键后,匹配项都会更新。

您可以:


通过C-nC-p


在匹配项中前后循环选择当前匹配项,然后使用Tab / S-Tab

移至下一个/上一个匹配项。使用M-aM-d
选择或取消选择所有匹配项


如果选择一个或多个匹配项,按Enter键后,它们将填充快速修复列表。从那里您可以使用默认的Vim命令/映射(例如:cnext:cprevious)在它们之间进行导航。



如果要为所有前缀添加前缀fzf.vim安装的命令,并避免覆盖现有命令,可以在vimrc中添加此命令:

let g:fzf_command_prefix = 'your_prefix'


我使用Fzf作为前缀,这就是为什么我没有类型为:Ag,但类型为:FzfAg


如果您更喜欢使用git grep而不是ag,似乎可以在其周围安装自己的自定义包装器:GGrep,如下所示:

command! -bang -nargs=* GGrep
  \ call fzf#vim#grep('git grep --line-number '.shellescape(<q-args>), 0, <bang>0)


:h fzf-vim-customization中进行了说明。

另外,如果fzf在tmux中打开一个窗格,并且您希望它占据整个屏幕,则可以在所有命令(:Ag!:GGrep!,...)后附加一个爆炸符号。正如您在上一条评论中所述,默认情况下,fzf会更改外壳程序的配置。例如,如果您使用bash,它将在您的~/.bashrc中添加以下行:

[ -f ~/.fzf.bash ] && source ~/.fzf.bash


这将获取文件~/.fzf.bash。后者包含一些代码:

# Setup fzf
# ---------
if [[ ! "$PATH" == */home/user/.fzf/bin* ]]; then
  export PATH="$PATH:/home/user/.fzf/bin"
fi

# Auto-completion
# ---------------
[[ $- == *i* ]] && source "/home/user/.fzf/shell/completion.bash" 2> /dev/null

# Key bindings
# ------------
source "/home/user/.fzf/shell/key-bindings.bash"


此代码将路径附加到环境变量$PATH/home/user/.fzf/bin;这是包含fzf程序的文件夹。

它还提供2个其他文件:

/home/user/.fzf/shell/completion.bash
/home/user/.fzf/shell/key-bindings.bash


第一个似乎定义了完成函数,不幸的是,这些键绑定可能会覆盖默认的readline函数。例如,fzf将功能fzf-file-widget绑定到C-t。该密钥通常由readline用于执行transpose-chars函数。

如果您不希望这样做,一种可能的解决方案是在~/.bashrc获得其配置后恢复fzf内部的键绑定。例如,如果您希望C-t保持其旧的行为,即将2个字符移至光标周围,然后将fzf-file-widget绑定到另一个键,例如C-x C-t,则可以在~/.bashrc的末尾添加以下行:

bind -x '"\C-x\C-t": fzf-file-widget'
bind '"\C-t": transpose-chars'


同样的情况也适用于zsh shell,但是安装键绑定的语法略有不同:

bindkey '^X^T' fzf-file-widget
bindkey '^T' transpose-chars



如果fzf覆盖了您曾经使用过的一个外壳键绑定,您想恢复它,但不知道所执行函数的确切名称是什么,您可以尝试以下操作。

首先,在您的~/.bashrc内部,临时注释掉产生fzf配置的行。然后,重新打开一个终端,并查看bind -P命令的输出,可以在Vim缓冲区中读取该命令:

bind -P | vim -R -


我不确定,但我认为它应该显示大多数或全部readline键绑定。如果要查找绑定到C-t键的readline函数的名称,请在Vim缓冲区中搜索\C-t。如果您要查找绑定到M-c(元/ alt键)的键,则可以搜索\ec\e代表转义键,看来M-c产生与escape + c相同的键码)。

您通过查看zsh命令的输出,可以在bindkey中执行相同的操作。但是这次,^[代表meta / alt修饰键,而单个插入符号(^)代表控制键。


当前,我发现4个键绑定执行了包含名称中的fzf关键字。他们使用键序列C-i(与Tab相同),C-rC-tM-c。它们绑定到以下功能:

C-i    fzf-completion
C-r    fzf-history-widget
C-t    fzf-file-widget
M-c    fzf-cd-widget


在我的系统上,最初,readlinebash用于编辑命令行的库)将这些键绑定到这些功能。 :

C-i     complete
C-r     reverse-search-history
C-t     transpose-chars
M-c     capitalize-word


zlezsh使用的行编辑器)将它们绑定到:

C-i     expand-or-complete
C-r     history-incremental-search-backward
C-t     transpose-chars
M-c     capitalize-word


评论


是否需要安装单独的插件/工具?

–ideasman42
16 Dec 21'在12:41

@ ideasman42是的,对此感到抱歉,我忘记了也必须使用shell命令ag。我更新了答案。

–user9433424
16年12月21日在12:51

可能值得一提的是,这些工具非常具有侵入性,默认情况下会替换bash和zsh配置。

–ideasman42
17年1月12日在15:12

@ ideasman42是的,我更新了答案以提及此问题。

–user9433424
17年1月12日在16:15