Автоматически переходить к тегу в Emacs

Я хотел бы, чтобы find-tag автоматически принимал параметр по умолчанию (т. е. слово в точке) и переходил к позиции тега без запроса.

Это возможно?

Я также использую рекомендуемую версию find-tag из Emacswiki, которая в случае совпадения повторно запускает ctags. Итак, я хотел бы что-то вроде этого:

is current word a known tag?
-> yes: jump to it without further confirmation
-> no: rerun ctags
is it known now?
-> yes: jump to it without further confirmation
-> no: prompt user for input

Благодарю вас!


person user673592    schedule 22.08.2012    source источник


Ответы (5)


Это один из лучших результатов поиска в Google по запросу «найти теги в emacs без подсказки». Для простой версии этого - без логики регенерации ctag, о которой упоминал постер, - кажется, ключ:

(find-tag (find-tag-default))

Итак, для меня это работает:

(defun find-tag-no-prompt ()
  "Jump to the tag at point without prompting"
  (interactive)
  (find-tag (find-tag-default)))
;; don't prompt when finding a tag
(global-set-key (kbd "M-.") 'find-tag-no-prompt)
person Michael Bosworth    schedule 22.07.2014

Вот мои настройки для ctags, у меня отлично работает. Я позаимствовал его у здесь.

(require 'eproject)
(require 'etags-select)

(defun build-ctags ()
  (interactive)
  (message "building project tags")
  (let ((root (eproject-root)))
    (shell-command
     (concat "ctags-exuberant -e -R --extra=+fq --exclude=db --exclude=test --exclude=.git --exclude=public -f " root "TAGS " root)))
  (visit-project-tags)
  (message "tags built successfully"))

(defun visit-project-tags ()
  (interactive)
  (let ((tags-file (concat (eproject-root) "TAGS")))
    (visit-tags-table tags-file)
    (message (concat "Loaded " tags-file))))

(defun hbin-find-tag ()
  "Borrow from http://mattbriggs.net/blog/2012/03/18/awesome-emacs-plugins-ctags/"
  (interactive)
  (if (file-exists-p (concat (eproject-root) "TAGS"))
      (visit-project-tags)
    (build-ctags))
  (etags-select-find-tag-at-point))

(global-set-key (kbd "M-.") 'hbin-find-tag)

PS: вам может понадобиться это:

git://github.com/jrockway/eproject.git
git://github.com/emacsmirror/etags-select.git
person hbin    schedule 22.08.2012
comment
Спасибо. Я постараюсь посмотреть, хотя я бы предпочел решение без eproject... - person user673592; 22.08.2012
comment
Я попробовал вашу настройку, он создает файл TAGS в корневом каталоге проекта, но когда я делаю M-. в файле глубже в дереве, он жалуется, что файла TAGS нет. Если я создаю один в этом каталоге, он работает, но дает 2 совпадения для каждого уникального тега (предположительно из-за 2 файлов TAGS?). Итак, я получаю либо 0 совпадений, либо 2, но не могу заставить его работать должным образом... есть идеи, в чем может быть причина? - person user673592; 22.08.2012
comment
Как автор etags-select, могу ли я предложить etags-table. Я действительно должен дать этим вещам свою собственную страницу GitHub... - person scottfrazer; 22.08.2012
comment
вместо этого переместил мой комментарий в ответ - person Cezar Halmagean; 20.03.2013

Ну, я нашел хакерское решение:

;; auto jump
(global-set-key (kbd "C-x C-M->") 'find-tag) ; bind to some unused placeholder
(global-set-key (kbd "M-.") (kbd "C-x C-M-> <return>"))

Сначала привяжите find-tag к какой-нибудь фиктивной привязке, которую вы все равно никогда не будете использовать (этот шаг необходим, чтобы избежать бесконечных циклов). Затем привяжите M-. к этой новой привязке + <return>.

Уродливо, но работает... Я оставлю вопрос открытым, если у кого-то есть лучший ответ (включая обработку неудачного поиска, как описано в исходном вопросе).

person user673592    schedule 23.08.2012
comment
Работает на меня! Довольно раздражает тот факт, что emacs переспрашивает тег. Большой! - person swdev; 05.05.2014

вот немного измененная версия, которая загружает зависимые драгоценные камни (полезно в ruby ​​on rails)

  (defun build-ctags ()
      (interactive)
      (message "building project tags")
      (let ((default-directory (eproject-root)))
        (shell-command (concat "exctags -e -R --extra=+fq --exclude=db --exclude=test --exclude=.git --exclude=public -f TAGS * " (trim-string (shell-command-to-string "rvm gemdir")) "/gems/*"))
        (visit-project-tags)
        (message "tags built successfully")))
person Cezar Halmagean    schedule 20.03.2013

Emacs 25 делает это по умолчанию. M-. (xref-find-definitions) переходит к определению, а M-, (xref-pop-marker-stack) возвращается обратно.

person Satya Mishra    schedule 21.05.2018