denite의 grep에게 VisualMode의 힘을 줘

8188 단어 neovimdenite.nvimVim

denite.nvim이란?



fzf라든지의 파인더 같은 녀석입니다.
다양한 조작의 인터페이스를 제공, 확장이 가능하게 되어 있어,
뭐든지 바꿀 수 있는 흑마술을 닮은 뭔가라고 생각하고 있습니다.


grep을 보다 편리하게



gif 내에서 grep의 데모하고 있지만,
이번에는 Visual 모드에서 선택한 문자열을 denite로 grep 할 수 있습니다.

선택 문자열을 얻고 denite



구글 선생님에게 물어 보면
h tps : // s c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 1533565 / HO W-Toge t- ぃ
를 찾았습니다.
getline("'<")[getpos("'<")[2] - 1:getpos("'>")[2] - 1]

우선, 함수화합니다.
function! g:GetVisualWord() abort
  let word = getline("'<")[getpos("'<")[2] - 1:getpos("'>")[2] - 1]
  return word
endfunction


Visual 모드일 때만 실행하고 싶으므로 매핑
xnoremap <silent> <SPACE>fg :Denite grep:::`GetVisualWord()`<CR>
" Space file grepって感じのマッピング

다만, 메타 문자라든지 들어가면, 올바른 grep 되지 않습니다. (grep 개인차에 따릅니다)
필요한 것 같은 편의 문자를 이스케이프 하는 함수를 새롭게 작성.
function! g:GetVisualWordEscape() abort
  let word = substitute(GetVisualWord(), '\\', '\\\\', 'g')
  let word = substitute(word, '[.?*+^$|()[\]]', '\\\0', 'g')
  return word
endfunction
xnoremap <silent> <SPACE>fg :Denite grep:::`GetVisualWordEscape()`<CR>
" エスケープバージョンに変更

이제 이렇게 됩니다.Dente file의 grep과 get(g의 grep이 있습니다!


복사하고 페어 검색하는 번거로움이 없어져 편해졌습니다!

대단히 처리를 확인



예를 들어 aiueo 문자열이 있고 iue를 선택한 상태라고 가정합니다.
01234 " 添字
12345 " 列番号
aiueo " 文字
 < >  " 選択文字: iue

하나씩 처리 결과를 살펴 보겠습니다.

" 1.選択している行の文字列を取得
getline("'<")
" Output: aiueo

" 2.選択文字列の初めの文字位置を取得
getpos("'<")[2]
" Output: 2

" 3.選択文字列の最後の文字位置を取得
getpos("'>")[2]
" Output: 4

" 4.開始位置と終了位置の添字を取得
getpos("'<")[2] - 1
" Output: 1
getpos("'>")[2] - 1
" Output: 3

" 5.上記を合わせて、選択文字を取得
" getline("'<")[1:3]
getline("'<")[getpos("'<")[2] - 1:getpos("'>")[2] - 1]
" Output: iue

포인트 부분 확인



'< 및 '>


'<는 마지막으로 선택한 첫 번째 행과 문자를 의미합니다.
반대로 '>는 마지막으로 선택한 마지막 행과 문자를 의미합니다.
어딘가를 선택한 다음 일반 모드에서 '< 실행하면 선택한 첫 번째 행으로 날아갑니다.

getpos



즉, getline("'<") 는, 최초의 선택행의 캐릭터 라인을 출력하고 있습니다.
getpos[bufnum, lnum, col, off]의 목록을 반환합니다.
시작 문자의 위치를 ​​알고 싶기 때문에 col 의 2 번째가 필요하므로 [2] 입니다.

Denite grep


Denite grep:0:1:2는 위치에 따라 각각 의미가 있습니다. ( :h denite-source-grep에서 자세히 알아보기)
  • 0는 지정된 경로에서 grep
  • 1는 지정된 grep 옵션으로 실행
  • 2는 지정된 문자열로 grep

  • 라는 역할이 있으므로 Denite grep:::grep-word 라는 느낌으로 사용합니다.

    사이고에게



    선택 문자열을 grep이라는 직관적인 조작이 되었습니다.
    이 선택 문자 취득 방법이라면, 멀티 바이트 대응하고 있지 않으므로, 향후 개량하고 싶네요 (이미 있을까? 알고 있으면 가르쳐 주세요!!)

    denite.nvim은 매우 편리합니다!
    핵심 부분은 Python으로 작성되었으므로 확장도 Python으로 할 수 있습니다! (디자브)

    필자는, Vim 어드벤트 캘린더 12일에도 참가하고 있어(단지의 프로모션), Git의 차분 관계(브랜치간의 커밋 로그 일람표시, 브랜치간 파일 일람표시, 차분 확인)를 조작할 수 있는 denite 확장 플러그인을 소개할 예정이므로 흥미있는 분은 꼭 체크 부탁드립니다.

    좋은 웹페이지 즐겨찾기