2014-01-03 3 views
0

Я смотрю на то, чтобы снова использовать Emacs в качестве основного редактора. Трюк здесь в том, что я никогда не делал больших проектов с Emacs. До этого момента я использовал Visual Studio, но в своем последнем проекте, основанном на Node (переписывание некоторых CoffeeScript - не то, что я могу изменить) и Java, я хотел бы сделать полный переход. Я использую IntelliJ/WebStorm на данный момент, но если бы у меня были некоторые функции, которые я нахожу в этих редакторах, я бы желал сделать ход всей продажи. Удивительно, что в WebStorm есть Перейти к использованию и Перейти к объявлению функция для CoffeeScript (я бы представлял себе то же самое для чистого JavaScript).Как можно «перейти к определению» в Java и JavaScript с помощью Emacs?

Как ветераны Emacs коды траверсы подобным образом, то есть как они обычно Перейти к Использованию или Перейти к декларации? Для Java это, скорее всего, отличается от JavaScript, но я хотел бы узнать разницу и возможные головные боли при настройке с помощью Emacs.

+0

Для Java я обычно использую [jdee] (http://jdee.sourceforge.net/), когда я нахожусь в emacs. –

ответ

2

Я не являюсь ветераном Emacs, но у меня есть одержимость emacs.

Для Java:

  • семантико-режим, кажется, не работает на практике, но теоретически может подскочить к определению
  • зло режима (немного слишком ...) может перейти к определения просто отлично со злым-Гото определением
    • это работает очень хорошо, и я бы даже предложить переносить его в не злую окружающую среду, если это возможно
  • imenu (это использует регулярное выражение двигатель найти определение)
    • уже используются в качестве запасного варианта в семантико-Iа-быстром скачке
    • не кажется, работает хорошо на переменных

Для Javascript: Javascript имеет некоторые очень сложный и, к сожалению, такие стили являются обычным явлением, поэтому решения на основе регулярных выражений могут время от времени переходить к неправильному определению.

  • семантико-режим не работает на всех
  • зла Гото-определения (использует движок регулярных выражений) отлично работает как всегда
  • imenu (использует движок регулярных выражений)
    • не кажется, хорошо работают на переменных
  • Tern является батарея (чужеродных) семантических анализаторов, которые, кажется, хорошо интегрируются с Emacs

В общем, я бы рекомендовал использовать зло, если можно, это превосходно. Если вы думаете о зле как, ну, зло, то:

  • Для переменных использовать семантическую-ию для прыжков в Java и крачку для прыжков в JS
  • Для функции использует 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) 
+0

Это очень интересно - я немного энтузиаст emacs и хочу, чтобы там было больше информации о таких вещах. Так что спасибо! Можете ли вы объяснить «злую» часть этого? Почему это «зло»? И это то, о чем вы говорите вообще (https://github.com/emacsmirror/evil) После того, как он размышляет об этом в течение секунды, «злая» часть просто играет на аспектах «go-to» (или я потерял что-то? – lucidquiet

+0

[evil] (http://www.emacswiki.org/emacs/Evil) - это эмуляционный слой Vim, который может эмулировать команду Vim 'gd' или« Goto Gefinition »(строка 2326 злых команд). el) .К сожалению, вы включите эмуляцию vim, если вы ее используете. Он работает очень хорошо, и поскольку я обожаю vim keybindings, я использую его с радостью. Однако многие пользователи emacs считают «злым» именно это: ужасный компромисс с враг :). – PythonNut

+0

Кроме того, вы можете использовать «зло-goto-definition» без зла (просто не включайте «злой режим», и все должно быть в порядке), я только что протестировал его. Но у вас все еще есть обширная библиотека, лежащая вокруг практически ничего. Если это хорошо с тобой, тогда у тебя есть решение! – PythonNut

0

Я бегу избыточную Ctags на моей папке проекта с -e для etags вариантов. После загрузки файла TAGS вы можете использовать M-., M-, и M-* для навигации по нему. Пакет etags-select очень полезен для выбора среди нескольких методов с тем же именем.

Другие полезные инструменты, чтобы найти вещи являются helm, в частности helm-for-files и helm-find-files (которые можно нажать в файл TAGS, чтобы сузить файл и поиск по ключевым словам), и rgrep. Я читал wgrep - тоже хороший для поиска и замены, но у меня еще не было возможности поиграть с ним.

Это все немного более ручной (конечно), чем IntelliJ, пока вы не повесите его. Одна вещь, хотя и о переключении, вам все равно понадобится правильная среда IDE для отладки вашего кода, поскольку я еще не нашел решение в этом отношении.

0

Использование malabar-mode вы можете jump-to-thing-at-point используя C-c C-v C-y. Это работает для поиска определений переменных, а также для поиска источника для класса (пока загружается исходная банка). Конечно, малабар-режим зависит от Maven.

Смежные вопросы