VIM으로 대화식으로 검색 / 탐지하는 방법?


12

VIM이 모든 파일 내에서 전체 프로젝트를 대화식으로 검색하도록 구성 할 수있는 방법이 있습니까?

하여 대화 형 , 나는 각 키 입력을 업데이트하는 의미.

Emacs consult-git-grep 와 같은 것 : example demo을 참조하십시오 .


나는 개인적으로 사용하지 않으므로 100 % 확신 할 수는 없지만 ctrl-p비슷한 플러그인이 당신이 찾고있는 것이라고 생각 합니다. 참고 unite.vim도 그렇게 할 수있을 것 때문이 아니라 내가 그것을 권하고 싶지 않다 내 의견으로 는 꽤 무겁고 버그 만드는 플러그인입니다.
statox

합니까는 ctrl-p대화 형으로 파일의 내용을 검색 할 수있는 방법이? 이름을 기반으로 파일을 대화식으로 검색하는 데만 사용했습니다.
ideasman42

나는 그것이 가능하다고 생각하지만 내가 그것을 사용하지 않기 때문에 내가 잘못했을 수도 있습니다
statox

답변:


14

이것이 당신이 찾고있는 것인지 확실하지 않지만 어쩌면 fzffzf.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-nC-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있습니다.

또한, 경우가 fzfTMUX의 창을 열고, 당신이 그것을 대신 화면 전체 소요 선호, 당신은 모든 명령에 강타를 추가 할 수 있습니다 ( :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 -PVim 버퍼에서 읽을 수 있는 명령 의 출력을 살펴보십시오 .

bind -P | vim -R -

확실하지 않지만 대부분 또는 모든 readline키 바인딩을 표시해야한다고 생각합니다 . C-tVim 버퍼에서 키에 바인딩 된 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

1
ag필요 설치하는 것을 별도의 플러그인 / 도구는?
ideasman42

@ ideasman42 예, 죄송합니다. 쉘 명령 ag도 필요 하다는 것을 잊었습니다 . 나는 대답을 업데이트했다.
user9433424

1
아마도 이러한 도구는 bash 및 zsh 구성을 기본적으로 대체하는 데 방해가 될 것입니다.
ideasman42

@ ideasman42 당신이 맞습니다, 나는이 문제를 언급하기 위해 대답을 업데이트했습니다.
user9433424
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.