DoomEmacs和EAF安装小白记录

DoomEmacs简单使用

建议在B站上看一下

  • Doom Emacs On Day One (Learn These Things FIRST!)这个教程
  • Emacs Doom Episode
  • 另外可以看一下B站上有个码码要洗手的up主,录了一系列DoomEmacs教程

利用Emacs --daemon 加快启动速度。

装完doomemacs最好在系统里面配置一下开机自动启动Emacs server, 以我的Ubuntu为例子,在Showapplication里面搜索Startup Applications,然后添加一个开机自动启动 /usr/local/bin/emacs --daemon

然后在.zshrc 或者是.bashrc中建立一个别名 alias emacs="emacsclient -c -a 'emacs'" 这样在终端中输入emacs, 就相当于打开一个emacsclient, 速度相当快,基本是秒开。

如果需要桌面端,利用下面的命令 sudo find / -iname emacs.desktop 找到emacs.desktop, 一般在/usr/local/share/applications/emacs.desktop. 进入这个目录,把emacs.desktop复制一份 sudo cp emacs.desktop emacsclient.desktop 然后用vim或者其他文本编辑器打开emacsclient.desktop. 改一下Name=Emacsclient, 并且 把

Exec=emacs %F这一行改成
Exec=/usr/local/bin/emacsclient -c -a 'emacs' %F

保存以后,你就能在桌面图标中找到emacsclient。这样就能够方便用鼠标启动emacsclient了。

Doomemacs 简单使用

SPC w v 左右分屏 SPC w c 关闭当前窗口 C-x k or SPC b k关闭当前buffer SPC . 查找文件

用Emacs的最主要目的, 或者说希望我的emacs配置成什么样子。

  • 利用zotero管理文献, Calibre管理电子书。因为不知到如何将Calibre的数据库导出,所以目前我把电子书也导入到zotero中,可惜的是zotero只支持pdf,对于epub和mobi无法支持。
  • 将zotero的库利用better bibtex插件自动和emacs连接,然后可以在emacs中查看zotero中的条目,能够浏览并注释zotero中的pdf文件。
  • 利用org-roam和org-noter记录文献阅读笔记和读书笔记。这些读书笔记能够自动连接到相应pdf的章节。并且笔记之间可以互相任意双向设置连接。
  • 利用emacs的latex插件或者quarto插件写东西。

calibre可以导出catalog,就是bib文件。用calibredb就可以。

1 个赞

* zotero 安装和使用

zotero的安装比较简单,直接去官网下载相应的安装程序就好。

zotero和emacs配合使用有两种方法:

** 安装和使用zotxt 插件

  1. 如果使用emacs和zotero只是为了插入引文的话,使用zotxt插件是最好。
;; [[file:packages.org::*Zotero][Zotero:1]]
(package! zotxt)
;; Zotero:1 ends here
  • 打开zotero,保证软件处于运行状态。 然后在编辑org文档时运行 M-x org-zotxt-mode 打开zotxt模式。 在需要插入文献的地方用快捷键 C-c “ i 就可以检索zotero文献库并插入条目了。

  • 如果想插入pandoc markdown格式的引文,可以用M-x zotxt-citekey-mode,再C-c “ k 就可以插入citekey 了,非常方便。

** 使用zotero的Better BibTeX插件

可能大部分人会选择这种方式,然后在emacs端口使用Citar, org-ref, org-roam-bibtex 插件配合使用。

  • 在zotero端,安装插件Better BibTeX.
  • 然后在zotero软件的配置里面,选择Better BibTeX配置一下,B站有相关教程
  • 然后在选择zotero软件,对你想导出的文献库目录点右键,选择导出文献库(Export Library),选择better bibTeX或者better bibLatex格式,选择你的目标目录就行。记得勾上Keep updated选项,这样zotero数据库改变后会自动同步。
  • 这里有个注意点,如果你导出后希望能够在emacs端直接能够打开PDF文件,需要包括file选项。默认在better BibTeX中有个地方可以输入你不想导出的项目。
  • 另外一个注意点是,如果你想导出note, 那么大概率,你在emacs中打开bib数据库时候,会出现"unbalanced parenthesis , 23323,123424"错误。对于这个错误刚开始我以为是我的配置文件出了问题,为此重装了emacs不下4次。结果偶然在helm-bibtex的网上,找到了答案, 对于Emacs不熟悉的小白,真的是一个小小的问题都会是不可逾越的障碍。
    • 真正原因是导出的bib文件出了问题。

    • 这个主要是因为你的zotero可能收集了网页的资料,zotero在抓取网页时候,会把网页内容存在note里面。如果你导出bib时候选择导出了note, 那么有一定概率因为网页中过多的字符和括号,导致大括号不匹配。

    • 解决方法:你可以用emacs打开你的bib文件,找到不匹配的项目:

    • emacs中输入 M-: (goto char xxx)

    • 比如在你的这个例子中, xxx就是你的报错数字23323, 。然后emacs会自动定位到不匹配的括号。

    • 然后找到这个条目的的最后,在这个条目的最后加上几个},一旦匹配上,你的报错数字就会消失(一般都是note部分出了问题,在note项后加上}就行,根据我测试,多几个}好像不会有问题)。

    • 如果报错数字出现变化,那是因为还有其他条目也有错误,继续上面的操作,直到所有报错消失就可以了。

    • 另外导出bib时候可以不要导出note项目,可能会避免上述问题。

** 在emacs端的配置

主要是要告诉emacs你导出的bib文件在那里? 把下面的文件路径改成你自己的路径就可以了。

(setq org-cite-csl-styles-dir "~/Zotero/styles")

(setq! bibtex-completion-bibliography '("~/Documents/org/roam/biblibrary/references.bib"))

(setq! citar-bibliography '("~/Documents/org/roam/biblibrary/references.bib"))

(setq! bibtex-completion-library-path '("~/Documents/org/roam/biblibrary/")
       bibtex-completion-notes-path "~/Documents/org/roam/")

(setq! citar-library-paths '("~/Documents/org/roam/biblibrary/")
       citar-notes-paths '("~/Documents/org/roam/"))


(after! pdf-view
  ;; open pdfs scaled to fit page
  (setq-default pdf-view-display-size 'fit-width)
  (add-hook! 'pdf-view-mode-hook (evil-colemak-basics-mode -1))
  ;; automatically annotate highlights
  (setq pdf-annot-activate-created-annotations t
        pdf-view-resize-factor 1.1)
   ;; faster motion
 (map!
   :map pdf-view-mode-map
   :n "g g"          #'pdf-view-first-page
   :n "G"            #'pdf-view-last-page
   :n "N"            #'pdf-view-next-page-command
   :n "E"            #'pdf-view-previous-page-command
   :n "e"            #'evil-collection-pdf-view-previous-line-or-previous-page
   :n "n"            #'evil-collection-pdf-view-next-line-or-next-page
   :localleader
   (:prefix "o"
    (:prefix "n"
     :desc "Insert" "i" 'org-noter-insert-note
     ))
 ))

;;   (after! PACKAGE
;;     (setq x y))

(after! org-ref
        (setq
         bibtex-completion-notes-path "~/Documents/org/roam/"
         bibtex-completion-bibliography "~/Documents/org/roam/biblibrary/references.bib"
         bibtex-completion-pdf-field "file"
         bibtex-completion-notes-template-multiple-files
         (concat
          "#+TITLE: ${title}\n"
          "#+ROAM_KEY: cite:${=key=}\n"
          "* TODO Notes\n"
          ":PROPERTIES:\n"
          ":Custom_ID: ${=key=}\n"
          ":NOTER_DOCUMENT: %(orb-process-file-field \"${=key=}\")\n"
          ":AUTHOR: ${author-abbrev}\n"
          ":JOURNAL: ${journaltitle}\n"
          ":DATE: ${date}\n"
          ":YEAR: ${year}\n"
          ":DOI: ${doi}\n"
          ":URL: ${url}\n"
          ":END:\n\n"
          )
         ))

(use-package! org-ref
    :config
    (setq
         org-ref-completion-library 'org-ref-ivy-cite
         org-ref-get-pdf-filename-function 'org-ref-get-pdf-filename-helm-bibtex
         org-ref-default-bibliography (list "~/Documents/org/roam/biblibrary/references.bib")
         org-ref-bibliography-notes "~/Documents/org/roam/bibnotes.org"
         org-ref-note-title-format "* TODO %y - %t\n :PROPERTIES:\n  :Custom_ID: %k\n  :NOTER_DOCUMENT: %F\n :ROAM_KEY: cite:%k\n  :AUTHOR: %9a\n  :JOURNAL: %j\n  :YEAR: %y\n  :VOLUME: %v\n  :PAGES: %p\n  :DOI: %D\n  :URL: %U\n :END:\n\n"
         org-ref-notes-directory "~/Documents/org/roam/"
         org-ref-notes-function 'orb-edit-notes
    ))

 (use-package! org-roam-bibtex
  :after (org-roam)
  :hook (org-roam-mode . org-roam-bibtex-mode)
  :config
  (setq org-roam-bibtex-preformat-keywords
   '("=key=" "title" "url" "file" "author-or-editor" "keywords"))
  (setq orb-templates
        '(("r" "ref" plain (function org-roam-capture--get-point)
           ""
           :file-name "${slug}"
           :head "#+TITLE: ${=key=}: ${title}\n#+ROAM_KEY: ${ref}

- tags ::
- keywords :: ${keywords}

\n* ${title}\n  :PROPERTIES:\n  :Custom_ID: ${=key=}\n  :URL: ${url}\n  :AUTHOR: ${author-or-editor}\n  :NOTER_DOCUMENT: %(orb-process-file-field \"${=key=}\")\n  :NOTER_PAGE: \n  :END:\n\n"

           :unnarrowed t))))

(after! helm
  ;; I want backspace to go up a level, like ivy
  (add-hook! 'helm-find-files-after-init-hook
    (map! :map helm-find-files-map
          "<DEL>" #'helm-find-files-up-one-level)))

;; Actually start using templates
(after! org-capture
  ;; Firefox
  (add-to-list 'org-capture-templates
               '("P" "Protocol" entry
                 (file+headline +org-capture-notes-file "Inbox")
                 "* %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n\n%?"
                 :prepend t
                 :kill-buffer t))
  (add-to-list 'org-capture-templates
               '("L" "Protocol Link" entry
                 (file+headline +org-capture-notes-file "Inbox")
                 "* %? [[%:link][%(transform-square-brackets-to-round-ones \"%:description\")]]\n"
                 :prepend t
                 :kill-buffer t))
  ;; Misc
  (add-to-list 'org-capture-templates
         '("a"               ; key
           "Article"         ; name
           entry             ; type
           (file+headline +org-capture-notes-file "Article")  ; target
           "* %^{Title} %(org-set-tags)  :article: \n:PROPERTIES:\n:Created: %U\n:Linked: %a\n:END:\n%i\nBrief description:\n%?"  ; template
           :prepend t        ; properties
           :empty-lines 1    ; properties
           :created t        ; properties
           ))
)



(use-package! org-protocol-capture-html
  :after org-protocol
  :config
  (add-to-list 'org-capture-templates
               '("w"
                 "Web site"
                 entry
                 (file+headline +org-capture-notes-file "Website")  ; target
                 "* %a :website:\n\n%U %?\n\n%:initial")
               )
  )

不要问我为啥这么配置,我完全不知道,只是从别人那里copy过来而已。上面文件途径的地方,改成你自己的路径名就行。这些配置是基于Doom Emacs, 放在config.el里面就行。

多谢!回头我试试啊。

* 中英文混打:OS输入法管理包 smart-input-source

由于经常要混合输入中英文,尤其使用的是evil模式。默认的输入分切换会非常不方便。参见(重新设计)中英文混打:OS输入法管理包 smart-input-source - #198,来自 goumao, 这个帖子安装sis包。会记忆你在输入模式的输入法,一旦ESC到normal模式则会自动切换到英文输入法,非常方便。

Doom emacs中安装的话, 在packages.el,写入下面代码。

(package! sis)

在config.el中写入,下面代码。我这里是Ubuntu linux系统,使用的是fcitx5输入法.

(use-package! sis
  ;; :hook
  ;; enable the /context/ and /inline region/ mode for specific buffers
  ;; (((text-mode prog-mode) . sis-context-mode)
  ;;  ((text-mode prog-mode) . sis-inline-mode))

  :config
  ;; For MacOS
  ;; (sis-ism-lazyman-config

  ;;  ;; English input source may be: "ABC", "US" or another one.
  ;;  ;; "com.apple.keylayout.ABC"
  ;;  "com.apple.keylayout.US"

  ;;  ;; Other language input source: "rime", "sogou" or another one.
  ;;  ;; "im.rime.inputmethod.Squirrel.Rime"
  ;;  "com.sogou.inputmethod.sogou.pinyin")
  (sis-ism-lazyman-config "1" "2" 'fcitx5)

  ;; enable the /cursor color/ mode
  (sis-global-cursor-color-mode t)
  ;; enable the /respect/ mode
  (sis-global-respect-mode t)
  ;; enable the /context/ mode for all buffers
  (sis-global-context-mode t)
  ;; enable the /inline english/ mode for all buffers
  (sis-global-inline-mode t)
  )

然后使用doom sync 安装就行。 安装注意:如果你使用了前面emacs --daemon. 需要重启一下系统,否则emacs会报错,找不到sis。

1 个赞

* EAF-pdf-viewer

由于使用Emacs主要是为了org mode管理日常 和org roam来记录笔记。阅读文献和电子书是必不可少的。目前Emacs内置的DocView需要把PDF转换为图片格式,运行非常缓慢。另外主流的就是PDF tools,这个package已经内置在Doom emacs中。可以直接通过init.el配置安装。功能还可以,但是运行的时候,发现还是有点卡顿。在知乎上看到一个大侠Jousimies(好像也在本站,不知道是否同一人,写了很多关于Emacs工作流的文章,是一个很热心的大侠),介绍了eaf-pdf-viewer,他非常推荐这个pdf浏览器。结果我在度娘和谷哥上一搜索,发现几乎没有什么关于这个浏览器的教程,仅在油管上发现了作者的一段介绍视频。尝试安装了几次,遇到一些问题。最后终于能够运行,打开pdf文件确实非常快。

** 安装

eaf-pdf-viewer安装分成2部分。第一部分要先安装EAF框架,然后安装pdf-viewer。在EAF框架下,有很多有意思的应用,有兴趣的可以去看看。由于框架和应用是分开的,如果安装时候仅注意应用的说明,会有问题。一些应用的注意事项实际在EAF框架的Github的faq里面。

  1. EAF 框架安装

关于EAF的框架安装,建议看一下Github上的说明。有中文格式,虽然简略,至少没有语言障碍。 emacs-application-framework/README.zh-CN.md at master · emacs-eaf/emacs-application-framework · GitHub 安装方法做的非常贴心,基本照着说明,clone下来后,运行install-eaf.py, 就会自动安装EAF框架需要的包插件什么的,非常方便。在安装的时候,你就可以选择EAF下面的应用。

不方便的地方是:各个应用的使用方法介绍非常简略。因为我用的是Doom Emacs, 和普通的emacs在安装包的时候,略有不同。所以一开始很是困惑,不知道应该如何配置。安装成功后又发现默认的快捷键不能使用,最后在EAF的faq里面发现,如果使用evil模式的话,需要特殊配置一下。

(add-to-list 'load-path "~/.emacs.d/site-lisp/emacs-application-framework/")

(require 'eaf)

 (require 'eaf-markdown-previewer)
 (require 'eaf-rss-reader)
 (require 'eaf-pdf-viewer)
 (require 'eaf-image-viewer)
 (require 'eaf-browser)
 (require 'eaf-org-previewer)
 (require 'eaf-mindmap)
 (require 'eaf-org)
 (defun eaf-org-open-file (file &optional link)
  "An wrapper function on `eaf-open'."
  (eaf-open file))
;;请使用 M-x eaf-org-export-to-pdf-and-open
;; use `emacs-application-framework' to open PDF file: link
 (add-to-list 'org-file-apps '("\\.pdf\\'" . eaf-org-open-file))


 (require 'eaf-evil)
;; eaf会把C-SPC当成evil的leader-key,在你加载'eaf-evil之后使用eaf时就需要在eaf中键入C-SPC使用evil leader下的键。
;; 我们只需要将这个键设置为 SPC或你自己的evil-leader-key即可
 (setq eaf-evil-leader-key "SPC")
;; (add-to-list 'TeX-command-list '("XeLaTeX" "%`xelatex --synctex=1%(mode)%' %t" TeX-run-TeX nil t))
;; (add-to-list 'TeX-view-program-list '("eaf" eaf-pdf-synctex-forward-view))
;; (add-to-list 'TeX-view-program-selection '(output-pdf "eaf"))
  • 本来doom emacs中的配置都会在(use-package!)下面整齐排列,但是经过我反复尝试,发现只有这样放在我的config.el中,才能正常使用eaf。而且在安装时候必须要把eaf-evil这一项,放在所有的eaf应用后面,否则会出现找不到配置文件的错误。

  • 如果哪位大虾能够帮忙告知一下在doom emacs下如何优雅的配置eaf框架,帮忙告知一下,不胜感激。

  • 另外我这样安装后,如果用emacs(gui)运行,则正常。如果是用emacs --daemon然后用emacs client运行的话,就会出现下述报错,但是目前并不影响运行。原因不明。

dbus-call-method: D-Bus error: "org.freedesktop.DBus.Error.UnknownMethod", "Object does not exist at path “/org/eaf/wayland”"
1 个赞

EAF 不支持 deamon 模式。

1 个赞

顺便翻译一下eaf-pdf-viewer的readme. 主要是为了自我学习。 奇怪这个emacs-china的网站,但是却不支持org格式的文件。

eaf-pdf-viewer

*** 加载pdf-viewer应用 (Load application)

首先安装EAF框架,然后把下面的代码放到你自己的emacs配置config中:

(add-to-list 'load-path "~/.emacs.d/site-lisp/emacs-application-framework/")
(require 'eaf)
(require 'eaf-pdf-viewer)

*** LaTeX配置(LaTeX config)(似乎这个eaf-pdf-viwer可以作为latex的实时双向浏览器,也就是你编译latex代码时候,可以实时预览生成的pdf,而且在pdf中双击可以实时回到代码进行编辑,如果真是这样,对于编译latex将会非常方便。)

(add-to-list 'TeX-command-list '("XeLaTeX" "%`xelatex --synctex=1%(mode)%' %t" TeX-run-TeX nil t))
(add-to-list 'TeX-view-program-list '("eaf" eaf-pdf-synctex-forward-view))
(add-to-list 'TeX-view-program-selection '(output-pdf "eaf"))

双击鼠标左键,可以回到相应代码进行编辑。

*** 深色背景模式 (Dark mode)

默认是和你的emacs背景颜色(emacs-background-color)相同。 如果不喜欢这个默认设定,可以通过下面的代码修改。

(setq eaf-pdf-dark-mode nil)

因为这个网站似乎不支持org 表格格式,只能上传个图了。

j

1 个赞

这个表格对齐你能忍? 换这个字体吧:

1 个赞

感谢,其实最初我的emacs配置了更沙黑体。但是因为改成用了doom, 现在还没改过来。

我也用的doom,和字体不冲突。

您用EAF吗? 我发现打开pdf后,再用快捷键o打开大纲模式后,不能用大纲来切换pdf页面,有点反人类。

没有。我用mac,好像EAF不支持macos吧。

支持,只是没有linux完美

请问大侠:

  1. EAF使用evil模式后,如何在大纲模式切换页面,Enter键位不能用?只能用eaf-pdf-ouline-jump命令。
  2. 在阅读pdf时候,o是打开大纲模式,能不能设成o打开大纲模式,再按一下o退出大纲模式?
  3. 另外在eaf中记忆pdf文件位置和页面位置的变量是什么?如何在org-capture或者org-roam-capture中调用他们,方便记录位置和跳转。 谢谢!

evil模式看wiki

按键自己绑定就好了

org和pdf交互用 eaf-interleave.el

1 个赞

大佬, 关于 eaf-interleave.el 我有个问题, eaf-interleave-add-note 这是不是个 bug, org-back-to-heading 并没有跳转到那个 entry 下, 而是当前 point 所在的 entry 下. 这是我丑陋的修改.

     (let ((property-list (org-map-entries (lambda ()
                                         (let ((url (org-entry-get-with-inheritance eaf-interleave--url-prop))
                                               (page (org-entry-get-with-inheritance eaf-interleave--page-note-prop)))
-                                          (cons url page)))))
+                                          (list url (org-entry-beginning-position) page)))))
           point)
       (catch 'find-property
         (dolist (property property-list)
           (when (and (string= (car property) url)
-                     (string= (cdr property) (number-to-string page)))
+                     (string= (nth 2 property) (number-to-string page)))
             (widen)
-            (org-back-to-heading t)
+            (goto-char (nth 1 property))
+            (org-back-to-heading)
             (eaf-interleave--narrow-to-subtree)
             (org-show-subtree)
             (org-cycle-hide-drawers t)

但我怀疑是不是我对用法理解有误. 还想问是不是 eaf-interleave.el 不止适用于 pdf 也适用于网页?

这个是社区开发者开发的功能,我平常很少用,欢迎发送补丁

您是说 PR?