LINUX.ORG.RU

[emacs] Переключение тэгов в зависимости от пути к файлу

 


0

1

Я работаю одновременно с исходниками из нескольких репозитариев.

Хочу сделать так, чтобы emacs переключался на другую таблицу тэгов (сtags) при переключении на файл из другого репозитория.

Написал переключалку, но вызывать её приходится ручками, так как не могу найти хук на переключение на другой буфер. Подскажите, как можно это реализовать.

Код переключалки (если есть нарекания по коду, высказывайте, в ELisp'е я совсем лопух):

(defvar tag-paths-alist () "*List containing pairs of path regexp and corresponding tag file." )

(setq tag-paths-alist '(("/somepath/trunk.x/" . "/somepath/trunk.x/bla/TAGS")
                        ("/somepath/trunk.y/" . "/somepath/trunk.y/bla/TAGS")))

(defun switch-tag-file () "Find corresponding tags file for current buffer and enable it."
  (interactive)
  (if tag-paths-alist
      (let ((alist-iter tag-paths-alist))
        (while alist-iter
          (let ((path-regexp (car (car alist-iter)))
                (path-to-tags (cdr (car alist-iter))))
            (if (string-match (regexp-quote path-regexp) default-directory)
                (progn
                  (message "switch-tag-file: found \"%s\" for \"%s\"\n" path-to-tags default-directory)
                  (setq tags-file-name path-to-tags)))
            (setq alist-iter (cdr alist-iter)))))))

Ответ на: комментарий от provaton

Спасибо, получилось!

Чтобы всё заработало, добавляем к приведенному выше такой вот код:

(defadvice find-tag (before switch-tag-file-ad)
  "Advice find-tag to switch to tag file corresponding to current buffer"
  (switch-tag-file))

(ad-activate 'find-tag)

j-a-t-a
() автор топика
Ответ на: комментарий от power

А нельзя в .dir-locals держать разные tags-table-list?

Как я понял, и tags-table-list, и tags-file-name, — глобальные переменные. Поэтому открытие файла из другого репозитария затерло бы это значение.

К тому же, хотелось бы держать настройки в одном месте.

Ну и наконец, я просто не знал про эту фичу :)

j-a-t-a
() автор топика

кстати (car (car lst)) можно заменить на (caar lst), а (cdr (car lst)) на (cdar lst)

provaton ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.