doomemacs/core/core-editor.el

270 lines
9.3 KiB
EmacsLisp
Raw Normal View History

;;; core-editor.el -*- lexical-binding: t; -*-
2017-01-17 12:15:48 +08:00
(defvar doom-large-file-size 1
"Size (in MB) above which the user will be prompted to open the file literally
to avoid performance issues. Opening literally means that no major or minor
modes are active and the buffer is read-only.")
(defvar doom-large-file-modes-list
'(archive-mode tar-mode jka-compr git-commit-mode image-mode
doc-view-mode doc-view-mode-maybe ebrowse-tree-mode pdf-view-mode)
"Major modes that `doom|check-large-file' will ignore.")
2017-02-20 07:11:28 +08:00
(setq-default
2017-06-16 08:06:21 +08:00
vc-follow-symlinks t
2017-02-20 07:11:28 +08:00
;; Save clipboard contents into kill-ring before replacing them
save-interprogram-paste-before-kill t
;; Bookmarks
bookmark-default-file (concat doom-cache-dir "bookmarks")
2017-02-20 07:11:28 +08:00
bookmark-save-flag t
;; Formatting
delete-trailing-lines nil
fill-column 80
sentence-end-double-space nil
word-wrap t
2017-02-20 07:11:28 +08:00
;; Scrolling
hscroll-margin 1
hscroll-step 1
scroll-conservatively 1001
scroll-margin 0
scroll-preserve-screen-position t
;; Whitespace (see `editorconfig')
indent-tabs-mode nil
require-final-newline t
tab-always-indent t
tab-width 4
2017-06-16 08:06:21 +08:00
tabify-regexp "^\t* [ \t]+" ; for :retab
2017-02-20 07:11:28 +08:00
;; Wrapping
truncate-lines t
truncate-partial-width-windows 50
2017-06-15 20:24:54 +08:00
;; whitespace-mode
whitespace-line-column fill-column
whitespace-style
'(face indentation tabs tab-mark spaces space-mark newline newline-mark
trailing lines-tail)
whitespace-display-mappings
'((tab-mark ?\t [? ?\t])
2017-06-16 08:06:21 +08:00
(newline-mark ?\n [ ?\n])
(space-mark ?\ [] [?.])))
(defun doom|ediff-use-existing-frame ()
"Use existing frame instead of creating a new one."
(setq ediff-diff-options "-w"
ediff-split-window-function #'split-window-horizontally
;; no extra frames
ediff-window-setup-function #'ediff-setup-windows-plain))
2017-06-16 08:06:21 +08:00
(add-hook 'ediff-load-hook #'doom|ediff-use-existing-frame)
2017-02-01 08:50:46 +08:00
(defun doom|dont-kill-scratch-buffer ()
"Don't kill the scratch buffer."
2017-05-21 14:27:42 +08:00
(or (not (string= (buffer-name) "*scratch*"))
(ignore (bury-buffer))))
(add-hook 'kill-buffer-query-functions #'doom|dont-kill-scratch-buffer)
(defun doom*delete-trailing-whitespace (orig-fn &rest args)
"Don't affect trailing whitespace on current line."
(let ((linestr (buffer-substring-no-properties
(line-beginning-position)
(line-end-position))))
(apply orig-fn args)
(when (and (if (featurep 'evil) (evil-insert-state-p) t)
(string-match-p "^[\s\t]*$" linestr))
(insert linestr))))
(advice-add #'delete-trailing-whitespace :around #'doom*delete-trailing-whitespace)
(defun doom|check-large-file ()
"Check if the buffer's file is large (see `doom-large-file-size'). If so, ask
for confirmation to open it literally (read-only, disabled undo and in
fundamental-mode) for performance sake."
(let* ((filename (buffer-file-name))
(size (nth 7 (file-attributes filename))))
(when (and (not (memq major-mode doom-large-file-modes-list))
size (> size (* 1024 1024 doom-large-file-size))
(y-or-n-p
(format (concat "%s is a large file, open literally to "
"avoid performance issues?")
(file-relative-name filename))))
(setq buffer-read-only t)
(buffer-disable-undo)
(fundamental-mode))))
(add-hook 'find-file-hook #'doom|check-large-file)
2017-01-17 12:15:48 +08:00
;;
;; Built-in plugins
;;
;; revert buffers for changed files
(global-auto-revert-mode 1)
(setq auto-revert-verbose nil)
;; enabled by default in Emacs 25+. No thanks.
(electric-indent-mode -1)
;; savehist / saveplace
(setq savehist-file (concat doom-cache-dir "savehist")
savehist-save-minibuffer-hisstory t
savehist-autosave-interval nil ; save on kill only
savehist-additional-variables '(kill-ring search-ring regexp-search-ring)
save-place-file (concat doom-cache-dir "saveplace"))
(add-hook! 'doom-init-hook #'(savehist-mode save-place-mode))
;; Keep track of recently opened files
(def-package! recentf
:defer 1
:config
(setq recentf-save-file (concat doom-cache-dir "recentf")
recentf-max-menu-items 0
recentf-max-saved-items 300
recentf-filename-handlers '(abbreviate-file-name)
recentf-exclude
(list "^/tmp/" "^/ssh:" "\\.?ido\\.last$" "\\.revive$" "/TAGS$"
"^/var/folders/.+$"
;; ignore private DOOM temp files (but not all of them)
(concat "^" (replace-regexp-in-string
(concat "@" (regexp-quote (system-name)))
"@" (abbreviate-file-name doom-host-dir)))))
(quiet! (recentf-mode 1)))
2017-01-17 12:15:48 +08:00
;;
2017-02-01 08:50:46 +08:00
;; Core Plugins
2017-01-17 12:15:48 +08:00
;;
2017-02-01 08:50:46 +08:00
;; Handles whitespace (tabs/spaces) settings externally. This way projects can
;; specify their own formatting rules.
(def-package! editorconfig
:demand t
2017-03-02 08:16:22 +08:00
:init
(def-setting! :editorconfig (action value)
":add or :remove an entry in `editorconfig-indentation-alist'."
(cond ((eq action :add)
`(push ,value editorconfig-indentation-alist))
((eq action :remove)
`(setq editorconfig-indentation-alist
(assq-delete-all ,value editorconfig-indentation-alist)))
(t (error "%s is an invalid action for :editorconfig"
action))))
2017-03-02 08:16:22 +08:00
:config
(add-hook 'doom-init-hook #'editorconfig-mode)
;; Editorconfig makes indentation weird in Lisp modes, so we disable it. It
;; still applies other project settings (e.g. tabs vs spaces) though.
(set! :editorconfig :remove 'emacs-lisp-mode)
(set! :editorconfig :remove 'lisp-mode)
2017-06-19 18:41:30 +08:00
(defvar whitespace-style)
(defun doom|editorconfig-whitespace-mode-maybe (&rest _)
"Show whitespace-mode when file uses TABS (ew)."
2017-06-15 20:24:54 +08:00
(when indent-tabs-mode
(let ((whitespace-style '(face tabs tab-mark trailing-lines tail)))
(whitespace-mode +1))))
(add-hook 'editorconfig-custom-hooks #'doom|editorconfig-whitespace-mode-maybe))
2017-06-15 20:24:18 +08:00
(def-package! editorconfig-conf-mode
:mode "\\.?editorconfig$")
2017-02-01 08:50:46 +08:00
;; Auto-close delimiters and blocks as you type
(def-package! smartparens
:demand t
2017-01-17 12:15:48 +08:00
:init
2017-03-05 09:54:13 +08:00
(setq sp-autowrap-region nil ; let evil-surround handle this
2017-01-17 12:15:48 +08:00
sp-highlight-pair-overlay nil
sp-cancel-autoskip-on-backward-movement nil
sp-show-pair-delay 0
sp-max-pair-length 3)
2015-06-06 18:40:33 +08:00
2017-01-17 12:15:48 +08:00
:config
(add-hook 'doom-init-hook #'smartparens-global-mode)
2017-01-17 12:15:48 +08:00
(require 'smartparens-config)
;; Smartparens interferes with Replace mode
(add-hook 'evil-replace-state-entry-hook #'turn-off-smartparens-mode)
(add-hook 'evil-replace-state-exit-hook #'turn-on-smartparens-mode)
2017-01-17 12:15:48 +08:00
;; Auto-close more conservatively
2017-06-16 08:06:21 +08:00
(let ((unless-list '(sp-point-before-word-p
sp-point-after-word-p
sp-point-before-same-p)))
(sp-pair "'" nil :unless unless-list)
(sp-pair "\"" nil :unless unless-list))
2017-01-17 12:15:48 +08:00
(sp-pair "{" nil :post-handlers '(("||\n[i]" "RET") ("| " " "))
:unless '(sp-point-before-word-p sp-point-before-same-p))
(sp-pair "(" nil :post-handlers '(("||\n[i]" "RET") ("| " " "))
:unless '(sp-point-before-word-p sp-point-before-same-p))
(sp-pair "[" nil :post-handlers '(("| " " "))
:unless '(sp-point-before-word-p sp-point-before-same-p))
2016-01-31 10:16:10 +08:00
2017-06-16 08:06:21 +08:00
(sp-local-pair 'css-mode "/*" "*/"
:post-handlers '(("[d-3]||\n[i]" "RET") ("| " "SPC")))
2017-01-17 12:15:48 +08:00
(sp-local-pair '(sh-mode markdown-mode) "`" nil
2017-06-16 08:06:21 +08:00
:unless '(sp-point-before-word-p sp-point-before-same-p))
(sp-local-pair '(xml-mode nxml-mode php-mode) "<!--" "-->"
:post-handlers '(("| " "SPC"))))
2016-03-23 23:59:06 +08:00
;; Branching & persistent undo
(def-package! undo-tree
:demand t
:config
2017-06-16 08:06:21 +08:00
(setq undo-tree-auto-save-history t
undo-tree-history-directory-alist
(list (cons "." (concat doom-cache-dir "undo-tree-hist/"))))
2017-06-20 22:19:40 +08:00
2017-06-16 08:06:21 +08:00
(defun doom*silence-undo-tree-load (orig-fn &rest args)
"Silence undo-tree load errors."
(quiet! (apply orig-fn args)))
2017-06-16 08:06:21 +08:00
(advice-add #'undo-tree-load-history-hook :around #'doom*silence-undo-tree-load))
2016-03-04 04:04:14 +08:00
;;
2017-01-17 12:15:48 +08:00
;; Autoloaded Plugins
2016-03-04 04:04:14 +08:00
;;
2015-06-06 18:40:33 +08:00
(def-package! ace-link
2017-02-20 07:11:28 +08:00
:commands (ace-link-help ace-link-org))
2017-01-17 12:15:48 +08:00
(def-package! ace-window
:commands (ace-window ace-swap-window ace-delete-window
ace-select-window ace-delete-other-windows)
2017-02-20 07:11:28 +08:00
:config
(setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l)
aw-scope 'frame
aw-background t))
2015-06-06 18:40:33 +08:00
(def-package! avy
2016-04-17 09:27:59 +08:00
:commands (avy-goto-char-2 avy-goto-line)
2017-02-20 07:11:28 +08:00
:config
(setq avy-all-windows nil
avy-background t))
2016-04-17 09:27:59 +08:00
(def-package! command-log-mode
:commands (command-log-mode global-command-log-mode)
:config
(set! :popup "*command-log*" :size 40 :align 'right :noselect t)
(setq command-log-mode-auto-show t
command-log-mode-open-log-turns-on-mode t))
2016-06-09 09:08:19 +08:00
(def-package! expand-region
2017-02-20 07:11:28 +08:00
:commands (er/expand-region er/contract-region er/mark-symbol er/mark-word))
2015-06-06 18:40:33 +08:00
(def-package! help-fns+ ; Improved help commands
2016-10-03 05:21:47 +08:00
:commands (describe-buffer describe-command describe-file
describe-keymap describe-option describe-option-of-type))
(def-package! imenu-anywhere
2017-01-17 12:15:48 +08:00
:commands (ido-imenu-anywhere ivy-imenu-anywhere helm-imenu-anywhere))
(def-package! imenu-list :commands imenu-list-minor-mode)
2017-01-17 12:15:48 +08:00
(def-package! pcre2el :commands rxt-quote-pcre)
2017-01-17 12:15:48 +08:00
(def-package! smart-forward
:commands (smart-up smart-down smart-backward smart-forward))
2015-06-06 18:40:33 +08:00
(def-package! wgrep
2016-06-13 14:11:33 +08:00
:commands (wgrep-setup wgrep-change-to-wgrep-mode)
:config
2017-05-18 00:23:17 +08:00
(setq wgrep-auto-save-buffer t))
2016-06-13 14:11:33 +08:00
2015-06-05 06:23:21 +08:00
(provide 'core-editor)
;;; core-editor.el ends here