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

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

[nongnu] elpa/subed e73c0a3803: 1.2.11 New commands subed-shift-subtitle


From: ELPA Syncer
Subject: [nongnu] elpa/subed e73c0a3803: 1.2.11 New commands subed-shift-subtitles-to-start-at-timestamp, subed-move-subtitles-to-start-at-timestamp, add workflow notes
Date: Wed, 20 Dec 2023 13:00:28 -0500 (EST)

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

    1.2.11 New commands subed-shift-subtitles-to-start-at-timestamp, 
subed-move-subtitles-to-start-at-timestamp, add workflow notes
    
    Sometimes I just want to move a subtitle to start at a specific
    timestamp without needing to do the math.
    
    * subed/subed-common.el (subed-shift-subtitles-to-start-at-timestamp): New 
command.
    (subed-move-subtitles-to-start-at-timestamp): New command.
    (subed-shift-subtitles): Include a pointer to 
subed-shift-subtitles-to-start-at-timestamp.
    (subed-move-subtitles): Include a pointer to 
subed-move-subtitles-to-start-at-timestamp.
    * tests/test-subed-common.el ("COMMON"): Add tests for shifting and moving.
    * subed/subed.el (subed-guess-format): Add documentation.
    * README.org: Added workflow notes.
---
 NEWS.org                   |   7 +
 README.org                 |  78 +++++
 subed/subed-common.el      |  28 +-
 subed/subed.el             |   6 +-
 tests/test-subed-common.el | 770 ++++++++++++++++++++++++---------------------
 5 files changed, 526 insertions(+), 363 deletions(-)

diff --git a/NEWS.org b/NEWS.org
index 1b590da3b4..f45723d352 100644
--- a/NEWS.org
+++ b/NEWS.org
@@ -1,6 +1,13 @@
 #+OPTIONS: toc:nil
 
 * subed news
+** Version 1.2.11 - 2022-12-20 - Sacha Chua
+
+- New commands ~subed-shift-subtitles-to-start-at-timestamp~ and
+  ~subed-move-subtitles-to-start-at-timestamp~ should make it easier
+  to adjust timestamps without doing msec math.
+- Add workflow notes to README.org.
+
 ** Version 1.2.10 - 2023-12-20 - Sacha Chua
 
 - Add extra line after comments in text output.
diff --git a/README.org b/README.org
index 918ed7b8dc..28525cecf2 100644
--- a/README.org
+++ b/README.org
@@ -256,6 +256,84 @@ If you use 
[[https://github.com/radian-software/straight.el][straight.el]], you
 ~subed-srt-mode~, ~subed-vtt-mode~, and ~subed-ass-mode~. When
 manually loading a mode, use those specific format modes instead of
 ~subed-mode~.
+** Some workflow ideas
+
+*** Reflowing subtitles into shorter or longer lines
+
+You may want to use ~set-fill-column~ and
+~display-fill-column-indicator-mode~ to show the target number of
+characters.
+
+Use ~subed-split-subtitle~ (~M-.~), ~subed-merge-dwim~ (~M-b~), and
+~subed-merge-with-previous~ (~M-M~) to split lines.
+
+Splitting will use the current MPV position if available. If not, it
+will guess where to split based on the the number of characters in the
+subtitle. You can use ~subed-mpv-jump-to-current-subtitle~ (~M-j~) to play the
+current subtitle manually and use ~subed-mpv-toggle-pause~ (~M-SPC~) to stop at
+the right time. Use ~subed-toggle-loop-over-current-subtitle~ (~C-c C-l~) if 
you
+want to keep looping. ~subed-waveform-show-current~ can help you
+fine-tune the split.
+
+*** Adjusting timestamps
+
+You can use ~subed-mpv-jump-to-current-subtitle~ (~M-j~) to play the
+current subtitle manually. Use
+~subed-mpv-jump-to-current-subtitle-near-end~ (~M-J~) to jump to near
+the end of the subtitle in order to test it. Use
+~subed-toggle-loop-over-current-subtitle~ (~C-c C-l~) if you want to
+keep looping automatically. Use ~subed-mpv-toggle-pause~ (~M-SPC~) to stop at 
the
+right time.
+
+~subed-waveform-show-current~ or ~subed-waveform-show-all~ can be
+useful for adjusting start and end timestamps. Use
+~subed-waveform-set-start~ (~mouse-1~, which is left click) or 
~subed-waveform-set-stop~ (~mouse-3~, which is right-click) to adjust only
+the current subtitle's timestamps, or use
+~subed-waveform-set-start-and-copy-to-previous~ (~S-mouse-1~ or ~M-mouse-1~) or
+~subed-waveform-set-stop-and-copy-to-next~ (~S-mouse-3~ or ~M-mouse-3~) to 
adjust adjacent
+subtitles as well.
+
+You can also manually adjust
+
+- subtitle start: ~M-[~  / ~M-]~
+- subtitle stop: (~M-{~ / ~M-}~)
+
+A prefix argument sets the number of milliseconds (e.g. ~C-u 1000 M-[ M-[ M-[~ 
decreases start time by 3 seconds).
+
+*** Editing subtitles
+
+You can use ~subed-mpv-jump-to-current-subtitle~ (~M-j~) to play the current
+subtitle and use ~subed-mpv-toggle-pause~ (~M-SPC~) to stop at the right time.
+Use ~subed-toggle-loop-over-current-subtitle~ (~C-c C-l~) if you want to keep
+looping automatically.
+
+If you have wdiff installed, you can use
+~subed-wdiff-subtitle-text-with-file~ to compare the subtitle text
+with a script or another subtitle file.
+
+*** Writing subtitles from scratch
+
+One way is to start with one big subtitle that covers the whole media
+file, and then split it using ~subed-split-subtitle~ (~M-.~).
+
+Another way is to type as much of the text as you can without worrying
+about timestamps, putting each caption on a separate line. Then you
+can use ~subed-align~ to convert it into timestamped captions.
+
+*** Resynchronizing subtitles
+
+If you're using ~subed-waveform-show-current~ or ~subed-waveform-show-all~, 
you can use ~M-mouse-2~ (Meta-middle-click, ~subed-waveform-shift-subtitles~) 
to shift the current subtitle and succeeding subtitles so that they start at 
the position you clicked on.
+
+To do this with the keyboard, you can use
+~subed-shift-subtitles-to-start-at-timestamp~ if you want to specify a
+timestamp or ~subed-shift-subtitles~ to specify a millisecond offset.
+
+*** Exporting text for review
+
+You can use ~subed-copy-region-text~ to copy the text of the subtitles
+for pasting into another buffer. Call it with the universal prefix
+~C-u~ to copy comments as well.
+
 ** Troubleshooting
 *** subed-mpv: Service name too long
 
diff --git a/subed/subed-common.el b/subed/subed-common.el
index 25b11f1af2..89ee166307 100644
--- a/subed/subed-common.el
+++ b/subed/subed-common.el
@@ -1176,6 +1176,9 @@ If BEG is nil, move only the current subtitle.
 After subtitles are moved, replay the first moved subtitle if
 replaying is enabled.
 
+To move to a specific timestamp, use
+`subed-move-subtitles-to-start-at-timestamp'.
+
 To move the current subtitle and following subtitles by default,
 use `subed-shift-subtitles', `subed-shift-subtitle-forward',
 or `subed-shift-subtitle-backward'."
@@ -1192,6 +1195,22 @@ or `subed-shift-subtitle-backward'."
       (when beg (goto-char beg))
       (subed-mpv-jump (subed-subtitle-msecs-start)))))
 
+(defun subed-move-subtitles-to-start-at-timestamp (timestamp &optional beg end)
+  "Move subtitles between BEG and END so that the current subtitle starts at 
TIMESTAMP.
+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.
+
+To move the current subtitle and following subtitles by default,
+use `subed-shift-subtitles', `subed-shift-subtitles-to-start-at-timestamp',
+`subed-shift-subtitle-forward', or `subed-shift-subtitle-backward'."
+  (interactive (list (read-string "New start: ")
+                     (when (region-active-p) (point))
+                     (when (region-active-p) (mark))))
+  (subed-move-subtitles (- (subed-timestamp-to-msecs timestamp) 
(subed-subtitle-msecs-start))
+                        beg end))
+
 (defun subed-move-subtitle-forward (&optional arg)
   "Move subtitle `subed-milliseconds-adjust' forward.
 
@@ -1236,7 +1255,8 @@ See `subed-move-subtitle-forward' about ARG."
 ;;; (same as moving, but follow-up subtitles are also moved)
 
 (defun subed-shift-subtitles (&optional arg)
-  "Move this and following subtitles by ARG."
+  "Move this and following subtitles by ARG milliseconds.
+To shift to a specific timestamp, use 
`subed-shift-subtitles-to-start-at-timestamp'."
   (interactive (list (if current-prefix-arg
                          (prefix-numeric-value current-prefix-arg)
                        (read-number "Milliseconds: "))))
@@ -1244,6 +1264,12 @@ See `subed-move-subtitle-forward' about ARG."
         (msecs (subed-get-milliseconds-adjust arg)))
     (subed-move-subtitles msecs (point))))
 
+(defun subed-shift-subtitles-to-start-at-timestamp (timestamp)
+  "Move this and following subtitles so that the current one starts at 
TIMESTAMP.
+To shift by a millisecond offset, use `subed-shift-subtitles'."
+  (interactive (list (read-string "New start: ")))
+  (subed-shift-subtitles (- (subed-timestamp-to-msecs timestamp) 
(subed-subtitle-msecs-start))))
+
 (defun subed-shift-subtitle-forward (&optional arg)
   "Shift subtitle `subed-milliseconds-adjust' forward.
 
diff --git a/subed/subed.el b/subed/subed.el
index 8a25fcc135..b4b1d8b81c 100644
--- a/subed/subed.el
+++ b/subed/subed.el
@@ -1,6 +1,6 @@
 ;;; subed.el --- A major mode for editing subtitles  -*- lexical-binding: t; 
-*-
 
-;; Version: 1.2.10
+;; Version: 1.2.11
 ;; Maintainer: Sacha Chua <sacha@sachachua.com>
 ;; Author: Random User
 ;; Keywords: convenience, files, hypermedia, multimedia
@@ -152,7 +152,9 @@ Key bindings:
 This is a workaround for the transition to using format-specific
 modes such as `subed-srt-mode' while `auto-mode-alist' might
 still refer to `subed-mode'.  It will also switch to the
-format-specific mode if `subed-mode' is called directly."
+format-specific mode if `subed-mode' is called directly.
+
+If FILENAME is specified, use that."
   (when (or filename
             (and (eq major-mode 'subed-mode)
                  (buffer-file-name)))
diff --git a/tests/test-subed-common.el b/tests/test-subed-common.el
index 2e0ff214b2..3d724217ee 100644
--- a/tests/test-subed-common.el
+++ b/tests/test-subed-common.el
@@ -779,193 +779,193 @@ Baz.
   (describe "Moving"
     (it "adjusts start and stop time by the same amount."
       (with-temp-srt-buffer
-                               (insert (concat "1\n"
-                                                                               
                "00:00:01,000 --> 00:00:02,000\n"
-                                                                               
                "Foo.\n"))
-                               (let ((orig-point (subed-jump-to-subtitle-text 
1)))
-                                       (subed-move-subtitle-forward 100)
-                                       (expect (subed-subtitle-msecs-start) 
:to-equal 1100)
-                                       (expect (subed-subtitle-msecs-stop) 
:to-equal 2100)
-                                       (subed-move-subtitle-backward 200)
-                                       (expect (subed-subtitle-msecs-start) 
:to-equal 900)
-                                       (expect (subed-subtitle-msecs-stop) 
:to-equal 1900)
-                                       (expect (point) :to-equal orig-point))))
+                        (insert (concat "1\n"
+                                                                               
         "00:00:01,000 --> 00:00:02,000\n"
+                                                                               
         "Foo.\n"))
+                        (let ((orig-point (subed-jump-to-subtitle-text 1)))
+                                (subed-move-subtitle-forward 100)
+                                (expect (subed-subtitle-msecs-start) :to-equal 
1100)
+                                (expect (subed-subtitle-msecs-stop) :to-equal 
2100)
+                                (subed-move-subtitle-backward 200)
+                                (expect (subed-subtitle-msecs-start) :to-equal 
900)
+                                (expect (subed-subtitle-msecs-stop) :to-equal 
1900)
+                                (expect (point) :to-equal orig-point))))
                (describe "when clipping to time boundaries"
                        (it "adjusts start and stop time by the same amount 
when bumping into next subtitle."
                                (with-temp-srt-buffer
-                                       (insert (concat "1\n"
-                                                                               
                        "00:00:01,000 --> 00:00:01,600\n"
-                                                                               
                        "Foo.\n\n"
-                                                                               
                        "2\n"
-                                                                               
                        "00:00:02,000 --> 00:00:03,000\n"
-                                                                               
                        "Bar.\n"))
-                                       (let ((orig-point 
(subed-jump-to-subtitle-id 1))
-                                                               
(subed-subtitle-spacing 100)
-                                                               
(subed-enforce-time-boundaries 'clip))
-                                               (subed-move-subtitle-forward 
1000)
-                                               (expect 
(subed-subtitle-msecs-start) :to-equal 1300)
-                                               (expect 
(subed-subtitle-msecs-stop) :to-equal 1900)
-                                               (expect (point) :to-equal 
orig-point))))
+                                (insert (concat "1\n"
+                                                                               
                 "00:00:01,000 --> 00:00:01,600\n"
+                                                                               
                 "Foo.\n\n"
+                                                                               
                 "2\n"
+                                                                               
                 "00:00:02,000 --> 00:00:03,000\n"
+                                                                               
                 "Bar.\n"))
+                                (let ((orig-point (subed-jump-to-subtitle-id 
1))
+                                                        
(subed-subtitle-spacing 100)
+                                                        
(subed-enforce-time-boundaries 'clip))
+                                        (subed-move-subtitle-forward 1000)
+                                        (expect (subed-subtitle-msecs-start) 
:to-equal 1300)
+                                        (expect (subed-subtitle-msecs-stop) 
:to-equal 1900)
+                                        (expect (point) :to-equal 
orig-point))))
                        (it "adjusts start and stop time by the same amount 
when bumping into previous subtitle."
                                (with-temp-srt-buffer
-                                       (insert (concat "1\n"
-                                                                               
                        "00:00:01,000 --> 00:00:01,600\n"
-                                                                               
                        "Foo.\n\n"
-                                                                               
                        "2\n"
-                                                                               
                        "00:00:02,000 --> 00:00:03,000\n"
-                                                                               
                        "Bar.\n"))
-                                       (let ((orig-point 
(subed-jump-to-subtitle-id 2))
-                                                               
(subed-subtitle-spacing 100)
-                                                               
(subed-enforce-time-boundaries 'clip))
-                                               (subed-move-subtitle-backward 
1000)
-                                               (expect 
(subed-subtitle-msecs-start) :to-equal 1700)
-                                               (expect 
(subed-subtitle-msecs-stop) :to-equal 2700)
-                                               (expect (point) :to-equal 
orig-point)))))
+                                (insert (concat "1\n"
+                                                                               
                 "00:00:01,000 --> 00:00:01,600\n"
+                                                                               
                 "Foo.\n\n"
+                                                                               
                 "2\n"
+                                                                               
                 "00:00:02,000 --> 00:00:03,000\n"
+                                                                               
                 "Bar.\n"))
+                                (let ((orig-point (subed-jump-to-subtitle-id 
2))
+                                                        
(subed-subtitle-spacing 100)
+                                                        
(subed-enforce-time-boundaries 'clip))
+                                        (subed-move-subtitle-backward 1000)
+                                        (expect (subed-subtitle-msecs-start) 
:to-equal 1700)
+                                        (expect (subed-subtitle-msecs-stop) 
:to-equal 2700)
+                                        (expect (point) :to-equal 
orig-point)))))
                (describe "when time boundaries are enforced with errors"
                        (it "does not adjust anything if subtitle cannot be 
moved forward at all."
                                (with-temp-srt-buffer
-                                       (insert (concat "1\n"
-                                                                               
                        "00:00:01,000 --> 00:00:02,000\n"
-                                                                               
                        "Foo.\n\n"
-                                                                               
                        "2\n"
-                                                                               
                        "00:00:02,000 --> 00:00:03,000\n"
-                                                                               
                        "Bar.\n"))
-                                       (let ((orig-point 
(subed-jump-to-subtitle-id 1))
-                                                               
(subed-enforce-time-boundaries 'error))
-                                               (expect 
(subed-move-subtitle-forward 1) :to-throw 'error)
-                                               (expect 
(subed-subtitle-msecs-start 1) :to-equal 1000)
-                                               (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2000)
-                                               (expect 
(subed-subtitle-msecs-start 2) :to-equal 2000)
-                                               (expect 
(subed-subtitle-msecs-stop 2) :to-equal 3000)
-                                               (expect (point) :to-equal 
orig-point))))
+                                (insert (concat "1\n"
+                                                                               
                 "00:00:01,000 --> 00:00:02,000\n"
+                                                                               
                 "Foo.\n\n"
+                                                                               
                 "2\n"
+                                                                               
                 "00:00:02,000 --> 00:00:03,000\n"
+                                                                               
                 "Bar.\n"))
+                                (let ((orig-point (subed-jump-to-subtitle-id 
1))
+                                                        
(subed-enforce-time-boundaries 'error))
+                                        (expect (subed-move-subtitle-forward 
1) :to-throw 'error)
+                                        (expect (subed-subtitle-msecs-start 1) 
:to-equal 1000)
+                                        (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2000)
+                                        (expect (subed-subtitle-msecs-start 2) 
:to-equal 2000)
+                                        (expect (subed-subtitle-msecs-stop 2) 
:to-equal 3000)
+                                        (expect (point) :to-equal 
orig-point))))
                        (it "does not adjust anything if subtitle cannot be 
moved backward at all."
                                (with-temp-srt-buffer
-                                       (insert (concat "1\n"
-                                                                               
                        "00:00:01,000 --> 00:00:02,000\n"
-                                                                               
                        "Foo.\n\n"
-                                                                               
                        "2\n"
-                                                                               
                        "00:00:02,000 --> 00:00:03,000\n"
-                                                                               
                        "Bar.\n"))
-                                       (let ((orig-point 
(subed-jump-to-subtitle-id 2))
-                                                               
(subed-enforce-time-boundaries 'error))
-                                               (expect 
(subed-move-subtitle-backward 1) :to-throw 'error)
-                                               (expect 
(subed-subtitle-msecs-start 1) :to-equal 1000)
-                                               (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2000)
-                                               (expect 
(subed-subtitle-msecs-start 2) :to-equal 2000)
-                                               (expect 
(subed-subtitle-msecs-stop 2) :to-equal 3000)
-                                               (expect (point) :to-equal 
orig-point)))))
+                                (insert (concat "1\n"
+                                                                               
                 "00:00:01,000 --> 00:00:02,000\n"
+                                                                               
                 "Foo.\n\n"
+                                                                               
                 "2\n"
+                                                                               
                 "00:00:02,000 --> 00:00:03,000\n"
+                                                                               
                 "Bar.\n"))
+                                (let ((orig-point (subed-jump-to-subtitle-id 
2))
+                                                        
(subed-enforce-time-boundaries 'error))
+                                        (expect (subed-move-subtitle-backward 
1) :to-throw 'error)
+                                        (expect (subed-subtitle-msecs-start 1) 
:to-equal 1000)
+                                        (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2000)
+                                        (expect (subed-subtitle-msecs-start 2) 
:to-equal 2000)
+                                        (expect (subed-subtitle-msecs-stop 2) 
:to-equal 3000)
+                                        (expect (point) :to-equal 
orig-point)))))
     (describe "adjusts subtitles in the active region,"
       (it "excluding the first subtitle."
         (with-temp-srt-buffer
-                                       (insert (concat "1\n"
-                                                                               
                        "00:00:01,000 --> 00:00:02,000\n"
-                                                                               
                        "Foo.\n\n"
-                                                                               
                        "2\n"
-                                                                               
                        "00:00:03,000 --> 00:00:04,000\n"
-                                                                               
                        "Bar.\n\n"
-                                                                               
                        "3\n"
-                                                                               
                        "00:00:05,000 --> 00:00:06,000\n"
-                                                                               
                        "Baz.\n"))
-                                       (setq mark-active t)
-                                       (spy-on 'region-beginning 
:and-return-value (subed-jump-to-subtitle-text 2))
-                                       (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-time-start 3))
-                                       (let ((orig-point 
(subed-jump-to-subtitle-text 2)))
-                                               (subed-move-subtitle-forward 
100)
-                                               (expect 
(subed-subtitle-msecs-start 1) :to-equal 1000)
-                                               (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2000)
-                                               (expect 
(subed-subtitle-msecs-start 2) :to-equal 3100)
-                                               (expect 
(subed-subtitle-msecs-stop 2) :to-equal 4100)
-                                               (expect 
(subed-subtitle-msecs-start 3) :to-equal 5100)
-                                               (expect 
(subed-subtitle-msecs-stop 3) :to-equal 6100)
-                                               (expect (point) :to-equal 
orig-point)
-                                               (subed-move-subtitle-backward 
200)
-                                               (expect 
(subed-subtitle-msecs-start 1) :to-equal 1000)
-                                               (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2000)
-                                               (expect 
(subed-subtitle-msecs-start 2) :to-equal 2900)
-                                               (expect 
(subed-subtitle-msecs-stop 2) :to-equal 3900)
-                                               (expect 
(subed-subtitle-msecs-start 3) :to-equal 4900)
-                                               (expect 
(subed-subtitle-msecs-stop 3) :to-equal 5900)
-                                               (expect (point) :to-equal 
orig-point))))
+                                (insert (concat "1\n"
+                                                                               
                 "00:00:01,000 --> 00:00:02,000\n"
+                                                                               
                 "Foo.\n\n"
+                                                                               
                 "2\n"
+                                                                               
                 "00:00:03,000 --> 00:00:04,000\n"
+                                                                               
                 "Bar.\n\n"
+                                                                               
                 "3\n"
+                                                                               
                 "00:00:05,000 --> 00:00:06,000\n"
+                                                                               
                 "Baz.\n"))
+                                (setq mark-active t)
+                                (spy-on 'region-beginning :and-return-value 
(subed-jump-to-subtitle-text 2))
+                                (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-time-start 3))
+                                (let ((orig-point (subed-jump-to-subtitle-text 
2)))
+                                        (subed-move-subtitle-forward 100)
+                                        (expect (subed-subtitle-msecs-start 1) 
:to-equal 1000)
+                                        (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2000)
+                                        (expect (subed-subtitle-msecs-start 2) 
:to-equal 3100)
+                                        (expect (subed-subtitle-msecs-stop 2) 
:to-equal 4100)
+                                        (expect (subed-subtitle-msecs-start 3) 
:to-equal 5100)
+                                        (expect (subed-subtitle-msecs-stop 3) 
:to-equal 6100)
+                                        (expect (point) :to-equal orig-point)
+                                        (subed-move-subtitle-backward 200)
+                                        (expect (subed-subtitle-msecs-start 1) 
:to-equal 1000)
+                                        (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2000)
+                                        (expect (subed-subtitle-msecs-start 2) 
:to-equal 2900)
+                                        (expect (subed-subtitle-msecs-stop 2) 
:to-equal 3900)
+                                        (expect (subed-subtitle-msecs-start 3) 
:to-equal 4900)
+                                        (expect (subed-subtitle-msecs-stop 3) 
:to-equal 5900)
+                                        (expect (point) :to-equal 
orig-point))))
       (it "excluding the last subtitle."
         (with-temp-srt-buffer
-                                       (insert (concat "1\n"
-                                                                               
                        "00:00:01,000 --> 00:00:02,000\n"
-                                                                               
                        "Foo.\n\n"
-                                                                               
                        "2\n"
-                                                                               
                        "00:00:03,000 --> 00:00:04,000\n"
-                                                                               
                        "Bar.\n\n"
-                                                                               
                        "3\n"
-                                                                               
                        "00:00:05,000 --> 00:00:06,000\n"
-                                                                               
                        "Baz.\n"))
-                                       (setq mark-active t)
-                                       (spy-on 'region-beginning 
:and-return-value (subed-jump-to-subtitle-text 1))
-                                       (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-time-stop 2))
-                                       (let ((orig-point 
(subed-jump-to-subtitle-time-stop 3)))
-                                               (subed-move-subtitle-forward 
500)
-                                               (expect 
(subed-subtitle-msecs-start 1) :to-equal 1500)
-                                               (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2500)
-                                               (expect 
(subed-subtitle-msecs-start 2) :to-equal 3500)
-                                               (expect 
(subed-subtitle-msecs-stop 2) :to-equal 4500)
-                                               (expect 
(subed-subtitle-msecs-start 3) :to-equal 5000)
-                                               (expect 
(subed-subtitle-msecs-stop 3) :to-equal 6000)
-                                               (expect (point) :to-equal 
orig-point)
-                                               (subed-move-subtitle-backward 
300)
-                                               (expect 
(subed-subtitle-msecs-start 1) :to-equal 1200)
-                                               (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2200)
-                                               (expect 
(subed-subtitle-msecs-start 2) :to-equal 3200)
-                                               (expect 
(subed-subtitle-msecs-stop 2) :to-equal 4200)
-                                               (expect 
(subed-subtitle-msecs-start 3) :to-equal 5000)
-                                               (expect 
(subed-subtitle-msecs-stop 3) :to-equal 6000)
-                                               (expect (point) :to-equal 
orig-point))))
+                                (insert (concat "1\n"
+                                                                               
                 "00:00:01,000 --> 00:00:02,000\n"
+                                                                               
                 "Foo.\n\n"
+                                                                               
                 "2\n"
+                                                                               
                 "00:00:03,000 --> 00:00:04,000\n"
+                                                                               
                 "Bar.\n\n"
+                                                                               
                 "3\n"
+                                                                               
                 "00:00:05,000 --> 00:00:06,000\n"
+                                                                               
                 "Baz.\n"))
+                                (setq mark-active t)
+                                (spy-on 'region-beginning :and-return-value 
(subed-jump-to-subtitle-text 1))
+                                (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-time-stop 2))
+                                (let ((orig-point 
(subed-jump-to-subtitle-time-stop 3)))
+                                        (subed-move-subtitle-forward 500)
+                                        (expect (subed-subtitle-msecs-start 1) 
:to-equal 1500)
+                                        (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2500)
+                                        (expect (subed-subtitle-msecs-start 2) 
:to-equal 3500)
+                                        (expect (subed-subtitle-msecs-stop 2) 
:to-equal 4500)
+                                        (expect (subed-subtitle-msecs-start 3) 
:to-equal 5000)
+                                        (expect (subed-subtitle-msecs-stop 3) 
:to-equal 6000)
+                                        (expect (point) :to-equal orig-point)
+                                        (subed-move-subtitle-backward 300)
+                                        (expect (subed-subtitle-msecs-start 1) 
:to-equal 1200)
+                                        (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2200)
+                                        (expect (subed-subtitle-msecs-start 2) 
:to-equal 3200)
+                                        (expect (subed-subtitle-msecs-stop 2) 
:to-equal 4200)
+                                        (expect (subed-subtitle-msecs-start 3) 
:to-equal 5000)
+                                        (expect (subed-subtitle-msecs-stop 3) 
:to-equal 6000)
+                                        (expect (point) :to-equal 
orig-point))))
                        (describe "when ignoring time boundaries"
                                (it "does not change spacing between subtitles 
when moving subtitles forward."
                                        (with-temp-srt-buffer
-                                               (insert "1\n"
-                                                                               
"00:00:01,000 --> 00:00:02,000\n"
-                                                                               
"Foo.\n\n"
-                                                                               
"2\n"
-                                                                               
"00:00:10,000 --> 00:00:11,000\n"
-                                                                               
"Bar.\n\n"
-                                                                               
"3\n"
-                                                                               
"00:00:12,000 --> 00:00:13,000\n"
-                                                                               
"Baz.\n")
-                                               (setq mark-active t)
-                                               (spy-on 'region-beginning 
:and-return-value (subed-jump-to-subtitle-id 1))
-                                               (spy-on 'region-end 
:and-return-value (subed-jump-to-subtitle-text 2))
-                                               (let ((orig-point 
(subed-jump-to-subtitle-time-start 1))
-                                                                       
(subed-enforce-time-boundaries nil))
-                                                       
(subed-move-subtitle-forward 2000)
-                                                       (expect 
(subed-subtitle-msecs-start 1) :to-equal 3000)
-                                                       (expect 
(subed-subtitle-msecs-stop 1) :to-equal 4000)
-                                                       (expect 
(subed-subtitle-msecs-start 2) :to-equal 12000)
-                                                       (expect 
(subed-subtitle-msecs-stop 2) :to-equal 13000)
-                                                       (expect 
(subed-subtitle-msecs-start 3) :to-equal 12000)
-                                                       (expect 
(subed-subtitle-msecs-stop 3) :to-equal 13000)
-                                                       (expect (point) 
:to-equal orig-point))))
+                                        (insert "1\n"
+                                                                        
"00:00:01,000 --> 00:00:02,000\n"
+                                                                        
"Foo.\n\n"
+                                                                        "2\n"
+                                                                        
"00:00:10,000 --> 00:00:11,000\n"
+                                                                        
"Bar.\n\n"
+                                                                        "3\n"
+                                                                        
"00:00:12,000 --> 00:00:13,000\n"
+                                                                        
"Baz.\n")
+                                        (setq mark-active t)
+                                        (spy-on 'region-beginning 
:and-return-value (subed-jump-to-subtitle-id 1))
+                                        (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-text 2))
+                                        (let ((orig-point 
(subed-jump-to-subtitle-time-start 1))
+                                                                
(subed-enforce-time-boundaries nil))
+                                                (subed-move-subtitle-forward 
2000)
+                                                (expect 
(subed-subtitle-msecs-start 1) :to-equal 3000)
+                                                (expect 
(subed-subtitle-msecs-stop 1) :to-equal 4000)
+                                                (expect 
(subed-subtitle-msecs-start 2) :to-equal 12000)
+                                                (expect 
(subed-subtitle-msecs-stop 2) :to-equal 13000)
+                                                (expect 
(subed-subtitle-msecs-start 3) :to-equal 12000)
+                                                (expect 
(subed-subtitle-msecs-stop 3) :to-equal 13000)
+                                                (expect (point) :to-equal 
orig-point))))
                                (it "does not change spacing between subtitles 
when moving subtitles backward."
                                        (with-temp-srt-buffer
-                                               (insert (concat "1\n"
-                                                                               
                                "00:00:01,000 --> 00:00:02,000\n"
-                                                                               
                                "Foo.\n\n"
-                                                                               
                                "2\n"
-                                                                               
                                "00:00:03,000 --> 00:00:04,000\n"
-                                                                               
                                "Bar.\n\n"
-                                                                               
                                "3\n"
-                                                                               
                                "00:00:10,000 --> 00:00:11,000\n"
-                                                                               
                                "Baz.\n"))
-                                               (setq mark-active t)
-                                               (spy-on 'region-beginning 
:and-return-value (subed-jump-to-subtitle-id 2))
-                                               (spy-on 'region-end 
:and-return-value (subed-jump-to-subtitle-text 3))
-                                               (let ((orig-point 
(subed-jump-to-subtitle-time-start 2))
-                                                                       
(subed-enforce-time-boundaries nil))
-                                                       
(subed-move-subtitle-backward 1000)
-                                                       (expect 
(subed-subtitle-msecs-start 1) :to-equal 1000)
-                                                       (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2000)
-                                                       (expect 
(subed-subtitle-msecs-start 2) :to-equal 2000)
-                                                       (expect 
(subed-subtitle-msecs-stop 2) :to-equal 3000)
-                                                       (expect 
(subed-subtitle-msecs-start 3) :to-equal 9000)
-                                                       (expect 
(subed-subtitle-msecs-stop 3) :to-equal 10000)
-                                                       (expect (point) 
:to-equal orig-point))))))
+                                        (insert (concat "1\n"
+                                                                               
                         "00:00:01,000 --> 00:00:02,000\n"
+                                                                               
                         "Foo.\n\n"
+                                                                               
                         "2\n"
+                                                                               
                         "00:00:03,000 --> 00:00:04,000\n"
+                                                                               
                         "Bar.\n\n"
+                                                                               
                         "3\n"
+                                                                               
                         "00:00:10,000 --> 00:00:11,000\n"
+                                                                               
                         "Baz.\n"))
+                                        (setq mark-active t)
+                                        (spy-on 'region-beginning 
:and-return-value (subed-jump-to-subtitle-id 2))
+                                        (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-text 3))
+                                        (let ((orig-point 
(subed-jump-to-subtitle-time-start 2))
+                                                                
(subed-enforce-time-boundaries nil))
+                                                (subed-move-subtitle-backward 
1000)
+                                                (expect 
(subed-subtitle-msecs-start 1) :to-equal 1000)
+                                                (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2000)
+                                                (expect 
(subed-subtitle-msecs-start 2) :to-equal 2000)
+                                                (expect 
(subed-subtitle-msecs-stop 2) :to-equal 3000)
+                                                (expect 
(subed-subtitle-msecs-start 3) :to-equal 9000)
+                                                (expect 
(subed-subtitle-msecs-stop 3) :to-equal 10000)
+                                                (expect (point) :to-equal 
orig-point))))))
                ;; What does it mean by not having space left?
     ;; (describe "unless there is no space left"
                ;;      (describe "when moving forward"
@@ -1019,220 +1019,270 @@ Baz.
     (describe "ignoring spacing for non-leading subtitles"
       (it "when moving forward."
         (with-temp-srt-buffer
-                                       (insert (concat "1\n"
-                                                                               
                        "00:00:00,000 --> 00:00:01,000\n"
-                                                                               
                        "Foo.\n\n"
-                                                                               
                        "2\n"
-                                                                               
                        "00:00:01,050 --> 00:00:02,000\n"
-                                                                               
                        "Bar.\n\n"
-                                                                               
                        "3\n"
-                                                                               
                        "00:00:05,000 --> 00:00:6,000\n"
-                                                                               
                        "Baz.\n"))
-                                       (setq mark-active t)
-                                       (spy-on 'region-beginning 
:and-return-value (subed-jump-to-subtitle-id 1))
-                                       (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-text 2))
-                                       (let ((orig-point 
(subed-jump-to-subtitle-time-start 3)))
-                                               (subed-move-subtitle-forward 
1000)
-                                               (expect 
(subed-subtitle-msecs-start 1) :to-equal 1000)
-                                               (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2000)
-                                               (expect 
(subed-subtitle-msecs-start 2) :to-equal 2050)
-                                               (expect 
(subed-subtitle-msecs-stop 2) :to-equal 3000)
-                                               (expect 
(subed-subtitle-msecs-start 3) :to-equal 5000)
-                                               (expect 
(subed-subtitle-msecs-stop 3) :to-equal 6000)
-                                               (expect (point) :to-equal 
orig-point))))
+                                (insert (concat "1\n"
+                                                                               
                 "00:00:00,000 --> 00:00:01,000\n"
+                                                                               
                 "Foo.\n\n"
+                                                                               
                 "2\n"
+                                                                               
                 "00:00:01,050 --> 00:00:02,000\n"
+                                                                               
                 "Bar.\n\n"
+                                                                               
                 "3\n"
+                                                                               
                 "00:00:05,000 --> 00:00:6,000\n"
+                                                                               
                 "Baz.\n"))
+                                (setq mark-active t)
+                                (spy-on 'region-beginning :and-return-value 
(subed-jump-to-subtitle-id 1))
+                                (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-text 2))
+                                (let ((orig-point 
(subed-jump-to-subtitle-time-start 3)))
+                                        (subed-move-subtitle-forward 1000)
+                                        (expect (subed-subtitle-msecs-start 1) 
:to-equal 1000)
+                                        (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2000)
+                                        (expect (subed-subtitle-msecs-start 2) 
:to-equal 2050)
+                                        (expect (subed-subtitle-msecs-stop 2) 
:to-equal 3000)
+                                        (expect (subed-subtitle-msecs-start 3) 
:to-equal 5000)
+                                        (expect (subed-subtitle-msecs-stop 3) 
:to-equal 6000)
+                                        (expect (point) :to-equal 
orig-point))))
       (it "when moving backward."
         (with-temp-srt-buffer
-                                       (insert (concat "1\n"
-                                                                               
                        "00:00:01,000 --> 00:00:02,000\n"
-                                                                               
                        "Foo.\n\n"
-                                                                               
                        "2\n"
-                                                                               
                        "00:00:04,000 --> 00:00:05,000\n"
-                                                                               
                        "Bar.\n\n"
-                                                                               
                        "3\n"
-                                                                               
                        "00:00:05,000 --> 00:00:05,000\n"
-                                                                               
                        "Baz.\n"))
-                                       (setq mark-active t)
-                                       (spy-on 'region-beginning 
:and-return-value (subed-jump-to-subtitle-id 2))
-                                       (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-text 3))
-                                       (let ((orig-point 
(subed-jump-to-subtitle-time-stop 1)))
-                                               (subed-move-subtitle-backward 
1000)
-                                               (expect 
(subed-subtitle-msecs-start 1) :to-equal 1000)
-                                               (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2000)
-                                               (expect 
(subed-subtitle-msecs-start 2) :to-equal 3000)
-                                               (expect 
(subed-subtitle-msecs-stop 2) :to-equal 4000)
-                                               (expect 
(subed-subtitle-msecs-start 3) :to-equal 4000)
-                                               (expect 
(subed-subtitle-msecs-stop 3) :to-equal 4000)
-                                               (expect (point) :to-equal 
orig-point))))
+                                (insert (concat "1\n"
+                                                                               
                 "00:00:01,000 --> 00:00:02,000\n"
+                                                                               
                 "Foo.\n\n"
+                                                                               
                 "2\n"
+                                                                               
                 "00:00:04,000 --> 00:00:05,000\n"
+                                                                               
                 "Bar.\n\n"
+                                                                               
                 "3\n"
+                                                                               
                 "00:00:05,000 --> 00:00:05,000\n"
+                                                                               
                 "Baz.\n"))
+                                (setq mark-active t)
+                                (spy-on 'region-beginning :and-return-value 
(subed-jump-to-subtitle-id 2))
+                                (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-text 3))
+                                (let ((orig-point 
(subed-jump-to-subtitle-time-stop 1)))
+                                        (subed-move-subtitle-backward 1000)
+                                        (expect (subed-subtitle-msecs-start 1) 
:to-equal 1000)
+                                        (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2000)
+                                        (expect (subed-subtitle-msecs-start 2) 
:to-equal 3000)
+                                        (expect (subed-subtitle-msecs-stop 2) 
:to-equal 4000)
+                                        (expect (subed-subtitle-msecs-start 3) 
:to-equal 4000)
+                                        (expect (subed-subtitle-msecs-stop 3) 
:to-equal 4000)
+                                        (expect (point) :to-equal 
orig-point))))
       )
     (describe "ignoring overlapping subtitles"
       (it "when moving forward."
         (with-temp-srt-buffer
-                                       (insert (concat "1\n"
-                                                                               
                        "00:00:01,000 --> 00:00:01,500\n"
-                                                                               
                        "Foo.\n\n"
-                                                                               
                        "2\n"
-                                                                               
                        "00:00:01,300 --> 00:00:02,000\n"
-                                                                               
                        "Bar.\n\n"
-                                                                               
                        "3\n"
-                                                                               
                        "00:00:05,000 --> 00:00:6,000\n"
-                                                                               
                        "Baz.\n"))
-                                       (setq mark-active t)
-                                       (spy-on 'region-beginning 
:and-return-value (subed-jump-to-subtitle-id 1))
-                                       (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-text 2))
-                                       (let ((orig-point 
(subed-jump-to-subtitle-text 2)))
-                                               (subed-move-subtitle-forward 
1000)
-                                               (expect 
(subed-subtitle-msecs-start 1) :to-equal 2000)
-                                               (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2500)
-                                               (expect 
(subed-subtitle-msecs-start 2) :to-equal 2300)
-                                               (expect 
(subed-subtitle-msecs-stop 2) :to-equal 3000)
-                                               (expect 
(subed-subtitle-msecs-start 3) :to-equal 5000)
-                                               (expect 
(subed-subtitle-msecs-stop 3) :to-equal 6000)
-                                               (expect (point) :to-equal 
orig-point))))
+                                (insert (concat "1\n"
+                                                                               
                 "00:00:01,000 --> 00:00:01,500\n"
+                                                                               
                 "Foo.\n\n"
+                                                                               
                 "2\n"
+                                                                               
                 "00:00:01,300 --> 00:00:02,000\n"
+                                                                               
                 "Bar.\n\n"
+                                                                               
                 "3\n"
+                                                                               
                 "00:00:05,000 --> 00:00:6,000\n"
+                                                                               
                 "Baz.\n"))
+                                (setq mark-active t)
+                                (spy-on 'region-beginning :and-return-value 
(subed-jump-to-subtitle-id 1))
+                                (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-text 2))
+                                (let ((orig-point (subed-jump-to-subtitle-text 
2)))
+                                        (subed-move-subtitle-forward 1000)
+                                        (expect (subed-subtitle-msecs-start 1) 
:to-equal 2000)
+                                        (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2500)
+                                        (expect (subed-subtitle-msecs-start 2) 
:to-equal 2300)
+                                        (expect (subed-subtitle-msecs-stop 2) 
:to-equal 3000)
+                                        (expect (subed-subtitle-msecs-start 3) 
:to-equal 5000)
+                                        (expect (subed-subtitle-msecs-stop 3) 
:to-equal 6000)
+                                        (expect (point) :to-equal 
orig-point))))
       (it "when moving backward."
         (with-temp-srt-buffer
-                                       (insert (concat "1\n"
-                                                                               
                        "00:00:01,000 --> 00:00:02,000\n"
-                                                                               
                        "Foo.\n\n"
-                                                                               
                        "2\n"
-                                                                               
                        "00:00:04,500 --> 00:00:04,000\n"
-                                                                               
                        "Bar.\n\n"
-                                                                               
                        "3\n"
-                                                                               
                        "00:00:04,500 --> 00:00:04,490\n"
-                                                                               
                        "Baz.\n"))
-                                       (setq mark-active t)
-                                       (spy-on 'region-beginning 
:and-return-value (subed-jump-to-subtitle-id 2))
-                                       (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-text 3))
-                                       (let ((orig-point 
(subed-jump-to-subtitle-text 1)))
-                                               (subed-move-subtitle-backward 
1000)
-                                               (expect 
(subed-subtitle-msecs-start 1) :to-equal 1000)
-                                               (expect 
(subed-subtitle-msecs-stop 1) :to-equal 2000)
-                                               (expect 
(subed-subtitle-msecs-start 2) :to-equal 3500)
-                                               (expect 
(subed-subtitle-msecs-stop 2) :to-equal 3000)
-                                               (expect 
(subed-subtitle-msecs-start 3) :to-equal 3500)
-                                               (expect 
(subed-subtitle-msecs-stop 3) :to-equal 3490)
-                                               (expect (point) :to-equal 
orig-point))))
+                                (insert (concat "1\n"
+                                                                               
                 "00:00:01,000 --> 00:00:02,000\n"
+                                                                               
                 "Foo.\n\n"
+                                                                               
                 "2\n"
+                                                                               
                 "00:00:04,500 --> 00:00:04,000\n"
+                                                                               
                 "Bar.\n\n"
+                                                                               
                 "3\n"
+                                                                               
                 "00:00:04,500 --> 00:00:04,490\n"
+                                                                               
                 "Baz.\n"))
+                                (setq mark-active t)
+                                (spy-on 'region-beginning :and-return-value 
(subed-jump-to-subtitle-id 2))
+                                (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-text 3))
+                                (let ((orig-point (subed-jump-to-subtitle-text 
1)))
+                                        (subed-move-subtitle-backward 1000)
+                                        (expect (subed-subtitle-msecs-start 1) 
:to-equal 1000)
+                                        (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2000)
+                                        (expect (subed-subtitle-msecs-start 2) 
:to-equal 3500)
+                                        (expect (subed-subtitle-msecs-stop 2) 
:to-equal 3000)
+                                        (expect (subed-subtitle-msecs-start 3) 
:to-equal 3500)
+                                        (expect (subed-subtitle-msecs-stop 3) 
:to-equal 3490)
+                                        (expect (point) :to-equal 
orig-point))))
       )
     (it "ignoring start time being larger than stop time."
       (with-temp-srt-buffer
-                               (insert (concat "1\n"
-                                                                               
                "00:00:01,500 --> 00:00:01,400\n"
-                                                                               
                "Foo.\n\n"
-                                                                               
                "2\n"
-                                                                               
                "00:00:02,500 --> 00:00:02,499\n"
-                                                                               
                "Bar.\n\n"
-                                                                               
                "3\n"
-                                                                               
                "00:00:05,000 --> 00:00:06,000\n"
-                                                                               
                "Bar.\n"))
-                               (setq mark-active t)
-                               (spy-on 'region-beginning :and-return-value 
(subed-jump-to-subtitle-text 1))
-                               (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-time-start 2))
-                               (let ((orig-point 
(subed-jump-to-subtitle-time-stop 1)))
-                                       (subed-move-subtitle-forward 1000)
-                                       (expect (subed-subtitle-msecs-start 1) 
:to-equal 2500)
-                                       (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2400)
-                                       (expect (subed-subtitle-msecs-start 2) 
:to-equal 3500)
-                                       (expect (subed-subtitle-msecs-stop 2) 
:to-equal 3499)
-                                       (expect (subed-subtitle-msecs-start 3) 
:to-equal 5000)
-                                       (expect (subed-subtitle-msecs-stop 3) 
:to-equal 6000)
-                                       (expect (point) :to-equal orig-point)
-                                       (subed-move-subtitle-backward 500)
-                                       (expect (subed-subtitle-msecs-start 1) 
:to-equal 2000)
-                                       (expect (subed-subtitle-msecs-stop 1) 
:to-equal 1900)
-                                       (expect (subed-subtitle-msecs-start 2) 
:to-equal 3000)
-                                       (expect (subed-subtitle-msecs-stop 2) 
:to-equal 2999)
-                                       (expect (subed-subtitle-msecs-start 3) 
:to-equal 5000)
-                                       (expect (subed-subtitle-msecs-stop 3) 
:to-equal 6000)
-                                       (expect (point) :to-equal orig-point))))
+                        (insert (concat "1\n"
+                                                                               
         "00:00:01,500 --> 00:00:01,400\n"
+                                                                               
         "Foo.\n\n"
+                                                                               
         "2\n"
+                                                                               
         "00:00:02,500 --> 00:00:02,499\n"
+                                                                               
         "Bar.\n\n"
+                                                                               
         "3\n"
+                                                                               
         "00:00:05,000 --> 00:00:06,000\n"
+                                                                               
         "Bar.\n"))
+                        (setq mark-active t)
+                        (spy-on 'region-beginning :and-return-value 
(subed-jump-to-subtitle-text 1))
+                        (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-time-start 2))
+                        (let ((orig-point (subed-jump-to-subtitle-time-stop 
1)))
+                                (subed-move-subtitle-forward 1000)
+                                (expect (subed-subtitle-msecs-start 1) 
:to-equal 2500)
+                                (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2400)
+                                (expect (subed-subtitle-msecs-start 2) 
:to-equal 3500)
+                                (expect (subed-subtitle-msecs-stop 2) 
:to-equal 3499)
+                                (expect (subed-subtitle-msecs-start 3) 
:to-equal 5000)
+                                (expect (subed-subtitle-msecs-stop 3) 
:to-equal 6000)
+                                (expect (point) :to-equal orig-point)
+                                (subed-move-subtitle-backward 500)
+                                (expect (subed-subtitle-msecs-start 1) 
:to-equal 2000)
+                                (expect (subed-subtitle-msecs-stop 1) 
:to-equal 1900)
+                                (expect (subed-subtitle-msecs-start 2) 
:to-equal 3000)
+                                (expect (subed-subtitle-msecs-stop 2) 
:to-equal 2999)
+                                (expect (subed-subtitle-msecs-start 3) 
:to-equal 5000)
+                                (expect (subed-subtitle-msecs-stop 3) 
:to-equal 6000)
+                                (expect (point) :to-equal orig-point))))
     (it "ignoring stop time being smaller than start time."
       (with-temp-srt-buffer
-                               (insert (concat "1\n"
-                                                                               
                "00:00:01,000 --> 00:00:02,000\n"
-                                                                               
                "Foo.\n\n"
-                                                                               
                "2\n"
-                                                                               
                "00:00:04,100 --> 00:00:04,099\n"
-                                                                               
                "Bar.\n\n"
-                                                                               
                "3\n"
-                                                                               
                "00:00:05,500 --> 00:00:05,000\n"
-                                                                               
                "Bar.\n"))
-                               (setq mark-active t)
-                               (spy-on 'region-beginning :and-return-value 
(subed-jump-to-subtitle-text 2))
-                               (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-time-start 3))
-                               (let ((orig-point (subed-jump-to-subtitle-text 
1)))
-                                       (subed-move-subtitle-forward 1000)
-                                       (expect (subed-subtitle-msecs-start 1) 
:to-equal 1000)
-                                       (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2000)
-                                       (expect (subed-subtitle-msecs-start 2) 
:to-equal 5100)
-                                       (expect (subed-subtitle-msecs-stop 2) 
:to-equal 5099)
-                                       (expect (subed-subtitle-msecs-start 3) 
:to-equal 6500)
-                                       (expect (subed-subtitle-msecs-stop 3) 
:to-equal 6000)
-                                       (expect (point) :to-equal orig-point)
-                                       (subed-move-subtitle-backward 500)
-                                       (expect (subed-subtitle-msecs-start 1) 
:to-equal 1000)
-                                       (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2000)
-                                       (expect (subed-subtitle-msecs-start 2) 
:to-equal 4600)
-                                       (expect (subed-subtitle-msecs-stop 2) 
:to-equal 4599)
-                                       (expect (subed-subtitle-msecs-start 3) 
:to-equal 6000)
-                                       (expect (subed-subtitle-msecs-stop 3) 
:to-equal 5500)
-                                       (expect (point) :to-equal orig-point))))
+                        (insert (concat "1\n"
+                                                                               
         "00:00:01,000 --> 00:00:02,000\n"
+                                                                               
         "Foo.\n\n"
+                                                                               
         "2\n"
+                                                                               
         "00:00:04,100 --> 00:00:04,099\n"
+                                                                               
         "Bar.\n\n"
+                                                                               
         "3\n"
+                                                                               
         "00:00:05,500 --> 00:00:05,000\n"
+                                                                               
         "Bar.\n"))
+                        (setq mark-active t)
+                        (spy-on 'region-beginning :and-return-value 
(subed-jump-to-subtitle-text 2))
+                        (spy-on 'region-end :and-return-value 
(subed-jump-to-subtitle-time-start 3))
+                        (let ((orig-point (subed-jump-to-subtitle-text 1)))
+                                (subed-move-subtitle-forward 1000)
+                                (expect (subed-subtitle-msecs-start 1) 
:to-equal 1000)
+                                (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2000)
+                                (expect (subed-subtitle-msecs-start 2) 
:to-equal 5100)
+                                (expect (subed-subtitle-msecs-stop 2) 
:to-equal 5099)
+                                (expect (subed-subtitle-msecs-start 3) 
:to-equal 6500)
+                                (expect (subed-subtitle-msecs-stop 3) 
:to-equal 6000)
+                                (expect (point) :to-equal orig-point)
+                                (subed-move-subtitle-backward 500)
+                                (expect (subed-subtitle-msecs-start 1) 
:to-equal 1000)
+                                (expect (subed-subtitle-msecs-stop 1) 
:to-equal 2000)
+                                (expect (subed-subtitle-msecs-start 2) 
:to-equal 4600)
+                                (expect (subed-subtitle-msecs-stop 2) 
:to-equal 4599)
+                                (expect (subed-subtitle-msecs-start 3) 
:to-equal 6000)
+                                (expect (subed-subtitle-msecs-stop 3) 
:to-equal 5500)
+                                (expect (point) :to-equal orig-point))))
     (it "disables subtitle replay while moving subtitles."
       (with-temp-srt-buffer
-                               (insert mock-srt-data)
-                               (subed-enable-replay-adjusted-subtitle :quiet)
-                               (spy-on 'subed-enable-replay-adjusted-subtitle 
:and-call-through)
-                               (spy-on 'subed-disable-replay-adjusted-subtitle 
:and-call-through)
-                               (spy-on 'subed-adjust-subtitle-time-start 
:and-call-fake
-                                                               (lambda (msecs 
&optional a b) (expect (subed-replay-adjusted-subtitle-p) :to-be nil)))
-                               (spy-on 'subed-adjust-subtitle-stop 
:and-call-fake
-                                                               (lambda (msecs 
&optional a b) (expect (subed-replay-adjusted-subtitle-p) :to-be nil)))
-                               (subed-move-subtitle-forward 100)
-                               (expect 'subed-disable-replay-adjusted-subtitle 
:to-have-been-called-times 1)
-                               (expect 'subed-enable-replay-adjusted-subtitle 
:to-have-been-called-times 1)
-                               (subed-move-subtitle-backward 100)
-                               (expect 'subed-disable-replay-adjusted-subtitle 
:to-have-been-called-times 2)
-                               (expect 'subed-enable-replay-adjusted-subtitle 
:to-have-been-called-times 2)))
+                        (insert mock-srt-data)
+                        (subed-enable-replay-adjusted-subtitle :quiet)
+                        (spy-on 'subed-enable-replay-adjusted-subtitle 
:and-call-through)
+                        (spy-on 'subed-disable-replay-adjusted-subtitle 
:and-call-through)
+                        (spy-on 'subed-adjust-subtitle-time-start 
:and-call-fake
+                                                        (lambda (msecs 
&optional a b) (expect (subed-replay-adjusted-subtitle-p) :to-be nil)))
+                        (spy-on 'subed-adjust-subtitle-stop :and-call-fake
+                                                        (lambda (msecs 
&optional a b) (expect (subed-replay-adjusted-subtitle-p) :to-be nil)))
+                        (subed-move-subtitle-forward 100)
+                        (expect 'subed-disable-replay-adjusted-subtitle 
:to-have-been-called-times 1)
+                        (expect 'subed-enable-replay-adjusted-subtitle 
:to-have-been-called-times 1)
+                        (subed-move-subtitle-backward 100)
+                        (expect 'subed-disable-replay-adjusted-subtitle 
:to-have-been-called-times 2)
+                        (expect 'subed-enable-replay-adjusted-subtitle 
:to-have-been-called-times 2)))
     (it "does not enable subtitle replay afterwards if it is disabled."
       (with-temp-srt-buffer
-                               (insert mock-srt-data)
-                               (subed-disable-replay-adjusted-subtitle :quiet)
-                               (spy-on 'subed-enable-replay-adjusted-subtitle 
:and-call-through)
-                               (spy-on 'subed-disable-replay-adjusted-subtitle 
:and-call-through)
-                               (spy-on 'subed-adjust-subtitle-time-start 
:and-call-fake
-                                                               (lambda (msecs 
&optional a b) (expect (subed-replay-adjusted-subtitle-p) :to-be nil)))
-                               (spy-on 'subed-adjust-subtitle-stop 
:and-call-fake
-                                                               (lambda (msecs 
&optional a b) (expect (subed-replay-adjusted-subtitle-p) :to-be nil)))
-                               (subed-move-subtitle-forward 100)
-                               (expect 'subed-disable-replay-adjusted-subtitle 
:to-have-been-called-times 1)
-                               (expect 'subed-enable-replay-adjusted-subtitle 
:to-have-been-called-times 0)
-                               (subed-move-subtitle-backward 100)
-                               (expect 'subed-disable-replay-adjusted-subtitle 
:to-have-been-called-times 2)
-                               (expect 'subed-enable-replay-adjusted-subtitle 
:to-have-been-called-times 0)))
+                        (insert mock-srt-data)
+                        (subed-disable-replay-adjusted-subtitle :quiet)
+                        (spy-on 'subed-enable-replay-adjusted-subtitle 
:and-call-through)
+                        (spy-on 'subed-disable-replay-adjusted-subtitle 
:and-call-through)
+                        (spy-on 'subed-adjust-subtitle-time-start 
:and-call-fake
+                                                        (lambda (msecs 
&optional a b) (expect (subed-replay-adjusted-subtitle-p) :to-be nil)))
+                        (spy-on 'subed-adjust-subtitle-stop :and-call-fake
+                                                        (lambda (msecs 
&optional a b) (expect (subed-replay-adjusted-subtitle-p) :to-be nil)))
+                        (subed-move-subtitle-forward 100)
+                        (expect 'subed-disable-replay-adjusted-subtitle 
:to-have-been-called-times 1)
+                        (expect 'subed-enable-replay-adjusted-subtitle 
:to-have-been-called-times 0)
+                        (subed-move-subtitle-backward 100)
+                        (expect 'subed-disable-replay-adjusted-subtitle 
:to-have-been-called-times 2)
+                        (expect 'subed-enable-replay-adjusted-subtitle 
:to-have-been-called-times 0)))
     (it "seeks player to current subtitle if region is not active."
       (with-temp-srt-buffer
-                               (insert mock-srt-data)
-                               (spy-on 'subed-replay-adjusted-subtitle-p 
:and-return-value t)
-                               (spy-on 'subed-mpv-jump)
-                               (subed-move-subtitle-forward 100)
-                               (expect 'subed-mpv-jump 
:to-have-been-called-times 1)
-                               (expect 'subed-mpv-jump 
:to-have-been-called-with 183550)
-                               (subed-move-subtitle-backward 200)
-                               (expect 'subed-mpv-jump 
:to-have-been-called-times 2)
-                               (expect 'subed-mpv-jump 
:to-have-been-called-with 183350)))
+                        (insert mock-srt-data)
+                        (spy-on 'subed-replay-adjusted-subtitle-p 
:and-return-value t)
+                        (spy-on 'subed-mpv-jump)
+                        (subed-move-subtitle-forward 100)
+                        (expect 'subed-mpv-jump :to-have-been-called-times 1)
+                        (expect 'subed-mpv-jump :to-have-been-called-with 
183550)
+                        (subed-move-subtitle-backward 200)
+                        (expect 'subed-mpv-jump :to-have-been-called-times 2)
+                        (expect 'subed-mpv-jump :to-have-been-called-with 
183350)))
     (it "seeks player to first subtitle in active region."
       (with-temp-srt-buffer
-                               (insert mock-srt-data)
-                               (let ((beg 15)
-                                                       (end (point-max)))
-                                       (setq mark-active t)
-                                       (spy-on 'region-beginning 
:and-return-value beg)
-                                       (spy-on 'region-end :and-return-value 
end)
-                                       (spy-on 
'subed-replay-adjusted-subtitle-p :and-return-value t)
-                                       (spy-on 'subed-mpv-jump)
-                                       (subed-move-subtitle-forward 100)
-                                       (expect 'subed-mpv-jump 
:to-have-been-called-times 1)
-                                       (expect 'subed-mpv-jump 
:to-have-been-called-with '61100)
-                                       (subed-move-subtitle-backward 300)
-                                       (expect 'subed-mpv-jump 
:to-have-been-called-times 2)
-                                       (expect 'subed-mpv-jump 
:to-have-been-called-with '60800)))))
+                        (insert mock-srt-data)
+                        (let ((beg 15)
+                                                (end (point-max)))
+                                (setq mark-active t)
+                                (spy-on 'region-beginning :and-return-value 
beg)
+                                (spy-on 'region-end :and-return-value end)
+                                (spy-on 'subed-replay-adjusted-subtitle-p 
:and-return-value t)
+                                (spy-on 'subed-mpv-jump)
+                                (subed-move-subtitle-forward 100)
+                                (expect 'subed-mpv-jump 
:to-have-been-called-times 1)
+                                (expect 'subed-mpv-jump 
:to-have-been-called-with '61100)
+                                (subed-move-subtitle-backward 300)
+                                (expect 'subed-mpv-jump 
:to-have-been-called-times 2)
+                                (expect 'subed-mpv-jump 
:to-have-been-called-with '60800))))
+    (describe "to a specified start timestamp"
+      (describe "when focusing on the current subtitle"
+        (it "adjusts start and stop time by the same amount."
+          (with-temp-srt-buffer
+           (insert mock-srt-data)
+           (subed-jump-to-subtitle-text 2)
+           (subed-move-subtitles-to-start-at-timestamp "00:02:02,334" nil nil)
+           (expect (subed-subtitle-msecs-start 1) :to-equal 
(subed-timestamp-to-msecs "00:01:01,000"))
+           (expect (subed-subtitle-msecs-stop 1) :to-equal 
(subed-timestamp-to-msecs "00:01:05,123"))
+           (expect (subed-subtitle-msecs-start 2) :to-equal 
(subed-timestamp-to-msecs "00:02:02,334"))
+           (expect (subed-subtitle-msecs-stop 2) :to-equal 
(subed-timestamp-to-msecs "00:02:10,445"))
+           (expect (subed-subtitle-msecs-start 3) :to-equal 
(subed-timestamp-to-msecs "00:03:03,450"))
+           (expect (subed-subtitle-msecs-stop 3) :to-equal 
(subed-timestamp-to-msecs "00:03:15,500")))))
+      (describe "when moving current and following subtitles"
+        (it "adjusts start and stop time by the same amount."
+          (with-temp-srt-buffer
+           (insert mock-srt-data)
+           (subed-jump-to-subtitle-text 2)
+           (subed-move-subtitles-to-start-at-timestamp "00:02:02,334" (point) 
(point-max))
+           (expect (subed-subtitle-msecs-start 1) :to-equal 
(subed-timestamp-to-msecs "00:01:01,000"))
+           (expect (subed-subtitle-msecs-stop 1) :to-equal 
(subed-timestamp-to-msecs "00:01:05,123"))
+           (expect (subed-subtitle-msecs-start 2) :to-equal 
(subed-timestamp-to-msecs "00:02:02,334"))
+           (expect (subed-subtitle-msecs-stop 2) :to-equal 
(subed-timestamp-to-msecs "00:02:10,445"))
+           (expect (subed-subtitle-msecs-start 3) :to-equal 
(subed-timestamp-to-msecs "00:03:03,550"))
+           (expect (subed-subtitle-msecs-stop 3) :to-equal 
(subed-timestamp-to-msecs "00:03:15,600")))))))
+  (describe "Shifting"
+    (describe "by an msec offset"
+      (it "adjusts start and stop time by the same amount."
+        (with-temp-srt-buffer
+         (insert mock-srt-data)
+         (subed-jump-to-subtitle-text 2)
+         (subed-shift-subtitles 100)
+         (expect (subed-subtitle-msecs-start 1) :to-equal 
(subed-timestamp-to-msecs "00:01:01,000"))
+         (expect (subed-subtitle-msecs-stop 1) :to-equal 
(subed-timestamp-to-msecs "00:01:05,123"))
+         (expect (subed-subtitle-msecs-start 2) :to-equal 
(subed-timestamp-to-msecs "00:02:02,334"))
+         (expect (subed-subtitle-msecs-stop 2) :to-equal 
(subed-timestamp-to-msecs "00:02:10,445"))
+         (expect (subed-subtitle-msecs-start 3) :to-equal 
(subed-timestamp-to-msecs "00:03:03,550"))
+         (expect (subed-subtitle-msecs-stop 3) :to-equal 
(subed-timestamp-to-msecs "00:03:15,600")))))
+    (describe "to a specified start timestamp"
+      (it "adjusts start and stop time by the same amount."
+        (with-temp-srt-buffer
+         (insert mock-srt-data)
+         (subed-jump-to-subtitle-text 2)
+         (subed-shift-subtitles-to-start-at-timestamp "00:02:02,334")
+         (expect (subed-subtitle-msecs-start 1) :to-equal 
(subed-timestamp-to-msecs "00:01:01,000"))
+         (expect (subed-subtitle-msecs-stop 1) :to-equal 
(subed-timestamp-to-msecs "00:01:05,123"))
+         (expect (subed-subtitle-msecs-start 2) :to-equal 
(subed-timestamp-to-msecs "00:02:02,334"))
+         (expect (subed-subtitle-msecs-stop 2) :to-equal 
(subed-timestamp-to-msecs "00:02:10,445"))
+         (expect (subed-subtitle-msecs-start 3) :to-equal 
(subed-timestamp-to-msecs "00:03:03,550"))
+         (expect (subed-subtitle-msecs-stop 3) :to-equal 
(subed-timestamp-to-msecs "00:03:15,600"))))))
 
   (describe "Inserting evenly spaced"
     (describe "in an empty buffer,"



reply via email to

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