Как мне найти путь к исполняемому файлу с Emacs Lisp?


16

Мой текущий вариант использования - найти Caskисполняемый файл (его можно установить как минимум в двух местах, и по этому поводу есть проблема ).

Мне нужно потребовать бочку следующим образом:

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

Но мне нужно найти правильный путь к этому cask.el, и, насколько я знаю, самый простой способ сделать это - найти исполняемый файл.

Как я могу это сделать?


6
Это executable-findто, что вы ищете?
Legoscia

2
Вам нужен исполняемый файл или файл библиотеки lisp? Бочка имеет оба.
Шости

Похоже, вы спрашиваете две разные вещи. Вы хотите найти исполняемый файл бочки? Или файл библиотеки cask.el (который не является исполняемым файлом)? Пожалуйста, измените свой вопрос и название соответственно.
Малабарба

Ответы:


17

Ответ @ Sigma - хорошее начало, но он не фильтрует по исполняемости и не учитывает дополнительные суффиксы. В Windows, например, запуск aможет вызвать a.exe, если это то, что у вас на пути.

Так что используйте executable-find; вот определение (взято из источников Emacs), если вам интересно:

(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

Не уверен, что я полностью понимаю (я сам не использую Cask), но может ли следующее поставить вас на правильный путь?

(locate-file "cask" exec-path)

Это, кажется, ответ на ваш общий вопрос.


3
В частности, для исполняемых файлов лучше использовать executable-find.
lunaryorn

0

Пути к исполняемому файлу с частичным префиксом:

(locate-file-completion-table
   exec-path
   exec-suffixes
   ;; here is prefix like "emacs" gives "emacs21"/"emacs22"/"emacs-nox"
   (thing-at-point 'filename)
   'identity
   t)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.