emacs/config_new.org
2024-09-24 21:05:14 +02:00

8.1 KiB
Raw Blame History

My Emacs

/laurens/emacs/media/commit/bd3f73747779c16d9efa643f47113ca3e675340d/img/dash_logo.png

Elpaca

(defvar elpaca-installer-version 0.7)
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
                              :ref nil :depth 1
                              :files (:defaults "elpaca-test.el" (:exclude "extensions"))
                              :build (:not elpaca--activate-package)))
(let* ((repo  (expand-file-name "elpaca/" elpaca-repos-directory))
       (build (expand-file-name "elpaca/" elpaca-builds-directory))
       (order (cdr elpaca-order))
       (default-directory repo))
  (add-to-list 'load-path (if (file-exists-p build) build repo))
  (unless (file-exists-p repo)
    (make-directory repo t)
    (when (< emacs-major-version 28) (require 'subr-x))
    (condition-case-unless-debug err
        (if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
                 ((zerop (apply #'call-process `("git" nil ,buffer t "clone"
                                                 ,@(when-let ((depth (plist-get order :depth)))
                                                     (list (format "--depth=%d" depth) "--no-single-branch"))
                                                 ,(plist-get order :repo) ,repo))))
                 ((zerop (call-process "git" nil buffer t "checkout"
                                       (or (plist-get order :ref) "--"))))
                 (emacs (concat invocation-directory invocation-name))
                 ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
                                       "--eval" "(byte-recompile-directory \".\" 0 'force)")))
                 ((require 'elpaca))
                 ((elpaca-generate-autoloads "elpaca" repo)))
            (progn (message "%s" (buffer-string)) (kill-buffer buffer))
          (error "%s" (with-current-buffer buffer (buffer-string))))
      ((error) (warn "%s" err) (delete-directory repo 'recursive))))
  (unless (require 'elpaca-autoloads nil t)
    (require 'elpaca)
    (elpaca-generate-autoloads "elpaca" repo)
    (load "./elpaca-autoloads")))
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca `(,@elpaca-order))
  ;; Install use-package support
  (elpaca elpaca-use-package
    ;; Enable use-package :ensure support for Elpaca.
    (elpaca-use-package-mode)
    )

General config

Yes-or-no

Because I'm lazy, important yes-or-no questions can be answered with y-or-n:

(defalias 'yes-or-no-p 'y-or-n-p)

FIDO

Use Fake-ido as minibuffer completion system, more info here: https://www.gnu.org/software/emacs/manual/html_node/emacs/Icomplete.html

(fido-vertical-mode 1)

Switch windows

(global-set-key (kbd "M-o") 'other-window)

Maximize at startup

More info : https://www.emacswiki.org/emacs/FullScreen

(push '(fullscreen . maximized) default-frame-alist)

ibuffer

Use list-buffers bigger brother.

(global-set-key [remap list-buffers] 'ibuffer)

Mark

(global-set-key (kbd "M-SPC") 'mark-word)

Isearch

Display number of matches:

(setq-default isearch-lazy-count t)

Reference that might be interesting for later: https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html

Sudo file

(defun sudo ()
  "Use TRAMP to `sudo' the current buffer."
  (interactive)
  (when buffer-file-name
    (find-alternate-file
      (concat "/sudo:root@localhost:"
        buffer-file-name)
    )
  )
)

Abbrev

(global-set-key [remap dabbrev-expand] 'hippie-expand)

Zap

(global-set-key (kbd "M-S-z") 'zap-up-to-char)

Spell checking

Look into customizing the 'ispell' group.

(add-hook 'prog-mode-hook 'flyspell-prog-mode)

Dired

(require 'dired-x)

Whole-line-or-region

Source: https://github.com/purcell/whole-line-or-region

Operate on the current line if no region is active.

(use-package whole-line-or-region
    :ensure t
    :config
        (whole-line-or-region-global-mode 1)
)

imenu

Flatten

(use-package flimenu
    :ensure t
    :config
        (flimenu-global-mode 1)
)

(global-set-key (kbd "M-i") 'imenu)

Terminal

Toggle between char- and line-mode

Courtesy goes to https://joelmccracken.github.io/entries/switching-between-term-mode-and-line-mode-in-emacs-term/

(require 'term)

(defun jnm/term-toggle-mode ()
  "Toggles term between line mode and char mode"
  (interactive)
  (if (term-in-line-mode)
      (term-char-mode)
    (term-line-mode)))

(define-key term-mode-map (kbd "C-c C-j") 'jnm/term-toggle-mode)
(define-key term-mode-map (kbd "C-c C-k") 'jnm/term-toggle-mode)

(define-key term-raw-map (kbd "C-c C-j") 'jnm/term-toggle-mode)
(define-key term-raw-map (kbd "C-c C-k") 'jnm/term-toggle-mode)

For the keybindings, we have to defien them in both raw and line mode. From the help page of term mode: If you define custom keybindings, make sure to assign them to the correct keymap (or to both): use term-raw-map in raw mode and term-mode-map in line mode.

Theme

(use-package monokai-theme
  :ensure t
  :init
    (load-theme 'monokai t)
)

Dashboard

(use-package dashboard
  :ensure t
  :config
  (add-hook 'elpaca-after-init-hook #'dashboard-insert-startupify-lists)
  (add-hook 'elpaca-after-init-hook #'dashboard-initialize)
  (dashboard-setup-startup-hook))

Hydra

Install and wait for hydra to be available since we are using it in this init.el :

(use-package hydra
  :ensure (:wait t)
  )

Text zoom

(defhydra hydra-zoom (global-map "<f1>")
  "zoom"
  ("g" text-scale-increase "in")
  ("l" text-scale-decrease "out")
)

Programming

Eglot

(use-package eglot
  :ensure t
  :defer t
  ;; This doesn't work for some reason, workaround below
  ;;:hook (prog-mode . eglot-ensure)
  ;; :config
  ;;   (add-hook 'prog-mode-hook 'eglot-ensure)
)

Workaround to enable eglot in all programming modes:

(add-hook 'prog-mode-hook 'eglot-ensure)

Yasnippet

(use-package yasnippet
  :ensure t
  :config
    (yas-reload-all)
    (add-hook 'prog-mode-hook 'yas-minor-mode)
)

Magit

Transient

Magit depends on this and it seems it's not installed as a dependency, so install it explicitly.

(use-package transient
  :ensure t
  )

Core

(use-package magit
  :ensure t
)

Multiple cursors

(use-package multiple-cursors
  :ensure t
  :bind
    ("C-x r a" . mc/edit-beginnings-of-lines)
    ("C-x r e" . mc/edit-ends-of-lines)
    ("C->" . mc/mark-next-like-this)
    ("C-<" . mc/mark-previous-like-this)
    ("C-c C->" . mc/mark-all-like-this)
)

Comment-dwim-2

Replacement for built-in comment-dwim, more comment features.

https://github.com/remyferre/comment-dwim-2

(use-package comment-dwim-2
    :ensure t
    :config
      (global-set-key (kbd "M-;") 'comment-dwim-2)
)

Projectile

(use-package projectile
  :ensure t
  :hook (prog-mode . projectile-mode)
;;  :config
;;    (setq projectile-globally-ignored-directories (cons ".ccls-cache" projectile-globally-ignored-directories))
;;    (setq projectile-indexing-method 'alien)
;;    (setq projectile-enable-caching t)
;;    (projectile-mode)
)