Jak znaleźć ścieżkę do pliku wykonywalnego za pomocą Emacsa Lispa?


16

Mój obecny przypadek użycia polega na ustaleniu, gdzie znajduje się Caskplik wykonywalny (można go zainstalować w co najmniej dwóch miejscach, a problem jest z tym związany).

Muszę wymagać beczki w ten sposób:

(require 'cask "~/.cask/cask.el")

Ale muszę znaleźć właściwą ścieżkę do tego cask.eli, o ile wiem, najłatwiejszym sposobem na to jest zlokalizowanie pliku wykonywalnego.

W jaki sposób mogę to zrobić?


6
Czy executable-findtego szukasz?
legoscia

2
Czy chcesz plik wykonywalny lub plik biblioteki Lisp? Cask ma jedno i drugie.
shosti

Wygląda na to, że pytasz o dwie różne rzeczy. Czy chcesz zlokalizować plik wykonywalny beczki? Lub plik biblioteki cask.el (który nie jest plikiem wykonywalnym)? Proszę odpowiednio zmienić swoje pytanie i tytuł.
Malabarba

Odpowiedzi:


17

Odpowiedź @ Sigma to dobry początek, ale nie filtruje według wykonalności, ani nie dopuszcza dodatkowych sufiksów. Na przykład w asystemie Windows uruchamianie może wywoływać a.exe, jeśli jest to na twojej drodze.

Więc użyj executable-find; oto definicja (wzięta ze źródeł Emacsa), jeśli jesteś ciekawy:

(defun executable-find (command)
  "Search for COMMAND in `exec-path' and return the absolute file name.
Return nil if COMMAND is not found anywhere in `exec-path'."
  ;; Use 1 rather than file-executable-p to better match the behavior of
  ;; call-process.
  (locate-file command exec-path exec-suffixes 1))

3

Nie jestem pewien, czy rozumiem całkowicie (sam nie używam Cask), ale czy poniższe postawy postawią cię na dobrej drodze?

(locate-file "cask" exec-path)

To wydaje się być odpowiedzią na twoje ogólne pytanie.


3
W przypadku plików wykonywalnych powinieneś raczej użyć executable-find.
lunaryorn,

0

Ścieżki do pliku wykonywalnego z częściowym prefiksem:

(locate-file-completion-table
   exec-path
   exec-suffixes
   ;; here is prefix like "emacs" gives "emacs21"/"emacs22"/"emacs-nox"
   (thing-at-point 'filename)
   'identity
   t)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.