;;; oni-core.el --- Core Emacs configuration -*- lexical-binding: t; -*- ;; Copyright (C) 2019 Tom Willemse ;; Author: Tom Willemse ;; Keywords: local ;; Version: 2021.0701.142845 ;; Package-Requires: (oni-data-dir oni-embrace oni-hydra expand-region multiple-cursors gcmh diminish ws-butler which-key insert-char-preview dashboard) ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; Core Emacs configuration, doesn't need any requires from within ;; Emacs. These settings don't seem to go anywhere else. ;;; Code: (require 'diminish) (require 'gcmh) (require 'hydra) (require 'oni-data-dir) (require 'recentf) (require 'which-key) (require 'ws-butler) (require 'auth-source) (defconst oni-core--auto-save-directory (oni-data-dir-locate "auto-save-files/") "Directory where auto-saves go.") (defalias 'yes-or-no-p 'y-or-n-p) (defvar oni-core--recentf-idle-timer nil "Internal variable keeping track of a timer started for ‘recentf-save-list’.") (defun oni-core--switch-newline-keys () "Switch the ‘C-j’ and ‘RET’ keys in the local buffer." (if electric-indent-mode (progn (local-set-key (kbd "C-j") 'newline) (local-set-key (kbd "RET") 'electric-newline-and-maybe-indent)) (local-unset-key (kbd "C-j")) (local-unset-key (kbd "RET")))) (defun oni-core--ensure-autosave-directory-exists () "Create the autosave directory if doesn't exist." (mkdir oni-core--auto-save-directory t)) (defun oni-core-move-beginning-of-dwim () "Move to beginning of line either after indentation or before." (interactive) (let ((start (point))) (back-to-indentation) (unless (/= start (point)) (move-beginning-of-line 1)))) (defun oni-core-move-end-of-dwim () "Move to end of line, either before any comments or after." (interactive) (let ((start (point)) (eolpos (line-end-position))) (beginning-of-line) (if (and comment-start (not (looking-at (regexp-quote comment-start))) (comment-search-forward eolpos t)) (progn (search-backward-regexp (concat "[^ \t" comment-start "]")) (forward-char) (when (or (bolp) (= start (point))) (end-of-line))) (end-of-line)))) ;;; From Bastien Guerry’s Emacs configuraiton: ;;; https://github.com/bzg/dotemacs/blob/master/emacs.org (defun oni-core-unfill-paragraph () "Make a multi-line paragraph into a single line of text." (interactive) (let ((fill-column (point-max))) (fill-paragraph nil))) (defun oni-core-recentf-save-list-silently () "Call ‘recentf-save-list’ but without showing a message about it." (let ((inhibit-message t)) (recentf-save-list))) (defhydra oni-sort-and-align-hydra (:color teal :hint nil) " ^Sort^ ^^-------------- _l_: Lines _p_: Paragraph _s_: String list" ("l" sort-lines) ("p" (save-excursion (sort-lines nil (progn (start-of-paragraph-text) (point)) (progn (end-of-paragraph-text) (point))))) ("s" (sort-regexp-fields nil (rx "\"" (one-or-more (not "\"")) "\"") (rx (one-or-more (not "\""))) (region-beginning) (region-end)))) (add-to-list 'auto-save-file-name-transforms `(".*" ,oni-core--auto-save-directory t) :append) (setq backup-directory-alist `((".*" . ,(oni-data-dir-locate "backup-files")))) (setq auto-save-list-file-prefix (oni-data-dir-locate "auto-save-list/.saves-")) (setq abbrev-file-name (oni-data-dir-locate "abbrev_defs")) (setq recentf-save-file (oni-data-dir-locate "recentf")) ;;; Get rid of the default help tooltip on the mode-line. (setq mode-line-default-help-echo nil) (setq user-full-name "Tom Willemse" user-mail-address "tom@ryuslash.org") (setq delete-old-versions t) (setq kept-new-versions 20) (setq kept-old-versions 20) (setq vc-make-backup-files t) (setq version-control t) (setq require-final-newline t) (setq sentence-end-double-space nil) (setq inhibit-startup-screen t) (setq electric-pair-skip-whitespace 'chomp) (setq fit-window-to-buffer-horizontally t) (require 'dashboard) (dashboard-setup-startup-hook) (setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*"))) ;; Increase the threshold for garbage collection for increased performance. ;; Apparently there are some (lsp-mode for example) packages that generate a lot ;; of garbage. (setq gc-cons-threshold 100000000) ;;; Remove ~/.authinfo from the auth sources since it’s an unencripted file and ;;; I don’t want to accidentally store anything in there. (setq auth-sources (cons "secrets:Login" (remove "~/.netrc" (remove "~/.authinfo" auth-sources)))) (setq read-mail-command 'gnus) (setq-default indent-tabs-mode nil) (setq-default tab-width 4) (setq-default truncate-lines t) (setq-default fill-column 80) (add-hook 'before-save-hook 'time-stamp) (add-hook 'electric-indent-local-mode-hook #'oni-core--switch-newline-keys) (add-hook 'minibuffer-setup-hook 'electric-pair-local-mode) (add-hook 'prog-mode-hook 'goto-address-prog-mode) (add-hook 'auto-save-hook #'oni-core--ensure-autosave-directory-exists) (add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p) (global-set-key (kbd "C-M-SPC") 'er/expand-region) (global-set-key (kbd "C-S-b") 'windmove-left) (global-set-key (kbd "C-S-f") 'windmove-right) (global-set-key (kbd "C-S-n") 'windmove-down) (global-set-key (kbd "C-S-p") 'windmove-up) (global-set-key (kbd "C-c (") 'embrace-commander) (global-set-key (kbd "C-c q") #'oni-core-unfill-paragraph) (global-set-key (kbd "C-c s") #'oni-sort-and-align-hydra/body) (global-set-key (kbd "C-x C-b") 'ibuffer-jump) (global-set-key (kbd "C-x M-f") 'ffap) (global-set-key (kbd "M-+") 'mc/mark-next-like-this) (global-set-key [remap insert-char] 'insert-char-preview) (global-set-key [remap move-beginning-of-line] #'oni-core-move-beginning-of-dwim) (global-set-key [remap move-end-of-line] #'oni-core-move-end-of-dwim) (global-set-key (kbd "C-") 'winner-undo) (global-set-key (kbd "C-") 'winner-redo) (unless oni-core--recentf-idle-timer (setq oni-core--recentf-idle-timer (run-with-idle-timer 10 t #'oni-core-recentf-save-list-silently))) (with-eval-after-load 'gcmh (diminish 'gcmh-mode)) (with-eval-after-load 'ws-butler (diminish 'ws-butler-mode)) (with-eval-after-load 'which-key (diminish 'which-key-mode)) (electric-indent-mode -1) (winner-mode) (recentf-mode) (gcmh-mode) (ws-butler-global-mode) (which-key-mode) (auto-insert-mode) (add-to-list 'display-buffer-alist `(,(rx string-start "*" (any ?h ?H) "elp") display-buffer-in-side-window (side . bottom) (slot . 0) (window-height . 0.33))) (when (eql system-type 'windows-nt) (add-to-list 'load-path (locate-user-emacs-file "vendor/p4-vc")) (add-to-list 'exec-path "c:/Program Files/Git/bin") (add-to-list 'exec-path "C:/Program Files/Git/usr/bin") (add-to-list 'exec-path "c:/cygwin64/bin") (setq delete-by-moving-to-trash t) (setq-default buffer-file-coding-system 'utf-8-unix)) (provide 'oni-core) ;;; oni-core.el ends here