LINUX.ORG.RU

кто использует tree-sitter?

 ,


2

2

Заметил, что очень многие сидят на надёжных, старых конфигурациях своих редакторов, vim и emacs.

В Neovim решили пойти по пути унификации и внедрили, кажется, с 4й версии tree-sitter.

В Emacs с тормозами, но впилили с 29 версии.

Результат впиливания в Emacs: все major modes идут на юга отдыхать (не нужны). Даже с csharp-mode, который приняли в ядро в 29 версии смешно получилось. Tree-sitter выполняет все задачи, описанные в этом примере.

С чем столкнулся я. Примеров в сети на данный момент практически нет, документация недооформлена, приходится обращаться к остаткам доки замороженных проектов, перенесённых в основную ветку разработки (привет Eglot и команды (или названия) для установки lsp сервера).

В сообществе Neovim с этим более чем полный порядок. Правда тут меня напрягает legacy и ублюдочный синтаксис конфига из-за vim. может после 0.11 версии станет легче, не знаю. И нам, осьминогам, Emacs ближе за возможность поменять всё на свете, даже Cthulhu!..

У кого есть истории успеха? Хорошие, годные статьи и (или) примеры конфигов с новыми фишками 29 версии? Их что-то маловато или я не там ищу.



Последнее исправление: Neuromagus (всего исправлений: 1)

Использую treesitter на 29.1 вместе с lsp-mode, никаких проблем не наблюдаю. Конфигурация: https://github.com/SL-RU/.emacs.d/tree/lsp

В основном все фишки автоматически включаются в пакетах с обновлением, нужно для каждого пакета доки/дискуссии смотреть

Eglot вообще не нравится, не понял его

SL_RU ★★★★
()
Последнее исправление: SL_RU (всего исправлений: 1)
Ответ на: комментарий от SL_RU

Спасибо, смотрю.

Ты тоже любишь emacsclient/server?

(require 'tree-sitter)
(global-tree-sitter-mode)

вообще не понял.

У меня по документации каждый major-mode заменяется на ts-mode

Почитал, у тебя мешанина из старых настроек, которые не используются в новой конфе с новыми.

Вот как пример:

(use-package typescript-mode

и 

(use-package tree-sitter

Он не нужен, как и другие major modes. tree-sitter встроен теперь, а ты испольуешь старую версию (deprecated)

Далее, bootstrap отваливается за ненадобностью, так как use-package встроили. Ну и многие mode уже просто не нужны. Их ставить нет смысла в 29 версии.

Вот об этом я и пишу.

в любом случае, благодарю за конфиг, теперь есть с чем сравнить.

Neuromagus
() автор топика
Последнее исправление: Neuromagus (всего исправлений: 3)

Ну, в емаксе вон меня давно напрягает лапша из регексов для подсветки, особенно в случае Common Lisp, когда у тебя макросы и вообще ридер изменяемый. Там что-то можно конечно подсветить, но регексами это сильно криво получается.

И вот я недавно решил таки потыкать этот tree sitter, но во-первых, нихера не понял, во-вторых, документации там нихера нету. Какая-то сишная библиотека нужна чтоли? Я тоже понял что все major modes старого разлива идут получается нахрен. Попытался загрузить c-ts-mode, вывалилось с ошибкой что какой-то там c-tree-parser либы нету.

Непонятно. Как и вообще непонятно, грамматика tree sitter это вообще что такое и на чем основано? На PEG? CFG? какой вид парсеров? Можно ли самому как-то писать, и скажем интегрировать в SLIME динамически?

lovesan ★★
()
Ответ на: комментарий от lovesan

Во. По делу: https://www.masteringemacs.org/article/how-to-get-started-tree-sitter

Есть и оф. дока, но я по исходникам рыл.

В двух словах: есть либа на Rust и C, а к ней есть синтаксические дополнения (grammars). Как пример - go или Python, языков много, в оф доке написано скромно, как написать для своего ЯП.

Ну и что надо сделать - tree-sitter встроен в 29 версию, а grammars надо или закомпилить по инструкции или поставить пакетом

В первой ссылке небольшая инструкция, написана человеческим языком, даже такому нубу, как я, зашла (я даже правки вносил :))

Ну а дальше (в инструкции написано), надо указать Emacs забыть как сон заменить major-mode на ts-mode (tree-sitter).

И начнут сыпаться плюшки. Плюшек много. И я понял, что пока люди их обходят стороной. Переписывался с «System Crafter», так он нубасит, пока сам не разобрался, видос не запилит и так далее. Может надо сделать заметку на ЛОР, да вот я не считаю себя компетентным.

Что могу сказать (и что я понимаю) - это быстрее, точнее, даёт унификацию (grammars вынесены, как и LSP). Много работы по перерабботке инструментов. Работа с кодом поменялась в 29 версии.

Tree-sitter is a parser generator tool and an incremental parsing library. It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited. Tree-sitter aims to be:

   - General enough to parse any programming language
   - Fast enough to parse on every keystroke in a text editor
   - Robust enough to provide useful results even in the presence of syntax errors
   - Dependency-free so that the runtime library (which is written in pure C) can be embedded in any application

Можно ли самому как-то писать, и скажем интегрировать в SLIME динамически?

Можно, всё можно.

P.S. где встроено и показывает результаты - Nvim, VSCode, Emacs 29 (начально)
P.P.S. https://github.com/theHamsta/tree-sitter-commonlisp

Neuromagus
() автор топика
Последнее исправление: Neuromagus (всего исправлений: 3)
Ответ на: комментарий от lovesan

И можно по твоим вопросам начать переписку с продвиженцем идеи tree-sitter в Σmacs https://www.youtube.com/watch?v=ZtkR8DPekWE

Neuromagus
() автор топика
Последнее исправление: Neuromagus (всего исправлений: 2)
Ответ на: комментарий от lovesan

все major modes старого разлива идут получается нахрен

И всё, что на них завязано, идёт тоже. К примеру, CIDER пока не работает с clojure-ts-mode, а значит, триситтер не готов к десктопу.

Nervous ★★★★★
()
Ответ на: комментарий от Nervous

а значит, триситтер не готов к десктопу.

Он готов, он в Emacs не готов. Даже не так Он и тут готов, инструменты не готовы.

Neuromagus
() автор топика
Последнее исправление: Neuromagus (всего исправлений: 1)

Использую с Emacs, но не для всех языков. Хачкелл с tree-sitter как-то очень странно раскрашивается: дефолтная подсветка делает жирными только ключевые слова, с tree-sitter же выделяется гораздо больше, включая имена функций. В итоге просто в глазах рябит.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

моя https://github.com/neuromagus/righteous-theme

3 цвета (основа, строки, комментарии, и затесался на меню 4й, чтобы от основы отличался)

Neuromagus
() автор топика
Последнее исправление: Neuromagus (всего исправлений: 1)
Ответ на: комментарий от Neuromagus

Можно, всё можно.

Не совсем понимаю как. Вон для CL в той ссылке написана некоторая «грамматика». Она фиксированная? Как это работает с макросами? Можно ли подсвечивать их элементы? То есть грубо говоря, расширять эту грамматику.

И как быть с reader-макросами, как писать собственные расширения правил для грамматики?

lovesan ★★
()
Ответ на: комментарий от lovesan

В emacs для indent можно добавить вот такое, для CL:

(define-common-lisp-style "my-indent-style"
  "My custom indent style."
  (:inherit "modern")
  (:variables
   (lisp-loop-indent-subclauses t))
  (:indentation
   (if (4 2 2))
   (define (&lambda 2))
   (with-gensyms ((&whole 4 &rest 1) &body))
   (define-dotnet-object-printer (as defmethod)) 
   ...)

Можно ли в tree-sitter сделать что-то подобное но для допустим, подсветки синтаксиса?

Или вот я написал кастомные ридер-макросы.

Мне надо чтобы вот тут:

[:System.Console WriteLine "Hello"]

Подсвечивался первый элемент как «имя типа», а второй элемент как «имя вызываемой функции». Как это сделать? Динамическое расширение грамматики возможно?

У CL потому что на самом деле «грамматики» как таковой нет.

lovesan ★★
()
Ответ на: комментарий от lovesan

Меня лично этот вопрос пока не интересовал, но в последнем видосе парень меняет отступы и пишет свою грамматику. Уверен, есть механизм, да доки куци(ы)е.

Если тебе интересен данный вопрос - welcome на github, в issue или к грамматике CL или персонажу из видоса или на набор из email адресов пишущих core emacs. Я же говорю, инет пуст. Пару старых статей, как включить (и то кастрированных) и всё.

Во в доках Emacs есть опция (setq treesit-font-lock-level 3), а в статьях ни слова (значения от 1 до 4, рекомендую вызвать справку).

Neuromagus
() автор топика
Ответ на: комментарий от Neuromagus

Эта опция, если не запямятовал, влияет на вложенность парса (глубину, семантику). 4 - max.

https://github.com/theHamsta/tree-sitter-commonlisp/tree/master

Посмотри TODO. Может ты это имеешь в виду.

Neuromagus
() автор топика
Последнее исправление: Neuromagus (всего исправлений: 1)
Ответ на: комментарий от Neuromagus

Ну вот я посмотрел, и вижу что там человек хочет запихунуть всякие стандартные макросы в грамматику.

Это значит что грамматики фиксированные. И расширять их это жопоболь.

По той причине что для CL нельзя в общем случае написать «грамматику» - для него не существует вменяемого LSP для VSCode, например. И видимо вот этот tree-sitter это тоже будет мимо.

И поэтому большинство лисперов пользуется Emacs + SLIME/SLY - потому что тот поднимает процесс лиспа и с ним общается, для того чтобы из него брать семантическое значение всяких вещей в коде. Для CL невозможен внешний синтаксический анализатор.

Надо короче для него писать что-то свое, а не все эти font-lock и tree-sitter.

lovesan ★★
()
Ответ на: комментарий от Neuromagus

мояhttps://github.com/neuromagus/righteous-theme

3 цвета (основа, строки, комментарии, и затесался на меню 4й, чтобы от основы отличался)

Слишком низкий контраст. Я вот с этими двумя сижу:

https://emacsthemes.com/themes/almost-mono-white-theme.html

https://emacsthemes.com/themes/almost-mono-gray-theme.html

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от lovesan

Бог его знает, если глянуть сюда - https://github.com/theHamsta/tree-sitter-commonlisp/blob/master/src/grammar.json, то описаны некие правила, как будет развиваться это дело - неизвестно.

Но, построение синтаксического дерева, отступы, подсветка - тут явно лучше. Даже по количеству строк кода. Старый поезд ушел. У меня анализ использования Emacs пацанами жуткий. они теперь в нюм ведут записи (Org-mode), а код пишут аки подростки наркоманы, ныкаясь от всех, в VSCode.

Neuromagus
() автор топика
Ответ на: комментарий от hateyoufeel

Слишком низкий контраст. Я вот с этими двумя сижу

Очень яркий белый на чёрном и очень яркий чёрный на белом.

Если хочешь, чтобы голова не болела, то фон не белый в светлой теме, в тёмной буквы не должны быть белыми или яркими (поэтому Monokai - говно)

Neuromagus
() автор топика
Ответ на: комментарий от Neuromagus

Очень яркий белый на чёрном и очень яркий чёрный на белом.

Он не яркий, если снизить яркость монитора :)

Собственно, ради этого всё и сделано.

Если хочешь, чтобы голова не болела

Она у меня и не болит.

(поэтому Monokai - говно)

Поддерживаю. Monokai и прочие Dracula – говно.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Хачкелл с tree-sitter как-то очень странно раскрашивается: дефолтная подсветка делает жирными только ключевые слова, с tree-sitter же выделяется гораздо больше, включая имена функций.

Поставь (setq treesit-font-lock-level 2) и будет тебе счастие. Я на таком левеле сижу. Указывает tree-sitter парсить string и operators. Для монотем самое то.

Neuromagus
() автор топика
Ответ на: комментарий от hateyoufeel

Быстрее. Меньше парсить. Или ты на другие ЯП тему меняешь? Будет заметно на больших вложениях. В доке написана команда автовыключения tree-sitter при открытии файлов больше, чем (и тут я не помню). А раз так, имеет место быть.

Neuromagus
() автор топика
Ответ на: комментарий от Neuromagus

Быстрее. Меньше парсить.

Ваще насрать. Файлы с хачкеллом редко большие и парсинг отнимает всего ничего.

Или ты на другие ЯП тему меняешь?

Нет.

Будет заметно на больших вложениях

Там нет больших вложений. Это хачкелл.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Ты не понял. Эта опция применима на весь парсинг. Заче тебе полная подсветка семантики с такой темой? Вот если бы ты был любителем гирлянд разноцвветных, тогда ‘4’ закрасила бы всё.

Ты же не только на Haskell пишешь. Вон у меня на плюсах заголовки по пол км.

Neuromagus
() автор топика
Ответ на: комментарий от Neuromagus

Заче тебе полная подсветка семантики с такой темой?

В других язычках всё норм выглядит. Я прозреваю, это косяк только грамматики в TS для хачкелла. Но я учту твой совет, спасибо.

hateyoufeel ★★★★★
()

Правда тут меня напрягает legacy и ублюдочный синтаксис конфига из-за vim.

Эммм… Что не так в луа? Да, пока не все портировали, но не помню, чтоб я за последний год сталкивался с функцией, которая в луа не представлена.

l0stparadise ★★★★★
()
Ответ на: комментарий от l0stparadise

Ну… Как тебе объяснить. В Emacs ты можешь поменять всё. В Nvim из-за попытки сделать vim, но neo, очень много забрано неудачного. Я про API. Не зря появились Helix или Kakoune. Раз появилось какбэ vim api, то и решения проблем самого vim.

Lua стоически решает вот это совместительство. А не должно. Портируют всего несколько человек и вылезают кривости (не забываем, Nvim не Vim), которых нет в Vim. поэтому многие зубры сидят на Vim и считают Nvim alpha в лучшем случае.

Мой личный опыт: ты жмёшь последовательность, а ничего не происходит. Некий баг. Не сработал твой набор команд. А в Vim срабатывает. Очень редко, когда сам ошибаешься, оооочень редко. В Nvim же они проглатываются без реагирования очень часто.

Neuromagus
() автор топика

Пробовал, ещё до релиза 29.1, показался сырым. В частности – фундаментальная проблема с error recovery – когда не удаётся распарсить всё, то вместо локальных артефактов – может портится синтаксис всего документа. Tree-sitter решил делать всё автоматически, и здесь у авторов грамматик мало инструментов повлиять на поведение. А в C/C++ проектах такого навалом – спасибо макросам, компиляторными расширениям и переусложнённому синтаксису.

snizovtsev ★★★★★
()
Ответ на: комментарий от Neuromagus

В Emacs ты можешь поменять всё.

Вот только за те года 3-4 что я его использую – всё поменять так и не получилось. Терплю баги конфига, потому что как показывает практика – на фикс простой проблемы уходит весь день. Смотришь лисповый код – и ничего не понимаешь, пока в каждый символ не вчитаешься с особым пристрастием. Вимскрипт я редактировал с большим удовольствием, да и луа понятный. Сижу только ради magit.

snizovtsev ★★★★★
()