VIM이 모든 파일 내에서 전체 프로젝트를 대화식으로 검색하도록 구성 할 수있는 방법이 있습니까?
하여 대화 형 , 나는 각 키 입력을 업데이트하는 의미.
Emacs consult-git-grep 와 같은 것 : example demo을 참조하십시오 .
ctrl-p
대화 형으로 파일의 내용을 검색 할 수있는 방법이? 이름을 기반으로 파일을 대화식으로 검색하는 데만 사용했습니다.
VIM이 모든 파일 내에서 전체 프로젝트를 대화식으로 검색하도록 구성 할 수있는 방법이 있습니까?
하여 대화 형 , 나는 각 키 입력을 업데이트하는 의미.
Emacs consult-git-grep 와 같은 것 : example demo을 참조하십시오 .
ctrl-p
대화 형으로 파일의 내용을 검색 할 수있는 방법이? 이름을 기반으로 파일을 대화식으로 검색하는 데만 사용했습니다.
답변:
이것이 당신이 찾고있는 것인지 확실하지 않지만 어쩌면 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
있습니다.
이를 사용하려면 쉘 명령 ag 를 설치해야합니다 . 데비안 기반 배포판에서는 다음 명령을 사용하여 배포 할 수 있습니다.
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 키를 누른 후 빠른 수정 사항 목록이 채워집니다. 여기에서 :cnext
및과 같은 기본 Vim 명령 / 매핑으로 탐색 할 수 있습니다 :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
셸 에도 동일하게 적용 되지만 키 바인딩을 설치하는 구문은 약간 다릅니다.
bindkey '^X^T' fzf-file-widget
bindkey '^T' transpose-chars
사용했던 셸 키 바인딩 중 하나가에 의해 재정의 된 fzf
경우이를 복원하려고하지만 실행 된 함수의 정확한 이름이 무엇인지 모르는 경우 다음을 시도 할 수 있습니다.
먼저 내부 ~/.bashrc
에서 fzf
구성을 제공 하는 행을 일시적으로 주석 처리 하십시오 . 그런 다음 터미널을 다시 열고 bind -P
Vim 버퍼에서 읽을 수 있는 명령 의 출력을 살펴보십시오 .
bind -P | vim -R -
확실하지 않지만 대부분 또는 모든 readline
키 바인딩을 표시해야한다고 생각합니다 . C-t
Vim 버퍼에서 키에 바인딩 된 readline 함수의 이름을 찾으려면을 검색하십시오 \\C-t
. 그리고 M-c
(meta / alt 키)에 바인딩 된 것을 찾으면 검색 할 것입니다 \\ec
( \e
이스케이프 키를 나타내며와 M-c
동일한 키 코드를 생성하는 것 같습니다 escape + c
).
명령 zsh
의 출력을 보면 동일한 작업을 수행 할 수 있습니다 bindkey
. 그러나 이번에 ^[
는 meta / alt 수정 자 키를, 단일 캐럿 ( ^
) 문자는 제어 키를 나타냅니다.
현재 fzf
이름에 키워드가 포함 된 함수를 실행하는 4 개의 키 바인딩이 발견되었습니다 . 키 시퀀스 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
ag
필요 설치하는 것을 별도의 플러그인 / 도구는?
ag
도 필요 하다는 것을 잊었습니다 . 나는 대답을 업데이트했다.
ctrl-p
비슷한 플러그인이 당신이 찾고있는 것이라고 생각 합니다. 참고unite.vim
도 그렇게 할 수있을 것 때문이 아니라 내가 그것을 권하고 싶지 않다 내 의견으로 는 꽤 무겁고 버그 만드는 플러그인입니다.