Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions extensions/vi-mode/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ To enable, add the following code to `~/.lem/init.lisp`:

```common-lisp
;; NORMAL mode
(define-key lem-vi-mode:*command-keymap* "q" 'quit-window)
(define-key lem-vi-mode:*command-keymap* "Space @" 'paredit-splice)
(define-key lem-vi-mode:*normal-keymap* "q" 'quit-window)
(define-key lem-vi-mode:*normal-keymap* "Space @" 'paredit-splice)

;; INSERT mode
(define-key lem-vi-mode:*insert-keymap* "(" 'paredit-insert-paren)
Expand Down
208 changes: 104 additions & 104 deletions extensions/vi-mode/binds.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -9,118 +9,118 @@
:lem-vi-mode/visual))
(in-package :lem-vi-mode/binds)

(define-key *command-keymap* "0" 'vi-move-to-beginning-of-line/universal-argument-0)
(define-key *command-keymap* "1" 'universal-argument-1)
(define-key *command-keymap* "2" 'universal-argument-2)
(define-key *command-keymap* "3" 'universal-argument-3)
(define-key *command-keymap* "4" 'universal-argument-4)
(define-key *command-keymap* "5" 'universal-argument-5)
(define-key *command-keymap* "6" 'universal-argument-6)
(define-key *command-keymap* "7" 'universal-argument-7)
(define-key *command-keymap* "8" 'universal-argument-8)
(define-key *command-keymap* "9" 'universal-argument-9)
(define-key *command-keymap* "l" 'vi-forward-char)
(define-key *command-keymap* "Space" 'vi-forward-char)
(define-key *command-keymap* "h" 'vi-backward-char)
(define-key *command-keymap* "j" 'vi-next-line)
(define-key *command-keymap* "+" 'vi-next-line)
(define-key *command-keymap* "k" 'vi-previous-line)
(define-key *command-keymap* "-" 'vi-previous-line)
(define-key *command-keymap* "g j" 'vi-next-display-line)
(define-key *command-keymap* "g k" 'vi-previous-display-line)
(define-key *command-keymap* "w" 'vi-forward-word-begin)
(define-key *command-keymap* "b" 'vi-backward-word-begin)
(define-key *command-keymap* "W" 'vi-forward-word-begin-broad)
(define-key *command-keymap* "B" 'vi-backward-word-begin-broad)
(define-key *command-keymap* "e" 'vi-forward-word-end)
(define-key *command-keymap* "E" 'vi-forward-word-end-broad)
(define-key *command-keymap* "$" 'vi-move-to-end-of-line)
(define-key *command-keymap* "g _" 'vi-move-to-last-nonblank)
(define-key *command-keymap* "H" 'vi-move-to-window-top)
(define-key *command-keymap* "M" 'vi-move-to-window-middle)
(define-key *command-keymap* "L" 'vi-move-to-window-bottom)
(define-key *command-keymap* "C-d" 'next-page)
(define-key *command-keymap* "C-u" 'previous-page)
(define-key *command-keymap* "^" 'vi-back-to-indentation)
(define-key *command-keymap* "_" 'vi-back-to-indentation)
(define-key *command-keymap* "=" 'vi-indent)
(define-key *command-keymap* "{" 'backward-paragraph)
(define-key *command-keymap* "}" 'forward-paragraph)
(define-key *command-keymap* "s" 'vi-substitute)
(define-key *command-keymap* "x" 'vi-delete-next-char)
(define-key *command-keymap* "X" 'vi-delete-previous-char)
(define-key *command-keymap* "d" 'vi-delete)
(define-key *command-keymap* "D" 'vi-delete-line)
(define-key *command-keymap* "c" 'vi-change)
(define-key *command-keymap* "C" 'vi-change-line)
(define-key *command-keymap* "g J" 'vi-join)
(define-key *command-keymap* "J" 'vi-join-line)
(define-key *command-keymap* "y" 'vi-yank)
(define-key *command-keymap* "p" 'vi-paste-after)
(define-key *command-keymap* "P" 'vi-paste-before)
(define-key *command-keymap* "r" 'vi-replace-char)
(define-key *command-keymap* "g U" 'vi-upcase)
(define-key *command-keymap* "g u" 'vi-downcase)
(define-key *command-keymap* "u" 'vi-undo)
(define-key *command-keymap* "C-r" 'vi-redo)
(define-key *command-keymap* "C-f" 'next-page)
(define-key *command-keymap* "C-b" 'previous-page)
(define-key *command-keymap* "%" 'vi-move-to-matching-paren)
(define-key *command-keymap* "/" 'vi-search-forward)
(define-key *command-keymap* "?" 'vi-search-backward)
(define-key *command-keymap* "n" 'vi-search-next)
(define-key *command-keymap* "N" 'vi-search-previous)
(define-key *command-keymap* "*" 'vi-search-forward-symbol-at-point)
(define-key *command-keymap* "g g" 'vi-goto-first-line)
(define-key *command-keymap* "G" 'vi-goto-line)
(define-key *command-keymap* "Return" 'vi-return)
(define-key *command-keymap* "f" 'vi-find-char)
(define-key *command-keymap* "F" 'vi-find-char-backward)
(define-key *command-keymap* "t" 'vi-find-char-before)
(define-key *command-keymap* "T" 'vi-find-char-backward-after)
(define-key *command-keymap* ";" 'vi-find-char-repeat)
(define-key *command-keymap* "," 'vi-find-char-repeat-backward)
(define-key *command-keymap* "z z" 'recenter)
(define-key *command-keymap* "Z Z" 'vi-write-quit)
(define-key *command-keymap* "C-w s" 'split-active-window-vertically)
(define-key *command-keymap* "C-w C-s" 'split-active-window-vertically)
(define-key *command-keymap* "C-w w" 'other-window)
(define-key *command-keymap* "C-w C-w" 'other-window)
(define-key *command-keymap* "C-w q" 'vi-quit)
(define-key *command-keymap* "C-w h" 'window-move-left)
(define-key *command-keymap* "C-w C-h" 'undefined-key)
(define-key *command-keymap* "C-w l" 'window-move-right)
(define-key *command-keymap* "C-w C-l" 'undefined-key)
(define-key *command-keymap* "C-w k" 'window-move-up)
(define-key *command-keymap* "C-w C-k" 'undefined-key)
(define-key *command-keymap* "C-w j" 'window-move-down)
(define-key *command-keymap* "C-w C-j" 'undefined-key)
(define-key *motion-keymap* "0" 'vi-move-to-beginning-of-line/universal-argument-0)
(define-key *motion-keymap* "1" 'universal-argument-1)
(define-key *motion-keymap* "2" 'universal-argument-2)
(define-key *motion-keymap* "3" 'universal-argument-3)
(define-key *motion-keymap* "4" 'universal-argument-4)
(define-key *motion-keymap* "5" 'universal-argument-5)
(define-key *motion-keymap* "6" 'universal-argument-6)
(define-key *motion-keymap* "7" 'universal-argument-7)
(define-key *motion-keymap* "8" 'universal-argument-8)
(define-key *motion-keymap* "9" 'universal-argument-9)
(define-key *motion-keymap* "l" 'vi-forward-char)
(define-key *motion-keymap* "Space" 'vi-forward-char)
(define-key *motion-keymap* "h" 'vi-backward-char)
(define-key *motion-keymap* "j" 'vi-next-line)
(define-key *motion-keymap* "+" 'vi-next-line)
(define-key *motion-keymap* "k" 'vi-previous-line)
(define-key *motion-keymap* "-" 'vi-previous-line)
(define-key *motion-keymap* "g j" 'vi-next-display-line)
(define-key *motion-keymap* "g k" 'vi-previous-display-line)
(define-key *motion-keymap* "w" 'vi-forward-word-begin)
(define-key *motion-keymap* "b" 'vi-backward-word-begin)
(define-key *motion-keymap* "W" 'vi-forward-word-begin-broad)
(define-key *motion-keymap* "B" 'vi-backward-word-begin-broad)
(define-key *motion-keymap* "e" 'vi-forward-word-end)
(define-key *motion-keymap* "E" 'vi-forward-word-end-broad)
(define-key *motion-keymap* "$" 'vi-move-to-end-of-line)
(define-key *motion-keymap* "g _" 'vi-move-to-last-nonblank)
(define-key *motion-keymap* "H" 'vi-move-to-window-top)
(define-key *motion-keymap* "M" 'vi-move-to-window-middle)
(define-key *motion-keymap* "L" 'vi-move-to-window-bottom)
(define-key *motion-keymap* "C-d" 'next-page)
(define-key *motion-keymap* "C-u" 'previous-page)
(define-key *motion-keymap* "^" 'vi-back-to-indentation)
(define-key *motion-keymap* "_" 'vi-back-to-indentation)
(define-key *motion-keymap* "{" 'backward-paragraph)
(define-key *motion-keymap* "}" 'forward-paragraph)
(define-key *motion-keymap* "C-f" 'next-page)
(define-key *motion-keymap* "C-b" 'previous-page)
(define-key *motion-keymap* "%" 'vi-move-to-matching-paren)
(define-key *motion-keymap* "/" 'vi-search-forward)
(define-key *motion-keymap* "?" 'vi-search-backward)
(define-key *motion-keymap* "n" 'vi-search-next)
(define-key *motion-keymap* "N" 'vi-search-previous)
(define-key *motion-keymap* "*" 'vi-search-forward-symbol-at-point)
(define-key *motion-keymap* "g g" 'vi-goto-first-line)
(define-key *motion-keymap* "G" 'vi-goto-line)
(define-key *motion-keymap* "Return" 'vi-return)
(define-key *motion-keymap* "f" 'vi-find-char)
(define-key *motion-keymap* "F" 'vi-find-char-backward)
(define-key *motion-keymap* "t" 'vi-find-char-before)
(define-key *motion-keymap* "T" 'vi-find-char-backward-after)
(define-key *motion-keymap* ";" 'vi-find-char-repeat)
(define-key *motion-keymap* "," 'vi-find-char-repeat-backward)
(define-key *motion-keymap* "z z" 'recenter)
(define-key *motion-keymap* "Z Z" 'vi-write-quit)
(define-key *motion-keymap* "C-w s" 'split-active-window-vertically)
(define-key *motion-keymap* "C-w C-s" 'split-active-window-vertically)
(define-key *motion-keymap* "C-w w" 'other-window)
(define-key *motion-keymap* "C-w C-w" 'other-window)
(define-key *motion-keymap* "C-w q" 'vi-quit)
(define-key *motion-keymap* "C-w h" 'window-move-left)
(define-key *motion-keymap* "C-w C-h" 'undefined-key)
(define-key *motion-keymap* "C-w l" 'window-move-right)
(define-key *motion-keymap* "C-w C-l" 'undefined-key)
(define-key *motion-keymap* "C-w k" 'window-move-up)
(define-key *motion-keymap* "C-w C-k" 'undefined-key)
(define-key *motion-keymap* "C-w j" 'window-move-down)
(define-key *motion-keymap* "C-w C-j" 'undefined-key)
(define-key *motion-keymap* "C-o" 'vi-jump-back)
(define-key *motion-keymap* "C-i" 'vi-jump-next)
(define-key *motion-keymap* ":" 'vi-ex)

(define-key *command-keymap* "v" 'vi-visual-char)
(define-key *command-keymap* "V" 'vi-visual-line)
(define-key *command-keymap* "C-v" 'vi-visual-block)
(define-key *motion-keymap* "v" 'vi-visual-char)
(define-key *motion-keymap* "V" 'vi-visual-line)
(define-key *motion-keymap* "C-v" 'vi-visual-block)

(define-key *command-keymap* "i" 'vi-insert)
(define-key *command-keymap* "I" 'vi-insert-line)
(define-key *command-keymap* "a" 'vi-append)
(define-key *command-keymap* "A" 'vi-append-line)
(define-key *command-keymap* "o" 'vi-open-below)
(define-key *command-keymap* "O" 'vi-open-above)
(define-key *command-keymap* "C-o" 'vi-jump-back)
(define-key *command-keymap* "C-i" 'vi-jump-next)
(define-key *command-keymap* "." 'vi-repeat)
(define-key *command-keymap* ":" 'vi-ex)
(define-key *command-keymap* 'delete-previous-char 'vi-backward-char)
(define-key *command-keymap* 'self-insert 'undefined-key)
(define-key *normal-keymap* "i" 'vi-insert)
(define-key *normal-keymap* "I" 'vi-insert-line)
(define-key *normal-keymap* "a" 'vi-append)
(define-key *normal-keymap* "A" 'vi-append-line)
(define-key *normal-keymap* "o" 'vi-open-below)
(define-key *normal-keymap* "O" 'vi-open-above)
(define-key *normal-keymap* "." 'vi-repeat)
(define-key *normal-keymap* "=" 'vi-indent)
(define-key *normal-keymap* "s" 'vi-substitute)
(define-key *normal-keymap* "x" 'vi-delete-next-char)
(define-key *normal-keymap* "X" 'vi-delete-previous-char)
(define-key *normal-keymap* "d" 'vi-delete)
(define-key *normal-keymap* "D" 'vi-delete-line)
(define-key *normal-keymap* "c" 'vi-change)
(define-key *normal-keymap* "C" 'vi-change-line)
(define-key *normal-keymap* "g J" 'vi-join)
(define-key *normal-keymap* "J" 'vi-join-line)
(define-key *normal-keymap* "y" 'vi-yank)
(define-key *normal-keymap* "p" 'vi-paste-after)
(define-key *normal-keymap* "P" 'vi-paste-before)
(define-key *normal-keymap* "r" 'vi-replace-char)
(define-key *normal-keymap* "g U" 'vi-upcase)
(define-key *normal-keymap* "g u" 'vi-downcase)
(define-key *normal-keymap* "u" 'vi-undo)
(define-key *normal-keymap* "C-r" 'vi-redo)
(define-key *motion-keymap* 'delete-previous-char 'vi-backward-char)
(define-key *motion-keymap* 'self-insert 'undefined-key)

(define-key *insert-keymap* "Escape" 'vi-end-insert)
(define-key *insert-keymap* "C-p" 'abbrev)
(define-key *insert-keymap* "C-w" 'vi-kill-last-word)

(define-key *command-keymap* "C-p" 'yank-pop)
(define-key *command-keymap* "C-n" 'yank-pop-next)
(define-key *normal-keymap* "C-p" 'yank-pop)
(define-key *normal-keymap* "C-n" 'yank-pop-next)

(define-key *command-keymap* "C-g" 'vi-keyboard-quit)
(define-key *motion-keymap* "C-g" 'vi-keyboard-quit)
(define-key *inactive-keymap* "Escape" 'vi-keyboard-quit)

(define-key *visual-keymap* "Escape" 'vi-visual-end)
Expand Down
4 changes: 2 additions & 2 deletions extensions/vi-mode/commands.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
:lem-vi-mode/jump-motions
:lem-vi-mode/commands/utils)
(:import-from :lem-vi-mode/states
:*command-keymap*
:*motion-keymap*
:normal
:insert)
(:import-from :lem-vi-mode/commands/utils
Expand Down Expand Up @@ -92,7 +92,7 @@

(defun extract-count-keys (keys)
(loop for key in keys
for cmd = (lem-core::keymap-find-keybind *command-keymap* key nil)
for cmd = (lem-core::keymap-find-keybind *motion-keymap* key nil)
unless (member cmd '(lem/universal-argument:universal-argument-0
lem/universal-argument:universal-argument-1
lem/universal-argument:universal-argument-2
Expand Down
38 changes: 25 additions & 13 deletions extensions/vi-mode/core.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
:state=
:change-state
:with-state
:mode-specific-keymaps
:pre-command-hook
:post-command-hook
:state-enabled-hook
Expand Down Expand Up @@ -48,15 +49,17 @@
(defun disable-hook ()
(run-hooks *disable-hook*))

(defvar *fallback-keymap* *global-keymap*)

(define-global-mode vi-mode (emacs-mode)
(:name "vi"
:keymap *fallback-keymap*
:enable-hook #'enable-hook
:disable-hook #'disable-hook))



(defclass vi-state ()
((name :initarg :name
:initform nil
:reader state-name)
(message
:initarg :message
Expand All @@ -70,10 +73,10 @@
:initarg :modeline-color
:initform 'state-modeline-white
:reader state-modeline-color)
(keymap
:initarg :keymap
:initform *global-keymap*
:reader state-keymap)
(keymaps
:initarg :keymaps
:initform '()
:reader state-keymaps)
(cursor-color
:initarg :cursor-color
:initform nil)))
Expand All @@ -82,11 +85,6 @@
(or (slot-value state 'cursor-color)
*default-cursor-color*))

(defmethod initialize-instance ((state vi-state) &rest initargs &key name &allow-other-keys)
(unless name
(setf (getf initargs :name) (class-name (class-of state))))
(apply #'call-next-method state initargs))

(defvar *current-state* nil)

(defun state= (state1 state2)
Expand Down Expand Up @@ -133,12 +131,26 @@
(assert (typep state 'vi-state))
state)

(defgeneric mode-specific-keymaps (mode)
(:method (mode) nil))

(defmethod compute-keymaps ((mode vi-mode))
(let* ((buffer (current-buffer))
(major-mode (ensure-mode-object (buffer-major-mode buffer)))
(minor-mode-keymaps (loop for mode-name in (buffer-minor-modes buffer)
for mode = (ensure-mode-object mode-name)
when (mode-keymap mode)
collect it)))
(append minor-mode-keymaps
(mode-specific-keymaps major-mode)
;; Precede state keymaps over major-mode keymaps
(state-keymaps (ensure-state *current-state*)))))

(defun change-state (name)
(and *current-state*
(state-disabled-hook (ensure-state *current-state*)))
(let ((state (ensure-state name)))
(setf *current-state* name)
(change-global-mode-keymap 'vi-mode (state-keymap state))
(state-enabled-hook state)
(set-attribute 'cursor :background (state-cursor-color state))))

Expand All @@ -160,7 +172,7 @@
(add-hook *pre-command-hook* 'vi-pre-command-hook)
(add-hook *post-command-hook* 'vi-post-command-hook)

(defmethod state-enabled-hook :after (state)
(defmethod state-enabled-hook :after ((state vi-state))
(lem-if:update-cursor-shape (lem:implementation)
(state-cursor-type state)))

Expand Down
2 changes: 1 addition & 1 deletion extensions/vi-mode/ex.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

(define-vi-state ex () ()
(:default-initargs
:keymap *ex-keymap*))
:keymaps (list *ex-keymap*)))

(define-command vi-ex () ()
(let* ((directory (uiop:getcwd))
Expand Down
1 change: 1 addition & 0 deletions extensions/vi-mode/lem-vi-mode.asd
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
(:file "ex-command" :depends-on ("ex-core" "options" "utils"))
(:file "ex" :depends-on ("core" "ex-parser"))
(:file "binds" :depends-on ("states" "commands" "ex" "visual"))
(:file "special-binds" :depends-on ("core"))
(:file "vi-mode" :depends-on ("core" "options" "ex" "commands" "states"))
(:file "utils"))
:in-order-to ((test-op (test-op "lem-vi-mode/tests"))))
Expand Down
2 changes: 1 addition & 1 deletion extensions/vi-mode/rc-example.lisp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
(in-package :lem-user)

;;; vi-mode
(define-key lem-vi-mode:*command-keymap* "q" 'quit-active-window)
(define-key lem-vi-mode:*normal-keymap* "q" 'quit-active-window)
(define-key lem-vi-mode:*insert-keymap* "C-n" 'lem/abbrev:abbrev-with-pop-up-window)

(add-hook lem-vi-mode:*enable-hook*
Expand Down
11 changes: 11 additions & 0 deletions extensions/vi-mode/special-binds.lisp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
(defpackage :lem-vi-mode/special-binds
(:use :cl)
(:import-from :lem-vi-mode/core
:mode-specific-keymaps)
(:import-from :lem/directory-mode
:directory-mode
:*directory-mode-keymap*))
(in-package :lem-vi-mode/special-binds)

(defmethod mode-specific-keymaps ((mode directory-mode))
(list *directory-mode-keymap*))
Loading