갤 살리기 운동 일환으로 뭐라도 연재 시작해봄
순정 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을 되돌아갈 수 있음.



이렇게만 설명하면 감이 잘 안올텐데, 예시 시나리오로 살펴보자:

0e9bf57fb6f468f3239cf4ed339c706c9f748f9aef0eb90e2b7e417bf028012355d58b7af6744cd32628eb5d866c843382876937

예를 들어, 이런 lua/rocks/init.lua 파일에서 CTRL-] 단축키로 커서 밑의 packadd 메서드의 정의로 이동하고

0be4f37eb68760f423eaf3ec339c706fadb47e26292bd089d968c23f9bbd505fbb1c3c077d657b139507d3d803b4ce4690f64a02

74e9f305bdf4698423e78797379c70698f127f4c9d174ca11c656606fdd6d01904e8d37a4c3fa4b27cace178472af80e13934dcd

이동한 lua/rocks/runtime.lua 파일에서 이것저것 살펴보다가 CTRL-] 단축키로 vim.notify가 정의된 위치로 이동해서

7e998602c7f4688423ee87e2429c7065ef91a18f4d1f6661a2a4d001ab8a566a330bd24431d7d57a7b77fb28813510b38acac2de

이런 코드 어딘가로 이동하게 됐는데, 여기서 맨 처음의 lua/rocks/init.lua 파일로 돌아가고 싶다고 생각해보셈

CTRL-O를 통해 jumplist 기반으로 돌아갈 수 있지만, 그러면 같은 파일 내에서의 CTRL-U 같은 모션들도 전부 포함되니까 상당히 돌아가게 된다.
특히 jumplist가 너무 많이 쌓였을 경우엔 얼마나 눌러야 돌아갈 수 있는지 가늠하기도 어려움

78ea8303b6816bf723ea86ec309c70191ad4880353c8a917e6f4eea665e41d656307d46be840cd2af85f1ba744528643b093adca

여기서 :tags 커맨드로 현재 tag stack 을 확인해보자, 다른 모션 말고 CTRL-]를 통한 정의 이동만 기록된걸 볼 수 있음.
여기서 CTRL-T를 2번 누르면

08ebf47ec0f06bf4239984e7439c706f8130f19b1831429ef97d4607c088c2739fa9874bf6188b07578d39435dedee41f01b0366

749bf405bc856df123ea83e0359c706dfbc5ee1f3bd594840fbf1b1368b040d4c106d4fea8c3a35b8a92df1fe51b392398b06ebc

정확히 맨 처음, 2번의 정의 이동 전의 위치로 돌아갈 수 있음

0ee8f404c48a6bf723ee80ec419c7018bc01a9c2c8f92752041a495aca7c8e454552aed3da5634c400e2f551b9dd906295d64767

tag stack 다시 확인해보면 이런 느낌

코드 내에서 정의 살펴본다고 여기저기 이동할때 알아두면 아주 편함.


팁2:
LSP의 go to definition 실행시, 정의 위치가 여러개가 뜨는 경우를 본 적 있을텐데,
`vim.lsp.buf.definition()` 를 매핑해서 쓰는 대신, tagfunc로 등록해놓고 `CTRL-]`를 누르면 무조건 정의가 하나만 뜸
대신 언어에 따라 정확하지 않은 위치로 이동할수도 있으니 그건 조심하자

- dc official App