발단

평소 유용하게 잘 쓰고 있는 tagbar가 markdown 파일을 지원하면 유용할 것 같다는 생각이 들었다.

공통 준비물

다음 도구들을 평소에 사용하고 있었다면 곧바로 적용하면 된다.

방법 1: .ctags 수정으로 간단하게 적용하는 방법

이 방법이 가장 심플하고 쉬우며, 종합적으로 가장 좋은 방법이라 생각한다.

~/.ctags 파일을 만들고 다음 내용을 집어넣는다.

--langdef=markdown
--langmap=markdown:.md
--regex-markdown=/^(#+)[ \t]+([^#]*)/\1 \2/h,header,Markdown Headers/
--regex-markdown=/\[([^\[]+)\]\(([^\)]+)\)/\1/l,link,Markdown Links/
--regex-markdown=/!\[\]\(.*[\/ ](.*\.[a-z]{3})\)/\1/i,image,Markdown Image/
  • langdef=markdown: markdown 랭귀지 정의
  • langmap=markdown:.md: .md 확장자를 가진 파일 지정

이제 .vimrc 파일을 열고 다음과 같이 g:tagbar_type_markdown 값을 지정해 준다.

let g:tagbar_type_markdown = {
    \ 'ctagstype' : 'markdown',
    \ 'kinds' : [
            \ 'h:headings',
            \ 'l:links',
            \ 'i:images'
        \ ],
    \ "sort" : 0
\ }

sort: 0이 중요하다. 이 값을 1로 설정하면, tagbar에 표시되는 태그가 정렬되기 때문에 markdown 문서의 toc를 보려는 목적에 적합하지 않다.

  • 이제 평소대로 tagbar를 사용하면 된다.
  • 만약 tagbar 갱신이 잘 안 된다면 갱신이 필요할 때마다 :e를 입력해주면 잘 돌아간다.
    • vim-gutentags를 쓰고 있다면 이런 수동 갱신을 쓸 일이 거의 없다.

방법 1을 응용해 vimwiki의 마크다운에도 적용하자

vimwiki는 filetypemarkdown이 아니라 vimwiki로 사용하고 있기 때문에 위와 같이 설정해도 tagbar가 제대로 표시되지 않을 수 있다.

위에서 설정했던 것과 거의 똑같이 .ctags 파일에 vimwiki 설정을 추가해주면 된다.

다음은 내가 사용하고 있는 .ctags 파일이다.

--langdef=markdown
--langmap=markdown:.md
--regex-markdown=/^(#+[ \t]+.*)/\1/h,heading,headings/

--langdef=vimwiki
--langmap=vimwiki:.md
--regex-vimwiki=/^(#+[ \t]+.*)/\1/h,heading,headings/

그리고 .vimrcg:tagbar_type_vimwiki를 추가해 주면 된다.

let g:tagbar_type_vimwiki = {
    \ 'ctagstype' : 'vimwiki',
    \ 'sort': 0,
    \ 'kinds' : [
        \ 'h:Heading'
    \ ]
\ }

방법 2: markdown2ctags 를 사용하는 방법

이 방법은 별로 추천하지 않는다. 마크다운 파일을 저장할 때마다 자동으로 태그바가 갱신되지 않기 때문이다. 자동으로 갱신하게 하려면 vimscript를 잡다하게 작성해야 하므로 불편한 점이 많다.

이 방법은 markdown2ctags를 사용하는 방법이다.

링크한 저장소에서 markdown2ctags.py 파일을 복사해 ~/.local/bin/로 옮겨두자.

하지만 그렇게 하면 컴퓨터를 바꾸거나 새로운 환경을 셋팅할 때마다 귀찮게 복사해야 할 것이므로 그냥 vim plug의 do를 사용하면 편하다.

Plug 'jszakmeister/markdown2ctags', {'do' : 'cp ./markdown2ctags.py ~/.local/bin/markdown2ctags.py'}

이제 .vimrc에 다음과 같이 설정해 준다.

let g:tagbar_type_markdown = {
    \ 'ctagstype': 'markdown',
    \ 'ctagsbin' : '/path/to/markdown2ctags.py',
    \ 'ctagsargs' : '-f - --sort=yes --sro=»',
    \ 'kinds' : [
        \ 's:sections',
        \ 'i:images'
    \ ],
    \ 'sro' : '»',
    \ 'kind2scope' : {
        \ 's' : 'section',
    \ },
    \ 'sort': 0,
\ }

세션 관련 문제 해결

한편 자동 세션 저장 기능을 사용하고 있을 때 tagbar가 열려 있는 상태에서 vim을 종료하고 다시 실행하면 tagbar가 일시적으로 제대로 작동하지 못하는 문제가 발생할 수 있다.

이런 경우, 다음과 같이 자동으로 tagbar를 종료하고 열어주는 augroup을 만들면 문제를 해결할 수 있다. 아래의 예제는 마크다운 파일을 편집하는 경우에만 tagbar 자동 종료/실행이 작동하도록 되어 있다.

augroup vimwiki_tagbar
    autocmd BufRead,BufNewFile *wiki/*.md TagbarOpen
    autocmd VimLeavePre *.md TagbarClose
augroup END

함께 읽기

  • [[ctags]]{ctags 명령어}