# Emacs Editor ## Why emacs? 1. Explore the unknown, just for fun! 2. Org Mode 3. Lisp Coding 4. A top-level tutorial for Emacs(Chinese): 5. A Beginner's Guide to Emacs(Chinese): ## Screenshot ![](/_img/emacs-2024-01-07.webp) ## Useful Links - Framework: - key bindings: - source code: - docs: - module index: - LSP Client: - Emacs Wiki: - Awesome Emacs: - Chinese(rime) support: - modal editing: - : evil mode, enabled by default in doom-emacs. - ## Install or Update After deploying this nix flake, run the following command to install or update emacs: ```bash doom sync ``` when in doubt, run `doom sync`! ## Testing > via `Justfile` located at the root of this repo. ```bash # testing just emacs-test just emacs-purge just emacs-reload # clear test data just emacs-clean ``` ## Limits - It's too slow to start up and install(compile/build) packages. - I have to use emacs in daemon/client mode to avoid this issue. - It's too large in size, not suitable for servers. - So vim/neovim is still the best choice for servers. - Emacs's markdown-mode works not well with tables, see: - https://github.com/jrblevin/markdown-mode/issues/380 - I use git command frequently, but doomemacs only autoupdates status of git diff / treemacs when using magit. - I have to learn magit to avoid this issue... - GitHub's orgmode support is not well, Markdown is better for GitHub. - Use markdown for repo's README.md, and use orgmode for my personal notes and docs only. ## Cheetsheet Here is the cheetsheet related to my DoomEmacs configs. Please read vim's common cheetsheet at [../README.md](../README.md) before reading the following. ### Basics > Terminal(vterm) is useful in GUI mode, I use Zellij instead in terminal mode. | Action | Shortcut | | ---------------------- | ------------------------------------------------- | | Popup Terminal(vterm) | `SPC + o + t` | | Open Terminal | `SPC + o + T` | | Open file tree sidebar | `SPC + o + p` | | Frame fullscreen | `SPC + t + F` | | Exit | `M-x C-c` | | Execute Command | `M-x`(hold on `Alt`/`option`, and then press `x`) | | Eval Lisp Code | `M-:`(hold on `Alt`/`option`, and then press `:`) | ### Window Navigation | Action | Shortcut | | ------------------------------------------ | --------------------------------------------------------------------- | | Split a window vertically and horizontally | `SPC w v/s` | | Move to a window in a specific direction | `Ctrl-w + h/j/k/l` | | Move a window to a specific direction | `Ctrl-w + H/J/K/L` | | Move to the next window | `SPC w w` | | Close the current window | `SPC w q` | | Rebalance all windows | `SPC w =` | | Set window's width(columns) | `80 SPC w \|` (the Vertical line is escaped due to markdown's limits) | | Set window's height | `30 SPC w _ ` | ### File Tree - treemacs: - treemacs-evil: | Action | Shortcut | | ------------------------------------- | --------- | | Resize Treemacs's window | `>` & `<` | | Extra Wide Window | `W` | | Rename | `R` | | Delete File/Direcoty | `d` | | New File | `cf` | | New Directory | `cd` | | Go to parent | `u` | | Run shell command in for current node | `!` | | Refresh file tree | `gr` | | Copy project-path into pasteboard | `yp` | | Copy absolute-path into pasteboard | `ya` | | Copy relative-path into pasteboard | `yr` | | Copy file to another location | `yf` | | Move file to another location | `m` | | quit | `q` | And bookmarks: - Add bookmarks in treemacs: `b` - Show Bookmark List: `SPC s m` ### Splitting and Buffers | Action | Shortcut | | ----------------------- | ----------------- | | Buffer List | ` + ,` | | Save all buffers(Tab) | ` + b + S` | | Kill the current buffer | ` + b + k` | | Kill all buffers | ` + b + K` | ### Editing and Formatting | Action | Shortcut | | ------------------------------------------ | ------------------- | | Format Document | ` + cf` | | Code Actions | ` + ca` | | Rename | ` + cr` | | Opening LSP symbols | ` + cS` | | Show all LSP Errors | ` + c + x/X` | | Show infinite undo history(really useful!) | ` + s + u` | | Open filepath/URL at cursor | `gf` | | Find files by keyword in path | ` + ` | | Grep string in files (vertico + ripgrep) | ` + sd` | ### Image Preview(GUI mode only) Use `-`, `+` to resize the image, `r` to rotate the image. ### Search & replace ```bash SPC s p foo C-; E C-c C-p :%s/foo/bar/g RET Z Z ``` 1. `SPC s p`: search in project 1. `foo`: the keyword to search 1. `C-; E`: exports what you’re looking at into a new buffer in grep-mode 1. `C-c C-p` to run wgrep-change-to-wgrep-mode to make the search results writable. 1. `:%s/foo/bar/g RET`: replace in the current buffer(just like neovim/vim) 1. `Z Z`: to write all the changes to their respective files ### Projects > easily switch between projects without exit emacs! | Action | Shortcut | | -------------------------- | ------------- | | Switch between projects | `SPC + p + p` | | Browse the current project | `SPC + p + .` | | Add new project | `SPC + p + a` | ### Workspaces > Very useful when run emacs in daemon/client modes | Action | Shortcut | | --------------------------- | --------------------------- | | Switch between workspaces | `M-1/2/3/...`(Alt-1/2/3/..) | | New Workspace | `SPC + TAB + n` | | New Named Workspace | `SPC + TAB + N` | | Delete Workspace | `SPC + TAB + d` | | Display Workspaces bar blow | `SPC + TAB + TAB` | ### Magit > https://github.com/magit/magit Magit is a powerful tool that make git operations easy and intuitive. | Action | Shortcut | | ------------------------ | ------------------------ | | Open Magit | `C-x g` or `SPC + g + g` | | Switch branch | `SPC + g + b` | | Show buffer's commit log | `SPC + g + L` | Shortcuts in magit's pane: > When run `git commit` / `git add` / `git push` /... via magit, multiple Arguments can be set. Set > arguments won't trigger a git command immediately. Magit will try to run a git command only after > an Action key is pressed. | Action | Shortcut | | -------------------------------------------------- | --------------------------------------------- | | Quit the current Magit pane | `q` | | Show log | `l` | | Show current branch's log | `l + l` | | Show current reflog | `l + r` | | Commit | `c` | | Stage | `s` | | Unstage | `u` | | Push | `p` | | Pull | `f` | | Rebase | `r` | | Rebase Interactively | `r + i`, select on a commit, then `C-c + C-c` | | Stash | `z` | | Merge | `m` | | Fold/Unfold | `TAB` | | Show details of the current unit(commit/stage/...) | `` | KeyBinding full list: