A. Patch: swap prev-buffer <--> next-buffer Steps to reproduce issue:
;; 1. load emacsy buffers without the fix. (load "buffer.scm") ;; 2. imagine these are tabs opened in order (map add-buffer! '(peace satan hell)) ;; 3. manually verify that we have these buffers (buffer-list) ;; (hell satan peace) ;; 4. current buffer should be 'hell (current-buffer) ;; -> hell (prev-buffer) ;; -> peace (next-buffer) ;; -> satan prev-buffer has next-buffer semantics and vice versa, due to what mru-next! considers next. B. Patch: add procedures buffer-next! buffer-prev! Also, the procedures buffer-next! and buffer-previous! have been added so that these can be used from a repl without the emacsy gui running. C. Patch: use #:export form instead of define*-public forms Have the API in one place at the top of the file
>From dbc53ceba04573678c211035b1a8df82d58a0f52 Mon Sep 17 00:00:00 2001 From: Amar Singh <n...@disroot.org> Date: Sun, 23 Jun 2019 23:45:06 +0530 Subject: [PATCH 1/3] cleanup buffer.scm: export using #:export keyword --- emacsy/buffer.scm | 69 +++++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/emacsy/buffer.scm b/emacsy/buffer.scm index 804a929..beeddf1 100644 --- a/emacsy/buffer.scm +++ b/emacsy/buffer.scm @@ -28,7 +28,30 @@ #:use-module (emacsy keymap) #:use-module (emacsy command) #:use-module (emacsy klecl) - #:use-module (emacsy mode)) + #:use-module (emacsy mode) + #:export (next-buffer + prev-buffer + with-buffer + save-excursion + <buffer> + buffer-stack + last-buffer + aux-buffer + buffer-name + buffer-name + set-buffer-name! + buffer-modified? + buffer-modified-tick + current-local-map + use-local-map + buffer-list + current-buffer + add-buffer! + remove-buffer! + set-buffer! + switch-to-buffer + local-var + emacsy-mode-line)) ;;; Commentary: @@ -52,7 +75,7 @@ ;; A convenience macro to work with a given buffer. ;; @end defmac ;;. -(define-syntax-public with-buffer +(define-syntax with-buffer (syntax-rules () ((with-buffer buffer e ...) (let ((old-buffer (current-buffer)) @@ -66,7 +89,7 @@ ;; A convenience macro to do some work ;; @end defmac ;;. -(define-syntax-public save-excursion +(define-syntax save-excursion (syntax-rules () ((save-excursion body ...) (let ((old-buffer (current-buffer)) @@ -82,7 +105,7 @@ (goto-char old-point))))))) ;;. -(define-class-public <buffer> () +(define-class <buffer> () (name #:init-keyword #:name) (file-name #:accessor buffer-file-name #:init-form #f #:init-keyword #:buffer-file-name) (keymap #:accessor local-keymap #:init-keyword #:keymap #:init-form (make-keymap)) @@ -104,39 +127,39 @@ ;;; one. ;;. -(define-public buffer-stack (make <mru-stack>)) +(define buffer-stack (make <mru-stack>)) ;;. -(define-public last-buffer #f) +(define last-buffer #f) ;;. -(define-public aux-buffer #f) +(define aux-buffer #f) ;; Buffer's have a name, and there is always a current buffer or it's ;; false. Note that methods do not work as easily with optional ;; arguments. It seems best to define each method with a different ;; number of arguments as shown below. -(define-method-public (buffer-name) +(define-method (buffer-name) (buffer-name (current-buffer))) ;;. -(define-method-public (buffer-name (buffer <buffer>)) +(define-method (buffer-name (buffer <buffer>)) (slot-ref buffer 'name)) ;;. -(define-method-public (set-buffer-name! name) +(define-method (set-buffer-name! name) (set-buffer-name! name (current-buffer))) ;;. -(define-method-public (set-buffer-name! name (buffer <buffer>)) +(define-method (set-buffer-name! name (buffer <buffer>)) (slot-set! buffer 'name name)) ;;. -(define-method-public (buffer-modified?) +(define-method (buffer-modified?) (buffer-modified? (current-buffer))) ;;. -(define-method-public (buffer-modified-tick) +(define-method (buffer-modified-tick) (buffer-modified-tick (current-buffer))) ;;. @@ -147,30 +170,30 @@ ;; @subsection Emacs Compatibility ;;. -(define-public (current-local-map) +(define (current-local-map) (local-keymap (current-buffer))) ;;. -(define-public (use-local-map keymap) +(define (use-local-map keymap) (set! (local-keymap (current-buffer)) keymap)) ;;. -(define-public (buffer-list) +(define (buffer-list) (mru-list buffer-stack)) ;;. -(define-public (current-buffer) +(define (current-buffer) ;; Perhaps instead of returning #f for no buffer there should be an ;; immutable void-buffer class. (or aux-buffer (mru-ref buffer-stack))) ;;. -(define-public (add-buffer! buffer) +(define (add-buffer! buffer) (mru-add! buffer-stack buffer)) ;;. -(define-public (remove-buffer! buffer) +(define (remove-buffer! buffer) (mru-remove! buffer-stack buffer)) ;;. @@ -183,7 +206,7 @@ (next-buffer (- incr))) ;;. -(define-public (set-buffer! buffer) +(define (set-buffer! buffer) ;;(emacsy-log-debug "set-buffer! to ~a" buffer) (if (mru-set! buffer-stack buffer) (set! aux-buffer #f) @@ -217,7 +240,7 @@ (current-buffer)) ;;. -(define-public switch-to-buffer primitive-switch-to-buffer) +(define switch-to-buffer primitive-switch-to-buffer) ;;. (define (local-var-ref symbol) @@ -237,12 +260,12 @@ (assq-set! (local-variables (current-buffer)) symbol value))) ;;. -(define-public local-var +(define local-var (make-procedure-with-setter local-var-ref local-var-set!)) ;;. ;; method -(define-method-public (emacsy-mode-line) +(define-method (emacsy-mode-line) (emacsy-mode-line (current-buffer))) (define-method (emacsy-mode-line (buffer <buffer>)) -- 2.22.0
>From f2585ae5c4420cede9fa602712dad31c33f06278 Mon Sep 17 00:00:00 2001 From: Amar Singh <n...@disroot.org> Date: Sun, 23 Jun 2019 23:50:39 +0530 Subject: [PATCH 2/3] buffers.scm: add procedures buffer-previous! buffer-next! --- emacsy/buffer.scm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/emacsy/buffer.scm b/emacsy/buffer.scm index beeddf1..34c3a75 100644 --- a/emacsy/buffer.scm +++ b/emacsy/buffer.scm @@ -31,6 +31,8 @@ #:use-module (emacsy mode) #:export (next-buffer prev-buffer + buffer-previous! + buffer-next! with-buffer save-excursion <buffer> @@ -196,6 +198,12 @@ (define (remove-buffer! buffer) (mru-remove! buffer-stack buffer)) +(define* (buffer-previous! #:optional (incr 1)) + (mru-next! buffer-stack incr)) + +(define* (buffer-next! #:optional (incr 1)) + (buffer-previous! (- incr))) + ;;. (define-interactive (next-buffer #:optional (incr 1)) (mru-next! buffer-stack incr) -- 2.22.0
>From 2f539bc90612aac149024b1a1ed81b26573097b6 Mon Sep 17 00:00:00 2001 From: Amar Singh <n...@disroot.org> Date: Sun, 23 Jun 2019 23:52:54 +0530 Subject: [PATCH 3/3] swap next-buffer <---> prev-buffer semantics --- emacsy/buffer.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emacsy/buffer.scm b/emacsy/buffer.scm index 34c3a75..b85cec4 100644 --- a/emacsy/buffer.scm +++ b/emacsy/buffer.scm @@ -206,7 +206,7 @@ ;;. (define-interactive (next-buffer #:optional (incr 1)) - (mru-next! buffer-stack incr) + (buffer-next!) (switch-to-buffer (mru-ref buffer-stack))) ;;. -- 2.22.0