我有很多目录充满了一堆TeX文档。因此,有很多文件具有相同的基本文件名和不同的扩展名。但是,其中只有一个是可编辑的。我想要一种方法来说服Emacs,如果我在一个我有
的目录中document.tex
document.log
document.pdf
document.bbl
document.aux
...
我在迷你缓冲区里做了
~/Documents/.../doc<TAB>
它填写'document.tex',因为那是该目录中唯一真正可编辑的文档。有人知道这样做的好方法吗?
答案 0 :(得分:6)
我写了一些应该做你想做的代码。基本思想是设置变量'completion-ignored-extensions
以匹配您要跳过的扩展名,但仅限于存在.tex
个文件时。这段代码就是这样做的。
(defadvice find-file-read-args (around find-file-read-args-limit-choices activate)
"set some stuff up for controlling extensions when tab completing"
(let ((completion-ignored-extensions completion-ignored-extensions)
(find-file-limit-choices t))
ad-do-it))
(defadvice minibuffer-complete (around minibuffer-complete-limit-choices nil activate)
"When in find-file, check for files of extension .tex, and if they're found, ignore .log .pdf .bbl .aux"
(let ((add-or-remove
(if (and (boundp 'find-file-limit-choices) find-file-limit-choices
(save-excursion
(let ((b (progn (beginning-of-line) (point)))
(e (progn (end-of-line) (point))))
(directory-files (file-name-directory (buffer-substring-no-properties b e)) nil "\\.tex$"))))
'add-to-list
'remove)))
(mapc (lambda (e) (setq completion-ignored-extensions
(funcall add-or-remove 'completion-ignored-extensions e)))
'(".log" ".pdf" ".bbl" ".aux")))
ad-do-it)
享受。
答案 1 :(得分:1)
在您的情况下,最简单的方法可能就是自定义变量“completion-ignored-extensions”。
但是,这意味着emacs总是忽略“。log”和“.pdf”之类的东西,这可能不是你想要的。如果您希望它更具选择性,则可能必须有效地重新实现函数file-name-completion。
答案 2 :(得分:1)
如果您愿意安装大型库并阅读一些文档,可以查看Icicles并定义符合您需求的sort function。另一种选择是ido,其wiki页面有sorting by mtime的示例,应该可以很容易地通过文件扩展名的函数进行排序。