通过交互,我的意思是更新每个按键。
类似Emacs counsel-git-的东西grep,请参阅:示例演示。
#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-n
和C-p
在匹配项中前后循环选择当前匹配项,然后使用
Tab
/ S-Tab
移至下一个/上一个匹配项。使用
M-a
或M-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-r
,C-t
和M-c
。它们绑定到以下功能:C-i fzf-completion
C-r fzf-history-widget
C-t fzf-file-widget
M-c fzf-cd-widget
在我的系统上,最初,
readline
(bash
用于编辑命令行的库)将这些键绑定到这些功能。 :C-i complete
C-r reverse-search-history
C-t transpose-chars
M-c capitalize-word
和
zle
(zsh
使用的行编辑器)将它们绑定到: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
评论
我个人没有使用它,所以我不确定100%,但是我认为ctrl-p或类似的插件是您要寻找的。注意unite.vim也应该能够做到这一点,但我不建议这样做,因为在我看来,这是一个非常繁琐且易于创建错误的插件。ctrl-p是否可以交互式搜索文件内容?我只用它来根据文件名交互式搜索文件。
我认为有可能,但正如我所说,我不使用它,所以也许我错了