10

変更されたバッファーがファイルに関連付けられていないときに、そのバッファーを保存するかどうかをEmacsに尋ねてもらいたいのですが。(ファイルにアクセスせずに)新しいバッファーを開くには、.emacsファイルに次の関数があります。

;; Creates a new empty buffer
(defun new-empty-buffer ()
  "Opens a new empty buffer."
  (interactive)
  (let ((buf (generate-new-buffer "untitled")))
    (switch-to-buffer buf)
    (funcall (and default-major-mode))
    (setq buffer-offer-save t)))

「buffer-offer-save」をnilではないものに設定するとうまくいくと思いました。しかし、「kill-this-buffer」でバッファを強制終了すると、何も要求せずに即座に強制終了されます。

これはGNUEmacs23.1.1で発生します

何か案は?

ありがとう、W

4

3 に答える 3

2

の使用を追加するために編集されましたbuffers-offer-save。注: この変数はEmacsを終了buffer-offer-saveするときにのみ使用されます

このコードから始めて、必要に応じてカスタマイズできます。

(add-to-list 'kill-buffer-query-functions 'ask-me-first)
(defun ask-me-first ()
  "prompt when killing a buffer"
  (if (or buffer-offer-save 
          (eq this-command 'kill-this-buffer)
          (and (buffer-modified-p) (not (buffer-file-name))))
      (y-or-n-p (format "Do you want to kill %s without saving? " (buffer-name)))
    t))

さらによく考えてみると、これは少し面倒です。なぜなら、削除されたすべてのバッファーについてプロンプトが表示され、Emacs が使用する一時バッファーが大量にあることがよくあるからです。(ファイルに関連付けられていない) バッファーを対話的に削除しようとしたときにプロンプ​​トを表示したい場合。

対話的にバッファーを強制終了しようとしているときにのみ表示されるこのアドバイスを使用できます。

(defadvice kill-buffer (around kill-buffer-ask-first activate)
  "if called interactively, prompt before killing"
  (if (and (or buffer-offer-save (interactive-p))
           (buffer-modified-p)
           (not (buffer-file-name)))
      (let ((answ (completing-read
                   (format "Buffer '%s' modified and not associated with a file, what do you want to do? (k)ill (s)ave (a)bort? " (buffer-name))
                   '("k" "s" "a")
                   nil
                   t)))
        (when (cond ((string-match answ "k")
                     ;; kill
                     t)
                    ((string-match answ "s")
                     ;; write then kill
                     (call-interactively 'write-file)
                     t)
                    (nil))
          ad-do-it)

        t)
    ;; not prompting, just do it
    ad-do-it))
于 2010-03-01T18:32:28.080 に答える
1

変更'new-empty-bufferすると、Trey の弁護で意図したとおりに機能するようです。

;; 新しい空のバッファを作成します
(defun new-empty-buffer ()
 「新しい空のバッファを開きます。」
 (相互の作用)
 (let ((buf (generate-new-buffer "untitled")))
   (switch-to-buffer buf)
   (funcall (および default-major-mode))
   ('buffer-offer-save' 永久ローカル t を入れます)
   (setq buffer-offer-save t)))

これによりbuffer-offer-save、新しいバッファーで永続的なローカルが作成されるため、メジャー モードを切り替えるときに残りのローカル変数で強制終了されることはありません。

于 2010-03-03T11:57:07.860 に答える
1

buffer-offer-saveEmacs の終了を要求するが、手動でバッファーを閉じることを要求しないのは意味がないので、その責任を「拡大」してみませんか?

(defadvice kill-buffer (around kill-buffer-ask activate)
  "If `buffer-offer-save' is non-nil and a buffer is modified,
prompt before closing."
  (if (and buffer-offer-save (buffer-modified-p))
      (when (yes-or-no-p "The document isn't saved. Quit? ")
        ad-do-it)
    ad-do-it))

untitledバッファが新しく作成された場合、プロンプトは表示されません。kill-bufferElisp から使用する場合、プロンプトは表示されません。のような Emacs システム バッファではプロンプトが表示されません*Messages*。ただし、空のバッファを作成してそこに何かを書き込んだ場合はプロンプトが表示されます。

空のバッファの作成に関する私の回答も参照してください。

于 2014-12-12T15:03:11.803 に答える