{"id":497144,"date":"2026-10-02T14:25:12","date_gmt":"2026-10-02T14:25:12","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=497144"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=497144","title":{"rendered":"Emacs: \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c TreeSitter"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>TreeSitter \u2013 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c\u0438 GitHub. \u0415\u0441\u043b\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u0433\u0440\u0443\u0431\u043e, \u0437\u0430\u0442\u043e \u043a\u0440\u0430\u0442\u043a\u043e, TreeSitter \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0440\u0435\u0432\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u042d\u0442\u043e \u043d\u0435 \u0440\u0430\u0437\u0431\u043e\u0440 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0430 \u043a\u043e\u0435-\u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0448\u0435. \u041d\u043e \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e TreeSitter \u043f\u043e\u0437\u043d\u0430\u0451\u0442\u0441\u044f \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438.<\/p>\n<p>\u0412\u043e\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 \u043a\u0430\u043a \u0431\u044b\u043b\u043e? \u0425\u043e\u0447\u0435\u0448\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0432 \u0441\u0432\u043e\u0451\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0438\u043b\u0438 IDE \u2013 \u0441\u0430\u0434\u0438\u0441\u044c \u0438 \u043f\u0438\u0448\u0438 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>\u041a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441? \u0421\u043a\u0430\u0447\u0430\u0439 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 TreeSitter \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0439 \u0435\u0439 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u0430 \u043e\u043d\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0434\u0430\u0441\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0440\u0435\u0432\u043e.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 (\u0432\u0441\u0435\u043c \u043c\u0438\u0440\u043e\u043c), \u0430 \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0434\u0435 \u0445\u043e\u0447\u0435\u0448\u044c.<\/p>\n<p>\u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 JavaScript. \u0424\u0430\u0439\u043b \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 C, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 (<code>.so<\/code> \u0432 *nix, <code>.dll<\/code> \u0432 Windows).<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>Emacs.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 <code>treesit.el<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0441 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430\u043c\u0438. \u0412 DEB-\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <code>built-essential<\/code>:<\/p>\n<pre><code>apt-get install build-essential --yes<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 treesit.el<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c <code>treesit.el<\/code>. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a <code>treesit-language-source-alist<\/code>. \u041a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c <strong>\u0434\u043e\u043b\u0436\u043d\u0430<\/strong> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u0435\u0451 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u0438 \u043f\u0443\u0442\u044c \u043a \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0443 \u0441 \u043a\u043e\u0434\u043e\u043c, \u0435\u0441\u043b\u0438 \u043e\u043d \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 <code>src\/<\/code>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0437\u0430\u043f\u0438\u0441\u0438 <strong>\u043c\u043e\u0433\u0443\u0442<\/strong> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 (\u0442\u0435\u0433 \u0438\u043b\u0438 \u0432\u0435\u0442\u043a\u0430 Git). \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0443\u043a\u0430\u0436\u0435\u0442\u0435 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438, \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0442\u043a\u0435. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u043e\u0439 \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c\u0438. \u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435, \u044d\u0442\u043e \u0430\u043d\u0442\u0438\u043f\u0430\u0442\u0442\u0435\u0440\u043d \u201c\u0434\u0435\u0442\u043e\u043d\u0430\u0442\u043e\u0440\u201d.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0430\u043b\u043e, \u043d\u0443\u0436\u043d\u043e \u0438\u0445 \u0435\u0449\u0451 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0443\u043c\u0435\u044e\u0442 \u0441\u0430\u043c\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u043d\u043e \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0432\u0435\u0437\u0434\u0435 \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u043d\u0430 \u0431\u0430\u0437\u0435 TreeSitter \u0432\u043c\u0435\u0441\u0442\u043e \u201c\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e\u201d (\u043d\u0430 \u0431\u0430\u0437\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a <code>major-mode-remap-alist<\/code>.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e <code>init.el<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"lisp\">;; \ud83d\udce6 TREESIT;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 TreeSitter(use-package treesit  :config  ;; \u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438  (setq treesit-language-source-alist    '(       (asciidoc         \"https:\/\/github.com\/cathaysia\/tree-sitter-asciidoc.git\"         \"v0.3.0\"         \"tree-sitter-asciidoc\/src\/\")       (asciidoc-inline         \"https:\/\/github.com\/cathaysia\/tree-sitter-asciidoc.git\"         \"v0.3.0\"         \"tree-sitter-asciidoc_inline\/src\/\")       (bash         \"https:\/\/github.com\/tree-sitter\/tree-sitter-bash.git\"         ;; \"v0.25.1\" ;; ABI v15         \"v0.23.3\")       (c         \"https:\/\/github.com\/tree-sitter\/tree-sitter-c.git\"         ;; \"v0.24.1\" ;; ABI v15         \"v0.23.5\")       (cpp         \"https:\/\/github.com\/tree-sitter\/tree-sitter-cpp.git\"         \"v0.23.4\")       (c-sharp         \"https:\/\/github.com\/tree-sitter\/tree-sitter-c-sharp.git\"         ;; \"v0.23.5\" ;; ABI v15         \"v0.23.1\")    ;; ABI v14       (css         \"https:\/\/github.com\/tree-sitter\/tree-sitter-css.git\"         ;; \"v0.25.0\" ;; ABI v15         \"v0.23.2\")       (dockerfile         \"https:\/\/github.com\/camdencheek\/tree-sitter-dockerfile.git\"         \"v0.2.0\"         \"src\/\")       (go         \"https:\/\/github.com\/tree-sitter\/tree-sitter-go.git\"         ;; \"v0.25.0\" ;; ABI v15         \"v0.23.4\")       (gomod         \"https:\/\/github.com\/camdencheek\/tree-sitter-go-mod.git\"         \"v1.1.0\")       (html         \"https:\/\/github.com\/tree-sitter\/tree-sitter-html.git\"         \"v0.23.2\")       (java         \"https:\/\/github.com\/tree-sitter\/tree-sitter-java.git\"         \"v0.23.5\")       (javascript         \"https:\/\/github.com\/tree-sitter\/tree-sitter-javascript.git\"         \"v0.23.1\"         \"src\/\")       (json         \"https:\/\/github.com\/tree-sitter\/tree-sitter-json.git\"         \"v0.24.8\")       (make         \"https:\/\/github.com\/tree-sitter-grammars\/tree-sitter-make.git\"         \"v1.1.1\"         \"src\/\")       (markdown         \"https:\/\/github.com\/tree-sitter-grammars\/tree-sitter-markdown.git\"         \"v0.4.1\"         \"tree-sitter-markdown\/src\")       (markdown-inline         \"https:\/\/github.com\/tree-sitter-grammars\/tree-sitter-markdown.git\"         \"v0.4.1\"         \"tree-sitter-markdown-inline\/src\")       (python         \"https:\/\/github.com\/tree-sitter\/tree-sitter-python.git\"         \"v0.23.6\"         \"src\/\")       (ruby         \"https:\/\/github.com\/tree-sitter\/tree-sitter-ruby.git\"         \"v0.23.1\"         \"src\/\")       (rust         \"https:\/\/github.com\/tree-sitter\/tree-sitter-rust.git\"         \"v0.23.3\")       (tsx         \"https:\/\/github.com\/tree-sitter\/tree-sitter-typescript.git\"         \"v0.23.2\"         \"tsx\/src\/\")       (typescript         \"https:\/\/github.com\/tree-sitter\/tree-sitter-typescript.git\"         \"v0.23.2\"         \"typescript\/src\/\")       (typst         \"https:\/\/github.com\/uben0\/tree-sitter-typst.git\"         \"0.11\"         \"src\/\")       (yaml         \"https:\/\/github.com\/tree-sitter-grammars\/tree-sitter-yaml.git\"         \"v0.7.2\"         \"src\/\")))  ;; \u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a  (dolist (source treesit-language-source-alist)    (let ((lang (car source)))      (unless (treesit-ready-p lang t)        (with-demoted-errors \"Treesit: \u043e\u0448\u0438\u0431\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438: %s\"          (treesit-install-language-grammar lang)))))  ;; \u0417\u0430\u043c\u0435\u043d\u0430 \"\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445\" \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u043d\u0430 TreeSitter  (add-to-list 'major-mode-remap-alist '(bash-mode . bash-ts-mode))  (add-to-list 'major-mode-remap-alist '(c++-mode . c++-ts-mode))  (add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode))  (add-to-list 'major-mode-remap-alist '(csharp-mode . csharp-ts-mode))  (add-to-list 'major-mode-remap-alist '(css-mode . css-ts-mode))  (add-to-list 'major-mode-remap-alist '(dockerfile-mode . dockerfile-ts-mode))  (add-to-list 'major-mode-remap-alist '(go-mode . go-ts-mode))  (add-to-list 'major-mode-remap-alist '(html-mode . html-ts-mode))  (add-to-list 'major-mode-remap-alist '(java-mode . java-ts-mode))  (add-to-list 'major-mode-remap-alist '(js-mode . js-ts-mode))  (add-to-list 'major-mode-remap-alist '(json-mode . json-ts-mode))  (add-to-list 'major-mode-remap-alist '(python-mode . python-ts-mode))  (add-to-list 'major-mode-remap-alist '(ruby-mode . ruby-ts-mode))  (add-to-list 'major-mode-remap-alist '(yaml-mode . yaml-ts-mode)))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b 2 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438? \u041e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e: \u043b\u0438\u0431\u043e \u0432 \u044f\u0437\u044b\u043a\u0435 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u043a\u0430\u043a \u0432 Golang, \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0434\u0432\u0443\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0442\u043e\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Markdown \u0438 AsciiDoc: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0435\u043b\u0438\u043c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0430\u0431\u0437\u0430\u0446\u044b, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u0436\u0435 \u0438\u0445 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u0447\u0430\u0441\u0442\u0438. \u041e\u0442\u0441\u044e\u0434\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0441 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c <code>_inline<\/code>.<\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u043a\u043e\u0434\u0430 \u2013 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0442\u0435\u0433\u0430\u043c Git. \u0412 Emacs 30.1, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f TreeSitter ABI v14, \u0438 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a \u0445\u043e\u0442\u044c \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f, \u043d\u043e \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u044b\u0439 Emacs, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0443\u0436\u043d\u043e\u0439 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438.<\/p>\n<h3>\u0420\u0435\u0436\u0438\u043c\u044b<\/h3>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 <code>init.el<\/code> \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0443\u0436\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>Dockerfile \/ Containerfile:<\/p>\n<pre><code class=\"lisp\">;; \ud83d\udce6 DOCKERFILE-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u043d\u0430 \u0431\u0430\u0437\u0435 TreeSitter \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Dockerfile.(use-package dockerfile-ts-mode  :defer t  :mode (\"Containerfile\\\\'\" . dockerfile-ts-mode))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421 <code>Dockerfile<\/code> \u0440\u0435\u0436\u0438\u043c \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0430 \u0432\u043e\u0442 \u0441 <code>Containerfile<\/code> \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<\/li>\n<li>\n<p>Golang:<\/p>\n<pre><code class=\"lisp\">;; \ud83d\udce6 GO-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u044f\u0437\u044b\u043a\u0430 Golang(use-package go-ts-mode  :defer t)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p>HTML:<\/p>\n<pre><code class=\"lisp\">;; \ud83d\udce6 HTML-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 HTML \u0438 SGML.(use-package html-ts-mode  :defer t)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p>Java:<\/p>\n<pre><code class=\"lisp\">;; \ud83d\udce6 JAVA;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Java.(use-package java-ts-mode  :defer t)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p>JavaScript:<\/p>\n<pre><code class=\"lisp\">;; \ud83d\udce6 JS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JavaScript.(use-package js  :defer t  :custom  (js-chain-indent t \"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443.\")  (js-indent-level 2 \"\u041e\u0442\u0441\u0442\u0443\u043f \u0432 2 \u043f\u0440\u043e\u0431\u0435\u043b\u0430, \u0430 \u043d\u0435 4 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e).\")  (js-switch-indent-offset 2 \"\u041e\u0442\u0441\u0442\u0443\u043f \u0432 2 \u043f\u0440\u043e\u0431\u0435\u043b\u0430 \u0434\u043b\u044f switch\/case.\"))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p>JSON:<\/p>\n<pre><code class=\"lisp\">;; \ud83d\udce6 JSON-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON \u0447\u0435\u0440\u0435\u0437 TreeSitter(use-package json-ts-mode :defer t)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p>Markdown: \u0440\u0435\u0436\u0438\u043c <code>markdown-ts-mode<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 Emacs 31. \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u043e\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 GNU ELPA \u2013 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>Python:<\/p>\n<pre><code class=\"lisp\">;; \ud83d\udce6 PYTHON-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Python \u0447\u0435\u0440\u0435\u0437 TreeSitter(use-package python  :pin gnu  :init  (unless (alist-get 'python package-alist)    (with-demoted-errors \"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f `python': %s\"      (package-upgrade 'python)))  :interpreter  (\"python[0-9]\" . python-mode)  :custom  (py-pylint-command-args \"--max-line-length 120\" \"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 pylint\")  (python-indent-guess-indent-offset-verbose nil \"\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\")  (python-indent-offset 4 \"\u041e\u0442\u0441\u0442\u0443\u043f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 4 \u043f\u0440\u043e\u0431\u0435\u043b\u0430\"))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p>Ruby:<\/p>\n<pre><code class=\"lisp\">;; \ud83d\udce6 RUBY-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Ruby.(use-package ruby-ts-mode  :interpreter  (\"bundler\" . ruby-ts-mode)  (\"ruby\" . ruby-ts-mode)  :mode  (\"\\\\.rb\\\\'\" . ruby-ts-mode)  (\"\\\\Vagrantfile\\\\'\" . ruby-ts-mode))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p>TypeScript:<\/p>\n<pre><code class=\"lisp\">;; \ud83d\udce6 TYPESCRIPT-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 TypeScript(use-package typescript-ts-mode  :defer t)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/li>\n<\/ul>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1089712\/\">https:\/\/habr.com\/ru\/articles\/1089712\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TreeSitter \u2013 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c\u0438 GitHub. \u0415\u0441\u043b\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u0433\u0440\u0443\u0431\u043e, \u0437\u0430\u0442\u043e \u043a\u0440\u0430\u0442\u043a\u043e, TreeSitter \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0440\u0435\u0432\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u042d\u0442\u043e \u043d\u0435 \u0440\u0430\u0437\u0431\u043e\u0440 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0430 \u043a\u043e\u0435-\u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0448\u0435. \u041d\u043e \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e TreeSitter \u043f\u043e\u0437\u043d\u0430\u0451\u0442\u0441\u044f \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438.\u0412\u043e\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 \u043a\u0430\u043a \u0431\u044b\u043b\u043e? \u0425\u043e\u0447\u0435\u0448\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0432 \u0441\u0432\u043e\u0451\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0438\u043b\u0438 IDE \u2013 \u0441\u0430\u0434\u0438\u0441\u044c \u0438 \u043f\u0438\u0448\u0438 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.\u041a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441? \u0421\u043a\u0430\u0447\u0430\u0439 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 TreeSitter \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0439 \u0435\u0439 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u0430 \u043e\u043d\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0434\u0430\u0441\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0440\u0435\u0432\u043e.\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 (\u0432\u0441\u0435\u043c \u043c\u0438\u0440\u043e\u043c), \u0430 \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0434\u0435 \u0445\u043e\u0447\u0435\u0448\u044c.\u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 JavaScript. \u0424\u0430\u0439\u043b \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 C, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 (.so \u0432 *nix, .dll \u0432 Windows).\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f:Emacs.\u041d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432.\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 treesit.el.\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0441 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430\u043c\u0438. \u0412 DEB-\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 built-essential:apt-get install build-essential &#8212;yes\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 treesit.el\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c treesit.el. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a treesit-language-source-alist. \u041a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u0435\u0451 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u0438 \u043f\u0443\u0442\u044c \u043a \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0443 \u0441 \u043a\u043e\u0434\u043e\u043c, \u0435\u0441\u043b\u0438 \u043e\u043d \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 src\/. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 (\u0442\u0435\u0433 \u0438\u043b\u0438 \u0432\u0435\u0442\u043a\u0430 Git). \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0443\u043a\u0430\u0436\u0435\u0442\u0435 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438, \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0442\u043a\u0435. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u043e\u0439 \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c\u0438. \u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435, \u044d\u0442\u043e \u0430\u043d\u0442\u0438\u043f\u0430\u0442\u0442\u0435\u0440\u043d \u201c\u0434\u0435\u0442\u043e\u043d\u0430\u0442\u043e\u0440\u201d.\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0430\u043b\u043e, \u043d\u0443\u0436\u043d\u043e \u0438\u0445 \u0435\u0449\u0451 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0443\u043c\u0435\u044e\u0442 \u0441\u0430\u043c\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u043d\u043e \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e.\u0422\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0432\u0435\u0437\u0434\u0435 \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u043d\u0430 \u0431\u0430\u0437\u0435 TreeSitter \u0432\u043c\u0435\u0441\u0442\u043e \u201c\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e\u201d (\u043d\u0430 \u0431\u0430\u0437\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a major-mode-remap-alist.\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e init.el \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:;; \ud83d\udce6 TREESIT;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 TreeSitter(use-package treesit  :config  ;; \u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438  (setq treesit-language-source-alist    &#8216;(       (asciidoc         &#171;https:\/\/github.com\/cathaysia\/tree-sitter-asciidoc.git&#187;         &#171;v0.3.0&#187;         &#171;tree-sitter-asciidoc\/src\/&#187;)       (asciidoc-inline         &#171;https:\/\/github.com\/cathaysia\/tree-sitter-asciidoc.git&#187;         &#171;v0.3.0&#187;         &#171;tree-sitter-asciidoc_inline\/src\/&#187;)       (bash         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-bash.git&#187;         ;; &#171;v0.25.1&#187; ;; ABI v15         &#171;v0.23.3&#187;)       (c         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-c.git&#187;         ;; &#171;v0.24.1&#187; ;; ABI v15         &#171;v0.23.5&#187;)       (cpp         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-cpp.git&#187;         &#171;v0.23.4&#187;)       (c-sharp         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-c-sharp.git&#187;         ;; &#171;v0.23.5&#187; ;; ABI v15         &#171;v0.23.1&#187;)    ;; ABI v14       (css         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-css.git&#187;         ;; &#171;v0.25.0&#187; ;; ABI v15         &#171;v0.23.2&#187;)       (dockerfile         &#171;https:\/\/github.com\/camdencheek\/tree-sitter-dockerfile.git&#187;         &#171;v0.2.0&#187;         &#171;src\/&#187;)       (go         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-go.git&#187;         ;; &#171;v0.25.0&#187; ;; ABI v15         &#171;v0.23.4&#187;)       (gomod         &#171;https:\/\/github.com\/camdencheek\/tree-sitter-go-mod.git&#187;         &#171;v1.1.0&#187;)       (html         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-html.git&#187;         &#171;v0.23.2&#187;)       (java         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-java.git&#187;         &#171;v0.23.5&#187;)       (javascript         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-javascript.git&#187;         &#171;v0.23.1&#187;         &#171;src\/&#187;)       (json         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-json.git&#187;         &#171;v0.24.8&#187;)       (make         &#171;https:\/\/github.com\/tree-sitter-grammars\/tree-sitter-make.git&#187;         &#171;v1.1.1&#187;         &#171;src\/&#187;)       (markdown         &#171;https:\/\/github.com\/tree-sitter-grammars\/tree-sitter-markdown.git&#187;         &#171;v0.4.1&#187;         &#171;tree-sitter-markdown\/src&#187;)       (markdown-inline         &#171;https:\/\/github.com\/tree-sitter-grammars\/tree-sitter-markdown.git&#187;         &#171;v0.4.1&#187;         &#171;tree-sitter-markdown-inline\/src&#187;)       (python         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-python.git&#187;         &#171;v0.23.6&#187;         &#171;src\/&#187;)       (ruby         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-ruby.git&#187;         &#171;v0.23.1&#187;         &#171;src\/&#187;)       (rust         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-rust.git&#187;         &#171;v0.23.3&#187;)       (tsx         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-typescript.git&#187;         &#171;v0.23.2&#187;         &#171;tsx\/src\/&#187;)       (typescript         &#171;https:\/\/github.com\/tree-sitter\/tree-sitter-typescript.git&#187;         &#171;v0.23.2&#187;         &#171;typescript\/src\/&#187;)       (typst         &#171;https:\/\/github.com\/uben0\/tree-sitter-typst.git&#187;         &#171;0.11&#187;         &#171;src\/&#187;)       (yaml         &#171;https:\/\/github.com\/tree-sitter-grammars\/tree-sitter-yaml.git&#187;         &#171;v0.7.2&#187;         &#171;src\/&#187;)))  ;; \u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a  (dolist (source treesit-language-source-alist)    (let ((lang (car source)))      (unless (treesit-ready-p lang t)        (with-demoted-errors &#171;Treesit: \u043e\u0448\u0438\u0431\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438: %s&#187;          (treesit-install-language-grammar lang)))))  ;; \u0417\u0430\u043c\u0435\u043d\u0430 &#171;\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445&#187; \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u043d\u0430 TreeSitter  (add-to-list &#8216;major-mode-remap-alist &#8216;(bash-mode . bash-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(c++-mode . c++-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(c-mode . c-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(csharp-mode . csharp-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(css-mode . css-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(dockerfile-mode . dockerfile-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(go-mode . go-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(html-mode . html-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(java-mode . java-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(js-mode . js-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(json-mode . json-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(python-mode . python-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(ruby-mode . ruby-ts-mode))  (add-to-list &#8216;major-mode-remap-alist &#8216;(yaml-mode . yaml-ts-mode)))\u041e\u0431\u0440\u0430\u0442\u0438\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b 2 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438? \u041e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e: \u043b\u0438\u0431\u043e \u0432 \u044f\u0437\u044b\u043a\u0435 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u043a\u0430\u043a \u0432 Golang, \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433.\u041e\u0431\u044b\u0447\u043d\u043e \u0434\u0432\u0443\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0442\u043e\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Markdown \u0438 AsciiDoc: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0435\u043b\u0438\u043c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0430\u0431\u0437\u0430\u0446\u044b, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u0436\u0435 \u0438\u0445 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u0447\u0430\u0441\u0442\u0438. \u041e\u0442\u0441\u044e\u0434\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0441 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c _inline.\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u043a\u043e\u0434\u0430 \u2013 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0442\u0435\u0433\u0430\u043c Git. \u0412 Emacs 30.1, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f TreeSitter ABI v14, \u0438 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a \u0445\u043e\u0442\u044c \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f, \u043d\u043e \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u044b\u0439 Emacs, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0443\u0436\u043d\u043e\u0439 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438.\u0420\u0435\u0436\u0438\u043c\u044b\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 init.el \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0443\u0436\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432:Dockerfile \/ Containerfile:;; \ud83d\udce6 DOCKERFILE-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u043d\u0430 \u0431\u0430\u0437\u0435 TreeSitter \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Dockerfile.(use-package dockerfile-ts-mode  :defer t  :mode (&#171;Containerfile\\\\'&#187; . dockerfile-ts-mode))\u0421 Dockerfile \u0440\u0435\u0436\u0438\u043c \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0430 \u0432\u043e\u0442 \u0441 Containerfile \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e.Golang:;; \ud83d\udce6 GO-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u044f\u0437\u044b\u043a\u0430 Golang(use-package go-ts-mode  :defer t)HTML:;; \ud83d\udce6 HTML-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 HTML \u0438 SGML.(use-package html-ts-mode  :defer t)Java:;; \ud83d\udce6 JAVA;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Java.(use-package java-ts-mode  :defer t)JavaScript:;; \ud83d\udce6 JS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JavaScript.(use-package js  :defer t  :custom  (js-chain-indent t &#171;\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443.&#187;)  (js-indent-level 2 &#171;\u041e\u0442\u0441\u0442\u0443\u043f \u0432 2 \u043f\u0440\u043e\u0431\u0435\u043b\u0430, \u0430 \u043d\u0435 4 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e).&#187;)  (js-switch-indent-offset 2 &#171;\u041e\u0442\u0441\u0442\u0443\u043f \u0432 2 \u043f\u0440\u043e\u0431\u0435\u043b\u0430 \u0434\u043b\u044f switch\/case.&#187;))JSON:;; \ud83d\udce6 JSON-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON \u0447\u0435\u0440\u0435\u0437 TreeSitter(use-package json-ts-mode :defer t)Markdown: \u0440\u0435\u0436\u0438\u043c markdown-ts-mode \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 Emacs 31. \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u043e\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 GNU ELPA \u2013 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e.Python:;; \ud83d\udce6 PYTHON-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Python \u0447\u0435\u0440\u0435\u0437 TreeSitter(use-package python  :pin gnu  :init  (unless (alist-get &#8216;python package-alist)    (with-demoted-errors &#171;\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f `python&#8217;: %s&#187;      (package-upgrade &#8216;python)))  :interpreter  (&#171;python[0-9]&#187; . python-mode)  :custom  (py-pylint-command-args &#171;&#8212;max-line-length 120&#187; &#171;\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 pylint&#187;)  (python-indent-guess-indent-offset-verbose nil &#171;\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f&#187;)  (python-indent-offset 4 &#171;\u041e\u0442\u0441\u0442\u0443\u043f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 4 \u043f\u0440\u043e\u0431\u0435\u043b\u0430&#187;))Ruby:;; \ud83d\udce6 RUBY-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Ruby.(use-package ruby-ts-mode  :interpreter  (&#171;bundler&#187; . ruby-ts-mode)  (&#171;ruby&#187; . ruby-ts-mode)  :mode  (&#171;\\\\.rb\\\\'&#187; . ruby-ts-mode)  (&#171;\\\\Vagrantfile\\\\'&#187; . ruby-ts-mode))TypeScript:;; \ud83d\udce6 TYPESCRIPT-TS-MODE;; \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 TypeScript(use-package typescript-ts-mode  :defer t)\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 https:\/\/habr.com\/ru\/articles\/1089712\/<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-497144","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497144","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=497144"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497144\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=497144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=497144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=497144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}