Emacs 29 on Pop!_OS 22.04
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
C/C++用のLSP
clangdのほうがcclsより細かく設定できるように感じたので、clangdを入れる。
LSP-Server: clangd
clangdをaptで入れると古い(v14)ので、このページの「Automatic installation script」のとおり、下記のようにllvm一式を入れた。
使うのはclangd
だけでclang
やlld
とかは必要ないけど、まあいいかと。
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で行く。
(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
フォルダの下に置いてみる。
-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でなにか改良されたんだろうか?
よくわからんがありがたい。
DTS(Device Tree Source)用のLSP
LSP Server: ginko_ls
cargo install ginko_ls
which ginko_ls
# =>/home/USER/.cargo/bin/ginko_ls
dts-mode
M-x package install <RET> dts-mode <RET>
settings
(use-package dts-mode)
:
(use-package eglot
:ensure t
:hook ((dts-mode . eglot-ensure)) ;; device tree
:config
(add-to-list 'eglot-server-programs '((dts-mode) "ginko_ls"))
)
Tree-sitter
c.f. https://unicorn.limited/jp/rd/linux/20231015-eglot.html
treesit-auto
1. install M-x package-install treesit-auto
2. install grammers
(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
ランチャー項目を整理
ランチャーには3種類登録される。
- Emacs
- Emacs (Terminal)
- Emacs (Client)
GUI版がふつうに起動すれば十分なので、下2つをripgrepで探して削除する。
cd /usr/lcoal/share/applications
rg -e 'Emacs \(Terminal\)|Emacs \(Client\)' --line-buffered --no-heading -g '*.desktop' 2&>/dev/null
emacsclient.desktop:2:Name=Emacs (Client)
emacs-term.desktop:3:Name=Emacs (Terminal)
この2つをrm -fr
する。
にしても、このPop!_OSのランチャーはブラウザのタイトルとかも引っかかるのでイマイチだな。