.PHONY: TAGS.emacs TAGS.vi
-CTAGS_OPTS=--options=${CFG_SRC_DIR}/src/etc/ctags.rust -R ${CFG_SRC_DIR}/src
+# This is using a blacklist approach, probably more durable than a whitelist.
+# We exclude: external dependencies (llvm, libuv, gyp, rt/{msvc,sundown,vg}),
+# tests (compiletest, test) and a couple of other things (rt/arch, etc)
+CTAGS_LOCATIONS=$(patsubst ${CFG_SRC_DIR}src/llvm,,\
+ $(patsubst ${CFG_SRC_DIR}src/libuv,,\
+ $(patsubst ${CFG_SRC_DIR}src/compiletest,,\
+ $(patsubst ${CFG_SRC_DIR}src/test,,\
+ $(patsubst ${CFG_SRC_DIR}src/gyp,,\
+ $(patsubst ${CFG_SRC_DIR}src/etc,,\
+ $(patsubst ${CFG_SRC_DIR}src/rt,,\
+ $(patsubst ${CFG_SRC_DIR}src/rt/arch,,\
+ $(patsubst ${CFG_SRC_DIR}src/rt/msvc,,\
+ $(patsubst ${CFG_SRC_DIR}src/rt/sundown,,\
+ $(patsubst ${CFG_SRC_DIR}src/rt/vg,,\
+ $(wildcard ${CFG_SRC_DIR}src/*) $(wildcard ${CFG_SRC_DIR}src/rt/*)\
+ )))))))))))
+CTAGS_OPTS=--options="${CFG_SRC_DIR}src/etc/ctags.rust" --languages=-javascript --recurse ${CTAGS_LOCATIONS}
+# We could use `--languages=Rust`, but there is value in producing tags for the
+# C++ parts of the code base too (at the time of writing, those are .h and .cpp
+# files in src/rt, src/rt/sync and src/rustllvm); we mainly just want to
+# exclude the external dependencies.
TAGS.emacs:
ctags -e -f $@ ${CTAGS_OPTS}