[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.")
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [nongnu] elpa/subed 006c2d98a6: Add lots of keybindings to C-c C-f (which is now subed-mpv-control),
ELPA Syncer <=