Skip to content
Snippets Groups Projects
Commit d1a1f559 authored by brad.beveridge's avatar brad.beveridge
Browse files

Updates to the slime bindings.

darcs-hash:2fdd4400878b12586a09be862122aef2c5c35a7c
parent 326c4dcc
No related branches found
No related tags found
No related merge requests found
;-*-Emacs-Lisp-*- ;-*-Emacs-Lisp-*-
(defconst vip-slime-leader " ") (defconst vip-slime-leader " ")
(defun viper-slime-key (key func) (defun viper-slime-key (key func)
(define-key viper-vi-global-user-map (concat vip-slime-leader key) func) ) (define-key viper-vi-global-user-map (concat vip-slime-leader key) func))
; In general the Viper Slime mappings are much the same as regular Slime bindings, ; In general the Viper Slime mappings are much the same as regular Slime bindings,
; The C-c and C-x prefixes are dropped. ; The C-c and C-x prefixes are dropped.
...@@ -13,74 +13,91 @@ ...@@ -13,74 +13,91 @@
; the M-x commands are not mapped, as they are presumably rare ; the M-x commands are not mapped, as they are presumably rare
; Some keys are a triple key sequence. The second key is a marker for a category ; Some keys are a triple key sequence. The second key is a marker for a category
; the third key is the activation key. ; the third key is the activation key.
(add-hook 'slime-mode-hook 'do-viper-slime-mappings)
(defun do-viper-slime-mappings ()
(define-key viper-vi-global-user-map vip-slime-leader (make-sparse-keymap))
; Compilation commands ; Compilation commands
(viper-slime-key "k" 'slime-compile-and-load-file) (viper-slime-key "k" 'slime-compile-and-load-file)
(viper-slime-key "K" 'slime-compile-file) (viper-slime-key "K" 'slime-compile-file)
(viper-slime-key "c" 'slime-compile-defun) (viper-slime-key "c" 'slime-compile-defun)
(viper-slime-key "C" 'slime-remove-notes) (viper-slime-key "C" 'slime-remove-notes)
; Note handling has the same binding as Slime defaults ; Note handling has the same binding as Slime defaults
(define-key viper-vi-global-user-map "M-n" 'slime-next-note) (define-key viper-vi-global-user-map "M-n" 'slime-next-note)
(define-key viper-vi-global-user-map "M-p" 'slime-previous-note) (define-key viper-vi-global-user-map "M-p" 'slime-previous-note)
; Finding definitions (they are same as Slime default) ; Finding definitions (they are same as Slime default)
(define-key viper-vi-global-user-map "M-." 'slime-edit-definition) (define-key viper-vi-global-user-map "M-." 'slime-edit-definition)
(define-key viper-vi-global-user-map "M-," 'slime-pop-find-definition-stack) (define-key viper-vi-global-user-map "M-," 'slime-pop-find-definition-stack)
; Lisp Evaluation ; Lisp Evaluation
(viper-slime-key "x" 'slime-eval-defun) (viper-slime-key "x" 'slime-eval-defun)
(viper-slime-key "e" 'slime-eval-last-expression) (viper-slime-key "e" 'slime-eval-last-expression)
(viper-slime-key "p" 'slime-pprint-eval-last-expression) (viper-slime-key "p" 'slime-pprint-eval-last-expression)
(viper-slime-key "r" 'slime-eval-region) (viper-slime-key "r" 'slime-eval-region)
; Lisp Documentation ; Lisp Documentation
; All documentation functions are triple key sequences (vip-slime-leader ?d key) ; All documentation functions are triple key sequences (vip-slime-leader ?d key)
(viper-slime-key "d" (make-sparse-keymap)) (viper-slime-key "d" (make-sparse-keymap))
(viper-slime-key "dd" 'slime-describe-symbol) (viper-slime-key "dd" 'slime-describe-symbol)
(viper-slime-key "da" 'slime-apropos) (viper-slime-key "da" 'slime-apropos)
(viper-slime-key "dz" 'slime-apropos-all) (viper-slime-key "dz" 'slime-apropos-all)
(viper-slime-key "dp" 'slime-apropos-package) (viper-slime-key "dp" 'slime-apropos-package)
(viper-slime-key "dh" 'slime-hyperspec-lookup) (viper-slime-key "dh" 'slime-hyperspec-lookup)
(viper-slime-key "d~" 'common-lisp-hyperspec-format) (viper-slime-key "d~" 'common-lisp-hyperspec-format)
; Programming helpers ; Programming helpers
; Completion TODO ; Completion TODO
; Completion is not yet done, as the bindings will need to be in Insert mode to be really useful ; Completion is not yet done, as the bindings will need to be in Insert mode to be really useful
; Macro expansion ; Macro expansion
(viper-slime-key "m" 'slime-macroexpand-1) (viper-slime-key "m" 'slime-macroexpand-1)
(viper-slime-key "M" 'slime-macroexpand-all) (viper-slime-key "M" 'slime-macroexpand-all)
(viper-slime-key "t" 'slime-toggle-trace-fdefinition) (viper-slime-key "t" 'slime-toggle-trace-fdefinition)
; Disassembly ; Disassembly
(viper-slime-key "D" 'slime-disassemble-symbol) (viper-slime-key "D" 'slime-disassemble-symbol)
; Abort/Recovery ; Abort/Recovery
(viper-slime-key "b" 'slime-interrupt) (viper-slime-key "b" 'slime-interrupt)
(viper-slime-key "~" 'slime-sync-package-and-default-directory) (viper-slime-key "~" 'slime-sync-package-and-default-directory)
(viper-slime-key "P" 'slime-repl-set-package) (viper-slime-key "P" 'slime-repl-set-package)
; Cross-reference ; Cross-reference
; All cross-reference functions are triple key sequences (vip-slime-leader ?w key) ; All cross-reference functions are triple key sequences (vip-slime-leader ?w key)
(viper-slime-key "w" (make-sparse-keymap)) (viper-slime-key "w" (make-sparse-keymap))
(viper-slime-key "wc" 'slime-who-calls) (viper-slime-key "wc" 'slime-who-calls)
(viper-slime-key "wr" 'slime-who-references) (viper-slime-key "wr" 'slime-who-references)
(viper-slime-key "wb" 'slime-who-binds) (viper-slime-key "wb" 'slime-who-binds)
(viper-slime-key "ws" 'slime-who-sets) (viper-slime-key "ws" 'slime-who-sets)
(viper-slime-key "wm" 'slime-who-macroexpands) (viper-slime-key "wm" 'slime-who-macroexpands)
(viper-slime-key "<" 'slime-list-callers) (viper-slime-key "<" 'slime-list-callers)
(viper-slime-key "<" 'slime-list-callees) (viper-slime-key "<" 'slime-list-callees)
; Inspector ; Inspector
(viper-slime-key "i" 'slime-inspect) (viper-slime-key "i" 'slime-inspect)
; TODO make the Viper movement keys work in Inspector mode
; Profiler ; Profiler
; "P" is already taken as a key, we use "f" to access the profiler functions ; "p" is already taken as a key, we use "f" to access the profiler functions
(viper-slime-key "f" (make-sparse-keymap)) (viper-slime-key "f" (make-sparse-keymap))
(viper-slime-key "ft" 'slime-toggle-profile-fdefinition) (viper-slime-key "ft" 'slime-toggle-profile-fdefinition)
(viper-slime-key "fp" 'slime-profile-package) (viper-slime-key "fp" 'slime-profile-package)
(viper-slime-key "fu" 'slime-unprofile-all) (viper-slime-key "fu" 'slime-unprofile-all)
(viper-slime-key "fr" 'slime-profile-report) (viper-slime-key "fr" 'slime-profile-report)
(viper-slime-key "fR" 'slime-profile-reset) (viper-slime-key "fR" 'slime-profile-reset))
(add-hook 'slime-inspector-mode-hook 'viper-inspector-mappings)
(defun viper-inspector-mappings ()
; The default for POP is "l", but we use that up
(define-key slime-inspector-mode-map "p" 'slime-inspector-pop)
(viper-modify-map-for-movement slime-inspector-mode-map)
(run-hooks 'viper-slime-inspector-mapping-hook))
(add-hook 'sldb-mode-hook 'viper-sldb-mappings)
(defun viper-sldb-mappings ()
(viper-modify-map-for-movement sldb-mode-map)
(run-hooks 'viper-sldb-mapping-hook))
(add-hook 'slime-xref-mode-hook 'viper-xref-mappings)
(defun viper-xref-mappings ()
(viper-modify-map-for-movement slime-xref-mode-map)
(run-hooks 'viper-xref-mapping-hook))
;-*-Emacs-Lisp-*- ;-*-Emacs-Lisp-*-
; Extensions to Viper that make it more Vim-like
;
; If you are running vanilla GNU Emacs, you will need redo.el ; If you are running vanilla GNU Emacs, you will need redo.el
; Aquamacs and Xemacs should be fine ; Aquamacs and Xemacs should be fine
; This has only been tested on Aquamacs ; This has only been tested on Aquamacs
...@@ -20,10 +22,8 @@ ...@@ -20,10 +22,8 @@
;;;;;;;;; TODO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; TODO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Incremental search with / and ? ; Incremental search with / and ?
; highlight all search matches ; highlight all search matches
; create proper split commmands so you can :sp filename
; look at Vim's top tips ; look at Vim's top tips
; Visual mode compat ; Visual mode compat
; open file at cursor - gf
; jump to last change '. ; jump to last change '.
; move over SEXP ; move over SEXP
;;;;;;;;; BUGS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; BUGS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
...@@ -56,9 +56,10 @@ ...@@ -56,9 +56,10 @@
(define-key viper-vi-global-user-map "\C-r" 'redo) (define-key viper-vi-global-user-map "\C-r" 'redo)
; Window manipulation ; Window manipulation
(define-key viper-vi-global-user-map "\C-w\C-w" 'viper-cycle-windows) (define-key global-map "\C-w" (make-sparse-keymap))
(define-key viper-vi-global-user-map "\C-wo" 'delete-other-windows) (define-key global-map "\C-w\C-w" 'viper-cycle-windows)
(define-key viper-vi-global-user-map "\C-wc" 'delete-window) (define-key global-map "\C-wo" 'delete-other-windows)
(define-key global-map "\C-wc" 'delete-window)
; Insert mode keys ; Insert mode keys
; Vim-like completion key ; Vim-like completion key
...@@ -68,16 +69,23 @@ ...@@ -68,16 +69,23 @@
;;; ex-token-alist is defined as a constant, but it appears I can safely push values to it! ;;; ex-token-alist is defined as a constant, but it appears I can safely push values to it!
(defvar viper-extra-ex-commands '( (defvar viper-extra-ex-commands '(
("sp" "split") ("sp" "split")
("split" (split-window)) ("split" (viper-split-window))
("b" "buffer") ("b" "buffer")
("bd" "bdelete") ("bd" "bdelete")
("bdelete" (viper-kill-current-buffer)) ("bdelete" (viper-kill-current-buffer))
("bn" "next") ("bn" "next")
("vs" "vsplit") ; Emacs and Vim use inverted naming conventions for splits :) ("vs" "vsplit") ; Emacs and Vim use inverted naming conventions for splits :)
("vsplit" (split-window-horizontally)) ("vsplit" (viper-split-window-horizontally))
)) ))
(setq ex-token-alist (append viper-extra-ex-commands ex-token-alist)) (setq ex-token-alist (append viper-extra-ex-commands ex-token-alist))
(defun viper-split-window (&optional file)
(split-window)
(ex-edit file))
(defun viper-split-window-horizontally (&optional file)
(split-window-horizontally)
(ex-edit file))
;;; Functions that the new key mappings use ;;; Functions that the new key mappings use
(defun viper-jump-to-tag-at-point () (defun viper-jump-to-tag-at-point ()
...@@ -130,6 +138,7 @@ ...@@ -130,6 +138,7 @@
(require 'advice) (require 'advice)
(viper-deflocalvar viper-visual-minor-mode nil) (viper-deflocalvar viper-visual-minor-mode nil)
(defvar viper-visual-map (make-sparse-keymap)) (defvar viper-visual-map (make-sparse-keymap))
(defvar viper-visual-mode-linewise nil)
; TODO, make this work for older Emacs without emulation-mode-map-alists ; TODO, make this work for older Emacs without emulation-mode-map-alists
(defadvice viper-normalize-minor-mode-map-alist (after viper-add-visual-maps activate) (defadvice viper-normalize-minor-mode-map-alist (after viper-add-visual-maps activate)
...@@ -137,29 +146,36 @@ ...@@ -137,29 +146,36 @@
(if (boundp 'emulation-mode-map-alists) (if (boundp 'emulation-mode-map-alists)
(push (cons 'viper-visual-minor-mode viper-visual-map) viper--key-maps) (push (cons 'viper-visual-minor-mode viper-visual-map) viper--key-maps)
;; else: This is a bit of a hack ;; else: This is a bit of a hack
(push (cons 'viper-visual-mode viper-visual-mode-map) minor-mode-map-alist))) (push (cons 'viper-visual-mode viper-visual-map) minor-mode-map-alist)))
(define-key viper-vi-global-user-map "v" 'viper-toggle-visual-mode)
(define-key viper-vi-global-user-map "v" 'viper-toggle-visual-mode) (define-key viper-vi-global-user-map "V" 'viper-toggle-visual-line-mode)
; Visual mode key mappings ; Visual mode key mappings
(define-key viper-visual-map "y" 'viper-visual-yank) (define-key viper-visual-map "y" 'viper-visual-yank)
(define-key viper-visual-map "d" 'viper-visual-delete) (define-key viper-visual-map "d" 'viper-visual-delete)
(define-key viper-visual-map "D" 'viper-visual-delete) (define-key viper-visual-map "D" 'viper-visual-delete)
(define-key viper-visual-map "x" 'viper-visual-delete) (define-key viper-visual-map "x" 'viper-visual-delete)
(define-key viper-visual-map "X" 'viper-visual-delete) (define-key viper-visual-map "X" 'viper-visual-delete)
(define-key viper-visual-map "o" 'exchange-point-and-mark) (define-key viper-visual-map "o" 'exchange-point-and-mark)
(define-key viper-visual-map "O" 'exchange-point-and-mark) (define-key viper-visual-map "O" 'exchange-point-and-mark)
(define-key viper-visual-map "c" 'viper-visual-change) (define-key viper-visual-map "c" 'viper-visual-change)
(define-key viper-visual-map "C" 'viper-visual-change)
(define-key viper-visual-map "h" nil) (define-key viper-visual-map "s" 'viper-visual-change)
(define-key viper-visual-map "S" 'viper-visual-change)
(define-key viper-visual-map "F" 'viper-visual-change)
(define-key viper-visual-map "i" 'viper-nil)
(define-key viper-visual-map "I" 'viper-nil)
(define-key viper-visual-map "a" 'viper-nil)
(define-key viper-visual-map "A" 'viper-nil)
(define-key viper-visual-map "u" 'viper-nil)
(define-key viper-visual-map "\C-r" 'viper-nil)
;(defadvice viper-ex (around viper-extended-ex-commands (arg &optional string) activate) ;(defadvice viper-ex (around viper-extended-ex-commands (arg &optional string) activate)
; ad-do-it) ; ad-do-it)
(defadvice viper-move-marker-locally (around viper-move-marker-locally-wrap activate) ;(defadvice viper-move-marker-locally (around viper-move-marker-locally-wrap activate)
(unless viper-visual-minor-mode ; (unless viper-visual-minor-mode
ad-do-it)) ; ad-do-it))
(defadvice viper-deactivate-mark (around viper-deactivate-mark-wrap activate) (defadvice viper-deactivate-mark (around viper-deactivate-mark-wrap activate)
(unless viper-visual-minor-mode (unless viper-visual-minor-mode
...@@ -177,13 +193,16 @@ ...@@ -177,13 +193,16 @@
(defun viper-enable-visual-mode (arg) (defun viper-enable-visual-mode (arg)
(interactive "P") (interactive "P")
(setq viper-visual-minor-mode t) (viper-set-mark-if-necessary)
(set-mark-command arg)) (setq viper-visual-minor-mode t))
(defun viper-disable-visual-mode (arg) (defun viper-disable-visual-mode (arg)
(interactive "P") (interactive "P")
(when viper-visual-linewise
(setq viper-visual-linewise nil)
(remove-hook 'post-command-hook 'viper-visual-linewise-lock))
(setq viper-visual-minor-mode nil) (setq viper-visual-minor-mode nil)
(deactivate-mark)) (viper-deactivate-mark))
(defun viper-toggle-visual-mode (arg) (defun viper-toggle-visual-mode (arg)
"Toggle visual mode on and off. This assumes that transient-mark-mode is active. viper-visual-minor-mode is also toggled on and off, which will enable the visual mode keymap." "Toggle visual mode on and off. This assumes that transient-mark-mode is active. viper-visual-minor-mode is also toggled on and off, which will enable the visual mode keymap."
...@@ -192,6 +211,17 @@ ...@@ -192,6 +211,17 @@
(viper-disable-visual-mode arg) (viper-disable-visual-mode arg)
(viper-enable-visual-mode arg))) (viper-enable-visual-mode arg)))
(defun viper-toggle-visual-line-mode (arg)
(interactive "P")
(make-local-variable 'viper-visual-linewise)
(setq viper-visual-linewise t)
(add-hook 'post-command-hook 'viper-visual-linewise-lock)
(viper-visual-linewise-lock)
(viper-toggle-visual-mode arg))
(defun viper-visual-linewise-lock ()
(beginning-of-line))
(defun viper-visual-yank (arg) (defun viper-visual-yank (arg)
(interactive "P") (interactive "P")
(viper-prefix-arg-com ?r 1 ?y) (viper-prefix-arg-com ?r 1 ?y)
...@@ -202,12 +232,6 @@ ...@@ -202,12 +232,6 @@
(viper-prefix-arg-com ?r 1 ?d) (viper-prefix-arg-com ?r 1 ?d)
(viper-disable-visual-mode arg)) (viper-disable-visual-mode arg))
(defun viper-visual-change (arg)
(interactive "P")
(viper-visual-delete arg)
(viper-disable-visual-mode arg)
(viper-insert arg))
(defun viper-visual-change (arg) (defun viper-visual-change (arg)
(interactive "P") (interactive "P")
(setq viper-visual-minor-mode nil) (setq viper-visual-minor-mode nil)
...@@ -216,3 +240,22 @@ ...@@ -216,3 +240,22 @@
;(setq edebug-trace t) ;(setq edebug-trace t)
;(setq edebug-all-forms t) ;(setq edebug-all-forms t)
;(require 'edebug) ;(require 'edebug)
; A helper function that injects the basic Viper movement keys into the map
; If you want different basic movement keys, then you can respond to the
; hook viper-modify-map-for-movement-hook
(defun viper-modify-map-for-movement (map)
; Vi like movement keys
(define-key map "\C-d" 'viper-scroll-up)
(define-key map "\C-u" 'viper-scroll-down)
(define-key map "0" 'viper-beginning-of-line)
(define-key map "$" 'viper-goto-eol)
(define-key map "k" 'viper-previous-line)
(define-key map "j" 'viper-next-line)
(define-key map "l" 'viper-forward-char)
(define-key map "h" 'viper-backward-char)
(define-key map "w" 'viper-forward-word)
(define-key map "b" 'viper-backward-word)
(run-hook-with-args 'viper-modify-map-for-movement-hook map))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment