[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/subed d27e55a 253/389: Move most stuff from subed.el to su
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/subed d27e55a 253/389: Move most stuff from subed.el to subed-common.el |
Date: |
Fri, 3 Dec 2021 11:00:36 -0500 (EST) |
branch: elpa/subed
commit d27e55a5ff9bb6aca59eb8c36851853a8e3f6511
Author: Random User <rndusr@posteo.de>
Commit: Random User <rndusr@posteo.de>
Move most stuff from subed.el to subed-common.el
---
subed/{subed.el => subed-common.el} | 127 +----
subed/subed-srt.el | 6 -
subed/subed.el | 904 +-----------------------------------
3 files changed, 7 insertions(+), 1030 deletions(-)
diff --git a/subed/subed.el b/subed/subed-common.el
similarity index 89%
copy from subed/subed.el
copy to subed/subed-common.el
index 8be3aa2..1a44a43 100644
--- a/subed/subed.el
+++ b/subed/subed-common.el
@@ -1,9 +1,4 @@
-;;; subed.el --- A major mode for editing subtitles -*- lexical-binding: t;
-*-
-
-;; Version: 0.0
-;; Keywords: convenience, files, hypermedia, multimedia
-;; URL: https://github.com/rndusr/subed
-;; Package-Requires: ((emacs "25"))
+;;; subed-common.el --- Subtitle-format agnostic functions -*-
lexical-binding: t; -*-
;;; License:
;;
@@ -26,56 +21,12 @@
;;; Commentary:
;;
-;; subed is a major mode for editing subtitles with Emacs and mpv. See
-;; README.org or https://github.com/rndusr/subed for more information.
+;; The functions in this file do not expect any particular subtitle format.
+;; Instead, they expect certain functions to exist that provide navigation and
+;; manipulation for whatever format the current buffer contains.
;;; Code:
-(require 'subed-config)
-(require 'subed-srt)
-(require 'subed-mpv)
-
-;; Abstraction layer to allow support for other subtitle formats
-(defcustom subed-font-lock-keywords subed-srt-font-lock-keywords
- "The particular font-lock keywords in use by subed."
- :type 'list
- :group 'subed)
-
-(defalias 'subed-subtitle-id #'subed-srt--subtitle-id)
-(defalias 'subed-subtitle-id-max #'subed-srt--subtitle-id-max)
-(defalias 'subed-subtitle-msecs-start #'subed-srt--subtitle-msecs-start)
-(defalias 'subed-subtitle-msecs-stop #'subed-srt--subtitle-msecs-stop)
-(defalias 'subed-subtitle-text #'subed-srt--subtitle-text)
-(defalias 'subed-subtitle-relative-point #'subed-srt--subtitle-relative-point)
-
-(defalias 'subed-jump-to-subtitle-id #'subed-srt--jump-to-subtitle-id)
-(defalias 'subed-jump-to-subtitle-time-start
#'subed-srt--jump-to-subtitle-time-start)
-(defalias 'subed-jump-to-subtitle-time-stop
#'subed-srt--jump-to-subtitle-time-stop)
-(defalias 'subed-jump-to-subtitle-text #'subed-srt--jump-to-subtitle-text)
-(defalias 'subed-jump-to-subtitle-end #'subed-srt--jump-to-subtitle-end)
-(defalias 'subed-jump-to-subtitle-id-at-msecs
#'subed-srt--jump-to-subtitle-id-at-msecs)
-(defalias 'subed-jump-to-subtitle-text-at-msecs
#'subed-srt--jump-to-subtitle-text-at-msecs)
-
-(defalias 'subed-forward-subtitle-id #'subed-srt--forward-subtitle-id)
-(defalias 'subed-backward-subtitle-id #'subed-srt--backward-subtitle-id)
-(defalias 'subed-forward-subtitle-text #'subed-srt--forward-subtitle-text)
-(defalias 'subed-backward-subtitle-text #'subed-srt--backward-subtitle-text)
-(defalias 'subed-forward-subtitle-time-start
#'subed-srt--forward-subtitle-time-start)
-(defalias 'subed-backward-subtitle-time-start
#'subed-srt--backward-subtitle-time-start)
-(defalias 'subed-forward-subtitle-time-stop
#'subed-srt--forward-subtitle-time-stop)
-(defalias 'subed-backward-subtitle-time-stop
#'subed-srt--backward-subtitle-time-stop)
-
-(defalias 'subed-set-subtitle-time-start #'subed-srt--set-subtitle-time-start)
-(defalias 'subed-set-subtitle-time-stop #'subed-srt--set-subtitle-time-stop)
-(defalias 'subed-prepend-subtitle #'subed-srt--prepend-subtitle)
-(defalias 'subed-append-subtitle #'subed-srt--append-subtitle)
-(defalias 'subed-kill-subtitle #'subed-srt--kill-subtitle)
-(defalias 'subed-sanitize #'subed-srt--sanitize)
-(defalias 'subed-regenerate-ids #'subed-srt--regenerate-ids)
-(defalias 'subed-regenerate-ids-soon #'subed-srt--regenerate-ids-soon)
-(defalias 'subed-sort #'subed-srt--sort)
-
-
;;; Debugging
(defun subed-enable-debugging ()
@@ -973,71 +924,5 @@ Return nil if function `buffer-file-name' returns nil."
(when (file-exists-p file-stem-video)
(throw 'found-videofile file-stem-video))))))))
-
-;;;###autoload
-(defun subed-mode-enable ()
- "Enable subed mode."
- (interactive)
- (kill-all-local-variables)
- (setq-local font-lock-defaults '(subed-font-lock-keywords))
- (setq-local paragraph-start "^[[:alnum:]\n]+")
- (setq-local paragraph-separate "\n\n")
- (use-local-map subed-mode-map)
- (add-hook 'post-command-hook #'subed--post-command-handler :append :local)
- (add-hook 'before-save-hook #'subed-sort :append :local)
- (add-hook 'after-save-hook #'subed-mpv-reload-subtitles :append :local)
- (add-hook 'kill-buffer-hook #'subed-mpv-kill :append :local)
- (add-hook 'kill-emacs-hook #'subed-mpv-kill :append :local)
- (when subed-auto-find-video
- (let ((video-file (subed-guess-video-file)))
- (when video-file
- (subed-debug "Auto-discovered video file: %s" video-file)
- (condition-case err
- (subed-mpv-find-video video-file)
- (error (message "%s -- Set subed-auto-find-video to nil to avoid
this error."
- (car (cdr err))))))))
- (subed-enable-pause-while-typing :quiet)
- (subed-enable-sync-point-to-player :quiet)
- (subed-enable-sync-player-to-point :quiet)
- (subed-enable-replay-adjusted-subtitle :quiet)
- (setq major-mode 'subed-mode
- mode-name "subed")
- (setq subed-mode--enabled-p t)
- (run-mode-hooks 'subed-mode-hook))
-
-(defun subed-mode-disable ()
- "Disable subed mode."
- (interactive)
- (subed-disable-pause-while-typing :quiet)
- (subed-disable-sync-point-to-player :quiet)
- (subed-disable-sync-player-to-point :quiet)
- (subed-disable-replay-adjusted-subtitle :quiet)
- (subed-mpv-kill)
- (subed-disable-debugging)
- (kill-all-local-variables)
- (remove-hook 'post-command-hook #'subed--post-command-handler :local)
- (remove-hook 'before-save-hook #'subed-sort :local)
- (remove-hook 'after-save-hook #'subed-mpv-reload-subtitles :local)
- (remove-hook 'kill-buffer-hook #'subed-mpv-kill :local)
- (setq subed-mode--enabled-p nil))
-
-;;;###autoload
-(defun subed-mode ()
- "Major mode for editing subtitles.
-
-This function enables or disables `subed-mode'. See also
-`subed-mode-enable' and `subed-mode-disable'.
-
-Key bindings:
-\\{subed-mode-map}"
- (interactive)
- ;; Use 'enabled property of this function to store enabled/disabled status
- (if subed-mode--enabled-p
- (subed-mode-disable)
- (subed-mode-enable)))
-
-;;;###autoload
-(add-to-list 'auto-mode-alist '("\\.srt\\'" . subed-mode-enable))
-
-(provide 'subed)
-;;; subed.el ends here
+(provide 'subed-common)
+;;; subed-common.el ends here
diff --git a/subed/subed-srt.el b/subed/subed-srt.el
index ac9ab7a..c7b4b50 100644
--- a/subed/subed-srt.el
+++ b/subed/subed-srt.el
@@ -27,12 +27,6 @@
;;; Code:
-(defvar subed-subtitle-spacing) ; from subed.el
-(defvar subed-default-subtitle-length) ; from subed.el
-(declare-function subed-save-excursion "subed.el" t t) ; macro
-(declare-function subed-debug "subed.el" (msg &rest args))
-(declare-function subed--right-pad "subed.el" (string length fillchar))
-
;;; Syntax highlighting
(defconst subed-srt-font-lock-keywords
diff --git a/subed/subed.el b/subed/subed.el
index 8be3aa2..942467e 100644
--- a/subed/subed.el
+++ b/subed/subed.el
@@ -32,14 +32,10 @@
;;; Code:
(require 'subed-config)
+(require 'subed-common)
(require 'subed-srt)
(require 'subed-mpv)
-;; Abstraction layer to allow support for other subtitle formats
-(defcustom subed-font-lock-keywords subed-srt-font-lock-keywords
- "The particular font-lock keywords in use by subed."
- :type 'list
- :group 'subed)
(defalias 'subed-subtitle-id #'subed-srt--subtitle-id)
(defalias 'subed-subtitle-id-max #'subed-srt--subtitle-id-max)
@@ -76,904 +72,6 @@
(defalias 'subed-sort #'subed-srt--sort)
-;;; Debugging
-
-(defun subed-enable-debugging ()
- "Hide debugging messages and set `debug-on-error' to nil."
- (interactive)
- (unless subed-debugging-enabled-p
- (setq subed-debugging-enabled-p t
- debug-on-error t)
- (let ((debug-buffer (get-buffer-create subed-debug-buffer))
- (debug-window (or (get-buffer-window subed-debug-buffer)
- (split-window-horizontally (max 35 (floor (* 0.3
(window-width))))))))
- (set-window-buffer debug-window debug-buffer)
- (with-current-buffer debug-buffer
- (buffer-disable-undo)
- (setq-local buffer-read-only t)))
- (add-hook 'kill-buffer-hook #'subed-disable-debugging :append :local)))
-
-(defun subed-disable-debugging ()
- "Display debugging messages in separate window and set `debug-on-error' to
t."
- (interactive)
- (when subed-debugging-enabled-p
- (setq subed-debugging-enabled-p nil
- debug-on-error nil)
- (let ((debug-window (get-buffer-window subed-debug-buffer)))
- (when debug-window
- (delete-window debug-window)))
- (remove-hook 'kill-buffer-hook #'subed-disable-debugging :local)))
-
-(defun subed-toggle-debugging ()
- "Display or hide debugging messages in separate window and set
`debug-on-error' to t or nil."
- (interactive)
- (if subed-debugging-enabled-p
- (subed-disable-debugging)
- (subed-enable-debugging)))
-
-(defun subed-debug (msg &rest args)
- "Pass MSG and ARGS to `format' and show the result in debugging buffer if it
exists."
- (when (get-buffer subed-debug-buffer)
- (with-current-buffer (get-buffer-create subed-debug-buffer)
- (setq-local buffer-read-only nil)
- (insert (apply #'format (concat msg "\n") args))
- (setq-local buffer-read-only t)
- (let ((debug-window (get-buffer-window subed-debug-buffer)))
- (when debug-window
- (set-window-point debug-window (goto-char (point-max))))))))
-
-
-;;; Utilities
-
-(defmacro subed-save-excursion (&rest body)
- "Restore relative point within current subtitle after executing BODY.
-This also works if the buffer changes (e.g. when sorting
-subtitles) as long the subtitle IDs don't change."
- (save-excursion
- `(let ((sub-id (subed-subtitle-id))
- (sub-pos (subed-subtitle-relative-point)))
- (progn ,@body)
- (subed-jump-to-subtitle-id sub-id)
- ;; Subtitle text may have changed and we may not be able to move to the
- ;; exact original position
- (condition-case nil
- (forward-char sub-pos)
- ('beginning-of-buffer nil)
- ('end-of-buffer nil)))))
-
-(defmacro subed-for-each-subtitle (&optional beg end reverse &rest body)
- "Run BODY for each subtitle between the region specified by BEG and END.
-If END is nil, it defaults to `point-max'.
-If BEG and END are both nil, run BODY only on the subtitle at point.
-If REVERSE is non-nil, start on the subtitle at END and move backwards.
-Before BODY is run, point is placed on the subtitle's ID."
- (declare (indent defun))
- `(atomic-change-group
- (if (not ,beg)
- ;; Run body on subtitle at point
- (save-excursion (subed-jump-to-subtitle-id)
- ,@body)
- (let ((begm (make-marker))
- (endm (make-marker)))
- (set-marker begm ,beg)
- (set-marker endm (or ,end (point-max)))
- ;; Run body on multiple subtitles
- (if ,reverse
- ;; Iterate backwards
- (save-excursion (goto-char endm)
- (subed-jump-to-subtitle-id)
- (catch 'first-subtitle-reached
- (while t
- ;; The subtitle includes every character up
to the next subtitle's ID (or eob)
- (let ((sub-end (save-excursion
(subed-jump-to-subtitle-end))))
- (when (< sub-end begm)
- (throw 'first-subtitle-reached t)))
- (progn ,@body)
- (unless (subed-backward-subtitle-id)
- (throw 'first-subtitle-reached t)))))
- ;; Iterate forwards
- (save-excursion (goto-char begm)
- (subed-jump-to-subtitle-id)
- (catch 'last-subtitle-reached
- (while t
- (when (> (point) endm)
- (throw 'last-subtitle-reached t))
- (progn ,@body)
- (unless (subed-forward-subtitle-id)
- (throw 'last-subtitle-reached t))))))))))
-
-(defmacro subed-with-subtitle-replay-disabled (&rest body)
- "Run BODY while automatic subtitle replay is disabled."
- (declare (indent defun))
- `(let ((replay-was-enabled-p (subed-replay-adjusted-subtitle-p)))
- (subed-disable-replay-adjusted-subtitle :quiet)
- (progn ,@body)
- (when replay-was-enabled-p
- (subed-enable-replay-adjusted-subtitle :quiet))))
-
-(defun subed--right-pad (string length fillchar)
- "Use FILLCHAR to make STRING LENGTH characters long."
- (concat string (make-string (- length (length string)) fillchar)))
-
-
-;;; Adjusting start/stop time individually
-
-(defun subed-adjust-subtitle-time-start (msecs &optional
- ignore-negative-duration
- ignore-spacing)
- "Add MSECS milliseconds to start time (use negative value to subtract).
-
-Unless IGNORE-NEGATIVE-DURATION is non-nil, reduce MSECS so that
-the start time isn't larger than the stop time. Zero-length
-subtiltes are always allowed.
-
-Unless IGNORE-SPACING is non-nil, if the adjustment would result
-in gaps between subtitles being smaller than
-`subed-subtitle-spacing', reduce MSECS so that this doesn't
-happen.
-
-Return the number of milliseconds the start time was adjusted or
-nil if nothing changed."
- (subed-disable-sync-point-to-player-temporarily)
- (let* ((msecs-start (subed-subtitle-msecs-start))
- (msecs-new (when msecs-start (+ msecs-start msecs))))
- (when msecs-new
- (if (> msecs 0)
- ;; Adding to start time
- (unless ignore-negative-duration
- (let ((msecs-stop (subed-subtitle-msecs-stop)))
- (setq msecs-new (min msecs-new msecs-stop))))
- ;; Subtracting from start time
- (unless ignore-spacing
- (let* ((msecs-prev-stop (save-excursion (when
(subed-backward-subtitle-id)
-
(subed-subtitle-msecs-stop))))
- (msecs-min (if msecs-prev-stop
- (+ msecs-prev-stop subed-subtitle-spacing) 0)))
- (when msecs-min
- (setq msecs-new (max msecs-new msecs-min))))))
- ;; msecs-new must be bigger than the current start time if we are adding
- ;; or smaller if we are subtracting.
- (when (or (and (> msecs 0) (> msecs-new msecs-start)) ;; Adding
- (and (< msecs 0) (< msecs-new msecs-start))) ;; Subtracting
- (subed-set-subtitle-time-start msecs-new)
- (subed--run-subtitle-time-adjusted-hook)
- (- msecs-new msecs-start)))))
-
-(defun subed-adjust-subtitle-time-stop (msecs &optional
- ignore-negative-duration
- ignore-spacing)
- "Add MSECS milliseconds to stop time (use negative value to subtract).
-
-Unless IGNORE-NEGATIVE-DURATION is non-nil, increase MSECS so
-that the stop time isn't smaller than the start time.
-Zero-length subtiltes are always allowed.
-
-Unless IGNORE-SPACING is non-nil, if the adjustment would result
-in gaps between subtitles being smaller than
-`subed-subtitle-spacing', reduce MSECS so that this doesn't
-happen.
-
-Return the number of milliseconds the stop time was adjusted or
-nil if nothing changed."
- (subed-disable-sync-point-to-player-temporarily)
- (let* ((msecs-stop (subed-subtitle-msecs-stop))
- (msecs-new (when msecs-stop (+ msecs-stop msecs))))
- (when msecs-new
- (if (> msecs 0)
- ;; Adding to stop time
- (unless ignore-spacing
- (let* ((msecs-next-start (save-excursion (when
(subed-forward-subtitle-id)
-
(subed-subtitle-msecs-start))))
- (msecs-max (when msecs-next-start
- (- msecs-next-start subed-subtitle-spacing))))
- (when msecs-max
- (setq msecs-new (min msecs-new msecs-max)))))
- ;; Subtracting from stop time
- (unless ignore-negative-duration
- (let ((msecs-start (subed-subtitle-msecs-start)))
- (setq msecs-new (max msecs-new msecs-start)))))
- ;; msecs-new must be bigger than the current stop time if we are adding
or
- ;; smaller if we are subtracting.
- (when (or (and (> msecs 0) (> msecs-new msecs-stop)) ;; Adding
- (and (< msecs 0) (< msecs-new msecs-stop))) ;; Subtracting
- (subed-set-subtitle-time-stop msecs-new)
- (subed--run-subtitle-time-adjusted-hook)
- (- msecs-new msecs-stop)))))
-
-(defun subed-increase-start-time (&optional arg)
- "Add `subed-milliseconds-adjust' milliseconds to start time.
-
-Return new start time in milliseconds or nil if it didn't change.
-
-If prefix argument ARG is given, it is used to set
-`subed-milliseconds-adjust' before moving subtitles. If the
-prefix argument is given but not numerical,
-`subed-milliseconds-adjust' is reset to its default value.
-
-Example usage:
- \\[universal-argument] 1000 \\[subed-increase-start-time] Increase start
time by 1000ms
- \\[subed-increase-start-time] Increase start time by 1000ms again
- \\[universal-argument] 500 \\[subed-increase-start-time] Increase start
time by 500ms
- \\[subed-increase-start-time] Increase start time by 500ms again
- \\[universal-argument] \\[subed-increase-start-time] Increase start
time by 100ms (the default)
- \\[subed-increase-start-time] Increase start time by 100ms (the
default) again"
- (interactive "P")
- (subed-adjust-subtitle-time-start (subed-get-milliseconds-adjust arg)))
-
-(defun subed-decrease-start-time (&optional arg)
- "Subtract `subed-milliseconds-adjust' milliseconds from start time.
-
-Return new start time in milliseconds or nil if it didn't change.
-
-See `subed-increase-start-time' about ARG."
- (interactive "P")
- (subed-adjust-subtitle-time-start (* -1 (subed-get-milliseconds-adjust
arg))))
-
-(defun subed-increase-stop-time (&optional arg)
- "Add `subed-milliseconds-adjust' milliseconds to stop time.
-
-Return new stop time in milliseconds or nil if it didn't change.
-
-See `subed-increase-start-time' about ARG."
- (interactive "P")
- (subed-adjust-subtitle-time-stop (subed-get-milliseconds-adjust arg)))
-
-(defun subed-decrease-stop-time (&optional arg)
- "Subtract `subed-milliseconds-adjust' milliseconds from stop time.
-
-Return new stop time in milliseconds or nil if it didn't change.
-
-See `subed-increase-start-time' about ARG."
- (interactive "P")
- (subed-adjust-subtitle-time-stop (* -1 (subed-get-milliseconds-adjust arg))))
-
-(defun subed-copy-player-pos-to-start-time ()
- "Replace current subtitle's start time with current playback 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)
- subed-mpv-playback-position))
-
-(defun subed-copy-player-pos-to-stop-time ()
- "Replace current subtitle's stop time with current playback 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)
- subed-mpv-playback-position))
-
-
-;;; Moving subtitles
-;;; (adjusting start and stop time by the same amount)
-
-(defun subed--get-move-subtitle-func (msecs)
- "Return subtitle moving function.
-
-When moving subtitles forward (MSECS > 0), we must adjust the
-stop time first and adjust the start time by the same amount the
-stop time was adjusted. This ensures that subtitle length
-doesn't change if we can't move MSECS milliseconds forward
-because we'd overlap with the next subtitle.
-
-When moving subtitles backward (MSECS < 0), it's the same thing
-but we move the start time first."
- (if (> msecs 0)
- (lambda (msecs &optional ignore-limits)
- (let ((msecs (subed-adjust-subtitle-time-stop msecs
- :ignore-negative-duration
- ignore-limits)))
- (when msecs (subed-adjust-subtitle-time-start msecs
-
:ignore-negative-duration
- ignore-limits))))
- (lambda (msecs &optional ignore-limits)
- (let ((msecs (subed-adjust-subtitle-time-start msecs
- :ignore-negative-duration
- ignore-limits)))
- (when msecs (subed-adjust-subtitle-time-stop msecs
- :ignore-negative-duration
- ignore-limits))))))
-
-(defun subed--move-current-subtitle (msecs)
- "Move subtitle on point by MSECS milliseconds."
- (unless (= msecs 0)
- (subed-with-subtitle-replay-disabled
- (cl-flet ((move-subtitle (subed--get-move-subtitle-func msecs)))
- (move-subtitle msecs)))))
-
-(defun subed--move-subtitles-in-region (msecs beg end)
- "Move subtitles in region specified by BEG and END by MSECS milliseconds."
- (unless (= msecs 0)
- (subed-with-subtitle-replay-disabled
- (cl-flet ((move-subtitle (subed--get-move-subtitle-func msecs)))
- ;; When moving subtitles forward, the first step is to move the last
- ;; subtitle because:
- ;; a) We need to check if we can move at all and abort if not.
- ;; b) We may have to reduce MSECS if we can move but not by the
full
- ;; amount. The goal is that all subtitles are moved by the same
- ;; amount and the spacing between subtitles doesn't change.
- ;; All other subtitles must be moved without any checks because we only
- ;; ensure that the active region as a whole can be moved, not it's
- ;; individual parts, which may be too close together or even overlap.
- ;; Moving subtitles backward is basically the same thing but vice
versa.
- (catch 'bumped-into-subtitle
- (if (> msecs 0)
- (save-excursion
- ;; Moving forward - Start on last subtitle to see if/how far
- ;; we can move forward.
- (goto-char end)
- (unless (setq msecs (move-subtitle msecs))
- (throw 'bumped-into-subtitle t))
- (subed-backward-subtitle-id)
- (subed-for-each-subtitle beg (point) :reverse
- (move-subtitle msecs :ignore-spacing)))
- ;; Start on first subtitle to see if/how far we can move backward.
- (save-excursion
- (goto-char beg)
- (unless (setq msecs (move-subtitle msecs))
- (throw 'bumped-into-subtitle t))
- (subed-forward-subtitle-id)
- (subed-for-each-subtitle (point) end
- (move-subtitle msecs :ignore-spacing)))))))))
-
-(defun subed-move-subtitles (msecs &optional beg end)
- "Move subtitles between BEG and END MSECS milliseconds forward.
-Use a negative MSECS value to move subtitles backward.
-If END is nil, move all subtitles from BEG to end of buffer.
-If BEG is nil, move only the current subtitle.
-After subtitles are moved, replay the first moved subtitle if
-replaying is enabled."
- (cond ((and beg end) (subed--move-subtitles-in-region msecs beg end))
- (beg (subed--move-subtitles-in-region msecs beg (point-max)))
- (t (subed--move-current-subtitle msecs)))
- (when (subed-replay-adjusted-subtitle-p)
- (save-excursion
- (when beg (goto-char beg))
- (subed-mpv-jump (subed-subtitle-msecs-start)))))
-
-(defun subed-move-subtitle-forward (&optional arg)
- "Move subtitle `subed-milliseconds-adjust' forward.
-
-Moving adjusts start and stop time by the same amount, preserving
-subtitle duration.
-
-All subtitles that are fully or partially in the active region
-are moved.
-
-If prefix argument ARG is given, it is used to set
-`subed-milliseconds-adjust' before moving subtitles. If the
-prefix argument is given but not numerical,
-`subed-milliseconds-adjust' is reset to its default value.
-
-Example usage:
- \\[universal-argument] 1000 \\[subed-move-subtitle-forward] Move subtitle
1000ms forward in time
- \\[subed-move-subtitle-forward] Move subtitle 1000ms forward in
time again
- \\[universal-argument] 500 \\[subed-move-subtitle-forward] Move subtitle
500ms forward in time
- \\[subed-move-subtitle-forward] Move subtitle 500ms forward in
time again
- \\[universal-argument] \\[subed-move-subtitle-forward] Move subtitle
100ms (the default) forward in time
- \\[subed-move-subtitle-forward] Move subtitle 100ms (the default)
forward in time again"
- (interactive "P")
- (let ((deactivate-mark nil)
- (msecs (subed-get-milliseconds-adjust arg))
- (beg (when (use-region-p) (region-beginning)))
- (end (when (use-region-p) (region-end))))
- (subed-move-subtitles msecs beg end)))
-
-(defun subed-move-subtitle-backward (&optional arg)
- "Move subtitle `subed-milliseconds-adjust' backward.
-
-See `subed-move-subtitle-forward' about ARG."
- (interactive "P")
- (let ((deactivate-mark nil)
- (msecs (* -1 (subed-get-milliseconds-adjust arg)))
- (beg (when (use-region-p) (region-beginning)))
- (end (when (use-region-p) (region-end))))
- (subed-move-subtitles msecs beg end)))
-
-
-;;; Shifting subtitles
-;;; (same as moving, but follow-up subtitles are also moved)
-
-(defun subed-shift-subtitle-forward (&optional arg)
- "Shift subtitle `subed-milliseconds-adjust' backward.
-
-Shifting is like moving, but it always moves the subtitles
-between point and the end of the buffer.
-
-See `subed-move-subtitle-forward' about ARG."
- (interactive "P")
- (let ((deactivate-mark nil)
- (msecs (subed-get-milliseconds-adjust arg))
- (beg (if (use-region-p) (region-beginning) (point))))
- (subed-move-subtitles msecs beg)))
-
-(defun subed-shift-subtitle-backward (&optional arg)
- "Shift subtitle `subed-milliseconds-adjust' backward.
-
-Shifting is like moving, but it always moves the subtitles
-between point and the end of the buffer.
-
-See `subed-move-subtitle-forward' about ARG."
- (interactive "P")
- (let ((deactivate-mark nil)
- (msecs (* -1 (subed-get-milliseconds-adjust arg)))
- (beg (if (use-region-p) (region-beginning) (point))))
- (subed-move-subtitles msecs beg)))
-
-
-;;; Inserting
-
-(defun subed--insert-subtitle-info (arg)
- "Provide information for inserting subtitles.
-ARG is the user-given argument.
-Return a list of values in the following order:
- number-of-subs insert-before-current (t or nil) buffer-is-empty
- msecs-min msecs-max msecs-avail msecs-per-sub msecs-between
- insert-subtitle-func"
- (let* ((number-of-subs (cond ((not arg) 1) ;; M-i
- ((integerp arg) arg) ;; C-u N M-i / C-u - N
M-i
- ;; C-u [C-u ...] M-i / C-u - [C-u ...] M-i
- ((consp arg) (* (truncate (log (abs (car arg))
4)) ;; ([-]64) -> 3
- (/ (car arg) (abs (car arg)))))
;; Restore sign
- (t 1))) ;; C-u - M-i
- (insert-before-current (or (< number-of-subs 0) ;; C-u - N M-i
- (eq arg '-) ;; C-u - M-i
- (consp arg))) ;; C-u [C-u ...] M-i
- ;; Ensure number-of-subs is positive, now that we figured out
`insert-before-current'
- (number-of-subs (abs number-of-subs))
- (buffer-is-empty (if (subed-subtitle-id) nil t))
- ;; Find out how much time there is available
- (msecs-min (save-excursion (if insert-before-current
- (if (subed-backward-subtitle-id)
- (subed-subtitle-msecs-stop) 0)
- (subed-subtitle-msecs-stop))))
- (msecs-max (save-excursion (if insert-before-current
- (subed-subtitle-msecs-start)
- (when (subed-forward-subtitle-id)
- (subed-subtitle-msecs-start)))))
- (msecs-avail (cond ((and msecs-min msecs-max) (- msecs-max msecs-min))
- (msecs-max msecs-max)
- (t nil))) ;; Unlimited
- (msecs-per-sub (if msecs-avail
- (min subed-default-subtitle-length
- (max 0 (/ (- msecs-avail (* (1+
number-of-subs) subed-subtitle-spacing))
- number-of-subs)))
- subed-default-subtitle-length))
- (msecs-between (if (or (not msecs-avail)
- (>= msecs-avail (* (1+ number-of-subs)
subed-subtitle-spacing)))
- subed-subtitle-spacing
- 0))
- (insert-subtitle-func (if insert-before-current
- #'subed-prepend-subtitle
- #'subed-append-subtitle)))
- (subed-debug "Inserting %s subtitle(s) %s the current in %sempty buffer"
- number-of-subs
- (if insert-before-current "before" "after")
- (if buffer-is-empty "" "non-"))
- (subed-debug " Available time: min=%S max=%S avail=%S sublen=%S/%S"
- msecs-min msecs-max msecs-avail msecs-per-sub
subed-default-subtitle-length)
- (list number-of-subs insert-before-current buffer-is-empty
- msecs-min msecs-max msecs-avail msecs-per-sub msecs-between
- insert-subtitle-func)))
-
-(defun subed-insert-subtitle (&optional arg)
- "Insert subtitle(s) evenly spaced.
-
-The inserted subtitles are `subed-default-subtitle-length'
-milliseconds long.
-
-Subtitles are spread out evenly over the available time.
-
-ARG, usually provided by `universal-argument', is used in the
-following manner:
- \\[subed-insert-subtitle] Insert 1 subtitle after the current
subtitle
- \\[universal-argument] \\[subed-insert-subtitle] Insert 1 subtitle
before the current subtitle
- \\[universal-argument] 5 \\[subed-insert-subtitle] Insert 5 subtitles
after the current subtitle
- \\[universal-argument] - 5 \\[subed-insert-subtitle] Insert 5 subtitles
before the current subtitle
- \\[universal-argument] \\[universal-argument] \\[subed-insert-subtitle]
Insert 2 subtitles before the current subtitle"
- (interactive "P")
- (atomic-change-group
- (cl-multiple-value-bind (number-of-subs insert-before-current
buffer-is-empty
- msecs-min msecs-max msecs-avail msecs-per-sub
msecs-between
- insert-subtitle-func)
- (subed--insert-subtitle-info arg)
- (dotimes (i number-of-subs)
- ;; Value constellations:
- ;; empty buffer, append : min=0 max=nil
avail=nil
- ;; empty buffer, prepend : min=0 max=nil
avail=nil
- ;; non-empty buffer, prepend, betwixt : min=non-nil max=non-nil
avail=non-nil
- ;; non-empty buffer, append, betwixt : min=non-nil max=non-nil
avail=non-nil
- ;; non-empty buffer, prepend to first : min=0 max=non-nil
avail=non-nil
- ;; non-empty buffer, append to last : min=non-nil max=nil
avail=nil
- (let* ((multiplier (if insert-before-current
- (- number-of-subs i)
- (1+ i)))
- (msecs-start (if msecs-avail
- ;; Inserting anywhere before the last subtitle
- (+ msecs-min
- (if (< msecs-per-sub
subed-default-subtitle-length)
- ;; Use all available space between
subtitles
- (+ msecs-between
- (* (1- multiplier) (+ msecs-between
msecs-per-sub)))
- ;; Leave extra space between subtitles
- (* multiplier (/ msecs-avail (1+
number-of-subs)))))
- (if (and msecs-min (not msecs-max))
- ;; Appending to last subtitle
- (+ msecs-min
- ;; If buffer is empty, start first
subtitle at 0
- (if (> msecs-min 0) msecs-between 0)
- (* (1- multiplier) (+ msecs-per-sub
msecs-between)))
- ;; Appending in empty buffer
- (* i (+ msecs-per-sub msecs-between)))))
- (msecs-stop (+ msecs-start msecs-per-sub)))
- (subed-debug " Inserting new subtitle at %S - %S" msecs-start
msecs-stop)
- (funcall insert-subtitle-func nil msecs-start msecs-stop nil)))
- (unless insert-before-current
- (dotimes (_ (1- number-of-subs))
- (subed-backward-subtitle-text))))
- (subed-regenerate-ids-soon))
- (point))
-
-(defun subed-insert-subtitle-adjacent (&optional arg)
- "Insert subtitle(s) close to each other.
-
-The inserted subtitles are `subed-default-subtitle-length'
-milliseconds long.
-
-Subtitles are inserted `subed-subtitle-spacing' milliseconds
-before or after the current subtitle. When inserting multiple
-subtitles, the gap between them is also `subed-subtitle-spacing'
-milliseconds long.
-
-ARG, usually provided by `universal-argument', is used in the
-following manner:
- \\[subed-insert-subtitle] Insert 1 subtitle after the current
subtitle
- \\[universal-argument] \\[subed-insert-subtitle] Insert 1 subtitle
before the current subtitle
- \\[universal-argument] 5 \\[subed-insert-subtitle] Insert 5 subtitles
after the current subtitle
- \\[universal-argument] - 5 \\[subed-insert-subtitle] Insert 5 subtitles
before the current subtitle
- \\[universal-argument] \\[universal-argument] \\[subed-insert-subtitle]
Insert 2 subtitles before the current subtitle"
- (interactive "P")
- (atomic-change-group
- (cl-multiple-value-bind (number-of-subs insert-before-current
buffer-is-empty
- msecs-min msecs-max msecs-avail msecs-per-sub
msecs-between
- insert-subtitle-func)
- (subed--insert-subtitle-info arg)
- (dotimes (i number-of-subs)
- ;; Value constellations:
- ;; empty buffer, append : min=0 max=nil
avail=nil
- ;; empty buffer, prepend : min=0 max=nil
avail=nil
- ;; non-empty buffer, prepend, betwixt : min=non-nil max=non-nil
avail=non-nil
- ;; non-empty buffer, append, betwixt : min=non-nil max=non-nil
avail=non-nil
- ;; non-empty buffer, prepend to first : min=0 max=non-nil
avail=non-nil
- ;; non-empty buffer, append to last : min=non-nil max=nil
avail=nil
- (let* ((multiplier (if insert-before-current
- (- number-of-subs i 1)
- i))
- (msecs-start (if buffer-is-empty
- (* multiplier (+ msecs-between msecs-per-sub))
- (if insert-before-current
- (- msecs-max (* (1+ i) (+ msecs-between
msecs-per-sub)))
- (+ msecs-min
- msecs-between
- (* i (+ msecs-per-sub msecs-between))))))
- (msecs-stop (+ msecs-start msecs-per-sub)))
- (subed-debug " Inserting new subtitle at %S - %S" msecs-start
msecs-stop)
- (funcall insert-subtitle-func nil msecs-start msecs-stop nil)))
- (unless insert-before-current
- (dotimes (_ (1- number-of-subs))
- (subed-backward-subtitle-text))))
- (subed-regenerate-ids-soon))
- (point))
-
-
-;;; Replay time-adjusted subtitle
-
-(defun subed-replay-adjusted-subtitle-p ()
- "Whether the player jumps to start time if start or stop time is adjusted."
- (member #'subed--replay-adjusted-subtitle subed-subtitle-time-adjusted-hook))
-
-(defun subed-enable-replay-adjusted-subtitle (&optional quiet)
- "Automatically replay a subtitle when its start/stop time is adjusted.
-
-If QUIET is non-nil, do not display a message in the minibuffer."
- (interactive)
- (unless (subed-replay-adjusted-subtitle-p)
- (add-hook 'subed-subtitle-time-adjusted-hook
#'subed--replay-adjusted-subtitle :append :local)
- (subed-debug "Enabled replaying adjusted subtitle: %s"
subed-subtitle-time-adjusted-hook)
- (unless quiet
- (message "Enabled replaying adjusted subtitle"))))
-
-(defun subed-disable-replay-adjusted-subtitle (&optional quiet)
- "Do not replay a subtitle automatically when its start/stop time is adjusted.
-
-If QUIET is non-nil, do not display a message in the minibuffer."
- (interactive)
- (when (subed-replay-adjusted-subtitle-p)
- (remove-hook 'subed-subtitle-time-adjusted-hook
#'subed--replay-adjusted-subtitle :local)
- (subed-debug "Disabled replaying adjusted subtitle: %s"
subed-subtitle-time-adjusted-hook)
- (unless quiet
- (message "Disabled replaying adjusted subtitle"))))
-
-(defun subed-toggle-replay-adjusted-subtitle ()
- "Enable/disable subtitle replay when start/stop time is adjusted."
- (interactive)
- (if (subed-replay-adjusted-subtitle-p)
- (subed-disable-replay-adjusted-subtitle)
- (subed-enable-replay-adjusted-subtitle)))
-
-(defun subed--replay-adjusted-subtitle (msecs-start)
- "Seek player to MSECS-START."
- (subed-debug "Replaying subtitle at: %s" (subed-srt--msecs-to-timestamp
msecs-start))
- (subed-mpv-jump msecs-start))
-
-
-;;; Sync point-to-player
-
-(defun subed-sync-point-to-player-p ()
- "Whether point is automatically moved to currently playing subtitle."
- (member #'subed--sync-point-to-player subed-mpv-playback-position-hook))
-
-(defun subed-enable-sync-point-to-player (&optional quiet)
- "Automatically move point to the currently playing subtitle.
-
-If QUIET is non-nil, do not display a message in the minibuffer."
- (interactive)
- (unless (subed-sync-point-to-player-p)
- (add-hook 'subed-mpv-playback-position-hook #'subed--sync-point-to-player
:append :local)
- (subed-debug "Enabled syncing point to playback position: %s"
subed-mpv-playback-position-hook)
- (unless quiet
- (message "Enabled syncing point to playback position"))))
-
-(defun subed-disable-sync-point-to-player (&optional quiet)
- "Do not move point automatically to the currently playing subtitle.
-
-If QUIET is non-nil, do not display a message in the minibuffer."
- (interactive)
- (when (subed-sync-point-to-player-p)
- (remove-hook 'subed-mpv-playback-position-hook
#'subed--sync-point-to-player :local)
- (subed-debug "Disabled syncing point to playback position: %s"
subed-mpv-playback-position-hook)
- (unless quiet
- (message "Disabled syncing point to playback position"))))
-
-(defun subed-toggle-sync-point-to-player ()
- "Enable/disable moving point to the currently playing subtitle."
- (interactive)
- (if (subed-sync-point-to-player-p)
- (subed-disable-sync-point-to-player)
- (subed-enable-sync-point-to-player)))
-
-(defun subed--sync-point-to-player (msecs)
- "Move point to subtitle at MSECS."
- (when (and (not (use-region-p))
- (subed-jump-to-subtitle-text-at-msecs msecs))
- (subed-debug "Synchronized point to playback position: %s -> #%s"
- (subed-srt--msecs-to-timestamp msecs) (subed-subtitle-id))
- ;; post-command-hook is not triggered because we didn't move interactively.
- ;; But there's not really a difference, e.g. the minor mode `hl-line'
breaks
- ;; unless we call its post-command function, so we do it manually.
- ;; It's also important NOT to call our own post-command function because
- ;; that causes player-to-point syncing, which would get hairy.
- (remove-hook 'post-command-hook #'subed--post-command-handler)
- (run-hooks 'post-command-hook)
- (add-hook 'post-command-hook #'subed--post-command-handler :append
:local)))
-
-(defvar-local subed--point-sync-delay-after-motion-timer nil)
-(defun subed-disable-sync-point-to-player-temporarily ()
- "Temporarily disable syncing point to player.
-
-After `subed-point-sync-delay-after-motion' seconds point is re-synced."
- (if subed--point-sync-delay-after-motion-timer
- (cancel-timer subed--point-sync-delay-after-motion-timer)
- (setq subed--point-was-synced (subed-sync-point-to-player-p)))
- (when subed--point-was-synced
- (subed-disable-sync-point-to-player :quiet))
- (when subed--point-was-synced
- (setq subed--point-sync-delay-after-motion-timer
- (run-at-time subed-point-sync-delay-after-motion nil
- (lambda ()
- (setq subed--point-sync-delay-after-motion-timer nil)
- (subed-enable-sync-point-to-player :quiet))))))
-
-
-;;; Sync player-to-point
-
-(defun subed-sync-player-to-point-p ()
- "Whether playback position jumps to subtitle at point."
- (member #'subed--sync-player-to-point subed-subtitle-motion-hook))
-
-(defun subed-enable-sync-player-to-point (&optional quiet)
- "Automatically seek player to subtitle at point.
-
-If QUIET is non-nil, do not display a message in the minibuffer."
- (interactive)
- (unless (subed-sync-player-to-point-p)
- (subed--sync-player-to-point)
- (add-hook 'subed-subtitle-motion-hook #'subed--sync-player-to-point
:append :local)
- (subed-debug "Enabled syncing playback position to point: %s"
subed-subtitle-motion-hook)
- (unless quiet
- (message "Enabled syncing playback position to point"))))
-
-(defun subed-disable-sync-player-to-point (&optional quiet)
- "Do not automatically seek player to subtitle at point.
-
-If QUIET is non-nil, do not display a message in the minibuffer."
- (interactive)
- (when (subed-sync-player-to-point-p)
- (remove-hook 'subed-subtitle-motion-hook #'subed--sync-player-to-point
:local)
- (subed-debug "Disabled syncing playback position to point: %s"
subed-subtitle-motion-hook)
- (unless quiet
- (message "Disabled syncing playback position to point"))))
-
-(defun subed-toggle-sync-player-to-point ()
- "Enable or disable automatically seeking player to subtitle at point."
- (interactive)
- (if (subed-sync-player-to-point-p)
- (subed-disable-sync-player-to-point)
- (subed-enable-sync-player-to-point)))
-
-(defun subed--sync-player-to-point ()
- "Seek player to currently focused subtitle."
- (subed-debug "Seeking player to subtitle at point %s" (point))
- (let ((cur-sub-start (subed-subtitle-msecs-start))
- (cur-sub-stop (subed-subtitle-msecs-stop)))
- (when (and subed-mpv-playback-position cur-sub-start cur-sub-stop
- (or (< subed-mpv-playback-position cur-sub-start)
- (> subed-mpv-playback-position cur-sub-stop)))
- (subed-mpv-jump cur-sub-start)
- (subed-debug "Synchronized playback position to point: #%s -> %s"
- (subed-subtitle-id) cur-sub-start))))
-
-
-;;; Loop over single subtitle
-
-(defun subed-subtitle-loop-p ()
- "Whether the player is looping over the current subtitle."
- (or subed--subtitle-loop-start subed--subtitle-loop-stop))
-
-(defun subed-toggle-subtitle-loop (&optional quiet)
- "Enable or disable looping in player over the current subtitle.
-
-If QUIET is non-nil, do not display a message in the minibuffer."
- (interactive)
- (if (subed-subtitle-loop-p)
- (progn
- (remove-hook 'subed-mpv-playback-position-hook
#'subed--ensure-subtitle-loop :local)
- (remove-hook 'subed-subtitle-motion-hook #'subed--set-subtitle-loop
:local)
- (setq subed--subtitle-loop-start nil
- subed--subtitle-loop-stop nil)
- (subed-debug "Disabling loop: %s - %s" subed--subtitle-loop-start
subed--subtitle-loop-stop)
- (unless quiet
- (message "Disabled looping")))
- (subed--set-subtitle-loop (subed-subtitle-id))
- (add-hook 'subed-mpv-playback-position-hook #'subed--ensure-subtitle-loop
:append :local)
- (add-hook 'subed-subtitle-motion-hook #'subed--set-subtitle-loop :append
:local)
- (subed-debug "Enabling loop: %s - %s" subed--subtitle-loop-start
subed--subtitle-loop-stop)))
-
-(defun subed--set-subtitle-loop (&optional sub-id)
- "Set loop positions to start/stop time of SUB-ID or current subtitle."
- (setq subed--subtitle-loop-start (- (subed-subtitle-msecs-start sub-id)
- (* subed-loop-seconds-before 1000))
- subed--subtitle-loop-stop (+ (subed-subtitle-msecs-stop sub-id)
- (* subed-loop-seconds-after 1000)))
- (subed-debug "Set loop: %s - %s"
- (subed-srt--msecs-to-timestamp subed--subtitle-loop-start)
- (subed-srt--msecs-to-timestamp subed--subtitle-loop-stop))
- (message "Looping over %s - %s"
- (subed-srt--msecs-to-timestamp subed--subtitle-loop-start)
- (subed-srt--msecs-to-timestamp subed--subtitle-loop-stop)))
-
-(defun subed--ensure-subtitle-loop (cur-msecs)
- "Jump to current subtitle start time if CUR-MSECS is after stop time."
- (when (and subed--subtitle-loop-start subed--subtitle-loop-stop
- subed-mpv-is-playing)
- (when (or (< cur-msecs subed--subtitle-loop-start)
- (> cur-msecs subed--subtitle-loop-stop))
- (subed-debug "%s -> Looping over %s - %s"
- (subed-srt--msecs-to-timestamp cur-msecs)
- (subed-srt--msecs-to-timestamp subed--subtitle-loop-start)
- (subed-srt--msecs-to-timestamp subed--subtitle-loop-stop))
- (subed-mpv-jump subed--subtitle-loop-start))))
-
-
-;;; Pause player while the user is editing
-
-(defun subed-pause-while-typing-p ()
- "Whether player is automatically paused or slowed down during editing.
-
-See `subed-playback-speed-while-typing' and
-`subed-playback-speed-while-not-typing'."
- (member #'subed--pause-while-typing after-change-functions))
-
-(defun subed-enable-pause-while-typing (&optional quiet)
- "Pause player while the user is editing a subtitle.
-
-After `subed-unpause-after-typing-delay' seconds, playback is
-resumed automatically unless the player was paused already.
-
-If QUIET is non-nil, do not display a message in the minibuffer."
- (unless (subed-pause-while-typing-p)
- (add-hook 'after-change-functions #'subed--pause-while-typing :append
:local)
- (unless quiet
- (subed-debug "%S" subed-playback-speed-while-typing)
- (if (<= subed-playback-speed-while-typing 0)
- (message "Playback will pause while subtitle texts are edited")
- (message "Playback will slow down by %s while subtitle texts are
edited"
- subed-playback-speed-while-typing)))))
-
-(defun subed-disable-pause-while-typing (&optional quiet)
- "Do not automatically pause player while the user is editing the buffer.
-
-If QUIET is non-nil, do not display a message in the minibuffer."
- (when (subed-pause-while-typing-p)
- (remove-hook 'after-change-functions #'subed--pause-while-typing :local)
- (unless quiet
- (message "Playback speed will not change while subtitle texts are
edited"))))
-
-(defun subed-toggle-pause-while-typing ()
- "Enable or disable auto-pausing while the user is editing the buffer."
- (interactive)
- (if (subed-pause-while-typing-p)
- (subed-disable-pause-while-typing)
- (subed-enable-pause-while-typing)))
-
-(defvar-local subed--unpause-after-typing-timer nil)
-(defun subed--pause-while-typing (&rest _args)
- "Pause or slow down playback for `subed-unpause-after-typing-delay' seconds.
-
-This function is meant to be an item in `after-change-functions'
-and therefore gets ARGS, which is ignored."
- (when subed--unpause-after-typing-timer
- (cancel-timer subed--unpause-after-typing-timer))
- (when (or subed-mpv-is-playing subed--player-is-auto-paused)
- (if (<= subed-playback-speed-while-typing 0)
- ;; Pause playback
- (progn
- (subed-mpv-pause)
- (setq subed--player-is-auto-paused t)
- (setq subed--unpause-after-typing-timer
- (run-at-time subed-unpause-after-typing-delay nil
- (lambda ()
- (setq subed--player-is-auto-paused nil)
- (subed-mpv-unpause)))))
- ;; Slow down playback
- (progn
- (subed-mpv-playback-speed subed-playback-speed-while-typing)
- (setq subed--player-is-auto-paused t)
- (setq subed--unpause-after-typing-timer
- (run-at-time subed-unpause-after-typing-delay nil
- (lambda ()
- (setq subed--player-is-auto-paused nil)
- (subed-mpv-playback-speed
subed-playback-speed-while-not-typing))))))))
-
-
-(defun subed-guess-video-file ()
- "Find video file with same base name as the opened file in the buffer.
-
-The file extension of the return value of the function
-`buffer-file-name' is replaced with each item in
-`subed-video-extensions' and the first existing file is returned.
-
-Language codes are also handled; e.g. \"foo.en.srt\" or
-\"foo.estonian.srt\" -> \"foo.{mkv,mp4,...}\" (this actually
-simply removes the extension from the extension-stripped file
-name).
-
-Return nil if function `buffer-file-name' returns nil."
- (when (buffer-file-name)
- (catch 'found-videofile
- (let* ((file-base (file-name-sans-extension (buffer-file-name)))
- (file-stem (file-name-sans-extension file-base)))
- (dolist (extension subed-video-extensions)
- (let ((file-base-video (format "%s.%s" file-base extension))
- (file-stem-video (format "%s.%s" file-stem extension)))
- (when (file-exists-p file-base-video)
- (throw 'found-videofile file-base-video))
- (when (file-exists-p file-stem-video)
- (throw 'found-videofile file-stem-video))))))))
-
-
;;;###autoload
(defun subed-mode-enable ()
"Enable subed mode."
- [nongnu] elpa/subed 7b5c5e0 205/389: Add/Fix tests for moving subtitles, (continued)
- [nongnu] elpa/subed 7b5c5e0 205/389: Add/Fix tests for moving subtitles, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed 3b69f02 225/389: Simplify basic test for moving subtitle, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed b6e484f 204/389: Move subtitles in active region as a unit, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed 07a3774 218/389: Add generic function subed-subtitle-id-max, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed 80a2545 223/389: Reduce LOC, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed cfe8d1c 228/389: subed-srt--backward-subtitle-id: Don't look for different ID, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed 1e2dab9 229/389: remove sharp-quote from list; make variable customizable, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed 17b5e1d 238/389: Adjust some test descriptions, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed bd6e798 247/389: subed-copy-player-pos-to-start/stop-time: Return playback position, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed c3e67ec 250/389: Add/Reword some features, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed d27e55a 253/389: Move most stuff from subed.el to subed-common.el,
ELPA Syncer <=
- [nongnu] elpa/subed b988a17 257/389: subed-replay-adjusted-subtitle-p: Fix if/when in docstring, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed 080e512 262/389: Make variable subed-subtitle-format private, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed e7e791f 265/389: Activate support for multiple subtitle formats, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed 831b0ea 267/389: Produce better error message when buffer-file-name is nil, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed 864748c 270/389: Point to subed-mode docstring in "Commentary", ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed 802a603 272/389: Add a real version number, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed 9557ba9 273/389: Standardize/Rename subtitle loop functions, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed ccc4c0e 274/389: Loop over current subtitle by default, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed 11a1993 275/389: Don't modify kill-ring when regenerating IDs, ELPA Syncer, 2021/12/03
- [nongnu] elpa/subed e3d4f46 283/389: Reword test description, ELPA Syncer, 2021/12/03