summaryrefslogtreecommitdiff
path: root/emacs/inits/14-movement.el
blob: 66da01fa3e3de097bc0bf23bc5d6bb661b2cd7bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
;; Time-stamp: <2025-06-25 20h18 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))
  "<return>" #'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 '(?n ?r ?s ?t ?h ?e ?a ?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 "<XF86Back>") nil)
  (global-set-key (kbd "<XF86Forward>") nil)
  (global-set-key (kbd "<right>") nil)
  (global-set-key (kbd "<left>") nil)
  (global-set-key (kbd "<up>") nil)
  (global-set-key (kbd "<down>") nil)
  (global-set-key (kbd "S-<right>") nil)
  (global-set-key (kbd "S-<left>") nil)
  (global-set-key (kbd "S-<up>") nil)
  (global-set-key (kbd "C-<down>") nil)
  (global-set-key (kbd "C-<right>") nil)
  (global-set-key (kbd "C-<left>") nil)
  (global-set-key (kbd "C-<up>") nil)
  (global-set-key (kbd "C-<down>") nil)
  (global-set-key (kbd "<Home>") nil)
  (global-set-key (kbd "<End>") nil))