Ctags: .ctags ํŒŒ์ผ์„ ์กด์ค‘ํ•˜์ง€ ์•Š๋Š” gtags

์— ๋งŒ๋“  2017๋…„ 12์›” 08์ผ  ยท  25์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: universal-ctags/ctags

๋‚˜๋Š” Universal-ctags๋กœ ์ „์—ญ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ctags --version์„ ์‹คํ–‰ํ•  ๋•Œ Universal-ctags ๋ฒ„์ „์ด ํ‘œ์‹œ๋˜๊ณ  ๋‹ค๋ฅธ ๋ฒ„์ „์€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” .ctags ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

-exclude=foo

gtags๋ฅผ ์‹คํ–‰ํ•  ๋•Œ .ctags ํŒŒ์ผ๊ณผ ๊ด€๋ จํ•˜์—ฌ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํƒœ๊ทธ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฌด์—‡์„ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์ง€?

๋ชจ๋“  25 ๋Œ“๊ธ€

Universal-ctags๋Š” .ctags๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ctags.1 ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€์˜ FILES ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฑฐ ๋ง์”€ํ•˜์‹œ๋Š”๊ฑด๊ฐ€์š”?

/ctags.cnf (on MSDOS, MSWindows only)
/etc/ctags.conf
/usr/local/etc/ctags.conf
$HOME/.ctags
$HOME/ctags.cnf (on MSDOS, MSWindows only)
.ctags
ctags.cnf (on MSDOS, MSWindows only)

If any of these configuration files exist, each will be expected to contain a set of default options which are read in the order listed when ctags starts, but before the CTAGS environment variable is read or any command line options are read. This makes it possible to set up site-wide, personal or project-level defaults. It is possible to compile ctags to read an additional configuration file before any of those shown above, which will be indicated if the output produced by the --version option lists the "custom-conf" feature. Options appearing in the CTAGS environment variable or on the command line will override options specified in these files. Only options will be read from these files. Note that the option files are read in line-oriented mode in which spaces are significant (since shell quoting is not possible). Each line of the file is read as one command line parameter (as if it were quoted with single quotes). Therefore, use new lines to indicate separate command-line arguments.

์ €๋Š” .ctags๋ฅผ ๊ฐ€๋Šฅ์„ฑ ์ค‘ ํ•˜๋‚˜๋กœ ๋ด…๋‹ˆ๋‹ค!

์•„๋งˆ๋„ ๊ทธ๋Š” ํ˜„์žฌ ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€ ๋ฅผ ์˜๋ฏธ

์‘๋‹ตํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
/pathtorepo/ctags.d/.ctags

์—ฌ๊ธฐ์—๋Š” -R์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

repos ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ:

ctags --์ƒ์„ธ

์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•  ๋•Œ

ctags --vertbose --options=ctags.d/.ctags

๊ทธ๊ฒƒ์€ ์˜ณ์€ ์ผ์„ํ•˜๊ณ  .ctags ํŒŒ์ผ์˜ ์ œ์™ธ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ํƒœ๊ทธ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฌด์—‡์„ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์ง€?

"ctags"๋งŒ ์‹คํ–‰ํ•  ๋•Œ ctags.d/.ctags(๋˜๋Š” ํ•„์š”ํ•œ ๋ชจ๋“  ํŒŒ์ผ)๋ฅผ ์กด์ค‘ํ•˜๋ ค๋ฉด ctags๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” ๋‚ด๊ฐ€ emacs ๋‚ด๋ถ€์—์„œ ggtags๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ggtags์—๋Š” ctags์™€ ๋‚˜๋ž€ํžˆ ์ž‘๋™ํ•˜๋Š” ggtags๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ์—์„œ "gtags"๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ์ž๋™์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ๊ฐ€ ๋˜๊ธธ ์›ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฒ”์šฉ ctag ์‚ฌ์šฉ
  2. Universal-ctags(ctags.d/.ctags) ํŒŒ์ผ์„ ์กด์ค‘ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

/pathtorepo/.ctags.d/exclude.ctags๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
Universal-ctags ์ž์ฒด์˜ ์†Œ์Šค ํŠธ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. .ctags.d ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/universal-ctags/ctags/tree/master/.ctags.d

๋‚ด ๋Œ“๊ธ€์„ ๋ฐ˜๋ณตํ•ด์„œ ์—…๋ฐ์ดํŠธํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

u-ctags๋Š” /pathtorepo์—์„œ u-ctags๋ฅผ ์‹คํ–‰ํ•  ๋•Œ /pathtorepo/.ctags.d/exclude.ctags๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
u-ctags๊ฐ€ exclude.ctags๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ž์œ ๋กญ๊ฒŒ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

masatake๋‹˜, ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ œ์™ธ ํŒŒ์ผ์ด ์„ ํƒ๋˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ด๊ฒƒ์€ ์ œ์™ธ๋˜์ง€ ์•Š์€ ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
    ctags --verbose --options=.ctags
    ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ctags --์ƒ์„ธ
    ์ œ์™ธ ํŒŒ์ผ์„ ์„ ํƒํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œ๋˜์ง€๋งŒ ๋‹ค์Œ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ctags: ์ง€์ •๋œ ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. "ctags --help"๋ฅผ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

ํ•˜์ง€๋งŒ ์™œ? ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ctags --verbose --options=.ctags
์ œ์™ธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๊นŒ?

  1. gtag๊ฐ€ universal-ctags๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ œ์™ธ ํŒŒ์ผ์„ ์„ ํƒํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
    gtags๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ „์—ญ์ด --with-universal-ctags๋กœ ๋นŒ๋“œ๋˜์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  exclude.ctags ํŒŒ์ผ์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

About 1. ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜์–ด๊ฐ€ ์„œํˆด๋‹ค. ๋‹ค์Œ ์ถœ๋ ฅ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ u-ctags๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

$ ./ctags --version | grep Universal
Universal Ctags 0.0.0(248cffc9), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.

u-ctags๋Š” ./.ctags.d ์•„๋ž˜์— ์ ‘๋ฏธ์‚ฌ๋กœ .ctags ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

$  ls -l .ctags.d
-rw-r--r--. 1 jet jet 104 Oct 14 02:46 exclusion.ctags

--verbose ์˜ต์…˜์€ ๋กœ๋“œ๋œ ํŒŒ์ผ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

$ ./ctags --verbose 2>&1 | grep 'Considering option file'
Considering option file .ctags.d/exclusion.ctags: reading...

๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” ํŒŒ์ผ์€ --options ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด,
๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— .ctags ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ์ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ ํŒŒ์ผ์ด ๋‘ ๋ฒˆ ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

$ ./ctags --verbose --options=.ctags.d 2>&1 | grep 'Considering option file'
Considering option file .ctags.d/exclusion.ctags: reading...
Considering option file .ctags.d/exclusion.ctags: already considered

--options๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์—†๋Š” ํŒŒ์ผ์€ ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

$ touch ./.ctags.d/please-load-me
$ ./ctags --verbose  2>&1 | grep 'Considering option file'
Considering option file .ctags.d/exclusion.ctags: reading...
$ mv ./.ctags.d/please-load-me ./.ctags.d/please-load-me.ctags
$ ./ctags --verbose  2>&1 | grep 'Considering option file'
Considering option file .ctags.d/exclusion.ctags: reading...
Considering option file .ctags.d/please-load-me.ctags: reading...

๊ทธ๊ฒŒ ๋‹ค์•ผ. ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€๊ฐ€ ์ž˜ ์ž‘์„ฑ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํ•˜๊ณ  ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์•ฝ 2, ๋ฏธ์•ˆํ•˜์ง€๋งŒ ๋‚˜๋Š” gtags์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์งˆ๋ฌธ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐ›์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์งˆ๋ฌธ์„ ๋ฐ›๊ธฐ ์ „์— ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ์ „ํžˆ $HOME/.ctags๋ฅผ ๋กœ๋“œํ•œ๋‹ค๋ฉด ์ด ์งˆ๋ฌธ์„ ๋ฐ›์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์™œ ๊ทธ ํŒŒ์ผ ๋กœ๋“œ๋ฅผ ์ค‘๋‹จํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ce0617a7be7a4d33a09ac60f21b8a9ce26690853์ด ์ด์œ ๋ฅผ ๋งํ•˜์ง€ ์•Š๊ณ  ์ด๊ฒƒ์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ํŒŒ์ผ์„ ์ด๋™ํ•˜๊ณ  ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ปค๋ฐ‹์€ #1519์˜ ์ผ๋ถ€์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์ด์œ ๊ฐ€ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜ธํ™˜์„ฑ์„ ๊นจ๋Š” ๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, u-ctags ์ดˆ๊ธฐ ๋ฒ„์ „์„ ์ถœ์‹œํ•  ๋•Œ ํ•œ ๋ฒˆ๋งŒ(ํฌ๋ง) ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์€ ํƒœ๊ทธ ํŒŒ์ผ ํ˜•์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ @b4n์ด ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ assigning version 3 tags file format ํ•˜๊ณ  ๋ฌธ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

~/.ctags.d/*.ctags ๋ฐ (๋กœ์ปฌ) ./.ctags.d/*.ctags ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ ์›๋ณธ ํฌ์Šคํ„ฐ์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
Universal Ctags ์ง€์›์œผ๋กœ ์ปดํŒŒ์ผ๋œ GNU Global 6.6.3์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. GTAGSCONF ๋Š” ๊ธฐ๋ณธ gtags.conf ์„ค์น˜ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  GTAGSLABEL ๋Š” new-ctags ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ Global์˜ /plugin-factory/exuberant-ctags.c (Universal Ctags๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ, 193ํ–‰๋ถ€ํ„ฐ ์‹œ์ž‘)์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ .ctags.d/*.ctags ๋กœ๋“œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์˜ต์…˜ ์—†์ด Universal Ctags๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. .

์ด๊ฒƒ์„ ๊ธ€๋กœ๋ฒŒ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ณด๊ณ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. :)

์žฌํ˜„ํ•˜๋ ค๋ฉด:

git clone -b tests --single-branch https://github.com/janEbert/julia-ctags.git
cd julia-ctags
mkdir -p ~/.ctags.d
mkdir -p .ctags.d
ln -s $PWD/ctags ~/.ctags.d/julia.ctags  # or cp if you want to be safe
ln -s $PWD/ctags ./.ctags.d/julia.ctags
gtags
global greet  # returns nothing

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง์ ‘ ctags๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

$ new-ctags --version
$ new-ctags -o - JULIA-FILE

๊ธฐ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋‚˜์š”?

์˜ˆ, Universal Ctags(๋‚ด ์ปดํ“จํ„ฐ์˜ uctags , GTAGSLABEL ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ด๋ฆ„์ด ์•„๋‹˜)๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ --options ๋ฅผ ํ†ตํ•ด ์ง€์ •๋œ .ctags ํŒŒ์ผ์˜ ์œ ๋ฌด์— ๊ด€๊ณ„์—†์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ง์ ‘ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ Universal Ctags๋Š” ~/.ctags.d ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์–ด์จŒ๋“  ์ด ๋™์ž‘์€ Global๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

--options๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. uctags๋Š” --options๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ~/.ctags.d/julia.ctags ๋ฐ ./.ctags.d/julia.ctags๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋‹น์‹ ์ด ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ uctags --version
$ uctags -o - JULIA-FILE

๋ช…๋ น ์ถœ๋ ฅ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

BTW, GNU/Linux์—์„œ ctags๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. uctags ๋Š” --options ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ~/.ctags.d ์˜ ๋‚ด์šฉ์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋‚˜๋Š” ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ gtags ๊ฐ€์ง„ uctags ๋ฐฑ์—”๋“œ๋กœ, ~/.ctags.d _not_ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ, GNU/Linux, ํŠนํžˆ Ubuntu์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ uctags --version
Universal Ctags 0.0.0(1a94658c), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Jul 29 2019, 13:42:51
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +packcc
$ uctags -o - testfile.jl
CtagsTest   testfile.jl /^module CtagsTest$/;"  f
ImmutablePoint  testfile.jl /^struct ImmutablePoint{T}$/;"  f
MutablePoint    testfile.jl /^mutable struct MutablePoint{T}$/;"    f
addcoment   testfile.jl /^addcoment(string::AbstractString, comment, spaces=1) = begin  # Maybe write without `begin`?$/;"  f
addone! testfile.jl /^function addone!(x::T) where {T <: Number}$/;"    f
deprecated_returnsquarepower    testfile.jl /^deprecated_returnsquarepower() = 2.0$/;"  f
multiply    testfile.jl /^multiply(x, y) = x * y$/;"    f
multiply    testfile.jl /^multiply(x, y...) = begin$/;" f
printgreeting   testfile.jl /^    function printgreeting(x)$/;" f
square  testfile.jl /^function square(x)$/;"    f

ํŽธ์ง‘: ์ตœ์‹  ๋ฒ„์ „์˜ ์œ ๋‹ˆ๋ฒ„์„ค Ctag๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์ถœ๋ ฅ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ๋ ฅ์—๋Š” ์œ„์˜ ์ถ”๊ฐ€ ์žฌํ˜„์„ ์œ„ํ•ด ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•œ greet ํ•จ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งํฌํ•œ ๋ถ„๊ธฐ์˜ ์˜ค๋ž˜๋œ ํŒŒ์„œ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. global greet ๋ฅผ global square ๋ฐ”๊พธ๋ฉด ์—ฌ์ „ํžˆ ์ถœ๋ ฅ์ด ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ok ๋…๋ฆฝ ์‹คํ–‰ํ˜• ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ์„œ uctags๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

GNU/๋ฆฌ๋ˆ…์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€! ํ›จ์”ฌ ๋” ๋งŽ์€ ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

strace ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค. Ubuntu๋ฅผ ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ apt-get์ด strace๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ช…๋ น์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์‹คํ–‰

$ strace -s 4096 -f -e execve,execveat gtags

์ถœ๋ ฅ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ok ๋…๋ฆฝ ์‹คํ–‰ํ˜• ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ์„œ uctags๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์•„๋ฆ„๋‹ต๊ฒŒ ๋…๋ฆฝ ์‹คํ–‰ํ˜•์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

GNU/๋ฆฌ๋ˆ…์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€! ํ›จ์”ฌ ๋” ๋งŽ์€ ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

$ strace -s 4096 -f -e execve,execveat gtags
execve("/usr/local/bin/gtags", ["gtags"], 0x7ffe7e8d0fe8 /* 83 vars */) = 0
strace: Process 2210 attached
[pid  2210] execve("/usr/bin/sort", ["/usr/bin/sort", "-k", "1,1"], 0x562714c855b0 /* 84 vars */) = 0
strace: Process 2211 attached
[pid  2211] execve("/usr/bin/sort", ["/usr/bin/sort", "-k", "1,1"], 0x562714c97410 /* 84 vars */) = 0
[pid  2210] +++ exited with 0 +++
[pid  2209] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2210, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
[pid  2211] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2211, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

strace์˜ ์ถœ๋ ฅ์€ gtags๊ฐ€ uctags๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

์ •๋ง ๊ณ ๋งˆ์›Œ. ๋ถˆํŽธ์„ ๋ผ์ณ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ GLOBAL ๊ฐœ๋ฐœ์›์—๊ฒŒ ์”๋‹ˆ๋‹ค!
๋‹ค์‹œ ๊ณ ๋งˆ์›Œ! Universal Ctags๋Š” ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. :)

์ด๋ด, ๋‚˜๋Š” ์กฐ๊ธˆ ์‹œ๋„ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ๋‹น์‹ ์„ ์จ์•ผํ• ์ง€ Shigio๋ฅผ ์จ์•ผํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

GNU Global์€ GTAGSCONF ํŒŒ์ผ์˜ langmap ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ gtags ํŒŒ์ผ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ํ•ด๋‹น ์„ค์ •์„ Universal Ctags์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ์‹œ์ ์—์„œ Julia(.jl)์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ „์—ญ ๊ตฌ์„ฑ์— ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ Universal Ctags๊ฐ€ ๋‹ค์Œ ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜ ์ค‘์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์•Œ ์ˆ˜ ์—†๋Š” ์–ธ์–ด "[langmap ๋ชฉ๋ก]"

๋ฌธ์ œ๋Š” Universal Ctags๊ฐ€ ๋จผ์ € ์ธ์ˆ˜๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ ๋‹ค์Œ .ctags.d ์˜ต์…˜์„ ๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. --langmap ์˜ต์…˜์„ ์ „๋‹ฌํ•˜๊ธฐ _์ „์—_ ๋ช…์‹œ์ ์œผ๋กœ --options=[...].ctags ์ „๋‹ฌํ•˜๋„๋ก Global์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ํ›„ ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์‹œ ํ•œ ๋ฒˆ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ณ  Global ํ…Œ์ด๋ธ”์„ ์–ป์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ธ์ง€( .ctags.d ํŒŒ์ผ์ด Universal Ctags์— ๋Œ€ํ•œ ์ธ์ˆ˜๋ณด๋‹ค ๋จผ์ € ์ฒ˜๋ฆฌ๋˜๋„๋ก) ์•„๋‹ˆ๋ฉด Global์— ๋ณด๊ณ ์„œ๋ฅผ ์ œ์ถœํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Universal Ctags๊ฐ€ ๋จผ์ € ์ธ์ˆ˜๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ ๋‹ค์Œ .ctags.d์˜ ์˜ต์…˜์„ ๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋‹ค.
๋ช‡ ๊ฐ€์ง€ ์˜ˆ์™ธ๋งŒ ์žˆ์ง€๋งŒ Universal-ctags๋Š” .ctags.d/*.ctags๋ฅผ ๋กœ๋“œํ•œ ๋‹ค์Œ cmdline ์˜ต์…˜์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
ctags-optlib.7 ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€์—์„œ ์ž‘์„ฑํ•œ ๊ฒƒ์ฒ˜๋Ÿผ --_echo=MSG ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ u-ctags๊ฐ€ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 [yamato@slave]~% ls ~/.ctags.d 
config.ctags
[yamato@slave]~% cat ~/.ctags.d/config.ctags
--_echo=hello from dot-ctags


[yamato@slave]~% u-ctags --_echo="hello from cmdline" --_force-quit
u-ctags: Notice: hello from dot-ctags
u-ctags: Notice: hello from cmdline

ctags.1 ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ctags์— --options๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
julia.ctags๋ฅผ ~/.ctags.d์— ๋„ฃ๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. u-ctags๋Š” julia.ctags๋ฅผ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ --options๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ข‹์•„, ๋ฐฉ๊ธˆ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ ๋” ์ด์ƒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ํ•ด๋“œ๋ ค ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰