Talk page | https://emacsconf.org/2020/schedule/01 |
Contact | Sacha Chua sacha@sachachua.com |
Video with subtitles | emacs-conf-2020-emacs-news-highlights-sacha-chua.webm |
Audio only | audio.ogg |
0:00:20 | ![]() |
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 | ![]() |
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 | ![]() |
0:00:32 | and John Wiegley’s development update tomorrow |
0:00:34 | will probably give more details. |
0:00:35 | ![]() |
0:00:36 | ![]() |
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 | ![]() |
0:00:48 | To learn more, check out the Bringing GNU Emacs to Native Code |
0:00:50 | presentation from the European Lisp Symposium. |
0:00:54 | ![]() |
0:00:55 | ![]() |
0:00:55 | There was a huge conversation about |
0:00:56 | modernizing Emacs on emacs-devel and other places. |
0:00:59 | ![]() |
0:00:59 | Linux Weekly News has a good summary. |
0:01:02 | ![]() |
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 | ![]() |
https://github.com/rougier/elegant-emacs | |
0:01:18 | but starter kits and configuration give people |
0:01:21 | a great way to experiment. |
0:01:21 | ![]() |
0:01:22 | ![]() |
0:01:22 | Speaking of starter kits, |
0:01:24 | Doom Emacs seems to be growing in popularity. |
0:01:27 | ![]() |
0:01:27 | It got a big boost thanks to DoomCasts and |
0:01:28 | ![]() |
0:01:28 | DistroTube videos. So if you’re curious, |
0:01:32 | go ahead and check those out. |
0:01:34 | ![]() |
0:01:35 | ![]() |
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. |
0:01:44 | ![]() |
0:01:45 | ![]() |
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 | ![]() |
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 | ![]() |
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 | ![]() |
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 | ![]() |
0:02:09 | Check these screenshots out for some ideas. |
https://www.reddit.com/r/emacs/comments/iemo44/wysiwygified_org_mode/ |
0:02:11 | ![]() |
0:02:12 | ![]() |
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 | ![]() |
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. |
0:02:25 | ![]() |
0:02:26 | ![]() |
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 | ![]() |
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. |
0:02:41 | ![]() |
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 | ![]() |
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 | ![]() |
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 | ![]() |
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 | ![]() |
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. |
0:03:26 | ![]() |
0:03:27 | ![]() |
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 | ![]() |
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 | ![]() |
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 | ![]() |
0:03:55 | Now on to the rest of EmacsConf! |
0:03:57 | Have fun, and thanks for joining us! |
0:03:59 | ![]() |
0:03:49 | Have fun, and thanks for joining us! |
- 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)
- Not yet, although https://www.emacswiki.org/emacs/Usergroups is a start
- Additional meetup (French): https://www.emacs-doctor.com/emacs-paris-user-group/
- Please make your big blue button full screen. +1
- Super happy with emacs!
- 🤞 maybe next time we’ll be taking notes with crdt.el (https://code.librehq.com/qhong/crdt.el) +1
- super solid video, loved the baked captions +1+1
- https://github.com/sachac/emacsconf-2020-emacs-news-highlights <- The talk
(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))
(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