[CM] Navigation in nrepl
Elijah Stone
elronnd at elronnd.net
Sat Jul 17 17:56:59 PDT 2021
Nrepl is really great, but I've found myself missing wordwise navigation
and deletion. So, the attached patch to nrepl.scm implements C-w, M-d,
C-u, M-b, M-f a la readline (except with more relaxed word separators as
befits lisp). It also changes meta-key recognition to recognise 'alt' as
a meta key.
Cheers,
-E
-------------- next part --------------
975,976c975,979
< (selection #f)
< (control-key (ash 1 33))) ; notcurses getc returns 32 bits
---
> (selection "")
> (previously-selected #f)
> (just-selected #f)
> (control-key (ash 1 33))
> (meta-key (ash 1 34))) ; notcurses getc returns 32 bits
1157,1217c1160,1276
< (set! (keymap (char->integer #\escape))
< (lambda (c)
< ;; these are the Meta key handlers
< (let ((k (notcurses_getc nc (c-pointer 0) (c-pointer 0) ni)))
<
< (case (integer->char k)
< ((#\C #\c)
< (do ((len (- (eols row) col))
< (cur-line (ncplane_contents ncp row col 1 (- (eols row) col)))
< (i 0 (+ i 1)))
< ((or (= i len)
< (char-alphabetic? (cur-line i)))
< (when (< i len)
< (set! (cur-line i) (char-upcase (cur-line i)))
< (nc-display row col cur-line)
< (notcurses_refresh nc)
< (do ((k (+ i 1) (+ k 1)))
< ((or (>= k len)
< (not (or (char-alphabetic? (cur-line k))
< (char-numeric? (cur-line k)))))
< (set! col (min (eols row) (+ col k)))))))))
<
< ((#\L #\l)
< (do ((len (- (eols row) col))
< (cur-line (ncplane_contents ncp row col 1 (- (eols row) col)))
< (i 0 (+ i 1)))
< ((or (= i len)
< (char-alphabetic? (cur-line i)))
< (when (< i len)
< (do ((k i (+ k 1)))
< ((or (= k len)
< (not (char-alphabetic? (cur-line k))))
< (nc-display row col cur-line)
< (notcurses_refresh nc)
< (set! col (+ col k)))
< (set! (cur-line k) (char-downcase (cur-line k))))))))
<
< ((#\U #\u)
< (do ((len (- (eols row) col))
< (cur-line (ncplane_contents ncp row col 1 (- (eols row) col)))
< (i 0 (+ i 1)))
< ((or (= i len)
< (char-alphabetic? (cur-line i)))
< (when (< i len)
< (do ((k i (+ k 1)))
< ((or (= k len)
< (not (char-alphabetic? (cur-line k))))
< (nc-display row col cur-line)
< (notcurses_refresh nc)
< (set! col (+ col k)))
< (set! (cur-line k) (char-upcase (cur-line k))))))))
<
< ((#\<)
< (set-row 0)
< (set-col (bols 0)))
<
< ((#\>)
< (set-row ncp-max-row)
< (set-col (bols ncp-max-row)))
<
< )))) ; end Meta keys
---
> (define (prepend-to-selection new-text)
> (unless (zero? (length new-text))
> (set! selection (if previously-selected (append new-text selection)
> new-text))
> (set! just-selected #t)))
> (define (append-to-selection new-text)
> (unless (zero? (length new-text))
> (set! selection (if previously-selected (append selection new-text)
> new-text))
> (set! just-selected #t)))
> (define (char-alphanumeric? c)
> (or (char-alphabetic? c)
> (char-numeric? c)))
> (define (word-back-x)
> (let loop ((col (max (bols row) (- col 1))))
> (if (= col (bols row))
> col
> (if (string=? " " (ncplane_contents ncp row col 1 1))
> (loop (- col 1))
> (let loop ((col col))
> (if (= col (bols row))
> col
> (if (string=? " " (ncplane_contents ncp row (- col 1) 1 1))
> col
> (loop (- col 1)))))))))
> (define (word-forward-x)
> (let loop ((col (min (eols row) (+ col 1))))
> (if (= col (eols row))
> col
> (if (string=? " " (ncplane_contents ncp row col 1 1))
> (loop (+ col 1))
> (let loop ((col col))
> (if (= col (eols row))
> col
> (if (string=? " " (ncplane_contents ncp row col 1 1))
> col
> (loop (+ col 1)))))))))
>
> (set! (keymap (+ meta-key (char->integer #\B)))
> (set! (keymap (+ meta-key (char->integer #\b)))
> (lambda (c)
> (set! col (word-back-x)))))
>
> (set! (keymap (+ meta-key (char->integer #\C)))
> (set! (keymap (+ meta-key (char->integer #\c)))
> (lambda (c)
> (do ((len (- (eols row) col))
> (cur-line (ncplane_contents ncp row col 1 (- (eols row) col)))
> (i 0 (+ i 1)))
> ((or (= i len)
> (char-alphabetic? (cur-line i)))
> (when (< i len)
> (set! (cur-line i) (char-upcase (cur-line i)))
> (nc-display row col cur-line)
> (notcurses_refresh nc)
> (do ((k (+ i 1) (+ k 1)))
> ((or (>= k len)
> (not (char-alphanumeric? (cur-line k))))
> (set! col (min (eols row) (+ col k)))))))))))
>
> (set! (keymap (+ meta-key (char->integer #\D)))
> (set! (keymap (+ meta-key (char->integer #\d)))
> (lambda (c)
> (let ((newcol (word-forward-x)))
> (append-to-selection (ncplane_contents ncp row col 1 (- newcol col)))
> (nc-display row col (ncplane_contents ncp row newcol 1 (- (eols row) newcol)))
> (nc-display row (- (eols row) (- newcol col)) (make-string (- newcol col) #\space))
> (set! (eols row) (- (eols row) (- newcol col)))))))
>
> (set! (keymap (+ meta-key (char->integer #\F)))
> (set! (keymap (+ meta-key (char->integer #\f)))
> (lambda (c)
> (set! col (word-forward-x)))))
>
> (set! (keymap (+ meta-key (char->integer #\L)))
> (set! (keymap (+ meta-key (char->integer #\l)))
> (lambda (c)
> (do ((len (- (eols row) col))
> (cur-line (ncplane_contents ncp row col 1 (- (eols row) col)))
> (i 0 (+ i 1)))
> ((or (= i len)
> (char-alphabetic? (cur-line i)))
> (when (< i len)
> (do ((k i (+ k 1)))
> ((or (= k len)
> (not (char-alphabetic? (cur-line k))))
> (nc-display row col cur-line)
> (notcurses_refresh nc)
> (set! col (+ col k)))
> (set! (cur-line k) (char-downcase (cur-line k))))))))))
>
> (set! (keymap (+ meta-key (char->integer #\U)))
> (set! (keymap (+ meta-key (char->integer #\u)))
> (lambda (c)
> (do ((len (- (eols row) col))
> (cur-line (ncplane_contents ncp row col 1 (- (eols row) col)))
> (i 0 (+ i 1)))
> ((or (= i len)
> (char-alphabetic? (cur-line i)))
> (when (< i len)
> (do ((k i (+ k 1)))
> ((or (= k len)
> (not (char-alphabetic? (cur-line k))))
> (nc-display row col cur-line)
> (notcurses_refresh nc)
> (set! col (+ col k)))
> (set! (cur-line k) (char-upcase (cur-line k))))))))))
>
> (set! (keymap (+ meta-key (char->integer #\<)))
> (lambda (c)
> (set-row 0)
> (set-col (bols 0))))
>
> (set! (keymap (+ meta-key (char->integer #\>)))
> (lambda (c)
> (set-row ncp-max-row)
> (set-col (bols ncp-max-row))))
1268,1272c1327,1331
< (set! (keymap (+ control-key (char->integer #\K)))
< (lambda (c)
< (set! selection (ncplane_contents ncp row col 1 (- (eols row) col)))
< (nc-display row col (make-string (- (eols row) col) #\space))
< (set! (eols row) col)))
---
> (set! (keymap (+ control-key (char->integer #\K)))
> (lambda (c)
> (append-to-selection (ncplane_contents ncp row col 1 (- (eols row) col)))
> (nc-display row col (make-string (- (eols row) col) #\space))
> (set! (eols row) col)))
1340a1400,1416
> (set! (keymap (+ control-key (char->integer #\U)))
> (lambda (c)
> (prepend-to-selection (ncplane_contents ncp row (bols row) 1 (- col (bols row))))
> (nc-display row (bols row) (ncplane_contents ncp row col 1 (- (eols row) col)))
> (nc-display row (- (eols row) (- col (bols row))) (make-string (- col (bols row)) #\space))
> (set! (eols row) (- (eols row) (- col (bols row))))
> (set! col (bols row))))
>
> (set! (keymap (+ control-key (char->integer #\W)))
> (lambda (c)
> (let ((newcol (word-back-x)))
> (prepend-to-selection (ncplane_contents ncp row newcol 1 (- col newcol)))
> (nc-display row newcol (ncplane_contents ncp row col 1 (- (eols row) col)))
> (nc-display row (- (eols row) (- col newcol)) (make-string (- col newcol) #\space))
> (set! (eols row) (- (eols row) (- col newcol)))
> (set! col newcol))))
>
1353c1429
< (set-col (eols row)))))
---
> (set-col (+ col (length selection))))))
1474a1551,1553
> (set! previously-selected just-selected)
> (set! just-selected #f)
>
1476c1555,1559
< (func (hash-table-ref keymap (if (ncinput_ctrl ni) (+ c control-key) c))))
---
> (c (if (= c (char->integer #\escape))
> (logior meta-key (notcurses_getc nc (c-pointer 0) (c-pointer 0) ni))
> c))
> (func (hash-table-ref keymap (logior c (if (ncinput_ctrl ni) control-key 0)
> (if (ncinput_alt ni) meta-key 0)))))
More information about the Cmdist
mailing list