在没有保存内容时更新标签栏

问题描述 投票:3回答:1

我正在使用Tab-bar将我在Emacs中的工作编成表格,到目前为止,我发现tabbar-ruler基本上增加了一个指示符,用于显示文件被修改的时间。显然,它本身并不起作用。

我添加了一些代码,让标签栏知道文件已被修改,但是当我恢复工作时它不起作用。我需要一些钩子,如果可能的话,让emacs知道达到“不必保存”状态时,它将使选项卡掉线。

这是到目前为止的代码:

(defadvice tabbar-buffer-tab-label (after fixup_tab_label_space_and_flag activate)
(setq ad-return-value
     (if (and (buffer-modified-p (tabbar-tab-value tab))
              (buffer-file-name (tabbar-tab-value tab)))
         (concat " " (concat ad-return-value " "))
       (concat " " (concat ad-return-value " ")))))

;; Called each time the modification state of the buffer changed.
(defun er/modification-state-change ()
    (tabbar-set-template tabbar-current-tabset nil)
    (tabbar-display-update))
(add-hook 'after-save-hook 'er/modification-state-change)

;; First-change-hook is called BEFORE the change is made.
(defun er/on-buffer-modification ()
    (set-buffer-modified-p t)
    (er/modification-state-change))
(add-hook 'first-change-hook 'er/on-buffer-modification)

;; Retrieve original state after revert is made.
(defun er/on-buffer-revert ()
    (set-buffer-modified-p nil)
    (er/modification-state-change))
(add-hook 'after-revert-hook 'er/on-buffer-revert)

er / on-buffer-revert函数是我尝试至少达到恢复的缓冲区状态。也不起作用。

第一段代码,顺便说一句,只是添加了原来没有的额外空格标签栏。

有什么想法吗?

emacs elisp
1个回答
0
投票

我知道您几年前曾问过这个问题,但这是一个正确支持还原的有效示例。请注意,它在以下情况下正确支持标签栏状态:

  • 缓冲区还原
  • 撤消回到上一个保存的状态
  • 更改文本以使其与上次保存之前的文本相匹配
    (defun my-ignore-buffer-p ()
      (not (buffer-file-name)))

    (setq my-buffer-hashes (make-hash-table :test 'equal))
    (defun my-set-buffer-hash ()
      (puthash (current-buffer) (buffer-hash) my-buffer-hashes))
    (defun my-get-buffer-hash ()
      (gethash (current-buffer) my-buffer-hashes))
    (defun my-buffer-hash-changed-p ()
      (not (string= (buffer-hash) (my-get-buffer-hash))))

    ;; Hook save and change events to show modified buffers in tabbar
    (defun on-saving-buffer ()
      (tabbar-set-template tabbar-current-tabset nil)
      (tabbar-display-update))
    (defun on-modifying-buffer ()
      (unless (my-ignore-buffer-p)
        (my-set-buffer-hash)
        (set-buffer-modified-p (buffer-modified-p))
        (tabbar-set-template tabbar-current-tabset nil)
        (tabbar-display-update)))
    (defun after-modifying-buffer (begin end length)
      (unless (my-ignore-buffer-p)
        (set-buffer-modified-p (my-buffer-hash-changed-p))
        (tabbar-set-template tabbar-current-tabset nil)
        (tabbar-display-update)))

    (add-hook 'after-save-hook 'on-saving-buffer)
    (add-hook 'first-change-hook 'on-modifying-buffer)
    (add-hook 'after-change-functions 'after-modifying-buffer)
© www.soinside.com 2019 - 2024. All rights reserved.