0

私は emacs を複数のモード (ESS、Auctex、Slime、elisp など) で使用しており、すべて悪モードのキーバインディングを使用しています。各対話モードには、スペースバーをプレフィックスとして使用してショートカットにバインドした領域、行、またはバッファーを評価するための同様の機能があります。

;; bind slime's eval and elisp eval to the key sequence "<SPC>e"
(evil-define-key 'normal lisp-mode-map (kbd "<SPC>e") 'slime-eval-last-expression)
(evil-define-key 'normal lisp-interaction-mode-map (kbd "<SPC>e") 'eval-last-sexp)

関数の「タイプ」にデフォルトのキーを設定したいと思います。これにより、使用するすべての対話モードとすべてのコマンドに対して上記のようなエントリを作成する必要がなくなります。これにより、より読みやすい .emacs 初期化ファイルが提供され、将来のキーバインディングの変更が容易になることが期待されます。

一連のフックを使用して自分でこれを行うことができると確信していますが、これに対する既存または組み込みのサポートがあるのでしょうか?

ありがとう

テンソル積

4

1 に答える 1

2

私は悪について何も知らないので、通常の Emacs の解決策を示します。

(global-set-key [?\s ?e] #'my-eval-last-sexp)
(defvar my-eval-last-sexp-command #'undefined)
(defun my-eval-last-sexp ()
  (interactive)
  (call-interactively my-eval-last-sexp-command))
(add-hook 'emacs-lisp-mode-hook
          (lambda () (set (make-local-variable 'my-eval-last-sexp-command) #'eval-last-sexp))
(add-hook 'lisp-mode-hook
          (lambda () (set (make-local-variable 'my-eval-last-sexp-command) #'slime-eval-last-expression))
...

ご覧のとおり、必要なキーは 1 つしかありません (この場合は [?\s ?e])。しかし、書かなければならないコードの量はあまり節約できません。my-eval-last-sexpもう少し複雑にするか (たとえば、メジャー モード名からコマンド名を推測しようとする)、フック関数をグローバルな連想リストに置き換えることで改善できます。

願わくば、将来のいくつかの Emacs では、インタープリター/コンパイラーと対話するすべてのソースコードモードが、より多くのコードを共有して、問題が単純に解消されるようになることを願っています。

于 2012-10-05T16:22:54.470 に答える