summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--init.el278
-rw-r--r--lisp/km-abbrev.el2
-rw-r--r--lisp/km-ace-link.el2
-rw-r--r--lisp/km-avy.el2
-rw-r--r--lisp/km-bib.el2
-rw-r--r--lisp/km-buffers.el2
-rw-r--r--lisp/km-compile.el2
-rw-r--r--lisp/km-denote.el70
-rw-r--r--lisp/km-diff.el2
-rw-r--r--lisp/km-dired.el2
-rw-r--r--lisp/km-editing.el2
-rw-r--r--lisp/km-elfeed.el2
-rw-r--r--lisp/km-ess.el2
-rw-r--r--lisp/km-files.el15
-rw-r--r--lisp/km-framewin.el2
-rw-r--r--lisp/km-gnus.el2
-rw-r--r--lisp/km-god.el36
-rw-r--r--lisp/km-hydra.el2
-rw-r--r--lisp/km-magit.el49
-rw-r--r--lisp/km-mail.el4
-rw-r--r--lisp/km-ol-git-link.el2
-rw-r--r--lisp/km-org-agenda.el4
-rw-r--r--lisp/km-org.el12
-rw-r--r--lisp/km-outline.el2
-rw-r--r--lisp/km-projectile.el2
-rw-r--r--lisp/km-python.el62
-rw-r--r--lisp/km-shell.el2
-rw-r--r--lisp/km-snakemake.el2
-rw-r--r--lisp/km-tex.el2
-rw-r--r--lisp/km-util.el2
-rw-r--r--lisp/km-webjump.el2
-rw-r--r--lisp/setkey.el2
-rw-r--r--snippets/sh-mode/mktempd4
34 files changed, 260 insertions, 322 deletions
diff --git a/.gitignore b/.gitignore
index 9e551ec..5b4fe7a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
/auto-save-list
cache
/bookmarks
+/eln-cache/
/history
/lisp/km-untracked.el
/.mc-lists.el
@@ -24,3 +25,4 @@ cache
/lisp/km-emacs-autoloads.el
/lisp/mail-config.el
/transient
+/debbugs
diff --git a/init.el b/init.el
index b4985dc..7b6a7e9 100644
--- a/init.el
+++ b/init.el
@@ -1,6 +1,6 @@
;;; init.el --- Kyle Meyer's Emacs configuration
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
@@ -59,9 +59,18 @@
:demand t
:init
(setq modus-themes-fringes 'subtle)
- (setq modus-themes-diffs 'fg-only)
:config
- (load-theme 'modus-operandi t))
+ (defun km/modus-themes-set-custom-faces ()
+ (modus-themes-with-colors
+ (when (featurep 'git-annex)
+ (set-face-attribute 'git-annex-dired-annexed-available nil
+ :foreground green)
+ (set-face-attribute 'git-annex-dired-annexed-unavailable nil
+ :foreground red))))
+ (add-hook 'modus-themes-after-load-theme-hook
+ #'km/modus-themes-set-custom-faces)
+
+ (modus-themes-load-theme 'modus-operandi))
;;; Custom prefix maps
@@ -84,6 +93,7 @@
(define-prefix-command 'km/dired-prefix-map)
(define-prefix-command 'km/dired-subtree-prefix-map)
(define-prefix-command 'km/gnus-summary-prefix-map)
+(define-prefix-command 'km/ledger-prefix-map)
(define-prefix-command 'km/magit-map)
(define-prefix-command 'km/magit-wip-map)
(define-prefix-command 'km/org-prefix-map)
@@ -96,14 +106,8 @@
;;; Org
(use-package org
- :load-path "~/src/emacs/org-mode/lisp/"
:mode ("\\.org.txt\\'" . org-mode)
:init
- (require 'org-loaddefs)
- (add-to-list 'load-path "~/src/emacs/org-contrib/lisp/" t)
- (with-eval-after-load 'info
- (info-initialize)
- (add-to-list 'Info-directory-list "~/src/emacs/org-mode/doc/"))
(bind-keys :map km/global-org-map
("b" . org-switchb)
("cg" . org-clock-goto)
@@ -133,7 +137,7 @@
(put 'org-log-done 'safe-local-variable #'booleanp)
(put 'org-archive-location 'safe-local-variable #'stringp)
- (setq org-catch-invisible-edits 'error
+ (setq org-fold-catch-invisible-edits 'error
org-special-ctrl-k t
org-insert-heading-respect-content nil
org-M-RET-may-split-line nil
@@ -146,9 +150,9 @@
org-goto-max-level 3)
(setq org-startup-folded t)
- (setq org-default-notes-file "~/notes/tasks.org")
- (setq org-agenda-text-search-extra-files
- (file-expand-wildcards "~/notes/extra/*.org"))
+ (setq org-directory (expand-file-name "~/tasks/"))
+ (setq org-default-notes-file (concat (file-name-as-directory org-directory)
+ "tasks.org"))
(setq org-reverse-note-order t)
(setq org-refile-targets '((nil :maxlevel . 2))
@@ -172,7 +176,7 @@
(add-hook 'next-error-hook (lambda ()
(when (eq major-mode 'org-mode)
- (org-show-context))))
+ (org-fold-show-context))))
(advice-add
'org-eval-in-calendar :around
@@ -188,7 +192,7 @@
'((name . "org-save-after-capture-refile")))
(bind-keys :map org-mode-map
- ("C-c l" . org-goto)
+ ("C-c l" . consult-org-heading)
("C-c m" . km/org-prefix-map)
;; Don't let `org-cycle-agenda-files' binding override
;; custom `backward-kill-word' binding
@@ -331,6 +335,8 @@
("o" . km/org-open-file)
("p" . km/org-open-file-at-point)
("r" . km/org-open-recent-file))
+ (bind-keys :map km/global-org-map
+ ("f" . km/org-copy-plain-file-link))
(define-key ctl-x-4-map "o" #'km/org-switch-to-buffer-other-window)
@@ -374,8 +380,8 @@
#'km/org-agenda-set-restriction-lock))
:config
- (setq org-directory "~/notes/")
- (setq org-agenda-files "~/notes/agenda-files")
+ (setq org-agenda-files (concat (file-name-as-directory org-directory)
+ "agenda-files"))
(add-hook 'org-agenda-finalize-hook #'km/org-agenda-cd-and-read-dir-locals)
(add-hook 'org-agenda-finalize-hook #'km/org-agenda-store-current-span)
@@ -387,14 +393,8 @@
("D" . km/org-agenda-delete-subtree)
("w" . km/org-agenda-refile-dwim)))
-(use-package org-link-edit
- :load-path "~/src/emacs/org-link-edit/"
- :init (require 'org-link-edit-autoloads nil t))
-
(use-package bog
- :load-path "~/src/emacs/bog/"
:init
- (require 'bog-autoloads nil t)
(setq bog-keymap-prefix (kbd "C-c b"))
(global-set-key bog-keymap-prefix bog-command-map)
:config
@@ -520,13 +520,6 @@
(put 'narrow-to-page 'disabled nil)
(put 'narrow-to-region 'disabled nil)
-(use-package narrow-indirect
- :init
- (bind-keys :map ctl-x-4-map
- ("nd" . ni-narrow-to-defun-indirect-other-window)
- ("nn" . ni-narrow-to-region-indirect-other-window)
- ("np" . ni-narrow-to-page-indirect-other-window)))
-
(use-package avy
:chords ("jf" . avy-goto-subword-1)
:init
@@ -584,32 +577,39 @@
(with-eval-after-load 'avy
(add-to-list 'avy-dispatch-alist (cons ?w #'km/avy-action-copy-line))))
-(use-package ivy
- :diminish ivy-mode
- :config
- (setq ivy-count-format "(%d/%d) ")
- (setq ivy-use-virtual-buffers t)
- (setq ivy-virtual-abbreviate 'abbreviate)
- (setq ivy-wrap t)
-
- (define-key ivy-minibuffer-map (kbd "C-'") nil)
- (define-key ivy-minibuffer-map (kbd "C-.") 'ivy-avy)
+(use-package vertico
+ :init
+ (vertico-mode 1))
- (ivy-mode 1))
+(use-package orderless
+ :init
+ (setq completion-styles '(orderless basic))
+ (setq completion-category-overrides
+ '((file (styles basic partial-completion)))))
-(use-package swiper
- :bind (("M-s k" . swiper)))
+(use-package consult
+ :chords (("jt" . consult-buffer))
+ :bind (("C-x b" . consult-buffer)
+ ("C-x 4 b" . consult-buffer-other-window)
+ ("C-c z m" . consult-man)
+ ("M-g g" . consult-goto-line)
+ ("M-s k" . consult-line)
+ ("M-y" . consult-yank-pop)
+ :map minibuffer-local-map
+ ("M-s" . consult-history)
+ ("M-r" . consult-history))
+ :config
+ (setq consult-narrow-key "<")
+ (setq consult-preview-key nil))
-(use-package counsel
- :chords (("jt" . counsel-buffer-or-recentf)
- ("kx" . counsel-M-x))
- :bind (("C-c l" . counsel-imenu)
- ("M-y" . counsel-yank-pop)))
+(use-package consult-imenu
+ :bind (("C-c l" . consult-imenu)))
;;; Buffers and files
(setq require-final-newline t)
+(setq write-region-inhibit-fsync t)
;; Disable `suspend-frame' binding.
(global-set-key (kbd "C-x C-z") nil)
@@ -645,6 +645,8 @@
(setq tramp-default-method "sshx"))
(use-package recentf
+ :init
+ (recentf-mode 1)
:config
(setq recentf-max-saved-items 100
recentf-save-file "~/.emacs.d/cache/recentf")
@@ -658,19 +660,6 @@
"/itsalltext/")
recentf-exclude)))
-(use-package nlines
- :load-path "~/src/emacs/nlines/"
- :init
- (require 'nlines-autoloads nil t)
- (define-key km/file-map "l" #'nlines-run-command))
-
-(use-package cpinfo
- :load-path "~/src/emacs/cpinfo/"
- :init
- (require 'cpinfo-autoloads nil t)
- (with-eval-after-load 'dired
- (define-key km/dired-prefix-map "f" #'cpinfo-copy)))
-
(use-package view
:diminish (view-mode . "Vw")
:chords ("hq" . view-mode)
@@ -754,7 +743,7 @@
:config
(setq projectile-find-dir-includes-top-level t
projectile-use-git-grep t)
- (setq projectile-completion-system 'ivy)
+ (setq projectile-git-submodule-command nil)
(defun km/projectile-ignore-directory-p (name)
(or (file-remote-p name)
@@ -886,18 +875,14 @@
(use-package git-annex
:config
- (setq git-annex-commit nil))
-
-(use-package with-editor
- :load-path "~/src/emacs/with-editor/")
+ (setq git-annex-commit nil)
+ (run-hooks 'modus-themes-after-load-theme-hook))
(use-package transient
- :load-path "~/src/emacs/transient/lisp"
:config
(setq transient-default-level 7))
(use-package magit-popup
- :load-path "~/src/emacs/magit-popup/"
:config
(setq magit-popup-show-help-echo nil
magit-popup-show-common-commands nil
@@ -908,7 +893,6 @@
("SPC SPC <t>" . magit-invoke-popup-option)))
(use-package magit
- :load-path "~/src/emacs/magit/lisp/"
:bind ("C-x g" . km/magit-status)
:chords ("jg" . km/magit-status)
:init
@@ -977,9 +961,9 @@
(transient-append-suffix 'magit-diff "t"
'("e" "Edit options" magit-diff-refresh))
(transient-append-suffix 'magit-diff "-w"
- '("-d" "Diff filter" "--diff-filter=" read-from-minibuffer))
+ '("-d" "Diff filter" "--diff-filter="))
(transient-append-suffix 'magit-diff-refresh "-w"
- '("-d" "Diff filter" "--diff-filter=" read-from-minibuffer))
+ '("-d" "Diff filter" "--diff-filter="))
(transient-suffix-put 'magit-stash "Z" :key "s")
@@ -1075,9 +1059,6 @@
(put 'magit-edit-line-commit 'disabled nil)
(put 'magit-diff-edit-hunk-commit 'disabled nil))
-(use-package orgit
- :load-path "~/src/emacs/orgit/")
-
(use-package km-magit
:init
(bind-keys :map km/git-map
@@ -1155,7 +1136,7 @@
(transient-append-suffix 'magit-log "l"
'("d" "Log dwim" km/magit-log-dwim))
- (transient-append-suffix 'magit-log "d"
+ (transient-append-suffix 'magit-log "s"
'("y" "Cherry dwim" km/magit-cherry-dwim))
(transient-append-suffix 'magit-merge "m"
@@ -1188,21 +1169,10 @@
'("s" "series" km/magit-patch-create-series))))
(use-package magit-annex
- :load-path "~/src/emacs/magit-annex/"
- :init (require 'magit-annex-autoloads nil t)
:config
(setq magit-annex-unused-open-function #'org-open-file))
-(use-package magit-tbdiff
- :load-path "~/src/emacs/magit-tbdiff/"
- :init (require 'magit-tbdiff-autoloads nil t))
-
-(use-package magit-imerge
- :load-path "~/src/emacs/magit-imerge/"
- :init (require 'magit-imerge-autoloads nil t))
-
(use-package git-commit
- ;; :load-path "~/src/emacs/magit/lisp/"
:config
(setq git-commit-finish-query-functions nil)
@@ -1219,50 +1189,16 @@
'((name . "go-to-bob"))))
(use-package orgit
- :disabled t
- :load-path "~/src/emacs/orgit/"
- :init (require 'orgit-autoloads nil t))
+ :disabled t)
;;; Command interfaces
+(key-chord-define-global "kx" #'execute-extended-command)
+
(use-package setkey
:bind ("C-c v" . setkey-call))
-(use-package god-mode
- :bind (("C-c d" . god-local-mode)
- ("C-x C-1" . delete-other-windows)
- ("C-x C-2" . split-window-below)
- ("C-x C-3" . split-window-right))
- :config
- (add-hook 'view-mode-hook
- (lambda ()
- (if view-mode (god-local-mode-pause) (god-local-mode-resume))))
- (add-hook 'org-capture-mode-hook
- (lambda () (god-local-mode -1)))
-
- (add-hook 'god-mode-enabled-hook
- (lambda ()
- (when view-mode
- (view-mode -1))
- (when (derived-mode-p 'emacs-lisp-mode)
- (lispy-mode -1))))
- (add-hook 'god-mode-disabled-hook
- (lambda ()
- (when (derived-mode-p 'emacs-lisp-mode)
- (lispy-mode 1))))
- (bind-keys :map god-local-mode-map
- ("." . repeat)
- ("i" . god-local-mode))
-
- (require 'km-god))
-
-(use-package km-god
- :config
- (add-to-list 'god-exempt-predicates #'km/god-gnus-p)
- (add-hook 'god-mode-enabled-hook #'km/god-update-cursor)
- (add-hook 'god-mode-disabled-hook #'km/god-update-cursor))
-
(use-package km-hydra
:bind (("C-c n" . km/hydra-outline-mode)
("C-c w" . hydra-window-map/body))
@@ -1325,7 +1261,6 @@
(global-set-key (kbd "C-c i") #'km/yas-dummy)
:config
(global-set-key (kbd "C-c i") nil)
- (setq yas-fallback-behavior nil)
(defun km/yas-with-comment (str)
(concat comment-start
@@ -1506,6 +1441,10 @@
("a" . km/zsh-ansi-term)
("t" . km/open-external-terminal)))
+(use-package vterm
+ :init
+ (bind-keys :map km/external-map ("v" . vterm)))
+
;;; Other external programs
@@ -1513,7 +1452,7 @@
:init
(define-key km/external-map "b" #'browse-url)
:config
- (setq browse-url-browser-function
+ (setq browse-url-handlers
`(,(cons (rx string-start "https://"
(or "inbox.kyleam.com"
"lore.kernel.org"
@@ -1551,8 +1490,6 @@
select-enable-primary t))
(use-package man
- :init
- (define-key km/external-map "m" #'man)
:config
(setq Man-notify-method 'aggressive))
@@ -1759,21 +1696,42 @@
(use-package ledger-mode
:init
- (and (boundp 'font-lock-global-modes)
- (pcase font-lock-global-modes
- ('t
- (setq font-lock-global-modes '(not ledger-mode)))
- (`(not . ,_)
- (add-to-list 'font-lock-global-modes 'ledger-mode t))
- (`(,_ . ,_)
- (setq font-lock-global-modes
- (delq 'ledger-mode font-lock-global-modes))))))
+ (bind-keys :map km/ledger-prefix-map
+ ("a" . km/ledger-insert-account)
+ ("p" . km/ledger-insert-payee))
+
+ (setq ledger-highlight-xact-under-point nil)
+ :config
+ (defun km/ledger-insert-account ()
+ (interactive)
+ (insert (completing-read "Account: " (ledger-accounts-list))))
+
+ (defun km/ledger-insert-payee ()
+ (interactive)
+ (insert (completing-read "Payee: " (ledger-payees-in-buffer))))
+
+ (bind-keys :map ledger-mode-map
+ ("C-c m" . km/ledger-prefix-map)))
(use-package rst
- :defer t
:config
(add-hook 'rst-mode-hook #'flyspell-mode))
+(use-package denote
+ :bind (("C-c d d" . denote)
+ ("C-c d D" . denote-date)
+ ("C-c d t" . denote-type)
+ ("C-c d f" . km/find-file-with-denote-naming)
+ ("C-c d ." . km/denote-find-file-at-point)
+ ("C-c d i" . km/denote-insert-id))
+ :config
+ (setq denote-directory (expand-file-name "~/notes"))
+ (setq denote-dired-directories (list denote-directory))
+ (setq denote-file-type 'text)
+
+ (with-eval-after-load 'dired
+ (add-hook 'dired-mode-hook #'denote-dired-mode-in-directories)))
+
;;; Language modes
@@ -1789,7 +1747,7 @@
(use-package haskell-mode
:config
(setq haskell-process-show-debug-tips nil)
- (add-hook 'haskell-mode-hook #'turn-on-haskell-indentation)
+ (add-hook 'haskell-mode-hook #'haskell-indentation-mode)
(add-hook 'haskell-mode-hook #'interactive-haskell-mode)
(add-hook 'haskell-mode-hook #'turn-on-haskell-doc)
(bind-keys :map haskell-mode-map
@@ -1822,15 +1780,12 @@
'("Packages" "^\\s-*(\\(use-package\\)\\s-+\\(\\(\\sw\\|\\s_\\)+\\)" 2))))
(add-hook 'emacs-lisp-mode-hook #'km/imenu-add-use-package))
-(use-package find-function
+(use-package find-func
:bind (("C-h ;" . find-function)
("C-h 4 ;" . find-function-other-window))
:init
(define-key km/file-map "e" #'find-library))
-(use-package paredit
- :diminish (paredit-mode . "Pe"))
-
(use-package lispy
:init
(add-hook 'emacs-lisp-mode-hook #'lispy-mode)
@@ -1879,7 +1834,6 @@
(add-to-list 'interpreter-mode-alist '("python2" . python-mode))
(add-to-list 'interpreter-mode-alist '("python3" . python-mode))
- (pyvenv-tracking-mode 1)
:config
(setq python-fill-docstring-style 'pep-257-nn
python-indent-guess-indent-offset nil)
@@ -1916,15 +1870,7 @@
(require 'km-python))
-(use-package pydoc
- :load-path "~/src/emacs/pydoc/"
- :config
- (setq pydoc-make-method-buttons nil)
- ;; Don't shadow my `ace-link' binding.
- (define-key pydoc-mode-map "o" #'ace-link-help))
-
(use-package km-python
- :bind ("C-h y" . km/pydoc)
:init
(bind-keys :map km/python-prefix-map
("c" . km/python-copy-last-shell-line-as-comment)
@@ -1940,19 +1886,13 @@
(lambda ()
(add-hook
'post-self-insert-hook
- #'km/python-indent-post-self-insert-function 'append 'local)))
-
- (add-hook 'pydoc-after-finish-hook #'km/pydoc-store-name)
- (when (file-exists-p km/pydoc-names-file)
- (km/pydoc-read-names-file km/pydoc-names-file)))
+ #'km/python-indent-post-self-insert-function 'append 'local))))
(use-package snakemake-mode
- :load-path "~/src/emacs/snakemake-mode/"
:init
- (require 'snakemake-autoloads nil t)
- (define-key km/compile-map "s" #'snakemake-popup)
+ (define-key km/compile-map "s" #'snakemake)
(with-eval-after-load 'dired
- (define-key dired-mode-map "b" #'snakemake-popup))
+ (define-key dired-mode-map "b" #'snakemake))
:config
(setq snakemake-root-dir-function #'projectile-project-root)
@@ -1963,11 +1903,7 @@
;; is derived from Python mode, I need to define it again here
;; because I have a Python mode hook that overrides the Python
;; version.
- (add-hook 'snakemake-mode-hook #'km/snakemake-set-local-vars)
-
- (with-eval-after-load 'snakemake
- (magit-change-popup-key 'snakemake-popup :action
- ?p ?o)))
+ (add-hook 'snakemake-mode-hook #'km/snakemake-set-local-vars))
(use-package km-snakemake
:init
@@ -2026,14 +1962,13 @@
(use-package notmuch
:init
- (autoload 'notmuch "notmuch" "Notmuch mail" t)
(define-key km/mail-map "n" #'notmuch)
:config
(setq mail-user-agent 'notmuch-user-agent)
(setq notmuch-hello-sections '(notmuch-hello-insert-saved-searches))
(setq notmuch-archive-tags '("-unread"))
(setq notmuch-draft-tags '("+draft" "-unread"))
- (setq notmuch-search-oldest-first nil)
+ (setq-default notmuch-search-oldest-first nil)
(setq notmuch-show-indent-messages-width 0)
@@ -2049,6 +1984,8 @@
(add-to-list 'notmuch-show-stash-mlarchive-link-alist
'("yhetil-orgmode" . "https://yhetil.org/orgmode/"))
+ (add-to-list 'notmuch-show-stash-mlarchive-link-alist
+ '("orgmode-list" . "https://list.orgmode.org/"))
(advice-add
'notmuch-show-forward-message :around
@@ -2273,7 +2210,10 @@
visible-bell t
enable-recursive-minibuffers t)
-(setq bookmark-save-flag nil)
+(use-package bookmark
+ :config
+ (setq bookmark-save-flag nil)
+ (setq bookmark-fringe-mark nil))
(use-package eww
:config
@@ -2316,8 +2256,6 @@
;; Remove all mail map bindings except notmuch-related ones.
(global-set-key (kbd "C-x m n") #'notmuch)
(global-set-key (kbd "C-x m .") #'km/notmuch-show-at-point)
- (with-eval-after-load 'km-python
- (add-hook 'kill-emacs-hook #'km/pydoc-save-names-file))
(savehist-mode 1)
(setq save-abbrevs 'silently
bookmark-save-flag 1)
diff --git a/lisp/km-abbrev.el b/lisp/km-abbrev.el
index 554464d..20653b3 100644
--- a/lisp/km-abbrev.el
+++ b/lisp/km-abbrev.el
@@ -1,6 +1,6 @@
;;; km-abbrev.el --- Abbrev mode extesions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-ace-link.el b/lisp/km-ace-link.el
index e407348..b3ac06e 100644
--- a/lisp/km-ace-link.el
+++ b/lisp/km-ace-link.el
@@ -1,6 +1,6 @@
;;; km-ace-link.el --- Extensions for Ace Link
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-avy.el b/lisp/km-avy.el
index 5c31daa..dc99b00 100644
--- a/lisp/km-avy.el
+++ b/lisp/km-avy.el
@@ -1,6 +1,6 @@
;;; km-avy.el --- Extensions for avy
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-bib.el b/lisp/km-bib.el
index 4b82c28..ef50400 100644
--- a/lisp/km-bib.el
+++ b/lisp/km-bib.el
@@ -1,6 +1,6 @@
;;; km-bib.el --- Bibliography configuration
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-buffers.el b/lisp/km-buffers.el
index 762a39b..0fb44f6 100644
--- a/lisp/km-buffers.el
+++ b/lisp/km-buffers.el
@@ -1,6 +1,6 @@
;;; km-buffers.el --- Buffer-related extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-compile.el b/lisp/km-compile.el
index 2e8e571..d7a8635 100644
--- a/lisp/km-compile.el
+++ b/lisp/km-compile.el
@@ -1,6 +1,6 @@
;;; km-compile.el --- Compilation extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-denote.el b/lisp/km-denote.el
new file mode 100644
index 0000000..24e98d2
--- /dev/null
+++ b/lisp/km-denote.el
@@ -0,0 +1,70 @@
+;;; km-denote.el --- Denote-related extensions -*- lexical-binding: t; -*-
+
+;; Copyright Kyle Meyer <kyle@kyleam.com>
+
+;; Author: Kyle Meyer <kyle@kyleam.com>
+;; URL: https://git.kyleam.com/emacs.d
+
+;; 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/>.
+
+;;; Code:
+
+(require 'denote)
+
+;;;###autoload
+(defun km/denote-add-frontmatter ()
+ "Insert front matter into current file.
+Unlike an interactive call to `denote-add-front-matter', this
+does not prompt for the title and keywords; it just takes them
+from the file name."
+ (interactive)
+ (let ((fname (or (buffer-file-name)
+ (user-error "Buffer not visiting file"))))
+ (denote-add-front-matter
+ fname
+ (denote-retrieve-filename-title fname)
+ (denote-extract-keywords-from-path fname))))
+
+;;;###autoload
+(defun km/denote-find-file-at-point ()
+ "Find the file in `denote-directory' for the denote ID at point.
+The file must be tracked in Git."
+ (interactive)
+ (let ((id (save-excursion
+ (let ((case-fold-search nil))
+ (skip-chars-backward "-a-z0-9_T"))
+ (if (looking-at denote-id-regexp)
+ (match-string-no-properties 0)
+ (user-error "No denote ID at point"))))
+ (default-directory denote-directory))
+ (find-file
+ (car (or (process-lines "git" "ls-files" "--" (concat id "--*"))
+ (process-lines "git" "ls-files" "--" (concat "**/" id "--*"))
+ (user-error "No tracked file found for %s" id))))))
+
+(defun km/denote-insert-id (&optional with-prefix)
+ "Insert ID of tracked file in `denote-directory'.
+When WITH-PREFIX is non-nil, prepend \"denote:\" to the inserted
+ID."
+ (interactive "P")
+ (let* ((default-directory denote-directory)
+ (id (or (denote-extract-id-from-string
+ (completing-read
+ "Note: "
+ (process-lines "git" "ls-files" "--" "*--*")))
+ (error "Could not determine ID"))))
+ (insert (concat (and with-prefix "denote:") id))))
+
+(provide 'km-denote)
+;;; km-denote.el ends here
diff --git a/lisp/km-diff.el b/lisp/km-diff.el
index a4b855b..ce26288 100644
--- a/lisp/km-diff.el
+++ b/lisp/km-diff.el
@@ -1,6 +1,6 @@
;;; km-diff.el --- Diff-related extensions -*- lexical-binding: t; -*-
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-dired.el b/lisp/km-dired.el
index 51eeb15..a6fb8d8 100644
--- a/lisp/km-dired.el
+++ b/lisp/km-dired.el
@@ -1,6 +1,6 @@
;;; km-dired.el --- Dired extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-editing.el b/lisp/km-editing.el
index 262d3aa..17a8f28 100644
--- a/lisp/km-editing.el
+++ b/lisp/km-editing.el
@@ -1,6 +1,6 @@
;;; km-editing.el --- Editing-related extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-elfeed.el b/lisp/km-elfeed.el
index eb5c2ea..f057836 100644
--- a/lisp/km-elfeed.el
+++ b/lisp/km-elfeed.el
@@ -1,6 +1,6 @@
;;; km-elfeed.el --- Extensions for elfeed
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-ess.el b/lisp/km-ess.el
index bba660e..66e144d 100644
--- a/lisp/km-ess.el
+++ b/lisp/km-ess.el
@@ -1,6 +1,6 @@
;;; km-ess.el --- ESS extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-files.el b/lisp/km-files.el
index 9bd9280..5ec4a06 100644
--- a/lisp/km-files.el
+++ b/lisp/km-files.el
@@ -1,6 +1,6 @@
;;; km-files.el --- File-related extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
@@ -99,6 +99,14 @@ Use the current file name as initial input of prompt."
(defun km/read-recent-file ()
(completing-read "Choose recent file: " recentf-list nil t))
+;;;###autoload
+(defun km/find-file-with-denote-naming (file)
+ (interactive "F")
+ (find-file
+ (concat (file-name-directory file)
+ (format-time-string "%Y%m%dT%H%M%S--")
+ (file-name-nondirectory file))))
+
;;; Scratch files
@@ -125,7 +133,7 @@ Prompt with characters from `km/find-scratch-buffers' to
determine the extension of the scratch file.
With prefix argument PWD, find the scratch file in
-`default-directory' instead of /tmp."
+`default-directory' instead of `temporary-file-directory'."
(interactive "P")
(switch-to-buffer (km/scratch--find-file-no-select pwd)))
@@ -142,7 +150,8 @@ With prefix argument PWD, find the scratch file in
(let* ((choices (mapcar #'car km/find-scratch-buffers))
(ch (read-char-choice (concat "[" choices "]") choices))
(ext (cadr (assq ch km/find-scratch-buffers))))
- (concat (if pwd default-directory "/tmp/") "scratch" ext)))
+ (expand-file-name (concat "scratch" ext)
+ (if pwd default-directory temporary-file-directory))))
(provide 'km-files)
;;; km-files.el ends here
diff --git a/lisp/km-framewin.el b/lisp/km-framewin.el
index 95037b1..abc7fb2 100644
--- a/lisp/km-framewin.el
+++ b/lisp/km-framewin.el
@@ -1,6 +1,6 @@
;;; km-framewin.el --- Frame and window extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-gnus.el b/lisp/km-gnus.el
index dee7d76..b8b804b 100644
--- a/lisp/km-gnus.el
+++ b/lisp/km-gnus.el
@@ -1,6 +1,6 @@
;;; km-mail.el --- Gnus-related extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-god.el b/lisp/km-god.el
deleted file mode 100644
index 6426830..0000000
--- a/lisp/km-god.el
+++ /dev/null
@@ -1,36 +0,0 @@
-;;; km-god.el --- God mode extensions
-
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
-
-;; Author: Kyle Meyer <kyle@kyleam.com>
-;; URL: https://git.kyleam.com/emacs.d
-
-;; 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/>.
-
-;;; Code:
-
-(require 'god-mode)
-
-(defun km/god-update-cursor ()
- (setq cursor-type (if god-local-mode 'bar 'box)))
-
-(defun km/god-gnus-p ()
- "Return non-nil if a Gnus-related mode is enabled."
- (derived-mode-p 'gnus-group-mode
- 'gnus-summary-mode
- 'gnus-article-mode
- 'message-mode))
-
-(provide 'km-god)
-;;; km-god.el ends here
diff --git a/lisp/km-hydra.el b/lisp/km-hydra.el
index 9437b48..ebe238f 100644
--- a/lisp/km-hydra.el
+++ b/lisp/km-hydra.el
@@ -1,6 +1,6 @@
;;; km-hydra.el --- Hydra definitions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-magit.el b/lisp/km-magit.el
index f6f4cdf..204bddb 100644
--- a/lisp/km-magit.el
+++ b/lisp/km-magit.el
@@ -1,6 +1,6 @@
;;; km-magit.el --- Magit extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
@@ -50,19 +50,21 @@ a proper commit."
(interactive)
(magit-run-git "commit" "--all" "--message=auto"))
-(defun km/magit-update-or-auto-commit (&optional no-directory)
+(defun km/magit-update-or-auto-commit (&optional full-name)
(interactive "P")
(let ((files (delete-dups (nconc (magit-unstaged-files)
(magit-staged-files)))))
(cl-case (length files)
(0 (user-error "No tracked files with changes"))
(1
- (magit-run-git "commit" "--all" "--message"
- (concat (funcall (if no-directory
- #'file-name-nondirectory
- #'identity)
- (car files))
- ": Update")))
+ (let ((file (car files)))
+ (magit-run-git "commit" "--all" "--message"
+ (concat (funcall (if full-name
+ #'identity
+ #'file-name-nondirectory)
+ file)
+ (and (magit-rev-verify (concat "HEAD:" file))
+ ": Update")))))
(t
(km/magit-auto-commit)))))
@@ -255,7 +257,7 @@ argument SUFFIX, prompt for a suffix to use instead of
(list
(magit-completing-read
"Branch to archive" (magit-list-refnames "refs/heads")
- nil 'require nil nil
+ nil 'require-match nil nil
(or (magit-branch-at-point) (magit-get-previous-branch)))))))
(setq branches
(mapcar (lambda (branch)
@@ -320,7 +322,7 @@ argument SUFFIX, prompt for a suffix to use instead of
(interactive
(list (magit-completing-read
"Delete set with member" (magit-list-refnames "refs/heads")
- nil 'require nil nil
+ nil 'require-match nil nil
(or (magit-branch-at-point) (magit-get-previous-branch)))))
(km/magit-branch--set-action
"Delete"
@@ -332,7 +334,7 @@ argument SUFFIX, prompt for a suffix to use instead of
(interactive
(list (magit-completing-read
"Archive set with member" (magit-list-refnames "refs/heads")
- nil 'require nil nil
+ nil 'require-match nil nil
(or (magit-branch-at-point) (magit-get-previous-branch)))))
(km/magit-branch--set-action
"Archive"
@@ -467,13 +469,13 @@ N defaults to 20."
(1 (car files))
(t (magit-completing-read "File" files nil t))))))
-(defun km/magit-insert-staged-file (&optional no-directory)
+(defun km/magit-insert-staged-file (&optional full-name)
"Select a staged file to insert.
This is useful for referring to file names in commit messages.
By default, the path for the file name is relative to the top
directory of the repository. Remove the directory component from
-the file name if NO-DIRECTORY is non-nil.
+the file name unless FULL-NAME is non-nil.
If there are no staged files, look instead at files that changed
in HEAD. These rules will usually offer the files of interest
@@ -489,7 +491,7 @@ command will still offer the staged files)."
(0 (error "No files found"))
(t
(completing-read "Staged file: " files nil t)))))
- (insert (if no-directory (file-name-nondirectory file) file)))))
+ (insert (if full-name file (file-name-nondirectory file))))))
(defun km/magit-shorten-hash (hash &optional n)
(magit-rev-parse (format "--short=%s" (or n (magit-abbrev-length))) hash))
@@ -544,11 +546,11 @@ argument."
(kill-new (message "%s" desc))))
(defun km/magit-rev-ancestor-p (rev-a rev-b)
- "Report whether REV-A is the ancestor of REV-B."
+ "Report whether REV-A is an ancestor of REV-B."
(interactive
- (let* ((rev-a (magit-read-branch-or-commit "Ancestor candidate")))
+ (let ((rev-a (magit-read-branch-or-commit "Ancestor candidate")))
(list rev-a (magit-read-other-branch-or-commit
- (format "Is %s the ancestor of" rev-a)
+ (format "Is %s an ancestor of" rev-a)
rev-a))))
(message "%s is %san ancestor of %s" rev-a
(if (magit-git-success "merge-base" "--is-ancestor"
@@ -881,9 +883,6 @@ appending [M/N] to each entry."
;; specified.
(when (magit-anything-modified-p t)
(user-error "There are uncommitted changes"))
- (setq args (seq-remove
- (lambda (a) (string-match-p "\\`--base=" a))
- args))
(let* ((current (magit-get-current-branch))
(upstream (or (magit-get-upstream-branch current)
(user-error "No upstream branch")))
@@ -894,8 +893,10 @@ appending [M/N] to each entry."
(concat "reset: moving back to " current)
current)
(magit-branch-checkout patch-branch))
- (apply #'magit-run-git "format-patch"
- upstream (concat "--base=" upstream) args)
+ (unless (seq-some (lambda (a) (string-match-p "\\`--base=" a))
+ args)
+ (setq args (cons (concat "--base=" upstream) args)))
+ (apply #'magit-run-git "format-patch" upstream args)
(let* ((patches (or (seq-filter
(lambda (f) (string-suffix-p ".patch" f))
(magit-untracked-files))
@@ -1142,8 +1143,8 @@ function."
;; This always converts to commits IDs. It could try to map
;; refnames to the appropriate GitHub link (including remotes
;; to forks), but I don't have much need for it at the moment.
- (let ((rev1 (magit-rev-parse (match-string 1 magit-buffer-range)))
- (rev2 (magit-rev-parse (match-string 3 magit-buffer-range))))
+ (let ((rev1 (magit-commit-p (match-string 1 magit-buffer-range)))
+ (rev2 (magit-commit-p (match-string 3 magit-buffer-range))))
(format "%s/compare/%s...%s"
(or (km/magit-github-url) "")
rev1 rev2)))))
diff --git a/lisp/km-mail.el b/lisp/km-mail.el
index 4c3104e..22d6b4e 100644
--- a/lisp/km-mail.el
+++ b/lisp/km-mail.el
@@ -1,6 +1,6 @@
;;; km-mail.el --- Mail-related extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
@@ -183,7 +183,7 @@ in the remote's \".git/config\" entry."
(default-value 'notmuch-search-oldest-first)))
(declare-function debbugs-gnu-current-status "debbugs-gnu" ())
-;; Modified from fucntion in Nicolas Petton's emacs configuration
+;; Modified from function in Nicolas Petton's emacs configuration
;; (https://gitlab.petton.fr/nico/emacs.d/, 208407f53a)
;;;###autoload
(defun km/debbugs-notmuch-select-report (&rest _)
diff --git a/lisp/km-ol-git-link.el b/lisp/km-ol-git-link.el
index efe5cd8..19582bc 100644
--- a/lisp/km-ol-git-link.el
+++ b/lisp/km-ol-git-link.el
@@ -1,6 +1,6 @@
;;; km-ol-git-link.el --- Tweaks to ol-git-link
-;; Copyright (C) 2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-org-agenda.el b/lisp/km-org-agenda.el
index e377f69..ded7afc 100644
--- a/lisp/km-org-agenda.el
+++ b/lisp/km-org-agenda.el
@@ -1,6 +1,6 @@
;;; km-org-agenda.el --- Org mode agenda extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
@@ -33,7 +33,7 @@
(defun km/org-agenda-cd-and-read-dir-locals ()
(unless (get 'org-agenda-files 'org-restrict)
- (setq default-directory (expand-file-name "~/notes/"))
+ (setq default-directory org-directory)
(hack-local-variables)))
(defun km/org-agenda-store-current-span ()
diff --git a/lisp/km-org.el b/lisp/km-org.el
index 683dc3c..37ca829 100644
--- a/lisp/km-org.el
+++ b/lisp/km-org.el
@@ -1,6 +1,6 @@
;;; km-org.el --- Org mode extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
@@ -537,6 +537,16 @@ beginning of the link."
(goto-char beg)
slurped))))
+;;;###autoload
+(defun km/org-copy-plain-file-link ()
+ (interactive)
+ (kill-new
+ (message
+ (concat "file:"
+ (abbreviate-file-name
+ (or (buffer-file-name)
+ (user-error "Buffer not visiting a file")))))))
+
;;; Export
diff --git a/lisp/km-outline.el b/lisp/km-outline.el
index b5b7b2a..8455e50 100644
--- a/lisp/km-outline.el
+++ b/lisp/km-outline.el
@@ -1,6 +1,6 @@
;;; km-outline.el --- Outline mode extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-projectile.el b/lisp/km-projectile.el
index e22eeae..cf855b6 100644
--- a/lisp/km-projectile.el
+++ b/lisp/km-projectile.el
@@ -1,6 +1,6 @@
;;; km-projectile.el --- Projectile configuration
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-python.el b/lisp/km-python.el
index 18ef28f..339e8be 100644
--- a/lisp/km-python.el
+++ b/lisp/km-python.el
@@ -1,6 +1,6 @@
;;; km-python.el --- Python extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
@@ -203,65 +203,5 @@ being turned on."
(when (< (current-indentation) indentation)
(indent-line-to indentation))))))
-
-;;; Pydoc
-
-(require 'pydoc)
-
-(defvar km/pydoc-names nil
- "List of names that have been sucessfully loaded by `pydoc'.")
-
-(defvar km/pydoc-names-file "~/.emacs.d/.pydoc-names"
- "File to save `km/pydoc-names' to.")
-
-;;;###autoload
-(defun km/pydoc ()
- "Run `pydoc', prompting with `km/pydoc-names'."
- (interactive)
- (let* ((default-directory "~/")
- (initial-name (and (use-region-p)
- (buffer-substring-no-properties
- (region-beginning)
- (region-end))))
- (name (completing-read "Name: " km/pydoc-names nil nil
- initial-name)))
- (pydoc name)))
-
-(defun km/pydoc-store-name ()
- "Store the name for the current pydoc object."
- (with-current-buffer (pydoc-buffer)
- (unless (eq (plist-get pydoc-info :type) 'not-found)
- (cl-pushnew (substring-no-properties (car (cdr help-xref-stack-item)))
- km/pydoc-names
- :test #'string=))))
-
-(defun km/pydoc-save-names-file (&optional file)
- "Save `km/pydoc-names' to FILE.
-FILE is `km/pydoc-names-file' by default."
- (interactive
- (list
- (read-file-name (format "Save file (default %s): "
- km/pydoc-names-file)
- nil km/pydoc-names-file t)))
- (setq file (or file km/pydoc-names-file))
- (when (file-writable-p file)
- (with-temp-file file
- (let (print-length)
- (print (sort km/pydoc-names #'string-lessp)
- (current-buffer))))))
-
-;;;###autoload
-(defun km/pydoc-read-names-file (&optional file)
- "Read `km/pydoc-names-file' from FILE.
-FILE is `km/pydoc-names-file' by default."
- (interactive
- (list
- (read-file-name (format "Read file (default %s): "
- km/pydoc-names-file)
- nil km/pydoc-names-file t)))
- (with-temp-buffer
- (insert-file-contents (or file km/pydoc-names-file))
- (setq km/pydoc-names (read (current-buffer)))))
-
(provide 'km-python)
;;; km-python.el ends here
diff --git a/lisp/km-shell.el b/lisp/km-shell.el
index afbfa72..63a8366 100644
--- a/lisp/km-shell.el
+++ b/lisp/km-shell.el
@@ -1,6 +1,6 @@
;;; km-shell.el --- Shell-related extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-snakemake.el b/lisp/km-snakemake.el
index fc95dce..a1dbe5b 100644
--- a/lisp/km-snakemake.el
+++ b/lisp/km-snakemake.el
@@ -1,6 +1,6 @@
;;; km-snakemake.el --- Snakemake extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-tex.el b/lisp/km-tex.el
index c7e4fef..16b4780 100644
--- a/lisp/km-tex.el
+++ b/lisp/km-tex.el
@@ -1,6 +1,6 @@
;;; km-tex.el --- TeX extensions
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-util.el b/lisp/km-util.el
index 13629eb..7d80543 100644
--- a/lisp/km-util.el
+++ b/lisp/km-util.el
@@ -1,6 +1,6 @@
;;; km-util.el --- Utilities
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/km-webjump.el b/lisp/km-webjump.el
index f3c2cb7..8fc7b20 100644
--- a/lisp/km-webjump.el
+++ b/lisp/km-webjump.el
@@ -1,6 +1,6 @@
;;; km-webjump.el --- Extensions for webjump
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/lisp/setkey.el b/lisp/setkey.el
index 2482585..3e83f5b 100644
--- a/lisp/setkey.el
+++ b/lisp/setkey.el
@@ -1,6 +1,6 @@
;;; setkey.el --- Set a temporary key binding
-;; Copyright (C) 2012-2020 Kyle Meyer <kyle@kyleam.com>
+;; Copyright Kyle Meyer <kyle@kyleam.com>
;; Author: Kyle Meyer <kyle@kyleam.com>
;; URL: https://git.kyleam.com/emacs.d
diff --git a/snippets/sh-mode/mktempd b/snippets/sh-mode/mktempd
new file mode 100644
index 0000000..e5c4b25
--- /dev/null
+++ b/snippets/sh-mode/mktempd
@@ -0,0 +1,4 @@
+# -*- mode: snippet -*-
+# key: mt
+# --
+mktemp -d "\${TMPDIR:-/tmp}"/$1-XXXXXXX$0