ambevar-dotfiles/.emacs.d/lisp/main.el

388 lines
15 KiB
EmacsLisp
Raw Normal View History

;;; Main options
(require 'functions)
;;; Minimal UI. Run early to hide it as soon as possible.
2014-03-08 11:48:35 +01:00
(setq inhibit-startup-screen t)
(menu-bar-mode -1)
;;; `tool-bar-mode' and `scroll-bar-mode' might not be compiled in.
(when (fboundp 'tool-bar-mode) (tool-bar-mode -1))
(when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
2017-07-28 18:20:50 +02:00
;;; In some cases, Emacs can still decide by itself to use graphical boxes.
;;; Force on using the minibuffer instead.
(setq use-dialog-box nil)
2014-03-08 11:48:35 +01:00
2017-07-28 18:21:06 +02:00
;;; Timeout before echoing the prefix of an unfinished keystroke.
(setq echo-keystrokes 0.5)
;;; Remember last cursor position.
2017-08-03 18:49:33 +02:00
(save-place-mode)
;;; When the daemon is killed abruptly, places are not saved. Adding this hook
;;; allows to save places at a strategic moment.
2014-03-03 21:05:09 +01:00
(add-hook 'before-save-hook 'save-place-kill-emacs-hook)
;;; Recent files.
(setq recentf-max-saved-items 40)
2016-06-09 18:20:38 +02:00
2017-07-28 18:24:15 +02:00
;;; Save M-: history.
(savehist-mode)
;;; Disable autosave features.
(setq auto-save-default nil)
2013-06-04 20:51:04 +02:00
(setq auto-save-list-file-prefix nil)
2018-03-01 18:54:01 +01:00
;;; Place backup files in specific directory.
(setq backup-directory-alist
`(("." . ,(expand-file-name "backups" user-emacs-directory))))
;;; Default mode
2017-05-24 00:27:02 +02:00
(setq-default major-mode 'text-mode)
;;; Disable suspend key since it is useless on Emacs server.
(global-unset-key (kbd "C-z"))
(global-unset-key (kbd "C-x C-z"))
;;; Make questions less annoying.
(defalias 'yes-or-no-p 'y-or-n-p)
2017-06-22 19:03:10 +02:00
;;; Enable all disabled commands.
(setq disabled-command-function nil)
2013-10-20 18:19:19 +02:00
;;; Print buffer size in mode line.
(size-indication-mode 1)
2017-06-19 21:32:54 +02:00
;;; Display defun in mode line.
;; (which-function-mode)
2017-06-19 21:32:54 +02:00
;;; No need when we have a status bar.
;; (display-time)
;; (setq display-time-day-and-date t
;; display-time-24hr-format t
;; display-time-default-load-average nil)
;;; Just like time, no need when we have a status bar.
;; (display-battery-mode)
2017-06-19 21:32:54 +02:00
;;; TODO: Battery status (%b) does not work properly.
;; (setq battery-mode-line-format "[%p%%%b %t]")
2017-06-19 21:32:54 +02:00
;;; Line numbers
;;; Adding to `find-file-hook' ensures it will work for every file, regardless of
;;; the mode, but it won't work for buffers without files nor on mode change.
2017-06-18 17:55:38 +02:00
(dolist (hook '(prog-mode-hook text-mode-hook))
(add-hook hook 'ambrevar/turn-on-column-number-mode)
(add-hook hook 'ambrevar/turn-off-line-number-mode)
2018-06-01 11:09:36 +02:00
(add-hook hook 'display-line-numbers-mode))
(setq display-line-numbers-type 'visual)
;;; Alternative scrolling
(setq scroll-error-top-bottom t)
;;; Kill whole line including \n.
(setq kill-whole-line t)
;;; Indentation
2014-10-24 14:58:38 +02:00
(setq-default tab-width 2)
(defvaralias 'standard-indent 'tab-width)
(setq-default indent-tabs-mode t)
;;; Line by line scrolling
(setq scroll-step 1)
2014-11-12 15:09:14 +01:00
(setq
whitespace-style
'(face empty indentation space-after-tab space-before-tab tab-mark trailing))
2017-06-18 20:52:00 +02:00
;;; REVIEW: `whitespace-report' will mistakenly always report empty lines at
;;; beginning and end of buffer as long as there is at least one empty line.
;;; `whitespace-cleanup' works properly however.
2017-06-18 20:52:00 +02:00
;;; Reported at http://debbugs.gnu.org/cgi/bugreport.cgi?bug=23740.
;; (setq whitespace-action '(report-on-bogus))
;;; Add formatting functions to the buffer-local `before-save-hook'.
;;; WARNING: this can break some configuration files needing whitespaces at the
;;; end. This can also slow down saving on big files. Some modes (e.g. lisp) run
2018-02-15 14:23:46 +01:00
;;; `ambrevar/prettify' in their local hook, which is redundant with this.
;; (add-hook 'find-file-hook 'ambrevar/turn-on-prettify-before-save)
(add-hook 'find-file-hook 'ambrevar/turn-on-delete-trailing-whitespace)
;;; Cycle spacing instead of just-one-space. This frees M-\.
(global-set-key [remap just-one-space] 'cycle-spacing)
;;; Hippie expand
;; (global-set-key (kbd "M-/") 'hippie-expand)
;;; Abbreviation is like snippets: annoying at times, especially in
;;; prog-mode. They are useful in text mode to avoid the sprawling of
;;; abbreviations.
(add-hook 'text-mode-hook 'abbrev-mode)
;;; Auto-fill
(when (getenv "MANWIDTH")
(setq-default fill-column (string-to-number (getenv "MANWIDTH"))))
(add-hook 'text-mode-hook 'turn-on-auto-fill)
;; (setq sentence-end-double-space nil)
;;; Enforce horizontal splitting. 140 means that the window is large enough to
;;; hold 2 other windows of 70 columns.
(setq split-height-threshold nil
split-width-threshold 140)
2016-07-21 13:37:46 +02:00
;;; Windmove mode
2017-10-08 20:36:28 +02:00
;;; By default, it allows easy window switching with Shift+arrows. I like to
;;; stick to the home-row, but to avoid shadowing other binding I exceptionaly use
;;; 'super' (normally reserved to the WM).
(when (fboundp 'windmove-default-keybindings)
(ambrevar/global-set-keys
"s-h" 'windmove-left
"s-j" 'windmove-down
"s-k" 'windmove-up
"s-l" 'windmove-right))
(ambrevar/global-set-keys
"s-o" 'delete-other-windows
;; "s-w" 'other-window
"s-c" 'delete-window)
2018-02-16 12:33:33 +01:00
;; REVIEW: If xdg-open is not found, set Emacs URL browser to the environment browser,
;; or w3m if BROWSER is not set.
;; See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=18986.
(require 'browse-url)
2017-09-11 19:29:35 +02:00
(setq browse-url-generic-program (or
2018-02-16 12:33:33 +01:00
(executable-find (or (getenv "BROWSER") "")) ; TODO: Still need this in Emacs 26?
2017-09-11 19:29:35 +02:00
(when (executable-find "xdg-mime")
(let ((desktop-browser (ambrevar/call-process-to-string "xdg-mime" "query" "default" "text/html")))
2017-09-11 19:29:35 +02:00
(substring desktop-browser 0 (string-match "\\.desktop" desktop-browser))))
(executable-find browse-url-mozilla-program)
(executable-find browse-url-firefox-program)
(executable-find browse-url-chromium-program)
(executable-find browse-url-kde-program)
(executable-find browse-url-conkeror-program)
(executable-find browse-url-chrome-program)))
2018-02-12 12:53:45 +01:00
(setq shr-external-browser browse-url-browser-function)
2018-12-02 12:33:17 +01:00
(setq browse-url-browser-function '(;; TODO: Display hyperspec in other window.
("http://www.lispworks.com/reference/HyperSpec/.*" . eww-browse-url)
2018-12-28 19:38:46 +01:00
("file:///.*HyperSpec.*" . eww-browse-url)
2018-12-02 12:33:17 +01:00
("." . browse-url-default-browser)))
2017-09-11 19:29:35 +02:00
;; shr
(setq shr-width (string-to-number (or (getenv "MANWIDTH") "80")))
;;; Extend MIME-types support for videos.
(with-eval-after-load 'mailcap
(dolist (ext '((".webm" . "video/webm")
(".mp4" . "video/mp4")
(".flv" . "video/mp4")
(".ogv" . "video/ogg")
(".mkv" . "video/x-matroska")))
(add-to-list 'mailcap-mime-extensions ext)))
2012-11-13 18:46:20 +01:00
;;; Default ispell dictionary. If not set, Emacs uses the current locale.
(setq ispell-dictionary "english")
(ambrevar/define-keys text-mode-map
"C-<f6>" 'ispell-change-dictionary
"<f6>" 'ispell-buffer)
2012-12-21 21:30:54 +01:00
;;; Show matching parenthesis
(show-paren-mode 1)
;;; By default, theres a small delay before showing a matching parenthesis. Set
;;; it to 0 to deactivate.
(setq show-paren-delay 0)
2016-10-05 06:56:16 +02:00
(setq show-paren-when-point-inside-paren t)
2017-06-29 19:06:53 +02:00
;;; Electric Pairs to auto-complete () [] {} "" etc. It works on regions.
2017-06-03 19:41:19 +02:00
;; (electric-pair-mode)
;;; Spawn terminal shortcut: WM's binding is s+<return>.
(global-set-key (kbd "C-x M-<return>") 'spawn-terminal)
;;; Calendar ISO display.
(setq calendar-week-start-day 1)
(setq calendar-date-style 'iso)
;;; Compilation bindings and conveniences.
(setq compilation-ask-about-save nil)
(setq compilation-scroll-output 'first-error)
(with-eval-after-load 'compile
;; Making `compilation-directory' local only works with `recompile'
;; and if `compile' is never used. In such a scenario,
;; `compile-command' is not saved by `recompile' itself which adds a
;; lot of bookkeeping.
;; (make-variable-buffer-local 'compilation-directory)
;; (make-variable-buffer-local 'compile-history)
(make-variable-buffer-local 'compile-command))
2017-06-12 22:29:30 +02:00
;;; Some commands ignore that compilation-mode is a "dumb" terminal and still display colors.
;;; Thus we render those colors.
(require 'ansi-color)
2018-02-15 13:28:49 +01:00
(defun ambrevar/compilation-colorize-buffer ()
2017-06-12 22:29:30 +02:00
(when (eq major-mode 'compilation-mode)
(ansi-color-apply-on-region compilation-filter-start (point-max))))
2018-02-15 13:28:49 +01:00
(add-hook 'compilation-filter-hook 'ambrevar/compilation-colorize-buffer)
(global-set-key (kbd "<f7>") 'previous-error)
(global-set-key (kbd "<f8>") 'next-error)
2018-02-15 13:28:49 +01:00
(defun ambrevar/compile-last-command ()
(interactive)
(compile compile-command))
(ambrevar/define-keys prog-mode-map
"C-<f6>" 'compile
;; Do not use `recompile' since we want to change the compilation folder for the current buffer.
2018-02-15 13:28:49 +01:00
"<f6>" 'ambrevar/compile-last-command)
;;; REVIEW: Bug 26658 reports that cc-modes mistakenly does not make use of prog-mode-map.
;;; The following line is a suggested work-around.
;;; This should be fixed in Emacs 26.
(eval-after-load 'cc-mode '(set-keymap-parent c-mode-base-map prog-mode-map))
2017-07-28 18:22:59 +02:00
;;; Comint mode
(setq comint-prompt-read-only t)
;;; Desktop-mode
2017-10-23 21:07:25 +02:00
;;; REVIEW: `desktop-kill' should not query the user in `kill-emacs-hook'.
;;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=28943
2017-07-28 09:12:25 +02:00
;;; TODO: Desktop mode does not save window registers properly.
;;; See https://groups.google.com/forum/#!topic/gnu.emacs.help/64aO_O43530
;;; and https://www.reddit.com/r/emacs/comments/4q38s1/save_register_between_sessions/?st=j419vc7r&sh=2617ffb4
;;; and http://debbugs.gnu.org/cgi/bugreport.cgi?bug=27422
;;; and https://stackoverflow.com/questions/5830494/windows-configuration-to-registers#5830928
;;; and https://www.reddit.com/r/emacs/comments/7au3hj/how_do_you_manage_your_emacs_windows_and_stay_sane/dpfbg3a/?context=3.
2017-04-28 07:24:51 +02:00
(when (daemonp)
;; Auto-load/save sessions only when running the daemon.
;; `server-running-p' is only useful once the daemon is started and cannot be
;; used for initialization. Use `daemonp' instead.
(when (< emacs-major-version 27)
;; By default, Emacs<27 prompts for unsafe variable when loading desktop
;; which stucks the daemon. Disable this behaviour.
(defun ambrevar/enable-safe-local-variables ()
(setq enable-local-variables t))
(add-hook 'after-init-hook 'ambrevar/enable-safe-local-variables))
(require 'desktop) ; This adds a hook to `after-init-hook'.
(when (< emacs-major-version 27)
(defun ambrevar/enable-all-local-variables ()
(setq enable-local-variables :all))
(add-hook 'after-init-hook 'ambrevar/enable-all-local-variables))
(when (< emacs-major-version 27)
(load "patch-desktop"))
2017-08-14 16:33:27 +02:00
(setq history-length 250
;; Default timer (30) is way too high: for somebody too frenzy, the timer
;; might never be saved. See
2017-10-23 21:07:25 +02:00
;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=28943.
desktop-auto-save-timeout 5
;; desktop-restore-eager 4 ; Can be annoying as you don't have your last-loaded buffers immediately.
2018-02-18 12:36:56 +01:00
;; desktop-load-locked-desktop 'ask
desktop-restore-frames nil
desktop-save t)
;; Before Emacs 27, initialization needs the patch above.
(if (< emacs-major-version 27)
(desktop-save-mode)
(defun ambrevar/desktop-init (_frame)
2018-02-18 12:36:56 +01:00
(desktop-save-mode)
(desktop-read)
(remove-hook 'server-after-make-frame-hook 'ambrevar/desktop-init))
(add-hook 'server-after-make-frame-hook 'ambrevar/desktop-init))
2018-07-17 11:02:36 +02:00
;; Don't save crytped files since they can't be restored.
(setq desktop-files-not-to-save
(concat (substring desktop-files-not-to-save 0 -2) "\\|" (regexp-quote ".gpg") "\\'\\)"))
;; Discarding PDFs and images makes it lighter.
(add-to-list 'desktop-modes-not-to-save 'pdf-view-mode)
2017-12-03 10:49:40 +01:00
(add-to-list 'desktop-modes-not-to-save 'image-mode)
;; TODO: `compile-history' should be buffer local but that does not work.
;; http://user42.tuxfamily.org/compile-history-local/index.html
;; http://stackoverflow.com/questions/22995203/one-compile-command-per-buffer-not-directory
;; (add-to-list 'desktop-locals-to-save 'compile-history)
2017-05-22 16:26:52 +02:00
(add-to-list 'desktop-locals-to-save 'compile-command)
2017-12-07 11:07:53 +01:00
(add-to-list 'desktop-locals-to-save 'ispell-local-dictionary))
;;; Buffer names.
2014-02-21 20:14:50 +01:00
(setq uniquify-buffer-name-style 'forward)
;;; Skeleton settings
;;; Do not expand abbrevs in skeletons.
2014-03-13 16:13:21 +01:00
(setq-default skeleton-further-elements '((abbrev-mode nil)))
(ambrevar/turn-on-skeleton-markers)
(ambrevar/global-set-keys
"C->" 'skeleton-next-position
"C-<" 'skeleton-previous-position)
2014-03-13 16:13:21 +01:00
;;; Disable prompt (but leave warning) on git symlink.
(setq vc-follow-symlinks t)
;;; Clipboard and primary selection.
;; (setq select-enable-clipboard t)
(setq select-enable-primary t
save-interprogram-paste-before-kill t)
;;; Move mouse away.
2017-06-18 16:28:15 +02:00
(mouse-avoidance-mode 'banish)
2017-05-28 18:37:54 +02:00
;;; That binding is not very useful and gets in the way of C-<mouse-1>.
(global-unset-key (kbd "C-<down-mouse-1>"))
;;; Scroll zooming.
(ambrevar/global-set-keys
"C-<wheel-down>" 'text-scale-decrease
"C-<mouse-5>" 'text-scale-decrease
"C-<wheel-up>" 'text-scale-increase
"C-<mouse-4>" 'text-scale-increase)
2015-06-02 10:05:14 +02:00
(setq text-scale-mode-step 1.1)
;;; Sort
2015-11-02 13:34:04 +01:00
(setq sort-fold-case t)
;;; Replace not-so-useful comment-dwim binding.
(global-set-key (kbd "M-;") 'comment-line)
2016-10-05 06:56:16 +02:00
;;; Eldoc: Disable if too distracting.
2016-10-06 14:37:53 +02:00
;; (global-eldoc-mode 0)
;; (setq eldoc-idle-delay 0.1) ; Could be even more distracting.
;;; Replace `kill-buffer' binding by `kill-this-buffer'.
(global-set-key (kbd "C-x k") 'kill-this-buffer)
;;; Ediff
;;; TODO: Ediff does not seem to auto-refine. Bug? Compare daemon and no-daemon.
2016-12-10 17:53:59 +01:00
(setq ediff-window-setup-function 'ediff-setup-windows-plain
ediff-split-window-function 'split-window-horizontally)
;;; Trash
(setq delete-by-moving-to-trash t)
;;; Display Time World
2017-06-18 14:26:26 +02:00
(setq
zoneinfo-style-world-list
'(("UTC" "-")
("Europe/Paris" "France Germany Sweden")
("Asia/Calcutta" "India")
("Indian/Mauritius" "Mauritius")
("Africa/Tunis" "Tunisia")
("Asia/Ho_Chi_Minh" "Vietnam")
("Australia/Melbourne" "Melbourne")
("Africa/Nairobi" "Uganda")))
;;; Frame title
(setq frame-title-format (concat "%b" (unless (daemonp) " [serverless]")))
2017-10-08 20:36:28 +02:00
;;; Initial scratch buffer message.
(require 'functions) ; For `ambrevar/fortune-scratch-message'.
(let ((fortune (ambrevar/fortune-scratch-message)))
(when fortune
(setq initial-scratch-message fortune)))
;;; Support for Emacs pinentry.
;;; Required for eshell/sudo and everything relying on GPG queries.
(setq epa-pinentry-mode 'loopback) ; This will fail if gpg>=2.1 is not available.
2018-02-16 12:33:33 +01:00
(when (require 'pinentry nil t)
(pinentry-start))
2018-02-19 21:22:54 +01:00
;;; Edebug
;; (setq edebug-trace t)
;;; Make windowing more reactive on. This is especially true with Helm on EXWM.
(when (= emacs-major-version 26)
(setq x-wait-for-event-timeout nil))
(setq woman-fill-column fill-column)
2018-07-12 17:30:18 +02:00
;;; Save all visited URLs.
(setq url-history-track t
url-history-file (expand-file-name "url/history" user-emacs-directory))
(setq abbrev-file-name (expand-file-name "abbrev_defs" "~/personal"))
2014-03-08 11:48:35 +01:00
(provide 'main)