¿Cómo puedo encontrar la ruta a un ejecutable con Emacs Lisp?

16

Mi caso de uso actual es encontrar dónde está el Caskejecutable (se puede instalar en al menos dos lugares, y hay un problema abierto al respecto).

Necesito requerir barril de esta manera:

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

Pero necesito encontrar la ruta correcta a eso cask.el, y que yo sepa, la forma más fácil de hacerlo es ubicar el ejecutable.

¿Cómo puedo hacer esto?

Trevoke
fuente
66
¿Es executable-findlo que estás buscando?
legoscia
2
¿Quieres el archivo ejecutable o la biblioteca lisp? Cask tiene ambos.
shosti
Parece que estás preguntando dos cosas diferentes. ¿Desea ubicar el ejecutable de barril? ¿O el archivo de biblioteca cask.el (que no es un ejecutable)? Modifique su pregunta y título en consecuencia.
Malabarba

Respuestas:

17

La respuesta de @ Sigma es un buen comienzo, pero no se filtra por la capacidad de ejecución, ni permite sufijos adicionales. En Windows, por ejemplo, ejecutar apuede invocar a.exe, si eso es lo que está en su camino.

Así que usa executable-find; Aquí está la definición (tomada de las fuentes de Emacs), si tiene curiosidad:

(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))
Clemente
fuente
3

No estoy seguro de entenderlo por completo (no estoy usando Cask), pero ¿lo pondría en el camino correcto?

(locate-file "cask" exec-path)

Esa parece ser la respuesta a su pregunta general.

Sigma
fuente
3
Para los ejecutables específicamente deberías usarlos executable-find.
lunaryorn
0

Rutas al ejecutable en prefijo parcial:

(locate-file-completion-table
   exec-path
   exec-suffixes
   ;; here is prefix like "emacs" gives "emacs21"/"emacs22"/"emacs-nox"
   (thing-at-point 'filename)
   'identity
   t)
gavenkoa
fuente