;;; init.el --- bandali's emacs configuration -*- lexical-binding: t -*-
-;; Copyright (C) 2018-2019 Amin Bandali <bandali@gnu.org>
+;; Copyright (C) 2018-2020 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
(interactive)
(kill-buffer (current-buffer)))
+(defun b/move-indentation-or-beginning-of-line (arg)
+ "Move to the indentation or to the beginning of line."
+ (interactive "^p")
+ ;; (if (bolp)
+ ;; (back-to-indentation)
+ ;; (move-beginning-of-line arg))
+ (if (= (point)
+ (progn (back-to-indentation)
+ (point)))
+ (move-beginning-of-line arg)))
+
+(defun b/join-line-top ()
+ "Like `join-line', but join next line to the current line."
+ (interactive)
+ (join-line 1))
+
+(defun b/duplicate-line-or-region (&optional n)
+ "Duplicate the current line, or region (if active).
+Make N (default: 1) copies of the current line or region."
+ (interactive "*p")
+ (let ((u-r-p (use-region-p)) ; if region is active
+ (n1 (or n 1)))
+ (save-excursion
+ (let ((text
+ (if u-r-p
+ (buffer-substring (region-beginning) (region-end))
+ (prog1 (thing-at-point 'line)
+ (end-of-line)
+ (if (eobp)
+ (newline)
+ (forward-line 1))))))
+ (dotimes (_ (abs n1))
+ (insert text))))
+ (let* ((beg (if u-r-p
+ (region-beginning)
+ (line-beginning-position)))
+ (end (if u-r-p
+ (region-end)
+ (line-end-position)))))))
+
\f
;;; Defaults
;; scroll-margin 1
;; scroll-conservatively 10000
scroll-step 1
- scroll-conservatively 10
+ scroll-conservatively 101
scroll-preserve-screen-position 1
;; focus follows mouse
mouse-autoselect-window t)
;;; General bindings
(bind-keys
+ ("C-a" . b/move-indentation-or-beginning-of-line)
("C-c a i" . ielm)
+ ("C-c d" . b/duplicate-line-or-region)
("C-c e b" . eval-buffer)
("C-c e e" . eval-last-sexp)
("C-S-h C" . describe-char)
("C-S-h F" . describe-face)
+ ("C-S-j" . b/join-line-top)
+
("C-c x" . execute-extended-command)
("C-x k" . b/kill-current-buffer)
:bind (:map doc-view-mode-map
("M-RET" . image-previous-line)))
+;; Email (with Gnus, message, and EBDB)
(require 'bandali-gnus)
-
(use-package sendmail
:config
(setq sendmail-program (executable-find "msmtp")
;; message-sendmail-extra-arguments '("-v" "-d")
mail-specify-envelope-from t
mail-envelope-from 'header))
-
(require 'bandali-message)
+(require 'bandali-ebdb)
+
+;; IRC (with ERC and ZNC)
+(require 'bandali-erc)
+
+(use-package scpaste
+ :config
+ (setq scpaste-http-destination "https://p.bndl.org"
+ scpaste-scp-destination "p:~"))
\f
;;; Editing
-(comment
+
;; highlight uncommitted changes in the left fringe
(use-package diff-hl
:defer 0.6
:config
(setq diff-hl-draw-borders nil)
(global-diff-hl-mode)
- :hook (magit-post-refresh . diff-hl-magit-post-refresh))
+ :hook
+ ((magit-pre-refresh . diff-hl-magit-pre-refresh)
+ (magit-post-refresh . diff-hl-magit-post-refresh)))
;; display Lisp objects at point in the echo area
(use-package eldoc
(use-package conf-mode
:mode "\\.*rc$")
-(use-package sh-mode
- :mode "\\.bashrc$")
+(use-package sh-script
+ :mode ("\\.bashrc$" . sh-mode))
(use-package company
:disabled
)
(use-package flycheck
+ :disabled
:defer 0.6
:hook (prog-mode . flycheck-mode)
:bind
(setq flycheck-check-syntax-automatically '(mode-enabled save))
:custom (flycheck-mode-line-prefix "flyc"))
-(use-package flyspell)
+;; (use-package flyspell)
;; http://endlessparentheses.com/ispell-and-apostrophes.html
(use-package ispell
+ :disabled
:defer 0.6
:config
;; ’ can be part of a word
(setq indent-tabs-mode nil))
(add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode))
-(use-package reveal
- :hook (emacs-lisp-mode . reveal-mode))
-
-(use-package elisp-mode)
-
-;; (use-package alloy-mode
-;; :straight (:host github :repo "dwwmmn/alloy-mode")
-;; :mode "\\.\\(als\\|dsh\\)\\'"
-;; :config
-;; (setq alloy-basic-offset 2)
-;; ;; (defun b/alloy-simple-indent (start end)
-;; ;; (interactive "r")
-;; ;; ;; (if (region-active-p)
-;; ;; ;; (indent-rigidly start end alloy-basic-offset)
-;; ;; ;; (if (bolp)
-;; ;; ;; (indent-rigidly (line-beginning-position)
-;; ;; ;; (line-end-position)
-;; ;; ;; alloy-basic-offset)))
-;; ;; (indent-to (+ (current-column) alloy-basic-offset)))
-;; :bind (:map alloy-mode-map
-;; ("RET" . electric-newline-and-maybe-indent)
-;; ;; ("TAB" . b/alloy-simple-indent)
-;; ("TAB" . indent-for-tab-command))
-;; :hook (alloy-mode . (lambda () (setq-local indent-tabs-mode nil))))
-
-(eval-when-compile (defvar lean-mode-map))
+(use-package alloy-mode
+ :mode "\\.\\(als\\|dsh\\)\\'"
+ :config
+ (setq alloy-basic-offset 2)
+ ;; (defun b/alloy-simple-indent (start end)
+ ;; (interactive "r")
+ ;; ;; (if (region-active-p)
+ ;; ;; (indent-rigidly start end alloy-basic-offset)
+ ;; ;; (if (bolp)
+ ;; ;; (indent-rigidly (line-beginning-position)
+ ;; ;; (line-end-position)
+ ;; ;; alloy-basic-offset)))
+ ;; (indent-to (+ (current-column) alloy-basic-offset)))
+ :bind (:map alloy-mode-map
+ ("RET" . electric-newline-and-maybe-indent)
+ ;; ("TAB" . b/alloy-simple-indent)
+ ("TAB" . indent-for-tab-command))
+ :hook (alloy-mode . (lambda () (setq-local indent-tabs-mode nil))))
+
(use-package lean-mode
+ :disabled
:defer 0.4
+ :init (eval-when-compile (defvar lean-mode-map))
:bind (:map lean-mode-map
("S-SPC" . company-complete))
:config
lean-input-user-translations '(("/" "/")))
(lean-input-setup))
-(use-package mhtml-mode)
-
(use-package sgml-mode
:config
(setq sgml-basic-offset 0))
(setq emmet-move-cursor-between-quotes t)
:hook (css-mode html-mode sgml-mode))
-(use-package geiser)
+(use-package geiser
+ :disabled)
(use-package geiser-guile
+ :disabled
:config
(setq geiser-guile-load-path "~/src/git/guix"))
-(use-package guix)
-
-(comment
- (use-package auctex
- :custom
- (font-latex-fontify-sectioning 'color)))
+(use-package guix
+ :disabled)
(use-package go-mode
:disabled)
(use-package po-mode
+ :disabled
:hook
(po-mode . (lambda () (run-with-timer 0.1 nil 'View-exit))))
+(use-package auctex
+ :disabled
+ :custom
+ (font-latex-fontify-sectioning 'color))
+
(use-package tex-mode
:config
(cl-delete-if
\f
;;; Theme
+(comment
(add-to-list 'custom-theme-load-path
(expand-file-name
(convert-standard-filename "lisp") user-emacs-directory))
("C-c j" . crux-top-join-line)
("C-S-j" . crux-top-join-line)))
-(use-package mwim
- :bind (("C-a" . mwim-beginning-of-code-or-line)
- ("C-e" . mwim-end-of-code-or-line)
- ("<home>" . mwim-beginning-of-line-or-code)
- ("<end>" . mwim-end-of-line-or-code)))
-
(use-package projectile
:disabled
:defer 0.5
(use-package window
:bind
- (("C-c w e" . (lambda ()
- (interactive)
- (split-window-right)
- (other-window 1)
- (erc-switch-to-buffer)))
- ("C-c w s l" . (lambda ()
+ (("C-c w s l" . (lambda ()
(interactive)
(split-window-right)
(other-window 1)))
:config
(eosd-start))
-(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
(getenv "XDG_DOWNLOAD_DIR"))))
\f
-;;; Email
-
-(use-package ebdb
- :demand
- :after gnus
- :bind (:map gnus-group-mode-map ("e" . ebdb))
- :config
- (setq ebdb-sources (b/var "ebdb"))
- (with-eval-after-load 'swiper
- (add-to-list 'swiper-font-lock-exclude 'ebdb-mode t)))
-
-(use-package ebdb-com
- :after ebdb)
-
-(use-package ebdb-complete
- :after ebdb
- :config
- ;; (setq ebdb-complete-mail 'capf)
- (ebdb-complete-enable))
-
-(use-package ebdb-message
- :demand
- :after ebdb)
-
-;; (use-package company-ebdb
-;; :config
-;; (defun company-ebdb--post-complete (_) nil))
-
-(use-package ebdb-gnus
- :after ebdb
- :custom
- (ebdb-gnus-window-size 0.3))
-
-(use-package ebdb-mua
- :demand
- :after ebdb
- :custom (ebdb-mua-pop-up t))
-
-;; (use-package ebdb-message
-;; :after ebdb)
-
-;; (use-package ebdb-vcard
-;; :after ebdb)
-
-(use-package message-x)
-
-(comment
- (use-package message-x
- :custom
- (message-x-completion-alist
- (quote
- (("\\([rR]esent-\\|[rR]eply-\\)?[tT]o:\\|[bB]?[cC][cC]:" . gnus-harvest-find-address)
- ((if
- (boundp
- (quote message-newgroups-header-regexp))
- message-newgroups-header-regexp message-newsgroups-header-regexp)
- . message-expand-group))))))
-
-(comment
- (use-package gnus-harvest
- :commands gnus-harvest-install
- :demand t
- :config
- (if (featurep 'message-x)
- (gnus-harvest-install 'message-x)
- (gnus-harvest-install))))
-
-(use-package gnus-article-treat-patch
- :disabled
- :demand
- :load-path "lisp/"
- :config
- ;; note: be sure to customize faces with `:foreground "white"' when
- ;; using a theme with a white/light background :)
- (setq ft/gnus-article-patch-conditions
- '("^@@ -[0-9]+,[0-9]+ \\+[0-9]+,[0-9]+ @@")))
-
-\f
-;;; IRC (with ERC and ZNC)
-
-(use-package erc
- :bind (("C-c b b" . erc-switch-to-buffer)
- :map erc-mode-map
- ("M-a" . erc-track-switch-buffer))
- :custom
- (erc-join-buffer 'bury)
- (erc-lurker-hide-list '("JOIN" "PART" "QUIT"))
- (erc-nick "bandali")
- (erc-prompt "erc>")
- (erc-rename-buffers t)
- (erc-server-reconnect-attempts 5)
- (erc-server-reconnect-timeout 3)
- :config
- (defun erc-cmd-OPME ()
- "Request chanserv to op me."
- (erc-message "PRIVMSG"
- (format "chanserv op %s %s"
- (erc-default-target)
- (erc-current-nick)) nil))
- (defun erc-cmd-DEOPME ()
- "Deop myself from current channel."
- (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-fill
- :after erc
- :custom
- (erc-fill-column 77)
- (erc-fill-function 'erc-fill-static)
- (erc-fill-static-center 18))
-
-(use-package erc-pcomplete
- :after erc
- :custom
- (erc-pcomplete-nick-postfix ", "))
-
-(use-package erc-track
- :after erc
- :bind (("C-c a e t d" . erc-track-disable)
- ("C-c a e t e" . erc-track-enable))
- :custom
- (erc-track-enable-keybindings nil)
- (erc-track-exclude-types '("JOIN" "MODE" "NICK" "PART" "QUIT"
- "324" "329" "332" "333" "353" "477"))
- (erc-track-position-in-mode-line t)
- (erc-track-priority-faces-only 'all)
- (erc-track-shorten-function nil))
-
-(use-package erc-hl-nicks
- :after erc)
-
-(use-package erc-scrolltoplace
- :after erc)
-
-(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
)