Table of Contents
- Get Started
- External tools
- Customize
- Install and Update Language Servers
- Vterm
- LLM
- Tree sitter
- Misc. tips
Only tested with >= Emacs 30.1 in Debian
backup your .emacs and .emacs.d, rename them to something else because emacs loads .emacs first if it exists
git clone https://github.com/braineo/fate-emacs.git ~/.emacs.ddocker pull braineo/fate-emacs
# run in terminal
docker run -it --rm braineo/fate-emacs
# run with GUI
xhost +local:root # WARN: this comes with security issues
docker run -it --rm -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /your/workspace/:/mnt/workspace braineo/fate-emacsripgrep is basically a fast grep written in Rust.
Download ripgrep release from https://github.com/BurntSushi/ripgrep/releases
# example
wget https://github.com/BurntSushi/ripgrep/releases/download/0.10.0/ripgrep_0.10.0_amd64.deb && dpkg -i ripgrep_0.10.0_amd64.deb
# or
apt install ripgrep
# or
cargo install ripgrepfd is a replacement for find
sudo apt install fd-find
# or
cargo install fd-findenchant is a library for spell checking
## Debian
sudo apt install libenchant-2-dev pkg-configmdopen is for live markdown preview
cargo install mdopenDirectly install via pip install causes warnings after Debian 12. To use packages newer than the system provided packages, use venv or pipx instead.
# use venv
sudo apt install python3-venv
python3 -m venv .venv
source .venv/bin/activate
pip install requests
deactivate# for executables, use pipx
sudo apt install pipx
pipx ensurepath
pipx install ruff-lspM-x fate/python-install-tools
M-x fate/go-install-tools
| Name | Installation command | Description |
|---|---|---|
| prettier | npm i -g prettier | Formatter for JavaScript, TypeScript, CSS, JSON, and more |
| linter LSP | npm i -g vscode-langservers-extracted | Language server of eslint, HTML, CSS |
| TypeScript LSP | npm i -g @typescript/native-preview |
or M-x fate/js-install-tools
| Name | Installation command | Description |
|---|---|---|
| shellcheck | apt install shellcheck | A great teacher helping you write better shell script |
| shfmt | go install mvdan.cc/sh/v3/cmd/shfmt@latest | A shell script formatter |
Install fonts for mode-line
M-x nerd-icons-install-fonts
The first time you open Emacs, it will create a custom.el for you automatically from fate-custom-template.el. There you can made custom configuration does not go with Emacs for different computers (like your personal ones and working ones). For example, PATH variable.
Especially for macOS users, because exec-path-from-shell is slow that I did not include it and you might want to edit ENV variables and exec-path
(setq exec-path (append exec-path '("/path/to/bin")))(setenv "LD_LIBRARY_PATH"
(let ((current (getenv "LD_LIBRARY_PATH"))
(new "/path/to/lib/"))
(if current (concat new ":" current) new)))(setq lsp-python-ms-extra-paths
'("/path/to/a/site-packages"
"/path/to/b/site-packages"))EditorConfig helps maintain consistent coding styles for multiple developers working on the same project across various editors and IDEs. The EditorConfig project consists of a file format for defining coding styles and a collection of text editor plugins that enable editors to read the file format and adhere to defined styles. EditorConfig files are easily readable and they work nicely with version control systems.
wget https://github.com/braineo/configs/blob/master/editorconfig/.editorconfig ~/.editorconfigOptional configuration, take a look at my configs if interested
Previously lsp-mode was used as LSP client. The configuration now migrates to lsp-bridge, a client emphasizes performance. It has not covered all the features in lsp-mode, but it is really fast.
# install dependencies for lsp-bridge
pip3 install epc orjson sexpdata six setuptools paramiko rapidfuzzFor each language server, refer to the configuration guide in lsp-bridge
Language servers implemented in NodeJS can obtain directly by doing lsp-install-server.
| Language | Installation command |
|---|---|
| TypeScript/JavaScript | npm i -g @typescript/native-preview; npm i -g typescript |
| JSON | npm i -g vscode-json-languageserver |
| Dockerfile | npm install -g dockerfile-language-server-nodejs |
Microsoft Python Language Server (depreciated)
lsp-python-ms now downloads language server binary automatically, or you can build latest Microsoft Python Language Server by yourself
- Install dotnet-sdk
- Clone and install python-language-server
git clone https://github.com/Microsoft/python-language-server.git
cd python-language-server/src/LanguageServer/Impl
dotnet build -c Release
dotnet publish -c Release -r linux-x64 # linux
dotnet publish -c Release -r osx-x64 # macchange the value of the -r flag depending on your architecture and operating system. See Microsoft’s Runtime ID Catalog for the right value for your system.
Then, link the executable to somewhere on your path, e.g.
ln -sf $(git rev-parse --show-toplevel)/output/bin/Release/linux-x64/publish/Microsoft.Python.LanguageServer ~/.emacs.d/mspyls/
ln -sf $(git rev-parse --show-toplevel)/output/bin/Release/osx-x64/publish/Microsoft.Python.LanguageServer ~/.emacs.d/mspyls/Credit to lsp-python-ms
Because Microsoft’s Python language server does not ship with a linter, need to install flake8
pip install flake8;; Configure extra search path
(setq lsp-python-ms-extra-paths
'("path1"
"path2"))
;; If you need to work on some python2 projects, make sure use a right flake8
(setq flycheck-python-flake8-executable "python2")clangd needs compile_commands.json to know the compiler flags that are used to build the project, when some custom paths are used.
For cmake project, passing -DCMAKE_EXPORT_COMPILE_COMMANDS=ON to cmake can generate compile_commands.json. If it is not a cmake project,
bear is a right tool to generate it.
Pitfalls for compile_commands.json. By default CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES are not exported into compile_commands.json. With compile_commands.json clangd might still not able to figure out the include paths. In that case you can try adding following lines to the beginning of CMakeLists.txt. See cmake issue
if(CMAKE_EXPORT_COMPILE_COMMANDS)
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES})
endif()But again, if the project is using gcc instead of clang, you might see some errors like this from clangd. That's because the previous lines add -isystem /usr/lib/gcc/x86_64-linux-gnu/14/include and it is not compatible with clang. You can manually remove it and fine tune the CMake.
E[12:12:01.769] [builtin_definition] Line 18: in included file: definition of builtin function '_mm_getcsr'
To manually verify if clangd works. You can run
clangd --compile-commands-dir="." --query-driver="clang-tidy" --check="path/to/some.cpp"To make vterm handy, you need some shell-side configuration, add following to .zshrc or .bashrc
if [[ "$INSIDE_EMACS" = 'vterm' ]] \
&& [[ -n ${EMACS_VTERM_PATH} ]] \
&& [[ -f ${EMACS_VTERM_PATH}/etc/emacs-vterm-zsh.sh ]]; then
source ${EMACS_VTERM_PATH}/etc/emacs-vterm-zsh.sh
fiYou can choose to use OpenAI, if you want to keep the prompt to yourself. Hosting a local LLM is not difficult either.
follow guide in nvidia site.
TL;DR
wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64//cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get install -y nvidia-kernel-open-dkms
sudo apt-get install -y cuda-drivers
sudo apt install nvidia-cuda-toolkitgit clone [email protected]:ggerganov/llama.cpp.git
mkdir build
cd build
cmake .. -DLLAMA_CUBLAS=ON
cmake --build . --config ReleaseRun following command in build folder, api server will spin up at localhost:8080
./bin/server --model /path/to/models/dolphin-2.6-mistral-7b-dpo-laser.Q5_K_M.gguf --n-gpu-layers 400Or use Ollama as frontend
curl -fsSL https://ollama.com/install.sh | sh
ollama run dolphin-mixtralIf the system has an Nvidia graphics card but showing 100% CPU when running ollama ps
NAME ID SIZE PROCESSOR UNTIL
deepseek-r1:14b ea35dfe18182 9.9 GB 100% CPU 4 minutes from now
refer to https://github.com/ollama/ollama/blob/main/docs/troubleshooting.md#container-fails-to-run-on-nvidia-gpu and check logs from following
sudo systemctl stop ollama
OLLAMA_DEBUG=1 ollama serve 2>&1 | tee server.logTree-sitter is a parser generator tool and an incremental parsing library. It is integrated into Emacs from 29. With tree sitter, it makes syntax parsing much faster and font-lock-rules much easier to write. Other than syntax highlight, it can provide some other useful functions to improve editing efficiency.
Although fate/treesit-install-language-grammars or the built-in treesit-install-language-grammar should be enough to automate the process.
In case you need to test your modification locally and build it from source.
git clone [email protected]:tree-sitter/tree-sitter-rust.git
cd tree-sitter-rust/src
cc parser.c scanner.c -fPIC -I. --shared -o libtree-sitter-rust.so
mv libtree-sitter-rust.so ~/.emacs.d/tree-sitterThis script has been very useful for me to have up-to-date repo status with issue and pull requests. Add it to crontab job and run hourly.
@hourly /usr/local/bin/emacs -nw -Q --batch -l /home/user/.emacs.d/bin/update_forge_repos.el