新插件:calibredb.el 用 emacs 管理你的 ebooks(其实可以任何文件)

好的,谢谢你的建议,对于 ref 的支持会在后期版本慢慢加入。因为目前还有很多基本功能在我的TODO list 里面。

1.3.0发布,欢迎测试。添加了 calibredb-clone, calibredb-switch-librarycalibredb-library-list现在你可以快速切换 library 了。多 libraries 让 calibredb 更加有弹性,举个例子,利用calibredb-clone快速克隆library,一个存放电子书,一个存放文献,一个存放工作的文档,一个项目的文档的存放等。切换Library后,你就可以轻松利用calibredb-add添加文件到当前工作的Library,文件都是通过复制来加入Library的,因此不担心源文件会被损害或者丢失。

(setq calibredb-library-alist '(("~/OneDrive/Doc/Calibre")
                                  ("/Users/damonchan/Documents/Books Library")
                                  ("/Users/damonchan/Documents/HELLO")
                                  ("/Users/damonchan/Documents/Books")
                                  ("/Users/damonchan/Documents/World")))

M-x caibredb-library-list

或者 M-x calibredb-switch-library 选择一个 library 路径。

4 个赞

太肝了太肝了(泪目) :joy:

1.4.0 发布,增加了很多 keybinding 和个性化设置,可以在*calibredb-search**calibredb-entry*里面完成大部分的电子书管理操作。

2 个赞

更新后,重启 doom emacs 失败,提示:

(invalid-function helm-build-sync-source)

好的,谢谢反馈,我晚点看看。

刚测试了,应该没有问题。use-package和doom都可以

1.5.0 发布,加强了 *calibredb-search**calibredb-entry* 的用户体验,增加更多的按键。Helm 支持标记和设置多个tags,comments,author,title。加强对图片的文件的支持。增加calibredb-add-dir可以添加一个文件夹。

在我那还是不行,emacs --debug-init 获取的信息如下:

Debugger entered--Lisp error: (invalid-function helm-build-sync-source)
  helm-build-sync-source("calibredb" :header-name #f(compiled-function (name) #) :candidates calibredb-candidates :persistent-action calibredb-find-cover :action calibredb-helm-actions :keymap (keymap (27 keymap (99 . calibredb-set-metadata--comments-1) (116 . calibredb-set-metadata--tags-1)) keymap (f13 lambda nil (interactive) (helm-select-nth-action 12)) (f12 lambda nil (interactive) (helm-select-nth-action 11)) (f11 lambda nil (interactive) (helm-select-nth-action 10)) (f10 lambda nil (interactive) (helm-select-nth-action 9)) (f9 lambda nil (interactive) (helm-select-nth-action 8)) (f8 lambda nil (interactive) (helm-select-nth-action 7)) (f7 lambda nil (interactive) (helm-select-nth-action 6)) (f6 lambda nil (interactive) (helm-select-nth-action 5)) (f5 lambda nil (interactive) (helm-select-nth-action 4)) (f4 lambda nil (interactive) (helm-select-nth-action 3)) (f3 lambda nil (interactive) (helm-select-nth-action 2)) (f2 lambda nil (interactive) (helm-select-nth-action 1)) (menu-bar keymap (help-menu keymap (describe keymap (describe-mode . helm-help)))) (help keymap (109 . helm-help)) (23 . #f(compiled-function () (interactive nil) #)) (f1 lambda nil (interactive) (helm-select-nth-action 0)) (8 keymap (109 . helm-help) (104 . undefined) (8 . undefined) (99 . helm-customize-group) (4 . helm-enable-or-switch-to-debug)) (20 . helm-toggle-resplit-and-swap-windows) (C-tab . undefined) (67108897 . helm-toggle-suspend-update) (3 keymap (57 . helm-execute-selection-action-at-nth-+9) (56 . helm-execute-selection-action-at-nth-+8) (55 . helm-execute-selection-action-at-nth-+7) (54 . helm-execute-selection-action-at-nth-+6) (53 . helm-execute-selection-action-at-nth-+5) (52 . helm-execute-selection-action-at-nth-+4) (51 . helm-execute-selection-action-at-nth-+3) (50 . helm-execute-selection-action-at-nth-+2) (49 . helm-execute-selection-action-at-nth-+1) (63 . helm-help) (110 . #f(compiled-function () (interactive nil) #)) (108 . helm-display-line-numbers-mode) (62 . helm-toggle-truncate-line) (21 . helm-refresh) (6 . helm-follow-mode) (9 . helm-copy-to-buffer) (11 . helm-kill-selection-and-quit) (25 . helm-yank-selection) (37 . helm-exchange-minibuffer-and-header-line) (95 . helm-toggle-full-frame) (45 . helm-swap-windows)) (67108987 . helm-enlarge-window) (67108989 . helm-narrow-window) (19 . undefined) (24 keymap (57 . helm-execute-selection-action-at-nth-+9) (56 . helm-execute-selection-action-at-nth-+8) (55 . helm-execute-selection-action-at-nth-+7) (54 . helm-execute-selection-action-at-nth-+6) (53 . helm-execute-selection-action-at-nth-+5) (52 . helm-execute-selection-action-at-nth-+4) (51 . helm-execute-selection-action-at-nth-+3) (50 . helm-execute-selection-action-at-nth-+2) (49 . helm-execute-selection-action-at-nth-+1) (2 . helm-resume-list-buffers-after-quit) (98 . helm-resume-previous-session-after-quit) (6 . helm-quit-and-find-file)) (11 . helm-delete-minibuffer-contents) (67108896 . helm-toggle-visible-mark-forward) (0 . helm-toggle-visible-mark) (C-M-up . helm-scroll-other-window-down) (C-M-down . helm-scroll-other-window) (M-prior . helm-scroll-other-window-down) (M-next . helm-scroll-other-window) (12 . helm-recenter-top-bottom-other-window) (15 . helm-next-source) (10 . helm-execute-persistent-action) (9 . helm-select-action) (13 . helm-maybe-exit-minibuffer) (7 . helm-keyboard-quit) (22 . helm-next-page) (27 keymap (110 . next-history-element) (112 . previous-history-element) (115 . undefined) (5 . helm-display-all-sources) (1 . helm-show-all-candidates-in-source) (85 . helm-unmark-all) (97 . helm-mark-all) (109 . helm-toggle-all-marks) (41 . helm-next-visible-mark) (40 . helm-prev-visible-mark) (91) (32 . helm-toggle-visible-mark-backward) (33554454 . helm-scroll-other-window-down) (25 . helm-scroll-other-window-down) (22 . helm-scroll-other-window) (12 . helm-reposition-window-other-window) (111 . helm-previous-source) (62 . helm-end-of-buffer) (60 . helm-beginning-of-buffer) (118 . helm-previous-page)) (next . helm-next-page) (prior . helm-previous-page) (C-up . helm-follow-action-backward) (C-down . helm-follow-action-forward) (16 . helm-previous-line) (14 . helm-next-line) (up . helm-previous-line) ...) :candidate-number-limit 9999)
  byte-code("\301\302!\205\026\0\302\303\304\305\306\307\310\311\312\313\314\010\315\316&\015\207" [calibredb-helm-map fboundp helm-build-sync-source "calibredb" :header-name #f(compiled-function (name) #) :candidates calibredb-candidates :persistent-action calibredb-find-cover :action calibredb-helm-actions :keymap :candidate-number-limit 9999] 14)
  (defvar calibredb-helm-source (byte-code "\301\302!\205\026\0\302\303\304\305\306\307\310\311\312\313\314\010\315\316&\015\207" [calibredb-helm-map fboundp helm-build-sync-source "calibredb" :header-name #f(compiled-function (name) #) :candidates calibredb-candidates :persistent-action calibredb-find-cover :action calibredb-helm-actions :keymap :candidate-number-limit 9999] 14) ("/home/mls/.emacs.d.doom/.local/straight/build/calibredb/calibredb.elc" . 5383))
  require(calibredb)
  eval-buffer(# nil "/home/mls/.doom.d/modules/private/myorg/config.el" nil t)  ; Reading at buffer position 33895
  load-with-code-conversion("/home/mls/.doom.d/modules/private/myorg/config.el" "/home/mls/.doom.d/modules/private/myorg/config.el" t t)
  load("/home/mls/.doom.d/modules/private/myorg/config" t nomessage)
  (let (file-name-handler-alist) (load (expand-file-name "config" (plist-get plist :path)) t (quote nomessage)))
  (condition-case e (let (file-name-handler-alist) (load (expand-file-name "config" (plist-get plist :path)) t (quote nomessage))) ((debug doom-error) (signal (car e) (cdr e))) ((debug error) (doom--handle-load-error e (expand-file-name "config" (plist-get plist :path)) (plist-get plist :path))))
  (let ((doom--current-module key) (doom--current-flags (plist-get plist :flags))) (condition-case e (let (file-name-handler-alist) (load (expand-file-name "config" (plist-get plist :path)) t (quote nomessage))) ((debug doom-error) (signal (car e) (cdr e))) ((debug error) (doom--handle-load-error e (expand-file-name "config" (plist-get plist :path)) (plist-get plist :path)))))
  (closure ((init-p . t) (temp-buffer . #) (force-p) t) (key plist) (let ((doom--current-module key) (doom--current-flags (plist-get plist :flags))) (condition-case e (let (file-name-handler-alist) (load (expand-file-name "config" (plist-get plist :path)) t (quote nomessage))) ((debug doom-error) (signal (car e) (cdr e))) ((debug error) (doom--handle-load-error e (expand-file-name "config" (plist-get plist :path)) (plist-get plist :path))))))((:private . myorg) (:flags nil :path "/home/mls/.doom.d/modules/private/myorg/"))
  maphash((closure ((init-p . t) (temp-buffer . #) (force-p) t) (key plist) (let ((doom--current-module key) (doom--current-flags (plist-get plist :flags))) (condition-case e (let (file-name-handler-alist) (load (expand-file-name "config" (plist-get plist :path)) t (quote nomessage))) ((debug doom-error) (signal (car e) (cdr e))) ((debug error) (doom--handle-load-error e (expand-file-name "config" (plist-get plist :path)) (plist-get plist :path)))))) #)
  (progn (maphash (function (lambda (key plist) (let ((doom--current-module key) (doom--current-flags (plist-get plist :flags))) (condition-case e (let (file-name-handler-alist) (load ... t ...)) ((debug doom-error) (signal ... ...)) ((debug error) (doom--handle-load-error e ... ...)))))) doom-modules))
  (if doom-modules (progn (maphash (function (lambda (key plist) (let ((doom--current-module key) (doom--current-flags ...)) (condition-case e (let ... ...) (... ...) (... ...))))) doom-modules)))
  (progn (if doom-debug-mode (progn (let ((inhibit-message (active-minibuffer-window))) (message #("DOOM Initializing user config" 0 5 (face font-lock-comment-face)))))) (if doom-modules (progn (maphash (function (lambda (key plist) (let (... ...) (condition-case e ... ... ...)))) doom-modules))) (run-hook-wrapped (quote doom-before-init-modules-hook) (function doom-try-run-hook)) (if doom-modules (progn (maphash (function (lambda (key plist) (let (... ...) (condition-case e ... ... ...)))) doom-modules))) (run-hook-wrapped (quote doom-init-modules-hook) (function doom-try-run-hook)) (condition-case e (let (file-name-handler-alist) (load (expand-file-name "config" doom-private-dir) t (quote nomessage))) ((debug doom-error) (signal (car e) (cdr e))) ((debug error) (doom--handle-load-error e (expand-file-name "config" doom-private-dir) doom-private-dir))) (load custom-file (quote noerror) (not doom-debug-mode)))
  (if init-p (progn (if doom-debug-mode (progn (let ((inhibit-message (active-minibuffer-window))) (message #("DOOM Initializing user config" 0 5 (face font-lock-comment-face)))))) (if doom-modules (progn (maphash (function (lambda (key plist) (let ... ...))) doom-modules))) (run-hook-wrapped (quote doom-before-init-modules-hook) (function doom-try-run-hook)) (if doom-modules (progn (maphash (function (lambda (key plist) (let ... ...))) doom-modules))) (run-hook-wrapped (quote doom-init-modules-hook) (function doom-try-run-hook)) (condition-case e (let (file-name-handler-alist) (load (expand-file-name "config" doom-private-dir) t (quote nomessage))) ((debug doom-error) (signal (car e) (cdr e))) ((debug error) (doom--handle-load-error e (expand-file-name "config" doom-private-dir) doom-private-dir))) (load custom-file (quote noerror) (not doom-debug-mode))) nil)
  (let* ((init-p (and t (condition-case e (let (file-name-handler-alist) (load (expand-file-name "init" doom-private-dir) t (quote nomessage))) ((debug doom-error) (signal (car e) (cdr e))) ((debug error) (doom--handle-load-error e (expand-file-name "init" doom-private-dir) doom-private-dir)))))) (if init-p (progn (if doom-debug-mode (progn (let ((inhibit-message ...)) (message #("DOOM Initializing user config" 0 5 (face font-lock-comment-face)))))) (if doom-modules (progn (maphash (function (lambda ... ...)) doom-modules))) (run-hook-wrapped (quote doom-before-init-modules-hook) (function doom-try-run-hook)) (if doom-modules (progn (maphash (function (lambda ... ...)) doom-modules))) (run-hook-wrapped (quote doom-init-modules-hook) (function doom-try-run-hook)) (condition-case e (let (file-name-handler-alist) (load (expand-file-name "config" doom-private-dir) t (quote nomessage))) ((debug doom-error) (signal (car e) (cdr e))) ((debug error) (doom--handle-load-error e (expand-file-name "config" doom-private-dir) doom-private-dir))) (load custom-file (quote noerror) (not doom-debug-mode))) nil))
  (progn (if doom-debug-mode (progn (let ((inhibit-message (active-minibuffer-window))) (message #("DOOM Initializing core modules" 0 5 (face font-lock-comment-face)))))) (doom-initialize-core-modules) (let* ((init-p (and t (condition-case e (let (file-name-handler-alist) (load ... t ...)) ((debug doom-error) (signal ... ...)) ((debug error) (doom--handle-load-error e ... doom-private-dir)))))) (if init-p (progn (if doom-debug-mode (progn (let (...) (message #("DOOM Initializing user config" 0 5 (face font-lock-comment-face)))))) (if doom-modules (progn (maphash (function ...) doom-modules))) (run-hook-wrapped (quote doom-before-init-modules-hook) (function doom-try-run-hook)) (if doom-modules (progn (maphash (function ...) doom-modules))) (run-hook-wrapped (quote doom-init-modules-hook) (function doom-try-run-hook)) (condition-case e (let (file-name-handler-alist) (load (expand-file-name "config" doom-private-dir) t (quote nomessage))) ((debug doom-error) (signal (car e) (cdr e))) ((debug error) (doom--handle-load-error e (expand-file-name "config" doom-private-dir) doom-private-dir))) (load custom-file (quote noerror) (not doom-debug-mode))) nil)))
  (unwind-protect (progn (if doom-debug-mode (progn (let ((inhibit-message (active-minibuffer-window))) (message #("DOOM Initializing core modules" 0 5 (face font-lock-comment-face)))))) (doom-initialize-core-modules) (let* ((init-p (and t (condition-case e (let ... ...) (... ...) (... ...))))) (if init-p (progn (if doom-debug-mode (progn (let ... ...))) (if doom-modules (progn (maphash ... doom-modules))) (run-hook-wrapped (quote doom-before-init-modules-hook) (function doom-try-run-hook)) (if doom-modules (progn (maphash ... doom-modules))) (run-hook-wrapped (quote doom-init-modules-hook) (function doom-try-run-hook)) (condition-case e (let (file-name-handler-alist) (load ... t ...)) ((debug doom-error) (signal ... ...)) ((debug error) (doom--handle-load-error e ... doom-private-dir))) (load custom-file (quote noerror) (not doom-debug-mode))) nil))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer)))
  (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (if doom-debug-mode (progn (let ((inhibit-message ...)) (message #("DOOM Initializing core modules" 0 5 (face font-lock-comment-face)))))) (doom-initialize-core-modules) (let* ((init-p (and t (condition-case e ... ... ...)))) (if init-p (progn (if doom-debug-mode (progn ...)) (if doom-modules (progn ...)) (run-hook-wrapped (quote doom-before-init-modules-hook) (function doom-try-run-hook)) (if doom-modules (progn ...)) (run-hook-wrapped (quote doom-init-modules-hook) (function doom-try-run-hook)) (condition-case e (let ... ...) (... ...) (... ...)) (load custom-file (quote noerror) (not doom-debug-mode))) nil))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer))))
  (let ((temp-buffer (generate-new-buffer " *temp*"))) (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (if doom-debug-mode (progn (let (...) (message #("DOOM Initializing core modules" 0 5 (face font-lock-comment-face)))))) (doom-initialize-core-modules) (let* ((init-p (and t ...))) (if init-p (progn (if doom-debug-mode ...) (if doom-modules ...) (run-hook-wrapped ... ...) (if doom-modules ...) (run-hook-wrapped ... ...) (condition-case e ... ... ...) (load custom-file ... ...)) nil))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer)))))
  (progn (setq doom-init-modules-p t doom-modules nil) (let ((temp-buffer (generate-new-buffer " *temp*"))) (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (if doom-debug-mode (progn (let ... ...))) (doom-initialize-core-modules) (let* ((init-p ...)) (if init-p (progn ... ... ... ... ... ... ...) nil))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer))))))
  (if (or force-p (not doom-init-modules-p)) (progn (setq doom-init-modules-p t doom-modules nil) (let ((temp-buffer (generate-new-buffer " *temp*"))) (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (if doom-debug-mode (progn ...)) (doom-initialize-core-modules) (let* (...) (if init-p ... nil))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer)))))))
  doom-initialize-modules(nil)
  (progn (setq doom-init-p t) (if doom-debug-mode (progn (let ((inhibit-message (active-minibuffer-window))) (message #("DOOM Initializing Doom" 0 5 (face font-lock-comment-face)))))) (setq-default exec-path doom--initial-exec-path load-path doom--initial-load-path process-environment doom--initial-process-environment) (or (and (or (doom-load-autoloads-file doom-autoload-file) (ignore (warn "Doom's core autoloads file is missing"))) (or (doom-load-autoloads-file doom-package-autoload-file) (ignore (warn "Doom's package autoloads file is missing")))) (signal (quote doom-error) (list "Doom is in an incomplete state" "run 'bin/doom sync' on the command line to repair it"))) (and (or (display-graphic-p) (daemonp)) (doom-load-envvars-file doom-env-file (quote noerror))) (require (quote core-modules)) (autoload (quote doom-initialize-packages) "core-packages") (autoload (quote doom-initialize-core-packages) "core-packages") (eval-after-load (quote package) (function (lambda nil (require (quote core-packages))))) (eval-after-load (quote straight) (function (lambda nil (doom-initialize-packages)))) (add-hook (quote window-setup-hook) (function (lambda (&rest _) (add-hook (quote hack-local-variables-hook) (function doom-run-local-var-hooks-h)) (add-hook (quote after-change-major-mode-hook) (function doom-run-local-var-hooks-maybe-h) (quote append)) (add-hook (quote doom-first-input-hook) (function gcmh-mode)) (let ((fn (intern ...))) (fset fn (function (lambda ... ... ...))) (put (quote doom-first-input-hook) (quote permanent-local) t) (let ((--dolist-tail-- ...)) (while --dolist-tail-- (let ... ... ...)))) (let ((fn (intern ...))) (fset fn (function (lambda ... ... ...))) (put (quote doom-first-file-hook) (quote permanent-local) t) (let ((--dolist-tail-- ...)) (while --dolist-tail-- (let ... ... ...)))) (let ((fn (intern ...))) (fset fn (function (lambda ... ... ...))) (put (quote doom-first-buffer-hook) (quote permanent-local) t) (let ((--dolist-tail-- ...)) (while --dolist-tail-- (let ... ... ...)))))) nil nil) (add-hook (quote emacs-startup-hook) (function doom-load-packages-incrementally-h)) (add-hook (quote window-setup-hook) (function doom-display-benchmark-h) (quote append)) (doom-initialize-modules force-p))
  (if (or force-p (not doom-init-p)) (progn (setq doom-init-p t) (if doom-debug-mode (progn (let ((inhibit-message (active-minibuffer-window))) (message #("DOOM Initializing Doom" 0 5 (face font-lock-comment-face)))))) (setq-default exec-path doom--initial-exec-path load-path doom--initial-load-path process-environment doom--initial-process-environment) (or (and (or (doom-load-autoloads-file doom-autoload-file) (ignore (warn "Doom's core autoloads file is missing"))) (or (doom-load-autoloads-file doom-package-autoload-file) (ignore (warn "Doom's package autoloads file is missing")))) (signal (quote doom-error) (list "Doom is in an incomplete state" "run 'bin/doom sync' on the command line to repair it"))) (and (or (display-graphic-p) (daemonp)) (doom-load-envvars-file doom-env-file (quote noerror))) (require (quote core-modules)) (autoload (quote doom-initialize-packages) "core-packages") (autoload (quote doom-initialize-core-packages) "core-packages") (eval-after-load (quote package) (function (lambda nil (require (quote core-packages))))) (eval-after-load (quote straight) (function (lambda nil (doom-initialize-packages)))) (add-hook (quote window-setup-hook) (function (lambda (&rest _) (add-hook (quote hack-local-variables-hook) (function doom-run-local-var-hooks-h)) (add-hook (quote after-change-major-mode-hook) (function doom-run-local-var-hooks-maybe-h) (quote append)) (add-hook (quote doom-first-input-hook) (function gcmh-mode)) (let ((fn ...)) (fset fn (function ...)) (put (quote doom-first-input-hook) (quote permanent-local) t) (let (...) (while --dolist-tail-- ...))) (let ((fn ...)) (fset fn (function ...)) (put (quote doom-first-file-hook) (quote permanent-local) t) (let (...) (while --dolist-tail-- ...))) (let ((fn ...)) (fset fn (function ...)) (put (quote doom-first-buffer-hook) (quote permanent-local) t) (let (...) (while --dolist-tail-- ...))))) nil nil) (add-hook (quote emacs-startup-hook) (function doom-load-packages-incrementally-h)) (add-hook (quote window-setup-hook) (function doom-display-benchmark-h) (quote append)) (doom-initialize-modules force-p)))
  doom-initialize()
  eval-buffer(# nil "/home/mls/.emacs.d/init.el" nil t)  ; Reading at buffer position 2620
  load-with-code-conversion("/home/mls/.emacs.d/init.el" "/home/mls/.emacs.d/init.el" t t)
  load("/home/mls/.emacs.d/init" t t)
  #f(compiled-function () #)()
  command-line()
  normal-top-level()

似乎是我的库文件有问题吧?

好奇怪 我用没有插件的emacs装过也可以,byte-compile-file 也通过了。你是什么系统和什么版本的emacs?

你也是用doom sync吗

manjaro linux & emacs 26.3
doom sync
doom u
doom re

动作都做了,实在搞不定,我把 repos/calibredb.el 删了,又重来,还是没搞定。

换了一台 mac OS mojave & emacs-plus 26.3 测试,同样的错误。

能删除helm,然后在无 helm 的条件下安装吗?

目测可能是 helm 编译的问题,如果可以,请再把 helm 安装回来并用最新版,再测试一次。

如果可以的话,重装 helm 后,手动编译 helm 一次。

doom build 解决了。 :ok_hand: :ok_hand: :100:

由于master分支在melpa审核中,于是我开了develop分支继续开发:

https://github.com/chenyanming/calibredb.el/tree/develop

1.6.0 发布:

  1. 加强了 Library 的管理体验和错误处理,你可以在 *calibredb-search* 里面,调用 calibredb-library-listcalibredb-library-next and calibredb-library-previous 快速切换 library。calibredb-library-list 也支持在任何情况下切换 library。
  2. 增加mark和unmark功能,你可以在 *calibredb-search* 里面批量修改 metadata。
  3. 强化 calibredb-set-metadata-dispatchcalibredb-export-dispatch,支持 Arguments 的输入。
  4. 强化对图片文件的支持,*calibredb-entry* 里面显示的图片的本身而不是 cover page。
  5. 增加 calibredb-add-dir 支持添加一个文件夹的文件(只是一层文件夹,非递归)。

欢迎测试和反馈。

1 个赞

赞一个,有增强了插件功能。更新使用中。

1 个赞

我使用命令 calibredb-list ,报错:

Debugger entered--Lisp error: (wrong-type-argument consp nil)
  calibredb-candidates()
  calibredb-list()
  funcall-interactively(calibredb-list)
  call-interactively(calibredb-list record nil)
  command-execute(calibredb-list record)
  counsel-M-x-action("calibredb-list")
  ivy-call()

我的设置:

(use-package calibredb
  :quelpa (calibredb :fetcher github :repo "chenyanming/calibredb.el")
  :defer t
  :commands (calibredb-dispatch)
  :custom ((calibredb-root-dir (expand-file-name "~/Calibre Library"))))

这是我Edebug调试的结果