Como posso encontrar o caminho para um executável com o Emacs Lisp?

16

Meu caso de uso atual é descobrir onde está o Caskexecutável (ele pode ser instalado em pelo menos dois locais e existe um problema em aberto).

Eu preciso exigir o barril desta maneira:

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

Mas preciso encontrar o caminho correto para isso cask.ele, até onde sei, a maneira mais fácil de fazer isso é localizar o executável.

Como posso fazer isso?

Trevoke
fonte
6
É o executable-findque você está procurando?
legoscia 26/09
2
Deseja o arquivo executável ou a biblioteca lisp? Cask tem os dois.
shosti 26/09/14
Parece que você está perguntando duas coisas diferentes. Deseja localizar o executável do barril? Ou o arquivo da biblioteca cask.el (que não é um executável)? Altere sua pergunta e título de acordo.
Malabarba 26/09

Respostas:

17

A resposta da @ Sigma é um bom começo, mas não filtra por executabilidade, nem permite sufixos extras. No Windows, por exemplo, a execução apode invocar a.exe, se é isso que está no seu caminho.

Então use executable-find; aqui está a definição (retirada das fontes do Emacs), se você estiver 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))
Clemente
fonte
3

Não sei se entendi completamente (não estou usando o Cask), mas o seguinte o colocaria no caminho certo?

(locate-file "cask" exec-path)

Essa parece ser a resposta para sua pergunta geral.

Sigma
fonte
3
Para executáveis ​​especificamente, você deve usar executable-find.
lunaryorn
0

Caminhos para o executável no prefixo 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
fonte