Как мне найти путь к исполняемому файлу с 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.