;; Time-stamp: <2025-06-25 20h01 BST (anker)> ;; ------------------------------------------------------------------- ;; We have expand region at home (defvar treesit--region-stack '()) (defun treesit-node-bounds-match-region-p (node beg end) "Returns `t' if the bounds of the region marked `beg' and `end' match the bounds of `node'." (and (= beg (treesit-node-start node)) (= end (treesit-node-end node)))) (defun treesit-mark-bigger-node () "Expand selection to the parent of the smallest node containing the region." (interactive) (unless mark-active (set-mark-command nil)) (unless (or (eq last-command 'treesit-mark-bigger-node) (eq last-command 'treesit-contract-region)) (setq treesit--region-stack nil)) (let* ((cur-node (treesit-node-on (region-beginning) (region-end))) (next-node (if ;; check if the node containing the selection is already good (not (treesit-node-bounds-match-region-p cur-node (region-beginning) (region-end))) cur-node (treesit-parent-until cur-node (lambda (n) (not (treesit-node-bounds-match-region-p n (region-beginning) (region-end)))))))) (unless (null next-node) (push (cons (region-beginning) (region-end)) treesit--region-stack) (set-mark (treesit-node-end next-node)) (goto-char (treesit-node-start next-node))))) (defun treesit-contract-region () "Contract a region to the last expansion." (interactive) (unless (null treesit--region-stack) (let ((last-region (pop treesit--region-stack))) (set-mark (cdr last-region)) (goto-char (car last-region))))) (defun treesit-reset-region () "Reset region to before the first invocation of `treesit-mark-bigger-node'." (interactive) (unless (null treesit--region-stack) (let ((last-region (car (last treesit--region-stack)))) (setq treesit--region-stack nil) (set-mark (cdr last-region)) (goto-char (car last-region)) (when (= (car last-region) (cdr last-region)) (deactivate-mark))))) (defvar-keymap treesit-mark-bigger-node-repeat-map :doc "Repeatedly expand selection up tree sitter nodes." :repeat (:exit (treesit-reset-region)) "" #'treesit-mark-bigger-node "-" #'treesit-contract-region "C-g" #'treesit-reset-region) (global-set-key (kbd "M-r") 'treesit-mark-bigger-node) (global-set-key (kbd "M-S-r") 'treesit-contract-region) ;; ------------------------------------------------------------------- ;; Window switching (use-package ace-window :ensure t :bind (("C-," . ace-window) ("C-x o" . ace-window)) :config (setq aw-keys '(?a ?r ?s ?t ?c ?e ?n ?i))) ;; ------------------------------------------------------------------- ;; General stuff ;; (global-set-key (kbd "C-b") 'recenter-top-bottom) ;; (global-set-key (kbd "M-b") 'downcase-word) ;; (global-set-key (kbd "C-l") 'backward-char) ;; (global-set-key (kbd "M-l") 'backward-word) (global-set-key (kbd "C-M-e") 'end-of-buffer) (global-set-key (kbd "C-M-a") 'beginning-of-buffer) (global-set-key (kbd "M-z") 'zap-up-to-char) ;; Fast movement (global-set-key (kbd "C-S-n") (lambda () (interactive) (ignore-errors (forward-line 5)))) (global-set-key (kbd "C-S-p") (lambda () (interactive) (ignore-errors (forward-line -5)))) (global-set-key (kbd "C-S-f") (lambda () (interactive) (ignore-errors (forward-char 5)))) (global-set-key (kbd "C-S-b") (lambda () (interactive) (ignore-errors (backward-char 5)))) ;; Hardcore mode (defconst hardcore-nav-mode t) (when hardcore-nav-mode (global-set-key (kbd "") nil) (global-set-key (kbd "") nil) (global-set-key (kbd "") nil) (global-set-key (kbd "") nil) (global-set-key (kbd "") nil) (global-set-key (kbd "") nil) (global-set-key (kbd "S-") nil) (global-set-key (kbd "S-") nil) (global-set-key (kbd "S-") nil) (global-set-key (kbd "C-") nil) (global-set-key (kbd "C-") nil) (global-set-key (kbd "C-") nil) (global-set-key (kbd "C-") nil) (global-set-key (kbd "C-") nil) (global-set-key (kbd "") nil) (global-set-key (kbd "") nil))