Search
Duplicate

neovim 간단 꿀팁 - 복사한부분 하이라이팅

간단소개
nvim에서 복사한 부분을 시각적으로 확인하는 방법
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Vim
잡지식
태그
vim
잡지식
Scrap
8 more properties

0. 결론 요약

init.vim 설정파일에 다음을 추가한다. (neovim 0.5버전 이상에서는 별도의 플러그인 없이 가능하다.)
augroup highlight_yank autocmd! autocmd TextYankPost * silent! lua vim.highlight.on_yank() augroup END
Bash
이후 yy 등으로 텍스트를 복사할 때 복사되는 부분이 강조되어 쉽게 확인 가능하다.
yi” 명령어로 따옴표 내부를 복사한 모습

1. 서론

vim에서 텍스트를 복사할 때, 복사한 부분이 확인이 안되는 탓에 제대로 복사가 된건가? 싶은 경우가 종종 있었다. neovim에서는 자체적으로 복사되는 부분이 하이라이팅되게 설정이 가능하다.
// 여담이지만 개인적으로 추가하고 엄청 편하게 쓰고 있는 기능중 하나입니다. 적극 추천…

2. 추가설정

augroup highlight_yank autocmd! autocmd TextYankPost * silent! lua vim.highlight.on_yank({higroup="IncSearch", timeout=350}) augroup END
Bash
on_yank 이후 괄호 안에 { } 로 묶어 옵션을 지정해줄 수 있다.
higroup : 어떤 highlighting group 설정을 이용할지. 쉽게 말해 어떤 색으로 하이라이팅되게 할지 설정한다. 기본 설정값은 IncSearch
timeout: 하이라이팅 지속 시간 (ms 단위). 기본 설정값은 150ms 저는 150은 너무 짧아서 350으로 설정해두고 씁니다.
on_macro: 매크로를 이용할때 적용 여부. 기본 설정값은 false
on_visual: visual 모드로 선택한 부분을 복사할 때 적용 여부. 기본 설정값은 true
event: event structure….라는데 이건 잘 모르겠다. 기본 설정값은 v:event

3. 명령어 간단 보충설명

// 사실 저도 이 부분들은 자세히 몰라서… 대략적으로만 설명합니다 틀린부분 지적, 보완 환영합니다.
autocmd는 어떤 {event}가 일어났을 때 자동으로 특정 {command}들을 실행하게 하는 기능이다.
:au[tocmd] [group] {event} {pat} [++once] [++nested] {cmd}
Bash
group: autocmd group으로…여러 autocmd들을 묶어서 지정할 수 있는 듯하다. 생략할 경우 현재 지정된 autogroup을 사용한다고 한다. 위에서는 highlight_yank 로 그룹을 설정해줬다.
event: TextYankPost 부분에 해당한다. 즉 ‘텍스트가 복사될 때’ 실행하라는 뜻.
pattern: 적용할 파일 패턴. 위에선 wildcard를 이용해 모든 파일에 적용했다. *.c 등으로 특정 파일형식을 지정해주는 것도 가능하다.
이후 뒤에 붙는 부분들이 실행할 명령어에 해당한다. (silent ! 는 기타 메세지나 에러메세지를 출력하지 않고 실행하라는 뜻)

4. nvim말고 그냥 vim은요?

vim에서는… 크게 2가지 방법이 있는 것 같다.
1.
외부 플러그인을 쓰는 방법. 아래 플러그인이 대표적인듯하다.
2.
vimscript를 직접 작성하는 방법….아래 링크와 같은 방법이 있다고 합니다. (vim 버전 8.0.1394 이상만 가능)
여러분을 위해 위 글의 결론만 대충 요약하자면… 아래 내용을 .vimrc 설정파일에 추가하면 된다고 합니다.
(TextYankPost 이벤트시 FlashYankedText를 호출하고, 타이머 이후 DeleteTemporaryMatch 함수를 호출하는 방식)
augroup highlightYankedText autocmd! autocmd TextYankPost * call FlashYankedText() augroup END function! FlashYankedText() if (!exists('g:yankedTextMatches')) let g:yankedTextMatches = [] endif let matchId = matchadd('IncSearch', ".\\%>'\\[\\_.*\\%<']..") let windowId = winnr() call add(g:yankedTextMatches, [windowId, matchId]) call timer_start(500, 'DeleteTemporaryMatch') endfunction function! DeleteTemporaryMatch(timerId) while !empty(g:yankedTextMatches) let match = remove(g:yankedTextMatches, 0) let windowID = match[0] let matchID = match[1] try call matchdelete(matchID, windowID) endtry endwhile endfunction
Bash
음…여러분 그냥 neovim을 씁시다. brew install neovim 혹은 apt install neovim 추천드립니다.

5. 참고한 링크