Как определить альтернативную команду для emacs eshell - PullRequest
1 голос
/ 23 февраля 2012

Я пытаюсь начать использовать eshell вместо bash в emacs, но я сильно полагаюсь на функции bash, которые я написал за эти годы.Я бы хотел настроить eshell для вызова bash всякий раз, когда возникает условие «команда не найдена», если рассматриваемая команда реализована как функция bash.

Существует переменная с дразнящим названием eshell-alternate-command-hook, которая звучиткак будто это сделано на заказ, но мое отсутствие навыков elisp мешает моему успеху, я думаю.

Это мое лучшее усилие:

(add-hook 'eshell-alternate-command-hook 'invoke-bash t t)
(defun invoke-bash (command args)
  (throw 'eshell-replace-command
     (list "bash -c" command args)))

Но когда я проверяю это, это нене работает:

c:/temp $ lsd
Wrong number of arguments: (lambda (command args) (throw (quote eshell-replace-command) (list "bash -c" command args))), 1
c:/temp $ 

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Вот что я в итоге придумал:

(defun invoke-bash (command)
(progn 
  (setq invoke-bash-cmd (concat "bash -c \"" command " " (mapconcat 'identity eshell-last-arguments " ") "\""))
  (message invoke-bash-cmd)
  (throw 'eshell-replace-command
     (eshell-parse-command invoke-bash-cmd))))
0 голосов
/ 24 февраля 2012

Я не гуру eshell, но там, где используется этот хук, я вижу, что он получает только один аргумент - команду, которую вы пытаетесь выполнить, поэтому ваш код может выглядеть как

(add-hook 'eshell-alternate-command-hook 'invoke-bash)
(defun invoke-bash (command)
  (throw 'eshell-replace-command
     (list "bash -c" command)))

но это не работает, потому что вам нужно вернуть функцию elisp, а не имя команды (согласно документации). Если вы хотите запустить bash, вам нужно вернуть строку с полным путем к ней, но я не нашел, как передать дополнительные аргументы в bash. Может быть, вы можете найти больше в соответствующем разделе Emacs Wiki ?

...