下位Emacs Lispモードでのセッション間の履歴の記憶


9

*ielm*セッション間のバッファーの履歴をEmacsに記憶させることができません。私の知る限り、そのような履歴はバッファローカル変数に記録されますcomint-input-ring。したがって、私は私のinitファイルに次の式を追加しました:

(setq desktop-locals-to-save
    (append desktop-locals-to-save
            '((comint-input-ring . 50))))

動作しません。desktopEmacsがdesktop-globals-to-saveinitファイルに追加したグローバル変数を記憶しているため、パッケージが機能していることがわかります。

-

編集:savehistどちらも機能しません。それはcomint-input-ringバッファローカル変数だからだと思います。


1
デスクトップで機能しない理由を確認する時間はありません。ただしsavehist.el、この変数を使用して、保存する変数のリストに追加してみることができます。
2014

おかげで、ドリュー、しかし私はsavehistすでに考えていました(言及しなかったことを申し訳ありません)。私が見る限り、それはグローバル変数のみでしたが、comint-input-ringバッファローカルです。今、私はとにかくそれを試みましたが、成功しませんでした。
Elena

警告:次の解決策は冒とくです !!!! comint.el次の2行のコード内でコメント化します: (put 'comint-input-ring 'permanent-local t)および(make-local-variable 'comint-input-ring)。次に、に追加comint-input-ringdesktop-locals-to-saveます。最後に、該当するファイルを再バイトコンパイルし、Emacsを再起動して、最大限の生活を楽しんでください。
法律家、

回答:


5

バッファが強制終了されたcomint-input-ringときにの*ielm*バッファローカル値をグローバル変数に保存して、inferior-emacs-lisp-mode-hook次の場所に復元できます。

;; global copy of the buffer-local variable
(defvar ielm-comint-input-ring nil)

(defun set-ielm-comint-input-ring ()
  ;; create a buffer-local binding of kill-buffer-hook
  (make-local-variable 'kill-buffer-hook)
  ;; save the value of comint-input-ring when this buffer is killed
  (add-hook 'kill-buffer-hook #'save-ielm-comint-input-ring)
  ;; restore saved value (if available)
  (when ielm-comint-input-ring
    (message "Restoring comint-input-ring...")
    (setq comint-input-ring ielm-comint-input-ring)))

(defun save-ielm-comint-input-ring ()
  (message "Saving comint-input-ring...")
  (setq ielm-comint-input-ring comint-input-ring))

(require 'ielm)
(add-hook 'inferior-emacs-lisp-mode-hook #'set-ielm-comint-input-ring)

これで、に追加ielm-comint-input-ringsavehist-additional-variablesて、必要な動作を取得できるはずです。(私はこのアプローチをテストしましたが、あなたdesktop-locals-to-saveも使用できるはずです。)


1
あなたは使用する必要がありますLOCALに引数をadd-hook手動で呼び出すのではなく、make-local-variablekill-buffer-hook。後者は、後でグローバルにフックにコールバックを追加しようとするときに問題を引き起こす可能性があります。
2015年

これがinf-mongoうまく機能していることをとても嬉しく思います(または、おそらく、を使用する他のすべてのモードcomint)。これは非常に便利です。
Blake Miller、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.