diff --git a/ChangeLog b/ChangeLog index c9fc1e9b9..899c6d393 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2020-09-08 Boruch Baum + + * w3m-ems.el (w3m-tab-move-right, w3m-tab-move-left): BUGFIX: moving + with prefix-arg > 1 was swapping tab positions instead of adjusting all + tab numbers in between. + 2020-09-03 Katsumi Yamaoka Allow url like "file:foo.txt" (bug#969386 of debian) diff --git a/w3m-ems.el b/w3m-ems.el index 827062d33..21d0c3962 100644 --- a/w3m-ems.el +++ b/w3m-ems.el @@ -883,37 +883,59 @@ fast operation of mouse wheel." last-command-event)) (w3m-tab-next-buffer (- (or n 1)) event)) -(defun w3m-tab-move-right (&optional n event) +(defun w3m-tab-move-right (&optional mv-amt event) "Move the current tab right-ward (ie. next, higher number). -Use the prefix argument to move the tab N positions right-ward. +Use the prefix argument to move the tab MV-AMT positions right-ward. EVENT is an internal arg for mouse control." (interactive (list (prefix-numeric-value current-prefix-arg) last-command-event)) - (unless n (setq n 1)) - (when (and (/= n 0) (eq major-mode 'w3m-mode)) - (let* ((buffers (if (> n 0) - (w3m-list-buffers) - (setq n (- n)) - (nreverse (w3m-list-buffers)))) - (dest (or (nth n (memq (current-buffer) buffers)) - (car (last buffers)))) - (next (w3m-buffer-number dest)) - (cur (w3m-buffer-number (current-buffer)))) - (rename-buffer "*w3m*<0>") - (w3m-buffer-set-number dest cur) - (w3m-buffer-set-number (current-buffer) next) - (w3m-select-buffer-update) - (w3m-tab-mouse-track-selected-tab event next t)))) + (unless mv-amt (setq mv-amt 1)) + (if (> 0 mv-amt) + (w3m-tab-move-left (- mv-amt) event) + (when (and (/= mv-amt 0) (eq major-mode 'w3m-mode)) + (let* ((start-buf (current-buffer)) + (start-num (w3m-buffer-number start-buf)) + (buffers (w3m-list-buffers)) + (len (length buffers)) + (this-num (1- start-num)) + this-buf) + (setq mv-amt (min mv-amt (- len start-num))) + (setq buffers (last buffers (- len start-num))) + (setq buffers (butlast buffers (- (length buffers) mv-amt))) + (rename-buffer "*w3m*<0>") + (while (setq this-buf (pop buffers)) + (w3m-buffer-set-number this-buf (incf this-num))) + (w3m-buffer-set-number start-buf (+ start-num mv-amt)) + (w3m-select-buffer-update) + (w3m-tab-mouse-track-selected-tab event (+ start-num mv-amt) t))))) (defalias 'w3m-tab-move-next 'w3m-tab-move-right) -(defun w3m-tab-move-left (&optional n event) +(defun w3m-tab-move-left (&optional mv-amt event) "Move the current tab left-ward (ie. prior, lower number). -Use the prefix argument to move the tab N positions left-ward. +Use the prefix argument to move the tab MV-AMT positions left-ward. EVENT is an internal arg for mouse control." (interactive (list (prefix-numeric-value current-prefix-arg) - last-command-event)) - (w3m-tab-move-right (- n) event)) + last-command-event)) + (unless mv-amt (setq mv-amt 1)) + (if (> 0 mv-amt) + (w3m-tab-move-right (- mv-amt) event) + (when (and (/= mv-amt 0) (eq major-mode 'w3m-mode)) + (let* ((start-buf (current-buffer)) + (start-num (w3m-buffer-number start-buf)) + (buffers (nreverse (w3m-list-buffers))) + (len (length buffers)) + (this-num (1+ start-num)) + this-buf) + (setq mv-amt (min mv-amt start-num)) + (setq buffers (last buffers (1- start-num))) + (setq buffers (butlast buffers (- (length buffers) mv-amt))) + (rename-buffer "*w3m*<0>") + (while (setq this-buf (pop buffers)) + (w3m-buffer-set-number this-buf (decf this-num))) + (w3m-buffer-set-number start-buf (- start-num mv-amt)) + (w3m-select-buffer-update) + (w3m-tab-mouse-track-selected-tab event (+ start-num mv-amt) t))))) (defalias 'w3m-tab-move-prior 'w3m-tab-move-left)