2010-08-18 17 views
25

Esistono librerie o funzioni che eseguono un'espansione glob di tipo bash per emacs lisp?emacs lisp elenca i file con espansione glob

Ad esempio:

(directory-files-glob "~/Desktop/*") 
> ("/home/user/Desktop/file1" "/home/user/Desktop/file2") 

Se non c'è una tale funzione non ci sono alcun suggerimento/suggerimento su come implementarlo?

EDIT:

ho trovato nel docs anche una funzione utile che fa tutto proprio questo:

di file-expand-jolly: Questa funzione espande il modello modello jolly, restituendo un elenco dei nomi di file che lo corrispondono.

+2

Grazie - file-expand-jolly è esattamente quello che volevo – Greg

risposta

19

Controllare la documentazione per directory-files:

(directory-files "~/Desktop" nil ".") 

Nota: Il terzo argomento è un'espressione regolare - non globbing.

È semplice trasformare gli schemi globbing in espressioni regolari. eshell è dotato di un pacchetto di traduzione che si può usare:

(require 'em-glob) 
(defun directory-files-glob (path) 
    (directory-files (file-name-directory path) 
        nil 
        (eshell-glob-regexp (file-name-nondirectory path)))) 

E, se si vuole piena esposizione al eshell è globbing (con le directory), probabilmente c'è un modo per ottenere questo. Quanto sopra presuppone che la parte globbing si trovi nella parte non di directory del percorso.

+0

Grazie mille per la spiegazione chiara e le ulteriori idee! – pygabriel

3

Il pacchetto f aggiunge un'enorme quantità di funzioni di manipolazione di file e filepath in uno schema di denominazione coerente. Ha una funzione f-glob che fa esattamente questo:

(f-glob "~/doc/*.org") ; returns a list of files ending with ".org" 
(f-glob "*.org" "~/doc/") ; they all behave the same 
(f-glob "*.org" "~/doc") 
9

Non capisco perché questo è stato trascurato forse non era in emacs nel 2010, ma in una corrente emacs almeno c'è la funzione file-expand-wildcards

(file-expand-wildcards "~/Desktop/*") 

che fa esattamente quello che vuoi fare ..

+0

Oh ho visto la modifica del Q che include già questo, ma dato che l'ho trascurato qui lascerò comunque la mia risposta –