Emacs News Highlights

Emacs News Highlights

Talk

Intro

0:00:00 title.png
0:00:00 I'm Sacha Chua, and welcome to EmacsConf 2020.
0:00:04 To kick things off, here are ten cool things
0:00:07 that people have been working on
0:00:08 since the conference last year.
0:00:10 If you want to follow the links
0:00:11 or if you'd like to add something I've missed,
0:00:14 add them to the collaborative pad
0:00:16 if you're watching this live
0:00:17 or check out the EmacsConf wiki page for this talk.
0:00:19 1.png

1. Emacs 27.1

0:00:20 emacs27-1.png
0:00:20 The big news this year was the release of Emacs 27.1,
0:00:24 a little over two years after Emacs 26.
0:00:27 release-notes.png
0:00:27 Mickey Petersen's notes on the release are a great way
0:00:31 to find out what's new,
0:00:32 emacs-dev-update.png
0:00:32 and John Wiegley's development update tomorrow
0:00:34 will probably give more details.

2. Performance

0:00:35 2.png
0:00:36 gcc-emacs.png
0:00:36 What's coming up for Emacs 28 and beyond?
0:00:39 One of the branches that people are
0:00:40 excited about is gccemacs, which compiles
0:00:44 Emacs Lisp to native code so that it runs faster.
0:00:48 gcc-video.png
0:00:48 To learn more, check out the Bringing GNU Emacs to Native Code
0:00:50 presentation from the European Lisp Symposium.

3. Modernization: behaviour and appearance

0:00:54 3.png
0:00:55 modernization.png
0:00:55 There was a huge conversation about
0:00:56 modernizing Emacs on emacs-devel and other places.
0:00:59 lwn.png
0:00:59 Linux Weekly News has a good summary.
0:01:02 variable-width.png
0:01:02 One of the interesting sub-threads on emacs-devel
0:01:04 was about using more variable-width fonts,
0:01:06 which would probably go a long way to
0:01:08 making Emacs look pretty fancy once people
0:01:11 sort out the alignment issues.
0:01:13 It looks like core Emacs will probably
0:01:15 change slowly in terms of functionality and documentation,
0:01:18 elegant-emacs.png
  https://github.com/rougier/elegant-emacs
0:01:18 but starter kits and configuration give people
0:01:21 a great way to experiment.

4. Doom Emacs

0:01:21 4.png
0:01:22 doom-emacs.png
0:01:22 Speaking of starter kits,
0:01:24 Doom Emacs seems to be growing in popularity.
0:01:27 doomcasts.png
0:01:27 It got a big boost thanks to DoomCasts and
0:01:28 distrotube.png
0:01:28 DistroTube videos. So if you're curious,
0:01:32 go ahead and check those out.

5. Other videos

0:01:34 5.png
0:01:35 videos.png
0:01:35 And for general Emacs topics,
0:01:37 there have been a ton of other great videos
0:01:38 from Protesilaos Stavrou, Mike Zamansky, System Crafters,
0:01:42 and other folks. Good stuff.

6. Org Mode

0:01:44 6.png
0:01:45 org-mode.png
0:01:45 Org continues to be a big reason
0:01:46 for people to get into Emacs.
0:01:48 This year, Zettelkasten-based workflows
0:01:50 became popular as people played around
0:01:52 with organizing ideas into small chunks
0:01:55 that are linked to each other.
0:01:57 org-roam.png
0:01:57 org-roam is one of the packages for doing that
0:01:59 and there are three presentations about it this year.
0:02:02 zettelkasten-discussion.png
0:02:02 There are also non-Org ways to do it,
0:02:04 such as zetteldeft, neuron-mode, and more.
0:02:07 org-appearance-agenda.png
  https://www.reddit.com/r/emacs/comments/hnf3cw/my_orgmode_agenda_much_better_now_with_category/
0:02:07 People have been experimenting
0:02:08 with Org's appearance.
0:02:09 org-appearance-wysiwyg.png
0:02:09 Check these screenshots out for some ideas.
  https://www.reddit.com/r/emacs/comments/iemo44/wysiwygified_org_mode/

7. Coding: LSP-mode

0:02:11 7.png
0:02:12 json.png
0:02:12 Coding: Faster JSON processing
0:02:14 is going to make working with
0:02:15 code analysis tools better.
0:02:17 lsp.png
0:02:17 LSP-mode released version 7 and gained more contributors, too,
0:02:21 so there are probably exciting times ahead
0:02:23 for making Emacs even more of an
0:02:24 integrated development environment.

8. EAF

0:02:25 8.png
0:02:26 eaf.png
0:02:26 EAF: The Emacs Application Framework
0:02:30 has some pretty interesting demos of
0:02:32 embedded Qt programs in Emacs on Linux.
0:02:34 eaf-talk.png
0:02:34 Matthew Zeng will give a presentation
0:02:37 on its architecture and walk through some demos,
0:02:39 so check that one out too if you want.

9. Virtual meetups

0:02:41 9.png
0:02:41 The big real-world change this year
0:02:43 was COVID-19, of course. It sucks. A lot.
0:02:47 One good thing that's come out of it
0:02:49 is that many Emacs meetups have moved online,
0:02:52 so it's easier to connect with people
0:02:54 no matter where you are in the world.
0:02:56 meetup-atx.png
0:02:56 There's one hosted by EmacsATX on December 2
0:03:01 and it's about re-builder, leaf, and feather.
0:03:03 meetup-nyc.png
0:03:03 EmacsNYC's next meetup is on December 7
0:03:06 and it's about literate programming with Org Mode.
0:03:08 meetup-berlin.png
0:03:08 The Berlin remote meetup was
0:03:10 just a few days ago on November 25,
0:03:12 and EmacsSF and Asia-Pacific
0:03:15 probably have some coming up, too.
0:03:17 meetups.png
0:03:17 People generally announce the meetups
0:03:18 on reddit.com/r/emacs, so you can
0:03:21 look there for updates.
0:03:23 If you organize one of these,
0:03:24 please let me know so that
0:03:25 I can include it in Emacs News.

10. Survey

0:03:26 10.png
0:03:27 survey.png
0:03:28 Lastly, there's an unofficial survey of the Emacs community.
0:03:31 It closes on November 30,
0:03:33 so if you'd like to participate,
0:03:34 you can fill out the form at emacssurvey.org
0:03:37 or send it in via e-mail.
0:03:39 summary.png
0:03:39 So those were 10 quick highlights from this year.
0:03:42 If you're curious, check out the EmacsConf 2020 wiki page
0:03:46 for this talk so that you can follow the links.
0:03:47 emacs-news.png
0:03:47 If you'd like to get updates every week,
0:03:49 you can check out the Emacs News I put together.
0:03:52 Feel free to send me cool stuff to include.
0:03:55 emacsconf.png
0:03:55 Now on to the rest of EmacsConf!
0:03:57 Have fun, and thanks for joining us!
0:03:59 emacsconf.png
0:03:49 Have fun, and thanks for joining us!

Code

Generate subtitles

    (defun my/emms-insert-timestamp ()
      (interactive)
      (when (looking-at "[0-9]:[0-9][0-9]:[0-9][0-9] ")
        (replace-match ""))
      (insert
       (format "%d:%02d:%02d "
               (/ emms-playing-time 3600)
               (% (/ emms-playing-time 60) 60)
               (% emms-playing-time 60)))
      (forward-line)
      (beginning-of-line)
      (skip-chars-forward "| "))
  ;; (progn (require 'emms-setup) (emms-all) (emms-default-players))
  ;; (global-set-key (kbd "<f5>") 'my/emms-insert-timestamp)
  ;; (global-set-key (kbd "<f6>") 'emms-pause)
    (defun my/get-timestamp-lines ()
      (save-excursion
        (goto-char (point-min))
        (let (temp result)
          (while (re-search-forward "^ *|? *\\(\\([0-9]\\):\\([0-9][0-9]\\):\\([0-9][0-9]\\)\\) *|? *\\(.*?\\) *|?$" nil t)
            (setq temp (cons (list :time
                                   (+
                                    (* 60 60 (string-to-number (match-string 2)))
                                    (* 60 (string-to-number (match-string 3)))
                                    (string-to-number (match-string 4)))
                                   :start-ts (match-string 1)
                                   :raw (match-string 5)
                                   :text (replace-regexp-in-string
                                          "\\[\\|\\]\\| (<.*?>)" ""
                                          (save-match-data (org-export-string-as (save-match-data (match-string 5)) 'ascii t))))
                             temp)))
          (reverse temp))))
  (defun my/calculate-duration-and-end-ts (temp)
    (loop for i below (1- (length temp)) do
          (plist-put (elt temp i) :end-ts (plist-get (elt temp (1+ i)) :start-ts))
          (plist-put (elt temp i) :duration (- (plist-get (elt temp (1+ i)) :time) (plist-get (elt temp i) :time))))
    temp)

    (defun my/generate-subtitles (lines)
      (interactive (list (my/get-timestamp-lines)))
      (save-excursion
        (goto-char (point-min))
        (let ((temp
               (my/calculate-duration-and-end-ts
                (seq-remove (lambda (o) (string-match "file:" (plist-get o :raw)))
                            lines))))
          (with-current-buffer (find-file "subtitles.srt")
            (erase-buffer)
            (insert
             (s-join ""
                     (loop for i below (1- (length temp)) collect
                           (format "%d\n%s,000 --> %s,000\n%s\n\n"
                                   (1+ i)
                                   (plist-get (elt temp i) :start-ts)
                                   (plist-get (elt temp i) :end-ts)
                                   (plist-get (elt temp i) :text)))))
            (save-buffer)))))
(my/generate-subtitles (my/get-timestamp-lines))

Generate the presentation using the timestamps and linked images

(defun my/include-subtitles ()
  (interactive)
  "ffmpeg -y -i with-audio.webm -i subtitles.srt -c:v copy -c:a copy emacs-conf-2020-emacs-news-highlights-sacha-chua.webm")

(defun my/generate-video (lines audio)
  (interactive (list (my/get-timestamp-lines) "run"))
  (let ((result (my/calculate-duration-and-end-ts
                 (seq-filter (lambda (o) (string-match "file:" (plist-get o :raw)))
                             lines)))
        output)
    ;;      (setq result (seq-take result 5))
    (setq output (format "ffmpeg -y %s -i %s -filter_complex \"%s;%sconcat=n=%d:v=1[v]\" -map '[v]' -map %d:a -shortest -vsync 1 -c:a copy -c:v vp8 with-audio.webm"
                         (mapconcat (lambda (o)
                                      (if (string-match "file:\\([^]]+*\\)" (plist-get o :raw))
                                          (format "-loop 1 -t %d -framerate 5 -i '%s'"
                                                  (or (plist-get o :duration) 0)
                                                  (match-string 1 (plist-get o :raw))))) result " \\\n")
                         audio
                         (s-join ";"
                                 (loop for i below (1- (length result)) collect
                                       (format "[%d:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r%d]" i i)))
                         (s-join ""
                                 (loop for i below (1- (length result)) collect 
                                       (format "[r%d]" i)))
                         (1- (length result))
                         (length result)))
    output))
(let ((lines (my/get-timestamp-lines)))
  ;(my/generate-subtitles lines)
  (funcall
     (cdr (assoc run '(("copy" . kill-new) ("show" . identity) ("run" . shell-command))))
     (concat (my/generate-video lines audio)
             ";" (my/include-subtitles))))
Back to top | E-mail me