This repository has been archived on 2024-10-22. You can view files and clone it, but cannot push or open issues or pull requests.
spacemacs/core/core-spacemacs.el

239 lines
9.8 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-keybindings)
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.")
(defvar spacemacs--default-mode-line mode-line-format
"Backup of default mode line format.")
(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))
(setq initial-buffer-choice (lambda () (get-buffer spacemacs-buffer-name)))
(spacemacs-buffer/set-mode-line "")
;; no welcome buffer
(setq inhibit-startup-screen t)
;; silence ad-handle-definition about advised functions getting redefined
(setq ad-redefinition-action 'accept)
;; default theme
(let ((default-theme (car dotspacemacs-themes)))
(spacemacs/load-theme default-theme)
;; protect used themes from deletion as orphans
(setq configuration-layer--protected-packages
(append
(delq nil (mapcar 'spacemacs//get-theme-package
dotspacemacs-themes))
configuration-layer--protected-packages))
(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-protected-package 'dash t)
(spacemacs/load-or-install-protected-package 's t)
;; bind-key is required by use-package
(spacemacs/load-or-install-protected-package 'bind-key t)
(spacemacs/load-or-install-protected-package 'use-package t)
(setq use-package-verbose init-file-debug)
;; package-build is required by quelpa
(spacemacs/load-or-install-protected-package 'package-build t)
(setq quelpa-verbose init-file-debug
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-protected-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-protected-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)
(spacemacs/load-or-install-protected-package 'evil t)
(spacemacs/load-or-install-protected-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))
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 '(16)))))
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))
(if configuration-layer-error-count
(spacemacs-buffer/set-mode-line
(format (concat "%s error(s) at startup! "
"Spacemacs may not be able to operate properly.")
configuration-layer-error-count))
(spacemacs-buffer/set-mode-line spacemacs--default-mode-line))
(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"
2015-09-12 09:02:50 +00:00
"- Distribution: %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)
2015-09-12 09:02:50 +00:00
dotspacemacs-distribution
(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)