From 29732f9621c2024a92236971348c053f0b165779 Mon Sep 17 00:00:00 2001 From: Armin Friedl Date: Sun, 7 Feb 2021 17:58:53 +0100 Subject: [PATCH] Add base configs --- config/base-config.el | 95 ++++++++++++++++++++++++++++++++++++++ config/base-keybindings.el | 0 config/base-libs.el | 6 +++ config/company.el | 4 ++ config/diminish.el | 1 + config/eglot.el | 9 ++++ config/evil.el | 18 ++++++++ config/git.el | 73 +++++++++++++++++++++++++++++ config/ido.el | 17 +++++++ config/magit.el | 0 config/markdown.el | 9 ++++ config/theme.el | 6 +++ init.el | 33 +++++++++++-- 13 files changed, 266 insertions(+), 5 deletions(-) create mode 100644 config/base-config.el create mode 100644 config/base-keybindings.el create mode 100644 config/base-libs.el create mode 100644 config/company.el create mode 100644 config/diminish.el create mode 100644 config/eglot.el create mode 100644 config/evil.el create mode 100644 config/git.el create mode 100644 config/ido.el create mode 100644 config/magit.el create mode 100644 config/markdown.el create mode 100644 config/theme.el diff --git a/config/base-config.el b/config/base-config.el new file mode 100644 index 0000000..62834fd --- /dev/null +++ b/config/base-config.el @@ -0,0 +1,95 @@ +;; use soft tabs +(setq-default indent-tabs-mode nil) + +;; make prompts accept y or n +(defalias 'yes-or-no-p #'y-or-n-p) + +;; no confirmation for non-existent files or buffers +(setq confirm-nonexistent-file-or-buffer nil) + +;; disable audible bell +(setq ring-bell-function #'ignore) + +;; scroll one line at a time +(setq mouse-wheel-scroll-amount + '(1 + ((shift) . 5) + ((control)))) + +;; disable scroll acceleration +(setq mouse-wheel-progressive-speed nil) + +;; reload buffers automatically when files change on disk +(use-package autorevert + :diminish auto-revert-mode + :init + ;; revert buffers quietly + (setq auto-revert-verbose nil) + :config + (global-auto-revert-mode 1)) + +;; integrate with X clipboard +(setq select-enable-clipboard t) + +;; ensure clipboard strings are saved into kill ring +(setq save-interprogram-paste-before-kill t) + +;; move deleted files to trash +(setq delete-by-moving-to-trash t) + +;; show keystrokes immediately +(setq echo-keystrokes 0.1) + +;; add directory to buffer name if filename is not unique +(setq uniquify-buffer-name-style 'forward) + +;; automatically determine major-mode for newly created buffers +(setq-default major-mode + (lambda () + (unless buffer-file-name + (let ((buffer-file-name (buffer-name))) + (set-auto-mode t))))) + +;; single space ends a sentence +(setq-default sentence-end-double-space nil) + +;; default to 80 chars fill-column +(setq-default fill-column 80) + +;; confirm when exiting +(setq confirm-kill-emacs #'y-or-n-p) + +;; backup files +(setq make-backup-files t + backup-directory-alist `(("." . ,(expand-file-name "backup" + user-emacs-directory))) + backup-by-copying t + delete-old-versions t + version-control t + vc-make-backup-files t + kept-new-versions 6 + kept-old-versions 2) + +;; preserve point position when scrolling +(setq scroll-preserve-screen-position 'always) + +;; always add newline at the end of the file +;; (setq require-final-newline t) + +;; remember position in previously visited files +(use-package saveplace + :config + (save-place-mode 1)) + +;; monday is the first day of the week +(setq calendar-week-start-day 1) + +;; turn off distractions +(tool-bar-mode -1) +(menu-bar-mode -1) +(scroll-bar-mode -1) + +;; font +(-let [font (font-spec :name "Source Code Pro" :size 12.0)] + (set-face-attribute 'default nil :font font) + (set-frame-font font nil 't)) diff --git a/config/base-keybindings.el b/config/base-keybindings.el new file mode 100644 index 0000000..e69de29 diff --git a/config/base-libs.el b/config/base-libs.el new file mode 100644 index 0000000..7975612 --- /dev/null +++ b/config/base-libs.el @@ -0,0 +1,6 @@ +;; Install basic convenience libraries everything else can rely upon. Must be +;; initialized first thing after `straight' setup. +(use-package dash) +(use-package dash-functional) +(use-package f) +(use-package s) diff --git a/config/company.el b/config/company.el new file mode 100644 index 0000000..9f33236 --- /dev/null +++ b/config/company.el @@ -0,0 +1,4 @@ +(use-package company + :diminish company-mode abbrev-mode + :init + (add-hook 'after-init-hook 'global-company-mode)) diff --git a/config/diminish.el b/config/diminish.el new file mode 100644 index 0000000..b188ab4 --- /dev/null +++ b/config/diminish.el @@ -0,0 +1 @@ +(use-package diminish) diff --git a/config/eglot.el b/config/eglot.el new file mode 100644 index 0000000..9d33f53 --- /dev/null +++ b/config/eglot.el @@ -0,0 +1,9 @@ +(use-package project + :demand 't) + +(use-package eglot + :after project + :config + (add-hook 'c-mode-common-hook 'eglot-ensure) + ;; shadow default ccls + (push '((c-mode c++-mode) "clangd") eglot-server-programs)) diff --git a/config/evil.el b/config/evil.el new file mode 100644 index 0000000..21fff61 --- /dev/null +++ b/config/evil.el @@ -0,0 +1,18 @@ +(use-package evil + :init + (setq evil-want-integration t) ;; This is optional since it's already set to t by default. + (setq evil-want-keybinding nil) + :config + (evil-mode 1)) + +(use-package evil-collection + :after evil + :config + (evil-collection-init)) + +(use-package evil-escape + :after evil + :diminish evil-escape-mode + :config + (setq-default evil-escape-key-sequence "jk") + (evil-escape-mode)) diff --git a/config/git.el b/config/git.el new file mode 100644 index 0000000..67741ec --- /dev/null +++ b/config/git.el @@ -0,0 +1,73 @@ +;; https://raw.githubusercontent.com/mpolden/emacs.d/master/lisp/init-git.el +(use-package git-commit + :after markdown-mode + + :init + ;; use gfm-mode as major mode + (setq git-commit-major-mode 'gfm-mode)) + +(defun magit-visit-file-other-window (&optional noselect) + "Visit current file in another window." + (interactive) + (let ((current-window (selected-window))) + (call-interactively 'magit-diff-visit-file-other-window) + (when noselect + (select-window current-window)))) + +(defun magit-visit-file-other-window-noselect () + "Visit current file in another window, but don't select it." + (interactive) + (magit-visit-file-other-window t)) + +(use-package magit + :init + ;; disable gravatars + (setq magit-revision-show-gravatars nil) + + ;; hide recent commits in magit-status + (setq magit-log-section-commit-count 0) + + ;; set the default directory for git repositories + (let ((project-dir "~/p")) + (when (and (not (boundp 'magit-repository-directories)) (file-directory-p project-dir)) + (setq magit-repository-directories (list (cons project-dir 1))))) + + :bind (("C-x m" . magit-status) + ("C-c b" . magit-blame) + :map magit-status-mode-map + ;; make C-o and o behave as in dired + ("o" . magit-visit-file-other-window) + ("C-o" . magit-visit-file-other-window-noselect))) + +(use-package forge + :ensure t + :after magit + :init + ;; limit number of topics listed in status buffer + (setq forge-topic-list-limit '(10 . 0)) + :bind (;; killing in pullreq or issue section copies the url at point + :map forge-pullreq-section-map + ([remap magit-delete-thing] . forge-copy-url-at-point-as-kill) + :map forge-issue-section-map + ([remap magit-delete-thing] . forge-copy-url-at-point-as-kill))) + +;; follow symlinks to files under version control +(setq vc-follow-symlinks t) + +;; limit vc backends as this may speed up some operations, e.g. tramp +(setq vc-handled-backends '(Git)) + +(defun vc-git-grep-root (&optional dir) + (interactive) + (let ((search-regexp (grep-read-regexp)) + (dir (or dir (vc-git-root default-directory)))) + (vc-git-grep search-regexp "" dir))) + +;; (use-package vc-git +;; :after grep +;; :bind (;; C-c g runs git grep in repository +;; "C-c g" . vc-git-grep-root)) + +(use-package smerge-mode + :init + (setq smerge-command-prefix (kbd "C-c x"))) diff --git a/config/ido.el b/config/ido.el new file mode 100644 index 0000000..764127b --- /dev/null +++ b/config/ido.el @@ -0,0 +1,17 @@ +(use-package flx) + +(use-package counsel ;; counsel brings in ivy and swiper as dependencies + ;; needed for ivy--regex-fuzzy + :after flx + :diminish ivy-mode + :init + ;; use fuzzy matching by default. Needs flx. + (setq ivy-re-builders-alist '((t . ivy--regex-fuzzy))) + + :config + (setq ivy-use-virtual-buffers t) + (setq ivy-count-format "(%d/%d) ") + (ivy-mode 1) + + :bind + ([ remap isearch-forward ] . 'swiper)) diff --git a/config/magit.el b/config/magit.el new file mode 100644 index 0000000..e69de29 diff --git a/config/markdown.el b/config/markdown.el new file mode 100644 index 0000000..06f571f --- /dev/null +++ b/config/markdown.el @@ -0,0 +1,9 @@ +(use-package markdown-mode + :ensure t + :commands gfm-mode + :mode + ;; use gfm mode for .md and .markdown extensions + (("\\.\\(md\\|markdown\\)\\'" . gfm-mode) + ;; use gfm mode for pull request and issue buffers + ("PULLREQ_EDITMSG" . gfm-mode) + ("ISSUE_EDITMSG" . gfm-mode))) diff --git a/config/theme.el b/config/theme.el new file mode 100644 index 0000000..f14fa3e --- /dev/null +++ b/config/theme.el @@ -0,0 +1,6 @@ +(use-package doom-themes) +(use-package modus-themes + :config + (load-theme 'modus-operandi t)) + +(setq custom-theme-allow-multiple-selections nil) diff --git a/init.el b/init.el index 6835d51..cbfea5b 100644 --- a/init.el +++ b/init.el @@ -2,15 +2,11 @@ ;;; Prolog -(let ((minver "26.1")) - (when (version< emacs-version minver) - (error "Emacs v%s or higher is required." minver))) - ;; don't GC during startup to save time (setq gc-cons-percentage 0.6) (setq gc-cons-threshold most-positive-fixnum) -;;; straight and use-package setup +;;; Straight setup with use-package integration (defconst straight-use-package-by-default 't) (defconst bootstrap-version 5) @@ -25,6 +21,33 @@ (eval-print-last-sexp))) (load bootstrap-file nil 'nomessage)) +;; call `straight-use-package' once directly to install `use-package'. Other +;; than here the integration is vice versa. I.e. `use-package' uses `straight' +;; internally to fetch packages. +(straight-use-package 'use-package) + +(add-to-list 'load-path (expand-file-name "config" user-emacs-directory)) + +;; Base config +(load "base-libs") ;; utility libs everything else can rely upon. Load + ;; this first. +(load "base-config") ;; emacs core configuration +(load "diminish") +(load "evil") +(load "ido") +(load "company") +(load "theme") + +;; Tools +(load "git") + +;; Languages +(load "markdown") +(load "eglot") + + +(load "base-keybindings") ;; load this last to ensure all bound symbols are in + ;; scope and `base-keybindings' takes precedence ;;; Epilog