DoomEmacs和EAF安装小白记录

#+title: DoomEmacs和EAF安装小白记录

  • 为什么用Emacs 我是一个Vim使用者,本来是不愿意用其它编辑器的。但是因为不是计算机出身,实在没有本事把vim改成自己想要的样子。所以只能改想其它办法。偶然看到网上org-mode的介绍,发现它提供的功能真是我所需要,而且居然是开源软件,最后还发现有个Evil模式,居然能够全功能模拟vim的功能,据Evil模式的开发者说,他能够用EVil模式完全实现Practical Vim这本书中所有的列子。这真正是我需要的样子。而且看到大佬居然能够配合zotero,实现知识和笔记管理。加上它的org管理日程模式,所有这些功能比任何的商业软件都要齐全。可以这么说,粗粗了解后,我觉得这就是我要的软件。所以毫不犹豫的投入Emacs的怀抱。 然而Emacs入门对于非计算机出身的人来讲,真是大大的不容易。刚开始我对着B站的从零开始配置Emacs教程,一点点开始。起先还不错,很快随着各种包的加入,Emacs的启动变得越来越慢。而且各种快捷键需要自己一点点摸索设置,简直是头大无比。本来想坚持下去,后来发现如果你要熟练Emacs,没有几年功夫,恐怕很难调教成自己需要的样子。我虽然想要一辆好车,但是我总不能从头去学造车吧。 所以就投入了DoomEmacs的怀抱。原因有几点:
  • 启动快速
  • 完全支持Evil模式
  • 所有的主要功能都有合理而且完整的快捷键设置。(这一点对小白尤其重要,因为自己摸索去设置快捷键实在是一件琐碎无比的事情)

我本来以为DoomEmacs会是开箱即用,其实却不是那么回事,其实任何开源软件对于小白来讲都是一件非常困难的事情。这中间实在走了很多弯路。因为没有计算机编程背景,所以也不能对开源社区有啥贡献。就把我这个老白的折腾记录一下,给像我一样的小白们参考一下。

  • Emacs 编译安装 我的系统是Ubuntu22.04.1 Gnome 42.5 Windowing System Wayland

‘’’

sudo apt install build-essential texinfo libx11-dev libxpm-dev libjpeg-dev libpng-dev libgif-dev libtiff-dev libgtk2.0-dev libncurses-dev gnutls-dev libgtk-3-dev
sudo apt install -y libjansson4 libjansson-dev
sudo apt install libgccjit-11-dev libgccjit0

‘’’

  • 这里面请大家参考一下上面的网址,因为我的系统之前折腾过所以可能有的依赖包已经安装。
  • 因为后面需要安装EAF,需要json支持,所以要安装libjansoon包,同时据说应该要Enabling Native Compilation, 所以需要libgccjit包。
  • 安装libgccjit包是一件麻烦事,因为不同的gcc版本对应的不同的包。所以一定要先看一看你的gcc --version ,是什么version就把上面的11改成什么。在上面网址的教程中直接安装了gcc-10, 同时export CC = gcc-10. 是没有必要的。 实际上我用gcc-10编译了一次,结果Emacs启动奇慢无比。后来改成gcc11编译后就好了,非常奇怪。
  • 然后在终端进入你刚才解压的Emacs28.2目录夹,用下面的命令编译安装Emacs. ‘’’
./autogen.sh
./configure --without-compress-install --with-native-compilation --with-json --with-mailutils
make -j 4
make install

‘’’

  • Emacs 默认安装在/usr/local/bin/emacs
  • 这样就算是把Emacs安装好了。
1 个赞

如果只是为了用 org,其实可以直接参考 doom 提供的安装教程:

建议先尝试用起来 Emacs,后面熟悉了再上 EAF,以防中途遇到一些问题直接劝退了

DoomEmacs的安装

  • 首先你需要科学上网。因为DoomEmacs是非常依赖github网站的。虽然可以通过改hosts什么的,或者有的地方能够间歇性上github. 我本来以为只要不停的gitclone, 等着网路偶尔通畅的时候,能够把Doom安装完。因为之前折腾vim的YouCompleteMe时候就是这种办法。但是这个对于Doom是完全行不通的。即使是你的网络稍微差一点,如果安装过程稍微中断几次,那么你的Doom就会出现各种网上都搜不到答案的奇怪问题。所以如果你的Doom出现什么奇怪问题。最好的办法就是删除.doom.d和.emacs.d目录夹。 按照Doom官网说明重新说明重新安装,多半奇怪问题就消失了。

  • 如果你没法科学上网,可以试试这个帖子的方法用 ghproxy 加速 Doom Emacs 安装, 不过我没有测试过。

  • 将export PATH=$HOME/.emacs.d/bin:$PATH 加入到你的.bashrc 或者.zshrc配置中,具体看你用的终端。

  • 另外在配置你的init.el和packages.el后,一定运行Doom Sync. 如果某个包在git过程中曾经中断,一定在init.el取消掉,然后运行Doom Sync和Doom purge. 然后再在init.el中配置重新安装,否则会出非常奇怪的问题。我推测是gitclone不完整,而系统又认为你已经clone完成了。

  • 我觉得解决Doom对于github的依赖的问题,其实可以把Doom中涉及的包全部打包成一个文件,然后再放在网盘上,随需要就直接把全部Doom涉及的包下载下来。这样就会大大方便Doom的安装,不过因为在国外大概没有这边的网络问题。而且开源软件都是志愿者的义务劳动,实在是无法强求的。我曾经在doom网站上留言说这个项目太过依赖github网站,应该给个选择从emacs源中下载相应的包。开发者说,不是他们太依赖github,是因为这些包碰巧都在github.

  • 因为我要用到org-roam-bibtex, 而Doom内置init.el 的biblio, 和helm提供的功能老是出现问题。所以只能从网上大佬的配置中copy过来配置,后面我贴上来。

1 个赞

thanks

已经劝退了,不过我又坚持了一下。我发现eaf-pdf-viewer启动实在比pdf-tools快太多了。就是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。

* 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”"

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