Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个人怎么能';进入定义';在Java和JavaScript中使用Emacs?_Java_Javascript_Emacs_Intellij Idea - Fatal编程技术网

一个人怎么能';进入定义';在Java和JavaScript中使用Emacs?

一个人怎么能';进入定义';在Java和JavaScript中使用Emacs?,java,javascript,emacs,intellij-idea,Java,Javascript,Emacs,Intellij Idea,我正在考虑重新使用Emacs作为我的主要编辑器。这里的诀窍是,我从来没有真正用Emacs做过大型项目工作。到目前为止,我使用的是Visual Studio,但在我最新的基于Node(传输一些CoffeeScript——我无法更改的内容)和Java的项目中,我想进行完全转换。目前我正在使用IntelliJ/WebStorm,但如果我有一些在这些编辑器中找到的功能,我会愿意将其全部出售。令人惊讶的是,在WebStorm中,CoffeeScript有一个转到用法和转到声明功能(我认为纯JavaScri

我正在考虑重新使用Emacs作为我的主要编辑器。这里的诀窍是,我从来没有真正用Emacs做过大型项目工作。到目前为止,我使用的是Visual Studio,但在我最新的基于Node(传输一些CoffeeScript——我无法更改的内容)和Java的项目中,我想进行完全转换。目前我正在使用IntelliJ/WebStorm,但如果我有一些在这些编辑器中找到的功能,我会愿意将其全部出售。令人惊讶的是,在WebStorm中,CoffeeScript有一个转到用法转到声明功能(我认为纯JavaScript也是如此)


Emacs的老手们是如何以类似的方式遍历代码的,也就是说,他们通常是如何进入使用状态还是进入声明状态?Java可能与JavaScript不同,但我想知道使用Emacs设置它的区别和可能的麻烦。

我不是Emacs的老手,但我确实对Emacs着迷

对于Java:

  • 语义模式在实践中似乎不起作用,但理论上可以跳转到定义
  • 邪恶模式(有点过分了…)可以跳转到定义,与邪恶转到定义一样好
    • 这非常有效,如果可能的话,我甚至建议将其移植到一个非邪恶的环境中
  • imenu(使用正则表达式引擎查找定义)
    • 已被用作语义ia快速跳转的后备方案
    • 似乎对变量不起作用
对于Javascript:Javascript有一些非常复杂的作用域样式,不幸的是,这种样式很常见,因此基于正则表达式的解决方案有时会跳转到错误的定义

  • 语义模式根本不起作用
  • 邪恶的goto定义(使用正则表达式引擎)一如既往地工作得很好
  • imenu(使用正则表达式引擎)
    • 似乎对变量不起作用
  • 是一组(外来的)语义分析器,它似乎与Emacs集成得很好
总的来说,如果可以的话,我真的建议你使用邪恶,它是极好的。如果你认为邪恶是邪恶的,那么:

  • 对于变量,在Java中使用语义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)

我在我的项目文件夹上运行了大量的CTAG,选项为
-e
。加载标记文件后,可以使用
M-.
M-、
M-*
对其进行导航。该软件包非常有助于在多个同名方法中进行选择

查找资料的其他有用工具有
helm
,特别是
helmforfiles
helmfindfiles
(可以点击标签文件缩小文件和关键字搜索范围)和
rgrep
。我读的是一个很好的搜索和替换,但我还没有机会玩它


当然,在你掌握窍门之前,它比IntelliJ更容易操作。关于切换,有一点是,你仍然需要一个合适的IDE来调试你的代码,因为我还没有找到解决方案。

使用
你可以
使用
C-C-v C-y
跳到某个点上。这适用于查找变量定义和查找类的源代码(只要下载了源jar)。当然,malabar模式取决于Maven

对于Java,我通常在使用emacs时使用它。这非常有趣——我有点喜欢emacs,希望有更多关于这方面的信息。谢谢!你能解释一下这其中的“邪恶”部分吗?为什么它是“邪恶的”?这就是你通常所指的吗()在思考了一会儿之后,“邪恶”部分只是在“转到”方面发挥作用(或者我遗漏了什么吗?是一个可以模拟Vim的
gd
或“Goto Gefinition”命令的Vim仿真层(evil commands.el的第2326行)不幸的是,如果你使用VIM仿真,你将启用VIM仿真。它非常好,而且因为我喜欢VIM键绑定,所以我很高兴地使用它。然而,许多Emacs用户考虑<代码>邪恶<代码>:与敌人进行可怕的妥协:),也可以使用<代码>邪恶GOTO定义<代码>无邪恶。(只是不要启用邪恶模式,你应该会没事的),我刚刚测试了它。但是你仍然有一个庞大的库,几乎什么都没有做。如果你没问题,那么你有一个解决方案!昨天我就想知道了……
tern
for JS。