(defvar b/before-user-init-time (current-time)
"Value of `current-time' when Emacs begins loading `user-init-file'.")
-(message "Loading Emacs...done (%.3fs)"
- (float-time (time-subtract b/before-user-init-time
- before-init-time)))
+(defvar b/emacs-initialized nil
+ "Whether Emacs has been initialized.")
+
+(when (not (bound-and-true-p b/emacs-initialized))
+ (message "Loading Emacs...done (%.3fs)"
+ (float-time (time-subtract b/before-user-init-time
+ before-init-time))))
;; temporarily increase `gc-cons-threshhold' and `gc-cons-percentage'
;; during startup to reduce garbage collection frequency. clearing
;; set them back to their defaults once we're done initializing
(defun b/post-init ()
- (setq gc-cons-threshold b/gc-cons-threshold
- gc-cons-percentage b/gc-cons-percentage
+ "My post-initialize function, run after loading `user-init-file'."
+ (setq b/emacs-initialized t
+ gc-cons-threshold b/gc-cons-threshold
+ gc-cons-percentage b/gc-cons-percentage
file-name-handler-alist b/file-name-handler-alist))
(add-hook 'after-init-hook #'b/post-init)
(expand-file-name "~/.emacs.d/straight/build/")))
(defun b/reload-init ()
- "Reload init.el."
+ "Reload `user-init-file'."
(interactive)
- (setq b/file-name-handler-alist file-name-handler-alist)
+ (setq b/before-user-init-time (current-time)
+ b/file-name-handler-alist file-name-handler-alist)
(load user-init-file nil 'nomessage)
(b/post-init))
(global-auto-revert-non-file-buffers nil))
;; time and battery in mode-line
-(comment
- (use-feature time
- :init
- (setq display-time-default-load-average nil)
- :config
- (display-time-mode))
+(use-feature time
+ :demand
+ :config
+ (display-time-mode)
+ :custom
+ (display-time-default-load-average nil)
+ (display-time-format "%a %b %-e, %-l:%M%P"))
- (use-feature battery
- :config
- (display-battery-mode)))
+(use-feature battery
+ :demand
+ :config
+ (display-battery-mode)
+ :custom
+ (battery-mode-line-format " %p%% %t"))
(use-feature fringe
:demand
;;; Essential packages
(use-package exwm
- :disabled
:demand
:config
(require 'exwm-config)
- ;; Set the initial workspace number.
- (setq exwm-workspace-number 4)
+ (setq
+ exwm-workspace-number 4
+ exwm-workspace-index-map (lambda (i) (number-to-string (1+ i))))
- ;; Make class name the buffer name, truncating beyond 50 characters
+ ;; Make class name the buffer name, truncating beyond 60 characters
(defun exwm-rename-buffer ()
(interactive)
(exwm-workspace-rename-buffer
(concat exwm-class-name ":"
- (if (<= (length exwm-title) 50) exwm-title
- (concat (substring exwm-title 0 49) "...")))))
+ (if (<= (length exwm-title) 60) exwm-title
+ (concat (substring exwm-title 0 59) "...")))))
(add-hook 'exwm-update-class-hook 'exwm-rename-buffer)
(add-hook 'exwm-update-title-hook 'exwm-rename-buffer)
+ (defun b/exwm-ws-prev-index ()
+ "Return the index for the previous EXWM workspace, wrapping
+around if needed."
+ (if (= exwm-workspace-current-index 0)
+ (1- exwm-workspace-number)
+ (1- exwm-workspace-current-index)))
+
+ (defun b/exwm-ws-next-index ()
+ "Return the index for the next EXWM workspace, wrapping
+around if needed."
+ (if (= exwm-workspace-current-index
+ (1- exwm-workspace-number))
+ 0
+ (1+ exwm-workspace-current-index)))
+
;; 's-R': Reset
(exwm-input-set-key (kbd "s-R") #'exwm-reset)
;; 's-\': Switch workspace
(exwm-input-set-key (kbd "s-\\") #'exwm-workspace-switch)
;; 's-N': Switch to certain workspace
- (dotimes (i 10)
+ (dotimes (i exwm-workspace-number)
(exwm-input-set-key
(kbd (format "s-%d" i))
(lambda ()
(interactive)
- (exwm-workspace-switch-create i))))
+ (exwm-workspace-switch-create (1- i)))))
+ ;; 's-[': Switch to previous workspace
+ (defun b/exwm-ws-prev ()
+ "Switch to previous EXWM workspace, wrapping around if needed."
+ (interactive)
+ (exwm-workspace-switch-create (b/exwm-ws-prev-index)))
+ (exwm-input-set-key (kbd "s-[") #'b/exwm-ws-prev)
+ ;; 's-]': Switch to next workspace
+ (defun b/exwm-ws-next ()
+ "Switch to next EXWM workspace, wrapping around if needed."
+ (interactive)
+ (exwm-workspace-switch-create (b/exwm-ws-next-index)))
+ (exwm-input-set-key (kbd "s-]") #'b/exwm-ws-next)
+ ;; 's-{': Move window to previous workspace
+ (defun b/exwm-move-window-to-prev-ws ()
+ "Move window to previous EXWM workspace, wrapping around if
+needed."
+ (interactive)
+ (exwm-workspace-move-window (b/exwm-ws-prev-index)))
+ (exwm-input-set-key (kbd "s-{") #'b/exwm-move-window-to-prev-ws)
+ ;; 's-}': Move window to next workspace
+ (defun b/exwm-move-window-to-next-ws ()
+ "Move window to next EXWM workspace, wrapping around if
+needed."
+ (interactive)
+ (exwm-workspace-move-window (b/exwm-ws-next-index)))
+ (exwm-input-set-key (kbd "s-}") #'b/exwm-move-window-to-next-ws)
;; 's-SPC': Launch application
;; (exwm-input-set-key
;; (kbd "s-SPC")
(exwm-input-set-key (kbd "M-s-SPC") #'counsel-linux-app)
- ;; Shorten 'C-c C-q' to 'C-q'
- (define-key exwm-mode-map [?\C-q] #'exwm-input-send-next-key)
-
- ;; Line-editing shortcuts
- (setq exwm-input-simulation-keys
- '(;; movement
- ([?\C-b] . [left])
- ([?\M-b] . [C-left])
- ([?\C-f] . [right])
- ([?\M-f] . [C-right])
- ([?\C-p] . [up])
- ([?\C-n] . [down])
- ([?\C-a] . [home])
- ([?\C-e] . [end])
- ([?\M-v] . [prior])
- ([?\C-v] . [next])
- ([?\C-d] . [delete])
- ([?\C-k] . [S-end delete])
- ;; cut/copy/paste
- ;; ([?\C-w] . [?\C-x])
- ([?\M-w] . [?\C-c])
- ([?\C-y] . [?\C-v])
- ;; search
- ([?\C-s] . [?\C-f])))
-
- ;; Enable EXWM
- (exwm-enable)
+ (exwm-input-set-key
+ (kbd "s-<return>") (lambda ()
+ (interactive)
+ (b/start-process "urxvt")))
- (add-hook 'exwm-init-hook #'exwm-config--fix/ido-buffer-window-other-frame)
+ (exwm-input-set-key
+ (kbd "s-t")
+ (lambda ()
+ (interactive)
+ (exwm-floating-toggle-floating)))
- (require 'exwm-systemtray)
- (exwm-systemtray-enable)
+ (exwm-input-set-key
+ (kbd "s-f")
+ (lambda ()
+ (interactive)
+ (exwm-layout-toggle-fullscreen)))
- (require 'exwm-randr)
- (exwm-randr-enable)
+ (exwm-input-set-key
+ (kbd "s-w")
+ (lambda ()
+ (interactive)
+ (kill-buffer (current-buffer))))
- ;; (exwm-input-set-key
- ;; (kbd "s-<return>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process "urxvt" nil "urxvt")))
+ (exwm-input-set-key
+ (kbd "s-q")
+ (lambda ()
+ (interactive)
+ (exwm-manage--kill-client)))
;; (exwm-input-set-key
;; (kbd "s-SPC") ;; rofi doesn't properly launch programs when started from emacs
;; (interactive)
;; (start-process "rofi-pass" nil "rofi-pass")))
- ;; (exwm-input-set-key
- ;; (kbd "<XF86AudioMute>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "pamixer" nil "pamixer --toggle-mute")))
-
- ;; (exwm-input-set-key
- ;; (kbd "<XF86AudioLowerVolume>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "pamixer" nil "pamixer --allow-boost --decrease 5")))
-
- ;; (exwm-input-set-key
- ;; (kbd "<XF86AudioRaiseVolume>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "pamixer" nil "pamixer --allow-boost --increase 5")))
-
- ;; (exwm-input-set-key
- ;; (kbd "<XF86AudioPlay>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "mpc" nil "mpc toggle")))
-
- ;; (exwm-input-set-key
- ;; (kbd "<XF86AudioPrev>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "mpc" nil "mpc prev")))
-
- ;; (exwm-input-set-key
- ;; (kbd "<XF86AudioNext>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "mpc" nil "mpv next")))
-
- (defun b/exwm-pasystray ()
- "A command used to start pasystray."
- (interactive)
- (if (executable-find "pasystray")
- (progn
- (message "EXWM: starting pasystray ...")
- (start-process-shell-command "pasystray" nil "pasystray --notify=all"))
- (message "EXWM: pasystray is not installed, abort!")))
+ (exwm-input-set-key
+ (kbd "<XF86AudioMute>")
+ (lambda ()
+ (interactive)
+ (start-process-shell-command "pamixer" nil "pamixer --toggle-mute")))
- (add-hook 'exwm-init-hook #'b/exwm-pasystray)
+ (exwm-input-set-key
+ (kbd "<XF86AudioLowerVolume>")
+ (lambda ()
+ (interactive)
+ (start-process-shell-command "pamixer" nil "pamixer --allow-boost --decrease 5")))
(exwm-input-set-key
- (kbd "s-t")
+ (kbd "<XF86AudioRaiseVolume>")
(lambda ()
(interactive)
- (exwm-floating-toggle-floating)))
+ (start-process-shell-command "pamixer" nil "pamixer --allow-boost --increase 5")))
(exwm-input-set-key
- (kbd "s-f")
+ (kbd "<XF86AudioPlay>")
(lambda ()
(interactive)
- (exwm-layout-toggle-fullscreen)))
+ (start-process-shell-command "mpc" nil "mpc toggle")))
(exwm-input-set-key
- (kbd "s-w")
+ (kbd "<XF86AudioPrev>")
(lambda ()
(interactive)
- (kill-buffer (current-buffer))))
+ (start-process-shell-command "mpc" nil "mpc prev")))
(exwm-input-set-key
- (kbd "s-q")
+ (kbd "<XF86AudioNext>")
(lambda ()
(interactive)
- (exwm-manage--kill-client))))
+ (start-process-shell-command "mpc" nil "mpc next")))
+
+ ;; Shorten 'C-c C-q' to 'C-q'
+ (define-key exwm-mode-map [?\C-q] #'exwm-input-send-next-key)
+
+ ;; Line-editing shortcuts
+ (setq exwm-input-simulation-keys
+ '(;; movement
+ ([?\C-b] . [left])
+ ([?\M-b] . [C-left])
+ ([?\C-f] . [right])
+ ([?\M-f] . [C-right])
+ ([?\C-p] . [up])
+ ([?\C-n] . [down])
+ ([?\C-a] . [home])
+ ([?\C-e] . [end])
+ ([?\M-v] . [prior])
+ ([?\C-v] . [next])
+ ([?\C-d] . [delete])
+ ([?\C-k] . [S-end ?\C-x])
+ ;; cut/copy/paste
+ ([?\C-w] . [?\C-x])
+ ([?\M-w] . [?\C-c])
+ ([?\C-y] . [?\C-v])
+ ([?\M-d] . [C-S-right ?\C-x])
+ ([?\M-\d] . [C-S-left ?\C-x])
+ ;; search
+ ([?\C-s] . [?\C-f])
+ ;; escape
+ ([?\C-g] . [escape])))
+
+ ;; Enable EXWM
+ (exwm-enable)
+
+ (add-hook 'exwm-init-hook #'exwm-config--fix/ido-buffer-window-other-frame)
+
+ (require 'exwm-systemtray)
+ (exwm-systemtray-enable)
+
+ (require 'exwm-randr)
+ (exwm-randr-enable))
;; use the org-plus-contrib package to get the whole deal
(use-package org-plus-contrib)
(nconc magit-section-initial-visibility-alist
'(([unpulled status] . show)
([unpushed status] . show)))
- :custom (magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1)
+ :custom
+ (magit-diff-refine-hunk t)
+ (magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1)
:custom-face (magit-diff-file-heading ((t (:weight normal)))))
;; recently opened files
(or
(name . "^\\*scratch\\*$")
(name . "^\\*Messages\\*$")))
+ ("exwm" (mode . exwm-mode))
("erc" (mode . erc-mode)))))
(ibuffer-formats
'((mark modified read-only locked " "
- (name 18 18 :left :elide)
+ (name 72 72 :left :elide)
" "
(size-h 9 -1 :right)
" "
(use-feature elisp-mode
:delight (emacs-lisp-mode "Elisp" :major))
-
(use-package alloy-mode
:straight (:host github :repo "dwwmmn/alloy-mode")
:mode "\\.als\\'"
(use-package lsp-java
:config
(add-hook 'java-mode-hook
- (lambda ()
- (setq-local company-backends (list 'company-lsp))))
+ (lambda ()
+ (setq-local company-backends (list 'company-lsp))))
(add-hook 'java-mode-hook 'lsp-java-enable)
(add-hook 'java-mode-hook 'flycheck-mode)
(lambda (p) (string-match "^---?" (car p)))
tex--prettify-symbols-alist)
:hook ((tex-mode . auto-fill-mode)
- (tex-mode . flyspell-mode)
- (tex-mode . (lambda () (electric-indent-local-mode -1)))))
+ (tex-mode . flyspell-mode)))
\f
;;; Theme
(sml/setup)
(smart-mode-line-enable))
+(use-package doom-modeline
+ :disabled
+ :demand
+ :hook (after-init . doom-modeline-init)
+ :custom
+ (doom-modeline-buffer-file-name-style 'relative-to-project))
+
(use-package doom-themes)
(defvar b/org-mode-font-lock-keywords
:defer 0.4
:bind (("C-c d" . crux-duplicate-current-line-or-region)
("C-c D" . crux-duplicate-and-comment-current-line-or-region)
- ("C-c f c" . crux-copy-file-preserve-attributes)
- ("C-c f d" . crux-delete-file-and-buffer)
- ("C-c f r" . crux-rename-file-and-buffer)
+ ("C-c f C" . crux-copy-file-preserve-attributes)
+ ("C-c f D" . crux-delete-file-and-buffer)
+ ("C-c f R" . crux-rename-file-and-buffer)
("C-c j" . crux-top-join-line)
("C-S-j" . crux-top-join-line)))
:commands eshell-up)
(use-package multi-term
+ :disabled
:defer 0.6
:bind (("C-c a s m m" . multi-term)
("C-c a s m d" . multi-term-dedicated-toggle)
"Return the In-Reply-To header for this message."
(when message-reply-headers
(let ((from (mail-header-from message-reply-headers))
- (msg-id (mail-header-id message-reply-headers)))
+ (msg-id (mail-header-id message-reply-headers)))
(when from
msg-id))))
;; (message-header-subject ((t (:foreground "#111" :weight semi-bold))))
;; (message-header-to ((t (:foreground "#111" :weight normal))))
;; (message-header-cc ((t (:foreground "#333" :weight normal))))
- )
+ :custom
+ (message-elide-ellipsis "[...]\n"))
(use-feature mml
:delight " mml")