branch: externals/poke
commit 4e5528bff6245eaf0b60d224b3de0edeadb2bed7
Author: Stefan Monnier <[email protected]>
Commit: Stefan Monnier <[email protected]>

    Fix warnings and cosmetic details for GNU ELPA
    
    This doesn't fix quite all warnings yet, tho.
    
    * .gitignore: New file.
    * poke.el: Adjust copyright for GNU ELPA.
    Use `lexical-binding`.  Use `cl-lib` instead of `cl`.
    Let-bind `inhibit-read-only` rather than `buffer-read-only`.
    Replace all uses of `called-interactively-p` with an `and-display` arg.
    Replace save-excursion+set-buffer with `with-current-buffer`.
    Let `define-derived-mode` add the mode map to the docstring.
    (poke): New custom group.
    (PLET_STATE_LENGTH, PLET_STATE_MSG): Delete vars.
    Use symbols instead.
    (poke-pokelet-filter): Adjust accordingly.  Use `cl-callf`.
    (poke-repl-process): Declare before first use.
    (poke-out-stylize): `mapcar` => `dolist`.
    (poke-out-handle-cmd): Remove unused binding of `buffer-read-only`.
    (poke-out-mode): Use `define-derived-mode`.
    (poke--start-byte-offset): Rename from `start-byte-offset` and declare
    at top-level.
    (poke-vu-cmd-previous-line): Avoid `line-number-at-pos`.
    (poke-vu-cmd-next-line): Prefer `line-beginning-position` over
    point movement.  Avoid `end-of-buffer`.
    (poke-vu-cmd-page-down, poke-vu-cmd-page-up): Remove unused var `window`.
    (poke-vu-byte-pos): Use `forward-line` instead of `goto-line`.
    (poke-vu-mode-map): Define separately.
    (poke-vu-mode): Use `define-derived-mode`.
    (poke-vu-refresh): Take an optional `window` argument.
    Let `format` do the conversion from number to string.
    (window-size-change-functions): Set it buffer-locally in `poke-vu-mode`
    instead of setting it globally.
    (poke-repl-complete-begin, poke-repl-complete-end): Move before first use.
    (poke-elval-handle-cmd): Also use `lexical-binding` here.
    (poke-repl-input-sender): Mark `proc` arg as unused.
    (poke-edit-1): Use `mapconcat` (O(n) instead of O(n²)).
    (poke--edit-name, poke--edit-type, poke--edit-typekind)
    (poke--edit-elem-names, poke--edit-elem-values): Rename by adding the
    "poke--" prefix.
    (poke-pk): Pass a symbol to `poke-edit-2` for the `typekind`.
    (poke-edit-do-buffer): Presume `poke--edit-typekind` is a symbol rather
    than a string.  Use a closure instead of `(lambda ...).
    (poke-maps-populate): Remove unused var `map-type`.
---
 .gitignore |   3 +
 poke.el    | 484 ++++++++++++++++++++++++++++---------------------------------
 2 files changed, 228 insertions(+), 259 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000..c7e76127ef
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+*.elc
+/poke-autoloads.el
+/poke-pkg.el
diff --git a/poke.el b/poke.el
index c639b6ab4d..18b54d048a 100644
--- a/poke.el
+++ b/poke.el
@@ -1,6 +1,7 @@
-;;; poke.el --- Emacs meets GNU poke!
+;;; poke.el --- Emacs meets GNU poke!  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2022  Free Software Foundation, Inc.
 
-;; Copyright (C) 2022  Jose E. Marchesi
 ;; Author: Jose E. Marchesi <[email protected]>
 ;; Maintainer: Jose E. Marchesi <[email protected]>
 ;; URL: https://www.jemarch.net/poke
@@ -26,7 +27,7 @@
 
 ;;; Commentary:
 
-;; This file implements a Emacs interface to GNU poke, the extensible
+;; This file implements an Emacs interface to GNU poke, the extensible
 ;; editor for structured binary data.
 ;;
 ;; It uses the poked (GNU poke daemon) in order to act as a set of
@@ -52,7 +53,7 @@
 (require 'tabulated-list)
 (require 'poke-mode)
 (require 'widget)
-(require 'cl)
+(require 'cl-lib)
 
 ;;;; First, some utilities
 
@@ -66,6 +67,10 @@
           (ash (aref seq 1) 8)
           (aref seq 0)))
 
+(defgroup poke ()
+  "Poke interaction mode."
+  :group 'programming)
+
 ;;;; Faces
 
 (defface poke-integer-face '((t :foreground "green"))
@@ -144,9 +149,6 @@ buffer `*poked*'."
 
 ;;;; pokelet protocol
 
-(defconst PLET_STATE_LENGTH 0) ; Collecting length bytes.
-(defconst PLET_STATE_MSG 1) ; Collecting message data.
-
 (defun poke-pokelet-filter (proc string)
   "Process filter for pokelets.
 
@@ -154,33 +156,32 @@ This filter implements the poke daemon message protocol, 
called
 pdap.  PROC must be a pokelet process and is required to have the
 following attributes in its alist:
 
-  pokelet-state
+  `pokelet-state'
 
-    One of the POKE_STATE_* values below.  Initially must
-    be POKE_STATE_LENGTH.
+    One of the PLET_STATE_* values below.  Initially must
+    be PLET_STATE_LENGTH.
 
-  pokelet-buf
+  `pokelet-buf'
 
     This is a string that accumulates the input received
-    by the pokelet.  Initially "".
+    by the pokelet.  Initially \"\".
 
-  pokelet-msg-length
+  `pokelet-msg-length'
 
-    Lenght of the message being processed.  Initially 0.
+    Length of the message being processed.  Initially 0.
 
-  pokelet-msg-handler
+  `pokelet-msg-handler'
 
     Function that gets the process, a command number
     and a command argument.  This function can error
     if there is a protocol error."
-  (process-put proc 'pokelet-buf
-               (concat (process-get proc 'pokelet-buf) string))
-  (while (or (and (= (process-get proc 'pokelet-state) PLET_STATE_LENGTH)
+  (cl-callf concat (process-get proc 'pokelet-buf) string)
+  (while (or (and (eq (process-get proc 'pokelet-state) 'PLET_STATE_LENGTH)
                   (>= (length (process-get proc 'pokelet-buf)) 2))
-             (and (= (process-get proc 'pokelet-state) PLET_STATE_MSG)
+             (and (eq (process-get proc 'pokelet-state) 'PLET_STATE_MSG)
                   (>= (length (process-get proc 'pokelet-buf))
                       (process-get proc 'pokelet-msg-length))))
-    (if (= (process-get proc 'pokelet-state) PLET_STATE_LENGTH)
+    (if (eq (process-get proc 'pokelet-state) 'PLET_STATE_LENGTH)
         (let ((pokelet-buf (process-get proc 'pokelet-buf)))
           ;; The message lenght is encoded as an unsigned
           ;; little-endian 16 bit number.  Collect and skipt it.
@@ -190,7 +191,7 @@ following attributes in its alist:
                                (aref pokelet-buf 0)))
           (process-put proc 'pokelet-buf (substring pokelet-buf 2))
           ;; We are now waiting for the message data.
-          (process-put proc 'pokelet-state PLET_STATE_MSG))
+          (process-put proc 'pokelet-state 'PLET_STATE_MSG))
       ;; We are collecting message data.
       (when (>= (length (process-get proc 'pokelet-buf))
                 (process-get proc 'pokelet-msg-length))
@@ -208,14 +209,14 @@ following attributes in its alist:
                      'pokelet-buf
                      (substring (process-get proc 'pokelet-buf)
                                 (process-get proc 'pokelet-msg-length)))
-        (process-put proc 'pokelet-state PLET_STATE_LENGTH)))))
+        (process-put proc 'pokelet-state 'PLET_STATE_LENGTH)))))
 
 (defun poke-make-pokelet-process-new (name ctrl msg-handler)
    (let ((proc (make-network-process :name name
                                      :buffer (concat "*" name "*")
                                      :family 'local
                                      :service poked-socket)))
-     (process-put proc 'pokelet-state PLET_STATE_LENGTH)
+     (process-put proc 'pokelet-state 'PLET_STATE_LENGTH)
      (process-put proc 'pokelet-buf "")
      (process-put proc 'pokelet-msg-length 0)
      (process-put proc 'pokelet-msg-handler msg-handler)
@@ -235,6 +236,8 @@ following attributes in its alist:
 
 ;;;; poke-out pokelet
 
+(defvar poke-repl-process)
+
 (defconst poke-out-iter-string
   (propertize (char-to-string 8594) 'font-lock-face 'poke-iter-string-face))
 
@@ -242,14 +245,13 @@ following attributes in its alist:
 
 (defun poke-out-stylize (styles string)
   (let ((propertized-string string))
-    (mapcar (lambda (style)
-              (let* ((face-ass (assoc style poke-styling-faces))
-                     (face (when face-ass (cadr face-ass))))
-                (setq propertized-string
-                      (if face
-                          (propertize propertized-string 'font-lock-face face)
-                        propertized-string))))
-            (reverse styles))
+    (dolist (style (reverse styles))
+      (let* ((face-ass (assoc style poke-styling-faces))
+             (face (when face-ass (cadr face-ass))))
+        (setq propertized-string
+              (if face
+                  (propertize propertized-string 'font-lock-face face)
+                propertized-string))))
     propertized-string))
 
 (defun poke-out-handle-cmd (proc cmd data)
@@ -258,9 +260,8 @@ following attributes in its alist:
      (process-put proc 'poke-out-eval "")
      (when (buffer-live-p (process-buffer proc))
        (with-current-buffer (process-buffer proc)
-         (let ((buffer-read-only nil))
-           (goto-char (point-max))
-           (process-put proc 'poke-out-iter-begin (point))))))
+         (goto-char (point-max))
+         (process-put proc 'poke-out-iter-begin (point)))))
     (3 ;; Iteration end
      (when (buffer-live-p (process-buffer proc))
        (with-current-buffer (process-buffer proc)
@@ -269,10 +270,8 @@ following attributes in its alist:
                           (point-max))
              (narrow-to-region (process-get proc 'poke-out-iter-begin)
                                (point-max)))
-           (let ((buffer-read-only nil))
-             (mapcar (lambda (window)
-                       (set-window-point window (point-min)))
-                     (get-buffer-window-list))))))
+           (dolist (window (get-buffer-window-list))
+             (set-window-point window (point-min))))))
      (process-put proc 'poke-out-emitted-iter-string nil)
      (when (process-live-p poke-repl-process)
        (poke-repl-end-of-iteration (process-get proc 'poke-out-eval))))
@@ -282,7 +281,7 @@ following attributes in its alist:
        (when (buffer-live-p (process-buffer proc))
          (with-current-buffer (process-buffer proc)
            (save-excursion
-             (let ((buffer-read-only nil))
+             (let ((inhibit-read-only t))
                (goto-char (point-max))
                (unless (process-get proc 'poke-out-emitted-iter-string)
                  (insert (concat poke-out-iter-string "\n"))
@@ -300,7 +299,7 @@ following attributes in its alist:
        (when (not (process-live-p poke-repl-process))
          (when (buffer-live-p (process-buffer proc))
            (with-current-buffer (process-buffer proc)
-             (let ((buffer-read-only nil))
+             (let ((inhibit-read-only t))
                (goto-char (point-max))
                (insert (concat ">" output))))))))
     (7 ;; Error output
@@ -314,7 +313,7 @@ following attributes in its alist:
        (when (not (process-live-p poke-repl-process))
          (when (buffer-live-p (process-buffer proc))
            (with-current-buffer (process-buffer proc)
-             (let ((buffer-read-only nil))
+             (let ((inhibit-read-only t))
                (goto-char (point-max))
                (insert (concat "error>" output))))))))
     (4 ;; Styling class begin
@@ -336,24 +335,15 @@ following attributes in its alist:
      (error "pokelet protocol error"))))
 
 (defvar poke-out-font-lock nil
-  "Font lock entries for `poke-vu-mode'.")
+  "Font lock entries for `poke-out-mode'.")
 
-(defun poke-out-mode ()
-  "A major mode for Poke out buffers.
-
-Commands:
-\\{poke-out-mode-map}"
-  (interactive)
-  (kill-all-local-variables)
-  (setq poke-out-mode-map (make-keymap))
-  (use-local-map  poke-out-mode-map)
+(define-derived-mode poke-out-mode nil "poke-out"
+  "A major mode for Poke out buffers."
   (setq-local font-lock-defaults '(poke-out-font-lock))
-  (setq mode-name "poke-out")
-  (setq major-mode 'poke-out-mode)
   (read-only-mode t))
 
-(defun poke-out ()
-  (interactive)
+(defun poke-out (&optional and-display)
+  (interactive (list (not (or executing-kbd-macro noninteractive))))
   (when (not (process-live-p poke-out-process))
     (setq poke-out-process
           (poke-make-pokelet-process-new "poke-out" "\x81"
@@ -362,10 +352,9 @@ Commands:
     (process-put poke-out-process 'poke-out-iter-begin 1)
     (process-put poke-out-process 'poke-out-eval nil)
     (process-put poke-out-process 'poke-out-emitted-iter-string nil)
-    (save-excursion
-      (set-buffer "*poke-out*")
+    (with-current-buffer "*poke-out*"
       (poke-out-mode)))
-  (when (called-interactively-p)
+  (when and-display
     (switch-to-buffer-other-window "*poke-out*")))
 
 ;;;; poke-cmd pokelet
@@ -384,13 +373,13 @@ Commands:
           (process-send-string poke-cmd-process string)))
     (error "poke-cmd is not running")))
 
-(defun poke-cmd ()
-  (interactive)
+(defun poke-cmd (&optional and-display)
+  (interactive (list (not (or executing-kbd-macro noninteractive))))
   (when (not (process-live-p poke-cmd-process))
     (setq poke-cmd-process (poke-make-pokelet-process
                             "poke-cmd" "\x02"))
     (set-process-query-on-exit-flag poke-cmd-process nil))
-  (when (called-interactively-p)
+  (when and-display
     (switch-to-buffer-other-window "*poke-cmd*")))
 
 ;;;; poke-code pokelet
@@ -423,30 +412,25 @@ Commands:
 
 (defvar poke-code-mode-map
   (let ((map (make-sparse-keymap)))
-    (define-key map "\C-c\C-c" 'poke-code-cmd-send-code)
+    (define-key map "\C-c\C-c" #'poke-code-cmd-send-code)
     map))
 
 (define-derived-mode poke-code-mode poke-mode "poke-code"
-  "A major mode for Poke code.
-
-Commands:
-\\<poke-code-mode-map>
-\\{poke-code-mode-map}"
+  "A major mode for Poke code."
 )
 
-(defun poke-code ()
-  (interactive)
+(defun poke-code (&optional and-display)
+  (interactive (list (not (or executing-kbd-macro noninteractive))))
   (when (not (process-live-p poke-code-process))
     (setq poke-code-process (poke-make-pokelet-process
                             "poke-code" "\x01"))
     (set-process-query-on-exit-flag poke-code-process nil)
-    (save-excursion
-      (set-buffer "*poke-code*")
+    (with-current-buffer "*poke-code*"
       (poke-code-mode)
       (goto-char (point-min))
       (insert "/* This is a Poke evaluation buffer.\n"
               "   Press C-cC-c to evaluate. */\n")))
-  (when (called-interactively-p)
+  (when and-display
     (switch-to-buffer-other-window "*poke-code*")))
 
 ;;;; poke-vu pokelet
@@ -458,7 +442,7 @@ Commands:
     (1 ;; CLEAR
      (when (buffer-live-p (process-buffer proc))
        (with-current-buffer (process-buffer proc)
-         (let ((buffer-read-only nil))
+         (let ((inhibit-read-only t))
            (setq-local poke-vu-cur-pos (point))
            (delete-region (point-min) (point-max))))))
     (2 ;; APPEND
@@ -467,14 +451,13 @@ Commands:
     (5 ;; FINISH
      (when (buffer-live-p (process-buffer proc))
        (with-current-buffer (process-buffer proc)
-         (let* ((buffer-read-only nil)
+         (let* ((inhibit-read-only t)
                 (current-pos (buffer-local-value 'poke-vu-cur-pos
                                                  (current-buffer))))
            (insert (process-get proc 'poke-vu-output))
            (goto-char current-pos)
-           (mapcar (lambda (window)
-                     (set-window-point window current-pos))
-                   (get-buffer-window-list))
+           (dolist (window (get-buffer-window-list))
+             (set-window-point window current-pos))
            (let ((offset (poke-vu-byte-at-point)))
              (when offset
                (poke-vu-goto-byte offset))))))
@@ -494,33 +477,32 @@ Commands:
     )
   "Font lock entries for `poke-vu-mode'.")
 
+(defvar-local poke--start-byte-offset 0)
+
 (defun poke-vu-cmd-beginning-of-buffer ()
   (interactive)
-  (setq start-byte-offset 0)
+  (setq poke--start-byte-offset 0)
   (poke-vu-refresh)
   (poke-vu-goto-byte 0))
 
 (defun poke-vu-cmd-previous-line ()
   (interactive)
-  (if (equal (line-number-at-pos) 1)
+  (if (= (point-min) (line-beginning-position))
       (progn
-        (setq-local start-byte-offset (- start-byte-offset #x10))
+        (setq-local poke--start-byte-offset (- poke--start-byte-offset #x10))
         (poke-vu-refresh))
     (previous-line))
   (let ((offset (poke-vu-byte-at-point)))
     (if offset
-          (poke-vu-goto-byte offset))))
+        (poke-vu-goto-byte offset))))
 
 (defun poke-vu-cmd-next-line ()
   (interactive)
-  (if (save-excursion
-        (end-of-line)
-        (forward-char)
-        (eobp))
+  (if (>= (line-beginning-position 2) (point-max))
       (progn
-        (setq-local start-byte-offset (+ start-byte-offset #x10))
+        (setq-local poke--start-byte-offset (+ poke--start-byte-offset #x10))
         (poke-vu-refresh)
-        (end-of-buffer)
+        (goto-char (point-max))
         (previous-line))
     (next-line))
   (let ((offset (poke-vu-byte-at-point)))
@@ -529,22 +511,22 @@ Commands:
 
 (defun poke-vu-cmd-page-down ()
   (interactive)
-  (save-excursion
-    (let ((window (get-buffer-window (current-buffer))))
-      (setq-local start-byte-offset
-                  (+ start-byte-offset (* (- (window-height) 1) #x10)))
-      (poke-vu-refresh)))
+  (save-excursion ;; FIXME: What for, we're not moving here.
+    (setq-local poke--start-byte-offset
+                ;; FIXME: The window-height doesn't necessarily say
+                ;; how many lines are actually displayed :-(
+                (+ poke--start-byte-offset (* (- (window-height) 1) #x10)))
+    (poke-vu-refresh))
   (let ((offset (poke-vu-byte-at-point)))
     (if offset
         (poke-vu-goto-byte offset))))
 
 (defun poke-vu-cmd-page-up ()
   (interactive)
-  (save-excursion
-    (let ((window (get-buffer-window (current-buffer))))
-      (setq-local start-byte-offset
-                  (- start-byte-offset (* (- (window-height) 1) #x10)))
-      (poke-vu-refresh)))
+  (save-excursion ;; FIXME: What for, we're not moving here.
+    (setq-local poke--start-byte-offset
+                (- poke--start-byte-offset (* (- (window-height) 1) #x10)))
+    (poke-vu-refresh))
   (let ((offset (poke-vu-byte-at-point)))
     (if offset
         (poke-vu-goto-byte offset))))
@@ -553,7 +535,7 @@ Commands:
 
 (defun poke-vu-bol-byte ()
   "Return the byte offset of the first byte in the current line."
-  (+ start-byte-offset
+  (+ poke--start-byte-offset
      (* (- (line-number-at-pos) 1) poke-vu-bytes-per-line)))
 
 (defun poke-vu-byte-at-point ()
@@ -578,15 +560,15 @@ corresponding to the given offset.
 
 If the current buffer is not showing the given byte offset,
 return nil."
-  (when (and (>= offset start-byte-offset)
-             (<= offset (+ start-byte-offset
+  (when (and (>= offset poke--start-byte-offset)
+             (<= offset (+ poke--start-byte-offset
                            (* (count-lines (point-min) (point-max))
                               poke-vu-bytes-per-line))))
     (save-excursion
-      (let ((lineno (+ (/ (- offset start-byte-offset)
-                          poke-vu-bytes-per-line)
-                       1)))
-        (goto-line lineno)
+      (let ((lineno (/ (- offset poke--start-byte-offset)
+                          poke-vu-bytes-per-line)))
+        (goto-char (point-min))
+        (forward-line lineno)
         (let* ((lineoffset (- offset (poke-vu-bol-byte)))
                (column  (+ 10
                            (* 2 lineoffset)
@@ -604,8 +586,8 @@ relative to the beginning of the shown IO space."
   (let ((byte-pos (poke-vu-byte-pos offset)))
     (unless byte-pos
       ;; Scroll so the desired byte is in the first line.
-      (setq start-byte-offset (- offset
-                                 (% offset poke-vu-bytes-per-line)))
+      (setq poke--start-byte-offset (- offset
+                                       (% offset poke-vu-bytes-per-line)))
       (poke-vu-refresh)
       (setq byte-pos (poke-vu-byte-pos offset)))
     ;; Move the point where the byte at the given offset is.
@@ -661,79 +643,69 @@ relative to the beginning of the shown IO space."
           (kill-new string))
         (message "%s" string)))))
 
-(defun poke-vu-mode ()
-  "A major mode for Poke vu output.
+(defvar poke-vu-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-v"  #'poke-vu-cmd-page-down)
+    (define-key map "\M-v"  #'poke-vu-cmd-page-up)
+    (define-key map "\C-a"  #'poke-vu-cmd-move-beginning-of-line)
+    (define-key map "\C-e"  #'poke-vu-cmd-move-end-of-line)
+    (define-key map "\C-b"  #'poke-vu-cmd-backward-char)
+    (define-key map "\C-f"  #'poke-vu-cmd-forward-char)
+    (define-key map "\M-<"  #'poke-vu-cmd-beginning-of-buffer)
+    (define-key map "\C-p"  #'poke-vu-cmd-previous-line)
+    (define-key map "\C-n"  #'poke-vu-cmd-next-line)
+    (define-key map "\C-cg" #'poke-vu-cmd-goto-byte)
+    (define-key map "w"     #'poke-vu-cmd-copy-byte-offset-as-kill)
+    map))
 
-Commands:
-\\{poke-vu-mode-map}"
-  (interactive)
-  (kill-all-local-variables)
-  (setq poke-vu-mode-map (make-keymap))
-  (use-local-map  poke-vu-mode-map)
-  (define-key poke-vu-mode-map "\C-v" 'poke-vu-cmd-page-down)
-  (define-key poke-vu-mode-map "\M-v" 'poke-vu-cmd-page-up)
-  (define-key poke-vu-mode-map "\C-a" 'poke-vu-cmd-move-beginning-of-line)
-  (define-key poke-vu-mode-map "\C-e" 'poke-vu-cmd-move-end-of-line)
-  (define-key poke-vu-mode-map "\C-b" 'poke-vu-cmd-backward-char)
-  (define-key poke-vu-mode-map "\C-f" 'poke-vu-cmd-forward-char)
-  (define-key poke-vu-mode-map "\M-<" 'poke-vu-cmd-beginning-of-buffer)
-  (define-key poke-vu-mode-map "\C-p" 'poke-vu-cmd-previous-line)
-  (define-key poke-vu-mode-map "\C-n" 'poke-vu-cmd-next-line)
-  (define-key poke-vu-mode-map "\C-cg" 'poke-vu-cmd-goto-byte)
-  (define-key poke-vu-mode-map "w" 'poke-vu-cmd-copy-byte-offset-as-kill)
+(define-derived-mode poke-vu-mode nil "poke-vu"
+  "A major mode for Poke vu output."
   (setq-local font-lock-defaults '(poke-vu-font-lock))
-  (setq-local start-byte-offset 0)
+  (setq-local poke--start-byte-offset 0)
   (setq-local header-line-format
               "76543210  0011 2233 4455 6677 8899 aabb ccdd eeff  
0123456789ABCDEF")
-  (setq mode-name "poke-vu")
-  (setq major-mode 'poke-vu-mode)
-  (read-only-mode t))
+  (read-only-mode t)
+  (add-hook 'window-size-change-functions #'poke-vu-refresh nil t))
 
-(defun poke-vu ()
-  (interactive)
+(defun poke-vu (&optional and-display)
+  (interactive (list (not (or executing-kbd-macro noninteractive))))
   (when (not (process-live-p poke-vu-process))
     (setq poke-vu-process
           (poke-make-pokelet-process-new "poke-vu" "\x82"
                                          #'poke-vu-handle-cmd))
     (process-put poke-vu-process 'poke-vu-output "")
-    (save-excursion
-     (set-buffer "*poke-vu*")
+    (with-current-buffer "*poke-vu*"
      (poke-vu-mode)))
-  (when (called-interactively-p)
+  (when and-display
     (switch-to-buffer-other-window "*poke-vu*")))
 
 (defun poke-vu-erase ()
   (let ((buffer (get-buffer "*poke-vu*")))
     (when (and (process-live-p poke-vu-process)
                buffer)
-      (let ((buffer-read-only nil))
+      (let ((inhibit-read-only t))
         (delete-region (point-min) (point-max))))))
 
-(defun poke-vu-refresh ()
+(defun poke-vu-refresh (&optional window)
   "Return the Poke code to send in order to refresh the poke-vu
 buffer."
   (let* ((buffer (get-buffer "*poke-vu*"))
-         (window (get-buffer-window buffer)))
+         (window (or window (get-buffer-window buffer))))
+    (cl-assert (or (null window) (eq buffer (window-buffer window))))
     (when (and (process-live-p poke-vu-process)
                window)
       (poke-code-send (format
-                       "poke_el_vu_from = %s#B; poke_el_vu_size = %s#B; 
poke_el_vu_refresh;"
-                       (number-to-string
-                        (buffer-local-value 'start-byte-offset buffer))
-                       (number-to-string (* (- (window-height window) 2)
-                                            #x10)))))))
-
-(add-hook 'window-size-change-functions
-          (lambda (window)
-            (let (buffer (window-buffer window))
-              (when (equal (buffer-name buffer) "*poke-vu*")
-                (poke-vu-refresh)))))
+                       "poke_el_vu_from = %d#B; poke_el_vu_size = %d#B; 
poke_el_vu_refresh;"
+                       (buffer-local-value 'poke--start-byte-offset buffer)
+                       (* (- (window-height window) 2) #x10))))))
 
 ;;;; poke-complete
 
 (defvar poke-complete-process nil)
 
 (defvar poke-complete-alternatives nil)
+(defvar poke-repl-complete-begin nil)
+(defvar poke-repl-complete-end nil)
 
 (defun poke-complete-handle-cmd (proc cmd data)
   (pcase cmd
@@ -798,7 +770,7 @@ fun plet_elval = (string s) void:
   (pcase cmd
     (0 ;; EVAL
      (ignore-errors
-       (eval (car (read-from-string data)))))
+       (eval (car (read-from-string data)) t)))
     (_ ;; Protocol error
      (process-put proc 'pokelet-buf "")
      (process-put proc 'pokelet-msg-lenght 0)
@@ -821,19 +793,17 @@ fun plet_elval = (string s) void:
 
 (defvar poke-repl-mode-map
   (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "\C-ci") 'poke-ios)
-    (define-key map (kbd "\C-cc") 'poke-code)
-    (define-key map (kbd "\C-cs") 'poke-settings)
-    (define-key map (kbd "\C-cm") 'poke-maps)
-    (define-key map (kbd "\C-cv") 'poke-vu)
-    (define-key map (kbd "\C-cV") 'poke-vu-refresh)
+    (define-key map (kbd "\C-ci") #'poke-ios)
+    (define-key map (kbd "\C-cc") #'poke-code)
+    (define-key map (kbd "\C-cs") #'poke-settings)
+    (define-key map (kbd "\C-cm") #'poke-maps)
+    (define-key map (kbd "\C-cv") #'poke-vu)
+    (define-key map (kbd "\C-cV") #'poke-vu-refresh)
     map)
   "Local keymap for `poke-repl-mode' buffers.")
 
 (define-derived-mode poke-repl-mode comint-mode "poke"
-  "Major mode for the poke repl.
-\\<poke-repl-mode-map>
-\\{poke-repl-mode-map}"
+  "Major mode for the poke repl."
   (setq comint-prompt-regexp (concat "^" (regexp-quote poke-repl-prompt)))
   (setq comint-input-sender 'poke-repl-input-sender)
   (setq poke-repl-process
@@ -847,9 +817,6 @@ fun plet_elval = (string s) void:
                #'poke-repl-complete-symbol)
   (comint-output-filter poke-repl-process poke-repl-prompt))
 
-(defvar poke-repl-complete-begin nil)
-(defvar poke-repl-complete-end nil)
-
 (defun poke-repl-complete-symbol ()
   (let ((symbol (or (comint-word "a-zA-Z._'")
                     "")))
@@ -862,7 +829,7 @@ fun plet_elval = (string s) void:
 
 (defun poke-repl-end-of-iteration (valstring)
   (with-current-buffer "*poke-repl*"
-    (let ((buffer-read-only nil))
+    (let ((inhibit-read-only t))
       (save-excursion
         (if
             (re-search-backward
@@ -886,9 +853,10 @@ fun plet_elval = (string s) void:
           (delete-region (point) (line-end-position))))
       (comint-output-filter poke-repl-process poke-repl-prompt))))
 
-(defun poke-repl-input-sender (proc input)
-  (if (not (string-blank-p input))
-    (let ((buffer-read-only nil))
+(defun poke-repl-input-sender (_proc input)
+  (if (string-blank-p input)
+      (comint-output-filter poke-repl-process poke-repl-prompt)
+    (let ((inhibit-read-only t))
       (comint-output-filter poke-repl-process "-prv-\n")
       (comint-output-filter poke-repl-process poke-repl-prompt)
       (cond
@@ -903,11 +871,10 @@ fun plet_elval = (string s) void:
                                 "\"" (match-string 1 input) "\""
                                 ");")))
        (t
-        (poke-cmd-send (concat input ";")))))
-    (comint-output-filter poke-repl-process poke-repl-prompt)))
+        (poke-cmd-send (concat input ";")))))))
 
-(defun poke-repl ()
-  (interactive)
+(defun poke-repl (&optional and-display)
+  (interactive (list (not (or executing-kbd-macro noninteractive))))
   (poke-out)
   (poke-cmd)
   (poke-code)
@@ -917,7 +884,7 @@ fun plet_elval = (string s) void:
       (with-current-buffer  buf
         (poke-repl-mode)))
     (poke-code-send "poke_el_banner;"))
-  (when (called-interactively-p)
+  (when and-display
     (switch-to-buffer-other-window "*poke-repl*")))
 
 ;;;; poke-ios
@@ -964,17 +931,15 @@ fun plet_elval = (string s) void:
 
 (defvar poke-ios-mode-map
   (let ((map (make-sparse-keymap)))
-    (define-key map [return] 'poke-ios-cmd-set-ios)
-    (define-key map (kbd "RET") 'poke-ios-cmd-set-ios)
-    (define-key map (kbd "n") 'poke-ios-cmd-next)
-    (define-key map (kbd "p") 'poke-ios-cmd-prev)
+    (define-key map [return]    #'poke-ios-cmd-set-ios)
+    (define-key map (kbd "RET") #'poke-ios-cmd-set-ios)
+    (define-key map (kbd "n")   #'poke-ios-cmd-next)
+    (define-key map (kbd "p")   #'poke-ios-cmd-prev)
     map)
   "Local keymap for `poke-ios-mode' buffers.")
 
 (define-derived-mode poke-ios-mode tabulated-list-mode "poke-ios"
-  "Major mode for summarizing the open IO spaces in poke.
-\\<poke-ios-mode-map>
-\\{poke-ios-mode-map}"
+  "Major mode for summarizing the open IO spaces in poke."
   (setq tabulated-list-format nil)
   (setq tabulated-list-padding 2)
   (setq tabulated-list-sort-key nil)
@@ -1003,8 +968,7 @@ fun plet_elval = (string s) void:
 (defun poke-ios-populate ()
   "Populate a `poke-ios-mode' buffer with the data in `poke-ios-alist."
   (when (get-buffer "*poke-ios*")
-    (save-excursion
-      (set-buffer "*poke-ios*")
+    (with-current-buffer "*poke-ios*"
       (let ((headers [("Id" 5 t) ("Handler" 10 nil) ("Flags" 8 nil)
                       ("Size" 6 t)])
             (entries (mapcar
@@ -1026,14 +990,14 @@ fun plet_elval = (string s) void:
         (goto-char (point-min))
         (poke-ios-update-overlay)))))
 
-(defun poke-ios ()
-  (interactive)
+(defun poke-ios (&optional and-display)
+  (interactive (list (not (or executing-kbd-macro noninteractive))))
   (let ((buf (get-buffer-create "*poke-ios*")))
     (with-current-buffer buf
       (poke-ios-mode)
       (poke-ios-populate)
       (poke-ios-update-overlay)))
-  (when (called-interactively-p)
+  (when and-display
     (switch-to-buffer-other-window "*poke-ios*")))
 
 ;;;; poke-edit
@@ -1044,20 +1008,17 @@ fun plet_elval = (string s) void:
                           name ", "
                           "typeof (" name "));")))
 
-(defun poke-edit-1 (name type typekind elems)
-  (let ((elem-names "")
-        (elem-values ""))
-    (mapcar
-     (lambda (ename)
-       (setq elem-names (concat elem-names "\"" ename "\",")))
-     elems)
-    (mapcar
-     (lambda (ename)
-       (setq elem-values (concat elem-values "format (\"%Tv\", "
-                                 "(" name ")"
-                                 (if (equal (aref ename 0) ?\[) "" ".")
-                                 ename "),")))
-     elems)
+(defun poke-edit-1 (name _type _typekind elems)
+  (let ((elem-names
+         (mapconcat (lambda (ename) (concat "\"" ename "\""))
+                    elems ","))
+        (elem-values
+         (mapconcat (lambda (ename)
+                      (concat "format (\"%Tv\", "
+                              "(" name ")"
+                              (if (equal (aref ename 0) ?\[) "" ".")
+                              ename ")"))
+                    elems ",")))
     (poke-code-send
      (concat "poke_el_edit_2 ("
              "\"" name "\", "
@@ -1066,15 +1027,21 @@ fun plet_elval = (string s) void:
              "[" elem-names "], "
              "[" elem-values "]);"))))
 
+(defvar poke--edit-name)
+(defvar poke--edit-type)
+(defvar poke--edit-typekind)
+(defvar poke--edit-elem-names)
+(defvar poke--edit-elem-values)
+
 (defun poke-edit-2 (name type typekind elem-names elem-values)
   (let ((buf (get-buffer-create "*poke-edit*")))
     (with-current-buffer buf
       (poke-edit-mode)
-      (setq-local edit-name name)
-      (setq-local edit-type type)
-      (setq-local edit-typekind typekind)
-      (setq-local edit-elem-names elem-names)
-      (setq-local edit-elem-values elem-values)
+      (setq-local poke--edit-name name)
+      (setq-local poke--edit-type type)
+      (setq-local poke--edit-typekind typekind)
+      (setq-local poke--edit-elem-names elem-names)
+      (setq-local poke--edit-elem-values elem-values)
       (poke-edit-do-buffer)
       (when (not (get-buffer-window "*poke-edit*"))
         (switch-to-buffer-other-window "*poke-edit*")))))
@@ -1082,7 +1049,7 @@ fun plet_elval = (string s) void:
 (defvar poke-edit-mode-map
   (let ((map (make-sparse-keymap)))
     (set-keymap-parent map widget-keymap)
-    (define-key map (kbd "q") 'quit-window)
+    (define-key map (kbd "q") #'quit-window)
     map))
 
 (defun poke-edit-mode ()
@@ -1095,44 +1062,48 @@ fun plet_elval = (string s) void:
   (let ((inhibit-read-only t))
     (erase-buffer))
   (remove-overlays)
-  (widget-insert (concat (propertize edit-name
+  (widget-insert (concat (propertize poke--edit-name
                                      'font-lock-face
                                      'poke-edit-header-face)
                          " = "
-                         edit-type
+                         poke--edit-type
                          "\n"))
   (widget-insert (concat "  "
-                         (pcase edit-typekind
-                           ("struct" "{")
-                           ("array" "[")
+                         (pcase poke--edit-typekind
+                           ('struct "{")
+                           ('array "[")
                            (_ ""))
                          "\n"))
-  (mapcar*
+  (cl-mapcar
    (lambda (elem-name elem-value)
      (widget-create 'editable-field
                     :size 2
                     :format (concat "    "
                                     (propertize elem-name
                                                 'font-lock-face
-                                                'poke-struct-field-name-face) 
"=" "%v,")
-                    :action `(lambda (widget event)
-                               (poke-code-send
-                                (concat "(" ,edit-name ")"
-                                        (if (equal ,edit-typekind "struct")
-                                            "."
-                                          "")
-                                        ,elem-name
-                                        " = "
-                                        (widget-value widget)
-                                        ";"
-                                        "plet_elval 
(\"(poke-edit-after)\");")))
+                                                'poke-struct-field-name-face)
+                                    "=" "%v,")
+                    :action
+                    (let ((edit-name poke--edit-name)
+                          (edit-typekind poke--edit-typekind))
+                      (lambda (widget _event)
+                        (poke-code-send
+                         (concat "(" edit-name ")"
+                                 (if (equal edit-typekind 'struct)
+                                     "."
+                                   "")
+                                 elem-name
+                                 " = "
+                                 (widget-value widget)
+                                 ";"
+                                 "plet_elval (\"(poke-edit-after)\");"))))
                     elem-value)
      (widget-insert "\n"))
-   edit-elem-names
-   edit-elem-values)
-  (widget-insert (concat "  " (pcase edit-typekind
-                                ("struct" "}")
-                                ("array" "]")
+   poke--edit-elem-names
+   poke--edit-elem-values)
+  (widget-insert (concat "  " (pcase poke--edit-typekind
+                                ('struct "}")
+                                ('array "]")
                                 (_ ""))
                          "\n"))
   (widget-setup)
@@ -1143,7 +1114,7 @@ fun plet_elval = (string s) void:
   (poke-vu-refresh)
   (let ((buf (get-buffer "*poke-edit*")))
     (set-buffer buf)
-    (poke-edit edit-name)))
+    (poke-edit poke--edit-name)))
 
 ;;;; poke-maps
 
@@ -1193,14 +1164,13 @@ Each entry in the stack is a list of strings, and may 
be empty.")
   "Populate a `poke-maps-mode' buffer with the map listing
 at the top of the `poke-maps-stack' stack."
   (when (get-buffer "*poke-maps*")
-    (save-excursion
-      (set-buffer "*poke-maps*")
+    (with-current-buffer "*poke-maps*"
       (let ((headers [("" 3 nil) ("Offset" 20 nil) ("Name" 30 nil)])
             (entries (mapcar
                       (lambda (map)
                         (let ((map-mark (if (car map) "#" ""))
                               (map-name (cadr map))
-                              (map-type (caddr map))
+                              ;; (map-type (caddr map))
                               (map-offset (cadddr map)))
                           (list map-name (vector map-mark
                                                  (if (equal (% map-offset 8) 0)
@@ -1260,8 +1230,7 @@ at the top of the `poke-maps-stack' stack."
   (let ((buf (get-buffer "*poke-out*"))
         (cur-window (get-buffer-window)))
     (when buf
-      (save-excursion
-        (set-buffer buf)
+      (with-current-buffer buf
         (ignore-errors
           (mapcar (lambda (window)
                     (select-window window)
@@ -1280,21 +1249,19 @@ at the top of the `poke-maps-stack' stack."
 
 (defvar poke-maps-mode-map
   (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "RET") 'poke-maps-cmd-sub)
-    (define-key map (kbd "SPC") 'poke-maps-cmd-scroll-out-up)
-    (define-key map (kbd "u") 'poke-maps-cmd-parent)
-    (define-key map (kbd "#") 'poke-maps-cmd-mark)
-    (define-key map (kbd "n") 'poke-maps-cmd-next)
-    (define-key map (kbd "p") 'poke-maps-cmd-prev)
-    (define-key map (kbd "e") 'poke-maps-cmd-edit)
-    (define-key map (kbd "w") 'poke-maps-cmd-copy-name-as-kill)
+    (define-key map (kbd "RET") #'poke-maps-cmd-sub)
+    (define-key map (kbd "SPC") #'poke-maps-cmd-scroll-out-up)
+    (define-key map (kbd "u")   #'poke-maps-cmd-parent)
+    (define-key map (kbd "#")   #'poke-maps-cmd-mark)
+    (define-key map (kbd "n")   #'poke-maps-cmd-next)
+    (define-key map (kbd "p")   #'poke-maps-cmd-prev)
+    (define-key map (kbd "e")   #'poke-maps-cmd-edit)
+    (define-key map (kbd "w")   #'poke-maps-cmd-copy-name-as-kill)
     map)
   "Local keymap for `poke-maps-mode' buffer.")
 
 (define-derived-mode poke-maps-mode tabulated-list-mode "poke-maps"
-    "Major mode for listing the maps in poke.
-\\<poke-maps-mode-map>
-\\{poke-maps-mode-map}"
+  "Major mode for listing the maps in poke."
   (setq tabulated-list-format nil)
   (setq tabulated-list-padding 2)
   (setq tabulated-list-sort-key nil)
@@ -1311,12 +1278,12 @@ at the top of the `poke-maps-stack' stack."
                 (line-end-position))
   (overlay-put poke-maps-overlay 'face 'highlight))
 
-(defun poke-maps ()
-  (interactive)
+(defun poke-maps (&optional and-display)
+  (interactive (list (not (or executing-kbd-macro noninteractive))))
   (let ((buf (get-buffer-create "*poke-maps*")))
     (with-current-buffer buf
       (poke-maps-do-buffer)))
-  (when (called-interactively-p)
+  (when and-display
     (switch-to-buffer-other-window "*poke-maps*")))
 
 ;;;; poke-settings
@@ -1364,7 +1331,7 @@ Expected 2, 8, 10 or 16."))
 (defvar poke-settings-map
   (let ((map (make-sparse-keymap)))
     (set-keymap-parent map widget-keymap)
-    (define-key map (kbd "q") 'quit-window)
+    (define-key map (kbd "q") #'quit-window)
     map))
 
 (defun poke-settings-create-widgets ()
@@ -1375,7 +1342,7 @@ Expected 2, 8, 10 or 16."))
   (widget-insert "Output mode:\n")
   (widget-create 'radio-button-choice
                  :value poke-setting-omode
-                 :notify (lambda (widget &rest ignore)
+                 :notify (lambda (widget &rest _)
                            (poke-setting-set-omode (widget-value widget))
                            (setq poke-setting-omode (widget-value widget)))
                  '(item "plain") '(item "tree"))
@@ -1383,7 +1350,7 @@ Expected 2, 8, 10 or 16."))
   (widget-insert "Output base:\n")
   (widget-create 'radio-button-choice
                  :value poke-setting-obase
-                 :notify (lambda (widget &rest ignore)
+                 :notify (lambda (widget &rest _)
                            (poke-setting-set-obase (widget-value widget))
                            (setq poke-setting-obase (widget-value widget)))
                  '(item 2) '(item 8) '(item 10) '(item 16))
@@ -1391,7 +1358,7 @@ Expected 2, 8, 10 or 16."))
   (widget-insert "Pretty-print:\n")
   (widget-create 'radio-button-choice
                  :value poke-setting-pretty-print
-                 :notify (lambda (widget &rest ignore)
+                 :notify (lambda (widget &rest _)
                            (poke-setting-set-pretty-print (widget-value 
widget))
                            (setq poke-setting-pretty-print (widget-value 
widget)))
                  '(item "yes") '(item "no"))
@@ -1399,7 +1366,7 @@ Expected 2, 8, 10 or 16."))
   (widget-insert "Output offsets:\n")
   (widget-create 'radio-button-choice
                  :value poke-setting-omaps
-                 :notify (lambda (widget &rest ignore)
+                 :notify (lambda (widget &rest _)
                            (poke-setting-set-omaps (widget-value widget))
                            (setq poke-setting-omaps (widget-value widget)))
                  '(item "yes") '(item "no"))
@@ -1407,14 +1374,14 @@ Expected 2, 8, 10 or 16."))
   (use-local-map poke-settings-map)
   (widget-setup))
 
-(defun poke-settings ()
-  (interactive)
+(defun poke-settings (&optional and-display)
+  (interactive (list (not (or executing-kbd-macro noninteractive))))
   (let ((buf (get-buffer "*poke-settings*")))
     (unless buf
       (setq buf (get-buffer-create "*poke-settings*"))
       (with-current-buffer buf
         (poke-settings-create-widgets))))
-  (when (called-interactively-p)
+  (when and-display
     (switch-to-buffer-other-window "*poke-settings*")))
 
 ;;;; Main interface
@@ -1538,7 +1505,7 @@ fun poke_el_edit_2 = (string name, any val, Pk_Type 
valtype,
     elem_vals_list += \"\\\"\" + escape_string (elem_vals[i]) + \"\\\" \";
   elem_vals_list += \")\";
 
-  var cmd = format (\"(poke-edit-2 \\\"%s\\\" \\\"%s\\\" \\\"%s\\\" %s %s)\"
+  var cmd = format (\"(poke-edit-2 \\\"%s\\\" \\\"%s\\\" '%s %s %s)\"
                     name, valtype.name, typekind,
                     elem_names_list, elem_vals_list);
   plet_elval (cmd);
@@ -1599,13 +1566,12 @@ fun quit = void:
   (interactive)
   ;; Note that killing the buffers will also kill the
   ;; associated processes if they are running.
-  (mapcar
-   (lambda (bufname)
-     (let ((buf (get-buffer bufname)))
-       (when buf (kill-buffer buf))))
-   '("*poke-out*" "*poke-cmd*" "*poke-code*" "*poke-ios*"
+  (dolist (bufname
+           '("*poke-out*" "*poke-cmd*" "*poke-code*" "*poke-ios*"
      "*poke-vu*" "*poke-repl*" "*poke-elval*" "*poked*"
      "*poke-settings*" "*poke-maps*" "*poke-edit*" "*poke-complete*"))
+    (let ((buf (get-buffer bufname)))
+      (when buf (kill-buffer buf))))
   (setq poke-repl-prompt poke-repl-default-prompt)
   (setq poke-ios-alist nil))
 

Reply via email to