;;; init-git.el --- Magit configuration -*- lexical-binding: t; -*- ;;; Commentary: ;; Use Magit with its native keybindings while preserving Evil's window ;; management. ;; ;; Magit buffers are displayed in a dedicated side window on the right. ;; ;; Custom keybindings: ;; C-c C-g - Open Magit ;; C-w - Evil window map ;; j - Next section ;; k - Previous section ;; q - Kill Magit buffer and close the side window ;;; Code: (use-package magit :after evil :bind (("C-c C-g" . magit-status)) :config ;; Magit appearance and behaviour. ;; Highlight the exact characters that changed. (setq magit-diff-refine-hunk 'all) ;; Show more surrounding context in diffs. (setq magit-diff-context-lines 5) ;; Show all transient options. (setq transient-default-level 5) ;; Don't ask about saving modified buffers. (setq magit-save-repository-buffers 'dontask) ;; Display Magit in a dedicated side window on the right. (add-to-list 'display-buffer-alist '("\\*magit" (display-buffer-in-side-window) (side . right) (slot . 0) (window-width . 0.45) (dedicated . t))) ;; Custom commands. (defun my/magit-quit () "Kill the current Magit buffer and close its window." (interactive) (quit-window t)) ;; Keybindings. (dolist (map '(magit-mode-map magit-status-mode-map magit-log-mode-map magit-diff-mode-map magit-revision-mode-map)) (with-eval-after-load 'magit (when (boundp map) (let ((keymap (symbol-value map))) ;; Keep Evil window commands. (define-key keymap (kbd "C-w") evil-window-map) ;; Vim-style movement. (define-key keymap (kbd "j") #'magit-section-forward) (define-key keymap (kbd "k") #'magit-section-backward) ;; Quit Magit. (define-key keymap (kbd "q") #'my/magit-quit))))) (with-eval-after-load 'which-key (which-key-add-key-based-replacements "C-c C-g" "Magit"))) (provide 'init-git) ;;; init-git.el ends here