One long standing annoyance I have with using vim-tags is that our tags file is not properly sorted. That is, the sorting exhuberant Ctags does is only on the tag itself. The problem with that is that, for example, the tag 'mutex' appears a mere 505 times, 492 of those are structure members. However it is _far_ more likely that someone wants the struct definition when looking for the mutex tag than any of those members. However, due to the nature of the sorting, the struct definition will not be first. So add a script that does a custom sort of the tags file, taking the tag kind into account. The kind ordering is roughly: 'type', 'function', 'macro', 'enum', rest. Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> --- scripts/sort-tags.awk | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++ scripts/tags.sh | 8 +++++- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/scripts/sort-tags.awk b/scripts/sort-tags.awk new file mode 100755 index 000000000000..1eb50406c9d3 --- /dev/null +++ b/scripts/sort-tags.awk @@ -0,0 +1,79 @@ +#!/usr/bin/awk -f + +# $ ctags --list-kinds +# C +# c classes +# s structure names +# t typedefs +# g enumeration names +# u union names +# n namespaces + +# f function definitions +# p function prototypes [off] +# d macro definitions + +# e enumerators (values inside an enumeration) +# m class, struct, and union members +# v variable definitions + +# l local variables [off] +# x external and forward variable declarations [off] + +BEGIN { + FS = "\t" + + sort = "LC_ALL=C sort" + + # our sort order for C kinds: + order["c"] = "A" + order["s"] = "B" + order["t"] = "C" + order["g"] = "D" + order["u"] = "E" + order["n"] = "F" + order["f"] = "G" + order["p"] = "H" + order["d"] = "I" + order["e"] = "J" + order["m"] = "K" + order["v"] = "L" + order["l"] = "M" + order["x"] = "N" +} + +# pass through header +/^!_TAG/ { + print $0 + next +} + +{ + # find 'kinds' + for (i = 1; i <= NF; i++) { + if ($i ~ /;"$/) { + kind = $(i+1) + break; + } + } + + # create sort key + if (order[kind]) + key = $1 order[kind]; + else + key = $1 "Z"; + + # get it sorted + print key "\t" $0 |& sort +} + +END { + close(sort, "to") + while ((sort |& getline) > 0) { + # strip key + sub(/[^[:space:]]*[[:space:]]*/, "") + print $0 + } + close(sort) +} + diff --git a/scripts/tags.sh b/scripts/tags.sh index 4e18ae5282a6..93d729392a7b 100755 --- a/scripts/tags.sh +++ b/scripts/tags.sh @@ -251,6 +251,8 @@ setup_regex() exuberant() { + rm -f tags.unsorted + setup_regex exuberant asm c all_target_sources | xargs $1 -a \ -I __initdata,__exitdata,__initconst,__ro_after_init \ @@ -266,12 +268,16 @@ exuberant() -I DEFINE_TRACE,EXPORT_TRACEPOINT_SYMBOL,EXPORT_TRACEPOINT_SYMBOL_GPL \ -I static,const \ --extra=+fq --c-kinds=+px --fields=+iaS --langmap=c:+.h \ + --sort=no -o tags.unsorted \ "${regex[@]}" setup_regex exuberant kconfig all_kconfigs | xargs $1 -a \ - --langdef=kconfig --language-force=kconfig "${regex[@]}" + --langdef=kconfig --language-force=kconfig --sort=no \ + -o tags.unsorted "${regex[@]}" + scripts/sort-tags.awk tags.unsorted > tags + rm -f tags.unsorted } emacs()