spacemacs/core/core-spacemacs.el

276 lines
12 KiB
EmacsLisp
Raw Normal View History

;;; core-spacemacs.el --- Spacemacs Core File
;;
;; Copyright (c) 2012-2014 Sylvain Benner
;; Copyright (c) 2014-2015 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3
2014-09-24 00:47:20 +00:00
(setq message-log-max 16384)
(defconst emacs-start-time (current-time))
(require 'subr-x nil 'noerror)
2015-01-27 03:51:47 +00:00
(require 'core-emacs-backports)
(require 'core-release-management)
2015-04-11 19:10:21 +00:00
(require 'core-auto-completion)
2015-01-27 03:51:47 +00:00
(require 'core-themes-support)
(require 'core-fonts-support)
(require 'core-spacemacs-buffer)
(require 'core-toggle)
(require 'core-micro-state)
(require 'core-use-package-ext)
(require 'core-evilify-keymap)
2015-01-08 05:34:23 +00:00
(defgroup spacemacs nil
"Spacemacs customizations."
:group 'starter-kit
:prefix 'spacemacs-)
;; loading progress bar variables
2015-03-12 03:46:37 +00:00
(defvar spacemacs-loading-char ?█)
(defvar spacemacs-loading-string "")
(defvar spacemacs-loading-counter 0)
2015-03-12 03:46:37 +00:00
;; (defvar spacemacs-loading-text "Loading")
;; (defvar spacemacs-loading-done-text "Ready!")
(defvar spacemacs-loading-dots-chunk-count 3)
2015-03-12 03:46:37 +00:00
(defvar spacemacs-loading-dots-count (window-total-size nil 'width))
(defvar spacemacs-loading-dots-chunk-size
(/ spacemacs-loading-dots-count spacemacs-loading-dots-chunk-count))
(defvar spacemacs-loading-dots-chunk-threshold 0)
(defvar spacemacs-mode-map
(let ((map (make-sparse-keymap)))
(define-key map [tab] 'widget-forward)
(define-key map (kbd "C-i") 'widget-forward)
(define-key map [backtab] 'widget-backward)
(define-key map (kbd "RET") 'widget-button-press)
(define-key map [down-mouse-1] 'widget-button-click)
map)
"Keymap for spacemacs mode.")
(define-derived-mode spacemacs-mode special-mode "Spacemacs"
"Spacemacs major mode for startup screen.
\\<spacemacs-mode-map>
"
2015-03-01 17:49:39 +00:00
:group 'spacemacs
2014-09-10 03:12:31 +00:00
:syntax-table nil
:abbrev-table nil
(setq truncate-lines t)
;; needed to make tab work correctly in terminal
(evil-define-key 'motion spacemacs-mode-map (kbd "C-i") 'widget-forward)
;; motion state since this is a special mode
(add-to-list 'evil-motion-state-modes 'spacemacs-mode))
(defun spacemacs/init ()
"Create the special buffer for `spacemacs-mode' and perform startup
initialization."
;; explicitly set the prefered coding systems to avoid annoying prompt
;; from emacs (especially on Microsoft Windows)
(prefer-coding-system 'utf-8)
;; dotfile init
(dotspacemacs/load-file)
;; TODO remove evil-want-C-u-scroll and document it, we should not
;; shadow the universal argument
(setq-default evil-want-C-u-scroll t)
(dotspacemacs|call-func dotspacemacs/init "Calling dotfile init...")
(dotspacemacs|call-func dotspacemacs/user-init "Calling dotfile user init...")
;; spacemacs init
(switch-to-buffer (get-buffer-create spacemacs-buffer-name))
(spacemacs-buffer/set-mode-line "")
;; no welcome buffer
(setq inhibit-startup-screen t)
;; default theme
(let ((default-theme (car dotspacemacs-themes)))
(spacemacs/load-theme default-theme)
;; used to prevent automatic deletion of used packages
(setq spacemacs-used-theme-packages
(delq nil (mapcar 'spacemacs//get-theme-package
dotspacemacs-themes)))
(setq-default spacemacs--cur-theme default-theme)
(setq-default spacemacs--cycle-themes (cdr dotspacemacs-themes)))
;; removes the GUI elements
(when (and (fboundp 'tool-bar-mode) (not (eq tool-bar-mode -1)))
(tool-bar-mode -1))
(when (and (fboundp 'scroll-bar-mode) (not (eq scroll-bar-mode -1)))
(scroll-bar-mode -1))
;; tooltips in echo-aera
(when (and (fboundp 'tooltip-mode) (not (eq tooltip-mode -1)))
(tooltip-mode -1))
(unless (eq window-system 'mac)
(when (and (fboundp 'menu-bar-mode) (not (eq menu-bar-mode -1)))
(menu-bar-mode -1)))
;; for convenience and user support
(unless (fboundp 'tool-bar-mode)
(spacemacs-buffer/message (concat "No graphical support detected, you won't be"
"able to launch a graphical instance of Emacs"
"with this build.")))
2014-11-28 05:07:29 +00:00
;; font
2015-01-30 02:19:37 +00:00
(if (find-font (font-spec :name (car dotspacemacs-default-font)))
(spacemacs/set-default-font dotspacemacs-default-font)
2015-04-12 16:25:53 +00:00
(spacemacs-buffer/warning "Cannot find font \"%s\"!"
(car dotspacemacs-default-font)))
2014-12-12 16:53:19 +00:00
;; banner
(spacemacs-buffer/insert-banner-and-buttons)
2015-07-24 04:08:43 +00:00
;; mandatory dependencies
2015-02-06 04:20:14 +00:00
;; dash is required to prevent a package.el bug with f on 24.3.1
(spacemacs/load-or-install-package 'dash t)
2015-07-24 04:08:43 +00:00
(spacemacs/load-or-install-package 's t)
;; bind-key is required by use-package
(spacemacs/load-or-install-package 'bind-key t)
(spacemacs/load-or-install-package 'use-package t)
(setq use-package-verbose dotspacemacs-verbose-loading)
;; package-build is required by quelpa
(spacemacs/load-or-install-package 'package-build t)
(setq quelpa-verbose dotspacemacs-verbose-loading
quelpa-dir (concat spacemacs-cache-directory "quelpa/")
quelpa-build-dir (expand-file-name "build" quelpa-dir)
quelpa-persistent-cache-file (expand-file-name "cache" quelpa-dir)
quelpa-update-melpa-p nil)
(spacemacs/load-or-install-package 'quelpa t)
;; inject use-package hooks for easy customization of
;; stock package configuration
2015-05-21 02:39:14 +00:00
(setq use-package-inject-hooks t)
2015-07-24 04:08:43 +00:00
;; which-key
(spacemacs/load-or-install-package 'which-key t)
;; evil and evil-leader must be installed at the beginning of the
;; boot sequence.
;; Use C-u as scroll-up (must be set before actually loading evil)
2014-12-12 16:53:19 +00:00
(spacemacs/load-or-install-package 'evil t)
(spacemacs/load-or-install-package 'evil-leader t)
2015-08-12 05:31:44 +00:00
(require 'core-evilified-state)
2015-01-08 05:34:23 +00:00
;; check for new version
(if dotspacemacs-mode-line-unicode-symbols
(setq-default spacemacs-version-check-lighter "[⇪]"))
2015-01-08 05:34:23 +00:00
(spacemacs/set-new-version-lighter-mode-line-faces)
(add-hook 'emacs-startup-hook 'spacemacs-buffer/goto-link-line)
(spacemacs-mode))
(defun spacemacs//get-package-directory (pkg)
"Return the directory of PKG. Return nil if not found."
(let ((elpa-dir (concat user-emacs-directory "elpa/")))
(when (file-exists-p elpa-dir)
(let ((dir (reduce (lambda (x y) (if x x y))
(mapcar (lambda (x)
(when (string-match
(concat "/"
(symbol-name pkg)
"-[0-9]+") x) x))
(directory-files elpa-dir 'full))
:initial-value nil)))
(when dir (file-name-as-directory dir))))))
(defun spacemacs/load-or-install-package (pkg &optional log file-to-load)
2014-12-12 16:53:19 +00:00
"Load PKG package. PKG will be installed if it is not already installed.
Whenever the initial require fails the absolute path to the package
directory is returned.
If LOG is non-nil a message is displayed in spacemacs-mode buffer.
FILE-TO-LOAD is an explicit file to load after the installation."
2015-08-09 04:29:02 +00:00
(let ((warning-minimum-level :error))
(condition-case nil
(require pkg)
(error
;; not installed, we try to initialize package.el only if required to
;; precious seconds during boot time
(require 'cl)
(let ((pkg-elpa-dir (spacemacs//get-package-directory pkg)))
(if pkg-elpa-dir
(add-to-list 'load-path pkg-elpa-dir)
;; install the package
(when log
(spacemacs-buffer/append
(format "(Bootstrap) Installing %s...\n" pkg))
(spacemacs//redisplay))
(package-refresh-contents)
(package-install pkg)
(setq pkg-elpa-dir (spacemacs//get-package-directory pkg)))
(require pkg nil 'noerror)
(when file-to-load
(load-file (concat pkg-elpa-dir file-to-load)))
pkg-elpa-dir)))))
2015-03-31 03:16:33 +00:00
(defun spacemacs/maybe-install-dotfile ()
"Install the dotfile if it does not exist."
(unless (file-exists-p dotspacemacs-filepath)
(spacemacs-buffer/set-mode-line "Dotfile wizard installer")
2015-03-31 03:16:33 +00:00
(spacemacs//redisplay)
(when (dotspacemacs/install 'with-wizard)
(dotspacemacs/sync-configuration-layers)
(spacemacs-buffer/append
2015-04-17 15:05:54 +00:00
"The dotfile has been installed.\n"))))
2015-03-31 03:16:33 +00:00
(defun spacemacs/display-and-copy-version ()
"Echo the current spacemacs version and copy it."
(interactive)
(let ((msg (format "Spacemacs v.%s" spacemacs-version)))
(message msg) (kill-new msg)))
(defun display-startup-echo-area-message ()
"Change the default welcome message of minibuffer to another one."
(message "Spacemacs is ready."))
(defun spacemacs/setup-startup-hook ()
"Add post init processing."
(add-hook
'emacs-startup-hook
(lambda ()
;; Ultimate configuration decisions are given to the user who can defined
;; them in his/her ~/.spacemacs file
;; TODO remove support for dotspacemacs/config in 0.105
(if (fboundp 'dotspacemacs/user-config)
(dotspacemacs|call-func dotspacemacs/user-config
"Calling dotfile user config...")
(spacemacs-buffer/warning (concat "`dotspacemacs/config' is deprecated, "
"please rename your function to "
"`dotspacemacs/user-config'"))
(dotspacemacs|call-func dotspacemacs/config
"Calling dotfile user config..."))
;; from jwiegley
;; https://github.com/jwiegley/dot-emacs/blob/master/init.el
(let ((elapsed (float-time
(time-subtract (current-time) emacs-start-time))))
(spacemacs-buffer/append
2015-04-13 06:17:48 +00:00
(format "\n[%s packages loaded in %.3fs]\n"
(configuration-layer/configured-packages-count)
elapsed)))
;; Display useful lists of items
(when dotspacemacs-startup-lists
(spacemacs-buffer/insert-startupify-lists))
(when configuration-layer-error-count
;; ("%e" mode-line-front-space mode-line-mule-info mode-line-client mode-line-modified mode-line-remote mode-line-frame-identification mode-line-buffer-identification " " mode-line-position evil-mode-line-tag
;; (vc-mode vc-mode)
;; " " mode-line-modes mode-line-misc-info mode-line-end-spaces
(spacemacs-buffer/set-mode-line
(format (concat "%s error(s) at startup! "
"Spacemacs may not be able to operate properly.")
configuration-layer-error-count))
(force-mode-line-update))
(spacemacs/check-for-new-version spacemacs-version-check-interval))))
(defun spacemacs/describe-system-info ()
"Gathers info about your Spacemacs setup and copies to clipboard."
(interactive)
(let ((sysinfo (format
(concat "#### System Info\n"
"- OS: %s\n"
"- Emacs: %s\n"
"- Spacemacs: %s\n"
"- Spacemacs branch: %s (rev. %s)\n"
"- Layers:\n```elisp\n%s```\n")
system-type
emacs-version
spacemacs-version
(spacemacs/git-get-current-branch)
(spacemacs/git-get-current-branch-rev)
(pp dotspacemacs-configuration-layers))))
(kill-new sysinfo)
(message sysinfo)
(message (concat "Information has been copied to clipboard.\n"
"You can paste it in the gitter chat.\n"
"Check the *Messages* buffer if you need to review it"))))
(provide 'core-spacemacs)