Tintingoo's Blog

My Doom Emacs configuration file -- org version

Tintingo / 2022-02-16


Doom Emacs configuration

https://vde05-1256575153.cos.ap-beijing.myqcloud.com/img/doom-emacs-bw-light.svg

在使用了 Doom Emacs 一段时间后,我将自己积累的配置文件集合到这个 org 文件中,以便进行统一管理。接触过 Doom Emacs 的朋友肯定知道,在 Doom Emacs 中,用户配置文件主要可以分为三个:

init.el

defines which of the existing Doom modules are loaded. A Doom module is a bundle of packages, configuration and commands, organized into a unit that can be toggled easily from this file.

packages.el

defines which packages should be installed, beyond those that are installed and loaded as part of the enabled modules.

config.el

contains all custom configuration and code.

由于一些信息在网页中无法显示,可以对比我的 dotfiles 中的 DoomConfig.org 文件进行查看。主要有两点,在此进行说明:

1. 开头的信息


:DOC-CONFIG:
# Tangle by default to config.el, which is the most common case
#+property: header-args:emacs-lisp :tangle config.el
#+property: header-args :mkdirp yes :comments no
#+startup: fold
:END:

加上此信息后,emacs 就知道此文件中的 elisp 代码默认发送到 config.el 文件中去。

2. 代码块中的信息

; #+begin_src emacs-lisp :tangle packages.el
; (package! rime)
; #+end_src

其中的 emacs-lisp :tangle packages.el 的作用就是当执行 org-babel-tangle 命令之后将代码块中的内容发送到 packages.el 文件中。

当我们修改完此org文件并保存后,执行以下两个步骤可以将elisp代码块发送到对应的文件中:

  1. 光标位于 #+property: header-args:emacs-lisp :tangle config.el 行,按下 C-c C-c

  2. M-x org-babel-tangle

References

Emacs config is an art, and I have learned a lot by reading through other people's config files, and from many other resources. These are some of the best ones (several are also written in org mode). You will find snippets from all of these (and possibly others) throughout my config.

Note: a lot of manual configuration has been rendered moot by using Emacs Doom, which aggregates a well-maintained and organized collection of common configuration settings for performance optimization, package management, commonly used packages (e.g. Org) and much more.

Doom config file overview

Doom Emacs uses three config files:

  • init.el defines which of the existing Doom modules are loaded. A Doom module is a bundle of packages, configuration and commands, organized into a unit that can be toggled easily from this file.

  • packages.el defines which packages should be installed, beyond those that are installed and loaded as part of the enabled modules.

  • config.el contains all custom configuration and code.

There are other files that can be loaded, but theses are the main ones. The load order of different files is defined depending on the type of session being started.

All the config files are generated from this Org file, to try and make its meaning as clear as possible. All package! declarations are written to packages.el, all other LISP code is written to config.el.

Config file headers

We start by simply defining the standard headers used by the three files. These headers come from the initial files generated by doom install, and contain either some Emacs-LISP relevant indicators like lexical-binding, or instructions about the contents of the file.

generate init.el file headers

init.el
;;; init.el -*- lexical-binding: t; -*-

;; DO NOT EDIT THIS FILE DIRECTLY
;; This is a file generated from a literate programing source file located at
;; https://gitlab.com/zzamboni/dot-doom/-/blob/master/doom.org
;; You should make any changes there and regenerate it from Emacs org-mode
;; using org-babel-tangle (C-c C-v t)

;; This file controls what Doom modules are enabled and what order they load
;; in. Remember to run 'doom sync' after modifying it!

;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's
;;      documentation. There you'll find a "Module Index" link where you'll find
;;      a comprehensive list of Doom's modules and what flags they support.

;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or
;;      'C-c c k' for non-vim users) to view its documentation. This works on
;;      flags as well (those symbols that start with a plus).
;;
;;      Alternatively, press 'gd' (or 'C-c c d') on a module to browse its
;;      directory (for easy access to its source code).

generate package.el file headers

packages.el
;; -*- no-byte-compile: t; -*-
;;; $DOOMDIR/packages.el

;; DO NOT EDIT THIS FILE DIRECTLY
;; This is a file generated from a literate programing source file located at
;; https://gitlab.com/zzamboni/dot-doom/-/blob/master/doom.org
;; You should make any changes there and regenerate it from Emacs org-mode
;; using org-babel-tangle (C-c C-v t)

;; To install a package with Doom you must declare them here and run 'doom sync'
;; on the command line, then restart Emacs for the changes to take effect -- or
;; use 'M-x doom/reload'.

;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror:
;;(package! some-package)

;; To install a package directly from a remote git repo, you must specify a
;; `:recipe'. You'll find documentation on what `:recipe' accepts here:
;; https://github.com/raxod502/straight.el#the-recipe-format
;;(package! another-package
;;  :recipe (:host github :repo "username/repo"))

;; If the package you are trying to install does not contain a PACKAGENAME.el
;; file, or is located in a subdirectory of the repo, you'll need to specify
;; `:files' in the `:recipe':
;;(package! this-package
;;  :recipe (:host github :repo "username/repo"
;;           :files ("some-file.el" "src/lisp/*.el")))

;; If you'd like to disable a package included with Doom, you can do so here
;; with the `:disable' property:
;;(package! builtin-package :disable t)

;; You can override the recipe of a built in package without having to specify
;; all the properties for `:recipe'. These will inherit the rest of its recipe
;; from Doom or MELPA/ELPA/Emacsmirror:
;;(package! builtin-package :recipe (:nonrecursive t))
;;(package! builtin-package-2 :recipe (:repo "myfork/package"))

;; Specify a `:branch' to install a package from a particular branch or tag.
;; This is required for some packages whose default branch isn't 'master' (which
;; our package manager can't deal with; see raxod502/straight.el#279)
;;(package! builtin-package :recipe (:branch "develop"))

;; Use `:pin' to specify a particular commit to install.
;;(package! builtin-package :pin "1a2b3c4d5e")

;; Doom's packages are pinned to a specific commit and updated from release to
;; release. The `unpin!' macro allows you to unpin single packages...
;;(unpin! pinned-package)
;; ...or multiple packages
;;(unpin! pinned-package another-pinned-package)
;; ...Or *all* packages (NOT RECOMMENDED; will likely break things)
;;(unpin! t)

generate config.el file headers

config.el
;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-

;; DO NOT EDIT THIS FILE DIRECTLY
;; This is a file generated from a literate programing source file located at
;; https://gitlab.com/zzamboni/dot-doom/-/blob/master/doom.org
;; You should make any changes there and regenerate it from Emacs org-mode
;; using org-babel-tangle (C-c C-v t)

;; Place your private configuration here! Remember, you do not need to run 'doom
;; sync' after modifying this file!

;; Some functionality uses this to identify you, e.g. GPG configuration, email
;; clients, file templates and snippets.
;; (setq user-full-name "John Doe"
;;      user-mail-address "john@doe.com")

;; Doom exposes five (optional) variables for controlling fonts in Doom. Here
;; are the three important ones:
;;
;; + `doom-font'
;; + `doom-variable-pitch-font'
;; + `doom-big-font' -- used for `doom-big-font-mode'; use this for
;;   presentations or streaming.
;;
;; They all accept either a font-spec, font string ("Input Mono-12"), or xlfd
;; font string. You generally only need these two:
;; (setq doom-font (font-spec :family "monospace" :size 12 :weight 'semi-light)
;;       doom-variable-pitch-font (font-spec :family "sans" :size 13))

;; There are two ways to load a theme. Both assume the theme is installed and
;; available. You can either set `doom-theme' or manually load a theme with the
;; `load-theme' function. This is the default:
;; (setq doom-theme 'doom-one)

;; If you use `org' and don't want your org files in the default location below,
;; change `org-directory'. It must be set before org loads!
;; (setq org-directory "~/org/")

;; This determines the style of line numbers in effect. If set to `nil', line
;; numbers are disabled. For relative line numbers, set this to `relative'.
;; (setq display-line-numbers-type t)

;; Here are some additional functions/macros that could help you configure Doom:
;;
;; - `load!' for loading external *.el files relative to this one
;; - `use-package!' for configuring packages
;; - `after!' for running code after a package has loaded
;; - `add-load-path!' for adding directories to the `load-path', relative to
;;   this file. Emacs searches the `load-path' when you load packages with
;;   `require' or `use-package'.
;; - `map!' for binding new keys
;;
;; To get information about any of these functions/macros, move the cursor over
;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k').
;; This will open documentation for it, including demos of how they are used.
;;
;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how
;; they are implemented.

Customized variables

Doom does not recommend the Emacs customize mechanism:

Note: do not use M-x customize or the customize API in general. Doom is designed to be configured programmatically from your config.el, which can conflict with Customize’s way of modifying variables.

All necessary settings are therefore set by hand as part of this configuration file. The only exceptions are "safe variable" and "safe theme" settings, which are automatically saved by Emacs in custom.el, but this is OK as they don't conflict with anything else from the config.

Doom modules

This code is written to the init.el to select which modules to load. Written here as-is for now, as it is quite well structured and clear.

packages.el
(doom! :input
       ;;chinese
       ;;japanese
       ;;layout            ; auie,ctsrnm is the superior home row

       :completion
       company           ; the ultimate code completion backend
       ;;helm              ; the *other* search engine for love and life
       ;;ido               ; the other *other* search engine...
       ;;ivy               ; a search engine for love and life
       vertico           ; the search engine of the future

       :ui
       ;;deft              ; notational velocity for Emacs
       doom              ; what makes DOOM look the way it does
       doom-dashboard    ; a nifty splash screen for Emacs
       doom-quit         ; DOOM quit-message prompts when you quit Emacs
       ;;(emoji +unicode)  ; 🙂
       hl-todo           ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
       ;;hydra
       indent-guides     ; highlighted indent columns
       ;;ligatures         ; ligatures and symbols to make your code pretty again
       ;;minimap           ; show a map of the code on the side
       modeline          ; snazzy, Atom-inspired modeline, plus API
       ;;nav-flash         ; blink cursor line after big motions
       ;;neotree           ; a project drawer, like NERDTree for vim
       ophints           ; highlight the region an operation acts on
       (popup +defaults)   ; tame sudden yet inevitable temporary windows
       ;;tabs              ; a tab bar for Emacs
       ;; treemacs          ; a project drawer, like neotree but cooler
       ;;unicode           ; extended unicode support for various languages
       vc-gutter         ; vcs diff in the fringe
       vi-tilde-fringe   ; fringe tildes to mark beyond EOB
       ;;window-select     ; visually switch windows
       workspaces        ; tab emulation, persistence & separate workspaces
       ;;zen               ; distraction-free coding or writing
       ;; (tabs +centaur-tabs)

       :editor
       (evil +everywhere); come to the dark side, we have cookies
       file-templates    ; auto-snippets for empty files
       fold              ; (nigh) universal code folding
       (format +onsave)  ; automated prettiness
       ;;god               ; run Emacs commands without modifier keys
       ;;lispy             ; vim for lisp, for people who don't like vim
       ;;multiple-cursors  ; editing in many places at once
       ;;objed             ; text object editing for the innocent
       ;;parinfer          ; turn lisp into python, sort of
       ;;rotate-text       ; cycle region at point between text candidates
       snippets          ; my elves. They type so I don't have to
       ;;word-wrap         ; soft wrapping with language-aware indent

       :emacs
       dired             ; making dired pretty [functional]
       electric          ; smarter, keyword-based electric-indent
       ;;ibuffer         ; interactive buffer management
       undo              ; persistent, smarter undo for your inevitable mistakes
       vc                ; version-control and Emacs, sitting in a tree

       :term
       eshell            ; the elisp shell that works everywhere
       ;;shell             ; simple shell REPL for Emacs
       ;;term              ; basic terminal emulator for Emacs
       ;;vterm             ; the best terminal emulation in Emacs

       :checkers
       syntax              ; tasing you for every semicolon you forget
       ;;(spell +flyspell) ; tasing you for misspelling mispelling
       ;;grammar           ; tasing grammar mistake every you make

       :tools
       ;;ansible
       ;;debugger          ; FIXME stepping through code, to help you add bugs
       ;;direnv
       ;;docker
       ;;editorconfig      ; let someone else argue about tabs vs spaces
       ein               ; tame Jupyter notebooks with emacs
       (eval +overlay)     ; run code, run (also, repls)
       ;;gist              ; interacting with github gists
       lookup              ; navigate your code and its documentation
       lsp               ; M-x vscode
       magit             ; a git porcelain for Emacs
       ;;make              ; run make tasks from Emacs
       ;;pass              ; password manager for nerds
       ;;pdf               ; pdf enhancements
       ;;prodigy           ; FIXME managing external services & code builders
       ;;rgb               ; creating color strings
       ;;taskrunner        ; taskrunner for all your projects
       ;;terraform         ; infrastructure as code
       ;;tmux              ; an API for interacting with tmux
       ;;upload            ; map local to remote projects via ssh/ftp

       :os
       (:if IS-MAC macos)  ; improve compatibility with macOS
       ;;tty               ; improve the terminal Emacs experience

       :lang
       ;;agda              ; types of types of types of types...
       ;;beancount         ; mind the GAAP
       ;;cc                ; C > C++ == 1
       ;;clojure           ; java with a lisp
       ;;common-lisp       ; if you've seen one lisp, you've seen them all
       ;;coq               ; proofs-as-programs
       ;;crystal           ; ruby at the speed of c
       ;;csharp            ; unity, .NET, and mono shenanigans
       ;;data              ; config/data formats
       ;;(dart +flutter)   ; paint ui and not much else
       ;;dhall
       ;;elixir            ; erlang done right
       ;;elm               ; care for a cup of TEA?
       emacs-lisp        ; drown in parentheses
       ;;erlang            ; an elegant language for a more civilized age
       ;;ess               ; emacs speaks statistics
       ;;factor
       ;;faust             ; dsp, but you get to keep your soul
       ;;fsharp            ; ML stands for Microsoft's Language
       ;;fstar             ; (dependent) types and (monadic) effects and Z3
       ;;gdscript          ; the language you waited for
       ;;(go +lsp)         ; the hipster dialect
       ;;(haskell +dante)  ; a language that's lazier than I am
       ;;hy                ; readability of scheme w/ speed of python
       ;;idris             ; a language you can depend on
       ;;json              ; At least it ain't XML
       ;;(java +meghanada) ; the poster child for carpal tunnel syndrome
       ;;javascript        ; all(hope(abandon(ye(who(enter(here))))))
       ;;julia             ; a better, faster MATLAB
       ;;kotlin            ; a better, slicker Java(Script)
       latex             ; writing papers in Emacs has never been so fun
       ;;lean              ; for folks with too much to prove
       ;;ledger            ; be audit you can be
       ;;lua               ; one-based indices? one-based indices
       markdown          ; writing docs for people to ignore
       ;;nim               ; python + lisp at the speed of c
       ;;nix               ; I hereby declare "nix geht mehr!"
       ;;ocaml             ; an objective camel
       org               ; organize your plain life in plain text
       ;;php               ; perl's insecure younger brother
       ;;plantuml          ; diagrams for confusing people more
       ;;purescript        ; javascript, but functional
       (python
        +lsp
        +conda
        +pyright)          ;beautiful is better than ugly
       ;;qt                ; the 'cutest' gui framework ever
       ;;racket            ; a DSL for DSLs
       ;;raku              ; the artist formerly known as perl6
       ;;rest              ; Emacs as a REST client
       ;;rst               ; ReST in peace
       ;;(ruby +rails)     ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"}
       ;;rust              ; Fe2O3.unwrap().unwrap().unwrap().unwrap()
       ;;scala             ; java, but good
       ;;(scheme +guile)   ; a fully conniving family of lisps
       sh                ; she sells {ba,z,fi}sh shells on the C xor
       ;;sml
       ;;solidity          ; do you need a blockchain? No.
       ;;swift             ; who asked for emoji variables?
       ;;terra             ; Earth and Moon in alignment for performance.
       ;;web               ; the tubes
       ;;yaml              ; JSON, but readable
       ;;zig               ; C, but simpler

       :email
       ;;(mu4e +org +gmail)
       ;;notmuch
       ;;(wanderlust +gmail)

       :app
       ;;calendar
       ;;emms
       ;;everywhere        ; *leave* Emacs!? You must be joking
       ;;irc               ; how neckbeards socialize
       ;;(rss +org)        ; emacs as an RSS reader
       ;;twitter           ; twitter client https://twitter.com/vnought

       :config
       ;;literate
       (default +bindings +smartparens)
       )

General configuration

My user information. Some functionality uses this to identify you, e.g. GPG configuration, email clients, file templates and snippets.

(setq user-full-name "Tintingo"
      user-mail-address "norery@163.com")
(setq doom-font (font-spec :family "Source Code Pro" :size 14))

make "starting "look" progress" disappear

(advice-add 'ispell-lookup-words :around
            (lambda (orig &rest args)
              (shut-up (apply orig args))))

Visual, session and window settings

Basic UI settings

(setq doom-theme 'doom-solarized-light)

(setq display-line-numbers-type 'relative)

(setq ein:output-area-inlined-images t)

;; (setq initial-frame-alist (quote ((fullscreen . maximized))))   ;; 默认全屏

;; 修改当前行的高亮背景色。 M-x 运行describe-char -> Face: h1-line -> Background: #0D343E 可以看到这个值。通过(customize this face) 修改,被保存在 ~/.emacs.d/.local/custom.el 文件
'(hl-line ((t (:background "#0D343E" ))))

;; ;;光标在括号内时就高亮包含内容的两个括号
(defadvice show-paren-function (around fix-show-paren-function activate)
  (cond ((looking-at-p "\\s(") ad-do-it)
        (t (save-excursion
             (ignore-errors (backward-up-list))
             ad-do-it)))
  )

Dashborad settngs

I made a super simple set of Doom-Emacs custom splash screens by combining a Doom logo with the word "Emacs" rendered in the Doom Font. You can see them at https://gitlab.com/zzamboni/dot-doom/-/tree/master/splash (you can also see one of them at the top of this file). I configure it to be used instead of the default splash screen. It took me all of 5 minutes to make, so improvements are welcome!

If you want to choose at random among a few different splash images, you can list them in alternatives.

You can find other splash images at the jeetelongname/doom-banners GitHub repository.

;; (let ((alternatives '("doom-emacs-bw-light.svg"
;;                       ;; "doom-emacs-flugo-slant_out_purple-small.png"
;;                       ;; "doom-emacs-flugo-slant_out_bw-small.png"
;;                       )))
;;   (setq fancy-splash-image
;;         (concat doom-private-dir "splash/"
;;                 (nth (random (length alternatives)) alternatives))))

I eliminate all but the first two items in the dashboard menu, since those are the only ones I still use sometimes.

;; (setq +doom-dashboard-menu-sections (cl-subseq +doom-dashboard-menu-sections 0 2))

nayn-mode

(package! nyan-mode)
;; 彩虹猫进度条
(use-package nyan-mode
  :if (not (boundp 'awesome-tray-mode))
  :ensure t
  :hook (after-init . nyan-mode)
  :config
  (setq nyan-wavy-trail t
		nyan-animate-nyancat t))

Customize KeyBinding

Install an evil tutorial package and use M-x and evil-tutor-start to open it. Can We find some new tips which can help us using Emacs more efficiently?

(package! evil-tutor)
  • use jj to exit the evil insert mode, default is jk.

(use-package! evil-escape
        :init
        (setq evil-escape-key-sequence "jj")
        )
  • use SPC b j/k to move to the next/previous buffer, the default is SPC b n/p.

(map! :leader
      :desc "Like M-x"          :n        "SPC"   #'execute-extended-command
      :desc "Next buffer"       :n        "bj"    #'next-buffer
      :desc "Previous-buffer"   :n        "bk"    #'previous-buffer
      ;; Switch to TAB + number
      :desc "switch to TAB 1"   :n        "1"       #'+workspace/switch-to-0
      :desc "switch to TAB 2"   :n        "2"       #'+workspace/switch-to-1
      :desc "switch to TAB 3"   :n        "3"       #'+workspace/switch-to-2
      ;; kill shortcuts key bindings.
      :nv "b[" nil
      :nv "b]" nil
      )

(map! :map org-mode-map
      :desc "org previous heading"      :n      "SPC k"    #'org-previous-visible-heading
       ;; can not use "SPC-j"
      :desc "org next headng"           :n      "SPC j"    #'org-next-visible-heading
  )

;; 以当前文件的可视行为单位进行移动.
(evil-global-set-key 'motion "j" 'evil-next-visual-line)
(evil-global-set-key 'motion "k" 'evil-previous-visual-line)

;; use =command k=  to move five lines up
;; use =command j= to move five lines down
(map!
      :desc "move next 5 line"       :nvi          "C-j"    #'(lambda () (interactive) (forward-line 5))
      :desc "move previous 5 line"   :nvi          "C-k"    #'(lambda () (interactive) (forward-line -5)))

;;;;;;;; Ein KeyBinding
(map! :map ein:notebook-mode-map
      :leader
      :desc "ein:insert above"         :n    "ea"        #'ein:worksheet-insert-cell-above-km
      :desc "ein:insert below"         :n    "eb"        #'ein:worksheet-insert-cell-next-km
      :desc "ein:Run all"              :n    "ell"       #'ein:worksheet-execute-all-cells
      :desc "ein:To next cell"         :n    "ej"        #'ein:worksheet-goto-next-input-km
      :desc "ein:To prev cell"         :n    "ek"        #'ein:worksheet-goto-prev-input-km
      :desc "ein:Change cell type"     :n    "eu"        #'ein:worksheet-change-cell-type-km
      :desc "ein:Restart session"      :n    "err"       #'ein:notebook-restart-session-command-km
      :desc "ein:kill cell"            :n    "ed"        #'ein:worksheet-kill-cell-km
      :desc "ein:interrupt kernel"     :n    "ez"        #'ein:notebook-kernel-interrupt-command-km
      :desc "ein:toggle output"        :n    "et"        #'ein:worksheet-toggle-output-km
      :desc "ein:show output"          :n    "ev"        #'ein:worksheet-set-output-visibility-all-km
      :desc "ein:login"                :n    "el"        #'ein:login
      :desc "ein:stop"                 :n    "ep"        #'ein:stop
      :desc "ein:open notebook"        :n    "eo"        #'ein:notebook-open-km
      )

Now, The describability of SPC bk is not update in Which-Key, How to update it?

Org mode

(setq org-directory "~/Documents/OrgType/")

Doom Emacs's org module already install many packages about org mode, and we can check them in org/README.org.

UI Settings

org-superstar

(package! org-superstar)
(use-package org-superstar
  :ensure t
  :after org
  :hook (org-mode . org-superstar-mode)
  :custom
    ( with-eval-after-load  'org-superstar)
    (org-superstar-headline-bullets-list '("☰" "☷" "✿" "☭"))
    (org-superstar-cycle-headline-bullets nil )
    ;; This is usually the default, but keep in mind it must be nil
    (setq org-hide-leading-stars nil)
    ;; This line is necessary.
    (setq org-superstar-leading-bullet ?\s)
    ;; If you use Org Indent you also need to add this, otherwise the
    ;; above has no effect while Indent is enabled.
    (setq org-indent-mode-turns-on-hiding-stars nil)

  )

org-appear

Org mode provides a way to toggle visibility of hidden elements such as emphasis markers, links, etc. by customising specific variables, e.g., org-hide-emphasis-markers. However, it is currently not possible to do this interactively and on an element-by-element basis. This package, inspired by org-fragtog, enables automatic visibility toggling depending on cursor position. Hidden element parts appear when the cursor enters an element and disappear when it leaves.

Install org-appear in package.el file:

(package! org-appear)

The package can be enabled interactively or automatically on org-mode start-up:

(use-package org-appear
  :ensure t
  :after org
  :hook (org-mode . org-appear-mode)
  :custom
    ;; allow to toggle links
    (org-appear-autolinks t)
    ;; allow to toggle subscripts and superscripts
    (org-appear-autosubmarkers t)
    ;; toggle Org entitites
    (org-appear-autoentities t)
    ;; toggle keywords in org-hidden-keywords
    (org-appear-autokeywords t)
    ;; if greater than 0, toggle with an idle delay
    (org-appear-delay 0.5)
  )
;; (add-hook 'org-mode-hook 'org-appear-mode)

org-ol-tree

Speaking of headlines, a nice package for viewing and managing the heading structure has come to my attention – org-ol-tree.

(package! org-ol-tree
  :recipe (:host github :repo "Townk/org-ol-tree")
  )

We can use -Spc m O- to open the org-ol-tree.

(use-package! org-ol-tree
  :commands org-ol-tree)
(map! :map org-mode-map
      :after org
      :localleader
      :desc "open org-ol-tree" "O" #'org-ol-tree)

Chinese support

(package! rime)
(use-package rime
        :init
        :custom
        (default-input-method "rime")
        (rime-librime-root "~/.emacs.d/librime/dist") )

** 简介
pyim-basedict 是 pyim 输入法的默认词库词库数据来源为 libpinyin 项目

 https://github.com/libpinyin/libpinyin/releases (Data files we need is in release tarball)

注意这个词库的词条量大概在 10 万左右是一个 *比较小* 的词库只能确保 pyim
可以正常工作如果用户想让 pyim 更加顺手需要添加其它附加词库具体添加词库的
方式可以参考 pyim 的 README.

** 安装和使用
1. 配置 melpa 源参考http://melpa.org/#/getting-started
2. M-x package-install RET pyim-basedict RET
3. 在 Emacs 配置文件中比如: ~/.emacs添加如下代码
   #+BEGIN_EXAMPLE
   (pyim-basedict-enable)
   #+END_EXAMPLE
st")
        (setq rime-user-data-dir "~/Library/Rime/")
        ;;; 具体参考 mode-line-mule-info 默认值,其中可能有其它有用信息
        (setq mode-line-mule-info '((:eval (rime-lighter))))
        (setq rime-show-candidate 'posframe)
        (rime-posframe-properties
                (list :background-color "#073642"
                 :foreground-color "#839496"
                 :internal-border-width 1))
        (setq rime-cursor "˰")
        (setq rime-disable-predicates
              '(rime-predicate-evil-mode-p
                rime-predicate-after-alphabet-char-p
                rime-predicate-prog-in-code-p
                ))
        )

pangu-spacing

PanGu-Spcing 方便地解决了我在中英文混杂输入的一个痛点,它会自动在中英文之间插入空格。

(package! pangu-spacing)
(require 'pangu-spacing)
(global-pangu-spacing-mode 1)
(setq pangu-spacing-real-insert-separtor t)

Python

(use-package conda
  :ensure t
  :init
  (setq conda-anaconda-home (expand-file-name "~/opt/anaconda3"))
  (setq conda-env-home-directory (expand-file-name "~/opt/anaconda3")))

Emacs Ipython Notebook

load-path

;; 递归遍历加载路径 test
  (defun add-subdirs-to-load-path(dir)
    "Recursive add directories to `load-path`."
    (let ((default-directory (file-name-as-directory dir)))
      (add-to-list 'load-path dir)
      (normal-top-level-add-subdirs-to-load-path)))

  (let ((gc-cons-threshold most-positive-fixnum)
        (file-name-handler-alist nil))
    ;; 将配置文件添加进load-path
    (add-subdirs-to-load-path "~/.doom.d/etc/")
;;     ;; (unless (file-exists-p "~/.config/.evan-emacs.d/")
;;     ;;   (mkdir "~/.config/.evan-emacs.d"))
;;     ;; (add-subdirs-to-load-path "~/.config/.evan-emacs.d/"))

    )
;; 所有配置自带的模块
(require 'init-config)
  • Test