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-mode
和 evil-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, 就调用 racer
的 find-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-python
的 find-reference
一直无法用,我也不知道是 lsp-python
有问题,还是python-language-server
有问题了。我已经开了好多的 issue, 我都不好意思只开 issue
不去 pull request
, 只是我的elisp 也只是在够用的程度,并不精…
python用jedi的话,jump to definition和jump back还是挺好用的
lsp-python 相当完善了(其实应该说 python-language-server
),比单独使用 jedi 体验好很多。
真的假的,不会有什么暗坑吧?
能不能麻烦总结一下比 jedi 好的和不好的方面呢?
大概率是没坑的,放心用吧。 python-language-server 出来都多长时间了?如果真有坑,那也是 lsp-python 包的坑。
jedi 算是 pyls 的组件?懒得查证了。而特性要多得多。
H L M
是真的没用,其他键还是都有用的。。另外即使不覆盖纯增加,g
z
开头的也还有一些空间。
r ; J
我嘗試去掉過,後來又加回來了。s S x ;
我都去掉了