home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / me34src.zip / me3 / mutt / builtin / markring.mut < prev    next >
Text File  |  1995-01-14  |  3KB  |  137 lines

  1. ;; markring.mut : Maintain a ring of marks so it is easy to jump to 
  2. ;;   often referenced places in a buffer.
  3. ;; Notes:
  4. ;;   Marking regions does not effect the ring.
  5. ;;   Each buffer has its own ring.
  6. ;;   When the ring is full, the ring wraps around.
  7. ;;   Be sure to add (markring-init) to (create-buffer-hook) and
  8. ;;     (read-file-hook).
  9. ;;   Marks may invalided without my knowing about it (eg buffer is
  10. ;;     cleared).  This would make (goto-mark) choke.
  11. ;;   Data structure:
  12. ;;     A list of mark ids acting like a stack:
  13. ;;     oldest mmark -> element0, element1, ..., elementn <- youngest mark
  14. ;;     When a mark is set, it is put at the end of the stack.
  15. ;;     When popping a mark, take it off the start of the stack.
  16. ;; Uses:
  17. ;;   Buffer variables:
  18. ;;     mark-ring:  list of mark ids.
  19. ;; C Durland  rewritten to use lists: 9/91    Public Domain
  20. ;;     Changed from queues to stacks: 2/92
  21.  
  22. (include me.mh)
  23.  
  24. (const
  25.   NUMBER-OF-MARKS-IN-RING    4
  26. )
  27.  
  28. (defun
  29.   markring-init
  30.   {
  31.     (create-buffer-var LIST "mark-ring")
  32.     (markring-reset)
  33.   }
  34.   markring-reset    HIDDEN
  35.   {
  36.     (int num-marks n)
  37.     (list ring)
  38.  
  39. ;    (ring (loc (buffer-var "mark-ring")))
  40.     (ring (buffer-var "mark-ring"))
  41.     (num-marks (length-of ring))
  42.  
  43.     (for (n 0) (< n num-marks) (+= n 1) (free-mark (extract-element ring n)))
  44.     (remove-elements ring 0 1000)
  45. (buffer-var "mark-ring" ring)
  46.   }
  47.   MAIN
  48.   {
  49.     (register-hook ICREATE-BUFFER-HOOK "markring-init")
  50.     (register-hook ICLEAR-BUFFER-HOOK  "markring-init")
  51.  
  52.     (bind-to-key "markring-push"        "F-9")
  53.     (bind-to-key "markring-push"        "M-C-p")
  54.     (bind-to-key "markring-pop"            "M-p")
  55.   }
  56. )
  57.  
  58.  
  59.     ;; Put a mark in the mark ring.
  60. (defun
  61.   markring-push
  62.   {
  63.     (int mark)
  64.     (list ring)
  65.  
  66. ;    (ring (loc (buffer-var "mark-ring")))
  67.     (ring (buffer-var "mark-ring"))
  68.  
  69.     (if (< (length-of ring) NUMBER-OF-MARKS-IN-RING)    ;; need a new mark
  70.     (mark (create-mark TRUE))    ;; a new mark
  71.     (mark (pop-mark ring)))        ;; ring full, reuse oldest mark
  72.     (push-mark ring mark)
  73. (buffer-var "mark-ring" ring)
  74.  
  75.     (set-mark mark)
  76.     (msg "Mark queued.")
  77.   }
  78. )
  79.  
  80.  
  81. (defun
  82.   markring-pop    ;; Cycle through the mark ring
  83.   {
  84.     (int mark)
  85.     (list ring)
  86.  
  87. ;; !!! (if (no-markring) (markring-init))
  88.  
  89. ;    (ring (loc (buffer-var "mark-ring")))
  90.     (ring (buffer-var "mark-ring"))
  91.  
  92.     (if (== 0 (length-of ring)) { (msg "Mark ring empty.")(done) })
  93.  
  94.     (mark (pop-mark ring))
  95.     (push-mark ring mark)
  96. (buffer-var "mark-ring" ring)
  97.  
  98.     (goto-mark mark)
  99.   }
  100. )
  101.  
  102. (defun
  103.   markring-delete   ;; remove youngest mark from ring (usually just popped)
  104.   {
  105.     (int num-marks mark n)
  106.     (list ring)
  107.  
  108. ;    (ring (loc (buffer-var "mark-ring")))
  109.     (ring (buffer-var "mark-ring"))
  110.  
  111.     (num-marks (length-of ring))    ;; number of marks in ring
  112.     (if (== 0 num-marks) { (msg "Mark ring empty.")(done) })
  113.  
  114.     (n (- num-marks 1))
  115.  
  116.     (mark (extract-element ring n)) (free-mark mark)
  117.     (remove-elements ring n 1)
  118.  
  119. (buffer-var "mark-ring" ring)
  120.   }
  121. )
  122.  
  123. (defun
  124.   push-mark (list ring)(int mark)    HIDDEN
  125.   {
  126.     (insert-object ring 10000 mark) ;; add to end of ring
  127.   }
  128.   pop-mark (list ring)            HIDDEN
  129.   {
  130.     (int mark)
  131.  
  132.     (mark (extract-element ring 0))
  133.     (remove-elements ring 0 1)
  134.     mark
  135.   }
  136. )
  137.