ํ์ ์ด๋ฆ: ์๋ฌด๊ฑฐ๋
ctags๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉํ ๋ช ๋ น์ค:
$ ctags --options=NONE -R -x
์ ๋ ฅ ํ์ผ์ ๋ด์ฉ:
$ git clone https://github.com/liuchengxu/vista.vim
$ cd vista.vim
$ ctags --options=NONE -R -x
๊ทํ๊ฐ ๋ง์กฑํ์ง ๋ชปํ๋ ํ๊ทธ ์ถ๋ ฅ:
ctags -R -x
์ ์ถ๋ ฅ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ctags -R -x
์ ์ถ๋ ฅ์์ โโํ๊ทธ ์ด๋ฆ๊ณผ ๋ฒ์๋ฅผ ํํฐ๋งํ๊ณ ์ถ์ง๋ง ์ ๋๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ
๋๋ค.
์์ํ๋ ํ๊ทธ ์ถ๋ ฅ:
ctags -R
์ ๋ํ ํน์ ํ์๋ ์๋ ๊ฒฝ์ฐ ์คํ ๊ฐ๋ฅํฉ๋๋ค.
{tagname}<Tab>{tagfile}<Tab>{tagaddress}[;"<Tab>{tagfield}..]
ctags ๋ฒ์ :
$ ctags --version
Universal Ctags 0.0.0(1208e45), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
Compiled: Mar 11 2019, 17:01:27
URL: https://ctags.io/
Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +case-insensitive-filenames, +packcc
ctags ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ป๋ ๋ฐฉ๋ฒ:
macOS์ brew install ctags
๋๋ ๋น์ ์ ์ง๋ฌธ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
ctags -R
์ ์ถ๋ ฅ์ ๋ง์กฑํ์ญ๋๊น? ๊ทธ๋ ๋ค๋ฉด -x
์ต์
์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๊ทํ์ ์ง๋ฌธ์ ๋ต๋ณํ๊ธฐ ์ํด ์ฌ์ฉ ์ฌ๋ก์ ๋ฐฐ๊ฒฝ์ ๋ ์๊ณ ์ถ์ต๋๋ค.
vim ์คํฌ๋ฆฝํธ๋ฅผ ๋ชจ๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ ctags์ vim ํ์์ธ vim.c๋ฅผ ์ฝ๋ ํ ๋ฒ์ ํ๋๋ฅผ ์ฑ์ฐ์ง ์์ต๋๋ค. ๋ฒ๊ทธ๋ผ๊ณ ์๊ฐ๋๋ฉด vim ํ์๊ฐ ์ด๋ค ์ข ๋ฅ์ ์ ๋ ฅ์ ๋ํ ๋ฒ์ ํ๋๋ฅผ ์ฑ์ฐ๋์ง ์๋ ค์ฃผ์ญ์์ค.
๋ช ํํ ํ์ง ๋ชปํด ์ฃ์กํฉ๋๋ค.
-x
์ต์ ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
ctags -R
๊ฐ ๋ด ํ์๋ฅผ ์ถฉ์กฑํ์ง๋ง ํ๊ทธ ํ์ผ์ ์์ฑํ๊ณ ์ถ์ง ์์ผ๋ฏ๋ก -x
์ต์
์ ์ฌ์ฉํฉ๋๋ค.
๋ด ์ฌ์ฉ ์ฌ๋ก.
ํ์ฌ vista.vim์ ์ผ๋ถ ํ์ผ์ ํ๊ทธ ํ์๋ง ์ง์ํ์ง๋ง ์ผ๋ถ ์ฌ์ฉ์๋ ํ๋ก์ ํธ์ ๋ชจ๋ ํ๊ทธ ํ์๋ฅผ ์ํฉ๋๋ค(https://github.com/liuchengxu/vista.vim/issues/14). ctags -R
์ง์์ ์ถ๊ฐํ๋ ค๊ณ ํ์ง๋ง ์ด๋ฌํ ์ถ๋ ฅ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํ๋ง๋๋ก vista#util#Trim
, function
, 18
, autoload/vista/util.vim
, vista#util#Trim(str)
๋ฅผ ๊ฐ๊ฐ ์ถ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
ctags -R -x
:
...
vista#util#Trim function 18 autoload/vista/util.vim function! vista#util#Trim(str)
vista#util#Truncate function 13 autoload/vista/util.vim function! vista#util#Truncate(msg) abort
vista#util#Warning function 90 autoload/vista/util.vim function! vista#util#Warning(msg) abort
vista#viewer#Display function 90 autoload/vista/viewer.vim function! vista#viewer#Display(data) abort
vista#viewer#Render function 86 autoload/vista/viewer.vim function! vista#viewer#Render(data) abort
vista#viewer#prefixes function 94 autoload/vista/viewer.vim function! vista#viewer#prefixes() abort
-o -
์ต์
์ ์ฌ์ฉํ๋ฉด ctags๋ ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ์ stdout์ผ๋ก ๋ด๋ณด๋
๋๋ค.
[yamato@slave]/tmp/vista.vim% u-ctags -R -o - | head
/ ftplugin/vista.vim /^nnoremap <buffer> <silent> \/ :<c-u>call vista#finder#fzf#Run()<CR>$/;" m
<CR> ftplugin/vista.vim /^nnoremap <buffer> <silent> <CR> :<c-u>call vista#cursor#FoldOrJump()<CR>$/;" m
Commands README.md /^### Commands$/;" S
Contributing README.md /^## Contributing$/;" s
Features README.md /^## Features$/;" s
Installation README.md /^## Installation$/;" s
Introduction README.md /^## Introduction$/;" s
License README.md /^## License$/;" s
NeoVim README.md /^#### NeoVim$/;" t
Options README.md /^### Options$/;" S
--_xformat=
์ต์
์ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
u-ctags -R -x --_xformat='TAGNAME:%N @@@ KIND:%K !!! LINE:%n +++ INPUT-FILE:%F === PATTERN:%P' | head
TAGNAME:/ @@@ KIND:map !!! LINE:38 +++ INPUT-FILE:ftplugin/vista.vim === PATTERN:/^nnoremap <buffer> <silent> \/ :<c-u>call vista#finder#fzf#Run()<CR>$/
TAGNAME:<CR> @@@ KIND:map !!! LINE:37 +++ INPUT-FILE:ftplugin/vista.vim === PATTERN:/^nnoremap <buffer> <silent> <CR> :<c-u>call vista#cursor#FoldOrJump()<CR>$/
TAGNAME:Commands @@@ KIND:subsection !!! LINE:101 +++ INPUT-FILE:README.md === PATTERN:/^### Commands$/
TAGNAME:Contributing @@@ KIND:section !!! LINE:164 +++ INPUT-FILE:README.md === PATTERN:/^## Contributing$/
TAGNAME:Features @@@ KIND:section !!! LINE:37 +++ INPUT-FILE:README.md === PATTERN:/^## Features$/
TAGNAME:Installation @@@ KIND:section !!! LINE:69 +++ INPUT-FILE:README.md === PATTERN:/^## Installation$/
TAGNAME:Introduction @@@ KIND:section !!! LINE:25 +++ INPUT-FILE:README.md === PATTERN:/^## Introduction$/
TAGNAME:License @@@ KIND:section !!! LINE:168 +++ INPUT-FILE:README.md === PATTERN:/^## License$/
TAGNAME:NeoVim @@@ KIND:subsubsection !!! LINE:90 +++ INPUT-FILE:README.md === PATTERN:/^#### NeoVim$/
TAGNAME:Options @@@ KIND:subsection !!! LINE:113 +++ INPUT-FILE:README.md === PATTERN:/^### Options$/
http://docs.ctags.io/en/latest/news.html?highlight=--_xformat#customizing -xref-output ์ ์ฐธ์กฐํ์ธ์.
ํ์๋ฅผ ์์ฑํ์ง ์์ผ๋ ค๋ฉด --output-format=json
๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
u-ctags -R --output-format=json | head
{"_type": "tag", "name": "/", "path": "ftplugin/vista.vim", "pattern": "/^nnoremap <buffer> <silent> \\/ :<c-u>call vista#finder#fzf#Run()<CR>$/", "kind": "map"}
{"_type": "tag", "name": "<CR>", "path": "ftplugin/vista.vim", "pattern": "/^nnoremap <buffer> <silent> <CR> :<c-u>call vista#cursor#FoldOrJump()<CR>$/", "kind": "map"}
{"_type": "tag", "name": "Commands", "path": "README.md", "pattern": "/^### Commands$/", "kind": "subsection"}
{"_type": "tag", "name": "Contributing", "path": "README.md", "pattern": "/^## Contributing$/", "kind": "section"}
{"_type": "tag", "name": "Features", "path": "README.md", "pattern": "/^## Features$/", "kind": "section"}
{"_type": "tag", "name": "Installation", "path": "README.md", "pattern": "/^## Installation$/", "kind": "section"}
{"_type": "tag", "name": "Introduction", "path": "README.md", "pattern": "/^## Introduction$/", "kind": "section"}
{"_type": "tag", "name": "License", "path": "README.md", "pattern": "/^## License$/", "kind": "section"}
{"_type": "tag", "name": "NeoVim", "path": "README.md", "pattern": "/^#### NeoVim$/", "kind": "subsubsection"}
{"_type": "tag", "name": "Options", "path": "README.md", "pattern": "/^### Options$/", "kind": "subsection"}
๊ฐ์ฌํฉ๋๋ค! brew์ ์ํด ์ค์น๋ ctags
๋ brew install ctags
์ด๋ brew install --HEAD universal-ctags/universal-ctags/universal-ctags
์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก --output-format=json
๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ $ --_xformat=
์ต์
์ ์๋ํฉ๋๋ค.
@KazuakiM , ctags๋ฅผ libjansson.so.4์ ์ฐ๊ฒฐํ ์ ์๋์?
u-ctags์๋ json ์ถ๋ ฅ ๋ชจ๋๊ฐ ์์ต๋๋ค. u-ctags๊ฐ libjansson์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
์ด๊ฒ์ homebrew-universal-ctags repo์์ ์๋ก์ด ๋ฌธ์ ๋ก ๋ณด๊ณ ํด์ผ ํ๋์ง ์๋ ค์ฃผ์ธ์.
@liuchengxu , ํ๊ทธ ํ์ผ, ctags์ ๊ธฐ๋ณธ ํ์์ readtags.c์ ํจ์๋ก ๊ตฌ๋ฌธ ๋ถ์๋ ์ ์์ต๋๋ค.
readtags ๋ช
๋ น ๋ฐ python-ctags3, python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ readtags.c๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@masatake
์๋
ํ์ธ์, homebrew-universal-ctags๋ jansson์ ์ง์ํฉ๋๋ค.
$ brew info universal-ctags
universal-ctags/universal-ctags/universal-ctags: HEAD
Maintained ctags implementation
https://github.com/universal-ctags/ctags
Conflicts with:
ctags (because this formula installs the same executable as the ctags formula)
/usr/local/Cellar/universal-ctags/HEAD-1b747b3 (325 files, 4.3MB) *
Built from source on 2019-02-02 at 16:45:17
From: https://github.com/universal-ctags/homebrew-universal-ctags/blob/master/universal-ctags.rb
==> Dependencies
Build: autoconf โ, automake โ, pkg-config โ
Optional: jansson โ, libyaml โ
==> Options
--with-jansson
Build with jansson support
--with-libyaml
Build with libyaml support
--without-doc
Compile without man pages
--without-xml
Compile without libxml2
--HEAD
Install HEAD version
==> Caveats
Under some circumstances, emacs and ctags can conflict. By default,
emacs provides an executable `ctags` that would conflict with the
executable of the same name that ctags provides. To prevent this,
Homebrew removes the emacs `ctags` and its manpage before linking.
However, if you install emacs with the `--keep-ctags` option, then
the `ctags` emacs provides will not be removed. In that case, you
won't be able to install ctags successfully. It will build but not
link.
@KazuakiM ์ข์ ์บ์น, ๋์์ ๋์ณค์ต๋๋ค. JSON ์ง์์๋ --with-jansson
์ต์
์ด ํ์ํฉ๋๋ค.
$ brew reinstall --with-jansson universal-ctags/universal-ctags/universal-ctags