Improve some berserk checks
[crawl.git] / crawl-ref / docs / develop / ctags.txt
1 1. CTAGS-EXUBERANT SETTINGS FOR CRAWL
2
3 For users of ctags-exuberant, there are some settings that can improve
4 your quality of living when working on crawl. Note that some of these
5 settings aren't appropriate for your ~/.ctags unless you work exclusively
6 on crawl.
7
8 --langdef=crawlmap
9 --langmap=crawlmap:+.des
10 --regex-crawlmap=/^ *NAME: *([^ ]*)/\1/q,map,map definition/
11
12     Create tags for maps in .des files, pointing to the NAME: line.
13     Single-quote the regex in the shell, but not in .ctags.
14
15 --regex-c++=/^ *DEF_BITFIELD *\( *([a-zA-Z0-9_:]*)/\1/t/
16 --regex-c++=/^ *FEATFN_MEMOIZED *\( *([a-zA-Z0-9_:]*)/\1/f/
17
18     Treat the DEF_BITFIELD macro as a typedef and FEATFN_MEMOIZED as a
19     function definition.
20
21 -I decltype+
22
23     More correctly interpret "auto func() -> decltype(foo)" as a declaration
24     of "func", not of "decltype".
25
26 -I override
27 -I PURE
28 -I IMMUTABLE
29
30     The same, for C++11 "override" and our function attribute macros.
31
32 --extra=+q
33
34     Allow searching for "player::rot", not just "rot".
35
36 --exclude=contrib
37 --exclude=android-project
38 --exclude=saves
39
40     Don't tag third-party code, and don't try to tag save files,
41     which would otherwise be mistaken for C# source.
42
43
44 2. RUNNING CTAGS AUTOMATICALLY
45
46 I like to run ctags automatically every time I take a git action, but don't
47 want to wait for it to complete each time. Instead, I run ctags in the
48 background. But, until ctags does finish, I'd rather have an outdated tag
49 file than an incomplete one; so I have ctags write the tag file to a temporary
50 location (containing the job's PID to avoid conflicts) then move it into
51 place once it is ready.
52
53 Create an executable script .git/hooks/ctags with the contents:
54
55    #! /bin/sh -e
56    cd crawl-ref/source
57    tagfile=../../.git/tags.tmp.$$
58    ctags -R -f "$tagfile"  # Perhaps add some command-line options here
59    mv "$tagfile" tags
60
61 Add to your post-checkout, post-commit, and post-merge hooks the line:
62
63    .git/hooks/ctags >/dev/null 2>&1 &
64
65 Add to your post-rewrite hook:
66
67    [ "$1" = rebase ] && .git/hooks/ctags >/dev/null 2>&1 &