Emacs:文件“...”不是有效的标签文件

时间:2013-11-12 21:54:01

标签: emacs elisp ctags

当我尝试加载我的TAGS文件时,Emacs因某种原因一直说它不是有效的标签文件。 create命令非常简单:

$ ctags -e command-not-found.c

看起来也很正常:

^L
command-not-found.c,246
#define MAXSGST ^?MAXSGST^A6,80
#define MIN(^?MIN^A7,99
char** getdirlst()^?getdirlst^A9,143
void freedirlst(char **dirlst)^?freedirlst^A30,581
int levenshtein(const char *s, const char *t)^?levenshtein^A39,726
int main(int argc, char **argv)^?main^A62,1321

确切的错误消息是:File /Users/Ron/Documents/Code/command-not-found/TAGS is not a valid tags table。这是几天前的工作,谁知道什么是错的? 在过去的几天里,我没有以任何方式改变我的配置。

修改: 今天在使用上周工作的现有TAGS文件的同时尝试了同样的事情,我得到了同样的错误。

编辑2 : 似乎我与find-file-hook链接的一些代码导致了问题。我写了一个函数来确定文件是否是二进制文件,如果是,则在hexl-mode中打开它。显然,emacs在hexl-mode处时无法读取TAGS文件,因此它表示无效。对此的快速解决方法是确定文件是否为标记文件并保持不变:

;; open binaries in hexl-mode
(defun byte-plaintext-p (byte)
  "Determine whether BYTE is plaintext or not."
  (cl-case byte
    ((?\n ?\r ?\t) t)
    (otherwise (and (<= byte 126) (>= byte 32)))))
(defun file-binary-p (file)
  "Determine whether FILE is a binary file."
  (with-temp-buffer
    (insert-file-contents file)
    (cl-loop for c across
             (buffer-substring-no-properties
              1 (min 100 (buffer-size)))
             thereis (not (byte-plaintext-p c)))))
(defun file-tags-naive-p (file) ;; check if first character is '^L'
  "Determine whether FILE is a TAGS file."
  (let ((c (with-temp-buffer
             (insert-file-contents file nil 0 1) (buffer-string))))
    (if (= (aref c 0) 12) t nil)))
(add-hook 'find-file-hook
          (lambda ()
            (if (and (file-exists-p (buffer-file-name))
                     (> (buffer-size) 0)
                     (not (file-tags-naive-p (buffer-file-name))))
                (if (and (file-binary-p (buffer-file-name))
                         (string= (buffer-local-value 'major-mode
                                                      (current-buffer))
                                  "fundamental-mode"))
                    (hexl-mode)))))

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

/Users/Ron/Documents/Code/command-not-found/command-not-found.c确实不是有效的标签表:它是源文件。标签表应该有名称TAGS,所以当Emacs要求你提供标签表时,不要输入“command-not-found.c”而应输入“TAGS”。