-;;; init.el --- mab's emacs configuration -*- lexical-binding: t -*-
+;;; init.el --- bandali's emacs configuration -*- lexical-binding: t -*-
-;; Copyright (C) 2018-2019 Amin Bandali <mab@gnu.org>
+;; Copyright (C) 2018-2019 Amin Bandali <bandali@gnu.org>
;; 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
;;; Commentary:
-;; Emacs configuration of Amin Bandali, computer scientist, free
-;; software activist, GNU maintainer & webmaster. Packages are
-;; installed from GNU Guix, for purely functional and fully
-;; reproducible package management. Before switching to GNU Guix,
-;; I used straight.el for package management, and before that, Borg.
+;; GNU Emacs configuration of Amin Bandali, computer scientist,
+;; Free Software activist, and GNU maintainer & webmaster. Packages
+;; are installed through GNU Guix for a fully reproducible setup.
+;; Before switching to Guix, I used straight.el, and before that Borg.
;; Over the years, I've taken inspiration from configurations of many
;; great people. Some that I can remember off the top of my head are:
(defvar b/gc-cons-threshold gc-cons-threshold)
(defvar b/gc-cons-percentage gc-cons-percentage)
(defvar b/file-name-handler-alist file-name-handler-alist)
-(setq gc-cons-threshold (* 400 1024 1024) ; 400 MiB
+(setq gc-cons-threshold (* 30 1024 1024) ; 30 MiB
gc-cons-percentage 0.6
file-name-handler-alist nil
;; sidesteps a bug when profiling with esup
(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))
+ file-name-handler-alist b/file-name-handler-alist)
+ (with-eval-after-load 'exwm-workspace
+ (setq-default
+ mode-line-format
+ (append
+ mode-line-format
+ '((:eval
+ (format
+ "[%s]" (number-to-string
+ exwm-workspace-current-index))))))))
(add-hook 'after-init-hook #'b/post-init)
;; increase number of lines kept in *Messages* log
;;; whoami
(setq user-full-name "Amin Bandali"
- user-mail-address "mab@gnu.org")
+ user-mail-address "bandali@gnu.org")
\f
;;; comment macro
\f
;;; Initial setup
-(defvar b/exwm-p (string= (system-name) "jirud")
+(defvar b/exwm-p (string= (system-name) "chaman")
"Whether or not we will be using `exwm'.")
;; keep ~/.emacs.d clean
(with-demoted-errors
(load (b/etc "secrets"))))
-;; better $PATH (and other environment variable) handling
-(use-package exec-path-from-shell
- :defer 0.4
- :init
- (setq exec-path-from-shell-arguments nil
- exec-path-from-shell-check-startup-files nil)
- :config
- (exec-path-from-shell-initialize)
- ;; while we're at it, let's fix access to our running ssh-agent
- (exec-path-from-shell-copy-env "SSH_AGENT_PID")
- (exec-path-from-shell-copy-env "SSH_AUTH_SOCK"))
-
;; start up emacs server. see
;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html#Emacs-Server
(use-package server
(make-local-variable 'mouse-autoselect-window)
(setq mouse-autoselect-window nil))
+(defun b/kill-current-buffer ()
+ "Kill the current buffer."
+ ;; also see https://redd.it/64xb3q
+ (interactive)
+ (kill-buffer (current-buffer)))
+
\f
;;; Defaults
;; time and battery in mode-line
(use-package time
- :if b/exwm-p
:demand
:config
(display-time-mode)
:custom
(display-time-default-load-average nil)
- (display-time-format "%a %b %-e, %-l:%M%P")
+ (display-time-format "%a %b %-e %-l:%M%P")
(display-time-mail-icon '(image :type xpm :file "gnus/gnus-pointer.xpm" :ascent center))
(display-time-use-mail-icon t))
(use-package battery
- :if b/exwm-p
:demand
:config
(display-battery-mode)
("C-S-h C" . describe-char)
("C-S-h F" . describe-face)
- ("C-x k" . kill-this-buffer)
+ ("C-x k" . b/kill-current-buffer)
("C-x K" . kill-buffer)
("C-x s" . save-buffer)
("C-x S" . save-some-buffers)
([XF86AudioMute] .
(lambda ()
(interactive)
- (start-process "" nil "pamixer" "--toggle-mute")))
+ (start-process "" nil "amixer" "set" "'Master',0" "toggle")))
([XF86AudioLowerVolume] .
(lambda ()
(interactive)
(start-process
- "" nil "pamixer" "--allow-boost" "--decrease" "5")))
+ "" nil "amixer" "set" "'Master',0" "5%-")))
([XF86AudioRaiseVolume] .
(lambda ()
(interactive)
(start-process
- "" nil "pamixer" "--allow-boost" "--increase" "5")))
+ "" nil "amixer" "set" "'Master',0" "5%+")))
([XF86AudioPlay] .
(lambda ()
(interactive)
(exwm-manage-finish . (lambda ()
(when exwm-class-name
(cond
- ((string= exwm-class-name "Abrowser")
+ ((string= exwm-class-name "IceCat")
(exwm-input-set-local-simulation-keys
`(,@exwm-input-simulation-keys
([?\C-\S-d] . [?\C-d]))))
;; 'magit-insert-untracked-files
;; 'append)
(setq magit-repository-directories '(("~/" . 0)
- ("~/src/git/" . 1)))
+ ("~/src/git/" . 2)))
(nconc magit-section-initial-visibility-alist
'(([unpulled status] . show)
([unpushed status] . show)))
(bind-keys
("C-c f ." . find-file)
+ ("C-c f d" . find-name-dired)
("C-c f l" . find-library)
- ("C-c f r" . recentf-open-files)
+ ;; ("C-c f r" . recentf-open-files)
("C-c x" . execute-extended-command))
(comment
(counsel-mode 1)
(defalias 'locate #'counsel-locate))
-(comment
- (use-package helm
- :commands (helm-M-x helm-mini helm-resume)
- :bind (("M-x" . helm-M-x)
- ("M-y" . helm-show-kill-ring)
- ("C-x b" . helm-mini)
- ("C-x C-b" . helm-buffers-list)
- ("C-x C-f" . helm-find-files)
- ("C-h r" . helm-info-emacs)
- ("C-s-r" . helm-resume)
- :map helm-map
- ("<tab>" . helm-execute-persistent-action)
- ("C-i" . helm-execute-persistent-action) ; Make TAB work in terminals
- ("C-z" . helm-select-action)) ; List actions
- :config (helm-mode 1)))
-
(use-package eshell
:defer 0.5
:commands eshell
("C-S-l" . b/eshell-clear)
("M-r" . counsel-esh-history)
;; ([tab] . company-complete)
- :map eshell-hist-mode-map
- ("M-r" . counsel-esh-history)))
+ )
+ (if (version< "27" emacs-version)
+ (bind-keys :map eshell-hist-mode-map
+ ("M-r" . counsel-esh-history))
+ (bind-keys :map eshell-mode-map
+ ("M-r" . counsel-esh-history))))
:hook (eshell-mode . b/eshell-setup)
:custom
(mode . message-mode)))
("web"
(or
- (mode . web-mode)
+ ;; (mode . web-mode)
+ (mode . mhtml-mode)
(mode . css-mode)
(mode . scss-mode)
(mode . js2-mode)))
("\\.flac\\'" "mpv")))
:bind (:map dired-mode-map
("b" . dired-up-directory)
- ("e" . dired-ediff-files)
- ("E" . dired-toggle-read-only)
+ ("E" . dired-ediff-files)
+ ("e" . dired-toggle-read-only)
("\\" . dired-hide-details-mode)
("z" . (lambda ()
(interactive)
(add-to-list 'tramp-default-proxies-alist
(list (regexp-quote (system-name)) nil nil)))
-(use-package dash
- :config (dash-enable-font-lock))
-
(use-package doc-view
:bind (:map doc-view-mode-map
("M-RET" . image-previous-line)))
:mode "\\.bashrc$")
(use-package company
+ :disabled
:bind
(:map company-active-map
([tab] . company-complete-common-or-cycle)
lean-input-user-translations '(("/" "/")))
(lean-input-setup))
-(comment
- (use-package proof-site ; for Coq
- :straight proof-general)
-
- (use-package haskell-mode
- :config
- (setq haskell-indentation-layout-offset 4
- haskell-indentation-left-offset 4
- flycheck-checker 'haskell-hlint
- flycheck-disabled-checkers '(haskell-stack-ghc haskell-ghc)))
-
- (use-package dante
- :after haskell-mode
- :commands dante-mode
- :hook (haskell-mode . dante-mode))
-
- (use-package hlint-refactor
- :after haskell-mode
- :bind (:map hlint-refactor-mode-map
- ("C-c l b" . hlint-refactor-refactor-buffer)
- ("C-c l r" . hlint-refactor-refactor-at-point))
- :hook (haskell-mode . hlint-refactor-mode))
-
- (use-package flycheck-haskell
- :after haskell-mode)
- ;; alternative: hs-lint https://github.com/ndmitchell/hlint/blob/20e116a043f2073c57b17b24ae6364b5e433ba7e/data/hs-lint.el
- )
+(use-package mhtml-mode)
(use-package sgml-mode
:config
- (setq sgml-basic-offset 2))
+ (setq sgml-basic-offset 0))
(use-package css-mode
:config
(setq css-indent-offset 2))
-(use-package web-mode
- :mode "\\.html\\'"
- :config
- (b/setq-every 2
- web-mode-code-indent-offset
- web-mode-css-indent-offset
- web-mode-markup-indent-offset)
- :custom
- (web-mode-enable-auto-indentation nil))
-
(use-package emmet-mode
- :after (:any web-mode css-mode sgml-mode)
+ :after (:any mhtml-mode css-mode sgml-mode)
:bind* (("C-)" . emmet-next-edit-point)
("C-(" . emmet-prev-edit-point))
:config
(unbind-key "C-j" emmet-mode-keymap)
(setq emmet-move-cursor-between-quotes t)
- :hook (web-mode css-mode html-mode sgml-mode))
-
-(comment
- (use-package meghanada
- :bind
- (:map meghanada-mode-map
- (("C-M-o" . meghanada-optimize-import)
- ("C-M-t" . meghanada-import-all)))
- :hook (java-mode . meghanada-mode)))
-
-(comment
- (use-package treemacs
- :config (setq treemacs-never-persist t))
-
- (use-package yasnippet
- :config
- ;; (yas-global-mode)
- )
-
- (use-package lsp-mode
- :init (setq lsp-eldoc-render-all nil
- lsp-highlight-symbol-at-point nil)
- )
-
- (use-package hydra)
-
- (use-package company-lsp
- :after company
- :config
- (setq company-lsp-cache-candidates t
- company-lsp-async t))
-
- (use-package lsp-ui
- :config
- (setq lsp-ui-sideline-update-mode 'point))
-
- (use-package lsp-java
- :config
- (add-hook 'java-mode-hook
- (lambda ()
- (setq-local company-backends (list 'company-lsp))))
-
- (add-hook 'java-mode-hook 'lsp-java-enable)
- (add-hook 'java-mode-hook 'flycheck-mode)
- (add-hook 'java-mode-hook 'company-mode)
- (add-hook 'java-mode-hook 'lsp-ui-mode))
-
- (use-package dap-mode
- :after lsp-mode
- :config
- (dap-mode t)
- (dap-ui-mode t))
-
- (use-package dap-java
- :after (lsp-java))
-
- (use-package lsp-java-treemacs
- :after (treemacs)))
-
-(comment
- (use-package eclim
- :bind (:map eclim-mode-map ("S-SPC" . company-complete))
- :hook ((java-mode . eclim-mode)
- (eclim-mode . (lambda ()
- (make-local-variable 'company-idle-delay)
- (defvar company-idle-delay)
- ;; (setq company-idle-delay 0.7)
- (setq company-idle-delay nil))))
- :custom
- (eclim-auto-save nil)
- ;; (eclimd-default-workspace "~/src/eclipse-workspace-exp")
- (eclim-executable "~/.p2/pool/plugins/org.eclim_2.8.0/bin/eclim")
- (eclim-eclipse-dirs '("~/usr/eclipse/dsl-2018-09/eclipse"))))
+ :hook (css-mode html-mode sgml-mode))
(use-package geiser)
:commands (sml/apply-theme)
:demand
:config
+ ;; thanks, but no thnaks; don't make fixed-width fills.
+ (defun sml/fill-for-buffer-identification () "")
(setq sml/theme 'tangomod)
(sml/setup)
(smart-mode-line-enable))
(use-package doom-themes)
-(use-package solarized-theme
- :disabled
- :config
- (load-theme 'solarized-light t))
-
(use-package moody
:disabled
:demand
(interactive)
(mapc #'disable-theme custom-enabled-themes)
(load-theme 'tangomod t)
- (sml/apply-theme 'tangomod)
+ (when (featurep 'smart-mode-line)
+ (sml/apply-theme 'tangomod))
(font-lock-remove-keywords
'org-mode b/org-mode-font-lock-keywords)
(when (featurep 'erc-hl-nicks)
(interactive)
(mapc #'disable-theme custom-enabled-themes)
(load-theme 'doom-one t)
- (sml/apply-theme 'automatic)
+ (when (featurep 'smart-mode-line)
+ (sml/apply-theme 'automatic))
(font-lock-add-keywords
'org-mode b/org-mode-font-lock-keywords t)
(when (featurep 'erc-hl-nicks)
"C-c f n" "footnote")
(which-key-add-major-mode-key-based-replacements 'org-mode
"C-c C-v" "org-babel")
- (which-key-add-major-mode-key-based-replacements 'web-mode
- "C-c C-a" "web/attributes"
- "C-c C-b" "web/blocks"
- "C-c C-d" "web/dom"
- "C-c C-e" "web/element"
- "C-c C-t" "web/tags")
(which-key-mode)
:custom
("<end>" . mwim-end-of-line-or-code)))
(use-package projectile
+ :disabled
:defer 0.5
:bind-keymap ("C-c p" . projectile-command-map)
:config
:after message
:hook (message-mode . orgalist-mode))
-;; easily type pretty quotes & other typography, like ‘’“”-–—«»‹›
-(use-package typo
- :defer 0.5
- :config
- :hook (((text-mode erc-mode web-mode) . typo-mode)
- ((tex-mode git-commit-mode) . (lambda ()(typo-mode -1)))))
-
-(use-package electric
- :disabled
- :demand
- :config
- (electric-quote-mode))
-
;; highlight TODOs in buffers
(use-package hl-todo
:defer 0.5
:config
(global-hl-todo-mode))
-(use-package shrink-path
- :defer 0.5
- :after eshell
- :config
- (defvar user-@-host (concat (user-login-name) "@" (system-name) ":"))
- (defun +eshell/prompt ()
- (concat (propertize user-@-host 'face 'default)
- (propertize (abbreviate-file-name default-directory)
- 'face 'font-lock-comment-face)
- (propertize "\n" 'face 'default)
- (if (= (user-uid) 0)
- (propertize "#" 'face 'red)
- (propertize "$" 'face 'default))
- (propertize " " 'face 'default)))
- (setq eshell-prompt-regexp "\\(.*\n\\)*[$#] "
- eshell-prompt-function #'+eshell/prompt))
-
-(use-package eshell-up
- :after eshell
- :commands eshell-up)
-
(use-package multi-term
:disabled
:defer 0.6
("p" . mc/mark-previous-like-this)
("a" . mc/mark-all-like-this))))
-(use-package forge
- :disabled
- :demand
- :after magit)
-
(use-package yasnippet
:defer 0.6
:config
("C-c D b" . debbugs-gnu-bugs)
("C-c D e" .
(lambda ()
- (interactive)
+ (interactive) ; bug-gnu-emacs
(setq debbugs-gnu-current-suppress t)
(debbugs-gnu debbugs-gnu-default-severities '("emacs"))))
- ("C-c D g" .
+ ("C-c D g" . ; bug-gnuzilla
(lambda ()
(interactive)
(setq debbugs-gnu-current-suppress t)
(debbugs-gnu debbugs-gnu-default-severities '("gnuzilla"))))
- ("C-c D G" .
+ ("C-c D G b" . ; bug-guix
(lambda ()
(interactive)
(setq debbugs-gnu-current-suppress t)
- (debbugs-gnu debbugs-gnu-default-severities '("guix"))))))
+ (debbugs-gnu debbugs-gnu-default-severities '("guix"))))
+ ("C-c D G p" . ; guix-patches
+ (lambda ()
+ (interactive)
+ (setq debbugs-gnu-current-suppress t)
+ (debbugs-gnu debbugs-gnu-default-severities '("guix-patches"))))))
(use-package org-ref
:init
org-ref-bibliography-notes "~/usr/org/notes.org"
org-ref-pdf-directory "~/usr/org/bibtex-pdfs/"))
-(use-package alert
- :commands (alert)
- :init (setq alert-default-style 'notifications))
-
;; (use-package fill-column-indicator)
-(use-package emojify
- :disabled
- :hook (erc-mode . emojify-mode))
-
(use-package window
:bind
(("C-c w e" . (lambda ()
:config
(eosd-start))
-(use-package nnreddit
- :disabled
- :demand
- :after gnus
- :custom
- (nnreddit-python-command "python3"))
-
-(use-package hyperbole
- :disabled
- :straight (hyperbole
- :host github :repo "rswgnu/hyperbole"
- :files ("*.el" ("kotl" "kotl/*.el")
- "DEMO" "man/*.info" "man/*.texi")))
-
-;; (use-package oddmuse-curl
-;; :straight (:host github :repo "kensanata/oddmuse-curl")
-;; :config
-;; (setq
-;; oddmuse-wikis
-;; (append
-;; '(("EmacsConf" "https://emacsconf.org" utf-8 "question" nil)
-;; ("EmacsConf 2019" "https://emacsconf.org/2019" utf-8 "question" nil))
-;; oddmuse-wikis))
-;; :custom
-;; (oddmuse-username "bandali"))
-
-(use-package debpaste
- :custom
- (debpaste-paste-is-hidden t))
-
(use-package scpaste
:disabled
:config
(setq scpaste-http-destination "https://p.bndl.org"
scpaste-scp-destination "nix:/var/www/p.bndl.org"))
+(use-package eww
+ :bind ("C-c a e w" . eww)
+ :custom
+ (eww-download-directory (file-name-as-directory
+ (getenv "XDG_DOWNLOAD_DIR"))))
+
\f
;;; Email (with Gnus)
read-mail-command 'gnus)
(use-package gnus
- :bind (("s-m" . gnus)
+ :bind (("s-m" . gnus-plugged)
("s-M" . gnus-unplugged)
- ("C-c a m" . gnus)
+ ("C-c a m" . gnus-plugged)
("C-c a M" . gnus-unplugged))
:init
(setq
(nnimap-address "127.0.0.1")
(nnimap-server-port 143)
(nnimap-authenticator plain)
- (nnimap-user "mab@gnu.local")
+ (nnimap-user "bandali@gnu.local")
(nnimap-inbox "INBOX")
(nnimap-split-methods 'nnimap-split-fancy)
(nnimap-split-fancy (|
University of Waterloo
https://bandali.eu.org")
(defvar b/csc-signature "Amin Bandali
-Systems Committee
+System Administrator, Systems Committee
Computer Science Club, University of Waterloo
https://csclub.uwaterloo.ca/~abandali")
(setq gnus-message-replysign t
gnus-posting-styles
'((".*"
- (address "mab@gnu.org"))
+ (address "bandali@gnu.org"))
("nnimap\\+gnu:l\\..*"
(signature nil))
("nnimap\\+gnu:.*"
(use-package mm-uu
:config
- (set-face-attribute 'mm-uu-extract nil :extend t)
+ (when (version< "27" emacs-version)
+ (set-face-attribute 'mm-uu-extract nil :extend t))
:custom
(mm-uu-diff-groups-regexp
"\\(gmane\\|gnu\\|l\\)\\..*\\(diff\\|commit\\|cvs\\|bug\\|dev\\)"))
message-subscribed-address-functions
'(gnus-find-subscribed-addresses)
message-dont-reply-to-names
- "\\(\\(\\(amin\\|mab\\)@shemshak\\.org\\)\\|\\(.*@aminb\\.org\\)\\|\\(\\(mab\\|bandali\\|aminb?\\)@gnu\\.org\\)\\|\\(a?bandali@\\(csclub\\.\\)?uwaterloo\\.ca\\)\\)")
+ "\\(\\(amin@shemshak\\.org\\)\\|\\(.*@aminb\\.org\\)\\|\\(\\(bandali\\|mab\\|aminb?\\)@gnu\\.org\\)\\|\\(a?bandali@\\(csclub\\.\\)?uwaterloo\\.ca\\)\\)")
;; (require 'company-ebdb)
:hook (;; (message-setup . mml-secure-message-sign-pgpmime)
(message-mode . flyspell-mode)
("r" . footnote-renumber-footnotes)
("s" . footnote-set-style)))
-(use-package bbdb
- :disabled
- :demand
- :after gnus
- :bind (:map gnus-group-mode-map ("e" . bbdb))
- :config
- (bbdb-initialize 'gnus 'message)
- :custom
- (bbdb-complete-mail-allow-cycling t)
- (bbdb-user-mail-address-re message-dont-reply-to-names))
-
(use-package ebdb
:demand
:after gnus
(erc-cmd-DEOP (format "%s" (erc-current-nick))))
(add-to-list 'erc-modules 'keep-place)
(add-to-list 'erc-modules 'notifications)
+ (add-to-list 'erc-modules 'smiley)
(add-to-list 'erc-modules 'spelling)
(add-to-list 'erc-modules 'scrolltoplace)
(erc-update-modules))
(use-package erc-scrolltoplace
:after erc)
-;; (use-package znc
-;; :straight (:host nil :repo "https://git.shemshak.org/amin/znc.el")
-;; :bind (("C-c a e e" . znc-erc)
-;; ("C-c a e a" . znc-all))
-;; :config
-;; (let ((pwd (let ((auth (auth-source-search :host "znca")))
-;; (cond
-;; ((null auth) (error "Couldn't find znca's authinfo"))
-;; (t (funcall (plist-get (car auth) :secret)))))))
-;; (setq znc-servers
-;; `(("znc.shemshak.org" 1337 t
-;; ((freenode "amin/freenode" ,pwd)))
-;; ("znc.shemshak.org" 1337 t
-;; ((moznet "amin/moznet" ,pwd)))
-;; ("znc.shemshak.org" 1337 t
-;; ((oftc "amin/oftc" ,pwd)))))))
+(use-package znc
+ :bind (("C-c a e e" . znc-erc)
+ ("C-c a e a" . znc-all))
+ :config
+ (let ((pwd (let ((auth (auth-source-search :host "znca")))
+ (cond
+ ((null auth) (error "Couldn't find znca's authinfo"))
+ (t (funcall (plist-get (car auth) :secret)))))))
+ (setq znc-servers
+ `(("znc.shemshak.org" 1337 t
+ ((freenode "amin/freenode" ,pwd)))
+ ("znc.shemshak.org" 1337 t
+ ((oftc "amin/oftc" ,pwd)))))))
\f
;;; Post initialization