diff options
Diffstat (limited to 'emacs')
-rw-r--r-- | emacs/.emacs.d/init.org | 197 |
1 files changed, 157 insertions, 40 deletions
diff --git a/emacs/.emacs.d/init.org b/emacs/.emacs.d/init.org index 45b2a449..a34f148d 100644 --- a/emacs/.emacs.d/init.org +++ b/emacs/.emacs.d/init.org @@ -18,6 +18,17 @@ Open Emacs with just a plain window. No graphics or messages, please! (remove-hook 'find-file-hooks #'vc-refresh-state) #+END_SRC +Are we running on Windows via the WSL? + +#+BEGIN_SRC emacs-lisp +(when (file-exists-p "/proc/sys/kernel/osrelease") + (with-temp-buffer + (insert-file-contents-literally "/proc/sys/kernel/osrelease") + (decode-coding-region (point-min) (point-max) 'utf-8 t) + (when (string-match "Microsoft$" (buffer-string)) + (setq system-type 'gnu/linux/windows)))) +#+END_SRC + ** Compatibility #+BEGIN_SRC emacs-lisp @@ -76,8 +87,7 @@ the buffer to be empty. (use-package use-package :commands (use-package-autoload-keymap) :defer 5)) -(setq use-package-verbose t - use-package-always-ensure t +(setq use-package-always-ensure t package-enable-at-startup nil) #+END_SRC @@ -170,10 +180,19 @@ Eziam looks nice, too #+BEGIN_SRC emacs-lisp (use-package eziam-light-theme :ensure eziam-theme + :if (or window-system + server-name) :defines (eziam-scale-headings) :config (progn (setq eziam-scale-headings nil) - (load-theme 'eziam-light t))) + (load-theme 'eziam-light t) + (custom-theme-set-faces 'user + '(default ((t (:background "#ffffff")))) + '(js2-function-call ((t (:underline nil)))) + '(font-lock-keyword-face ((t (:weight normal)))) + '(git-gutter-fr:added ((t (:foreground "#96a4ab")))) + '(git-gutter-fr:modified ((t (:foreground "#96a4ab")))) + '(git-gutter-fr:deleted ((t (:foreground "#96a4ab"))))))) #+END_SRC Highlighting quasi-quoted expressions in lisps is quite useful, but I @@ -221,9 +240,13 @@ because I manage those in my [[file:~/projects/dotfiles/tag-xresources/xresource (if (eq displays 1) (ap/set-fonts "Monaco" 16 "Lucida Grande" 16 t 0.2) (ap/set-fonts "Monoid" 12 "Helvetica Neue" 12 t 0.1)))) - ((eq window-system 'x) + ((and (eq window-system 'x) + (not (eq system-type 'gnu/linux/windows))) (set-fontset-font "fontset-default" 'unicode (font-spec :name "Iosevka" :size 14)) - (ap/set-fonts "Iosevka" 16 "Noto Sans" 14 nil)))) + (ap/set-fonts "Iosevka" 16 "Noto Sans" 14 nil)) + ((and (eq window-system 'x) + (eq system-type 'gnu/linux/windows)) + (ap/set-fonts "Noto Mono" 12 "Sans" 12 nil)))) (ap/set-fonts-according-to-system)) #+END_SRC @@ -288,19 +311,17 @@ Sometimes I like to hide clutter. Other times, it's useful. (defun hide-clutter () (interactive) - (fringe-mode '(4 . 8)) (hide-mode-line)) (defun show-clutter () (interactive) - (fringe-mode '(8 . 8)) (show-mode-line)) -(hide-clutter) (when mode-line-default-hidden (call-interactively #'hide-mode-line)) -(setq-default indicate-buffer-boundaries 'left) +(setq-default indicate-buffer-boundaries nil) +(fringe-mode '(4 . 4)) (defun hide-mode-line-if-default-hidden () (if mode-line-default-hidden @@ -309,11 +330,11 @@ Sometimes I like to hide clutter. Other times, it's useful. (add-to-list 'default-frame-alist '(border-width . 0)) (add-to-list 'default-frame-alist '(internal-border-width . 0)) -(when (eq window-system 'x) +(when (or (eq window-system 'x) + (eq window-system 'mac)) (setq window-divider-default-bottom-width 1 window-divider-default-right-width 1 window-divider-default-places t) - (setq mode-line-default-hidden t) (window-divider-mode +1)) (add-hook 'after-change-major-mode-hook #'hide-mode-line-if-default-hidden) @@ -382,10 +403,16 @@ read them automatically any more. So, let’s use the [[https://github.com/purcell/exec-path-from-shell][exec-path-from-shell]] package to set up ~exec-path~ and similar variables from whatever my shell configuration is. +On Windows, I like to run Emacs from the system tray menu of VcXsrv. +It starts up without an environment in this case as well. + #+BEGIN_SRC emacs-lisp (use-package exec-path-from-shell - :if (eq system-type 'darwin) - :config (exec-path-from-shell-initialize)) + :if (or (eq system-type 'darwin) + (eq system-type 'gnu/linux/windows)) + :config (progn + (setq exec-path-from-shell-arguments '("-l")) + (exec-path-from-shell-initialize))) #+END_SRC * Keybindings @@ -510,7 +537,7 @@ based upon some folder conventions I use. :demand t :diminish projectile-mode :config (progn - (projectile-global-mode) + (projectile-mode 1) (add-to-list 'projectile-globally-ignored-directories ".stversions") (defun yarn-install (&optional arg) @@ -545,7 +572,9 @@ based upon some folder conventions I use. projectile-completion-system 'ivy))) (use-package counsel-projectile - :config (counsel-projectile-on)) + :config (progn + (counsel-projectile-on) + (define-key projectile-mode-map [remap counsel-projectile-ag] #'counsel-projectile-rg))) #+END_SRC ** vc @@ -571,12 +600,24 @@ changed. This package colours the fringe. I have it set to the right fringe so it doesn’t interfere with flycheck. #+BEGIN_SRC emacs-lisp +(eval-when-compile (require 'fringe-helper)) (use-package git-gutter-fringe :defer 2 :diminish git-gutter-mode :config (progn (global-git-gutter-mode 1) - (set-face-foreground 'git-gutter:modified "grey") + ;; places the git gutter outside the margins. + (setq-default fringes-outside-margins t) + ;; thin fringe bitmaps + (fringe-helper-define 'git-gutter-fr:added '(center repeated) + ".XXX....") + (fringe-helper-define 'git-gutter-fr:modified '(center repeated) + ".XXX....") + (fringe-helper-define 'git-gutter-fr:deleted 'bottom + ".......X" + "......XX" + ".....XXX" + "....XXXX") (setq git-gutter-fr:side 'right-fringe))) #+END_SRC @@ -597,6 +638,17 @@ time. Make sure to set it up with a nice =completing-read-function= :init (add-hook 'magit-mode-hook #'magit-load-config-extensions)) #+END_SRC +** git-messenger + +Popup the last commit that changed the line at point. + +#+BEGIN_SRC emacs-lisp +(use-package git-messenger + :bind* (("C-x v p" . git-messenger:popup-message)) + :config (progn + (setq git-messenger:use-magit-popup t))) +#+END_SRC + ** git-timemachine This package allow me to go through a file’s history with just a few @@ -988,6 +1040,17 @@ Directional window movement ("S-<up>" . windmove-up) ("S-<down>" . windmove-down))) #+END_SRC +* Blogging + +I have a [[https://alanpearce.uk][blog]] that I publish with hugo. + +#+BEGIN_SRC emacs-lisp +(use-package easy-hugo + :config (setq easy-hugo-basedir (car (split-string (shell-command-to-string "ghq list --full-path alanpearce.uk"))) + easy-hugo-url "https://alanpearce.uk" + easy-hugo-default-ext ".md")) +#+END_SRC + * Completion Make built-in completion a bit more intelligent, by adding substring @@ -1035,6 +1098,7 @@ seems to work perfectly well for me. #+BEGIN_SRC emacs-lisp (use-package company-nixos-options + :defer 30 :config (progn (add-to-list 'company-backends 'company-nixos-options))) #+END_SRC @@ -1153,6 +1217,17 @@ Expand subfolders like a tree inside the parent (bind-key "i" #'dired-subtree-toggle dired-mode-map)))) #+END_SRC +** Disk usage + +Combine dired and du (disk usage). + +#+BEGIN_SRC emacs-lisp +(use-package dired-du + :after dired + :config (progn + (setq dired-du-size-format t))) +#+END_SRC + ** Dired-narrow One can already use dired with wildcards to browse a filtered directory listing, but it opens a new buffer. Dired-narrow is a @@ -1262,7 +1337,7 @@ workplace, so I keep it in a host-specific, GPG-encrypted file. send-mail-function #'smtpmail-send-it message-send-mail-function #'smtpmail-send-it))) -(with-eval-after-load 'gnus-mime +(with-eval-after-load "gnus-mime" (define-key gnus-mime-button-map " " #'gnus-mime-view-part-externally)) (with-eval-after-load "mailcap" @@ -1282,7 +1357,7 @@ information here as well. #+BEGIN_SRC emacs-lisp (use-package bbdb :config (progn - (bbdb-initialize 'gnus 'mail 'message 'pgp) + (bbdb-initialize 'gnus 'message 'pgp) (bbdb-mua-auto-update-init 'gnus 'message) (setq bbdb-send-mail-style 'gnus bbdb-complete-mail-allow-cycling t @@ -1584,13 +1659,15 @@ works really nicely. (ledger-report "Budget (Cumulative)" nil))) :config (progn (setq ledger-use-iso-dates t - ledger-post-use-completion-engine :built-in + ledger-post-use-completion-engine :ido ledger-reconcile-default-commodity "€" ledger-clear-whole-transactions t ledger-narrow-on-reconcile t - ledger-default-date-format "%Y-%m-%d" - ledger-reports '(("Monthly Expenses" "ledger -f %(ledger-file) reg -M Expenses --real -l \"payee != 'Opening Balances'\"") - ("Expenses:This Month" "ledger -f %(ledger-file) bal \\^Expenses -p \"this month\"") + ledger-reports `(("Monthly Expenses" "ledger -f %(ledger-file) reg -M \\^Flex --real -X EUR -l \"payee != 'Opening Balances'\"") + ("Average Monthly Expenses (Past 12 Months)" ,(concat "ledger -f %(ledger-file) -b " + (format-time-string "%Y-%m" (time-add (current-time) (days-to-time -365))) + " --monthly --average balance ^Flex")) + ("Expenses:This Month" "ledger -f %(ledger-file) bal \\^Flex -p \"this month\"") ("On-budget Balances" "ledger -f %(ledger-file) bal --current -R :Budget: Assets:Receivable Liabilities:Personal") ("All Account Balances" "ledger -f %(ledger-file) bal --current -R \\^Assets \\^Liabilities") ("Budget Values (Current Month)" "ledger -f %(ledger-file) bal -p \"this month\" --limit \"payee=~/budget/\" \\^Funds") @@ -1667,6 +1744,12 @@ Org is wünderbar. (set-register ?o `(file . ,(expand-file-name "organiser.org" org-directory))) (add-hook 'org-mode-hook #'turn-on-auto-fill) (org-load-modules-maybe t))) + +(use-package org-src + :ensure nil + :after org + :config (progn + (bind-key "C-x C-s" #'org-edit-src-exit org-src-mode-map))) #+END_SRC **** org-babel @@ -1717,15 +1800,32 @@ On-the-fly error checking in programming modes? Yes please. :defer 5 :config (progn (global-flycheck-mode) - (setq flycheck-check-syntax-automatically '(save new-line mode-enabled)) + (setq flycheck-check-syntax-automatically '(save mode-enabled)) + (setq flycheck-indication-mode 'left-fringe) + (with-eval-after-load 'git-gutter-fringe + (fringe-helper-define 'flycheck-fringe-bitmap-double-arrow '(center repeated) + ".XXX....")) (if (executable-find "eslint_d") (setq flycheck-javascript-eslint-executable "eslint_d")))) #+END_SRC +*** flycheck-pos-tip + +Show flycheck errors in a little popup, so I don't lose my place + +#+BEGIN_SRC emacs-lisp +(use-package flycheck-pos-tip + :after flycheck + :config (progn + (setq flycheck-display-errors-delay 0.5) + (flycheck-pos-tip-mode 1))) +#+END_SRC + *** flycheck-flow #+BEGIN_SRC emacs-lisp (use-package flycheck-flow + :after js2-mode :config (progn (flycheck-add-next-checker 'javascript-eslint 'javascript-flow))) #+END_SRC @@ -1790,6 +1890,15 @@ guess a definition. :config (setq dumb-jump-selector 'ivy)) #+END_SRC +** imenu-anywhere + +This is like imenu, but shows functions (or similar top-level +entities) across buffers in the same project. Neat! + +#+BEGIN_SRC emacs-lisp +(use-package imenu-anywhere + :bind ("C-x C-." . ivy-imenu-anywhere)) +#+END_SRC ** Lisps *** All @@ -2036,6 +2145,15 @@ the project. This will allows emacs to find their executables. (add-hook 'js2-mode-hook #'add-node-modules-path))) #+END_SRC +**** Flow + +#+BEGIN_SRC emacs-lisp +(use-package flow-minor-mode + :after js2-mode + :config (progn + (add-hook 'js2-mode-hook #'flow-minor-enable-automatically))) +#+END_SRC + **** Indium Javascript with an inferior node.js process and a debugger? Awesome. @@ -2264,6 +2382,18 @@ Sometimes I might want to show off my emacs usage. (add-hook 'prog-mode-hook #'flyspell-prog-mode))) #+END_SRC +** Style checking + +[[https://github.com/ValeLint/vale][Vale]] is a linter, but for prose. Neat idea! Salesman is a bad term. + +#+BEGIN_SRC emacs-lisp +(use-package flycheck-vale + :if (executable-find "vale") + :config (progn + (add-to-list 'flycheck-vale-modes 'org-mode) + (flycheck-vale-setup))) +#+END_SRC + * Scripting Make a shell-script buffer executable after saving it, if it has a shebang. @@ -2293,6 +2423,8 @@ nice, when I remember to use it. #+BEGIN_SRC emacs-lisp (use-package eshell :bind ("C-c s" . eshell) + :defer 10 + :functions (eshell/pwd) :config (progn (setq eshell-directory-name "~/.emacs.d/eshell" eshell-prompt-function (lambda () @@ -2353,6 +2485,7 @@ Emacs has an editor within. (put 'downcase-region 'disabled nil) (setq sentence-end-double-space t line-move-visual nil) +(setq-default truncate-lines t) #+END_SRC ** align @@ -2376,7 +2509,7 @@ The most important one for me is JSON property alignment. I like to use the clipboard more than the primary selection in X11. #+BEGIN_SRC emacs-lisp -(setq x-select-enable-clipboard t +(setq select-enable-clipboard t save-interprogram-paste-before-kill t) (if (functionp 'x-cut-buffer-or-selection-value) (setq interprogram-paste-function 'x-cut-buffer-or-selection-value)) @@ -2384,22 +2517,6 @@ I like to use the clipboard more than the primary selection in X11. (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))) #+END_SRC -*** Copy formatted code - -#+BEGIN_SRC emacs-lisp -(bind-key* "C-c w" (define-prefix-command 'copy-as-map)) -(use-package copy-as-format - :bind (("C-c C-w" . copy-as-format) - :map copy-as-map - ("b" . copy-as-format-bitbucket) - ("g" . copy-as-format-github) - ("h" . copy-as-format-hipchat) - ("w" . copy-as-format-html) - ("j" . copy-as-format-jira) - ("m" . copy-as-format-markdown) - ("s" . copy-as-format-slack))) -#+END_SRC - ** Selection I’m quite used to deleting text by selecting it and typing. Emacs has |