Slime (and elisp-slime-nav) uses M-. to navigate to the symbol at point, and M-, to pop back to previous marks. I like this.
Evil uses . to repeat the previous editing command, C-. to replace a just repeated command with a previously executed command, and M-. to do the same in the reverse direction (useful if you overshoot with C-.). I like this as well.
I'd like to use M-. for slime-style navigation except when the previous command was C-. (evil-repeat-pop), in which case I'd like M-. to run evil-repeat-pop-next. I'm not sure how to go about implementing this.
I'm considering removing the evil M-. binding and defining a hydra that's entered upon running evil-repeat-pop (C-.) and which binds M-. to evil-repeat-pop-next in a transient keymap.
I also considered binding M-. to a wrapper function like,
(if (eql last-command 'evil-repeat-pop)
(evil-repeat-pop-next)
(elisp-slime-nav-find-elisp-thing-at-point))
but I want the "else" clause to do whatever M-. would have done if evil wasn't enabled. This might be elisp-slime-nav-find-elisp-thing-at-point, xref-find-definitions, ggtags-find-tag-dwim, etc. depending on what modes and code-tagging approaches I'm using.