diff options
author | Franck Cuny <franck@fcuny.net> | 2024-04-02 19:26:01 -0700 |
---|---|---|
committer | Franck Cuny <franck@fcuny.net> | 2024-04-02 19:26:01 -0700 |
commit | a6145c74d2847c6ebc1911934bb11782b9986601 (patch) | |
tree | a3f0fa967cd8f4efb64c15a3b9d225ab2f20fc57 | |
parent | add a few more snippets for go (diff) | |
download | emacs.d-a6145c74d2847c6ebc1911934bb11782b9986601.tar.gz |
committing the whole configuration
Going to get rid of the org configuration, it's not super friendly for my workflow.
Diffstat (limited to '')
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | early-init.el | 23 | ||||
-rw-r--r-- | init.el | 1119 |
3 files changed, 1142 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore index 9d56bed..366c1cc 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,5 @@ /data*/ /eln-cache/ /elpa/ -/init.el -/early-init.el /url/ /eshell/ diff --git a/early-init.el b/early-init.el new file mode 100644 index 0000000..ab93a23 --- /dev/null +++ b/early-init.el @@ -0,0 +1,23 @@ +;;; early-init.el --- Early initialization -*- lexical-binding: t -*- + +;;; Commentary: + +;;; Code: + +;; disable GUI elements +(scroll-bar-mode -1) ; hide the scroll bar +(tool-bar-mode -1) ; hide the tool bar +(menu-bar-mode -1) ; hide the menu +(blink-cursor-mode -1) ; don't blink the cursor + +(setq make-pointer-invisible t) ;; hide cursor while typing +(setq use-dialog-box nil) ;; do not show GUI dialogs +(setq inhibit-startup-screen t) ;; hide the startup screen + +;; don't report warnings and errors related to native compilation +(setq native-comp-async-report-warnings-errors nil) + +;; increase font size +(set-face-attribute 'default nil :height 130) + +;;; early-init.el ends here diff --git a/init.el b/init.el new file mode 100644 index 0000000..361e2cd --- /dev/null +++ b/init.el @@ -0,0 +1,1119 @@ +;;; init.el --- This is where all emacs start. -*- lexical-binding: t -*- + +;;; Commentary: + +;;; Code: + +(setq gc-cons-percentage 0.5 + gc-cons-threshold (* 128 1024 1024)) + +(defconst emacs-start-time (current-time)) + +(defun report-time-since-load (&optional suffix) + (message "Loading init...done (%.3fs)%s" + (float-time (time-subtract (current-time) emacs-start-time)) + suffix)) + +(add-hook 'after-init-hook + #'(lambda () (report-time-since-load " [after-init]")) + t) + +(fset 'yes-or-no-p 'y-or-n-p) ; replace yes/no prompts with y/n + +;; set utf-8 as the default encoding +(prefer-coding-system 'utf-8-unix) +(setq locale-coding-system 'utf-8) +(set-language-environment 'utf-8) +(set-terminal-coding-system 'utf-8) +(set-keyboard-coding-system 'utf-8) + +(setq load-prefer-newer t) +(setq init-file-debug t) + +(package-initialize) + +(setq package-archives (append + package-archives + '(("melpa" . "https://melpa.org/packages/") + ("elpa" . "https://elpa.nongnu.org/nongnu/")))) + +(eval-and-compile + (defsubst emacs-path (path) + (expand-file-name path user-emacs-directory)) + + (setq package-enable-at-startup nil + load-path + (append (list (emacs-path "use-package")) + (delete-dups load-path) + (list (emacs-path "lisp"))))) + +(require 'use-package) + +(setq use-package-verbose init-file-debug + use-package-expand-minimally (not init-file-debug) + use-package-compute-statistics nil + debug-on-error init-file-debug) + +(use-package diminish :ensure t) + +(defconst user-data-directory + (emacs-path "data")) + +(defun user-data (dir) + (expand-file-name dir user-data-directory)) + +(setq custom-file (user-data "customizations.el")) +(load custom-file 'noerror) + +(defvar saved-window-configuration nil) + +(defun push-window-configuration () + (interactive) + (push (current-window-configuration) saved-window-configuration)) + +(defun pop-window-configuration () + (interactive) + (let ((config (pop saved-window-configuration))) + (if config + (set-window-configuration config) + (if (> (length (window-list)) 1) + (delete-window) + (bury-buffer))))) + +(defun my/rename-this-buffer-and-file () + "Renames current buffer and file it is visiting." + (interactive) + (let ((name (buffer-name)) + (filename (buffer-file-name)) + (read-file-name-function 'read-file-name-default)) + (if (not (and filename (file-exists-p filename))) + (error "Buffer '%s' is not visiting a file!" name) + (let ((new-name (read-file-name "New name: " filename))) + (cond ((get-buffer new-name) + (error "A buffer named '%s' already exists!" new-name)) + (t + (rename-file filename new-name 1) + (rename-buffer new-name) + (set-visited-file-name new-name) + (set-buffer-modified-p nil) + (message "File '%s' successfully renamed to '%s'" name (file-name-nondirectory new-name)))))))) + +(defun my/check-work-machine-p () + "Return t if this is a work machine." + (string-match "HQ\\.*" (system-name))) + +(defun my/github-code-search () + "Search code on github for a given language." + (interactive) + (let ((language (completing-read + "Language: " + '("Emacs Lisp" "Python" "Go" "Nix"))) + (code (read-string "Code: "))) + (browse-url + (concat "https://github.com/search?lang=" language + "&type=code&q=" code)))) + +(defun my/work-code-search () + "Search code on sourcegraph for a given language." + (interactive) + (let ((language (completing-read + "Language: " + '("Ruby" "Python" "Go"))) + (code (read-string "Code: "))) + (browse-url + (concat "https://sourcegraph.rbx.com/search?q=context:global+lang:" language + "+" code)))) + +(use-package abbrev + :diminish + :hook + ((text-mode prog-mode) . abbrev-mode) + :custom + (abbrev-file-name (emacs-path "abbrevs.el")) + ;; save abbrevs when files are saved + (save-abbrevs 'silently) + :config + (if (file-exists-p abbrev-file-name) + (quietly-read-abbrev-file))) + +(use-package autorevert + :custom + (auto-revert-use-notify nil) + :config + (global-auto-revert-mode t)) + +(use-package bookmark + :defer t + :custom + (bookmark-default-file (user-data "bookmarks"))) + +(use-package compile + :bind (:map compilation-mode-map + ("z" . delete-window)) + :custom + (compilation-always-kill t) + ;; Don't freeze when process reads from stdin + (compilation-disable-input t) + (compilation-ask-about-save nil) + (compilation-context-lines 10) + (compilation-scroll-output 'first-error) + (compilation-skip-threshold 2) + (compilation-window-height 100)) + +(use-package consult + :ensure t + :bind (("C-c m" . consult-mode-command) + ("M-g o" . consult-org-heading) + ("C-x b" . consult-buffer) + ("C-x r b" . consult-bookmark) + ("C-x p b" . consult-project-buffer) + ("C-c i" . consult-imenu) + ("M-g e" . consult-compile-error) + ("M-g g" . consult-goto-line) + ("M-g M-g" . consult-goto-line) + ("M-g m" . consult-mark) + ("M-g k" . consult-global-mark))) + +(use-package corfu + :ensure t + :demand t + :bind (("M-/" . completion-at-point) + :map corfu-map + ("C-n" . corfu-next) + ("C-p" . corfu-previous) + ("<return>" . corfu-insert) + ("M-d" . corfu-info-documentation) + ("M-l" . corfu-info-location) + ("M-." . corfu-move-to-minibuffer)) + :custom + ;; Works with `indent-for-tab-command'. Make sure tab doesn't indent when you + ;; want to perform completion + (tab-always-indent 'complete) + (completion-cycle-threshold t) ; Always show candidates in menu + + (corfu-auto t) + (corfu-auto-prefix 2) + (corfu-auto-delay 0.25) + + (corfu-min-width 80) + (corfu-max-width corfu-min-width) ; Always have the same width + (corfu-cycle t) + + ;; `nil' means to ignore `corfu-separator' behavior, that is, use the older + ;; `corfu-quit-at-boundary' = nil behavior. Set this to separator if using + ;; `corfu-auto' = `t' workflow (in that case, make sure you also set up + ;; `corfu-separator' and a keybind for `corfu-insert-separator', which my + ;; configuration already has pre-prepared). Necessary for manual corfu usage with + ;; orderless, otherwise first component is ignored, unless `corfu-separator' + ;; is inserted. + (corfu-quit-at-boundary nil) + (corfu-separator ?\s) ; Use space + (corfu-quit-no-match 'separator) ; Don't quit if there is `corfu-separator' inserted + (corfu-preview-current 'insert) ; Preview first candidate. Insert on input if only one + (corfu-preselect-first t) ; Preselect first candidate? + + ;; Other + (corfu-echo-documentation nil) ; Already use corfu-popupinfo + + :init + ;; see https://github.com/minad/corfu#completing-in-the-eshell-or-shell + (add-hook 'eshell-mode-hook + (lambda () + (setq-local corfu-auto nil) + (corfu-mode))) + :config + (global-corfu-mode)) + +(use-package corfu-popupinfo + :after corfu + :hook (corfu-mode . corfu-popupinfo-mode) + :bind (:map corfu-map + ("M-n" . corfu-popupinfo-scroll-up) + ("M-p" . corfu-popupinfo-scroll-down) + ([remap corfu-show-documentation] . corfu-popupinfo-toggle)) + :custom + (corfu-popupinfo-delay 0.5) + (corfu-popupinfo-max-width 70) + (corfu-popupinfo-max-height 20) + ;; Also here to be extra-safe that this is set when `corfu-popupinfo' is + ;; loaded. I do not want documentation shown in both the echo area and in + ;; the `corfu-popupinfo' popup. + (corfu-echo-documentation nil)) + +(use-package cape + :demand t + :ensure t + :bind (("C-c . p" . completion-at-point) + ("C-c . h" . cape-history) + ("C-c . f" . cape-file) + ("C-c . a" . cape-abbrev) + ("C-c . l" . cape-line) + ("C-c . w" . cape-dict) + ("C-c . r" . cape-rfc1345)) + :init + ;; Add `completion-at-point-functions', used by `completion-at-point'. + (add-to-list 'completion-at-point-functions #'cape-file) + (add-to-list 'completion-at-point-functions #'cape-abbrev)) + + (use-package marginalia + :ensure t + ;; Either bind `marginalia-cycle' globally or only in the minibuffer + :bind (:map minibuffer-local-map + ("M-A" . marginalia-cycle)) + + :init + ;; Must be in the :init section of use-package such that the mode gets + ;; enabled right away. Note that this forces loading the package. + (marginalia-mode)) + + (use-package orderless + :demand t + :ensure t + :custom + (completion-styles '(orderless basic)) + (completion-category-defaults nil)) + + (use-package vertico + :ensure t + :config + (vertico-mode)) + +(use-package yasnippet + :ensure t + :defer t + :diminish + :hook ((prog-mode . yas-minor-mode)) + :config + (yas-reload-all)) + +(use-package dired + :diminish + :bind (:map dired-mode-map + ("j" . dired) + ("z" . pop-window-configuration) + ("^" . dired-up-directory) + ("q" . pop-window-configuration) + ("M-!" . shell-command) + ("<tab>" . dired-next-window)) + :custom + (dired-clean-up-buffers-too nil) + (dired-dwim-target t) + (dired-hide-details-hide-information-lines nil) + (dired-hide-details-hide-symlink-targets nil) + (dired-listing-switches "-lah") + (dired-no-confirm + '(byte-compile chgrp chmod chown copy hardlink symlink touch)) + (dired-omit-mode nil t) + (dired-omit-size-limit 60000) + (dired-recursive-copies 'always) + (dired-recursive-deletes 'always) + :functions (dired-dwim-target-directory)) + + (use-package direnv + :ensure t + :custom + (direnv-always-show-summary nil) + :config + (direnv-mode)) + +(use-package docker + :bind ("C-c d" . docker) + :diminish + :init + (use-package docker-image :commands docker-images) + (use-package docker-volume :commands docker-volumes) + (use-package docker-network :commands docker-containers) + (use-package docker-compose :commands docker-compose) + + (use-package docker-container + :commands docker-containers + :custom + (docker-containers-shell-file-name "/bin/bash") + (docker-containers-show-all nil))) + +(use-package docker-compose-mode + :ensure t + :mode "docker-compose.*\.yml\\'") + +(use-package dockerfile-mode + :ensure t + :mode "Dockerfile[a-zA-Z.-]*\\'") + + (use-package emacs + :bind* ("M-j" . join-line) + + :custom-face + (cursor ((t (:background "hotpink")))) + ;; (highlight ((t (:background "blue4")))) + ;; (minibuffer-prompt ((t (:foreground "grey80")))) + ;; (mode-line-inactive ((t (:background "grey50")))) + (nobreak-space ((t nil))) + + :custom + (auto-save-default nil) ;; don't auto save files + (auto-save-list-file-prefix nil) ;; no backups + (create-lockfiles nil) ;; don't use a lock file + (confirm-kill-emacs #'yes-or-no-p) ;; ask before killing emacs + (make-backup-files nil) ;; really no backups + (minibuffer-message-timeout 0.5) ;; How long to display an echo-area message + (next-screen-context-lines 5) ;; scroll 5 lines at a time + (require-final-newline t) ;; ensure newline exists at the end of the file + (ring-bell-function 'ignore) ;; really no bell + (tab-always-indent 'complete) ;; when using TAB, always indent + (visible-bell nil) ;; no bell + (column-number-mode t) ;; show column number in the mode line + (electric-pair-mode 1) ;; matches parens and brackets + (indent-tabs-mode nil) ;; turn off tab indentation + (cursor-type 'box) ;; cursor is a horizontal bar + (delete-by-moving-to-trash t) ;; delete files by moving them to the trash + (initial-scratch-message "") ;; empty scratch buffer + (garbage-collection-messages t) ;; log when the gc kicks in + + ;; bytecomp.el + (byte-compile-verbose nil) + + ;; prog-mode.el + (prettify-symbols-unprettify-at-point 'right-edge) + + ;; startup.el + (auto-save-list-file-prefix (user-data "auto-save-list/.saves-")) + (initial-buffer-choice t) + (initial-major-mode 'fundamental-mode) + (initial-scratch-message "") + + (user-full-name "Franck Cuny") + (user-mail-address "franck@fcuny.net") + (add-log-mailing-address "franck@fcuny.net") + + (history-length 200) + (history-delete-duplicates t) + (completion-ignored-extensions + '(".class" + ".cp" + ".elc" + ".fmt" + ".git/" + ".pyc" + ".so" + "~")) + + ;; paragraphs.el + (sentence-end-double-space nil) + + ;; switch to view-mode whenever you are in a read-only buffer (e.g. + ;; switched to it using C-x C-q). + (view-read-only t) + + ;; window.el + (switch-to-buffer-preserve-window-point t) + + ;; warnings.el + (warning-minimum-log-level :error) + + ;; frame.el + (window-divider-default-bottom-width 1) + (window-divider-default-places 'bottom-only) + + ;; paren.el + (show-paren-delay 0) + (show-paren-highlight-openparen t) + (show-paren-when-point-inside-paren t) + (show-paren-when-point-in-periphery t) + + :config + (add-hook 'after-save-hook + #'executable-make-buffer-file-executable-if-script-p)) + +(use-package eshell + :commands (eshell eshell-command) + :custom + (eshell-directory-name (emacs-path "eshell")) + (eshell-hist-ignoredups t) + (eshell-history-size 50000) + (eshell-ls-dired-initial-args '("-h")) + (eshell-ls-exclude-regexp "~\\'") + (eshell-ls-initial-args "-h") + (eshell-modules-list + '(eshell-alias + eshell-basic + eshell-cmpl + eshell-dirs + eshell-glob + eshell-hist + eshell-ls + eshell-pred + eshell-prompt + eshell-rebind + eshell-script + eshell-term + eshell-unix + eshell-xtra)) + (eshell-prompt-function + (lambda nil + (concat (abbreviate-file-name (eshell/pwd)) + (if (= (user-uid) 0) + " # " " $ ")))) + (eshell-save-history-on-exit t) + (eshell-stringify-t nil) + (eshell-term-name "ansi") + + :preface + (defun eshell-initialize () + (add-hook 'eshell-expand-input-functions #'eshell-spawn-external-command) + + :init + (add-hook 'eshell-first-time-mode-hook #'eshell-initialize))) + +(use-package flymake + :bind (("C-c ! n" . flymake-goto-next-error) + ("C-c ! p" . flymake-goto-next-error)) + :custom + (flymake-start-on-save-buffer t) + (flymake-fringe-indicator-position 'left-fringe) + (flymake-suppress-zero-counters t) + (flymake-proc-compilation-prevents-syntax-check t) + (elisp-flymake-byte-compile-load-path load-path)) + +;; use various monaspace fonts +;; https://monaspace.githubnext.com +(set-face-attribute 'default nil + :font "Monaspace Neon" + :height 150) + +(set-face-attribute 'fixed-pitch nil + :font "Monaspace Neon" + :height 150) + +(set-face-attribute 'variable-pitch nil + :font "Monaspace Radon" + :height 150) + +(custom-set-faces + '(font-lock-comment-face ((t (:font "Monaspace Radon" :italic t :height 1.0))))) + +(use-package fringe + :config + ;;; no fringe on the right side + (set-fringe-mode '(8 . 0))) + + (use-package git-link + :defines git-link-remote-alist + :ensure t + :bind ("C-c Y" . git-link) + :commands (git-link git-link-commit git-link-homepage) + + :custom + (git-link-open-in-browser t) + + :preface + (defun git-link-fcuny-net (hostname dirname filename branch commit start end) + (format "http://git.fcuny.net/%s/tree/%s?id=%s#n%s" + (replace-regexp-in-string "^r/\\(.*\\)" "\\1.git" dirname) + filename + commit + start)) + + (defun git-link-commit-fcuny-net (hostname dirname commit) + (format "http://git.fcuny.net/%s/commit/?id=%s" + (replace-regexp-in-string "^r/\\(.*\\)" "\\1.git" dirname) + commit)) + + :config + (add-to-list 'git-link-remote-alist '("git\\.fcuny\\.net" git-link-fcuny-net)) + (add-to-list 'git-link-commit-remote-alist '("git\\.fcuny\\.net" git-link-commit-fcuny-net)) + + ;; sets up roblox git enterprise as a git-link handler + (add-to-list 'git-link-remote-alist '("github\\.rblx\\.com" git-link-github)) + (add-to-list 'git-link-commit-remote-alist '("github\\.rblx\\.com" git-link-commit-github))) + +(use-package ibuffer + :bind ("C-x C-b" . ibuffer) + :custom + (ibuffer-default-display-maybe-show-predicates t) + (ibuffer-expert t) + (ibuffer-formats + '((mark modified read-only " " + (name 16 -1) + " " + (size 6 -1 :right) + " " + (mode 16 16) + " " filename) + (mark " " + (name 16 -1) + " " filename))) + (ibuffer-maybe-show-regexps nil) + (ibuffer-saved-filter-groups + '(("default" + ("Magit" + (or + (mode . magit-status-mode) + (mode . magit-log-mode) + (name . "\\*magit") + (name . "magit-") + (name . "git-monitor"))) + ("Commands" + (or + (mode . shell-mode) + (mode . eshell-mode) + (mode . term-mode) + (mode . compilation-mode))) + ("Rust" + (or + (mode . rust-mode) + (mode . cargo-mode) + (name . "\\*Cargo") + (name . "^\\*rls\\(::stderr\\)?\\*") + (name . "eglot"))) + ("Nix" + (mode . nix-mode)) + ("Lisp" + (mode . emacs-lisp-mode)) + ("Dired" + (mode . dired-mode)) + ("Org" + (or + (name . "^\\*Calendar\\*$") + (name . "^\\*Org Agenda") + (name . "^ \\*Agenda") + (name . "^diary$") + (mode . org-mode))) + ("Emacs" + (or + (name . "^\\*scratch\\*$") + (name . "^\\*Messages\\*$") + (name . "^\\*\\(Customize\\|Help\\)") + (name . "\\*\\(Echo\\|Minibuf\\)")))))) + (ibuffer-show-empty-filter-groups nil) + (ibuffer-shrink-to-minimum-size t t) + (ibuffer-use-other-window t) + :init + (add-hook 'ibuffer-mode-hook + #'(lambda () + (ibuffer-switch-to-saved-filter-groups "default")))) + +(use-package indent + :commands indent-according-to-mode + :custom + (tab-always-indent 'complete)) + + (use-package ispell + :custom + (ispell-program-name (executable-find "aspell")) + (ispell-dictionary "en_US") + (ispell-extra-args '("--camel-case"))) + + (use-package jq-mode + :ensure t + :mode "\\.jq\\'") + +(use-package eglot + :ensure t + :after yasnippet + :bind (:map eglot-mode-map + ("C-c l a" . eglot-code-actions) + ("C-c l r" . eglot-rename)) + :config + (setq-default eglot-workspace-configuration + '((gopls + (usePlaceholders . t) + (staticcheck . t) + (completeUnimported . t)))) + + ;; uses https://github.com/oxalica/nil for the LSP server instead of rnix + (add-to-list 'eglot-server-programs '(nix-mode . ("nixd")))) + +(use-package tree-sitter + :ensure t + :config + (global-tree-sitter-mode)) + +(use-package tree-sitter-langs + :after tree-sitter + :ensure t) + +(use-package emacs-lisp-mode + :bind (:map emacs-lisp-mode-map + ("C-c C-r" . eval-region) + ("C-c C-d" . eval-defun) + ("C-c C-b" . eval-buffer)) + :hook ((emacs-lisp-mode . flymake-mode))) + +(use-package eldoc + :diminish + :hook ((c-mode-common emacs-lisp-mode) . eldoc-mode) + :custom + (eldoc-idle-delay 1) + (eldoc-documentation-strategy #'eldoc-documentation-default) + (eldoc-echo-area-use-multiline-p 3) + (eldoc-echo-area-prefer-doc-buffer 'maybe) + (eldoc-echo-area-display-truncation-message nil)) + + (use-package hcl-mode + :ensure t + :mode "\.nomad\\'") + +(use-package json-mode + :mode "\\.json\\'") + +(use-package json-reformat + :ensure t + :after json-mode) + +(use-package go-mode + :ensure t + :defer t + :hook ((go-mode . tree-sitter-hl-mode) + (go-mode . eglot-ensure) + (go-mode . (lambda () (setq tab-width 4))) + (go-mode . (lambda () (add-hook 'before-save-hook 'eglot-format-buffer nil t)))) + :bind (:map go-mode-map + ("C-c C-c" . compile))) + +(use-package gotest + :ensure t + :after go-mode + :custom + (go-test-verbose t)) + + (use-package nix-mode + :ensure t + :hook ((nix-mode . eglot-ensure) + (nix-mode . (lambda () (add-hook 'before-save-hook 'eglot-format-buffer nil t)))) + :custom + (nix-indent-function 'nix-indent-line)) + + (use-package protobuf-mode + :ensure t + :mode "\\.proto\\'") + +(use-package python-mode + :hook ((python-mode . tree-sitter-hl-mode) + (python-mode . eglot-ensure)) + :interpreter "python" + :bind (:map python-mode-map + ("C-c c") + ("C-c C-z" . python-shell))) + +(use-package blacken + :ensure t + :hook (python-mode . blacken-mode)) + + (use-package py-isort + :ensure t + :commands (py-isort-buffer py-isort-region)) + + (use-package ruby-mode + :mode "\\.rb\\'" + :interpreter "ruby" + :bind (:map ruby-mode-map + ("<return>" . my-ruby-smart-return)) + :preface + (defun my-ruby-smart-return () + (interactive) + (when (memq (char-after) '(?\| ?\" ?\')) + (forward-char)) + (call-interactively 'newline-and-indent))) + +(use-package sh-script + :defer t + :preface + (defvar sh-script-initialized nil) + + (defun initialize-sh-script () + (unless sh-script-initialized + (setq sh-script-initialized t) + (info-lookup-add-help :mode 'shell-script-mode + :regexp ".*" + :doc-spec '(("(bash)Index"))))) + :init + (add-hook 'shell-mode-hook #'initialize-sh-script)) + +(use-package terraform-mode + :ensure t + :mode "\.tf\\'") + +(use-package toml-mode + :defer t + :ensure t) + +(use-package yaml-mode + :ensure t + :mode "\\.ya?ml\\'") + +(when (memq window-system '(mac ns)) + (add-to-list 'default-frame-alist '(fullscreen . maximized)) + (add-to-list 'default-frame-alist '(ns-appearance . nil)) + (add-to-list 'default-frame-alist '(ns-transparent-titlebar . nil)) + (when (boundp 'ns-use-native-fullscreen) + (setq ns-use-native-fullscreen nil)) + (when (boundp 'mac-allow-anti-aliasing) + (setq mac-allow-anti-aliasing t))) + +(use-package exec-path-from-shell + :ensure t + :demand t + :if (memq window-system '(mac ns)) + :config + (exec-path-from-shell-initialize)) + + (use-package magit + :defer t + :ensure t + :bind (("C-x g" . magit-status) + ("C-x G" . magit-status-with-prefix)) + :custom + (magit-diff-options nil) + (magit-diff-refine-hunk t) + (magit-fetch-arguments nil) + (magit-log-section-commit-count 10) + (magit-pre-refresh-hook nil) + (magit-process-popup-time 15) + (magit-clone-default-directory "~/workspace/") + (magit-section-initial-visibility-alist '((untracked . hide))) + :hook (magit-mode . hl-line-mode) + :config + (use-package magit-commit + :defer t + :config + (use-package git-commit + :custom + (git-commit-major-mode 'markdown-mode) + (git-commit-setup-hook + '(git-commit-save-message + git-commit-turn-on-auto-fill + git-commit-turn-on-flyspell + bug-reference-mode)))) + + (use-package magit-status + :defer t + :config + (dolist (func '(magit-insert-unpushed-to-upstream-or-recent + magit-insert-unpulled-from-pushremote + magit-insert-unpulled-from-upstream + )) + (remove-hook 'magit-status-sections-hook func)) + + (dolist (func '(magit-insert-diff-filter-header + magit-insert-tags-header)) + (remove-hook 'magit-status-headers-hook func)))) + +(use-package markdown-mode + :mode (("\\`README\\.md\\'" . gfm-mode) + ("\\.md\\'" . markdown-mode) + ("\\.markdown\\'" . markdown-mode)) + :custom + (markdown-command "pandoc -f markdown_github+smart") + (markdown-command-needs-filename t) + (markdown-enable-math t) + (markdown-open-command "marked") + :init + (setq markdown-command "multimarkdown")) + + (use-package markdown-preview-mode + :ensure t + :after markdown-mode + :config + (setq markdown-preview-stylesheets + (list (concat "https://github.com/dmarcotte/github-markdown-preview/" + "blob/master/data/css/github.css")))) + +(use-package midnight + :demand t + :bind ("C-c z" . clean-buffer-list) + :custom + (midnight-delay 18000) + (clean-buffer-list-kill-never-buffer-names + '("*scratch*" + "*Messages*" + "*server*" + "*Group*" + "*Org Agenda*" + "todo.org")) + (clean-buffer-list-kill-never-regexps + '("^ \\*Minibuf-.*\\*$" + "^\\*Summary" + "^\\*Article" "^#")) + (clean-buffer-list-kill-regexps '(".*")) + :config + (midnight-mode t)) + +(use-package my-cheeseboard) + +(use-package my-uptime + :init + (add-to-list 'display-buffer-alist '("\\*slo-calculator\\*" + (display-buffer-in-side-window) + (side . left) + (slot . 0) + (window-width . 0.35)))) + + (use-package org + :hook + (org-mode . turn-on-flyspell) + (org-mode . visual-line-mode) + (org-mode . org-indent-mode) + :custom + ;;; general settings + (org-startup-folded t) + (org-startup-indented t) + (org-hide-emphasis-markers t) + (org-hide-leading-stars t) + (org-pretty-entities t) + (org-return-follows-link t) + (org-startup-with-inline-images t) + (org-export-backends '(html md)) + (org-imenu-depth 4) + (org-insert-heading-respect-content t) + (org-outline-path-complete-in-steps nil) + (org-src-fontify-natively t) + (org-src-preserve-indentation t) + (org-src-tab-acts-natively t) + (org-src-window-setup 'current-window) + (org-yank-adjusted-subtrees t) + (org-structure-template-alist + '(("s" . "src") + ("E" . "src emacs-lisp") + ("p" . "src python") + ("e" . "example") + ("q" . "quote") + ("V" . "verbatim"))) + :config + (font-lock-add-keywords 'org-mode + '(("^ *\\(-\\) " + (0 (ignore (compose-region (match-beginning 1) (match-end 1) "•"))))))) + +(use-package org-bullets + :ensure t + :hook (org-mode . org-bullets-mode)) + +(use-package org-auto-tangle + :ensure t + :hook (org-mode . org-auto-tangle-mode)) + +(use-package org-babel + :no-require t + :after (org) + :config + (org-babel-do-load-languages + 'org-babel-load-languages + '((python . t) + (emacs-lisp . t) + (calc . t) + (shell . t) + (sql . t) + (dot . t))) + + (remove-hook 'kill-emacs-hook 'org-babel-remove-temporary-directory) + + (advice-add 'org-babel-edit-prep:emacs-lisp :after + #'(lambda (_info) (run-hooks 'emacs-lisp-mode-hook)))) + +(use-package ox-gfm + :ensure t + :after org) + +(use-package ox-md + :after org) + +(use-package ox-pandoc + :ensure t + :after org + :preface + (defun markdown-to-org-region (start end) + "Convert region from markdown to org, replacing selection" + (interactive "r") + (shell-command-on-region start end "pandoc -f markdown -t org" t t))) + + (use-package project + :ensure nil + :custom + (project-switch-commands + '((project-dired "Root" ?d) + (project-find-file "File" ?f) + (project-switch-to-buffer "Buffer" ?b) + (project-eshell "Shell" ?e) + (magit-project-status "Git" ?g))) + :init + (setq-default project-list-file (user-data "projects.eld"))) + +(use-package recentf + :demand t + :commands (recentf-mode + recentf-add-file + recentf-apply-filename-handlers) + :custom + (recentf-auto-cleanup 60) + (recentf-exclude + '("~\\'" "\\`out\\'" "\\.log\\'" "^/[^/]*:" "\\.el\\.gz\\'" "\\.gz\\'")) + (recentf-max-saved-items 2000) + (recentf-save-file (user-data "recentf")) + :preface + :config + (recentf-mode 1)) + +(use-package restclient + :ensure t + :mode ("\\.rest\\'" . restclient-mode)) + + (use-package rg + :ensure t + :custom ((rg-group-result t) + (rg-show-columns t) + (rg-align-line-number-field-length 3) + (rg-align-column-number-field-length 3) + (rg-align-line-column-separator "#") + (rg-align-position-content-separator "|") + (rg-hide-command nil) + (rg-align-position-numbers t) + (rg-command-line-flags '("--follow")))) + +(use-package savehist + :unless noninteractive + :custom + (savehist-additional-variables + '(file-name-history + kmacro-ring + compile-history + compile-command)) + (savehist-autosave-interval 60) + (savehist-file (user-data "history")) + (savehist-ignored-variables + '(load-history + flyspell-auto-correct-ring + org-roam-node-history + magit-revision-history + org-read-date-history + query-replace-history + yes-or-no-p-history + kill-ring)) + (savehist-mode t) + :config + (savehist-mode 1)) + +(use-package saveplace + :unless noninteractive + :custom + (save-place-file (user-data "places")) + :config + (save-place-mode 1)) + +(use-package modus-themes + :ensure t + :custom + ;; Syntax Highlighting + (modus-themes-bold-constructs t) + (modus-operandi-palette-overrides '((comment red-faint) + (string "#101010") + (bg-main "#FFFCF6"))) + + (modus-themes-italic-constructs t) + + ;; Use mixed fonts + (modus-themes-mixed-fonts t) + (modus-themes-variable-pitch-ui t) + + ;; Enhance minibuffer completions + (modus-themes-prompts '(italic bold)) + (modus-themes-completions '((matches . (extrabold)) + (selection . (semibold italic text-also)))) + + ;; Org Mode + ;;; Make headings in org files more distinct + (modus-themes-headings '((t . (background bold rainbow 1)))) + ;;; Tint the background of code blocks in org files + (modus-themes-org-blocks 'tinted-background) + ;;; Make tags less colorful and tables look the same as + ;;; the default foreground. + (prose-done cyan-cooler) + (prose-tag fg-dim) + (prose-table fg-main) + + ;; Make the fringe more intense + (modus-themes-common-palette-overrides '((fringe bg-active))) + + :config + (load-theme 'modus-operandi t)) + +(use-package time + :custom + (display-time-interval 60) + (display-time-mode t) + (display-time-24hr-format t) + (display-time-day-and-date t) + (display-time-default-load-average nil) + (world-clock-list t) + (world-clock-timer-enable t) + (world-clock-timer-second 60) + ;; UTC => 02:42 +0000 Wednesday 20 April + ;; Berkeley => 19:42 -0700 Tuesday 19 April + (world-clock-time-format "%R %z %A %d %B") + (zoneinfo-style-world-list '(("UTC" "UTC") + ("America/Los_Angeles" "Berkeley") + ("America/Denver" "Mountain Time") + ("America/Chicago" "Central Time") + ("America/New_York" "New York") + ("Europe/London" "London") + ("Europe/Paris" "Paris"))) + :init + (add-to-list 'display-buffer-alist '("\\*wclock\\*" + (display-buffer-in-side-window) + (side . left) + (slot . 0) + (window-width . 0.35)))) + + (use-package tramp + :defer t + :custom + (tramp-default-method "ssh") + (tramp-auto-save-directory "~/.cache/emacs/backups") + (tramp-ssh-controlmaster-options "-o ControlMaster=auto -o ControlPath='tramp.%%C'") + :config + ;; Setting this with `:custom' does not take effect. + (setq tramp-persistency-file-name (user-data "tramp"))) + +(use-package transient + :defer t + :custom + (transient-history-file (user-data "transient/history.el")) + (transient-values-file (user-data "transient/values.el"))) + +(use-package vc + :defer t + :custom + (vc-command-messages t) + (vc-follow-symlinks t)) + +(use-package which-key + :demand t + :diminish + :ensure t + :config + (which-key-mode)) + +(use-package whitespace + :diminish (global-whitespace-mode + whitespace-mode + whitespace-newline-mode) + :commands (whitespace-buffer + whitespace-cleanup + whitespace-mode + whitespace-turn-off) + :init + (dolist (hook '(prog-mode-hook text-mode-hook)) + (add-hook hook #'whitespace-mode)) + :custom + (whitespace-auto-cleanup t t) + (whitespace-rescan-timer-time nil t) + (whitespace-silent t t) + (whitespace-style '(face trailing space-before-tab)) + :defines + (whitespace-auto-cleanup + whitespace-rescan-timer-time + whitespace-silent)) + +(report-time-since-load) + +;; Local Variables: +;; byte-compile-warnings: (not docstrings lexical noruntime) +;; End: |