aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Wilkie <antigravityd@gmail.com>2021-09-05 00:25:24 -0500
committerDuncan Wilkie <antigravityd@gmail.com>2021-09-05 00:25:24 -0500
commit40ff77af5aaf1552ea34a0f95bdb09aee6584de6 (patch)
tree39f3847bab612dae6e1380fdff6fbb2bcb9dcb72
Initial Emacs config.
-rw-r--r--config.org515
-rw-r--r--init.el280
2 files changed, 795 insertions, 0 deletions
diff --git a/config.org b/config.org
new file mode 100644
index 0000000..100d735
--- /dev/null
+++ b/config.org
@@ -0,0 +1,515 @@
+#+title DNW's GNU Emacs Configuration
+#+PROPERTY: header-args:emacs-lisp :tangle ./init.el
+
+* Startup Performance
+
+Increase RAM footprint on startup to reduce load time. Display load time as well.
+
+#+begin_src emacs-lisp
+
+ (setq gc-cons-threshold (* 50 1000 1000))
+
+ (defun dnw/display-startup-time ()
+ (message "Emacs loaded in %s with %d garbage collections."
+ (format "%2f seconds"
+ (float-time
+ (time-subtract after-init-time before-init-time)))
+ gcs-done))
+
+ (add-hook 'emacs-startup-hook #'dnw/display-startup-time)
+
+#+end_src
+
+
+
+
+* Basic Configuration UI
+
+** Hide Ugly GUI Elements
+
+#+begin_src emacs-lisp
+
+ (setq inhibit-startup-message t)
+
+ (menu-bar-mode -1)
+ (tool-bar-mode -1)
+ (scroll-bar-mode -1)
+ (tooltip-mode -1)
+ (set-fringe-mode 10)
+
+#+end_src
+
+** Better Font
+
+Noto Emoji is the fallback here.
+
+#+begin_src emacs-lisp
+
+ (set-face-attribute 'default nil :font "Liberation Mono" :height 130)
+ (set-fontset-font "fontset-default" nil
+ (font-spec :size 13 :name "Noto Emoji"))
+
+#+end_src
+
+** Line Numbers
+
+Display cursor position on the modeline, and line numbers left of the buffer. Except where it's stupid.
+
+#+begin_src emacs-lisp
+
+ (column-number-mode)
+ (global-display-line-numbers-mode t)
+
+ ;; Disable in e.g. shell
+ (dolist (mode '(org-mode-hook
+ term-mode-hook
+ eshell-mode-hook))
+ (add-hook mode (lambda () (display-line-numbers-mode 0))))
+
+#+end_src
+
+#+RESULTS:
+
+* Package Management
+
+Declare which archives to use, syncing them on start. Always-ensure downloads needed packages not on the system.
+
+#+begin_src emacs-lisp
+
+ (require 'package)
+ (setq package-archives '(("melpa" . "https://melpa.org/packages/")
+ ("org" . "https://orgmode.org/elpa/")
+ ("elpa" . "https://elpa.gnu.org/packages/")))
+
+ (package-initialize)
+ (unless package-archive-contents
+ (package-refresh-contents))
+
+ (require 'use-package)
+ (setq use-package-always-ensure t)
+
+#+end_src
+
+** Auto-Updates
+
+Prompt to update Emacs packages weekly.
+
+#+begin_src emacs-lisp
+
+ (use-package auto-package-update
+ :custom
+ (auto-package-update-interval 7)
+ (auto-package-update-prompt-before-update t)
+ (auto-package-update-hide-results t)
+ :config
+ (auto-package-update-maybe)
+ (auto-package-update-at-time "12:00"))
+
+#+end_src
+
+* No Littering!
+
+Write backups and autosaves to .emacs.d, instead of strewing them across the filesystem.
+
+#+begin_src emacs-lisp
+
+ (use-package no-littering)
+
+ (setq auto-save-file-name-transforms
+ `((".*" ,(no-littering-expand-var-file-name "auto-save/") t)))
+
+#+end_src
+
+
+* Ivy (Command Completion)
+
+#+begin_src emacs-lisp
+
+ (use-package ivy
+ :diminish
+ :bind (("C-s" . swiper)
+ :map ivy-minibuffer-map
+ ("TAB" . ivy-alt-done)
+ ("C-l" . ivy-alt-done)
+ ("C-j" . ivy-next-line)
+ ("C-k" . ivy-previous-line)
+ :map ivy-switch-buffer-map
+ ("C-k" . ivy-previous-line)
+ ("C-l" . ivy-done)
+ ("C-d" . ivy-switch-buffer-kill)
+ :map ivy-reverse-i-search-map
+ ("C-k" . ivy-previous-line)
+ ("C-d" . ivy-reverse-i-search-kill))
+ :config
+ (ivy-mode 1))
+
+ (use-package ivy-rich
+ :after ivy
+ :init
+ (ivy-rich-mode 1))
+
+#+end_src
+
+The Counsel UI is prettier.
+
+#+begin_src emacs-lisp
+
+ (use-package counsel
+ :bind (("M-x" . counsel-M-x)
+ ("C-x b" . counsel-ibuffer)
+ ("C-x C-f" . counsel-find-file)
+ :map minibuffer-local-map
+ ("C-r" . 'counsel-minibuffer-history)))
+
+#+end_src
+
+* Helpful (Better Documentation)
+
+Using M-x /documentation command/ defaults to the much better counsel/helpful version.
+
+#+begin_src emacs-lisp
+
+ (use-package helpful
+ :commands (helpful-callable helpful-variable helpful-command helpful-key)
+ :custom
+ (counsel-describe-function-function #'helpful-callable)
+ (counsel-describe-variable-function #'helpful-variable)
+ :bind
+ ([remap describe-function] . counsel-describe-function)
+ ([remap describe-command] . helpful-command)
+ ([remap describe-variable] . counsel-describe-variable)
+ ([remap describe-key] . helpful-key))
+
+#+end_src
+
+* More UI Configuration
+
+** DOOM Modeline
+
+A prettier and more functional modeline. All-the-icons is required for e.g. the org logo when in org mode.
+
+#+begin_src emacs-lisp
+
+ (use-package doom-modeline
+ :ensure t
+ :init (doom-modeline-mode 1))
+
+ (use-package all-the-icons)
+
+#+end_src
+
+** Set Theme
+
+These have better integration with package-spawned buffers. And are quite tasteful.
+
+#+begin_src emacs-lisp
+
+ (use-package doom-themes
+ :init (load-theme 'doom-dark+ t))
+
+#+end_src
+
+** Rainbow Delimiters
+
+No more parenthesis hell!
+
+#+begin_src emacs-lisp
+
+ (use-package rainbow-delimiters
+ :hook (prog-mode . rainbow-delimiters-mode))
+
+#+end_src
+
+* Which-key
+
+In case of brain-fart: display all bound keystrokes.
+
+#+begin_src emacs-lisp
+
+ (use-package which-key
+ :defer 0
+ :diminish which-key-mode
+ :config
+ (which-key-mode)
+ (setq which-key-idle-delay 1))
+
+#+end_src
+
+* Org Mode
+
+** Basic Setup
+
+Nicer collapsed heading indicator, document-like variable pitch font, etc.
+
+#+begin_src emacs-lisp
+
+ (defun dnw/org-mode-setup ()
+ (org-indent-mode)
+ (variable-pitch-mode 1)
+ (visual-line-mode 1))
+
+ (use-package org
+ :commands (org-capture org-agenda)
+ :hook (org-mode . dnw/org-mode-setup)
+ :config
+ (setq org-ellipsis " ▼"))
+
+#+end_src
+
+** Prettier Headings
+
+Font scaling based on tree depth with some typographical subtleties
+
+#+begin_src emacs-lisp
+
+ (use-package org-bullets
+ :after org
+ :hook (org-mode . org-bullets-mode))
+ (with-eval-after-load 'org-faces (dolist (face '((org-level-1 . 1.2)
+ (org-level-2 . 1.1)
+ (org-level-3 . 1.05)
+ (org-level-4 . 1.0)
+ (org-level-5 . 1.1)
+ (org-level-6 . 1.1)
+ (org-level-7 . 1.1)
+ (org-level-8 . 1.1)))
+ (set-face-attribute (car face) nil :font "Liberation Sans" :weight 'regular :height (cdr face)))
+
+ (set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch)
+ (set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch))
+ (set-face-attribute 'org-table nil :inherit '(shadow fixed-pitch))
+ (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch))
+ (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch))
+ (set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch))
+ (set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch))
+
+#+end_src
+
+** Visual Fill
+
+Comfy padding on the margins.
+
+#+begin_src emacs-lisp
+
+ (defun dnw/org-mode-visual-fill ()
+ (setq visual-fill-column-width 170
+ visual-fill-column-center-text t)
+ (visual-fill-column-mode 1))
+
+ (use-package visual-fill-column
+ :hook (org-mode . dnw/org-mode-visual-fill))
+
+#+end_src
+
+** Babel
+
+Evaluation of code blocks & abbreviated syntax for generating them.
+
+#+begin_src emacs-lisp
+
+ (with-eval-after-load 'org
+ (org-babel-do-load-languages
+ 'org-babel-load-languages
+ '((emacs-lisp . t)
+ (python . t)))
+
+ (setq org-confirm-babel-evaluate nil)
+
+ (require 'org-tempo)
+
+ (add-to-list 'org-structure-template-alist '("sh" . "src shell"))
+ (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
+ (add-to-list 'org-structure-template-alist '("py" . "src python")))
+
+#+end_src
+
+** Tangle
+
+Dispatches code blocks from an org file to places on disk. M-x org-babel-tangle to write, or add an auto-tangle hook as below for frequently edited config files.
+
+#+begin_src emacs-lisp
+ (defun dnw/org-babel-tangle-config ()
+ (when (string-equal (buffer-file-name)
+ (expand-file-name "~/.emacs.d/config.org"))
+
+ (let ((org-confirm-babel-evaluate nil))
+ (org-babel-tangle))))
+
+ (add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'dnw/org-babel-tangle-config)))
+
+#+end_src
+
+** Roam
+
+The magic! Add additional capture templates here; for example, a "Structure" template for a note on a mathematical structure, or a "Theorem" template for a note on a theorem, etc.
+
+#+begin_src emacs-lisp
+
+ (use-package org-roam
+ :after org
+ :init
+ (setq org-roam-v2-ack t)
+ :custom
+ (org-roam-directory "~/Roam")
+ (org-roam-completion-everywhere t)
+ (org-roam-capture-templates
+ '(("d" "default" plain
+ "%?"
+ :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
+ :unnarowed t)))
+ :bind (("C-c n l" . org-roam-buffer-toggle)
+ ("C-c n f" . org-roam-node-find)
+ ("C-c n i" . org-roam-node-insert)
+ :map org-mode-map
+ ("C-M-i" . completion-at-point))
+ :config
+ (org-roam-setup))
+
+#+end_src
+
+* Dired
+
+Make C-x C-j open dired at pwd. List directories first, and use all-the-icons to be pretty. Can be configured to use dired-open to use external file display programs by default
+instead of needing to '&' every time.
+
+#+begin_src emacs-lisp
+
+ (use-package dired
+ :ensure nil
+ :commands (dired dired-jump)
+ :bind (("C-x C-j" . dired-jump))
+ :custom ((dired-listing-switches "-ahgo --group-directories-first")))
+
+ (use-package dired-single
+ :after dired)
+
+ (use-package all-the-icons-dired
+ :hook (dired-mode . all-the-icons-dired-mode))
+
+#+end_src
+
+New key to hide dotfiles.
+
+#+begin_src emacs-lisp
+
+ ;; TODO
+
+#+end_src
+
+* LSP-Mode
+
+VSCode's Language Server protocol; a standard for project management that turns Emacs into a full IDE.
+
+** Initial Configuration
+
+Create a breadcrumbs hook that enables a path listing header on LSP mode buffers.
+
+
+#+begin_src emacs-lisp
+
+ (defun dnw/lsp-mode-setup ()
+ (setq lsp-headerline-breadcrumb-segments '(path-to-project file symbols))
+ (lsp-headerline-breadcrumb-mode))
+
+ (use-package lsp-mode
+ :commands (lsp lsp-deferred)
+ :hook (lsp-mode . dnw/lsp-mode-setup)
+ :init
+ (setq lsp-keymap-prefix "C-c l")
+ :config
+ (lsp-enable-which-key-integration t))
+
+ (use-package lsp-ui
+ :hook (lsp-mode . lsp-ui-mode)
+ :custom
+ (setq lsp-ui-doc-position 'bottom))
+
+ (use-package lsp-ivy
+ :after lsp)
+
+#+end_src
+
+** Company Mode
+
+Use company-mode style point completions in LSP-mode
+
+#+begin_src emacs-lisp
+
+ (use-package company
+ :after lsp-mode
+ :hook (prog-mode . company-mode)
+ :bind
+ (:map company-active-map
+ ("<tab>" . company-complete-selection))
+ (:map lsp-mode-map
+ ("<tab>" . company-indent-or-complete-common))
+ :custom
+ (company-minimum-prefix-length 1)
+ (company-idle-delay 0.0))
+
+ (use-package company-box
+ :hook (company-mode . company-box-mode))
+
+#+end_src
+
+* Source Control
+
+** Projectile
+
+Helps make Emacs aware of project structure like makefiles and .gitignore
+
+#+begin_src emacs-lisp
+
+ (use-package projectile
+ :diminish projectile-mode
+ :config (projectile-mode)
+ :custom ((projectile-completion-sustem 'ivy))
+ :bind-keymap
+ ("C-c p" . projectile-command-map)
+ :init
+ (when (file-directory-p "~/Code")
+ (setq projectile-project-search-path '("~/Code")))
+ (setq projectile-switch-project-action #'projectile-dired))
+
+ (use-package counsel-projectile
+ :config (counsel-projectile-mode))
+
+#+end_src
+
+** Magit
+
+#+begin_src emacs-lisp
+
+ (use-package magit
+ :commands (magit-status magit-get-current-branch)
+ :custom
+ (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1))
+
+#+end_src
+* AUCTeX
+
+Powerful LaTeX editing. Display previews with Zathura using C-c C-c to compile; C-c C-v to view. Subsequent calls to C-c C-c automatically update the Zathura window.
+
+#+begin_src emacs-lisp
+
+ (setq TeX-auto-save t)
+ (setq TeX-parse-self t)
+ (setq-default TeX-master nil)
+ (add-hook 'LaTeX-mode-hook 'visual-line-mode)
+ (add-hook 'LaTeX-mode-hook 'flyspell-mode)
+ (add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)
+ (add-hook 'LaTeX-mode-hook 'turn-on-reftex)
+ (setq reftex-plug-into-AUCTeX t)
+ (setq TeX-view-program-selection '((output-pdf "Zathura")))
+
+#+end_src
+
+* Runtime Performance
+
+#+begin_src emacs-lisp
+
+ (setq gc-cons-threshold (* 20 1000 1000))
+
+#+end_src
+
+
diff --git a/init.el b/init.el
new file mode 100644
index 0000000..8fd09f9
--- /dev/null
+++ b/init.el
@@ -0,0 +1,280 @@
+(setq gc-cons-threshold (* 50 1000 1000))
+
+(defun dnw/display-startup-time ()
+ (message "Emacs loaded in %s with %d garbage collections."
+ (format "%2f seconds"
+ (float-time
+ (time-subtract after-init-time before-init-time)))
+ gcs-done))
+
+(add-hook 'emacs-startup-hook #'dnw/display-startup-time)
+
+(setq inhibit-startup-message t)
+
+(menu-bar-mode -1)
+(tool-bar-mode -1)
+(scroll-bar-mode -1)
+(tooltip-mode -1)
+(set-fringe-mode 10)
+
+(set-face-attribute 'default nil :font "Liberation Mono" :height 130)
+(set-fontset-font "fontset-default" nil
+ (font-spec :size 13 :name "Noto Emoji"))
+
+(column-number-mode)
+(global-display-line-numbers-mode t)
+
+;; Disable in e.g. shell
+(dolist (mode '(org-mode-hook
+ term-mode-hook
+ eshell-mode-hook))
+ (add-hook mode (lambda () (display-line-numbers-mode 0))))
+
+(require 'package)
+(setq package-archives '(("melpa" . "https://melpa.org/packages/")
+ ("org" . "https://orgmode.org/elpa/")
+ ("elpa" . "https://elpa.gnu.org/packages/")))
+
+(package-initialize)
+(unless package-archive-contents
+ (package-refresh-contents))
+
+(require 'use-package)
+(setq use-package-always-ensure t)
+
+(use-package auto-package-update
+ :custom
+ (auto-package-update-interval 7)
+ (auto-package-update-prompt-before-update t)
+ (auto-package-update-hide-results t)
+ :config
+ (auto-package-update-maybe)
+ (auto-package-update-at-time "12:00"))
+
+(use-package no-littering)
+
+(setq auto-save-file-name-transforms
+ `((".*" ,(no-littering-expand-var-file-name "auto-save/") t)))
+
+(use-package ivy
+ :diminish
+ :bind (("C-s" . swiper)
+ :map ivy-minibuffer-map
+ ("TAB" . ivy-alt-done)
+ ("C-l" . ivy-alt-done)
+ ("C-j" . ivy-next-line)
+ ("C-k" . ivy-previous-line)
+ :map ivy-switch-buffer-map
+ ("C-k" . ivy-previous-line)
+ ("C-l" . ivy-done)
+ ("C-d" . ivy-switch-buffer-kill)
+ :map ivy-reverse-i-search-map
+ ("C-k" . ivy-previous-line)
+ ("C-d" . ivy-reverse-i-search-kill))
+ :config
+ (ivy-mode 1))
+
+(use-package ivy-rich
+ :after ivy
+ :init
+ (ivy-rich-mode 1))
+
+(use-package counsel
+ :bind (("M-x" . counsel-M-x)
+ ("C-x b" . counsel-ibuffer)
+ ("C-x C-f" . counsel-find-file)
+ :map minibuffer-local-map
+ ("C-r" . 'counsel-minibuffer-history)))
+
+(use-package helpful
+ :commands (helpful-callable helpful-variable helpful-command helpful-key)
+ :custom
+ (counsel-describe-function-function #'helpful-callable)
+ (counsel-describe-variable-function #'helpful-variable)
+ :bind
+ ([remap describe-function] . counsel-describe-function)
+ ([remap describe-command] . helpful-command)
+ ([remap describe-variable] . counsel-describe-variable)
+ ([remap describe-key] . helpful-key))
+
+(use-package doom-modeline
+ :ensure t
+ :init (doom-modeline-mode 1))
+
+(use-package all-the-icons)
+
+(use-package doom-themes
+ :init (load-theme 'doom-dark+ t))
+
+(use-package rainbow-delimiters
+ :hook (prog-mode . rainbow-delimiters-mode))
+
+(use-package which-key
+ :defer 0
+ :diminish which-key-mode
+ :config
+ (which-key-mode)
+ (setq which-key-idle-delay 1))
+
+(defun dnw/org-mode-setup ()
+ (org-indent-mode)
+ (variable-pitch-mode 1)
+ (visual-line-mode 1))
+
+(use-package org
+ :commands (org-capture org-agenda)
+ :hook (org-mode . dnw/org-mode-setup)
+ :config
+ (setq org-ellipsis " ▼"))
+
+(use-package org-bullets
+ :after org
+ :hook (org-mode . org-bullets-mode))
+(with-eval-after-load 'org-faces (dolist (face '((org-level-1 . 1.2)
+ (org-level-2 . 1.1)
+ (org-level-3 . 1.05)
+ (org-level-4 . 1.0)
+ (org-level-5 . 1.1)
+ (org-level-6 . 1.1)
+ (org-level-7 . 1.1)
+ (org-level-8 . 1.1)))
+ (set-face-attribute (car face) nil :font "Liberation Sans" :weight 'regular :height (cdr face)))
+
+ (set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch)
+ (set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch))
+ (set-face-attribute 'org-table nil :inherit '(shadow fixed-pitch))
+ (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch))
+ (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch))
+ (set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch))
+ (set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch))
+
+(defun dnw/org-mode-visual-fill ()
+ (setq visual-fill-column-width 170
+ visual-fill-column-center-text t)
+ (visual-fill-column-mode 1))
+
+(use-package visual-fill-column
+ :hook (org-mode . dnw/org-mode-visual-fill))
+
+(with-eval-after-load 'org
+ (org-babel-do-load-languages
+ 'org-babel-load-languages
+ '((emacs-lisp . t)
+ (python . t)))
+
+(setq org-confirm-babel-evaluate nil)
+
+(require 'org-tempo)
+
+(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
+(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
+(add-to-list 'org-structure-template-alist '("py" . "src python")))
+
+(defun dnw/org-babel-tangle-config ()
+ (when (string-equal (buffer-file-name)
+ (expand-file-name "~/.emacs.d/config.org"))
+
+ (let ((org-confirm-babel-evaluate nil))
+ (org-babel-tangle))))
+
+(add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'dnw/org-babel-tangle-config)))
+
+(use-package org-roam
+ :after org
+ :init
+ (setq org-roam-v2-ack t)
+ :custom
+ (org-roam-directory "~/Roam")
+ (org-roam-completion-everywhere t)
+ (org-roam-capture-templates
+ '(("d" "default" plain
+ "%?"
+ :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
+ :unnarowed t)))
+ :bind (("C-c n l" . org-roam-buffer-toggle)
+ ("C-c n f" . org-roam-node-find)
+ ("C-c n i" . org-roam-node-insert)
+ :map org-mode-map
+ ("C-M-i" . completion-at-point))
+ :config
+ (org-roam-setup))
+
+(use-package dired
+ :ensure nil
+ :commands (dired dired-jump)
+ :bind (("C-x C-j" . dired-jump))
+ :custom ((dired-listing-switches "-ahgo --group-directories-first")))
+
+(use-package dired-single
+ :after dired)
+
+(use-package all-the-icons-dired
+ :hook (dired-mode . all-the-icons-dired-mode))
+
+;; TODO
+
+(defun dnw/lsp-mode-setup ()
+ (setq lsp-headerline-breadcrumb-segments '(path-to-project file symbols))
+ (lsp-headerline-breadcrumb-mode))
+
+(use-package lsp-mode
+ :commands (lsp lsp-deferred)
+ :hook (lsp-mode . dnw/lsp-mode-setup)
+ :init
+ (setq lsp-keymap-prefix "C-c l")
+ :config
+ (lsp-enable-which-key-integration t))
+
+(use-package lsp-ui
+ :hook (lsp-mode . lsp-ui-mode)
+ :custom
+ (setq lsp-ui-doc-position 'bottom))
+
+(use-package lsp-ivy
+ :after lsp)
+
+(use-package company
+ :after lsp-mode
+ :hook (prog-mode . company-mode)
+ :bind
+ (:map company-active-map
+ ("<tab>" . company-complete-selection))
+ (:map lsp-mode-map
+ ("<tab>" . company-indent-or-complete-common))
+ :custom
+ (company-minimum-prefix-length 1)
+ (company-idle-delay 0.0))
+
+(use-package company-box
+ :hook (company-mode . company-box-mode))
+
+(use-package projectile
+ :diminish projectile-mode
+ :config (projectile-mode)
+ :custom ((projectile-completion-sustem 'ivy))
+ :bind-keymap
+ ("C-c p" . projectile-command-map)
+ :init
+ (when (file-directory-p "~/Code")
+ (setq projectile-project-search-path '("~/Code")))
+ (setq projectile-switch-project-action #'projectile-dired))
+
+(use-package counsel-projectile
+ :config (counsel-projectile-mode))
+
+(use-package magit
+ :commands (magit-status magit-get-current-branch)
+ :custom
+ (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1))
+
+(setq TeX-auto-save t)
+(setq TeX-parse-self t)
+(setq-default TeX-master nil)
+(add-hook 'LaTeX-mode-hook 'visual-line-mode)
+(add-hook 'LaTeX-mode-hook 'flyspell-mode)
+(add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)
+(add-hook 'LaTeX-mode-hook 'turn-on-reftex)
+(setq reftex-plug-into-AUCTeX t)
+(setq TeX-view-program-selection '((output-pdf "Zathura")))
+
+(setq gc-cons-threshold (* 20 1000 1000))