~elais/shaolin-emacs-archive

4eea75bc1e106f1623a65186d78931572ad0dbf3 — Elais Player 4 years ago 2d75e4e
refactor shaolin emacs

This refactor includes a number of quality of life improvements.

* Editor defaults have been split into their own package

* Completion defaults have been split into their own package

* A new projects package was added for projectile

* Snippets has been refactored to actually work

* A makefile has been added to generate the package guix profile

* Everything just works a lot better out of the box now

* Diminish, projectile, and golden ratio packages were added

Shaolin Emacs a more complete editor and more pleasant default experience. In
fact this commit can almost be said to be the one that makes it into a usable
editor, of course time and hacking will tell if that is true of the new shaolin
or not.
A .gitignore => .gitignore +8 -0
@@ 0,0 1,8 @@
.DS_Store
.idea
*.log
tmp/

auto-save-alist/
.local/
var/

A Makefile => Makefile +11 -0
@@ 0,0 1,11 @@
##
# Shaolin Emacs
#
# @file
# @version 0.1

build:
	mkdir -p .local/guix-profiles/emacs
	guix package -m guix.scm --profile=.local/guix-profiles/emacs/emacs-profile

# end

M early-init.el => early-init.el +0 -12
@@ 23,14 23,6 @@
;; Emacs HEAD (27+) introduces early-init.el, which is run before init.el,
;; before package and UI initialization happens.

;; Defer garbage collection further back in the startup process
;; (setq gc-cons-threshold most-positive-fixnum)

;; In Emacs 27+, package initialization occurs before `user-init-file' is
;; loaded, but after `early-init-file'. Doom handles package initialization, so
;; we must prevent Emacs from doing it early!
(setq package-enable-at-startup nil)

;; Prevent the glimpse of un-styled Emacs by disabling these UI elements early.
(push '(menu-bar-lines . 0) default-frame-alist)
(push '(tool-bar-lines . 0) default-frame-alist)


@@ 41,8 33,4 @@
;; larger than the system default.
(setq frame-inhibit-implied-resize t)

;; Ignore X resources; its settings would be redundant with the other settings
;; in this file and can conflict with later config (particularly where the
;; cursor color is concerned).

;;; early-init.el ends here

M etc/custom.el => etc/custom.el +4 -2
@@ 3,8 3,10 @@
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(custom-safe-themes
   '("801a567c87755fe65d0484cb2bded31a4c5bb24fd1fe0ed11e6c02254017acb2" default)))
 '(safe-local-variable-values
   '((eval modify-syntax-entry 43 "'")
     (eval modify-syntax-entry 36 "'")
     (eval modify-syntax-entry 126 "'"))))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.

A etc/yasnippet/templates/file/emacs-lisp-mode/__package => etc/yasnippet/templates/file/emacs-lisp-mode/__package +25 -0
@@ 0,0 1,25 @@
;;; `(file-name-nondirectory buffer-file-name)`${1: --- ${2:description}} -*- lexical-binding: t; -*-
;;
;; Copyright (C) `(format-time-string "%Y")` `user-full-name`
;;
;; Author: `user-full-name` <https://git.sr.ht/~`user-login-name`>
;; Maintainer: `user-full-name` <`user-mail-address`>
;; Created: `(format-time-string "%B %d, %Y")`
;; Modified: `(format-time-string "%B %d, %Y")`
;; Version: 0.0.1
;; Keywords:
;; Homepage: https://git.sr.ht/~`user-login-name`/shaolin-emacs
;; Package-Requires: ((emacs `emacs-version`) (cl-lib "0.5"))
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;;  $2
;;
;;; Code:

`%`$0

(provide '`(file-name-base buffer-file-name)`)
;;; `(file-name-nondirectory buffer-file-name)` ends here

M guix.scm => guix.scm +52 -12
@@ 1,14 1,54 @@
(use-modules (elais packages emacs-xyz)
	     (guix profiles)
	     (gnu packages emacs-xyz))
(use-modules
 (elais packages emacs-xyz)
 (gnu packages emacs-xyz)
 (gnu packages shellutils)
 (guix build-system emacs)
 (guix download)
 (guix packages)
 (guix profiles))

(define emacs-envrc
  (package
    (name "emacs-envrc")
    (version "0.1")
    (source
      (origin
        (method url-fetch)
        (uri (string-append
               "https://github.com/purcell/envrc/archive/"
               version
               ".tar.gz"))
        (sha256
          (base32
            "0r7ip3kzzg7prrgal54psplmy643xrzwcik5b5phrkwycqzm3pcd"))))
    (build-system emacs-build-system)
    (propagated-inputs `(("emacs-seq" ,emacs-seq)
                         ("direnv" ,direnv)))
    (home-page "https://github.com/purcell/envrc")
    (synopsis
      "Support for `direnv' that operates buffer-locally")
    (description
      "Use direnv (https://direnv.net/) to set environment variables on a
per-buffer basis.  This means that when you work across multiple
projects which have `.envrc` files, all processes launched from the
buffers \"in\" those projects will be executed with the environment
variables specified in those files.  This allows different versions
of linters and other tools to be installed in each project if
desired.")
    (license #f)))

(packages->manifest
 (list emacs-use-package emacs-tao-theme emacs-modus-operandi-theme
   emacs-spacemacs-theme emacs-edwina
   ;; ghost-eating-techniques
   emacs-yasnippet emacs-yasnippet-snippets emacs-no-littering
   ;; shaolin-movement
   emacs-boon emacs-which-key emacs-ctrlf emacs-selectrum
   emacs-general emacs-selectrum-prescient emacs-magit emacs-company
   emacs-company-prescient emacs-eglot emacs-direnv
   emacs-prescient))
 (list emacs-use-package
       ;; shao-ui
       emacs-tao-theme emacs-golden-ratio emacs-diminish
       ;; shao-projects
       emacs-envrc emacs-projectile
       ;; shao-snippets
       emacs-yasnippet
       ;; ghost-eating-techniques
       emacs-yasnippet emacs-yasnippet-snippets emacs-no-littering
       ;; shaolin-movement
       emacs-boon emacs-which-key emacs-ctrlf emacs-selectrum
       emacs-general emacs-magit emacs-company emacs-selectrum-prescient
       emacs-company-prescient emacs-eglot emacs-direnv
       emacs-prescient))

M init.el => init.el +17 -13
@@ 20,28 20,32 @@
;;; Code:

(eval-when-compile 
 (add-to-list 'load-path (expand-file-name
                          ".emacs-profile/share/emacs/site-lisp"
                          user-emacs-directory))
  (add-to-list 'load-path
               (expand-file-name
                ".local/guix-profiles/emacs/emacs-profile/share/emacs/site-lisp/"
                user-emacs-directory))
 (add-to-list 'load-path (expand-file-name "lisp" user-emacs-directory))
 (add-to-list 'custom-theme-load-path  (expand-file-name
                                        "themes"
                                        user-emacs-directory))
 (require 'use-package))

(use-package tao-theme
  :init
  (setq tao-theme-use-sepia nil)
  :config
  (load-theme 'tao-yang t))
  

;; Credentials  
(setq user-name "Elais Player"
(setq user-full-name "Elais Player"
      user-mail-address "elais@fastmail.com")

;; Local Packages
;;
;;; Local Packages

;; General Configuration
(require 'shao-defaults)
(require 'shao-lsp)
(require 'init-snippets)
(require 'shao-editor)
(require 'shao-ui)
(require 'shao-fingers)
(require 'shao-snippets)
(require 'shao-completion)
(require 'shao-projects)

;; Special Modes
(require 'shao-vc)

D lisp/init-snippets.el => lisp/init-snippets.el +0 -30
@@ 1,30 0,0 @@
;;; init-snippets.el --- Initialize yasnippet config. -*- lexical-binding: t -*-

(use-package yasnippet
  :diminish yas-minor-mode
  :hook ((text-mode . yas-minor-mode)
         (prog-mode . yas-minor-mode)
         (conf-mode . yas-minor-mode)
         (snippet-mode . yas-minor-mode))
  :commands (yas-minor-mode-on
             yas-expand
             yas-expand-snippet
             yas-lookup-snippet
             yas-insert-snippet
             yas-new-snippet
             yas-visit-snippet-file)
  :config
  (add-to-list 'yas-snippet-dirs "~/.emacs.d/snippets")
  (add-to-list 'yas-snippet-dirs "~/.guix-extra-profiles/shaolin-emacs/shaolin-emacs/yasnippet-snippets")
  (setq yas-verbosity 0
        yas-also-auto-indent-first-line t))

(use-package autoinsert
  :config
  (setq auto-insert-query nil)
  (auto-insert-mode 1)
  (add-hook 'find-file-hook 'auto-insert)
  (setq auto-insert-alist nil))

(provide 'init-snippets)
;;; init-snippets.el ends here

A lisp/shao-completion.el => lisp/shao-completion.el +78 -0
@@ 0,0 1,78 @@
;;; shao-completion.el --- completions for shaolin -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2020 Elais Player
;;
;; Author: Elais Player <http://github/elais>
;; Maintainer: Elais Player <elais@fastmail.com>
;; Created: June 13, 2020
;; Modified: June 13, 2020
;; Version: 0.0.1
;; Keywords:
;; Homepage: https://github.com/elais/shao-completion
;; Package-Requires: ((emacs 28.0.50) (cl-lib "0.5"))
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;; Shaolin completion packages
;;
;;; Code:


;;
;;; Functions

(defun recentf-open-files+ ()
  "Use `completing-read' to open a recent file."
  (interactive)
  (let ((files (mapcar 'abbreviate-file-name recentf-list)))
    (find-file (completing-read "Find recent file: " files nil t))))

;;
;;; Packages
(use-package company
  :diminish company-mode
  :commands (company-complete-common
             company-manual-begin
             company-grab-line)
  :custom
  (company-idle-delay 1)
  (company-minimum-prefix-length 2)
  (company-tooltip-limit 14)
  (company-tooltip-align-annotations t)
  (company-require-match 'never)
  (company-global-modes
   '(not erc-mode message-mode help-mode gud-mode eshell-mode))
  (company-frontends '(company-pseudo-tooltip-frontend
                       company-echo-metadata-frontend))

  (company-backends '(company-capf))

  (company-auto-complete-chars nil)
  (company-dabbrev-other-buffers nil)
  (compan-dabbrev-ignore-case nil)
  (company-dabbrev-downcase nil)
  :config
  (global-company-mode +1))

(use-package company-tng
  :config
  (add-to-list 'company-frontends 'company-tng-frontend))

(use-package company-prescient
  :hook (company-mode . company-prescient-mode)
  :config
  (company-prescient-mode +1))

(use-package selectrum
 :config
 (selectrum-mode +1))

(use-package selectrum-prescient
  :config
  (selectrum-prescient-mode +1)
  (prescient-persist-mode +1))

(provide 'shao-completion)
;;; shao-completion.el ends here

M lisp/shao-defaults.el => lisp/shao-defaults.el +0 -9
@@ 1,14 1,5 @@
;;; shao-defaults.el --- defaults -*- lexical-binding: t; -*-

(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)

;; smart tab behavior
(setq-default indent-tabs-mode nil)
(setq-default tab-width 8)
(setq tab-always-indent 'complete)

;; Startup optimizations
(setq inhibit-startup-message t

A lisp/shao-editor.el => lisp/shao-editor.el +79 -0
@@ 0,0 1,79 @@
;;; shao-editor.el --- editor configuration -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2020 Elais Player
;;
;; Author: Elais Player <https://git.sr.ht/~elais>
;; Maintainer: Elais Player <elais@fastmail.com>
;; Created: June 13, 2020
;; Modified: June 13, 2020
;; Version: 0.0.1
;; Keywords:
;; Homepage: https://github.com/elais/shao-editor
;; Package-Requires: ((emacs 28.0.50) (cl-lib "0.5"))
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;;
;;
;;; Code:

;; Resolve symlinks when opening files so any operations are conducted
;; from the file's true directory (like `find-file').
(setq find-file-visit-truename t
      vc-follow-symlinks t)

;;; Formatting
;; Favor spaces over tabs. Pls dun h8, but I think spaces (and 4 of them) is a
;; more consistent default than 8-space tabs. It can be changed on a per-mode
;; basis anyway (and is, where tabs are the canonical style, like go-mode).
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)

;; smart tab behavior
(setq-default indent-tabs-mode nil)
(setq-default tab-width 2)
(setq tab-always-indent 'complete)

;; An archaic default in the age of widescreen 4k displays? I disagree. We still
;; frequently split our terminals and editor frames, or have them side-by-side,
;; using up more of that newly available horizontal real-estate.
(setq-default fill-column 80)

;; Continue wrapped words at whitespace, rather than in the middle of a word.
(setq-default word-wrap t)

;; ...but don't do any wrapping by default. It's expensive. Enable
;; `visual-line-mode' if you want soft line-wrapping. `auto-fill-mode' for hard
;; line-wrapping.
(setq-default truncate-lines t)

;; If enabled (and `truncate-lines' was disabled), soft wrapping no longer
;; occurs when that window is less than `truncate-partial-width-windows'
;; characters wide. We don't need this, and it's extra work for Emacs otherwise,
;; so off it goes.
(setq truncate-partial-width-windows nil)

;; Disable the warning "X and Y are the same file".
(setq find-file-suppress-same-file-warnings t)


;; The POSIX standard defines a line is "a sequence of zero or more non-newline
;; characters followed by a terminating newline", so files should end in a
;; newline. Windows doesn't respect this (because it's Windows), but we should,
;; since programmers' tools tend to be POSIX compliant.
(setq require-final-newline t)

;;
;;; Extra file extensions to support

(push '("/LICENSE\\'" . text-mode) auto-mode-alist)
(push '("\\.log\\'" . text-mode) auto-mode-alist)
(push '("rc\\'" . conf-mode) auto-mode-alist)
(push '("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode) auto-mode-alist)

(provide 'shao-editor)
;;; shao-editor.el ends here

M lisp/shao-fingers.el => lisp/shao-fingers.el +61 -51
@@ 1,63 1,73 @@
;;; shao-fingers.el -*- lexical-binding: t; -*-
;;; shao-fingers.el --- core keybindings -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2020 Elais Player
;;
;; Author: Elais Player <http://github/elais>
;; Maintainer: Elais Player <elais@fastmail.com>
;; Created: June 13, 2020
;; Modified: June 13, 2020
;; Version: 0.0.1
;; Keywords:
;; Homepage: https://github.com/elais/shao-projects
;; Package-Requires: ((emacs 28.0.50) (cl-lib "0.5"))
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;; Keybinding interface for shaolin
;;
;;; Code:

(use-package general
 :demand t)
;;; useful keymaps
;; main shaolin keymaps
(defvar +shaolin-fingers-map (make-sparse-keymap))

;; file keymap
(defvar +shaolin-files-map (make-sparse-keymap))

;; buffer keymap
(defvar +shaolin-buffer-map (make-sparse-keymap))

;;
;;; Packages

(use-package boon
(use-package general
  :demand t
  :general
 (:keymaps 'boon-command-mode
  "r" 'ctrlf-forward-regexp)
  :init
  (require 'boon-qwerty)
  :config
  (boon-mode))

(use-package company
  :commands company-complete-common company-manual-begin company-grab-line
  :init
  (setq company-idle-delay 0.25
        company-minimum-prefix-length 2
        company-tooltip-limit 14
        company-tooltip-align-annotations t
        company-require-match 'never
        company-global-modes
        '(not erc-mode message-mode help-mode gud-mode eshell-mode)
        company-frontends '(company-pseudo-tooltip-frontend
                            company-echo-metadata-frontend)

        company-backends '(company-capf)

        company-auto-complete-chars nil
        company-dabbrev-other-buffers nil
        compan-dabbrev-ignore-case nil
        company-dabbrev-downcase nil)
  :config
  (global-company-mode +1))
  
(use-package company-tng
  :config
  (add-to-list 'company-frontends 'company-tng-frontend))
(use-package company-prescient
  :hook (company-mode . company-prescient-mode)
  :config
  (company-prescient-mode +1))
  
(use-package selectrum
 :config
 (selectrum-mode +1))
  (general-define-key
   :keymaps #'+shaolin-files-map
   "s" 'save-buffer
   "f" 'find-file)
   
  (general-create-definer shaolin-fingers-def
    :keymaps '+shaolin-fingers-map
    "f" #'+shaolin-files-map
    "b" #'+shaolin-buffer-map))

(use-package selectrum-prescient
(use-package which-key
  :diminish which-key-mode
  :custom
  (which-key-sort-order #'which-key-prefix-then-key-order)
  (which-key-sort-uppercase-first nil)
  (which-key-add-column-padding 1)
  (which-key-max-display-columns nil)
  (which-key-min-display-lines 6)
  :config
  (selectrum-prescient-mode +1)
  (prescient-persist-mode +1)) 
  (which-key-mode +1))

(use-package ctrlf
 :general
 (:keymaps 'boon-command-map
           "r" 'ctrlf-forward-regexp
           "h" 'ctrlf-forward-literal)
 :config
 (ctrlf-mode +1))
   
(use-package which-key

(use-package boon-qwerty
  :demand t
  :config
  (which-key-mode))
  
  (boon-mode +1))

(provide 'shao-fingers)
;;; shao-fingers.el ends here

A lisp/shao-projects.el => lisp/shao-projects.el +48 -0
@@ 0,0 1,48 @@
;;; shao-projects.el -- Shaolin Project Config -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2020 Elais Player
;;
;; Author: Elais Player <http://github/elais>
;; Maintainer: Elais Player <elais@fastmail.com>
;; Created: June 13, 2020
;; Modified: June 13, 2020
;; Version: 0.0.1
;; Keywords:
;; Homepage: https://github.com/elais/shao-projects
;; Package-Requires: ((emacs 28.0.50) (cl-lib "0.5"))
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;; Project specific packages and configuration
;;
;;; Code:

;;
;;; Packages

(use-package envrc
  :general
  ("C-c e" 'envrc-command-map)
  :config
  (envrc-global-mode))

(use-package projectile
  :commands (projectile-project-root
             projectile-project-name
             projectile-project-p
             projectile-locate-dominating-file)
  :custom
  (projectile-ignored-projects '("~/" "/tmp"))
  (projectile-globally-ignored-files '(".DS_Store" "Icon
" "TAGS"))
  (projectile--globally-ignored-file-suffixes '(".elc" ".pyc" ".o"))
  (projectile-root-files-bottom-up
   (append '(".projectile"
             ".project"
             ".git")))
  :config
  (projectile-mode +1))

(provide 'shao-projects)
;;; shao-projects.el ends here

A lisp/shao-snippets.el => lisp/shao-snippets.el +76 -0
@@ 0,0 1,76 @@
;;; shao-snippets.el --- Snippets Configuration -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2020 Elais Player
;;
;; Author: Elais Player <http://github/elais>
;; Maintainer: Elais Player <elais@fastmail.com>
;; Created: June 13, 2020
;; Modified: June 13, 2020
;; Version: 0.0.1
;; Keywords:
;; Homepage: https://github.com/elais/shao-snippets
;; Package-Requires: ((emacs 28.0.50) (cl-lib "0.5"))
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;;
;;
;;; Code:

;;; Variables

(defvar +guix-snippets-dir
  (expand-file-name
   ".local/guix-profiles/emacs/emacs-profile/share/emacs/yasnippet-snippets/"
   user-emacs-directory)
  "Directory where `yasnippet-dirs' something.")

(defvar +file-templates-dir
  (expand-file-name
   "etc/yasnippet/templates/file/"
   user-emacs-directory)
  "The path to the directory of yasnippet folders to use for file templates.")

(defvar +file-templates-default-trigger "__"
  "The default yasnippet trigger key (a string) for file template rules that
don't have a :trigger property in `+file-templates-alist'.")

(defvar +file-templates-alist
  '((gitignore-mode)
    (dockerfile-mode)
    ;; emacs lisp
    ("/.dir-locals.el$")
    (emacs-lisp-mode :trigger "__package"))
  "An alist of file template rules. The CAR of each rule is either a major mode
symbol or regexp string. The CDR is a plist. See `set-file-template!' for more
information.")

;;
;;; Library

;; TODO buffer specific hooks 

;;
;;; Packages

(use-package yasnippet
  :commands (yas-minor-mode-on
             yas-expand
             yas-expand-snippet
             yas-lookup-snippet
             yas-insert-snippet
             yas-new-snippet
             yas-visit-snippet-file)
  :diminish yas-minor-mode
  :hook ((prog-mode . yas-minor-mode)
         (text-mode . yas-minor-mode)
         (conf-mode . yas-minor-mode))
  :config
  (add-to-list 'yas-snippet-dirs '+guix-snippets-dir)
  (add-to-list 'yas-snippet-dirs '+file-templates-dir)
  (yas-reload-all))

(provide 'shao-snippets)
;;; shao-snippets.el ends here

A lisp/shao-ui.el => lisp/shao-ui.el +94 -0
@@ 0,0 1,94 @@
;;; shao-ui.el -- Shaolin Emacs UI -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2020 Elais Player
;;
;; Author: Elais Player <http://github/elais>
;; Maintainer: Elais Player <elais@fastmail.com>
;; Created: June 13, 2020
;; Modified: June 13, 2020
;; Version: 0.0.1
;; Keywords:
;; Homepage: https://github.com/elais/shao-ui
;; Package-Requires: ((emacs 28.0.50) (cl-lib "0.5"))
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;; This borrows liberally from doom-emacs, because the defaults I used there
;; are defaults that I actually liked a lot.
;;
;;; Code:


;;; General UX
(setq confirm-nonexistent-file-or-buffer nil)

;;
;;; Scrolling

(setq hscroll-margin 2
      hscroll-step 1
      ;; Emacs spends too much effort recentering the screen if you scroll the
      ;; cursor more than N lines past window edges (where N is the settings of
      ;; `scroll-conservatively'). This is especially slow in larger files
      ;; during large-scale scrolling commands. If kept over 100, the window is
      ;; never automatically recentered.
      scroll-conservatively 101
      scroll-margin 0
      scroll-preserve-screen-position t
      ;; Reduce cursor lag by a tiny bit by not auto-adjusting `window-vscroll'
      ;; for tall lines.
      auto-window-vscroll nil
      ;; mouse
      mouse-wheel-scroll-amount '(5 ((shift) . 2))
      mouse-wheel-progressive-speed nil)  ; don't accelerate scrolling

;;
;;; Windows/frames

;; A simple frame title
(setq frame-title-format '("%b – Shaolin")
      icon-title-format frame-title-format)

;; Don't resize windows & frames in steps; it's prohibitive to prevent the user
;; from resizing it to exact dimensions, and looks weird.
(setq window-resize-pixelwise t
      frame-resize-pixelwise t)

(unless (assq 'menu-bar-lines default-frame-alist)
  ;; We do this in early-init.el too, but in case the user is on Emacs 26 we do
  ;; it here too: disable tool and scrollbars, as Doom encourages
  ;; keyboard-centric workflows, so these are just clutter (the scrollbar also
  ;; impacts performance).
  (add-to-list 'default-frame-alist '(menu-bar-lines . 0))
  (add-to-list 'default-frame-alist '(tool-bar-lines . 0))
  (add-to-list 'default-frame-alist '(vertical-scroll-bars)))

;; These are disabled directly through their frame parameters, to avoid the
;; extra work their minor modes do, but we have to unset these variables
;; ourselves, otherwise users will have to cycle them twice to re-enable them.
(setq menu-bar-mode nil
      tool-bar-mode nil
      scroll-bar-mode nil)

;;; Packages

(use-package diminish)

(use-package tao-theme
  :custom
  (tao-theme-use-sepia nil)
  :config
  (load-theme 'tao-yin t))

(use-package golden-ratio
  :diminish golden-ratio-mode
  :custom
  (golden-ratio-auto-scale t)
  :config
  (golden-ratio-mode +1))


(provide 'shao-ui)
;;; shao-ui.el ends here