Подтвердить что ты не робот

Emacs lisp файлы с расширением glob

Есть ли библиотека или функция, которая выполняет bash -подобное расширение glob для emacs lisp?

Например:

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

Если такой функции нет, есть подсказка о том, как ее реализовать?

EDIT:

Я нашел в docs также полезную функцию, которая делает именно это:

файл-расширяющие-символы: Эта функция расширяет шаблон шаблона подстановки, возвращая список имен файлов, которые соответствуют ему.

4b9b3361

Ответ 1

Ознакомьтесь с документацией для directory-files:

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

Примечание. Третий аргумент - это регулярное выражение, а не глобус.

Прямо перевернуть шаблоны глобусов в регулярные выражения. eshell поставляется с пакетом перевода, который вы можете использовать:

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

И, если вы хотите полностью разобраться с globing (с каталогами) в eshell, возможно, есть способ получить это. Вышеприведенное предполагает, что часть globbing находится в некаталограммной части пути.

Ответ 2

Не уверен, почему это было упущено, может быть, это было не в emacs в 2010 году, а в текущем emacs, по крайней мере, есть функция file-expand-wildcards

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

который делает именно то, что вы хотите сделать.

Ответ 3

Пакет f добавляет огромное количество функций манипуляции файлами и файловыми файлами в соответствии с последовательной схемой именования. Он имеет функцию f-glob, которая делает именно это:

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