doomemacs/core/core.el

241 lines
9.2 KiB
EmacsLisp
Raw Normal View History

2015-06-06 06:40:33 -04:00
;;; core.el --- The heart of the beast
2015-06-04 18:23:21 -04:00
;;
2015-06-06 06:40:33 -04:00
;;; Naming conventions:
2015-06-04 18:23:21 -04:00
;;
2016-05-20 22:37:30 -04:00
;; doom-... A public variable/constant or function
;; doom--... An internal variable or function (non-interactive)
;; doom/... An autoloaded interactive function
;; doom:... An ex command
;; doom|... A hook
;; doom*... An advising function
;; doom.... Custom prefix commands
2016-05-24 22:15:44 -04:00
;; ...! Macro, shortcut alias or subst defun
2015-06-04 18:23:21 -04:00
;;
;;; Autoloaded functions are in {core,modules}/defuns/defuns-*.el
2015-06-04 18:23:21 -04:00
;; Premature optimization for faster startup
(setq-default gc-cons-threshold 339430400
gc-cons-percentage 0.6)
(defalias '! 'eval-when-compile)
(defconst doom-emacs-dir (! (expand-file-name user-emacs-directory)))
(defconst doom-core-dir (! (expand-file-name "core" doom-emacs-dir)))
(defconst doom-modules-dir (! (expand-file-name "modules" doom-emacs-dir)))
(defconst doom-private-dir (! (expand-file-name "private" doom-emacs-dir)))
(defconst doom-packages-dir (! (expand-file-name (concat ".cask/" emacs-version "/elpa") doom-emacs-dir)))
(defconst doom-ext-dir (! (expand-file-name "ext" doom-emacs-dir)))
2016-05-28 22:33:20 -04:00
(defconst doom-themes-dir (! (expand-file-name "themes" doom-private-dir)))
(defconst doom-temp-dir
2016-06-06 23:48:26 -04:00
(! (format "%s/cache/%s" doom-private-dir (system-name)))
"Hostname-based elisp temp directories")
;; window-system is deprecated. Not on my watch!
(unless (boundp 'window-system)
(defvar window-system (framep-on-display)))
2016-05-26 18:51:39 -04:00
2016-06-17 15:41:53 -04:00
;;
(defvar doom-leader "," "Prefix for <leader> bindings")
(defvar doom-localleader "\\" "Prefix for <localleader> bindings")
(defvar doom-unreal-buffers
'("^ ?\\*.+" image-mode dired-mode reb-mode messages-buffer-mode
tabulated-list-mode comint-mode magit-mode)
"A list of regexps or modes whose buffers are considered unreal, and will be
ignored when using `doom:next-real-buffer' and `doom:previous-real-buffer' (or
killed by `doom/kill-unreal-buffers', or after `doom/kill-real-buffer').")
(defvar doom-cleanup-processes-alist
'(("pry" . ruby-mode)
("irb" . ruby-mode)
("ipython" . python-mode))
"An alist of (process-name . major-mode), that `doom:cleanup-processes' checks
before killing processes. If there are no buffers with matching major-modes, it
gets killed.")
(defvar doom-project-root-files
'(".git" ".hg" ".svn" "rebar.config" "project.clj" "SConstruct" "pom.xml"
"build.sbt" "build.gradle" "Gemfile" "requirements.txt" "package.json"
"gulpfile.js" "Gruntfile.js" "bower.json" "composer.json" "Cargo.toml"
"mix.exs" "tsconfig.json")
"A list of files that count as 'project files', which determine whether a
folder is the root of a project or not.")
(defvar doom-unicode-font
(font-spec :family "DejaVu Sans Mono" :size 13)
"Font to fall back to for unicode glyphs.")
2016-05-26 18:51:39 -04:00
;;
;; Load path
;;
(defvar doom--load-path load-path
"Initial `load-path'; so we don't clobber it on consecutive reloads.")
2016-05-28 22:33:20 -04:00
(defsubst --subdirs (path &optional include-self)
(let ((result (if include-self (list path) (list))))
(mapc (lambda (file)
(when (file-directory-p file)
(push file result)))
(ignore-errors (directory-files path t "^[^.]" t)))
result))
2016-05-26 18:51:39 -04:00
;; Populate the load-path manually; cask shouldn't be an internal dependency
(setq load-path
2016-05-28 22:33:20 -04:00
(! (append (list doom-private-dir)
2016-05-26 18:51:39 -04:00
(--subdirs doom-core-dir t)
(--subdirs doom-modules-dir t)
(--subdirs doom-packages-dir)
(--subdirs (expand-file-name "../bootstrap" doom-packages-dir))
2016-05-28 22:33:20 -04:00
(--subdirs doom-themes-dir t)
2016-05-26 18:51:39 -04:00
doom--load-path))
custom-theme-load-path
2016-05-28 22:33:20 -04:00
(! (append (--subdirs doom-themes-dir t)
2016-05-26 18:51:39 -04:00
custom-theme-load-path)))
;;
;; Core configuration
;;
2016-03-03 15:04:14 -05:00
;; UTF-8 please
2016-05-21 23:12:50 -04:00
(set-charset-priority 'unicode)
(setq locale-coding-system 'utf-8) ; pretty
(set-terminal-coding-system 'utf-8) ; pretty
(set-keyboard-coding-system 'utf-8) ; pretty
(set-selection-coding-system 'utf-8) ; please
(prefer-coding-system 'utf-8) ; with sugar on top
2016-03-10 23:54:56 -05:00
(setq default-process-coding-system '(utf-8-unix . utf-8-unix))
;; Stop package.el from being annoying. I rely solely on Cask.
(setq-default
package--init-file-ensured t
package-user-dir doom-packages-dir
package-enable-at-startup nil
package-archives
'(("gnu" . "http://elpa.gnu.org/packages/")
("melpa" . "http://melpa.org/packages/")
("org" . "http://orgmode.org/elpa/")))
;; Core settings
(setq byte-compile-warnings nil
ad-redefinition-action 'accept ; silence the advised function warnings
2016-06-06 19:42:00 -04:00
apropos-do-all t
compilation-always-kill t ; kill compl. process before spawning another
compilation-ask-about-save nil ; save all buffers before compiling
compilation-scroll-output t ; scroll with output while compiling
confirm-nonexistent-file-or-buffer t
delete-by-moving-to-trash t
echo-keystrokes 0.02 ; show me what I type
ediff-diff-options "-w"
ediff-split-window-function 'split-window-horizontally ; side-by-side diffs
ediff-window-setup-function 'ediff-setup-windows-plain ; no extra frames
enable-recursive-minibuffers nil ; no minibufferception
idle-update-delay 5 ; update a little less often
major-mode 'text-mode
ring-bell-function 'ignore ; silence of the bells!
save-interprogram-paste-before-kill nil
sentence-end-double-space nil
;; http://ergoemacs.org/emacs/emacs_stop_cursor_enter_prompt.html
minibuffer-prompt-properties
'(read-only t point-entered minibuffer-avoid-prompt face minibuffer-prompt)
;; persistent bookmarks
bookmark-save-flag t
bookmark-default-file (concat doom-temp-dir "/bookmarks")
;; Disable backups (that's what git/dropbox are for)
history-length 1000
vc-make-backup-files nil
auto-save-default nil
auto-save-list-file-name (concat doom-temp-dir "/autosave")
make-backup-files nil
create-lockfiles nil
backup-directory-alist `((".*" . ,(concat doom-temp-dir "/backup/")))
;; Remember undo history
undo-tree-auto-save-history nil
undo-tree-history-directory-alist `(("." . ,(concat doom-temp-dir "/undo/"))))
2015-09-30 13:47:57 -04:00
2016-03-03 15:04:14 -05:00
;;
2016-05-26 18:51:39 -04:00
;; Bootstrap
;;
2016-05-26 18:51:39 -04:00
(autoload 'use-package "use-package" "" nil 'macro)
(require 'f)
(require 'core-defuns)
(unless (require 'autoloads nil t)
(doom-reload-autoloads)
(unless (require 'autoloads nil t)
(error "Autoloads weren't generated! Run `make autoloads`")))
2016-05-20 09:23:46 -04:00
2016-05-18 16:58:07 -04:00
(use-package anaphora
:commands (awhen aif acond awhile))
(use-package persistent-soft
:commands (persistent-soft-store
persistent-soft-fetch
persistent-soft-exists-p
persistent-soft-flush
persistent-soft-location-readable
2015-11-17 02:18:56 -05:00
persistent-soft-location-destroy)
2016-05-20 22:37:30 -04:00
:init (defvar pcache-directory (concat doom-temp-dir "/pcache/")))
(use-package async
:commands (async-start
async-start-process
async-get
async-wait
async-inject-variables))
2016-05-19 03:17:59 -04:00
(use-package json
:commands (json-read-from-string json-encode json-read-file))
(use-package help-fns+ ; Improved help commands
:commands (describe-buffer describe-command describe-file
describe-keymap describe-option describe-option-of-type))
2016-06-04 22:47:20 -04:00
(use-package smex
:commands (smex smex-major-mode-commands)
:config
(setq smex-completion-method 'ivy
smex-save-file (concat doom-temp-dir "/smex-items"))
(smex-initialize))
2016-05-19 03:17:59 -04:00
;;
;; Automatic minor modes
;;
2016-05-20 22:37:30 -04:00
(defvar doom-auto-minor-mode-alist '()
2016-05-19 03:17:59 -04:00
"Alist of filename patterns vs corresponding minor mode functions, see
`auto-mode-alist'. All elements of this alist are checked, meaning you can
enable multiple minor modes for the same regexp.")
2016-05-20 22:37:30 -04:00
(defun doom|enable-minor-mode-maybe ()
"Check file name against `doom-auto-minor-mode-alist'."
2016-05-19 03:17:59 -04:00
(when buffer-file-name
(let ((name buffer-file-name)
(remote-id (file-remote-p buffer-file-name))
2016-05-20 22:37:30 -04:00
(alist doom-auto-minor-mode-alist))
2016-05-19 03:17:59 -04:00
;; Remove backup-suffixes from file name.
(setq name (file-name-sans-versions name))
;; Remove remote file name identification.
(when (and (stringp remote-id)
(string-match-p (regexp-quote remote-id) name))
(setq name (substring name (match-end 0))))
(while (and alist (caar alist) (cdar alist))
(if (string-match (caar alist) name)
(funcall (cdar alist) 1))
(setq alist (cdr alist))))))
2016-05-20 22:37:30 -04:00
(add-hook 'find-file-hook 'doom|enable-minor-mode-maybe)
2016-05-19 03:17:59 -04:00
2016-05-21 23:12:50 -04:00
;;
(add-hook! emacs-startup
2016-05-20 09:23:46 -04:00
;; We add this to `after-init-hook' to allow errors to stop it
(defadvice save-buffers-kill-emacs (around no-query-kill-emacs activate)
"Prevent annoying \"Active processes exist\" query when you quit Emacs."
2016-05-21 23:12:50 -04:00
(cl-flet ((process-list ())) ad-do-it)))
2015-06-04 18:23:21 -04:00
(provide 'core)
;;; core.el ends here