Simple xref backend that use user-defined regular expressions.
It allows Emacs to support basic navigation in non standard files
like configuration files containing references.
Source code is shameless copy paste from xref-js2, with JS specific logic removed.
You can just download file xref-regex.el
and install it using M-x package-install-file
.
el-get recipe is also available.
- Emacs above 25.1
- ag, rg or GNU grep
Customizexref-regex-search-program
to select search tool.grep
is default.
Apart from enabling xref backend with
(require 'xref-regex)
(add-hook 'some-random-mode-hook (lambda ()
(add-hook 'xref-backend-functions #'xref-regex-xref-backend nil t)))
you need to set variables xref-regex-definitions-regexps
xref-regex-references-regexps
to lists of regular expression templates,
that will match definitions and references to symbols of interest.
Example of such regex template list is ("^Host \\K%s" "^Match originalhost \\K%s")
for definitions and ("ProxyJump %s")
for references.
Including %s
is necessary. It will be replaced by tag Xref will search for.
Thanks for \\K
your point will land in correct column instead beginning of line.
(grep does not support --columns
so this example will work correctly only with other search tools)
Double backslash instead single is needed due to Lisp syntax.
Adding following header to your .ssh/config
will let you use xref to jump to Proxy definition.
# -*- mode: conf; xref-regex-definitions-regexps: ("^Host \\K%s" "^Match originalhost \\K%s"); xref-regex-references-regexps: ("ProxyJump \\K%s"); -*-
Use M-x normal-mode
or reopen buffer to make it work.
You can also use Directory Variables if you don't want to pollute file headers.
Possibilities are limited only by Your imagination. And your ability to write regular expressions.
And limitations of regular expressions.
If your data is hard to parse with regular expressions you can create comments containing tags instead.
If you want searching tool to follow symlinks, customize variables xref-regex-[ar]g-arguments
and add flag --follow
to follow symlinks.
or in case of grep replace --recursive
with --dereference-recursive
in variable xref-regex-grep-arguments
.
Variables xref-regex-ignored-dirs
and xref-regex-ignored-files
allows you to ignore unwanted files/dirs.