emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/subed 006c2d98a6: Add lots of keybindings to C-c C-f (whic


From: ELPA Syncer
Subject: [nongnu] elpa/subed 006c2d98a6: Add lots of keybindings to C-c C-f (which is now subed-mpv-control)
Date: Wed, 18 Dec 2024 16:01:12 -0500 (EST)

branch: elpa/subed
commit 006c2d98a630ffdb27f8a750db8cf1e459028d01
Author: Sacha Chua <sacha@sachachua.com>
Commit: Sacha Chua <sacha@sachachua.com>

    Add lots of keybindings to C-c C-f (which is now subed-mpv-control)
    
    * subed/subed-align.el (subed-align-region-hook):
    replace with subed-region-adjusted-hook.
    * subed/subed-align.el (subed-align-region): Call 
subed-region-adjusted-hook.
    *
    subed/subed-common.el 
(subed-copy-player-pos-to-start-time-and-copy-to-previous):
    New command.
    (subed-copy-player-pos-to-stop-time-and-copy-to-next):
    New command.
    *
    subed/subed-common.el (subed--scale-subtitles-in-region):
    Call subed-region-adjusted-hook.
    * subed/subed-common.el (subed--move-subtitles-in-region):
    Call subed-region-adjusted-hook.
    (subed-forward-word): New command.
    *
    subed/subed-config.el (subed-mpv-large-step-seconds):
    New option.
    *
    subed/subed-config.el (subed-mpv-small-step-seconds):
    New option.
    *
    subed/subed-config.el (subed-region-adjusted-hook):
    New hook.
    * subed/subed-mpv.el (subed-mpv-seek): Make this interactive.
    (subed-mpv-jump): Make this interactive.
    (subed-mpv-jump-to-before-current-subtitle): New command.
    (subed-mpv-jump-to-end-of-current-subtitle): New command.
    (subed-mpv-back-large-step): New command.
    (subed-mpv-back-small-step): New command.
    (subed-mpv-small-step): New command.
    (subed-mpv-large-step): New command.
    (subed-mpv-undo-seek): New command.
    (subed-mpv-frame-step): Let the transient map take
    care of repeating.
    (subed-mpv-frame-back-step): Let the transient map take
    care of repeating.
    (subed-mpv-backward-subtitle-and-jump): New command.
    (subed-mpv-forward-subtitle-and-jump): New command.
    (subed-mpv-control): New interactive command for
    repeating transient map.
    * subed/subed-waveform.el (subed-waveform-refresh-region):
    Rename from subed-waveform-refresh-after-realigning because it
    can be used for more reasons. Add to
    subed-region-adjusted-hook instead.
    * subed/subed-word-data.el (subed): Add to
    subed-region-adjusted-hook instead.
    * subed/subed.el (subed-mpv-control-map): Rename
    from subed-mpv-frame-step-map and add lots of keybindings.
---
 subed/subed-align.el     |  5 +---
 subed/subed-common.el    | 52 ++++++++++++++++++++++++++++++++--
 subed/subed-config.el    | 24 ++++++++++++----
 subed/subed-mpv.el       | 72 ++++++++++++++++++++++++++++++++++++++++++++----
 subed/subed-waveform.el  |  6 ++--
 subed/subed-word-data.el |  4 +--
 subed/subed.el           | 55 ++++++++++++++++++++++++++++--------
 7 files changed, 185 insertions(+), 33 deletions(-)

diff --git a/subed/subed-align.el b/subed/subed-align.el
index 753898ed1c..fc9033b080 100644
--- a/subed/subed-align.el
+++ b/subed/subed-align.el
@@ -41,9 +41,6 @@
 Ex: 
task_adjust_boundary_nonspeech_min=0.500|task_adjust_boundary_nonspeech_string=REMOVE
 will remove silence and other non-speech spans.")
 
-(defvar subed-align-region-hook nil "Functions to run after realigning a 
region.
-Each function will be called with BEG and END.")
-
 ;;;###autoload
 (defun subed-align-region (audio-file beg end)
   "Align just the given section."
@@ -105,7 +102,7 @@ Each function will be called with BEG and END.")
               (let ((current (pop results)))
                 (subed-set-subtitle-time-start (elt current 1))
                 (subed-set-subtitle-time-stop (elt current 2)))))
-          (run-hook-with-args 'subed-align-region-hook beg end))
+          (run-hook-with-args 'subed-region-adjusted-hook beg end))
       (delete-file temp-input-file)
       (delete-file temp-file))))
 
diff --git a/subed/subed-common.el b/subed/subed-common.el
index 947aac994a..b39c27c9de 100644
--- a/subed/subed-common.el
+++ b/subed/subed-common.el
@@ -932,6 +932,36 @@ See `subed-increase-start-time' about ARG."
     (subed--run-subtitle-time-adjusted-hook)
     subed-mpv-playback-position))
 
+(defun subed-copy-player-pos-to-start-time-and-copy-to-previous ()
+  "Replace current subtitle's start time with current playback time.
+Update the previous subtitle's stop time."
+  (interactive)
+  (when (and subed-mpv-playback-position
+             (subed-subtitle-msecs-start))
+    (subed-set-subtitle-time-start subed-mpv-playback-position)
+    (subed--run-subtitle-time-adjusted-hook)
+    (save-excursion
+      (when (subed-backward-subtitle-time-stop)
+        (subed-set-subtitle-time-stop
+         (- subed-mpv-playback-position subed-subtitle-spacing)))
+      (subed--run-subtitle-time-adjusted-hook))
+    subed-mpv-playback-position))
+
+(defun subed-copy-player-pos-to-stop-time-and-copy-to-next ()
+  "Replace current subtitle's stop time with current playback time.
+Update the next subtitle's start time."
+  (interactive)
+  (when (and subed-mpv-playback-position
+             (subed-subtitle-msecs-stop))
+    (subed-set-subtitle-time-stop subed-mpv-playback-position)
+    (subed--run-subtitle-time-adjusted-hook)
+    (save-excursion
+      (when (subed-forward-subtitle-time-start)
+        (subed-set-subtitle-time-start
+         (+ subed-mpv-playback-position subed-subtitle-spacing)))
+      (subed--run-subtitle-time-adjusted-hook))
+    subed-mpv-playback-position))
+
 
 ;;; Moving subtitles
 ;;; (adjusting start and stop time by the same amount)
@@ -1070,7 +1100,8 @@ subtitles by the same offset, use `subed-move-subtitles' 
instead."
                     (user-error "Can't scale when contraction would eliminate 
region"))
                   (goto-char end)
                   (move-subtitle msecs :ignore-negative-duration)
-                  (funcall scale-subtitles)))))))))))
+                  (funcall scale-subtitles)
+                  (run-hook-with-args 'subed-region-adjusted-hook beg 
(point))))))))))))
 
 (defun subed--move-subtitles-in-region (msecs beg end)
   "Move subtitles in region specified by BEG and END by MSECS milliseconds."
@@ -1106,7 +1137,8 @@ subtitles by the same offset, use `subed-move-subtitles' 
instead."
                                                                        (throw 
'bumped-into-subtitle t))
                                                                
(subed-forward-subtitle-id)
                                                                
(subed-for-each-subtitle (point) end nil
-                                                                       
(move-subtitle msecs :ignore-negative-duration))))))))))
+                                                                       
(move-subtitle msecs :ignore-negative-duration)))))
+          (run-hook-with-args 'subed-region-adjusted-hook beg (point)))))))
 
 (defun subed-scale-subtitles (msecs &optional beg end)
   "Scale subtitles between BEG and END after moving END MSECS.
@@ -2430,6 +2462,22 @@ Does not yet take overlapping subtitles into account."
       (message "%s" (subed-msecs-to-timestamp sum)))
     sum))
 
+(defun subed-forward-word (&optional arg)
+  "Skip timestamps."
+  (interactive "^p")
+  (setq arg (or arg 1))
+  (let ((end (or (save-excursion (subed-jump-to-subtitle-end)) (point))))
+    (loop while (> arg 0)
+          do
+          (forward-word 1)
+          (skip-syntax-forward "^\s")
+          (setq arg (1- arg))
+          (when (> (point) end)
+            (subed-jump-to-subtitle-text)
+            (forward-word 1)
+            (skip-syntax-forward "^\s")
+            (setq end (or (save-excursion (subed-jump-to-subtitle-end)) 
(point)))))))
+
 ;;; Experimental retiming workflow
 
 (defvar subed-retime-subtitles-adjustment-msecs 100
diff --git a/subed/subed-config.el b/subed/subed-config.el
index 0527c3e588..30700d909a 100644
--- a/subed/subed-config.el
+++ b/subed/subed-config.el
@@ -238,16 +238,19 @@ Used when temporarily disabling point-to-player sync.")
   :type 'file
   :group 'subed)
 
-(defcustom subed-mpv-socket-dir (concat (temporary-file-directory) "subed")
-  "Path to Unix IPC socket that is passed to mpv's --input-ipc-server option."
-  :type 'file
-  :group 'subed)
-
 (defcustom subed-mpv-executable "mpv"
   "Path or filename of mpv executable."
   :type 'file
   :group 'subed)
 
+(defcustom subed-mpv-large-step-seconds 5 "Number of seconds to move for a 
large step."
+  :type 'number
+  :group 'subed)
+
+(defcustom subed-mpv-small-step-seconds 1 "Number of seconds to move for a 
large step."
+  :type 'number
+  :group 'subed)
+
 (defcustom subed-mpv-arguments '("--osd-level=2" "--osd-fractions" 
"--keep-open=yes")
   "Additional arguments for \"mpv\".
 The options --input-ipc-server=SRTEDIT-MPV-SOCKET and --idle are
@@ -255,6 +258,11 @@ hardcoded."
   :type '(repeat string)
   :group 'subed)
 
+(defcustom subed-mpv-socket-dir (concat (temporary-file-directory) "subed")
+  "Path to Unix IPC socket that is passed to mpv's --input-ipc-server option."
+  :type 'file
+  :group 'subed)
+
 (defun subed--buffer-file-name ()
   "Return base name of buffer file name or a default name."
   (file-name-nondirectory (or (buffer-file-name) "unnamed")))
@@ -296,10 +304,14 @@ Otherwise, adjust the stop time of the current subtitle."
 
 ;;; Hooks
 
-(defvar-local subed-subtitle-time-adjusted-hook ()
+(defvar-local subed-subtitle-time-adjusted-hook nil
   "Functions to call when a subtitle's start or stop time has changed.
 The functions are called with the subtitle's start time.")
 
+(defvar-local subed-region-adjusted-hook nil
+  "Functions to call when the times for subtitles in a region have changed.
+The functions are called with BEG and END for the region.")
+
 (defvar-local subed-subtitle-merged-hook nil
   "Functions to call when a subtitle has been merged.")
 
diff --git a/subed/subed-mpv.el b/subed/subed-mpv.el
index 9aa38933ec..f6e3e8925b 100644
--- a/subed/subed-mpv.el
+++ b/subed/subed-mpv.el
@@ -319,10 +319,13 @@ See \"List of events\" in mpv(1)."
 
 (defun subed-mpv-seek (msec)
   "Move playback position MSEC milliseconds relative to current position."
+  (interactive "NOffset in ms: ")
   (subed-mpv--client-send `(seek ,(/ msec 1000.0) relative+exact)))
 
 (defun subed-mpv-jump (msec)
   "Move playback position to absolute position MSEC milliseconds."
+  (interactive "MTimestamp or msecs: ")
+  (setq msec (subed-to-msecs msec))
   (subed-mpv--client-send `(seek ,(/ msec 1000.0) absolute+exact)))
 
 (defun subed-mpv-jump-to-current-subtitle ()
@@ -342,21 +345,73 @@ See \"List of events\" in mpv(1)."
       (subed-debug "Seeking player to end of focused subtitle: %S" cur-sub-end)
       (subed-mpv-jump cur-sub-end))))
 
+(defun subed-mpv-jump-to-before-current-subtitle ()
+  "Move playback position before the current subtitle."
+  (interactive)
+  (let ((cur-sub-start (subed-subtitle-msecs-start)))
+    (when cur-sub-start
+      (setq cur-sub-start (- cur-sub-start subed-sample-msecs))
+      (subed-debug "Seeking player to before focused subtitle: %S" 
cur-sub-start)
+      (subed-mpv-jump cur-sub-start))))
+
+(defun subed-mpv-jump-to-end-of-current-subtitle ()
+  "Move playback position to the end of current subtitle."
+  (interactive)
+  (let ((cur-sub-end (subed-subtitle-msecs-stop)))
+    (when cur-sub-end
+      (subed-debug "Seeking player to end of focused subtitle: %S" cur-sub-end)
+      (subed-mpv-jump cur-sub-end))))
+
+(defun subed-mpv-back-large-step ()
+  "Move back one large step."
+  (interactive)
+  (subed-mpv--client-send `(seek ,(- 0 subed-mpv-large-step-seconds) 
relative+exact)))
+
+(defun subed-mpv-back-small-step ()
+  "Move back one small step."
+  (interactive)
+  (subed-mpv--client-send `(seek ,(- 0 subed-mpv-small-step-seconds) 
relative+exact)))
+
+(defun subed-mpv-small-step ()
+  "Move forward one small step."
+  (interactive)
+  (subed-mpv--client-send `(seek ,subed-mpv-small-step-seconds 
relative+exact)))
+
+(defun subed-mpv-large-step ()
+  "Move forward one large step."
+  (interactive)
+  (subed-mpv--client-send `(seek ,subed-mpv-large-step-seconds 
relative+exact)))
+
+(defun subed-mpv-undo-seek ()
+  "Undo a seek."
+  (interactive)
+  (subed-mpv--client-send `(revert-seek)))
+
 (defun subed-mpv-frame-step ()
   "Step one frame forward.
 Set up keybindings so that repeatedly pressing `,' and `.' moves
 by frames until any other key is pressed."
   (interactive)
-  (subed-mpv--client-send `(frame-step))
-  (set-transient-map subed-mpv-frame-step-map))
+  (subed-mpv--client-send `(frame-step)))
 
 (defun subed-mpv-frame-back-step ()
   "Step one frame backward.
 Set up keybindings so that repeatedly pressing `,' and `.' moves
 by frames until any other key is pressed."
   (interactive)
-  (subed-mpv--client-send `(frame-back-step))
-  (set-transient-map subed-mpv-frame-step-map))
+  (subed-mpv--client-send `(frame-back-step)))
+
+(defun subed-mpv-backward-subtitle-and-jump ()
+  "Go to the previous subtitle and jump to its beginning."
+  (interactive)
+  (subed-backward-subtitle-text)
+  (subed-mpv-jump-to-current-subtitle))
+
+(defun subed-mpv-forward-subtitle-and-jump ()
+  "Go to the next subtitle and jump to its beginning."
+  (interactive)
+  (subed-forward-subtitle-text)
+  (subed-mpv-jump-to-current-subtitle))
 
 (defun subed-mpv-add-subtitles (file)
   "Load FILE as subtitles in mpv."
@@ -402,7 +457,8 @@ hosting providers."
   (setq subed-mpv-media-file url)
   (subed-mpv--play url))
 
-(defvar subed-mpv-play-from-file-hook nil "Functions to run after a media file 
is loaded.
+(defvar subed-mpv-play-from-file-hook nil
+  "Functions to run after a media file is loaded.
 Called with FILE as argument.")
 
 (defun subed-mpv-play-from-file (file)
@@ -436,5 +492,11 @@ time the buffer is saved."
   (subed-mpv--client-disconnect)
   (subed-mpv--server-stop))
 
+(defun subed-mpv-control ()
+  "Use keyboard shortcuts to control MPV.
+See `subed-mpv-control-map'."
+  (interactive)
+  (set-transient-map subed-mpv-control-map t))
+
 (provide 'subed-mpv)
 ;;; subed-mpv.el ends here
diff --git a/subed/subed-waveform.el b/subed/subed-waveform.el
index 4e3fca6aa6..d7da65c4dd 100644
--- a/subed/subed-waveform.el
+++ b/subed/subed-waveform.el
@@ -206,8 +206,8 @@ rounded to the nearest multiple of this number."
     (remove-hook 'subed-subtitle-merged-hook 'subed-waveform-subtitle-merged t)
     (remove-hook 'subed-subtitles-sorted-hook 'subed-waveform-refresh t)))
 
-(with-eval-after-load 'subed-align
-  (add-hook 'subed-align-region-hook 
#'subed-waveform-refresh-after-realigning))
+(with-eval-after-load 'subed
+  (add-hook 'subed-region-adjusted-hook #'subed-waveform-refresh-region))
 
 (defconst subed-waveform-volume-map
   (let ((map (make-sparse-keymap)))
@@ -516,7 +516,7 @@ This function ignores arguments and can be used in hooks."
     (subed-jump-to-subtitle-text)
     (subed-waveform--make-overlay)))
 
-(defun subed-waveform-refresh-after-realigning (beg end)
+(defun subed-waveform-refresh-region (beg end)
   "Refresh waveforms after modifying region."
   (when subed-waveform-minor-mode
     (save-excursion
diff --git a/subed/subed-word-data.el b/subed/subed-word-data.el
index fbc7cb20ff..6cfd90bfa4 100644
--- a/subed/subed-word-data.el
+++ b/subed/subed-word-data.el
@@ -430,8 +430,8 @@ Assumes words haven't been edited."
       (unless (subed-forward-subtitle-text)
         (goto-char (point-max))))))
 
-(with-eval-after-load 'subed-align
-  (add-hook 'subed-align-region-hook #'subed-word-data-refresh-region))
+(with-eval-after-load 'subed
+  (add-hook 'subed-region-adjusted-hook #'subed-word-data-refresh-region))
 
 
 (provide 'subed-word-data)
diff --git a/subed/subed.el b/subed/subed.el
index f750471ded..367db92d23 100644
--- a/subed/subed.el
+++ b/subed/subed.el
@@ -41,12 +41,45 @@
 
 (declare-function tramp-tramp-file-p "tramp")
 
-(defconst subed-mpv-frame-step-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "." #'subed-mpv-frame-step)
-    (define-key map "," #'subed-mpv-frame-back-step)
-    map)
-  "A keymap for stepping through the media file by frames.")
+(define-obsolete-variable-alias 'subed-mpv-frame-step-map 
'subed-mpv-control-map "2024-12-18")
+
+(defvar-keymap subed-mpv-control-map
+       :doc "Shortcuts for focusing on controlling MPV."
+  :name "MPV"
+       "." #'subed-mpv-frame-step
+       "," #'subed-mpv-frame-back-step
+       "<left>" #'subed-mpv-back-large-step
+       "S-<left>" #'subed-mpv-back-small-step
+       "<right>" #'subed-mpv-large-step
+       "S-<right>" #'subed-mpv-small-step
+       "SPC" #'subed-mpv-toggle-pause
+       "u" #'subed-mpv-undo-seek
+       "j" #'subed-mpv-jump-to-current-subtitle
+       "J" #'subed-mpv-jump-to-current-subtitle-near-end
+       "s" #'subed-mpv-seek
+       "S" #'subed-mpv-jump
+  "l" #'subed-toggle-loop-over-current-subtitle
+       "[" #'subed-copy-player-pos-to-start-time
+       "]" #'subed-copy-player-pos-to-stop-time
+       "{" #'subed-copy-player-pos-to-start-time-and-copy-to-previous
+       "}" #'subed-copy-player-pos-to-stop-time-and-copy-to-next
+       "b" #'subed-backward-subtitle-text
+       "f" #'subed-forward-subtitle-text
+       "p" #'subed-backward-subtitle-text
+       "n" #'subed-forward-subtitle-text
+  "<up>" #'subed-backward-subtitle-text
+       "<down>" #'subed-forward-subtitle-text
+  "S-<up>" #'subed-mpv-backward-subtitle-and-jump
+       "S-<down>" #'subed-mpv-forward-subtitle-and-jump
+       ;; aegisub-inspired keyboard shortcuts
+       "q" #'subed-mpv-jump-to-before-current-subtitle
+       "d" #'subed-mpv-jump-to-current-subtitle-near-end
+       "e" #'subed-mpv-jump-to-current-subtitle
+       "w" #'subed-mpv-jump-to-end-of-current-subtitle
+       "x" #'subed-backward-subtitle-text
+       "z" #'subed-forward-subtitle-text
+  "X" #'subed-mpv-backward-subtitle-and-jump
+       "Z" #'subed-mpv-forward-subtitle-and-jump)
 
 (defconst subed-mode-map
   (let ((subed-mode-map (make-keymap)))
@@ -87,7 +120,7 @@
     (define-key subed-mode-map (kbd "C-c C-d") #'subed-toggle-debugging)
     (define-key subed-mode-map (kbd "C-c C-v") #'subed-mpv-play-from-file)
     (define-key subed-mode-map (kbd "C-c C-u") #'subed-mpv-play-from-url)
-    (define-key subed-mode-map (kbd "C-c C-f") subed-mpv-frame-step-map)
+    (define-key subed-mode-map (kbd "C-c C-f") #'subed-mpv-control)
     (define-key subed-mode-map (kbd "C-c C-p") 
#'subed-toggle-pause-while-typing)
     (define-key subed-mode-map (kbd "C-c C-l") 
#'subed-toggle-loop-over-current-subtitle)
     (define-key subed-mode-map (kbd "C-c C-r") 
#'subed-toggle-replay-adjusted-subtitle)
@@ -96,10 +129,10 @@
     (define-key subed-mode-map (kbd "C-c .") 
#'subed-toggle-sync-point-to-player)
     (define-key subed-mode-map (kbd "C-c ,") 
#'subed-toggle-sync-player-to-point)
     (define-key subed-mode-map (kbd "C-c C-t") (let ((html-tag-keymap 
(make-sparse-keymap)))
-                                                                               
     (define-key html-tag-keymap (kbd "C-t") #'subed-insert-html-tag)
-                                                                               
     (define-key html-tag-keymap (kbd "C-i") #'subed-insert-html-tag-italic)
-                                                                               
     (define-key html-tag-keymap (kbd "C-b") #'subed-insert-html-tag-bold)
-                                                                               
     html-tag-keymap))
+                                                                               
(define-key html-tag-keymap (kbd "C-t") #'subed-insert-html-tag)
+                                                                               
(define-key html-tag-keymap (kbd "C-i") #'subed-insert-html-tag-italic)
+                                                                               
(define-key html-tag-keymap (kbd "C-b") #'subed-insert-html-tag-bold)
+                                                                               
html-tag-keymap))
     subed-mode-map)
   "A keymap for editing subtitles.")
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]