doomemacs/core/core-editor.el

240 lines
8.5 KiB
EmacsLisp
Raw Normal View History

2017-01-17 12:15:48 +08:00
;;; core-editor.el --- filling the editor shaped hole in the Emacs OS
(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
;; 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
;; 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
tabify-regexp "^\t* [ \t]+" ; for :retab
whitespace-line-column fill-column
whitespace-style
'(face tabs tab-mark trailing lines-tail)
whitespace-display-mappings
'((tab-mark ?\t [? ?\t]) (newline-mark 10 [36 10]))
;; Wrapping
truncate-lines t
truncate-partial-width-windows 50
visual-fill-column-center-text nil
2017-02-21 09:41:30 +08:00
word-wrap t
vc-follow-symlinks t)
2017-02-01 08:50:46 +08:00
;; Save point across sessions
(require 'saveplace)
(setq save-place-file (concat doom-cache-dir "saveplace"))
2017-02-21 13:47:34 +08:00
(save-place-mode +1)
2017-02-01 08:50:46 +08:00
;; Save history across sessions
(require 'savehist)
(setq savehist-file (concat doom-cache-dir "savehist")
savehist-save-minibuffer-history t
savehist-autosave-interval nil ; save on kill only
savehist-additional-variables '(kill-ring search-ring regexp-search-ring))
(savehist-mode 1)
2017-02-01 08:50:46 +08:00
;; Branching & persistent undo
(require 'undo-tree)
(setq undo-tree-auto-save-history t
undo-tree-history-directory-alist (list (cons "." (concat doom-cache-dir "undo-tree-hist/"))))
;; Keep track of recently opened files
(require 'recentf)
(setq recentf-save-file (concat doom-cache-dir "recentf")
2017-03-28 01:05:30 +08:00
recentf-exclude (list "/tmp/" "/ssh:" "\\.?ido\\.last$" "\\.revive$" "/TAGS$"
"^/var/folders/.+$" doom-local-dir)
recentf-max-menu-items 0
recentf-max-saved-items 250
recentf-filename-handlers '(abbreviate-file-name))
(quiet! (recentf-mode 1))
2017-02-01 08:50:46 +08:00
;; Ediff: use existing frame instead of creating a new one
(add-hook! ediff-load
(setq ediff-diff-options "-w"
ediff-split-window-function #'split-window-horizontally
ediff-window-setup-function #'ediff-setup-windows-plain)) ; no extra frames
2017-02-01 08:50:46 +08:00
;; revert buffers for changed files
(global-auto-revert-mode 1)
(setq auto-revert-verbose nil)
2017-01-17 12:15:48 +08:00
;; don't kill scratch buffers
(defun doom|dont-kill-scratch-buffer ()
(or (not (eq (buffer-name) "*scratch*"))
(ignore (bury-buffer))))
(add-hook 'kill-buffer-query-functions #'doom|dont-kill-scratch-buffer)
;; enabled by default in Emacs 25+. No thanks.
(electric-indent-mode -1)
(defun doom*delete-trailing-whitespace (orig-fn &rest args)
"Don't affect trailing whitespace on current line."
(let ((spaces (1- (current-column)))
(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. 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
;;
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
2016-05-21 07:08:02 +08:00
:mode ("\\.?editorconfig$" . editorconfig-conf-mode)
2017-03-02 08:16:22 +08:00
:init
(def-setting! :editorconfig (action value)
`(after! editorconfig
,(cond ((eq action :add)
`(push ',value editorconfig-indentation-alist))
((eq action :remove)
(unless (symbolp value)
(error "%s is not a valid major-mode in editorconfig-indentation-alist" value))
`(setq editorconfig-indentation-alist
(delq (assq ',value editorconfig-indentation-alist)
editorconfig-indentation-alist)))
(t (error "%s is an invalid action for :editorconfig" action)))))
:config
(editorconfig-mode +1)
2016-05-21 07:08:02 +08:00
;; Show whitespace in tabs indentation mode
(add-hook! 'editorconfig-custom-hooks
(if indent-tabs-mode (whitespace-mode +1))))
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
(smartparens-global-mode 1)
(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
(sp-pair "'" nil :unless '(sp-point-before-word-p sp-point-after-word-p sp-point-before-same-p))
2017-01-17 12:15:48 +08:00
(sp-pair "\"" nil :unless '(sp-point-before-word-p sp-point-after-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 '(("||\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-01-17 12:15:48 +08:00
(sp-local-pair
'css-mode "/*" "*/" :post-handlers '(("[d-3]||\n[i]" "RET") ("| " "SPC")))
(sp-local-pair '(sh-mode markdown-mode) "`" nil
: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
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! goto-last-change :commands goto-last-change)
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
(setq wgrep-auto-save-buffer t)
(advice-add #'wgrep-abort-changes :after #'doom/popup-close)
(advice-add #'wgrep-finish-edit :after #'doom/popup-close))
2016-06-13 14:11:33 +08:00
2015-06-05 06:23:21 +08:00
(provide 'core-editor)
;;; core-editor.el ends here