help

:help quickfix 로 볼 수 있다.

vim 기본기능 활용

vimgrep

:vimgrep /pattern/j **
:vim /pattern/j **
:vim /pattern/g **
  • :vimgrep 명령은 :vim으로 축약해 사용해도 문제없다.
  • 하위 경로의 모든 파일에서 pattern 으로 검색한다.
  • j 플래그가 없다면 첫 번째 검색 결과가 버퍼에 자동으로 열린다.
  • 검색 결과는 quickfix 창에서 볼 수 있다.
:vim // **
  • 하위 경로의 모든 파일에서 마지막 검색어로 검색한다.

grep

:grep arguments
:gr arguments
  • grep을 vim 밖에서 쓰는 것처럼 arguments를 주면 된다.
  • 검색 결과는 quickfix 창에서 볼 수 있다.

:grepgrepprg에 지정된 프로그램을 사용하며, 해당 프로그램의 출력 포맷을 grepformat으로 지정 줘야 한다.

다음은 [[/cmd/ag]]와 ack를 설정한 예이다.

if executable('ag')
    set grepprg=ag\ --nogroup\ --nocolor\ --column
    set grepformat=%f:%l:%c%m
elseif executable('ack')
    set grepprg=ack\ --nogroup\ --column\ $*
    set grepformat=%f:%l:%c:%m
endif

cdo, cfdo

  • :cdo, :cfdo를 사용하면 quickfix에 리스팅된 모든 항목, 모든 파일에 대해 명령을 내릴 수 있다.
  • 제공하는 명령은 |를 통해 pipe 연결하는 것도 가능하다.
  • 리스트에 invalid한 항목이 있다면 실패하는데, 이런 것들을 무시하려면 !를 붙여주면 된다.
:cdo s/hello/hi/

위 명령은 quickfix 목록의 모든 항목에 대해 hellohi로 치환해준다.

자세한 내용은 :help :cfdo 참고.

다음 문서도 읽어볼 만하다.

Integralist/Examples.md

응용 및 플러그인 활용

vim-togglelist

vim-togglelist를 사용해 다음과 같이 토글하고 있다.

" quickfix 열기/닫기 토글
nnoremap <Tab>ql :call ToggleLocationList()<CR>
nnoremap <Tab>qq :call ToggleQuickfixList()<CR>

:cnext, :cprevious 입력은 귀찮은 일이기 때문에 이렇게 설정해 뒀다.

" quickfix 다음/이전 이동
nnoremap <Tab>qn :cnext<CR>
nnoremap <Tab>qN :cprevious<CR>

fzf 에서 선택한 항목을 quickfix로 보내기

나는 다음과 같이 fzf 단축키를 매핑해 놓고 있다. <c-q>에 주목.

let g:fzf_action = {
            \ 'ctrl-s': 'split',
            \ 'ctrl-v': 'vsplit',
            \ 'ctrl-q': function('s:build_quickfix_list'),
            \ }

fzf에서 tab 으로 quickfix로 보낼 항목을 선택한 다음 <c-q>를 입력하면 된다.

vim-enmasse 로 편리하게 편지하기

Olical/vim-enmasse

quickfix 리스팅을 해 놓은 다음, :EnMasse를 입력하면 quckfix 엔트리가 모여있는 버퍼가 하나 열린다.

이 버퍼에서 각 엔트리를 편집하고 저장하면 각 파일의 각 엔트리가 업데이트된다.

참고: [[/clojure/vim-setting]]{vim-iced}에도 비슷한 기능이 있다.

Clojure clj-kondo lint report

[[/clojure/vim-setting#clj-kondo로-lint-하기]]

프로젝트 bookmark

아이디어는 다음과 같았다.

  • 각 파일에 대한 즐겨찾기를 개별 파일로 저장하고 싶다.
    • ${pwd}/.bookmark 같은 파일을 만들어서 vim 세션별로 관리하도록 하자.
  • quickfix 기능을 사용하자.
    • 버퍼/윈도우 관리용 코드를 안 짜도 된다.
    • .bookmark파일명:행번호:열번호 메모 형식의 행들로 이루어진 순수한 텍스트 파일이 되도록 한다.
    • 따라서 :cfile .bookmark로 열면 퀵픽스 창으로 열리고, 퀵픽스 기능을 사용할 수 있다.
  • plain text 파일로 저장한다.
    • 그러므로 그냥 열어서 편집도 가능하다.
    • gF, gf로 파일을 쉽게 열 수 있다.
    • url이면 gx로 웹 브라우저도 바로 열 수 있다.

구현

QuickFixBookMark 작업

" 현재 커서가 있는 라인을 북마크 파일에 저장합니다.
function! AddQuickfixBookmarkFile()
    let l:pwd = getcwd()
    let l:file = l:pwd . '/.quickfix-bookmark'
    let l:bookmark = expand("%:p").":".line(".").": ".expand("<cword>")
    echom l:bookmark
    call system("echo '" . l:bookmark . "' >> " . l:file)
endfunction

nnoremap <Tab>qm :call AddQuickfixBookmarkFile()<CR>
  • 북마크 파일에 내용을 추가하는 기능.
    • PWD에 .quickfix-bookmark 파일을 생성한다.
    • vim session이 자동으로 PWD를 관리해주므로 이렇게 하면 프로젝트 루트에 생성된다.
    • 새로운 내용은 quickfix-bookmark 파일의 마지막 줄에 추가된다.
  • <Tab>qm을 순서대로 입력해 사용할 수 있다. (m: mark)
    • mnormal m을 의식한 것이다.
" 북마크 파일을 편집합니다. 메모를 추가하는 등의 용도로 사용하세요.
" 편집 화면에서도 gf, gF 를 사용해 해당 파일의 해당 라인으로 점프할 수 있습니다.
function! EditQuickfixBookmarkFile()
    let l:pwd = getcwd()
    let l:file = l:pwd . '/.quickfix-bookmark'
    execute "vs " . l:file
endfunction

nnoremap <Tab>qe :call EditQuickfixBookmarkFile()<CR>
  • 북마크 파일을 편집할 수 있게 열어주는 기능.
    • 메모를 추가하거나, 삭제하거나, 직접 적어 추가하거나, 수정할 수 있다.
    • gf, gF, gX도 사용할 수 있다.
  • <Tab>qe를 순서대로 입력해 사용할 수 있다. (e: edit)
    • e:edit를 의식한 것이다.
" 북마크 파일을 퀵픽스 창에 열어줍니다.
" 퀵픽스 기능을 사용해 다음 파일, 이전 파일로 이동할 수 있습니다.
function! OpenQuickfixBookmarkFile()
    let l:pwd = getcwd()
    let l:file = l:pwd . '/.quickfix-bookmark'
    execute "cfile " . l:file
    copen
endfunction

nnoremap <Tab>q' :call OpenQuickfixBookmarkFile()<CR>
nnoremap <Tab>q` :call OpenQuickfixBookmarkFile()<CR>
  • 북마크 파일을 소스로 삼아 퀵픽스 창을 열어준다.
  • <Tab>q'를 순서대로 입력해 사용할 수 있다. (': Jump to the mark)

함께 읽기

  • [[/clojure/vim-setting]]