966 lines
31 KiB
EmacsLisp
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))
|