This is my private doom emacs configuration. Specifically configured for Javascript, Python, C++, Rust, and Go.
- Screenshot
- Installation
- Features
- Configuration
- Appendix
- FAQ
- How to manage tab-width or indent?
- How to use Magit Forge?
- Why my jdtls java fails at booting?
- Why sometimes the floating error boxes (flycheck posframe) do not disappear?
- How to use forge?
- How to use emacs-everywhere?
- When you do `doom upgrade` and get too many open files issue on MacOS.
- When open in ssh tty, clipetty emit: `Opening output file: Permission denied, /dev/pts/3`.
- Method 1: Use brew cask(Recommended). Pick emacs-mac or emacs-plus.
brew tap railwaycat/emacsmacport brew install --cask emacs-mac brew tap d12frosted/emacs-plus brew install emacs-plus@28 --with-native-comp # create alias in /Applications if needed ln -Fs `sudo find /usr/local/Cellar/emacs-* -name "Emacs.app"` /Applications/Emacs.app
# Ubuntu emacs
sudo add-apt-repository ppa:kelleyk/emacs
sudo apt-get update
sudo apt install emacs27
# Arch
sudo pacman -S emacs
# Clone Doom Emacs
rm -r ~/.emacs.d
git clone --depth 1 https://github.com/hlissner/doom-emacs ~/.config/emacs
# Clone my config
git clone https://github.com/ztlevi/doom-config ~/.config/doom
~/.config/emacs/bin/doom install
This Emacs configuration is written for Emacs 25.1+ on Mac OS X 10.11+ and Linux Arch. Windows users may need to tweak the config for themselves.
Install dependencies including search tools, utils, and linters.
# search tool
brew install ripgrep grep exa zstd fd
brew install --HEAD universal-ctags/universal-ctags/universal-ctags
# utils
brew install sqlite hub gpg2 coreutils gnu-tar mplayer direnv libtool git-delta
# language
brew install shellcheck aspell languagetool clang-format google-java-format
sudo pacman --needed --noconfirm -S sqlite ripgrep fd wmctrl exa languagetool zstd ctags git-delta
Note: for windows users, aspell is used instead. ripgrep can be installed via choco
# Install linuxbrew
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
# Then follow the macos installaion guide except the Cask part
- For vterm
brew install cmake
sudo apt install libvterm-dev libtool-bin
Install CJK fonts for your linux machines if you use them. https://github.com/googlefonts/noto-cjk
npm install -g cspell prettier
pip3 install --upgrade pylint gnureadline black cpplint
# macos
brew install go
# arch
sudo pacman --needed --noconfirm -S go
Language Server Protocol: Install the lsp for your languages. A few examples are listed below.
You can always do M-x lsp-install-server
to install the specific language server. But I prefer to script them and install them at once.
# python
npm i -g pyright
pip3 install --user debugpy
# Java
# Java 11 is needed for latest eclipse.jdt.ls to function
# M-x lsp-install-server -> jdtls
# Bash
npm i -g bash-language-server
# C++ use clangd
brew install llvm
# Run ~M-x dap-codelldb-setup~ to download the ~codelldb~ vscode extension.
# You can refer the debug template here https://github.com/ztlevi/gtest-cpp-demo/blob/main/.vscode/launch.json
# Rust
rustup update
rustup component add rls rust-analysis rust-src
# Javascript
npm i -g typescript typescript-language-server
# Vue
npm install vue-language-server -g
# gopls
go install golang.org/x/tools/gopls@latest
# Run ~M-x dap-go-setup~ to download the vscode debug extension.
For MacOS, according to the discussion here, the following codes will speed up Emacs GUI startup time.
defaults write org.gnu.Emacs Emacs.ToolBar -string no
defaults write org.gnu.Emacs Emacs.ScrollBar -string no
defaults write org.gnu.Emacs Emacs.MenuBar -string no
An in-depth list of features, how to use them, and their dependencies.
How to configure this module, including common problems and how to address them.
I have to use ssh with tmux on server. And terminal emacs becomes my daily driver. Checkout Alacritty keybinding config to make you terminal compatible with Meta keys.
- Include a list of ways this module changes default behavior
You can use `setq-hook!` to set the tab-width explicitly.
(after! cc-mode
(setq-hook! 'cc-mode-hook tab-width 2 c-basic-offset 2))
I prefer to use a global `~/.editorconfig`, it can be override by a project local `.editorconfig`. Checkout mine. `setq-hook!` wii be overrided by editorconfig since editorconfig gains the highest priority.
- Create a token on Github https://github.com/settings/tokens with repo, user and admin:org permissions.
If using GitHub enterprise / for business you also need the
write:discussion
,read:discussion
scope. - Put the following credential in
/.authinfo.gpg
(This location is configured byauth-sources
).machine api.github.com login yourlogin^forge password MYTOKENGOESHERE machine api.github.com login yourlogin^code-review password MYTOKENGOESHERE
See https://magit.vc/manual/ghub/Creating-a-Token.html#Creating-a-Token and https://magit.vc/manual/forge/Token-Creation.html#Token-Creation
Sometimes it caused by legacy cache under lsp-java-workspace-dir
. Delete that folder and restart lsp.
Call posframe-delete-all
to get rid of it.
Take a look at this manual. See how to create token for forge. Create the token with the full repo access.
Then in the magit status buffer, use @
to dispatch the forge menu.
Create a Automator workflow like this https://imgur.com/Xq4xe82. And bind it to some key in Settings->Keyboard->Shortcuts->Services. You need to add Emacs to the Settings->Security&Privacy->Accessibility. Then select some text and press the key. Unfortunately, I didn’t find a way to automate pasting. You’ll need to press the key Cmd-v to paste it after editing.
Use ulimit -n 10240
to increase the limit. See post here https://discussions.apple.com/thread/251000125.
See discussion here spudlyo/clipetty#20. Try `unset SSH_TTY` and then restart your emacs.