aagain
2022 年12 月 24 日 15:33
1
#+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安装好了。
3 个赞
Roife
2022 年12 月 24 日 15:56
2
如果只是为了用 org
,其实可以直接参考 doom 提供的安装教程:
#+TITLE: Getting Started Guide
#+STARTUP: nofold
GNU Emacs is one grand ol' adventure, let alone Doom Emacs. Before you start
you'll need to set up Emacs, Doom, and its packages, then learn how to take care
of your new puppy/operating system. This guide will walk you through installing,
using, configuring and troubleshooting all of these things, to smooth you into
your Emacs journey.
This guide will gloss over many technicalities so you can get up and running as
soon as possible. A more technical user manual is in the works for aspiring
contributors who want a deeper understanding of how Doom Emacs works.
#+begin_quote
If you feel like we've missed something, [[https://discord.gg/qvGgnVx][join us on our Discord server]] and let
us know!
#+end_quote
* Table of Contents :TOC_4:
- [[#install][Install]]
This file has been truncated. show original
Roife
2022 年12 月 24 日 15:58
3
建议先尝试用起来 Emacs,后面熟悉了再上 EAF,以防中途遇到一些问题直接劝退了
aagain
2022 年12 月 24 日 16:03
6
已经劝退了,不过我又坚持了一下。我发现eaf-pdf-viewer启动实在比pdf-tools快太多了。就是eaf对小白太不友好,网上完全没有任何教程。
aagain
2022 年12 月 25 日 15:39
7
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 . 查找文件
calibre可以导出catalog,就是bib文件。用calibredb就可以。
1 个赞
aagain
2022 年12 月 27 日 15:14
10
* zotero 安装和使用
zotero的安装比较简单,直接去官网下载相应的安装程序就好。
zotero和emacs配合使用有两种方法:
** 安装和使用zotxt 插件
如果使用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里面。
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-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 个赞
感谢,其实最初我的emacs配置了更沙黑体。但是因为改成用了doom, 现在还没改过来。
您用EAF吗?
我发现打开pdf后,再用快捷键o打开大纲模式后,不能用大纲来切换pdf页面,有点反人类。