;;; init.el --- Personal Emacs configuration -*- lexical-binding: t -*-
-;; Copyright (C) 2021-2023 Eshel Yaron
+;; Copyright (C) 2021-2024 Eshel Yaron
;; Author: Eshel Yaron <me@eshelyaron.com>
(elpaca org-transclusion)
(elpaca sweeprolog)
-(elpaca avy)
(elpaca (bbdb
:repo "https://git.savannah.nongnu.org/git/bbdb.git"
:files (:defaults "lisp/*.el.in")
:pre-build (("pandoc" "-o" "elfeed.texi" "README.md"))))
(elpaca emms)
(elpaca htmlize)
-(elpaca kubernetes)
(elpaca (oauth2
:repo "git://git.sv.gnu.org/emacs/elpa"
:local-repo "oauth2"
"--eval" "(setq org-babel-confirm-evaluate-answer-no t)"
"-f" "org-texinfo-export-to-texinfo"))))
(elpaca paredit)
-(elpaca rainbow-delimiters)
-(elpaca rainbow-mode)
(elpaca sqlformat)
-(elpaca (mode-face :repo "https://git.sr.ht/~eshel/mode-face"))
(elpaca (auctex
+ :branch "main"
:files ("*.el" "*.info*")
:pre-build (("./autogen.sh")
("./configure" "--with-lispdir=." "--with-texmf-dir=/tmp")
"-f" "org-texinfo-export-to-texinfo")
("mv" "README.texi" "pdf-tools.texi"))))
(elpaca ob-prolog)
+(elpaca (kubed :repo "~/checkouts/kubed"))
(elpaca-wait)
(defvar-keymap esy/elpaca-prefix-map
:doc "Keymap for `elpaca' commands."
+ :prefix 'esy/elpaca-prefix-map
"r" #'elpaca-rebuild
"e" #'elpaca-recipe
"f" #'elpaca-fetch
"d" #'elpaca-delete
"l" #'elpaca-log-updates
"i" #'elpaca-info
- "t" #'elpaca-try)
+ "t" #'elpaca-try
+ "m" #'elpaca-update-menus)
(keymap-unset elpaca-ui-mode-map "p" t)
(keymap-set elpaca-ui-mode-map "l" #'elpaca-ui-mark-pull)
(quit-windows-on "*elpaca-diff*")))
nil t)))
-(defalias 'esy/elpaca-prefix-map esy/elpaca-prefix-map)
-
;;; Set some variables
(setq
;; don't spawn new frames in Ediff
ediff-window-setup-function #'ediff-setup-windows-plain
duplicate-line-final-position -1
- tramp-kubernetes-namespace "argo"
+ ;; tramp-kubernetes-namespace "argo"
;; configure Org capture templates
org-capture-templates '(("t" "Todo [inbox]" entry
(file+headline "~/org/inbox.org" "Tasks")
("studies" . ?s)
("esols" . ?e)
("personal" . ?p)
+ ("kubed" . ?k)
(:endgroup))
;; minimal prompt for tags
org-fast-tag-selection-single-key 'expert
'((buffer (styles substring))
(file (styles basic partial-completion substring)
(sort-function . minibuffer-sort-by-history))
+ (cobra-command-line (styles basic substring partial-completion))
(project-file (styles basic partial-completion substring))
(recent-file (styles basic partial-completion substring))
(command (sort-function . minibuffer-sort-by-history)))
- ;; completion-auto-help 'visible
+ completion-auto-help 'visible
completions-max-height 16
completion-auto-wrap t
- completion-at-point-functions nil
+ read-minibuffer-restore-windows nil
shell-kill-buffer-on-exit t
compilation-scroll-output t
display-time-default-load-average nil
;; confirm-nonexistent-file-or-buffer nil
extended-command-dim-hyphens t
read-buffer-completion-ignore-case t
- echo-keystrokes-help nil)
+ echo-keystrokes-help nil
+ checkdoc-verb-check-experimental-flag nil
+ prefix-help-command #'help-complete-keys
+ help-enable-variable-value-editing t
+ pcomplete-termination-string ""
+ imenu-flatten t
+ imenu-auto-rescan t)
-(setq-default indent-tabs-mode nil)
+(setq-default indent-tabs-mode nil
+ display-line-numbers-width 4)
;;; Load my custom theme
(message path))
path))
-(defun esy/transcribe ()
- (interactive)
- (message "Recording...")
- (let ((process
- (start-process "ffmpeg" nil "ffmpeg"
- "-f" "avfoundation"
- "-i" "1:0"
- "-ar" "16000"
- "-y"
- "/tmp/foo.wav")))
- (set-transient-map
- (make-sparse-keymap) nil
- (lambda ()
- (message "Stopping recording")
- (interrupt-process process)
- (accept-process-output process 1 nil t)
- (message "Transcribing...")
- (message
- (string-trim-right
- (string-trim-left
- (with-temp-buffer
- (call-process "whisper"
- nil '(t nil) nil
- "-m"
- "/Users/eshelyaron/checkouts/whisper.cpp/models/ggml-base.en.bin"
- "--no-timestamps" "-f" "/tmp/foo.wav")
- (goto-char (point-min))
- (while (search-forward "[BLANK_AUDIO]" nil t)
- (replace-match "" nil t))
- (buffer-string))))))
- "Recording... Press any key to stop")))
-
-(defun esy/record (timeout)
- (interactive "p")
- (message "Recording...")
- (call-process "ffmpeg"
- nil nil nil
- "-f" "avfoundation"
- "-i" "1:0" "-t"
- (number-to-string (max timeout 2))
- "-ar" "16000" "-y" "/tmp/foo.wav")
- (openai-chat (string-trim-right
- (string-trim-left
- (with-temp-buffer
- (call-process "whisper"
- nil '(t nil) nil
- "-m"
- "/Users/eshelyaron/checkouts/whisper.cpp/models/ggml-base.en.bin"
- "--no-timestamps" "-f" "/tmp/foo.wav")
- (goto-char (point-min))
- (while (search-forward "[BLANK_AUDIO]" nil t)
- (replace-match "" nil t))
- (buffer-string))))))
-
(defun esy/dedicate-window (window flag)
(interactive (list (get-buffer-window) (not current-prefix-arg)))
(message "Window is %s dedicated to buffer %s."
;;; Extend standard programming mode hooks
+(defun esy/prog-set-up-capf ()
+ (add-hook 'completion-at-point-functions
+ #'tags-completion-at-point-function 90 t))
+
(dolist (mode '(bug-reference-prog-mode
display-fill-column-indicator-mode
display-line-numbers-mode
- flymake-mode))
+ flymake-mode
+ ;; esy/prog-set-up-capf
+ ))
(add-hook 'prog-mode-hook mode))
(add-hook 'lisp-data-mode-hook #'paredit-mode)
(keymap-global-set "C-M-i" #'completion-at-point)
(keymap-global-set "C-c c" #'org-capture)
+(keymap-global-set "C-c !" #'flymake-go-to-diagnostic)
(keymap-global-set "C-c f" #'recentf-open)
+(keymap-global-set "C-c k" 'kubed-prefix-map)
(keymap-global-set "C-c l" #'org-store-link)
(keymap-global-set "C-c a" #'org-agenda)
(keymap-global-set "C-c v" #'esy/terminal)
-(keymap-global-set "C-c p" #'sweeprolog-prefix-map)
+(keymap-global-set "C-c p" 'sweeprolog-prefix-map)
(keymap-global-set "C-c S" #'scratch-buffer)
(keymap-global-set "C-c m" #'esy/emms-map)
(keymap-global-set "C-c C" #'esy-publish-create-post)
-(keymap-global-set "C-c O" #'openai-chat)
(keymap-global-set "C-c e" 'esy/elpaca-prefix-map)
(keymap-global-set "C-c E" #'elfeed)
(keymap-global-set "C-c T" #'esy/ttyper)
-(keymap-global-set "C-c R" #'esy/record)
(keymap-global-set "C-c G" #'gnus)
(keymap-global-set "C-c M" #'mastodon)
(keymap-global-set "C-c t" #'esy/tmp-dired)
(keymap-set window-prefix-map "e" #'windmove-swap-states-right)
(keymap-set window-prefix-map "d" #'esy/dedicate-window)
+(keymap-set isearch-mode-map "C-;" #'avy-isearch)
+
(dolist (command '(windmove-swap-states-up
windmove-swap-states-down
windmove-swap-states-left
narrow-to-region
narrow-to-page
downcase-region
- upcase-region))
+ upcase-region
+ list-timers))
(put command 'disabled nil))
;;; disable some commands
(with-eval-after-load 'project
(add-to-list 'project-switch-commands '(project-compile "Compile"))
- (add-to-list 'project-switch-commands '(rg-project "rg"))
(add-to-list 'project-switch-commands '(magit-project-status "Magit"))
(add-to-list 'project-switch-commands '(project-shell "Shell"))
+ (add-to-list 'project-switch-commands '(project-go-to-diagnostic "Flymake"))
(define-key project-prefix-map "w" #'project-copy-relative-file-name-as-kill)
(define-key project-prefix-map "m" #'magit-project-status)
;;; Enable some global minor modes
-(dolist (mode '(
- column-number-mode
- context-menu-mode
- display-time-mode
- display-battery-mode
- global-auto-revert-mode
- global-diff-hl-mode
- lin-global-mode
- minibuffer-depth-indicate-mode
- pixel-scroll-precision-mode
- recentf-mode
- repeat-mode
- save-place-mode
- savehist-mode
- transient-mark-mode
- winner-mode
- completions-auto-update-mode
- ;; mode-face-global-mode
- global-completion-preview-mode
- ;; tab-bar-mode
- ))
- (funcall mode))
+(mapc #'funcall '(column-number-mode
+ context-menu-mode
+ display-battery-mode
+ display-time-mode
+ global-auto-revert-mode
+ global-completion-preview-mode
+ global-diff-hl-mode
+ global-minibuffer-auto-completion-mode
+ kubed-menu-bar-mode
+ lin-global-mode
+ minibuffer-depth-indicate-mode
+ pixel-scroll-precision-mode
+ recentf-mode
+ repeat-mode
+ save-place-mode
+ savehist-mode
+ transient-mark-mode
+ winner-mode))
;;; Set up EMMS
(with-eval-after-load 'elisp-mode
(setq elisp-flymake-byte-compile-load-path (cons "./" load-path))
- (keymap-set emacs-lisp-mode-map "C-c C-t" #'trace-function))
+ (keymap-set emacs-lisp-mode-map "C-c C-t" #'trace-function)
+ (keymap-set emacs-lisp-mode-map "C-c C-s" #'set-variable))
(dolist (mm '((go-ts-mode . go-ts-mode-hook)
(typescript-ts-mode . typescript-ts-mode-hook)
(setq completion-preview-minimum-symbol-length 2)
(keymap-set completion-preview-active-mode-map "M-n" #'completion-preview-next-candidate)
(keymap-set completion-preview-active-mode-map "M-p" #'completion-preview-prev-candidate)
- ;; (keymap-set completion-preview-active-mode-map "M-i" #'completion-preview-insert)
- )
+ (keymap-set completion-preview-active-mode-map "M-f" #'completion-preview-insert-word))
(load-file "/Users/eshelyaron/checkouts/agda/src/data/emacs-mode/agda2.el")
(interactive
(list (let ((def (buffer-name)))
(minibuffer-with-setup-hook
- (lambda () (setq minibuffer-completion-action
+ (lambda () (setq minibuffer-action
(cons (lambda (buf-name)
(kill-buffer buf-name)
(message "Killed %s" buf-name))
- "kill")))
+ "kill")
+ minibuffer-alternative-action
+ (cons #'display-buffer "display")))
(completing-read-multiple
(format-prompt "Kill buffers" def)
(completion-buffer-name-table) nil t nil
(load-file (expand-file-name "admin/cherry.el" source-directory))
-(add-hook 'minibuffer-setup-hook #'minibuffer-hint-mode)
-
(with-eval-after-load 'magit
(with-eval-after-load 'diff-hl
(add-hook 'magit-pre-refresh-hook 'diff-hl-magit-pre-refresh)
(interactive "sSearch: ")
(eww (url-encode-url (format "yhetil.org/emacs?q=%s" q))))
+(with-eval-after-load 'vc-git
+ (add-hook 'vc-git-region-history-mode-hook #'bug-reference-mode))
+
+(add-hook 'find-function-after-hook #'esy/pulse-line)
+
(provide 'init)
;;; init.el ends here