马儿慢些走

人生惶惶,悲喜一场。

Emacs自定义插件进行笔记本地备份和RClone远程同步(KIMI)

title: Emacs自定义插件进行笔记本地备份和RClone远程同步(KIMI)

为了能够在Emacs记笔记的时候能够同步和备份笔记,我用如下Emacs自定义插件实现这个
功能。备份功能将笔记备份到本地指定目录的压缩包,同步功能将笔记和远程的对象存储
进行同步,可以单向也可以双向同步。

需要提前安装和配置RClone远程存储。双向同步会删除文件,所以要及时备份。

自动同步和启动、退出时候的同步是从思源笔记中学到的,甚至对象存储进行远程数据保
存和同步的方法也是从思源笔记中学习到的。

自己电脑上的Emacs配置文件和目录也放在笔记目录中,把Emacs自己读取的文件设置为软
链接。

这份代码放到~/.emacs.d/lisp/backup-sync.el中,在~/.emacs中加载即可。目前没
有考虑更高级的功能,比如支持多个数据源的备份和同步,仅满足自己的功能即可。


Kimi: 这段代码是一个用于备份和同步笔记的 Emacs 插件,主要功能是通过 rclone
tar 命令来实现本地文件夹的备份和与远程文件夹的同步。以下是对代码的详细分
析和解释:

1. 加载依赖

(require 'cl-lib)
(require 'timer)
  • cl-lib:加载 Common Lisp 扩展库,提供一些额外的函数和宏。
  • timer:加载定时器功能,用于实现自动同步功能。

2. 定义自定义组

(defgroup backup-sync nil
  "使用 rclone 和 tar 备份和同步文件。"
  :group 'tools)
  • 定义了一个自定义组 backup-sync,用于组织与备份同步相关的自定义变量和函数。
    这有助于在 Emacs 的自定义界面中更好地管理这些设置。

3. 定义自定义变量

(defcustom backup-sync-source-folder "/path/to/source/folder"
  "要备份和同步的源文件夹路径。"
  :type 'string
  :group 'backup-sync)
  • 定义了一个自定义变量 backup-sync-source-folder,用于指定要备份和同步的源文
    件夹路径。
  • 类似地,定义了其他自定义变量,包括备份文件夹路径、远程文件夹路径、保留的备份
    文件数量、自动同步的启用状态、自动同步的间隔时间、启动时同步和退出时同步的启
    用状态。

4. 生成时间戳

(defun backup-sync-timestamp ()
  "生成时间戳字符串。"
  (format-time-string "%Y%m%d%H%M%S"))
  • 定义了一个函数 backup-sync-timestamp,用于生成时间戳字符串,格式为
    YYYYMMDDHHMMSS,用于备份文件的命名。

5. 备份源文件夹

(defun backup-sync-backup ()
  "将源文件夹备份到备份文件夹。"
  (interactive)
  (let* ((timestamp (backup-sync-timestamp))
         (backup-file (expand-file-name (concat "backup-" timestamp ".tar.gz") backup-sync-backup-folder)))
    (make-directory backup-sync-backup-folder t)
    (message "开始备份到 %s..." backup-file)
    (shell-command (format "tar -czf %s -C %s ." backup-file backup-sync-source-folder))
    (message "备份完成: %s" backup-file)
    (backup-sync-clean-old-backups)))
  • 定义了一个函数 backup-sync-backup,用于将源文件夹备份到备份文件夹。
  • 使用 tar 命令将源文件夹压缩成 .tar.gz 文件,并存储在指定的备份文件夹中。
  • 调用了 backup-sync-clean-old-backups 函数来清理旧备份。

6. 清理旧备份

(defun backup-sync-clean-old-backups ()
  "清理旧备份,只保留指定数量的最新备份。"
  (interactive)
  (let* ((backup-files (directory-files backup-sync-backup-folder t "backup-.*\\.tar\\.gz$"))
         (sorted-backup-files (sort backup-files (lambda (a b) (string> a b))))
         (backups-to-delete (nthcdr backup-sync-keep-backups sorted-backup-files)))
    (dolist (file backups-to-delete)
      (delete-file file)
      (message "已删除旧备份: %s" file))))
  • 定义了一个函数 backup-sync-clean-old-backups,用于清理旧备份。
  • 获取所有备份文件,按时间排序,删除超出保留数量的旧备份。

7. 同步本地到远程

(defun backup-sync-sync-local-to-remote ()
  "使用 rclone 将源文件夹同步到远程文件夹。"
  (interactive)
  (message "正在同步本地到远程...")
  (shell-command (format "rclone sync %s %s" backup-sync-source-folder backup-sync-remote-folder))
  (message "本地到远程同步完成。"))
  • 定义了一个函数 backup-sync-sync-local-to-remote,使用 rclone 将源文件夹
    同步到远程文件夹。

8. 同步远程到本地

(defun backup-sync-sync-remote-to-local ()
  "使用 rclone 将远程文件夹同步到源文件夹。"
  (interactive)
  (message "正在同步远程到本地..."
  (shell-command (format "rclone sync %s %s" backup-sync-remote-folder backup-sync-source-folder))
  (message "远程到本地同步完成。"))
  • 定义了一个函数 backup-sync-sync-remote-to-local,使用 rclone 将远程文件
    夹同步到源文件夹。

9. 双向同步

(defun backup-sync-bidirectional-sync ()
  "执行本地和远程文件夹之间的双向同步。"
  (interactive)
  (backup-sync-sync-local-to-remote)
  (backup-sync-sync-remote-to-local))
  • 定义了一个函数 backup-sync-bidirectional-sync,执行本地和远程文件夹之间的
    双向同步。

10. 自动同步

(defun backup-sync-auto-sync ()
  "自动同步本地和远程文件夹。"
  (when backup-sync-enable-auto-sync
    (backup-sync-bidirectional-sync)
    (message "自动同步完成。")))
  • 定义了一个函数 backup-sync-auto-sync,用于自动同步本地和远程文件夹。

11. 定时器

(defvar backup-sync-timer nil
  "自动同步的定时器。")

(defun backup-sync-start-auto-sync ()
  "启动自动同步定时器。"
  (when backup-sync-enable-auto-sync
    (setq backup-sync-timer
          (run-at-time t backup-sync-auto-sync-interval 'backup-sync-auto-sync))
    (message "自动同步已启动。")))

(defun backup-sync-stop-auto-sync ()
  "停止自动同步定时器。"
  (when backup-sync-timer
    (cancel-timer backup-sync-timer)
    (setq backup-sync-timer nil)
    (message "自动同步已停止。")))
  • 定义了一个变量 backup-sync-timer,用于存储定时器。
  • 定义了函数 backup-sync-start-auto-syncbackup-sync-stop-auto-sync,分
    别用于启动和停止自动同步定时器。

12. 启动和退出时同步

(defun backup-sync-on-startup ()
  "在 Emacs 启动时同步。"
  (when backup-sync-sync-on-startup
    (backup-sync-bidirectional-sync)
    (message "启动时同步完成。")))

(defun backup-sync-on-exit ()
  "在 Emacs 退出时同步。"
  (when backup-sync-sync-on-exit
    (backup-sync-bidirectional-sync)
    (message "退出时同步完成。")))
  • 定义了函数 backup-sync-on-startupbackup-sync-on-exit,分别在 Emacs
    启动和退出时执行双向同步。

13. 添加钩子

(add-hook 'emacs-startup-hook 'backup-sync-on-startup)
(add-hook 'kill-emacs-hook 'backup-sync-on-exit)
  • backup-sync-on-startup 添加到 emacs-startup-hook,在 Emacs 启动时执行。
  • backup-sync-on-exit 添加到 kill-emacs-hook,在 Emacs 退出时执行。

14. 快捷键绑定

(global-set-key (kbd "C-c b b") 'backup-sync-backup)
(global-set-key (kbd "C-c b c") 'backup-sync-clean-old-backups)
(global-set-key (kbd "C-c b l") 'backup-sync-sync-local-to-remote)
(global-set-key (kbd "C-c b r") 'backup-sync-sync-remote-to-local)
(global-set-key (kbd "C-c b d") 'backup-sync-bidirectional-sync)
  • 为备份、清理旧备份、本地到远程同步、远程到本地同步和双向同步命令分别绑定了快捷键。

15. 启动自动同步

(backup-sync-start-auto-sync)
  • 在插件加载时启动自动同步定时器。

16. 提供插件

(provide 'backup-sync)
  • 表示插件加载完成,可以被其他代码加载。

总结

这个插件通过定义一系列自定义变量和函数,实现了本地文件夹的备份和与远程文件夹的
同步功能。它支持手动备份、清理旧备份、双向同步,以及自动同步功能,并且可以通过
快捷键和钩子方便地使用。

posted on 2025-10-19 14:40  马儿慢些走  阅读(21)  评论(0)    收藏  举报

导航