diff --git a/bootstrap.el b/bootstrap.el index 06555758d..572f078d9 100644 --- a/bootstrap.el +++ b/bootstrap.el @@ -76,6 +76,9 @@ (load "~/.emacs.local.el")) (load-theme narf-theme t) (setq narf-current-theme narf-theme) - (mapc 'require packages))) + (mapc 'require packages) + + (defun display-startup-echo-area-message () + (message ":: Loaded in %s" (emacs-init-time))))) ;;; bootstrap.el ends here diff --git a/core/core-completion.el b/core/core-completion.el index 667926e9f..294fc68dd 100644 --- a/core/core-completion.el +++ b/core/core-completion.el @@ -1,5 +1,4 @@ ;;; core-completion.el --- auto completion backend (Company-mode) -;; see lib/company-macros.el (use-package company :commands (global-company-mode company-complete company-complete-common company-dict @@ -25,20 +24,19 @@ company-quickhelp-delay nil) :config - (require 'company-statistics) + (use-package company-statistics) ;; NOTE: pos-tip.el in Emacs 25+ does not work - (require 'company-quickhelp) - (company-quickhelp-mode +1) - - ;; Rewrites evil-complete to use company-dabbrev - (setq evil-complete-next-func 'narf/company-evil-complete-next - evil-complete-previous-func 'narf/company-evil-complete-previous) + (use-package company-quickhelp :config (company-quickhelp-mode +1)) (use-package company-dict :defer t :config (setq company-dict-dir (concat narf-private-dir "dict"))) + ;; Rewrites evil-complete to use company-dabbrev + (setq evil-complete-next-func 'narf/company-evil-complete-next + evil-complete-previous-func 'narf/company-evil-complete-previous) + (add-to-list 'company-transformers 'company-sort-by-occurrence) (setq-default company-backends (append '(company-keywords) company-backends)) diff --git a/core/core-editor.el b/core/core-editor.el index d88f401e1..97fc317f2 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -1,12 +1,11 @@ ;;; core-editor.el -;; see lib/editor-defuns.el -;;;; Editor behavior ;;;;;;;;;;;;;;;; (setq-default ;; spaces instead of tabs indent-tabs-mode nil tab-always-indent t tab-width 4 + require-final-newline t delete-trailing-lines nil fill-column 90 @@ -21,11 +20,10 @@ scroll-margin 0 scroll-conservatively 1001 scroll-preserve-screen-position t - hscroll-step 1 hscroll-margin 1 - shift-select-mode t + shift-select-mode t tabify-regexp "^\t* [ \t]+" whitespace-style '(face tabs tab-mark trailing newline indentation newline-mark) whitespace-display-mappings @@ -40,7 +38,9 @@ (save-place-mode +1)) -;; Automatic minor modes ;;;;;;;;;;; +;; +;; Automatic minor modes +;; (defvar narf-auto-minor-mode-alist '() "Alist of filename patterns vs corresponding minor mode functions, see @@ -67,7 +67,9 @@ enable multiple minor modes for the same regexp.") (add-hook! find-file 'narf|enable-minor-mode-maybe) -;; Modes 'n hooks ;;;;;;;;;;;;;;;;;;; +;; +;; Modes 'n hooks +;; (associate! applescript-mode :match "\\.applescript$") (associate! emacs-lisp-mode :match "\\(/Cask\\|\\.\\(el\\|gz\\)\\)$") @@ -100,8 +102,7 @@ enable multiple minor modes for the same regexp.") (fundamental-mode) (visual-line-mode))) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - +;; ;; (global-whitespace-mode 1) ; Show whitespace ;; (global-font-lock-mode t) ; Enable syntax highlighting for older emacs (electric-indent-mode -1) ; on by default @@ -113,7 +114,10 @@ enable multiple minor modes for the same regexp.") (add-hook! after-init (setq winner-boring-buffers narf-ignore-buffers)) -;; Extra modes ;;;;;;;;;;;;;;;;;;;;;;;;; + +;; +;; Extra modes +;; (use-package vimrc-mode :mode ("/\\.?g?vimrc$" "\\.vim$" "/\\.vim/rc/.+$")) ;; Data formats @@ -126,7 +130,10 @@ enable multiple minor modes for the same regexp.") (define-docset! dockerfile-mode "docker") (define-builder! dockerfile-mode dockerfile-build-buffer "Dockerfile")) -;; Plugins ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; +;; Plugins +;; (use-package avy :commands (avy-goto-char-2 avy-goto-line) diff --git a/core/core-evil.el b/core/core-evil.el index a2f2750d9..7de73b705 100644 --- a/core/core-evil.el +++ b/core/core-evil.el @@ -1,5 +1,4 @@ ;;; core-evil.el --- the root of all evil -;; see lib/evil-defuns.el (use-package evil :init diff --git a/core/core-file-templates.el b/core/core-file-templates.el index d9c955d29..114fccadd 100644 --- a/core/core-file-templates.el +++ b/core/core-file-templates.el @@ -1,10 +1,10 @@ -;;; core-file-templates.el --- file templates +;;; core-file-templates.el (use-package autoinsert :defer t :init - (setq auto-insert-query nil ; Don't prompt before insertion - auto-insert-alist '()) + (setq auto-insert-query nil ; Don't prompt before insertion + auto-insert-alist '()) ; Tabula rasa :config (auto-insert-mode 1) diff --git a/core/core-flycheck.el b/core/core-flycheck.el index 410df7134..87e2045f8 100644 --- a/core/core-flycheck.el +++ b/core/core-flycheck.el @@ -1,5 +1,4 @@ ;;; core-flycheck.el --- check yourself before you shrek yourself -;; Related to: lib/defuns-flycheck.el (use-package flycheck :commands (flycheck-mode flycheck-list-errors flycheck-buffer) diff --git a/core/core-helm.el b/core/core-helm.el index 85403e52e..2fb1a1b1d 100644 --- a/core/core-helm.el +++ b/core/core-helm.el @@ -23,14 +23,14 @@ ;; Don't override evil-ex's completion helm-mode-handle-completion-in-region nil - helm-candidate-number-limit 50 + helm-candidate-number-limit 40 helm-bookmark-show-location t) :config (require 'helm-files) (mapc (lambda (r) (add-to-list 'helm-boring-file-regexp-list r)) - (list "\\.projects$" "\\.DS_Store$")) + (list "\\.projects$" "\\.DS_Store$" "\\.cask")) (map! (:map helm-generic-files-map "ESC" 'helm-keyboard-quit) @@ -98,6 +98,7 @@ projectile-project-root-files narf-project-root-files) (add-to-list 'projectile-globally-ignored-files "ido.last") + (add-to-list 'projectile-globally-ignored-directories ".cask") (add-to-list 'projectile-globally-ignored-directories "assets") (add-to-list 'projectile-globally-ignored-directories ".export") (add-to-list 'projectile-globally-ignored-directories ".attach") @@ -143,7 +144,6 @@ helm-swoop-pre-input-function (lambda () ""))) (use-package helm-describe-modes :defer t) -;; (use-package helm-c-yasnippet :commands helm-yas-visit-snippet-file) (use-package helm-semantic :commands helm-semantic-or-imenu) (use-package helm-elisp :commands helm-apropos) (use-package helm-command :commands helm-M-x) diff --git a/core/core-project.el b/core/core-project.el index 83ee273ba..b3435b39f 100644 --- a/core/core-project.el +++ b/core/core-project.el @@ -1,6 +1,9 @@ ;;; core-project.el --- all your (basic) project navigational needs -;;; Dired +;; +;; Dired +;; + ;; Always copy/delete recursively (setq dired-recursive-copies (quote always)) (setq dired-recursive-deletes (quote top)) @@ -32,8 +35,7 @@ (make-directory parent-directory t)))) (add-to-list 'find-file-not-found-functions #'narf|create-non-existent-directory) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - +;; (use-package ido :defines (flx-ido-mode ido-ubiquitous-debug-mode ido-context-switch-command ido-temp-list) :functions (ido-to-end) @@ -73,6 +75,7 @@ (add-hook! (ido-make-file-list ido-make-dir-list) 'narf*ido-sort-mtime) (add-hook! ido-setup 'narf|ido-setup-home-keybind)) +;; (use-package neotree :commands (neotree-show neotree-hide diff --git a/core/core-sessions.el b/core/core-sessions.el index 51f66773c..584faddd2 100644 --- a/core/core-sessions.el +++ b/core/core-sessions.el @@ -1,5 +1,4 @@ ;;; core-sessions.el -;; see lib/workgroup-defuns.el ;; I use workgroups to accomplish two things: ;; 1. Vim-like tab emulation (type :tabs to see a list of tabs -- maybe I'll add some diff --git a/core/core-ui.el b/core/core-ui.el index ed61f48df..e714ae6c7 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -1,5 +1,4 @@ ;;; core-ui.el --- interface settings -;; see lib/ui-defuns.el (setq-default blink-matching-paren nil @@ -10,69 +9,78 @@ ;; switching. cursor-in-non-selected-windows nil highlight-nonselected-windows nil + hl-line-sticky-flag nil ; only highlight in one window - ;; Custom mode-line solves duplicate buffer names - uniquify-buffer-name-style nil + uniquify-buffer-name-style nil ; my mode-line does this for me visible-bell nil ; silence of the bells use-dialog-box nil ; always avoid GUI redisplay-dont-pause t - indicate-buffer-boundaries nil + indicate-buffer-boundaries t indicate-empty-lines t fringes-outside-margins t - hl-line-sticky-flag nil ; only highlight in one window - - idle-update-delay 1 - + idle-update-delay 2 ; update a little less often split-width-threshold nil ; favor horizontal splits show-help-function nil ; hide :help-echo text + ;; Disable bidirectional text support for slight performance bonus bidi-display-reordering nil ;; Minibuffer resizing resize-mini-windows 'grow-only max-mini-window-height 0.3 + ;; Remove arrow on the right fringe when wrapped fringe-indicator-alist (delq (assoc 'continuation fringe-indicator-alist) fringe-indicator-alist)) -(defface narf-minibuffer-active '((t (:inherit mode-line))) "Face for active minibuffer") -(defvar narf-fringe-size 6) -(if window-system - (progn - (fringe-mode narf-fringe-size) - (setq frame-title-format '(buffer-file-name "%f" ("%b"))) +(blink-cursor-mode 1) ; blink cursor +(tooltip-mode -1) ; show tooltips in echo area - (narf/load-font narf-default-font) - (set-face-attribute 'default t :font narf-default-font) +;; Set up minibuffer and fringe +(defface narf-minibuffer-active '((t (:inherit mode-line))) + "Face for active minibuffer") - (define-fringe-bitmap 'tilde [64 168 16] nil nil 'center) - (setcdr (assq 'empty-line fringe-indicator-alist) 'tilde) - (set-fringe-bitmap-face 'tilde 'font-lock-comment-face) +(if (not window-system) + (menu-bar-mode -1) + ;; Set fonts + (narf/load-font narf-default-font) + (set-face-attribute 'default t :font narf-default-font) - (set-window-fringes (minibuffer-window) 0 0 nil) - (defun narf|minibuffer-setup () - (set-window-fringes (selected-window) 0 0 nil) - (make-local-variable 'face-remapping-alist) - (add-to-list 'face-remapping-alist '(default narf-minibuffer-active))) - (add-hook! minibuffer-setup 'narf|minibuffer-setup)) - (menu-bar-mode -1)) + ;; Setup fringe + (fringe-mode narf-fringe-size) + (setq frame-title-format '(buffer-file-name "%f" ("%b"))) + (set-window-fringes (minibuffer-window) 0 0 nil) + ;; Tilde empty-line indicator + (define-fringe-bitmap 'tilde [64 168 16] nil nil 'center) + (setcdr (assq 'empty-line fringe-indicator-alist) 'tilde) + (set-fringe-bitmap-face 'tilde 'font-lock-comment-face) + + ;; Brighter minibuffer when active + (defun narf|minibuffer-setup () + (set-window-fringes (selected-window) 0 0 nil) + (make-local-variable 'face-remapping-alist) + (add-to-list 'face-remapping-alist '(default narf-minibuffer-active))) + (add-hook! minibuffer-setup 'narf|minibuffer-setup)) ;; Fix display of certain unicode characters -(mapc (lambda (x) - (set-fontset-font "fontset-default" `(,x . ,x) - (font-spec :name "DejaVu Sans") nil 'prepend)) - '(?☑ ?☐ ?✍ ?⚠ ?★)) -(mapc (lambda (x) - (set-fontset-font "fontset-default" `(,x . ,x) - (font-spec :name "DejaVu Sans" :size 10) nil)) - '(?➊ ?➋ ?➌ ?➍ ?➎ ?❻ ?➐ ?➑ ?➒ ?➓ ?λ)) -(mapc (lambda (x) - (set-fontset-font "fontset-default" `(,x . ,x) - (font-spec :name "FontAwesome" :size 13) nil)) - '(? ? ? ? ? ? ? ? ?)) +(mapc (lambda (set) + (let ((font (car set)) + (chars (cadr set)) + (size (caddr set))) + (mapc (lambda (x) (set-fontset-font + "fontset-default" `(,x . ,x) + (font-spec :name font :size size) nil 'prepend)) + chars))) + '(("DejaVu Sans" (?☑ ?☐ ?✍ ?⚠ ?★ ?λ + ?➊ ?➋ ?➌ ?➍ ?➎ ?❻ ?➐ ?➑ ?➒ ?➓)) + ;; File attachment symbols (for org-mode) + ("FontAwesome" (? ? ? ? ? ? ? ? ?) 13) + ;; Math symbols + ("Hack" (?× ?∙ ?÷ ?⌉ ?⌈ ?⌊ ?⌋ + ?∩ ?∪ ?⊆ ?⊂ ?⊄ ?⊇ ?⊃ ?⊅ + ?⇒ ?⇐ ?⇔ ?↔ ?→ ?≡ ?∴ ?∵ ?⊕ ?∀ ?∃ ?∄ ?∈ ?∉ + ?∨ ?∧ ?¬)))) -(blink-cursor-mode 1) ; do blink cursor -(tooltip-mode -1) ; show tooltips in echo area ;; on by default in Emacs 25 (when (and (featurep 'eldoc) (>= emacs-major-version 25)) (global-eldoc-mode -1)) @@ -91,10 +99,10 @@ (add-hook! evil-visual-state-entry 'narf|hl-line-off) (add-hook! evil-visual-state-exit 'narf|hl-line-on) -;; Hide modeline in help windows ;;;;;;; +;; Hide modeline in help windows (add-hook! help-mode (setq-local mode-line-format nil)) -;; Highlight TODO/FIXME/NOTE tags ;;;;;; +;; Highlight TODO/FIXME/NOTE tags (defface narf-todo-face '((t (:inherit font-lock-warning-face))) "Face for TODOs") (defface narf-fixme-face '((t (:inherit font-lock-warning-face))) "Face for FIXMEs") (defface narf-note-face '((t (:inherit font-lock-warning-face))) "Face for NOTEs") @@ -103,11 +111,15 @@ ("\\<\\(FIXME\\((.+)\\)?:?\\)" 1 'narf-fixme-face prepend) ("\\<\\(NOTE\\((.+)\\)?:?\\)" 1 'narf-note-face prepend)))) -;; Fade out when unfocused ;;;;;;;;;;;;; +;; Fade out when unfocused (add-hook! focus-in (set-frame-parameter nil 'alpha 100)) (add-hook! focus-out (set-frame-parameter nil 'alpha 75)) -;; Plugins ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; +;; Plugins +;; + (use-package visual-fill-column :defer t) (use-package yascroll diff --git a/core/core-vars.el b/core/core-vars.el index a55b54dc5..522c30e4a 100644 --- a/core/core-vars.el +++ b/core/core-vars.el @@ -8,7 +8,10 @@ (defvar narf-leader-prefix "," "Prefix key for maps") (defvar narf-localleader-prefix "\\" "Prefix key for maps") -;; Buffers/Files ;;;;;;;;;;;;;;;;;;;;;;; + +;; +;; Buffers/Files +;; (defvar narf-unreal-buffers '("^ ?\\*.+\\*" image-mode @@ -56,5 +59,12 @@ gets killed.") "A list of files that count as 'project files', which determine whether a folder is the root of a project or not.") + +;; +;; Fringe/margins +;; + +(defvar narf-fringe-size 6 "Default width to use for the fringes.") + (provide 'core-vars) ;;; core-vars.el ends here diff --git a/core/core-yasnippet.el b/core/core-yasnippet.el index f9b9e7759..c71e86432 100644 --- a/core/core-yasnippet.el +++ b/core/core-yasnippet.el @@ -1,6 +1,4 @@ ;;; core-yasnippet.el --- For the lazy typist -;; see lib/yasnippet-defuns.el -;; see lib/yasnippet-macros.el (use-package yasnippet :mode ("emacs\\.d/private/\\(snippets\\|templates\\)/.+$" . snippet-mode) diff --git a/core/core.el b/core/core.el index a5755377c..72709c9c4 100644 --- a/core/core.el +++ b/core/core.el @@ -11,16 +11,10 @@ ;; narf.... Custom prefix commands ;; ...! Macro ;; +;; You will find all autoloaded function in {core,modules}/defuns/defuns-*.el +;; ;;; -;; Ask for confirmation on exit only if there are real buffers left -(when window-system - (setq confirm-kill-emacs - (lambda (_) - (if (narf/get-real-buffers) - (y-or-n-p ">> Gee, I dunno Brain... Are you sure?") - t)))) - (setq-default ad-redefinition-action 'accept ; silence the advised function warnings echo-keystrokes 0.02 ; show me what I type @@ -62,7 +56,7 @@ undo-tree-auto-save-history t undo-tree-history-directory-alist `(("." . ,(concat narf-temp-dir "undo/")))) -;;; UTF-8 please +;; UTF-8 please (setq locale-coding-system 'utf-8) ; pretty (set-terminal-coding-system 'utf-8) ; pretty (set-keyboard-coding-system 'utf-8) ; pretty @@ -70,8 +64,18 @@ (prefer-coding-system 'utf-8) ; with sugar on top (fset 'yes-or-no-p 'y-or-n-p) ; y/n instead of yes/no +;; Ask for confirmation on exit only if there are real buffers left +(when window-system + (setq confirm-kill-emacs + (lambda (_) + (if (narf/get-real-buffers) + (y-or-n-p ">> Gee, I dunno Brain... Are you sure?") + t)))) -;; Bootstrap ;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; +;; Bootstrap +;; (autoload 'use-package "use-package" "" nil 'macro) (require 'dash) @@ -136,22 +140,20 @@ async-wait async-inject-variables)) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; (require (cond (IS-MAC 'core-os-osx) (IS-LINUX 'core-os-linux) (IS-WINDOWS 'core-os-win32))) -;; Set this up at the end to allow errors to prevent it. + +;; +;; Allow errors to stop this from happening (add-hook! after-init (defadvice save-buffers-kill-emacs (around no-query-kill-emacs activate) "Prevent annoying \"Active processes exist\" query when you quit Emacs." (cl-flet ((process-list ())) ad-do-it))) -(defun display-startup-echo-area-message () - (after! workgroups2 - (message "%sLoaded in %s" (narf/tab-display t t) (emacs-init-time)))) - (require 'server) (unless (server-running-p) (server-start)) diff --git a/core/defuns/defuns-neotree.el b/core/defuns/defuns-neotree.el index 8adee9508..556711c62 100644 --- a/core/defuns/defuns-neotree.el +++ b/core/defuns/defuns-neotree.el @@ -17,7 +17,7 @@ (neotree-find)))) ;;;###autoload -(defun narf|neotree-close-on-window-change () +(defun narf|neotree-close-on-window-change (&rest _) "Close neotree to prevent ensuing mindow buggery." (unless (and (neo-global--window-exists-p) (eq (current-buffer) (neo-global--get-buffer))) diff --git a/core/defuns/macros-yasnippet.el b/core/defuns/macros-yasnippet.el index aad470934..d99297729 100644 --- a/core/defuns/macros-yasnippet.el +++ b/core/defuns/macros-yasnippet.el @@ -5,7 +5,7 @@ (defmacro add-yas-minor-mode! (mode) "Register minor MODES in yasnippet." `(after! yasnippet - (when (boundp 'yas-extra-modes) + (when (boundp 'yas--extra-modes) (add-hook ',(intern (concat (symbol-name (cadr mode)) "-hook")) (lambda () (if (symbol-value ,mode) diff --git a/modules/module-apple.el b/modules/module-apple.el index 525093d56..bd461060e 100644 --- a/modules/module-apple.el +++ b/modules/module-apple.el @@ -13,10 +13,10 @@ (require 'company-sourcekit) (define-company-backend! swift-mode (sourcekit yasnippet)))) -(defun narf-lb6-reload () - (interactive) - (let ((dir (f-traverse-upwards (lambda (f) (string-suffix-p ".lbaction" f))))) - (shell-command (format "open '%s'" dir)))) + +;; +;; LaunchBar: https://www.obdev.at/products/launchbar +;; (define-minor-mode lb6-mode "Launchbar development mode." @@ -26,5 +26,10 @@ (define-builder! lb6-mode narf-lb6-reload) (associate! lb6-mode :match "\\.lb\\(action\\|ext\\)/.+$") +(defun narf-lb6-reload () + (interactive) + (let ((dir (f-traverse-upwards (lambda (f) (string-suffix-p ".lbaction" f))))) + (shell-command (format "open '%s'" dir)))) + (provide 'module-apple) ;;; module-apple.el ends here diff --git a/modules/module-csharp.el b/modules/module-csharp.el index 123a75cba..7e38311cb 100644 --- a/modules/module-csharp.el +++ b/modules/module-csharp.el @@ -20,7 +20,7 @@ :config (map! :map omnisharp-mode-map "gd" 'omnisharp-go-to-definition - (:prefix "\\" + (:localleader "tr" (λ! (omnisharp-unit-test "fixture")) "ts" (λ! (omnisharp-unit-test "single")) "ta" (λ! (omnisharp-unit-test "all")))) diff --git a/modules/module-lisp.el b/modules/module-lisp.el index e942f2410..173f2e79c 100644 --- a/modules/module-lisp.el +++ b/modules/module-lisp.el @@ -1,5 +1,4 @@ ;;; module-lisp --- all things lisp -;; see lib/elisp-defuns.el (add-hook! emacs-lisp-mode '(turn-on-eldoc-mode flycheck-mode))