emacs: treesit-fold, indent-bars

This commit is contained in:
Pavel Korytov 2024-10-21 02:25:31 +03:00
parent 758d693025
commit 3a16765179
2 changed files with 284 additions and 104 deletions

View file

@ -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 (<buffer> . <workspace-index>) 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 (<buffer> . <workspace-index>) 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 (<buffer> . <workspace-index>) 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 (<buffer> . <workspace-index>) 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 (<buffer> . <workspace-index>) 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 (<buffer> . <workspace-index>) 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 (<buffer> . <workspace-index>) 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 (<buffer> . <workspace-index>) 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 (<buffer> . <workspace-index>) 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

216
Emacs.org
View file

@ -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