调整evil键绑定方便交叉引用

https://github.com/MaskRay/Config/blob/master/home/.emacs.d/private/%2Bmy/my-code/packages.el#L113 严重亵渎。。

x r s S ; H J L M等很多键感觉并不实用,抛弃用作前缀键或者交叉引用、avy辅助的交叉引用

  • ; definition
  • r references
  • J xref jump-back
  • C-p xref jump-forward
  • x prefix-key,杂项xref、hierarchies等
  • s `avy-goto-char-timer
  • avy-goto-char-timer + definition/references 也有价值,可以绑定
  (my/define-key
   evil-normal-state-map
   "gd" #'my-xref/find-definitions
   "gf" #'my/ffap
   "C-j" #'my-xref/find-definitions
   "gs" #'my-xref/find-references
   "C-," #'my-xref/find-references
   ";" (lambda () (interactive) (avy-goto-char-timer) (my-xref/find-definitions))
   "x;" (lambda () (interactive) (avy-goto-char-timer) (my-xref/find-references))
   "C-p" #'lsp-ui-peek-jump-forward
   "L" #'lsp-ui-peek-jump-backward
   "x" nil
   "x SPC" #'cquery/random
   "xb" #'cquery/base
   "xd" #'cquery/derived
   "xe" #'cquery/callers
   ;; callers
   "xc" #'cquery-call-hierarchy
   ;; callees
   "xC" (lambda () (interactive) (cquery-call-hierarchy t))
   ;; derived
   "xi" (lambda () (interactive) (cquery-inheritance-hierarchy t))
   ;; base
   "xI" #'cquery-inheritance-hierarchy
   "xl" #'cquery-code-lens-mode
   "xm" #'cquery-member-hierarchy
   "xP" #'cquery-preprocess-file
   "xR" #'cquery-freshen-index
   "xr" #'evil-replace
   "xv" #'cquery/vars
   "xx" #'evil-delete-char
   "M-<" #'previous-error
   "M->" #'next-error

   "<Backspace>" #'spacemacs/evil-search-clear-highlight
   "C-c P s" #'profiler-start
   "C-c P r" #'profiler-report
   "C-c P S" #'profiler-stop
   )

好多的 (define-key evil-xxx-mode-map),看得头大~. 要不了解一下 general,可以更加便捷地绑定 evil 的按键,类似 evil-leader-key,功能更加强大. 比如说在 evil-normal-modeevil-visual-mode定义keybinding:

 (general-nvmap
    "Y" 'samray/copy-to-end-of-line
    "(" 'paredit-open-round
 )

详见 emacs.d/init-keybindings.el at f6f5872bf26e87a29e2ca1b44f0e98efee4ee482 · ramsayleung/emacs.d · GitHub

和 evil-lisp-state 一样,分开来写个 state

我用 spacemacs … 有没有少加一个依赖的办法

r单键 lsp textDocument/references或ripgrep查找引用很舒服。阅读你的配置……

(defun my-xref/find-references ()
  (interactive)
  (if lsp-mode
      (lsp-ui-peek-find-references)
    (spacemacs/search-project-rg-region-or-symbol)))

还有什么让非lsp-mode references更舒服的配置?

我最近对 grep/rg 来查找reference 的方案有点疲惫了,典型的就是 dumb-jump,可能大一点的项目查找就卡住了。但是对于非 lsp-mode 的reference 查找这个问题还是要面对的。所以我就猥琐一点,穷举不同语法解释器的find-reference 方法,判断如果是 Python, 就调用 elpy 的 goto-reference, 是Rust, 就调用 racerfind-reference. 我是想不出相对“优雅”的 reference 配置, 摊手.jpg

刚好今天写了一个函数,不用写那么多define-key

(defun maple/define-key (keymap key def &rest bindings)
  "Define multi keybind with KEYMAP KEY DEF BINDINGS."
  (interactive)
  (while key
    (define-key keymap key def)
    (setq key (pop bindings)
          def (pop bindings))))

使用

(maple/define-key evil-insert-state-map
                  (kbd "C-h") (kbd "<left>")
                  (kbd "C-l") (kbd "<right>")
                  (kbd "C-j") (kbd "<down>")
                  (kbd "C-k") (kbd "<up>")
                  (kbd "C-v") 'cua-paste)

赞。更新了。

以前我用 spacemacs-jump-handlers (不同major-mode有不同find-definition的实现,依次选取)

dumb-jump 在列表末尾,前面的jump handler不移动光标位置会自动用dumb-jump

我不得已用(丑陋的elisp…)

(defun my-advice/dumb-jump-go (orig-fun &rest args)
  (unless (or lsp-mode
              (cl-some
               (lambda (x) (string-match-p x buffer-file-name))
               my-xref-blacklist))
    (apply orig-fun args)))

现在干脆 if lsp-mode smart-jump spacemacs-jump-handler

其实,说到底都是Emacs 缺乏一个统一的 find-definition/reference 的规范,所以每个语法的补全插件都自己做一套。当需要补全的语法多了之后,自然就会有各种花式的find reference 操作,继而衍生出各种的 jump; dumb-jump, smart-jump, etc, 要解决这样的现象,还是要推动一个统一的规范(大佬们现在好像没这个想法),或者推 lsp-mode. 但是lsp 的语言后端也会有不同的差异,比如说 cquery 就有功能加成,lsp-python就连 lsp-on-cover 的功能都没,最近用 lsp-pythonfind-reference 一直无法用,我也不知道是 lsp-python 有问题,还是python-language-server有问题了。我已经开了好多的 issue, 我都不好意思只开 issue 不去 pull request, 只是我的elisp 也只是在够用的程度,并不精…

python用jedi的话,jump to definition和jump back还是挺好用的

lsp-python 相当完善了(其实应该说 python-language-server ),比单独使用 jedi 体验好很多。

真的假的,不会有什么暗坑吧? :sweat_smile:

能不能麻烦总结一下比 jedi 好的和不好的方面呢?

大概率是没坑的,放心用吧。 python-language-server 出来都多长时间了?如果真有坑,那也是 lsp-python 包的坑。

jedi 算是 pyls 的组件?懒得查证了。而特性要多得多。

Feature Providers

  • Jedi Jedi for Completions, Definitions, Hover, References, Signature Help, and Symbols
  • Rope Rope for Completions and renaming
  • Pyflakes Pyflakes linter to detect various errors
  • McCabe McCabe linter for complexity checking
  • pycodestyle pycodestyle linter for style checking
  • pydocstyle pydocstyle linter for docstring style checking
  • YAPF YAPF for code formatting

没有用函数的道理,应该用宏

H L M是真的没用,其他键还是都有用的。。另外即使不覆盖纯增加,g z开头的也还有一些空间。

r ; J我嘗試去掉過,後來又加回來了。s S x ;我都去掉了