- Use EmacsClient and set up a daemon. Your Emacs experience will improve a lot and you will save a lot of time.
- For better experience, use Emacs’s inner file manager.
- Get LSP up and running. It will turn Emacs into a fully-featured modern IDE. Emacs supports LSP for almost every language.
- Try to avoid terminal version of Emacs when possible.
- Use Doom Emacs’s built-in helps to understand how things work under the hood and change them to suit your needs.
SPC h k
tells you how key combinations translate to Emacs commands.SPC h w
helps you find keyboard shortcuts for different commands.SPC h v
lets you see what’s inside variables and change them.SPC h f
tells you about functions and where they are defined.SPC h b b
to see a list of all keybindings
- Github doesn’t render org files very well. It’s best that you clone this repository and open it in Emacs.
- See other files in this repository as well. Currently additional instructions for Go, and Python are also offered. If there’s anything missing, or you can suggest a better workflow, make sure to contribute.
C
- “Control” keyM
- “Alt” or “Option” keyS
- “Super” or “Command” keySPC
- “Space” key
SPC f s
for saving the current fileSPC :
for entering a commandSPC q q
to close EmacsSPC f D
to delete this file
SPC p p
to open a projectSPC SPC
to open a file in a projectSPC o p
to open the file explorerSPC o E
to open the shell (eshell) in fullscreenSPC o e
to open the shell (eshell) in a popup windowSPC f r
recently visited filesSPC p r
recently visited files in a projectM-x projectile-discover-projects-in-directory
to find projects within given folder using ProjectileM-x projectile-discover-projects-in-search-path
to find projects in the folder defined by theprojectile-project-search-path
variable using Projectile
- Dired (Directory Editor) is how you interfaces with a directory
- Press
C-x d
to open dired. - Use
RET
to go to a folder or open a file. - Use
-
for going one folder back - Use
+
for creating a new directory - Use
d
to mark the files for deletion, pressx
to delete. - Use
M
to change permissions - Use
o
to sort by modes. - Use
O
to change the owner. - Use
m
to mark andu
to unmark files or directories. U
to unselect all- Use
t
to invert the selection. t
to switch between files and directories- Use
C
to copy. - Use
R
to move. - Move with
h
,j
,k
,l
- Toggle
(
for simple view SPC .
to create or find a file- Use either arrow keys, or hold
C-
withh
,=j=,=k=, andl
to choose between options.
- Use either arrow keys, or hold
*
to select all directories.C
copy to another windowR
move to another windowdired-do-what-i-mean-target
set to truei
to edit file/dir name
- Buffers are a special concept in emacs they can be terminals, files, directories, etc
SPC b b
to open another buffer- workspace buffer
SPC b B
you can see all the bufferSPC ,
to switch buffers (its an alias)SPC SHIFT ,
to switch to all buffersSPC b X
You can create a scratch bufferSPC b s
to save and name it
SPC w v
window split verticallySPC w s
window split horizontallySPC w w
to switch windowsSPC w q
to close window, frame, quit EMACS if last frameSPC w +
andSPC w -
to increase and decrease window heightSPC w >
andSPC w <
to increase and decrease window width- You can use vim motion keys to navigate between open windows for example
SPC w H
moves the window to the left. - Windows are panes in your screen
SPC TAB n
New workspaceSPC TAB N
Newly named workspaceSPC TAB [
Previous workspaceSPC TAB ]
Next workspaceSPC TAB d
Remove workspaceSPC TAB R
Restore last sessionM-1
Switch to workspace 1M-2
Switch to workspace 2 and so forth.
SPC f p
to open the config.- To add a package, add the package to
.doom.d/package.el
- Then close and
doom refresh
- Then go to
.doom.d/config.el
to configure the package def-package!
is a macro you can use to configure packagesspace h help
you can look up method man pages:init
is used for setting the package up:config
to set configuration after the package has been initialized:after
lets you set which package it should load after
- You can use
:after!
to configure packages that are already there
f
and then the letter you want to navigate to.,
will go backward;
will go forward after that “find”
t
to find and move cursor to the character before what you’ve searched.v
puts you in visual mode. You can select text by withv t some-char-you-navigate-to
orv f some-char-you-navigate-to
;
to jump to the next find,
to jump to the previous ones
to snipe
- Evil-snipe lets you go to all the occurrences in your document
g s SPC
to use avy and going to a certain word in file.t
is the same thing except for a character you want to jump to before the one you inserts
to do a double character search- Evil-snipe will remember your last search so
,
and;
will navigate F
orT
to go backwardsg s SPC
and then select the letter that avy gives you to navigate to that spot- These letters are on your home row so they are easy to click
SPC h v
for variable, to set the avy variable to search all open windowsavy-all-windows
lets you search in all windows open.
- You can remove a word with
g s SPC select-one-letter x select-the-removal-spot
- You can use
X
to stay in your original spot of search
- You can use
- You can go
g s space select-one-letter i select-the-correction-spot
to correct the spelling of the search- Install ispell on your OS first
- You can
yank
a word from one place to another withg s SPC select-one-letter y select-the-correction-spot-to-paste
- Use
t
to “teleport” the word from one place to anotherg s SPC select-one-letter t select-the-correction-spot-to-teleport
- Using evil-multiedit (known as multiple cursors in other IDEs) you can make selections and then edit those selections simultaneously. To do this uncomment
multiple-cursors
in yourinit.el
. M-d
will select the current word, press this again and it will find another occurrenceM-D
will find an occurrence upward- You can use a visual selection to select multiple words as well.
R
will select all occurrences.CTRL n
for next selectionCTRL p
for previous.- Exclude matches with
RET
- You can make an edit and the changes will be reflected to all the selections.
- Org mode gives you the ability to structure your document
*
for a h1**
for an h2 and so on- You can
TAB
a section to fold a subtree (hide it) - You can use
SHIFT TAB
to cycle through folded states CTRL return
to create a headline of the same typeM-arrow up
lets you shift the position of the sectionM-h
promotes a headline to the next levelM-l
demotes- You can create lists
- one
- 2
- wooo
- 3
SPC m l
to add a link to an org page- You can add
::
to specify a heading or a line number - You can paste http links as well
- You can “link” some text with specific code
SPC m l
elisp: (+ 2 2) when you click the link, emacs will evaluate the expression - Show My Agenda
- List Files in directory
SPC n l
stores a link to a particular headline
SPC i s
for inserting code snippets- Example:
(+ 2 3 4 5)
- Example:
C-c C-c
to execute the code.SPC m '
to edit inside the babel in another buffer.- Results will show up in a
##+RESULTS
header - This feature is called Babel
- One snippet can consume the output of another snippet
- You can create your own snippets in the following directory:
~/.doom.d/snippets/
- Create a task by prefixing any heading with
TODO
DONE
means the task is done- You can create your custom key words by changing this variable:
org-todo-keywords
- remember you can get to your variables through
SPC h v
(M-x counsel-describe-variable) - These values are already set in Doom:
((sequence "TODO(t)" "PROJ(p)" "STRT(s)" "WAIT(w)" "HOLD(h)" "|" "DONE(d)" "KILL(k)") (sequence "[ ](T)" "[-](S)" "[?](W)" "|" "[X](D)"))
- remember you can get to your variables through
SPC m t
to change a status of a todoSHIFT left
andSHIFT right
can be used to change the status of a todo as well.- If you finish a task with a command, org mode will add a date that you “closed” the task.
SPC o a t
to open the agenda -> todo listq
to quitorg-agenda-files
is a variable you can set to filter which files agenda searches for todos in.
SHIFT up
andSHIFT down
will toggle the priority of tasksorg-fancy-priorities
gives you fancy looking priorities
- Tags can be attached to any headlines
SPC m q
to tag a headline- Example:
- TODO play more games :fun:
- Tags are hierarchical so nested headings will be tagged with the parent header tag
org-tag-sparce-tree
will search for headings that only have a specific tag
SPC m o
is used for setting a property.
- You can use categories to change the label in agenda view.
- If you want to keep track of your habits using org mode, you can set the
STYLE
property to habit.
- Two types of lists, ordered and unordered lists
SHIFT right
andSHIFT left
can be used to change the type of lists.
- You can also change an unordered list by changing the first item to 1. and then typing
C-c C-c
and vice versa.
- [ ] This is still todo
- [-] This is in progress
- [X] This is a done task
- [-] Task 1
- [X] Task 2
- You can do this by adding [/] to the heading and pressing
C-c C-c
- You can’t assign a tag or a priority
C-c C-z
to insert a note for a heading in org mode.
- Note taken on [2020-12-18 Fri 21:52]
Like this!
C-c C-c
to insert a tag for a heading in org mode.
- Magit is enabled by default in Doom Emacs’s init.el
SPC g g
shows Magit status page- Most commands are done from the status page
- Use tab to expand headlines in the status page
?
in Magit’s status page for a nice list of available commands and help,q
to close this help page- Open diff view for a file with
TAB
- Press
s
under “Unstaged changes” to stage a changeu
to undo a changec
to commit
b s
for branch and spinoff to create another branch, rewinding the commits you made to masterb b
to switch branches
t t
to create a tag, default place is the commit you are currently selectingV
to select a change in a diff andx
to discard that change.s
to stagec
to commit, you canq
to quit the commit screenP
to push and thenp
to your remote oru
to a another remote
- Forge is installed in emacs doom
@
for forge- Set up forge with
M-x forge-pull
- the first time you will get a token from Github
@ c p
to create a pull request with forge- select the base branch
- then select the target branch
- then provide a short description
CTRL c CTRL c
to finish the pull request
- Now there will be a
pull requests
tab
lsp-update-server
select a language server to update.lsp-workspace-folders-add
to interactively set a folder as an LSP workspace.lsp-workspace-folders-remove
to interactively unset a folder as an LSP workspace.lsp-workspace-restart
to restart your workspace. Especially useful after activating a virtual environment.
SPC c c
to run a compile command (or a test, or any other command in the current directory)SPC c C
to repeat the command aboveSPC c d
jump to var/func/… definitionsC o
(evil-jump-backward
) Go back to your last position in the jump listC i
(evil-jump-forward
) Go forward in the jump list
SPC c D
see references to var/func/…SPC c e
to evaluate the current buffer or region (when nothing is selected, equivalent to runningSPC c c
and writinggo run
+ the file name.)SPC c f
see references to var/func/…SPC c k
jump to documentationSPC c r
rename all references and definitions for the var/func at point in all project filesSPC c s
send to REPLSPC c x
see all LSP diagnosticslsp-ui-imenu
to navigate definitions in your codeflycheck-list-errors
to see the errors detected by LSP.
- Set up vterm in your init.el file.
SPC o T
for opening vtermSPC o t
for opening vterm in a popup window
- Set up neotree or treemacs in your init.el file.
SPC o p
for opening neotree or treemacs
SPC X
to capture (the new thing gets captured to a single file but that’s fine since we can easily refile it.)SPC m r r
to refile
These keybindings only work after installing org-roam. To install org-roam edit your init.el
file and add (org +roam2)
in its designated place. Watch this video to understand what org-roam is.
SPC n r f
Find an existing node or create a new one.SPC n r i
Insert a link to another node.SPC n r r
Toggle backlinks paneSPC m m o t
Add a roam tag.SPC m m o a
Add a roam alias.
Code folding helps with code readability. First, make sure fold
is not commented in your init.el
file then move your cursor to the definition of a class or a function and try the following:
z a
Toggle the fold at point.z m
Close all the folds.z r
Open all the folds.z j
Next folded region.z k
Previous folded region.
- TBD, for now see Michael Neuper’s blog post which has videos as well.
- First uncomment
bidi
under:input
ininit.el
- If your cursor moves at the wrong direction, see this evil-mode bug and toggle evil-mode by pressing
C-z
if neccessary. - To enable the bidi-mode everywhere and change the font of Persian/Arabic texts, you can use the snippet below:
(+bidi-global-mode 1)
(setq +bidi-want-smart-fontify nil)
(set-fontset-font t 'arabic "Sahel") ; Works for Persian as well
- Zaiste Programming’s Doom Emacs Tutorial
- This org file is mostly from the notes taken from the series above by ianjones.us
- Doom Emacs Documentation
- DistroTube’s YouTube Video
- A very nice collection of Doom Emacs tips by yusbk
- [ ] LSP
- [ ] Org Roam
- [ ] abbrev-mode