f287a2b3b1
Need to reconfigure the setup script to symlink init.el to ~/.emacs.d instead of symlinking it to ~/. This change is better in the long run.
594 lines
18 KiB
EmacsLisp
594 lines
18 KiB
EmacsLisp
(require 'package)
|
|
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
|
|
(add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/") t)
|
|
(package-initialize)
|
|
|
|
|
|
;; TODO: macro definitions
|
|
;; (defmacro add-hooks (hooks callback)
|
|
;; "Convenience macro for creating multiple hooks."
|
|
;; (mapcar (lambda (mode) `(add-hook ,mode ,callback)) hooks))
|
|
|
|
|
|
;; use-package configuration
|
|
(require 'use-package)
|
|
(setq use-package-always-ensure t)
|
|
|
|
|
|
;; disable custom variable entries from being written to ~/.emacs.d/init.el
|
|
(setq custom-file "~/.emacs.d/custom.el")
|
|
(load custom-file 'noerror)
|
|
|
|
|
|
;; transparently edit compressed files
|
|
(auto-compression-mode t)
|
|
|
|
|
|
;; disable line-wrapping
|
|
(setq-default truncate-lines 1)
|
|
|
|
|
|
;; change font
|
|
(add-to-list 'default-frame-alist '(font . "Operator Mono"))
|
|
|
|
|
|
;; create file bookmarks
|
|
(set-register ?e '(file . "~/.emacs.d/init.el"))
|
|
(set-register ?u '(file . "~/urbint"))
|
|
(set-register ?d '(file . "~/Dropbox"))
|
|
|
|
|
|
;; change emacs prompts from "yes or no" -> "y or n"
|
|
(fset 'yes-or-no-p 'y-or-n-p)
|
|
|
|
|
|
;; function to copy current file buffer path to clipboard
|
|
(defun my-put-file-name-on-clipboard ()
|
|
"Put the current file name on the clipboard"
|
|
(interactive)
|
|
(let ((filename (if (equal major-mode 'dired-mode)
|
|
default-directory
|
|
(buffer-file-name))))
|
|
(when filename
|
|
(with-temp-buffer
|
|
(insert filename)
|
|
(clipboard-kill-region (point-min) (point-max)))
|
|
(message filename))))
|
|
|
|
|
|
;; open photos in Emacs
|
|
(auto-image-file-mode 1)
|
|
|
|
|
|
;; working with remote files
|
|
(require 'tramp)
|
|
(setq tramp-default-method "ssh")
|
|
|
|
|
|
;; persist history etc b/w Emacs sessions
|
|
(setq desktop-save 'if-exists)
|
|
(desktop-save-mode 1)
|
|
|
|
(setq desktop-globals-to-save
|
|
(append '((extended-command-history . 30)
|
|
(file-name-history . 100)
|
|
(grep-history . 30)
|
|
(compile-history . 30)
|
|
(minibuffer-history . 50)
|
|
(query-replace-history . 60)
|
|
(read-expression-history . 60)
|
|
(regexp-history . 60)
|
|
(regexp-search-ring . 20)
|
|
(search-ring . 20)
|
|
(shell-command-history . 50)
|
|
tags-file-name
|
|
register-alist)))
|
|
|
|
|
|
;; disable menubar
|
|
(if (string-equal system-type "gnu/linux")
|
|
(menu-bar-mode nil)
|
|
(if (string-equal system-type "darwin")
|
|
(setq ns-auto-hide-menu-bar t)))
|
|
|
|
|
|
;; smooth scrolling settings
|
|
(setq scroll-step 1
|
|
scroll-conservatively 10000)
|
|
|
|
|
|
;; increase line height
|
|
(setq-default line-spacing 4)
|
|
|
|
|
|
;; config Emacs to use $PATH values
|
|
(use-package exec-path-from-shell
|
|
:config
|
|
(when (memq window-system '(mac ns))
|
|
(exec-path-from-shell-initialize)))
|
|
|
|
|
|
;; Emacs autosave, backup, interlocking files
|
|
(setq auto-save-default nil
|
|
make-backup-files nil
|
|
create-lockfiles nil)
|
|
|
|
|
|
;; disable startup screen
|
|
(setq inhibit-startup-screen t)
|
|
|
|
|
|
;; disable toolbar
|
|
(tool-bar-mode -1)
|
|
|
|
|
|
;; enable line numbers
|
|
(global-linum-mode t)
|
|
|
|
|
|
;; change linum color
|
|
;; TODO - ensure this is evaluated *after* linum is loaded (eval-after-load ...)
|
|
(set-face-foreground 'linum "#ddb275")
|
|
|
|
|
|
;; maximize current window
|
|
(global-set-key (kbd "M-z") #'delete-other-windows)
|
|
|
|
|
|
;; dired configuration
|
|
(require 'dired)
|
|
(define-key dired-mode-map (kbd "c") #'find-file) ; this acts as a create-file
|
|
(define-key dired-mode-map (kbd "f") #'wpc/find-file)
|
|
(define-key dired-mode-map (kbd "-") #'dired-up-directory)
|
|
|
|
;; dired jumping
|
|
(global-set-key (kbd "C-x d") #'dired-jump)
|
|
|
|
(defun wpc/find-file ()
|
|
"Prefer project-based file-finding if inside of project; otherwise gracefully fallback."
|
|
(interactive)
|
|
(with-current-buffer (current-buffer)
|
|
(if (projectile-project-p)
|
|
(call-interactively #'counsel-projectile-find-file)
|
|
(call-interactively #'find-file))))
|
|
|
|
|
|
;; set default buffer for Emacs
|
|
(setq initial-buffer-choice "~/urbint")
|
|
|
|
|
|
;; vim
|
|
(use-package evil
|
|
:init
|
|
(defun wpc/evil-window-vsplit-right ()
|
|
(interactive)
|
|
(evil-window-vsplit)
|
|
(windmove-right))
|
|
(defun wpc/evil-window-split-down ()
|
|
(interactive)
|
|
(evil-window-split)
|
|
(windmove-down))
|
|
:config
|
|
(define-key evil-motion-state-map (kbd "RET") #'evil-goto-line)
|
|
(define-key evil-normal-state-map (kbd "H") #'evil-first-non-blank)
|
|
(define-key evil-normal-state-map (kbd "L") #'evil-end-of-line)
|
|
(define-key evil-normal-state-map (kbd "-") #'dired-jump)
|
|
(define-key evil-normal-state-map (kbd "s") nil)
|
|
(define-key evil-normal-state-map (kbd "s l") #'wpc/evil-window-vsplit-right)
|
|
(define-key evil-normal-state-map (kbd "s h") #'evil-window-vsplit)
|
|
(define-key evil-normal-state-map (kbd "s k") #'evil-window-split)
|
|
(define-key evil-normal-state-map (kbd "s j") #'wpc/evil-window-split-down)
|
|
(define-key evil-normal-state-map (kbd "s j") #'wpc/evil-window-split-down)
|
|
|
|
;; paredit specific keybindings
|
|
(require 'paredit)
|
|
(evil-define-key 'normal paredit-mode-map (kbd "==") #'paredit-reindent-defun)
|
|
(evil-define-key 'normal paredit-mode-map (kbd ">)") #'paredit-forward-slurp-sexp)
|
|
(evil-define-key 'normal paredit-mode-map (kbd "<(") #'paredit-backward-slurp-sexp)
|
|
(evil-define-key 'normal paredit-mode-map (kbd "<)") #'paredit-forward-barf-sexp)
|
|
(evil-define-key 'normal paredit-mode-map (kbd ">(") #'paredit-backward-barf-sexp)
|
|
|
|
;; swap two Elements (e is for elements)
|
|
(evil-define-key 'normal paredit-mode-map (kbd ">e") #'paredit-move-forward)
|
|
(evil-define-key 'normal paredit-mode-map (kbd "<e") #'paredit-move-backward)
|
|
|
|
;; swap two Forms (f is for forms)
|
|
(evil-define-key 'normal paredit-mode-map (kbd ">f") #'paredit-move-backward)
|
|
(evil-define-key 'normal paredit-mode-map (kbd "<f") #'paredit-move-backward)
|
|
|
|
;; raising
|
|
(evil-define-key 'normal paredit-mode-map (kbd "go") #'paredit-raise-sexp)
|
|
|
|
;; surround current sexp in a block
|
|
;; (evil-define-key 'normal paredit-mode-map (kbd "c s e b") nil)
|
|
|
|
(require 'cider)
|
|
(evil-define-key 'normal cider-mode-map (kbd "M-.") #'cider-find-var)
|
|
|
|
(defun wpc/reindent-defun-and-align-clojure-map ()
|
|
(interactive)
|
|
(call-interactively #'paredit-reindent-defun)
|
|
(call-interactively #'clojure-align))
|
|
|
|
(evil-define-key 'normal cider-mode-map (kbd "==") #'wpc/reindent-defun-and-align-clojure-map)
|
|
|
|
(define-key evil-ex-completion-map (kbd "M-p") #'previous-complete-history-element)
|
|
(define-key evil-ex-completion-map (kbd "M-n") #'next-complete-history-element)
|
|
|
|
;; unbind ReadLine movements from Evil's insertion map
|
|
(define-key evil-insert-state-map (kbd "C-a") nil)
|
|
(define-key evil-insert-state-map (kbd "C-e") nil)
|
|
(define-key evil-insert-state-map (kbd "C-n") nil)
|
|
(define-key evil-insert-state-map (kbd "C-p") nil)
|
|
(define-key evil-insert-state-map (kbd "C-k") nil)
|
|
|
|
(evil-set-initial-state 'help-mode 'emacs)
|
|
(evil-set-initial-state 'cider-repl-mode 'emacs)
|
|
(evil-set-initial-state 'cider-stacktrace-mode 'emacs)
|
|
(evil-set-initial-state 'cider-docview-mode 'emacs)
|
|
(evil-set-initial-state 'cider-browse-spec-mode 'emacs)
|
|
(evil-set-initial-state 'cider-browse-spec-view-mode 'emacs)
|
|
(evil-set-initial-state 'cider-browse-spec-example-mode 'emacs)
|
|
(evil-mode 1)
|
|
|
|
;; create comments easily
|
|
(use-package evil-commentary
|
|
:config
|
|
(evil-commentary-mode))
|
|
|
|
;; evil surround
|
|
(use-package evil-surround
|
|
:config
|
|
(global-evil-surround-mode 1))
|
|
|
|
;; evil leader
|
|
(use-package evil-leader
|
|
:config
|
|
(global-evil-leader-mode)
|
|
(evil-leader/set-leader "<SPC>")
|
|
|
|
(defun wpc/evil-leader/set-key-for-clojure-modes (kbd callback)
|
|
(evil-leader/set-key-for-mode 'clojure-mode kbd callback)
|
|
(evil-leader/set-key-for-mode 'clojurec-mode kbd callback)
|
|
(evil-leader/set-key-for-mode 'clojurescript-mode kbd callback))
|
|
|
|
(wpc/evil-leader/set-key-for-clojure-modes "d" #'cider-doc)
|
|
(wpc/evil-leader/set-key-for-clojure-modes "e" #'cider-eval-defun-at-point)
|
|
(wpc/evil-leader/set-key-for-clojure-modes "r" #'wpc/find-or-create-clojure-or-clojurescript-repl)
|
|
(wpc/evil-leader/set-key-for-clojure-modes "n" #'wpc/cider/repl-set-ns-and-eval-buffer)
|
|
|
|
(evil-leader/set-key
|
|
"i" #'helm-semantic-or-imenu
|
|
"j" #'jump-to-register
|
|
"h" #'help
|
|
"p" #'counsel-git-grep
|
|
"f" #'wpc/find-file
|
|
"b" #'ivy-switch-buffer
|
|
"B" #'ibuffer
|
|
"w" #'ace-select-window)))
|
|
|
|
(use-package company
|
|
:bind (:map company-active-map
|
|
("C-j" . company-select-next)
|
|
("C-n" . company-select-next)
|
|
("C-k" . company-select-previous)
|
|
("C-p" . company-select-previous)
|
|
("C-d" . company-show-doc-buffer))
|
|
:config
|
|
(setq company-idle-delay 0)
|
|
(setq company-minimum-prefix-length 2)
|
|
(add-hook 'after-init-hook #'global-company-mode))
|
|
|
|
|
|
|
|
|
|
;; map C-a <-> M-m bindings since M-m is more common
|
|
(global-set-key (kbd "C-a") #'back-to-indentation)
|
|
(global-set-key (kbd "M-m") #'move-beginning-of-line)
|
|
|
|
|
|
;; fullscreen emacs
|
|
(global-set-key (kbd "<s-return>") #'toggle-frame-fullscreen)
|
|
|
|
|
|
;; auto-close parens, brackets, quotes
|
|
(electric-pair-mode 1)
|
|
|
|
|
|
;; highlight matching parens, brackets, etc
|
|
(show-paren-mode 1)
|
|
|
|
|
|
;; project mgt
|
|
(use-package projectile
|
|
:config
|
|
(projectile-mode t))
|
|
|
|
|
|
;; paredit LISP editing
|
|
(use-package paredit
|
|
:config
|
|
(define-key paredit-mode-map (kbd "M-q") nil)
|
|
(add-hook 'clojure-mode-hook #'enable-paredit-mode)
|
|
(add-hook 'clojurescript-mode-hook #'enable-paredit-mode)
|
|
(add-hook 'emacs-lisp-mode-hook #'enable-paredit-mode))
|
|
|
|
|
|
(use-package counsel
|
|
:bind
|
|
("C-c g" . counsel-git)
|
|
("C-c j" . counsel-git-grep)
|
|
("C-h f" . counsel-describe-function)
|
|
("C-h v" . counsel-describe-function))
|
|
|
|
|
|
|
|
;; projectile intergration with ivy
|
|
(use-package counsel-projectile
|
|
:config
|
|
(global-set-key (kbd "C-x C-f") #'wpc/find-file)
|
|
(counsel-projectile-on))
|
|
|
|
|
|
;; efficient window-switching
|
|
(use-package ace-window
|
|
:bind ("C-x o" . ace-window)
|
|
:config
|
|
(setq aw-keys '(?a ?s ?d ?f ?j ?k ?k ?\;)))
|
|
|
|
|
|
;; create your own vim-like modes
|
|
(use-package hydra
|
|
:config
|
|
(defhydra hydra-ibuffer-main (:color pink :hint nil)
|
|
"
|
|
^Navigation^ | ^Mark^ | ^Actions^ | ^View^
|
|
-^----------^-+-^----^--------+-^-------^--------+-^----^-------
|
|
_k_: ʌ | _m_: mark | _D_: delete | _g_: refresh
|
|
_RET_: visit | _u_: unmark | _S_: save | _s_: sort
|
|
_j_: v | _*_: specific | _a_: all actions | _/_: filter
|
|
-^----------^-+-^----^--------+-^-------^--------+-^----^-------
|
|
"
|
|
("j" ibuffer-forward-line)
|
|
("RET" ibuffer-visit-buffer :color blue)
|
|
("k" ibuffer-backward-line)
|
|
("m" ibuffer-mark-forward)
|
|
("u" ibuffer-unmark-forward)
|
|
("*" hydra-ibuffer-mark/body :color blue)
|
|
("D" ibuffer-do-delete)
|
|
("S" ibuffer-do-save)
|
|
("a" hydra-ibuffer-action/body :color blue)
|
|
("g" ibuffer-update)
|
|
("s" hydra-ibuffer-sort/body :color blue)
|
|
("/" hydra-ibuffer-filter/body :color blue)
|
|
("o" ibuffer-visit-buffer-other-window "other window" :color blue)
|
|
("q" quit-window "quit ibuffer" :color blue)
|
|
("." nil "toggle hydra" :color blue))
|
|
|
|
(defhydra hydra-ibuffer-mark (:color teal :columns 5
|
|
:after-exit (hydra-ibuffer-main/body))
|
|
"Mark"
|
|
("*" ibuffer-unmark-all "unmark all")
|
|
("M" ibuffer-mark-by-mode "mode")
|
|
("m" ibuffer-mark-modified-buffers "modified")
|
|
("u" ibuffer-mark-unsaved-buffers "unsaved")
|
|
("s" ibuffer-mark-special-buffers "special")
|
|
("r" ibuffer-mark-read-only-buffers "read-only")
|
|
("/" ibuffer-mark-dired-buffers "dired")
|
|
("e" ibuffer-mark-dissociated-buffers "dissociated")
|
|
("h" ibuffer-mark-help-buffers "help")
|
|
("z" ibuffer-mark-compressed-file-buffers "compressed")
|
|
("b" hydra-ibuffer-main/body "back" :color blue))
|
|
|
|
(defhydra hydra-ibuffer-action (:color teal :columns 4
|
|
:after-exit
|
|
(if (eq major-mode 'ibuffer-mode)
|
|
(hydra-ibuffer-main/body)))
|
|
"Action"
|
|
("A" ibuffer-do-view "view")
|
|
("E" ibuffer-do-eval "eval")
|
|
("F" ibuffer-do-shell-command-file "shell-command-file")
|
|
("I" ibuffer-do-query-replace-regexp "query-replace-regexp")
|
|
("H" ibuffer-do-view-other-frame "view-other-frame")
|
|
("N" ibuffer-do-shell-command-pipe-replace "shell-cmd-pipe-replace")
|
|
("M" ibuffer-do-toggle-modified "toggle-modified")
|
|
("O" ibuffer-do-occur "occur")
|
|
("P" ibuffer-do-print "print")
|
|
("Q" ibuffer-do-query-replace "query-replace")
|
|
("R" ibuffer-do-rename-uniquely "rename-uniquely")
|
|
("T" ibuffer-do-toggle-read-only "toggle-read-only")
|
|
("U" ibuffer-do-replace-regexp "replace-regexp")
|
|
("V" ibuffer-do-revert "revert")
|
|
("W" ibuffer-do-view-and-eval "view-and-eval")
|
|
("X" ibuffer-do-shell-command-pipe "shell-command-pipe")
|
|
("b" nil "back"))
|
|
|
|
(defhydra hydra-ibuffer-sort (:color amaranth :columns 3)
|
|
"Sort"
|
|
("i" ibuffer-invert-sorting "invert")
|
|
("a" ibuffer-do-sort-by-alphabetic "alphabetic")
|
|
("v" ibuffer-do-sort-by-recency "recently used")
|
|
("s" ibuffer-do-sort-by-size "size")
|
|
("f" ibuffer-do-sort-by-filename/process "filename")
|
|
("m" ibuffer-do-sort-by-major-mode "mode")
|
|
("b" hydra-ibuffer-main/body "back" :color blue))
|
|
|
|
(defhydra hydra-ibuffer-filter (:color amaranth :columns 4)
|
|
"Filter"
|
|
("m" ibuffer-filter-by-used-mode "mode")
|
|
("M" ibuffer-filter-by-derived-mode "derived mode")
|
|
("n" ibuffer-filter-by-name "name")
|
|
("c" ibuffer-filter-by-content "content")
|
|
("e" ibuffer-filter-by-predicate "predicate")
|
|
("f" ibuffer-filter-by-filename "filename")
|
|
(">" ibuffer-filter-by-size-gt "size")
|
|
("<" ibuffer-filter-by-size-lt "size")
|
|
("/" ibuffer-filter-disable "disable")
|
|
("b" hydra-ibuffer-main/body "back" :color blue))
|
|
|
|
(add-hook 'ibuffer-hook #'hydra-ibuffer-main/body))
|
|
|
|
|
|
;; sensible window mgt
|
|
(global-set-key (kbd "M--") #'split-window-below)
|
|
(global-set-key (kbd "M-\\") #'split-window-right)
|
|
(global-set-key (kbd "M-q") #'delete-window)
|
|
(global-set-key (kbd "M-h") #'windmove-left)
|
|
(global-set-key (kbd "M-l") #'windmove-right)
|
|
(global-set-key (kbd "M-j") #'windmove-down)
|
|
(global-set-key (kbd "M-k") #'windmove-up)
|
|
|
|
|
|
;; rebalance emacs windows after splits are created
|
|
(defadvice split-window-below (after rebalance-windows activate)
|
|
(balance-windows))
|
|
|
|
(defadvice split-window-right (after rebalance-windows activate)
|
|
(balance-windows))
|
|
|
|
(defadvice delete-window (after rebalance-window activate)
|
|
(balance-windows))
|
|
|
|
|
|
;; highlight lines that are over 100 characters long
|
|
(use-package whitespace
|
|
:init
|
|
(setq whitespace-line-column 100)
|
|
(setq whitespace-style '(face lines-tail)))
|
|
|
|
|
|
;; trim whitespace on save
|
|
(add-hook 'before-save-hook #'delete-trailing-whitespace)
|
|
|
|
|
|
;; disable GUI scrollbars
|
|
(when (display-graphic-p)
|
|
(scroll-bar-mode -1))
|
|
|
|
|
|
;; use tabs instead of spaces
|
|
(setq-default indent-tabs-mode nil)
|
|
|
|
|
|
;; automatically follow symlinks
|
|
(setq vc-follow-symlinks t)
|
|
|
|
|
|
;; fullscreen settings
|
|
(setq ns-use-native-fullscreen nil)
|
|
|
|
|
|
;; clojure REPL support
|
|
(defun wpc/find-or-create-clojure-or-clojurescript-repl ()
|
|
(interactive)
|
|
(with-current-buffer (current-buffer)
|
|
(let ((buffer-name (wpc/buffer-name-for-clojure-mode major-mode))
|
|
(repl-function (wpc/repl-function-for-clojure-mode major-mode)))
|
|
(if (get-buffer buffer-name)
|
|
(switch-to-buffer buffer-name)
|
|
(funcall repl-function)))))
|
|
|
|
(defun wpc/buffer-name-for-clojure-mode (mode)
|
|
(require 'projectile)
|
|
(let* ((project-name (projectile-project-name))
|
|
(cljs-name (concat "*cider-repl CLJS " project-name "*"))
|
|
(clj-name (concat "*cider-repl " project-name "*")))
|
|
(cond ((eq mode 'clojurescript-mode) cljs-name)
|
|
((eq mode 'clojure-mode) clj-name)
|
|
((eq mode 'clojurec-mode) cljs-name))))
|
|
|
|
(defun wpc/repl-function-for-clojure-mode (mode)
|
|
(require 'projectile)
|
|
(let ((project-name (projectile-project-name))
|
|
(cljs-fn #'cider-jack-in-clojurescript)
|
|
(clj-fn #'cider-jack-in))
|
|
(cond ((eq mode 'clojurescript-mode) cljs-fn)
|
|
((eq mode 'clojure-mode) clj-fn)
|
|
((eq mode 'clojurec-mode) cljs-fn))))
|
|
|
|
(defun wpc/cider/repl-set-ns-and-eval-buffer ()
|
|
(interactive)
|
|
(with-current-buffer (current-buffer)
|
|
(call-interactively #'cider-eval-buffer)
|
|
(call-interactively #'cider-repl-set-ns)))
|
|
|
|
(use-package cider
|
|
;; TODO: define REPL settings as a minor-mode that gets run when specific REPLs boot
|
|
:bind (:map cider-repl-mode-map
|
|
("C-l" . cider-repl-clear-buffer)
|
|
("C-u" . kill-whole-line))
|
|
:init
|
|
(setq cider-cljs-lein-repl
|
|
"(do (require 'figwheel-sidecar.repl-api)
|
|
(figwheel-sidecar.repl-api/start-figwheel!)
|
|
(figwheel-sidecar.repl-api/cljs-repl))")
|
|
(setq cider-prompt-for-symbol nil)
|
|
:config
|
|
(define-key cider-repl-mode-map (kbd "<up>") #'cider-repl-previous-input)
|
|
(define-key cider-repl-mode-map (kbd "<down>") #'cider-repl-next-input)
|
|
(define-key clojurescript-mode-map (kbd "C-c M-j") #'wpc/find-or-create-clojure-or-clojurescript-repl))
|
|
|
|
|
|
|
|
;; premium Emacs themes
|
|
(use-package doom-themes
|
|
:config
|
|
(setq doom-themes-enable-bold t)
|
|
doom-themes-enable-italic t
|
|
(load-theme 'doom-one t)
|
|
(doom-themes-visual-bell-config)
|
|
(doom-themes-org-config))
|
|
|
|
|
|
;; kbd discovery
|
|
(use-package which-key
|
|
:init
|
|
(setq which-key-idle-delay 0.25)
|
|
:config
|
|
(which-key-mode))
|
|
|
|
|
|
;; targeted line jumping Emacs style
|
|
(use-package avy
|
|
:bind
|
|
(("C-'" . avy-goto-char)))
|
|
|
|
|
|
;; completion framework
|
|
(use-package ivy
|
|
:config
|
|
(use-package all-the-icons-ivy
|
|
:config
|
|
(all-the-icons-ivy-setup))
|
|
(ivy-mode t))
|
|
|
|
|
|
;; client for git
|
|
(use-package magit)
|
|
|
|
|
|
;; ido-based M-x
|
|
(use-package smex
|
|
:bind
|
|
("M-x" . smex)
|
|
("M-X" . smex-major-mode-commands)
|
|
:init
|
|
;; smex (ido) configuration
|
|
(require 'ido)
|
|
(defun wpc/bind-ido-keys ()
|
|
"Adds custom KBDs for ido. This function is recommended in the ido source code."
|
|
(define-key ido-completion-map (kbd "<tab>") #'ido-next-match)
|
|
(define-key ido-completion-map (kbd "<backtab>") #'ido-prev-match))
|
|
(add-hook 'ido-setup-hook #'wpc/bind-ido-keys)
|
|
:config
|
|
(smex-initialize))
|
|
|
|
|
|
;; interactive buffer searching
|
|
(use-package swiper
|
|
:bind
|
|
("C-s" . swiper)
|
|
("C-r" . swiper))
|
|
|
|
|
|
(use-package markdown-mode)
|