diff options
Diffstat (limited to '')
-rw-r--r-- | home/dots/.emacs | 863 | ||||
-rw-r--r-- | home/dots/.emacs.d/elisp/almost-mono-themes.el | 205 | ||||
-rw-r--r-- | home/dots/.emacs.d/elisp/exwm-mff.el | 191 | ||||
-rw-r--r-- | home/dots/.emacs.d/elisp/org-link-minor-mode.el | 137 | ||||
-rw-r--r-- | home/dots/.emacs.d/snippets/go-mode/errnotnil | 5 | ||||
-rw-r--r-- | home/dots/.emacs.d/snippets/go-mode/error | 7 | ||||
-rw-r--r-- | home/dots/.emacs.d/snippets/mhtml-mode/<div>..</div>~ | 7 |
7 files changed, 1415 insertions, 0 deletions
diff --git a/home/dots/.emacs b/home/dots/.emacs new file mode 100644 index 0000000..9a931a1 --- /dev/null +++ b/home/dots/.emacs @@ -0,0 +1,863 @@ +;; -*- lexical-binding: t; -*- +(add-to-list 'load-path "~/.emacs.d/elisp") +(fset 'yes-or-no-p 'y-or-n-p) +(setq + inhibit-startup-screen t + default-frame-alist '((font . "Iosevka SS13 Extended") + (height . 170) + (line-spacing . 0.5)) + ;; undo + undo-limit 10000000 + undo-outer-limit 20000000 + + ;; Package list + package-list '( + magit + nix-mode + go-mode + devdocs + rec-mode + almost-mono-themes + eldoc-box + markdown-mode + nov + yasnippet + yasnippet-snippets + pinentry + geiser + geiser-guile + guix + avy + tldr + elfeed + elfeed-protocol + exwm + emms + mastodon + pass + lem + expand-region) + + package-archives '(("elpa" . "https://elpa.gnu.org") + ("gnu" . "http://elpa.gnu.org/packages/") + ("melpa" . "https://melpa.org/packages/") + ("non-gnu" . "https://elpa.nongnu.org/nongnu/") + ("melpa-stable" . "https://stable.melpa.org/packages/"))) + + +;; UI +(menu-bar-mode -1) +(tool-bar-mode -1) + +(setq-default fill-column 80 + frame-title-format '("%b")) + +(package-initialize) + + +(unless package-archive-contents + (package-refresh-contents)) + +;; install the missing packages +(dolist (package package-list) + (unless (package-installed-p package) + (package-install package))) + +(use-package tab-bar + :init + (tab-bar-mode)) + +(use-package project + :ensure t + :init + (add-to-list 'project-switch-commands '(project-shell "Shell"))) + +(use-package exwm + :init + (setq exwm-workspace-number 1 + exwm-input-global-keys + `(([?\s-r] . exwm-reset) ;; s-r: Reset (to line-mode). + ;; s-N: Switch to certain workspace. + ,@(mapcar (lambda (i) + `(,(kbd (format "s-%d" i)) . + (lambda () + (interactive) + (tab-bar-select-tab ,i)))) + (number-sequence 0 9)))) + (exwm-input-set-key (kbd "s-f") + (lambda () (interactive) + (shell-command "firefox"))) + (exwm-input-set-key (kbd "<print>") + (lambda () (interactive) + (shell-command "scrot -F '/home/mccd/screenshots/%Y-%m-%d_$wx$h.png'"))) + (exwm-input-set-key (kbd "C-<print>") + (lambda () (interactive) + (shell-command "scrot -s -F '/home/mccd/screenshots/%Y-%m-%d_$wx$h.png'"))) + (exwm-input-set-key (kbd "s-<SPC>") + (lambda (cmd) ;; s-&: Launch application. + (interactive (list (read-shell-command "$ "))) + (start-process-shell-command cmd nil cmd))) + (exwm-enable) + (exwm-xim-mode) + (push ?\C-\\ exwm-input-prefix-keys) + :config + (setq + ring-bell-function 'ignore + default-directory "/home/mccd/" + focus-follows-mouse t + mouse-autoselect-window t) + :hook + (;; Make sure titles match X window + (server-after-make-frame . (lambda () + (set-window-margins (selected-window) 2 2))) + (exwm-update-title . (lambda () + (exwm-workspace-rename-buffer + (concat exwm-class-name ":" + (if (<= (length exwm-title) 50) exwm-title + (concat (substring exwm-title 0 49) "...")))))) + (exwm-update-class . (lambda () + (exwm-workspace-rename-buffer + (concat exwm-class-name ":" + (if (<= (length exwm-title) 50) exwm-title + (concat (substring exwm-title 0 49) "...")))))))) + +(use-package time + :init + (display-time-mode) + :config + (setq display-time-format "%a, %d/%m/%Y %H:%M")) + +(use-package geiser + :ensure t) + +(use-package pixel-scroll + :init + (pixel-scroll-precision-mode)) + +(use-package scroll-bar + :init + (scroll-bar-mode -1)) + +(use-package frame + :init + (window-divider-mode)) + +(use-package delsel + :init + (delete-selection-mode)) + +(use-package files + :config + (setq delete-old-versions t + kept-new-versions 6 + kept-old-versions 2 + version-control t + auto-save-default nil)) + +(use-package minibuffer + :defer t + :config + (setq completion-cycle-threshold 5 + completion-ignore-case t)) + +(use-package pass + :defer t + :ensure t) + +(use-package select + :config + (setq x-select-enable-clipboard t + x-select-enable-primary t)) + +(use-package imenu + :defer t + :config + (setq imenu-auto-rescan t)) + +(defun sudo-shell-command (command) + (interactive "MShell command (root): ") + (with-temp-buffer + (cd "/sudo::/") + (async-shell-command command))) + + +(use-package guix + :ensure t + :bind + (("C-c C-g g" . guix) + ("C-c C-g o" . (lambda () + (interactive) + (sudo-shell-command "guix system reconfigure /home/mccd/system/os/config.scm"))) + ("C-c C-g h" . (lambda () + (interactive) + (async-shell-command "guix home reconfigure ~/system/home/config.scm"))))) + + +(use-package nov + :defer t + :ensure t + :init + (add-to-list 'auto-mode-alist '("\\.epub'" . nov-mode))) + +(use-package battery + :init + (display-battery-mode t)) + +(use-package comint + :bind + ((:repeat-map + repeat-hist-line-map + ("n" . comint-next-input) + ("p" . comint-previous-input)))) + +(use-package repeat + :demand t + :bind + ((:repeat-map + repeat-normal-movement-map + ("n" . next-line) + ("b" . backward-char) + ("f" . forward-char) + ("e" . move-end-of-line) + ("F" . forward-word) + ("B" . backward-word) + ("v" . scroll-up-command) + ("V" . scroll-down-command) + ("o" . avy-goto-char-timer) + ("g" . goto-line) + ("a" . move-beginning-of-line) + ("k" . kill-line) + ("d" . delete-char) + ("D" . kill-word) + ("." . er/expand-region) + ("-" . er/contract-region) + ("p" . previous-line)) + (:repeat-map + repeat-movement-map + ("e" . end-of-defun) + ("f" . forward-sexp) + ("n" . forward-list) + ("p" . backward-list) + ("d" . down-list) + ("u" . up-list) + ("b" . backward-sexp) + ("a" . beginning-of-defun))) + :config + (setq repeat-on-final-keystroke t + set-mark-command-repeat-pop t + repeat-exit-key (kbd "<TAB>")) + (repeat-mode 1)) + +(use-package org-crypt + :ensure nil + :init + (setenv "GPG_AGENT_INFO" nil) + (setq auth-source-debug t + epg-gpg-program "gpg2") + (org-crypt-use-before-save-magic)) + +(use-package grep + :config + (setq-default + grep-template (string-join + '("ugrep" + "--color=never" + "--ignore-binary" + "--ignore-case" + "--include=<F>" + "--line-number" + "--null" + "--recursive" + "--regexp=<R>") + " "))) + +(use-package pinentry + :ensure t + :init + (pinentry-start)) + + +(use-package epa-file + :init + (epa-file-enable) + (setq + epa-pinentry-mode 'loopback)) + +(use-package exwm-mff + :demand t + :load-path "elisp" + :hook + ((server-after-make-frame . exwm-mff-mode))) + +(use-package avy + :ensure t + :config + (setq + avy-timeout-seconds 0.2) + (global-set-key (kbd "M-o") 'avy-goto-char-timer) + (set-face-attribute 'avy-lead-face nil :inherit 'fixed-pitch) + (set-face-attribute 'avy-lead-face-0 nil :inherit 'fixed-pitch) + (set-face-attribute 'avy-lead-face-1 nil :inherit 'fixed-pitch) + (set-face-attribute 'avy-lead-face-2 nil :inherit 'fixed-pitch) + (setf (alist-get ? avy-dispatch-alist) 'avy-action-mark-to-char) + (define-key isearch-mode-map (kbd "M-o") 'avy-isearch) + (defun avy-action-kill-whole-line (pt) + (save-excursion + (goto-char pt) + (kill-whole-line)) + (select-window + (cdr + (ring-ref avy-ring 0))) + t) + (setf (alist-get ?k avy-dispatch-alist) 'avy-action-kill-stay + (alist-get ?K avy-dispatch-alist) 'avy-action-kill-whole-line) + (defun avy-action-copy-whole-line (pt) + (save-excursion + (goto-char pt) + (cl-destructuring-bind (start . end) + (bounds-of-thing-at-point 'line) + (copy-region-as-kill start end))) + (select-window + (cdr + (ring-ref avy-ring 0))) + t) + (defun avy-action-yank-whole-line (pt) + (avy-action-copy-whole-line pt) + (save-excursion (yank)) + t) + + (setf (alist-get ?y avy-dispatch-alist) 'avy-action-yank + (alist-get ?w avy-dispatch-alist) 'avy-action-copy + (alist-get ?W avy-dispatch-alist) 'avy-action-copy-whole-line + (alist-get ?Y avy-dispatch-alist) 'avy-action-yank-whole-line) + (defun avy-action-copy-whole-line (pt) + (save-excursion + (goto-char pt) + (cl-destructuring-bind (start . end) + (bounds-of-thing-at-point 'line) + (copy-region-as-kill start end))) + (select-window + (cdr + (ring-ref avy-ring 0))) + t) + + (defun avy-action-yank-whole-line (pt) + (avy-action-copy-whole-line pt) + (save-excursion (yank)) + t) + + (setf (alist-get ?y avy-dispatch-alist) 'avy-action-yank + (alist-get ?w avy-dispatch-alist) 'avy-action-copy + (alist-get ?W avy-dispatch-alist) 'avy-action-copy-whole-line + (alist-get ?Y avy-dispatch-alist) 'avy-action-yank-whole-line) + + (defun avy-action-teleport-whole-line (pt) + (avy-action-kill-whole-line pt) + (save-excursion (yank)) t) + + (setf (alist-get ?t avy-dispatch-alist) 'avy-action-teleport + (alist-get ?T avy-dispatch-alist) 'avy-action-teleport-whole-line) + + (defun avy-action-mark-to-char (pt) + (activate-mark) + (goto-char pt)) + + (setf (alist-get ? avy-dispatch-alist) 'avy-action-mark-to-char)) + +(use-package flymake + :defer t + :bind + (:repeat-map flymake-repeat-map + ("]" . flymake-goto-next-error) + ("[" . flymake-goto-prev-error)) + :hook + ((flymake-mode . + (lambda () + (define-key flymake-mode-map (kbd "C-c ]") 'flymake-goto-next-error) + (define-key flymake-mode-map (kbd "C-c [") 'flymake-goto-prev-error))))) + +(use-package expand-region + :ensure t + :init + (global-set-key (kbd "C-c .") 'er/expand-region)) + +(use-package devdocs + :ensure t + :init + (global-set-key (kbd "C-h D") 'devdocs-lookup)) + +(use-package sgml-mode + :init + (add-to-list 'auto-mode-alist '("\\.njk\\'" . html-mode)) + (add-to-list 'auto-mode-alist '("\\.tmpl\\'" . html-mode)) + :hook + ;; TODO fix + ((html-mode . (lambda () + (keymap-local-set (kbd "M-o") 'avy-goto-char-timer))) + (html-mode . (lambda () + (setq sgml-basic-offset 8 + indent-tabs-mode t))))) + +(use-package eldoc + :ensure t + :demand t + :diminish "" + :config + (setq eldoc-print-after-edit t + echo-area-display-truncation-message nil + eldoc-echo-area-prefer-doc-buffer 'maybe + eldoc-echo-area-use-multiline-p nil) + :hook (prog-mode . eldoc-mode)) + +(use-package eldoc-box + :ensure t + :demand t + :hook + (eglot-managed-mode . #'eldoc-box-hover-mode) + :config + (global-set-key (kbd "C-h .") #'eldoc-box-help-at-point)) + +(use-package markdown-mode + :ensure t + :config + (set-face-attribute 'markdown-code-face nil :inherit 'fixed-pitch) + :hook + ((markdown-mode . variable-pitch-mode) + (markdown-mode . markdown-toggle-url-hiding) + (markdown-mode . markdown-toggle-markup-hiding) + (markdown-mode . visual-line-mode))) + +(use-package elec-pair + :init + (electric-pair-mode 1) + :config + (global-set-key (kbd "M-{") 'insert-pair) + (global-set-key (kbd "M-\"") 'insert-pair) + (global-set-key (kbd "M-\'") 'insert-pair) + (global-set-key (kbd "M-<") 'insert-pair) + (global-set-key (kbd "M-[") 'insert-pair)) + +(use-package ido + :init + (ido-mode t)) + +(use-package org-link-minor-mode + :load-path "elisp" + :defer t) + +(use-package calendar + :defer t + :init + (add-to-list 'auto-mode-alist '("~/personal-db/log" . diary-mode)) + :hook + ((diary-mode . variable-pitch-mode) + ; (diary-mode . org-link-minor-mode) + ; (diary-fancy-display-mode . org-link-minor-mode) + (diary-fancy-display-mode . variable-pitch-mode) + (diary-mode . (lambda () + (add-hook 'after-save-hook 'sync-org nil t))) + (diary-mode . flyspell-mode)) + :config + (global-set-key (kbd "C-c d") 'calendar) + (calendar-set-date-style 'european) + (set-face-attribute 'diary nil :inherit 'fixed-pitch) + (setq diary-file "~/personal-db/log" + calendar-mark-diary-entries-flag t + calendar-week-start-day 1)) + +(use-package nix-mode + :ensure t + :defer t + :hook + ((nix-mode . (lambda () + (add-hook 'before-save-hook #'nix-format-buffer nil t))) + (nix-mode . nix-prettify-mode))) + +(use-package eglot + :config + ;; Ensure `nil` is in your PATH. + (add-to-list 'eglot-server-programs '(nix-mode . ("nil"))) + (define-key eglot-mode-map (kbd "C-c r") 'eglot-rename) + (define-key eglot-mode-map (kbd "C-c o") 'eglot-code-actions) + :hook + (nix-mode . eglot-ensure) + (go-mode . eglot-ensure)) + +(use-package go-mode + :ensure t + :defer t + :hook + ((go-mode . (lambda () + (add-hook + 'before-save-hook 'eglot-format-buffer nil t))) + (go-mode . (lambda () + (setq-local compile-command "go build ."))))) + +(use-package rec-mode + :ensure nil + :defer t + :mode "\\.rec\\'" + :hook + ((rec-mode . flymake-mode) + (rec-mode . eldoc-mode))) + +(use-package erc + :ensure t + :config + (setq erc-autojoin-channels-alist + '(("Libera.Chat" + "#emacs" + "#permacomputing" + "#oldcomputerchallenge" + "#go-nuts" + "#netbsd" + "#nonguix" + "#guix"))) + :init + (global-set-key + "\C-cef" + (lambda () + (interactive) + (erc + :server "irc.libera.chat" + :port "6667" + :nick "mccd" + :password (shell-command-to-string "pass show libera.chat"))))) + +(use-package ob-rec + :ensure nil) + +(defun sync-org () + (interactive) + (async-shell-command "org-sync")) + +(add-to-list 'display-buffer-alist '("*Async Shell Command*" display-buffer-no-window (nil))) + +;; Org +(use-package org + :ensure t + :init + (add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode)) + (org-babel-do-load-languages + 'org-babel-load-languages + '((shell . t) + (rec .t))) + + :config + (setq org-refile-targets + '((nil :maxlevel . 4) + (org-agenda-files :maxlevel . 4)) + org-default-notes-file "~/personal-db/notes/todo.org" + org-hide-emphasis-markers t + org-agenda-include-diary t + org-agenda-remove-tags t + org-startup-folded 'content + org-agenda-inhibit-startup nil + ;; Add /New Heading at the end for use + org-refile-allow-creating-parent-nodes 'confirm + org-outline-path-complete-in-steps nil + org-refile-use-outline-path 'file + ;; Otherwise looks weird in variable-pitch-mode + org-log-done 'time + org-capture-templates + '(("t" "Todo" + entry (file "~/personal-db/notes/todo.org") + "* TODO %?\n%i\n%a\n " + :empty-lines 0) + ("l" "Log" plain (file "~/personal-db/log") + "%<%d %b %Y %H:%M> %?" + :prepend t) + ("n" "Inbox" + entry (file "~/personal-db/notes/inbox.org") + "** %?\n%T" + :empty-lines 0))) + (set-face-attribute 'org-block nil :inherit 'fixed-pitch) + (set-face-attribute 'org-code nil :inherit 'fixed-pitch) + (set-face-attribute 'org-table nil :inherit 'fixed-pitch) + (set-face-attribute 'org-date nil :inherit 'fixed-pitch) + (set-face-attribute 'org-tag nil :inherit 'fixed-pitch) + (global-set-key (kbd "C-c l") #'org-store-link) + (global-set-key (kbd "C-c a") #'org-agenda) + (global-set-key (kbd "C-c c") #'org-capture) + (global-set-key (kbd "C-c j") #'org-goto) + (global-set-key (kbd "C-c s") #'project-find-regexp) + (global-set-key (kbd "C-c C-o") #'org-open-at-point-global) + (global-set-key (kbd "C-c C-s") #'sync-org) + ;; Something errors out with capture logs and non-org files + (add-to-list 'warning-suppress-log-types '(org-element)) + (add-to-list 'warning-suppress-types '(org-element)) + :hook + ((org-mode . auto-save-visited-mode) + (org-mode . org-indent-mode) + (org-mode . flyspell-mode) + (org-mode . visual-line-mode) + (org-mode . (lambda () + (add-hook 'after-save-hook 'sync-org nil t))) + (org-mode . variable-pitch-mode))) + +(use-package rec-mode + :ensure t) + +(use-package magit + :ensure t + :demand t) + +(use-package magit-extras + :ensure nil) + +(use-package yasnippet + :diminish t + :ensure t + :init + (yas-global-mode 1)) + +(use-package register + :bind + (("C-z" . 'point-to-register))) + +(defun marc/set-msmtp-account () + (if (message-mail-p) + (save-excursion + (let* + ((from (save-restriction + (message-narrow-to-headers) + (message-fetch-field "from"))) + (account + (cond + ((string-match "marcc@fastmail.fr" from) "home") + ((string-match "marc.coquand@sustainably.app" from) "work") + ((string-match "marc@mccd.space" from) "home")))) + (setq message-sendmail-extra-arguments (list '"-a" account)))))) + +;(use-package message +; :defer t +; :hook +; ((message-send-mail . marc/set-msmtp-account) +; (message-mode-hook flyspell-mode))) + +(add-hook 'message-send-mail-hook #'marc/set-msmtp-account) +(add-hook 'message-mode-hook #'flyspell-mode) + +(use-package flyspell + :defer t) + +(use-package mu4e + :ensure nil + :config + ;; This is set to 't' to avoid mail syncing issues when using mbsync + (setq mu4e-change-filenames-when-moving t) + + ;; don't keep message compose buffers around after sending: + (setq message-kill-buffer-on-exit t) + + ;; send function: + (setq send-mail-function 'sendmail-send-it + message-send-mail-function 'sendmail-send-it) + + ;; send program: + ;; this is exeranal. remember we installed it before. + (setq sendmail-program (executable-find "msmtp")) + + ;; select the right sender email from the context. + (setq message-sendmail-envelope-from 'header) + + ;; Refresh mail using isync every 10 minutes + (setq mu4e-update-interval (* 10 60) + mu4e-get-mail-command "mbsync -a" + mu4e-view-show-images t + mu4e-view-show-addresses t + mu4e-attachment-dir "~/Downloads" + mu4e-view-prefer-html t + mu4e-maildir "~/mail") + + (setq mu4e-contexts + (list + ;; Home + (make-mu4e-context + :name "home" + :enter-func (lambda () (mu4e-message "Entering personal context")) + :leave-func (lambda () (mu4e-message "Leaving personal context")) + :match-func + (lambda (msg) + (when msg + (string-prefix-p "/home" (mu4e-message-field msg :maildir)))) + :vars '((user-mail-address . "marc@mccd.space") + (user-full-name . "Marc Coquand") + (mu4e-drafts-folder . "/home/Drafts") + (mu4e-sent-folder . "/home/Sent") + (mu4e-refile-folder . "/home/Archive") + (mu4e-trash-folder . "/home/Trash") + (mu4e-sent-messages-behavior . sent) + + (mu4e-maildir-shortcuts . + (("/home/INBOX" . ?i) + ("/home/Archive/Done" . ?d) + ("/home/Archive" . ?a) + ("/home/Archive/Todo" . ?t))))) + ;; Work account + (make-mu4e-context + :name "work" + :enter-func (lambda () (mu4e-message "Entering work context")) + :leave-func (lambda () (mu4e-message "Leaving work context")) + :match-func + (lambda (msg) + (when msg + (string-prefix-p "/work" (mu4e-message-field msg :maildir)))) + :vars '((user-mail-address . "marc.coquand@sustainably.app") + (user-full-name . "Marc Coquand") + (mu4e-drafts-folder . "/work/[Gmail]/Drafts") + (mu4e-sent-folder . "/work/[Gmail]/Sent Mail") + (mu4e-refile-folder . "/work/[Gmail]/All Mail") + (mu4e-sent-messages-behavior . delete) + (mu4e-trash-folder . "/work/[Gmail]/Trash") + (mu4e-maildir-shortcuts . + (("/work/[Gmail]/All Mail" . ?a) + ("/work/INBOX" . ?i)))))))) + + +(use-package lem + :ensure t + :config + (setq lem-instance-url "https://lemmy.sdf.org")) + +(use-package elfeed-protocol + :ensure t + :init + (elfeed-protocol-enable)) + +(use-package elfeed + :ensure t + :config + (setq elfeed-use-curl t + ;; setup feeds + elfeed-protocol-fever-update-unread-only t + elfeed-protocol-fever-fetch-category-as-tag t + elfeed-protocol-feeds '(("fever+https://freshrss@rss.mccd.space" + :api-url "https://rss.mccd.space/api/fever.php" + :password (shell-command-to-string "pass show mccd/freshrss"))) + ;; enable elfeed-protocol + elfeed-protocol-enabled-protocols '(fever) + elfeed-curl-extra-arguments '("--insecure")) ;necessary for https without a trust certificate + (elfeed-set-timeout 36000) + (global-set-key (kbd "C-x w") 'elfeed)) + +(use-package mastodon + :defer t + :config + (setq + mastodon-active-user "marcc" + mastodon-instance-url "https://fosstodon.org")) + +(use-package eww + :config + (setq + browse-url-browser-function 'eww-browse-url ; Use eww as the default browser + eww-search-prefix "https://lite.duckduckgo.com/lite/?q=" + shr-max-image-proportion 0.3 + shr-width 70)) + +;; Can play youtube urls and music. +;; Requires mpv +(use-package emms + :ensure t + :init + (add-hook 'emms-player-started-hook 'emms-show) + :config + (setq emms-shop-format "on: %s") + (emms-all) + (emms-default-players)) + +(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. + '(default ((t (:inherit nil :extend nil :stipple nil :background "white" :foreground "black" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight regular :height 150 :width expanded :foundry "UKWN" :family "Iosevka SS13 Extended")))) + '(avy-lead-face ((t (:inherit fixed-pitch :background "dark red" :foreground "white")))) + '(calendar-weekend-header ((t (:inherit nil)))) + '(custom-group-subtitle ((t (:weight bold :family "Iosevka Aile")))) + '(diary ((t (:inherit fixed-pitch :foreground "red1")))) + '(eglot-highlight-symbol-face ((t (:weight bold)))) + '(eglot-mode-line ((t (:weight regular)))) + '(erc-timestamp-face ((t (:foreground "blue" :weight bold)))) + '(eshell-prompt ((t (:weight bold)))) + '(eww-valid-certificate ((t (:foreground "black" :weight bold)))) + '(fixed-pitch ((t (:family "Iosevka SS13 Extended")))) + '(font-lock-builtin-face ((t (:weight regular)))) + '(font-lock-comment-face ((t (:foreground "royalblue" :slant normal)))) + '(font-lock-constant-face ((t (:slant italic :weight regular)))) + '(font-lock-function-name-face ((t (:weight regular)))) + '(font-lock-keyword-face ((t (:weight regular)))) + '(font-lock-string-face ((t (:foreground "black" :slant italic)))) + '(font-lock-type-face ((t (:foreground "black")))) + '(font-lock-variable-name-face ((t (:foreground "black")))) + '(fringe ((t (:background "white")))) + '(header-line ((t (:inherit default :foreground "grey20" :box (:line-width (8 . 8) :color "#FFFFFF") :underline (:color "#e0e0e0" :style line :position 0) :family "Iosevka Aile")))) + '(highlight ((t (:background "azure2")))) + '(info-header-xref ((t (:inherit info-xref :underline (:color "RoyalBlue3" :style line :position t))))) + '(info-node ((t (:foreground "brown" :box (:line-width (4 . 4) :color "white") :slant italic :weight bold)))) + '(link ((t (:foreground "royalblue" :underline t)))) + '(magit-branch-remote ((t (:foreground "royalblue")))) + '(markdown-inline-code-face ((t (:inherit markdown-code-face)))) + '(markdown-pre-face ((t (:inherit markdown-code-face)))) + '(mastodon-display-name-face ((t (:inherit nil :weight bold)))) + '(mode-line ((t (:background "gray95" :foreground "black" :box (:line-width (8 . 8) :style flat-button) :overline "#e0e0e0" :underline (:color "#e0e0e0" :style line :position t) :family "Iosevka Aile")))) + '(mode-line-emphasis ((t (:weight regular)))) + '(mode-line-inactive ((t (:inherit mode-line :background "#fbfbfb" :foreground "grey60" :overline "#f9f9f9" :underline (:color "#f9f9f9" :style line :position 0) :weight light)))) + '(mu4e-header-highlight-face ((t (:inherit hl-line :extend t :weight bold)))) + '(mu4e-highlight-face ((t (:inherit highlight)))) + '(org-date ((t (:inherit fixed-pitch :foreground "gray40" :underline t)))) + '(org-headline-done ((t (:foreground "gray40")))) + '(org-level-1 ((t (:inherit outline-1 :extend nil :weight regular)))) + '(org-tag ((t (:inherit fixed-pitch :foreground "gray40" :weight regular)))) + '(org-time-grid ((t (:foreground "gray")))) + '(outline-4 ((t (:inherit outline-2)))) + '(tab-bar ((t (:box (:line-width (12 . 24) :style flat-button) :weight semi-light :family "Iosevka Aile")))) + '(tab-bar-tab ((t (:inherit tab-bar :foreground "black" :box (:line-width (20 . 1) :color "white") :weight semi-bold)))) + '(tab-bar-tab-inactive ((t (:inherit tab-bar-tab :background "white" :foreground "#999999" :weight semi-light)))) + '(tldr-code-block ((t (:background "cornsilk" :foreground "black")))) + '(tldr-command-argument ((t (:background "cornsilk" :foreground "black")))) + '(tldr-command-itself ((t (:background "khaki" :foreground "black" :weight bold)))) + '(tldr-introduction ((t (:foreground "black" :slant italic)))) + '(tldr-title ((t (:inherit variable-pitch :foreground "black" :weight bold :height 1.2)))) + '(variable-pitch ((t (:family "Iosevka Aile")))) + '(window-divider ((t (:foreground "gray90"))))) +(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 + '("cbd85ab34afb47003fa7f814a462c24affb1de81ebf172b78cb4e65186ba59d2" default)) + '(erc-mode-line-format "") + '(erc-modules + '(autojoin button completion fill irccontrols list match menu move-to-prompt netsplit networks noncommands notifications readonly ring services stamp spelling)) + '(magit-section-visibility-indicator '("..." . t)) + '(markdown-list-item-bullets '("-")) + '(mastodon-tl--enable-proportional-fonts t) + '(mastodon-use-emojify t) + '(mode-line-compact 'long) + '(mode-line-format + '("%e" mode-line-front-space + (:propertize + ("" mode-line-modified " ")) + mode-line-buffer-identification " " mode-line-modes)) + '(mode-line-percent-position nil) + '(mode-line-position-line-format '(" ")) + '(mu4e-bookmarks + '((:name "Last 7 days" :query "date:7d..now" :hide-unread t :key 119) + (:name "Messages with images" :query "mime:image/*" :key 112))) + '(org-agenda-files + '("~/personal-db/notes/sustainable-software.org" "/home/mccd/personal-db/notes/thoughts.org" "/home/mccd/personal-db/notes/cal-ios.org" "/home/mccd/personal-db/notes/ethics-and-software.org" "/home/mccd/personal-db/notes/reminders.org" "/home/mccd/builds/sustainably/piva.org" "/home/mccd/personal-db/notes/programming.org" "/home/mccd/personal-db/notes/unix.org" "/home/mccd/personal-db/notes/agency-and-tech.org" "/home/mccd/personal-db/notes/emacs-teaches.org" "/home/mccd/personal-db/notes/emacs.org" "/home/mccd/personal-db/notes/inbox.org" "/home/mccd/personal-db/notes/todo.org")) + '(org-fold-core-style 'overlays) + '(package-selected-packages + '(nov eldoc-box hide-mode-line exwm-mff eat pinentry exwm emms company orglink web-mode flycheck nix-mode nix-ts-mode avy pdf-tools elfeed-protocol lem yasnippet-snippets elfeed yasnippet smartparens markdown-mode mastodon tldr almost-mono-themes rec-mode magit go-mode expand-region devdocs)) + '(tab-bar-auto-width t) + '(tab-bar-close-button-show nil) + '(tab-bar-format + '(tab-bar-format-tabs tab-bar-format-align-right tab-bar-format-global)) + '(tab-bar-position nil) + '(tab-bar-tab-hints t) + '(window-divider-default-right-width 2) + '(yank-from-kill-ring-rotate t)) +(put 'secrets-mode 'disabled nil) diff --git a/home/dots/.emacs.d/elisp/almost-mono-themes.el b/home/dots/.emacs.d/elisp/almost-mono-themes.el new file mode 100644 index 0000000..4b7769e --- /dev/null +++ b/home/dots/.emacs.d/elisp/almost-mono-themes.el @@ -0,0 +1,205 @@ +;;; almost-mono-themes.el --- Almost monochromatic color themes -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 - 2022 John Olsson + +;; Author: John Olsson <john@cryon.se> +;; Maintainer: John Olsson <john@cryon.se> +;; URL: https://github.com/cryon/almost-mono-themes +;; Created: 9th May 2019 +;; Version: 1.0.0 +;; Keywords: faces +;; Package-Requires: ((emacs "24")) + +;; This file 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 file 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 file. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; A suite of almost monochrome Emacs themes + +;;; Code: + +(defconst almost-mono-themes-colors + '((white . ((background . "#ffffff") + (foreground . "#000000") + (weak . "#888888") + (weaker . "#dddddd") + (weakest . "#efefef") + (highlight . "#fda50f") + (warning . "#ff0000") + (success . "#00ff00") + (string . "#3c5e2b"))) + + (black . ((background . "#000000") + (foreground . "#ffffff") + (weak . "#aaaaaa") + (weaker . "#666666") + (weakest . "#222222") + (highlight . "#fda50f") + (warning . "#ff0000") + (success . "#00ff00") + (string . "#a7bca4"))) + + (gray . ((background . "#2b2b2b") + (foreground . "#ffffff") + (weak . "#aaaaaa") + (weaker . "#666666") + (weakest . "#222222") + (highlight . "#fda50f") + (warning . "#ff0000") + (success . "#00ff00") + (string . "#a7bca4"))) + + (cream . ((background . "#f0e5da") + (foreground . "#000000") + (weak . "#7d7165") + (weaker . "#c4baaf") + (weakest . "#dbd0c5") + (highlight . "#fda50f") + (warning . "#ff0000") + (success . "#00ff00") + (string . "#3c5e2b"))))) + +(defmacro almost-mono-themes--variant-with-colors (variant &rest body) + "Execute BODY in a scope where the different colors for given VARIANT is bound." + `(let* ((colors (or (cdr (assoc ,variant almost-mono-themes-colors)) + (error "No such theme variant"))) + (background (cdr (assoc 'background colors))) + (foreground (cdr (assoc 'foreground colors))) + (weak (cdr (assoc 'weak colors))) + (weaker (cdr (assoc 'weaker colors))) + (weakest (cdr (assoc 'weakest colors))) + (highlight (cdr (assoc 'highlight colors))) + (warning (cdr (assoc 'warning colors))) + (success (cdr (assoc 'success colors))) + (string (cdr (assoc 'string colors)))) + ,@body)) + +(defmacro almost-mono-themes--faces-spec () + "Provide the faces specification." + (quote + (mapcar + (lambda (entry) (list (car entry) `((t ,@(cdr entry))))) + `( + + ;; default + (default (:background ,background :foreground ,foreground)) + (fringe (:background ,background)) + (region (:background ,highlight :foreground ,foreground)) + (show-paren-match (:background ,background :foreground ,success :bold t)) + (show-paren-mismatch (:background ,background :foreground ,warning :bold t)) + (minibuffer-prompt (:weight bold :foreground ,foreground)) + (isearch (:background ,weak :foreground ,foreground :bold t)) + (lazy-highlight (:background ,weaker :foreground ,foreground)) + (link (:underline t)) + + ;; mode line + (mode-line (:box (:line-width -1 :color ,weaker) + :background ,weakest :foreground ,foreground)) + + (mode-line-inactive (:box (:line-width -1 :color ,weaker) + :background ,background :foreground ,weaker)) + + ;; font lock + (font-lock-keyword-face (:bold t)) + (font-lock-function-name-face (:bold t)) + (font-lock-variable-name-face (:foreground ,foreground)) + (font-lock-warning-face (:foreground ,foreground :underline (:color ,warning :style wave))) + (font-lock-builtin-face (:bold t)) + (font-lock-variable-name-face (:foreground ,foreground :italic t)) + (font-lock-constant-face (:bold t :italic t)) + (font-lock-type-face (:italic t)) + (font-lock-preprocessor-face (:italic t)) + (font-lock-comment-face (:foreground ,weak :italic t)) + (font-lock-string-face (:foreground ,string)) + (font-lock-doc-face (:inherit font-lock-comment-face)) + (line-number (:foreground ,weaker)) + (linum (:inherit line-number)) + (vertical-border (:foreground ,weaker)) + + ;; eshell + (eshell-prompt (:foreground ,foreground :bold t)) + (eshell-ls-directory (:foreground ,foreground :bold t)) + (eshell-ls-archive (:inherit eshell-ls-unreadable)) + (eshell-ls-backup (:inherit eshell-ls-unreadable)) + (eshell-ls-clutter (:inherit eshell-ls-unreadable)) + (eshell-ls-executable (:inherit eshell-ls-unreadable)) + (eshell-ls-missing (:inherit eshell-ls-unreadable)) + (eshell-ls-product (:inherit eshell-ls-unreadable)) + (eshell-ls-readonly (:inherit eshell-ls-unreadable)) + (eshell-ls-special (:inherit eshell-ls-unreadable)) + (eshell-ls-symlink (:inherit eshell-ls-unreadable)) + + ;; company mode + (company-tooltip (:background ,weakest :foreground ,foreground)) + (company-tooltip-selection (:background ,weaker :foreground ,foreground)) + ;;(company-tooltip-search (:background "#ff0000" :foreground "#00ff00")) + (company-tooltip-common (:bold t)) + (company-tooltip-common-selection (:bold t)) + (company-scrollbar-bg (:background ,weaker)) + (company-scrollbar-fg (:background ,weak)) + (company-tooltip-annotation-selection (:background ,weaker :foreground ,foreground :italic t)) + (company-tooltip-annotation (:background ,weakest :foreground ,weak :italic t)) + + ;; git gutter + (git-gutter:modified (:background ,highlight :foreground ,highlight)) + (git-gutter:added (:background ,success :foreground ,success)) + (git-gutter:deleted (:background ,warning :foreground ,warning)) + + ;; diff hl + (diff-hl-change (:background ,highlight :foreground ,highlight)) + (diff-hl-insert (:background ,success :foreground ,success)) + (diff-hl-delete (:background ,warning :foreground ,warning)) + + ;; hl line + (hl-line (:background ,weakest)) + (highlight-current-line-face (:inherit hl-line)) + + ;; ido + (ido-first-match (:bold t)) + (ido-only-match (:bold t)) + (ido-subdir (:italic t)) + (ido-virtual (:foreground ,weak)) + (ido-vertical-match-face (:bold t :italic nil)) + + ;; org mode + (org-table (:foreground ,weak)) + + )))) + + +(defun almost-mono-themes--variant-name (variant) + "Create symbol for color theme variant VARIANT." + (intern (format "almost-mono-%s" (symbol-name variant)))) + +(defmacro almost-mono-themes--define-theme (variant) + "Define a theme for the almost-mono variant VARIANT." + (let ((name (almost-mono-themes--variant-name variant)) + (doc (format "almost mono theme (%s version)" variant))) + `(progn + (deftheme ,name ,doc) + (put ',name 'theme-immediate t) + (almost-mono-themes--variant-with-colors + ',variant + (apply 'custom-theme-set-faces ',name + (almost-mono-themes--faces-spec))) + (provide-theme ',name)))) + +;;;###autoload +(when (and (boundp 'custom-theme-load-path) load-file-name) + (add-to-list 'custom-theme-load-path + (file-name-as-directory (file-name-directory load-file-name)))) + +(provide 'almost-mono-themes) + +;;; almost-mono-themes.el ends here diff --git a/home/dots/.emacs.d/elisp/exwm-mff.el b/home/dots/.emacs.d/elisp/exwm-mff.el new file mode 100644 index 0000000..6b1ef87 --- /dev/null +++ b/home/dots/.emacs.d/elisp/exwm-mff.el @@ -0,0 +1,191 @@ +;;; exwm-mff.el --- Mouse Follows Focus -*- lexical-binding: t; -*- + +;; Copyright (C) 2019, 2020, 2021 Ian Eure + +;; Author: Ian Eure <public@lowbar.fyi> +;; URL: https://github.com/ieure/exwm-mff +;; Version: 1.2.1 +;; Package-Requires: ((emacs "25.1")) +;; Keywords: unix + +;; 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 <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Mouse Follows Focus +;; =================== +;; +;; Traditional window managers are mouse-centric: the window to receive +;; input is usually selected with the pointing device. +;; +;; Emacs is keybord-centric: the window to receive key input is usually +;; selected with the keyboard. When you use the keyboard to focus a +;; window, the spatial relationship between pointer and active window is +;; broken -- the pointer can be anywhere on the screen, instead of over +;; the active window, which can make it hard to find. +;; +;; The same problem also exists in traditional windowing systems when +;; you use the keyboard to switch windows, e.g. with Alt-Tab. +;; +;; Because Emacs’ model is inverted, this suggests that the correct +;; behavior is also the inverse -- instead of using the mouse to +;; select a window to receive keyboard input, the keyboard should be +;; used to select the window to receive mouse input. +;; +;; `EXWM-MFF-MODE' is a global minor mode which does exactly this. +;; When the selected window in Emacs changes, the mouse pointer is +;; moved to its center, unless the pointer is already somewhere inside +;; the window’s bounds. While it's especially helpful for for EXWM +;; users, it works for any Emacs window in a graphical session. +;; +;; This package also offers the `EXWM-MFF-WARP-TO-SELECTED' command, +;; which allows you to summon the pointer with a hotkey. Unlike the +;; minor mode, summoning is unconditional, and will place the pointer in +;; the center of the window even if it already resides within its bounds +;; -- a handy feature if you’ve lost your pointer, even if you’re using +;; the minor mode. +;; +;; +;; Limitations +;; ~~~~~~~~~~~ +;; +;; None known at this time. + +;;; Code: + +(require 'subr-x) +(require 'cl-macs) + +(defcustom exwm-mff-ignore-if nil + "List of predicate functions for windows to ignore. + +Predicates accept one argument, WINDOW, and return non-NIL if +automatic pointer warping should be suppressed." + :type 'hook + :group 'exwm-mff) + +(defconst exwm-mff--debug-buffer " *exwm-mff-debug*" + "Name of the buffer exwm-mff will write debug messages into.") + +(defvar exwm-mff--debug 0 + "Whether (and how) to debug exwm-mff. +0 = don't debug. +1 = log messages to *exwm-mff-debug*. +2 = log messages to *exwm-mff-debug* and the echo area.") + +(defvar exwm-mff--last-window nil + "The last selected window.") + +(defun exwm-mff--guard () + "Raise an error unless this is a graphic session with mouse support." + (unless (and (display-graphic-p) (display-mouse-p)) + (error "EXWM-MFF-MODE doesn't work on non-graphic or non-mouse sessions"))) + +(defun exwm-mff--contains-pointer? (window) + "Return non-NIL when the mouse pointer is within FRAME and WINDOW." + (cl-destructuring-bind ((mouse-x . mouse-y) (left top right bottom)) + (list (mouse-absolute-pixel-position) + (window-absolute-pixel-edges window)) + (and (<= left mouse-x right) + (<= top mouse-y bottom)))) + +(defun exwm-mff--debug (string &rest objects) + "Log debug message STRING, using OBJECTS to format it." + (let ((debug-level (or exwm-mff--debug 0))) + (when (> debug-level 0) + (let ((str (apply #'format (concat "[%s] " string) + (cons (current-time-string) objects)))) + (when (>= debug-level 1) + (with-current-buffer (get-buffer-create exwm-mff--debug-buffer) + (goto-char (point-max)) + (insert (concat str "\n"))) + (when (>= debug-level 2) + (message str))))))) + +(defun exwm-mff-show-debug () + "Enable exwm-mff debugging, and show the buffer with debug logs." + (interactive) + (setq exwm-mff--debug 1) + (pop-to-buffer (get-buffer-create exwm-mff--debug-buffer))) + +(defun exwm-mff--window-center (window) + "Return a list of (x y) coordinates of the center of WINDOW in FRAME." + (cl-destructuring-bind (left top right bottom) (window-pixel-edges window) + (list (+ left (/ (- right left) 2)) + (+ top (/ (- bottom top) 2))))) + +(defun exwm-mff-warp-to (frame window) + "Place the pointer in the center of WINDOW in FRAME." + (apply #'set-mouse-pixel-position frame + (exwm-mff--window-center window))) + +;;;###autoload +(defun exwm-mff-warp-to-selected () + "Place the pointer in the center of the selected window." + (interactive) + (exwm-mff--guard) + (exwm-mff-warp-to (selected-frame) (selected-window))) + +(defun exwm-mff--explain (selected-window same-window? contains-pointer? mini? ignored?) + "Use SELECTED-WINDOW, SAME-WINDOW?, CONTAINS-POINTER?, MINI? +and IGNORED? to return an explanation of focusing behavior." + (cond + (same-window? "selected window hasn't changed") + (contains-pointer? "already contains pointer") + (mini? "is minibuffer") + (ignored? "one or more functions in `exwm-mff-ignore-if' matches") + (t (format "doesn't contain pointer (in %s)" selected-window)))) + +(defun exwm-mff-hook (sw &optional norecord) + "EXWM-MFF-MODE hook. + +This is after-advice placed on SELECT-WINDOW. It moves the +pointer to SW (the currently selected window), if NORECORD is +nil, and if it's not already in it." + (unless norecord + (if-let ((same-window? (eq sw exwm-mff--last-window))) + ;; The selected window is unchanged, we don't need to check + ;; anything else. + (exwm-mff--debug + "nop-> %s" (exwm-mff--explain sw same-window? nil nil nil)) + + (let* ((sf (window-frame sw)) + (contains-pointer? (exwm-mff--contains-pointer? sw)) + (mini? (minibufferp (window-buffer sw))) + (ignore? (run-hook-with-args-until-success 'exwm-mff-ignore-if sw))) + (if (or same-window? contains-pointer? mini? ignore?) + (exwm-mff--debug + "nop-> %s::%s (%s)" sf sw (exwm-mff--explain sw nil contains-pointer? mini? ignore?)) + (exwm-mff--debug + "warp-> %s::%s (%s)" sf sw (exwm-mff--explain sw nil contains-pointer? mini? ignore?)) + (exwm-mff-warp-to sf (setq exwm-mff--last-window sw))))))) + +(defgroup exwm-mff nil + "Mouse-Follows-Focus mode for EXWM." + :group 'exwm) + +;;;###autoload +(define-minor-mode exwm-mff-mode + "Mouse follows focus mode for EXWM." + :global t + :require 'exwm-mff + :group 'exwm-mff + (exwm-mff--guard) + (if exwm-mff-mode + (advice-add 'select-window :after #'exwm-mff-hook) + (advice-remove 'select-window #'exwm-mff-hook))) + +(provide 'exwm-mff) + +;;; exwm-mff.el ends here diff --git a/home/dots/.emacs.d/elisp/org-link-minor-mode.el b/home/dots/.emacs.d/elisp/org-link-minor-mode.el new file mode 100644 index 0000000..7f1faaa --- /dev/null +++ b/home/dots/.emacs.d/elisp/org-link-minor-mode.el @@ -0,0 +1,137 @@ +;;; org-link-minor-mode.el --- Enable org-mode links in non-org modes -*- lexical-binding: t; -*- +;; +;; Copyright (C) 2012-2020 +;; +;; Author: Sean O'Halpin <sean.ohalpin@gmail.com> +;; Maintainer: Sean O'Halpin <sean.ohalpin@gmail.com> +;; Created: 20120825 +;; Modified: 20200129 +;; Version: 0.0.3 +;; Package-Requires: ((emacs "24.3")) +;; Package-Version: 20200129.0141 +;; Keywords: hypermedia +;; Url: https://github.com/seanohalpin/org-link-minor-mode +;; +;; Changes for org v9: Stefan-W. Hahn <stefan dot hahn at s-hahn dot de> +;; +;; This file 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, or (at your option) +;; any later version. +;; +;; This file 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 <http://www.gnu.org/licenses/>. +;; +;;; Commentary: +;; +;; Enables org-mode links of the form: +;; +;; http://www.bbc.co.uk +;; man:emacs +;; info:emacs +;; <http://www.bbc.co.uk> +;; [[http://www.bbc.co.uk][BBC]] +;; [[org-link-minor-mode]] +;; [2012-08-18] +;; <2012-08-18> +;; +;; Note that `org-toggle-link-display' will also work when this mode +;; is enabled. +;; +;;; Code: + +(require 'org-element) + +;; Following declarations are necessary to make the byte compiler happy. + +;; For org v8 compatibility (if used with org v9) +(declare-function org-activate-plain-links "org" (limit)) +(declare-function org-activate-angle-links "org" (limit)) +(declare-function org-activate-bracket-links "org" (limit)) +(declare-function org-decompose-region "org-compat" (beg end)) + +;; For org v9 compatibility (if used with org v8) +(declare-function org-activate-links "org" (limit)) +(declare-function org-activate-dates "org" (limit)) + +(defun org-link-minor-mode--unfontify-region (beg end) + "Remove org-link fontification between BEG and END." + (font-lock-default-unfontify-region beg end) + (let* ((buffer-undo-list t) + (inhibit-read-only t) (inhibit-point-motion-hooks t) + (inhibit-modification-hooks t) + deactivate-mark buffer-file-name buffer-file-truename) + (if (fboundp 'org-decompose-region) + (org-decompose-region beg end) + (decompose-region beg end)) + (remove-text-properties beg end + '(mouse-face t keymap t org-linked-text t + invisible t intangible t + help-echo t rear-nonsticky t + htmlize-link t + org-no-flyspell t org-emphasis t)) + (org-remove-font-lock-display-properties beg end))) + +(defvar org-link-minor-mode-map (make-sparse-keymap) + "Local keymap.") +(make-variable-buffer-local 'org-link-minor-mode-map) + +;;;###autoload +(define-minor-mode org-link-minor-mode + "Toggle display of org-mode style links in non-org-mode buffers." + :lighter " org-link" + :keymap org-link-minor-mode-map + (let ((lk org-highlight-links) + org-link-minor-mode-keywords) + (if (fboundp 'org-activate-links) + ;; from Org v9.2 + (setq org-link-minor-mode-keywords + (list + '(org-activate-links) + (when (memq 'tag lk) '(org-activate-tags (1 'org-tag prepend))) + (when (memq 'radio lk) '(org-activate-target-links (1 'org-link t))) + (when (memq 'date lk) '(org-activate-dates (0 'org-date t))) + (when (memq 'footnote lk) '(org-activate-footnote-links)))) + (setq org-link-minor-mode-keywords + (list + (when (memq 'tag lk) '(org-activate-tags (1 'org-tag prepend))) + (when (memq 'angle lk) '(org-activate-angle-links (0 'org-link t))) + (when (memq 'plain lk) '(org-activate-plain-links (0 'org-link t))) + (when (memq 'bracket lk) '(org-activate-bracket-links (0 'org-link t))) + (when (memq 'radio lk) '(org-activate-target-links (0 'org-link t))) + (when (memq 'date lk) '(org-activate-dates (0 'org-date t))) + (when (memq 'footnote lk) '(org-activate-footnote-links))))) + (if org-link-minor-mode + (if (derived-mode-p 'org-mode) + (progn + (message "org-mode doesn't need org-link-minor-mode") + (org-link-minor-mode -1)) + (font-lock-add-keywords nil org-link-minor-mode-keywords t) + (kill-local-variable 'org-mouse-map) + (setq-local org-mouse-map + (let ((map (make-sparse-keymap))) + (define-key map [return] 'org-open-at-point) + (define-key map [tab] 'org-next-link) + (define-key map [backtab] 'org-previous-link) + (define-key map [mouse-2] 'org-open-at-point) + (define-key map [follow-link] 'mouse-face) + map)) + (setq-local font-lock-unfontify-region-function + 'org-link-minor-mode--unfontify-region) + (setq-local org-descriptive-links nil) + (org-toggle-link-display)) + (unless (derived-mode-p 'org-mode) + (font-lock-remove-keywords nil org-link-minor-mode-keywords) + (setq org-descriptive-links t) + (org-toggle-link-display) + (kill-local-variable 'org-descriptive-links) + (kill-local-variable 'org-mouse-map) + (kill-local-variable 'font-lock-unfontify-region-function))))) + +(provide 'org-link-minor-mode) +;;; org-link-minor-mode.el ends here diff --git a/home/dots/.emacs.d/snippets/go-mode/errnotnil b/home/dots/.emacs.d/snippets/go-mode/errnotnil new file mode 100644 index 0000000..0122e56 --- /dev/null +++ b/home/dots/.emacs.d/snippets/go-mode/errnotnil @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: err not nil +# key: ; +# -- +; err != nil
\ No newline at end of file diff --git a/home/dots/.emacs.d/snippets/go-mode/error b/home/dots/.emacs.d/snippets/go-mode/error new file mode 100644 index 0000000..799e9f8 --- /dev/null +++ b/home/dots/.emacs.d/snippets/go-mode/error @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: error +# key: err@ +# -- +if err != nil { + $0 +} diff --git a/home/dots/.emacs.d/snippets/mhtml-mode/<div>..</div>~ b/home/dots/.emacs.d/snippets/mhtml-mode/<div>..</div>~ new file mode 100644 index 0000000..028d782 --- /dev/null +++ b/home/dots/.emacs.d/snippets/mhtml-mode/<div>..</div>~ @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: <div>..</div> +# key: <div +# -- +<div> + $1 +</div> |