Skip to content

sachac/emacsconf-2020-emacs-news-highlights

Repository files navigation

Emacs News Highlights

Talk pagehttps://emacsconf.org/2020/schedule/01
ContactSacha Chua sacha@sachachua.com
Video with subtitlesemacs-conf-2020-emacs-news-highlights-sacha-chua.webm
Audio onlyaudio.ogg

Talk

Intro

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

1. Emacs 27.1

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

2. Performance

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

3. Modernization: behaviour and appearance

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

4. Doom Emacs

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

5. Other videos

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

6. Org Mode

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

7. Coding: LSP-mode

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

8. EAF

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

9. Virtual meetups

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

10. Survey

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

Additional notes from the pad

Questions

Any news about guile-on-emacs? Is it a dead project?

  • Haven’t been linking to things about it lately. Last major news was https://emacsninja.com/posts/state-of-emacs-lisp-on-guile.html (May), I think
  • The only contributor to it occasionally shows up on #emacs, they revealed they’ve been busy programming for a living to improve browser JS engines and would need funding to do further Guile Emacs work (like, 10$ monthly from a few dozen people on Patreon or so)

Is there some kind of online summary page of Emacs community meetups and events?

Notes

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))))
             "\n")
            (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))))
ffmpeg -y -loop 1 -t 19 -framerate 5 -i 'images/title.png' \
-loop 1 -t 1 -framerate 5 -i 'images/1.png' \
-loop 1 -t 7 -framerate 5 -i 'images/emacs27-1.png' \
-loop 1 -t 5 -framerate 5 -i 'images/release-notes.png' \
-loop 1 -t 3 -framerate 5 -i 'images/emacs-dev-update.png' \
-loop 1 -t 1 -framerate 5 -i 'images/2.png' \
-loop 1 -t 12 -framerate 5 -i 'images/gcc-emacs.png' \
-loop 1 -t 6 -framerate 5 -i 'images/gcc-video.png' \
-loop 1 -t 1 -framerate 5 -i 'images/3.png' \
-loop 1 -t 4 -framerate 5 -i 'images/modernization.png' \
-loop 1 -t 3 -framerate 5 -i 'images/lwn.png' \
-loop 1 -t 16 -framerate 5 -i 'images/variable-width.png' \
-loop 1 -t 3 -framerate 5 -i 'images/elegant-emacs.png' \
-loop 1 -t 1 -framerate 5 -i 'images/4.png' \
-loop 1 -t 5 -framerate 5 -i 'images/doom-emacs.png' \
-loop 1 -t 1 -framerate 5 -i 'images/doomcasts.png' \
-loop 1 -t 6 -framerate 5 -i 'images/distrotube.png' \
-loop 1 -t 1 -framerate 5 -i 'images/5.png' \
-loop 1 -t 9 -framerate 5 -i 'images/videos.png' \
-loop 1 -t 1 -framerate 5 -i 'images/6.png' \
-loop 1 -t 12 -framerate 5 -i 'images/org-mode.png' \
-loop 1 -t 5 -framerate 5 -i 'images/org-roam.png' \
-loop 1 -t 5 -framerate 5 -i 'images/zettelkasten-discussion.png' \
-loop 1 -t 2 -framerate 5 -i 'images/org-appearance-agenda.png' \
-loop 1 -t 2 -framerate 5 -i 'images/org-appearance-wysiwyg.png' \
-loop 1 -t 1 -framerate 5 -i 'images/7.png' \
-loop 1 -t 5 -framerate 5 -i 'images/json.png' \
-loop 1 -t 8 -framerate 5 -i 'images/lsp.png' \
-loop 1 -t 1 -framerate 5 -i 'images/8.png' \
-loop 1 -t 8 -framerate 5 -i 'images/eaf.png' \
-loop 1 -t 7 -framerate 5 -i 'images/eaf-talk.png' \
-loop 1 -t 15 -framerate 5 -i 'images/9.png' \
-loop 1 -t 7 -framerate 5 -i 'images/meetup-atx.png' \
-loop 1 -t 5 -framerate 5 -i 'images/meetup-nyc.png' \
-loop 1 -t 9 -framerate 5 -i 'images/meetup-berlin.png' \
-loop 1 -t 9 -framerate 5 -i 'images/meetups.png' \
-loop 1 -t 1 -framerate 5 -i 'images/10.png' \
-loop 1 -t 12 -framerate 5 -i 'images/survey.png' \
-loop 1 -t 8 -framerate 5 -i 'images/summary.png' \
-loop 1 -t 8 -framerate 5 -i 'images/emacs-news.png' \
-loop 1 -t 4 -framerate 5 -i 'images/emacsconf.png' \
-loop 1 -t 0 -framerate 5 -i 'images/emacsconf.png' -i audio.ogg -filter_complex "[0:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r0];[1:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r1];[2:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r2];[3:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r3];[4:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r4];[5:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r5];[6:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r6];[7:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r7];[8:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r8];[9:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r9];[10:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r10];[11:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r11];[12:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r12];[13:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r13];[14:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r14];[15:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r15];[16:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r16];[17:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r17];[18:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r18];[19:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r19];[20:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r20];[21:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r21];[22:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r22];[23:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r23];[24:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r24];[25:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r25];[26:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r26];[27:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r27];[28:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r28];[29:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r29];[30:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r30];[31:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r31];[32:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r32];[33:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r33];[34:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r34];[35:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r35];[36:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r36];[37:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r37];[38:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r38];[39:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r39];[40:v]scale=1280:720:force_original_aspect_ratio=decrease,setsar=sar=1,pad=1280:720:(ow-iw)/2:(oh-ih)/2[r40];[r0][r1][r2][r3][r4][r5][r6][r7][r8][r9][r10][r11][r12][r13][r14][r15][r16][r17][r18][r19][r20][r21][r22][r23][r24][r25][r26][r27][r28][r29][r30][r31][r32][r33][r34][r35][r36][r37][r38][r39][r40]concat=n=41:v=1[v]" -map '[v]' -map 42:a -shortest -vsync 1 -c:a copy -c:v vp8 with-audio.webm;ffmpeg -y -i with-audio.webm -i subtitles.srt -c:v copy -c:a copy emacs-conf-2020-emacs-news-highlights-sacha-chua.webm

About

Emacs News Highlights talk for EmacsConf 2020

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published