]> git.eshelyaron.com Git - sweep.git/commitdiff
ADDED: minor mode for moving to the next hole with TAB
authorEshel Yaron <me@eshelyaron.com>
Fri, 2 Dec 2022 11:41:32 +0000 (13:41 +0200)
committerEshel Yaron <me@eshelyaron.com>
Fri, 2 Dec 2022 12:21:30 +0000 (14:21 +0200)
* sweeprolog.el (sweeprolog-forward-hole-on-tab-mode): new minor mode,
binding TAB to...
(sweeprolog-indent-or-forward-hole): new command.
* README.org ("Filling Holes"): rephrase and mention new minor mode.

README.org
sweeprolog.el

index a289c99ce6b15645b5d11c4d0ba34f1c113ec626..885dc9cbc9fc3f70e3f7d0b1295b0f2daa7d4bb3 100644 (file)
@@ -666,13 +666,13 @@ buffer, and applying the following layout rules:
 
 To enable this mode in a ~sweeprolog-mode~ buffer, type ~M-x
 sweeprolog-electric-layout-mode~.  This step can be automated by adding
-~sweeprolog-electric-layout-mode~ to ~sweeprolog-mode-hook~[fn:2]:
+~sweeprolog-electric-layout-mode~ to ~sweeprolog-mode-hook~[fn:1]:
 
 #+begin_src emacs-lisp
   (add-hook 'sweeprolog-mode-hook #'sweeprolog-electric-layout-mode)
 #+end_src
 
-[fn:2] For more information about major mode hooks in Emacs, which
+[fn:1] For more information about major mode hooks in Emacs, which
 ~sweeprolog-mode-hook~ is one of, see [[info:emacs#Hooks][Hooks]].
 
 ** Term-based editing and motion commands
@@ -1072,7 +1072,7 @@ placeholders for the arguments of the head term (if any) and for the
 clause's body.  These placeholders, called simply "holes", represent
 the Prolog terms that remain to be given by the user.  Holes are
 written in the buffer as regular Prolog variables, but they are
-annotated with a special text property[fn:1] that allows
+annotated with a special text property[fn:2] that allows
 ~sweeprolog-mode~ to recognize them as holes needed to be filled.  After
 a term is inserted with ~sweeprolog-insert-term-dwim~, the region is set
 to the first hole and the cursor left at the its end.
@@ -1084,16 +1084,31 @@ them easily distinguishable from regular Prolog variables.  Hole
 highlighting is enabled by default, to disable it customize
 ~sweeprolog-highlight-holes~ to nil.
 
+#+FINDEX: sweeprolog-backward-hole
 #+FINDEX: sweeprolog-forward-hole
 #+KINDEX: C-c C-i
 #+KINDEX: C-c TAB
 #+KINDEX: C-- C-c C-i
 #+KINDEX: C-- C-c TAB
 To jump to the next hole in a ~sweeprolog-mode~ buffer, use the command
-~C-c C-i~ (~M-x sweeprolog-forward-hole~).  This command sets up the
-region to cover the next hole after point leaving the cursor at right
-after the hole.  To jump to the previous hole instead, call
-~sweeprolog-forward-hole~ with a negative prefix argument (~C-- C-c C-i~).
+~M-x sweeprolog-forward-hole~, bound by default to ~C-c TAB~ (or ~C-c C-i~).
+This command sets up the region to cover the next hole after point
+leaving the cursor at right after the hole.  To jump to the previous
+hole instead, use ~sweeprolog-backward-hole~ or call
+~sweeprolog-forward-hole~ with a negative prefix argument (~C-- C-c TAB~).
+
+When the minor mode ~sweeprolog-forward-hole-on-tab-mode~ is enabled,
+the ~TAB~ key is bound to a command moves to the next hole when called
+in a properly indented line (otherwise it indents the line).  This
+makes moving between holes in the buffer easier since ~TAB~ can be used
+instead of ~C-c TAB~ in most cases.  To enable this mode in a Prolog
+buffer, type ~M-x sweeprolog-forward-hole-on-tab-mode-map~.  This step
+can be automated by adding ~sweeprolog-forward-hole-on-tab-mode~ to
+~sweeprolog-mode-hook~:
+
+#+begin_src emacs-lisp
+  (add-hook 'sweeprolog-mode-hook #'sweeprolog-forward-hole-on-tab-mode)
+#+end_src
 
 To "fill" a hole marked by one of the aforementioned commands, type
 ~C-w~ (~M-x kill-region~) to kill the region and remove the placeholder
@@ -1103,7 +1118,7 @@ enabled the placeholder is automatically deleted when the user inserts
 a character while the region is active (see also [[info:emacs#Using Region][Using Region in the
 Emacs manual]]).
 
-[fn:1] see [[info:elisp#Text Properties][Text Properties in the Elisp manual]]
+[fn:2] see [[info:elisp#Text Properties][Text Properties in the Elisp manual]]
 
 ** Writing Tests
 :PROPERTIES:
@@ -1357,7 +1372,7 @@ backtracking.
 The =sweeprolog-top-level-mode=, enabled in the =sweep= top-level buffer,
 integrates with the standard Emacs symbol completion mechanism to
 provide completion for predicate names.  To complete a partial
-predicate name in the top-level prompt, use =C-M-i= (or =M-<TAB>=).  For
+predicate name in the top-level prompt, use =C-M-i= (or =M-TAB=).  For
 more information see [[info:emacs#Symbol Completion][Symbol Completion in the Emacs manual]].
 
 * Finding Prolog code
index b8bb8b780a7d826f27a418c1661b244f0797fe2b..4bf303b1e5172ef3d1714597958ab27a913690d5 100644 (file)
@@ -92,6 +92,9 @@ Prolog token as returned from `sweeprolog-last-token-boundaries'.")
 
 (defvar sweeprolog-top-level-mode-syntax-table sweeprolog-mode-syntax-table)
 
+(defvar sweeprolog-module-documentation-regexp (rx bol (zero-or-more whitespace)
+                                                   ":-" (zero-or-more whitespace)
+                                                   "module("))
 ;;;; User options
 
 (defgroup sweeprolog nil
@@ -399,10 +402,6 @@ non-terminals)."
     map)
   "Local keymap for `sweeprolog-top-level-menu-mode' buffers.")
 
-(defvar sweeprolog-module-documentation-regexp (rx bol (zero-or-more whitespace)
-                                                   ":-" (zero-or-more whitespace)
-                                                   "module("))
-
 ;;;###autoload
 (defvar sweeprolog-help-prefix-map
   (let ((map (make-sparse-keymap)))
@@ -428,6 +427,11 @@ non-terminals)."
     map)
   "Keymap for `sweeprolog' global commands.")
 
+(defvar sweeprolog-forward-hole-on-tab-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "TAB") #'sweeprolog-indent-or-forward-hole)
+    map)
+  "Keymap for moving to next hole with TAB.")
 
 ;;;; Menu bar
 
@@ -4179,6 +4183,41 @@ valid Prolog atom."
           (sweeprolog-analyze-buffer t))
       (message "No implicit autoloads found."))))
 
+
+;;;; Minor mode for moving to the next hole with TAB
+
+(defun sweeprolog-indent-or-forward-hole (&optional arg)
+  "Indent the current line or region, or go to the next hole.
+
+If the region is active, indent it by calling `indent-region'.
+Otherwise, indent the current line or, if already indented, move
+to the ARGth next hole in the buffer."
+  (interactive "p" sweeprolog-mode)
+  (if (use-region-p)
+      (indent-region (region-beginning) (region-end))
+    (let ((point (point))
+          (tab-always-indent 'complete)
+          (completion-at-point-functions nil))
+      (unless (save-excursion
+                (beginning-of-line)
+                (or (sweeprolog-at-beginning-of-top-term-p)
+                    (looking-at-p "[ \t]*$")
+                    (looking-at-p (rx (or "%" "/*")))))
+        (indent-for-tab-command))
+      (when (= point (point))
+        (sweeprolog-forward-hole arg)))))
+
+;;;###autoload
+(define-minor-mode sweeprolog-forward-hole-on-tab-mode
+  "Make TAB do the Right Thing in `sweeprolog-mode'.
+
+When enabled, this minor mode binds TAB to the command
+`sweeprolog-indent-or-forward-hole', which moves to the next hole
+in the buffer when the called in a line that's already indented
+propely."
+  :group 'sweeprolog)
+
+
 ;;;; Footer
 
 (provide 'sweeprolog)