[Emacs] Only install packages after use-package present
This commit is contained in:
parent
679fdb2b8f
commit
25033c1414
@ -72,175 +72,6 @@ file uses lexical scoping.
|
|||||||
;;; -*- lexical-binding: t -*-
|
;;; -*- lexical-binding: t -*-
|
||||||
(setq-default lexical-binding t)
|
(setq-default lexical-binding t)
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
** Setup auto-compile
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(when (boundp 'use-package)
|
|
||||||
(use-package auto-compile
|
|
||||||
:ensure t
|
|
||||||
:config
|
|
||||||
(progn
|
|
||||||
(auto-compile-on-load-mode)
|
|
||||||
(auto-compile-on-save-mode))))
|
|
||||||
#+END_SRC
|
|
||||||
** Prefer Newer Versions
|
|
||||||
To reduce the risk of loading outdated byte code files, we set
|
|
||||||
load-prefer-newer and enable auto-compile-on-load-mode as early as
|
|
||||||
possible.
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(setq load-prefer-newer t)
|
|
||||||
#+END_SRC
|
|
||||||
** Custom Files
|
|
||||||
The default value of ~custom-file~ is just the current user's ~.emacs.d/init.el~
|
|
||||||
file. Emacs will add content to ~custom-file~ whenever a variable is customized
|
|
||||||
or marked as safe. When init.el is version controlled, it is quite annoying to
|
|
||||||
have random machine-generated variable settings amended to it because those
|
|
||||||
changes are often not worth keeping permanently, so we set a different custom
|
|
||||||
file here to avoid this situation.
|
|
||||||
|
|
||||||
custom-before.el is loaded before the rest of init.el, while custom-after.el is
|
|
||||||
loaded afterwards. this-machine.el has customizations that should only apply to
|
|
||||||
the current machine. custom-before and custom-after are not version controlled
|
|
||||||
in the dotfiles repo but they are shared across machines elsewhere.
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(defvar machine-custom "~/.emacs.d/this-machine.el")
|
|
||||||
(defvar custom-after-file "~/.emacs.d/custom-after.el")
|
|
||||||
(setq custom-file "~/.emacs.d/custom-before.el")
|
|
||||||
(when (file-exists-p custom-file) (load custom-file))
|
|
||||||
#+END_SRC
|
|
||||||
** emit
|
|
||||||
*** TODO this needs to be done better, but it works for now
|
|
||||||
:LOGBOOK:
|
|
||||||
- State "TODO" from "TODO" [2016-09-13 Tue 17:49]
|
|
||||||
:END:
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(when (file-exists-p "~/.emacs.d/load.d/emit.el")
|
|
||||||
(load "~/.emacs.d/load.d/emit.el"))
|
|
||||||
#+END_SRC
|
|
||||||
** Benchmarking
|
|
||||||
This appears here so that it can accurately benchmark as much of
|
|
||||||
startup as possible.
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(defvar imalison:do-benchmark)
|
|
||||||
(when (and (boundp 'use-package)
|
|
||||||
(bound-and-true-p imalison:do-benchmark))
|
|
||||||
(use-package benchmark-init))
|
|
||||||
#+END_SRC
|
|
||||||
** GUI Disables
|
|
||||||
Death to any gui elements in emacs! Do this EARLY so that emacs
|
|
||||||
doesn't redisplay in a way that is visually unpleasant on startup a
|
|
||||||
bunch of times.
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(when (fboundp 'menu-bar-mode) (menu-bar-mode -1))
|
|
||||||
(when (fboundp 'tool-bar-mode) (tool-bar-mode -1))
|
|
||||||
(when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
|
|
||||||
#+END_SRC
|
|
||||||
Tooltips are annoying:
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(if (fboundp 'tooltip-mode) (tooltip-mode -1) (setq tooltip-use-echo-area t))'
|
|
||||||
#+END_SRC
|
|
||||||
** Byte-Compiler
|
|
||||||
These definitions silence the byte-compiler.
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(defvar grep-find-ignored-directories nil)
|
|
||||||
(defvar grep-find-ignored-files nil)
|
|
||||||
(defvar ido-context-switch-command nil)
|
|
||||||
(defvar ido-cur-item nil)
|
|
||||||
(defvar ido-cur-list nil)
|
|
||||||
(defvar ido-default-item nil)
|
|
||||||
(defvar inherit-input-method nil)
|
|
||||||
(defvar oauth--token-data nil)
|
|
||||||
(defvar tls-checktrust nil)
|
|
||||||
(defvar tls-program nil)
|
|
||||||
(defvar url-callback-arguments nil)
|
|
||||||
(defvar url-callback-function nil)
|
|
||||||
(defvar url-http-extra-headers nil)
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
;; This variable doesn't exist in old versions of org-mode
|
|
||||||
(defvar org-show-context-detail)
|
|
||||||
#+END_SRC
|
|
||||||
** exec-path-from-shell
|
|
||||||
Sets environment variables by starting a shell.
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
;; TODO: this does not seem to actually install exec-path-from-shell
|
|
||||||
(eval-and-compile
|
|
||||||
(when (fboundp 'use-package)
|
|
||||||
(use-package exec-path-from-shell
|
|
||||||
:config
|
|
||||||
(progn
|
|
||||||
;; For debugging
|
|
||||||
(when nil
|
|
||||||
(message "path: %s, setup: %s" (getenv "PATH")
|
|
||||||
(getenv "ENVIRONMENT_SETUP_DONE"))
|
|
||||||
(setq exec-path-from-shell-debug t))
|
|
||||||
(setq exec-path-from-shell-arguments (list "-l"))
|
|
||||||
(setq exec-path-from-shell-check-startup-files nil)
|
|
||||||
(add-to-list 'exec-path-from-shell-variables "SHELL")
|
|
||||||
(add-to-list 'exec-path-from-shell-variables "GOPATH")
|
|
||||||
(add-to-list 'exec-path-from-shell-variables "ENVIRONMENT_SETUP_DONE")
|
|
||||||
(add-to-list 'exec-path-from-shell-variables "PYTHONPATH")
|
|
||||||
(exec-path-from-shell-initialize)))))
|
|
||||||
#+END_SRC
|
|
||||||
** noflet
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(use-package noflet
|
|
||||||
:demand t)
|
|
||||||
#+END_SRC
|
|
||||||
** Non-Forking Shell Command To String
|
|
||||||
Emacs' built in ~shell-command-to-string~ function has the downside that it
|
|
||||||
forks a new shell process every time it is executed. This means that any shell
|
|
||||||
startup cost is incurred when this function is called.
|
|
||||||
|
|
||||||
The following implementation uses eshell's ~executable-find~ to find the
|
|
||||||
binary (which is the only reason ~shell-comand-to-string~ is typically used
|
|
||||||
anyway), but it avoids incurring any shell-startup cost.
|
|
||||||
|
|
||||||
This was originally inspired by [[https://github.com/bbatsov/projectile/issues/1044][this issue]].
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(defun imalison:call-process-to-string (program &rest args)
|
|
||||||
(with-temp-buffer
|
|
||||||
(apply 'call-process program nil (current-buffer) nil args)
|
|
||||||
(buffer-string)))
|
|
||||||
|
|
||||||
(defun imalison:get-call-process-args-from-shell-command (command)
|
|
||||||
(cl-destructuring-bind
|
|
||||||
(the-command . args) (split-string command " ")
|
|
||||||
(let ((binary-path (executable-find the-command)))
|
|
||||||
(when binary-path
|
|
||||||
(cons binary-path args)))))
|
|
||||||
|
|
||||||
(defun imalison:shell-command-to-string (command)
|
|
||||||
(let ((call-process-args
|
|
||||||
(imalison:get-call-process-args-from-shell-command command)))
|
|
||||||
(if call-process-args
|
|
||||||
(apply 'imalison:call-process-to-string call-process-args)
|
|
||||||
(shell-command-to-string command))))
|
|
||||||
#+END_SRC
|
|
||||||
This makes it so that we always try to call-process instead of shell-command-to-sting. It may cause undesireable behavior.
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
(defun imalison:try-call-process (command)
|
|
||||||
(let ((call-process-args
|
|
||||||
(imalison:get-call-process-args-from-shell-command command)))
|
|
||||||
(if call-process-args
|
|
||||||
(apply 'imalison:call-process-to-string call-process-args))))
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
This had to be disabled because it was causing a bunch of issues with projectile.
|
|
||||||
#+BEGIN_SRC emacs-lisp :tangle no
|
|
||||||
(advice-add 'shell-command-to-string :before-until 'imalison:try-call-process)
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
This solution only applies it to projectile-find-file
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
|
||||||
|
|
||||||
(defun imalison:call-with-quick-shell-command (fn &rest args)
|
|
||||||
(noflet ((shell-command-to-string (&rest args)
|
|
||||||
(or (apply 'imalison:try-call-process args) (apply this-fn args))))
|
|
||||||
(apply fn args)))
|
|
||||||
|
|
||||||
(advice-add 'projectile-find-file :around 'imalison:call-with-quick-shell-command)
|
|
||||||
#+END_SRC
|
|
||||||
** Security
|
** Security
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(defvar imalison:secure t)
|
(defvar imalison:secure t)
|
||||||
@ -332,6 +163,172 @@ Ensure by default since most of the package for which I use use-package need to
|
|||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(setq use-package-always-ensure t)
|
(setq use-package-always-ensure t)
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
** Setup auto-compile
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package auto-compile
|
||||||
|
:demand t
|
||||||
|
:ensure t
|
||||||
|
:config
|
||||||
|
(progn
|
||||||
|
(auto-compile-on-load-mode)
|
||||||
|
(auto-compile-on-save-mode)))
|
||||||
|
#+END_SRC
|
||||||
|
** Prefer Newer Versions
|
||||||
|
To reduce the risk of loading outdated byte code files, we set
|
||||||
|
load-prefer-newer and enable auto-compile-on-load-mode as early as
|
||||||
|
possible.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(setq load-prefer-newer t)
|
||||||
|
#+END_SRC
|
||||||
|
** Custom Files
|
||||||
|
The default value of ~custom-file~ is just the current user's ~.emacs.d/init.el~
|
||||||
|
file. Emacs will add content to ~custom-file~ whenever a variable is customized
|
||||||
|
or marked as safe. When init.el is version controlled, it is quite annoying to
|
||||||
|
have random machine-generated variable settings amended to it because those
|
||||||
|
changes are often not worth keeping permanently, so we set a different custom
|
||||||
|
file here to avoid this situation.
|
||||||
|
|
||||||
|
custom-before.el is loaded before the rest of init.el, while custom-after.el is
|
||||||
|
loaded afterwards. this-machine.el has customizations that should only apply to
|
||||||
|
the current machine. custom-before and custom-after are not version controlled
|
||||||
|
in the dotfiles repo but they are shared across machines elsewhere.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defvar machine-custom "~/.emacs.d/this-machine.el")
|
||||||
|
(defvar custom-after-file "~/.emacs.d/custom-after.el")
|
||||||
|
(setq custom-file "~/.emacs.d/custom-before.el")
|
||||||
|
(when (file-exists-p custom-file) (load custom-file))
|
||||||
|
#+END_SRC
|
||||||
|
** emit
|
||||||
|
*** TODO this needs to be done better, but it works for now
|
||||||
|
:LOGBOOK:
|
||||||
|
- State "TODO" from "TODO" [2016-09-13 Tue 17:49]
|
||||||
|
:END:
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(when (file-exists-p "~/.emacs.d/load.d/emit.el")
|
||||||
|
(load "~/.emacs.d/load.d/emit.el"))
|
||||||
|
#+END_SRC
|
||||||
|
** Benchmarking
|
||||||
|
This appears here so that it can accurately benchmark as much of
|
||||||
|
startup as possible.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defvar imalison:do-benchmark)
|
||||||
|
(use-package benchmark-init
|
||||||
|
:if (bound-and-true-p imalison:do-benchmark)
|
||||||
|
:demand t)
|
||||||
|
#+END_SRC
|
||||||
|
** GUI Disables
|
||||||
|
Death to any gui elements in emacs! Do this EARLY so that emacs
|
||||||
|
doesn't redisplay in a way that is visually unpleasant on startup a
|
||||||
|
bunch of times.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(when (fboundp 'menu-bar-mode) (menu-bar-mode -1))
|
||||||
|
(when (fboundp 'tool-bar-mode) (tool-bar-mode -1))
|
||||||
|
(when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
|
||||||
|
#+END_SRC
|
||||||
|
Tooltips are annoying:
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(if (fboundp 'tooltip-mode) (tooltip-mode -1) (setq tooltip-use-echo-area t))'
|
||||||
|
#+END_SRC
|
||||||
|
** Byte-Compiler
|
||||||
|
These definitions silence the byte-compiler.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defvar grep-find-ignored-directories nil)
|
||||||
|
(defvar grep-find-ignored-files nil)
|
||||||
|
(defvar ido-context-switch-command nil)
|
||||||
|
(defvar ido-cur-item nil)
|
||||||
|
(defvar ido-cur-list nil)
|
||||||
|
(defvar ido-default-item nil)
|
||||||
|
(defvar inherit-input-method nil)
|
||||||
|
(defvar oauth--token-data nil)
|
||||||
|
(defvar tls-checktrust nil)
|
||||||
|
(defvar tls-program nil)
|
||||||
|
(defvar url-callback-arguments nil)
|
||||||
|
(defvar url-callback-function nil)
|
||||||
|
(defvar url-http-extra-headers nil)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
;; This variable doesn't exist in old versions of org-mode
|
||||||
|
(defvar org-show-context-detail)
|
||||||
|
#+END_SRC
|
||||||
|
** exec-path-from-shell
|
||||||
|
Sets environment variables by starting a shell.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package exec-path-from-shell
|
||||||
|
:config
|
||||||
|
(progn
|
||||||
|
;; For debugging
|
||||||
|
(when nil
|
||||||
|
(message "path: %s, setup: %s" (getenv "PATH")
|
||||||
|
(getenv "ENVIRONMENT_SETUP_DONE"))
|
||||||
|
(setq exec-path-from-shell-debug t))
|
||||||
|
(setq exec-path-from-shell-arguments (list "-l"))
|
||||||
|
(setq exec-path-from-shell-check-startup-files nil)
|
||||||
|
(add-to-list 'exec-path-from-shell-variables "SHELL")
|
||||||
|
(add-to-list 'exec-path-from-shell-variables "GOPATH")
|
||||||
|
(add-to-list 'exec-path-from-shell-variables "ENVIRONMENT_SETUP_DONE")
|
||||||
|
(add-to-list 'exec-path-from-shell-variables "PYTHONPATH")
|
||||||
|
(exec-path-from-shell-initialize)))
|
||||||
|
#+END_SRC
|
||||||
|
** noflet
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package noflet
|
||||||
|
:demand t)
|
||||||
|
#+END_SRC
|
||||||
|
** Non-Forking Shell Command To String
|
||||||
|
Emacs' built in ~shell-command-to-string~ function has the downside that it
|
||||||
|
forks a new shell process every time it is executed. This means that any shell
|
||||||
|
startup cost is incurred when this function is called.
|
||||||
|
|
||||||
|
The following implementation uses eshell's ~executable-find~ to find the
|
||||||
|
binary (which is the only reason ~shell-comand-to-string~ is typically used
|
||||||
|
anyway), but it avoids incurring any shell-startup cost.
|
||||||
|
|
||||||
|
This was originally inspired by [[https://github.com/bbatsov/projectile/issues/1044][this issue]].
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun imalison:call-process-to-string (program &rest args)
|
||||||
|
(with-temp-buffer
|
||||||
|
(apply 'call-process program nil (current-buffer) nil args)
|
||||||
|
(buffer-string)))
|
||||||
|
|
||||||
|
(defun imalison:get-call-process-args-from-shell-command (command)
|
||||||
|
(cl-destructuring-bind
|
||||||
|
(the-command . args) (split-string command " ")
|
||||||
|
(let ((binary-path (executable-find the-command)))
|
||||||
|
(when binary-path
|
||||||
|
(cons binary-path args)))))
|
||||||
|
|
||||||
|
(defun imalison:shell-command-to-string (command)
|
||||||
|
(let ((call-process-args
|
||||||
|
(imalison:get-call-process-args-from-shell-command command)))
|
||||||
|
(if call-process-args
|
||||||
|
(apply 'imalison:call-process-to-string call-process-args)
|
||||||
|
(shell-command-to-string command))))
|
||||||
|
#+END_SRC
|
||||||
|
This makes it so that we always try to call-process instead of shell-command-to-sting. It may cause undesireable behavior.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun imalison:try-call-process (command)
|
||||||
|
(let ((call-process-args
|
||||||
|
(imalison:get-call-process-args-from-shell-command command)))
|
||||||
|
(if call-process-args
|
||||||
|
(apply 'imalison:call-process-to-string call-process-args))))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
This had to be disabled because it was causing a bunch of issues with projectile.
|
||||||
|
#+BEGIN_SRC emacs-lisp :tangle no
|
||||||
|
(advice-add 'shell-command-to-string :before-until 'imalison:try-call-process)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
This solution only applies it to projectile-find-file
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
|
||||||
|
(defun imalison:call-with-quick-shell-command (fn &rest args)
|
||||||
|
(noflet ((shell-command-to-string (&rest args)
|
||||||
|
(or (apply 'imalison:try-call-process args) (apply this-fn args))))
|
||||||
|
(apply fn args)))
|
||||||
|
|
||||||
|
(advice-add 'projectile-find-file :around 'imalison:call-with-quick-shell-command)
|
||||||
|
#+END_SRC
|
||||||
** Set EMACS environment variable
|
** Set EMACS environment variable
|
||||||
Emacs cask seems to depend on the EMACS environment variable being set to the
|
Emacs cask seems to depend on the EMACS environment variable being set to the
|
||||||
binary path of emacs. I found the method for getting the path to the emacs
|
binary path of emacs. I found the method for getting the path to the emacs
|
||||||
|
Loading…
Reference in New Issue
Block a user