Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Evil mode for nEXT browser
(in-package :next)
(defparenstatic scroll-half-page-down
(ps:chain window (scroll-by 0 (/ (ps:@ window inner-height) 2))))
(defparenstatic scroll-half-page-up
(ps:chain window (scroll-by 0 (/ (ps:@ window inner-height) -2))))
(defparenstatic scroll-page-down
(ps:chain window (scroll-by 0 (ps:@ window inner-height))))
(defparenstatic scroll-page-up
(ps:chain window (scroll-by 0 (- (ps:@ window inner-height)))))
; evil mode replicates all of the history functionality of document-mode
; because it overwrites document mode
(defvar *evil-mode-map* (make-hash-table :test 'equalp))
(defclass evil-mode (mode)
((active-history-node :accessor active-history-node :initarg :active-node)
(link-hints :accessor link-hints)))
(defun evil-mode ()
"Vim-like document-mode replacement"
(let* ((root (make-node :data "about:blank"))
(mode (make-instance 'evil-mode
:name "Evil-Mode"
:keymap *evil-mode-map*
:active-node root)))
mode))
(defmethod setup ((mode evil-mode) buffer)
(call-next-method)
(interface:web-view-set-url-loaded-callback
(view buffer)
(lambda () (add-or-traverse-history mode))))
;; insert-mode does almost nothing and should be enabled to interact with
;; web-pages using the keyboard
(defvar *insert-mode-map* (make-hash-table :test 'equalp))
(defclass insert-mode (mode) ())
(defun insert-mode ()
"Vim-like application mode, with some maps for changing modes back"
(make-instance 'insert-mode
:name "Insert-Mode"
:keymap *insert-mode-map*))
; interface
(define-key *evil-mode-map*
(kbd "Z Z")
'interface:kill)
;; use this because nEXT users definitely expect this at least
(define-key *evil-mode-map*
(kbd "C-x C-c")
'interface:kill)
; navigation
(define-key *evil-mode-map*
(kbd "j")
'scroll-down)
(define-key *evil-mode-map*
(kbd "k")
'scroll-up)
(define-key *evil-mode-map*
(kbd "l")
'scroll-right)
(define-key *evil-mode-map*
(kbd "h")
'scroll-left)
(define-key *evil-mode-map*
(kbd "G")
'scroll-to-bottom)
(define-key *evil-mode-map*
(kbd "g g")
'scroll-to-top)
(define-key *evil-mode-map*
(kbd "d")
'scroll-half-page-down)
(define-key *evil-mode-map*
(kbd "u")
'scroll-half-page-up)
; zoom
(define-key *evil-mode-map*
(kbd "z i")
'zoom-in-page)
(define-key *evil-mode-map*
(kbd "z o")
'zoom-out-page)
(define-key *evil-mode-map*
(kbd "z 0")
'unzoom-page)
; buffer navigation
(define-key *evil-mode-map*
(kbd "g t")
'switch-buffer-next)
(define-key *evil-mode-map*
(kbd "L")
'history-forwards)
(define-key *evil-mode-map*
(kbd "H")
'history-backwards)
(define-key *evil-mode-map*
(kbd "J")
'switch-buffer-next)
(define-key *evil-mode-map*
(kbd "K")
'switch-buffer-previous)
(define-key *evil-mode-map*
(kbd "g T")
'switch-buffer-previous)
(define-key *evil-mode-map*
(kbd "x")
'delete-active-buffer)
(define-key *evil-mode-map*
(kbd "B")
(:input-complete *minibuffer* switch-buffer buffer-complete))
(define-key *evil-mode-map*
(kbd "o")
(:input-complete *minibuffer* set-url history-typed-complete :empty-complete t))
(define-key *evil-mode-map*
(kbd "t")
(:input-complete *minibuffer* set-url-new-buffer history-typed-complete :empty-complete t))
(define-key *evil-mode-map*
(kbd "b")
(:input-complete *minibuffer* set-url bookmark-complete))
; link-hints
(define-key *evil-mode-map* (kbd "f") (:input *minibuffer* go-anchor :setup #'setup-anchor :cleanup #'remove-link-hints))
(define-key *evil-mode-map*
(kbd "F")
(:input *minibuffer* go-anchor-new-buffer :setup #'setup-anchor :cleanup #'remove-link-hints))
(define-key *evil-mode-map*
(kbd "g f")
(:input *minibuffer* go-anchor-new-buffer-focus :setup #'setup-anchor))
; mode switching
(define-key *evil-mode-map* (kbd "i")
(lambda () (add-or-switch-to-mode *active-buffer* (insert-mode))))
(define-key *insert-mode-map* (kbd "C-[")
(lambda () (add-or-switch-to-mode *active-buffer* (evil-mode))))
(define-key *insert-mode-map* (kbd "ESCAPE")
(lambda () (add-or-switch-to-mode *active-buffer* (evil-mode))))
; overwrite the generator for document mode to replace it with evil-mode
(defun document-mode () (evil-mode))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment