gpt4 book ai didi

java - Java 和 JavaScript 中的 'Go to definition' 如何使用 Emacs?

转载 作者:行者123 更新时间:2023-12-02 06:22:13 25 4
gpt4 key购买 nike

我正在考虑重新使用 Emacs 作为我的主要编辑器。这里的技巧是我从未真正使用 Emacs 完成过大型项目工作。到目前为止,我已经使用了 Visual Studio,但在 Node 上构建的最新项目(转换一些 CoffeeScript——我无法更改的东西)和 Java 上,我想进行完全切换。我目前正在使用 IntelliJ/WebStorm,但如果我拥有在这些编辑器中找到的一些功能,我愿意将其整个出售。令人惊讶的是,在 WebStorm 中,CoffeeScript 具有转到用法转到声明功能(我想纯 JavaScript 也是如此)。

Emacs 的老手如何以类似的方式遍历代码,即他们通常如何转到用法转到声明? Java 和 JavaScript 可能有所不同,但我想知道使用 Emacs 进行设置的差异和可能遇到的麻烦。

最佳答案

我算不上 Emacs 的老手,但我确实对 emacs 很着迷。

对于 Java:

  • 语义模式在实践中似乎不起作用,但理论上可以跳转到定义
  • evil-mode (有点矫枉过正...)可以通过邪恶转到定义跳转到定义
    • 这非常有效,如果可能的话,我什至建议将其移植到非邪恶环境
  • imenu(这使用正则表达式引擎来查找定义)
    • 已被用作语义ia-fast-jump的后备
    • 似乎不适用于变量

对于 Javascript:Javascript 有一些非常复杂的范围样式,不幸的是,此类样式很常见,因此基于正则表达式的解决方案有时可能会跳转到错误的定义。

  • 语义模式根本不起作用
  • evil-goto-definition(使用正则表达式引擎)一如既往地出色
  • imenu(使用正则表达式引擎)
    • 似乎不适用于变量
  • Tern是一组(外来)语义分析器,似乎与 Emacs 集成得很好

总的来说,如果可以的话,我真的建议使用邪恶,它非常棒。如果你认为邪恶就是邪恶,那么:

  • 对于变量,在Java中使用semantic-ia进行跳转,在JS中使用tern进行跳转
  • 对于函数,请使用 imenu。它在 Java 和 JS 上都运行良好。

最后,这是我几乎所有跳跃都使用的一些代码。它允许您选择要跳转到的任何函数并使用 imenu,因此您可以跳转到除当前符号点之外的其他内容。

(defun ido-goto-symbol (&optional symbol-list)
"refresh imenu and jump to a place in the buffer using ido."
(interactive)
(unless (featurep 'imenu)
(require 'imenu nil t))
(cond
((not symbol-list)
(let ((ido-mode ido-mode)
(ido-enable-flex-matching
(if (boundp 'ido-enable-flex-matching)
ido-enable-flex-matching t))
name-and-pos symbol-names position)
(unless ido-mode
(ido-mode 1)
(setq ido-enable-flex-matching t))
(while (progn
(imenu--cleanup)
(setq imenu--index-alist nil)
(ido-goto-symbol (imenu--make-index-alist))
(setq selected-symbol
(ido-completing-read "symbol? " symbol-names))
(string= (first imenu--rescan-item) selected-symbol)))
(unless (and (boundp 'mark-active) mark-active)
(push-mark nil t nil))
(setq position (rest (assoc selected-symbol name-and-pos)))
(cond
((overlayp position)
(goto-char (overlay-start position)))
(t
(goto-char position)))))
((listp symbol-list)
(dolist (symbol symbol-list)
(let (name position)
(cond
((and (listp symbol) (imenu--subalist-p symbol))
(ido-goto-symbol symbol))
((listp symbol)
(setq name (first symbol))
(setq position (rest symbol)))
((stringp symbol)
(setq name symbol)
(setq position
(get-text-property 1 'org-imenu-marker symbol))))
(unless (or (null position) (null name)
(string= (first imenu--rescan-item) name))
(add-to-list 'symbol-names name)
(add-to-list 'name-and-pos (cons name position))))))))

(global-set-key (kbd "m-=") 'ido-goto-symbol)

关于java - Java 和 JavaScript 中的 'Go to definition' 如何使用 Emacs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20911127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com