1

私は emacs 内で bash の代わりに eshell を使い始めようとしていますが、長年にわたって書いてきた bash 関数に大きく依存しています。問題のコマンドが bash 関数として実装されている場合に備えて、「コマンドが見つからない」状態が発生するたびに bash を呼び出すように eshell を構成したいと考えています。

オーダーメイドのように聞こえる興味をそそる名前の変数があります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 $ 
4

2 に答える 2

1

これは私が最終的に思いついたものです:

(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))))
于 2012-02-24T17:59:51.377 に答える
0

私は eshell の第一人者ではありませんが、このフックが使用されている場所では、実行しようとしているコマンドの引数を 1 つだけ受け取ることがわかります。したがって、コードは次のようになります。

(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の対応するセクションでもっと見つけることができますか?

于 2012-02-23T20:32:31.590 に答える