Last active
August 6, 2019 10:00
-
-
Save lehmacdj/b3c897ab46af34574b2947f8dc4e937d to your computer and use it in GitHub Desktop.
Evil mode for nEXT browser
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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
Fails on next version 1.1.0 built from source under OpenBSD 6.4. Unfortunately, I'm not familiar with lisp to provide much insight beyond uploading the error log.