Open4

Emacs 29 on Pop!_OS 22.04

zedzed

Install Emacs 29.3 from source

sudo apt update && sudo apt upgrade -y
sudo apt install gcc make ncurses-dev texinfo -y
sudo apt install libxpm-dev libjpeg-dev libgif-dev libtiff-dev librsvg2-dev libgnutls28-dev libharfbuzz-dev libcairo2-dev libgtk-3-dev libgccjit-11-dev libjansson-dev libtree-sitter-dev -y

cd ~/Downloads
wget -O - https://ftp.gnu.org/gnu/emacs/emacs-29.3.tar.xz | tar Jxvf -
cd emacs-29.3
./configure --without-sound --without-pop --with-x-toolkit=gtk --with-native-compilation=aot --with-tree-sitter --with-small-ja-dic | tee configure.log
# =>⏰36.25s total
make -j3
# =>⏰1309.59s total
sudo make install

which emacs
# =>/usr/local/bin/emacs

file `which emacs`
# =>/usr/local/bin/emacs: symbolic link to emacs-29.3

emacs --batch --eval '(message  (string-replace "\n" "" (emacs-version)))'
# =>GNU Emacs 29.3 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.33, cairo version 1.16.0) of 2024-03-27

emacs --batch --eval '(message system-configuration-features)'
# =>CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON LIBSELINUX LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB
zedzed

C/C++用のLSP

clangdのほうがcclsより細かく設定できるように感じたので、clangdを入れる。

LSP-Server: clangd

LLVM Debian/Ubuntu packages

clangdをaptで入れると古い(v14)ので、このページの「Automatic installation script」のとおり、下記のようにllvm一式を入れた。

使うのはclangdだけでclanglldとかは必要ないけど、まあいいかと。

sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"

途中で「続けるには「Enter」キーを」と言われるので、そのとおりにする。

/usr/bin/clangd-18として入るので、以下のようにしてclangdで呼べるようにしとく。

sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-18 99

settings

Emacs29はeglotが標準添付なのでeglotで行く。

init.el
(use-package eglot
  :ensure t
  :hook (prog-mode . eglot-ensure)
  :config
  (add-to-list 'eglot-server-programs '((c++-mode c-mode) "clangd"))
  )

clangd用の設定ファイル

プロジェクトルートにcompile_flags.txtというファイルを置く。
Zephyrのzephyr/samplesフォルダの下に置いてみる。

compile_flags.txt
-x c
-std=c17

試しにzephyr/samples/basic/blinky/src/main.cをEmacsで開いてみるとeglotが自動的にclangdに接続する。

試しにカーソルをgpio_pin_toggle_dtという関数名に置くとミニバッファが広がって、そこに参照ヘッダファイルやら返り値やら引数が表示された。でも、他のパッケージが悪さしてるのか、反応が悪い時がかなりある。

ところで、clangd-14のときはcompile_flags.txt-I~/zephyr-dev/3.6.0/zephyr/includeとかズラーッと書いていたけど、今はなにも書かなくてもヘッダファイルを見つけてよしなにしてくれているように見える。

V14→v18でなにか改良されたんだろうか?
よくわからんがありがたい。

zedzed

Tree-sitter

c.f. https://unicorn.limited/jp/rd/linux/20231015-eglot.html

1. install treesit-auto

M-x package-install treesit-auto

2. install grammers

*scratch-buffer*
(require 'treesit-auto)
(treesit-auto-install-all)

:
UUUUUUUUUUUUUUUUUUUUGGGGGGGGGGGAAAAAAAA !!! core dumped T_T

emacs(+0x1aadbd)[0x571430059dbd]
/lib/x86_64-linux-gnu/libc.so.6(+0x42520)[0x7e4c86642520]
/home/g/.emacs.d/tree-sitter/libtree-sitter-org.so(deserialize+0x20)[0x7e4c75f4f725]
/home/g/.emacs.d/tree-sitter/libtree-sitter-yaml.so(tree_sitter_yaml_external_scanner_create+0x35)[0x7e4c6beff1c2]
/lib/x86_64-linux-gnu/libtree-sitter.so.0(ts_parser_set_language+0x5f)[0x7e4c88c0e72f]

3. workaround

rm ~/.emacs.d/tree-sitter/libtree-sitter-yaml.so

TODO: retry somday