Come posso trovare il percorso di un eseguibile con Emacs Lisp?


16

Il mio caso d'uso attuale è trovare dove si trova l' Caskeseguibile (può essere installato in almeno due posizioni e c'è un problema aperto su questo).

Devo richiedere la botte in questo modo:

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

Ma ho bisogno di trovare il percorso corretto per quello cask.el, e per quanto ne so, il modo più semplice per farlo è individuare il file eseguibile.

Come posso fare questo?


6
È executable-findquello che stai cercando?
Legoscia,

2
Vuoi il file eseguibile o il file della libreria lisp? Cask ha entrambi.
shosti,

Sembra che tu stia chiedendo due cose diverse. Vuoi individuare l'eseguibile di botte? O il file della libreria cask.el (che non è un eseguibile)? Modifica la domanda e il titolo di conseguenza.
Malabarba,

Risposte:


17

La risposta di @ Sigma è un buon inizio, ma non filtra per eseguibilità, né consente suffissi extra. Su Windows, ad esempio, la corsa apuò invocare a.exe, se è questo il tuo percorso.

Quindi usa executable-find; ecco la definizione (tratta dalle fonti di Emacs), se sei curioso:

(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

Non sono sicuro di aver capito completamente (non sto usando Cask da solo), ma quanto segue ti metterebbe sulla buona strada?

(locate-file "cask" exec-path)

Questa sembra essere la risposta alla tua domanda generale.


3
Per gli eseguibili in particolare dovresti piuttosto usare executable-find.
lunaryorn,

0

Percorsi per eseguibili su prefisso parziale:

(locate-file-completion-table
   exec-path
   exec-suffixes
   ;; here is prefix like "emacs" gives "emacs21"/"emacs22"/"emacs-nox"
   (thing-at-point 'filename)
   'identity
   t)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.