갤 살리기 운동 일환으로 뭐라도 연재 시작해봄
순정 vim부터 (9.0 기준) neovim까지 (nightly 기준) 자잘한 팁같은거 조금씩 뿌릴 생각임
h,j,k,l 같은 vim motion이나 기본적인 config 작성법은 안다는 전제 하에 적을거임
강좌가 아니라 어디까지나 팁. 검색하면 수두룩하게 나오는 누구나 다 아는 정보는 피해서,
최대한 듣보잡 정보인데 알아두면 쓸만한것들만 모아보려 하고 있음
내장 help 문서가 이미 잘 작성되어 있는 vim 특성상 글이 좀 짧은건 양해바람
잘못된 정보에 대한 피드백은 언제나 환영
———
몸이 안좋아서 쳐자다가 지각함 ㅈㅅ
저번에 설명하려다가 망해버린 스니펫은 8월쯤에 다시 정리해서 올림
당분간은 스샷이나 움짤 찍을 여유가 안나네
———
:h CTRL-]
:h CTRL-T
CTRL-] vim help 페이지를 자주 쓴 사람이라면 알듯. help 페이지 내에서 go to definition 역할을 하는 단축키임
CTRL-T는 이전에 CTRL-]를 눌렀던 위치 (go to definition을 실행했던 위치)로 이동함
근데 이건 help 페이지에만 국한되는 로컬 매핑이 아니라 전역 매핑인데, 정확히 어떻게 동작하는건지 알아보자
:h tags
vim에는 tag라는 개념이 존재하는데, 간단히 정리하면 함수의 정의 위치에 대한 정보를 다룸
LSP에서 제공되는 정보를 사용하고 싶다면,
`:set tagfunc=v:lua.vim.lsp.tagfunc`로 LSP를 tag 함수로 지정할 수 있음
:h tag-stack
CTRL-O, CTRL-I로 큰 모션간 undo/redo처럼 이동하는 jumplist랑 비슷한 개념임
CTRL-]로 현재 함수의 정의로 이동하면, tag stack에 이동 전 위치가 저장됨
(`vim.lsp.tagfunc`를 사용중이라면 `vim.lsp.buf.definition()` 도 동일하게 동작. 보통 gd로 많이 매핑하는 그거)
`:tags` 커맨드로 현재 tag stack을 확인할 수 있고,
CTRL-T로 tag stack을 되돌아갈 수 있음.
이렇게만 설명하면 감이 잘 안올텐데, 예시 시나리오로 살펴보자:
예를 들어, 이런 lua/rocks/init.lua 파일에서 CTRL-] 단축키로 커서 밑의 packadd 메서드의 정의로 이동하고
이동한 lua/rocks/runtime.lua 파일에서 이것저것 살펴보다가 CTRL-] 단축키로 vim.notify가 정의된 위치로 이동해서
이런 코드 어딘가로 이동하게 됐는데, 여기서 맨 처음의 lua/rocks/init.lua 파일로 돌아가고 싶다고 생각해보셈
CTRL-O를 통해 jumplist 기반으로 돌아갈 수 있지만, 그러면 같은 파일 내에서의 CTRL-U 같은 모션들도 전부 포함되니까 상당히 돌아가게 된다.
특히 jumplist가 너무 많이 쌓였을 경우엔 얼마나 눌러야 돌아갈 수 있는지 가늠하기도 어려움
여기서 :tags 커맨드로 현재 tag stack 을 확인해보자, 다른 모션 말고 CTRL-]를 통한 정의 이동만 기록된걸 볼 수 있음.
여기서 CTRL-T를 2번 누르면
정확히 맨 처음, 2번의 정의 이동 전의 위치로 돌아갈 수 있음
tag stack 다시 확인해보면 이런 느낌
코드 내에서 정의 살펴본다고 여기저기 이동할때 알아두면 아주 편함.
팁2:
LSP의 go to definition 실행시, 정의 위치가 여러개가 뜨는 경우를 본 적 있을텐데,
`vim.lsp.buf.definition()` 를 매핑해서 쓰는 대신, tagfunc로 등록해놓고 `CTRL-]`를 누르면 무조건 정의가 하나만 뜸
대신 언어에 따라 정확하지 않은 위치로 이동할수도 있으니 그건 조심하자
- dc official App
전보다 이해하기 쉽고 흐름도 좋네 꾸준글 응원함
존나 뇌절하노ㅉ 재미도 없고 도움도 안되고
맞긴함ㅋㅋ
개인적으론 이게 vim을 쓰게된 주된 이유임 LSP이전에도 ctags랑 이 기능이랑 조합하면 C언어에서는 충분(?)했음 C++처럼 문법 복잡한 언어에서는 씩씩거리다가 LSP로 세계정복된듯