Dear all,

Here are the meetup notes.

TL;DR: whisper.el + org-capture; multi-line table cells; page-view package;
"double-capture" meeting notes workflow; export flow; performance of Org export.

- As usual, we started from Emacs News
  https://sachachua.com/blog/2025/12/2025-12-08-emacs-news/
- I had some connection issues at the beginning. Had to re-connect and
  switch to mobile network.
- Sacha shared her current tinkering with making use of whisper.el to
  quickly record org-capture notes
  - She ideally wants to use streaming to get things typed as she talks
    - https://github.com/ufal/SimulStreaming/tree/main/whisper_streaming
    - Ihor: There is also built-in streaming, but my personal experience
      is not great with it (quality of recognition drops)
  - One of the problems with non-streaming is that it is quite slow
    - We quickly figured that setting ~whisper-use-threads~
      can help a lot. The default is using no more than 4
      cores. Ramping it up to something closer to what CPU can handle
      can speed up recognition to levels that are comfortable.
    - In theory, one may also use GPU for even better performance
    - Ihor: I personally feel comfortable with whisper-use-threads=7
      on my 5+ years old laptop without proper GPU (only built-in
      Intel that shares CPU resources)
      #+begin_src emacs-lisp
        (use-package whisper
          :straight (whisper :host github :repo "natrys/whisper.el")
          :bind
          ("<f6>" . whisper-run)
          :config
          (setq whisper-install-directory "~/Dist/"
                whisper-model "base"
                whisper-language "en"
                whisper-translate nil
                whisper-use-threads (- (num-processors) 1)))
      #+end_src
  - One interesting feature of whisper is --prompt
    "you can give it a hint about whether you want punctuation and
    capitalization, skip filler words or include them, etc." -- Sacha
    not fully trained on
    - Ihor: I just pass the output through LLM to fix recognition issues
      See ~yant/gptel-cleanup-voice-recognition~ in 
https://github.com/yantar92/emacs-config/blob/4309703807d6af547db6c9d304e5ceb21fd79cd4/config.org?plain=1#L8522-L8562

- org-user asked about working with Org tables that have very wide columns
  - There is indeed setting column width + collapsing columns via overlays 
(built-in)
  - Other solution is https://github.com/misohena/phscroll, although it is a 
bit of a hack
    and may be finicky when Org buffer is open in multiple windows
  - There is also M-x org-table-edit-field to edit field in separate table.
    Does not help with display, but editing is easier then.
  - We have also been discussing adding multiline cells to Org tables, but
    we haven't found a satisfactory and backwards-compatible syntax
    See https://list.orgmode.org/orgmode/878rkyarvm.fsf@localhost/
    - If someone has ideas, feel free to write to the mailing list (reply to 
the linked thread or just post a new email; whatever is easier)
  - Org mode also supports Emacs' built-in table.el tables that do support
    multiline cells. Export will also work there. But not formulas.
    - Standard commands like M-left/right will not work there. You will need
      C-c ' to switch to table.el major mode buffer for editing. See
      documentation inside table.el file for more details about that
      major mode. It is fairly powerful.
    - Example table
       +---------------+---------------+---------------+
       | just write    |               |               |
       |here and it is |               |               |
       |multiline      |               |               |
       +---------------+---------------+---------------+
       |               |               |               |
       |               |               |               |
       |               |               |               |
       +---------------+---------------+---------------+

- org-user also asked karthink about timeline for landing Org latex preview
  - karthink is short on free time to work on it, so no timelines
  - (he also has gptel backlog on top of other things)
  - I want a bit astray and recalled one of the gptel feature
    requests: calling ~gptel-send~ synchronously (useful to implement agents)
    https://github.com/karthink/gptel/issues/1158
    - I have an ad-hoc solution to this - simply call gptel-send asynchronously
      followed by ~sleep-for~ loop. The callback for gptel will set a
      flag when the loop ends.

- org-user asked about in-buffer completion dropdown I use.
  It is https://github.com/minad/corfu

- We also briefly looked into https://github.com/bradmont/page-view
  - It looked fancy, but ruined my margin setup :)

- Nick Anderson has a very specific capture workflow for meetings
  He has two separate place to clock meeting time and meeting notes
  #+begin_quote
  I have different capture templates for each meeting.  
  I have a capture template for my "worklog" which goes to a note for
  today and clocks time.  When I capture or meetings, it's an
  immediate finish and then i want to capture to my worklog so that
  from worklog I have a link to that meeting and then my time is
  clocked in worklog.  
  I capture to the meeting and immediately capture to worklog (it's
  clocking time) yes, I follow the backlink back to the meeting note
  and keep taking notes.
  Each day I have a new worklog file. It links to all the other notes
  for things I did in the day, all worklog is for is holding clock
  time. (worklog/YYYY-MM-DD.org, meetings/org-meetup/YYYY-MM-DD.org)
  #+end_quote
  #+begin_src org
    ,* IN_PROGRESS Org Meetup :meeting:
     :properties:
     :prior_context: [[id:82a41521-2267-4c4d-bca4-e79d5ab6f6ee][Org meetup 
2025-12-10]]
     :ID:       edeb7194-1c2d-4e4a-a7ef-0ccd8066b2b0
     :end:
     :LOGBOOK:
     CLOCK: [2025-12-10 Wed 10:39]
     CLOCK: [2025-12-10 Wed 10:19]--[2025-12-10 Wed 10:38] =>  0:19
     :END:

    Then that prior_context links to this node in the meeting specific file.

    ,** Org meetup 2025-12-10
     :PROPERTIES:
     :ID:       82a41521-2267-4c4d-bca4-e79d5ab6f6ee
     :END:

  #+end_src
  - He does not use agenda, so I had a bit of a hard time getting the
    workflow :)
  - In any case, his workflow requires nested captures, which might be
    finicky
  - I did not suggest anything non-obvious other than generic
    (blindly) info about capture hooks.

- karthink asked whether ~org-export-before-processing-functions~
  runs in original Org buffer or in the working copy
  - All the details about export process are described in [[info:org#Advanced 
Export Configuration][org#Advanced
    Export Configuration]], step by step
  - Answer: in the copy

- karthink also asked about performance of Org export.
  He is particularly concerned about storing ~buffer-string~ in
  variable + ~insert~ than in other place vs primitive and fast
  ~insert-buffer-substring~ (in ~org-element--generate-copy-script~)
  - ~insert-buffer-substring~ is indeed faster
  - But the question is whether ~buffer-string~ is the real bottleneck
    in the existing code. I'd say that there is little point trying
    small speed-ups randomly. We should rather focus on real
    performance bottlenecks. For me, it draws analogies with
    https://en.wikipedia.org/wiki/Amdahl's_law. The results of
    optimizing non-critical parts of the code may not worth the
    effort.

- karthink that asked about an update on refactoring branch
  - it did not move at all as I just have enough time to keep up with
    bug reports and patches
  - The previous update still relevant: 
https://list.orgmode.org/orgmode/874j6zlhpu.fsf@localhost/ (more details)

:chat:
[17:04] yantar92 is now the presenter
[17:04] [Sacha Chua : VIEWER]: Yay! Happy to see you. =)
[17:04] [Sacha Chua : VIEWER]: (I was beginning to worry that I got my crontab 
wrong =) )
[17:09] [yantar92 : MODERATOR]: The latest Emacs News: 
https://sachachua.com/blog/2025/12/2025-12-08-emacs-news/
[17:10] [Nick Anderson : VIEWER]: Not sure if it's some kind of noise 
suppression but your audio is terribly choppy
[17:10] [Sacha Chua : VIEWER]: your audio is choppy for me too =(
[17:10] [Dave Marquardt : VIEWER]: Can confirm 😊
[17:11] [Nick Anderson : VIEWER]: works fine there
[17:11] [Sacha Chua : VIEWER]: Yeah the server seems to have reasonable CPU 
load and memory
[17:11] yantar92 is now the presenter
[17:12] [Sacha Chua : VIEWER]: I can hear you better now
[17:12] [Nick Anderson : VIEWER]: its better now
[17:12] [Sacha Chua : VIEWER]: Also there were a bunch of Org-related talks at 
EmacsConf, fun! =)
[17:13] [Sacha Chua : VIEWER]: I'm mulling over how to use whisper.el and 
org-capture to stick speech-to-text notes into an Org file =)
[17:14] [Nick Anderson : VIEWER]: I use whisper.el
[17:14] [Sacha Chua : VIEWER]: Yeah it should be pretty straightforward
[17:14] [Nick Anderson : VIEWER]: every day
[17:14] [Nick Anderson : VIEWER]: It's slow, but serviceable. 
[17:15] [Sacha Chua : VIEWER]: Nick: If you come across something that works 
with streaming output so that it's easier to keep track of what I was talking 
about, I'd love to hear about it! =)
[17:15] [Nick Anderson : VIEWER]: thats what i am looking for too, there are 
somethings out but i haven't seen things stiched together
[17:15] [Nick Anderson : VIEWER]: There was a new msft thing that i mean to 
look more into i think
[17:16] [Sacha Chua : VIEWER]: I checked out SimulStreaming and that might be 
interesting but I haven't integrated it into Emacs yet. 
[17:17] [Nick Anderson : VIEWER]: 30 sec windows
[17:17] [Sacha Chua : VIEWER]: Oooh, I think ideally I would press an 
org-capture-like key, start recording, press C-c C-c or something similar to 
finish the note, and have the transcription and saving happen asynchronously so 
I can get back to working on stuff.
[17:18] [Nick Anderson : VIEWER]: yeah 
[17:18] [Nick Anderson : VIEWER]: i just want it to happen in real time 😁
[17:21] [Nick Anderson : VIEWER]: when i go rambling for a while i dont enjoy 
waiting for the transcription to finish. whisper.el works pretty well for short 
things.
[17:21] [Nick Anderson : VIEWER]: 10s of seconds or minutes 
[17:21] [Nick Anderson : VIEWER]: is "long" for me
[17:22] [Nick Anderson : VIEWER]: right now it seems to take about as long as i 
speak
[17:23] [Sacha Chua : VIEWER]: I was also thinking of exploring a client-server 
model that can keep the language model in memory
[17:23] [Nick Anderson : VIEWER]: hum im using base and language
[17:23] [Nick Anderson : VIEWER]: OOOOOOH
[17:23] [Nick Anderson : VIEWER]: yeah it's nil
[17:23] [Sacha Chua : VIEWER]: oooooh I should try whisper-use-threads
[17:23] [yantar92 : MODERATOR]: (use-package whisper
    :straight (whisper :host github :repo "natrys/whisper.el")
    :bind
    ("" . whisper-run)
    :config
    (setq whisper-install-directory "~/Dist/"
        whisper-model "base"
          whisper-language "en"
          whisper-translate nil
          whisper-use-threads (- (num-processors) 1)))
[17:23] [Sacha Chua : VIEWER]: Oh it says default is whisper.cpp default 
(number of cores but max 4)
[17:24] [Nick Anderson : VIEWER]: ok much better
[17:24] [Nick Anderson : VIEWER]: Thanks 
[17:24] [Sacha Chua : VIEWER]: Ooooh, faster
[17:25] [Nick Anderson : VIEWER]: ioll have to re-check for gpu
[17:26] [Nick Anderson : VIEWER]: nice
[17:26] [Sacha Chua : VIEWER]: Hmm, neat
[17:27] [Sacha Chua : VIEWER]: (you probably mean speech recognition artefacts 
instead of speed recognition artefacts in your prompt)
[17:28] [Sacha Chua : VIEWER]: Yeah, this year I learned how to use the 
initial_prompt for whisper to get it to more often spell Emacs correctly when 
transcribing the talks =)
[17:28] [Sacha Chua : VIEWER]: Maybe it's in one of the arguments
[17:28] [Nick Anderson : VIEWER]: yant/gptel-cleanup-voice-recognition: 
https://github.com/yantar92/emacs-config/blob/4309703807d6af547db6c9d304e5ceb21fd79cd4/config.org?plain=1#L8522-L8562
[17:29] [Sacha Chua : VIEWER]: Yeah, it does!
[17:29] [Sacha Chua : VIEWER]: So you can give it a hint about whether you want 
punctuation and capitalization, skip filler words or include them, etc.
[17:30] [Sacha Chua : VIEWER]: and technical terms
[17:32] [org-user : VIEWER]: Any tips for Org tables that have wide columns, 
other than setting the width?
[17:33] [Sacha Chua : VIEWER]: phscroll?
[17:33] [Sacha Chua : VIEWER]: https://github.com/misohena/phscroll
[17:34] [org-user : VIEWER]: phscroll looks interesting. Thanks!
[17:34] [Sacha Chua : VIEWER]: Oh, it could be fun to have a records-like view 
of a single row
[17:34] [org-user : VIEWER]: Exactly
[17:34] [Sacha Chua : VIEWER]: so like, you pop the row out into a different 
buffer that has the headers and the row values, with shortcuts for going to the 
next/previous rows...
[17:35] [Sacha Chua : VIEWER]: ... what, we have multiline tables now?
[17:35] [Sacha Chua : VIEWER]: Neat!
[17:36] [org-user : VIEWER]: Thanks, Ihor!
[17:44] [yantar92 : MODERATOR]: 
https://list.orgmode.org/orgmode/878rkyarvm.fsf@localhost/
[17:46] [org-user : VIEWER]: Any timelines on the latex preview revamp?
[17:49] [karthink : VIEWER]: Waiting for free time to work on it again, 
probably later this month
[17:49] [karthink : VIEWER]: Yeah, there's also a gptel backlog
[17:50] [karthink : VIEWER]: Yes, I think you were running sleep in a loop
[17:51] [Nick Anderson : VIEWER]: I've got this thing that I've been thinking 
about for a while to do a double capture for helping my inter-linking.

I have different capture templates for each meeting.
I have a capture template for my "worklog" which goes to a note for today and 
clocks time.

When I capturef or meetings, it's an immediate finish and then i want to 
capture to my worklog so that from worklog I have a link to that meeting and 
then my time is clocked in worklog.

I guess probably use org-capture-after-finalize-hook


[17:52] [Nick Anderson : VIEWER]: emacs news is more interesting 😁
[17:56] [org-user : VIEWER]: Ihor, what was providing the completion when you 
were editing the "straight" invocation (completion for the supported keywords 
etc)
[17:59] [Nick Anderson : VIEWER]: /meetings/org-meetup-DATE.org and 
/worklog/YYYY-MM-DD.org with entries for things I do, one for example links to 
the org-meetup for this date.
[17:59] [Nick Anderson : VIEWER]: all clocked time is in worklog/*.org files 
[17:59] [Nick Anderson : VIEWER]: yes, because I use %%a to link back to where 
i just was
[18:00] [Nick Anderson : VIEWER]: so then worklog has an id link to the meeting
[18:00] [Nick Anderson : VIEWER]: ? I dont understand what you mean in sequence
[18:00] [Nick Anderson : VIEWER]: Right now it's manual yeah i capture for one, 
then i trigger captuer again
[18:01] [Nick Anderson : VIEWER]: yeah thats what i was thinking after finalize 
hook but fishing for better ideas.
[18:01] [Nick Anderson : VIEWER]: humm thanks
[18:04] [yantar92 : MODERATOR]: https://github.com/minad/corfu
[18:06] [yantar92 : MODERATOR]: https://github.com/bradmont/page-view
[18:08] [Nick Anderson : VIEWER]: Just for trying to explain ... but doesn't 
need covered more I think  ... Basically in my worklog I want this:

# ```
# * IN_PROGRESS Org Meetup                                            :meeting:
# :properties:
# :prior_context: [[id:82a41521-2267-4c4d-bca4-e79d5ab6f6ee][Org meetup 
2025-12-10]]
# :ID:       edeb7194-1c2d-4e4a-a7ef-0ccd8066b2b0
# :end:
# :LOGBOOK:
# CLOCK: [2025-12-10 Wed 10:39]
# CLOCK: [2025-12-10 Wed 10:19]--[2025-12-10 Wed 10:38] =>  0:19
# :END:

# ```

Then that prior_context links to this node in the meeting specific file.


# ```
# ** Org meetup 2025-12-10
# :PROPERTIES:
# :ID:       82a41521-2267-4c4d-bca4-e79d5ab6f6ee
# :END:
# ```


All I get from that is the link to this meeting file which happened today where 
I was clocking time without having to trigger another capture manually.
[18:08] [yantar92 : MODERATOR]: 
https://orgmode.org/worg/org-contrib/babel/intro.html
[18:09] [Nick Anderson : VIEWER]: yeop
[18:10] [Nick Anderson : VIEWER]: yes, yes 
[18:11] [Nick Anderson : VIEWER]: I captrue to the meeting and immediately 
capture to worklog (it's clocking time) yes, i follow the backlink back to the 
meeting note and keep taking notes.
[18:11] [Nick Anderson : VIEWER]: its just so that i can navigate around to 
specific context
[18:11] [Nick Anderson : VIEWER]: im apparently bad ad explaining it shortly 
[18:12] [Nick Anderson : VIEWER]: its my custom workflow yes indeed
[18:12] [Nick Anderson : VIEWER]: Each day i have a new worklog file.
[18:13] [Nick Anderson : VIEWER]: it links to all the other notes for things i 
did in the day, all worklog is for is holidng clock time
[18:13] [Nick Anderson : VIEWER]: and a short overview of all i did that day in 
the one file
[18:13] [Nick Anderson : VIEWER]: in the worklog file
[18:13] [Nick Anderson : VIEWER]: its just a heading 
[18:13] [Nick Anderson : VIEWER]: yep
[18:13] [Nick Anderson : VIEWER]: worklog/YYYY-MM-DD.org
[18:14] [Nick Anderson : VIEWER]: meetgins/org-meetup/YYYY-MM-DD.org 
[18:14] [Nick Anderson : VIEWER]: yes 
[18:14] [Nick Anderson : VIEWER]: something like that
[18:16] [Nick Anderson : VIEWER]: yeah thats like backwards from what im doing
[18:16] [Nick Anderson : VIEWER]: but also useful and something i also have and 
use
[18:16] [Nick Anderson : VIEWER]: anyway, thank you
[18:17] [Nick Anderson : VIEWER]: As I get interrupted I open new captures and 
then have to eventually unwind and finish them off
[18:18] [Nick Anderson : VIEWER]: Which is probably related to why my notes are 
in a different file from the active captrue that is clocking the time
[18:19] [Nick Anderson : VIEWER]: yeah i still dont use agenda 😁
[18:20] [karthink : VIEWER]: Quick question about 
org-export-before-processing-functions: Does this run in the current buffer or 
in the export buffer (copy of current Org buffer)?
[18:21] [karthink : VIEWER]: Got it, thanks.
[18:21] [yantar92 : MODERATOR]: [[info:org#Advanced Export 
Configuration][org#Advanced Export Configuration]]
[18:22] [karthink : VIEWER]: Also,  I was wondering: is insert-buffer-substring 
more efficient than running (buffer-string) and inserting the string into 
another buffer?  It looks like it might be, in which case org-export's memory 
usage can be decreased a little
[18:23] [karthink : VIEWER]: Since insert-buffer-substring copies bytes 
directly and doesn't create an intermediate string object -- at least that's my 
impression from a cursory look at the source.
[18:25] [karthink : VIEWER]: org-element--generate-copy-script
[18:25] [karthink : VIEWER]: Look for str in this function
[18:26] [karthink : VIEWER]: It triggers once per export, right?
[18:27] [karthink : VIEWER]: export is memory usage heavy, so I thought we 
could reduce some GC pressure
[18:28] [karthink : VIEWER]: Essentially one `(buffer-string)` worth of memory
[18:28] [karthink : VIEWER]: Yeah, just a thought for now
[18:33] [karthink : VIEWER]: Any news on your Org refactoring attempt, Ihor?
[18:34] [karthink : VIEWER]: I can relate
[18:34] [org-user : VIEWER]: What would the refactoring achieve?
[18:36] [org-user : VIEWER]: I can see why this would be time-consuming, but 
useful when done
[18:36] [org-user : VIEWER]: Heh
[18:39] [yantar92 : MODERATOR]: 
https://list.orgmode.org/orgmode/874j6zlhpu.fsf@localhost/
[18:39] [yantar92 : MODERATOR]: more details on refactoring
[18:41] [oylenshpeegul : VIEWER]: Thank you!
[18:41] [Dave Marquardt : VIEWER]: Thanks!
:end:

-- 
Ihor Radchenko // yantar92,
Org mode maintainer,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>

Reply via email to