;;; input.el --- Configure behaviour of input devices. -*- lexical-binding: t; -*- ;;; Commentary: ;; * Setup mouse & keyboard behaviour. ;; * Setup basic keybindings. ;;; Code: (require 'basics/package-management) (use-package emacs :straight (:type built-in) :demand t :custom ((mouse-wheel-scroll-amount '(1 ((shift) . 1))) ; Scroll 1 line. ;; Paste text where the cursor is, not where the mouse is. (mouse-yank-at-point t) ;; Reduce scroll lag. (auto-window-vscroll nil)) :config (progn (delete-selection-mode t) ; Delete selection when you start to write. ;; kill-region (cut) and kill-ring-save (copy) act on the current ;; line if no text is visually selected. ;; (put 'kill-ring-save 'interactive-form '(interactive (if (use-region-p) (list (region-beginning) (region-end)) (list (line-beginning-position) (line-beginning-position 2))))) (put 'kill-region 'interactive-form '(interactive (if (use-region-p) (list (region-beginning) (region-end)) (list (line-beginning-position) (line-beginning-position 2))))) (defun my/delete-word (arg) "Delete characters forward until encountering the end of a word. With ARG, do it that many times." (interactive "p") (if (use-region-p) (delete-region (region-beginning) (region-end)) (delete-region (point) (progn (forward-word arg) (point))))) (defun my/backward-delete-word (arg) "Delete characters backward until encountering the end of a word. With ARG, do it that many times." (interactive "p") (my/delete-word (- arg))) ;; Enable keybindings. (put 'set-goal-column 'disabled nil) (put 'upcase-region 'disabled nil) (put 'downcase-region 'disabled nil)) :bind (("C-S-" . fixup-whitespace) ; Reduce whitespace around cursor. ("M-" . scroll-up-line) ; Scroll without moving the cursor. ("M-" . scroll-down-line) ;; Delete words without storing them in the kill buffer. ("C-" . my/delete-word) ("M-" . my/delete-word) ("C-" . my/backward-delete-word) ("C-DEL" . my/backward-delete-word) ("M-DEL" . my/backward-delete-word) ("C-q" . delete-frame) ;; Insert next character with control characters. ("C-S-v" . quoted-insert) ;; C-x C-f will be replaced with projectile-find-file. ("C-x C-S-f" . find-file) ("C-x F" . find-file))) ; Workaround for terminals. ; Multiple cursors. (use-package multiple-cursors :init (global-unset-key (kbd "M-")) :bind (("C-c m" . mc/edit-lines) ("M-" . mc/add-cursor-on-click))) ;; Edit multiple regions in the same way simultaneously. (use-package iedit :bind (("C-;" . iedit-mode) ("M-;" . iedit-mode) ;; ↓↑ Compatibility with TUI. (:map iedit-mode-keymap ("M-;" . iedit-mode)))) ;; Display available keybindings. (use-package which-key :defer 2 :diminish which-key-mode :defines (which-key-mode) :config (which-key-mode)) ;; Navigate between windows with alt+arrows. (use-package windmove :config (windmove-default-keybindings '(meta shift)) :bind (([(meta shift left)] . windmove-left) ; Needed for Emacs-over-SSH. 🤷 ([(meta shift right)] . windmove-right) ([(meta shift up)] . windmove-up) ([(meta shift down)] . windmove-down))) ;; Easy access to a family of keybindings. (use-package hydra) (provide 'basics/input) ;;; input.el ends here