Skip to content

Instantly share code, notes, and snippets.

@meain
Created March 14, 2023 18:40
Show Gist options
  • Save meain/65289f299277b5c1cc81b43c6f5db2c2 to your computer and use it in GitHub Desktop.
Save meain/65289f299277b5c1cc81b43c6f5db2c2 to your computer and use it in GitHub Desktop.
Split join args - emacs tree-sitter
(defun meain/closest-node (nodes)
(let ((distance 999999)
(node nil)
(point (point)))
(progn
(seq-do (lambda (x)
(let* (
(range (tsc-node-byte-range (cdr x)))
(start (byte-to-position (car range)))
(end (byte-to-position (cdr range)))
(smallest (min (abs (- start point))
(abs (- end point))))
)
(if (> distance smallest)
(progn
(setq node x)
(setq distance smallest)))))
nodes)
node)))
(defvar meain/split-join-langs '( ; (mode . ((list . (item trailing_comma))))
(go-mode . ((argument_list . (identifier t))
(parameter_list . (parameter_declaration t))))))
(defun meain/split-join-args ()
(interactive)
(let* ((settings (alist-get major-mode meain/split-join-langs))
(root-node (tsc-root-node tree-sitter-tree))
(node-selectors (mapcar 'car settings))
(string-query-builder (lambda (x) (concat "(" (symbol-name x) ") @list")))
(string-query (string-join (mapcar string-query-builder node-selectors) " "))
(query (tsc-make-query tree-sitter-language string-query))
(nodes (tsc-query-captures query root-node #'tsc--buffer-substring-no-properties))
(node (cdr (meain/closest-node nodes)))
(isettings (alist-get (tsc-node-type node) settings))
(join (s-contains-p "\n" (tsc-node-text node)))
(joiner (if join (cons ", " "") (cons ",\n" "\n")))
(string-query (concat "(" (symbol-name (car isettings)) ") @arg"))
(query (tsc-make-query tree-sitter-language string-query))
(inodes (tsc-query-captures query node #'tsc--buffer-substring-no-properties))
(range (tsc-node-byte-range node))
(start (byte-to-position (car range)))
(end (byte-to-position (cdr range)))
(text-pieces (seq-map (lambda (x) (tsc-node-text (cdr x))) inodes))
(text (string-join text-pieces (car joiner)))
(final-comma (if (and (not join) (cadr isettings)) "," "")))
(message "emacs-lisp-mode-8a0d:39 children: %s" children)
(goto-char (+ start 1))
(delete-char (- end start 2))
(insert (concat (cdr joiner) text final-comma (cdr joiner)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment