ambevar-dotfiles/.emacs.d/init.el

338 lines
12 KiB
EmacsLisp
Raw Normal View History

;;; Emacs config
2016-10-14 14:03:30 +02:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Prerequisites
(defvar mickey-minor-mode-map (make-keymap) "Keymap for `mickey-minor-mode'.")
(define-minor-mode mickey-minor-mode
"The mode's keymap allows for overriding all global and major mode keys.
To view where the bindings are set in your config files, lookup
`mickey-minor-mode-map' over it. Example:\n
(define-key mickey-minor-mode-map (kbd \"C-i\") 'some-function)"
t " myckey" 'mickey-minor-mode-map)
(add-hook 'minibuffer-setup-hook (lambda () (mickey-minor-mode 0)))
2013-07-03 14:04:51 +02:00
(defvar emacs-cache-folder "~/.cache/emacs/"
"Cache folder is everything we do not want to track along with
the configuration files.")
2013-06-16 14:27:14 +02:00
(if (not (file-directory-p emacs-cache-folder))
2013-06-12 22:56:30 +02:00
(make-directory emacs-cache-folder t))
;;; Store additional config in a 'lisp' subfolder and add it to the load path so
;;; that `require' can find the files.
2014-11-25 08:44:22 +01:00
(add-to-list 'load-path "~/.emacs.d/lisp")
2014-02-12 17:37:43 +01:00
;;; Local plugin folder for quick install. All files in this folder will be
;;; accessible to Emacs config. This is done to separate the versioned config
;;; files from the external packages. For instance you can put package.el in
;;; there for Emacs <24.
2014-03-08 11:48:35 +01:00
(add-to-list 'load-path "~/.emacs.d/local")
(when (require 'package nil t)
;; (add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(setq package-user-dir (concat emacs-cache-folder "elpa"))
(package-initialize))
2014-03-08 11:48:35 +01:00
(require 'functions nil t)
(require 'main nil t)
2016-12-12 13:53:53 +01:00
(require 'visual nil t)
2014-02-12 17:48:29 +01:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Major modes
2014-03-08 11:48:35 +01:00
;;; Assembly
(add-to-list 'package-selected-packages 'nasm-mode)
;;; Asymptote
2014-12-16 10:10:41 +01:00
(add-to-list 'load-path "/usr/share/asymptote")
(autoload 'asy-mode "asy-mode.el" "Asymptote major mode." t)
(autoload 'lasy-mode "asy-mode.el" "Hybrid Asymptote/Latex major mode." t)
(autoload 'asy-insinuate-latex "asy-mode.el" "Asymptote insinuate LaTeX." t)
(add-to-list 'auto-mode-alist '("\\.asy$" . asy-mode))
;;; BBCode
(add-to-list 'package-selected-packages 'bbcode-mode)
2014-09-11 22:33:39 +02:00
(load-external "\\.bbcode\\'" 'bbcode-mode)
(add-hook 'bbcode-mode-hook (lambda () (require 'mode-bbcode)))
;;; Bibtex
(setq bibtex-entry-format '(opts-or-alts required-fields numerical-fields whitespace realign last-comma delimiters braces sort-fields))
(setq bibtex-field-delimiters 'double-quotes)
(add-hook 'bibtex-mode-hook 'turn-off-indent-tabs)
;;; Bison/Flex
2014-03-08 15:58:29 +01:00
(load-external "\\.l\\'" 'flex-mode nil 'c-mode)
(load-external "\\.yy?\\'" 'bison-mode nil 'c-mode)
;;; C/C++
(add-hook 'c-mode-hook (lambda () (require 'mode-cc)))
(add-hook 'c++-mode-hook (lambda () (require 'mode-cc)))
;;; ChangeLog
(defun change-log-set-indent-rules ()
(setq tab-width 2 left-margin 2))
(add-hook 'change-log-mode-hook 'change-log-set-indent-rules)
;;; GLSL
2014-03-08 15:58:29 +01:00
(load-external "\\.vert\\'\\|\\.frag\\'\\|\\.glsl\\'" 'glsl-mode nil 'c-mode)
;;; Go
(add-to-list 'package-selected-packages 'go-mode)
(add-to-list 'package-selected-packages 'go-eldoc)
(add-to-list 'package-selected-packages 'go-guru)
(add-to-list 'package-selected-packages 'go-rename)
(add-to-list 'package-selected-packages 'helm-go-package)
(add-to-list 'package-selected-packages 'company-go)
2014-03-08 15:58:29 +01:00
(load-external "\\.go\\'" 'go-mode)
(add-hook 'go-mode-hook (lambda () (require 'mode-go)))
;;; Graphviz dot
;; The view command is broken but the preview command works (it displays the PNG
;; in a new window), which is enough and probably not worth a fix.
(add-to-list 'package-selected-packages 'graphviz-dot-mode)
(load-external "\\.dot\\'" 'graphviz-dot-mode)
;;; JavaScript
(add-hook 'js-mode-hook (lambda () (defvaralias 'js-indent-level 'tab-width)))
;;; Lisp
;;; Should not use tabs.
(dolist (hook '(lisp-mode-hook emacs-lisp-mode-hook))
(add-hook hook 'turn-on-fmt-before-save)
(add-hook hook 'turn-off-indent-tabs))
(define-key lisp-mode-shared-map "\M-." 'find-symbol-at-point)
;;; Common LISP
(setq inferior-lisp-program "clisp")
;;; Lua
(add-to-list 'package-selected-packages 'lua-mode)
2014-03-08 15:58:29 +01:00
(load-external "\\.lua\\'" 'lua-mode nil 'sh-mode)
2014-03-25 09:23:12 +01:00
(add-hook 'lua-mode-hook (lambda () (require 'mode-lua)))
;;; Mail with Mutt support.
(add-hook 'mail-mode-hook 'mail-text)
(add-to-list 'auto-mode-alist '("/tmp/mutt-.*" . mail-mode))
2017-06-03 14:53:31 +02:00
(defun mutt-backup-buffer ()
"Create a copy of the current buffer.
This is useful for recovery in case Mutt hangs before sending the
e-mail."
(when (not (boundp 'mutt-backup))
(set (make-local-variable 'mutt-backup) (make-temp-file (concat (buffer-name) "-"))))
(copy-file buffer-file-name mutt-backup t))
(defun mutt-check-buffer ()
2017-06-03 14:53:31 +02:00
(when (string-match "/tmp/mutt-.*" (buffer-file-name))
(when (require 'with-editor nil t)
;; Just like git commits.
(with-editor-mode))
(add-hook 'after-save-hook 'mutt-backup-buffer nil t)))
(add-hook 'find-file-hook 'mutt-check-buffer)
;;; Makefile
(add-hook 'makefile-mode-hook (lambda () (require 'mode-makefile)))
;;; Markdown
(add-to-list 'package-selected-packages 'markdown-mode)
2014-03-08 15:58:29 +01:00
(load-external "\\.md\\'\\|\\.markdown\\'" 'markdown-mode)
;;; If we need more option, add it to a dedicated file.
(when (require 'markdown-mode nil t)
(set-face-attribute 'markdown-header-face-1 nil :inherit 'info-title-1)
(set-face-attribute 'markdown-header-face-2 nil :inherit 'info-title-2)
(set-face-attribute 'markdown-header-face-3 nil :inherit 'info-title-3)
(set-face-attribute 'markdown-header-face-4 nil :inherit 'info-title-4)
(define-key markdown-mode-map "\M-'" 'markdown-blockquote-region)
(add-hook 'markdown-mode-hook 'turn-on-newline-paragraph))
;;; Matlab / Octave
(add-to-list 'auto-mode-alist '("\\.m\\'" . octave-mode)) ; matlab
(defun octave-set-comment-start ()
"Set comment character to '%' to be Matlab-compatible."
(set (make-local-variable 'comment-start) "% "))
(add-hook 'octave-mode-hook 'octave-set-comment-start)
;;; Maxima
(autoload 'maxima-mode "maxima" "Maxima mode" t)
(autoload 'maxima "maxima" "Maxima interaction" t)
(setq auto-mode-alist (cons '("\\.mac" . maxima-mode) auto-mode-alist))
;;; Mediawiki
(add-to-list 'package-selected-packages 'mediawiki)
2014-03-10 10:37:43 +01:00
(load-external "\\.wiki\\'" 'mediawiki 'mediawiki-mode)
(add-hook 'mediawiki-mode-hook (lambda () (require 'mode-mediawiki)))
;;; Org-mode
(add-hook 'org-mode-hook (lambda () (require 'mode-org)))
;;; Perl
(defun perl-set-indent-rules ()
(defvaralias 'perl-indent-level 'tab-width))
(defun perl-set-compiler ()
(setq compile-command (concat "perl " (shell-quote-argument buffer-file-name))))
(add-hook 'perl-mode-hook 'perl-set-indent-rules)
(add-hook 'perl-mode-hook 'perl-set-compiler)
;;; po
;;; No hook for this mode?
2014-03-08 15:58:29 +01:00
(load-external "\\.po\\'\\|\\.po\\." 'po-mode)
(when (fboundp 'po-find-file-coding-system)
(modify-coding-system-alist 'file "\\.po\\'\\|\\.po\\." 'po-find-file-coding-system))
;;; Python
(add-hook 'python-mode-hook (lambda () (require 'mode-python)))
;;; Roff / Nroff
(add-hook 'nroff-mode-hook (lambda () (require 'mode-nroff)))
;;; Shell
(add-hook 'sh-mode-hook (lambda () (require 'mode-sh)))
;;; Arch Linux PKGBUILD
(add-to-list 'auto-mode-alist '("PKGBUILD" . sh-mode))
;;; rc
(add-to-list 'auto-mode-alist '("rc\\'" . sh-mode))
;;; Fish
2016-10-11 17:33:36 +02:00
(add-to-list 'package-selected-packages 'fish-mode)
(defun fish-check-buffer ()
(when (string-match "/tmp/tmp\..*\.fish" (buffer-file-name))
(when (require 'with-editor nil t)
;; Just like git commits.
(with-editor-mode))
(end-of-line)))
(add-hook 'find-file-hook 'fish-check-buffer)
2016-10-11 17:33:36 +02:00
;;; Srt (subtitles)
(add-to-list 'auto-mode-alist '("\\.srt\\'" . text-mode))
;;; TeX / LaTeX / Texinfo
(add-hook 'tex-mode-hook (lambda () (require 'mode-tex)))
(add-hook 'texinfo-mode-hook (lambda () (require 'mode-texinfo)))
(add-hook 'latex-mode-hook (lambda () (require 'mode-latex)))
(add-to-list 'package-selected-packages 'latex-math-preview)
(add-to-list 'package-selected-packages 'latex-pretty-symbols)
(require 'latex-pretty-symbols nil t)
;;; Web forms.
;;; Remove auto-fill in web edits because wikis and forums do not like it.
;;; This works for qutebrowser, but may need changes for other browsers.
(defun browser-check-buffer ()
(when (string-match (concat (getenv "BROWSER") "-editor-*") (buffer-name))
(when (require 'with-editor nil t)
;; Just like git commits.
(with-editor-mode))
(auto-fill-mode -1)))
(add-hook 'find-file-hook 'browser-check-buffer)
;;; XML / SGML
(defun sgml-setup ()
(setq sgml-xml-mode t)
;; (toggle-truncate-lines) ; This seems to slow down Emacs.
(turn-off-auto-fill))
(add-hook 'sgml-mode-hook 'sgml-setup)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Minor modes and features.
2014-02-22 19:13:39 +01:00
;;; Company
(add-to-list 'package-selected-packages 'company)
(add-to-list 'package-selected-packages 'helm-company)
(when (require 'company nil t)
(setq company-idle-delay nil))
;;; Dired
(add-hook 'dired-mode-hook (lambda () (require 'mode-dired)))
;;; Eshell
(add-hook 'eshell-load-hook (lambda () (require 'mode-eshell)))
;;; Evil
(add-to-list 'package-selected-packages 'evil)
(add-to-list 'package-selected-packages 'evil-leader)
(add-to-list 'package-selected-packages 'evil-magit)
(add-to-list 'package-selected-packages 'evil-mc)
(add-to-list 'package-selected-packages 'evil-mc-extras)
(add-to-list 'package-selected-packages 'linum-relative)
(when (require 'evil nil t)
(require 'tool-evil))
;;; GUD (GDB, etc.)
2017-05-28 18:51:31 +02:00
(add-hook 'gud-mode-hook (lambda () (require 'mode-gud)))
;;; Helm
(add-to-list 'package-selected-packages 'helm)
(add-to-list 'package-selected-packages 'helm-descbinds)
(add-to-list 'package-selected-packages 'helm-ls-git)
;; (add-to-list 'package-selected-packages 'helm-pt) ; No need?
(add-to-list 'package-selected-packages 'wgrep-helm)
(add-to-list 'package-selected-packages 'wgrep-pt)
(when (require 'helm-config nil t)
(require 'tool-helm))
;;; Indentation engine fix.
(require 'smiext "tool-smiext")
;;; Indent style guessing.
(require 'dtrt-indent nil t)
;;; Magit
(add-to-list 'package-selected-packages 'magit)
2016-06-09 14:42:19 +02:00
(when (require 'magit nil t)
2017-05-08 15:52:36 +02:00
(set-face-foreground 'magit-branch-remote "orange red")
(setq git-commit-summary-max-length fill-column)
(setq magit-diff-refine-hunk 'all)
2016-06-09 14:42:19 +02:00
(global-set-key (kbd "C-x g") 'magit-status))
;;; Multiple cursors
;; (add-to-list 'package-selected-packages 'multiple-cursors)
;; (add-to-list 'package-selected-packages 'phi-search)
(when (require 'multiple-cursors nil t)
(setq mc/list-file (concat emacs-cache-folder "mc-lists.el"))
;; Load the file at the new location.
(load mc/list-file t)
(define-key mickey-minor-mode-map (kbd "C-<mouse-1>") 'mc/add-cursor-on-click)
(define-key mickey-minor-mode-map (kbd "C-x M-r") 'mc/edit-lines)
(define-key mickey-minor-mode-map (kbd "C-x M-m") 'mc/mark-more-like-this-extended)
(define-key mickey-minor-mode-map (kbd "C-x M-l") 'mc/mark-all-like-this-dwim)
;; Search compatible with mc.
(require 'phi-search nil t))
2017-05-22 23:57:52 +02:00
;;; PDF
(autoload 'pdf-view "tool-pdf" nil t)
(autoload 'pdf-compress "tool-pdf" nil t)
;;; Translator
(autoload 'itranslate "tool-itranslate" nil t)
(autoload 'itranslate-lines "tool-itranslate" nil t)
(autoload 'itranslate-region "tool-itranslate" nil t)
2017-05-08 15:52:36 +02:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Finalization
2016-10-14 14:03:30 +02:00
;;; Don't let `customize' clutter my config.
;;; This will prompt "File exists, but cannot be read".
(setq custom-file "/dev/null")
;;; We need to put it at the end to make sure it doesn't get overriden by other
;;; minor modes.
(mickey-minor-mode 1)
;;; Local hook. You can use it to set system specific variables, such as the
;;; external web browser or pdf viewer. You can also backport feature for old
;;; Emacs. For instance:
;;
;; (setq pdf-viewer "evince")
;; (setq pdf-viewer-args nil)
;;
;; (dolist (hook '(asm-mode-hook awk-mode-hook c++-mode-hook c-mode-hook
;; emacs-lisp-mode-hook lisp-mode-hook lua-mode-hook
;; makefile-mode-hook octave-mode-hook perl-mode-hook
;; python-mode-hook scheme-mode-hook sh-mode-hook))
;; (add-hook hook (lambda () (run-hooks 'prog-mode-hook))))
;;
;; (defun comment-line... ;; From emacs 25
;;
;; (transient-mark-mode 1)
;;
;; ;; Fix slow startup when network is slow. Most visible with Helm and Magit with Emacs <25.
;; (setq tramp-ssh-controlmaster-options "-o ControlMaster=auto -o ControlPath='tramp.%%C' -o ControlPersist=no")
2016-10-05 06:56:16 +02:00
2014-03-12 10:36:37 +01:00
(load "local" t t)