Emacs lisp код для добавления файлов для мониторинга - PullRequest
4 голосов
/ 25 ноября 2010

Я новичок в программировании на emacs lisp. Я разработчик и программирую на языке c ежедневно. Я хотел бы использовать теги для просмотра кода в emacs. Тем не менее, размер моего проекта очень большой и не может позволить себе запускать etags время от времени. Я хотел бы добавить функцию lisp или код в emacs таким образом, каждый файл, который я открываю, emacs должен записывать в один файл (назовите его ~ / project_files_opened.txt), и я буду выполнять задание cron, которое будет содержать только открытые файлы. Может кто-нибудь помочь мне с некоторыми ссылками или существующим кодом, чтобы сделать это? Даже некоторые примеры помогут мне подобрать ... Спасибо ..

Ответы [ 3 ]

1 голос
/ 25 ноября 2010

Вы можете предпочесть GNU Global как замену etags. Мое предостережение в том, что я не использовал его сам, однако я считаю, что он реализует правильную базу данных, а не простой плоский файл TAGS, и поэтому поэтапные обновления должны быть очень эффективными.

Подробнее см. Учебник ; в частности 3.6 Extended Emacs с использованием GLOBAL и 4.3 Инкрементное обновление .

В Emacs Wiki есть также страница:
http://www.emacswiki.org/emacs/GnuGlobal

1 голос
/ 29 ноября 2010

Как насчет немного другого такта? Когда вы открываете файл (который вам небезразличен), в этот момент добавьте его в файл TAGS. Вы можете сделать это довольно легко с помощью следующего кода:

(setq tags-file-name "/scratch2/TAGS")
(setq tags-revert-without-query t)
(add-hook 'find-file-hooks 'add-opened-file-to-tags)
(defun add-opened-file-to-tags ()
  "every time a file is opened, add it to the TAGS file (if not already present)
Note: only add it to the TAGS file when the major mode is one we care about"
  (when (memq major-mode '(c-mode c++-mode))
(let ((opened-file (buffer-file-name)))
  (save-excursion
    (visit-tags-table-buffer)
    (unless (member opened-file (tags-table-files))
      (shell-command 
            (format "etags -a --output %s %s" tags-file-name opened-file)))))))
;; create an empty TAGS file if necessary
(unless (file-exists-p tags-file-name)
  (shell-command (format "touch %s" tags-file-name)))

Время от времени вы хотите удалить файл TAGS, чтобы обновить содержимое. Или вы можете использовать что-то вроде следующего M-x refresh-tags-table :

(defun refresh-tags-file ()
  "rebuild the tags file"
  (interactive)
  (let ((tags-files 
     (save-excursion
       (visit-tags-table-buffer)
       (tags-table-files))))
(delete-file tags-file-name)
(dolist (file tags-files)
  (shell-command (format "etags -a --output %s %s" tags-file-name file)))))
0 голосов
/ 25 ноября 2010

Вы можете взглянуть на рамки CEDET. См. семантический модуль .

...