From 1be27e3bf36f5e984429f645bdce1bcb8e82c54c Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 10 Feb 2021 17:47:18 -0500 Subject: [PATCH] * lisp/play/decipher.el: Use lexical-binding (decipher-mode-syntax-table): Move initialization into declaration. (decipher-mode, decipher-stats-mode): Use `define-derived-mode`. (decipher-stats-buffer): Use `buffer-local-value`. --- lisp/play/decipher.el | 84 ++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 50 deletions(-) diff --git a/lisp/play/decipher.el b/lisp/play/decipher.el index 524ca81f30a..9b2626b19da 100644 --- a/lisp/play/decipher.el +++ b/lisp/play/decipher.el @@ -1,4 +1,4 @@ -;;; decipher.el --- cryptanalyze monoalphabetic substitution ciphers +;;; decipher.el --- cryptanalyze monoalphabetic substitution ciphers -*- lexical-binding: t; -*- ;; ;; Copyright (C) 1995-1996, 2001-2021 Free Software Foundation, Inc. ;; @@ -71,7 +71,7 @@ ;; Emacs commands. ;; ;; Decipher supports Font Lock mode. To use it, you can also add -;; (add-hook 'decipher-mode-hook 'turn-on-font-lock) +;; (add-hook 'decipher-mode-hook #'turn-on-font-lock) ;; See the variable `decipher-font-lock-keywords' if you want to customize ;; the faces used. I'd like to thank Simon Marshall for his help in making ;; Decipher work well with Font Lock. @@ -84,6 +84,8 @@ ;; 1. The consonant-line shortcut ;; 2. More functions for analyzing ciphertext +;;; Code: + ;;;=================================================================== ;;; Variables: ;;;=================================================================== @@ -139,20 +141,20 @@ the tail of the list." (defvar decipher-mode-map (let ((map (make-keymap))) (suppress-keymap map) - (define-key map "A" 'decipher-show-alphabet) - (define-key map "C" 'decipher-complete-alphabet) - (define-key map "D" 'decipher-digram-list) - (define-key map "F" 'decipher-frequency-count) - (define-key map "M" 'decipher-make-checkpoint) - (define-key map "N" 'decipher-adjacency-list) - (define-key map "R" 'decipher-restore-checkpoint) - (define-key map "U" 'decipher-undo) - (define-key map " " 'decipher-keypress) - (define-key map [remap undo] 'decipher-undo) - (define-key map [remap advertised-undo] 'decipher-undo) + (define-key map "A" #'decipher-show-alphabet) + (define-key map "C" #'decipher-complete-alphabet) + (define-key map "D" #'decipher-digram-list) + (define-key map "F" #'decipher-frequency-count) + (define-key map "M" #'decipher-make-checkpoint) + (define-key map "N" #'decipher-adjacency-list) + (define-key map "R" #'decipher-restore-checkpoint) + (define-key map "U" #'decipher-undo) + (define-key map " " #'decipher-keypress) + (define-key map [remap undo] #'decipher-undo) + (define-key map [remap advertised-undo] #'decipher-undo) (let ((key ?a)) (while (<= key ?z) - (define-key map (vector key) 'decipher-keypress) + (define-key map (vector key) #'decipher-keypress) (cl-incf key))) map) "Keymap for Decipher mode.") @@ -161,24 +163,21 @@ the tail of the list." (defvar decipher-stats-mode-map (let ((map (make-keymap))) (suppress-keymap map) - (define-key map "D" 'decipher-digram-list) - (define-key map "F" 'decipher-frequency-count) - (define-key map "N" 'decipher-adjacency-list) + (define-key map "D" #'decipher-digram-list) + (define-key map "F" #'decipher-frequency-count) + (define-key map "N" #'decipher-adjacency-list) map) -"Keymap for Decipher-Stats mode.") + "Keymap for Decipher-Stats mode.") -(defvar decipher-mode-syntax-table nil - "Decipher mode syntax table") - -(if decipher-mode-syntax-table - () +(defvar decipher-mode-syntax-table (let ((table (make-syntax-table)) (c ?0)) (while (<= c ?9) (modify-syntax-entry c "_" table) ;Digits are not part of words (cl-incf c)) - (setq decipher-mode-syntax-table table))) + table) + "Decipher mode syntax table") (defvar-local decipher-alphabet nil) ;; This is an alist containing entries (PLAIN-CHAR . CIPHER-CHAR), @@ -214,7 +213,6 @@ list of such cons cells.") (defvar decipher--freqs) ;;;=================================================================== -;;; Code: ;;;=================================================================== ;; Main entry points: ;;-------------------------------------------------------------------- @@ -256,7 +254,7 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ -*-decipher-*-\n)\n\n") (decipher-mode)) ;;;###autoload -(defun decipher-mode () +(define-derived-mode decipher-mode nil "Decipher" "Major mode for decrypting monoalphabetic substitution ciphers. Lower-case letters enter plaintext. Upper-case letters are commands. @@ -272,16 +270,10 @@ The most useful commands are: Show adjacency list for current letter (lists letters appearing next to it) \\[decipher-make-checkpoint] Save the current cipher alphabet (checkpoint) \\[decipher-restore-checkpoint] Restore a saved cipher alphabet (checkpoint)" - (interactive) - (kill-all-local-variables) (setq buffer-undo-list t ;Disable undo - indent-tabs-mode nil ;Do not use tab characters - major-mode 'decipher-mode - mode-name "Decipher") + indent-tabs-mode nil) ;Do not use tab characters (if decipher-force-uppercase (setq case-fold-search nil)) ;Case is significant when searching - (use-local-map decipher-mode-map) - (set-syntax-table decipher-mode-syntax-table) (unless (= (point-min) (point-max)) (decipher-read-alphabet)) (setq-local font-lock-defaults @@ -291,7 +283,6 @@ The most useful commands are: (lambda () (setq buffer-read-only nil buffer-undo-list nil)) nil t) - (run-mode-hooks 'decipher-mode-hook) (setq buffer-read-only t)) (put 'decipher-mode 'mode-class 'special) @@ -314,10 +305,10 @@ The most useful commands are: ((= ?> first-char) nil) ((= ?\( first-char) - (setq decipher-function 'decipher-alphabet-keypress) + (setq decipher-function #'decipher-alphabet-keypress) t) ((= ?\) first-char) - (setq decipher-function 'decipher-alphabet-keypress) + (setq decipher-function #'decipher-alphabet-keypress) nil) (t (error "Bad location"))))) @@ -456,7 +447,7 @@ The most useful commands are: (decipher-insert plain-char) (setq case-fold-search t ;Case is not significant cipher-string (downcase cipher-string)) - (let ((font-lock-fontify-region-function 'ignore)) + (let ((font-lock-fontify-region-function #'ignore)) ;; insert-and-inherit will pick the right face automatically (while (search-forward-regexp "^:" nil t) (setq bound (point-at-eol)) @@ -868,12 +859,12 @@ Creates the statistics buffer if it doesn't exist." (aset decipher--after i (make-vector 27 0)))) (if decipher-ignore-spaces (progn - (decipher-loop-no-breaks 'decipher--analyze) + (decipher-loop-no-breaks #'decipher--analyze) ;; The first character of ciphertext was marked as following a space: (let ((i 26)) (while (>= (cl-decf i) 0) (aset (aref decipher--after i) 26 0)))) - (decipher-loop-with-breaks 'decipher--analyze)) + (decipher-loop-with-breaks #'decipher--analyze)) (message "Processing results...") (setcdr (last decipher--digram-list 2) nil) ;Delete the phony "* " digram ;; Sort the digram list by frequency and alphabetical order: @@ -954,18 +945,12 @@ Creates the statistics buffer if it doesn't exist." ;; Statistics Buffer: ;;==================================================================== -(defun decipher-stats-mode () +(define-derived-mode decipher-stats-mode nil "Decipher-Stats" "Major mode for displaying ciphertext statistics." - (interactive) - (kill-all-local-variables) (setq buffer-read-only t buffer-undo-list t ;Disable undo case-fold-search nil ;Case is significant when searching - indent-tabs-mode nil ;Do not use tab characters - major-mode 'decipher-stats-mode - mode-name "Decipher-Stats") - (use-local-map decipher-stats-mode-map) - (run-mode-hooks 'decipher-stats-mode-hook)) + indent-tabs-mode nil)) ;Do not use tab characters (put 'decipher-stats-mode 'mode-class 'special) ;;-------------------------------------------------------------------- @@ -1001,9 +986,8 @@ if it can't, it signals an error." (let ((stats-name (concat "*" (buffer-name) "*"))) (setq decipher-stats-buffer (if (eq 'decipher-stats-mode - (cdr-safe (assoc 'major-mode - (buffer-local-variables - (get-buffer stats-name))))) + (buffer-local-value 'major-mode + (get-buffer stats-name))) ;; We just lost track of the statistics buffer: (get-buffer stats-name) (generate-new-buffer stats-name)))) -- 2.39.5