238 lines
9.7 KiB
EmacsLisp
238 lines
9.7 KiB
EmacsLisp
;;; 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
|
|
(setq message-log-max 16384)
|
|
(defconst emacs-start-time (current-time))
|
|
|
|
(require 'subr-x nil 'noerror)
|
|
(require 'core-dotspacemacs)
|
|
(require 'core-emacs-backports)
|
|
(require 'core-release-management)
|
|
(require 'core-auto-completion)
|
|
(require 'core-themes-support)
|
|
(require 'core-fonts-support)
|
|
(require 'core-spacemacs-buffer)
|
|
(require 'core-keybindings)
|
|
(require 'core-toggle)
|
|
(require 'core-micro-state)
|
|
(require 'core-use-package-ext)
|
|
|
|
(defgroup spacemacs nil
|
|
"Spacemacs customizations."
|
|
:group 'starter-kit
|
|
:prefix 'spacemacs-)
|
|
|
|
;; loading progress bar variables
|
|
(defvar spacemacs-loading-char ?█)
|
|
(defvar spacemacs-loading-string "")
|
|
(defvar spacemacs-loading-counter 0)
|
|
;; (defvar spacemacs-loading-text "Loading")
|
|
;; (defvar spacemacs-loading-done-text "Ready!")
|
|
(defvar spacemacs-loading-dots-chunk-count 3)
|
|
(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 (kbd "<tab>") 'widget-forward)
|
|
(define-key map (kbd "<return>") 'widget-button-press)
|
|
(define-key map [backtab] 'widget-backward)
|
|
(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>
|
|
"
|
|
:group 'spacemacs
|
|
:syntax-table nil
|
|
:abbrev-table nil
|
|
(setq truncate-lines t)
|
|
;; 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)
|
|
;; TODO move evil-want-C-u-scroll when evil is removed from the bootstrapped
|
|
;; packages.
|
|
(setq-default evil-want-C-u-scroll t)
|
|
(dotspacemacs/load-file)
|
|
(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)
|
|
;; 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.")))
|
|
;; initialize the configuration layer system
|
|
(require 'core-configuration-layer)
|
|
(configuration-layer/initialize)
|
|
;; 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)))
|
|
;; font
|
|
(if (find-font (font-spec :name (car dotspacemacs-default-font)))
|
|
(spacemacs/set-default-font dotspacemacs-default-font)
|
|
(spacemacs-buffer/warning "Cannot find font \"%s\"!"
|
|
(car dotspacemacs-default-font)))
|
|
;; banner
|
|
(spacemacs-buffer/insert-banner-and-buttons)
|
|
;; mandatory dependencies
|
|
;; 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)
|
|
(spacemacs/load-or-install-protected-package 'bind-map 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
|
|
(setq use-package-inject-hooks t)
|
|
;; which-key
|
|
(spacemacs/load-or-install-protected-package 'which-key t)
|
|
;; evil 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)
|
|
(require 'core-keybindings)
|
|
;; check for new version
|
|
(if dotspacemacs-mode-line-unicode-symbols
|
|
(setq-default spacemacs-version-check-lighter "[⇪]"))
|
|
(spacemacs/set-new-version-lighter-mode-line-faces)
|
|
(add-hook 'emacs-startup-hook 'spacemacs-buffer/goto-link-line)
|
|
(spacemacs-mode))
|
|
|
|
(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")
|
|
(spacemacs//redisplay)
|
|
(when (dotspacemacs/install 'with-wizard)
|
|
(dotspacemacs/sync-configuration-layers '(16)))))
|
|
|
|
(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
|
|
(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"
|
|
"- 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)
|
|
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)
|