.emacs.d/init.el

966 lines
31 KiB
EmacsLisp

;; __ __ __ __ ______ ______ __
;; /\ \ /\ "-.\ \ /\ \ /\__ _\ /\ ___\ /\ \
;; \ \ \ \ \ \-. \ \ \ \ \/_/\ \/ \ \ __\ \ \ \____
;; \ \_\ \ \_\\"\_\ \ \_\ \ \_\ \ \_____\ \ \_____\
;; \/_/ \/_/ \/_/ \/_/ \/_/ \/_____/ \/_____/
;;; BAD stuff
(setq package-check-signature nil)
;;; Making the interface not terrible ;;;
(add-to-list 'default-frame-alist '(font . "scientifica-11"))
(set-face-attribute 'default t :font "scientifica-11")
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
(fringe-mode 0)
;;; Sane defaults ;;;
(add-to-list 'load-path "~/.emacs.d/lisp/")
(when (version<= "26.0.50" emacs-version)
(setq display-line-numbers-type 'relative)
(global-display-line-numbers-mode))
(setq server-use-tcp t)
(add-to-list 'exec-path "/home/gigavinyl/.nix-profile/bin/")
(global-set-key (kbd "<mouse-2>") 'clipboard-yank)
(setq x-select-enable-primary t)
(setq x-select-enable-clipboard t)
(setq-default word-wrap t) ; wrap lines
(setq delete-old-versions -1) ; delete excess backup versions silently
(setq version-control t) ; use version control
(setq vc-make-backup-files t) ; make backups file even when in version controlled dir
(setq backup-directory-alist `(("." . "~/.emacs.d/backups"))) ; which directory to put backups file
(setq vc-follow-symlinks t) ; don't ask for confirmation when opening symlinked file
(setq auto-save-file-name-transforms '((".*" "~/.emacs.d/auto-save-list/" t))) ;transform backups file name
(setq inhibit-startup-screen t) ; inhibit useless and old-school startup screen
(setq ring-bell-function 'ignore) ; silent bell when you make a mistake
(setq coding-system-for-read 'utf-8) ; use utf-8 by default
(setq coding-system-for-write 'utf-8)
(set-language-environment "UTF-8")
(setq sentence-end-double-space nil) ; sentence SHOULD end with only a point.
(setq default-fill-column 80) ; toggle wrapping text at the 80th character
(setq-default indent-tabs-mode nil) ; tabs to spaces
(setq tab-width 2)
(global-set-key "\C-m" 'newline-and-indent)
;; Scratch Buffer
;; (setq initial-scratch-message
;; (format
;; ";; %s\n\n"
;; (replace-regexp-in-string
;; "\n" "\n;; " ; comment each line
;; (replace-regexp-in-string
;; "\n$" "" ; remove trailing linebreak
;; (shell-command-to-string "toilet -d ~/labs/figlet-fonts -f Sub-Zero Im\ Gay")))))
;;; Setup Recent Files
(recentf-mode 1)
(setq recentf-max-menu-items 25)
(global-set-key "\C-x\ \C-r" 'recentf-open-files)
;;; Use package ;;;
(setq package-enable-at-startup nil) ; tells emacs not to load any packages before starting up
;; the following lines tell emacs where on the internet to look up
;; for new packages.
(setq package-archives '(("org" . "http://orgmode.org/elpa/")
("gnu" . "http://elpa.gnu.org/packages/")
("melpa" . "https://melpa.org/packages/")
("marmalade" . "http://marmalade-repo.org/packages/")))
(package-initialize) ; guess what this one does ?
; Bootstrap `use-package'
(unless (package-installed-p 'use-package) ; unless it is already installed
(package-refresh-contents) ; updage packages archive
(package-install 'use-package)) ; and install the most recent version of use-package
(require 'use-package) ; guess what this one does too ?
(use-package auto-package-update
:config
(setq auto-package-update-delete-old-versions t)
(setq auto-package-update-hide-results t)
(auto-package-update-maybe))
;; straight.el
(defvar bootstrap-version)
(let ((bootstrap-file
(expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
(bootstrap-version 5))
(unless (file-exists-p bootstrap-file)
(with-current-buffer
(url-retrieve-synchronously
"https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
'silent 'inhibit-cookies)
(goto-char (point-max))
(eval-print-last-sexp)))
(load bootstrap-file nil 'nomessage))
(setq straight-use-package-by-default t)
(setq straight-vc-git-default-protocol 'ssh)
(setq straight-check-for-modifications 'live)
;;; Evil!!
; General
(use-package general
:config
(setq general-default-prefix "<SPC>")
(general-evil-setup))
; Undo-tree
(use-package undo-tree)
;goto-chg
(use-package goto-chg)
; evil-mode
(use-package evil
:init
(setq evil-want-C-i-jump nil)
:config
(evil-mode 1)
(setq evil-mode-line-format '(before . mode-line-front-space))
(setq-default display-line-numbers 'visual
display-line-numbers-widen t
;; this is the default
display-line-numbers-current-absolute t)
(defun noct:relative ()
(setq-local display-line-numbers 'visual))
(defun noct:absolute ()
(setq-local display-line-numbers t))
(add-hook 'evil-insert-state-entry-hook #'noct:absolute)
(add-hook 'evil-insert-state-exit-hook #'noct:relative)
(custom-set-faces '(line-number ((t :foreground "brightblack"))))
(custom-set-faces '(line-number-current-line ((t :weight bold
:foreground "white")))))
; evil-collection
(use-package evil-collection
:config (evil-collection-init))
; evil-escape
(use-package evil-escape
:config
(setq-default evil-escape-key-sequence "jk")
(evil-escape-mode))
; evil- commentary
(use-package evil-commentary
:config
(evil-commentary-mode))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(line-number ((t :foreground "brightblack")))
'(line-number-current-line ((t :weight bold :foreground "white"))))
;;; Editing Packages
(use-package powerthesaurus)
(use-package lsp-mode)
(use-package lsp-ui :commands lsp-ui-mode)
(use-package company-lsp :commands company-lsp)
(use-package helm-lsp :commands helm-lsp-workspace-symbol)
;; optionally if you want to use debugger
(use-package dap-mode)
(use-package evil-snipe
:config
(evil-snipe-mode +1)
(evil-snipe-override-mode +1))
;parinfer
(use-package parinfer
:general
(general-nmap
"," 'parinfer-toggle-mode)
:config
(setq parinfer-extensions '(defaults pretty-parens smart-yank smart-tab paredit evil))
:init
(progn
(setq parinfer-extensions
'(defaults ; should be included.
pretty-parens ; different paren styles for different modes.
evil ; If you use Evil.
;; lispy ; If you use Lispy. With this extension, you should install Lispy and do not enable lispy-mode directly.
smart-tab ; C-b & C-f jump positions and smart shift with tab & S-tab.
smart-yank)) ; Yank behavior depend on mode.
(add-hook 'clojure-mode-hook #'parinfer-mode)
(add-hook 'emacs-lisp-mode-hook #'parinfer-mode)
(add-hook 'common-lisp-mode-hook #'parinfer-mode)
(add-hook 'scheme-mode-hook #'parinfer-mode)
(add-hook 'lisp-mode-hook #'parinfer-mode)))
;yasnippet
(use-package yasnippet
:config
(yas-global-mode 1))
; focus-mode
(use-package focus
:commands focus-mode)
(use-package writeroom-mode
:commands writeroom-mode)
; flyspell
(use-package flyspell
:after (:any tex org)
:config
(setq ispell-program-name "aspell")
;; Please note ispell-extra-args contains ACTUAL parameters passed to aspell
(setq ispell-extra-args '("--sug-mode=ultra" "--lang=en_US")))
; company-mode
(use-package company
:config
(add-hook 'after-init-hook 'global-company-mode))
(use-package pos-tip
:after compmay)
(use-package company-quickhelp
:after company
:config (company-quickhelp-mode))
;flycheck
(use-package flycheck
:config
(global-flycheck-mode))
(use-package flycheck-pos-tip
:after flycheck
:config
(with-eval-after-load 'flycheck
(flycheck-pos-tip-mode)))
; lsp
(use-package lsp-mode
:hook (XXX-mode . lsp)
:commands lsp)
;; optionally
(use-package lsp-ui
:commands lsp-ui-mode
:config
(add-hook 'lsp-mode-hook 'lsp-ui-mode))
(use-package company-lsp :commands company-lsp)
(use-package helm-lsp :commands helm-lsp-workspace-symbol)
(use-package lsp-treemacs :commands lsp-treemacs-errors-list)
;;; Evil!!
; General
(use-package general
:config
(setq general-default-prefix "<SPC>")
(general-evil-setup))
; Undo-tree
(use-package undo-tree)
;goto-chg
(use-package goto-chg)
; evil-mode
(use-package evil
:init
(setq evil-want-C-i-jump nil)
:config
(evil-mode 1)
(setq evil-mode-line-format '(before . mode-line-front-space))
(setq-default display-line-numbers 'visual
display-line-numbers-widen t
;; this is the default
display-line-numbers-current-absolute t)
(defun noct:relative ()
(setq-local display-line-numbers 'visual))
(defun noct:absolute ()
(setq-local display-line-numbers t))
(add-hook 'evil-insert-state-entry-hook #'noct:absolute)
(add-hook 'evil-insert-state-exit-hook #'noct:relative)
(custom-set-faces '(line-number ((t :foreground "brightblack"))))
(custom-set-faces '(line-number-current-line ((t :weight bold
:foreground "white")))))
; evil-escape
(use-package evil-escape
:config
(setq-default evil-escape-key-sequence "jk")
(evil-escape-mode))
; evil- commentary
(use-package evil-commentary
:config
(evil-commentary-mode))
;;; Interface
;;theme
(use-package ewal-doom-themes
:straight (ewal-doom-themes
:host gitlab
:repo "jjzmajic/ewal"
:branch "develop"
:files ("doom-themes/*.el")
:depth full))
(load-theme 'ewal-doom-one t)
(enable-theme 'ewal-doom-one)
(use-package multi-term
:config
(setq term-term-name "xterm")
(defun j/configure-term ()
(setq truncate-lines 1)
(define-key term-raw-map (kbd "C-y") 'term-paste)
(add-hook 'term-mode-hook 'j/configure-term t)))
(use-package helm-mt)
; fix those pesky highligts
(set-face-attribute 'region nil :background "brightblack")
;all-the-icons
(use-package all-the-icons)
;neo-tree
(use-package neotree
:config
(setq neo-theme (if (display-graphic-p) 'icons 'arrow))
(global-set-key [f8] 'neotree-toggle))
;which-key
(use-package which-key
:config
(which-key-mode)
(setq which-key-allow-evil-operators t))
;rainbow-delimiters
(use-package rainbow-delimiters
:config
(add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
; rich-minority
(use-package rich-minority
:config
(setq rm-whitelist "*")
(rich-minority-mode 1))
;; ; smart-mode-line
;; (use-package smart-mode-line
;; :config
;; (setq sml/theme 'respectful)
;; (setq sml/no-confirm-load-theme t)
;; (sml/setup))
;; doom-modeline
(use-package doom-modeline
:config
(setq doom-modeline-icon nil)
(if window-system (setq doom-modeline-unicode-fallback t))
(setq doom-modeline-buffer-file-name-style 'truncate-upto-project)
(setq doom-modeline-major-mode-color-icon t)
(setq doom-modeline-continuous-word-count-modes '(markdown-mode gfm-mode org-mode))
(setq doom-modeline-modal-icon t)
(setq doom-modeline-env-version t)
(setq inhibit-compacting-font-caches t)
:hook (after-init . doom-modeline-mode))
(set-face-attribute 'mode-line nil
:box '(:line-width 0))
;; helm
(autoload 'dired-async-mode "dired-async.el" nil t)
(dired-async-mode 1)
(use-package helm
:config
(global-set-key (kbd "C-x C-f") #'helm-find-files)
(require 'helm-config)
(setq helm-mode-fuzzy-match t)
(setq helm-completion-in-region-fuzzy-match t)
(helm-mode 1))
(use-package smex
:config
(smex-initialize)
:general
(general-nmap
":" 'smex))
; Parens
(show-paren-mode 1)
(set-face-background 'show-paren-match (face-background 'default))
(set-face-foreground 'show-paren-match "#def")
(set-face-attribute 'show-paren-match nil :weight 'extra-bold :underline t)
(use-package highlight-parentheses
:init
(add-hook 'highlight-parentheses-mode-hook)
'(lambda ()
(setq autopair-handle-action-fns
(append)))
(if autopair-handle-action-fns
autopair-handle-action-fns
'(autopair-default-handle-action))
'((lambda (action pair pos-before))
(hl-paren-color-update)))
(define-globalized-minor-mode global-highlight-parentheses-mode
highlight-parentheses-mode
(lambda ()
(highlight-parentheses-mode t)))
(global-highlight-parentheses-mode t)
(use-package smartparens
:config
(require 'smartparens-config)
(smartparens-global-mode 1))
;;; Elm
(use-package elm-mode
:mode ("\\.elm\\'" . elm-mode)
:interpreter ("elm" . elm-mode))
;;; Elixir
(use-package elixir-mode
:mode ("\\.ex*\\'" . elixir-mode)
:interpreter ("ex*" . elixir-mode))
(use-package alchemist
:after elixir-mode)
;;; Org Mode
; org
(use-package org
:mode ("\\.org\\'" . org-mode)
:interpreter ("org" . org-mode)
:general
(general-nmap
"oa" 'org-agenda)
:config
(setq org-agenda-files '("~/org/"))
(setq org-agenda-include-diary t)
(setq org-todo-keywords
'((sequence "TODO" "IN-PROGRESS" "WAITING" "|" "DONE" "CANCELED")))
(define-key global-map "\C-cl" 'org-store-link)
(custom-set-variables)
'(org-directory "~/.org")
'(org-agenda-files (list org-directory)))
(use-package calfw)
(use-package calfw-cal)
(use-package calfw-org)
(setq org-agenda-window-setup (quote current-window))
;;warn me of any deadlines in next 7 days
(setq org-deadline-warning-days 7)
;;show me tasks scheduled or due in next fortnight
(setq org-agenda-span (quote fortnight))
;;don't show tasks as scheduled if they are already shown as a deadline
(setq org-agenda-skip-scheduled-if-deadline-is-shown t)
;;don't give awarning colour to tasks with impending deadlines
;;if they are scheduled to be done
(setq org-agenda-skip-deadline-prewarning-if-scheduled (quote pre-scheduled))
;;don't show tasks that are scheduled or have deadlines in the
;;normal todo list
(setq org-agenda-todo-ignore-deadlines (quote all))
(setq org-agenda-todo-ignore-scheduled (quote all))
;;sort tasks in order of when they are due and then by priority
(setq org-agenda-sorting-strategy
(quote
((agenda deadline-up priority-down)
(todo priority-down category-keep)
(tags priority-down category-keep)
(search category-keep))))
(use-package org-bullets
:config
(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))
; evil-org
(use-package evil-org
:after org
:config
(add-hook 'org-mode-hook 'evil-org-mode)
(add-hook 'evil-org-mode-hook
(lambda ()
(evil-org-set-key-theme '(textobjects insert navigation additional shift todo heading))))
(require 'evil-org-agenda)
(evil-org-agenda-set-keys))
;org-journal ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
(use-package org-journal
:custom
(org-journal-dir "~/org/journal/")
(org-journal-date-format "%A, %d %B %Y"))
(use-package toc-org)
(add-to-list 'load-path "~/.emacs.d/toc-org")
(if (require 'toc-org nil t)
(add-hook 'org-mode-hook 'toc-org-mode)
;; enable in markdown, too
(add-hook 'markdown-mode-hook 'toc-org-mode)
u (define-key markdown-mode-map (kbd "\C-c\C-o") 'toc-org-markdown-follow-thing-at-point)
(warn "toc-org not found"))
;;; Emacs-lisp
(use-package suggest)
;;; LaTeX
;; (use-package tex
;; :straight auctex
;; :mode ("\\.tex\\'" . LaTeX-mode)
;; :interpreter ("tex" . LaTeX-mode)
;; :config
;; (setq TeX-save-query nil)
;; (add-hook 'LaTeX-mode-hook 'turn-on-auto-fill)
;; (setq TeX-source-correlate-mode t)
;; (setq LaTeX-item-indent 1)
;; (setq TeX-auto-save t)
;; (setq TeX-parse-self t)
;; (setq-default TeX-master nil)
;; (add-hook 'LaTeX-mode-hook 'visual-line-mode)
;; (add-hook 'LaTeX-mode-hook 'flyspell-mode)
;; (add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)
;; (add-hook 'LaTeX-mode-hook 'turn-on-reftex)
;; (add-hook 'LaTeX-mode-hook 'TeX-interactive-mode)
;; (add-hook 'LaTeX-mode-hook 'TeX-source-correlate-mode)
;; (setq TeX-view-program-selection '((output-pdf "Zathura")))
;; (eval-after-load "tex"
;; '(progn
;; (add-to-list
;; 'TeX-engine-alist
;; '(default-shell-escape "Default with shell escape"
;; "pdftex -shell-escape"
;; "pdflatex -shell-escape"
;; ConTeXt-engine))))
;; ;; (setq-default TeX-engine 'default-shell-escape)
;; (setq reftex-plug-into-AUCTeX t))
;; (use-package company-auctex
;; :after tex
;; :config
;; (company-auctex-init))
;; (use-package company-math
;; :after tex
;; :config
;; (defun my-latex-mode-setup ()
;; (setq-local company-backends
;; (append '((company-math-symbols-latex company-math-symbols-unicode company-latex-commands company-auctex))
;; company-backends)))
;; (add-hook 'TeX-mode-hook 'my-latex-mode-setup))
;;; projects
; projectile ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
(use-package projectile
:general
(general-nmap
"p" '(:keymap projectile-command-map :wk "projectile prefix")))
; magit ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
(use-package magit)
(use-package forge)
(use-package git-gutter
:config
(global-git-gutter-mode +1))
(use-package evil-magit)
;;; Misc
(use-package gopher
:commands gopher)
;; (use-package erc)
;; (require 'erc-nicklist)
;; (setq erc-autojoin-channels-alist
;; '(("freenode.net" "#emacs" "#erc" "##crawl" "#iww" "#clojure" "#rust" "#haskell" "#NetBSD" "#pkgsrc" "#go-nuts")))
;; ;; (erc-ssl :server "irc.freenode.net" :port 6697 :nick "gigavinyl")
;; ;; (erc-ssl :server "irc.oftc.net" :port 6697 :nick "gigavinyl")
;; ;;(erc :server "irc.indymedia.org" :port 6667 :nick "gigavinyl")
;; (use-package erc-colorize)
;; (use-package erc-status-sidebar)
;; (use-package erc-youtube)
;; (use-package erc-yt)
;; (use-package erc-social-graph)
;; (require 'erc-sasl)
;; (add-to-list 'erc-sasl-server-regexp-list "irc.freenode.net")
;; circe
(use-package circe
:general
(general-nmap
"i" 'circe))
(setq auth-sources '("~/.authinfo.gpg"))
(defun my-fetch-password (&rest params)
(require 'auth-source)
(let ((match (car (apply 'auth-source-search params))))
(if match
(let ((secret (plist-get match :secret)))
(if (functionp secret)
(funcall secret)
secret))
(error "Password not found for %S" params))))
(defun my-nickserv-password (server)
(my-fetch-password :login "gigavinyl" :machine "irc.freenode.net"))
(setq circe-network-options
'(("Freenode"
:nick "gigavinyl"
:channels (:after-auth "#emacs" "#emacs-circe" "##rust" "#clojure" "#iww" "#foodnotbombs" "#anarchism" "#NetBSD" "#pkgsrc")
:nickserv-password my-nickserv-password)))
(use-package deadgrep
:config
(global-set-key (kbd "<f5>") #'deadgrep))
(use-package elfeed
:general
(general-nmap
"f" 'elfeed))
(use-package tramp)
(use-package mentor
:config (autoload 'mentor "mentor" nil t))
;notmuch
(require 'notmuch)
(defun message-recipients ()
"Return a list of all recipients in the message, looking at TO, CC and BCC.
Each recipient is in the format of `mail-extract-address-components'."
(mapcan (lambda (header)
(let ((header-value (message-fetch-field header)))
(and
header-value
(mail-extract-address-components header-value t))))
'("To" "Cc" "Bcc")))
(defun message-all-epg-keys-available-p ()
"Return non-nil if the pgp keyring has a public key for each recipient."
(require 'epa)
(let ((context (epg-make-context epa-protocol)))
(catch 'break
(dolist (recipient (message-recipients))
(let ((recipient-email (cadr recipient)))
(when (and recipient-email (not (epg-list-keys context recipient-email)))
(throw 'break nil))))
t)))
(defun message-sign-encrypt-if-all-keys-available ()
"Add MML tag to encrypt message when there is a key for each recipient.
Consider adding this function to `message-send-hook' to
systematically send encrypted emails when possible."
(when (message-all-epg-keys-available-p)
(mml-secure-message-sign-encrypt)))
(add-hook 'message-send-hook #'message-sign-encrypt-if-all-keys-available)
;(require 'ol-notmuch)
(use-package helm-notmuch
:general
(general-nmap
"nm" 'helm-notmuch))
(setq notmuch-saved-searches '((:name "unread"
:query "tag:inbox and tag:unread"
:count-query "tag:unread and tag:inbox"
:sort-order newest-first)
(:name "inbox"
:query "tag:inbox"
:count-query "tag:inbox"
:sort-order newest-first)
(:name "sent"
:query "tag:sent"
:count-query "tag:sent"
:sort-order newest-first)))
(setq mail-specify-envelope-from t)
(setq message-sendmail-envelope-from 'header)
(setq mail-envelope-from 'header)
(setq sendmail-program "/usr/pkg/bin/msmtp")
(require 'notmuch-address)
(setq notmuch-address-command "/usr/local/bin/nottoomuch-addresses.sh")
(setq notmuch-address-selection-function
(lambda (prompt collection initial-input)
(completing-read prompt (cons initial-input collection) nil t nil 'notmuch-address-history)))
(add-hook 'message-setup-hook 'mml-secure-sign-pgpmime)
(setq notmuch-crypto-process-mime t)
(define-key notmuch-search-mode-map "g"
'notmuch-poll-and-refresh-this-buffer)
(define-key notmuch-hello-mode-map "g"
'notmuch-poll-and-refresh-this-buffer)
(define-key notmuch-search-mode-map "d"
(lambda ()
"toggle deleted tag for thread"
(interactive)
(if (member "deleted" (notmuch-search-get-tags))
(notmuch-search-tag '("-deleted"))
(notmuch-search-tag '("+deleted" "-inbox" "-unread")))))
(define-key notmuch-search-mode-map "!"
(lambda ()
"toggle unread tag for thread"
(interactive)
(if (member "unread" (notmuch-search-get-tags))
(notmuch-search-tag '("-unread"))
(notmuch-search-tag '("+unread")))))
(define-key notmuch-show-mode-map "d"
(lambda ()
"toggle deleted tag for message"
(interactive)
(if (member "deleted" (notmuch-show-get-tags))
(notmuch-show-tag '("-deleted"))
(notmuch-show-tag '("+deleted" "-inbox" "-unread")))))
(define-key notmuch-search-mode-map "a"
(lambda ()
"toggle archive"
(interactive)
(if (member "archive" (notmuch-search-get-tags))
(notmuch-search-tag '("-archive"))
(notmuch-search-tag '("+archive" "-inbox" "-unread")))))
(define-key notmuch-show-mode-map "a"
(lambda ()
"toggle archive"
(interactive)
(if (member "archive" (notmuch-show-get-tags))
(notmuch-show-tag '("-archive"))
(notmuch-show-tag '("+archive" "-inbox" "-unread")))))
(define-key notmuch-hello-mode-map "i"
(lambda ()
(interactive)
(notmuch-hello-search "tag:inbox")))
(define-key notmuch-hello-mode-map "u"
(lambda ()
(interactive)
(notmuch-hello-search "tag:unread")))
(define-key notmuch-hello-mode-map "a"
(lambda ()
(interactive)
(notmuch-hello-search "tag:archive")))
(use-package w3m)
(require 'sr-speedbar)
(use-package exec-path-from-shell
:config
(when (memq window-system '(mac ns x))
(exec-path-from-shell-initialize)))
(use-package rainbow-delimiters
:config
(add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
(use-package editorconfig
:config
(editorconfig-mode 1))
(use-package aggressive-indent
:config
(global-aggressive-indent-mode 1))
;(add-to-list 'load-path "~/.emacs.d/scel/el") ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
;(require 'sclang) ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
;;; Rust
(use-package rustic
:mode ("\\.rs\\'" . rustic)
:interpreter ("rust" . rustic))
(use-package flycheck-rust
; :config (with-eval-after-load 'rustic (add-hook 'flycheck-mode-hook #'flycheck-rust-setup))
:after rustic)
(use-package racer
:after rust-mode
:config
(add-hook 'rustic-hook #'racer-mode)
(add-hook 'rustic-hook #'eldoc-mode)
(add-hook 'racer-mode-hook #'company-mode)
(define-key rust-mode-map (kbd "TAB") #'company-indent-or-complete-common)
(setq company-tooltip-align-annotations t))
(use-package toml-mode
:mode ("\\.toml\\'" . toml-mode)
:interpreter ("rust" . toml-mode))
;;; Go
(use-package go-mode
:mode ("\\.go\\'" . go-mode)
:interpreter ("go" . go-mode)
:config
(add-hook 'go-mode-hook 'lsp-deferred))
(use-package gorepl-mode
:after go-mode
:config
(add-hook 'go-mode-hook #'gorepl-mode))
(use-package gotest
:after go-mode)
;;; Haskell
(use-package haskell-mode
:mode ("\\.hs\\'" . haskell-mode)
:interpreter ("haskell" . haskell-mode))
(use-package lsp-haskell
:config
(add-hook 'haskell-mode-hook #'lsp))
;;; Clojure
;; (use-package clojure-mode
;; :mode ("\\.clj*\\'" . clojure-mode)
;; :interpreter ("clojure" . clojure-mode))
;; (use-package cider
;; :after clojure-mode
;; :config
;; (add-hook 'clojure-mode-hook #'cider-mode)
;; (setq nrepl-hide-special-buffers t))
;; (use-package emidje
;; :after clojure-mode
;; :config
;; (eval-after-load 'cider
;; #'emidje-setup))
;; (use-package flycheck-clojure
;; :after flycheck
;; :config
;; (eval-after-load 'flycheck '(flycheck-clojure-setup))
;; (add-hook 'after-init-hook #'global-flycheck-mode))
;; (use-package clj-refactor
;; :after clojure-mode
;; :config
;; (defun my-clojure-mode-hook ()
;; (clj-refactor-mode 1
;; (yas-minor-mode 1))
;; (cljr-add-keybindings-with-prefix "C-c C-m"))
;; (add-hook 'clojure-mode-hook #'my-clojure-mode-hook)) ; for adding require/use/import statements
;; (use-package clojure-snippets
;; :after clojure-mode)
;;; Misc langs
(use-package yaml-mode
:mode ("\\.yaml\\'" . yaml-mode)
:interpreter ("yaml" . yaml-mode))
(general-define-key
:states 'normal
"b" 'helm-buffers-list
"rl" 'load-file "~/emacs.d/init.el")
;; byte-compile
(defun byte-compile-current-buffer ()
"`byte-compile' current buffer if it's emacs-lisp-mode and compiled file exists."
(interactive)
(when (and (eq major-mode 'emacs-lisp-mode)
(file-exists-p (byte-compile-dest-file buffer-file-name)))
(byte-compile-file buffer-file-name)))
(add-hook 'after-save-hook #'byte-compile-current-buffer)
(defun goto-match-paren (arg)
"Go to the matching parenthesis if on parenthesis, otherwise insert %.
vi style of % jumping to matching brace."
(interactive "p")
(cond ((looking-at "\\s\(\") (forward-list 1) (backward-char 1)
((looking-at \"\\s\)\") (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))\)"))))
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(browse-url-browser-function 'browse-url-firefox)
'(custom-safe-themes
'("c74e83f8aa4c78a121b52146eadb792c9facc5b1f02c917e3dbb454fca931223" "e4c8810d9ab925567a69c11d5c95d198a4e7d05871453b2c92c020712559c4c1" default))
'(elfeed-feeds
'("https://therealnews.com/feed" "https://blog.netbsd.org/tnf/feed/entries/atom" "http://libcom.org/library-latest/feed" "https://itsgoingdown.org/feed/podcast/" "https://crimethinc.com/feed" "https://www.indybay.org/syn/generate_rss.php?page_id=60&include_posts=1&include_blurbs=1" "https://www.indybay.org/syn/generate_rss.php?page_id=12&include_posts=1&include_blurbs=1" "https://unicornriot.ninja/feed/" "https://blackrosefed.org/feed/" "http://news.infoshop.org/feed/" "https://antifascistnews.net/feed/" "https://en.squat.net/feed/" "https://enoughisenough14.org/feed/" "https://thefreeonline.wordpress.com/feed/" "https://www.redpepper.org.uk/feed" "https://anarchistnews.org/rss.xml" "https://waronsociety.noblogs.org/?feed=rss2" "https://en-contrainfo.espiv.net/feed/" "https://earthfirstjournal.org/newswire/feed/" "https://anarchistwithoutcontent.wordpress.com/feed/" "https://countervortex.org/node/feed" "http://ideasandaction.info/feed/" "https://industrialworker.iww.org/?feed=rss2" "https://www.iww.org/node/feed" "https://transfelinism.wordpress.com/feed/" "https://yogthos.net/feed.xml"))
'(helm-completion-style 'emacs)
'(lui-buttons-list
'(("\\(?:id\\|mid\\|thread\\):[0-9A-Za-z][0-9A-Za-z.@-]*" 0 notmuch-show 0)
("`\\([A-Za-z0-9+=*/-]+\\)'" 1 lui-button-elisp-symbol 1)
("\\<debbugs[#:]\\([0-9]+\\)" 0 "https://debbugs.gnu.org/cgi/bugreport.cgi?bug=%s" 1)
("\\<RFC ?\\([0-9]+\\)" 0 "http://www.ietf.org/rfc/rfc%s.txt" 1)
("\\<CVE[- ]\\([0-9]+-[0-9]+\\)" 0 "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-%s" 1)
("\\<SRFI[- ]?\\([0-9]+\\)" 0 "http://srfi.schemers.org/srfi-%s/srfi-%s.html" 1 1)
("\\<PEP[- ]?\\([0-9]+\\)" 0 lui-button-pep 1)
("\\<xkcd[ #]*\\([0-9]+\\)" 0 "https://xkcd.com/%s" 1)
("\\([0-9a-zA-Z_.-]+/[0-9a-zA-Z_.-]+\\)#\\([0-9]+\\)" 0 "https://github.com/%s/issues/%s" 1 2)))
'(mml-secure-openpgp-encrypt-to-self t)
'(org-journal-date-format "%A, %d %B %Y")
'(org-journal-dir "~/org/journal/")
'(package-selected-packages
'(gopher gorepl-mode go-flycheck go-mode alchemist Alchemist elixir-mode erc-nicklist lsp-treemacs helm-lsp erc-yt erc-youtube multi-term erc-sasl elfeed auto-compile smex weehcat git-gutter doom-modeline clj-refactor paredit yascroll yaml-mode writeroom-mode which-key w3m use-package toml-mode smartparens smart-mode-line rainbow-delimiters racer projectile parinfer org-plus-contrib org-journal neotree multiple-cursors minimap lsp-ui lsp-haskell inflections hydra general focus flycheck-rust flycheck-pos-tip flycheck-clojure flx exec-path-from-shell evil-org evil-magit evil-escape evil-commentary emidje edn editorconfig counsel company-quickhelp company-math company-lsp company-auctex bug-hunter auto-package-update all-the-icons aggressive-indent))
'(send-mail-function 'smtpmail-send-it)
'(smtpmail-smtp-server "smtp.riseup.net")
'(smtpmail-smtp-service 587))