У меня проблемы с установкой грамматики дерева для C++ в Emacs. Я использую Emacs 29.4 со встроенным Tree-Sitter в Arch Linux. Это то, что я сделал до сих пор:
Сначала я определил квитанцию сборки:
(setq treesit-language-source-alist
'((c++ "https://github.com/tree-sitter/tree-sitter-cpp")))
Потом я позвонил:
M-x treesit-install-language-grammar RET c++ RET
Я получил следующее сообщение в *Warnings*
:
⛔ Warning (treesit): The installed language grammar for c++ cannot be located or has problems (symbol-error): /home/tilman/.emacs.d/tree-sitter/libtree-sitter-c++.so: undefined symbol: tree_sitter_c++
Тем не менее, библиотека была собрана и установлена в ~/.emacs.d/tree-sitter/libtree-sitter-c++.so
.
Я открыл исходный файл ++ и набрал
M-X c++-ts-mode RET
Но подсветки синтаксиса почти не было, а в *Messages*
произошло следующее:
Error during redisplay: (jit-lock-function 1) signaled (treesit-query-error "Node type error at" 575 "[\"_Atomic\" \"break\" \"case\" \"const\" \"continue\" \"default\" \"do\" \"else\" \"enum\" \"extern\" \"for\" \"goto\" \"if\" \"inline\" \"register\" \"restrict\" \"return\" \"sizeof\" \"static\" \"struct\" \"switch\" \"typedef\" \"union\" \"volatile\" \"while\" \"and\" \"and_eq\" \"bitand\" \"bitor\" \"catch\" \"class\" \"co_await\" \"co_return\" \"co_yield\" \"compl\" \"concept\" \"consteval\" \"constexpr\" \"constinit\" \"decltype\" \"delete\" \"explicit\" \"final\" \"friend\" \"mutable\" \"namespace\" \"new\" \"noexcept\" \"not\" \"not_eq\" \"operator\" \"or\" \"or_eq\" \"override\" \"private\" \"protected\" \"public\" \"requires\" \"template\" \"throw\" \"try\" \"typename\" \"using\" \"virtual\" \"xor\" \"xor_eq\"] @font-lock-keyword-face (auto) @font-lock-keyword-face (this) @font-lock-keyword-face" "Debug the query with `treesit-query-validate'")
Я поискал в Интернете эту ошибку и нашел несколько сообщений о том, что версия грамматики может быть слишком новой для Emacs. Похоже, это общая проблема. Специально для C++ я нашел эту ветку на Reddit. У пользователей там была такая же проблема, как и у меня. Некоторые говорили, что это сработало после перехода на версию v0.22.0. Таким образом, я добавил версию в квитанцию,
(setq treesit-language-source-alist
'((c++ "https://github.com/tree-sitter/tree-sitter-cpp" "v0.22.0")))
и попробовал еще раз - результат тот же. Это не работает.
Любая помощь очень ценится!
С наилучшими пожеланиями, Тилман
Имя грамматики C++ — cpp
, а не c++
, поэтому treesit-language-source-alist
должно быть
(setq treesit-language-source-alist
'((cpp "https://github.com/tree-sitter/tree-sitter-cpp" "v0.22.0")))
Вы можете найти название грамматики в связанном файле grammar.js . Или запустите strings libtree-sitter-cpp.so
в скомпилированной библиотеке, чтобы найти символ tree_sitter_<parser_name>
.
Обычно имя грамматики — это имя репозитория без префикса tree-sitter-
.
Для полноты картины: я также установил грамматику C и добавил (setq treesit-load-name-override-list '((c++ "libtree-sitter-cpp")))
, как предложено в Настройка Tree-Sitter в Emacs 29.x. Возможно, это будет полезно и для тех, кто борется с Tree-Sitter для C++ в Emacs.
Большое спасибо! Это сработало!