Як я можу знайти шлях до виконавчого файлу за допомогою Emacs Lisp?


16

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

Мені потрібно вимагати бочка таким чином:

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

Але мені потрібно знайти правильний шлях до цього cask.el, і наскільки я знаю, найпростіший спосіб зробити це через пошук виконуваного файлу.

Як я можу це зробити?


6
Це executable-findте, що ви шукаєте?
legoscia

2
Ви хочете виконаний файл або файл бібліотеки lisp? У Каска є і те, і інше.
shosti

Здається, ви запитуєте дві різні речі. Ви хочете знайти виконувану скриньку? Або файл бібліотеки 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.
місячник

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.