簡體   English   中英

Emacs可以跟蹤像BBEdit這樣的文件嗎?

[英]Can Emacs keep track of files like BBEdit?

引用Sublime Text的功能請求

BBEdit在OS X上具有此功能:
- 在BBEdit中,打開“myfile.txt”
- 在Finder中,將“myfile.txt”重命名為“myfile2.txt”
- 現在,在BBEdit中,文檔顯示為“myfile2.txt”,並保存文件更新“myfile2.txt”

這比ST2用例要好得多:
- 在Sublime Text 2中,打開“myfile.txt”
- 在Finder中,將“myfile.txt”重命名為“myfile2.txt”
- 現在,將文檔保存在ST2中會以靜默方式創建重復文件“myfile.txt”。 這導致我的工作區中同一文件的兩個略有不同的版本,導致后來的麻煩。

與Sublime Text一樣,Emacs也會發生類似的事情。 所以,我很想找到一種方法讓Emacs做BBEdit正在做的事情。

我搜索了谷歌,但我真的不確定在這里搜索什么。 這是否有特定的藝術術語? 無論哪種方式,我都沒有發現任何興趣。

有沒有現成的方法呢? 還是會變得相當復雜? 這篇文章NSURL的“書簽”功能就是這里使用的。

來自最新Emacs主干的NEWS文件(未發布)

支持文件系統通知

Emacs現在支持文件系統更改的通知,例如文件的創建,修改和刪除。 這需要`glib'API或'inotify'API(僅限GNU / Linux系統)。 在MS-Windows系統上,Windows XP和更新版本支持此功能。

因此,對於GNU / Linux和Windows用戶來說,您要求的功能是不可能的,但似乎沒有(在Emacs中)支持OS X上生成的文件通知。

下面的代碼應該做你想要的(雖然它沒有經過徹底的測試)。 它需要最新的(未發布的)Emacs

(require 'filenotify)
(require 'cl-lib)

(defvar my-file-to-fd-hash (make-hash-table))

(defun my-file-notify-add-rename-watch (&optional file)
  (let ((file-name (or file buffer-file-name)))
    (when file-name
      (puthash file-name
               (file-notify-add-watch file-name
                          '(change)
                          'my-handle-file-change)
               my-file-to-fd-hash))))

(defun my-file-notify-rm-rename-watch (&optional file)
  (let* ((file-name (or file
                buffer-file-name))
         (fd (gethash file-name my-file-to-fd-hash)))
    ;; Stop watching the file
    (when fd
      (file-notify-rm-watch fd)
      (remhash file-name my-file-to-fd-hash))))

(add-to-list 'find-file-hook 'my-file-notify-add-rename-watch)
(add-to-list 'kill-buffer-hook 'my-file-notify-rm-rename-watch)

(defun my-handle-file-change (event)
  (let* ((fd (cl-first event))
         (action (cl-second event))
         (file (cl-third event))
         (renamed-to (cl-fourth event))
         (visiting-buffer (get-file-buffer file)))
    ;; Ignore events other than `rename` and also the `rename` events
    ;; generated due to emacs backing up file
    (when (and (eq action 'renamed)
           (not (backup-file-name-p renamed-to)))
      (message (format "File %s was renamed" file))

      ;; If file is not open ignore the notification
      (when visiting-buffer
        (with-current-buffer visiting-buffer
          (set-visited-file-name renamed-to))
        (my-file-notify-rm-rename-watch file)
        (my-file-notify-add-rename-watch renamed-to)))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM