From 3a167651794e8f79e865cb73ea85d74734cd6dd3 Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Mon, 21 Oct 2024 02:25:31 +0300 Subject: [PATCH] emacs: treesit-fold, indent-bars --- .emacs.d/init.el | 172 +++++++++++++++++++++++++++---------- Emacs.org | 216 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 284 insertions(+), 104 deletions(-) diff --git a/.emacs.d/init.el b/.emacs.d/init.el index 36f715e..9f6322e 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -169,8 +169,7 @@ (evil-set-undo-system 'undo-tree)) (when (fboundp #'general-define-key) (general-define-key - :states '(motion) - "ze" nil))) + :states '(motion)))) (use-package evil-surround :straight t @@ -365,7 +364,6 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer." (general-define-key :keymaps '(hs-minor-mode-map outline-minor-mode-map outline-mode-map) :states '(normal motion) - "ze" 'hs-hide-level "TAB" 'evil-toggle-fold) (defun my/zoom-in () @@ -756,7 +754,8 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer." :straight t :config (add-to-list 'editorconfig-indentation-alist - '(emmet-mode emmet-indentation))) + '(emmet-mode emmet-indentation)) + (editorconfig-mode)) (recentf-mode 1) @@ -821,9 +820,19 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer." '(image-mode doc-view-mode pdf-view-mode exwm-mode)) (general-define-key :states '(normal motion) - "-" nil - "--" #'avy-goto-char-2 - "-=" #'avy-goto-symbol-1)) + "-" #'avy-goto-char-timer)) + +(defun avy-action-embark (pt) + (unwind-protect + (save-excursion + (goto-char pt) + (embark-act)) + (select-window + (cdr (ring-ref avy-ring 0)))) + t) + +(with-eval-after-load 'avy + (setf (alist-get ?. avy-dispatch-alist) 'avy-action-embark)) (use-package ace-link :straight t @@ -886,7 +895,16 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer." '((eshell-atuin-history (vertico-sort-function . nil)) (my/index-nav (vertico-sort-function . nil)) (org-ql-view (vertico-sort-function . nil)) - (my/consult-line (vertico-sort-function . nil))))) + (my/consult-line (vertico-sort-function . nil)) + (telega-msg-add-reaction grid)))) + +(use-package vertico-quick + :after vertico + :config + (general-define-key + :keymaps '(vertico-map) + "M-q" #'vertico-quick-insert + "C-q" #'vertico-quick-exit)) (use-package orderless :straight t @@ -1449,14 +1467,16 @@ targets." (use-package nerd-icons :straight t) -(use-package highlight-indent-guides - :straight t +(use-package indent-bars + :straight (:host github :repo "jdtsmith/indent-bars") :if (not (or my/remote-server)) - :hook ((prog-mode . highlight-indent-guides-mode) - (LaTeX-mode . highlight-indent-guides-mode)) + :hook ((prog-mode . indent-bars-mode) + (LaTeX-mode . indent-bars-mode)) :config - (setq highlight-indent-guides-method 'bitmap) - (setq highlight-indent-guides-bitmap-function 'highlight-indent-guides--bitmap-line)) + (require 'indent-bars-ts) + (setopt indent-bars-no-descend-lists t + indent-bars-treesit-support t + indent-bars-width-frac 0.3)) (use-package rainbow-delimiters :straight t @@ -1708,23 +1728,8 @@ targets." (setq lsp-ui-doc-delay 2) (setq lsp-ui-sideline-show-hover nil)) -;; (use-package helm-lsp -;; :straight t -;; :commands helm-lsp-workspace-symbol) - -;; (use-package origami -;; :straight t -;; :hook (prog-mode . origami-mode)) - -;; (use-package lsp-origami -;; :straight t -;; :config -;; (add-hook 'lsp-after-open-hook #'lsp-origami-try-enable)) - -(use-package lsp-treemacs - :after (lsp) - :straight t - :commands lsp-treemacs-errors-list) +(use-package all-the-icons + :straight t) (my-leader-def :infix "l" @@ -1835,6 +1840,55 @@ targets." (run-hooks ',(intern (concat (symbol-name old-mode) "-hook"))))))))) +(use-package treesit-fold + :straight (treesit-fold :type git :host github :repo "emacs-tree-sitter/treesit-fold") + :commands (treesit-fold-mode)) + +(defun my/treesit-fold--get-nodes-to-fold () + (when-let* + ((node (ignore-errors (treesit-buffer-root-node))) + (patterns (seq-mapcat (lambda (fold-range) `((,(car fold-range)) @name)) + (alist-get major-mode treesit-fold-range-alist))) + (query (ignore-errors + (treesit-query-compile (treesit-node-language node) + patterns))) + (nodes-to-fold (treesit-query-capture node query)) + (mode-ranges (alist-get major-mode treesit-fold-range-alist)) + (nodes-to-fold + (cl-remove-if (lambda (node) + (treesit-fold--non-foldable-node-p (cdr node) mode-ranges)) + nodes-to-fold))) + nodes-to-fold)) + +(defun my/treesit-fold-hide-children () + (interactive) + (let* ((current-node (treesit-fold--foldable-node-at-pos)) + (all-nodes-to-fold (my/treesit-fold--get-nodes-to-fold)) + ;; Find foldable children of `current-node' + (target-nodes-to-fold + (seq-filter + (lambda (n) + (cl-block tree-iter + (while n + (setq n (treesit-node-parent n)) + (when (equal n current-node) + (cl-return-from tree-iter t))))) + (mapcar #'cdr all-nodes-to-fold)))) + (dolist (node target-nodes-to-fold) + (treesit-fold-close node)))) + +(defun my/evil-fold-hide-level () + (interactive) + (cond + (hs-minor-mode (hs-hide-level)) + (treesit-fold-mode (my/treesit-fold-hide-children)))) + +(with-eval-after-load 'treesit-fold + (general-define-key + :states '(normal) + "ze" #'my/evil-fold-hide-level) + (keymap-unset evil-motion-state-map "z e" t)) + (use-package dap-mode :straight t :if (not (or my/remote-server my/is-termux)) @@ -2096,13 +2150,13 @@ Returns ( . ) or nil." (or (copilot-accept-completion) (when (my/should-run-emmet-p) (my/emmet-or-tab)) (when (and (eq evil-state 'normal) - (or hs-minor-mode outline-minor-mode)) + (or hs-minor-mode treesit-fold-mode outline-minor-mode)) (evil-toggle-fold) t) (indent-for-tab-command))) (use-package copilot - :straight (:host github :repo "copilot/copilot.el") + :straight (:host github :repo "copilot-emacs/copilot.el") :commands (copilot-mode) :if (not (or my/remote-server my/is-termux)) :init @@ -2166,12 +2220,12 @@ Returns ( . ) or nil." :init (add-hook 'typescript-mode-hook #'smartparens-mode) (add-hook 'typescript-mode-hook #'rainbow-delimiters-mode) - (add-hook 'typescript-mode-hook #'hs-minor-mode) + (add-hook 'typescript-mode-hook #'treesit-fold-mode) :config (my/set-smartparens-indent 'typescript-mode)) (add-hook 'js-mode-hook #'smartparens-mode) -(add-hook 'js-mode-hook #'hs-minor-mode) +(add-hook 'js-mode-hook #'treesit-fold-mode) (my/set-smartparens-indent 'js-mode) (use-package jest-test-mode @@ -2241,14 +2295,14 @@ Returns ( . ) or nil." (defun my/web-mode-lsp () (when (seq-some - (lambda (regex) (string-match-p regex (buffer-name))) + (lambda (regex) (string-match-p regex (buffer-file-name))) my/web-mode-lsp-extensions) (lsp-deferred))) (add-hook 'web-mode-hook #'my/web-mode-lsp) (defun my/web-mode-vue-setup (&rest _) - (when (string-match-p (rx ".vue" eos) (buffer-name)) + (when (string-match-p (rx ".vue" eos) (buffer-file-name)) (setq-local web-mode-script-padding 0) (setq-local web-mode-style-padding 0) (setq-local create-lockfiles nil) @@ -2713,7 +2767,7 @@ Returns ( . ) or nil." (when (my/ltex-need-p) (lsp))) -(add-hook 'text-mode-hook #'my/text-mode-lsp-maybe) +;; (add-hook 'text-mode-hook #'my/text-mode-lsp-maybe) (use-package langtool :straight t @@ -2855,7 +2909,7 @@ Returns ( . ) or nil." (lsp)))) (add-hook 'python-mode-hook #'smartparens-mode) -(add-hook 'python-mode-hook #'hs-minor-mode) +(add-hook 'python-mode-hook #'treesit-fold-mode) (use-package pipenv :straight t @@ -2974,7 +3028,7 @@ Returns ( . ) or nil." :mode "\\.json\\'" :config (add-hook 'json-mode-hook #'smartparens-mode) - (add-hook 'json-mode-hook #'hs-minor-mode) + (add-hook 'json-mode-hook #'treesit-fold-mode) (my/set-smartparens-indent 'json-mode)) (use-package csv-mode @@ -2987,7 +3041,7 @@ Returns ( . ) or nil." :mode "\\.yml\\'" :config (add-hook 'yaml-mode-hook 'smartparens-mode) - (add-hook 'yaml-mode-hook 'highlight-indent-guides-mode) + ;; (add-hook 'yaml-mode-hook 'highlight-indent-guides-mode) (add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))) (use-package dotenv-mode @@ -3111,7 +3165,7 @@ Returns ( . ) or nil." :config (my/set-smartparens-indent 'go-mode) (add-hook 'go-mode-hook #'smartparens-mode) - (add-hook 'go-mode-hook #'hs-minor-mode)) + (add-hook 'go-mode-hook #'treesit-fold-mode)) (use-package csharp-mode :straight t @@ -3121,7 +3175,7 @@ Returns ( . ) or nil." (setq lsp-csharp-server-path (executable-find "omnisharp-wrapper")) (add-hook 'csharp-mode-hook #'csharp-tree-sitter-mode) (add-hook 'csharp-tree-sitter-mode-hook #'smartparens-mode) - (add-hook 'csharp-mode-hook #'hs-minor-mode) + (add-hook 'csharp-mode-hook #'treesit-fold-mode) (my/set-smartparens-indent 'csharp-tree-sitter-mode)) (use-package csproj-mode @@ -3514,7 +3568,8 @@ With ARG, repeats or can move backward if negative." ;; (hs-minor-mode -1) ;; (electric-indent-local-mode -1) ;; (rainbow-delimiters-mode -1) - (highlight-indent-guides-mode -1))) + ;; (highlight-indent-guides-mode -1) + )) (use-package ob-async :straight t @@ -3652,6 +3707,29 @@ With ARG, repeats or can move backward if negative." (org-babel-lob-execute-maybe) (org-babel-execute-src-block arg))))))) +(defun my/org-babel-execute-marked (&optional arg) + (interactive "P") + (let (markers) + (org-element-map (org-element-parse-buffer) 'src-block + (lambda (elem) + (let ((params (org-element-property :parameters elem))) + (when (and params + (string-match-p (rx "startup t") params)) + (let ((m (make-marker))) + (set-marker m (org-element-property :begin elem)) + (set-marker-insertion-type m t) + (push m markers)))))) + (setq markers (nreverse markers)) + (when arg + (setq markers + (seq-filter + (lambda (m) (> (marker-position m) (point))) + markers))) + (dolist (m markers) + (goto-char m) + (ignore-errors + (org-babel-execute-src-block))))) + (with-eval-after-load 'org (general-define-key :keymaps 'org-babel-map @@ -7284,7 +7362,7 @@ ENTRY is an instance of `elfeed-entry'." :init (my-leader-def "an" #'my/mastodon) :config - (setq mastodon-instance-url "https://emacs.ch") + (setq mastodon-instance-url "https://mastodon.bsd.cafe") (setq mastodon-active-user "sqrtminusone") (my/persp-add-rule mastodon-mode 0 "mastodon") ;; Hide spoilers by default @@ -7772,6 +7850,8 @@ base toot." :config (setq telega-emoji-use-images nil) (setq telega-chat-fill-column 80) + (setq telega-completing-read-function #'completing-read) + (add-to-list 'savehist-additional-variables 'telega-msg-add-reaction) (remove-hook 'telega-chat-mode-hook #'telega-chat-auto-fill-mode) (general-define-key :keymaps '(telega-root-mode-map telega-chat-mode-map) @@ -9077,7 +9157,7 @@ to `dired' if used interactively." (advice-add 'elcord--try-update-presence :filter-args #'my/elcord-update-presence-mask-advice) (add-to-list 'elcord-mode-text-alist '(telega-chat-mode . "Telega Chat")) (add-to-list 'elcord-mode-text-alist '(telega-root-mode . "Telega Root")) - (elcord-mode) + ;; (elcord-mode) (my/elcord-symlink)) (use-package snow diff --git a/Emacs.org b/Emacs.org index e7dc3fd..3bac12b 100644 --- a/Emacs.org +++ b/Emacs.org @@ -390,8 +390,7 @@ Basic evil configuration. (evil-set-undo-system 'undo-tree)) (when (fboundp #'general-define-key) (general-define-key - :states '(motion) - "ze" nil))) + :states '(motion)))) #+end_src **** Addons [[https://github.com/emacs-evil/evil-surround][evil-surround]] emulates one of my favorite vim plugins, surround.vim. Adds a lot of parentheses management options. @@ -672,7 +671,6 @@ Evil does a pretty good job of abstracting all these packages with a set of vim- (general-define-key :keymaps '(hs-minor-mode-map outline-minor-mode-map outline-mode-map) :states '(normal motion) - "ze" 'hs-hide-level "TAB" 'evil-toggle-fold) #+end_src **** Zoom UI @@ -1283,7 +1281,8 @@ References: :straight t :config (add-to-list 'editorconfig-indentation-alist - '(emmet-mode emmet-indentation))) + '(emmet-mode emmet-indentation)) + (editorconfig-mode)) #+end_src *** Editing files @@ -1396,11 +1395,24 @@ References: '(image-mode doc-view-mode pdf-view-mode exwm-mode)) (general-define-key :states '(normal motion) - "-" nil - "--" #'avy-goto-char-2 - "-=" #'avy-goto-symbol-1)) + "-" #'avy-goto-char-timer)) #+End_src +Integrate avy with embark: +#+begin_src emacs-lisp +(defun avy-action-embark (pt) + (unwind-protect + (save-excursion + (goto-char pt) + (embark-act)) + (select-window + (cdr (ring-ref avy-ring 0)))) + t) + +(with-eval-after-load 'avy + (setf (alist-get ?. avy-dispatch-alist) 'avy-action-embark)) +#+end_src + [[https://github.com/abo-abo/ace-link][ace-link]] is a package to jump to links with avy. #+begin_src emacs-lisp (use-package ace-link @@ -1445,7 +1457,7 @@ Persist history over Emacs restarts. (savehist-mode)) #+end_src -*** Vertico extensions +*** vertico extensions Vertico has a lot of extensions. [[https://github.com/minad/vertico/blob/main/extensions/vertico-directory.el][vertico-directory]] simplifies directory navigation. @@ -1488,7 +1500,19 @@ Vertico has a lot of extensions. '((eshell-atuin-history (vertico-sort-function . nil)) (my/index-nav (vertico-sort-function . nil)) (org-ql-view (vertico-sort-function . nil)) - (my/consult-line (vertico-sort-function . nil))))) + (my/consult-line (vertico-sort-function . nil)) + (telega-msg-add-reaction grid)))) +#+end_src + +[[https://github.com/minad/vertico/blob/main/extensions/vertico-quick.el][vertico-quick]] enables ivy-like bindings to choose candidates. +#+begin_src emacs-lisp +(use-package vertico-quick + :after vertico + :config + (general-define-key + :keymaps '(vertico-map) + "M-q" #'vertico-quick-insert + "C-q" #'vertico-quick-exit)) #+end_src *** orderless @@ -2276,16 +2300,18 @@ Run =M-x all-the-icons-install-fonts= at first setup. :straight t) #+end_src ** Text highlight -Highlight indent guides. +Highlight indent guides. I used [[https://github.com/DarthFennec/highlight-indent-guides][highlight-indent-guides]] before but [[https://github.com/jdtsmith/indent-bars][indent-bars]] seems to work better, and also doesn't break with =treesit-fold=. #+begin_src emacs-lisp -(use-package highlight-indent-guides - :straight t +(use-package indent-bars + :straight (:host github :repo "jdtsmith/indent-bars") :if (not (or my/remote-server)) - :hook ((prog-mode . highlight-indent-guides-mode) - (LaTeX-mode . highlight-indent-guides-mode)) + :hook ((prog-mode . indent-bars-mode) + (LaTeX-mode . indent-bars-mode)) :config - (setq highlight-indent-guides-method 'bitmap) - (setq highlight-indent-guides-bitmap-function 'highlight-indent-guides--bitmap-line)) + (require 'indent-bars-ts) + (setopt indent-bars-no-descend-lists t + indent-bars-treesit-support t + indent-bars-width-frac 0.3)) #+end_src Rainbow parentheses. @@ -2617,34 +2643,11 @@ References: :config (setq lsp-ui-doc-delay 2) (setq lsp-ui-sideline-show-hover nil)) + +(use-package all-the-icons + :straight t) #+end_src -#+RESULTS: -: t - -**** Integrations -The only integration left now is treemacs. - -Origami should've leveraged LSP folding, but it was too unstable at the moment I tried it. -#+begin_src emacs-lisp -;; (use-package helm-lsp -;; :straight t -;; :commands helm-lsp-workspace-symbol) - -;; (use-package origami -;; :straight t -;; :hook (prog-mode . origami-mode)) - -;; (use-package lsp-origami -;; :straight t -;; :config -;; (add-hook 'lsp-after-open-hook #'lsp-origami-try-enable)) - -(use-package lsp-treemacs - :after (lsp) - :straight t - :commands lsp-treemacs-errors-list) -#+end_src **** Keybindings #+begin_src emacs-lisp (my-leader-def @@ -2733,7 +2736,8 @@ Override flycheck checker with eslint. (setq-local lsp-diagnostic-package :none) (setq-local flycheck-checker 'javascript-eslint)) #+end_src -*** Tree Sitter +*** Tree-sitter +**** treesit.el Tree-Sitter integration with Emacs 29. References: @@ -2782,6 +2786,73 @@ References: (run-hooks ',(intern (concat (symbol-name old-mode) "-hook"))))))))) #+end_src +**** treesit-fold +[[https://github.com/emacs-tree-sitter/treesit-fold][treesit-fold]] uses treesit.el for folding. + +#+begin_src emacs-lisp +(use-package treesit-fold + :straight (treesit-fold :type git :host github :repo "emacs-tree-sitter/treesit-fold") + :commands (treesit-fold-mode)) +#+end_src + +***** Hide children of current node +A function to hide children of the current foldable node. This is somewhat similar to =hs-hide-level=, which I got used to. + +First, find all foldable nodes: +#+begin_src emacs-lisp +(defun my/treesit-fold--get-nodes-to-fold () + (when-let* + ((node (ignore-errors (treesit-buffer-root-node))) + (patterns (seq-mapcat (lambda (fold-range) `((,(car fold-range)) @name)) + (alist-get major-mode treesit-fold-range-alist))) + (query (ignore-errors + (treesit-query-compile (treesit-node-language node) + patterns))) + (nodes-to-fold (treesit-query-capture node query)) + (mode-ranges (alist-get major-mode treesit-fold-range-alist)) + (nodes-to-fold + (cl-remove-if (lambda (node) + (treesit-fold--non-foldable-node-p (cdr node) mode-ranges)) + nodes-to-fold))) + nodes-to-fold)) +#+end_src + +Then filter children of the current foldable node and fold them: +#+begin_src emacs-lisp +(defun my/treesit-fold-hide-children () + (interactive) + (let* ((current-node (treesit-fold--foldable-node-at-pos)) + (all-nodes-to-fold (my/treesit-fold--get-nodes-to-fold)) + ;; Find foldable children of `current-node' + (target-nodes-to-fold + (seq-filter + (lambda (n) + (cl-block tree-iter + (while n + (setq n (treesit-node-parent n)) + (when (equal n current-node) + (cl-return-from tree-iter t))))) + (mapcar #'cdr all-nodes-to-fold)))) + (dolist (node target-nodes-to-fold) + (treesit-fold-close node)))) +#+end_src + +#+begin_src emacs-lisp +(defun my/evil-fold-hide-level () + (interactive) + (cond + (hs-minor-mode (hs-hide-level)) + (treesit-fold-mode (my/treesit-fold-hide-children)))) +#+end_src + +#+begin_src emacs-lisp +(with-eval-after-load 'treesit-fold + (general-define-key + :states '(normal) + "ze" #'my/evil-fold-hide-level) + (keymap-unset evil-motion-state-map "z e" t)) +#+end_src + *** DAP An Emacs client for Debugger Adapter Protocol. @@ -3112,13 +3183,13 @@ A general-purpose package to run formatters on files. While the most popular for (or (copilot-accept-completion) (when (my/should-run-emmet-p) (my/emmet-or-tab)) (when (and (eq evil-state 'normal) - (or hs-minor-mode outline-minor-mode)) + (or hs-minor-mode treesit-fold-mode outline-minor-mode)) (evil-toggle-fold) t) (indent-for-tab-command))) (use-package copilot - :straight (:host github :repo "copilot/copilot.el") + :straight (:host github :repo "copilot-emacs/copilot.el") :commands (copilot-mode) :if (not (or my/remote-server my/is-termux)) :init @@ -3199,14 +3270,14 @@ My bit of config here: :init (add-hook 'typescript-mode-hook #'smartparens-mode) (add-hook 'typescript-mode-hook #'rainbow-delimiters-mode) - (add-hook 'typescript-mode-hook #'hs-minor-mode) + (add-hook 'typescript-mode-hook #'treesit-fold-mode) :config (my/set-smartparens-indent 'typescript-mode)) #+end_src *** JavaScript #+begin_src emacs-lisp (add-hook 'js-mode-hook #'smartparens-mode) -(add-hook 'js-mode-hook #'hs-minor-mode) +(add-hook 'js-mode-hook #'treesit-fold-mode) (my/set-smartparens-indent 'js-mode) #+end_src *** Jest @@ -3292,7 +3363,7 @@ Hooking this up with lsp. (defun my/web-mode-lsp () (when (seq-some - (lambda (regex) (string-match-p regex (buffer-name))) + (lambda (regex) (string-match-p regex (buffer-file-name))) my/web-mode-lsp-extensions) (lsp-deferred))) @@ -3302,7 +3373,7 @@ Hooking this up with lsp. Vue settings #+begin_src emacs-lisp (defun my/web-mode-vue-setup (&rest _) - (when (string-match-p (rx ".vue" eos) (buffer-name)) + (when (string-match-p (rx ".vue" eos) (buffer-file-name)) (setq-local web-mode-script-padding 0) (setq-local web-mode-style-padding 0) (setq-local create-lockfiles nil) @@ -3708,7 +3779,7 @@ To use it in =text-mode-hook= (when (my/ltex-need-p) (lsp))) -(add-hook 'text-mode-hook #'my/text-mode-lsp-maybe) +;; (add-hook 'text-mode-hook #'my/text-mode-lsp-maybe) #+end_src *** LanguageTool LanguageTool is a great offline spell checker. For some reason, the download link is nowhere to be found on the home page, so it is listed in the references as well. @@ -3907,7 +3978,7 @@ For some reason it doesn't use pipenv python executable, so here is a small work (lsp)))) (add-hook 'python-mode-hook #'smartparens-mode) -(add-hook 'python-mode-hook #'hs-minor-mode) +(add-hook 'python-mode-hook #'treesit-fold-mode) #+end_src *** pipenv [[https://github.com/pypa/pipenv][Pipenv]] is a package manager for Python. @@ -4124,7 +4195,7 @@ A function to start up [[https://www.tensorflow.org/tensorboard][TensorBoard]]. :mode "\\.json\\'" :config (add-hook 'json-mode-hook #'smartparens-mode) - (add-hook 'json-mode-hook #'hs-minor-mode) + (add-hook 'json-mode-hook #'treesit-fold-mode) (my/set-smartparens-indent 'json-mode)) #+end_src *** CSV @@ -4141,7 +4212,7 @@ A function to start up [[https://www.tensorflow.org/tensorboard][TensorBoard]]. :mode "\\.yml\\'" :config (add-hook 'yaml-mode-hook 'smartparens-mode) - (add-hook 'yaml-mode-hook 'highlight-indent-guides-mode) + ;; (add-hook 'yaml-mode-hook 'highlight-indent-guides-mode) (add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))) #+end_src ** Configuration @@ -4317,7 +4388,7 @@ Emacs integration for [[http://gnuplot.info/][gnuplot]]. :config (my/set-smartparens-indent 'go-mode) (add-hook 'go-mode-hook #'smartparens-mode) - (add-hook 'go-mode-hook #'hs-minor-mode)) + (add-hook 'go-mode-hook #'treesit-fold-mode)) #+end_src ** .NET *** C# @@ -4337,7 +4408,7 @@ Disabled that for now because it depends on the old tree sitter. (setq lsp-csharp-server-path (executable-find "omnisharp-wrapper")) (add-hook 'csharp-mode-hook #'csharp-tree-sitter-mode) (add-hook 'csharp-tree-sitter-mode-hook #'smartparens-mode) - (add-hook 'csharp-mode-hook #'hs-minor-mode) + (add-hook 'csharp-mode-hook #'treesit-fold-mode) (my/set-smartparens-indent 'csharp-tree-sitter-mode)) #+end_src *** MSBuild @@ -4885,7 +4956,8 @@ Turn of some minor modes in source blocks. ;; (hs-minor-mode -1) ;; (electric-indent-local-mode -1) ;; (rainbow-delimiters-mode -1) - (highlight-indent-guides-mode -1))) + ;; (highlight-indent-guides-mode -1) + )) #+end_src Async code blocks evaluations. Jupyter blocks have a built-in async, so they are set as ignored. @@ -5086,6 +5158,32 @@ First, execute things above and below the point: (org-babel-execute-src-block arg))))))) #+end_src +Execute all code blocks marked with =:startup t=: +#+begin_src emacs-lisp +(defun my/org-babel-execute-marked (&optional arg) + (interactive "P") + (let (markers) + (org-element-map (org-element-parse-buffer) 'src-block + (lambda (elem) + (let ((params (org-element-property :parameters elem))) + (when (and params + (string-match-p (rx "startup t") params)) + (let ((m (make-marker))) + (set-marker m (org-element-property :begin elem)) + (set-marker-insertion-type m t) + (push m markers)))))) + (setq markers (nreverse markers)) + (when arg + (setq markers + (seq-filter + (lambda (m) (> (marker-position m) (point))) + markers))) + (dolist (m markers) + (goto-char m) + (ignore-errors + (org-babel-execute-src-block))))) +#+end_src + Some keybindings: #+begin_src emacs-lisp (with-eval-after-load 'org @@ -10135,7 +10233,7 @@ The default UI is rather rough, but Nicolas Rougier's [[https://github.com/rougi :init (my-leader-def "an" #'my/mastodon) :config - (setq mastodon-instance-url "https://emacs.ch") + (setq mastodon-instance-url "https://mastodon.bsd.cafe") (setq mastodon-active-user "sqrtminusone") (my/persp-add-rule mastodon-mode 0 "mastodon") ;; Hide spoilers by default @@ -10718,6 +10816,8 @@ Or you can load up Element for a moment to see what the mention was, if that's e :config (setq telega-emoji-use-images nil) (setq telega-chat-fill-column 80) + (setq telega-completing-read-function #'completing-read) + (add-to-list 'savehist-additional-variables 'telega-msg-add-reaction) (remove-hook 'telega-chat-mode-hook #'telega-chat-auto-fill-mode) (general-define-key :keymaps '(telega-root-mode-map telega-chat-mode-map) @@ -12564,7 +12664,7 @@ And the package configuration: (advice-add 'elcord--try-update-presence :filter-args #'my/elcord-update-presence-mask-advice) (add-to-list 'elcord-mode-text-alist '(telega-chat-mode . "Telega Chat")) (add-to-list 'elcord-mode-text-alist '(telega-root-mode . "Telega Root")) - (elcord-mode) + ;; (elcord-mode) (my/elcord-symlink)) #+end_src *** Snow