2009-04-26 5 views
4

J'ai beaucoup de répertoires remplis d'un tas de documents TeX. Donc, il y a beaucoup de fichiers avec le même nom de fichier de base et différentes extensions. Un seul d'entre eux, cependant, est éditable. Je voudrais un moyen de convaincre Emacs que si je suis dans un répertoire où j'aiPréférer certaines extensions de fichier avec l'achèvement du nom de fichier Emacs

document.tex 
document.log 
document.pdf 
document.bbl 
document.aux 
... 

et je suis dans le mini-tampon et ne

~/Documents/.../doc<TAB> 

il remplit « document .tex ', parce que c'est le seul document réellement éditable dans ce répertoire. Quelqu'un sait-il un bon moyen de le faire?

Répondre

6

J'ai écrit du code qui devrait faire ce que vous voulez. L'idée de base est de définir la variable 'completion-ignored-extensions pour correspondre aux extensions que vous souhaitez ignorer, mais uniquement lorsque des fichiers .tex sont présents. Ce code le fait.

(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) 

Profitez-en.

+0

Je reçois une erreur de fonction non définie pour 'mapcq' - est-ce fourni par un paquet elisp que je devrais charger? –

+0

Je devrais mentionner que j'ai essayé 'mapc' et 'mapchar' et aucun travaillé. Cela semble très bien, merci! –

+0

Le mapcq était une faute de frappe, je l'ai corrigé. mapc a travaillé pour moi en ce que le code fait ce que je m'attendais. Un problème pourrait être que le code n'est pas activé, peut-être. Essayez d'ajouter a (y-or-n-p "Running?") Juste avant la ligne mapc, et quand vous faites TAB, vous devriez y être invité. Si vous ne l'êtes pas, le conseil n'est pas activé (pour une raison quelconque), et vous pouvez essayer d'ajouter (ad-activate 'minibuffer-complete-limit-choices). Je n'avais pas besoin de ça quand j'ai testé ça dans un emacs vanille. –

1

Probablement le moyen le plus simple de le faire dans votre cas consiste simplement à personnaliser la variable "completion-ignored-extensions". Toutefois, cela signifie qu'emacs ignore toujours les éléments tels que ".log" et ".pdf" qui ne correspondent peut-être pas à ce que vous voulez. Si vous voulez que ce soit plus sélectif, vous devrez peut-être ré-implémenter efficacement la fonction file-name-completion.

1

Si vous êtes ouvert à l'installation d'une bibliothèque de taille importante et à la lecture d'une documentation, vous pouvez consulter Icicles et définir un sort function correspondant à vos besoins. Une alternative est ido dont la page wiki a un exemple de sorting by mtime, qui devrait être facile à changer pour trier par une fonction de l'extension du nom de fichier.

Questions connexes