$(call find-sources,'defconfig')
 endef
 
+define xtags
+       if $1 --version 2>&1 | grep -iq exuberant; then \
+           $(all-sources) | xargs $1 -a \
+               -I __initdata,__exitdata,__acquires,__releases \
+               -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
+               --extra=+f --c-kinds=+px; \
+           $(all-kconfigs) | xargs $1 -a \
+               --langdef=kconfig \
+               --language-force=kconfig \
+               --regex-kconfig='/^[[:blank:]]*config[[:blank:]]+([[:alnum:]_]+)/\1/'; \
+           $(all-defconfigs) | xargs $1 -a \
+               --langdef=dotconfig \
+               --language-force=dotconfig \
+               --regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'; \
+       elif $1 --version 2>&1 | grep -iq emacs; then \
+           $(all-sources) | xargs $1 -a; \
+           $(all-kconfigs) | xargs $1 -a \
+               --regex='/^[ \t]*config[ \t]+\([a-zA-Z0-9_]+\)/\1/'; \
+           $(all-defconfigs) | xargs $1 -a \
+               --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \
+       else \
+           $(all-sources) | xargs $1 -a; \
+       fi
+endef
+
 quiet_cmd_cscope-file = FILELST cscope.files
       cmd_cscope-file = (echo \-k; echo \-q; $(all-sources)) > cscope.files
 
 quiet_cmd_TAGS = MAKE   $@
 define cmd_TAGS
        rm -f $@; \
-       ETAGSF=`etags --version | grep -i exuberant >/dev/null &&     \
-                echo "-I __initdata,__exitdata,__acquires,__releases  \
-                      -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL              \
-                      --extra=+f --c-kinds=+px"`;                     \
-                $(all-sources) | xargs etags $$ETAGSF -a;             \
-       if test "x$$ETAGSF" = x; then                                 \
-               $(all-kconfigs) | xargs etags -a                      \
-               --regex='/^config[ \t]+\([a-zA-Z0-9_]+\)/\1/';        \
-               $(all-defconfigs) | xargs etags -a                    \
-               --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/';     \
-       fi
+       $(call xtags,etags)
 endef
 
 TAGS: FORCE
        $(call cmd,TAGS)
 
-
 quiet_cmd_tags = MAKE   $@
 define cmd_tags
        rm -f $@; \
-       CTAGSF=`ctags --version | grep -i exuberant >/dev/null &&     \
-                echo "-I __initdata,__exitdata,__acquires,__releases  \
-                      -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL              \
-                      --extra=+f --c-kinds=+px"`;                     \
-                $(all-sources) | xargs ctags $$CTAGSF -a
+       $(call xtags,ctags)
 endef
 
 tags: FORCE