O3777TK2IVZ6LQATEWWIICGJY3GXO4MOUHZ73ENZFSY3VW4Q2DQAC
O44NSJ7NBP6VO6BMDKN4XID4SLPHLQQVN6AC3PU3XX5BGD3XGZZQC
RXCY7LD6ZRIOIKZEYKLMCYPMQPXF4DOEEFBDLVR2B22BXLZJFFBQC
A3TVGLVHSVLMEHLHB3TPBSD3QGNVGX3DIK6BEBDTTHWBNW4ALMRAC
IOXOZB2VUXVUEINLFBT4SPSJV32X5ZFT5FKSVRAIEXEFQJLG6MHQC
LA4734RIK7CSKUNJCTCI2KCBPNOKELRXVTW6HEPWY65LSYSA3CWAC
7F7T4E5VD2K7I2YRWYPP7EFJTAII5O6LCXDZ3JDXCVOEBJK7HSJQC
6N46BCIIDUA2NCB7VHX6E47WNYYRSDMBHDOABZSVEEMJXWH2LLOAC
BWGNLG4PJFLOW4GDWTXIE46CQT5DKZOZZKCDJ5AQI3Y6VBJRY3YQC
UIXIJMKKE7STQ65EALHSRFO7J64YCRPRQOQRAX7FJ27455W4X3WAC
FWKGBY6ODB6RTZHDHDXF6HUTCJHVY3FW2BXLBDYTRIXCUWSR43TQC
ZEEXPVMSAXE2MINLJT4FOIFWZ5QBZK56EHF7644KKC2IYVPEPYVQC
2GNS6EEXJ7EEZWESALVQ2QOGEVWOEE4VC6HOKCLL7UTEPFACJYKQC
YXDBKG5MWREH25GV2RUUW7ZI4P2XBNMZSB77WND3A6LUAL4NN63QC
ZUIZBW4PM62HWVU6ATCISLO2FNRPZMLAGJIGTNNOOLBGY2IH7QMQC
CRI7QVNA3MX55HFSAOS44NFO7COXIGLLOWU3GLROZM77TQ52J46AC
NTKY2LPKFRS6RYKCYNW43TVCRNPTHG75PZ5KZHLHAZYTTLDK4EEQC
RBGV5L2RZ3QLWUYDVYEZ4YVTUS5BD4VYUQSYSPV2GXU6BSV3EFIQC
PD25BRQUV6E3SZVTHGTC5M4UIGV763U2E73CTND5O2LYWOPWZJIQC
VVZTDOPJG76P5AVXU4VS3GXXNLKDPMFVLJZUD3E435KX4A3ZCG7AC
3YIUSMARD6GW5TXV7VTC6U5YGPCTD63QATPKBQUTEO7VOFNS3N3AC
QQKAMHWEDU5EQN4EEJ4ZTSRCHVU5XNNFZ3UPJ7FSFR23LBAF4IRQC
;;;; SLIME SETUP {{{
;; (load (expand-file-name "~/quicklisp/slime-helper.el"))
(require 'slime)
(global-set-key (kbd "C-c x") 'slime-export-symbol-at-point)
(when (and (boundp 'common-lisp-hyperspec-root)
(string-prefix-p "/" common-lisp-hyperspec-root))
(setq common-lisp-hyperspec-root
(concat "file://" common-lisp-hyperspec-root)))
;; Replace "sbcl" with the path to your implementation
(modify-syntax-entry ?- "w" lisp-mode-syntax-table)
(modify-syntax-entry ?* "w" lisp-mode-syntax-table)
(modify-syntax-entry ?+ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?! "w" lisp-mode-syntax-table)
(modify-syntax-entry ?$ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?% "w" lisp-mode-syntax-table)
(modify-syntax-entry ?& "w" lisp-mode-syntax-table)
(modify-syntax-entry ?% "w" lisp-mode-syntax-table)
(modify-syntax-entry ?= "w" lisp-mode-syntax-table)
(modify-syntax-entry ?< "w" lisp-mode-syntax-table)
(modify-syntax-entry ?> "w" lisp-mode-syntax-table)
(modify-syntax-entry 91 "(" lisp-mode-syntax-table)
(modify-syntax-entry 93 ")" lisp-mode-syntax-table)
;;(modify-syntax-entry ?@ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?^ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?_ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?~ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?. "w" lisp-mode-syntax-table)
(modify-syntax-entry ?\[ "(]" lisp-mode-syntax-table)
(modify-syntax-entry ?\] ")[" lisp-mode-syntax-table)
(modify-syntax-entry ?\{ "(}" lisp-mode-syntax-table)
(modify-syntax-entry ?\} "){" lisp-mode-syntax-table)
(setq shr-inhibit-images t
shr-use-fonts nil)
(defun fwoar--clhs-lookup (&rest args)
(let ((browse-url-browser-function 'eww-browse-url))
(hyperspec-lookup (word-at-point))))
(pushnew (list ?h "Check hyperspec" #'fwoar--clhs-lookup)
slime-selector-methods
:key #'car)
(find-file (if (not (null (cdr systems)))
(helm-comp-read "system:" systems)
(car systems)))))
slime-selector-methods
:key #'car)
;;;;; }}}
With ARG positive N, absorb that many expressions.
Examples:
(do-stuff 1) (save-excursion
(save-excursion -> |(do-stuff 1)
|(do-stuff 2)) (do-stuff 2))
foo bar (concat |baz quux) -> (concat |foo bar baz quux) ;; 2"
(interactive "p")
(sp-forward-whitespace)
(let* ((old (point))
(raise (progn
(sp-end-of-sexp)
(buffer-substring (point) old))))
(delete-region old (point))
(sp-forward-slurp-sexp arg)
(sp-backward-whitespace)
(sp-end-of-sexp)
(insert raise)
(save-excursion
(sp-backward-up-sexp)
(indent-sexp)))
(sp-backward-whitespace))
(defslime-repl-shortcut fwoar--slime-repl-load-asd ("load-asd")
(:handler (lambda ()
(interactive)
(slime-eval-async (cons 'cl:progn
(mapcar (lambda (it)
`(cl:progn (asdf:load-asd ,it) ,it))
system-files))
(lambda (r)
(message "Loading ASDs done: %s" r))))))
(:one-liner "Load asd for current project"))
(comment (defslime-repl-shortcut fwoar--slime-repl-quickload ("quickload")
(:handler (lambda ()
(interactive)
(slime-eval-async (cons 'cl:progn
(mapcar (lambda (it)
`(cl:progn (asdf:load-asd ,it) ,it))
system-files))
(lambda (r)
(message "Loading ASDs done: %s" r))))))
(:one-liner "Load asd for current project")))
(let ((system-files (fwoar--get-asds)))
(let ((system-files (fwoar--get-asds)))
(setq slime-contribs '(slime-fancy
slime-company
slime-macrostep
slime-trace-dialog
slime-mdot-fu
slime-buffer-streams
slime-indentation)
slime-export-save-file t)
(slime-setup slime-contribs)
(defun sp-absorb-forward-sexp (&optional arg)
"Absorb previous expression.
Save the expressions preceding point and delete them. Then slurp
an expression backward and insert the saved expressions.
;;(message (format "s-c-c is: %s" slime-company-completion))
(defun slime-ecl ()
(interactive)
(slime)))
(defun slime-cmucl ()
(interactive)
(slime)))
(defun slime-sbcl ()
(interactive)
(slime)))
(defun slime-ccl ()
(interactive)
(slime)))
(defun find-use-clause (current-form)
(when current-form
(destructuring-bind (discriminator . packages) current-form
(case discriminator
(:use (remove-if (op (or (eql :cl _)))
(cdr current-form)))
(defpackage (find-use-clause
(find-if (lambda (f)
(and (listp f)
(eql (car f) :use)))
'(defpackage :tracking-sim (:use :cl :alexandria :serapeum) (:export)))))))))
(defun load-package-uses ()
(interactive)
(slime-eval-async `(ql:quickload ',(find-use-clause (list-at-point)))))
(let ((inferior-lisp-program "ccl")
(slime-lisp-implementations nil))
(let ((inferior-lisp-program "sbcl")
(slime-lisp-implementations nil))
(let ((inferior-lisp-program "cmucl")
(slime-lisp-implementations nil))
(let ((inferior-lisp-program "ecl")
(slime-lisp-implementations nil))
(pushnew (list ?S "Goto System" #'fwoar--find-system)
(cl-defgeneric fwoar--find-system ())
(cl-defmethod fwoar--find-system (&context (major-mode lisp-mode))
(let ((systems (fwoar--get-asds)))
(defun fwoar--get-asds ()
(let ((dir-of-asd (locate-dominating-file default-directory
(lambda (n)
(directory-files n nil "^[^.#][^#]*[.]asd$")))))
(when dir-of-asd
(directory-files dir-of-asd
t "^[^.#][^#]*[.]asd$"))))
(evil-define-key 'normal lisp-mode-map "gd" 'slime-edit-definition)
(defun setup-lisp-mode ()
(unless (string= "*slime-scratch*" (buffer-name))
(smartparens-strict-mode 1)
(evil-smartparens-mode 1)
(aggressive-indent-mode 1))
(define-key evil-insert-state-map "^N" 'slime-fuzzy-indent-and-complete-symbol)
(rainbow-delimiters-mode))
(add-hook 'lisp-mode-hook 'setup-lisp-mode)
(add-hook 'emacs-lisp-mode-hook 'setup-lisp-mode)
(setq inferior-lisp-program "~/sbcl/bin/sbcl")
(defmacro define-lisp-implementations (&rest decl)
`(progn
,@(cl-loop for (symbol . args) in decl
collect `(progn
(defun ,symbol ()
(interactive)
(slime ',symbol))
(cl-pushnew '(,symbol ,@args) slime-lisp-implementations
:key 'car)))))
(with-eval-after-load "slime"
(when (or (eq system-type 'gnu/linux)
(eq system-type 'darwin))
(define-lisp-implementations
(abcl ("abcl"))
(ccl ("ccl"))
(clisp ("clisp"))
(cmucl ("cmucl" "-quiet"))
(ecl ("ecl"))
;;(mkcl ("mkcl"))
;;(xcl ("xcl"))
(sbcl ("sbcl" "--dynamic-space-size" "8192")))))
;; put slime-company in load-path
;; (require 'slime-company)
(use-package slime-company
:ensure t)
(add-to-list 'load-path (fwoar-git-repo "3dp/slime/"
"git@github.com:slime/slime.git"
"https://github.com/slime/slime.git"))
(defun wrap-with-doublequote (&optional arg)
(interactive "P")
(sp-wrap-with-pair "\""))
(defun fwoar-delete-mru-window ()
(interactive)
(delete-window
(get-mru-window nil nil t)))
(defun wrap-in-dollar-brace
(&optional arg)
(interactive "P")
(sp-wrap-with-pair "${"))
(use-package evil
:ensure t
:config
(advice-add 'evil-delete-marks :after
(lambda (&rest args)
(evil-visual-mark-render)))
(define-key evil-insert-state-map (kbd "TAB") 'company-indent-or-complete-common)
(evil-mode)
(progn ;; navigation
(define-key evil-normal-state-map " f" 'helm-projectile)
(define-key evil-normal-state-map " j" 'helm-buffers-list)
(define-key evil-normal-state-map " u" 'undo-tree-visualize))
(progn ;; completion
(define-key evil-normal-state-map (kbd "TAB") 'company-indent-or-complete-common)
(define-key evil-insert-state-map (kbd "TAB") 'company-indent-or-complete-common))
(progn ;; narrowing
(define-key evil-normal-state-map " n(" 'sp-narrow-to-sexp)
(define-key evil-normal-state-map " n)" 'sp-narrow-to-sexp)
(define-key evil-normal-state-map " nn" 'narrow-to-defun)
(define-key evil-normal-state-map " nr" 'narrow-to-region)
(define-key evil-normal-state-map " nw" 'widen)))
(use-package centaur-tabs
:ensure t
:after evil
:config
(setq centaur-tabs-adjust-buffer-order t
centaur-tabs-adjust-buffer-order 'left)
(centaur-tabs-enable-buffer-reordering)
(define-key evil-normal-state-map "gt" 'centaur-tabs-forward-tab)
(define-key global-map (kbd "<header-line> <wheel-up>") 'centaur-tabs-forward-tab)
(define-key global-map (kbd "s-}") 'centaur-tabs-forward-tab)
(define-key evil-normal-state-map "gT" 'centaur-tabs-backward-tab)
(define-key global-map (kbd "<header-line> <wheel-down>") 'centaur-tabs-backward-tab)
(define-key global-map (kbd "s-{") 'centaur-tabs-backward-tab))
(progn ;; splicing
(define-key evil-normal-state-map ",S" 'sp-splice-sexp)
(define-key cider-mode-map (kbd "C-, S") 'sp-splice-sexp)
(define-key cider-mode-map (kbd "C-, C-S") 'sp-splice-sexp)
(define-key evil-normal-state-map ",A" 'sp-splice-sexp-killing-backward)
(define-key cider-mode-map (kbd "C-, A") 'sp-splice-sexp-killing-backward)
(define-key cider-mode-map (kbd "C-, C-A") 'sp-splice-sexp-killing-backward)
(define-key evil-normal-state-map ",D" 'sp-splice-sexp-killing-forward)
(define-key cider-mode-map (kbd "C-, D") 'sp-splice-sexp-killing-forward)
(define-key cider-mode-map (kbd "C-, C-D") 'sp-splice-sexp-killing-forward)
(define-key evil-normal-state-map ",F" 'sp-splice-sexp-killing-around)
(define-key cider-mode-map (kbd "C-, F") 'sp-splice-sexp-killing-around)
(define-key cider-mode-map (kbd "C-, C-F") 'sp-splice-sexp-killing-around))
(progn ;; barf/slurp
(define-key evil-normal-state-map ",," 'sp-backward-barf-sexp)
(define-key cider-mode-map (kbd "C-, ,") 'sp-backward-barf-sexp)
(define-key cider-mode-map (kbd "C-, C-,") 'sp-backward-barf-sexp)
(define-key evil-normal-state-map ",." 'sp-forward-barf-sexp)
(define-key cider-mode-map (kbd "C-, .") 'sp-forward-barf-sexp)
(define-key cider-mode-map (kbd "C-, C-.") 'sp-forward-barf-sexp)
(define-key evil-normal-state-map ",<" 'sp-backward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, <") 'sp-backward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, C-<") 'sp-backward-slurp-sexp)
(define-key evil-normal-state-map ",>" 'sp-forward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, >") 'sp-forward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, C->") 'sp-forward-slurp-sexp))
(progn ;; misc
(define-key evil-normal-state-map ",~" 'sp-convolute-sexp)
(define-key evil-normal-state-map ",a" 'sp-absorb-sexp)
(define-key evil-normal-state-map ",e" 'sp-emit-sexp)
(define-key evil-normal-state-map ",`" 'sp-clone-sexp)
(define-key evil-normal-state-map ",J" 'sp-join-sexp)
(define-key evil-normal-state-map ",|" 'sp-split-sexp))
(define-key evil-normal-state-map ",w$" 'wrap-in-dollar-brace)
(define-key evil-normal-state-map ",w{" 'sp-wrap-curly)
(define-key evil-normal-state-map ",w}" 'sp-wrap-curly)
(define-key evil-normal-state-map ",w[" 'sp-wrap-square)
(define-key evil-normal-state-map ",w]" 'sp-wrap-square)
(define-key evil-normal-state-map ",w\"" 'wrap-with-doublequote)
(define-key cider-mode-map (kbd "C-, w \"") 'sp-wrap-doublequote))
(define-key global-map (kbd "C-, w [") 'sp-wrap-square)
(define-key global-map (kbd "C-, <escape>") 'sp-wrap-square)
(define-key global-map (kbd "C-, [") 'sp-wrap-square)
(define-key global-map (kbd "C-, w ]") 'sp-wrap-square)
(define-key global-map (kbd "C-, C-]") 'sp-wrap-square)
(define-key global-map (kbd "C-, ]") 'sp-wrap-square)
(define-key global-map (kbd "C-, {") 'sp-wrap-curly)
(define-key global-map (kbd "C-, C-{") 'sp-wrap-curly)
(define-key global-map (kbd "C-, }") 'sp-wrap-curly)
(define-key global-map (kbd "C-, C-}") 'sp-wrap-curly)
(define-key global-map (kbd "C-, w {") 'sp-wrap-curly)
(define-key global-map (kbd "C-, w }") 'sp-wrap-curly)
(define-key evil-normal-state-map (kbd "C-, $") 'wrap-in-dollar-brace)
(define-key evil-normal-state-map ",w(" 'sp-wrap-round)
(define-key evil-normal-state-map ",w)" 'sp-wrap-round)
(define-key global-map (kbd "C-, (") 'sp-wrap-round)
(define-key global-map (kbd "C-, C-(") 'sp-wrap-round)
(define-key global-map (kbd "C-, )") 'sp-wrap-round)
(define-key global-map (kbd "C-, C-)") 'sp-wrap-round)
(progn ;; wrapping
(define-key evil-normal-state-map ",W" 'sp-wrap-round)
(define-key evil-normal-state-map (kbd "C-, W") 'sp-wrap-round)
(define-key evil-normal-state-map (kbd "C-, C-W") 'sp-wrap-round)
(use-package evil-surround
:ensure t
:after evil
:config
(global-evil-surround-mode))
(use-package evil-leader
:after evil
:config (evil-leader/set-leader "ß"))
(use-package evil-smartparens
:ensure t
:after evil smartparens
:config
(evil-smartparens-mode 1)
:ensure t
(progn ;; workaround until this fixed: https://github.com/emacs-evil/evil/issues/1129
;; or this: https://github.com/emacs-evil/evil/pull/1130
(defun config/fix-evil-window-move (orig-fun &rest args)
"Close Treemacs while moving windows around."
(dolist (func '(evil-window-move-far-left
evil-window-move-far-right
evil-window-move-very-top
evil-window-move-very-bottom))
(advice-add func
:around #'config/fix-evil-window-move)))
)
(if (fboundp 'treemacs-get-local-window)
(let* ((treemacs-window (treemacs-get-local-window))
(is-active (and treemacs-window (window-live-p treemacs-window))))
(when is-active (treemacs))
(apply orig-fun args)
(when is-active
(save-selected-window
(treemacs))))
(apply orig-fun args)))
(define-key evil-motion-state-map (kbd "C-w C-w") 'evil-window-mru)
(define-key evil-normal-state-map "ZZ" 'save-buffer)
(define-key evil-motion-state-map (kbd "C-w C-o") 'fwoar-delete-mru-window)
;;;; SLIME SETUP {{{
;; (load (expand-file-name "~/quicklisp/slime-helper.el"))
(add-to-list 'load-path "~/git_repos/3dp/slime/")
(require 'slime)
(use-package slime-company
:ensure t)
(global-set-key (kbd "C-c x") 'slime-export-symbol-at-point)
(when (and (boundp 'common-lisp-hyperspec-root)
(string-prefix-p "/" common-lisp-hyperspec-root))
(setq common-lisp-hyperspec-root
(concat "file://" common-lisp-hyperspec-root)))
;; Replace "sbcl" with the path to your implementation
(setq inferior-lisp-program "~/sbcl/bin/sbcl")
(add-hook 'lisp-mode-hook
'(lambda ()
;;(define-key evil-insert-state-map "^N" 'slime-fuzzy-indent-and-complete-symbol)
;; (unless (string= "*slime-scratch*" (buffer-name))
;; (paredit-mode)
;; (evil-paredit-mode))
(rainbow-delimiters-mode)))
(setq slime-contribs
'(slime-fancy
slime-company
slime-macrostep
slime-trace-dialog
slime-mdot-fu))
(modify-syntax-entry ?- "w" lisp-mode-syntax-table)
(modify-syntax-entry ?* "w" lisp-mode-syntax-table)
(modify-syntax-entry ?+ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?! "w" lisp-mode-syntax-table)
(modify-syntax-entry ?$ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?% "w" lisp-mode-syntax-table)
(modify-syntax-entry ?& "w" lisp-mode-syntax-table)
(modify-syntax-entry ?% "w" lisp-mode-syntax-table)
(modify-syntax-entry ?= "w" lisp-mode-syntax-table)
(modify-syntax-entry ?< "w" lisp-mode-syntax-table)
(modify-syntax-entry ?> "w" lisp-mode-syntax-table)
(modify-syntax-entry 91 "(" lisp-mode-syntax-table)
(modify-syntax-entry 93 ")" lisp-mode-syntax-table)
;;(modify-syntax-entry ?@ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?^ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?_ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?~ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?. "w" lisp-mode-syntax-table)
(setq shr-inhibit-images t
shr-use-fonts nil)
(defun fwoar--clhs-lookup (&rest args)
(let ((browse-url-browser-function 'eww-browse-url))
(hyperspec-lookup (word-at-point))))
(pushnew (list ?h "Check hyperspec" #'fwoar--clhs-lookup)
slime-selector-methods
:key #'car)
(defun fwoar--slime-find-system ()
(let ((systems (directory-files
(locate-dominating-file default-directory
(lambda (n)
(directory-files n nil "^[^.#][^#]*[.]asd$")))
t "^[^.#][^#]*[.]asd$")))
(find-file (if (not (null (cdr systems)))
(helm-comp-read "system:" systems)
(car systems)))))
(pushnew (list ?S "Goto System" #'fwoar--slime-find-system)
slime-selector-methods
:key #'car)
;;;;; }}}
(use-package evil
:ensure t
:config
(advice-add 'evil-delete-marks :after
(lambda (&rest args)
(evil-visual-mark-render)))
(evil-define-key 'normal lisp-mode-map " o" 'slime-selector)
(define-key evil-insert-state-map (kbd "TAB") 'company-indent-or-complete-common)
(evil-mode)
(use-package evil-smartparens
:ensure t
:after smartparens
:config
(evil-smartparens-mode 1)
(progn ;; wrapping
(define-key evil-normal-state-map ",W" 'sp-wrap-round)
(define-key evil-normal-state-map ",w(" 'sp-wrap-round)
(define-key evil-normal-state-map ",w)" 'sp-wrap-round)
(define-key evil-normal-state-map ",w{" 'sp-wrap-curly)
(define-key evil-normal-state-map ",w}" 'sp-wrap-curly)
(define-key evil-normal-state-map ",w[" 'sp-wrap-square)
(define-key evil-normal-state-map ",w]" 'sp-wrap-square))
(progn ;; splicing
(define-key evil-normal-state-map ",S" 'sp-splice-sexp)
(define-key evil-normal-state-map ",A" 'sp-splice-sexp-killing-backward)
(define-key evil-normal-state-map ",D" 'sp-splice-sexp-killing-forward)
(define-key evil-normal-state-map ",F" 'sp-splice-sexp-killing-around))
(progn ;; barf/slurp
(define-key evil-normal-state-map ",," 'sp-backward-barf-sexp)
(define-key evil-normal-state-map ",." 'sp-forward-barf-sexp)
(define-key evil-normal-state-map ",<" 'sp-backward-slurp-sexp)
(define-key evil-normal-state-map ",>" 'sp-forward-slurp-sexp))
(progn ;; misc
(define-key evil-normal-state-map ",~" 'sp-convolute-sexp)
(define-key evil-normal-state-map ",a" 'sp-absorb-sexp)
(define-key evil-normal-state-map ",e" 'sp-emit-sexp)
(define-key evil-normal-state-map ",`" 'sp-clone-sexp)
(define-key evil-normal-state-map ",J" 'sp-join-sexp)
(define-key evil-normal-state-map ",|" 'sp-split-sexp))
(progn ;; narrowing
(define-key evil-normal-state-map " n(" 'sp-narrow-to-sexp)
(define-key evil-normal-state-map " n)" 'sp-narrow-to-sexp)
(define-key evil-normal-state-map " nn" 'narrow-to-defun)
(define-key evil-normal-state-map " nr" 'narrow-to-region)
(define-key evil-normal-state-map " nw" 'widen)))
(progn ;; navigation
(define-key evil-normal-state-map " f" 'helm-projectile)
(define-key evil-normal-state-map " j" 'helm-buffers-list)
(define-key evil-normal-state-map " u" 'undo-tree-visualize))
(progn ;; completion
(define-key evil-normal-state-map (kbd "TAB") 'company-indent-or-complete-common)
(define-key evil-insert-state-map (kbd "TAB") 'company-indent-or-complete-common))
;; (use-package evil-paredit
;; :ensure t
;; :after paredit
;; :config
;; (evil-paredit-mode))
;;(use-package evil-numbers
;; :ensure t
;; :config
;; (global-set-key (kbd "C-c +") 'evil-numbers/inc-at-pt)
;; (global-set-key (kbd "C-c -") 'evil-numbers/dec-at-pt))
(use-package evil-surround
:ensure t
:config
(global-evil-surround-mode))
(use-package evil-leader
:config (evil-leader/set-leader "ß")))
;;;; SLIME SETUP {{{
;; (load (expand-file-name "~/quicklisp/slime-helper.el"))
(add-to-list 'load-path (fwoar-git-repo "3dp/slime/"
"git@github.com:slime/slime.git"
"https://github.com/slime/slime.git"))
(require 'slime)
(use-package slime-company
:ensure t)
;; put slime-company in load-path
;; (require 'slime-company)
(defmacro define-lisp-implementations (&rest decl)
`(progn
,@(cl-loop for (symbol . args) in decl
collect `(progn
(defun ,symbol ()
(interactive)
(slime ',symbol))
(cl-pushnew '(,symbol ,@args) slime-lisp-implementations
:key 'car)))))
(with-eval-after-load "slime"
(when (or (eq system-type 'gnu/linux)
(eq system-type 'darwin))
(define-lisp-implementations
(abcl ("abcl"))
(ccl ("ccl"))
(clisp ("clisp"))
(cmucl ("cmucl" "-quiet"))
(ecl ("ecl"))
;;(mkcl ("mkcl"))
;;(xcl ("xcl"))
(sbcl ("sbcl" "--dynamic-space-size" "8192")))))
(global-set-key (kbd "C-c x") 'slime-export-symbol-at-point)
(when (and (boundp 'common-lisp-hyperspec-root)
(string-prefix-p "/" common-lisp-hyperspec-root))
(setq common-lisp-hyperspec-root
(concat "file://" common-lisp-hyperspec-root)))
;; Replace "sbcl" with the path to your implementation
(setq inferior-lisp-program "~/sbcl/bin/sbcl")
(defun setup-lisp-mode ()
(unless (string= "*slime-scratch*" (buffer-name))
(smartparens-strict-mode 1)
(evil-smartparens-mode 1)
(aggressive-indent-mode 1))
(define-key evil-insert-state-map "^N" 'slime-fuzzy-indent-and-complete-symbol)
(rainbow-delimiters-mode))
(add-hook 'lisp-mode-hook 'setup-lisp-mode)
(add-hook 'emacs-lisp-mode-hook 'setup-lisp-mode)
(evil-define-key 'normal lisp-mode-map "gd" 'slime-edit-definition)
(modify-syntax-entry ?- "w" lisp-mode-syntax-table)
(modify-syntax-entry ?* "w" lisp-mode-syntax-table)
(modify-syntax-entry ?+ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?! "w" lisp-mode-syntax-table)
(modify-syntax-entry ?$ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?% "w" lisp-mode-syntax-table)
(modify-syntax-entry ?& "w" lisp-mode-syntax-table)
(modify-syntax-entry ?% "w" lisp-mode-syntax-table)
(modify-syntax-entry ?= "w" lisp-mode-syntax-table)
(modify-syntax-entry ?< "w" lisp-mode-syntax-table)
(modify-syntax-entry ?> "w" lisp-mode-syntax-table)
(modify-syntax-entry 91 "(" lisp-mode-syntax-table)
(modify-syntax-entry 93 ")" lisp-mode-syntax-table)
;;(modify-syntax-entry ?@ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?^ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?_ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?~ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?. "w" lisp-mode-syntax-table)
(modify-syntax-entry ?\[ "(]" lisp-mode-syntax-table)
(modify-syntax-entry ?\] ")[" lisp-mode-syntax-table)
(modify-syntax-entry ?\{ "(}" lisp-mode-syntax-table)
(modify-syntax-entry ?\} "){" lisp-mode-syntax-table)
(setq shr-inhibit-images t
shr-use-fonts nil)
(defun fwoar--clhs-lookup (&rest args)
(let ((browse-url-browser-function 'eww-browse-url))
(hyperspec-lookup (word-at-point))))
(pushnew (list ?h "Check hyperspec" #'fwoar--clhs-lookup)
slime-selector-methods
:key #'car)
(defun fwoar--get-asds ()
(let ((dir-of-asd (locate-dominating-file default-directory
(lambda (n)
(directory-files n nil "^[^.#][^#]*[.]asd$")))))
(when dir-of-asd
(directory-files dir-of-asd
t "^[^.#][^#]*[.]asd$"))))
(cl-defgeneric fwoar--find-system ())
(cl-defmethod fwoar--find-system (&context (major-mode lisp-mode))
(let ((systems (fwoar--get-asds)))
(find-file (if (not (null (cdr systems)))
(helm-comp-read "system:" systems)
(car systems)))))
(pushnew (list ?S "Goto System" #'fwoar--find-system)
slime-selector-methods
:key #'car)
(defun slime-ecl ()
(interactive)
(let ((inferior-lisp-program "ecl")
(slime-lisp-implementations nil))
(slime)))
(defun slime-cmucl ()
(interactive)
(let ((inferior-lisp-program "cmucl")
(slime-lisp-implementations nil))
(slime)))
(defun slime-sbcl ()
(interactive)
(let ((inferior-lisp-program "sbcl")
(slime-lisp-implementations nil))
(slime)))
(defun slime-ccl ()
(interactive)
(let ((inferior-lisp-program "ccl")
(slime-lisp-implementations nil))
(slime)))
(defun find-use-clause (current-form)
(when current-form
(destructuring-bind (discriminator . packages) current-form
(case discriminator
(:use (remove-if (op (or (eql :cl _)))
(cdr current-form)))
(defpackage (find-use-clause
(find-if (lambda (f)
(and (listp f)
(eql (car f) :use)))
'(defpackage :tracking-sim (:use :cl :alexandria :serapeum) (:export)))))))))
(defun load-package-uses ()
(interactive)
(slime-eval-async `(ql:quickload ',(find-use-clause (list-at-point)))))
;;(message (format "s-c-c is: %s" slime-company-completion))
;;;;; }}}
(defun sp-absorb-forward-sexp (&optional arg)
"Absorb previous expression.
Save the expressions preceding point and delete them. Then slurp
an expression backward and insert the saved expressions.
With ARG positive N, absorb that many expressions.
Examples:
(do-stuff 1) (save-excursion
(save-excursion -> |(do-stuff 1)
|(do-stuff 2)) (do-stuff 2))
foo bar (concat |baz quux) -> (concat |foo bar baz quux) ;; 2"
(interactive "p")
(sp-forward-whitespace)
(let* ((old (point))
(raise (progn
(sp-end-of-sexp)
(buffer-substring (point) old))))
(delete-region old (point))
(sp-forward-slurp-sexp arg)
(sp-backward-whitespace)
(sp-end-of-sexp)
(insert raise)
(save-excursion
(sp-backward-up-sexp)
(indent-sexp)))
(sp-backward-whitespace))
(setq slime-contribs '(slime-fancy
slime-company
slime-macrostep
slime-trace-dialog
slime-mdot-fu
slime-buffer-streams
slime-indentation)
slime-export-save-file t)
(slime-setup slime-contribs)
(defslime-repl-shortcut fwoar--slime-repl-load-asd ("load-asd")
(:handler (lambda ()
(interactive)
(let ((system-files (fwoar--get-asds)))
(slime-eval-async (cons 'cl:progn
(mapcar (lambda (it)
`(cl:progn (asdf:load-asd ,it) ,it))
system-files))
(lambda (r)
(message "Loading ASDs done: %s" r))))))
(:one-liner "Load asd for current project"))
(comment (defslime-repl-shortcut fwoar--slime-repl-quickload ("quickload")
(:handler (lambda ()
(interactive)
(let ((system-files (fwoar--get-asds)))
(slime-eval-async (cons 'cl:progn
(mapcar (lambda (it)
`(cl:progn (asdf:load-asd ,it) ,it))
system-files))
(lambda (r)
(message "Loading ASDs done: %s" r))))))
(:one-liner "Load asd for current project")))
(defun wrap-with-doublequote (&optional arg)
(interactive "P")
(sp-wrap-with-pair "\""))
(defun wrap-in-dollar-brace
(&optional arg)
(interactive "P")
(sp-wrap-with-pair "${"))
(defun fwoar-delete-mru-window ()
(interactive)
(delete-window
(get-mru-window nil nil t)))
(use-package evil
:ensure t
:config
(define-key evil-motion-state-map (kbd "C-w C-o") 'fwoar-delete-mru-window)
(define-key evil-motion-state-map (kbd "C-w C-w") 'evil-window-mru)
(define-key evil-normal-state-map "ZZ" 'save-buffer)
(advice-add 'evil-delete-marks :after
(lambda (&rest args)
(evil-visual-mark-render)))
(define-key evil-insert-state-map (kbd "TAB") 'company-indent-or-complete-common)
(evil-mode)
(progn ;; navigation
(define-key evil-normal-state-map " f" 'helm-projectile)
(define-key evil-normal-state-map " j" 'helm-buffers-list)
(define-key evil-normal-state-map " u" 'undo-tree-visualize))
(progn ;; completion
(define-key evil-normal-state-map (kbd "TAB") 'company-indent-or-complete-common)
(define-key evil-insert-state-map (kbd "TAB") 'company-indent-or-complete-common))
(progn ;; workaround until this fixed: https://github.com/emacs-evil/evil/issues/1129
;; or this: https://github.com/emacs-evil/evil/pull/1130
(defun config/fix-evil-window-move (orig-fun &rest args)
"Close Treemacs while moving windows around."
(if (fboundp 'treemacs-get-local-window)
(let* ((treemacs-window (treemacs-get-local-window))
(is-active (and treemacs-window (window-live-p treemacs-window))))
(when is-active (treemacs))
(apply orig-fun args)
(when is-active
(save-selected-window
(treemacs))))
(apply orig-fun args)))
(dolist (func '(evil-window-move-far-left
evil-window-move-far-right
evil-window-move-very-top
evil-window-move-very-bottom))
(advice-add func
:around #'config/fix-evil-window-move)))
)
(use-package evil-surround
:ensure t
:after evil
:config
(global-evil-surround-mode))
(use-package evil-leader
:ensure t
:after evil
:config (evil-leader/set-leader "ß"))
(use-package evil-smartparens
:ensure t
:after evil smartparens
:config
(evil-smartparens-mode 1)
(progn ;; wrapping
(define-key evil-normal-state-map ",W" 'sp-wrap-round)
(define-key evil-normal-state-map (kbd "C-, W") 'sp-wrap-round)
(define-key evil-normal-state-map (kbd "C-, C-W") 'sp-wrap-round)
(define-key evil-normal-state-map ",w(" 'sp-wrap-round)
(define-key evil-normal-state-map ",w)" 'sp-wrap-round)
(define-key global-map (kbd "C-, (") 'sp-wrap-round)
(define-key global-map (kbd "C-, C-(") 'sp-wrap-round)
(define-key global-map (kbd "C-, )") 'sp-wrap-round)
(define-key global-map (kbd "C-, C-)") 'sp-wrap-round)
(define-key evil-normal-state-map ",w$" 'wrap-in-dollar-brace)
(define-key evil-normal-state-map (kbd "C-, $") 'wrap-in-dollar-brace)
(define-key evil-normal-state-map ",w{" 'sp-wrap-curly)
(define-key evil-normal-state-map ",w}" 'sp-wrap-curly)
(define-key global-map (kbd "C-, {") 'sp-wrap-curly)
(define-key global-map (kbd "C-, C-{") 'sp-wrap-curly)
(define-key global-map (kbd "C-, }") 'sp-wrap-curly)
(define-key global-map (kbd "C-, C-}") 'sp-wrap-curly)
(define-key global-map (kbd "C-, w {") 'sp-wrap-curly)
(define-key global-map (kbd "C-, w }") 'sp-wrap-curly)
(define-key evil-normal-state-map ",w[" 'sp-wrap-square)
(define-key evil-normal-state-map ",w]" 'sp-wrap-square)
(define-key global-map (kbd "C-, w [") 'sp-wrap-square)
(define-key global-map (kbd "C-, <escape>") 'sp-wrap-square)
(define-key global-map (kbd "C-, [") 'sp-wrap-square)
(define-key global-map (kbd "C-, w ]") 'sp-wrap-square)
(define-key global-map (kbd "C-, C-]") 'sp-wrap-square)
(define-key global-map (kbd "C-, ]") 'sp-wrap-square)
(define-key evil-normal-state-map ",w\"" 'wrap-with-doublequote)
(define-key cider-mode-map (kbd "C-, w \"") 'sp-wrap-doublequote))
(progn ;; splicing
(define-key evil-normal-state-map ",S" 'sp-splice-sexp)
(define-key cider-mode-map (kbd "C-, S") 'sp-splice-sexp)
(define-key cider-mode-map (kbd "C-, C-S") 'sp-splice-sexp)
(define-key evil-normal-state-map ",A" 'sp-splice-sexp-killing-backward)
(define-key cider-mode-map (kbd "C-, A") 'sp-splice-sexp-killing-backward)
(define-key cider-mode-map (kbd "C-, C-A") 'sp-splice-sexp-killing-backward)
(define-key evil-normal-state-map ",D" 'sp-splice-sexp-killing-forward)
(define-key cider-mode-map (kbd "C-, D") 'sp-splice-sexp-killing-forward)
(define-key cider-mode-map (kbd "C-, C-D") 'sp-splice-sexp-killing-forward)
(define-key evil-normal-state-map ",F" 'sp-splice-sexp-killing-around)
(define-key cider-mode-map (kbd "C-, F") 'sp-splice-sexp-killing-around)
(define-key cider-mode-map (kbd "C-, C-F") 'sp-splice-sexp-killing-around))
(progn ;; barf/slurp
(define-key evil-normal-state-map ",," 'sp-backward-barf-sexp)
(define-key cider-mode-map (kbd "C-, ,") 'sp-backward-barf-sexp)
(define-key cider-mode-map (kbd "C-, C-,") 'sp-backward-barf-sexp)
(define-key evil-normal-state-map ",." 'sp-forward-barf-sexp)
(define-key cider-mode-map (kbd "C-, .") 'sp-forward-barf-sexp)
(define-key cider-mode-map (kbd "C-, C-.") 'sp-forward-barf-sexp)
(define-key evil-normal-state-map ",<" 'sp-backward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, <") 'sp-backward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, C-<") 'sp-backward-slurp-sexp)
(define-key evil-normal-state-map ",>" 'sp-forward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, >") 'sp-forward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, C->") 'sp-forward-slurp-sexp))
(progn ;; misc
(define-key evil-normal-state-map ",~" 'sp-convolute-sexp)
(define-key evil-normal-state-map ",a" 'sp-absorb-sexp)
(define-key evil-normal-state-map ",e" 'sp-emit-sexp)
(define-key evil-normal-state-map ",`" 'sp-clone-sexp)
(define-key evil-normal-state-map ",J" 'sp-join-sexp)
(define-key evil-normal-state-map ",|" 'sp-split-sexp))
(progn ;; narrowing
(define-key evil-normal-state-map " n(" 'sp-narrow-to-sexp)
(define-key evil-normal-state-map " n)" 'sp-narrow-to-sexp)
(define-key evil-normal-state-map " nn" 'narrow-to-defun)
(define-key evil-normal-state-map " nr" 'narrow-to-region)
(define-key evil-normal-state-map " nw" 'widen)))
(use-package centaur-tabs
:ensure t
:after evil
:config
(setq centaur-tabs-adjust-buffer-order t
centaur-tabs-adjust-buffer-order 'left)
(centaur-tabs-enable-buffer-reordering)
(define-key evil-normal-state-map "gt" 'centaur-tabs-forward-tab)
(define-key global-map (kbd "<header-line> <wheel-up>") 'centaur-tabs-forward-tab)
(define-key global-map (kbd "s-}") 'centaur-tabs-forward-tab)
(define-key evil-normal-state-map "gT" 'centaur-tabs-backward-tab)
(define-key global-map (kbd "<header-line> <wheel-down>") 'centaur-tabs-backward-tab)
(define-key global-map (kbd "s-{") 'centaur-tabs-backward-tab))
;;;; SLIME SETUP {{{
;; (load (expand-file-name "~/quicklisp/slime-helper.el"))
(add-to-list 'load-path (fwoar-git-repo "3dp/slime/"
"git@github.com:slime/slime.git"
"https://github.com/slime/slime.git"))
(require 'slime)
(use-package slime-company
:ensure t)
;; put slime-company in load-path
;; (require 'slime-company)
(defmacro define-lisp-implementations (&rest decl)
`(progn
,@(cl-loop for (symbol . args) in decl
collect `(progn
(defun ,symbol ()
(interactive)
(slime ',symbol))
(cl-pushnew '(,symbol ,@args) slime-lisp-implementations
:key 'car)))))
(with-eval-after-load "slime"
(when (or (eq system-type 'gnu/linux)
(eq system-type 'darwin))
(define-lisp-implementations
(abcl ("abcl"))
(ccl ("ccl"))
(clisp ("clisp"))
(cmucl ("cmucl" "-quiet"))
(ecl ("ecl"))
;;(mkcl ("mkcl"))
;;(xcl ("xcl"))
(sbcl ("sbcl" "--dynamic-space-size" "8192")))))
(global-set-key (kbd "C-c x") 'slime-export-symbol-at-point)
(when (and (boundp 'common-lisp-hyperspec-root)
(string-prefix-p "/" common-lisp-hyperspec-root))
(setq common-lisp-hyperspec-root
(concat "file://" common-lisp-hyperspec-root)))
;; Replace "sbcl" with the path to your implementation
(setq inferior-lisp-program "~/sbcl/bin/sbcl")
(defun setup-lisp-mode ()
(unless (string= "*slime-scratch*" (buffer-name))
(smartparens-strict-mode 1)
(evil-smartparens-mode 1)
(aggressive-indent-mode 1))
(define-key evil-insert-state-map "^N" 'slime-fuzzy-indent-and-complete-symbol)
(rainbow-delimiters-mode))
(add-hook 'lisp-mode-hook 'setup-lisp-mode)
(add-hook 'emacs-lisp-mode-hook 'setup-lisp-mode)
(evil-define-key 'normal lisp-mode-map "gd" 'slime-edit-definition)
(modify-syntax-entry ?- "w" lisp-mode-syntax-table)
(modify-syntax-entry ?* "w" lisp-mode-syntax-table)
(modify-syntax-entry ?+ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?! "w" lisp-mode-syntax-table)
(modify-syntax-entry ?$ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?% "w" lisp-mode-syntax-table)
(modify-syntax-entry ?& "w" lisp-mode-syntax-table)
(modify-syntax-entry ?% "w" lisp-mode-syntax-table)
(modify-syntax-entry ?= "w" lisp-mode-syntax-table)
(modify-syntax-entry ?< "w" lisp-mode-syntax-table)
(modify-syntax-entry ?> "w" lisp-mode-syntax-table)
(modify-syntax-entry 91 "(" lisp-mode-syntax-table)
(modify-syntax-entry 93 ")" lisp-mode-syntax-table)
;;(modify-syntax-entry ?@ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?^ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?_ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?~ "w" lisp-mode-syntax-table)
(modify-syntax-entry ?. "w" lisp-mode-syntax-table)
(modify-syntax-entry ?\[ "(]" lisp-mode-syntax-table)
(modify-syntax-entry ?\] ")[" lisp-mode-syntax-table)
(modify-syntax-entry ?\{ "(}" lisp-mode-syntax-table)
(modify-syntax-entry ?\} "){" lisp-mode-syntax-table)
(setq shr-inhibit-images t
shr-use-fonts nil)
(defun fwoar--clhs-lookup (&rest args)
(let ((browse-url-browser-function 'eww-browse-url))
(hyperspec-lookup (word-at-point))))
(pushnew (list ?h "Check hyperspec" #'fwoar--clhs-lookup)
slime-selector-methods
:key #'car)
(defun fwoar--get-asds ()
(let ((dir-of-asd (locate-dominating-file default-directory
(lambda (n)
(directory-files n nil "^[^.#][^#]*[.]asd$")))))
(when dir-of-asd
(directory-files dir-of-asd
t "^[^.#][^#]*[.]asd$"))))
(cl-defgeneric fwoar--find-system ())
(cl-defmethod fwoar--find-system (&context (major-mode lisp-mode))
(let ((systems (fwoar--get-asds)))
(find-file (if (not (null (cdr systems)))
(helm-comp-read "system:" systems)
(car systems)))))
(pushnew (list ?S "Goto System" #'fwoar--find-system)
slime-selector-methods
:key #'car)
(defun slime-ecl ()
(interactive)
(let ((inferior-lisp-program "ecl")
(slime-lisp-implementations nil))
(slime)))
(defun slime-cmucl ()
(interactive)
(let ((inferior-lisp-program "cmucl")
(slime-lisp-implementations nil))
(slime)))
(defun slime-sbcl ()
(interactive)
(let ((inferior-lisp-program "sbcl")
(slime-lisp-implementations nil))
(slime)))
(defun slime-ccl ()
(interactive)
(let ((inferior-lisp-program "ccl")
(slime-lisp-implementations nil))
(slime)))
(defun find-use-clause (current-form)
(when current-form
(destructuring-bind (discriminator . packages) current-form
(case discriminator
(:use (remove-if (op (or (eql :cl _)))
(cdr current-form)))
(defpackage (find-use-clause
(find-if (lambda (f)
(and (listp f)
(eql (car f) :use)))
'(defpackage :tracking-sim (:use :cl :alexandria :serapeum) (:export)))))))))
(defun load-package-uses ()
(interactive)
(slime-eval-async `(ql:quickload ',(find-use-clause (list-at-point)))))
;;(message (format "s-c-c is: %s" slime-company-completion))
;;;;; }}}
(defun sp-absorb-forward-sexp (&optional arg)
"Absorb previous expression.
Save the expressions preceding point and delete them. Then slurp
an expression backward and insert the saved expressions.
With ARG positive N, absorb that many expressions.
Examples:
(do-stuff 1) (save-excursion
(save-excursion -> |(do-stuff 1)
|(do-stuff 2)) (do-stuff 2))
foo bar (concat |baz quux) -> (concat |foo bar baz quux) ;; 2"
(interactive "p")
(sp-forward-whitespace)
(let* ((old (point))
(raise (progn
(sp-end-of-sexp)
(buffer-substring (point) old))))
(delete-region old (point))
(sp-forward-slurp-sexp arg)
(sp-backward-whitespace)
(sp-end-of-sexp)
(insert raise)
(save-excursion
(sp-backward-up-sexp)
(indent-sexp)))
(sp-backward-whitespace))
(setq slime-contribs '(slime-fancy
slime-company
slime-macrostep
slime-trace-dialog
slime-mdot-fu
slime-buffer-streams
slime-indentation)
slime-export-save-file t)
(slime-setup slime-contribs)
(defslime-repl-shortcut fwoar--slime-repl-load-asd ("load-asd")
(:handler (lambda ()
(interactive)
(let ((system-files (fwoar--get-asds)))
(slime-eval-async (cons 'cl:progn
(mapcar (lambda (it)
`(cl:progn (asdf:load-asd ,it) ,it))
system-files))
(lambda (r)
(message "Loading ASDs done: %s" r))))))
(:one-liner "Load asd for current project"))
(comment (defslime-repl-shortcut fwoar--slime-repl-quickload ("quickload")
(:handler (lambda ()
(interactive)
(let ((system-files (fwoar--get-asds)))
(slime-eval-async (cons 'cl:progn
(mapcar (lambda (it)
`(cl:progn (asdf:load-asd ,it) ,it))
system-files))
(lambda (r)
(message "Loading ASDs done: %s" r))))))
(:one-liner "Load asd for current project")))
(defun wrap-with-doublequote (&optional arg)
(interactive "P")
(sp-wrap-with-pair "\""))
(defun wrap-in-dollar-brace
(&optional arg)
(interactive "P")
(sp-wrap-with-pair "${"))
(defun fwoar-delete-mru-window ()
(interactive)
(delete-window
(get-mru-window nil nil t)))
(use-package evil
:ensure t
:config
(define-key evil-motion-state-map (kbd "C-w C-o") 'fwoar-delete-mru-window)
(define-key evil-motion-state-map (kbd "C-w C-w") 'evil-window-mru)
(define-key evil-normal-state-map "ZZ" 'save-buffer)
(advice-add 'evil-delete-marks :after
(lambda (&rest args)
(evil-visual-mark-render)))
(define-key evil-insert-state-map (kbd "TAB") 'company-indent-or-complete-common)
(evil-mode)
(progn ;; navigation
(define-key evil-normal-state-map " f" 'helm-projectile)
(define-key evil-normal-state-map " j" 'helm-buffers-list)
(define-key evil-normal-state-map " u" 'undo-tree-visualize))
(progn ;; completion
(define-key evil-normal-state-map (kbd "TAB") 'company-indent-or-complete-common)
(define-key evil-insert-state-map (kbd "TAB") 'company-indent-or-complete-common))
(progn ;; workaround until this fixed: https://github.com/emacs-evil/evil/issues/1129
;; or this: https://github.com/emacs-evil/evil/pull/1130
(defun config/fix-evil-window-move (orig-fun &rest args)
"Close Treemacs while moving windows around."
(if (fboundp 'treemacs-get-local-window)
(let* ((treemacs-window (treemacs-get-local-window))
(is-active (and treemacs-window (window-live-p treemacs-window))))
(when is-active (treemacs))
(apply orig-fun args)
(when is-active
(save-selected-window
(treemacs))))
(apply orig-fun args)))
(dolist (func '(evil-window-move-far-left
evil-window-move-far-right
evil-window-move-very-top
evil-window-move-very-bottom))
(advice-add func
:around #'config/fix-evil-window-move)))
)
(use-package evil-surround
:ensure t
:after evil
:config
(global-evil-surround-mode))
(use-package evil-leader
:ensure t
:after evil
:config (evil-leader/set-leader "ß"))
(use-package evil-smartparens
:ensure t
:after evil smartparens
:config
(evil-smartparens-mode 1)
(progn ;; wrapping
(define-key evil-normal-state-map ",W" 'sp-wrap-round)
(define-key evil-normal-state-map (kbd "C-, W") 'sp-wrap-round)
(define-key evil-normal-state-map (kbd "C-, C-W") 'sp-wrap-round)
(define-key evil-normal-state-map ",w(" 'sp-wrap-round)
(define-key evil-normal-state-map ",w)" 'sp-wrap-round)
(define-key global-map (kbd "C-, (") 'sp-wrap-round)
(define-key global-map (kbd "C-, C-(") 'sp-wrap-round)
(define-key global-map (kbd "C-, )") 'sp-wrap-round)
(define-key global-map (kbd "C-, C-)") 'sp-wrap-round)
(define-key evil-normal-state-map ",w$" 'wrap-in-dollar-brace)
(define-key evil-normal-state-map (kbd "C-, $") 'wrap-in-dollar-brace)
(define-key evil-normal-state-map ",w{" 'sp-wrap-curly)
(define-key evil-normal-state-map ",w}" 'sp-wrap-curly)
(define-key global-map (kbd "C-, {") 'sp-wrap-curly)
(define-key global-map (kbd "C-, C-{") 'sp-wrap-curly)
(define-key global-map (kbd "C-, }") 'sp-wrap-curly)
(define-key global-map (kbd "C-, C-}") 'sp-wrap-curly)
(define-key global-map (kbd "C-, w {") 'sp-wrap-curly)
(define-key global-map (kbd "C-, w }") 'sp-wrap-curly)
(define-key evil-normal-state-map ",w[" 'sp-wrap-square)
(define-key evil-normal-state-map ",w]" 'sp-wrap-square)
(define-key global-map (kbd "C-, w [") 'sp-wrap-square)
(define-key global-map (kbd "C-, <escape>") 'sp-wrap-square)
(define-key global-map (kbd "C-, [") 'sp-wrap-square)
(define-key global-map (kbd "C-, w ]") 'sp-wrap-square)
(define-key global-map (kbd "C-, C-]") 'sp-wrap-square)
(define-key global-map (kbd "C-, ]") 'sp-wrap-square)
(define-key evil-normal-state-map ",w\"" 'wrap-with-doublequote)
(define-key cider-mode-map (kbd "C-, w \"") 'sp-wrap-doublequote))
(progn ;; splicing
(define-key evil-normal-state-map ",S" 'sp-splice-sexp)
(define-key cider-mode-map (kbd "C-, S") 'sp-splice-sexp)
(define-key cider-mode-map (kbd "C-, C-S") 'sp-splice-sexp)
(define-key evil-normal-state-map ",A" 'sp-splice-sexp-killing-backward)
(define-key cider-mode-map (kbd "C-, A") 'sp-splice-sexp-killing-backward)
(define-key cider-mode-map (kbd "C-, C-A") 'sp-splice-sexp-killing-backward)
(define-key evil-normal-state-map ",D" 'sp-splice-sexp-killing-forward)
(define-key cider-mode-map (kbd "C-, D") 'sp-splice-sexp-killing-forward)
(define-key cider-mode-map (kbd "C-, C-D") 'sp-splice-sexp-killing-forward)
(define-key evil-normal-state-map ",F" 'sp-splice-sexp-killing-around)
(define-key cider-mode-map (kbd "C-, F") 'sp-splice-sexp-killing-around)
(define-key cider-mode-map (kbd "C-, C-F") 'sp-splice-sexp-killing-around))
(progn ;; barf/slurp
(define-key evil-normal-state-map ",," 'sp-backward-barf-sexp)
(define-key cider-mode-map (kbd "C-, ,") 'sp-backward-barf-sexp)
(define-key cider-mode-map (kbd "C-, C-,") 'sp-backward-barf-sexp)
(define-key evil-normal-state-map ",." 'sp-forward-barf-sexp)
(define-key cider-mode-map (kbd "C-, .") 'sp-forward-barf-sexp)
(define-key cider-mode-map (kbd "C-, C-.") 'sp-forward-barf-sexp)
(define-key evil-normal-state-map ",<" 'sp-backward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, <") 'sp-backward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, C-<") 'sp-backward-slurp-sexp)
(define-key evil-normal-state-map ",>" 'sp-forward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, >") 'sp-forward-slurp-sexp)
(define-key cider-mode-map (kbd "C-, C->") 'sp-forward-slurp-sexp))
(progn ;; misc
(define-key evil-normal-state-map ",~" 'sp-convolute-sexp)
(define-key evil-normal-state-map ",a" 'sp-absorb-sexp)
(define-key evil-normal-state-map ",e" 'sp-emit-sexp)
(define-key evil-normal-state-map ",`" 'sp-clone-sexp)
(define-key evil-normal-state-map ",J" 'sp-join-sexp)
(define-key evil-normal-state-map ",|" 'sp-split-sexp))
(progn ;; narrowing
(define-key evil-normal-state-map " n(" 'sp-narrow-to-sexp)
(define-key evil-normal-state-map " n)" 'sp-narrow-to-sexp)
(define-key evil-normal-state-map " nn" 'narrow-to-defun)
(define-key evil-normal-state-map " nr" 'narrow-to-region)
(define-key evil-normal-state-map " nw" 'widen)))
(use-package centaur-tabs
:ensure t
:after evil
:config
(setq centaur-tabs-adjust-buffer-order t
centaur-tabs-adjust-buffer-order 'left)
(centaur-tabs-enable-buffer-reordering)
(define-key evil-normal-state-map "gt" 'centaur-tabs-forward-tab)
(define-key global-map (kbd "<header-line> <wheel-up>") 'centaur-tabs-forward-tab)
(define-key global-map (kbd "s-}") 'centaur-tabs-forward-tab)
(define-key evil-normal-state-map "gT" 'centaur-tabs-backward-tab)
(define-key global-map (kbd "<header-line> <wheel-down>") 'centaur-tabs-backward-tab)
(define-key global-map (kbd "s-{") 'centaur-tabs-backward-tab))