From 3abf958cc889c39eb21d00afb311de29238ceefa Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 11 Jun 2018 22:57:27 +0200 Subject: [PATCH 001/280] Add config.org + replace setup-editing/general.el --- config.org | 439 ++++++++++++++++++ custom/setup-editing.el | 134 ------ custom/setup-general.el | 62 --- img/dash_logo.png | Bin 0 -> 65349 bytes init.el | 141 +----- {snippets => plugins/yasnippet}/c-mode/fori | 3 +- {snippets => plugins/yasnippet}/c-mode/oncekl | 0 7 files changed, 454 insertions(+), 325 deletions(-) create mode 100644 config.org delete mode 100644 custom/setup-editing.el delete mode 100644 custom/setup-general.el create mode 100644 img/dash_logo.png rename {snippets => plugins/yasnippet}/c-mode/fori (61%) rename {snippets => plugins/yasnippet}/c-mode/oncekl (100%) diff --git a/config.org b/config.org new file mode 100644 index 0000000..a014f1a --- /dev/null +++ b/config.org @@ -0,0 +1,439 @@ +#+STARTUP: overview +#+TITLE: My Emacs +#+CREATOR: Laurens Miers +#+LANGUAGE: en +[[./img/dash_logo.png]] + +* Installation + +My personal emacs configuration + +(Heavily) Inspired by the following configs: + - https://github.com/tuhdo/emacs-c-ide-demo + - https://github.com/daedreth/UncleDavesEmacs + +This configuration requires the installation of : + + - the GNU =global= package (for gtags) + - =clang= (for ivory) + - =cmake= (for ivory) + - =llvm-libs= (for cmake, somehow not a dependency on Manjaro when installing cmake) + - Use python-pip to install =jedi=, =flake8=, =importmagic= and =autopep8= (for elpy) + - =ditaa= (for ascii to image generation in org-mode) + +When first checking out this config, run =irony-install-server= to make and install the irony-server. + +* General stuff +** Unsorted + +Collection of stuff that needs to be sorted...someday....maybe... +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "M-p") 'fill-paragraph) +#+END_SRC +** Macro's + +Rebind the macro keys to Fx keys to give them a decent purpose. + +#+BEGIN_SRC emacs-lisp +(global-set-key [f9] 'start-kbd-macro) +(global-set-key [f10] 'end-kbd-macro) +(global-set-key [f11] 'call-last-kbd-macro) +#+END_SRC + +** Goto-line + +Starting with Emacs 23.2, =M-g g= is bound to goto-line. +However, I find this too long. So rebind it: + +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "M-g") 'goto-line) +#+END_SRC + +** Rectangle + +Most rectangle functions are by default mapped to something like =C-x r (other-char)=. +I use =string-insert-rectangle= and =query-replace-regexp= quite a lot, +so rebind it to something easy to remember. + +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "C-x r i") 'string-insert-rectangle) +(global-set-key (kbd "C-x r r") 'query-replace-regexp) +#+END_SRC + +** Garbage collection (gc) + +I used to have the following enabled in my init to increase the gc threshold to speed-up emacs startup: +(stolen from [[http://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/]]) + +#+BEGIN_SRC +;; (setq gc-cons-threshold 100000000) +#+END_SRC + +But according to this: [[https://lists.gnu.org/archive/html/help-gnu-emacs/2007-06/msg00243.html ]], +it is no longer necessary. + +** Yes-or-no questions + +Because I'm lazy, important yes-or-no questions can be answered with y-or-n: + +#+BEGIN_SRC emacs-lisp +(defalias 'yes-or-no-p 'y-or-n-p) +#+END_SRC + +** Emacs fullscreen at startup + +#+BEGIN_SRC emacs-lisp +(add-to-list 'default-frame-alist '(fullscreen . maximized)) +#+END_SRC + +** Multi-frame rebindings + +Sometimes I have multiple emacs-frames open. +I prefer that the normal =C-x o= can deal with this. + +#+BEGIN_SRC emacs-lisp +;; Use C-x o to switch to other frame when using multi-monitor +(global-set-key (kbd "C-x o") 'next-multiframe-window) +#+END_SRC + +Now that =next-multiframe-window= is bound to =C-x o=, +Bind =C-x p= to =previous-multiframe-window=. + +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "\C-x p") 'previous-multiframe-window) +#+END_SRC + +** Enable disabled commands + +Some commands are disabled to protect the user. +Narrow-region/page is a really handy feature, enable it: + +#+BEGIN_SRC emacs-lisp +(put 'narrow-to-page 'disabled nil) +(put 'narrow-to-region 'disabled nil) +#+END_SRC + +** Buffers + +Why is this not built-in? + +#+BEGIN_SRC emacs-lisp +(defun kill-all-buffers () + "Kill all buffers without regard for their origin." + (interactive) + (mapc 'kill-buffer (buffer-list))) +#+END_SRC + +** Helping vim-users + +#+BEGIN_SRC emacs-lisp +(defconst wq "This is not vi! Use C-x C-c instead.") +(defconst w "This is not vi! Use C-x C-s instead.") +(defconst q! "This is EMACS not vi! Use C-x C-c instead.") +(defconst wq! "This is EMACS not vi! Use C-x C-c instead.") +#+END_SRC + +* Theme + +#+BEGIN_SRC emacs-lisp +(use-package monokai-theme + :ensure t + :init + (load-theme 'monokai t) + +) +#+END_SRC + +** Highlight line + +Highlight line will highlight the current line we are on. +Enable highlight-line globally and replace its background colour. + +#+BEGIN_SRC emacs-lisp +(global-hl-line-mode 1) +(set-face-background hl-line-face "dark slate grey") +#+END_SRC + +* Dashboard + +I use the dashboard as start screen. +Since I like it to give me a list of recent files, we need to enable =recentf-mode=. + +#+BEGIN_SRC emacs-lisp +(use-package dashboard + :ensure t + :init + (recentf-mode 1) + :config + (dashboard-setup-startup-hook) + (setq dashboard-startup-banner "~/.emacs.d/img/dash_logo.png") + (setq dashboard-items '((recents . 10) + (bookmarks . 5) + )) + (setq dashboard-banner-logo-title "") +) +#+END_SRC + +* Zygospore + +Revert =C-x 1= by pressing =C-x 1= again: +[[https://github.com/louiskottmann/zygospore.el]] + +FYI: At one point, used this together with sr-speedbar. They did not play well together... + +#+BEGIN_SRC emacs-lisp +(use-package zygospore + :ensure t + :config + (global-set-key (kbd "C-x 1") 'zygospore-toggle-delete-other-windows) +) +#+END_SRC + +* Mode-line + +[[https://github.com/Malabarba/smart-mode-line]] + +#+BEGIN_SRC emacs-lisp +(use-package smart-mode-line + :ensure t + :config + (setq sml/no-confirm-load-theme t) + (setq sml/theme 'powerline) + (sml/setup) +) +#+END_SRC + +* Editing settings + +** Kill-ring customization + +Setting =kill-whole-line= to non-nil means when we execute =C-k= at the beginning of a line +will the entire line including the following newline will be deleted. + +#+BEGIN_SRC emacs-lisp +(setq kill-ring-max 5000) ; increase kill-ring capacity +(setq kill-whole-line t) +#+END_SRC + +** Newline at end-of-file + +#+BEGIN_SRC emacs-lisp +(setq mode-require-final-newline t) ; add a newline to end of file +#+END_SRC + +** Enable column numbers + +#+BEGIN_SRC emacs-lisp +(setq column-number-mode 1) +#+END_SRC + +** Look-and-feel modifications + +Remove scroll-, tool- and menu-bar. I don't use them so free some space. + +#+BEGIN_SRC emacs-lisp +(scroll-bar-mode -1) +(tool-bar-mode -1) +(menu-bar-mode -1) +#+END_SRC + +** Tab-width + +Set the default tab width. +#+BEGIN_SRC emacs-lisp +(setq-default tab-width 4) +#+END_SRC + +** Automatic indent + +Automatically indent when pressing =RET=. +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "RET") 'newline-and-indent) +#+END_SRC + +** Delete trailing whitespace + +Automatically delete trailing whitespace when saving a file. + +#+BEGIN_SRC emacs-lisp +(add-hook 'before-save-hook 'delete-trailing-whitespace) +#+END_SRC + +* Undo-tree + +Undo with =C-/=. +#+BEGIN_SRC emacs-lisp +(use-package undo-tree + :ensure t + :config + (global-undo-tree-mode) +) +#+END_SRC + +* Volatile highlights + +Show/highlight changes when doing undo/yanks/kills/... + +https://github.com/k-talo/volatile-highlights.el + +#+BEGIN_SRC emacs-lisp +(use-package volatile-highlights + :ensure t + :config + (volatile-highlights-mode t) +) +#+END_SRC + +* iedit + +Highlight occurences of symbol and replace them simultanously. +Shortkey: =C-;= + +https://github.com/victorhge/iedit + +#+BEGIN_SRC emacs-lisp +(use-package iedit + :ensure t +) +#+END_SRC + +* Smartparens + +Smart minor-mode to deal with pairs. + +https://github.com/Fuco1/smartparens + +#+BEGIN_SRC emacs-lisp +(use-package smartparens + :ensure t + :config + (require 'smartparens-config) +) + +;; old config stuff +;; (setq sp-base-key-bindings 'paredit) +;; (setq sp-autoskip-closing-pair 'always) +;; (setq sp-hybrid-kill-entire-symbol nil) +;; (sp-use-paredit-bindings) +;; +;; (show-smartparens-global-mode +1) +;; (smartparens-global-mode 1) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; keybinding management smartparens ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; cl-package contains the loop macro +;; (require 'cl) +;; +;; (defmacro def-pairs (pairs) +;; `(progn +;; ,@(loop for (key . val) in pairs +;; collect +;; `(defun ,(read (concat +;; "wrap-with-" +;; (prin1-to-string key) +;; "s")) +;; (&optional arg) +;; (interactive "p") +;; (sp-wrap-with-pair ,val))))) +;; +;; (def-pairs ((paren . "(") +;; (bracket . "[") +;; (brace . "{") +;; (single-quote . "'") +;; (double-quote . "\"") +;; (underscore . "_") +;; (back-quote . "`"))) +;; +;; (define-key smartparens-mode-map (kbd "C-c (") 'wrap-with-parens) +;; (define-key smartparens-mode-map (kbd "C-c [") 'wrap-with-brackets) +;; (define-key smartparens-mode-map (kbd "C-c {") 'wrap-with-braces) +;; (define-key smartparens-mode-map (kbd "C-c '") 'wrap-with-single-quotes) +;; (define-key smartparens-mode-map (kbd "C-c \"") 'wrap-with-double-quotes) +;; (define-key smartparens-mode-map (kbd "C-c _") 'wrap-with-underscores) +;; (define-key smartparens-mode-map (kbd "C-c `") 'wrap-with-back-quotes) +;; +;; (define-key smartparens-mode-map (kbd "C-c s r") 'sp-rewrap-sexp) +;; (define-key smartparens-mode-map (kbd "C-c s u") 'sp-unwrap-sexp) +;; +;; (define-key smartparens-mode-map (kbd "C-M-f") 'sp-forward-sexp) +;; (define-key smartparens-mode-map (kbd "C-M-b") 'sp-backward-sexp) +;; +;; ;; TODO: in manjaro this selects keyboard-layout or something +;; ;;(define-key smartparens-mode-map (kbd "C-M-k") 'sp-kill-sexp) +;; (define-key smartparens-mode-map (kbd "C-M-w") 'sp-copy-sexp) +;; +;; (define-key smartparens-mode-map (kbd "C-M-n") 'sp-next-sexp) +;; (define-key smartparens-mode-map (kbd "C-M-p") 'sp-previous-sexp) +;; +;; ;; TODO: for some reason this does not work +;; (define-key smartparens-mode-map (kbd "C-M-a") 'sp-beginning-of-sexp) +;; (define-key smartparens-mode-map (kbd "C-M-e") 'sp-end-of-sexp) +;; +;; (define-key smartparens-mode-map (kbd "C-M-h") 'mark-defun) +;; +;; (smartparens-global-mode t) + +#+END_SRC + +* Comment-dwim-2 + +Replacement for built-in =comment-dwim=, more comment features. + +https://github.com/remyferre/comment-dwim-2 + +#+BEGIN_SRC emacs-lisp +(use-package comment-dwim-2 + :ensure t + :config + (global-set-key (kbd "M-;") 'comment-dwim-2) +) +#+END_SRC + +* Yasnippet + +Template system for Emacs. + +https://github.com/joaotavora/yasnippet + +#+BEGIN_SRC emacs-lisp +(use-package yasnippet + :ensure t + :config + (add-to-list 'load-path + "~/.emacs.d/plugins/yasnippet") + (yas-global-mode 1) +) +#+END_SRC + +* Old stuff, maybe usefull for lookup later + +#+BEGIN_SRC emacs-lisp +;; show whitespace in diff-mode +;; (add-hook 'diff-mode-hook (lambda () +;; (setq-local whitespace-style +;; '(face +;; tabs +;; tab-mark +;; spaces +;; space-mark +;; trailing +;; indentation::space +;; indentation::tab +;; newline +;; newline-mark)) +;; (whitespace-mode 1))) +#+END_SRC + + +* TODO + +stuff i need to look into: +- ibuffer +- switch-window +- split-and-follow-vertically/horizontally +- which-key +- symon +- spaceline +- async +- exwm diff --git a/custom/setup-editing.el b/custom/setup-editing.el deleted file mode 100644 index fbddaab..0000000 --- a/custom/setup-editing.el +++ /dev/null @@ -1,134 +0,0 @@ -(setq global-mark-ring-max 5000 ; increase mark ring to contains 5000 entries - mark-ring-max 5000 ; increase kill ring to contains 5000 entries - mode-require-final-newline t ; add a newline to end of file - ) - -(setq kill-ring-max 5000 ; increase kill-ring capacity - kill-whole-line t ; if NIL, kill whole line and move the next line up - ) - -;; show column numbers -(setq column-number-mode 1) - -;; Remove scroll-bar, tool-bar and menu-bar -(scroll-bar-mode -1) -(tool-bar-mode -1) -(menu-bar-mode -1) - -;; set appearance of a tab that is represented by 4 spaces -(setq-default tab-width 4) - -;; automatically indent when press RET -(global-set-key (kbd "RET") 'newline-and-indent) - -;; Map query-replace-regexp to an easier key -(global-set-key (kbd "C-x r r") 'query-replace-regexp) - -;; Map query-replace-regexp to an easier key -(global-set-key (kbd "M-p") 'fill-paragraph) - -;; Delete trailing whitespace when saving file -(add-hook 'before-save-hook 'delete-trailing-whitespace) - -;; show whitespace in diff-mode -(add-hook 'diff-mode-hook (lambda () - (setq-local whitespace-style - '(face - tabs - tab-mark - spaces - space-mark - trailing - indentation::space - indentation::tab - newline - newline-mark)) - (whitespace-mode 1))) - -;; Package: undo-tree -- saner, imo, undo with C-/ -(require 'undo-tree) -(global-undo-tree-mode) - -;; Package: volatile-highlights --- show changes by "undo/yanks/..." -(require 'volatile-highlights) -(volatile-highlights-mode t) - -;;; Package: iedit --- Replace occurences of symbol and highlight them -(require 'iedit) - -;; Package: smartparens --- smart way to handle (), {}, ... -(require 'smartparens-config) -(setq sp-base-key-bindings 'paredit) -(setq sp-autoskip-closing-pair 'always) -(setq sp-hybrid-kill-entire-symbol nil) -(sp-use-paredit-bindings) - -(show-smartparens-global-mode +1) -(smartparens-global-mode 1) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; keybinding management smartparens ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; cl-package contains the loop macro -(require 'cl) - -(defmacro def-pairs (pairs) - `(progn - ,@(loop for (key . val) in pairs - collect - `(defun ,(read (concat - "wrap-with-" - (prin1-to-string key) - "s")) - (&optional arg) - (interactive "p") - (sp-wrap-with-pair ,val))))) - -(def-pairs ((paren . "(") - (bracket . "[") - (brace . "{") - (single-quote . "'") - (double-quote . "\"") - (underscore . "_") - (back-quote . "`"))) - -(define-key smartparens-mode-map (kbd "C-c (") 'wrap-with-parens) -(define-key smartparens-mode-map (kbd "C-c [") 'wrap-with-brackets) -(define-key smartparens-mode-map (kbd "C-c {") 'wrap-with-braces) -(define-key smartparens-mode-map (kbd "C-c '") 'wrap-with-single-quotes) -(define-key smartparens-mode-map (kbd "C-c \"") 'wrap-with-double-quotes) -(define-key smartparens-mode-map (kbd "C-c _") 'wrap-with-underscores) -(define-key smartparens-mode-map (kbd "C-c `") 'wrap-with-back-quotes) - -(define-key smartparens-mode-map (kbd "C-c s r") 'sp-rewrap-sexp) -(define-key smartparens-mode-map (kbd "C-c s u") 'sp-unwrap-sexp) - -(define-key smartparens-mode-map (kbd "C-M-f") 'sp-forward-sexp) -(define-key smartparens-mode-map (kbd "C-M-b") 'sp-backward-sexp) - -;; TODO: in manjaro this selects keyboard-layout or something -;;(define-key smartparens-mode-map (kbd "C-M-k") 'sp-kill-sexp) -(define-key smartparens-mode-map (kbd "C-M-w") 'sp-copy-sexp) - -(define-key smartparens-mode-map (kbd "C-M-n") 'sp-next-sexp) -(define-key smartparens-mode-map (kbd "C-M-p") 'sp-previous-sexp) - -;; TODO: for some reason this does not work -(define-key smartparens-mode-map (kbd "C-M-a") 'sp-beginning-of-sexp) -(define-key smartparens-mode-map (kbd "C-M-e") 'sp-end-of-sexp) - -(define-key smartparens-mode-map (kbd "C-M-h") 'mark-defun) - -(smartparens-global-mode t) - - -;; Package: comment-dwim-2 --- replacement for built-in comment-dwim, more comment features -(require 'comment-dwim-2) -(global-set-key (kbd "M-;") 'comment-dwim-2) - - -;; Package: yasnippet --- code template system -(require 'yasnippet) -(yas-global-mode 1) - -(provide 'setup-editing) diff --git a/custom/setup-general.el b/custom/setup-general.el deleted file mode 100644 index 221252c..0000000 --- a/custom/setup-general.el +++ /dev/null @@ -1,62 +0,0 @@ -(global-set-key [f9] 'start-kbd-macro) -(global-set-key [f10] 'end-kbd-macro) -(global-set-key [f11] 'call-last-kbd-macro) - -;; Package zygospore --- revert C-x 1 by pressing C-x 1 again -;; TODO: Doesn't work with sr-speedbar -(global-set-key (kbd "C-x 1") 'zygospore-toggle-delete-other-windows) - -;; Set 'M-g' to 'goto-line', it's faster and what we usually want -(global-set-key (kbd "M-g") 'goto-line) - -;; Set 'C-x r i' to 'string-insert-rectangle' -;; Easier than using 'M-x' and searching for it. -(global-set-key (kbd "C-x r i") 'string-insert-rectangle) - -;; set garbage collection to higher value -;; see http://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/ -(setq gc-cons-threshold 100000000) - -;; important yes-or-no questions can be answered with y-or-n -(defalias 'yes-or-no-p 'y-or-n-p) - -;; maximize Emacs at startup -(add-to-list 'default-frame-alist '(fullscreen . maximized)) - -;; Move one window back command -(global-set-key (kbd "\C-x p") 'previous-multiframe-window) - -;; Use C-x o to switch to other frame when using multi-monitor -(global-set-key (kbd "C-x o") 'next-multiframe-window) - -;; set my theme -(load-theme 'wombat) - -;; highlight line (hl-line) -(global-hl-line-mode 1) -(set-face-background hl-line-face "dark slate grey") - -;; smart mode line -(setq sml/no-confirm-load-theme t) -(setq sml/theme 'powerline) -(sml/setup) - -;; enable disabled commands -(put 'narrow-to-page 'disabled nil) -(put 'narrow-to-region 'disabled nil) - -;; quick function to kill all other buffers -(defun kill-other-buffers () - "Kill all other buffers." - (interactive) - (mapc 'kill-buffer - (delq (current-buffer) - (remove-if-not 'buffer-file-name (buffer-list))))) - -;; screw with vi(m)-users -(defconst wq "This is not vi! Use C-x C-c instead.") -(defconst w "This is not vi! Use C-x C-s instead.") -(defconst q! "This is EMACS not vi! Use C-x C-c instead.") -(defconst wq! "This is EMACS not vi! Use C-x C-c instead.") - -(provide 'setup-general) diff --git a/img/dash_logo.png b/img/dash_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8c88bef43e593c46d6a03337f85a3275c88d9b GIT binary patch literal 65349 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 Cam7mj literal 0 HcmV?d00001 diff --git a/init.el b/init.el index 876843e..7670945 100644 --- a/init.el +++ b/init.el @@ -1,152 +1,39 @@ - -;; add the custom dir to our load path -(add-to-list 'load-path "~/.emacs.d/custom") - -;; add melpa-stable to package-archives ;; IMPORTANT: add (require 'package), else package-archives is not declared (void-variable) (require 'package) + +(setq package-enable-at-startup nil) + +;; add melpa-stable to package-archives (add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t) -(add-to-list 'package-archives - '("melpa" . "http://melpa.milkbox.net/packages/") t) - ;; MUST be called after package-archives is updated -;; Else the automated installation logic is not able to install missing packages (package-initialize) -;; my required packages -(defconst my-packages - '( - undo-tree - volatile-highlights - smartparens - iedit - zygospore - comment-dwim-2 - yasnippet - yasnippet-snippets - sr-speedbar - company - irony - irony-eldoc - company-irony - flycheck-irony - elpy - py-autopep8 - magit - org - smart-mode-line - smart-mode-line-powerline-theme - helm - helm-gtags - helm-swoop - helm-company - dashboard - multiple-cursors - expand-region - )) +;;; Bootstrapping use-package +(unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) -;; function to install new packages -(defun install-packages () - "Install all required packages." - (interactive) - (unless package-archive-contents - (package-refresh-contents)) - (dolist (package my-packages) - (unless (package-installed-p package) - (package-install package)))) - -;; install packages if not yet installed -(install-packages) - -;; setup general -(require 'setup-general) - -;; setup general editing settings -(require 'setup-editing) - -;; setup org -(require 'setup-org) - -;; setup coding -(require 'setup-coding) - -;; setup helm -(require 'setup-helm) -(require 'setup-helm-gtags) - -;; setup speedbar -(require 'setup-speedbar) - -;; setup autocompletion -(require 'setup-autocompletion) - -;; setup Windows if our bootloader is Windows -(if (eq system-type 'windows-nt) - (require 'setup-windows) -) - -;; setup dashboard -(require 'setup-dashboard) - -;; setup gdb -(require 'setup-gdb) - -;; setup multiple cursors -(require 'setup-cursors) - -;; setup expand-region -(require 'setup-expand-region) - -;; start emacs server -(server-start) +;;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. +(when (file-readable-p "~/.emacs.d/config.org") +(org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) +(provide 'init) (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. - '(ansi-color-faces-vector - [default default default italic underline success warning error]) - '(ansi-color-names-vector - ["#757575" "#CD5542" "#4A8F30" "#7D7C21" "#4170B3" "#9B55C3" "#68A5E9" "gray43"]) '(custom-safe-themes (quote - ("84d2f9eeb3f82d619ca4bfffe5f157282f4779732f48a5ac1484d94d5ff5b279" "c74e83f8aa4c78a121b52146eadb792c9facc5b1f02c917e3dbb454fca931223" "3c83b3676d796422704082049fc38b6966bcad960f896669dfc21a7a37a748fa" "938d8c186c4cb9ec4a8d8bc159285e0d0f07bad46edf20aa469a89d0d2a586ea" "6de7c03d614033c0403657409313d5f01202361e35490a3404e33e46663c2596" "ed317c0a3387be628a48c4bbdb316b4fa645a414838149069210b66dd521733f" "1db337246ebc9c083be0d728f8d20913a0f46edc0a00277746ba411c149d7fe5" default))) - '(fci-rule-color "#2e2e2e") - '(global-company-mode t) + ("5f27195e3f4b85ac50c1e2fac080f0dd6535440891c54fcfa62cdcefedf56b1b" default))) '(package-selected-packages (quote - (ample-zen-theme ample-theme magit irony-eldoc elpy irony helm-swoop helm))) - '(vc-annotate-background "#3b3b3b") - '(vc-annotate-color-map - (quote - ((20 . "#dd5542") - (40 . "#CC5542") - (60 . "#fb8512") - (80 . "#baba36") - (100 . "#bdbc61") - (120 . "#7d7c61") - (140 . "#6abd50") - (160 . "#6aaf50") - (180 . "#6aa350") - (200 . "#6a9550") - (220 . "#6a8550") - (240 . "#6a7550") - (260 . "#9b55c3") - (280 . "#6CA0A3") - (300 . "#528fd1") - (320 . "#5180b3") - (340 . "#6380b3") - (360 . "#DC8CC3")))) - '(vc-annotate-very-old-color "#DC8CC3")) + (zygospore yasnippet-snippets volatile-highlights use-package undo-tree sr-speedbar smartparens smart-mode-line-powerline-theme py-autopep8 multiple-cursors magit irony-eldoc iedit helm-swoop helm-gtags helm-company flycheck-irony expand-region elpy dashboard company-irony comment-dwim-2)))) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. ) - -(provide 'init) -;;; init.el ends here diff --git a/snippets/c-mode/fori b/plugins/yasnippet/c-mode/fori similarity index 61% rename from snippets/c-mode/fori rename to plugins/yasnippet/c-mode/fori index acb5879..63e65b0 100644 --- a/snippets/c-mode/fori +++ b/plugins/yasnippet/c-mode/fori @@ -2,8 +2,7 @@ # name: for with loop variable # key: fori # -- -int i = 0; -for (${1:i = 0}; ${2:i < N}; ${3:++i}) { +for (${1:int i = 0}; ${2:i < N}; ${3:++i}) { $0 } diff --git a/snippets/c-mode/oncekl b/plugins/yasnippet/c-mode/oncekl similarity index 100% rename from snippets/c-mode/oncekl rename to plugins/yasnippet/c-mode/oncekl From 2ce4a6d6a9e4076b0c4eef96980a5756130155be Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 11 Jun 2018 23:10:24 +0200 Subject: [PATCH 002/280] Enable smartparens + some extra smartparens config --- config.org | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config.org b/config.org index a014f1a..18162eb 100644 --- a/config.org +++ b/config.org @@ -300,6 +300,9 @@ https://github.com/victorhge/iedit * Smartparens Smart minor-mode to deal with pairs. +Extra options: + - =show-smartparens-global-mode= : highlight corresponding bracket/pair/... + - =smartparens-global-mode= : enable smartparens https://github.com/Fuco1/smartparens @@ -308,6 +311,8 @@ https://github.com/Fuco1/smartparens :ensure t :config (require 'smartparens-config) + (show-smartparens-global-mode t) + (smartparens-global-mode t) ) ;; old config stuff From 6e1fb2c76913dc3d1429237f34e81854dfbe3145 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 11 Jun 2018 23:13:16 +0200 Subject: [PATCH 003/280] Add backup-files config --- config.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config.org b/config.org index 18162eb..ea4334f 100644 --- a/config.org +++ b/config.org @@ -133,6 +133,14 @@ Why is this not built-in? (defconst wq! "This is EMACS not vi! Use C-x C-c instead.") #+END_SRC +** Backup files + +Disable the generation of backup-files, I don't use them. + +#+BEGIN_SRC emacs-lisp +(setq make-backup-files nil) +#+END_SRC + * Theme #+BEGIN_SRC emacs-lisp From 8eec08cfd8ff55d6c2f4eba3d3a380038d80c518 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 11 Jun 2018 23:35:53 +0200 Subject: [PATCH 004/280] Add expand region to config.org + remove old file --- config.org | 18 ++++++++++++++++++ custom/setup-expand-region.el | 7 ------- 2 files changed, 18 insertions(+), 7 deletions(-) delete mode 100644 custom/setup-expand-region.el diff --git a/config.org b/config.org index ea4334f..e99ffea 100644 --- a/config.org +++ b/config.org @@ -419,6 +419,24 @@ https://github.com/joaotavora/yasnippet ) #+END_SRC +* Expand-region + +Expand region increases the selected region by semantic units. +I also enable =pending-delete-mode=, this means when we mark a region and start typing, +the text within the mark is deleted with the new typed text and the mark disappears. + +https://github.com/magnars/expand-region.el + +#+BEGIN_SRC emacs-lisp +(use-package expand-region + :ensure t + :init + (pending-delete-mode t) + :config + (global-set-key (kbd "C-=") 'er/expand-region) +) +#+END_SRC + * Old stuff, maybe usefull for lookup later #+BEGIN_SRC emacs-lisp diff --git a/custom/setup-expand-region.el b/custom/setup-expand-region.el deleted file mode 100644 index 1734ac0..0000000 --- a/custom/setup-expand-region.el +++ /dev/null @@ -1,7 +0,0 @@ -(require 'expand-region) - -(pending-delete-mode t) - -(global-set-key (kbd "C-=") 'er/expand-region) - -(provide 'setup-expand-region) From 150de7bd0af278bf83070d7475a4baf131188968 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 11 Jun 2018 23:36:42 +0200 Subject: [PATCH 005/280] Remove README.md --- README.md | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 89897d5..0000000 --- a/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# emacs -My personal emacs configuration - -It is mostly based on tuhdo's emacs ide demo: https://github.com/tuhdo/emacs-c-ide-demo - -This configuration requires the installation of : - - the GNU global package (for gtags) - - clang (for ivory) - - cmake (for ivory) - - llvm-libs (for cmake, somehow not a dependency on Manjaro when installing cmake) - - Use python-pip to install jedi, flake8, importmagic and autopep8 (for elpy) - - ditaa (for ascii to image generation in org-mode) - -When first checking out this config, run irony-install-server to make and install the irony-server. From a2e0594ef11a781a993a9f5e74d769056e6de543 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 17:30:34 +0200 Subject: [PATCH 006/280] Remove custom-set-variables --- init.el | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/init.el b/init.el index 7670945..d614563 100644 --- a/init.el +++ b/init.el @@ -20,20 +20,3 @@ (org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) (provide 'init) -(custom-set-variables - ;; custom-set-variables was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - '(custom-safe-themes - (quote - ("5f27195e3f4b85ac50c1e2fac080f0dd6535440891c54fcfa62cdcefedf56b1b" default))) - '(package-selected-packages - (quote - (zygospore yasnippet-snippets volatile-highlights use-package undo-tree sr-speedbar smartparens smart-mode-line-powerline-theme py-autopep8 multiple-cursors magit irony-eldoc iedit helm-swoop helm-gtags helm-company flycheck-irony expand-region elpy dashboard company-irony comment-dwim-2)))) -(custom-set-faces - ;; custom-set-faces was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - ) From ce7bb16836eb5a7932642bd9841ea4c63e2af93d Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 17:32:48 +0200 Subject: [PATCH 007/280] Add Windooze section --- config.org | 31 +++++++++++++++++++++++++++++++ custom/setup-windows.el | 25 ------------------------- 2 files changed, 31 insertions(+), 25 deletions(-) delete mode 100644 custom/setup-windows.el diff --git a/config.org b/config.org index e99ffea..8f2d103 100644 --- a/config.org +++ b/config.org @@ -437,6 +437,37 @@ https://github.com/magnars/expand-region.el ) #+END_SRC +* Windooze + +When we use windows as our bootloader, we have to setup some things first: + +#+BEGIN_SRC emacs-lisp +;; Windows performance tweaks +;; +(when (boundp 'w32-pipe-read-delay) + (setq w32-pipe-read-delay 0)) +;; Set the buffer size to 64K on Windows (from the original 4K) +(when (boundp 'w32-pipe-buffer-size) + (setq irony-server-w32-pipe-buffer-size (* 64 1024))) + +;; Set pipe delay to 0 to reduce latency of irony +(setq w32-pipe-read-delay 0) + +;; From "setting up irony mode on Windows" : +;; Make sure the path to clang.dll is in emacs' exec_path and shell PATH. +(setenv "PATH" + (concat + "C:\\msys64\\usr\\bin" ";" + "C:\\msys64\\mingw64\\bin" ";" + (getenv "PATH") + ) +) +(setq exec-path (append '("c:/msys64/usr/bin" "c:/alt/msys64/mingw64/bin") + exec-path)) +#+END_SRC + +To be fair, I didn't test this in a while... + * Old stuff, maybe usefull for lookup later #+BEGIN_SRC emacs-lisp diff --git a/custom/setup-windows.el b/custom/setup-windows.el deleted file mode 100644 index 695b1de..0000000 --- a/custom/setup-windows.el +++ /dev/null @@ -1,25 +0,0 @@ -;; Windows performance tweaks -;; -(when (boundp 'w32-pipe-read-delay) - (setq w32-pipe-read-delay 0)) -;; Set the buffer size to 64K on Windows (from the original 4K) -(when (boundp 'w32-pipe-buffer-size) - (setq irony-server-w32-pipe-buffer-size (* 64 1024))) - -;; Set pipe delay to 0 to reduce latency of irony -(setq w32-pipe-read-delay 0) - -;; From "setting up irony mode on Windows" : -;; Make sure the path to clang.dll is in emacs' exec_path and shell PATH. -(setenv "PATH" - (concat - "C:\\msys64\\usr\\bin" ";" - "C:\\msys64\\mingw64\\bin" ";" - (getenv "PATH") - ) -) -(setq exec-path (append '("c:/msys64/usr/bin" "c:/alt/msys64/mingw64/bin") - exec-path)) - - -(provide 'setup-windows) From 436106e94de53379a448b8b64e8ffa7970ab9937 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 17:35:15 +0200 Subject: [PATCH 008/280] Add speedbar section --- config.org | 17 +++++++++++++++++ custom/setup-speedbar.el | 11 ----------- 2 files changed, 17 insertions(+), 11 deletions(-) delete mode 100644 custom/setup-speedbar.el diff --git a/config.org b/config.org index 8f2d103..610bab1 100644 --- a/config.org +++ b/config.org @@ -470,6 +470,8 @@ To be fair, I didn't test this in a while... * Old stuff, maybe usefull for lookup later +** Diff mode stuff + #+BEGIN_SRC emacs-lisp ;; show whitespace in diff-mode ;; (add-hook 'diff-mode-hook (lambda () @@ -487,6 +489,21 @@ To be fair, I didn't test this in a while... ;; (whitespace-mode 1))) #+END_SRC +** Speedbar + +#+BEGIN_SRC emacs-lisp +;; Package: sr-speedbar +;;(require 'sr-speedbar) +;; (add-hook 'emacs-startup-hook (lambda () ; Open sr speedbar on startup +;; (sr-speedbar-open) +;; )) +;; (setq speedbar-show-unknown-files t) ; Enable speedbar to show all files +;; (setq speedbar-use-images nil) ; use text for buttons +;; (setq sr-speedbar-right-side nil) ; put on left side +;; (setq sr-speedbar-width 40) +;; +;; (provide 'setup-speedbar) +#+END_SRC * TODO diff --git a/custom/setup-speedbar.el b/custom/setup-speedbar.el deleted file mode 100644 index e38ac8d..0000000 --- a/custom/setup-speedbar.el +++ /dev/null @@ -1,11 +0,0 @@ -;; Package: sr-speedbar -(require 'sr-speedbar) -;; (add-hook 'emacs-startup-hook (lambda () ; Open sr speedbar on startup -;; (sr-speedbar-open) -;; )) -(setq speedbar-show-unknown-files t) ; Enable speedbar to show all files -(setq speedbar-use-images nil) ; use text for buttons -(setq sr-speedbar-right-side nil) ; put on left side -(setq sr-speedbar-width 40) - -(provide 'setup-speedbar) From 0791b21aafe1d3987bff2c7b176be31ad51998e8 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 18:04:16 +0200 Subject: [PATCH 009/280] Add helm section --- config.org | 67 ++++++++++++++++++++++++++++++++++++++++++++ custom/setup-helm.el | 50 --------------------------------- 2 files changed, 67 insertions(+), 50 deletions(-) delete mode 100644 custom/setup-helm.el diff --git a/config.org b/config.org index 610bab1..c3f6a27 100644 --- a/config.org +++ b/config.org @@ -468,6 +468,72 @@ When we use windows as our bootloader, we have to setup some things first: To be fair, I didn't test this in a while... +* Helm + +#+BEGIN_SRC emacs-lisp +(use-package helm + :ensure t + :bind + ("M-x" . 'helm-M-x) + ("M-y" . 'helm-show-kill-ring) + ("C-x b" . 'helm-mini) + ("C-x C-b" . 'helm-mini) + ("C-x C-f" . 'helm-find-files) + :init + (helm-mode 1)) + :config + (setq helm-M-x-fuzzy-match t + helm-buffers-fuzzy-matching t + helm-recentf-fuzzy-match t + helm-semantic-fuzzy-match t + helm-imenu-fuzzy-match t + helm-split-window-inside-p nil ;; open helm buffer inside current window + helm-scroll-amount 8 ;; scroll 8 lines other window using M-/M- +;; helm-move-to-line-cycle-in-source nil ;; move to end or beginning of source when reaching to por bottom of source +;; helm-ff-search-library-in-sexp t ;; search for library in 'require' and 'declare-function' sexp +;; helm-echo-input-in-header-line t + ) + +(require 'helm-config) +;; (helm-autoresize-mode 1) +;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) +;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) + +;; replace vanilla isearch with helm-swoop +(use-package helm-swoop + :ensure t + :bind + ("C-s" . 'helm-swoop') + :config + (define-key helm-swoop-map (kbd "C-s") 'helm-multi-swoop-all-from-helm-swoop) +) + +;; rebind tab to do persistent action +;; we use helm-execute-persistent-action more than helm-select-action (default for ) +;; (define-key helm-map (kbd "") 'helm-execute-persistent-action) +;; make TAB work in terminal +;; (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) +;; remap helm-select-action: lists actions +;; (define-key helm-map (kbd "C-z") 'helm-select-action) + +;; remap calculator +;; (global-set-key (kbd "C-c C-c") 'helm-calcul-expression) + +;; TODO: experiment with mark ring (breadcrumbs something?) +;; TODO: experiment with helm-regexp (build and test regexes) +;; TODO: remember helm-top (helm interface for top program) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Next 2 lines make sure when using helm-swoop only the current window/buffer is affected ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; If this value is t, split window inside the current window +;; (setq helm-swoop-split-with-multiple-windows t) + +;; Split direcion. 'split-window-vertically or 'split-window-horizontally +;; (setq helm-swoop-split-direction 'split-window-vertically) + +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff @@ -516,3 +582,4 @@ stuff i need to look into: - spaceline - async - exwm +- helm-hide-minibuffer diff --git a/custom/setup-helm.el b/custom/setup-helm.el deleted file mode 100644 index 1ed7612..0000000 --- a/custom/setup-helm.el +++ /dev/null @@ -1,50 +0,0 @@ -(require 'helm) -(require 'helm-config) - -;; replace vanilla commands with helm commands -(global-set-key (kbd "M-x") 'helm-M-x) -(global-set-key (kbd "M-y") 'helm-show-kill-ring) -(global-set-key (kbd "C-x b") 'helm-mini) -;; In vanilla, this is mapped to show-buffers, but I don't use that so map it to helm-mini as well -(global-set-key (kbd "C-x C-b") 'helm-mini) -(global-set-key (kbd "C-x C-f") 'helm-find-files) - -;; rebind tab to do persistent action -;; we use helm-execute-persistent-action more than helm-select-action (default for ) -(define-key helm-map (kbd "") 'helm-execute-persistent-action) -;; make TAB work in terminal -(define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) -;; remap helm-select-action: lists actions -(define-key helm-map (kbd "C-z") 'helm-select-action) - -;; remap calculator -(global-set-key (kbd "C-c C-c") 'helm-calcul-expression) - -;; TODO: experiment with mark ring (breadcrumbs something?) -;; TODO: experiment with helm-regexp (build and test regexes) -;; TODO: remember helm-top (helm interface for top program) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; PACKAGE: helm-swoop ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Locate the helm-swoop folder to your path -(require 'helm-swoop) - -;; replace vanilla I-search with helm-swoop -(global-set-key (kbd "C-s") 'helm-swoop) - -;; From helm-swoop to helm-multi-swoop-all -;;(define-key helm-swoop-map (kbd "M-s") 'helm-multi-swoop-all-from-helm-swoop) -(define-key helm-swoop-map (kbd "C-s") 'helm-multi-swoop-all-from-helm-swoop) -;; TODO: find out how to switch from multi-swoop to swoop back again - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Next 2 lines make sure when using helm-swoop only the current window/buffer is affected ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; If this value is t, split window inside the current window -(setq helm-swoop-split-with-multiple-windows t) - -;; Split direcion. 'split-window-vertically or 'split-window-horizontally -(setq helm-swoop-split-direction 'split-window-vertically) - -(provide 'setup-helm) From 27b84978a74870bb0bb6fd6aa70a9cd36774e7f5 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 20:58:29 +0200 Subject: [PATCH 010/280] Add readme --- README.org | 1 + 1 file changed, 1 insertion(+) create mode 120000 README.org diff --git a/README.org b/README.org new file mode 120000 index 0000000..f13833e --- /dev/null +++ b/README.org @@ -0,0 +1 @@ +config.org \ No newline at end of file From dc8880dfc1f130c94b4cc61df88249fda5f0642b Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 21:19:17 +0200 Subject: [PATCH 011/280] Add helm-gtags section --- config.org | 23 +++++++++++++++++++++++ custom/setup-helm-gtags.el | 19 ------------------- 2 files changed, 23 insertions(+), 19 deletions(-) delete mode 100644 custom/setup-helm-gtags.el diff --git a/config.org b/config.org index c3f6a27..fa8e98d 100644 --- a/config.org +++ b/config.org @@ -470,6 +470,8 @@ To be fair, I didn't test this in a while... * Helm +** General config + #+BEGIN_SRC emacs-lisp (use-package helm :ensure t @@ -534,6 +536,27 @@ To be fair, I didn't test this in a while... #+END_SRC +** Helm-gtags + +#+BEGIN_SRC emacs-lisp +(use-package helm-gtags + :ensure t + :bind + ( "M-." . 'helm-gtags-find-tag-from-here) + ( "M-," . 'helm-gtags-pop-stack) + ( "C-c f" . 'helm-gtags-find-files) + ( "C-c p" . 'helm-gtags-parse-file) + :config + (add-hook 'c-mode-hook 'helm-gtags-mode) + (add-hook 'c++-mode-hook 'helm-gtags-mode) + (add-hook 'python-mode-hook 'helm-gtags-mode) + (add-hook 'java-mode-hook 'helm-gtags-mode) + (add-hook 'asm-mode-hook 'helm-gtags-mode) + + (custom-set-variables '(helm-gtags-auto-update t)) +) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff diff --git a/custom/setup-helm-gtags.el b/custom/setup-helm-gtags.el deleted file mode 100644 index 09b7e09..0000000 --- a/custom/setup-helm-gtags.el +++ /dev/null @@ -1,19 +0,0 @@ -(require 'helm-gtags) - -;; Enable helm-gtags-mode in languages that GNU Global supports -(add-hook 'c-mode-hook 'helm-gtags-mode) -(add-hook 'c++-mode-hook 'helm-gtags-mode) -(add-hook 'python-mode-hook 'helm-gtags-mode) -(add-hook 'java-mode-hook 'helm-gtags-mode) -(add-hook 'asm-mode-hook 'helm-gtags-mode) - -;; customize behaviour -(custom-set-variables - '(helm-gtags-auto-update t)) - -(global-set-key (kbd "M-.") 'helm-gtags-find-tag-from-here) -(global-set-key (kbd "M-,") 'helm-gtags-pop-stack) -(global-set-key (kbd "C-c C-f") 'helm-gtags-find-files) -(global-set-key (kbd "C-c g f") 'helm-gtags-parse-file) - -(provide 'setup-helm-gtags) From 945a55a2c0eaa8ae509216ed13c38f166786324b Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 21:32:58 +0200 Subject: [PATCH 012/280] Set modeline theme to respectful --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index fa8e98d..49fbd44 100644 --- a/config.org +++ b/config.org @@ -206,7 +206,7 @@ FYI: At one point, used this together with sr-speedbar. They did not play well t :ensure t :config (setq sml/no-confirm-load-theme t) - (setq sml/theme 'powerline) + (setq sml/theme 'respectful) (sml/setup) ) #+END_SRC From 16a0b0bef67c53584b92c9b86089fc3f2df21f66 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 21:45:59 +0200 Subject: [PATCH 013/280] Fix helm section --- config.org | 52 +++++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/config.org b/config.org index 49fbd44..a41b062 100644 --- a/config.org +++ b/config.org @@ -476,40 +476,42 @@ To be fair, I didn't test this in a while... (use-package helm :ensure t :bind - ("M-x" . 'helm-M-x) - ("M-y" . 'helm-show-kill-ring) - ("C-x b" . 'helm-mini) - ("C-x C-b" . 'helm-mini) - ("C-x C-f" . 'helm-find-files) + ("M-x" . helm-M-x) + ("M-y" . helm-show-kill-ring) + ("C-x b" . helm-mini) + ("C-x C-b" . helm-mini) + ("C-x C-f" . helm-find-files) :init - (helm-mode 1)) + (helm-mode 1) :config - (setq helm-M-x-fuzzy-match t - helm-buffers-fuzzy-matching t - helm-recentf-fuzzy-match t - helm-semantic-fuzzy-match t - helm-imenu-fuzzy-match t - helm-split-window-inside-p nil ;; open helm buffer inside current window - helm-scroll-amount 8 ;; scroll 8 lines other window using M-/M- + (setq helm-M-x-fuzzy-match t + helm-buffers-fuzzy-matching t + helm-recentf-fuzzy-match t + helm-semantic-fuzzy-match t + helm-imenu-fuzzy-match t + helm-split-window-inside-p nil ;; open helm buffer inside current window + helm-scroll-amount 8 ;; scroll 8 lines other window using M-/M- ;; helm-move-to-line-cycle-in-source nil ;; move to end or beginning of source when reaching to por bottom of source ;; helm-ff-search-library-in-sexp t ;; search for library in 'require' and 'declare-function' sexp ;; helm-echo-input-in-header-line t - ) + ) +) -(require 'helm-config) -;; (helm-autoresize-mode 1) -;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) -;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) - -;; replace vanilla isearch with helm-swoop (use-package helm-swoop :ensure t :bind - ("C-s" . 'helm-swoop') + ("C-s" . helm-swoop) :config (define-key helm-swoop-map (kbd "C-s") 'helm-multi-swoop-all-from-helm-swoop) ) +;; (require 'helm-config) +;; ;; (helm-autoresize-mode 1) +;; ;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) +;; ;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) +;; +;; ;; replace vanilla isearch with helm-swoop + ;; rebind tab to do persistent action ;; we use helm-execute-persistent-action more than helm-select-action (default for ) ;; (define-key helm-map (kbd "") 'helm-execute-persistent-action) @@ -542,10 +544,10 @@ To be fair, I didn't test this in a while... (use-package helm-gtags :ensure t :bind - ( "M-." . 'helm-gtags-find-tag-from-here) - ( "M-," . 'helm-gtags-pop-stack) - ( "C-c f" . 'helm-gtags-find-files) - ( "C-c p" . 'helm-gtags-parse-file) + ( "M-." . helm-gtags-find-tag-from-here) + ( "M-," . helm-gtags-pop-stack) + ( "C-c f" . helm-gtags-find-files) + ( "C-c p" . helm-gtags-parse-file) :config (add-hook 'c-mode-hook 'helm-gtags-mode) (add-hook 'c++-mode-hook 'helm-gtags-mode) From bc4ec44ceacd826a370f53c58151f96a77ea3418 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 21:59:24 +0200 Subject: [PATCH 014/280] Helm: split in current window + rebind for helm + enable autoresize --- config.org | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/config.org b/config.org index a41b062..b5e4887 100644 --- a/config.org +++ b/config.org @@ -489,12 +489,16 @@ To be fair, I didn't test this in a while... helm-recentf-fuzzy-match t helm-semantic-fuzzy-match t helm-imenu-fuzzy-match t - helm-split-window-inside-p nil ;; open helm buffer inside current window + helm-split-window-inside-p t ;; open helm buffer inside current window helm-scroll-amount 8 ;; scroll 8 lines other window using M-/M- ;; helm-move-to-line-cycle-in-source nil ;; move to end or beginning of source when reaching to por bottom of source ;; helm-ff-search-library-in-sexp t ;; search for library in 'require' and 'declare-function' sexp ;; helm-echo-input-in-header-line t ) + ;; rebind tab to do persistent action + ;; we use helm-execute-persistent-action more than helm-select-action (default for ) + (define-key helm-map (kbd "") 'helm-execute-persistent-action) + (helm-autoresize-mode 1) ;; Awesome feature together with helm-split-window-inside-p != nil ) (use-package helm-swoop @@ -506,15 +510,9 @@ To be fair, I didn't test this in a while... ) ;; (require 'helm-config) -;; ;; (helm-autoresize-mode 1) ;; ;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) ;; ;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) ;; -;; ;; replace vanilla isearch with helm-swoop - -;; rebind tab to do persistent action -;; we use helm-execute-persistent-action more than helm-select-action (default for ) -;; (define-key helm-map (kbd "") 'helm-execute-persistent-action) ;; make TAB work in terminal ;; (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) ;; remap helm-select-action: lists actions From 3fcf20b86394db74c6cea44adf8d92b97a0d326e Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:00:49 +0200 Subject: [PATCH 015/280] Remove old dashboard file --- custom/setup-dashboard.el | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 custom/setup-dashboard.el diff --git a/custom/setup-dashboard.el b/custom/setup-dashboard.el deleted file mode 100644 index 6d1490a..0000000 --- a/custom/setup-dashboard.el +++ /dev/null @@ -1,17 +0,0 @@ -(require 'dashboard) - -(dashboard-setup-startup-hook) - -;; Set the startup message -(setq dashboard-banner-logo-title "") - -;; Set the banner -(setq dashboard-startup-banner 'logo) -(setq dashboard-items '((recents . 10) - (bookmarks . 5) - )) - -;; Enable recent files -(recentf-mode 1) - -(provide 'setup-dashboard) From 63258929387a09f11a4f05623542b9d5d81b6529 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:11:21 +0200 Subject: [PATCH 016/280] Helm-swoop: split window in current window --- config.org | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/config.org b/config.org index b5e4887..6803a61 100644 --- a/config.org +++ b/config.org @@ -506,7 +506,10 @@ To be fair, I didn't test this in a while... :bind ("C-s" . helm-swoop) :config + ;; "C-s" + "C-s" results in mult-swoop (define-key helm-swoop-map (kbd "C-s") 'helm-multi-swoop-all-from-helm-swoop) + ;; split window inside the current window when multiple windows open + (setq helm-swoop-split-with-multiple-windows t) ) ;; (require 'helm-config) @@ -525,15 +528,6 @@ To be fair, I didn't test this in a while... ;; TODO: experiment with helm-regexp (build and test regexes) ;; TODO: remember helm-top (helm interface for top program) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Next 2 lines make sure when using helm-swoop only the current window/buffer is affected ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; If this value is t, split window inside the current window -;; (setq helm-swoop-split-with-multiple-windows t) - -;; Split direcion. 'split-window-vertically or 'split-window-horizontally -;; (setq helm-swoop-split-direction 'split-window-vertically) - #+END_SRC ** Helm-gtags From 98b1dfc7ca72acfeaf21d3e351c912b7e27ee44f Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:15:57 +0200 Subject: [PATCH 017/280] Add multiple cursors section --- config.org | 16 ++++++++++++++++ custom/setup-cursors.el | 10 ---------- 2 files changed, 16 insertions(+), 10 deletions(-) delete mode 100644 custom/setup-cursors.el diff --git a/config.org b/config.org index 6803a61..093b32f 100644 --- a/config.org +++ b/config.org @@ -551,6 +551,22 @@ To be fair, I didn't test this in a while... ) #+END_SRC +* Mutliple cursors + +https://github.com/magnars/multiple-cursors.el + +#+BEGIN_SRC emacs-lisp +(use-package multiple-cursors + :ensure t + :bind + ("C-x r a" . mc/edit-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) +) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff diff --git a/custom/setup-cursors.el b/custom/setup-cursors.el deleted file mode 100644 index d5a1aca..0000000 --- a/custom/setup-cursors.el +++ /dev/null @@ -1,10 +0,0 @@ -(require 'multiple-cursors) - -(global-set-key (kbd "C-x r a") 'mc/edit-lines) -(global-set-key (kbd "C-x r e") 'mc/edit-ends-of-lines) - -(global-set-key (kbd "C->") 'mc/mark-next-like-this) -(global-set-key (kbd "C-<") 'mc/mark-previous-like-this) -(global-set-key (kbd "C-c C->") 'mc/mark-all-like-this) - -(provide 'setup-cursors) From 847f0d43eb05dc0cd44eb52cef2acc854d3aabf4 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:19:28 +0200 Subject: [PATCH 018/280] Add GDB section --- config.org | 41 +++++++++++++++++++++++++++++++++++++++++ custom/setup-gdb.el | 36 ------------------------------------ 2 files changed, 41 insertions(+), 36 deletions(-) delete mode 100644 custom/setup-gdb.el diff --git a/config.org b/config.org index 093b32f..738962b 100644 --- a/config.org +++ b/config.org @@ -567,6 +567,47 @@ https://github.com/magnars/multiple-cursors.el ) #+END_SRC +* GDB + +TODO: need to document this + +#+BEGIN_SRC emacs-lisp +(setq gdb-many-windows 1) + +;; Select a register number which is unlikely to get used elsewere +(defconst egdbe-windows-config-register 313465989 + "Internal used") + +(defvar egdbe-windows-config nil) + +(defun set-egdbe-windows-config () + (interactive) + (setq egdbe-windows-config (window-configuration-to-register egdbe-windows-config-register))) + +(defun egdbe-restore-windows-config () + (interactive) + (jump-to-register egdbe-windows-config-register)) + +(defun egdbe-start-gdb (&optional gdb-args) + "" + (interactive) + (set-egdbe-windows-config) + (call-interactively 'gdb)) + +(defun egdbe-quit () + "finish." + (interactive) + (gud-basic-call "quit") + (egdbe-restore-windows-config)) + +(defun egdbe-gud-mode-hook () + "" + (local-unset-key (kbd "q")) + (local-set-key (kbd "q") 'egdbe-quit)) + +(add-hook 'gud-mode-hook 'egdbe-gud-mode-hook) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff diff --git a/custom/setup-gdb.el b/custom/setup-gdb.el deleted file mode 100644 index 4d40663..0000000 --- a/custom/setup-gdb.el +++ /dev/null @@ -1,36 +0,0 @@ -(setq gdb-many-windows 1) - -;; Select a register number which is unlikely to get used elsewere -(defconst egdbe-windows-config-register 313465989 - "Internal used") - -(defvar egdbe-windows-config nil) - -(defun set-egdbe-windows-config () - (interactive) - (setq egdbe-windows-config (window-configuration-to-register egdbe-windows-config-register))) - -(defun egdbe-restore-windows-config () - (interactive) - (jump-to-register egdbe-windows-config-register)) - -(defun egdbe-start-gdb (&optional gdb-args) - "" - (interactive) - (set-egdbe-windows-config) - (call-interactively 'gdb)) - -(defun egdbe-quit () - "finish." - (interactive) - (gud-basic-call "quit") - (egdbe-restore-windows-config)) - -(defun egdbe-gud-mode-hook () - "" - (local-unset-key (kbd "q")) - (local-set-key (kbd "q") 'egdbe-quit)) - -(add-hook 'gud-mode-hook 'egdbe-gud-mode-hook) - -(provide 'setup-gdb) From 96ab07c63805dccf5f6c1829e0fecfa6362e32a2 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:28:21 +0200 Subject: [PATCH 019/280] Add C coding setting + angry faces --- config.org | 43 ++++++++++++++++++++++++++++++++++++++++++ custom/setup-coding.el | 32 ------------------------------- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/config.org b/config.org index 738962b..d1dbbed 100644 --- a/config.org +++ b/config.org @@ -267,6 +267,49 @@ Automatically delete trailing whitespace when saving a file. (add-hook 'before-save-hook 'delete-trailing-whitespace) #+END_SRC +** Angry faces + +#+BEGIN_SRC emacs-lisp +;; make angry face to get my attention +(setq prog-modes '(c++-mode python-mode erlang-mode java-mode c-mode emacs-lisp-mode scheme-mode prog-mode)) +(make-face 'font-lock-angry-face) +(modify-face 'font-lock-angry-face "Red" "Yellow" nil t nil t nil nil) + +;; Add keywords to recognize to angry face +(mapc (lambda (mode) + (font-lock-add-keywords + mode + '(("\\<\\(FIXME\\)" 1 'font-lock-angry-face t))) + ) + prog-modes) +(mapc (lambda (mode) + (font-lock-add-keywords + mode + '(("\\<\\(TODO\\)" 1 'font-lock-angry-face t))) + ) + prog-modes) +#+END_SRC + +** C Coding settings + +Some basic C-coding settings (style, indentation offset, ...). + +#+BEGIN_SRC emacs-lisp +;; default coding style +(setq c-default-style "linux") + +;; sane indentation offset +(setq c-basic-offset 4) +#+END_SRC + +** Tabs vs spaces + +Tabs are evil. + +#+BEGIN_SRC emacs-lisp +(setq-default indent-tabs-mode nil) +#+END_SRC + * Undo-tree Undo with =C-/=. diff --git a/custom/setup-coding.el b/custom/setup-coding.el index def1407..c4beb5f 100644 --- a/custom/setup-coding.el +++ b/custom/setup-coding.el @@ -1,35 +1,3 @@ -;; make angry face to get my attention -(setq prog-modes '(c++-mode python-mode erlang-mode java-mode c-mode emacs-lisp-mode scheme-mode prog-mode)) -(make-face 'font-lock-angry-face) -(modify-face 'font-lock-angry-face "Red" "Yellow" nil t nil t nil nil) - -;; Add keywords to recognize to angry face -(mapc (lambda (mode) - (font-lock-add-keywords - mode - '(("\\<\\(FIXME\\)" 1 'font-lock-angry-face t))) - ) - prog-modes) -(mapc (lambda (mode) - (font-lock-add-keywords - mode - '(("\\<\\(TODO\\)" 1 'font-lock-angry-face t))) - ) - prog-modes) - -;; default coding style -(setq c-default-style "linux") - -;; sane indentation offset -(setq c-basic-offset 4) - -;; Tab-space strategy -;; we use spaces, deal with it -(setq-default indent-tabs-mode nil) - -;; Enable subword mode for handling CamelCase format -(global-subword-mode t) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Python ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; From 623759dd64b4f4a21fb3d28d364fcc1282eeb88d Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:39:05 +0200 Subject: [PATCH 020/280] Add magit section --- config.org | 10 ++++++++++ custom/setup-coding.el | 5 ----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/config.org b/config.org index d1dbbed..34d0c82 100644 --- a/config.org +++ b/config.org @@ -651,6 +651,16 @@ TODO: need to document this (add-hook 'gud-mode-hook 'egdbe-gud-mode-hook) #+END_SRC +* Magit + +#+BEGIN_SRC emacs-lisp +(use-package magit + :ensure t + :bind + ("C-c m" . magit-status) +) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff diff --git a/custom/setup-coding.el b/custom/setup-coding.el index c4beb5f..d915503 100644 --- a/custom/setup-coding.el +++ b/custom/setup-coding.el @@ -8,9 +8,4 @@ (add-hook 'elpy-mode-hook 'flycheck-mode) (add-hook 'elpy-mode-hook 'py-autopep8-enable-on-save) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Magit (git) ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(global-set-key (kbd "C-c m") 'magit-status) - (provide 'setup-coding) From ef4b87f560b74303f4538a5f232b00d6a571f6d5 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:07:20 +0200 Subject: [PATCH 021/280] Add melpa to package-archives (needed for flycheck-clang-*) --- init.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/init.el b/init.el index d614563..aaaaeda 100644 --- a/init.el +++ b/init.el @@ -6,6 +6,8 @@ ;; add melpa-stable to package-archives (add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t) +(add-to-list 'package-archives + '("melpa" . "http://melpa.milkbox.net/packages/") t) ;; MUST be called after package-archives is updated (package-initialize) From 70662a4f65499bd707a15114e96740baddaaabcd Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:38:20 +0200 Subject: [PATCH 022/280] Add programming section - Setup company/ivory/flycheck - basic setup --- config.org | 114 ++++++++++++++++++++++++++++----- custom/setup-autocompletion.el | 14 ---- 2 files changed, 98 insertions(+), 30 deletions(-) diff --git a/config.org b/config.org index 34d0c82..bbea73f 100644 --- a/config.org +++ b/config.org @@ -446,22 +446,6 @@ https://github.com/remyferre/comment-dwim-2 ) #+END_SRC -* Yasnippet - -Template system for Emacs. - -https://github.com/joaotavora/yasnippet - -#+BEGIN_SRC emacs-lisp -(use-package yasnippet - :ensure t - :config - (add-to-list 'load-path - "~/.emacs.d/plugins/yasnippet") - (yas-global-mode 1) -) -#+END_SRC - * Expand-region Expand region increases the selected region by semantic units. @@ -661,6 +645,104 @@ TODO: need to document this ) #+END_SRC +* Programming + +** Yasnippet + +Template system for Emacs. + +https://github.com/joaotavora/yasnippet + +#+BEGIN_SRC emacs-lisp +(use-package yasnippet + :ensure t + :init + (add-to-list 'load-path + "~/.emacs.d/plugins/yasnippet") + :config + (add-hook 'prog-mode-hook 'yas-minor-mode) +) +#+END_SRC + +** Flycheck + +On-the-fly syntax checking. + +#+BEGIN_SRC emacs-lisp +(use-package flycheck + :ensure t + :config + (add-hook 'prog-mode-hook 'flycheck-mode) +) +#+END_SRC + +** Company mode + +#+BEGIN_SRC emacs-lisp +(use-package company + :ensure t + :config + (setq company-idle-delay 0) + (setq company-minimum-prefix-length 3)) + (add-hook 'prog-mode-hook 'company-mode) +#+END_SRC + +** C/C++ mode + +*** Flycheck + +Clang static analyzer with flycheck + +https://github.com/alexmurray/flycheck-clang-analyzer +https://github.com/Sarcasm/flycheck-irony + +#+BEGIN_SRC emacs-lisp +(use-package flycheck-clang-analyzer + :ensure t + :config + (with-eval-after-load 'flycheck + (require 'flycheck-clang-analyzer) + (flycheck-clang-analyzer-setup))) + +(use-package flycheck-irony + :ensure t + :config + (eval-after-load 'flycheck + '(add-hook 'flycheck-mode-hook #'flycheck-irony-setup)) +) +#+END_SRC + +*** Company + +https://github.com/ikirill/irony-eldoc + +#+BEGIN_SRC emacs-lisp +(use-package company-c-headers + :ensure t) + +(use-package company-irony + :ensure t + :config + (setq company-backends '((company-c-headers +;; company-dabbrev-code ;; not sure what this is + company-irony)))) + +(use-package irony + :ensure t + :config + (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options) + (add-hook 'c++-mode-hook 'irony-mode) + (add-hook 'c-mode-hook 'irony-mode) + (add-hook 'objc-mode-hook 'irony-mode) +) + +(use-package irony-eldoc + :ensure t + :config + (add-hook 'irony-mode-hook 'irony-eldoc) +) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff diff --git a/custom/setup-autocompletion.el b/custom/setup-autocompletion.el index e784b93..fbfbaca 100644 --- a/custom/setup-autocompletion.el +++ b/custom/setup-autocompletion.el @@ -1,21 +1,7 @@ -(add-hook 'after-init-hook 'global-company-mode) - -;; Add irony as company-backend -(eval-after-load 'company - '(add-to-list 'company-backends 'company-irony)) - ;; Add irony as flycheck hook (eval-after-load 'flycheck '(add-hook 'flycheck-mode-hook 'flycheck-irony-setup)) -(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options) -(add-hook 'irony-mode-hook 'irony-eldoc) - -;; Add irony-, flycheck-, company-mode to c-mode -(add-hook 'c-mode-hook 'irony-mode) -(add-hook 'c-mode-hook 'flycheck-mode) -(add-hook 'c-mode-hook 'company-mode) - ;; Set tab to autocomplete or indent depending on context (global-set-key (kbd "") 'company-indent-or-complete-common) From 68afa8fc08252b47a0719ebf46811b85e129edce Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:42:41 +0200 Subject: [PATCH 023/280] Add avy --- config.org | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config.org b/config.org index bbea73f..bb723f5 100644 --- a/config.org +++ b/config.org @@ -743,6 +743,17 @@ https://github.com/ikirill/irony-eldoc ) #+END_SRC +* Avy + +https://github.com/abo-abo/avy + +#+BEGIN_SRC emacs-lisp +(use-package avy + :ensure t + :bind + ("M-s" . avy-goto-char-timer)) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From ad283281232e61b97f74ce6868e2bbd4e8276a1f Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:53:53 +0200 Subject: [PATCH 024/280] Enable relative line numbers in program-mode --- config.org | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/config.org b/config.org index bb723f5..e051479 100644 --- a/config.org +++ b/config.org @@ -687,6 +687,16 @@ On-the-fly syntax checking. (add-hook 'prog-mode-hook 'company-mode) #+END_SRC +** (Relative) Line numbers + +#+BEGIN_SRC emacs-lisp +(use-package linum-relative + :ensure t + :config + (setq linum-relative-current-symbol "") + (add-hook 'prog-mode-hook 'linum-relative-mode)) +#+END_SRC + ** C/C++ mode *** Flycheck From 51f232a9dd0f7e40097e564608699890a79a3aba Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:54:24 +0200 Subject: [PATCH 025/280] Window splitting convenience functions --- config.org | 23 +++++++++++++++++++++++ init.el | 15 +++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/config.org b/config.org index e051479..7fbae73 100644 --- a/config.org +++ b/config.org @@ -753,6 +753,29 @@ https://github.com/ikirill/irony-eldoc ) #+END_SRC +* Windows + +** Splitting + +After you split a window, your focus remains in the previous one. +Credit goes to https://github.com/daedreth/UncleDavesEmacs + +#+BEGIN_SRC emacs-lisp +(defun split-and-follow-horizontally () + (interactive) + (split-window-below) + (balance-windows) + (other-window 1)) +(global-set-key (kbd "C-x 2") 'split-and-follow-horizontally) + +(defun split-and-follow-vertically () + (interactive) + (split-window-right) + (balance-windows) + (other-window 1)) +(global-set-key (kbd "C-x 3") 'split-and-follow-vertically) +#+END_SRC + * Avy https://github.com/abo-abo/avy diff --git a/init.el b/init.el index aaaaeda..16b4ed1 100644 --- a/init.el +++ b/init.el @@ -22,3 +22,18 @@ (org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) (provide 'init) +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(helm-gtags-auto-update t) + '(package-selected-packages + (quote + (linum-relative avy flycheck-irony irony-eldoc company-irony company-c-headers flycheck magit py-autopep8 multiple-cursors helm-gtags helm-swoop zygospore yasnippet volatile-highlights use-package undo-tree smartparens smart-mode-line monokai-theme iedit helm expand-region dashboard comment-dwim-2)))) +(custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) From c8573cde04764e182b86dfc3251ee24792de0551 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:58:51 +0200 Subject: [PATCH 026/280] Add switch-window --- config.org | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config.org b/config.org index 7fbae73..3f66f63 100644 --- a/config.org +++ b/config.org @@ -776,6 +776,22 @@ Credit goes to https://github.com/daedreth/UncleDavesEmacs (global-set-key (kbd "C-x 3") 'split-and-follow-vertically) #+END_SRC +** Switching + +#+BEGIN_SRC emacs-lisp +(use-package switch-window + :ensure t + :config + (setq switch-window-input-style 'minibuffer) + (setq switch-window-increase 4) + (setq switch-window-threshold 2) + (setq switch-window-shortcut-style 'qwerty) + (setq switch-window-qwerty-shortcuts + '("a" "s" "d" "f" "j" "k" "l" "i" "o")) + :bind + ("C-x o" . switch-window)) +#+END_SRC + * Avy https://github.com/abo-abo/avy From 9db1ce210e1acf1984a2621413d21bada92853d2 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 09:25:59 +0200 Subject: [PATCH 027/280] Set company-minimum-prefix to 2 --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 3f66f63..5c35833 100644 --- a/config.org +++ b/config.org @@ -683,7 +683,7 @@ On-the-fly syntax checking. :ensure t :config (setq company-idle-delay 0) - (setq company-minimum-prefix-length 3)) + (setq company-minimum-prefix-length 2)) (add-hook 'prog-mode-hook 'company-mode) #+END_SRC From 9d650ebbd53daddb27658a557d27195f0f7692c4 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 10:31:21 +0200 Subject: [PATCH 028/280] Add link to switch-window + tryout for multiple frames - Move window-switching specific stuff section from the past to here as well --- config.org | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/config.org b/config.org index 5c35833..e1dad54 100644 --- a/config.org +++ b/config.org @@ -86,23 +86,6 @@ Because I'm lazy, important yes-or-no questions can be answered with y-or-n: (add-to-list 'default-frame-alist '(fullscreen . maximized)) #+END_SRC -** Multi-frame rebindings - -Sometimes I have multiple emacs-frames open. -I prefer that the normal =C-x o= can deal with this. - -#+BEGIN_SRC emacs-lisp -;; Use C-x o to switch to other frame when using multi-monitor -(global-set-key (kbd "C-x o") 'next-multiframe-window) -#+END_SRC - -Now that =next-multiframe-window= is bound to =C-x o=, -Bind =C-x p= to =previous-multiframe-window=. - -#+BEGIN_SRC emacs-lisp -(global-set-key (kbd "\C-x p") 'previous-multiframe-window) -#+END_SRC - ** Enable disabled commands Some commands are disabled to protect the user. @@ -778,20 +761,44 @@ Credit goes to https://github.com/daedreth/UncleDavesEmacs ** Switching +https://github.com/dimitri/switch-window + #+BEGIN_SRC emacs-lisp (use-package switch-window :ensure t :config (setq switch-window-input-style 'minibuffer) - (setq switch-window-increase 4) + (setq switch-window-increase 6) (setq switch-window-threshold 2) (setq switch-window-shortcut-style 'qwerty) (setq switch-window-qwerty-shortcuts '("a" "s" "d" "f" "j" "k" "l" "i" "o")) +;; (setq switch-window-multiple-frames t) ;; TODO: doesn't work properly.. :bind ("C-x o" . switch-window)) #+END_SRC +When using exwm, have a look at this: https://github.com/dimitri/switch-window/pull/62 + + +** Multi-frame rebindings (obsolete with switch-window) + +Sometimes I have multiple emacs-frames open. +In the past, I preferred that the normal =C-x o= can deal with this but this is used by switch-window now. + +#+BEGIN_SRC emacs-lisp +;; Use C-x o to switch to other frame when using multi-monitor +;; (global-set-key (kbd "C-x o") 'next-multiframe-window) +#+END_SRC + +Now that =next-multiframe-window= is bound to =C-x o=, +Bind =C-x p= to =previous-multiframe-window=. + +#+BEGIN_SRC emacs-lisp +;; (global-set-key (kbd "\C-x p") 'previous-multiframe-window) +#+END_SRC + + * Avy https://github.com/abo-abo/avy From 39d0fdd7aad5775efee8d4a20d456be0e96d48d7 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 10:48:59 +0200 Subject: [PATCH 029/280] Add configuration-convenience functions --- config.org | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index e1dad54..c5afd1b 100644 --- a/config.org +++ b/config.org @@ -798,7 +798,6 @@ Bind =C-x p= to =previous-multiframe-window=. ;; (global-set-key (kbd "\C-x p") 'previous-multiframe-window) #+END_SRC - * Avy https://github.com/abo-abo/avy @@ -810,6 +809,27 @@ https://github.com/abo-abo/avy ("M-s" . avy-goto-char-timer)) #+END_SRC +* Convenience stuff + +** Visiting the configuration + +#+BEGIN_SRC emacs-lisp +(defun config-visit () + (interactive) + (find-file "~/.emacs.d/config.org")) +(global-set-key (kbd "C-c e") 'config-visit) +#+END_SRC + +** Reload the configuration + +#+BEGIN_SRC emacs-lisp +(defun config-reload () + "Reloads ~/.emacs.d/config.org at runtime" + (interactive) + (org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) +(global-set-key (kbd "C-c r") 'config-reload) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From a18574f65e82ed4ded702e3cdde1e0e39c309772 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 10:49:29 +0200 Subject: [PATCH 030/280] Enable subword mode (globally) --- config.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config.org b/config.org index c5afd1b..3796347 100644 --- a/config.org +++ b/config.org @@ -830,6 +830,12 @@ https://github.com/abo-abo/avy (global-set-key (kbd "C-c r") 'config-reload) #+END_SRC +** Subword + +#+BEGIN_SRC emacs-lisp +(global-subword-mode 1) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From 9608eb5ac9eaccecb18914d1d4afa1645645e503 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Thu, 14 Jun 2018 23:30:27 +0200 Subject: [PATCH 031/280] Avy: Set 'M-s' to avy-goto-char --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 3796347..b1168af 100644 --- a/config.org +++ b/config.org @@ -806,7 +806,7 @@ https://github.com/abo-abo/avy (use-package avy :ensure t :bind - ("M-s" . avy-goto-char-timer)) + ("M-s" . avy-goto-char)) #+END_SRC * Convenience stuff From 5e37f3e653fce60598ed19183db497c24e970fa0 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Thu, 14 Jun 2018 23:39:23 +0200 Subject: [PATCH 032/280] Start emacs server --- config.org | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config.org b/config.org index b1168af..53f35dd 100644 --- a/config.org +++ b/config.org @@ -836,6 +836,15 @@ https://github.com/abo-abo/avy (global-subword-mode 1) #+END_SRC +* Server + +Emacs as a server. +Emacsclient will then use this emacs as its server. + +#+BEGIN_SRC emacs-lisp +(server-start) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From f2b345306f6d5c15b437b80fab416c63da9b9ced Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Fri, 15 Jun 2018 00:18:28 +0200 Subject: [PATCH 033/280] Add beacon section --- config.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config.org b/config.org index 53f35dd..7c786a2 100644 --- a/config.org +++ b/config.org @@ -845,6 +845,19 @@ Emacsclient will then use this emacs as its server. (server-start) #+END_SRC +* Beacon + +https://github.com/Malabarba/beacon + +#+BEGIN_SRC emacs-lisp +(use-package beacon + :ensure t + :config + (beacon-mode 1) + (setq beacon-color "#FFFFCC") ;; yelowish +) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From b621088849ffe2bf09862ebde51b5292256ec7f8 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 26 Jun 2018 12:49:02 +0200 Subject: [PATCH 034/280] Make TAB work in minibuffer --- config.org | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.org b/config.org index 7c786a2..6d2c3d4 100644 --- a/config.org +++ b/config.org @@ -526,10 +526,10 @@ To be fair, I didn't test this in a while... ;; ;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) ;; ;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) ;; -;; make TAB work in terminal -;; (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) +;; make TAB work in terminal/minibuffer +(define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) ;; remap helm-select-action: lists actions -;; (define-key helm-map (kbd "C-z") 'helm-select-action) +(define-key helm-map (kbd "C-z") 'helm-select-action) ;; remap calculator ;; (global-set-key (kbd "C-c C-c") 'helm-calcul-expression) From f4b6e239421c32c9255d0bbcc7ded5c5c185e4c4 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 26 Jun 2018 12:50:14 +0200 Subject: [PATCH 035/280] Set GC threshold --- config.org | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.org b/config.org index 6d2c3d4..9161825 100644 --- a/config.org +++ b/config.org @@ -65,12 +65,12 @@ so rebind it to something easy to remember. I used to have the following enabled in my init to increase the gc threshold to speed-up emacs startup: (stolen from [[http://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/]]) -#+BEGIN_SRC -;; (setq gc-cons-threshold 100000000) +#+BEGIN_SRC emacs-lisp +(setq gc-cons-threshold 100000000) #+END_SRC But according to this: [[https://lists.gnu.org/archive/html/help-gnu-emacs/2007-06/msg00243.html ]], -it is no longer necessary. +it is no longer necessary. But I found that I still have to do this to speed up emacs. ** Yes-or-no questions From 878e2924407a6ab3bd56e8c33a7b051a548d1057 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 1 Jul 2018 16:20:40 +0200 Subject: [PATCH 036/280] Add elpy --- config.org | 18 +++++++++++++++++- init.el | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 9161825..f34dfe9 100644 --- a/config.org +++ b/config.org @@ -18,7 +18,8 @@ This configuration requires the installation of : - =clang= (for ivory) - =cmake= (for ivory) - =llvm-libs= (for cmake, somehow not a dependency on Manjaro when installing cmake) - - Use python-pip to install =jedi=, =flake8=, =importmagic= and =autopep8= (for elpy) + - Use python-pip to install requirements for elpy: + =pip install jedi flake8 importmagic autopep8 yapf= - =ditaa= (for ascii to image generation in org-mode) When first checking out this config, run =irony-install-server= to make and install the irony-server. @@ -736,6 +737,21 @@ https://github.com/ikirill/irony-eldoc ) #+END_SRC +** Python mode + +Use =elpy=: +https://github.com/jorgenschaefer/elpy + +It is a full dev env and sometimes feels like a bit too much but overal good experience. + +#+BEGIN_SRC emacs-lisp +(use-package elpy + :ensure t + :config + (elpy-enable) +) +#+END_SRC + * Windows ** Splitting diff --git a/init.el b/init.el index 16b4ed1..dbbf211 100644 --- a/init.el +++ b/init.el @@ -30,7 +30,7 @@ '(helm-gtags-auto-update t) '(package-selected-packages (quote - (linum-relative avy flycheck-irony irony-eldoc company-irony company-c-headers flycheck magit py-autopep8 multiple-cursors helm-gtags helm-swoop zygospore yasnippet volatile-highlights use-package undo-tree smartparens smart-mode-line monokai-theme iedit helm expand-region dashboard comment-dwim-2)))) + (elpy linum-relative avy flycheck-irony irony-eldoc company-irony company-c-headers flycheck magit py-autopep8 multiple-cursors helm-gtags helm-swoop zygospore yasnippet volatile-highlights use-package undo-tree smartparens smart-mode-line monokai-theme iedit helm expand-region dashboard comment-dwim-2)))) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. From 00798716825b4121dd4496d091ea64bd6b9ca154 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 1 Jul 2018 16:22:31 +0200 Subject: [PATCH 037/280] Disable audible bell --- config.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config.org b/config.org index f34dfe9..7d448ed 100644 --- a/config.org +++ b/config.org @@ -852,6 +852,14 @@ https://github.com/abo-abo/avy (global-subword-mode 1) #+END_SRC +** Bell + +The audible bell is annoying AF. + +#+BEGIN_SRC emacs-lisp +(setq visible-bell 1) +#+END_SRC + * Server Emacs as a server. From 850711cfdd5a60437987d5949359e467f2ff1a6a Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 1 Jul 2018 15:43:36 +0200 Subject: [PATCH 038/280] Add sunrise commander as submodule --- .gitmodules | 3 +++ extra/sunrise-commander | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 extra/sunrise-commander diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f8db735 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "extra/sunrise-commander"] + path = extra/sunrise-commander + url = https://github.com/escherdragon/sunrise-commander diff --git a/extra/sunrise-commander b/extra/sunrise-commander new file mode 160000 index 0000000..cf8305a --- /dev/null +++ b/extra/sunrise-commander @@ -0,0 +1 @@ +Subproject commit cf8305a149a321d028858057e7a7c92f0038a06a From 368de145873a53bf16194a48ea1bdd26f2fb0343 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 1 Jul 2018 15:43:59 +0200 Subject: [PATCH 039/280] Add basic sunrise commander config --- config.org | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config.org b/config.org index 7d448ed..9f19416 100644 --- a/config.org +++ b/config.org @@ -882,6 +882,22 @@ https://github.com/Malabarba/beacon ) #+END_SRC +* Sunrise commander + +https://github.com/escherdragon/sunrise-commander + +** Install + +#+BEGIN_SRC emacs-lisp +(add-to-list 'load-path "~/.emacs.d/extra/sunrise-commander") + +(require 'sunrise-commander) +(require 'sunrise-x-buttons) +(require 'sunrise-x-modeline) + +(add-to-list 'auto-mode-alist '("\\.srvm\\'" . sr-virtual-mode)) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From 338408623541824566a87b598a3dc747a4fb2791 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 3 Jul 2018 22:13:52 +0200 Subject: [PATCH 040/280] Add Org-mode section --- config.org | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/config.org b/config.org index 9f19416..f7fa20b 100644 --- a/config.org +++ b/config.org @@ -898,6 +898,67 @@ https://github.com/escherdragon/sunrise-commander (add-to-list 'auto-mode-alist '("\\.srvm\\'" . sr-virtual-mode)) #+END_SRC +* Org + +** Org bullets + +https://github.com/sabof/org-bullets + +#+BEGIN_SRC emacs-lisp +(use-package org-bullets + :ensure t + :config + (add-hook 'org-mode-hook (lambda () (org-bullets-mode)))) +#+END_SRC + +** Some basic config + +*** Super/Sub-scripts + +Use ={}= for subscripting: + +https://orgmode.org/manual/Subscripts-and-superscripts.html + +#+BEGIN_SRC emacs-lisp +(setq org-use-sub-superscripts '{}) +#+END_SRC + +*** Indentation + +Preserve indentation in SRC blocks + +#+BEGIN_SRC emacs-lisp +(setq org-src-preserve-indentation t) +#+END_SRC + + +*** Runnable languages + +#+BEGIN_SRC emacs-lisp +(org-babel-do-load-languages + 'org-babel-load-languages '( + (ditaa . t)) + ) +#+END_SRC + +**** Dita + +Tell org where to look for ditaa + +#+BEGIN_SRC emacs-lisp +(setq org-ditaa-jar-path "/usr/share/java/ditaa/ditaa-0_10.jar") +#+END_SRC + +** Note config + +#+BEGIN_SRC emacs-lisp +;; when ending TODO (C-C C-t) end with a note + timestamp +(setq org-log-done 'note) +;; Add extra states for keywords +(setq org-todo-keywords + '((sequence "TODO" "IN-PROGRESS" "WAITING" "DONE"))) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From 790399e4b93d24e6f51a52a88f44f6c513088b1b Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 3 Jul 2018 22:22:38 +0200 Subject: [PATCH 041/280] Add diminish section --- config.org | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/config.org b/config.org index f7fa20b..96cd438 100644 --- a/config.org +++ b/config.org @@ -195,6 +195,24 @@ FYI: At one point, used this together with sr-speedbar. They did not play well t ) #+END_SRC +** Diminish + +https://github.com/myrjola/diminish.el + +#+BEGIN_SRC emacs-lisp +(use-package diminish + :ensure t + :config + (diminish 'volatile-highlights-mode) + (diminish 'smartparens-mode) + (diminish 'beacon-mode) + (diminish 'subword-mode) + (diminish 'auto-revert-mode) + (diminish 'helm-mode) + (diminish 'undo-tree-mode) +) +#+END_SRC + * Editing settings ** Kill-ring customization From c2cf0f2cba32058d119f94b4112766d069ff2568 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 3 Jul 2018 22:51:30 +0200 Subject: [PATCH 042/280] Add clock to mode-line --- config.org | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/config.org b/config.org index 96cd438..d7fe805 100644 --- a/config.org +++ b/config.org @@ -213,6 +213,16 @@ https://github.com/myrjola/diminish.el ) #+END_SRC +** Clock + +#+BEGIN_SRC emacs-lisp + (setq display-time-24hr-format t) + (setq display-time-format "%H:%M - %d %b %Y") + (setq display-time-default-load-average nil) + + (display-time-mode 1) +#+END_SRC + * Editing settings ** Kill-ring customization From 7bd7a3db9b28a768d43316059a0453722304c808 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 3 Jul 2018 23:23:09 +0200 Subject: [PATCH 043/280] Move diminish to end of config - otherwise mode's not known --- config.org | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/config.org b/config.org index d7fe805..8d70314 100644 --- a/config.org +++ b/config.org @@ -195,24 +195,6 @@ FYI: At one point, used this together with sr-speedbar. They did not play well t ) #+END_SRC -** Diminish - -https://github.com/myrjola/diminish.el - -#+BEGIN_SRC emacs-lisp -(use-package diminish - :ensure t - :config - (diminish 'volatile-highlights-mode) - (diminish 'smartparens-mode) - (diminish 'beacon-mode) - (diminish 'subword-mode) - (diminish 'auto-revert-mode) - (diminish 'helm-mode) - (diminish 'undo-tree-mode) -) -#+END_SRC - ** Clock #+BEGIN_SRC emacs-lisp @@ -987,6 +969,25 @@ Tell org where to look for ditaa '((sequence "TODO" "IN-PROGRESS" "WAITING" "DONE"))) #+END_SRC +* Diminish + +https://github.com/myrjola/diminish.el + +#+BEGIN_SRC emacs-lisp +(use-package diminish + :ensure t + :config + (diminish 'volatile-highlights-mode) + (diminish 'smartparens-mode) + (diminish 'beacon-mode) + (diminish 'subword-mode) + (diminish 'auto-revert-mode) + (diminish 'helm-mode) + (diminish 'undo-tree-mode) + (diminish 'page-break-lines-mode) +) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From 7561b63cca457d1e3bbbb3ec7c7dcbd7ec6ba2dd Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 4 Sep 2018 15:29:40 +0200 Subject: [PATCH 044/280] Add shell-pop --- config.org | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/config.org b/config.org index 8d70314..f78c788 100644 --- a/config.org +++ b/config.org @@ -988,6 +988,21 @@ https://github.com/myrjola/diminish.el ) #+END_SRC +* Shell-pop + +https://github.com/kyagi/shell-pop-el + +#+BEGIN_SRC emacs-lisp +(use-package shell-pop + :ensure t + :bind (("C-c t" . shell-pop)) + :config + (setq shell-pop-shell-type (quote ("eshell" "*eshell*" (lambda nil (eshell shell-pop-term-shell))))) + (setq shell-pop-term-shell "/bin/zsh") + ;; need to do this manually or not picked up by `shell-pop' + (shell-pop--set-shell-type 'shell-pop-shell-type shell-pop-shell-type)) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From a5061a5904e8d565d3747dade0a2483134a682bd Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Thu, 25 Oct 2018 16:15:22 +0200 Subject: [PATCH 045/280] SUNRISE: add keybindings --- config.org | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config.org b/config.org index f78c788..c71b73e 100644 --- a/config.org +++ b/config.org @@ -905,6 +905,9 @@ https://github.com/escherdragon/sunrise-commander (require 'sunrise-x-buttons) (require 'sunrise-x-modeline) +(global-set-key (kbd "C-c s") 'sunrise) +(global-set-key (kbd "C-c c") 'sunrise-cd) + (add-to-list 'auto-mode-alist '("\\.srvm\\'" . sr-virtual-mode)) #+END_SRC From b9d9f3d789c08a22d5dda4b08e110cd7023d06a5 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 11 Nov 2018 14:06:37 +0100 Subject: [PATCH 046/280] Add resize-frame minor-mod --- config.org | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/config.org b/config.org index c71b73e..a56dd98 100644 --- a/config.org +++ b/config.org @@ -24,6 +24,62 @@ This configuration requires the installation of : When first checking out this config, run =irony-install-server= to make and install the irony-server. +* Resize frame + +Minor-mode to easily resize frames (works with EXWM (firefox, ...)). +Courtesy goes to kuanyui (https://gist.github.com/kuanyui/65a408d393871048771c): + +#+BEGIN_SRC emacs-lisp +;;; resize-frame.el --- A minor mode to resize frames easily. -*- lexical-binding: t; -*- + +;; Copyright (C) 2014 kuanyui + +;; Author: kuanyui +;; Keywords: frames, tools, convenience +;; License: WTFPL 1.0 + +;;; Commentary: + +;; Press "ESC `" and use arrow-keys or i/j/k/l to adjust frames. press any key to done. + +;;; Code: + +(defvar resize-frame-map + (let ((map (make-keymap))) + (define-key map (kbd "") 'enlarge-window) + (define-key map (kbd "") 'shrink-window) + (define-key map (kbd "") 'enlarge-window-horizontally) + (define-key map (kbd "") 'shrink-window-horizontally) + (set-char-table-range (nth 1 map) t 'resize-frame-done) + (define-key map (kbd "C-p") 'enlarge-window) + (define-key map (kbd "C-n") 'shrink-window) + (define-key map (kbd "C-f") 'enlarge-window-horizontally) + (define-key map (kbd "C-b") 'shrink-window-horizontally) + map)) + +(define-minor-mode resize-frame + "A simple minor mode to resize-frame. +C-c C-c to apply." + ;; The initial value. + :init-value nil + ;; The indicator for the mode line. + :lighter " ResizeFrame" + ;; The minor mode bindings. + :keymap resize-frame-map + :global t + (if (<= (length (window-list)) 1) + (progn (setq resize-frame nil) + (message "Only root frame exists, abort.")) + (message "Use arrow-keys or i/j/k/l to adjust frames."))) + +(defun resize-frame-done () + (interactive) + (setq resize-frame nil) + (message "Done.")) + +(global-set-key (kbd "C-x C-r") 'resize-frame) +#+END_SRC + * General stuff ** Unsorted From 44b23b046abbee7bd94b97a2a377c31aaea1f266 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 11 Nov 2018 14:07:02 +0100 Subject: [PATCH 047/280] Add which-key --- config.org | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index a56dd98..688c74e 100644 --- a/config.org +++ b/config.org @@ -181,6 +181,19 @@ Disable the generation of backup-files, I don't use them. (setq make-backup-files nil) #+END_SRC +* Which-key + +Display available keybindings in popup: +https://github.com/justbur/emacs-which-key + +#+BEGIN_SRC emacs-lisp +(use-package which-key + :ensure t + :config + (which-key-setup-side-window-bottom) + (which-key-mode)) +#+END_SRC + * Theme #+BEGIN_SRC emacs-lisp @@ -1104,8 +1117,6 @@ https://github.com/kyagi/shell-pop-el stuff i need to look into: - ibuffer - switch-window -- split-and-follow-vertically/horizontally -- which-key - symon - spaceline - async From af3c03850130a924611c5cc229f31201432cb000 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 11 Nov 2018 15:05:56 +0100 Subject: [PATCH 048/280] Switch automatically to *Help* window with describe-key --- config.org | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config.org b/config.org index 688c74e..a6830f4 100644 --- a/config.org +++ b/config.org @@ -181,6 +181,22 @@ Disable the generation of backup-files, I don't use them. (setq make-backup-files nil) #+END_SRC +** Describe key + +Describe key will open a new buffer with the relevant information. +However, it stays in the current window and opens a new window with the help-info, forcing you to switch buffers to close the help window. +This small function just switches the focus to the newly opened window so we can close it more easily. + +#+BEGIN_SRC emacs-lisp +(defun move-to-help-window () + (switch-to-buffer-other-window "*Help*") +) +(add-hook 'help-mode-hook 'move-to-help-window) +#+END_SRC + +#+RESULTS: +| move-to-help-window | + * Which-key Display available keybindings in popup: From 951ab95eece5e8ec5f040eaef750d17e765d5557 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 11 Nov 2018 15:51:49 +0100 Subject: [PATCH 049/280] Switch automatically to *Help* window with describe-key --- config.org | 3 --- 1 file changed, 3 deletions(-) diff --git a/config.org b/config.org index a6830f4..82a2122 100644 --- a/config.org +++ b/config.org @@ -194,9 +194,6 @@ This small function just switches the focus to the newly opened window so we can (add-hook 'help-mode-hook 'move-to-help-window) #+END_SRC -#+RESULTS: -| move-to-help-window | - * Which-key Display available keybindings in popup: From 717ec9d388efb79e3abe30dd7c681c00d47bb3b8 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 11 Nov 2018 21:27:30 +0100 Subject: [PATCH 050/280] Add (helm-)projectile - Remove clashing keymaps with helm-gtags --- config.org | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 82a2122..df16d30 100644 --- a/config.org +++ b/config.org @@ -571,6 +571,21 @@ When we use windows as our bootloader, we have to setup some things first: To be fair, I didn't test this in a while... +* Projectile + +Projectile is a project management tool, full details on: +https://github.com/bbatsov/projectile + +#+BEGIN_SRC emacs-lisp +(use-package projectile + :ensure t + :config + (setq projectile-indexing-method 'alien) + (projectile-global-mode) + (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) +) +#+END_SRC + * Helm ** General config @@ -641,8 +656,6 @@ To be fair, I didn't test this in a while... :bind ( "M-." . helm-gtags-find-tag-from-here) ( "M-," . helm-gtags-pop-stack) - ( "C-c f" . helm-gtags-find-files) - ( "C-c p" . helm-gtags-parse-file) :config (add-hook 'c-mode-hook 'helm-gtags-mode) (add-hook 'c++-mode-hook 'helm-gtags-mode) @@ -654,6 +667,23 @@ To be fair, I didn't test this in a while... ) #+END_SRC +** Helm-projectile + +Helm interface to projectile: +https://github.com/bbatsov/helm-projectile + +#+BEGIN_SRC emacs-lisp +(use-package helm-projectile + :ensure t + :init + (setq helm-projectile-fuzzy-match t) + (setq projectile-completion-system 'helm) + (setq projectile-switch-project-action 'helm-projectile) + :config + (helm-projectile-on) +) +#+END_SRC + * Mutliple cursors https://github.com/magnars/multiple-cursors.el From c65df83a20b4efdd342158eafc717c0d18089ea5 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 12 Nov 2018 15:57:30 +0100 Subject: [PATCH 051/280] Add paradox package menu --- config.org | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/config.org b/config.org index df16d30..633adc9 100644 --- a/config.org +++ b/config.org @@ -1155,6 +1155,23 @@ https://github.com/kyagi/shell-pop-el ;; (provide 'setup-speedbar) #+END_SRC +* Paradox + +Paradox is a more modern package menu. +It can update packages async, ... + +https://github.com/Malabarba/paradox + +#+BEGIN_SRC emacs-lisp +(use-package paradox + :ensure t + :init + (setq paradox-execute-asynchronously t) + :config + (paradox-enable) +) +#+END_SRC + * TODO stuff i need to look into: From 4b57824e9867cf8d81bf10b4d6d3d07babc0ad7a Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 20 Mar 2019 08:15:29 +0100 Subject: [PATCH 052/280] EXWM: Initial experiment - Can be loaded in with command line flag '-start_wm' --- config.org | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/config.org b/config.org index 633adc9..31a94e0 100644 --- a/config.org +++ b/config.org @@ -24,6 +24,32 @@ This configuration requires the installation of : When first checking out this config, run =irony-install-server= to make and install the irony-server. +* EXWM + +#+BEGIN_SRC emacs-lisp +(defun found-custom-arg (switch) + (let ((found-switch (member switch command-line-args))) + (setq command-line-args (delete switch command-line-args)) + found-switch)) + +(use-package exwm + :ensure t +) + +(if (found-custom-arg "-start_wm") + (progn + (message "Loading EXWM...") + (require 'exwm) + (require 'exwm-config) + + ;; systray not working? + (require 'exwm-systemtray) + (exwm-systemtray-enable) + (exwm-config-default) + ) +) +#+END_SRC + * Resize frame Minor-mode to easily resize frames (works with EXWM (firefox, ...)). @@ -248,6 +274,9 @@ Since I like it to give me a list of recent files, we need to enable =recentf-mo ) #+END_SRC +Important to note, =dashboard-setup-startup-hook= will not display the dashboard when command-line arguments are provided. +It assumes the command line arguments are filenames and skips showing the dashboard. + * Zygospore Revert =C-x 1= by pressing =C-x 1= again: From fed3fe020461b0da286d88dcecd046dc954ddf7a Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Fri, 12 Apr 2019 15:32:08 +0200 Subject: [PATCH 053/280] Customize EXWM config --- config.org | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 31a94e0..a7f00db 100644 --- a/config.org +++ b/config.org @@ -41,15 +41,69 @@ When first checking out this config, run =irony-install-server= to make and inst (message "Loading EXWM...") (require 'exwm) (require 'exwm-config) + (require 'exwm-randr) ;; systray not working? (require 'exwm-systemtray) (exwm-systemtray-enable) - (exwm-config-default) + + (setq exwm-workspace-number 2) + + (setq exwm-randr-workspace-output-plist + '(0 "DP1" 1 "DP2")) + (add-hook 'exwm-randr-screen-change-hook + (lambda () + (start-process-shell-command + "xrandr" nil "xrandr --output DP2 --primary --mode 1920x1080 --pos 1920x0 --rotate left --output DP1 --mode 1920x1080 --pos 0x0 --rotate normal --auto"))) + (exwm-randr-enable) + + + + ;; Make class name the buffer name + (add-hook 'exwm-update-class-hook + (lambda () + (exwm-workspace-rename-buffer exwm-class-name))) + ;; Global keybindings. + (setq exwm-input-global-keys + `( + ;; 's-r': Reset (to line-mode). + ([?\s-r] . exwm-reset) + ;; 's-w': Switch workspace. + ([?\s-w] . exwm-workspace-switch) + ;; 's-&': Launch application. + ([s-return] . (lambda (command) + (interactive (list (read-shell-command "$ "))) + (start-process-shell-command command nil command))) + ;; 's-N': Switch to certain workspace. + ,@(mapcar (lambda (i) + `(,(kbd (format "s-%d" i)) . + (lambda () + (interactive) + (exwm-workspace-switch-create ,i)))) + (number-sequence 0 9)))) + ;; Line-editing shortcuts + (setq exwm-input-simulation-keys + '(([?\C-b] . [left]) + ([?\C-f] . [right]) + ([?\C-p] . [up]) + ([?\C-n] . [down]) + ([?\C-a] . [home]) + ([?\C-e] . [end]) + ([?\M-v] . [prior]) + ([?\C-v] . [next]) + ([?\C-d] . [delete]) + ([?\C-s] . [C-f]) + ([?\C-k] . [S-end delete]))) + + (global-set-key (kbd "C-x C-b") 'exwm-workspace-switch-to-buffer) + + ;; Enable EXWM + (exwm-enable) ) ) #+END_SRC + * Resize frame Minor-mode to easily resize frames (works with EXWM (firefox, ...)). @@ -940,7 +994,20 @@ https://github.com/dimitri/switch-window (setq switch-window-shortcut-style 'qwerty) (setq switch-window-qwerty-shortcuts '("a" "s" "d" "f" "j" "k" "l" "i" "o")) -;; (setq switch-window-multiple-frames t) ;; TODO: doesn't work properly.. + (setq switch-window-multiple-frames t) + +;; TODO: test if this fixes exwm stuff + (setq switch-window-input-style 'minibuffer) + +;; (defun akirak/switch-window-frame-list-function () +;; "Frame list function for `switch-window' on EXWM." +;; (cl-remove-if-not #'exwm-workspace--active-p (visible-frame-list))) + +;; (setq switch-window-frame-list-function +;; 'akirak/switch-window-frame-list-function) + + + :bind ("C-x o" . switch-window)) #+END_SRC From 794973b0519f2b739582d9a386f08a5aa99d99be Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 19 Apr 2019 15:36:08 +0200 Subject: [PATCH 054/280] Term-mode: Add hook to toggle between char/line mode --- config.org | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/config.org b/config.org index a7f00db..68fa439 100644 --- a/config.org +++ b/config.org @@ -103,6 +103,28 @@ When first checking out this config, run =irony-install-server= to make and inst ) #+END_SRC +* Term + +** Toggle between char- and line-mode + +Courtesy goes to https://joelmccracken.github.io/entries/switching-between-term-mode-and-line-mode-in-emacs-term/ + +#+BEGIN_SRC emacs-lisp +(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) +#+END_SRC * Resize frame From 4906b9da53d587714d3186dfd0b63e0993f9bd5b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 19 Apr 2019 15:46:34 +0200 Subject: [PATCH 055/280] EXWM: Move config of exwm to use-package config section - + move found-custom-arg to 'Utils' section. --- config.org | 125 ++++++++++++++++++++++++++++------------------------- 1 file changed, 66 insertions(+), 59 deletions(-) diff --git a/config.org b/config.org index 68fa439..9c23751 100644 --- a/config.org +++ b/config.org @@ -24,81 +24,88 @@ This configuration requires the installation of : When first checking out this config, run =irony-install-server= to make and install the irony-server. -* EXWM +* Utils + +** Custom command line arguments + +Return if a custom command line arguments was found. +If it was found, we delete it from the list of command line arguments. #+BEGIN_SRC emacs-lisp (defun found-custom-arg (switch) (let ((found-switch (member switch command-line-args))) (setq command-line-args (delete switch command-line-args)) found-switch)) +#+END_SRC -(use-package exwm - :ensure t -) +* EXWM +Arandr config is still too static, should find a way to simplify this. + +#+BEGIN_SRC emacs-lisp (if (found-custom-arg "-start_wm") (progn (message "Loading EXWM...") - (require 'exwm) - (require 'exwm-config) - (require 'exwm-randr) + (use-package exwm + :ensure t + :config + (require 'exwm-systemtray) + (exwm-systemtray-enable) - ;; systray not working? - (require 'exwm-systemtray) - (exwm-systemtray-enable) + (require 'exwm-randr) + (setq exwm-workspace-number 2) - (setq exwm-workspace-number 2) - - (setq exwm-randr-workspace-output-plist - '(0 "DP1" 1 "DP2")) - (add-hook 'exwm-randr-screen-change-hook - (lambda () - (start-process-shell-command - "xrandr" nil "xrandr --output DP2 --primary --mode 1920x1080 --pos 1920x0 --rotate left --output DP1 --mode 1920x1080 --pos 0x0 --rotate normal --auto"))) - (exwm-randr-enable) - - - - ;; Make class name the buffer name - (add-hook 'exwm-update-class-hook + (setq exwm-randr-workspace-output-plist + '(0 "DP1" 1 "DP2")) + (add-hook 'exwm-randr-screen-change-hook (lambda () - (exwm-workspace-rename-buffer exwm-class-name))) - ;; Global keybindings. - (setq exwm-input-global-keys - `( - ;; 's-r': Reset (to line-mode). - ([?\s-r] . exwm-reset) - ;; 's-w': Switch workspace. - ([?\s-w] . exwm-workspace-switch) - ;; 's-&': Launch application. - ([s-return] . (lambda (command) - (interactive (list (read-shell-command "$ "))) - (start-process-shell-command command nil command))) - ;; 's-N': Switch to certain workspace. - ,@(mapcar (lambda (i) - `(,(kbd (format "s-%d" i)) . - (lambda () - (interactive) - (exwm-workspace-switch-create ,i)))) - (number-sequence 0 9)))) - ;; Line-editing shortcuts - (setq exwm-input-simulation-keys - '(([?\C-b] . [left]) - ([?\C-f] . [right]) - ([?\C-p] . [up]) - ([?\C-n] . [down]) - ([?\C-a] . [home]) - ([?\C-e] . [end]) - ([?\M-v] . [prior]) - ([?\C-v] . [next]) - ([?\C-d] . [delete]) - ([?\C-s] . [C-f]) - ([?\C-k] . [S-end delete]))) + (start-process-shell-command + "xrandr" nil "xrandr --output DP2 --primary --mode 1920x1080 --pos 1920x0 --rotate left --output DP1 --mode 1920x1080 --pos 0x0 --rotate normal --auto"))) + (exwm-randr-enable) - (global-set-key (kbd "C-x C-b") 'exwm-workspace-switch-to-buffer) + (require 'exwm-config) - ;; Enable EXWM - (exwm-enable) + ;; Make class name the buffer name + (add-hook 'exwm-update-class-hook + (lambda () + (exwm-workspace-rename-buffer exwm-class-name))) + ;; Global keybindings. + (setq exwm-input-global-keys + `( + ;; 's-r': Reset (to line-mode). + ([?\s-r] . exwm-reset) + ;; 's-w': Switch workspace. + ([?\s-w] . exwm-workspace-switch) + ;; 's-return': Launch application. + ([s-return] . (lambda (command) + (interactive (list (read-shell-command "$ "))) + (start-process-shell-command command nil command))) + ;; 's-N': Switch to certain workspace. + ,@(mapcar (lambda (i) + `(,(kbd (format "s-%d" i)) . + (lambda () + (interactive) + (exwm-workspace-switch-create ,i)))) + (number-sequence 0 9)))) + ;; Line-editing shortcuts + (setq exwm-input-simulation-keys + '(([?\C-b] . [left]) + ([?\C-f] . [right]) + ([?\C-p] . [up]) + ([?\C-n] . [down]) + ([?\C-a] . [home]) + ([?\C-e] . [end]) + ([?\M-v] . [prior]) + ([?\C-v] . [next]) + ([?\C-d] . [delete]) + ([?\C-s] . [C-f]) + ([?\C-k] . [S-end delete]))) + + (global-set-key (kbd "C-x C-b") 'exwm-workspace-switch-to-buffer) + + ;; Enable EXWM + (exwm-enable) + ) ) ) #+END_SRC From 16979c58e3e5c8988fd34c6134f7b35801e0024f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 19 Apr 2019 15:49:13 +0200 Subject: [PATCH 056/280] EXWM: Move EXWM section to bottom to avoid overwriting EXWM keymaps - F.e. C-x C-b should still work in non-EXWM environments --- config.org | 144 ++++++++++++++++++++++++++--------------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/config.org b/config.org index 9c23751..66ec60f 100644 --- a/config.org +++ b/config.org @@ -38,78 +38,6 @@ If it was found, we delete it from the list of command line arguments. found-switch)) #+END_SRC -* EXWM - -Arandr config is still too static, should find a way to simplify this. - -#+BEGIN_SRC emacs-lisp -(if (found-custom-arg "-start_wm") - (progn - (message "Loading EXWM...") - (use-package exwm - :ensure t - :config - (require 'exwm-systemtray) - (exwm-systemtray-enable) - - (require 'exwm-randr) - (setq exwm-workspace-number 2) - - (setq exwm-randr-workspace-output-plist - '(0 "DP1" 1 "DP2")) - (add-hook 'exwm-randr-screen-change-hook - (lambda () - (start-process-shell-command - "xrandr" nil "xrandr --output DP2 --primary --mode 1920x1080 --pos 1920x0 --rotate left --output DP1 --mode 1920x1080 --pos 0x0 --rotate normal --auto"))) - (exwm-randr-enable) - - (require 'exwm-config) - - ;; Make class name the buffer name - (add-hook 'exwm-update-class-hook - (lambda () - (exwm-workspace-rename-buffer exwm-class-name))) - ;; Global keybindings. - (setq exwm-input-global-keys - `( - ;; 's-r': Reset (to line-mode). - ([?\s-r] . exwm-reset) - ;; 's-w': Switch workspace. - ([?\s-w] . exwm-workspace-switch) - ;; 's-return': Launch application. - ([s-return] . (lambda (command) - (interactive (list (read-shell-command "$ "))) - (start-process-shell-command command nil command))) - ;; 's-N': Switch to certain workspace. - ,@(mapcar (lambda (i) - `(,(kbd (format "s-%d" i)) . - (lambda () - (interactive) - (exwm-workspace-switch-create ,i)))) - (number-sequence 0 9)))) - ;; Line-editing shortcuts - (setq exwm-input-simulation-keys - '(([?\C-b] . [left]) - ([?\C-f] . [right]) - ([?\C-p] . [up]) - ([?\C-n] . [down]) - ([?\C-a] . [home]) - ([?\C-e] . [end]) - ([?\M-v] . [prior]) - ([?\C-v] . [next]) - ([?\C-d] . [delete]) - ([?\C-s] . [C-f]) - ([?\C-k] . [S-end delete]))) - - (global-set-key (kbd "C-x C-b") 'exwm-workspace-switch-to-buffer) - - ;; Enable EXWM - (exwm-enable) - ) - ) -) -#+END_SRC - * Term ** Toggle between char- and line-mode @@ -1297,6 +1225,78 @@ https://github.com/Malabarba/paradox ) #+END_SRC +* EXWM + +Arandr config is still too static, should find a way to simplify this. + +#+BEGIN_SRC emacs-lisp +(if (found-custom-arg "-start_wm") + (progn + (message "Loading EXWM...") + (use-package exwm + :ensure t + :config + (require 'exwm-systemtray) + (exwm-systemtray-enable) + + (require 'exwm-randr) + (setq exwm-workspace-number 2) + + (setq exwm-randr-workspace-output-plist + '(0 "DP1" 1 "DP2")) + (add-hook 'exwm-randr-screen-change-hook + (lambda () + (start-process-shell-command + "xrandr" nil "xrandr --output DP2 --primary --mode 1920x1080 --pos 1920x0 --rotate left --output DP1 --mode 1920x1080 --pos 0x0 --rotate normal --auto"))) + (exwm-randr-enable) + + (require 'exwm-config) + + ;; Make class name the buffer name + (add-hook 'exwm-update-class-hook + (lambda () + (exwm-workspace-rename-buffer exwm-class-name))) + ;; Global keybindings. + (setq exwm-input-global-keys + `( + ;; 's-r': Reset (to line-mode). + ([?\s-r] . exwm-reset) + ;; 's-w': Switch workspace. + ([?\s-w] . exwm-workspace-switch) + ;; 's-return': Launch application. + ([s-return] . (lambda (command) + (interactive (list (read-shell-command "$ "))) + (start-process-shell-command command nil command))) + ;; 's-N': Switch to certain workspace. + ,@(mapcar (lambda (i) + `(,(kbd (format "s-%d" i)) . + (lambda () + (interactive) + (exwm-workspace-switch-create ,i)))) + (number-sequence 0 9)))) + ;; Line-editing shortcuts + (setq exwm-input-simulation-keys + '(([?\C-b] . [left]) + ([?\C-f] . [right]) + ([?\C-p] . [up]) + ([?\C-n] . [down]) + ([?\C-a] . [home]) + ([?\C-e] . [end]) + ([?\M-v] . [prior]) + ([?\C-v] . [next]) + ([?\C-d] . [delete]) + ([?\C-s] . [C-f]) + ([?\C-k] . [S-end delete]))) + + (global-set-key (kbd "C-x C-b") 'exwm-workspace-switch-to-buffer) + + ;; Enable EXWM + (exwm-enable) + ) + ) +) +#+END_SRC + * TODO stuff i need to look into: From 887886bb7da9a60f6c0e815e9e40fdf80fb13ed9 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 19 Apr 2019 16:09:20 +0200 Subject: [PATCH 057/280] EXWM: Use global flags to signal command-line-args --- config.org | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index 66ec60f..f872f52 100644 --- a/config.org +++ b/config.org @@ -38,6 +38,23 @@ If it was found, we delete it from the list of command line arguments. found-switch)) #+END_SRC +** Global variables + +Some package behave strangely if we have custom command line parameters. +F.e. Dashboard assumes you are directly opening a file so it won't load the dashboard. + +So, we remove our custom variables from the command line arguments and set global 'flags'. +These flags will enable/disable parts of the config. + +#+BEGIN_SRC emacs-lisp +(setq EXWM_ENABLE nil) + +(if (found-custom-arg "-start_wm") + (setq EXWM_ENABLE t) +) + +#+END_SRC + * Term ** Toggle between char- and line-mode @@ -1230,7 +1247,7 @@ https://github.com/Malabarba/paradox Arandr config is still too static, should find a way to simplify this. #+BEGIN_SRC emacs-lisp -(if (found-custom-arg "-start_wm") +(if EXWM_ENABLE (progn (message "Loading EXWM...") (use-package exwm From 17bec5fe79a176ab2a15f03d747b34adac69f4c8 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 19 Apr 2019 16:35:20 +0200 Subject: [PATCH 058/280] EXWM: cleanup switch window --- config.org | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/config.org b/config.org index f872f52..aedd9bc 100644 --- a/config.org +++ b/config.org @@ -958,6 +958,8 @@ Credit goes to https://github.com/daedreth/UncleDavesEmacs https://github.com/dimitri/switch-window +Explanation for different config when EXWM is in the README on the github. + #+BEGIN_SRC emacs-lisp (use-package switch-window :ensure t @@ -970,15 +972,12 @@ https://github.com/dimitri/switch-window '("a" "s" "d" "f" "j" "k" "l" "i" "o")) (setq switch-window-multiple-frames t) -;; TODO: test if this fixes exwm stuff - (setq switch-window-input-style 'minibuffer) + (if EXWM_ENABLE + (progn + (setq switch-window-input-style 'minibuffer) + ) + ) -;; (defun akirak/switch-window-frame-list-function () -;; "Frame list function for `switch-window' on EXWM." -;; (cl-remove-if-not #'exwm-workspace--active-p (visible-frame-list))) - -;; (setq switch-window-frame-list-function -;; 'akirak/switch-window-frame-list-function) @@ -988,14 +987,13 @@ https://github.com/dimitri/switch-window When using exwm, have a look at this: https://github.com/dimitri/switch-window/pull/62 - -** Multi-frame rebindings (obsolete with switch-window) +** Multi-frame rebindings (OBSOLETE with switch-window) Sometimes I have multiple emacs-frames open. In the past, I preferred that the normal =C-x o= can deal with this but this is used by switch-window now. #+BEGIN_SRC emacs-lisp -;; Use C-x o to switch to other frame when using multi-monitor +;; ;; Use C-x o to switch to other frame when using multi-monitor ;; (global-set-key (kbd "C-x o") 'next-multiframe-window) #+END_SRC @@ -1318,9 +1316,9 @@ Arandr config is still too static, should find a way to simplify this. stuff i need to look into: - ibuffer -- switch-window +- fix dired-mode (f.e. new-buffer for every folder, ...) +- helm-exwm - symon - spaceline - async -- exwm - helm-hide-minibuffer From 3a034f94cf94c0b489c996ac293a3b63ea787951 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 19 Apr 2019 16:36:01 +0200 Subject: [PATCH 059/280] EXWM: Set workspace number to 1 and comment xrandr stuff --- config.org | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/config.org b/config.org index aedd9bc..cb6f27f 100644 --- a/config.org +++ b/config.org @@ -1255,15 +1255,15 @@ Arandr config is still too static, should find a way to simplify this. (exwm-systemtray-enable) (require 'exwm-randr) - (setq exwm-workspace-number 2) + (setq exwm-workspace-number 1) - (setq exwm-randr-workspace-output-plist - '(0 "DP1" 1 "DP2")) - (add-hook 'exwm-randr-screen-change-hook - (lambda () - (start-process-shell-command - "xrandr" nil "xrandr --output DP2 --primary --mode 1920x1080 --pos 1920x0 --rotate left --output DP1 --mode 1920x1080 --pos 0x0 --rotate normal --auto"))) - (exwm-randr-enable) + ;; (setq exwm-randr-workspace-output-plist + ;; '(0 "DP1" 1 "DP2")) + ;; (add-hook 'exwm-randr-screen-change-hook + ;; (lambda () + ;; (start-process-shell-command + ;; "xrandr" nil "xrandr --output DP2 --primary --mode 1920x1080 --pos 1920x0 --rotate left --output DP1 --mode 1920x1080 --pos 0x0 --rotate normal --auto"))) + ;; (exwm-randr-enable) (require 'exwm-config) From 5f067d2b687aa161e54ba7d7022c2a99e40729a8 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 19 Apr 2019 16:53:02 +0200 Subject: [PATCH 060/280] Hydra: add hydra + hydra-zoom --- config.org | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/config.org b/config.org index cb6f27f..607d860 100644 --- a/config.org +++ b/config.org @@ -282,6 +282,25 @@ Enable highlight-line globally and replace its background colour. (set-face-background hl-line-face "dark slate grey") #+END_SRC +* Hydra + +https://github.com/abo-abo/hydra + +#+BEGIN_SRC emacs-lisp +(use-package hydra + :ensure t +) +#+END_SRC + +** Hydra Zoom + +#+BEGIN_SRC emacs-lisp +(defhydra hydra-zoom (global-map "") + "zoom" + ("g" text-scale-increase "in") + ("l" text-scale-decrease "out")) +#+END_SRC + * Dashboard I use the dashboard as start screen. From 0f6f65b1989c828bf60137f61d60302c224184db Mon Sep 17 00:00:00 2001 From: laurens Date: Sun, 14 Jul 2019 13:18:34 +0200 Subject: [PATCH 061/280] Add org package archives --- init.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/init.el b/init.el index dbbf211..ea210a5 100644 --- a/init.el +++ b/init.el @@ -8,6 +8,8 @@ '("melpa-stable" . "https://stable.melpa.org/packages/") t) (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t) +(add-to-list 'package-archives + '("org" . "https://orgmode.org/elpa/") t) ;; MUST be called after package-archives is updated (package-initialize) From 2cf00a921b39b53295546640408542952dc23810 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 26 Aug 2019 19:03:21 +0200 Subject: [PATCH 062/280] Remove project specific settings from general config --- config.org | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/config.org b/config.org index 607d860..c67c7f8 100644 --- a/config.org +++ b/config.org @@ -449,17 +449,6 @@ Some basic C-coding settings (style, indentation offset, ...). #+BEGIN_SRC emacs-lisp ;; default coding style (setq c-default-style "linux") - -;; sane indentation offset -(setq c-basic-offset 4) -#+END_SRC - -** Tabs vs spaces - -Tabs are evil. - -#+BEGIN_SRC emacs-lisp -(setq-default indent-tabs-mode nil) #+END_SRC * Undo-tree From a79e204d376bcb655c3c1f5aa415524f9a4916e9 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 26 Aug 2019 21:57:27 +0200 Subject: [PATCH 063/280] Remove old config files --- custom/setup-autocompletion.el | 8 -------- custom/setup-coding.el | 11 ----------- custom/setup-org.el | 28 ---------------------------- 3 files changed, 47 deletions(-) delete mode 100644 custom/setup-autocompletion.el delete mode 100644 custom/setup-coding.el delete mode 100644 custom/setup-org.el diff --git a/custom/setup-autocompletion.el b/custom/setup-autocompletion.el deleted file mode 100644 index fbfbaca..0000000 --- a/custom/setup-autocompletion.el +++ /dev/null @@ -1,8 +0,0 @@ -;; Add irony as flycheck hook -(eval-after-load 'flycheck - '(add-hook 'flycheck-mode-hook 'flycheck-irony-setup)) - -;; Set tab to autocomplete or indent depending on context -(global-set-key (kbd "") 'company-indent-or-complete-common) - -(provide 'setup-autocompletion) diff --git a/custom/setup-coding.el b/custom/setup-coding.el deleted file mode 100644 index d915503..0000000 --- a/custom/setup-coding.el +++ /dev/null @@ -1,11 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Python ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(require 'py-autopep8) -(elpy-enable) - -(setq elpy-modules (delq 'elpy-module-flycheck elpy-modules)) -(add-hook 'elpy-mode-hook 'flycheck-mode) -(add-hook 'elpy-mode-hook 'py-autopep8-enable-on-save) - -(provide 'setup-coding) diff --git a/custom/setup-org.el b/custom/setup-org.el deleted file mode 100644 index 1a448e6..0000000 --- a/custom/setup-org.el +++ /dev/null @@ -1,28 +0,0 @@ -(require 'org) - -(define-key global-map "\C-cl" 'org-store-link) -(define-key global-map "\C-ca" 'org-agenda) - -;; when ending TODO (C-C C-t) end with a note + timestamp -(setq org-log-done 'note) -;; Specify root dir to search for agenda files, TODOs, ... -(setq org-agenda-files '("~/org")) -;; Add extra states for keywords -(setq org-todo-keywords - '((sequence "TODO" "IN-PROGRESS" "WAITING" "DONE"))) - -(setq org-export-with-sub-superscripts nil) - -;; Preserve indentation in SRC blocks -(setq org-src-preserve-indentation t) - -;; Specify which languages are allowed to run inside org-mode -(org-babel-do-load-languages - 'org-babel-load-languages '( - (ditaa . t)) - ) - -;; Tell org where to look for ditaa -(setq org-ditaa-jar-path "/usr/share/java/ditaa/ditaa-0_10.jar") - -(provide 'setup-org) From 5d8c9ad8e57a27afc81bcf829dc400c86ee64cfe Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 26 Aug 2019 21:57:58 +0200 Subject: [PATCH 064/280] Only check melpa(https) for archives - Due to a bug in Emacs 26.2, we have to do a small workaround --- config.org | 11 +++++++++++ init.el | 4 +--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/config.org b/config.org index c67c7f8..453b3ac 100644 --- a/config.org +++ b/config.org @@ -23,6 +23,17 @@ This configuration requires the installation of : - =ditaa= (for ascii to image generation in org-mode) When first checking out this config, run =irony-install-server= to make and install the irony-server. +* Workarounds +** Emacs 26.2 + +Had some problems with downloading the spinner package in Emacs. +It is a known bug in Emacs 26.2. +https://www.reddit.com/r/emacs/comments/cdei4p/failed_to_download_gnu_archive_bad_request/ +https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34341 + +#+BEGIN_SRC emacs-lisp +(setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3") +#+END_SRC * Utils diff --git a/init.el b/init.el index ea210a5..d44a18b 100644 --- a/init.el +++ b/init.el @@ -5,9 +5,7 @@ ;; add melpa-stable to package-archives (add-to-list 'package-archives - '("melpa-stable" . "https://stable.melpa.org/packages/") t) -(add-to-list 'package-archives - '("melpa" . "http://melpa.milkbox.net/packages/") t) + '("melpa" . "https://melpa.org/packages/") t) (add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t) From e1abda326ff3720340f75adacb0e37ab759dcf02 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 26 Aug 2019 22:10:43 +0200 Subject: [PATCH 065/280] Diminish which-key and magit from ode line --- config.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.org b/config.org index 453b3ac..80a6eca 100644 --- a/config.org +++ b/config.org @@ -1187,6 +1187,8 @@ https://github.com/myrjola/diminish.el (diminish 'helm-mode) (diminish 'undo-tree-mode) (diminish 'page-break-lines-mode) + (diminish 'which-key-mode) + (diminish 'magit-mode) ) #+END_SRC From fad0df1881e4681750c2b9429d2f215bfc92f897 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 26 Aug 2019 22:11:12 +0200 Subject: [PATCH 066/280] Add Language Server - Use ccls as language server for C/C++ --- config.org | 79 +++++++++++++++--------------------------------------- 1 file changed, 22 insertions(+), 57 deletions(-) diff --git a/config.org b/config.org index 80a6eca..0de08f5 100644 --- a/config.org +++ b/config.org @@ -15,14 +15,11 @@ My personal emacs configuration This configuration requires the installation of : - the GNU =global= package (for gtags) - - =clang= (for ivory) - - =cmake= (for ivory) - - =llvm-libs= (for cmake, somehow not a dependency on Manjaro when installing cmake) + - =ccls=, a language server for C/C++ - Use python-pip to install requirements for elpy: =pip install jedi flake8 importmagic autopep8 yapf= - =ditaa= (for ascii to image generation in org-mode) -When first checking out this config, run =irony-install-server= to make and install the irony-server. * Workarounds ** Emacs 26.2 @@ -846,29 +843,6 @@ https://github.com/joaotavora/yasnippet ) #+END_SRC -** Flycheck - -On-the-fly syntax checking. - -#+BEGIN_SRC emacs-lisp -(use-package flycheck - :ensure t - :config - (add-hook 'prog-mode-hook 'flycheck-mode) -) -#+END_SRC - -** Company mode - -#+BEGIN_SRC emacs-lisp -(use-package company - :ensure t - :config - (setq company-idle-delay 0) - (setq company-minimum-prefix-length 2)) - (add-hook 'prog-mode-hook 'company-mode) -#+END_SRC - ** (Relative) Line numbers #+BEGIN_SRC emacs-lisp @@ -883,10 +857,9 @@ On-the-fly syntax checking. *** Flycheck -Clang static analyzer with flycheck +Clang static analyzer with flycheck (On-the-fly syntax checking) https://github.com/alexmurray/flycheck-clang-analyzer -https://github.com/Sarcasm/flycheck-irony #+BEGIN_SRC emacs-lisp (use-package flycheck-clang-analyzer @@ -895,44 +868,36 @@ https://github.com/Sarcasm/flycheck-irony (with-eval-after-load 'flycheck (require 'flycheck-clang-analyzer) (flycheck-clang-analyzer-setup))) - -(use-package flycheck-irony - :ensure t - :config - (eval-after-load 'flycheck - '(add-hook 'flycheck-mode-hook #'flycheck-irony-setup)) -) #+END_SRC *** Company -https://github.com/ikirill/irony-eldoc - #+BEGIN_SRC emacs-lisp -(use-package company-c-headers - :ensure t) - -(use-package company-irony - :ensure t - :config - (setq company-backends '((company-c-headers -;; company-dabbrev-code ;; not sure what this is - company-irony)))) - -(use-package irony - :ensure t - :config - (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options) - (add-hook 'c++-mode-hook 'irony-mode) - (add-hook 'c-mode-hook 'irony-mode) - (add-hook 'objc-mode-hook 'irony-mode) +(use-package lsp-mode + :commands lsp + :ensure t ) -(use-package irony-eldoc +(use-package lsp-ui + :commands lsp-ui-mode + :ensure t +) + +(use-package company-lsp + :ensure t + :commands company-lsp + :config (push 'company-lsp company-backends)) ;; add company-lsp as a backend + +(use-package ccls :ensure t :config - (add-hook 'irony-mode-hook 'irony-eldoc) + (setq ccls-executable "ccls") + (setq lsp-prefer-flymake nil) ;; Disable flymake for syntax checking, use flycheck instead + (setq-default flycheck-disabled-checkers '(c/c++-clang c/c++-cppcheck c/c++-gcc)) + :hook ((c-mode c++-mode objc-mode) . + (lambda () (require 'ccls) (lsp))) ) + #+END_SRC ** Python mode From ec26fd82371c7560842c261b3981940344e1fcac Mon Sep 17 00:00:00 2001 From: laurens Date: Wed, 4 Sep 2019 19:05:16 +0200 Subject: [PATCH 067/280] Add 'adaptive cursor width' --- config.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config.org b/config.org index 0de08f5..e9ab56e 100644 --- a/config.org +++ b/config.org @@ -256,6 +256,14 @@ This small function just switches the focus to the newly opened window so we can (add-hook 'help-mode-hook 'move-to-help-window) #+END_SRC +** Adaptive cursor width + +Make cursor the width of the character it is under f.e. full diwth of a tab. + +#+BEGIN_SRC emacs-lisp +(setq x-stretch-cursor t) +#+END_SRC + * Which-key Display available keybindings in popup: From dc0284d45f2ed22db6801d962dbb02f5e85a4554 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 9 Sep 2019 09:26:53 +0200 Subject: [PATCH 068/280] Remove hardcoded setting of tab width --- config.org | 7 ------- 1 file changed, 7 deletions(-) diff --git a/config.org b/config.org index e9ab56e..8d3d3af 100644 --- a/config.org +++ b/config.org @@ -413,13 +413,6 @@ Remove scroll-, tool- and menu-bar. I don't use them so free some space. (menu-bar-mode -1) #+END_SRC -** Tab-width - -Set the default tab width. -#+BEGIN_SRC emacs-lisp -(setq-default tab-width 4) -#+END_SRC - ** Automatic indent Automatically indent when pressing =RET=. From 831031aa3a608eb7aba062984e9b4ce1bfb6f253 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 9 Sep 2019 09:27:03 +0200 Subject: [PATCH 069/280] Add project-specific config file option --- init.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/init.el b/init.el index d44a18b..3101650 100644 --- a/init.el +++ b/init.el @@ -17,10 +17,14 @@ (package-refresh-contents) (package-install 'use-package)) -;;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. +;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. (when (file-readable-p "~/.emacs.d/config.org") (org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) +;; If it exists, load some project-specific configurations. +(when (file-readable-p "~/.emacs.d/project.org") +(org-babel-load-file (expand-file-name "~/.emacs.d/project.org"))) + (provide 'init) (custom-set-variables ;; custom-set-variables was added by Custom. From 597e00a584737b988969236849a9ab8b612b41d9 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 9 Sep 2019 09:28:43 +0200 Subject: [PATCH 070/280] smartparens: Add copy/kill of expression keybindings --- config.org | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index 8d3d3af..e3384ee 100644 --- a/config.org +++ b/config.org @@ -510,6 +510,9 @@ https://github.com/Fuco1/smartparens #+BEGIN_SRC emacs-lisp (use-package smartparens :ensure t + :bind + ("C-M-k" . sp-kill-sexp) + ("C-M-w" . sp-copy-sexp) :config (require 'smartparens-config) (show-smartparens-global-mode t) @@ -566,7 +569,7 @@ https://github.com/Fuco1/smartparens ;; (define-key smartparens-mode-map (kbd "C-M-b") 'sp-backward-sexp) ;; ;; ;; TODO: in manjaro this selects keyboard-layout or something -;; ;;(define-key smartparens-mode-map (kbd "C-M-k") 'sp-kill-sexp) +;; (define-key smartparens-mode-map (kbd "C-M-k") 'sp-kill-sexp) ;; (define-key smartparens-mode-map (kbd "C-M-w") 'sp-copy-sexp) ;; ;; (define-key smartparens-mode-map (kbd "C-M-n") 'sp-next-sexp) From 3ceea1058764518aa057f4e5caf261272a6a967e Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 9 Sep 2019 13:11:25 +0200 Subject: [PATCH 071/280] Add with-editor to use current emacs when $EDITOR is used --- config.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config.org b/config.org index e3384ee..bdcb7a8 100644 --- a/config.org +++ b/config.org @@ -86,6 +86,19 @@ Courtesy goes to https://joelmccracken.github.io/entries/switching-between-term- (define-key term-raw-map (kbd "C-c C-k") 'jnm/term-toggle-mode) #+END_SRC +** With editor +This will ensure things/commands/... called in eshell/shell that use $EDITOR, will use the current Emacs. + +#+BEGIN_SRC emacs-lisp +(use-package with-editor + :ensure t + :commands with-editor-export-editor + :init + (progn + (add-hook 'shell-mode-hook 'with-editor-export-editor) + (add-hook 'eshell-mode-hook 'with-editor-export-editor))) +#+END_SRC + * Resize frame Minor-mode to easily resize frames (works with EXWM (firefox, ...)). From ae71fc459cb95d90d9f219861242b1f73c6fdf17 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 9 Sep 2019 13:11:40 +0200 Subject: [PATCH 072/280] Add smart-eshell mode --- config.org | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/config.org b/config.org index bdcb7a8..a7135e4 100644 --- a/config.org +++ b/config.org @@ -99,6 +99,23 @@ This will ensure things/commands/... called in eshell/shell that use $EDITOR, wi (add-hook 'eshell-mode-hook 'with-editor-export-editor))) #+END_SRC +** Eshell + +*** Smart mode + +Plan 9 smart terminal features, for more info: +https://www.masteringemacs.org/article/complete-guide-mastering-eshell + +#+BEGIN_SRC emacs-lisp +(require 'eshell) +(require 'em-smart) +(setq eshell-where-to-jump 'begin) +(setq eshell-review-quick-commands nil) +(setq eshell-smart-space-goes-to-end t) + +(add-hook 'eshell-mode-hook 'eshell-smart-initialize) +#+END_SRC + * Resize frame Minor-mode to easily resize frames (works with EXWM (firefox, ...)). From c22f29ee026651e08076efc0f6d911fe7dad9427 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 9 Sep 2019 14:24:45 +0200 Subject: [PATCH 073/280] Remember password in eshell --- config.org | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/config.org b/config.org index a7135e4..ada1e1c 100644 --- a/config.org +++ b/config.org @@ -116,6 +116,23 @@ https://www.masteringemacs.org/article/complete-guide-mastering-eshell (add-hook 'eshell-mode-hook 'eshell-smart-initialize) #+END_SRC +*** Remember password + +In order to make eshell remember the password for X time after entering it, we have to do a few things. + +We first have to switch to eshell/sudo if we want to be independent of the underlying OS. +We could use an alias (alias sudo eshell/sudo $*), but to keep things inside this config file, switch to lisp functions before we set the password cache: + +#+BEGIN_SRC emacs-lisp +(require 'em-tramp) ; to load eshell’s sudo + +(setq eshell-prefer-lisp-functions t) +(setq eshell-prefer-lisp-variables t) + +(setq password-cache t) ; enable password caching +(setq password-cache-expiry 3600) ; for one hour (time in secs) +#+END_SRC + * Resize frame Minor-mode to easily resize frames (works with EXWM (firefox, ...)). From 6ecbdb89dcf57929b520c6864eca642a3c0b6640 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 8 Oct 2019 20:27:28 +0200 Subject: [PATCH 074/280] Add transparency --- config.org | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/config.org b/config.org index ada1e1c..79e715e 100644 --- a/config.org +++ b/config.org @@ -1349,6 +1349,26 @@ Arandr config is still too static, should find a way to simplify this. ) #+END_SRC +* Transparency + +Taken from EmacsWiki: +https://www.emacswiki.org/emacs/TransparentEmacs + +#+BEGIN_SRC emacs-lisp + (defun toggle-transparency () + (interactive) + (let ((alpha (frame-parameter nil 'alpha))) + (set-frame-parameter + nil 'alpha + (if (eql (cond ((numberp alpha) alpha) + ((numberp (cdr alpha)) (cdr alpha)) + ;; Also handle undocumented ( ) form. + ((numberp (cadr alpha)) (cadr alpha))) + 100) + '(85 . 50) '(100 . 100))))) + (global-set-key (kbd "C-x t") 'toggle-transparency) +#+END_SRC + * TODO stuff i need to look into: From 10d45c2d8c416a0548eee83d6cf17dee2b84f591 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 4 Feb 2020 10:46:10 +0100 Subject: [PATCH 075/280] Projectile: set indexing method to hybrid + ignore LSP server cache --- config.org | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index 79e715e..d4b7a27 100644 --- a/config.org +++ b/config.org @@ -704,7 +704,8 @@ https://github.com/bbatsov/projectile (use-package projectile :ensure t :config - (setq projectile-indexing-method 'alien) + (setq projectile-globally-ignored-directories (cons ".ccls-cache" projectile-globally-ignored-directories)) + (setq projectile-indexing-method 'hybrid) (projectile-global-mode) (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) ) From 21ac5f6b785520ec80510f776e99af66ff9f41ec Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 4 Feb 2020 10:46:51 +0100 Subject: [PATCH 076/280] HELM-GTAGS: set auto update to true --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index d4b7a27..7d50132 100644 --- a/config.org +++ b/config.org @@ -788,7 +788,7 @@ https://github.com/bbatsov/projectile (add-hook 'java-mode-hook 'helm-gtags-mode) (add-hook 'asm-mode-hook 'helm-gtags-mode) - (custom-set-variables '(helm-gtags-auto-update t)) + (setq helm-gtags-auto-update t) ) #+END_SRC From 6b6601b36158d4ab7ab3dc50237bbb3220c3c480 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 4 Feb 2020 10:47:04 +0100 Subject: [PATCH 077/280] LSP-UI: set doc position to top Doc position at point is annoying --- config.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.org b/config.org index 7d50132..0474edc 100644 --- a/config.org +++ b/config.org @@ -933,6 +933,8 @@ https://github.com/alexmurray/flycheck-clang-analyzer (use-package lsp-ui :commands lsp-ui-mode :ensure t + :config + (setq lsp-ui-doc-position (quote top)) ) (use-package company-lsp From 5b39426ab9e3d30cfde8478db67000c902996e0f Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 4 Feb 2020 10:49:05 +0100 Subject: [PATCH 078/280] INIT: Remove custom-set-variables --- init.el | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/init.el b/init.el index 3101650..309b8d2 100644 --- a/init.el +++ b/init.el @@ -26,18 +26,3 @@ (org-babel-load-file (expand-file-name "~/.emacs.d/project.org"))) (provide 'init) -(custom-set-variables - ;; custom-set-variables was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - '(helm-gtags-auto-update t) - '(package-selected-packages - (quote - (elpy linum-relative avy flycheck-irony irony-eldoc company-irony company-c-headers flycheck magit py-autopep8 multiple-cursors helm-gtags helm-swoop zygospore yasnippet volatile-highlights use-package undo-tree smartparens smart-mode-line monokai-theme iedit helm expand-region dashboard comment-dwim-2)))) -(custom-set-faces - ;; custom-set-faces was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - ) From e9b132d7e803d507d3a3c2c77d91c485474b9e4e Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 4 Feb 2020 10:52:59 +0100 Subject: [PATCH 079/280] TODO: Doxymacs --- config.org | 1 + 1 file changed, 1 insertion(+) diff --git a/config.org b/config.org index 0474edc..d7d7a2d 100644 --- a/config.org +++ b/config.org @@ -1382,3 +1382,4 @@ stuff i need to look into: - spaceline - async - helm-hide-minibuffer +- doxymacs From 586aa741df66070ebda5882cdc08dff6fa7bd848 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 20 Apr 2020 14:07:56 +0200 Subject: [PATCH 080/280] Fix lag in LSP mode due to garbage collection Used profiler to determine more than 80% of time was spent in garbage collection... Lowering the value back to the default fixes the lag. --- config.org | 24 ++++++++++++++++++------ init.el | 19 +++++++++++++------ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/config.org b/config.org index d7d7a2d..4c561f7 100644 --- a/config.org +++ b/config.org @@ -228,15 +228,27 @@ so rebind it to something easy to remember. ** Garbage collection (gc) -I used to have the following enabled in my init to increase the gc threshold to speed-up emacs startup: -(stolen from [[http://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/]]) +A lot of articles/sites/posts/... about this: +- [[https://lists.gnu.org/archive/html/help-gnu-emacs/2007-06/msg00243.html ]] +- https://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/ +- ... + +This just contains some hooks to stop/enable the GC at critical moments. +I'm not touching the value except during startup. +If I leave it too high, I got a lot of lag when using LSP mode, so just leave it at the default value. + +I just 'Disable' GC in the minibuffer, I don't want lags/hangups/... in the minibuffer. #+BEGIN_SRC emacs-lisp -(setq gc-cons-threshold 100000000) -#+END_SRC +(defun my-minibuffer-setup-hook () + (setq gc-cons-threshold most-positive-fixnum)) -But according to this: [[https://lists.gnu.org/archive/html/help-gnu-emacs/2007-06/msg00243.html ]], -it is no longer necessary. But I found that I still have to do this to speed up emacs. +(defun my-minibuffer-exit-hook () + (setq gc-cons-threshold 800000)) + +(add-hook 'minibuffer-setup-hook #'my-minibuffer-setup-hook) +(add-hook 'minibuffer-exit-hook #'my-minibuffer-exit-hook) +#+END_SRC ** Yes-or-no questions diff --git a/init.el b/init.el index 309b8d2..d06699f 100644 --- a/init.el +++ b/init.el @@ -17,12 +17,19 @@ (package-refresh-contents) (package-install 'use-package)) -;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. -(when (file-readable-p "~/.emacs.d/config.org") -(org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) +;;; Increase garbage collection threshold during init but leave it to the default value after +;;; There are a LOT of articles/sites/... discussing this: +;;; https://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/ +;;; https://jonnay.github.io/emagicians-starter-kit/Emagician-Base.html +;;; ... +(let ((gc-cons-threshold most-positive-fixnum)) + ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. + (when (file-readable-p "~/.emacs.d/config.org") + (org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) -;; If it exists, load some project-specific configurations. -(when (file-readable-p "~/.emacs.d/project.org") -(org-babel-load-file (expand-file-name "~/.emacs.d/project.org"))) + ;; If it exists, load some project-specific configurations. + (when (file-readable-p "~/.emacs.d/project.org") + (org-babel-load-file (expand-file-name "~/.emacs.d/project.org"))) +) (provide 'init) From f8e9110126e17664b334547dc7b5a9582241ff5a Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 20 Apr 2020 14:10:08 +0200 Subject: [PATCH 081/280] Remove flycheck-clang-analyzer, caused issues with LSP --- config.org | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/config.org b/config.org index 4c561f7..5245c0a 100644 --- a/config.org +++ b/config.org @@ -919,21 +919,6 @@ https://github.com/joaotavora/yasnippet ** C/C++ mode -*** Flycheck - -Clang static analyzer with flycheck (On-the-fly syntax checking) - -https://github.com/alexmurray/flycheck-clang-analyzer - -#+BEGIN_SRC emacs-lisp -(use-package flycheck-clang-analyzer - :ensure t - :config - (with-eval-after-load 'flycheck - (require 'flycheck-clang-analyzer) - (flycheck-clang-analyzer-setup))) -#+END_SRC - *** Company #+BEGIN_SRC emacs-lisp @@ -1388,6 +1373,7 @@ https://www.emacswiki.org/emacs/TransparentEmacs stuff i need to look into: - ibuffer +- flycheck - fix dired-mode (f.e. new-buffer for every folder, ...) - helm-exwm - symon From ea7d82619cbdbe4ce0c703e8f9bb1346d0d53c76 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 20 Apr 2020 14:19:40 +0200 Subject: [PATCH 082/280] Change GTAGS key bindings We use LSP for references etc so 'hide' gtags a bit more --- config.org | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/config.org b/config.org index 5245c0a..2a32285 100644 --- a/config.org +++ b/config.org @@ -787,12 +787,13 @@ https://github.com/bbatsov/projectile ** Helm-gtags +I use LSP for finding references,.. etc so not strictly necessary. +However, sometimes there is a (legacy) project which doesn't fit in nicely with LSP, +so keep gtags around just in case. + #+BEGIN_SRC emacs-lisp (use-package helm-gtags :ensure t - :bind - ( "M-." . helm-gtags-find-tag-from-here) - ( "M-," . helm-gtags-pop-stack) :config (add-hook 'c-mode-hook 'helm-gtags-mode) (add-hook 'c++-mode-hook 'helm-gtags-mode) @@ -801,6 +802,9 @@ https://github.com/bbatsov/projectile (add-hook 'asm-mode-hook 'helm-gtags-mode) (setq helm-gtags-auto-update t) + + (define-key helm-gtags-mode-map (kbd "C-c g .") 'helm-gtags-find-tag-from-here) + (define-key helm-gtags-mode-map (kbd "C-c g ,") 'helm-gtags-pop-stack) ) #+END_SRC From 91ab7f3e31304ce5bd3c656dcce4e01d584de521 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 20 Apr 2020 14:20:18 +0200 Subject: [PATCH 083/280] XREF: Add xref key bindings --- config.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config.org b/config.org index 2a32285..2b965d7 100644 --- a/config.org +++ b/config.org @@ -921,6 +921,14 @@ https://github.com/joaotavora/yasnippet (add-hook 'prog-mode-hook 'linum-relative-mode)) #+END_SRC +** xref + +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "M-.") 'xref-find-definitions) +(global-set-key (kbd "C-M-.") 'xref-find-references) +(global-set-key (kbd "M-,") 'xref-pop-marker-stack) +#+END_SRC + ** C/C++ mode *** Company From 15dca42666aef18a35ea2acba0a1ad6ca8cc1667 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 20 Apr 2020 14:20:39 +0200 Subject: [PATCH 084/280] LSP: Add LSP-UI keybindings by remapping xref functions --- config.org | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index 2b965d7..27bcab9 100644 --- a/config.org +++ b/config.org @@ -944,12 +944,17 @@ https://github.com/joaotavora/yasnippet :ensure t :config (setq lsp-ui-doc-position (quote top)) + (define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions) + (define-key lsp-ui-mode-map [remap xref-find-references] #'lsp-ui-peek-find-references) + (define-key lsp-ui-mode-map [remap complete-symbol] #'company-complete) ) (use-package company-lsp :ensure t :commands company-lsp - :config (push 'company-lsp company-backends)) ;; add company-lsp as a backend + :config + (push 'company-lsp company-backends) ;; add company-lsp as a backend +) (use-package ccls :ensure t From 4724e18f76c64ef5f552c4cc75eceb0d53dcd6f0 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 20 Apr 2020 14:23:52 +0200 Subject: [PATCH 085/280] DEBUG: Add some info on how to debug --- config.org | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/config.org b/config.org index 27bcab9..e8ccbe1 100644 --- a/config.org +++ b/config.org @@ -1386,6 +1386,21 @@ https://www.emacswiki.org/emacs/TransparentEmacs (global-set-key (kbd "C-x t") 'toggle-transparency) #+END_SRC +* Debugging + +Just some ways to debug lags, etc. + +#+BEGIN_SRC +M-x profiler-start + +...do stuff... + +M-x profiler-report +#+END_SRC + +Some usefull links: +- https://emacs.stackexchange.com/questions/5359/how-can-i-troubleshoot-a-very-slow-emacs + * TODO stuff i need to look into: From 673996444fc155b536ab23204d33f3fd76d65325 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 20 May 2020 17:38:24 +0200 Subject: [PATCH 086/280] UNDO: Fix lag when doing C-/ (undo/undo-tree-undo) undo-tree-undo calls undo-list-transfer-to-tree internally which does a lot of garbage-collect calls to make sure the GC won't run (to counter race conditions or something) So, define a hook that sets the GC threshold to maximum, does the undo (which should go fast now since the GC won't run), then restore the old GC threshold --- config.org | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/config.org b/config.org index e8ccbe1..420e49a 100644 --- a/config.org +++ b/config.org @@ -522,12 +522,32 @@ Some basic C-coding settings (style, indentation offset, ...). * Undo-tree Undo with =C-/=. + +The reason for the hook: +I had a lot of issues with undo lagging (taking literally seconds to complete...). +undo-tree-undo calls undo-list-transfer-to-tree internally which does +a lot of garbage-collect calls to make sure the GC won't run (to counter race +conditions where the GC would corrupt the undo-tree or something). + +So, define a hook that sets the GC threshold to maximum, +does the undo (which should go fast now since the GC won't run) +and then restore the old GC threshold. + #+BEGIN_SRC emacs-lisp (use-package undo-tree :ensure t :config (global-undo-tree-mode) + (define-key undo-tree-map (kbd "C-/") 'undo-hook) ) + +(defun undo-hook (&optional arg) + (interactive) + (setq gc-cons-threshold most-positive-fixnum) + (undo-tree-undo arg) + (setq gc-cons-threshold 800000) +) + #+END_SRC * Volatile highlights From 6efd6536e9996a4e150edf4919f0eb5107e4ce39 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Feb 2022 11:26:56 +0100 Subject: [PATCH 087/280] Remove gtags and lsp-mode, replace with rtags Faster than lsp and uses compilation database as well --- config.org | 133 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 89 insertions(+), 44 deletions(-) diff --git a/config.org b/config.org index 420e49a..2178106 100644 --- a/config.org +++ b/config.org @@ -14,8 +14,7 @@ My personal emacs configuration This configuration requires the installation of : - - the GNU =global= package (for gtags) - - =ccls=, a language server for C/C++ + - =rtags= - Use python-pip to install requirements for elpy: =pip install jedi flake8 importmagic autopep8 yapf= - =ditaa= (for ascii to image generation in org-mode) @@ -812,20 +811,20 @@ However, sometimes there is a (legacy) project which doesn't fit in nicely with so keep gtags around just in case. #+BEGIN_SRC emacs-lisp -(use-package helm-gtags - :ensure t - :config - (add-hook 'c-mode-hook 'helm-gtags-mode) - (add-hook 'c++-mode-hook 'helm-gtags-mode) - (add-hook 'python-mode-hook 'helm-gtags-mode) - (add-hook 'java-mode-hook 'helm-gtags-mode) - (add-hook 'asm-mode-hook 'helm-gtags-mode) +;; (use-package helm-gtags +;; :ensure t +;; :config +;; (add-hook 'c-mode-hook 'helm-gtags-mode) +;; (add-hook 'c++-mode-hook 'helm-gtags-mode) +;; (add-hook 'python-mode-hook 'helm-gtags-mode) +;; (add-hook 'java-mode-hook 'helm-gtags-mode) +;; (add-hook 'asm-mode-hook 'helm-gtags-mode) - (setq helm-gtags-auto-update t) +;; (setq helm-gtags-auto-update t) - (define-key helm-gtags-mode-map (kbd "C-c g .") 'helm-gtags-find-tag-from-here) - (define-key helm-gtags-mode-map (kbd "C-c g ,") 'helm-gtags-pop-stack) -) +;; (define-key helm-gtags-mode-map (kbd "C-c g .") 'helm-gtags-find-tag-from-here) +;; (define-key helm-gtags-mode-map (kbd "C-c g ,") 'helm-gtags-pop-stack) +;; ) #+END_SRC ** Helm-projectile @@ -951,41 +950,88 @@ https://github.com/joaotavora/yasnippet ** C/C++ mode -*** Company +*** LSP-mode + +Deprecated in favour of rtags #+BEGIN_SRC emacs-lisp -(use-package lsp-mode - :commands lsp - :ensure t +;; (use-package lsp-mode +;; :commands lsp +;; :ensure t +;; ) + +;; (use-package lsp-ui +;; :commands lsp-ui-mode +;; :ensure t +;; :config +;; (setq lsp-ui-doc-position (quote top)) +;; (define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions) +;; (define-key lsp-ui-mode-map [remap xref-find-references] #'lsp-ui-peek-find-references) +;; (define-key lsp-ui-mode-map [remap complete-symbol] #'company-complete) +;; ) + +;; (use-package company-lsp +;; :ensure t +;; :commands company-lsp +;; :config +;; (push 'company-lsp company-backends) ;; add company-lsp as a backend +;; ) + +;; (use-package ccls +;; :ensure t +;; :config +;; (setq ccls-executable "ccls") +;; (setq lsp-prefer-flymake nil) ;; Disable flymake for syntax checking, use flycheck instead +;; (setq-default flycheck-disabled-checkers '(c/c++-clang c/c++-cppcheck c/c++-gcc)) +;; :hook ((c-mode c++-mode objc-mode) . +;; (lambda () (require 'ccls) (lsp))) +;; ) + +#+END_SRC + +*** Rtags + +https://github.com/Andersbakken/rtags + +#+BEGIN_SRC emacs-lisp +(use-package company + :ensure t + :hook + ((c-mode c++-mode objc-mode) . (lambda () (require 'company) (company-mode))) ) -(use-package lsp-ui - :commands lsp-ui-mode +(use-package flycheck-rtags + :ensure t + :hook + ((c-mode c++-mode objc-mode) . (lambda () (require 'flycheck-rtags) (flycheck-mode))) +) + +(use-package company-rtags + :ensure t + :commands company-rtags + :config + (setq rtags-completions-enabled t) + (push 'company-rtags company-backends) ;; add company-lsp as a backend + (define-key c-mode-base-map (kbd "") (function company-complete)) ;; not working yet + :hook + ((c-mode c++-mode objc-mode) . (lambda () (require 'company))) +) + +(use-package helm-rtags :ensure t :config - (setq lsp-ui-doc-position (quote top)) - (define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions) - (define-key lsp-ui-mode-map [remap xref-find-references] #'lsp-ui-peek-find-references) - (define-key lsp-ui-mode-map [remap complete-symbol] #'company-complete) -) + (setq rtags-use-helm t) + (setq rtags-display-result-backend 'helm) + (rtags-enable-standard-keybindings) + (define-key c-mode-base-map (kbd "C-M-.") (function rtags-find-symbol)) + (define-key c-mode-base-map (kbd "C-M-?") (function rtags-find-references)) + (define-key c-mode-base-map (kbd "M-?") (function rtags-find-references-at-point)) + (define-key c-mode-base-map (kbd "M-i") (function rtags-imenu)) -(use-package company-lsp - :ensure t - :commands company-lsp - :config - (push 'company-lsp company-backends) ;; add company-lsp as a backend + :hook + ((c-mode c++-mode objc-mode) . (lambda () (require 'rtags) (rtags-start-process-unless-running))) + ((c-mode c++-mode objc-mode) . (lambda () (require 'rtags-xref) (rtags-xref-enable))) ) - -(use-package ccls - :ensure t - :config - (setq ccls-executable "ccls") - (setq lsp-prefer-flymake nil) ;; Disable flymake for syntax checking, use flycheck instead - (setq-default flycheck-disabled-checkers '(c/c++-clang c/c++-cppcheck c/c++-gcc)) - :hook ((c-mode c++-mode objc-mode) . - (lambda () (require 'ccls) (lsp))) -) - #+END_SRC ** Python mode @@ -1095,7 +1141,7 @@ https://github.com/abo-abo/avy (defun config-visit () (interactive) (find-file "~/.emacs.d/config.org")) -(global-set-key (kbd "C-c e") 'config-visit) +(global-set-key (kbd "C-c E") 'config-visit) #+END_SRC ** Reload the configuration @@ -1105,7 +1151,7 @@ https://github.com/abo-abo/avy "Reloads ~/.emacs.d/config.org at runtime" (interactive) (org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) -(global-set-key (kbd "C-c r") 'config-reload) +(global-set-key (kbd "C-c R") 'config-reload) #+END_SRC ** Subword @@ -1425,7 +1471,6 @@ Some usefull links: stuff i need to look into: - ibuffer -- flycheck - fix dired-mode (f.e. new-buffer for every folder, ...) - helm-exwm - symon From deb2961644e3e6fde3e7ba92e2663ba39cb9afab Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Feb 2022 14:15:43 +0100 Subject: [PATCH 088/280] Move company to separate section + always enable --- config.org | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/config.org b/config.org index 2178106..0150390 100644 --- a/config.org +++ b/config.org @@ -989,17 +989,20 @@ Deprecated in favour of rtags #+END_SRC +*** Company + +#+BEGIN_SRC emacs-lisp +(use-package company + :ensure t + :init (global-company-mode) +) +#+END_SRC + *** Rtags https://github.com/Andersbakken/rtags #+BEGIN_SRC emacs-lisp -(use-package company - :ensure t - :hook - ((c-mode c++-mode objc-mode) . (lambda () (require 'company) (company-mode))) -) - (use-package flycheck-rtags :ensure t :hook From f44990e0b0d3b951e237c18de8f9de3df537b963 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Feb 2022 14:22:19 +0100 Subject: [PATCH 089/280] RTAGS: split up in separate packages + refactor --- config.org | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/config.org b/config.org index 0150390..d8a66f9 100644 --- a/config.org +++ b/config.org @@ -1003,6 +1003,31 @@ Deprecated in favour of rtags https://github.com/Andersbakken/rtags #+BEGIN_SRC emacs-lisp +(use-package helm-rtags + :ensure t +) + +(use-package rtags-xref + :ensure t + :hook + ((c-mode c++-mode objc-mode) . (lambda () (require 'rtags-xref) (rtags-xref-enable))) +) + +(use-package rtags + :ensure t + :init + (setq rtags-display-result-backend 'helm) + (setq rtags-completions-enabled t) + :config + (rtags-enable-standard-keybindings) + (define-key c-mode-base-map (kbd "C-M-.") (function rtags-find-symbol)) + (define-key c-mode-base-map (kbd "C-M-?") (function rtags-find-references)) + (define-key c-mode-base-map (kbd "M-?") (function rtags-find-references-at-point)) + (define-key c-mode-base-map (kbd "M-i") (function rtags-imenu)) + :hook + ((c-mode c++-mode objc-mode) . (lambda () (require 'rtags) (rtags-start-process-unless-running))) +) + (use-package flycheck-rtags :ensure t :hook @@ -1013,28 +1038,11 @@ https://github.com/Andersbakken/rtags :ensure t :commands company-rtags :config - (setq rtags-completions-enabled t) - (push 'company-rtags company-backends) ;; add company-lsp as a backend + (push 'company-rtags company-backends) (define-key c-mode-base-map (kbd "") (function company-complete)) ;; not working yet :hook ((c-mode c++-mode objc-mode) . (lambda () (require 'company))) ) - -(use-package helm-rtags - :ensure t - :config - (setq rtags-use-helm t) - (setq rtags-display-result-backend 'helm) - (rtags-enable-standard-keybindings) - (define-key c-mode-base-map (kbd "C-M-.") (function rtags-find-symbol)) - (define-key c-mode-base-map (kbd "C-M-?") (function rtags-find-references)) - (define-key c-mode-base-map (kbd "M-?") (function rtags-find-references-at-point)) - (define-key c-mode-base-map (kbd "M-i") (function rtags-imenu)) - - :hook - ((c-mode c++-mode objc-mode) . (lambda () (require 'rtags) (rtags-start-process-unless-running))) - ((c-mode c++-mode objc-mode) . (lambda () (require 'rtags-xref) (rtags-xref-enable))) -) #+END_SRC ** Python mode From b0b2702b38e876b9a765e3dbadadfe9b9f4fd8aa Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Feb 2022 14:27:10 +0100 Subject: [PATCH 090/280] COMPANY: Bind c-tab to complete --- config.org | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index d8a66f9..556d5ae 100644 --- a/config.org +++ b/config.org @@ -995,6 +995,9 @@ Deprecated in favour of rtags (use-package company :ensure t :init (global-company-mode) + :bind ( + ("" . company-complete) + ) ) #+END_SRC @@ -1036,10 +1039,8 @@ https://github.com/Andersbakken/rtags (use-package company-rtags :ensure t - :commands company-rtags :config (push 'company-rtags company-backends) - (define-key c-mode-base-map (kbd "") (function company-complete)) ;; not working yet :hook ((c-mode c++-mode objc-mode) . (lambda () (require 'company))) ) From f0bd80917c6606000d00ab9233abb252d7a3dd45 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Feb 2022 14:29:05 +0100 Subject: [PATCH 091/280] COMPANY: Move section down after configuration by rtags company-backends variable has to be set BEFORE calling global-company-mode --- config.org | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/config.org b/config.org index 556d5ae..8a5208e 100644 --- a/config.org +++ b/config.org @@ -989,18 +989,6 @@ Deprecated in favour of rtags #+END_SRC -*** Company - -#+BEGIN_SRC emacs-lisp -(use-package company - :ensure t - :init (global-company-mode) - :bind ( - ("" . company-complete) - ) -) -#+END_SRC - *** Rtags https://github.com/Andersbakken/rtags @@ -1046,6 +1034,18 @@ https://github.com/Andersbakken/rtags ) #+END_SRC +*** Company + +#+BEGIN_SRC emacs-lisp +(use-package company + :ensure t + :init (global-company-mode) + :bind ( + ("" . company-complete) + ) +) +#+END_SRC + ** Python mode Use =elpy=: From bc3bddf4a8cd343bd7b550abca2b09647f0c447f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Feb 2022 14:42:26 +0100 Subject: [PATCH 092/280] XREF: Add helm-xref --- config.org | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config.org b/config.org index 8a5208e..7eed711 100644 --- a/config.org +++ b/config.org @@ -844,6 +844,17 @@ https://github.com/bbatsov/helm-projectile ) #+END_SRC +** Helm-xref + +Helm interface to xref: +https://github.com/brotzeit/helm-xref + +#+BEGIN_SRC emacs-lisp +(use-package helm-xref + :ensure t +) +#+END_SRC + * Mutliple cursors https://github.com/magnars/multiple-cursors.el From 8e6aaadd92b9fd96af648350752d7cd93bb6611d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Feb 2022 14:42:55 +0100 Subject: [PATCH 093/280] RTAGS: Refactor + enable flycheck according to github wiki --- config.org | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/config.org b/config.org index 7eed711..27f31c3 100644 --- a/config.org +++ b/config.org @@ -1012,7 +1012,7 @@ https://github.com/Andersbakken/rtags (use-package rtags-xref :ensure t :hook - ((c-mode c++-mode objc-mode) . (lambda () (require 'rtags-xref) (rtags-xref-enable))) + ((c-mode c++-mode objc-mode) . (function rtags-xref-enable)) ) (use-package rtags @@ -1020,6 +1020,7 @@ https://github.com/Andersbakken/rtags :init (setq rtags-display-result-backend 'helm) (setq rtags-completions-enabled t) + (setq rtags-autostart-diagnostics t) :config (rtags-enable-standard-keybindings) (define-key c-mode-base-map (kbd "C-M-.") (function rtags-find-symbol)) @@ -1027,21 +1028,27 @@ https://github.com/Andersbakken/rtags (define-key c-mode-base-map (kbd "M-?") (function rtags-find-references-at-point)) (define-key c-mode-base-map (kbd "M-i") (function rtags-imenu)) :hook - ((c-mode c++-mode objc-mode) . (lambda () (require 'rtags) (rtags-start-process-unless-running))) + ((c-mode c++-mode objc-mode) . (function rtags-start-process-unless-running)) ) +;; Stolen from the github wiki of rtags +(defun my-flycheck-rtags-setup () + (flycheck-select-checker 'rtags) + (setq-local flycheck-highlighting-mode nil) ;; RTags creates more accurate overlays. + (setq-local flycheck-check-syntax-automatically nil)) + (use-package flycheck-rtags :ensure t :hook - ((c-mode c++-mode objc-mode) . (lambda () (require 'flycheck-rtags) (flycheck-mode))) + ( + (c-mode c++-mode objc-mode) . (function my-flycheck-rtags-setup) + ) ) (use-package company-rtags :ensure t :config (push 'company-rtags company-backends) - :hook - ((c-mode c++-mode objc-mode) . (lambda () (require 'company))) ) #+END_SRC @@ -1054,6 +1061,10 @@ https://github.com/Andersbakken/rtags :bind ( ("" . company-complete) ) + :hook + ( + (c-mode c++-mode objc-mode) . company-mode + ) ) #+END_SRC From 9d72964ffac8cfad5e2c8c5970266ba8dcc8b043 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 1 Sep 2022 16:22:00 +0200 Subject: [PATCH 094/280] RTAGS: Add hook to c-mode-common --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 27f31c3..643470b 100644 --- a/config.org +++ b/config.org @@ -1012,7 +1012,7 @@ https://github.com/Andersbakken/rtags (use-package rtags-xref :ensure t :hook - ((c-mode c++-mode objc-mode) . (function rtags-xref-enable)) + ((c-mode-common) . (function rtags-xref-enable)) ) (use-package rtags From 65a0a832b41bdfe88082c988cf0b35014e36e299 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 20 Nov 2022 15:46:34 +0100 Subject: [PATCH 095/280] Fix typo --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 643470b..6c6a97f 100644 --- a/config.org +++ b/config.org @@ -316,7 +316,7 @@ This small function just switches the focus to the newly opened window so we can ** Adaptive cursor width -Make cursor the width of the character it is under f.e. full diwth of a tab. +Make cursor the width of the character it is under f.e. full width of a tab. #+BEGIN_SRC emacs-lisp (setq x-stretch-cursor t) From e17468eece3a104667faf0c364c51df9a55edf3e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 18 Apr 2023 22:35:18 +0200 Subject: [PATCH 096/280] fix: test if server is already running If server is already running, we get a warning/error when starting. Test if it is running before we actually start it. It's not really 100% proof: https://lists.gnu.org/archive/html/bug-gnu-emacs/2018-06/msg00720.html But it works for me, so don't ask questions. --- config.org | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index 6c6a97f..8e64567 100644 --- a/config.org +++ b/config.org @@ -1207,8 +1207,12 @@ The audible bell is annoying AF. Emacs as a server. Emacsclient will then use this emacs as its server. +Use server-running-p to test if it is already running. + #+BEGIN_SRC emacs-lisp -(server-start) +(require 'server) +(unless (server-running-p) + (server-start)) #+END_SRC * Beacon From a9cae7927683518c6e7798d6895def5f7af3fd69 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 5 May 2023 09:51:12 +0200 Subject: [PATCH 097/280] RIPGREP: Add ripgrep --- config.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config.org b/config.org index 8e64567..15227f9 100644 --- a/config.org +++ b/config.org @@ -62,6 +62,14 @@ These flags will enable/disable parts of the config. #+END_SRC +** Ripgrep + +#+BEGIN_SRC emacs-lisp +(use-package rg + :ensure t + ) +#+END_SRC + * Term ** Toggle between char- and line-mode From 381db3c3bd15a59b1d26107027a6a80872dae7d6 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 5 May 2023 09:51:21 +0200 Subject: [PATCH 098/280] RIPGREP: Add helm-rg/ripgrep --- config.org | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config.org b/config.org index 15227f9..14221c9 100644 --- a/config.org +++ b/config.org @@ -863,6 +863,17 @@ https://github.com/brotzeit/helm-xref ) #+END_SRC +** Helm-rg + +Helm interface to ripgrep: +https://github.com/cosmicexplorer/helm-rg + +#+BEGIN_SRC emacs-lisp +(use-package helm-rg + :ensure t +) +#+END_SRC + * Mutliple cursors https://github.com/magnars/multiple-cursors.el From 3867667e699d5273f774903d0d35a308e33eeca8 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 5 May 2023 10:28:27 +0200 Subject: [PATCH 099/280] UNDO-TREE: move undo files to separate folder Also include some code for tramp and non-undo-tree backup files for future reference. --- config.org | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/config.org b/config.org index 14221c9..d3a3be9 100644 --- a/config.org +++ b/config.org @@ -546,6 +546,8 @@ and then restore the old GC threshold. :config (global-undo-tree-mode) (define-key undo-tree-map (kbd "C-/") 'undo-hook) + (setq undo-tree-auto-save-history t) ;; Enable auto-save of undo history + (setq undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo"))) ;; Move undo-files to separate dir to avoid corrupting project with undo-files ) (defun undo-hook (&optional arg) @@ -554,7 +556,31 @@ and then restore the old GC threshold. (undo-tree-undo arg) (setq gc-cons-threshold 800000) ) +#+END_SRC +Move the undo-files to a separate folder and also auto-save. +Define the same behaviour for tramp-files to not pollute the remove file system. +Stolen from: https://emacs.stackexchange.com/questions/33/put-all-backups-into-one-backup-folder . +Not using it now due to use of undo-tree but leaving it here as a reference + +#+BEGIN_SRC emacs-lisp +;; (let ((backup-dir "~/.emacs.d/backups") +;; (auto-saves-dir "~/.emacs.d/auto-saves/")) +;; (dolist (dir (list backup-dir auto-saves-dir)) +;; (when (not (file-directory-p dir)) +;; (make-directory dir t))) +;; (setq backup-directory-alist `(("." . ,backup-dir)) +;; undo-tree-history +;; auto-save-file-name-transforms `((".*" ,auto-saves-dir t)) +;; auto-save-list-file-prefix (concat auto-saves-dir ".saves-") +;; tramp-backup-directory-alist `((".*" . ,backup-dir)) +;; tramp-auto-save-directory auto-saves-dir)) + +;; (setq backup-by-copying t ; Don't delink hardlinks +;; delete-old-versions t ; Clean up the backups +;; version-control t ; Use version numbers on backups, +;; kept-new-versions 5 ; keep some new versions +;; kept-old-versions 2) ; and some old ones, too #+END_SRC * Volatile highlights From c5d49f0e0747da5b3191afe715c163e34150fb3b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 5 May 2023 10:29:21 +0200 Subject: [PATCH 100/280] PROJECTILE: Enable caching Speeds up find-file --- config.org | 1 + 1 file changed, 1 insertion(+) diff --git a/config.org b/config.org index d3a3be9..d22b030 100644 --- a/config.org +++ b/config.org @@ -771,6 +771,7 @@ https://github.com/bbatsov/projectile :config (setq projectile-globally-ignored-directories (cons ".ccls-cache" projectile-globally-ignored-directories)) (setq projectile-indexing-method 'hybrid) + (setq projectile-enable-caching t) (projectile-global-mode) (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) ) From 3c94dc873eaaf7760b2e989d668146c503bfa394 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 5 May 2023 10:29:40 +0200 Subject: [PATCH 101/280] PROJECTILE: Use alien method for indexing Also speeds up find-file --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index d22b030..9af51c5 100644 --- a/config.org +++ b/config.org @@ -770,7 +770,7 @@ https://github.com/bbatsov/projectile :ensure t :config (setq projectile-globally-ignored-directories (cons ".ccls-cache" projectile-globally-ignored-directories)) - (setq projectile-indexing-method 'hybrid) + (setq projectile-indexing-method 'alien) (setq projectile-enable-caching t) (projectile-global-mode) (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) From 8014257b468daaf5af4bdecfe8d30ba43946c609 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 6 Jun 2023 09:55:38 +0200 Subject: [PATCH 102/280] feat: add table-of-contents for org-mode --- config.org | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/config.org b/config.org index 9af51c5..3cab2c9 100644 --- a/config.org +++ b/config.org @@ -4,6 +4,104 @@ #+LANGUAGE: en [[./img/dash_logo.png]] +* TABLE OF CONTENTS :toc: +- [[#installation][Installation]] +- [[#workarounds][Workarounds]] + - [[#emacs-262][Emacs 26.2]] +- [[#utils][Utils]] + - [[#custom-command-line-arguments][Custom command line arguments]] + - [[#global-variables][Global variables]] + - [[#ripgrep][Ripgrep]] +- [[#term][Term]] + - [[#toggle-between-char--and-line-mode][Toggle between char- and line-mode]] + - [[#with-editor][With editor]] + - [[#eshell][Eshell]] +- [[#resize-frame][Resize frame]] +- [[#general-stuff][General stuff]] + - [[#unsorted][Unsorted]] + - [[#macros][Macro's]] + - [[#goto-line][Goto-line]] + - [[#rectangle][Rectangle]] + - [[#garbage-collection-gc][Garbage collection (gc)]] + - [[#yes-or-no-questions][Yes-or-no questions]] + - [[#emacs-fullscreen-at-startup][Emacs fullscreen at startup]] + - [[#enable-disabled-commands][Enable disabled commands]] + - [[#buffers][Buffers]] + - [[#helping-vim-users][Helping vim-users]] + - [[#backup-files][Backup files]] + - [[#describe-key][Describe key]] + - [[#adaptive-cursor-width][Adaptive cursor width]] +- [[#which-key][Which-key]] +- [[#theme][Theme]] + - [[#highlight-line][Highlight line]] +- [[#hydra][Hydra]] + - [[#hydra-zoom][Hydra Zoom]] +- [[#dashboard][Dashboard]] +- [[#zygospore][Zygospore]] +- [[#mode-line][Mode-line]] + - [[#clock][Clock]] +- [[#editing-settings][Editing settings]] + - [[#kill-ring-customization][Kill-ring customization]] + - [[#newline-at-end-of-file][Newline at end-of-file]] + - [[#enable-column-numbers][Enable column numbers]] + - [[#look-and-feel-modifications][Look-and-feel modifications]] + - [[#automatic-indent][Automatic indent]] + - [[#delete-trailing-whitespace][Delete trailing whitespace]] + - [[#angry-faces][Angry faces]] + - [[#c-coding-settings][C Coding settings]] +- [[#undo-tree][Undo-tree]] +- [[#volatile-highlights][Volatile highlights]] +- [[#iedit][iedit]] +- [[#smartparens][Smartparens]] +- [[#comment-dwim-2][Comment-dwim-2]] +- [[#expand-region][Expand-region]] +- [[#windooze][Windooze]] +- [[#projectile][Projectile]] +- [[#helm][Helm]] + - [[#general-config][General config]] + - [[#helm-gtags][Helm-gtags]] + - [[#helm-projectile][Helm-projectile]] + - [[#helm-xref][Helm-xref]] + - [[#helm-rg][Helm-rg]] +- [[#mutliple-cursors][Mutliple cursors]] +- [[#gdb][GDB]] +- [[#magit][Magit]] +- [[#programming][Programming]] + - [[#yasnippet][Yasnippet]] + - [[#relative-line-numbers][(Relative) Line numbers]] + - [[#xref][xref]] + - [[#cc-mode][C/C++ mode]] + - [[#python-mode][Python mode]] +- [[#windows][Windows]] + - [[#splitting][Splitting]] + - [[#switching][Switching]] + - [[#multi-frame-rebindings-obsolete-with-switch-window][Multi-frame rebindings (OBSOLETE with switch-window)]] +- [[#avy][Avy]] +- [[#convenience-stuff][Convenience stuff]] + - [[#visiting-the-configuration][Visiting the configuration]] + - [[#reload-the-configuration][Reload the configuration]] + - [[#subword][Subword]] + - [[#bell][Bell]] +- [[#server][Server]] +- [[#beacon][Beacon]] +- [[#sunrise-commander][Sunrise commander]] + - [[#install][Install]] +- [[#org][Org]] + - [[#enabling-table-of-contents][Enabling table of contents]] + - [[#org-bullets][Org bullets]] + - [[#some-basic-config][Some basic config]] + - [[#note-config][Note config]] +- [[#diminish][Diminish]] +- [[#shell-pop][Shell-pop]] +- [[#old-stuff-maybe-usefull-for-lookup-later][Old stuff, maybe usefull for lookup later]] + - [[#diff-mode-stuff][Diff mode stuff]] + - [[#speedbar][Speedbar]] +- [[#paradox][Paradox]] +- [[#exwm][EXWM]] +- [[#transparency][Transparency]] +- [[#debugging][Debugging]] +- [[#todo][TODO]] + * Installation My personal emacs configuration @@ -1295,6 +1393,18 @@ https://github.com/escherdragon/sunrise-commander * Org +** Enabling table of contents + +Stolen from distrotube: +https://gitlab.com/dwt1/configuring-emacs/-/blob/main/01-elpaca-evil-general/config.org#enabling-table-of-contents + +#+BEGIN_SRC emacs-lisp +(use-package toc-org + :ensure t + :commands toc-org-enable + :init (add-hook 'org-mode-hook 'toc-org-enable)) +#+END_SRC + ** Org bullets https://github.com/sabof/org-bullets From 342307ce23c5f9f2c2cfdbd3b25d5a92d4295a76 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 6 Jun 2023 09:56:07 +0200 Subject: [PATCH 103/280] feat: add kill-other-buffers function Convenience function to prune buffers. This will kill all buffers except for scratch and Messages --- config.org | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/config.org b/config.org index 3cab2c9..a0762c6 100644 --- a/config.org +++ b/config.org @@ -10,6 +10,7 @@ - [[#emacs-262][Emacs 26.2]] - [[#utils][Utils]] - [[#custom-command-line-arguments][Custom command line arguments]] + - [[#kill-other-buffers][Kill other buffers]] - [[#global-variables][Global variables]] - [[#ripgrep][Ripgrep]] - [[#term][Term]] @@ -143,6 +144,23 @@ If it was found, we delete it from the list of command line arguments. found-switch)) #+END_SRC +** Kill other buffers + +Function to kill other buffers but the current open one (and some standard buffers which should be kept alive). +Stolen from https://www.emacswiki.org/emacs/KillingBuffers . + +#+BEGIN_SRC emacs-lisp + +(setq not-to-kill-buffer-list '("*scratch*" "*Messages*")) + +(defun kill-other-buffers () + "Kill all other buffers." + (interactive) + (if (member (buffer-name (current-buffer)) not-to-kill-buffer-list) + (bury-buffer) + (kill-buffer (current-buffer)))) +#+END_SRC + ** Global variables Some package behave strangely if we have custom command line parameters. From f90a75154ec1702160887574af33aba96f07f110 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 6 Jun 2023 10:32:53 +0200 Subject: [PATCH 104/280] refactor: clean up init.el to only contain bare-minimum --- init.el | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/init.el b/init.el index d06699f..444b5ab 100644 --- a/init.el +++ b/init.el @@ -1,22 +1,3 @@ -;; IMPORTANT: add (require 'package), else package-archives is not declared (void-variable) -(require 'package) - -(setq package-enable-at-startup nil) - -;; add melpa-stable to package-archives -(add-to-list 'package-archives - '("melpa" . "https://melpa.org/packages/") t) -(add-to-list 'package-archives - '("org" . "https://orgmode.org/elpa/") t) - -;; MUST be called after package-archives is updated -(package-initialize) - -;;; Bootstrapping use-package -(unless (package-installed-p 'use-package) - (package-refresh-contents) - (package-install 'use-package)) - ;;; Increase garbage collection threshold during init but leave it to the default value after ;;; There are a LOT of articles/sites/... discussing this: ;;; https://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/ @@ -24,12 +5,13 @@ ;;; ... (let ((gc-cons-threshold most-positive-fixnum)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. - (when (file-readable-p "~/.emacs.d/config.org") - (org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) + (defvar config-file (expand-file-name "config.org" user-emacs-directory)) + (defvar project-file (expand-file-name "project.org" user-emacs-directory)) + + (when (file-readable-p config-file) + (org-babel-load-file (expand-file-name config-file))) ;; If it exists, load some project-specific configurations. - (when (file-readable-p "~/.emacs.d/project.org") - (org-babel-load-file (expand-file-name "~/.emacs.d/project.org"))) + (when (file-readable-p project-file) + (org-babel-load-file (expand-file-name project-file))) ) - -(provide 'init) From 012444d41b8d03561f56afc0a309ace9721bac8f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 6 Jun 2023 10:33:11 +0200 Subject: [PATCH 105/280] feat: Add early-init.el Disable package.el at startup --- early-init.el | 1 + 1 file changed, 1 insertion(+) create mode 100644 early-init.el diff --git a/early-init.el b/early-init.el new file mode 100644 index 0000000..512068a --- /dev/null +++ b/early-init.el @@ -0,0 +1 @@ +(setq package-enable-at-startup nil) From a41c688aea01a71f25ad03241fc49253425e71f0 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 6 Jun 2023 10:33:30 +0200 Subject: [PATCH 106/280] feat: Add elpaca --- config.org | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/config.org b/config.org index a0762c6..ae1edec 100644 --- a/config.org +++ b/config.org @@ -6,6 +6,8 @@ * TABLE OF CONTENTS :toc: - [[#installation][Installation]] +- [[#base-packages-to-install-first][Base packages to install first]] + - [[#elpaca][Elpaca]] - [[#workarounds][Workarounds]] - [[#emacs-262][Emacs 26.2]] - [[#utils][Utils]] @@ -118,6 +120,111 @@ This configuration requires the installation of : =pip install jedi flake8 importmagic autopep8 yapf= - =ditaa= (for ascii to image generation in org-mode) +* Base packages to install first + +** Elpaca + +Replacement for built-in package manager package.el : + +https://github.com/progfolio/elpaca + +#+BEGIN_SRC emacs-lisp + (defvar elpaca-installer-version 0.4) + + (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 + + :files (:defaults (: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 (call-process "git" nil buffer t "clone" + + (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))) + + (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)) +#+END_SRC + +*** Use-package support + +#+BEGIN_SRC emacs-lisp + ;; Install use-package support +(elpaca elpaca-use-package + ;; Enable :elpaca use-package keyword. + (elpaca-use-package-mode) + ;; Assume :elpaca t unless otherwise specified. + (setq elpaca-use-package-by-default t)) +#+END_SRC + +*** Wait till initialized + +#+BEGIN_SRC emacs-lisp +;;When installing a package which modifies a form used at the top-level +;;(e.g. a package which adds a use-package key word), +;;use `elpaca-wait' to block until that package has been installed/configured. +;;For example: +;;(use-package general :demand t) +;;(elpaca-wait) +(elpaca-wait) +#+END_SRC + * Workarounds ** Emacs 26.2 From 94d12e2fdc7d835824c23a3d665b5d0364fbe8a7 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 6 Jun 2023 10:33:42 +0200 Subject: [PATCH 107/280] fix: add hydra-zoom in use-package hydra Otherwise defhydra is not known --- config.org | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/config.org b/config.org index ae1edec..08fcdbf 100644 --- a/config.org +++ b/config.org @@ -38,7 +38,6 @@ - [[#theme][Theme]] - [[#highlight-line][Highlight line]] - [[#hydra][Hydra]] - - [[#hydra-zoom][Hydra Zoom]] - [[#dashboard][Dashboard]] - [[#zygospore][Zygospore]] - [[#mode-line][Mode-line]] @@ -594,18 +593,17 @@ https://github.com/abo-abo/hydra #+BEGIN_SRC emacs-lisp (use-package hydra :ensure t + :config + ;; Hydra zoom + (defhydra hydra-zoom (global-map "") + "zoom" + ("g" text-scale-increase "in") + ("l" text-scale-decrease "out") + ) + ) #+END_SRC -** Hydra Zoom - -#+BEGIN_SRC emacs-lisp -(defhydra hydra-zoom (global-map "") - "zoom" - ("g" text-scale-increase "in") - ("l" text-scale-decrease "out")) -#+END_SRC - * Dashboard I use the dashboard as start screen. From 0ef6bf0f3cb98a3ca339c3e50d6e3791ac11a700 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 6 Jun 2023 10:35:33 +0200 Subject: [PATCH 108/280] fix: move helm-map keybindings inside use-package helm This to have helm-map be known/defined. --- config.org | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/config.org b/config.org index 08fcdbf..6e6079d 100644 --- a/config.org +++ b/config.org @@ -1028,6 +1028,10 @@ https://github.com/bbatsov/projectile ;; rebind tab to do persistent action ;; we use helm-execute-persistent-action more than helm-select-action (default for ) (define-key helm-map (kbd "") 'helm-execute-persistent-action) + ;; make TAB work in terminal/minibuffer + (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) + ;; remap helm-select-action: lists actions + (define-key helm-map (kbd "C-z") 'helm-select-action) (helm-autoresize-mode 1) ;; Awesome feature together with helm-split-window-inside-p != nil ) @@ -1046,10 +1050,6 @@ https://github.com/bbatsov/projectile ;; ;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) ;; ;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) ;; -;; make TAB work in terminal/minibuffer -(define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) -;; remap helm-select-action: lists actions -(define-key helm-map (kbd "C-z") 'helm-select-action) ;; remap calculator ;; (global-set-key (kbd "C-c C-c") 'helm-calcul-expression) @@ -1057,7 +1057,6 @@ https://github.com/bbatsov/projectile ;; TODO: experiment with mark ring (breadcrumbs something?) ;; TODO: experiment with helm-regexp (build and test regexes) ;; TODO: remember helm-top (helm interface for top program) - #+END_SRC ** Helm-gtags From fe97daac36bb4cdf421bfefd7577a7748a650aa7 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 6 Jun 2023 10:38:35 +0200 Subject: [PATCH 109/280] feat: remove paradox No longer maintained, never really used it and using elpaca now --- config.org | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/config.org b/config.org index 6e6079d..c073146 100644 --- a/config.org +++ b/config.org @@ -98,7 +98,6 @@ - [[#old-stuff-maybe-usefull-for-lookup-later][Old stuff, maybe usefull for lookup later]] - [[#diff-mode-stuff][Diff mode stuff]] - [[#speedbar][Speedbar]] -- [[#paradox][Paradox]] - [[#exwm][EXWM]] - [[#transparency][Transparency]] - [[#debugging][Debugging]] @@ -1659,23 +1658,6 @@ https://github.com/kyagi/shell-pop-el ;; (provide 'setup-speedbar) #+END_SRC -* Paradox - -Paradox is a more modern package menu. -It can update packages async, ... - -https://github.com/Malabarba/paradox - -#+BEGIN_SRC emacs-lisp -(use-package paradox - :ensure t - :init - (setq paradox-execute-asynchronously t) - :config - (paradox-enable) -) -#+END_SRC - * EXWM Arandr config is still too static, should find a way to simplify this. From d7dd8c6af1b6549c5369ca383ec72a5fb137faf4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 6 Jun 2023 10:39:40 +0200 Subject: [PATCH 110/280] feat: remove old workarounds Fixes for this have been merged in 26.3, 27.1 : https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34341 So no need for this anymore --- config.org | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/config.org b/config.org index c073146..7ddcf46 100644 --- a/config.org +++ b/config.org @@ -8,8 +8,6 @@ - [[#installation][Installation]] - [[#base-packages-to-install-first][Base packages to install first]] - [[#elpaca][Elpaca]] -- [[#workarounds][Workarounds]] - - [[#emacs-262][Emacs 26.2]] - [[#utils][Utils]] - [[#custom-command-line-arguments][Custom command line arguments]] - [[#kill-other-buffers][Kill other buffers]] @@ -223,18 +221,6 @@ https://github.com/progfolio/elpaca (elpaca-wait) #+END_SRC -* Workarounds -** Emacs 26.2 - -Had some problems with downloading the spinner package in Emacs. -It is a known bug in Emacs 26.2. -https://www.reddit.com/r/emacs/comments/cdei4p/failed_to_download_gnu_archive_bad_request/ -https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34341 - -#+BEGIN_SRC emacs-lisp -(setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3") -#+END_SRC - * Utils ** Custom command line arguments From f1f6b38b6c80d41dd81a713040772c16798cb799 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 10:47:15 +0200 Subject: [PATCH 111/280] feat: enable :ensure always true for use-package --- config.org | 41 ++++------------------------------------- 1 file changed, 4 insertions(+), 37 deletions(-) diff --git a/config.org b/config.org index 7ddcf46..1d4d065 100644 --- a/config.org +++ b/config.org @@ -207,6 +207,10 @@ https://github.com/progfolio/elpaca (elpaca-use-package-mode) ;; Assume :elpaca t unless otherwise specified. (setq elpaca-use-package-by-default t)) + +;; Always install when use-package is used +(eval-and-compile + (setq use-package-always-ensure t)) #+END_SRC *** Wait till initialized @@ -273,7 +277,6 @@ These flags will enable/disable parts of the config. #+BEGIN_SRC emacs-lisp (use-package rg - :ensure t ) #+END_SRC @@ -305,7 +308,6 @@ This will ensure things/commands/... called in eshell/shell that use $EDITOR, wi #+BEGIN_SRC emacs-lisp (use-package with-editor - :ensure t :commands with-editor-export-editor :init (progn @@ -544,7 +546,6 @@ https://github.com/justbur/emacs-which-key #+BEGIN_SRC emacs-lisp (use-package which-key - :ensure t :config (which-key-setup-side-window-bottom) (which-key-mode)) @@ -554,10 +555,8 @@ https://github.com/justbur/emacs-which-key #+BEGIN_SRC emacs-lisp (use-package monokai-theme - :ensure t :init (load-theme 'monokai t) - ) #+END_SRC @@ -577,7 +576,6 @@ https://github.com/abo-abo/hydra #+BEGIN_SRC emacs-lisp (use-package hydra - :ensure t :config ;; Hydra zoom (defhydra hydra-zoom (global-map "") @@ -596,7 +594,6 @@ Since I like it to give me a list of recent files, we need to enable =recentf-mo #+BEGIN_SRC emacs-lisp (use-package dashboard - :ensure t :init (recentf-mode 1) :config @@ -621,7 +618,6 @@ FYI: At one point, used this together with sr-speedbar. They did not play well t #+BEGIN_SRC emacs-lisp (use-package zygospore - :ensure t :config (global-set-key (kbd "C-x 1") 'zygospore-toggle-delete-other-windows) ) @@ -633,7 +629,6 @@ FYI: At one point, used this together with sr-speedbar. They did not play well t #+BEGIN_SRC emacs-lisp (use-package smart-mode-line - :ensure t :config (setq sml/no-confirm-load-theme t) (setq sml/theme 'respectful) @@ -748,7 +743,6 @@ and then restore the old GC threshold. #+BEGIN_SRC emacs-lisp (use-package undo-tree - :ensure t :config (global-undo-tree-mode) (define-key undo-tree-map (kbd "C-/") 'undo-hook) @@ -797,7 +791,6 @@ https://github.com/k-talo/volatile-highlights.el #+BEGIN_SRC emacs-lisp (use-package volatile-highlights - :ensure t :config (volatile-highlights-mode t) ) @@ -812,7 +805,6 @@ https://github.com/victorhge/iedit #+BEGIN_SRC emacs-lisp (use-package iedit - :ensure t ) #+END_SRC @@ -827,7 +819,6 @@ https://github.com/Fuco1/smartparens #+BEGIN_SRC emacs-lisp (use-package smartparens - :ensure t :bind ("C-M-k" . sp-kill-sexp) ("C-M-w" . sp-copy-sexp) @@ -911,7 +902,6 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package comment-dwim-2 - :ensure t :config (global-set-key (kbd "M-;") 'comment-dwim-2) ) @@ -927,7 +917,6 @@ https://github.com/magnars/expand-region.el #+BEGIN_SRC emacs-lisp (use-package expand-region - :ensure t :init (pending-delete-mode t) :config @@ -973,7 +962,6 @@ https://github.com/bbatsov/projectile #+BEGIN_SRC emacs-lisp (use-package projectile - :ensure t :config (setq projectile-globally-ignored-directories (cons ".ccls-cache" projectile-globally-ignored-directories)) (setq projectile-indexing-method 'alien) @@ -1167,7 +1155,6 @@ TODO: need to document this #+BEGIN_SRC emacs-lisp (use-package magit - :ensure t :bind ("C-c m" . magit-status) ) @@ -1183,7 +1170,6 @@ https://github.com/joaotavora/yasnippet #+BEGIN_SRC emacs-lisp (use-package yasnippet - :ensure t :init (add-to-list 'load-path "~/.emacs.d/plugins/yasnippet") @@ -1196,7 +1182,6 @@ https://github.com/joaotavora/yasnippet #+BEGIN_SRC emacs-lisp (use-package linum-relative - :ensure t :config (setq linum-relative-current-symbol "") (add-hook 'prog-mode-hook 'linum-relative-mode)) @@ -1219,12 +1204,10 @@ Deprecated in favour of rtags #+BEGIN_SRC emacs-lisp ;; (use-package lsp-mode ;; :commands lsp -;; :ensure t ;; ) ;; (use-package lsp-ui ;; :commands lsp-ui-mode -;; :ensure t ;; :config ;; (setq lsp-ui-doc-position (quote top)) ;; (define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions) @@ -1233,14 +1216,12 @@ Deprecated in favour of rtags ;; ) ;; (use-package company-lsp -;; :ensure t ;; :commands company-lsp ;; :config ;; (push 'company-lsp company-backends) ;; add company-lsp as a backend ;; ) ;; (use-package ccls -;; :ensure t ;; :config ;; (setq ccls-executable "ccls") ;; (setq lsp-prefer-flymake nil) ;; Disable flymake for syntax checking, use flycheck instead @@ -1261,13 +1242,11 @@ https://github.com/Andersbakken/rtags ) (use-package rtags-xref - :ensure t :hook ((c-mode-common) . (function rtags-xref-enable)) ) (use-package rtags - :ensure t :init (setq rtags-display-result-backend 'helm) (setq rtags-completions-enabled t) @@ -1289,7 +1268,6 @@ https://github.com/Andersbakken/rtags (setq-local flycheck-check-syntax-automatically nil)) (use-package flycheck-rtags - :ensure t :hook ( (c-mode c++-mode objc-mode) . (function my-flycheck-rtags-setup) @@ -1297,7 +1275,6 @@ https://github.com/Andersbakken/rtags ) (use-package company-rtags - :ensure t :config (push 'company-rtags company-backends) ) @@ -1307,7 +1284,6 @@ https://github.com/Andersbakken/rtags #+BEGIN_SRC emacs-lisp (use-package company - :ensure t :init (global-company-mode) :bind ( ("" . company-complete) @@ -1328,7 +1304,6 @@ It is a full dev env and sometimes feels like a bit too much but overal good exp #+BEGIN_SRC emacs-lisp (use-package elpy - :ensure t :config (elpy-enable) ) @@ -1365,7 +1340,6 @@ Explanation for different config when EXWM is in the README on the github. #+BEGIN_SRC emacs-lisp (use-package switch-window - :ensure t :config (setq switch-window-input-style 'minibuffer) (setq switch-window-increase 6) @@ -1413,7 +1387,6 @@ https://github.com/abo-abo/avy #+BEGIN_SRC emacs-lisp (use-package avy - :ensure t :bind ("M-s" . avy-goto-char)) #+END_SRC @@ -1472,7 +1445,6 @@ https://github.com/Malabarba/beacon #+BEGIN_SRC emacs-lisp (use-package beacon - :ensure t :config (beacon-mode 1) (setq beacon-color "#FFFFCC") ;; yelowish @@ -1507,7 +1479,6 @@ https://gitlab.com/dwt1/configuring-emacs/-/blob/main/01-elpaca-evil-general/con #+BEGIN_SRC emacs-lisp (use-package toc-org - :ensure t :commands toc-org-enable :init (add-hook 'org-mode-hook 'toc-org-enable)) #+END_SRC @@ -1518,7 +1489,6 @@ https://github.com/sabof/org-bullets #+BEGIN_SRC emacs-lisp (use-package org-bullets - :ensure t :config (add-hook 'org-mode-hook (lambda () (org-bullets-mode)))) #+END_SRC @@ -1577,7 +1547,6 @@ https://github.com/myrjola/diminish.el #+BEGIN_SRC emacs-lisp (use-package diminish - :ensure t :config (diminish 'volatile-highlights-mode) (diminish 'smartparens-mode) @@ -1598,7 +1567,6 @@ https://github.com/kyagi/shell-pop-el #+BEGIN_SRC emacs-lisp (use-package shell-pop - :ensure t :bind (("C-c t" . shell-pop)) :config (setq shell-pop-shell-type (quote ("eshell" "*eshell*" (lambda nil (eshell shell-pop-term-shell))))) @@ -1653,7 +1621,6 @@ Arandr config is still too static, should find a way to simplify this. (progn (message "Loading EXWM...") (use-package exwm - :ensure t :config (require 'exwm-systemtray) (exwm-systemtray-enable) From a581a36f5550f2419e05ff1e4e1bc1a53768a55b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 10:50:33 +0200 Subject: [PATCH 112/280] feat: increase garbage collection threshold always --- config.org | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/config.org b/config.org index 1d4d065..096aac0 100644 --- a/config.org +++ b/config.org @@ -6,6 +6,7 @@ * TABLE OF CONTENTS :toc: - [[#installation][Installation]] + - [[#garbage-collection][Garbage collection]] - [[#base-packages-to-install-first][Base packages to install first]] - [[#elpaca][Elpaca]] - [[#utils][Utils]] @@ -23,7 +24,6 @@ - [[#macros][Macro's]] - [[#goto-line][Goto-line]] - [[#rectangle][Rectangle]] - - [[#garbage-collection-gc][Garbage collection (gc)]] - [[#yes-or-no-questions][Yes-or-no questions]] - [[#emacs-fullscreen-at-startup][Emacs fullscreen at startup]] - [[#enable-disabled-commands][Enable disabled commands]] @@ -116,8 +116,15 @@ This configuration requires the installation of : =pip install jedi flake8 importmagic autopep8 yapf= - =ditaa= (for ascii to image generation in org-mode) -* Base packages to install first +** Garbage collection +Increase GC threshold to minimize time wasting: +#+BEGIN_SRC emacs-lisp +(setq gc-cons-threshold 20000000) ;; 20 MB +#+END_SRC + + +* Base packages to install first ** Elpaca Replacement for built-in package manager package.el : @@ -442,30 +449,6 @@ so rebind it to something easy to remember. (global-set-key (kbd "C-x r r") 'query-replace-regexp) #+END_SRC -** Garbage collection (gc) - -A lot of articles/sites/posts/... about this: -- [[https://lists.gnu.org/archive/html/help-gnu-emacs/2007-06/msg00243.html ]] -- https://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/ -- ... - -This just contains some hooks to stop/enable the GC at critical moments. -I'm not touching the value except during startup. -If I leave it too high, I got a lot of lag when using LSP mode, so just leave it at the default value. - -I just 'Disable' GC in the minibuffer, I don't want lags/hangups/... in the minibuffer. - -#+BEGIN_SRC emacs-lisp -(defun my-minibuffer-setup-hook () - (setq gc-cons-threshold most-positive-fixnum)) - -(defun my-minibuffer-exit-hook () - (setq gc-cons-threshold 800000)) - -(add-hook 'minibuffer-setup-hook #'my-minibuffer-setup-hook) -(add-hook 'minibuffer-exit-hook #'my-minibuffer-exit-hook) -#+END_SRC - ** Yes-or-no questions Because I'm lazy, important yes-or-no questions can be answered with y-or-n: From 1758fe8906233fe6931ebad4365f410d54a505d4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 10:47:40 +0200 Subject: [PATCH 113/280] feat: remove helm It's getting too slow for me, might be due to garbace collection but helm is too much for me anyway. --- config.org | 138 +---------------------------------------------------- 1 file changed, 2 insertions(+), 136 deletions(-) diff --git a/config.org b/config.org index 096aac0..ea1f4e6 100644 --- a/config.org +++ b/config.org @@ -57,12 +57,6 @@ - [[#expand-region][Expand-region]] - [[#windooze][Windooze]] - [[#projectile][Projectile]] -- [[#helm][Helm]] - - [[#general-config][General config]] - - [[#helm-gtags][Helm-gtags]] - - [[#helm-projectile][Helm-projectile]] - - [[#helm-xref][Helm-xref]] - - [[#helm-rg][Helm-rg]] - [[#mutliple-cursors][Mutliple cursors]] - [[#gdb][GDB]] - [[#magit][Magit]] @@ -954,136 +948,12 @@ https://github.com/bbatsov/projectile ) #+END_SRC -* Helm - -** General config - -#+BEGIN_SRC emacs-lisp -(use-package helm - :ensure t - :bind - ("M-x" . helm-M-x) - ("M-y" . helm-show-kill-ring) - ("C-x b" . helm-mini) - ("C-x C-b" . helm-mini) - ("C-x C-f" . helm-find-files) - :init - (helm-mode 1) - :config - (setq helm-M-x-fuzzy-match t - helm-buffers-fuzzy-matching t - helm-recentf-fuzzy-match t - helm-semantic-fuzzy-match t - helm-imenu-fuzzy-match t - helm-split-window-inside-p t ;; open helm buffer inside current window - helm-scroll-amount 8 ;; scroll 8 lines other window using M-/M- -;; helm-move-to-line-cycle-in-source nil ;; move to end or beginning of source when reaching to por bottom of source -;; helm-ff-search-library-in-sexp t ;; search for library in 'require' and 'declare-function' sexp -;; helm-echo-input-in-header-line t - ) - ;; rebind tab to do persistent action - ;; we use helm-execute-persistent-action more than helm-select-action (default for ) - (define-key helm-map (kbd "") 'helm-execute-persistent-action) - ;; make TAB work in terminal/minibuffer - (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) - ;; remap helm-select-action: lists actions - (define-key helm-map (kbd "C-z") 'helm-select-action) - (helm-autoresize-mode 1) ;; Awesome feature together with helm-split-window-inside-p != nil -) - -(use-package helm-swoop - :ensure t - :bind - ("C-s" . helm-swoop) - :config - ;; "C-s" + "C-s" results in mult-swoop - (define-key helm-swoop-map (kbd "C-s") 'helm-multi-swoop-all-from-helm-swoop) - ;; split window inside the current window when multiple windows open - (setq helm-swoop-split-with-multiple-windows t) -) - -;; (require 'helm-config) -;; ;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) -;; ;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) -;; - -;; remap calculator -;; (global-set-key (kbd "C-c C-c") 'helm-calcul-expression) - -;; TODO: experiment with mark ring (breadcrumbs something?) -;; TODO: experiment with helm-regexp (build and test regexes) -;; TODO: remember helm-top (helm interface for top program) -#+END_SRC - -** Helm-gtags - -I use LSP for finding references,.. etc so not strictly necessary. -However, sometimes there is a (legacy) project which doesn't fit in nicely with LSP, -so keep gtags around just in case. - -#+BEGIN_SRC emacs-lisp -;; (use-package helm-gtags -;; :ensure t -;; :config -;; (add-hook 'c-mode-hook 'helm-gtags-mode) -;; (add-hook 'c++-mode-hook 'helm-gtags-mode) -;; (add-hook 'python-mode-hook 'helm-gtags-mode) -;; (add-hook 'java-mode-hook 'helm-gtags-mode) -;; (add-hook 'asm-mode-hook 'helm-gtags-mode) - -;; (setq helm-gtags-auto-update t) - -;; (define-key helm-gtags-mode-map (kbd "C-c g .") 'helm-gtags-find-tag-from-here) -;; (define-key helm-gtags-mode-map (kbd "C-c g ,") 'helm-gtags-pop-stack) -;; ) -#+END_SRC - -** Helm-projectile - -Helm interface to projectile: -https://github.com/bbatsov/helm-projectile - -#+BEGIN_SRC emacs-lisp -(use-package helm-projectile - :ensure t - :init - (setq helm-projectile-fuzzy-match t) - (setq projectile-completion-system 'helm) - (setq projectile-switch-project-action 'helm-projectile) - :config - (helm-projectile-on) -) -#+END_SRC - -** Helm-xref - -Helm interface to xref: -https://github.com/brotzeit/helm-xref - -#+BEGIN_SRC emacs-lisp -(use-package helm-xref - :ensure t -) -#+END_SRC - -** Helm-rg - -Helm interface to ripgrep: -https://github.com/cosmicexplorer/helm-rg - -#+BEGIN_SRC emacs-lisp -(use-package helm-rg - :ensure t -) -#+END_SRC - * Mutliple cursors https://github.com/magnars/multiple-cursors.el #+BEGIN_SRC emacs-lisp (use-package multiple-cursors - :ensure t :bind ("C-x r a" . mc/edit-lines) ("C-x r e" . mc/edit-ends-of-lines) @@ -1220,10 +1090,6 @@ Deprecated in favour of rtags https://github.com/Andersbakken/rtags #+BEGIN_SRC emacs-lisp -(use-package helm-rtags - :ensure t -) - (use-package rtags-xref :hook ((c-mode-common) . (function rtags-xref-enable)) @@ -1231,7 +1097,8 @@ https://github.com/Andersbakken/rtags (use-package rtags :init - (setq rtags-display-result-backend 'helm) + ;; TODO + ;; (setq rtags-display-result-backend 'helm) (setq rtags-completions-enabled t) (setq rtags-autostart-diagnostics t) :config @@ -1536,7 +1403,6 @@ https://github.com/myrjola/diminish.el (diminish 'beacon-mode) (diminish 'subword-mode) (diminish 'auto-revert-mode) - (diminish 'helm-mode) (diminish 'undo-tree-mode) (diminish 'page-break-lines-mode) (diminish 'which-key-mode) From 808a7215ed2af273b84e2020a269a4a3a6691513 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 10:52:18 +0200 Subject: [PATCH 114/280] feat: Add ivy/counsel More lightweight than helm and suits my needs for now. --- config.org | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index ea1f4e6..3254878 100644 --- a/config.org +++ b/config.org @@ -9,6 +9,9 @@ - [[#garbage-collection][Garbage collection]] - [[#base-packages-to-install-first][Base packages to install first]] - [[#elpaca][Elpaca]] +- [[#ivy][Ivy]] + - [[#flx][flx]] + - [[#ivy-1][Ivy]] - [[#utils][Utils]] - [[#custom-command-line-arguments][Custom command line arguments]] - [[#kill-other-buffers][Kill other buffers]] @@ -117,7 +120,6 @@ Increase GC threshold to minimize time wasting: (setq gc-cons-threshold 20000000) ;; 20 MB #+END_SRC - * Base packages to install first ** Elpaca @@ -226,6 +228,63 @@ https://github.com/progfolio/elpaca (elpaca-wait) #+END_SRC +* Ivy +** flx + +Fuzzy matching: +https://github.com/lewang/flx + +#+begin_src emacs-lisp +;; (use-package flx) +#+end_src + +** Ivy + +Generic completion frontend: +https://github.com/abo-abo/swiper + +#+begin_src emacs-lisp +(use-package ivy + :defer 0.1 ;; TODO: fixes ivy not loading at startup, not sure why + :diminish + :bind (("C-x B" . ivy-switch-bufer-other-window) + :map ivy-minibuffer-map + ("TAB" . ivy-alt-done) + :map ivy-switch-buffer-map + ("C-d" . ivy-switch-buffer-kill) + :map ivy-occur-grep-mode-map + ("C-x e" . ivy-wgrep-change-to-wgrep-mode) + ("C-x C-s" . wgrep-finish-edit) + ("C-q" . wgrep-abort-changes) + ) + ;; FYI: to enable fuzzy search everywhere, can be limited to certain commands + ;; See: https://oremacs.com/swiper/#completion-styles + ;; :init + ;; (setq ivy-re-builders-alist + ;; '((t . ivy--regex-fuzzy))) + :config + (setq ivy-use-virtual-buffers t) ;; Add recent files + bookmarks to ivy-switch-buffer + (setq ivy-count-format "(%d/%d) ") ;; Style to use for displaying current candidate count + (ivy-mode) +) + +(use-package counsel + :after ivy + :bind ( + ("C-x f" . counsel-fzf) + ) + :config + (counsel-mode) +) + +(use-package swiper + :after ivy + :bind ( + ("C-s" . swiper) + ) +) +#+end_src + * Utils ** Custom command line arguments From 4aed3d38dd8e939ba78a08c87edea799176aea6f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 11:33:55 +0200 Subject: [PATCH 115/280] feat: use :diminish in use-package Only use it for the built-in modes like subword/auto-revert --- config.org | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/config.org b/config.org index 3254878..6a3bdc4 100644 --- a/config.org +++ b/config.org @@ -9,6 +9,7 @@ - [[#garbage-collection][Garbage collection]] - [[#base-packages-to-install-first][Base packages to install first]] - [[#elpaca][Elpaca]] + - [[#diminish][Diminish]] - [[#ivy][Ivy]] - [[#flx][flx]] - [[#ivy-1][Ivy]] @@ -88,7 +89,6 @@ - [[#org-bullets][Org bullets]] - [[#some-basic-config][Some basic config]] - [[#note-config][Note config]] -- [[#diminish][Diminish]] - [[#shell-pop][Shell-pop]] - [[#old-stuff-maybe-usefull-for-lookup-later][Old stuff, maybe usefull for lookup later]] - [[#diff-mode-stuff][Diff mode stuff]] @@ -228,6 +228,18 @@ https://github.com/progfolio/elpaca (elpaca-wait) #+END_SRC +** Diminish + +https://github.com/emacsmirror/diminish + +#+begin_src emacs-lisp +(use-package diminish + :config + (diminish 'subword-mode) + (diminish 'auto-revert-mode) + ) +#+end_src + * Ivy ** flx @@ -582,6 +594,7 @@ https://github.com/justbur/emacs-which-key #+BEGIN_SRC emacs-lisp (use-package which-key + :diminish :config (which-key-setup-side-window-bottom) (which-key-mode)) @@ -779,6 +792,7 @@ and then restore the old GC threshold. #+BEGIN_SRC emacs-lisp (use-package undo-tree + :diminish :config (global-undo-tree-mode) (define-key undo-tree-map (kbd "C-/") 'undo-hook) @@ -827,6 +841,7 @@ https://github.com/k-talo/volatile-highlights.el #+BEGIN_SRC emacs-lisp (use-package volatile-highlights + :diminish :config (volatile-highlights-mode t) ) @@ -998,6 +1013,7 @@ https://github.com/bbatsov/projectile #+BEGIN_SRC emacs-lisp (use-package projectile + :diminish :config (setq projectile-globally-ignored-directories (cons ".ccls-cache" projectile-globally-ignored-directories)) (setq projectile-indexing-method 'alien) @@ -1354,6 +1370,7 @@ https://github.com/Malabarba/beacon #+BEGIN_SRC emacs-lisp (use-package beacon + :diminish :config (beacon-mode 1) (setq beacon-color "#FFFFCC") ;; yelowish @@ -1450,25 +1467,6 @@ Tell org where to look for ditaa '((sequence "TODO" "IN-PROGRESS" "WAITING" "DONE"))) #+END_SRC -* Diminish - -https://github.com/myrjola/diminish.el - -#+BEGIN_SRC emacs-lisp -(use-package diminish - :config - (diminish 'volatile-highlights-mode) - (diminish 'smartparens-mode) - (diminish 'beacon-mode) - (diminish 'subword-mode) - (diminish 'auto-revert-mode) - (diminish 'undo-tree-mode) - (diminish 'page-break-lines-mode) - (diminish 'which-key-mode) - (diminish 'magit-mode) -) -#+END_SRC - * Shell-pop https://github.com/kyagi/shell-pop-el From 64c11c968cd7209f28425afe1258a6007e167961 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 12:02:02 +0200 Subject: [PATCH 116/280] fix: dashboard not loading --- config.org | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config.org b/config.org index 6a3bdc4..8136b50 100644 --- a/config.org +++ b/config.org @@ -647,11 +647,14 @@ Since I like it to give me a list of recent files, we need to enable =recentf-mo (recentf-mode 1) :config (dashboard-setup-startup-hook) + (setq dashboard-center-content t) (setq dashboard-startup-banner "~/.emacs.d/img/dash_logo.png") (setq dashboard-items '((recents . 10) (bookmarks . 5) + (projects . 5) )) (setq dashboard-banner-logo-title "") + (setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*"))) ) #+END_SRC From b4fbaac91fa31f65e84ccfb785c7203a7c04471c Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 12:33:09 +0200 Subject: [PATCH 117/280] fix: fix typo in ivy config --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 8136b50..1d70f7e 100644 --- a/config.org +++ b/config.org @@ -259,7 +259,7 @@ https://github.com/abo-abo/swiper (use-package ivy :defer 0.1 ;; TODO: fixes ivy not loading at startup, not sure why :diminish - :bind (("C-x B" . ivy-switch-bufer-other-window) + :bind (("C-x B" . ivy-switch-buffer-other-window) :map ivy-minibuffer-map ("TAB" . ivy-alt-done) :map ivy-switch-buffer-map From a4040e4eefbe940d56acd10c785896ea63ddcc00 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 12:40:25 +0200 Subject: [PATCH 118/280] fix: remove undo GC hook To avoid interfering with GC --- config.org | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/config.org b/config.org index 1d70f7e..0f515a0 100644 --- a/config.org +++ b/config.org @@ -783,32 +783,14 @@ Some basic C-coding settings (style, indentation offset, ...). Undo with =C-/=. -The reason for the hook: -I had a lot of issues with undo lagging (taking literally seconds to complete...). -undo-tree-undo calls undo-list-transfer-to-tree internally which does -a lot of garbage-collect calls to make sure the GC won't run (to counter race -conditions where the GC would corrupt the undo-tree or something). - -So, define a hook that sets the GC threshold to maximum, -does the undo (which should go fast now since the GC won't run) -and then restore the old GC threshold. - #+BEGIN_SRC emacs-lisp (use-package undo-tree :diminish :config (global-undo-tree-mode) - (define-key undo-tree-map (kbd "C-/") 'undo-hook) (setq undo-tree-auto-save-history t) ;; Enable auto-save of undo history (setq undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo"))) ;; Move undo-files to separate dir to avoid corrupting project with undo-files ) - -(defun undo-hook (&optional arg) - (interactive) - (setq gc-cons-threshold most-positive-fixnum) - (undo-tree-undo arg) - (setq gc-cons-threshold 800000) -) #+END_SRC Move the undo-files to a separate folder and also auto-save. From 70bac710394f2cf56bf7e2e0954c8c02fd0fba1b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 13:31:13 +0200 Subject: [PATCH 119/280] feat: enable menu in rg --- config.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.org b/config.org index 0f515a0..5567de1 100644 --- a/config.org +++ b/config.org @@ -349,6 +349,8 @@ These flags will enable/disable parts of the config. #+BEGIN_SRC emacs-lisp (use-package rg + :config + (rg-enable-menu) ;; Enable transient menu ) #+END_SRC From 667b311e3236845244a3a4cc20e7fe72528fbc27 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 13:31:44 +0200 Subject: [PATCH 120/280] feat: refactor projectile setup Set ivy as completion system refactor keymap binding don't enable projectile-global-mode, regular mode is enough --- config.org | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 5567de1..34569ef 100644 --- a/config.org +++ b/config.org @@ -1001,12 +1001,14 @@ https://github.com/bbatsov/projectile #+BEGIN_SRC emacs-lisp (use-package projectile :diminish + :custom ((projectile-completion-system 'ivy)) + :bind-keymap + ("C-c p" . projectile-command-map) :config (setq projectile-globally-ignored-directories (cons ".ccls-cache" projectile-globally-ignored-directories)) (setq projectile-indexing-method 'alien) (setq projectile-enable-caching t) - (projectile-global-mode) - (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) + (projectile-mode) ) #+END_SRC From 68d9e58c5138a8841755ef5146a1cf9b821cebc1 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 16:09:12 +0200 Subject: [PATCH 121/280] feat: enable ivy-hydra + move hydra --- config.org | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/config.org b/config.org index 34569ef..1d20b6d 100644 --- a/config.org +++ b/config.org @@ -10,6 +10,7 @@ - [[#base-packages-to-install-first][Base packages to install first]] - [[#elpaca][Elpaca]] - [[#diminish][Diminish]] + - [[#hydra][Hydra]] - [[#ivy][Ivy]] - [[#flx][flx]] - [[#ivy-1][Ivy]] @@ -39,7 +40,6 @@ - [[#which-key][Which-key]] - [[#theme][Theme]] - [[#highlight-line][Highlight line]] -- [[#hydra][Hydra]] - [[#dashboard][Dashboard]] - [[#zygospore][Zygospore]] - [[#mode-line][Mode-line]] @@ -240,6 +240,22 @@ https://github.com/emacsmirror/diminish ) #+end_src +** Hydra + +https://github.com/abo-abo/hydra + +#+begin_src emacs-lisp +(use-package hydra + :config + ;; Hydra zoom + (defhydra hydra-zoom (global-map "") + "zoom" + ("g" text-scale-increase "in") + ("l" text-scale-decrease "out") + ) +) +#+end_src + * Ivy ** flx @@ -295,8 +311,14 @@ https://github.com/abo-abo/swiper ("C-s" . swiper) ) ) + +(use-package ivy-hydra + :after (ivy hydra) + ) #+end_src +#+RESULTS: + * Utils ** Custom command line arguments @@ -621,23 +643,6 @@ Enable highlight-line globally and replace its background colour. (set-face-background hl-line-face "dark slate grey") #+END_SRC -* Hydra - -https://github.com/abo-abo/hydra - -#+BEGIN_SRC emacs-lisp -(use-package hydra - :config - ;; Hydra zoom - (defhydra hydra-zoom (global-map "") - "zoom" - ("g" text-scale-increase "in") - ("l" text-scale-decrease "out") - ) - -) -#+END_SRC - * Dashboard I use the dashboard as start screen. From 1b386ae27fdf03a1d31b29a1d9c50aeafca784dd Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 16:09:22 +0200 Subject: [PATCH 122/280] feat: diminish counsel --- config.org | 1 + 1 file changed, 1 insertion(+) diff --git a/config.org b/config.org index 1d20b6d..9d07ba9 100644 --- a/config.org +++ b/config.org @@ -298,6 +298,7 @@ https://github.com/abo-abo/swiper (use-package counsel :after ivy + :diminish :bind ( ("C-x f" . counsel-fzf) ) From d37d733f5b07a490b5e3b677260ec15862a7ef82 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 7 Jun 2023 16:09:47 +0200 Subject: [PATCH 123/280] feat: use fuzzy search in swiper, ignore order search in all others Can switch this at runtime using hydra (C-o M). --- config.org | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/config.org b/config.org index 9d07ba9..859ad9c 100644 --- a/config.org +++ b/config.org @@ -263,7 +263,7 @@ Fuzzy matching: https://github.com/lewang/flx #+begin_src emacs-lisp -;; (use-package flx) +(use-package flx) #+end_src ** Ivy @@ -285,12 +285,13 @@ https://github.com/abo-abo/swiper ("C-x C-s" . wgrep-finish-edit) ("C-q" . wgrep-abort-changes) ) - ;; FYI: to enable fuzzy search everywhere, can be limited to certain commands - ;; See: https://oremacs.com/swiper/#completion-styles - ;; :init - ;; (setq ivy-re-builders-alist - ;; '((t . ivy--regex-fuzzy))) :config + (setq ivy-re-builders-alist + '( + (swiper . ivy--regex-fuzzy) + (t . ivy--regex-ignore-order) + ) + ) (setq ivy-use-virtual-buffers t) ;; Add recent files + bookmarks to ivy-switch-buffer (setq ivy-count-format "(%d/%d) ") ;; Style to use for displaying current candidate count (ivy-mode) From ff49b4958c4d1e339ab1c0da2b73d09e7e49838e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 8 Jun 2023 12:57:40 +0200 Subject: [PATCH 124/280] feat: remove sunrise commandor Learn dired-mode instead --- config.org | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/config.org b/config.org index 859ad9c..573c6a7 100644 --- a/config.org +++ b/config.org @@ -82,8 +82,6 @@ - [[#bell][Bell]] - [[#server][Server]] - [[#beacon][Beacon]] -- [[#sunrise-commander][Sunrise commander]] - - [[#install][Install]] - [[#org][Org]] - [[#enabling-table-of-contents][Enabling table of contents]] - [[#org-bullets][Org bullets]] @@ -1373,25 +1371,6 @@ https://github.com/Malabarba/beacon ) #+END_SRC -* Sunrise commander - -https://github.com/escherdragon/sunrise-commander - -** Install - -#+BEGIN_SRC emacs-lisp -(add-to-list 'load-path "~/.emacs.d/extra/sunrise-commander") - -(require 'sunrise-commander) -(require 'sunrise-x-buttons) -(require 'sunrise-x-modeline) - -(global-set-key (kbd "C-c s") 'sunrise) -(global-set-key (kbd "C-c c") 'sunrise-cd) - -(add-to-list 'auto-mode-alist '("\\.srvm\\'" . sr-virtual-mode)) -#+END_SRC - * Org ** Enabling table of contents From c47edf6f187f701ba2860d84ed2bfadcf65c6d4c Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 8 Jun 2023 13:56:38 +0200 Subject: [PATCH 125/280] feat: Add initial dired config Single buffer + hiding dotfiles --- config.org | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/config.org b/config.org index 573c6a7..b1b1639 100644 --- a/config.org +++ b/config.org @@ -23,6 +23,10 @@ - [[#toggle-between-char--and-line-mode][Toggle between char- and line-mode]] - [[#with-editor][With editor]] - [[#eshell][Eshell]] +- [[#dired][Dired]] + - [[#general-config][General config]] + - [[#single-buffer][Single-buffer]] + - [[#hideshow-dot-files][Hide/show dot-files]] - [[#resize-frame][Resize frame]] - [[#general-stuff][General stuff]] - [[#unsorted][Unsorted]] @@ -445,6 +449,44 @@ We could use an alias (alias sudo eshell/sudo $*), but to keep things inside thi (setq password-cache-expiry 3600) ; for one hour (time in secs) #+END_SRC +* Dired + +** General config + +#+begin_src emacs-lisp +(use-package dired + :ensure nil + :commands (dired dired-jump) + :custom ((dired-listing-switches "-agho --group-directories-first")) +) +#+end_src + +** Single-buffer + +#+begin_src emacs-lisp +(use-package dired-single + :bind ( + :map dired-mode-map + ([remap dired-find-file] . dired-single-buffer) + ([remap dired-mouse-find-file-other-window] . dired-single-buffer-mouse) + ([remap dired-up-directory] . dired-single-up-directory) + ("" . dired-single-up-directory) + ) +) +#+end_src + +** Hide/show dot-files + +#+begin_src emacs-lisp +(use-package dired-hide-dotfiles + :hook (dired-mode . dired-hide-dotfiles-mode) + :bind ( + :map dired-mode-map + ("H" . dired-hide-dotfiles-mode) + ) +) +#+end_src + * Resize frame Minor-mode to easily resize frames (works with EXWM (firefox, ...)). From dd2692ca6eab61e41a12a4982fa140d7a371d091 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 8 Jun 2023 13:56:57 +0200 Subject: [PATCH 126/280] chore: clean up old debug code --- config.org | 2 -- 1 file changed, 2 deletions(-) diff --git a/config.org b/config.org index b1b1639..d53c0f9 100644 --- a/config.org +++ b/config.org @@ -321,8 +321,6 @@ https://github.com/abo-abo/swiper ) #+end_src -#+RESULTS: - * Utils ** Custom command line arguments From 0a2148f8df3ea2cf4113da36b1de5581f1300eeb Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 8 Jun 2023 17:55:19 +0200 Subject: [PATCH 127/280] fix: move dired-config to dired-single for it to take effect --- config.org | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/config.org b/config.org index d53c0f9..be5909d 100644 --- a/config.org +++ b/config.org @@ -24,7 +24,6 @@ - [[#with-editor][With editor]] - [[#eshell][Eshell]] - [[#dired][Dired]] - - [[#general-config][General config]] - [[#single-buffer][Single-buffer]] - [[#hideshow-dot-files][Hide/show dot-files]] - [[#resize-frame][Resize frame]] @@ -449,15 +448,6 @@ We could use an alias (alias sudo eshell/sudo $*), but to keep things inside thi * Dired -** General config - -#+begin_src emacs-lisp -(use-package dired - :ensure nil - :commands (dired dired-jump) - :custom ((dired-listing-switches "-agho --group-directories-first")) -) -#+end_src ** Single-buffer @@ -470,6 +460,9 @@ We could use an alias (alias sudo eshell/sudo $*), but to keep things inside thi ([remap dired-up-directory] . dired-single-up-directory) ("" . dired-single-up-directory) ) + :custom + (dired-listing-switches "-agho --group-directories-first") + (dired-dwim-target t) ;; Make dired guess the target directory for copy/... operations ) #+end_src From ffcbf8ec410eae5d1258f06d58e13df5ac29270b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 8 Jun 2023 21:23:50 +0200 Subject: [PATCH 128/280] feat: add ivy-rich --- config.org | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index be5909d..cb7b869 100644 --- a/config.org +++ b/config.org @@ -317,7 +317,13 @@ https://github.com/abo-abo/swiper (use-package ivy-hydra :after (ivy hydra) - ) +) + +(use-package ivy-rich + :after ivy + :init + (ivy-rich-mode 1) +) #+end_src * Utils From 5ebe6422f82064acb8101e29add09a2a2b82f59f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 8 Jun 2023 23:37:58 +0200 Subject: [PATCH 129/280] feat: refactor yasnippet Put snippets in standard path --- config.org | 4 +--- plugins/yasnippet/c-mode/oncekl | 9 --------- {plugins/yasnippet => snippets}/c-mode/fori | 4 ++-- snippets/c-mode/header | 10 ++++++++++ 4 files changed, 13 insertions(+), 14 deletions(-) delete mode 100644 plugins/yasnippet/c-mode/oncekl rename {plugins/yasnippet => snippets}/c-mode/fori (62%) create mode 100644 snippets/c-mode/header diff --git a/config.org b/config.org index cb7b869..8c73fbf 100644 --- a/config.org +++ b/config.org @@ -1131,10 +1131,8 @@ https://github.com/joaotavora/yasnippet #+BEGIN_SRC emacs-lisp (use-package yasnippet - :init - (add-to-list 'load-path - "~/.emacs.d/plugins/yasnippet") :config + (yas-reload-all) (add-hook 'prog-mode-hook 'yas-minor-mode) ) #+END_SRC diff --git a/plugins/yasnippet/c-mode/oncekl b/plugins/yasnippet/c-mode/oncekl deleted file mode 100644 index d0f8afc..0000000 --- a/plugins/yasnippet/c-mode/oncekl +++ /dev/null @@ -1,9 +0,0 @@ -#name : #ifndef XXX; #define XXX; #endif -# key: oncekl -# -- -#ifndef ${1:`(upcase (file-name-nondirectory (file-name-sans-extension (or (buffer-file-name) ""))))`_H_} -#define $1 - -$0 - -#endif /* $1 */ \ No newline at end of file diff --git a/plugins/yasnippet/c-mode/fori b/snippets/c-mode/fori similarity index 62% rename from plugins/yasnippet/c-mode/fori rename to snippets/c-mode/fori index 63e65b0..e2e0ac6 100644 --- a/plugins/yasnippet/c-mode/fori +++ b/snippets/c-mode/fori @@ -3,6 +3,6 @@ # key: fori # -- -for (${1:int i = 0}; ${2:i < N}; ${3:++i}) { +for (${1:size_t i = 0}; ${2:i < N}; ${3:++i}) { $0 -} +} \ No newline at end of file diff --git a/snippets/c-mode/header b/snippets/c-mode/header new file mode 100644 index 0000000..a7b5339 --- /dev/null +++ b/snippets/c-mode/header @@ -0,0 +1,10 @@ +#name : #ifndef XXX; #define XXX; #endif +# key: header +# -- + +#ifndef ${1:_`(upcase (file-name-nondirectory (file-name-sans-extension (or (buffer-file-name) ""))))`_H_} +#define $1 + +$0 + +#endif /* $1 */ \ No newline at end of file From a4f782825936eb995b5b0a9419c6faf1e2f23076 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 9 Jun 2023 15:54:28 +0200 Subject: [PATCH 130/280] fix: elpy-enable at init stage Taken from elpy github readme. --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 8c73fbf..ff84122 100644 --- a/config.org +++ b/config.org @@ -1260,7 +1260,7 @@ It is a full dev env and sometimes feels like a bit too much but overal good exp #+BEGIN_SRC emacs-lisp (use-package elpy - :config + :init (elpy-enable) ) #+END_SRC From 54491b0c0604caf4fb7f193125701d80eae88ca3 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 11 Jun 2023 14:31:26 +0200 Subject: [PATCH 131/280] feat: add magit-submodule-update-all suffix --- config.org | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/config.org b/config.org index ff84122..a60ded1 100644 --- a/config.org +++ b/config.org @@ -1116,8 +1116,20 @@ TODO: need to document this #+BEGIN_SRC emacs-lisp (use-package magit + :ensure t :bind ("C-c m" . magit-status) + :config + (transient-define-suffix magit-submodule-update-all () + "Update all submodules" + :description "Update All git submodule update --init --recursive" + (interactive) + (magit-with-toplevel + (magit-run-git-async "submodule" "update" "--force"))) + + (transient-append-suffix 'magit-submodule "f" + '("U" magit-submodule-update-all)) + ) #+END_SRC From ff9ed0382dfda8f6e2f494670aca3890cc6a786b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 1 Aug 2023 09:35:47 +0200 Subject: [PATCH 132/280] SWIPER: use thing-at-point by default when searching with swiper --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index a60ded1..307b731 100644 --- a/config.org +++ b/config.org @@ -311,7 +311,7 @@ https://github.com/abo-abo/swiper (use-package swiper :after ivy :bind ( - ("C-s" . swiper) + ("C-s" . swiper-thing-at-point) ) ) From 51f4498c99c8692c0c8ba0da2aa7b78bf1516a02 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 5 Dec 2023 16:06:54 +0100 Subject: [PATCH 133/280] RTAGS: remove rtags Use eglot instead, it's built-in: https://github.com/joaotavora/eglot#contribute-to-eglots-development --- config.org | 46 ---------------------------------------------- 1 file changed, 46 deletions(-) diff --git a/config.org b/config.org index 307b731..16d7c7f 100644 --- a/config.org +++ b/config.org @@ -109,7 +109,6 @@ My personal emacs configuration This configuration requires the installation of : - - =rtags= - Use python-pip to install requirements for elpy: =pip install jedi flake8 importmagic autopep8 yapf= - =ditaa= (for ascii to image generation in org-mode) @@ -1203,51 +1202,6 @@ Deprecated in favour of rtags #+END_SRC -*** Rtags - -https://github.com/Andersbakken/rtags - -#+BEGIN_SRC emacs-lisp -(use-package rtags-xref - :hook - ((c-mode-common) . (function rtags-xref-enable)) -) - -(use-package rtags - :init - ;; TODO - ;; (setq rtags-display-result-backend 'helm) - (setq rtags-completions-enabled t) - (setq rtags-autostart-diagnostics t) - :config - (rtags-enable-standard-keybindings) - (define-key c-mode-base-map (kbd "C-M-.") (function rtags-find-symbol)) - (define-key c-mode-base-map (kbd "C-M-?") (function rtags-find-references)) - (define-key c-mode-base-map (kbd "M-?") (function rtags-find-references-at-point)) - (define-key c-mode-base-map (kbd "M-i") (function rtags-imenu)) - :hook - ((c-mode c++-mode objc-mode) . (function rtags-start-process-unless-running)) -) - -;; Stolen from the github wiki of rtags -(defun my-flycheck-rtags-setup () - (flycheck-select-checker 'rtags) - (setq-local flycheck-highlighting-mode nil) ;; RTags creates more accurate overlays. - (setq-local flycheck-check-syntax-automatically nil)) - -(use-package flycheck-rtags - :hook - ( - (c-mode c++-mode objc-mode) . (function my-flycheck-rtags-setup) - ) -) - -(use-package company-rtags - :config - (push 'company-rtags company-backends) -) -#+END_SRC - *** Company #+BEGIN_SRC emacs-lisp From a1a3856486f5940fc28f7ee7174a8271c9191872 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 5 Dec 2023 16:07:50 +0100 Subject: [PATCH 134/280] LSP: remove old commented out blockrtags Use eglot instead, it's built-in: https://github.com/joaotavora/eglot#contribute-to-eglots-development --- config.org | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/config.org b/config.org index 16d7c7f..4ae0b58 100644 --- a/config.org +++ b/config.org @@ -1167,41 +1167,6 @@ https://github.com/joaotavora/yasnippet ** C/C++ mode -*** LSP-mode - -Deprecated in favour of rtags - -#+BEGIN_SRC emacs-lisp -;; (use-package lsp-mode -;; :commands lsp -;; ) - -;; (use-package lsp-ui -;; :commands lsp-ui-mode -;; :config -;; (setq lsp-ui-doc-position (quote top)) -;; (define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions) -;; (define-key lsp-ui-mode-map [remap xref-find-references] #'lsp-ui-peek-find-references) -;; (define-key lsp-ui-mode-map [remap complete-symbol] #'company-complete) -;; ) - -;; (use-package company-lsp -;; :commands company-lsp -;; :config -;; (push 'company-lsp company-backends) ;; add company-lsp as a backend -;; ) - -;; (use-package ccls -;; :config -;; (setq ccls-executable "ccls") -;; (setq lsp-prefer-flymake nil) ;; Disable flymake for syntax checking, use flycheck instead -;; (setq-default flycheck-disabled-checkers '(c/c++-clang c/c++-cppcheck c/c++-gcc)) -;; :hook ((c-mode c++-mode objc-mode) . -;; (lambda () (require 'ccls) (lsp))) -;; ) - -#+END_SRC - *** Company #+BEGIN_SRC emacs-lisp From 629f3da53b9a604358eeaa855853e6f989722241 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 5 Dec 2023 16:18:13 +0100 Subject: [PATCH 135/280] EGLOT: Add eglot LSP client which is built-in --- config.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config.org b/config.org index 4ae0b58..269edd1 100644 --- a/config.org +++ b/config.org @@ -1167,6 +1167,14 @@ https://github.com/joaotavora/yasnippet ** C/C++ mode +*** Eglot + +#+BEGIN_SRC emacs-lisp +(use-package eglot + :hook (prog-mode . eglot-ensure) +) +#+END_SRC + *** Company #+BEGIN_SRC emacs-lisp From 110f3c5dd995d1853312f42f65e02b0b237885bc Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 9 Apr 2024 09:44:10 +0200 Subject: [PATCH 136/280] PROGRAMMING: add zig-mode --- config.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config.org b/config.org index 269edd1..32d7bf4 100644 --- a/config.org +++ b/config.org @@ -73,6 +73,7 @@ - [[#xref][xref]] - [[#cc-mode][C/C++ mode]] - [[#python-mode][Python mode]] + - [[#zig-mode][Zig mode]] - [[#windows][Windows]] - [[#splitting][Splitting]] - [[#switching][Switching]] @@ -1204,6 +1205,13 @@ It is a full dev env and sometimes feels like a bit too much but overal good exp ) #+END_SRC +** Zig mode + +#+BEGIN_SRC emacs-lisp +(use-package zig-mode +) +#+END_SRC + * Windows ** Splitting From 27f8caf0a559b76cf446be375ace7f650cdfb679 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 9 Apr 2024 13:18:05 +0200 Subject: [PATCH 137/280] PROGRAMMING: Add rust mode --- config.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config.org b/config.org index 32d7bf4..bb73156 100644 --- a/config.org +++ b/config.org @@ -74,6 +74,7 @@ - [[#cc-mode][C/C++ mode]] - [[#python-mode][Python mode]] - [[#zig-mode][Zig mode]] + - [[#rust][Rust]] - [[#windows][Windows]] - [[#splitting][Splitting]] - [[#switching][Switching]] @@ -1212,6 +1213,13 @@ It is a full dev env and sometimes feels like a bit too much but overal good exp ) #+END_SRC +** Rust + +#+BEGIN_SRC emacs-lisp +(use-package rust-mode +) +#+END_SRC + * Windows ** Splitting From 0f9db243ad9f851bdf39f80ca684d0274988c174 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 26 Aug 2024 16:02:44 +0200 Subject: [PATCH 138/280] 'Fresh' start - Use config_new.org as main config file Trimmed down version of old config. Insipred by 'mastering emacs' book to use more the built-in functionality of emacs. I found that It's more than good enough for my usecases. - adapt early-init for quicker startup Stolen from doom emacs - Don't use/load project.org Use .dir-locals.el you peasant --- config.org | 118 +++++++++---------- config_new.org | 299 +++++++++++++++++++++++++++++++++++++++++++++++++ early-init.el | 8 ++ init.el | 21 +++- 4 files changed, 385 insertions(+), 61 deletions(-) create mode 100644 config_new.org diff --git a/config.org b/config.org index bb73156..ff3b9cb 100644 --- a/config.org +++ b/config.org @@ -117,11 +117,13 @@ This configuration requires the installation of : ** Garbage collection -Increase GC threshold to minimize time wasting: +Increase GC threshold to minimize time wasting on modern machines: #+BEGIN_SRC emacs-lisp (setq gc-cons-threshold 20000000) ;; 20 MB #+END_SRC +Recommendation stolen from https://github.com/lewang/flx?tab=readme-ov-file#gc-optimization . + * Base packages to install first ** Elpaca @@ -130,76 +132,43 @@ Replacement for built-in package manager package.el : https://github.com/progfolio/elpaca #+BEGIN_SRC emacs-lisp - (defvar elpaca-installer-version 0.4) - + (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 - - :files (:defaults (:exclude "extensions")) - - :build (:not elpaca--activate-package))) - + :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)) - + (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 (call-process "git" nil buffer t "clone" - - (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))) - - (kill-buffer buffer) - - (error "%s" (with-current-buffer buffer (buffer-string)))) - - ((error) (warn "%s" err) (delete-directory repo 'recursive)))) - + (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)) #+END_SRC @@ -453,6 +422,14 @@ We could use an alias (alias sudo eshell/sudo $*), but to keep things inside thi (setq password-cache-expiry 3600) ; for one hour (time in secs) #+END_SRC +** Vterm + +#+BEGIN_SRC emacs-lisp +(use-package vterm + :ensure t + ) +#+END_SRC + * Dired @@ -754,7 +731,7 @@ will the entire line including the following newline will be deleted. #+BEGIN_SRC emacs-lisp (setq kill-ring-max 5000) ; increase kill-ring capacity -(setq kill-whole-line t) +;; (setq kill-whole-line t) #+END_SRC ** Newline at end-of-file @@ -1115,6 +1092,13 @@ TODO: need to document this * Magit + +#+BEGIN_SRC emacs-lisp +(use-package transient + :ensure t + ) +#+END_SRC + #+BEGIN_SRC emacs-lisp (use-package magit :ensure t @@ -1171,6 +1155,26 @@ https://github.com/joaotavora/yasnippet *** Eglot +Eldoc complaints: + +#+BEGIN_SRC emacs-lisp +(use-package eldoc + :preface + (unload-feature 'eldoc t) + (setq custom-delayed-init-variables '()) + (defvar global-eldoc-mode nil) + :config + (global-eldoc-mode)) + + +(use-package jsonrpc + :preface + (unload-feature 'jsonrpc t) + ) + +#+END_SRC + + #+BEGIN_SRC emacs-lisp (use-package eglot :hook (prog-mode . eglot-ensure) diff --git a/config_new.org b/config_new.org new file mode 100644 index 0000000..c5dd757 --- /dev/null +++ b/config_new.org @@ -0,0 +1,299 @@ +#+STARTUP: overview +#+TITLE: My Emacs +#+CREATOR: Laurens Miers +#+LANGUAGE: en +[[./img/dash_logo.png]] + +* Elpaca + +#+begin_src emacs-lisp +(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)) +#+end_src + +#+begin_src emacs-lisp + ;; Install use-package support + (elpaca elpaca-use-package + ;; Enable use-package :ensure support for Elpaca. + (elpaca-use-package-mode) + ) +#+end_src + +* General config + +** Yes-or-no + +Because I'm lazy, important yes-or-no questions can be answered with y-or-n: +#+begin_src emacs-lisp +(defalias 'yes-or-no-p 'y-or-n-p) +#+end_src + +** FIDO + +Use Fake-ido as minibuffer completion system, more info here: +https://www.gnu.org/software/emacs/manual/html_node/emacs/Icomplete.html + +#+begin_src emacs-lisp +(fido-vertical-mode 1) +#+end_src + +** Switch windows + +#+begin_src emacs-lisp +(global-set-key (kbd "M-o") 'other-window) +#+end_src + +** Maximize at startup + +More info : https://www.emacswiki.org/emacs/FullScreen + +#+begin_src emacs-lisp +(push '(fullscreen . maximized) default-frame-alist) +#+end_src + +** ibuffer + +Use list-buffers bigger brother. +#+begin_src emacs-lisp +(global-set-key [remap list-buffers] 'ibuffer) +#+end_src + +** Mark + +#+begin_src emacs-lisp +(global-set-key (kbd "M-SPC") 'mark-word) +#+end_src + +** Isearch + +Display number of matches: +#+begin_src emacs-lisp +(setq-default isearch-lazy-count t) +#+end_src + +Reference that might be interesting for later: +https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html + +** Sudo file + +#+begin_src emacs-lisp +(defun sudo () + "Use TRAMP to `sudo' the current buffer." + (interactive) + (when buffer-file-name + (find-alternate-file + (concat "/sudo:root@localhost:" + buffer-file-name) + ) + ) +) +#+end_src + +* Whole-line-or-region + +Source: +https://github.com/purcell/whole-line-or-region + +Operate on the current line if no region is active. + +#+begin_src emacs-lisp +(use-package whole-line-or-region + :ensure t + :config + (whole-line-or-region-global-mode 1) +) +#+end_src + +* imenu + +** Flatten + +#+begin_src emacs-lisp +(use-package flimenu + :ensure t + :config + (flimenu-global-mode 1) +) + +(global-set-key (kbd "M-i") 'imenu) +#+end_src + +* 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/ + +#+BEGIN_SRC emacs-lisp +(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) +#+END_SRC + +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 + +#+BEGIN_SRC emacs-lisp +(use-package monokai-theme + :ensure t + :init + (load-theme 'monokai t) +) +#+END_SRC + +* Dashboard + +#+begin_src emacs-lisp +(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)) +#+end_src + +* Hydra + +Install and wait for hydra to be available since we are using it in this init.el : +#+begin_src emacs-lisp +(use-package hydra + :ensure (:wait t) + ) +#+end_src + +** Text zoom + +#+begin_src emacs-lisp +(defhydra hydra-zoom (global-map "") + "zoom" + ("g" text-scale-increase "in") + ("l" text-scale-decrease "out") +) +#+end_src + +* Programming + +** Eglot + +#+BEGIN_SRC emacs-lisp +(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) +) +#+END_SRC + +Workaround to enable eglot in all programming modes: +#+BEGIN_SRC emacs-lisp +(add-hook 'prog-mode-hook 'eglot-ensure) +#+END_SRC + +** Yasnippet + +#+BEGIN_SRC emacs-lisp +(use-package yasnippet + :ensure t + :config + (yas-reload-all) + (add-hook 'prog-mode-hook 'yas-minor-mode) +) +#+END_SRC + +** Magit + +#+BEGIN_SRC emacs-lisp +(use-package magit + :ensure t +) +#+END_SRC + +* Multiple cursors + +#+BEGIN_SRC emacs-lisp +(use-package multiple-cursors + :ensure t +) +#+END_SRC + +* Comment-dwim-2 + +Replacement for built-in =comment-dwim=, more comment features. + +https://github.com/remyferre/comment-dwim-2 + +#+BEGIN_SRC emacs-lisp +(use-package comment-dwim-2 + :ensure t + :config + (global-set-key (kbd "M-;") 'comment-dwim-2) +) +#+END_SRC + +* Projectile + +#+BEGIN_SRC emacs-lisp +(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) +) + +#+END_SRC diff --git a/early-init.el b/early-init.el index 512068a..0fe1b95 100644 --- a/early-init.el +++ b/early-init.el @@ -1 +1,9 @@ (setq package-enable-at-startup nil) + + +;; Local Variables: +;; no-byte-compile: t +;; no-native-compile: t +;; no-update-autoloads: t +;; End: + diff --git a/init.el b/init.el index 444b5ab..b25e39d 100644 --- a/init.el +++ b/init.el @@ -5,13 +5,26 @@ ;;; ... (let ((gc-cons-threshold most-positive-fixnum)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. - (defvar config-file (expand-file-name "config.org" user-emacs-directory)) - (defvar project-file (expand-file-name "project.org" user-emacs-directory)) + (defvar config-file (expand-file-name "config_new.org" user-emacs-directory)) + ;;(defvar project-file (expand-file-name "project.org" user-emacs-directory)) (when (file-readable-p config-file) (org-babel-load-file (expand-file-name config-file))) ;; If it exists, load some project-specific configurations. - (when (file-readable-p project-file) - (org-babel-load-file (expand-file-name project-file))) + ;;(when (file-readable-p project-file) + ;; (org-babel-load-file (expand-file-name project-file))) ) +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(package-selected-packages + '(flycheck-clang-tidy org-tree-slide ox-reveal writeroom-mode visual-fill-column org-present clang-format+ dash))) +(custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) From 0db6d1753e8fc43e2b3b7c7c49f328a733f4f539 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 11:58:49 +0200 Subject: [PATCH 139/280] ADD multipe-cursor keybindings --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index c5dd757..d073aef 100644 --- a/config_new.org +++ b/config_new.org @@ -266,6 +266,12 @@ Workaround to enable eglot in all programming modes: #+BEGIN_SRC emacs-lisp (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) ) #+END_SRC From ef04adcfd92e173ec3a28cbe5bb441312dfbea94 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:02:47 +0200 Subject: [PATCH 140/280] ADD hippie-expand Remap dabbrev to hippie-expand --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index d073aef..04a3253 100644 --- a/config_new.org +++ b/config_new.org @@ -125,6 +125,12 @@ https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch. ) #+end_src +** Abbrev + +#+begin_src emacs-lisp +(global-set-key [remap dabbrev-expand] 'hippie-expand) +#+end_src + * Whole-line-or-region Source: From 3bf48f5927c3d64d7f3c340461f8bf3b006b972a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:03:02 +0200 Subject: [PATCH 141/280] ADD zap-up-to-char keybinding --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index 04a3253..2ef4bb6 100644 --- a/config_new.org +++ b/config_new.org @@ -131,6 +131,12 @@ https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch. (global-set-key [remap dabbrev-expand] 'hippie-expand) #+end_src +** Zap + +#+begin_src emacs-lisp +(global-set-key (kbd "M-S-z") 'zap-up-to-char) +#+end_src + * Whole-line-or-region Source: From d184007b9b3c9b2f8c44f21622022f9c86370b4e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:03:19 +0200 Subject: [PATCH 142/280] ADD spell checking in prog-mode --- config_new.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config_new.org b/config_new.org index 2ef4bb6..ff8ee7a 100644 --- a/config_new.org +++ b/config_new.org @@ -137,6 +137,14 @@ https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch. (global-set-key (kbd "M-S-z") 'zap-up-to-char) #+end_src +** Spell checking + +Look into customizing the 'ispell' group. + +#+begin_src emacs-lisp +(add-hook 'prog-mode-hook 'flyspell-prog-mode) +#+end_src + * Whole-line-or-region Source: From db266f3ecec8b746c3decd4319b13b732f35dd19 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:03:32 +0200 Subject: [PATCH 143/280] ADD 'transient' dependant package for magit --- config_new.org | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/config_new.org b/config_new.org index ff8ee7a..d567839 100644 --- a/config_new.org +++ b/config_new.org @@ -275,6 +275,18 @@ Workaround to enable eglot in all programming modes: ** Magit +*** Transient + +Magit depends on this and it seems it's not installed as a dependency, so install it explicitly. + +#+BEGIN_SRC emacs-lisp +(use-package transient + :ensure t + ) +#+END_SRC + +*** Core + #+BEGIN_SRC emacs-lisp (use-package magit :ensure t From bd3f73747779c16d9efa643f47113ca3e675340d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:19:53 +0200 Subject: [PATCH 144/280] ADD enhanced dired --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index d567839..2876e5c 100644 --- a/config_new.org +++ b/config_new.org @@ -145,6 +145,12 @@ Look into customizing the 'ispell' group. (add-hook 'prog-mode-hook 'flyspell-prog-mode) #+end_src +* Dired + +#+begin_src emacs-lisp +(require 'dired-x) +#+end_src + * Whole-line-or-region Source: From 00d40a2d5ac4f40adcf904b5903263e8dc7f9900 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:22:53 +0200 Subject: [PATCH 145/280] PROJECTILE: Initial configuration Not sure yet about this but working for now. Override default project keymap --- config_new.org | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/config_new.org b/config_new.org index 2876e5c..6d4403d 100644 --- a/config_new.org +++ b/config_new.org @@ -332,12 +332,11 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (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) + :config + (setq projectile-indexing-method 'alien) + (setq projectile-enable-caching t) + (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) + (projectile-mode +1) ) #+END_SRC From a6c81d05bac145c6fa8b8efabf9d03f93c32890d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:45:34 +0200 Subject: [PATCH 146/280] ADD smartparens --- config_new.org | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config_new.org b/config_new.org index 6d4403d..1bfa1c6 100644 --- a/config_new.org +++ b/config_new.org @@ -299,6 +299,22 @@ Magit depends on this and it seems it's not installed as a dependency, so instal ) #+END_SRC +** Smartparens +Smart minor-mode to deal with pairs. + +https://github.com/Fuco1/smartparens + +#+BEGIN_SRC emacs-lisp +(use-package smartparens + :ensure t + :bind + ("C-M-w" . sp-copy-sexp) + :hook (prog-mode text-mode markdown-mode) + :config + (require 'smartparens-config) +) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From b8ef2937f35169ad15be4a1f9090759ff6c5a8b4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:34:16 +0200 Subject: [PATCH 147/280] ADD save history and recentf --- config_new.org | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/config_new.org b/config_new.org index 1bfa1c6..6a890d2 100644 --- a/config_new.org +++ b/config_new.org @@ -57,6 +57,25 @@ * General config +** Save history and recent files + +#+begin_src emacs-lisp +;; The built-in `savehist-mode' saves minibuffer histories. Vertico +;; can then use that information to put recently selected options at +;; the top. +;; +;; Further reading: https://protesilaos.com/emacs/dotemacs#h:25765797-27a5-431e-8aa4-cc890a6a913a +(savehist-mode 1) + +;; The built-in `recentf-mode' keeps track of recently visited files. +;; You can then access those through the `consult-buffer' interface or +;; with `recentf-open'/`recentf-open-files'. +;; +;; I do not use this facility, because the files I care about are +;; either in projects or are bookmarked. +(recentf-mode 1) +#+end_src + ** Yes-or-no Because I'm lazy, important yes-or-no questions can be answered with y-or-n: From 9541cfbf440ecd26561adb6161e730170788b8fe Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:34:31 +0200 Subject: [PATCH 148/280] Delete trailing whitespaces before-saving Enable globally because I don't know of a scenario where we would ever want this. --- config_new.org | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/config_new.org b/config_new.org index 6a890d2..4866110 100644 --- a/config_new.org +++ b/config_new.org @@ -57,6 +57,12 @@ * General config +** Delete trailing whitespaces + +#+BEGIN_SRC emacs-lisp +(add-hook 'before-save-hook 'delete-trailing-whitespace) +#+END_SRC + ** Save history and recent files #+begin_src emacs-lisp @@ -103,7 +109,7 @@ https://www.gnu.org/software/emacs/manual/html_node/emacs/Icomplete.html More info : https://www.emacswiki.org/emacs/FullScreen #+begin_src emacs-lisp -(push '(fullscreen . maximized) default-frame-alist) +(push '(fullscreen . maximized) default-frame-alist) #+end_src ** ibuffer @@ -284,7 +290,7 @@ Install and wait for hydra to be available since we are using it in this init.el Workaround to enable eglot in all programming modes: #+BEGIN_SRC emacs-lisp -(add-hook 'prog-mode-hook 'eglot-ensure) +(add-hook 'prog-mode-hook 'eglot-ensure) #+END_SRC ** Yasnippet @@ -373,5 +379,3 @@ https://github.com/remyferre/comment-dwim-2 (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) (projectile-mode +1) ) - -#+END_SRC From 7329b044f3861f515bdaa2399c9253658dc859d9 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:35:11 +0200 Subject: [PATCH 149/280] ADD save-symbol-at-point function This was originally supplied by smartparens but I don't need the whole package for this function. Other functionality which I used from smartparens is available with electric-pair-mode . --- config_new.org | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/config_new.org b/config_new.org index 4866110..688035d 100644 --- a/config_new.org +++ b/config_new.org @@ -379,3 +379,17 @@ https://github.com/remyferre/comment-dwim-2 (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) (projectile-mode +1) ) + +* Custom + +** Save symbol at point + +#+BEGIN_SRC emacs-lisp +(defun myrmi/save-symbol-at-point () + "Make symbol at point the latest kill in the kill ring." + (interactive) + (let ((symbol (thing-at-point 'symbol))) + (when symbol (kill-new symbol)))) + +(global-set-key (kbd "C-M-w") 'myrmi/save-symbol-at-point) +#+END_SRC From 801188ed90116da9c696fdaf81e26cd137437be1 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:36:50 +0200 Subject: [PATCH 150/280] ADD electric-pair mode in prog-mode This was originally supplied by smartparens but I'm only using a subset of this package. The main functionality which I used from smartparens is available with electric-pair-mode . --- config_new.org | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config_new.org b/config_new.org index 688035d..de2f4e0 100644 --- a/config_new.org +++ b/config_new.org @@ -275,6 +275,11 @@ Install and wait for hydra to be available since we are using it in this init.el * Programming +** Electric pair +#+BEGIN_SRC emacs-lisp +(add-hook 'prog-mode-hook 'electric-pair-mode) +#+END_SRC + ** Eglot #+BEGIN_SRC emacs-lisp From 22a827592d6cb8eda46f7972be1541d9f657cf6c Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:38:09 +0200 Subject: [PATCH 151/280] REMOVE imenu use consult-imenu in future --- config_new.org | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/config_new.org b/config_new.org index de2f4e0..4e3591d 100644 --- a/config_new.org +++ b/config_new.org @@ -191,20 +191,6 @@ Operate on the current line if no region is active. ) #+end_src -* imenu - -** Flatten - -#+begin_src emacs-lisp -(use-package flimenu - :ensure t - :config - (flimenu-global-mode 1) -) - -(global-set-key (kbd "M-i") 'imenu) -#+end_src - * Terminal ** Toggle between char- and line-mode From df5d0349070cfebfc3f151f8112cd875e5c3ce97 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:38:50 +0200 Subject: [PATCH 152/280] PROJECTILE: install project.el hooks Some packages use the project.el functions/bindings (like consult, ...) for their functionality. Install the projectile bindings so that they start using the projectile framework. --- config_new.org | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config_new.org b/config_new.org index 4e3591d..f53f9a0 100644 --- a/config_new.org +++ b/config_new.org @@ -369,7 +369,10 @@ https://github.com/remyferre/comment-dwim-2 (setq projectile-enable-caching t) (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) (projectile-mode +1) + (require 'project) + (add-hook 'project-find-functions #'project-projectile) ) +#+END_SRC * Custom From 35102de7f578cca937af0afeb8342a149bcd2d48 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:45:00 +0200 Subject: [PATCH 153/280] REMOVE fido, ADD Vertico Switch from fido to vertico --- config_new.org | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/config_new.org b/config_new.org index f53f9a0..893ccfd 100644 --- a/config_new.org +++ b/config_new.org @@ -55,6 +55,23 @@ ) #+end_src +* Vertico-stack + +** Vertico + +#+BEGIN_SRC emacs-lisp +;; Enable vertico +(use-package vertico + :ensure t + ;; :custom + ;; (vertico-scroll-margin 0) ;; Different scroll margin + ;; (vertico-count 20) ;; Show more candidates + ;; (vertico-resize t) ;; Grow and shrink the Vertico minibuffer + ;; (vertico-cycle t) ;; Enable cycling for `vertico-next/previous' + :init + (vertico-mode)) +#+END_SRC + * General config ** Delete trailing whitespaces @@ -89,15 +106,6 @@ 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) #+end_src -** FIDO - -Use Fake-ido as minibuffer completion system, more info here: -https://www.gnu.org/software/emacs/manual/html_node/emacs/Icomplete.html - -#+begin_src emacs-lisp -(fido-vertical-mode 1) -#+end_src - ** Switch windows #+begin_src emacs-lisp From 393bace7cff1e1b535dc0ab35fccc4883cc6fa53 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:45:25 +0200 Subject: [PATCH 154/280] ADD consult example config --- config_new.org | 111 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/config_new.org b/config_new.org index 893ccfd..bb451bd 100644 --- a/config_new.org +++ b/config_new.org @@ -72,6 +72,117 @@ (vertico-mode)) #+END_SRC +** Consult + +#+BEGIN_SRC emacs-lisp +(use-package consult + :ensure t + ;; Replace bindings. Lazily loaded by `use-package'. + :bind (;; C-c bindings in `mode-specific-map' + ;; ("C-c M-x" . consult-mode-command) + ;; ("C-c h" . consult-history) + ;; ("C-c k" . consult-kmacro) + ;; ("C-c m" . consult-man) + ;; ("C-c i" . consult-info) + ([remap Info-search] . consult-info) + ;; C-x bindings in `ctl-x-map' + ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command + ("C-x b" . consult-buffer) ;; orig. switch-to-buffer + ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window + ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame + ("C-x t b" . consult-buffer-other-tab) ;; orig. switch-to-buffer-other-tab + ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump + ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer + ;; Custom M-# bindings for fast register access + ;; ("M-#" . consult-register-load) + ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) + ;; ("C-M-#" . consult-register) + ;; Other custom bindings + ("M-y" . consult-yank-pop) ;; orig. yank-pop + ;; M-g bindings in `goto-map' + ;; ("M-g e" . consult-compile-error) + ;; ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck + ("M-g g" . consult-goto-line) ;; orig. goto-line + ("M-g M-g" . consult-goto-line) ;; orig. goto-line + ;; ("M-g o" . consult-outline) ;; Alternative: consult-org-heading + ;; ("M-g m" . consult-mark) + ;; ("M-g k" . consult-global-mark) + ("M-i" . consult-imenu) + ("M-I" . consult-imenu-multi) + ;; M-s bindings in `search-map' + ;; ("M-s d" . consult-find) ;; Alternative: consult-fd + ;; ("M-s c" . consult-locate) + ;; ("M-s g" . consult-grep) + ;; ("M-s G" . consult-git-grep) + ;; ("M-s r" . consult-ripgrep) + ("M-s l" . consult-line) + ;; ("M-s L" . consult-line-multi) + ;; ("M-s k" . consult-keep-lines) + ;; ("M-s u" . consult-focus-lines) + ;; Isearch integration + ("M-s e" . consult-isearch-history) + :map isearch-mode-map + ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s l" . consult-line) ;; needed by consult-line to detect isearch + ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch + ;; Minibuffer history + :map minibuffer-local-map + ("M-s" . consult-history) ;; orig. next-matching-history-element + ("M-r" . consult-history) ;; orig. previous-matching-history-element + ) + + ;; Enable automatic preview at point in the *Completions* buffer. This is + ;; relevant when you use the default completion UI. + :hook (completion-list-mode . consult-preview-at-point-mode) + + ;; The :init configuration is always executed (Not lazy) + :init + + ;; Optionally configure the register formatting. This improves the register + ;; preview for `consult-register', `consult-register-load', + ;; `consult-register-store' and the Emacs built-ins. + ;; (setq register-preview-delay 0.5 + ;; register-preview-function #'consult-register-format) + + ;; Optionally tweak the register preview window. + ;; This adds thin lines, sorting and hides the mode line of the window. + ;; (advice-add #'register-preview :override #'consult-register-window) + + ;; Use Consult to select xref locations with preview + (setq xref-show-xrefs-function #'consult-xref + xref-show-definitions-function #'consult-xref) + + ;; Configure other variables and modes in the :config section, + ;; after lazily loading the package. + ;; :config + + ;; Optionally configure preview. The default value + ;; is 'any, such that any key triggers the preview. + ;; (setq consult-preview-key 'any) + ;; (setq consult-preview-key "M-.") + ;; (setq consult-preview-key '("S-" "S-")) + ;; For some commands and buffer sources it is useful to configure the + ;; :preview-key on a per-command basis using the `consult-customize' macro. + ;; (consult-customize + ;; consult-theme :preview-key '(:debounce 0.2 any) + ;; consult-ripgrep consult-git-grep consult-grep + ;; consult-bookmark consult-recent-file consult-xref + ;; consult--source-bookmark consult--source-file-register + ;; consult--source-recent-file consult--source-project-recent-file + ;; :preview-key "M-." + ;; :preview-key '(:debounce 0.4 any)) + + ;; Optionally configure the narrowing key. + ;; Both < and C-+ work reasonably well. + ;; (setq consult-narrow-key "<") ;; "C-+" + + ;; Optionally make narrowing help available in the minibuffer. + ;; You may want to use `embark-prefix-help-command' or which-key instead. + ;; (keymap-set consult-narrow-map (concat consult-narrow-key " ?") #'consult-narrow-help) +) +#+END_SRC + * General config ** Delete trailing whitespaces From 17515a83778ba08e25ca158ad5753f4be29698e7 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:45:39 +0200 Subject: [PATCH 155/280] ADD Corfu For nice popup in eglot. --- config_new.org | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/config_new.org b/config_new.org index bb451bd..9d3ade8 100644 --- a/config_new.org +++ b/config_new.org @@ -183,6 +183,35 @@ ) #+END_SRC +** Corfu + +#+BEGIN_SRC emacs-lisp + (use-package corfu + :ensure t + ;; Optional customizations + ;; :custom + ;; (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' + ;; (corfu-auto t) ;; Enable auto completion + ;; (corfu-separator ?\s) ;; Orderless field separator + ;; (corfu-quit-at-boundary nil) ;; Never quit at completion boundary + ;; (corfu-quit-no-match nil) ;; Never quit, even if there is no match + ;; (corfu-preview-current nil) ;; Disable current candidate preview + ;; (corfu-preselect 'prompt) ;; Preselect the prompt + ;; (corfu-on-exact-match nil) ;; Configure handling of exact matches + ;; (corfu-scroll-margin 5) ;; Use scroll margin + + ;; Enable Corfu only for certain modes. See also `global-corfu-modes'. + ;; :hook ((prog-mode . corfu-mode) + ;; (shell-mode . corfu-mode) + ;; (eshell-mode . corfu-mode)) + + ;; Recommended: Enable Corfu globally. This is recommended since Dabbrev can + ;; be used globally (M-/). See also the customization variable + ;; `global-corfu-modes' to exclude certain modes. + :init + (global-corfu-mode)) +#+end_src + * General config ** Delete trailing whitespaces From 6e1ed0ebb6af66e0553d2f43f8567a6a713ad36c Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:45:57 +0200 Subject: [PATCH 156/280] ADD Orderless --- config_new.org | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/config_new.org b/config_new.org index 9d3ade8..51e576b 100644 --- a/config_new.org +++ b/config_new.org @@ -212,6 +212,31 @@ (global-corfu-mode)) #+end_src +** Orderless + +#+begin_src emacs-lisp + (use-package orderless + :ensure t + :demand t + :custom + (completion-styles '(orderless basic)) + ;; (gnus-completion-styles '(orderless substring basic)) + ;; (completion-category-overrides '((file (styles basic partial-completion)))) + + ;; Below not necessary if using vertico + ;; (completion-category-overrides '( + ;; (command (styles orderless basic partial-completion)) + ;; (file (styles orderless basic partial-completion)) + ;;;; (buffer (styles orderless basic)) + ;; (variable (styles orderless basic)) + ;; (symbol (styles orderless basic)) + ;; (consult-location (styles orderless)) + ;; (consult-multi (styles orderless)) + ;; ) + ;; ) + ) +#+end_src + * General config ** Delete trailing whitespaces From 49e26e5568c3b88fdbd73250acfc5271064b2dfb Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:46:07 +0200 Subject: [PATCH 157/280] ADD Marginalia Some eye candy in the minibuffer --- config_new.org | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/config_new.org b/config_new.org index 51e576b..e4e294b 100644 --- a/config_new.org +++ b/config_new.org @@ -237,6 +237,27 @@ ) #+end_src +** Marginalia + +#+begin_src emacs-lisp +;; Enable rich annotations using the Marginalia package +(use-package marginalia + :ensure t + ;; Bind `marginalia-cycle' locally in the minibuffer. To make the binding + ;; available in the *Completions* buffer, add it to the + ;; `completion-list-mode-map'. + :bind (:map minibuffer-local-map + ("M-A" . marginalia-cycle)) + + ;; The :init section is always executed. + :init + + ;; Marginalia must be activated in the :init section of use-package such that + ;; the mode gets enabled right away. Note that this forces loading the + ;; package. + (marginalia-mode)) +#+end_src + * General config ** Delete trailing whitespaces From 1549038f73f74b2c4c756a89a76b6742364c193f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:58:13 +0200 Subject: [PATCH 158/280] ADD backup configuration Store backups in /backups --- config_new.org | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/config_new.org b/config_new.org index e4e294b..43ae68b 100644 --- a/config_new.org +++ b/config_new.org @@ -285,6 +285,27 @@ (recentf-mode 1) #+end_src +** Backups + +#+BEGIN_SRC emacs-lisp +(defvar myrmi-backup-directory (concat user-emacs-directory "backups")) +(if (not (file-exists-p myrmi-backup-directory)) + (make-directory myrmi-backup-directory t) + ) +(setq backup-directory-alist `(("." . ,myrmi-backup-directory))) +(setq make-backup-files t + backup-by-copying t + version-control t + delete-old-versions t + delete-by-moving-to-trash t + kept-old-versions 6 + kept-new-versions 9 + auto-save-default t + auto-save-timeout 20 + auto-save-interval 200 + ) +#+END_SRC + ** Yes-or-no Because I'm lazy, important yes-or-no questions can be answered with y-or-n: From 43c75a29e21c33f6d73a14375025c43368682297 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 13:03:17 +0200 Subject: [PATCH 159/280] REMOVE custom-set-variables Find a way to move this elegantly to a file which can be ignored by git --- init.el | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/init.el b/init.el index b25e39d..4a3164f 100644 --- a/init.el +++ b/init.el @@ -15,16 +15,3 @@ ;;(when (file-readable-p project-file) ;; (org-babel-load-file (expand-file-name project-file))) ) -(custom-set-variables - ;; custom-set-variables was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - '(package-selected-packages - '(flycheck-clang-tidy org-tree-slide ox-reveal writeroom-mode visual-fill-column org-present clang-format+ dash))) -(custom-set-faces - ;; custom-set-faces was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - ) From 53dd2a90840d4a723280f9ee460cb59a31a39f7d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 21:37:06 +0200 Subject: [PATCH 160/280] ADD custom ceedling commands Convience function to run the ceedling command --- config_new.org | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/config_new.org b/config_new.org index 43ae68b..8b6a9d7 100644 --- a/config_new.org +++ b/config_new.org @@ -602,3 +602,23 @@ https://github.com/remyferre/comment-dwim-2 (global-set-key (kbd "C-M-w") 'myrmi/save-symbol-at-point) #+END_SRC + +** Ceedling + +#+BEGIN_SRC emacs-lisp +(defvar ceedling-project-file-name "project.yml") +(defvar ceedling-cmd "ceedling") +(defvar ceedling-project-root ".") + +(defun myrmi/run-ceedling-tests (&optional file-name) + (interactive) + (let* ( + (file-path (or file-name buffer-file-name)) + (root-path (or (locate-dominating-file file-path ceedling-project-file-name) ceedling-project-root)) + ) + (compile + (concat "cd " root-path " && " ceedling-cmd) + ) + ) + ) +#+END_SRC From 12b33b1f498bcea3e1edcad76e5bde84ed90ca00 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 21:37:32 +0200 Subject: [PATCH 161/280] PROJECTILE: use hybrid method Gives more flexibility with .projectile file IMO to add/remove folders from projectile-find-file . --- config_new.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_new.org b/config_new.org index 8b6a9d7..07ef738 100644 --- a/config_new.org +++ b/config_new.org @@ -580,7 +580,7 @@ https://github.com/remyferre/comment-dwim-2 (use-package projectile :ensure t :config - (setq projectile-indexing-method 'alien) + (setq projectile-indexing-method 'hybrid) (setq projectile-enable-caching t) (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) (projectile-mode +1) From 832bc40d8141f23bc8d0a607795690d2410f5377 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sat, 14 Sep 2024 08:37:47 +0200 Subject: [PATCH 162/280] Set path/exec-path to shell path For .dir-locals.el to find the custom programs --- config_new.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config_new.org b/config_new.org index 07ef738..e0d116c 100644 --- a/config_new.org +++ b/config_new.org @@ -622,3 +622,16 @@ https://github.com/remyferre/comment-dwim-2 ) ) #+END_SRC + +** Set path to shell path + +#+BEGIN_SRC emacs-lisp +(defun set-exec-path-from-shell-PATH () + (let ((path-from-shell + (replace-regexp-in-string "[[:space:]\n]*$" "" + (shell-command-to-string "$SHELL -l -c 'echo $PATH'")))) + (setenv "PATH" path-from-shell) + (setq exec-path (split-string path-from-shell path-separator)))) + +(set-exec-path-from-shell-PATH) +#+END_SRC From 1475b4acb8e0e163a2edee2d4b1f6dc256fe41a4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 15 Sep 2024 17:46:29 +0200 Subject: [PATCH 163/280] CUSTOM: Add functions to reload .dir-locals.el --- config_new.org | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/config_new.org b/config_new.org index e0d116c..f6f9247 100644 --- a/config_new.org +++ b/config_new.org @@ -635,3 +635,23 @@ https://github.com/remyferre/comment-dwim-2 (set-exec-path-from-shell-PATH) #+END_SRC + +** Reload dir-locals.el + +#+BEGIN_SRC emacs-lisp +(defun myrmi/reload-dir-locals-for-current-buffer () + "Reload dir locals for the current buffer" + (interactive) + (let ((enable-local-variables :all)) + (hack-dir-local-variables-non-file-buffer))) + +(defun myrmi/reload-dir-locals-for-all-buffers-in-this-directory () + "For every buffer with the same `default-directory` as the + current buffer, reload dir-locals." + (interactive) + (let ((dir default-directory)) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when (equal default-directory dir) + (myrmi/reload-dir-locals-for-current-buffer)))))) +#+END_SRC From f44190a45d0ca5a25241182a0fe670efda7424fa Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 15 Sep 2024 17:47:30 +0200 Subject: [PATCH 164/280] ELISP: add demos to describe-function It saves me some extra googling. --- config_new.org | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/config_new.org b/config_new.org index f6f9247..4747938 100644 --- a/config_new.org +++ b/config_new.org @@ -589,6 +589,18 @@ https://github.com/remyferre/comment-dwim-2 ) #+END_SRC +* Elisp + +** Add demos to describe-function + +#+BEGIN_SRC emacs-lisp +(use-package elisp-demos + :ensure t + :config + (advice-add 'describe-function-1 :after #'elisp-demos-advice-describe-function-1) + ) +#+END_SRC + * Custom ** Save symbol at point From 9d84faf97a55f81ca4f58d6cb2c40f9f07d9aff4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 15 Sep 2024 19:40:21 +0200 Subject: [PATCH 165/280] ADD custom visit/reload config functions --- config_new.org | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/config_new.org b/config_new.org index 4747938..b5d6d45 100644 --- a/config_new.org +++ b/config_new.org @@ -667,3 +667,20 @@ https://github.com/remyferre/comment-dwim-2 (when (equal default-directory dir) (myrmi/reload-dir-locals-for-current-buffer)))))) #+END_SRC + +** Visit/reload config + +These snippets assume my-config-file variable is set outside this configuration. +This should normally be done by the init.el to load this configuration. + +#+BEGIN_SRC emacs-lisp +(defun myrmi/visit-config () + "Reloads ~/.emacs.d/config.org at runtime" + (interactive) + (find-file my-config-file)) + +(defun myrmi/reload-config () + "Reloads ~/.emacs.d/config.org at runtime" + (interactive) + (org-babel-load-file my-config-file)) +#+END_SRC From f121ec0330da1929c07ccea7939309ba013a624b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 17 Sep 2024 20:55:04 +0200 Subject: [PATCH 166/280] REMOVE smartparens Replaced with electric-pair mode, good enough for my usecase. Don't need all the fancy stuff smartparens provides --- config_new.org | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/config_new.org b/config_new.org index b5d6d45..4196378 100644 --- a/config_new.org +++ b/config_new.org @@ -530,22 +530,6 @@ Magit depends on this and it seems it's not installed as a dependency, so instal ) #+END_SRC -** Smartparens -Smart minor-mode to deal with pairs. - -https://github.com/Fuco1/smartparens - -#+BEGIN_SRC emacs-lisp -(use-package smartparens - :ensure t - :bind - ("C-M-w" . sp-copy-sexp) - :hook (prog-mode text-mode markdown-mode) - :config - (require 'smartparens-config) -) -#+END_SRC - * Multiple cursors #+BEGIN_SRC emacs-lisp From 2c29e771325c2c89730d1f717ab92092325d7451 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 19 Sep 2024 22:44:13 +0200 Subject: [PATCH 167/280] ADD dumb-jump mode Add it immediatelly to the list of xref backends. --- config_new.org | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/config_new.org b/config_new.org index 4196378..a6901a2 100644 --- a/config_new.org +++ b/config_new.org @@ -530,6 +530,16 @@ Magit depends on this and it seems it's not installed as a dependency, so instal ) #+END_SRC +** Dumb-jump + +#+BEGIN_SRC emacs-lisp + (use-package dumb-jump + :ensure t + :init + (add-hook 'xref-backend-functions #'dumb-jump-xref-activate) + ) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From 0482e48c7fec99cc0793915ecdf38679fa543731 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 19 Sep 2024 22:44:41 +0200 Subject: [PATCH 168/280] Ensure eglot does not take full control of Xref Eglot by default will take full control of xref and make the xref-backend-functions (eglot-xref-backend t) . To have dumb-jump as backup if eglot would fail, instruct eglot to stay out of Xref and add/remove eglot xref backend manually. --- config_new.org | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/config_new.org b/config_new.org index a6901a2..91dda14 100644 --- a/config_new.org +++ b/config_new.org @@ -484,19 +484,17 @@ Install and wait for hydra to be available since we are using it in this init.el ** Eglot #+BEGIN_SRC emacs-lisp -(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) -) -#+END_SRC + (use-package eglot + :ensure t + ) -Workaround to enable eglot in all programming modes: -#+BEGIN_SRC emacs-lisp -(add-hook 'prog-mode-hook 'eglot-ensure) + (setq eglot-stay-out-of '(xref)) + (add-hook 'prog-mode-hook 'eglot-ensure) + (add-hook 'eglot-managed-mode-hook (lambda () + (if (eglot-managed-p) + (add-hook 'xref-backend-functions 'eglot-xref-backend) + (remove-hook 'xref-backend-functions 'eglot-xref-backend) + ))) #+END_SRC ** Yasnippet From ee7073ea67b013019c785cdc8a57a04166003360 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 19 Sep 2024 22:46:14 +0200 Subject: [PATCH 169/280] ADD Yasnippet hook to prog- and org-mode --- config_new.org | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config_new.org b/config_new.org index 91dda14..4c0966d 100644 --- a/config_new.org +++ b/config_new.org @@ -497,14 +497,17 @@ Install and wait for hydra to be available since we are using it in this init.el ))) #+END_SRC + ** Yasnippet #+BEGIN_SRC emacs-lisp (use-package yasnippet :ensure t + :hook + (prog-mode . yas-minor-mode) + (org-mode . yas-minor-mode) :config (yas-reload-all) - (add-hook 'prog-mode-hook 'yas-minor-mode) ) #+END_SRC From 8732e361600e8ff50d7000511a98d1c9940999d8 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 19 Sep 2024 22:47:48 +0200 Subject: [PATCH 170/280] PROJECTILE: Don't set indexing method This can be forced through .dir.locals.el if necessary. Leave it at default value (alien). --- config_new.org | 1 - 1 file changed, 1 deletion(-) diff --git a/config_new.org b/config_new.org index 4c0966d..52951b8 100644 --- a/config_new.org +++ b/config_new.org @@ -575,7 +575,6 @@ https://github.com/remyferre/comment-dwim-2 (use-package projectile :ensure t :config - (setq projectile-indexing-method 'hybrid) (setq projectile-enable-caching t) (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) (projectile-mode +1) From 8b3f426ae147d7b10f29485c8a9e1db9833cc354 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 10:08:45 +0200 Subject: [PATCH 171/280] ADD markdown-mode --- config_new.org | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config_new.org b/config_new.org index 52951b8..a105850 100644 --- a/config_new.org +++ b/config_new.org @@ -497,6 +497,13 @@ Install and wait for hydra to be available since we are using it in this init.el ))) #+END_SRC +** Markdown-mode + +#+BEGIN_SRC emacs-lisp +(use-package markdown-mode + :ensure t +) +#+END_SRC ** Yasnippet From c748fb94c4122ce5ddec48e395e8dcf5d0c24de9 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 10:09:13 +0200 Subject: [PATCH 172/280] ADD treesitter-mode for C --- config_new.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config_new.org b/config_new.org index a105850..a68be07 100644 --- a/config_new.org +++ b/config_new.org @@ -548,6 +548,14 @@ Magit depends on this and it seems it's not installed as a dependency, so instal ) #+END_SRC +** C-programming + +*** Tree-sitter + +#+BEGIN_SRC emacs-lisp +(add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode)) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From 69010af86e84d20710cea13e5b70365248c19314 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 18:35:15 +0200 Subject: [PATCH 173/280] INIT: Fix config file name for myrmi/{visit,reload}-config --- init.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/init.el b/init.el index 4a3164f..bd22fe2 100644 --- a/init.el +++ b/init.el @@ -5,11 +5,10 @@ ;;; ... (let ((gc-cons-threshold most-positive-fixnum)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. - (defvar config-file (expand-file-name "config_new.org" user-emacs-directory)) - ;;(defvar project-file (expand-file-name "project.org" user-emacs-directory)) + (defvar my-config-file (expand-file-name "config_new.org" user-emacs-directory)) - (when (file-readable-p config-file) - (org-babel-load-file (expand-file-name config-file))) + (when (file-readable-p my-config-file) + (org-babel-load-file (expand-file-name my-config-file))) ;; If it exists, load some project-specific configurations. ;;(when (file-readable-p project-file) From cdcd5779395fd75e7f5158ce73715767567b75c0 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 18:35:37 +0200 Subject: [PATCH 174/280] INIT: Move customization to its own file that we can ignore --- .gitignore | 1 + init.el | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ea8f90 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +custom.el diff --git a/init.el b/init.el index bd22fe2..2676b28 100644 --- a/init.el +++ b/init.el @@ -4,13 +4,12 @@ ;;; https://jonnay.github.io/emagicians-starter-kit/Emagician-Base.html ;;; ... (let ((gc-cons-threshold most-positive-fixnum)) + (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. (defvar my-config-file (expand-file-name "config_new.org" user-emacs-directory)) (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) - ;; If it exists, load some project-specific configurations. - ;;(when (file-readable-p project-file) - ;; (org-babel-load-file (expand-file-name project-file))) + (load custom-file) ) From f1eed76f1ba039cd7128f3376f59de4ee5806972 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 18:36:22 +0200 Subject: [PATCH 175/280] SNIPPET: Add c-define snippet --- snippets/c-mode/define | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 snippets/c-mode/define diff --git a/snippets/c-mode/define b/snippets/c-mode/define new file mode 100644 index 0000000..eb89c4a --- /dev/null +++ b/snippets/c-mode/define @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# name: Make a define +# key: def +# -- + +#define ${1:mydefine$(upcase yas-text)} $2 From 1449ae0e5f1fc955babea40850f9ac67ecb30686 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 18:37:12 +0200 Subject: [PATCH 176/280] SNIPPET: Add org source-code-block snippet --- snippets/org-mode/emacs-lisp-source-block | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 snippets/org-mode/emacs-lisp-source-block diff --git a/snippets/org-mode/emacs-lisp-source-block b/snippets/org-mode/emacs-lisp-source-block new file mode 100644 index 0000000..c0d946b --- /dev/null +++ b/snippets/org-mode/emacs-lisp-source-block @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: Lisp source code block +# key: se> +# -- + +#+BEGIN_SRC emacs-lisp +#+END_SRC From 752734c381e7fbf0a7d4a0f1a549e6ce994b6d2f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 18:37:22 +0200 Subject: [PATCH 177/280] SNIPPET: Add git-commit message template --- snippets/text-mode/git-commit-message-before-after | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 snippets/text-mode/git-commit-message-before-after diff --git a/snippets/text-mode/git-commit-message-before-after b/snippets/text-mode/git-commit-message-before-after new file mode 100644 index 0000000..983e180 --- /dev/null +++ b/snippets/text-mode/git-commit-message-before-after @@ -0,0 +1,10 @@ +# -*- mode: snippet -*- +# name: Git commit message template +# key: bac +# -- + +Before this commit, +${1} + +After this commit, +${2} From 31da5498b610e723a71900b38ef829bd2c91211d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 11:16:05 +0200 Subject: [PATCH 178/280] SNIPPETS: Fix org mode lisp source block snippet + add general source block --- snippets/org-mode/emacs-lisp-source-block | 2 +- snippets/org-mode/source_block_emacs | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 snippets/org-mode/source_block_emacs diff --git a/snippets/org-mode/emacs-lisp-source-block b/snippets/org-mode/emacs-lisp-source-block index c0d946b..5909c42 100644 --- a/snippets/org-mode/emacs-lisp-source-block +++ b/snippets/org-mode/emacs-lisp-source-block @@ -1,6 +1,6 @@ # -*- mode: snippet -*- # name: Lisp source code block -# key: se> +# key: s> # -- #+BEGIN_SRC emacs-lisp diff --git a/snippets/org-mode/source_block_emacs b/snippets/org-mode/source_block_emacs new file mode 100644 index 0000000..98bfd6f --- /dev/null +++ b/snippets/org-mode/source_block_emacs @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: Start emacs source block +# key: se> +# -- + +#+BEGIN_SRC emacs-lisp +#+END_SRC From 091b5fbda2a9953e69b4153229eceffc68056c22 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 11:17:30 +0200 Subject: [PATCH 179/280] GENERAL: Enable delete-selection-mode --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index a68be07..b48f483 100644 --- a/config_new.org +++ b/config_new.org @@ -385,6 +385,12 @@ Look into customizing the 'ispell' group. (add-hook 'prog-mode-hook 'flyspell-prog-mode) #+end_src +** Delete selection mode + +#+BEGIN_SRC emacs-lisp +(delete-selection-mode t) +#+END_SRC + * Dired #+begin_src emacs-lisp From 6f306b4ea51ad6c701a2696f9c0e1e3c03cb7ee8 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 11:26:12 +0200 Subject: [PATCH 180/280] Add "Enable disabled commands" section Enable narrow functions cause they're really handy. --- config_new.org | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/config_new.org b/config_new.org index b48f483..b329034 100644 --- a/config_new.org +++ b/config_new.org @@ -391,6 +391,16 @@ Look into customizing the 'ispell' group. (delete-selection-mode t) #+END_SRC +** Enable disabled commands + +Some commands are disabled to protect the user. +Narrow-region/page is a really handy feature, enable it: + +#+BEGIN_SRC emacs-lisp +(put 'narrow-to-page 'disabled nil) +(put 'narrow-to-region 'disabled nil) +#+END_SRC + * Dired #+begin_src emacs-lisp From 012e96051096f337035ff8cdbd194ac6b81c968f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 11:44:09 +0200 Subject: [PATCH 181/280] COMPILATION: goto end of buffer on completion --- config_new.org | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/config_new.org b/config_new.org index b329034..2f066d7 100644 --- a/config_new.org +++ b/config_new.org @@ -572,6 +572,21 @@ Magit depends on this and it seems it's not installed as a dependency, so instal (add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode)) #+END_SRC +** Compilation + +*** Goto end of buffer on completion + +Compilation output is almost always bigger than a normal buffer. +Move to the end if the compilation finishes. + +#+BEGIN_SRC emacs-lisp +(defun goto-end-compilation-buffer (comp-buffer msg) + (goto-char (point-max)) + ) + +(add-hook 'compilation-finish-functions #'goto-end-compilation-buffer) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From 6e52096e2d7cb214dec17b32a23b656b1f9bb57b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 11:48:43 +0200 Subject: [PATCH 182/280] Only load custom file if it exists --- init.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/init.el b/init.el index 2676b28..2ee5b47 100644 --- a/init.el +++ b/init.el @@ -11,5 +11,6 @@ (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) - (load custom-file) + (when (file-readable-p custom-file) + (load custom-file)) ) From 1b6619a978d0e6034cfea5ad2ba5e87472c82f28 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:18:32 +0200 Subject: [PATCH 183/280] USE_PACKAGE: always set ':ensure t' by default --- config_new.org | 123 +++++++++++++++++++++++-------------------------- 1 file changed, 57 insertions(+), 66 deletions(-) diff --git a/config_new.org b/config_new.org index 2f066d7..5245488 100644 --- a/config_new.org +++ b/config_new.org @@ -62,7 +62,6 @@ #+BEGIN_SRC emacs-lisp ;; Enable vertico (use-package vertico - :ensure t ;; :custom ;; (vertico-scroll-margin 0) ;; Different scroll margin ;; (vertico-count 20) ;; Show more candidates @@ -76,7 +75,6 @@ #+BEGIN_SRC emacs-lisp (use-package consult - :ensure t ;; Replace bindings. Lazily loaded by `use-package'. :bind (;; C-c bindings in `mode-specific-map' ;; ("C-c M-x" . consult-mode-command) @@ -186,55 +184,53 @@ ** Corfu #+BEGIN_SRC emacs-lisp - (use-package corfu - :ensure t - ;; Optional customizations - ;; :custom - ;; (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' - ;; (corfu-auto t) ;; Enable auto completion - ;; (corfu-separator ?\s) ;; Orderless field separator - ;; (corfu-quit-at-boundary nil) ;; Never quit at completion boundary - ;; (corfu-quit-no-match nil) ;; Never quit, even if there is no match - ;; (corfu-preview-current nil) ;; Disable current candidate preview - ;; (corfu-preselect 'prompt) ;; Preselect the prompt - ;; (corfu-on-exact-match nil) ;; Configure handling of exact matches - ;; (corfu-scroll-margin 5) ;; Use scroll margin +(use-package corfu + ;; Optional customizations + ;; :custom + ;; (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' + ;; (corfu-auto t) ;; Enable auto completion + ;; (corfu-separator ?\s) ;; Orderless field separator + ;; (corfu-quit-at-boundary nil) ;; Never quit at completion boundary + ;; (corfu-quit-no-match nil) ;; Never quit, even if there is no match + ;; (corfu-preview-current nil) ;; Disable current candidate preview + ;; (corfu-preselect 'prompt) ;; Preselect the prompt + ;; (corfu-on-exact-match nil) ;; Configure handling of exact matches + ;; (corfu-scroll-margin 5) ;; Use scroll margin - ;; Enable Corfu only for certain modes. See also `global-corfu-modes'. - ;; :hook ((prog-mode . corfu-mode) - ;; (shell-mode . corfu-mode) - ;; (eshell-mode . corfu-mode)) + ;; Enable Corfu only for certain modes. See also `global-corfu-modes'. + ;; :hook ((prog-mode . corfu-mode) + ;; (shell-mode . corfu-mode) + ;; (eshell-mode . corfu-mode)) - ;; Recommended: Enable Corfu globally. This is recommended since Dabbrev can - ;; be used globally (M-/). See also the customization variable - ;; `global-corfu-modes' to exclude certain modes. - :init - (global-corfu-mode)) + ;; Recommended: Enable Corfu globally. This is recommended since Dabbrev can + ;; be used globally (M-/). See also the customization variable + ;; `global-corfu-modes' to exclude certain modes. + :init + (global-corfu-mode)) #+end_src ** Orderless #+begin_src emacs-lisp - (use-package orderless - :ensure t - :demand t - :custom - (completion-styles '(orderless basic)) - ;; (gnus-completion-styles '(orderless substring basic)) - ;; (completion-category-overrides '((file (styles basic partial-completion)))) +(use-package orderless + :demand t + :custom + (completion-styles '(orderless basic)) + ;; (gnus-completion-styles '(orderless substring basic)) + ;; (completion-category-overrides '((file (styles basic partial-completion)))) - ;; Below not necessary if using vertico - ;; (completion-category-overrides '( - ;; (command (styles orderless basic partial-completion)) - ;; (file (styles orderless basic partial-completion)) - ;;;; (buffer (styles orderless basic)) - ;; (variable (styles orderless basic)) - ;; (symbol (styles orderless basic)) - ;; (consult-location (styles orderless)) - ;; (consult-multi (styles orderless)) - ;; ) - ;; ) - ) +;; Below not necessary if using vertico +;; (completion-category-overrides '( +;; (command (styles orderless basic partial-completion)) +;; (file (styles orderless basic partial-completion)) +;;;; (buffer (styles orderless basic)) +;; (variable (styles orderless basic)) +;; (symbol (styles orderless basic)) +;; (consult-location (styles orderless)) +;; (consult-multi (styles orderless)) +;; ) +;; ) +) #+end_src ** Marginalia @@ -242,7 +238,6 @@ #+begin_src emacs-lisp ;; Enable rich annotations using the Marginalia package (use-package marginalia - :ensure t ;; Bind `marginalia-cycle' locally in the minibuffer. To make the binding ;; available in the *Completions* buffer, add it to the ;; `completion-list-mode-map'. @@ -251,7 +246,6 @@ ;; The :init section is always executed. :init - ;; Marginalia must be activated in the :init section of use-package such that ;; the mode gets enabled right away. Note that this forces loading the ;; package. @@ -401,6 +395,15 @@ Narrow-region/page is a really handy feature, enable it: (put 'narrow-to-region 'disabled nil) #+END_SRC +** Use-package + +*** Always ensure + +#+BEGIN_SRC emacs-lisp +(require 'use-package-ensure) +(setq use-package-always-ensure t) +#+END_SRC + * Dired #+begin_src emacs-lisp @@ -416,7 +419,7 @@ Operate on the current line if no region is active. #+begin_src emacs-lisp (use-package whole-line-or-region - :ensure t + :config (whole-line-or-region-global-mode 1) ) @@ -454,7 +457,7 @@ For the keybindings, we have to defien them in both raw and line mode. From the #+BEGIN_SRC emacs-lisp (use-package monokai-theme - :ensure t + :init (load-theme 'monokai t) ) @@ -464,7 +467,6 @@ For the keybindings, we have to defien them in both raw and line mode. From the #+begin_src emacs-lisp (use-package dashboard - :ensure t :config (add-hook 'elpaca-after-init-hook #'dashboard-insert-startupify-lists) (add-hook 'elpaca-after-init-hook #'dashboard-initialize) @@ -500,9 +502,7 @@ Install and wait for hydra to be available since we are using it in this init.el ** Eglot #+BEGIN_SRC emacs-lisp - (use-package eglot - :ensure t - ) + (use-package eglot) (setq eglot-stay-out-of '(xref)) (add-hook 'prog-mode-hook 'eglot-ensure) @@ -516,16 +516,14 @@ Install and wait for hydra to be available since we are using it in this init.el ** Markdown-mode #+BEGIN_SRC emacs-lisp -(use-package markdown-mode - :ensure t -) +(use-package markdown-mode) + #+END_SRC ** Yasnippet #+BEGIN_SRC emacs-lisp (use-package yasnippet - :ensure t :hook (prog-mode . yas-minor-mode) (org-mode . yas-minor-mode) @@ -541,24 +539,20 @@ Install and wait for hydra to be available since we are using it in this init.el Magit depends on this and it seems it's not installed as a dependency, so install it explicitly. #+BEGIN_SRC emacs-lisp -(use-package transient - :ensure t - ) +(use-package transient) #+END_SRC *** Core #+BEGIN_SRC emacs-lisp -(use-package magit - :ensure t -) +(use-package magit) + #+END_SRC ** Dumb-jump #+BEGIN_SRC emacs-lisp (use-package dumb-jump - :ensure t :init (add-hook 'xref-backend-functions #'dumb-jump-xref-activate) ) @@ -591,7 +585,6 @@ Move to the end if the compilation finishes. #+BEGIN_SRC emacs-lisp (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) @@ -609,7 +602,6 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package comment-dwim-2 - :ensure t :config (global-set-key (kbd "M-;") 'comment-dwim-2) ) @@ -619,7 +611,6 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package projectile - :ensure t :config (setq projectile-enable-caching t) (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) @@ -635,7 +626,7 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package elisp-demos - :ensure t + :config (advice-add 'describe-function-1 :after #'elisp-demos-advice-describe-function-1) ) From 074c5fe0b1696680e28b5d6ea41236324b1889bd Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:19:06 +0200 Subject: [PATCH 184/280] ADD Org mode settings from old config - Enable Super/sub-scripts - Preserve indentation - Org bullets --- config_new.org | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/config_new.org b/config_new.org index 5245488..0774e54 100644 --- a/config_new.org +++ b/config_new.org @@ -620,13 +620,41 @@ https://github.com/remyferre/comment-dwim-2 ) #+END_SRC +* Org + +** General config +*** Super/Sub-scripts + +Use ={}= for subscripting: + +https://orgmode.org/manual/Subscripts-and-superscripts.html + +#+BEGIN_SRC emacs-lisp +(setq org-use-sub-superscripts '{}) +#+END_SRC + +*** Indentation + +Preserve indentation in SRC blocks + +#+BEGIN_SRC emacs-lisp +(setq org-src-preserve-indentation t) +#+END_SRC + +** Org bullets + +#+BEGIN_SRC emacs-lisp +(use-package org-bullets + :config + (add-hook 'org-mode-hook (lambda () (org-bullets-mode)))) +#+END_SRC + * Elisp ** Add demos to describe-function #+BEGIN_SRC emacs-lisp (use-package elisp-demos - :config (advice-add 'describe-function-1 :after #'elisp-demos-advice-describe-function-1) ) From e02a1990aac09ddfd67e184a961fbf2e8fb1d373 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:19:24 +0200 Subject: [PATCH 185/280] ADD Zygospore from old config It's too usefull not to have --- config_new.org | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/config_new.org b/config_new.org index 0774e54..5b85570 100644 --- a/config_new.org +++ b/config_new.org @@ -492,6 +492,20 @@ Install and wait for hydra to be available since we are using it in this init.el ) #+end_src +* Zygospore + +Revert =C-x 1= by pressing =C-x 1= again: +[[https://github.com/louiskottmann/zygospore.el]] + +FYI: At one point, used this together with sr-speedbar. They did not play well together... + +#+BEGIN_SRC emacs-lisp +(use-package zygospore + :config + (global-set-key (kbd "C-x 1") 'zygospore-toggle-delete-other-windows) +) +#+END_SRC + * Programming ** Electric pair From 122f1f51865675ef3d200af377258298a5a147b9 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:19:48 +0200 Subject: [PATCH 186/280] ADD Iedit from old config It's too usefull not to have --- config_new.org | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config_new.org b/config_new.org index 5b85570..78c1d6b 100644 --- a/config_new.org +++ b/config_new.org @@ -506,6 +506,17 @@ FYI: At one point, used this together with sr-speedbar. They did not play well t ) #+END_SRC +* Iedit + +Highlight occurences of symbol and replace them simultanously. +Shortkey: =C-;= + +https://github.com/victorhge/iedit + +#+BEGIN_SRC emacs-lisp +(use-package iedit) +#+END_SRC + * Programming ** Electric pair From d757ce44a819506691a9f97d08fe28f963dd4e9c Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:51:57 +0200 Subject: [PATCH 187/280] GENERAL: Move general config first before vertico stack This fixes the init error on vertico stack symbols not being known due to ':ensure' being removed since it should be enabled by default but this was only done later in the 'general config' section. --- config_new.org | 305 +++++++++++++++++++++++++------------------------ 1 file changed, 153 insertions(+), 152 deletions(-) diff --git a/config_new.org b/config_new.org index 78c1d6b..e4d24d6 100644 --- a/config_new.org +++ b/config_new.org @@ -55,6 +55,159 @@ ) #+end_src +* General config + +** Delete trailing whitespaces + +#+BEGIN_SRC emacs-lisp +(add-hook 'before-save-hook 'delete-trailing-whitespace) +#+END_SRC + +** Save history and recent files + +#+begin_src emacs-lisp +;; The built-in `savehist-mode' saves minibuffer histories. Vertico +;; can then use that information to put recently selected options at +;; the top. +;; +;; Further reading: https://protesilaos.com/emacs/dotemacs#h:25765797-27a5-431e-8aa4-cc890a6a913a +(savehist-mode 1) + +;; The built-in `recentf-mode' keeps track of recently visited files. +;; You can then access those through the `consult-buffer' interface or +;; with `recentf-open'/`recentf-open-files'. +;; +;; I do not use this facility, because the files I care about are +;; either in projects or are bookmarked. +(recentf-mode 1) +#+end_src + +** Backups + +#+BEGIN_SRC emacs-lisp +(defvar myrmi-backup-directory (concat user-emacs-directory "backups")) +(if (not (file-exists-p myrmi-backup-directory)) + (make-directory myrmi-backup-directory t) + ) +(setq backup-directory-alist `(("." . ,myrmi-backup-directory))) +(setq make-backup-files t + backup-by-copying t + version-control t + delete-old-versions t + delete-by-moving-to-trash t + kept-old-versions 6 + kept-new-versions 9 + auto-save-default t + auto-save-timeout 20 + auto-save-interval 200 + ) +#+END_SRC + +** Yes-or-no + +Because I'm lazy, important yes-or-no questions can be answered with y-or-n: +#+begin_src emacs-lisp +(defalias 'yes-or-no-p 'y-or-n-p) +#+end_src + +** Switch windows + +#+begin_src emacs-lisp +(global-set-key (kbd "M-o") 'other-window) +#+end_src + +** Maximize at startup + +More info : https://www.emacswiki.org/emacs/FullScreen + +#+begin_src emacs-lisp +(push '(fullscreen . maximized) default-frame-alist) +#+end_src + +** ibuffer + +Use list-buffers bigger brother. +#+begin_src emacs-lisp +(global-set-key [remap list-buffers] 'ibuffer) +#+end_src + +** Mark + +#+begin_src emacs-lisp +(global-set-key (kbd "M-SPC") 'mark-word) +#+end_src + +** Isearch + +Display number of matches: +#+begin_src emacs-lisp +(setq-default isearch-lazy-count t) +#+end_src + +Reference that might be interesting for later: +https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html + +** Sudo file + +#+begin_src emacs-lisp +(defun sudo () + "Use TRAMP to `sudo' the current buffer." + (interactive) + (when buffer-file-name + (find-alternate-file + (concat "/sudo:root@localhost:" + buffer-file-name) + ) + ) +) +#+end_src + +** Abbrev + +#+begin_src emacs-lisp +(global-set-key [remap dabbrev-expand] 'hippie-expand) +#+end_src + +** Zap + +#+begin_src emacs-lisp +(global-set-key (kbd "M-S-z") 'zap-up-to-char) +#+end_src + +** Spell checking + +Look into customizing the 'ispell' group. + +#+begin_src emacs-lisp +(add-hook 'prog-mode-hook 'flyspell-prog-mode) +#+end_src + +** Delete selection mode + +#+BEGIN_SRC emacs-lisp +(delete-selection-mode t) +#+END_SRC + +** Enable disabled commands + +Some commands are disabled to protect the user. +Narrow-region/page is a really handy feature, enable it: + +#+BEGIN_SRC emacs-lisp +(put 'narrow-to-page 'disabled nil) +(put 'narrow-to-region 'disabled nil) +#+END_SRC + +** Use-package + +*** Always ensure + +#+BEGIN_SRC emacs-lisp +(require 'use-package-ensure) +(setq use-package-always-ensure t) +#+END_SRC + +** Adaptive cursor width * Vertico-stack ** Vertico @@ -252,158 +405,6 @@ (marginalia-mode)) #+end_src -* General config - -** Delete trailing whitespaces - -#+BEGIN_SRC emacs-lisp -(add-hook 'before-save-hook 'delete-trailing-whitespace) -#+END_SRC - -** Save history and recent files - -#+begin_src emacs-lisp -;; The built-in `savehist-mode' saves minibuffer histories. Vertico -;; can then use that information to put recently selected options at -;; the top. -;; -;; Further reading: https://protesilaos.com/emacs/dotemacs#h:25765797-27a5-431e-8aa4-cc890a6a913a -(savehist-mode 1) - -;; The built-in `recentf-mode' keeps track of recently visited files. -;; You can then access those through the `consult-buffer' interface or -;; with `recentf-open'/`recentf-open-files'. -;; -;; I do not use this facility, because the files I care about are -;; either in projects or are bookmarked. -(recentf-mode 1) -#+end_src - -** Backups - -#+BEGIN_SRC emacs-lisp -(defvar myrmi-backup-directory (concat user-emacs-directory "backups")) -(if (not (file-exists-p myrmi-backup-directory)) - (make-directory myrmi-backup-directory t) - ) -(setq backup-directory-alist `(("." . ,myrmi-backup-directory))) -(setq make-backup-files t - backup-by-copying t - version-control t - delete-old-versions t - delete-by-moving-to-trash t - kept-old-versions 6 - kept-new-versions 9 - auto-save-default t - auto-save-timeout 20 - auto-save-interval 200 - ) -#+END_SRC - -** Yes-or-no - -Because I'm lazy, important yes-or-no questions can be answered with y-or-n: -#+begin_src emacs-lisp -(defalias 'yes-or-no-p 'y-or-n-p) -#+end_src - -** Switch windows - -#+begin_src emacs-lisp -(global-set-key (kbd "M-o") 'other-window) -#+end_src - -** Maximize at startup - -More info : https://www.emacswiki.org/emacs/FullScreen - -#+begin_src emacs-lisp -(push '(fullscreen . maximized) default-frame-alist) -#+end_src - -** ibuffer - -Use list-buffers bigger brother. -#+begin_src emacs-lisp -(global-set-key [remap list-buffers] 'ibuffer) -#+end_src - -** Mark - -#+begin_src emacs-lisp -(global-set-key (kbd "M-SPC") 'mark-word) -#+end_src - -** Isearch - -Display number of matches: -#+begin_src emacs-lisp -(setq-default isearch-lazy-count t) -#+end_src - -Reference that might be interesting for later: -https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html - -** Sudo file - -#+begin_src emacs-lisp -(defun sudo () - "Use TRAMP to `sudo' the current buffer." - (interactive) - (when buffer-file-name - (find-alternate-file - (concat "/sudo:root@localhost:" - buffer-file-name) - ) - ) -) -#+end_src - -** Abbrev - -#+begin_src emacs-lisp -(global-set-key [remap dabbrev-expand] 'hippie-expand) -#+end_src - -** Zap - -#+begin_src emacs-lisp -(global-set-key (kbd "M-S-z") 'zap-up-to-char) -#+end_src - -** Spell checking - -Look into customizing the 'ispell' group. - -#+begin_src emacs-lisp -(add-hook 'prog-mode-hook 'flyspell-prog-mode) -#+end_src - -** Delete selection mode - -#+BEGIN_SRC emacs-lisp -(delete-selection-mode t) -#+END_SRC - -** Enable disabled commands - -Some commands are disabled to protect the user. -Narrow-region/page is a really handy feature, enable it: - -#+BEGIN_SRC emacs-lisp -(put 'narrow-to-page 'disabled nil) -(put 'narrow-to-region 'disabled nil) -#+END_SRC - -** Use-package - -*** Always ensure - -#+BEGIN_SRC emacs-lisp -(require 'use-package-ensure) -(setq use-package-always-ensure t) -#+END_SRC - * Dired #+begin_src emacs-lisp From f6c14e7caaf7e111c19a662ba0772f910994e28a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:52:43 +0200 Subject: [PATCH 188/280] GENERAL: Add adaptive cursor width --- config_new.org | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config_new.org b/config_new.org index e4d24d6..a070af1 100644 --- a/config_new.org +++ b/config_new.org @@ -208,6 +208,13 @@ Narrow-region/page is a really handy feature, enable it: #+END_SRC ** Adaptive cursor width + +Make cursor the width of the character it is under f.e. full width of a tab. + +#+BEGIN_SRC emacs-lisp +(setq x-stretch-cursor t) +#+END_SRC + * Vertico-stack ** Vertico From 2be3a79aed9d452c3ceaa877b7a5e702fa42ebdb Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 23 Sep 2024 16:22:11 +0200 Subject: [PATCH 189/280] CORFU: Enable automatic completion in buffer Also cycle if we reach begin/end of list of candidates. --- config_new.org | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config_new.org b/config_new.org index a070af1..3b57a67 100644 --- a/config_new.org +++ b/config_new.org @@ -346,9 +346,9 @@ Make cursor the width of the character it is under f.e. full width of a tab. #+BEGIN_SRC emacs-lisp (use-package corfu ;; Optional customizations - ;; :custom - ;; (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' - ;; (corfu-auto t) ;; Enable auto completion + :custom + (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' + (corfu-auto t) ;; Enable auto completion ;; (corfu-separator ?\s) ;; Orderless field separator ;; (corfu-quit-at-boundary nil) ;; Never quit at completion boundary ;; (corfu-quit-no-match nil) ;; Never quit, even if there is no match From 539570657720a3115efe678023572723cb54c733 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 23 Sep 2024 16:26:43 +0200 Subject: [PATCH 190/280] ORG_MODE: Fix snippets to place cursor inside source block --- snippets/org-mode/emacs-lisp-source-block | 1 + snippets/org-mode/source_block_emacs | 1 + 2 files changed, 2 insertions(+) diff --git a/snippets/org-mode/emacs-lisp-source-block b/snippets/org-mode/emacs-lisp-source-block index 5909c42..2f90c13 100644 --- a/snippets/org-mode/emacs-lisp-source-block +++ b/snippets/org-mode/emacs-lisp-source-block @@ -4,4 +4,5 @@ # -- #+BEGIN_SRC emacs-lisp +${1} #+END_SRC diff --git a/snippets/org-mode/source_block_emacs b/snippets/org-mode/source_block_emacs index 98bfd6f..73ed1eb 100644 --- a/snippets/org-mode/source_block_emacs +++ b/snippets/org-mode/source_block_emacs @@ -4,4 +4,5 @@ # -- #+BEGIN_SRC emacs-lisp +${1} #+END_SRC From 584a0b1b7cb31ef105320224dd223fddf2bffa81 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 23 Sep 2024 16:27:02 +0200 Subject: [PATCH 191/280] MAGIT: Add example command to update submodules --- config_new.org | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/config_new.org b/config_new.org index 3b57a67..e40e8b3 100644 --- a/config_new.org +++ b/config_new.org @@ -572,16 +572,36 @@ https://github.com/victorhge/iedit Magit depends on this and it seems it's not installed as a dependency, so install it explicitly. #+BEGIN_SRC emacs-lisp -(use-package transient) +(use-package transient + :ensure (:wait t) +) #+END_SRC *** Core #+BEGIN_SRC emacs-lisp -(use-package magit) +(use-package magit +:ensure (:wait t) +) #+END_SRC +**** Extra commands + +***** Update all submodules + +#+BEGIN_SRC emacs-lisp +(transient-define-suffix magit-submodule-update-all () + "Update all submodules" + :description "Update All git submodule update --init --recursive" + (interactive) + (magit-with-toplevel + (magit-run-git-async "submodule" "update" "--force"))) + +(transient-append-suffix 'magit-submodule "f" + '("U" magit-submodule-update-all)) +#+END_SRC + ** Dumb-jump #+BEGIN_SRC emacs-lisp From 5ef08b39b658e61cc8bf3ec63190beb9af6aeeec Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 23 Sep 2024 16:31:10 +0200 Subject: [PATCH 192/280] ADD volatile highlights --- config_new.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config_new.org b/config_new.org index e40e8b3..74af99d 100644 --- a/config_new.org +++ b/config_new.org @@ -647,6 +647,19 @@ Move to the end if the compilation finishes. ) #+END_SRC +* Volatile highlights + +Show/highlight changes when doing undo/yanks/kills/... + +https://github.com/k-talo/volatile-highlights.el + +#+BEGIN_SRC emacs-lisp +(use-package volatile-highlights + :config + (volatile-highlights-mode t) +) +#+END_SRC + * Comment-dwim-2 Replacement for built-in =comment-dwim=, more comment features. From 78afc078ff26793a208fd2221226a5586cda6937 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 23 Sep 2024 16:35:04 +0200 Subject: [PATCH 193/280] GENERAL: Enable column numbers --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index 74af99d..4f8f1e8 100644 --- a/config_new.org +++ b/config_new.org @@ -57,6 +57,12 @@ * General config +** Enable column numbers + +#+BEGIN_SRC emacs-lisp +(setq column-number-mode 1) +#+END_SRC + ** Delete trailing whitespaces #+BEGIN_SRC emacs-lisp From d5f79bf639b40b574eba68ef8a3182e7d13da9b6 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:31:08 +0200 Subject: [PATCH 194/280] ADD angry faces face to major prog modes --- config_new.org | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/config_new.org b/config_new.org index 4f8f1e8..debb4fc 100644 --- a/config_new.org +++ b/config_new.org @@ -533,6 +533,28 @@ https://github.com/victorhge/iedit * Programming +** Angry faces + +#+BEGIN_SRC emacs-lisp +(defface highlight-angry-faces + '( + (default :background "Yellow" :foreground "Red") + ) + "Angry faces highlighting." + :group 'basic-faces +) + +(mapc (lambda (mode) + (font-lock-add-keywords + mode + '( + ("\\<\\(FIXME\\)" 1 'highlight-angry-faces t) + ("\\<\\(TODO\\)" 1 'highlight-angry-faces t) + ))) + '(text-mode emacs-lisp-mode rust-mode zig-mode c-ts-mode c-mode prog-mode) +) +#+END_SRC + ** Electric pair #+BEGIN_SRC emacs-lisp (add-hook 'prog-mode-hook 'electric-pair-mode) From 954196d061579ea8f3f1bcb47c502fa2a7cb8987 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:31:25 +0200 Subject: [PATCH 195/280] ADD rust-mode --- config_new.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config_new.org b/config_new.org index debb4fc..bbc9811 100644 --- a/config_new.org +++ b/config_new.org @@ -662,6 +662,14 @@ Move to the end if the compilation finishes. (add-hook 'compilation-finish-functions #'goto-end-compilation-buffer) #+END_SRC +** Rust + +#+BEGIN_SRC emacs-lisp +(use-package rust-mode + :init + (setq rust-mode-treesitter-derive t)) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From f2cfe8035ca1accfd5af44edcfd6ee4f320817d5 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:31:32 +0200 Subject: [PATCH 196/280] ADD zig mode --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index bbc9811..9ff9041 100644 --- a/config_new.org +++ b/config_new.org @@ -670,6 +670,12 @@ Move to the end if the compilation finishes. (setq rust-mode-treesitter-derive t)) #+END_SRC +** Zig + +#+BEGIN_SRC emacs-lisp +(use-package zig-mode) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From edee35724e51d847cda9e9c92a7033701517851d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:31:37 +0200 Subject: [PATCH 197/280] ADD python mode --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index 9ff9041..330635d 100644 --- a/config_new.org +++ b/config_new.org @@ -676,6 +676,12 @@ Move to the end if the compilation finishes. (use-package zig-mode) #+END_SRC +** Python + +#+BEGIN_SRC emacs-lisp +(use-package python-mode) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From c31bd5ab5b097ca77e18e7c0a94fe87f23fe7238 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:32:27 +0200 Subject: [PATCH 198/280] ADD visible bell --- config_new.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config_new.org b/config_new.org index 330635d..c7ee028 100644 --- a/config_new.org +++ b/config_new.org @@ -57,6 +57,14 @@ * General config +** Bell + +The audible bell is annoying AF. + +#+BEGIN_SRC emacs-lisp +(setq visible-bell 1) +#+END_SRC + ** Enable column numbers #+BEGIN_SRC emacs-lisp From d3f6a04e9bee99bdb1428dd2dc13ee5184e2856b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:37:07 +0200 Subject: [PATCH 199/280] ADD resize-mode --- config_new.org | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/config_new.org b/config_new.org index c7ee028..5633e96 100644 --- a/config_new.org +++ b/config_new.org @@ -229,6 +229,62 @@ Make cursor the width of the character it is under f.e. full width of a tab. (setq x-stretch-cursor t) #+END_SRC +* Resize-mode + +Minor-mode to easily resize frames (works with EXWM (firefox, ...)). +Courtesy goes to kuanyui (https://gist.github.com/kuanyui/65a408d393871048771c): + +#+BEGIN_SRC emacs-lisp +;;; resize-frame.el --- A minor mode to resize frames easily. -*- lexical-binding: t; -*- + +;; Copyright (C) 2014 kuanyui + +;; Author: kuanyui +;; Keywords: frames, tools, convenience +;; License: WTFPL 1.0 + +;;; Commentary: + +;; Press "ESC `" and use arrow-keys or i/j/k/l to adjust frames. press any key to done. + +;;; Code: + +(defvar resize-frame-map + (let ((map (make-keymap))) + (define-key map (kbd "") 'enlarge-window) + (define-key map (kbd "") 'shrink-window) + (define-key map (kbd "") 'enlarge-window-horizontally) + (define-key map (kbd "") 'shrink-window-horizontally) + (set-char-table-range (nth 1 map) t 'resize-frame-done) + (define-key map (kbd "C-p") 'enlarge-window) + (define-key map (kbd "C-n") 'shrink-window) + (define-key map (kbd "C-f") 'enlarge-window-horizontally) + (define-key map (kbd "C-b") 'shrink-window-horizontally) + map)) + +(define-minor-mode resize-frame + "A simple minor mode to resize-frame. +C-c C-c to apply." + ;; The initial value. + :init-value nil + ;; The indicator for the mode line. + :lighter " ResizeFrame" + ;; The minor mode bindings. + :keymap resize-frame-map + :global t + (if (<= (length (window-list)) 1) + (progn (setq resize-frame nil) + (message "Only root frame exists, abort.")) + (message "Use arrow-keys or i/j/k/l to adjust frames."))) + +(defun resize-frame-done () + (interactive) + (setq resize-frame nil) + (message "Done.")) + +(global-set-key (kbd "C-x C-r") 'resize-frame) +#+END_SRC + * Vertico-stack ** Vertico From 55e765911ef76e71cc69b9ec34496d74305da70b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:24:29 +0200 Subject: [PATCH 200/280] Rename Vertico-stack to Completion section --- config_new.org | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/config_new.org b/config_new.org index 5633e96..59c02ef 100644 --- a/config_new.org +++ b/config_new.org @@ -285,9 +285,8 @@ C-c C-c to apply." (global-set-key (kbd "C-x C-r") 'resize-frame) #+END_SRC -* Vertico-stack - -** Vertico +* Completion +** Minibuffer #+BEGIN_SRC emacs-lisp ;; Enable vertico From 4233409d50e835860e3741fbc0ecd452d3e27423 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:27:16 +0200 Subject: [PATCH 201/280] Enable dired-x whenever dired mode is invoked --- config_new.org | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/config_new.org b/config_new.org index 59c02ef..83529a9 100644 --- a/config_new.org +++ b/config_new.org @@ -483,8 +483,20 @@ C-c C-c to apply." * Dired +** Dired-x + #+begin_src emacs-lisp -(require 'dired-x) +(with-eval-after-load 'dired + (require 'dired-x) + ;; Set dired-x global variables here. For example: + ;; (setq dired-x-hands-off-my-keys nil) + )) + +(add-hook 'dired-mode-hook + (lambda () + ;; Set dired-x buffer-local variables here. For example: + ;; (dired-omit-mode 1) + )) #+end_src * Whole-line-or-region From caf08093ddffa08e6c5885e4b2bd378443298cc4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:44:32 +0200 Subject: [PATCH 202/280] ADD eshell plan9/smart-mode settings --- config_new.org | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/config_new.org b/config_new.org index 83529a9..90bcdd7 100644 --- a/config_new.org +++ b/config_new.org @@ -515,6 +515,21 @@ Operate on the current line if no region is active. #+end_src * Terminal +** Eshell +*** Smart mode + +Plan 9 smart terminal features, for more info: +https://www.masteringemacs.org/article/complete-guide-mastering-eshell + +#+BEGIN_SRC emacs-lisp +(require 'eshell) +(require 'em-smart) +(setq eshell-where-to-jump 'begin) +(setq eshell-review-quick-commands nil) +(setq eshell-smart-space-goes-to-end t) + +(add-hook 'eshell-mode-hook 'eshell-smart-initialize) +#+END_SRC ** Toggle between char- and line-mode From cb018ca96b1dea4d2f300521084d14359e404e20 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:47:22 +0200 Subject: [PATCH 203/280] Move config.org to config_old.org This to keep the old settings, you never know. Yeah, I know, it's in git and I can always go back, but it's easier to compare if the file is still in the repo... --- config.org => config_old.org | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename config.org => config_old.org (100%) diff --git a/config.org b/config_old.org similarity index 100% rename from config.org rename to config_old.org From ddc622f270b05a3e6fde0419e162c142d3fa68b5 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:49:14 +0200 Subject: [PATCH 204/280] Move config_new.org to config.org Use it as the main config now. --- config_new.org => config.org | 0 init.el | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename config_new.org => config.org (100%) diff --git a/config_new.org b/config.org similarity index 100% rename from config_new.org rename to config.org diff --git a/init.el b/init.el index 2ee5b47..e442e9c 100644 --- a/init.el +++ b/init.el @@ -6,7 +6,7 @@ (let ((gc-cons-threshold most-positive-fixnum)) (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. - (defvar my-config-file (expand-file-name "config_new.org" user-emacs-directory)) + (defvar my-config-file (expand-file-name "config.org" user-emacs-directory)) (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) From 29f8a2b08bb56c8030e0b521d6faf4631396a173 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:52:36 +0200 Subject: [PATCH 205/280] Update gitignore --- .gitignore | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.gitignore b/.gitignore index 7ea8f90..ea48958 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,21 @@ custom.el +backups +eshell +elpaca + +# projectile +projectile* + +# savehist file +history + +# recentf file +recentf + +session* + +# .org converted files +config*.el + +# Tramp connection file +tramp From 7c39432564d45137eae605851285ae2823807fb3 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 21:00:23 +0200 Subject: [PATCH 206/280] Move sudo to myrmi/sudo-current-buffer It's a new function, use the custom prefix to make that clear. --- config.org | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/config.org b/config.org index 90bcdd7..d2fe38c 100644 --- a/config.org +++ b/config.org @@ -161,21 +161,6 @@ Display number of matches: Reference that might be interesting for later: https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html -** Sudo file - -#+begin_src emacs-lisp -(defun sudo () - "Use TRAMP to `sudo' the current buffer." - (interactive) - (when buffer-file-name - (find-alternate-file - (concat "/sudo:root@localhost:" - buffer-file-name) - ) - ) -) -#+end_src - ** Abbrev #+begin_src emacs-lisp @@ -866,6 +851,22 @@ Preserve indentation in SRC blocks * Custom +** Sudo current buffer + +#+BEGIN_SRC emacs-lisp +(defun myrmi/sudo-current-buffer () + "Use TRAMP to `sudo' the current buffer." + (interactive) + (when buffer-file-name + (find-alternate-file + (concat "/sudo:root@localhost:" + buffer-file-name) + ) + ) +) +#+END_SRC + + ** Save symbol at point #+BEGIN_SRC emacs-lisp From 3c24cac0c12080fa4534a93f439f282d248e1fac Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 22:06:42 +0200 Subject: [PATCH 207/280] DELETE sunrise-commander Not using it, maybe somewhere in the future, I'll re-enable/add it. --- .gitmodules | 3 --- extra/sunrise-commander | 1 - 2 files changed, 4 deletions(-) delete mode 100644 .gitmodules delete mode 160000 extra/sunrise-commander diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index f8db735..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "extra/sunrise-commander"] - path = extra/sunrise-commander - url = https://github.com/escherdragon/sunrise-commander diff --git a/extra/sunrise-commander b/extra/sunrise-commander deleted file mode 160000 index cf8305a..0000000 --- a/extra/sunrise-commander +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cf8305a149a321d028858057e7a7c92f0038a06a From 5ca1559c206aa1087d5d6d10d4256d6d341106a2 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 22:18:01 +0200 Subject: [PATCH 208/280] Move cheat-sheet to inside config.org --- cheat-sheet.txt | 8 -------- config.org | 13 ++++++++++++- 2 files changed, 12 insertions(+), 9 deletions(-) delete mode 100644 cheat-sheet.txt diff --git a/cheat-sheet.txt b/cheat-sheet.txt deleted file mode 100644 index ddd8cdd..0000000 --- a/cheat-sheet.txt +++ /dev/null @@ -1,8 +0,0 @@ -C-M-Space : smartparens wrapping -C-c C-c : calculator (see init.el) -C-h k : lookup key sequence -C-x 0 : close current window -C-q : insert a -M-x (un)tabify : (replace) tabs -M-x describe-bindings : list of all mapped keys/commands -M-p : fill-paragraph, works for doxygen as well diff --git a/config.org b/config.org index aced26d..5d3a693 100644 --- a/config.org +++ b/config.org @@ -866,7 +866,6 @@ Preserve indentation in SRC blocks ) #+END_SRC - ** Save symbol at point #+BEGIN_SRC emacs-lisp @@ -948,3 +947,15 @@ This should normally be done by the init.el to load this configuration. (interactive) (org-babel-load-file my-config-file)) #+END_SRC + +** Tips and Tricks + +*** Cheat-sheet + +| Key | Explanation | +|-----------------------+-----------------------------------------------------------| +| C-h k | Lookup key sequencesmartparens wrapping | +| C-q | Insert quoted/explicitly. F.e. to insert a tab, ... | +| M-x untabify/tabify | Convert to spaces/tabs | +| M-x describe-bindings | List all mapped keys/commands | +| M-q | Fill paragraph | From c5cebd2147edabe9310fea7275c4331f2877746e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 22:22:47 +0200 Subject: [PATCH 209/280] REMOVE logo Img is bloat --- config.org | 1 - img/dash_logo.png | Bin 65349 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100644 img/dash_logo.png diff --git a/config.org b/config.org index 5d3a693..1025829 100644 --- a/config.org +++ b/config.org @@ -2,7 +2,6 @@ #+TITLE: My Emacs #+CREATOR: Laurens Miers #+LANGUAGE: en -[[./img/dash_logo.png]] * Elpaca diff --git a/img/dash_logo.png b/img/dash_logo.png deleted file mode 100644 index bd8c88bef43e593c46d6a03337f85a3275c88d9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65349 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 Cam7mj From 8a5527c2d4347e76c5664602225b976eb9cbb380 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 25 Sep 2024 23:02:26 +0200 Subject: [PATCH 210/280] ADD org-roam + org-roam-ui --- config.org | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/config.org b/config.org index 1025829..9ddf340 100644 --- a/config.org +++ b/config.org @@ -837,6 +837,39 @@ Preserve indentation in SRC blocks (add-hook 'org-mode-hook (lambda () (org-bullets-mode)))) #+END_SRC +** Org Roam + +#+BEGIN_SRC emacs-lisp +(use-package org-roam + :custom + (org-roam-directory "~/projects/notes") + :config + (org-roam-setup) +) + +#+END_SRC + +*** UI + +#+BEGIN_SRC emacs-lisp +(use-package org-roam-ui + :ensure + (:host github :repo "org-roam/org-roam-ui" :branch "main" :files ("*.el" "out")) + :after org-roam +;; normally we'd recommend hooking orui after org-roam, but since org-roam does not have +;; a hookable mode anymore, you're advised to pick something yourself +;; if you don't care about startup time, use +;; :hook (after-init . org-roam-ui-mode) + :config + (setq org-roam-ui-sync-theme t + org-roam-ui-follow t + org-roam-ui-update-on-save t + org-roam-ui-open-on-start t) + ;; Start UI + ;; (org-roam-ui-mode) + ) +#+END_SRC + * Elisp ** Add demos to describe-function From 61273748883b504f4ed9ffd47aff30079a0f6a85 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:18:04 +0200 Subject: [PATCH 211/280] ORG_ROAM: Add completion everywhere That way, when we type a part of the note name, we get an automatic link/insert of the node. --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 9ddf340..441286c 100644 --- a/config.org +++ b/config.org @@ -843,10 +843,10 @@ Preserve indentation in SRC blocks (use-package org-roam :custom (org-roam-directory "~/projects/notes") + (org-roam-completion-everywhere t) :config (org-roam-setup) ) - #+END_SRC *** UI From bbffcd8d2bcfbbe1b4a42b7fe04f8f0fe3fb5f46 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:21:11 +0200 Subject: [PATCH 212/280] DIRED: Add guessing of target directory --- config.org | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config.org b/config.org index 441286c..40aefce 100644 --- a/config.org +++ b/config.org @@ -483,6 +483,15 @@ C-c C-c to apply." )) #+end_src +** Guess target directory + +I currently prefer to have two dired windows open in the same frame. +Instruct dired to 'Prefer next windows on the same frame' when renaming/copying files. + +#+BEGIN_SRC emacs-lisp +(setq dired-dwim-target 'dired-dwim-target-next) +#+END_SRC + * Whole-line-or-region Source: From 32ddb062c02f82a4439e09d1b1fc0ee6f61c4633 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:21:26 +0200 Subject: [PATCH 213/280] ORG_ROAM: Add consult integration --- config.org | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/config.org b/config.org index 40aefce..11c2b17 100644 --- a/config.org +++ b/config.org @@ -879,6 +879,40 @@ Preserve indentation in SRC blocks ) #+END_SRC +*** Consult + +#+BEGIN_SRC emacs-lisp +(use-package consult-org-roam + :ensure t + :after org-roam + :init + (require 'consult-org-roam) + ;; Activate the minor mode + (consult-org-roam-mode 1) + ;; :custom + ;; Use `ripgrep' for searching with `consult-org-roam-search' + ;; (consult-org-roam-grep-func #'consult-ripgrep) + + ;; Configure a custom narrow key for `consult-buffer', default is 'n', this sets it to 'r' + ;; (consult-org-roam-buffer-narrow-key ?r) + + ;; Display org-roam buffers right after non-org-roam buffers + ;; in consult-buffer (and not down at the bottom) + ;; (consult-org-roam-buffer-after-buffers t) + :config + ;; Eventually suppress previewing for certain functions + (consult-customize + consult-org-roam-forward-links + :preview-key "M-.") + :bind + ;; Define some convenient keybindings as an addition + ("C-c n f" . consult-org-roam-file-find) + ("C-c n b" . consult-org-roam-backlinks) + ("C-c n B" . consult-org-roam-backlinks-recursive) + ("C-c n l" . consult-org-roam-forward-links) + ("C-c n s" . consult-org-roam-search)) +#+END_SRC + * Elisp ** Add demos to describe-function From 1022956e464b86917d0988569ad7f548f24ad4b8 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:30:48 +0200 Subject: [PATCH 214/280] ENABLE consult-grep --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 11c2b17..e59f51c 100644 --- a/config.org +++ b/config.org @@ -323,7 +323,7 @@ C-c C-c to apply." ;; M-s bindings in `search-map' ;; ("M-s d" . consult-find) ;; Alternative: consult-fd ;; ("M-s c" . consult-locate) - ;; ("M-s g" . consult-grep) + ("M-s g" . consult-grep) ;; ("M-s G" . consult-git-grep) ;; ("M-s r" . consult-ripgrep) ("M-s l" . consult-line) From 83dc7650868b9f98bf2d1330d936d557fe75c222 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:46:53 +0200 Subject: [PATCH 215/280] ENABLE consult-compile-error --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index e59f51c..744fbc7 100644 --- a/config.org +++ b/config.org @@ -311,7 +311,7 @@ C-c C-c to apply." ;; Other custom bindings ("M-y" . consult-yank-pop) ;; orig. yank-pop ;; M-g bindings in `goto-map' - ;; ("M-g e" . consult-compile-error) + ("M-g e" . consult-compile-error) ;; ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck ("M-g g" . consult-goto-line) ;; orig. goto-line ("M-g M-g" . consult-goto-line) ;; orig. goto-line From f82e59591e2d06d8b3f9ac7a1d6000563a8453bb Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:47:05 +0200 Subject: [PATCH 216/280] ENABLE consult-flymake --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 744fbc7..7111358 100644 --- a/config.org +++ b/config.org @@ -312,7 +312,7 @@ C-c C-c to apply." ("M-y" . consult-yank-pop) ;; orig. yank-pop ;; M-g bindings in `goto-map' ("M-g e" . consult-compile-error) - ;; ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck + ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck ("M-g g" . consult-goto-line) ;; orig. goto-line ("M-g M-g" . consult-goto-line) ;; orig. goto-line ;; ("M-g o" . consult-outline) ;; Alternative: consult-org-heading From e837ce7551da3ad61f91acf49a0d5c0b2ad9720e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:48:20 +0200 Subject: [PATCH 217/280] ENABLE consult-find --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 7111358..27cc543 100644 --- a/config.org +++ b/config.org @@ -321,7 +321,7 @@ C-c C-c to apply." ("M-i" . consult-imenu) ("M-I" . consult-imenu-multi) ;; M-s bindings in `search-map' - ;; ("M-s d" . consult-find) ;; Alternative: consult-fd + ("M-s d" . consult-find) ;; Alternative: consult-fd ;; ("M-s c" . consult-locate) ("M-s g" . consult-grep) ;; ("M-s G" . consult-git-grep) From 8b1d672215d9229d3e01d8f3a2c62216c47cb00b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 10:07:52 +0200 Subject: [PATCH 218/280] FIX org-mode source block snippets --- snippets/org-mode/emacs-lisp-source-block | 4 ++-- snippets/org-mode/source_block_emacs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/snippets/org-mode/emacs-lisp-source-block b/snippets/org-mode/emacs-lisp-source-block index 2f90c13..73ed1eb 100644 --- a/snippets/org-mode/emacs-lisp-source-block +++ b/snippets/org-mode/emacs-lisp-source-block @@ -1,6 +1,6 @@ # -*- mode: snippet -*- -# name: Lisp source code block -# key: s> +# name: Start emacs source block +# key: se> # -- #+BEGIN_SRC emacs-lisp diff --git a/snippets/org-mode/source_block_emacs b/snippets/org-mode/source_block_emacs index 73ed1eb..bcda23d 100644 --- a/snippets/org-mode/source_block_emacs +++ b/snippets/org-mode/source_block_emacs @@ -1,8 +1,8 @@ # -*- mode: snippet -*- -# name: Start emacs source block -# key: se> +# name: Org source code block +# key: s> # -- -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC ${1} #+END_SRC From 62148f96ca7adff1e7ffcad9d1c81578e47faf83 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 10:08:33 +0200 Subject: [PATCH 219/280] Simplify keys for org-mode source block snippets --- snippets/org-mode/emacs-lisp-source-block | 2 +- snippets/org-mode/source_block_emacs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/snippets/org-mode/emacs-lisp-source-block b/snippets/org-mode/emacs-lisp-source-block index 73ed1eb..25f00aa 100644 --- a/snippets/org-mode/emacs-lisp-source-block +++ b/snippets/org-mode/emacs-lisp-source-block @@ -1,6 +1,6 @@ # -*- mode: snippet -*- # name: Start emacs source block -# key: se> +# key: se # -- #+BEGIN_SRC emacs-lisp diff --git a/snippets/org-mode/source_block_emacs b/snippets/org-mode/source_block_emacs index bcda23d..215d78e 100644 --- a/snippets/org-mode/source_block_emacs +++ b/snippets/org-mode/source_block_emacs @@ -1,6 +1,6 @@ # -*- mode: snippet -*- # name: Org source code block -# key: s> +# key: s # -- #+BEGIN_SRC From ce1c827f4c4c3bfcdf0dfc83ee6b1e2465b875e0 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 15:49:26 +0200 Subject: [PATCH 220/280] ELPACA: Add sub-titles --- config.org | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config.org b/config.org index 27cc543..7002ee2 100644 --- a/config.org +++ b/config.org @@ -5,6 +5,8 @@ * Elpaca +** Core + #+begin_src emacs-lisp (defvar elpaca-installer-version 0.7) (defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) @@ -46,6 +48,8 @@ (elpaca `(,@elpaca-order)) #+end_src +** Use-package integration + #+begin_src emacs-lisp ;; Install use-package support (elpaca elpaca-use-package From 1a99cb8ccb94a9797611c0cc3c1fa3445b07b674 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 15:50:10 +0200 Subject: [PATCH 221/280] ELPACA: Wait until use-package integration fully loaded Stolen from github: https://github.com/progfolio/elpaca/issues/236 If the maintainer does it, it probably is needed. --- config.org | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/config.org b/config.org index 7002ee2..68b8f96 100644 --- a/config.org +++ b/config.org @@ -51,11 +51,14 @@ ** Use-package integration #+begin_src emacs-lisp - ;; Install use-package support - (elpaca elpaca-use-package - ;; Enable use-package :ensure support for Elpaca. - (elpaca-use-package-mode) - ) +;; Install use-package support +(elpaca elpaca-use-package + ;; Enable use-package :ensure support for Elpaca. + (elpaca-use-package-mode) + ) + +;; wait to get elpaca use-package integration +(elpaca-wait) #+end_src * General config From 21fbc47a8f650ecbd8ef20a773a7d539e9e19aef Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 15:57:14 +0200 Subject: [PATCH 222/280] ADD eldoc section This is a built-in package which we are updating for eglot. This requires some emacs-fu which I found on the elpaca github. --- config.org | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/config.org b/config.org index 68b8f96..99d95d8 100644 --- a/config.org +++ b/config.org @@ -61,6 +61,43 @@ (elpaca-wait) #+end_src +* Built-in packages +** Eldoc + +I got the following error message when loading eglot: +#+BEGIN_SRC +eglot failed eldoc installed version (1 13 0) lower than min required 1.14.0 00.239351 +#+END_SRC + +So install the eldoc package to be sure we have the latest version. +But after installing it, we get a new warning: + +#+BEGIN_SRC +⛔ Warning (emacs): eldoc loaded before Elpaca activation +#+END_SRC + +This seemed tricker than expected, but found a solution in the github issues of elpaca: +https://github.com/progfolio/elpaca/issues/236 + +#+BEGIN_SRC emacs-lisp +(use-package eldoc + :preface + ;; avoid loading of built-in eldoc, see https://github.com/progfolio/elpaca/issues/236#issuecomment-1879838229 + (unload-feature 'eldoc t) + (setq custom-delayed-init-variables '()) + (defvar global-eldoc-mode nil) + :demand t + :config + (global-eldoc-mode)) + +#+END_SRC +** Wait for loading updated packages + +Wait until updated built-in packages are fully loaded: +#+BEGIN_SRC emacs-lisp +(elpaca-wait) +#+END_SRC + * General config ** Bell From 1521fcb13ee8f72d3aa35f3fef7c4c7f1264e2df Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 15:58:24 +0200 Subject: [PATCH 223/280] ADD jsonrpc section This is a built-in package which we are updating for eglot. --- config.org | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/config.org b/config.org index 99d95d8..b7dbd21 100644 --- a/config.org +++ b/config.org @@ -91,6 +91,18 @@ https://github.com/progfolio/elpaca/issues/236 (global-eldoc-mode)) #+END_SRC + +** Jsonrpc +After eldoc was taken care of, a new error was reported: +#+BEGIN_SRC +eglot failed jsonrpc installed version (1 0 16) lower than min required 1.0.24 00.280828 +#+END_SRC + +So let's install the latest one: +#+BEGIN_SRC emacs-lisp +(use-package jsonrpc) +#+END_SRC + ** Wait for loading updated packages Wait until updated built-in packages are fully loaded: From 934c375c34cb8ac084134ef7c461e120566fbabb Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 29 Sep 2024 15:13:45 +0200 Subject: [PATCH 224/280] ADD org-roam-dailies-goto-today keybinding --- config.org | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index b7dbd21..69ce512 100644 --- a/config.org +++ b/config.org @@ -966,7 +966,9 @@ Preserve indentation in SRC blocks ("C-c n b" . consult-org-roam-backlinks) ("C-c n B" . consult-org-roam-backlinks-recursive) ("C-c n l" . consult-org-roam-forward-links) - ("C-c n s" . consult-org-roam-search)) + ("C-c n s" . consult-org-roam-search) + ("C-c n d" . org-roam-dailies-goto-today) + ) #+END_SRC * Elisp From 6aaae92c535a10659d546b2c7f86fce975b7eb5f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 29 Sep 2024 21:50:21 +0200 Subject: [PATCH 225/280] ADD filetags snippet --- snippets/org-mode/filetags | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 snippets/org-mode/filetags diff --git a/snippets/org-mode/filetags b/snippets/org-mode/filetags new file mode 100644 index 0000000..b3f283d --- /dev/null +++ b/snippets/org-mode/filetags @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# name: Filetags +# key: ft +# -- + +#+FILETAGS: :$1: From 3ad176fbf96fd8f7c910150a5e8ee2f7513b2511 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 29 Sep 2024 21:04:37 +0200 Subject: [PATCH 226/280] ORG-TODO: Mark parent task done if child tasks are done --- config.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config.org b/config.org index 69ce512..db8d82f 100644 --- a/config.org +++ b/config.org @@ -894,6 +894,19 @@ Preserve indentation in SRC blocks (setq org-src-preserve-indentation t) #+END_SRC +** Org-todo + +*** Mark parent entry as DONE when children are DONE + +#+BEGIN_SRC emacs-lisp +(defun org-summary-todo (n-done n-not-done) + "Switch entry to DONE when all subentries are done, to TODO otherwise." + (let (org-log-done org-todo-log-states) ; turn off logging + (org-todo (if (= n-not-done 0) "DONE" "TODO")))) + +(add-hook 'org-after-todo-statistics-hook #'org-summary-todo) +#+END_SRC + ** Org bullets #+BEGIN_SRC emacs-lisp From d0657174dcc24b3cec48846baf834b76d0a655c4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 29 Sep 2024 22:58:41 +0200 Subject: [PATCH 227/280] Update org-agenda-files with todo.org inside org-roam-directory --- config.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.org b/config.org index db8d82f..c4f81da 100644 --- a/config.org +++ b/config.org @@ -924,6 +924,8 @@ Preserve indentation in SRC blocks (org-roam-completion-everywhere t) :config (org-roam-setup) + ;; Add todo lists to org-agenda + (custom-set-variables '(org-agenda-files (directory-files-recursively org-roam-directory "todo\\.org$"))) ) #+END_SRC From 40d9146a45c4bc00733294f14b2a5c4fddc8bf98 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Oct 2024 21:58:34 +0200 Subject: [PATCH 228/280] In-buffer-completion: Add separate section --- config.org | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index c4f81da..bdc3ea9 100644 --- a/config.org +++ b/config.org @@ -450,7 +450,9 @@ C-c C-c to apply." ) #+END_SRC -** Corfu +** In-buffer completion + +*** Corfu #+BEGIN_SRC emacs-lisp (use-package corfu From a5efd66ec77a10603ff1390b101b1a7140df3a1d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Oct 2024 21:58:59 +0200 Subject: [PATCH 229/280] In-buffer-completion: Add consult completion method --- config.org | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config.org b/config.org index bdc3ea9..11e7279 100644 --- a/config.org +++ b/config.org @@ -452,6 +452,17 @@ C-c C-c to apply." ** In-buffer completion +*** Consult + +#+BEGIN_SRC +(setq completion-in-region-function + (lambda (&rest args) + (apply (if vertico-mode + #'consult-completion-in-region + #'completion--in-region) + args))) +#+END_SRC + *** Corfu #+BEGIN_SRC emacs-lisp From a68f566cd955505cbb519216ca7307981308347a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Oct 2024 21:59:09 +0200 Subject: [PATCH 230/280] In-buffer-completion: Disable corfu Getting crashes with emacs 29.4, seems to be a known issue. Until emacs 30, find another in-buffer-completion solution. --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 11e7279..91591be 100644 --- a/config.org +++ b/config.org @@ -465,7 +465,7 @@ C-c C-c to apply." *** Corfu -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC (use-package corfu ;; Optional customizations :custom From 75bda91171d9432e6c36c62204504f93706363d3 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Oct 2024 21:59:48 +0200 Subject: [PATCH 231/280] In-buffer-completion: Add company-mode --- config.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config.org b/config.org index 91591be..84fc64c 100644 --- a/config.org +++ b/config.org @@ -491,6 +491,19 @@ C-c C-c to apply." (global-corfu-mode)) #+end_src +*** Company-mode + +#+BEGIN_SRC emacs-lisp +(use-package company + :config + (define-key prog-mode-map + (kbd "TAB") + #'company-indent-or-complete-common) + :init + (global-company-mode) + ) +#+END_SRC + ** Orderless #+begin_src emacs-lisp From ad0adbc7266af6f64eb6f883bcd566182f135935 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 4 Nov 2024 09:43:21 +0100 Subject: [PATCH 232/280] feat: Enable global auto-revert mode --- config.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config.org b/config.org index 84fc64c..c990b2b 100644 --- a/config.org +++ b/config.org @@ -269,6 +269,12 @@ Make cursor the width of the character it is under f.e. full width of a tab. (setq x-stretch-cursor t) #+END_SRC +** Enable auto-revert + +#+BEGIN_SRC emacs-lisp +(setq global-auto-revert-mode 1) +#+END_SRC + * Resize-mode Minor-mode to easily resize frames (works with EXWM (firefox, ...)). From 7285b8750ed850a9305611bc88d4095abdee0737 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 17 Nov 2024 19:27:26 +0100 Subject: [PATCH 233/280] feat: load init.el from (org-)notes repo if it exists --- init.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/init.el b/init.el index e442e9c..fa74166 100644 --- a/init.el +++ b/init.el @@ -7,10 +7,14 @@ (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. (defvar my-config-file (expand-file-name "config.org" user-emacs-directory)) + (defvar notes-config-file (expand-file-name "init.el" "~/projects/notes/")) (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) (when (file-readable-p custom-file) (load custom-file)) + + (when (file-readable-p notes-config-file) + (load notes-config-file)) ) From 2023ec08b34b6824b19391f7855b59325c487898 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sat, 21 Dec 2024 19:54:33 +0100 Subject: [PATCH 234/280] add(snippets): Add kaboom snippet for c-mode --- snippets/c-mode/kaboom | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 snippets/c-mode/kaboom diff --git a/snippets/c-mode/kaboom b/snippets/c-mode/kaboom new file mode 100644 index 0000000..d4220a2 --- /dev/null +++ b/snippets/c-mode/kaboom @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# name: kaboom +# key: kb +# -- + +char (*__kaboom)[sizeof($1)] = 1; From 34e4462f1bef1da0642a9eccb7ad15ebacf981c3 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 7 Jan 2025 21:47:39 +0100 Subject: [PATCH 235/280] add(yas): enable also in text-mode --- config.org | 1 + 1 file changed, 1 insertion(+) diff --git a/config.org b/config.org index c990b2b..8b4bfc0 100644 --- a/config.org +++ b/config.org @@ -759,6 +759,7 @@ https://github.com/victorhge/iedit :hook (prog-mode . yas-minor-mode) (org-mode . yas-minor-mode) + (text-mode . yas-minor-mode) :config (yas-reload-all) ) From 0e722c06b590e941875af29fe2af838a92a5b441 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 7 Jan 2025 21:47:58 +0100 Subject: [PATCH 236/280] add(org-roam): show tags in org-roam-node-find This allows us to search for them as well --- config.org | 1 + 1 file changed, 1 insertion(+) diff --git a/config.org b/config.org index 8b4bfc0..fbc73df 100644 --- a/config.org +++ b/config.org @@ -957,6 +957,7 @@ Preserve indentation in SRC blocks (org-roam-completion-everywhere t) :config (org-roam-setup) + (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag))) ;; Add todo lists to org-agenda (custom-set-variables '(org-agenda-files (directory-files-recursively org-roam-directory "todo\\.org$"))) ) From cea6f3f2c0dd6ac9616b9d3d5403f7bca311e2fa Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 7 Jan 2025 21:48:45 +0100 Subject: [PATCH 237/280] add(org-roam): enable db autosync mode --- config.org | 1 + 1 file changed, 1 insertion(+) diff --git a/config.org b/config.org index fbc73df..7600947 100644 --- a/config.org +++ b/config.org @@ -958,6 +958,7 @@ Preserve indentation in SRC blocks :config (org-roam-setup) (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag))) + (org-roam-db-autosync-mode) ;; Add todo lists to org-agenda (custom-set-variables '(org-agenda-files (directory-files-recursively org-roam-directory "todo\\.org$"))) ) From 28dae3bfeb6a7d6ba751adc31a6fb540935cb072 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 7 Jan 2025 22:05:29 +0100 Subject: [PATCH 238/280] add(org-roam): don't limit tags to 10 chars --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 7600947..fd17ab9 100644 --- a/config.org +++ b/config.org @@ -957,7 +957,7 @@ Preserve indentation in SRC blocks (org-roam-completion-everywhere t) :config (org-roam-setup) - (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag))) + (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags}" 'face 'org-tag))) (org-roam-db-autosync-mode) ;; Add todo lists to org-agenda (custom-set-variables '(org-agenda-files (directory-files-recursively org-roam-directory "todo\\.org$"))) From e692a9de93f5a6afd8e97cc674b1cd8339d9b581 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 7 Jan 2025 22:05:46 +0100 Subject: [PATCH 239/280] add(org-roam): custom command to filter on a tag --- config.org | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config.org b/config.org index fd17ab9..4b14626 100644 --- a/config.org +++ b/config.org @@ -1034,6 +1034,22 @@ Preserve indentation in SRC blocks * Custom +** Org-roam + +Inspired by https://github.com/org-roam/org-roam/wiki/User-contributed-Tricks#filter-by-a-tag . + +#+BEGIN_SRC emacs-lisp +(defun myrmi/org-roam-node-find-tag-filter () + "Select a single tag from list and filter `org-roam-node' by it." + (interactive) + (let ((tag (car (completing-read-multiple "Tag: " + (org-roam-tag-completions))))) + (org-roam-node-find nil nil + (lambda (node) + (member tag + (org-roam-node-tags node)))))) +#+END_SRC + ** Sudo current buffer #+BEGIN_SRC emacs-lisp From 275d07b9614c718470ee566680b734446883379e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 8 Jan 2025 21:48:29 +0100 Subject: [PATCH 240/280] feat(buffer-completion): replace company-mode with corfu --- config.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 4b14626..ed797e3 100644 --- a/config.org +++ b/config.org @@ -471,7 +471,7 @@ C-c C-c to apply." *** Corfu -#+BEGIN_SRC +#+BEGIN_SRC emacs-lisp (use-package corfu ;; Optional customizations :custom @@ -499,7 +499,7 @@ C-c C-c to apply." *** Company-mode -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC (use-package company :config (define-key prog-mode-map From 7252361ab14013391b75be10861a0bee5e95efb3 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 8 Jan 2025 21:48:34 +0100 Subject: [PATCH 241/280] feat(consult): enable --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index ed797e3..96cec6c 100644 --- a/config.org +++ b/config.org @@ -460,7 +460,7 @@ C-c C-c to apply." *** Consult -#+BEGIN_SRC +#+BEGIN_SRC emacs-lisp (setq completion-in-region-function (lambda (&rest args) (apply (if vertico-mode From c8fa26b07b7d9d0f0a659556fd829d35e50cdc5e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 8 Jan 2025 21:48:49 +0100 Subject: [PATCH 242/280] feat(corfu): make execute complete --- config.org | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config.org b/config.org index 96cec6c..fa61c57 100644 --- a/config.org +++ b/config.org @@ -474,6 +474,9 @@ C-c C-c to apply." #+BEGIN_SRC emacs-lisp (use-package corfu ;; Optional customizations + :bind (:map corfu-map ("" . corfu-complete)) + :config + (setq tab-always-indent 'complete) :custom (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' (corfu-auto t) ;; Enable auto completion From 3853d9d247239f4b47c9eecf7e851f1067dace0a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 8 Jan 2025 21:49:21 +0100 Subject: [PATCH 243/280] fix: close minibuffer if open when pressing C-g --- config.org | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/config.org b/config.org index fa61c57..4e8e23a 100644 --- a/config.org +++ b/config.org @@ -1161,3 +1161,37 @@ This should normally be done by the init.el to load this configuration. | M-x untabify/tabify | Convert to spaces/tabs | | M-x describe-bindings | List all mapped keys/commands | | M-q | Fill paragraph | + +** Minibuffer + +*** Close minibuffer when pressing C-g + +'Inspired' by https://protesilaos.com/codelog/2024-11-28-basic-emacs-configuration/#h:1e4fde73-a2a2-4dc5-82ad-02cf3884ece6 . +#+BEGIN_SRC emacs-lisp +(defun myrmi/keyboard-quit-dwim () + "Do-What-I-Mean behaviour for a general `keyboard-quit'. + +The generic `keyboard-quit' does not do the expected thing when +the minibuffer is open. Whereas we want it to close the +minibuffer, even without explicitly focusing it. + +The DWIM behaviour of this command is as follows: + +- When the region is active, disable it. +- When a minibuffer is open, but not focused, close the minibuffer. +- When the Completions buffer is selected, close it. +- In every other case use the regular `keyboard-quit'." + (interactive) + (cond + ((region-active-p) + (keyboard-quit)) + ((derived-mode-p 'completion-list-mode) + (delete-completion-window)) + ((> (minibuffer-depth) 0) + (abort-recursive-edit)) + (t + (keyboard-quit)))) + +(define-key global-map (kbd "C-g") #'myrmi/keyboard-quit-dwim) + +#+END_SRC From ede533e7927a4933659c427e536692d74cb2224a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 9 Jan 2025 20:53:30 +0100 Subject: [PATCH 244/280] Use load-file option for custom file and notes iso manual check --- init.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/init.el b/init.el index fa74166..3d52422 100644 --- a/init.el +++ b/init.el @@ -12,9 +12,6 @@ (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) - (when (file-readable-p custom-file) - (load custom-file)) - - (when (file-readable-p notes-config-file) - (load notes-config-file)) + (load notes-config-file :no-error-if-file-is-missing) + (load custom-file :no-error-if-file-is-missing) ) From 17e062e07f32968ec5463d3ad635d31c923ed9c8 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 9 Jan 2025 20:54:38 +0100 Subject: [PATCH 245/280] Add font and icon/nerd-font section --- config.org | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/config.org b/config.org index 4e8e23a..09e47b6 100644 --- a/config.org +++ b/config.org @@ -1053,6 +1053,45 @@ Inspired by https://github.com/org-roam/org-roam/wiki/User-contributed-Tricks#fi (org-roam-node-tags node)))))) #+END_SRC +** Font + +'Inspired' by https://protesilaos.com/codelog/2024-11-28-basic-emacs-configuration/#h:1e4fde73-a2a2-4dc5-82ad-02cf3884ece6 . +#+BEGIN_SRC emacs-lisp +(let ((mono-spaced-font "Monospace") + (proportionately-spaced-font "Sans")) + (set-face-attribute 'default nil :family mono-spaced-font :height 100) + (set-face-attribute 'fixed-pitch nil :family mono-spaced-font :height 1.0) + (set-face-attribute 'variable-pitch nil :family proportionately-spaced-font :height 1.0)) +#+END_SRC + +*** Icon fonts + +To make this setup work, the user must type M-x and then call the +command 'nerd-icons-install-fonts'. This will store the icon font files +in a local directory (on Linux this is ~/.local/share/fonts). + +#+BEGIN_SRC emacs-lisp +(use-package nerd-icons + :ensure t) + +(use-package nerd-icons-completion + :ensure t + :after marginalia + :config + (add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup)) + +(use-package nerd-icons-corfu + :ensure t + :after corfu + :config + (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)) + +(use-package nerd-icons-dired + :ensure t + :hook + (dired-mode . nerd-icons-dired-mode)) +#+END_SRC + ** Sudo current buffer #+BEGIN_SRC emacs-lisp From c47c5a5185ee55d1192f73ff68b70b056bf77331 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 9 Jan 2025 21:11:48 +0100 Subject: [PATCH 246/280] fix: revert-mode setting --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 09e47b6..72bc534 100644 --- a/config.org +++ b/config.org @@ -272,7 +272,7 @@ Make cursor the width of the character it is under f.e. full width of a tab. ** Enable auto-revert #+BEGIN_SRC emacs-lisp -(setq global-auto-revert-mode 1) +(global-auto-revert-mode t) #+END_SRC * Resize-mode From 0b57fa79b5b4e35642ad5f3183e74585f3be56a2 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 30 Apr 2025 09:36:55 +0200 Subject: [PATCH 247/280] feat: Update elpaca This avoids the warning at startup about not being able to determine elpaca core date. --- config.org | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/config.org b/config.org index 72bc534..24b9c10 100644 --- a/config.org +++ b/config.org @@ -7,13 +7,13 @@ ** Core -#+begin_src emacs-lisp -(defvar elpaca-installer-version 0.7) +#+BEGIN_SRC emacs-lisp +(defvar elpaca-installer-version 0.11) (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 + :ref nil :depth 1 :inherit ignore :files (:defaults "elpaca-test.el" (:exclude "extensions")) :build (:not elpaca--activate-package))) (let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory)) @@ -23,30 +23,30 @@ (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)) + (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))) + (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"))) + (let ((load-source-file-function nil)) (load "./elpaca-autoloads")))) (add-hook 'after-init-hook #'elpaca-process-queues) (elpaca `(,@elpaca-order)) -#+end_src +#+END_SRC ** Use-package integration From f5ef8d68c597b2c6c0423dc169395b2aab29f738 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 30 Apr 2025 09:37:32 +0200 Subject: [PATCH 248/280] fix: Update visit/reload-config docs --- config.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 24b9c10..1eb50cd 100644 --- a/config.org +++ b/config.org @@ -1179,12 +1179,12 @@ This should normally be done by the init.el to load this configuration. #+BEGIN_SRC emacs-lisp (defun myrmi/visit-config () - "Reloads ~/.emacs.d/config.org at runtime" + "Visit emacs config" (interactive) (find-file my-config-file)) (defun myrmi/reload-config () - "Reloads ~/.emacs.d/config.org at runtime" + "Reload emacs config at runtime" (interactive) (org-babel-load-file my-config-file)) #+END_SRC From d3dc9465dd19f2d6139e06b07bf56eba9d2d6e61 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 30 Apr 2025 09:38:32 +0200 Subject: [PATCH 249/280] fix: load init.el of notes repo when org-roam is properly loaded This avoids all kinds of issues about variables not being declared, etc. in the project-notes init.el --- config.org | 1 + init.el | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/config.org b/config.org index 1eb50cd..404cccb 100644 --- a/config.org +++ b/config.org @@ -964,6 +964,7 @@ Preserve indentation in SRC blocks (org-roam-db-autosync-mode) ;; Add todo lists to org-agenda (custom-set-variables '(org-agenda-files (directory-files-recursively org-roam-directory "todo\\.org$"))) + (load (expand-file-name "init.el" org-roam-directory) :no-error-if-file-is-missing) ) #+END_SRC diff --git a/init.el b/init.el index 3d52422..5b96eb9 100644 --- a/init.el +++ b/init.el @@ -7,11 +7,9 @@ (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. (defvar my-config-file (expand-file-name "config.org" user-emacs-directory)) - (defvar notes-config-file (expand-file-name "init.el" "~/projects/notes/")) (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) - (load notes-config-file :no-error-if-file-is-missing) (load custom-file :no-error-if-file-is-missing) ) From 1a21781fba70826d4c71aed51004059833b85313 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 30 Apr 2025 09:39:47 +0200 Subject: [PATCH 250/280] fix: switch back to company from corfu to avoid random crash It seems like a known issue (don't have the link anymore..) but company is doing fine for now so just switch back to it. --- config.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 404cccb..af422e5 100644 --- a/config.org +++ b/config.org @@ -471,7 +471,7 @@ C-c C-c to apply." *** Corfu -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC (use-package corfu ;; Optional customizations :bind (:map corfu-map ("" . corfu-complete)) @@ -502,7 +502,7 @@ C-c C-c to apply." *** Company-mode -#+BEGIN_SRC +#+BEGIN_SRC emacs-lisp (use-package company :config (define-key prog-mode-map From ff740ce08eb8949437da7ec73533556d26e2d46e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 30 Apr 2025 09:40:43 +0200 Subject: [PATCH 251/280] feat: Add org-download --- config.org | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config.org b/config.org index af422e5..88e0e25 100644 --- a/config.org +++ b/config.org @@ -1025,6 +1025,15 @@ Preserve indentation in SRC blocks ) #+END_SRC +** Org Download + +#+BEGIN_SRC emacs-lisp +(use-package org-download + :config + (add-hook 'dired-mode-hook 'org-download-enable) + ) +#+END_SRC + * Elisp ** Add demos to describe-function From 22c029b2f44186797fcdb88d86745140c2132601 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 25 May 2025 17:25:41 +0200 Subject: [PATCH 252/280] Remove old eldoc/jsonrpc workarounds and just use built-in packages --- config.org | 59 +++++++++--------------------------------------------- 1 file changed, 9 insertions(+), 50 deletions(-) diff --git a/config.org b/config.org index 88e0e25..6424b85 100644 --- a/config.org +++ b/config.org @@ -61,57 +61,7 @@ (elpaca-wait) #+end_src -* Built-in packages -** Eldoc - -I got the following error message when loading eglot: -#+BEGIN_SRC -eglot failed eldoc installed version (1 13 0) lower than min required 1.14.0 00.239351 -#+END_SRC - -So install the eldoc package to be sure we have the latest version. -But after installing it, we get a new warning: - -#+BEGIN_SRC -⛔ Warning (emacs): eldoc loaded before Elpaca activation -#+END_SRC - -This seemed tricker than expected, but found a solution in the github issues of elpaca: -https://github.com/progfolio/elpaca/issues/236 - -#+BEGIN_SRC emacs-lisp -(use-package eldoc - :preface - ;; avoid loading of built-in eldoc, see https://github.com/progfolio/elpaca/issues/236#issuecomment-1879838229 - (unload-feature 'eldoc t) - (setq custom-delayed-init-variables '()) - (defvar global-eldoc-mode nil) - :demand t - :config - (global-eldoc-mode)) - -#+END_SRC - -** Jsonrpc -After eldoc was taken care of, a new error was reported: -#+BEGIN_SRC -eglot failed jsonrpc installed version (1 0 16) lower than min required 1.0.24 00.280828 -#+END_SRC - -So let's install the latest one: -#+BEGIN_SRC emacs-lisp -(use-package jsonrpc) -#+END_SRC - -** Wait for loading updated packages - -Wait until updated built-in packages are fully loaded: -#+BEGIN_SRC emacs-lisp -(elpaca-wait) -#+END_SRC - * General config - ** Bell The audible bell is annoying AF. @@ -206,6 +156,15 @@ Use list-buffers bigger brother. (global-set-key (kbd "M-SPC") 'mark-word) #+end_src +** Eldoc + +#+BEGIN_SRC emacs-lisp +(use-package eldoc + :ensure nil + :init + (global-eldoc-mode)) +#+END_SRC + ** Isearch Display number of matches: From 49a5164f45a90c369482b6aef1a1a2ee7194b280 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 25 May 2025 17:26:06 +0200 Subject: [PATCH 253/280] Rework isearch configuration using emacs-solo inspiration --- config.org | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/config.org b/config.org index 6424b85..faed9e1 100644 --- a/config.org +++ b/config.org @@ -167,10 +167,26 @@ Use list-buffers bigger brother. ** Isearch -Display number of matches: -#+begin_src emacs-lisp -(setq-default isearch-lazy-count t) -#+end_src +Inspired by [[https://github.com/LionyxML/emacs-solo][emacs-solo]]: + +#+BEGIN_SRC emacs-lisp +(use-package isearch + :ensure nil + :config + (setq isearch-lazy-count t) ; Display number of matches + (setq lazy-count-prefix-format "(%s/%s) ") ; eye-candy to add braces + (defun isearch-copy-selected-word () + "Copy the current `isearch` selection to the kill ring." + (interactive) + (when isearch-other-end + (let ((selection (buffer-substring-no-properties isearch-other-end (point)))) + (kill-new selection) + (isearch-exit)))) + + ;; Bind `M-w` in isearch to copy the selected word, so M-s M-. M-w + ;; does a great job of 'copying the current word under cursor'. + (define-key isearch-mode-map (kbd "M-w") 'isearch-copy-selected-word)) +#+END_SRC Reference that might be interesting for later: https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html From f2dc1fe4961cb9dd54ca1212fa60ce6b2a8beec9 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 25 May 2025 17:26:30 +0200 Subject: [PATCH 254/280] Add flymake configuration --- config.org | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/config.org b/config.org index faed9e1..6d332c9 100644 --- a/config.org +++ b/config.org @@ -191,6 +191,25 @@ Inspired by [[https://github.com/LionyxML/emacs-solo][emacs-solo]]: Reference that might be interesting for later: https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html +** Flymake + +#+BEGIN_SRC emacs-lisp +(use-package flymake + :ensure nil + :defer t + :hook + (prog-mode-hook . flymake-mode) + :custom + (flymake-show-diagnostics-at-end-of-line 'short) + (flymake-indicator-type 'margins) + (flymake-margin-indicators-string + `((error "!" compilation-error) + (warning "?" compilation-warning) + (note "i" compilation-info)) + ) + ) +#+END_SRC + ** Abbrev #+begin_src emacs-lisp From 6c24da45031616936063f873284683a2fece8bac Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 25 May 2025 17:26:38 +0200 Subject: [PATCH 255/280] Rework eglot configuration to use built-in package --- config.org | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/config.org b/config.org index 6d332c9..3aa641e 100644 --- a/config.org +++ b/config.org @@ -731,15 +731,21 @@ https://github.com/victorhge/iedit ** Eglot #+BEGIN_SRC emacs-lisp - (use-package eglot) - +(use-package eglot + :ensure nil + :custom + (eglot-autoshutdown t) + :init (setq eglot-stay-out-of '(xref)) (add-hook 'prog-mode-hook 'eglot-ensure) (add-hook 'eglot-managed-mode-hook (lambda () (if (eglot-managed-p) (add-hook 'xref-backend-functions 'eglot-xref-backend) (remove-hook 'xref-backend-functions 'eglot-xref-backend) - ))) + ))) + + ) + #+END_SRC ** Markdown-mode From 2572e8c22199c5e173a020237f941290ddf5736a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 26 May 2025 10:59:38 +0200 Subject: [PATCH 256/280] Fix linting warnings in early-init/init.el There should be no functional changes --- early-init.el | 19 +++++++++++++------ init.el | 6 ++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/early-init.el b/early-init.el index 0fe1b95..3a99e6d 100644 --- a/early-init.el +++ b/early-init.el @@ -1,9 +1,16 @@ +;;; early-init.el --- Early Init -*- lexical-binding: t; -*- + +;;; Commentary: +;; Early init configuration for Emacs Solo +;; + +;;; Code: + + + +;; Recommended by elpaca (setq package-enable-at-startup nil) +(provide 'early-init) -;; Local Variables: -;; no-byte-compile: t -;; no-native-compile: t -;; no-update-autoloads: t -;; End: - +;;; early-init.el ends here diff --git a/init.el b/init.el index 5b96eb9..a57c423 100644 --- a/init.el +++ b/init.el @@ -1,3 +1,9 @@ +;;; init.el --- Init -*- lexical-binding: t; -*- + + +;;; Commentary: +;;; Load init files + ;;; Increase garbage collection threshold during init but leave it to the default value after ;;; There are a LOT of articles/sites/... discussing this: ;;; https://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/ From a731bab651f9115b4026878ebadce3c62e404a43 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 26 May 2025 10:59:45 +0200 Subject: [PATCH 257/280] Only pop-up messages buffer if there is an error --- early-init.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/early-init.el b/early-init.el index 3a99e6d..e163e66 100644 --- a/early-init.el +++ b/early-init.el @@ -7,6 +7,8 @@ ;;; Code: +;; Only care about errors in *Messages* buffer +(setq warning-minimum-level :error) ;; Recommended by elpaca (setq package-enable-at-startup nil) From 7f901b23aec9fde3de5c085587e9e263aa7acdea Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:47:37 +0200 Subject: [PATCH 258/280] feat: Remove elpaca I'm not actually using it and it's just bloat at this point. This speeds up the startup significantly. Remove what you don't need. --- config.org | 168 +++++++++++++++++++------------------------------- early-init.el | 2 +- 2 files changed, 64 insertions(+), 106 deletions(-) diff --git a/config.org b/config.org index 3aa641e..63b47ad 100644 --- a/config.org +++ b/config.org @@ -3,65 +3,61 @@ #+CREATOR: Laurens Miers #+LANGUAGE: en -* Elpaca - -** Core +* General config #+BEGIN_SRC emacs-lisp -(defvar elpaca-installer-version 0.11) -(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 :inherit ignore - :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) - (let ((load-source-file-function nil)) (load "./elpaca-autoloads")))) -(add-hook 'after-init-hook #'elpaca-process-queues) -(elpaca `(,@elpaca-order)) + (use-package emacs + :ensure nil + :custom + (inhibit-startup-message t) + :init + (with-current-buffer (get-buffer-create "*scratch*") + (insert (format ";; + ;; ██╗ ██╗███████╗██╗ ██╗ ██████╗ + ;; ██║ ██║██╔════╝██║ ██║ ██╔═══██╗ + ;; ███████║█████╗ ██║ ██║ ██║ ██║ + ;; ██╔══██║██╔══╝ ██║ ██║ ██║ ██║ + ;; ██║ ██║███████╗███████╗███████╗╚██████╔╝ + ;; ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝ ╚═════╝ + ;; + ;; ███████╗███╗ ███╗ █████╗ ██████╗███████╗ + ;; ██╔════╝████╗ ████║██╔══██╗██╔════╝██╔════╝ + ;; █████╗ ██╔████╔██║███████║██║ ███████╗ + ;; ██╔══╝ ██║╚██╔╝██║██╔══██║██║ ╚════██║ + ;; ███████╗██║ ╚═╝ ██║██║ ██║╚██████╗███████║ + ;; ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚══════╝ + ;; + ;; Loading time : %s + ;; Packages : %s + ;; + " + (emacs-init-time) + (number-to-string (length package-activated-list))))) + + (message (emacs-init-time)) + ) #+END_SRC -** Use-package integration +** Package repos -#+begin_src emacs-lisp -;; Install use-package support -(elpaca elpaca-use-package - ;; Enable use-package :ensure support for Elpaca. - (elpaca-use-package-mode) - ) +#+BEGIN_SRC emacs-lisp +(require 'package) +(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) +;; Comment/uncomment this line to enable MELPA Stable if desired. See `package-archive-priorities` +;; and `package-pinned-packages`. Most users will not need or want to do this. +;;(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t) +(package-initialize) +#+END_SRC -;; wait to get elpaca use-package integration -(elpaca-wait) -#+end_src +** Use-package + +*** Always ensure + +#+BEGIN_SRC emacs-lisp +(require 'use-package-ensure) +(setq use-package-always-ensure t) +#+END_SRC -* General config ** Bell The audible bell is annoying AF. @@ -246,15 +242,6 @@ Narrow-region/page is a really handy feature, enable it: (put 'narrow-to-region 'disabled nil) #+END_SRC -** Use-package - -*** Always ensure - -#+BEGIN_SRC emacs-lisp -(require 'use-package-ensure) -(setq use-package-always-ensure t) -#+END_SRC - ** Adaptive cursor width Make cursor the width of the character it is under f.e. full width of a tab. @@ -650,29 +637,26 @@ For the keybindings, we have to defien them in both raw and line mode. From the #+begin_src emacs-lisp (use-package dashboard :config - (add-hook 'elpaca-after-init-hook #'dashboard-insert-startupify-lists) - (add-hook 'elpaca-after-init-hook #'dashboard-initialize) (dashboard-setup-startup-hook)) #+end_src * Hydra -Install and wait for hydra to be available since we are using it in this init.el : -#+begin_src emacs-lisp +https://github.com/abo-abo/hydra + +#+BEGIN_SRC emacs-lisp (use-package hydra - :ensure (:wait t) + :defer t + :config + ;; Zoom hydra + (defhydra hydra-zoom (global-map "") + "zoom" + ("g" text-scale-increase "in") + ("l" text-scale-decrease "out") + ) + ) -#+end_src - -** Text zoom - -#+begin_src emacs-lisp -(defhydra hydra-zoom (global-map "") - "zoom" - ("g" text-scale-increase "in") - ("l" text-scale-decrease "out") -) -#+end_src +#+END_SRC * Zygospore @@ -770,41 +754,15 @@ https://github.com/victorhge/iedit ** Magit -*** Transient - -Magit depends on this and it seems it's not installed as a dependency, so install it explicitly. - -#+BEGIN_SRC emacs-lisp -(use-package transient - :ensure (:wait t) -) -#+END_SRC - *** Core #+BEGIN_SRC emacs-lisp (use-package magit -:ensure (:wait t) -) + :defer t + ) #+END_SRC -**** Extra commands - -***** Update all submodules - -#+BEGIN_SRC emacs-lisp -(transient-define-suffix magit-submodule-update-all () - "Update all submodules" - :description "Update All git submodule update --init --recursive" - (interactive) - (magit-with-toplevel - (magit-run-git-async "submodule" "update" "--force"))) - -(transient-append-suffix 'magit-submodule "f" - '("U" magit-submodule-update-all)) -#+END_SRC - ** Dumb-jump #+BEGIN_SRC emacs-lisp diff --git a/early-init.el b/early-init.el index e163e66..5d83494 100644 --- a/early-init.el +++ b/early-init.el @@ -10,7 +10,7 @@ ;; Only care about errors in *Messages* buffer (setq warning-minimum-level :error) -;; Recommended by elpaca +;; We control when packages are enabled (setq package-enable-at-startup nil) (provide 'early-init) From adab1147e0da42c890d047d55b0f2dc5082db383 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:48:31 +0200 Subject: [PATCH 259/280] fix: Docs on keys to use when resizing --- config.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 63b47ad..d80c79b 100644 --- a/config.org +++ b/config.org @@ -301,8 +301,8 @@ C-c C-c to apply." :global t (if (<= (length (window-list)) 1) (progn (setq resize-frame nil) - (message "Only root frame exists, abort.")) - (message "Use arrow-keys or i/j/k/l to adjust frames."))) + (message "Only root frame exists, abort.")) + (message "Use arrow-keys or C-p/n/f/b to adjust frames."))) (defun resize-frame-done () (interactive) From 377a5cadff3a82543095840bf97255fde13eaf06 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:48:46 +0200 Subject: [PATCH 260/280] fix: whitespace has a separate built-in package It has a better hook (whitespace-cleanup) than the barebones delete-trailing-whitespace. --- config.org | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index d80c79b..cb19b82 100644 --- a/config.org +++ b/config.org @@ -72,10 +72,16 @@ The audible bell is annoying AF. (setq column-number-mode 1) #+END_SRC -** Delete trailing whitespaces +** Whitespace cleanup #+BEGIN_SRC emacs-lisp -(add-hook 'before-save-hook 'delete-trailing-whitespace) +(use-package whitespace + :ensure nil + :defer t + :hook (before-save-hook . whitespace-cleanup) + ;; if we wanna remove this hook at any time, eval: + ;; (remove-hook 'before-save-hook #'whitespace-cleanup) + ) #+END_SRC ** Save history and recent files From 80b3e4dbc16e0ed8b3fbc314366c733d1a208d3c Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:49:59 +0200 Subject: [PATCH 261/280] feat: enable vertico-cycle and call hook when appropriate --- config.org | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/config.org b/config.org index cb19b82..55f545b 100644 --- a/config.org +++ b/config.org @@ -322,15 +322,14 @@ C-c C-c to apply." ** Minibuffer #+BEGIN_SRC emacs-lisp -;; Enable vertico (use-package vertico - ;; :custom + :custom ;; (vertico-scroll-margin 0) ;; Different scroll margin ;; (vertico-count 20) ;; Show more candidates ;; (vertico-resize t) ;; Grow and shrink the Vertico minibuffer - ;; (vertico-cycle t) ;; Enable cycling for `vertico-next/previous' - :init - (vertico-mode)) + (vertico-cycle t) ;; Enable cycling for `vertico-next/previous' + :hook (after-init . vertico-mode) + ) #+END_SRC ** Consult From 3f93a19d4b92287ffc670adc74bd546e0b41853f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:51:20 +0200 Subject: [PATCH 262/280] feat: enable corfu iso company-mode No issues so far when using melpa iso latest git repo (elpaca behaviour) --- config.org | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/config.org b/config.org index 55f545b..346c55e 100644 --- a/config.org +++ b/config.org @@ -457,7 +457,7 @@ C-c C-c to apply." *** Corfu -#+BEGIN_SRC +#+BEGIN_SRC emacs-lisp (use-package corfu ;; Optional customizations :bind (:map corfu-map ("" . corfu-complete)) @@ -486,19 +486,6 @@ C-c C-c to apply." (global-corfu-mode)) #+end_src -*** Company-mode - -#+BEGIN_SRC emacs-lisp -(use-package company - :config - (define-key prog-mode-map - (kbd "TAB") - #'company-indent-or-complete-common) - :init - (global-company-mode) - ) -#+END_SRC - ** Orderless #+begin_src emacs-lisp From a79987f30fba939724c39a7aaed91b541aebf82a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:52:05 +0200 Subject: [PATCH 263/280] chore: stylefix --- config.org | 187 ++++++++++++++++++++++++++--------------------------- 1 file changed, 93 insertions(+), 94 deletions(-) diff --git a/config.org b/config.org index 346c55e..0390fca 100644 --- a/config.org +++ b/config.org @@ -182,8 +182,8 @@ Inspired by [[https://github.com/LionyxML/emacs-solo][emacs-solo]]: (interactive) (when isearch-other-end (let ((selection (buffer-substring-no-properties isearch-other-end (point)))) - (kill-new selection) - (isearch-exit)))) + (kill-new selection) + (isearch-exit)))) ;; Bind `M-w` in isearch to copy the selected word, so M-s M-. M-w ;; does a great job of 'copying the current word under cursor'. @@ -338,58 +338,58 @@ C-c C-c to apply." (use-package consult ;; Replace bindings. Lazily loaded by `use-package'. :bind (;; C-c bindings in `mode-specific-map' - ;; ("C-c M-x" . consult-mode-command) - ;; ("C-c h" . consult-history) - ;; ("C-c k" . consult-kmacro) - ;; ("C-c m" . consult-man) - ;; ("C-c i" . consult-info) - ([remap Info-search] . consult-info) - ;; C-x bindings in `ctl-x-map' - ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command - ("C-x b" . consult-buffer) ;; orig. switch-to-buffer - ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window - ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame - ("C-x t b" . consult-buffer-other-tab) ;; orig. switch-to-buffer-other-tab - ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump - ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer - ;; Custom M-# bindings for fast register access - ;; ("M-#" . consult-register-load) - ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) - ;; ("C-M-#" . consult-register) - ;; Other custom bindings - ("M-y" . consult-yank-pop) ;; orig. yank-pop - ;; M-g bindings in `goto-map' - ("M-g e" . consult-compile-error) - ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck - ("M-g g" . consult-goto-line) ;; orig. goto-line - ("M-g M-g" . consult-goto-line) ;; orig. goto-line - ;; ("M-g o" . consult-outline) ;; Alternative: consult-org-heading - ;; ("M-g m" . consult-mark) - ;; ("M-g k" . consult-global-mark) - ("M-i" . consult-imenu) - ("M-I" . consult-imenu-multi) - ;; M-s bindings in `search-map' - ("M-s d" . consult-find) ;; Alternative: consult-fd - ;; ("M-s c" . consult-locate) - ("M-s g" . consult-grep) - ;; ("M-s G" . consult-git-grep) - ;; ("M-s r" . consult-ripgrep) - ("M-s l" . consult-line) - ;; ("M-s L" . consult-line-multi) - ;; ("M-s k" . consult-keep-lines) - ;; ("M-s u" . consult-focus-lines) - ;; Isearch integration - ("M-s e" . consult-isearch-history) - :map isearch-mode-map - ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string - ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string - ("M-s l" . consult-line) ;; needed by consult-line to detect isearch - ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch - ;; Minibuffer history - :map minibuffer-local-map - ("M-s" . consult-history) ;; orig. next-matching-history-element - ("M-r" . consult-history) ;; orig. previous-matching-history-element - ) + ;; ("C-c M-x" . consult-mode-command) + ;; ("C-c h" . consult-history) + ;; ("C-c k" . consult-kmacro) + ;; ("C-c m" . consult-man) + ;; ("C-c i" . consult-info) + ([remap Info-search] . consult-info) + ;; C-x bindings in `ctl-x-map' + ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command + ("C-x b" . consult-buffer) ;; orig. switch-to-buffer + ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window + ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame + ("C-x t b" . consult-buffer-other-tab) ;; orig. switch-to-buffer-other-tab + ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump + ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer + ;; Custom M-# bindings for fast register access + ;; ("M-#" . consult-register-load) + ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) + ;; ("C-M-#" . consult-register) + ;; Other custom bindings + ("M-y" . consult-yank-pop) ;; orig. yank-pop + ;; M-g bindings in `goto-map' + ("M-g e" . consult-compile-error) + ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck + ("M-g g" . consult-goto-line) ;; orig. goto-line + ("M-g M-g" . consult-goto-line) ;; orig. goto-line + ;; ("M-g o" . consult-outline) ;; Alternative: consult-org-heading + ;; ("M-g m" . consult-mark) + ;; ("M-g k" . consult-global-mark) + ("M-i" . consult-imenu) + ("M-I" . consult-imenu-multi) + ;; M-s bindings in `search-map' + ("M-s d" . consult-find) ;; Alternative: consult-fd + ;; ("M-s c" . consult-locate) + ("M-s g" . consult-grep) + ;; ("M-s G" . consult-git-grep) + ;; ("M-s r" . consult-ripgrep) + ("M-s l" . consult-line) + ;; ("M-s L" . consult-line-multi) + ;; ("M-s k" . consult-keep-lines) + ;; ("M-s u" . consult-focus-lines) + ;; Isearch integration + ("M-s e" . consult-isearch-history) + :map isearch-mode-map + ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s l" . consult-line) ;; needed by consult-line to detect isearch + ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch + ;; Minibuffer history + :map minibuffer-local-map + ("M-s" . consult-history) ;; orig. next-matching-history-element + ("M-r" . consult-history) ;; orig. previous-matching-history-element + ) ;; Enable automatic preview at point in the *Completions* buffer. This is ;; relevant when you use the default completion UI. @@ -402,7 +402,7 @@ C-c C-c to apply." ;; preview for `consult-register', `consult-register-load', ;; `consult-register-store' and the Emacs built-ins. ;; (setq register-preview-delay 0.5 - ;; register-preview-function #'consult-register-format) + ;; register-preview-function #'consult-register-format) ;; Optionally tweak the register preview window. ;; This adds thin lines, sorting and hides the mode line of the window. @@ -410,7 +410,7 @@ C-c C-c to apply." ;; Use Consult to select xref locations with preview (setq xref-show-xrefs-function #'consult-xref - xref-show-definitions-function #'consult-xref) + xref-show-definitions-function #'consult-xref) ;; Configure other variables and modes in the :config section, ;; after lazily loading the package. @@ -449,10 +449,10 @@ C-c C-c to apply." #+BEGIN_SRC emacs-lisp (setq completion-in-region-function (lambda (&rest args) - (apply (if vertico-mode - #'consult-completion-in-region - #'completion--in-region) - args))) + (apply (if vertico-mode + #'consult-completion-in-region + #'completion--in-region) + args))) #+END_SRC *** Corfu @@ -488,7 +488,7 @@ C-c C-c to apply." ** Orderless -#+begin_src emacs-lisp +#+BEGIN_SRC emacs-lisp (use-package orderless :demand t :custom @@ -508,18 +508,18 @@ C-c C-c to apply." ;; ) ;; ) ) -#+end_src +#+END_SRC ** Marginalia -#+begin_src emacs-lisp +#+BEGIN_SRC emacs-lisp ;; Enable rich annotations using the Marginalia package (use-package marginalia ;; Bind `marginalia-cycle' locally in the minibuffer. To make the binding ;; available in the *Completions* buffer, add it to the ;; `completion-list-mode-map'. :bind (:map minibuffer-local-map - ("M-A" . marginalia-cycle)) + ("M-A" . marginalia-cycle)) ;; The :init section is always executed. :init @@ -527,7 +527,7 @@ C-c C-c to apply." ;; the mode gets enabled right away. Note that this forces loading the ;; package. (marginalia-mode)) -#+end_src +#+END_SRC * Dired @@ -541,10 +541,10 @@ C-c C-c to apply." ) (add-hook 'dired-mode-hook - (lambda () - ;; Set dired-x buffer-local variables here. For example: - ;; (dired-omit-mode 1) - )) + (lambda () + ;; Set dired-x buffer-local variables here. For example: + ;; (dired-omit-mode 1) + )) #+end_src ** Guess target directory @@ -565,9 +565,8 @@ Operate on the current line if no region is active. #+begin_src emacs-lisp (use-package whole-line-or-region - - :config - (whole-line-or-region-global-mode 1) + :config + (whole-line-or-region-global-mode 1) ) #+end_src @@ -689,12 +688,12 @@ https://github.com/victorhge/iedit ) (mapc (lambda (mode) - (font-lock-add-keywords - mode - '( - ("\\<\\(FIXME\\)" 1 'highlight-angry-faces t) - ("\\<\\(TODO\\)" 1 'highlight-angry-faces t) - ))) + (font-lock-add-keywords + mode + '( + ("\\<\\(FIXME\\)" 1 'highlight-angry-faces t) + ("\\<\\(TODO\\)" 1 'highlight-angry-faces t) + ))) '(text-mode emacs-lisp-mode rust-mode zig-mode c-ts-mode c-mode prog-mode) ) #+END_SRC @@ -758,10 +757,10 @@ https://github.com/victorhge/iedit ** Dumb-jump #+BEGIN_SRC emacs-lisp - (use-package dumb-jump - :init - (add-hook 'xref-backend-functions #'dumb-jump-xref-activate) - ) +(use-package dumb-jump + :init + (add-hook 'xref-backend-functions #'dumb-jump-xref-activate) +) #+END_SRC ** C-programming @@ -841,8 +840,8 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package comment-dwim-2 - :config - (global-set-key (kbd "M-;") 'comment-dwim-2) + :bind + ("M-;" . comment-dwim-2) ) #+END_SRC @@ -1006,11 +1005,11 @@ Inspired by https://github.com/org-roam/org-roam/wiki/User-contributed-Tricks#fi "Select a single tag from list and filter `org-roam-node' by it." (interactive) (let ((tag (car (completing-read-multiple "Tag: " - (org-roam-tag-completions))))) + (org-roam-tag-completions))))) (org-roam-node-find nil nil - (lambda (node) - (member tag - (org-roam-node-tags node)))))) + (lambda (node) + (member tag + (org-roam-node-tags node)))))) #+END_SRC ** Font @@ -1061,7 +1060,7 @@ in a local directory (on Linux this is ~/.local/share/fonts). (when buffer-file-name (find-alternate-file (concat "/sudo:root@localhost:" - buffer-file-name) + buffer-file-name) ) ) ) @@ -1089,9 +1088,9 @@ in a local directory (on Linux this is ~/.local/share/fonts). (defun myrmi/run-ceedling-tests (&optional file-name) (interactive) (let* ( - (file-path (or file-name buffer-file-name)) - (root-path (or (locate-dominating-file file-path ceedling-project-file-name) ceedling-project-root)) - ) + (file-path (or file-name buffer-file-name)) + (root-path (or (locate-dominating-file file-path ceedling-project-file-name) ceedling-project-root)) + ) (compile (concat "cd " root-path " && " ceedling-cmd) ) @@ -1128,8 +1127,8 @@ in a local directory (on Linux this is ~/.local/share/fonts). (let ((dir default-directory)) (dolist (buffer (buffer-list)) (with-current-buffer buffer - (when (equal default-directory dir) - (myrmi/reload-dir-locals-for-current-buffer)))))) + (when (equal default-directory dir) + (myrmi/reload-dir-locals-for-current-buffer)))))) #+END_SRC ** Visit/reload config From e6e5b5e4613ef26e5b7ca1378aa5ecbaa7218e26 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:52:38 +0200 Subject: [PATCH 264/280] feat: Remove org-roam-ui Not using it, so don't have it. --- config.org | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/config.org b/config.org index 0390fca..ea4587d 100644 --- a/config.org +++ b/config.org @@ -917,27 +917,6 @@ Preserve indentation in SRC blocks ) #+END_SRC -*** UI - -#+BEGIN_SRC emacs-lisp -(use-package org-roam-ui - :ensure - (:host github :repo "org-roam/org-roam-ui" :branch "main" :files ("*.el" "out")) - :after org-roam -;; normally we'd recommend hooking orui after org-roam, but since org-roam does not have -;; a hookable mode anymore, you're advised to pick something yourself -;; if you don't care about startup time, use -;; :hook (after-init . org-roam-ui-mode) - :config - (setq org-roam-ui-sync-theme t - org-roam-ui-follow t - org-roam-ui-update-on-save t - org-roam-ui-open-on-start t) - ;; Start UI - ;; (org-roam-ui-mode) - ) -#+END_SRC - *** Consult #+BEGIN_SRC emacs-lisp From 3591e5704e7f4b4645d0f4d5369325dd80ac7368 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:01:17 +0200 Subject: [PATCH 265/280] fix: remove/apply defer only where it makes sense :defer is to defer loading because some other action (hook/config/...) will load it when appropriate. --- config.org | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/config.org b/config.org index ea4587d..cecb401 100644 --- a/config.org +++ b/config.org @@ -77,7 +77,6 @@ The audible bell is annoying AF. #+BEGIN_SRC emacs-lisp (use-package whitespace :ensure nil - :defer t :hook (before-save-hook . whitespace-cleanup) ;; if we wanna remove this hook at any time, eval: ;; (remove-hook 'before-save-hook #'whitespace-cleanup) @@ -637,7 +636,6 @@ https://github.com/abo-abo/hydra #+BEGIN_SRC emacs-lisp (use-package hydra - :defer t :config ;; Zoom hydra (defhydra hydra-zoom (global-map "") @@ -726,7 +724,9 @@ https://github.com/victorhge/iedit ** Markdown-mode #+BEGIN_SRC emacs-lisp -(use-package markdown-mode) +(use-package markdown-mode + :defer t +) #+END_SRC @@ -790,6 +790,7 @@ Move to the end if the compilation finishes. #+BEGIN_SRC emacs-lisp (use-package rust-mode + :defer t :init (setq rust-mode-treesitter-derive t)) #+END_SRC @@ -797,13 +798,17 @@ Move to the end if the compilation finishes. ** Zig #+BEGIN_SRC emacs-lisp -(use-package zig-mode) +(use-package zig-mode + :defer t + ) #+END_SRC ** Python #+BEGIN_SRC emacs-lisp -(use-package python-mode) +(use-package python-mode + :defer t + ) #+END_SRC * Multiple cursors @@ -896,6 +901,8 @@ Preserve indentation in SRC blocks #+BEGIN_SRC emacs-lisp (use-package org-bullets + :defer t + :after org :config (add-hook 'org-mode-hook (lambda () (org-bullets-mode)))) #+END_SRC @@ -904,6 +911,8 @@ Preserve indentation in SRC blocks #+BEGIN_SRC emacs-lisp (use-package org-roam + :defer t + :after org :custom (org-roam-directory "~/projects/notes") (org-roam-completion-everywhere t) @@ -957,6 +966,8 @@ Preserve indentation in SRC blocks #+BEGIN_SRC emacs-lisp (use-package org-download + :defer t + :after org :config (add-hook 'dired-mode-hook 'org-download-enable) ) From c809f480bd08d05413ac8f36d817f7e20d7ce536 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:02:27 +0200 Subject: [PATCH 266/280] fix: load theme after it is actually loaded, not at init time --- config.org | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config.org b/config.org index cecb401..d19c937 100644 --- a/config.org +++ b/config.org @@ -616,8 +616,7 @@ For the keybindings, we have to defien them in both raw and line mode. From the #+BEGIN_SRC emacs-lisp (use-package monokai-theme - - :init + :config (load-theme 'monokai t) ) #+END_SRC From 28b6168110e36e3b4122590d3cbb023c3a975e92 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:03:05 +0200 Subject: [PATCH 267/280] fix: refeactor electric pair It's a built-in package, so we can provide a proper configuration section using use-package. --- config.org | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index d19c937..7af261e 100644 --- a/config.org +++ b/config.org @@ -696,8 +696,12 @@ https://github.com/victorhge/iedit #+END_SRC ** Electric pair + #+BEGIN_SRC emacs-lisp -(add-hook 'prog-mode-hook 'electric-pair-mode) +(use-package elec-pair + :ensure nil + :defer t + :hook (prog-mode-hook . electric-pair-mode)) #+END_SRC ** Eglot From 980ce6750b0aceefba08c22a9203492d160bdabb Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:03:41 +0200 Subject: [PATCH 268/280] feat: Add paren package configuration show-paren-context-when-offscreen is handy to indicate when we are offscreen for a block of code --- config.org | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/config.org b/config.org index 7af261e..994938c 100644 --- a/config.org +++ b/config.org @@ -704,6 +704,18 @@ https://github.com/victorhge/iedit :hook (prog-mode-hook . electric-pair-mode)) #+END_SRC +** Paren + +#+BEGIN_SRC emacs-lisp +(use-package paren + :ensure nil + :hook (after-init-hook . show-paren-mode) + :custom + (show-paren-delay 0) + (show-paren-style 'mixed) + (show-paren-context-when-offscreen t)) ;; show matches within window splits +#+END_SRC + ** Eglot #+BEGIN_SRC emacs-lisp From 015ed00b0f39fd2cad2abc440e7f4afc95050b70 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:04:47 +0200 Subject: [PATCH 269/280] feat: refactor org mode configuration Defer loading to speed up startup and combine all the configuration of org mode in the same block. org-ellipsis is newly added and gives some eye candy when org blocks are folded. --- config.org | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/config.org b/config.org index 994938c..eb1224f 100644 --- a/config.org +++ b/config.org @@ -877,26 +877,27 @@ https://github.com/remyferre/comment-dwim-2 (add-hook 'project-find-functions #'project-projectile) ) #+END_SRC - * Org ** General config -*** Super/Sub-scripts - -Use ={}= for subscripting: - -https://orgmode.org/manual/Subscripts-and-superscripts.html #+BEGIN_SRC emacs-lisp -(setq org-use-sub-superscripts '{}) -#+END_SRC - -*** Indentation - -Preserve indentation in SRC blocks - -#+BEGIN_SRC emacs-lisp -(setq org-src-preserve-indentation t) +(use-package org + :ensure nil + :defer t + :mode ("\\.org\\'" . org-mode) + :config + (setq + ;; Start collapsed for speed + org-startup-folded t + ;; Use ={}= for subscripting: https://orgmode.org/manual/Subscripts-and-superscripts.html + org-use-sub-superscripts '{} + ;; Preserve indentation in SRC blocks + org-src-preserve-indentation t + ) + ;; Ellipsis styling + (setq org-ellipsis " ▼ ") + (set-face-attribute 'org-ellipsis nil :inherit 'default :box nil)) #+END_SRC ** Org-todo From 6a57cbfd1f319404033ddd75311de56da4b35901 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:46:43 +0200 Subject: [PATCH 270/280] feat: Add custom modeline --- config.org | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/config.org b/config.org index eb1224f..4a417e2 100644 --- a/config.org +++ b/config.org @@ -1002,6 +1002,36 @@ https://github.com/remyferre/comment-dwim-2 * Custom +** Modeline + +#+BEGIN_SRC emacs-lisp +(setq-default mode-line-format + '("%e" " " + ;; (:propertize " " display (raise +0.1)) ;; Top padding + ;; (:propertize " " display (raise -0.1)) ;; Bottom padding + (:propertize "𝝮 " face font-lock-keyword-face) + + (:propertize + ("" mode-line-mule-info mode-line-client mode-line-modified mode-line-remote mode-line-window-dedicated)) + + mode-line-frame-identification + mode-line-buffer-identification + " " + mode-line-position + mode-line-format-right-align + " " + (project-mode-line project-mode-line-format) + " " + (vc-mode vc-mode) + " " + mode-line-modes + mode-line-misc-info + mode-line-end-spaces) + project-mode-line t + mode-line-buffer-identification '(" %b") + mode-line-position-column-line-format '(" %l:%c")) +#+END_SRC + ** Org-roam Inspired by https://github.com/org-roam/org-roam/wiki/User-contributed-Tricks#filter-by-a-tag . From 0c18e02686cf000eae1dd4f7451c79ba8c0444aa Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:55:07 +0200 Subject: [PATCH 271/280] fix: liniting errors on init.el --- init.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/init.el b/init.el index a57c423..3f13d33 100644 --- a/init.el +++ b/init.el @@ -4,6 +4,9 @@ ;;; Commentary: ;;; Load init files + +;;; Code: + ;;; Increase garbage collection threshold during init but leave it to the default value after ;;; There are a LOT of articles/sites/... discussing this: ;;; https://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/ @@ -19,3 +22,7 @@ (load custom-file :no-error-if-file-is-missing) ) + +(provide 'init) + +;;; init.el ends here From c3a188defe7d1a44cbe87c60c6f683a65d7aba7b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 13:06:08 +0200 Subject: [PATCH 272/280] fix: Remove unused mark section M-SPC is used for selecting region anyway --- config.org | 6 ------ 1 file changed, 6 deletions(-) diff --git a/config.org b/config.org index 4a417e2..fcb643e 100644 --- a/config.org +++ b/config.org @@ -151,12 +151,6 @@ Use list-buffers bigger brother. (global-set-key [remap list-buffers] 'ibuffer) #+end_src -** Mark - -#+begin_src emacs-lisp -(global-set-key (kbd "M-SPC") 'mark-word) -#+end_src - ** Eldoc #+BEGIN_SRC emacs-lisp From 4aeb92eb6f69853a4ee304c69d5a699fe4448e68 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 13:06:26 +0200 Subject: [PATCH 273/280] feat: Add which-func configuration --- config.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config.org b/config.org index fcb643e..f91f1a1 100644 --- a/config.org +++ b/config.org @@ -205,6 +205,19 @@ https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch. ) #+END_SRC +** Which-func + +Show function we are currently in in the mode-line. + +#+BEGIN_SRC emacs-lisp +(use-package which-func + :ensure nil + :defer t + :hook + (prog-mode-hook . which-function-mode) + ) +#+END_SRC + ** Abbrev #+begin_src emacs-lisp From 8ba598127bc7952c8438f655d26ea7f808bf626d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 13:49:51 +0200 Subject: [PATCH 274/280] feat: show line numbers --- config.org | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config.org b/config.org index f91f1a1..1f33c7c 100644 --- a/config.org +++ b/config.org @@ -218,6 +218,13 @@ Show function we are currently in in the mode-line. ) #+END_SRC +** Line-numbers + +Show line numbers. +#+BEGIN_SRC emacs-lisp +(global-display-line-numbers-mode t) +#+END_SRC + ** Abbrev #+begin_src emacs-lisp From b79d782623162449a85c299abd5c67252ff3f76d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 14:06:08 +0200 Subject: [PATCH 275/280] feat: Make dashboard a bit fancier --- config.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config.org b/config.org index 1f33c7c..13cea1e 100644 --- a/config.org +++ b/config.org @@ -639,6 +639,12 @@ For the keybindings, we have to defien them in both raw and line mode. From the #+begin_src emacs-lisp (use-package dashboard + :custom + (dashboard-center-content t) ;; Center content + (dashboard-icon-type 'nerd-icons) ;; Nerd icons used + (dashboard-set-heading-icons t) ;; Heading icons enabled + (dashboard-set-file-icons t) ;; File icons enabled + (dashboard-startup-banner 'logo) ;; Use alternative logo :config (dashboard-setup-startup-hook)) #+end_src From 706b396e1c100092d75d6374a0107d2e75bd70cf Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 14:06:22 +0200 Subject: [PATCH 276/280] feat: load org-roam at startup --- config.org | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config.org b/config.org index 13cea1e..dc42e02 100644 --- a/config.org +++ b/config.org @@ -947,8 +947,7 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package org-roam - :defer t - :after org + :demand :custom (org-roam-directory "~/projects/notes") (org-roam-completion-everywhere t) From 423acecb38166cc301a3be909fd34b55aa57b095 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 24 Jul 2025 10:24:01 +0200 Subject: [PATCH 277/280] replace whitespace-cleanup with delete-trailing-whitespace whitespace-cleanup seems to do some formatting, tabs-to-whitespace and vice versa,... which are kinda annoying. We should be fine for now with just removing trailing whitespaces. --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index dc42e02..c421d39 100644 --- a/config.org +++ b/config.org @@ -77,7 +77,7 @@ The audible bell is annoying AF. #+BEGIN_SRC emacs-lisp (use-package whitespace :ensure nil - :hook (before-save-hook . whitespace-cleanup) + :hook (before-save-hook . delete-trailing-whitespace) ;; if we wanna remove this hook at any time, eval: ;; (remove-hook 'before-save-hook #'whitespace-cleanup) ) From 06208d5491a1e154721130c803f6aee83edd9bef Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 24 Jul 2025 10:24:54 +0200 Subject: [PATCH 278/280] feat: Display function name in header as well --- config.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.org b/config.org index c421d39..d40c03f 100644 --- a/config.org +++ b/config.org @@ -213,6 +213,8 @@ Show function we are currently in in the mode-line. (use-package which-func :ensure nil :defer t + :custom + (which-func-display mode-and-header) :hook (prog-mode-hook . which-function-mode) ) From 53aa91408cfb26aa7e7312d39157d6945599b2e6 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Thu, 14 Aug 2025 11:44:30 +0200 Subject: [PATCH 279/280] fix: which-func custom setting --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index d40c03f..fc60742 100644 --- a/config.org +++ b/config.org @@ -214,7 +214,7 @@ Show function we are currently in in the mode-line. :ensure nil :defer t :custom - (which-func-display mode-and-header) + (which-func-display 'mode-and-header) :hook (prog-mode-hook . which-function-mode) ) From b8adef76fb1759b3c63a28e702c1edd220207019 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Thu, 14 Aug 2025 11:44:38 +0200 Subject: [PATCH 280/280] chore: update gitignore with compile elpa files, org-roam-db, ... --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index ea48958..712c684 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,11 @@ backups eshell elpaca +eln-cache +elpa +org-roam.db +transient + # projectile projectile*