The pages where I write about Emacs. It doesn’t happen very often. I think you’re probably best off following Planet Emacsen, the ultimate Emacs related blog aggregator.

2019-12-14 Gnus IMAP issues

I’ve started using Gnus again in recent weeks and months. One problem I have is that I enter the INBOX group using C-u RET or issue / o inside the group to see all the mail in my INBOX, read and unread, but all I get are 17 mails. I know some are missing.

When I use the Server Buffer via ^ and enter the INBOX, I get 50 mails. This includes all the missing mails.

I sometimes suspect that it has to do with me reading mails on the phone, too.

Do you understand what’s going on? Many years ago I had decided that the Gnus Agent was a problem and disable it setting gnus-agent to nil. (My entire Gnus config is available online.)

I removed the newsrc files (.newsrc.eld, .newsrc-dribble, their backup files), started Gnus again, and all I seem to have lost was the read marks. As I had all groups “read” that wasn’t a problem, a quick “catch-up” on the groups in questions solved that; then I went into my INBOX and all the mails were there. Let’s see whether it degenerates again.


Comments on 2019-12-14 Gnus IMAP issues

/ w runs the command gnus-summary-pop-limit

– gijs 2019-12-15 08:37 UTC

I don’t think this is a question of limits. When entering a group, read mail is not shown by default. When I then press / w, nothing happens. When I press / o, read mail is shown in the buffer. My problem is that not all read mail is shown in the buffer.

– Alex Schroeder 2019-12-15 10:04 UTC

I find Gnus nnimap is great,it practically runs itself, when imap is used as intended - keep it on the server. There is really no need to download everything. This is great for work email.

The .newsrc* files are not really needed, everything is on the imap server. They just make reading email faster. One can just delete them and start where the left, it will just take longer to sync.

I have a few comments on your gnus config:

  1. For nnimap gnus-secondary-select-methods the group names are formatted as “nnimap+server:Groupname”. The “server” part should be the method label and not the nnimap-address. So for your archive, spam or trash groups, should use for example “nnimap+notifications:Archive”. To my understanding, the “server” string is more of the method label to distinguish from the other methods.
  2. You must have your reasons for setting both the gnus-select-method and the gnus-secondary-select-method “notifications” to the same imap server (imap.migadu.com). This may be a source of confusion to gnus. The issues you are experiencing may come from a bad interaction between the two methods. From your config, it is not clear what distinguishes the two methods. May I suggest keeping only one and see if the issues persist ? I find gnus-select-method to be archaic, as it no longer makes any sense to treat any method as special. Setting gnus-select-method to ’(nnnil nil) and moving all method definition to gnus-secondary-select-methods gives the best experience IMV.

Btw, I’m a big fan of your work. Thank you for all the code contributions, post and of ourse the emacswiki work !! Amazing.

– DEUS MAX 2019-12-15 10:50 UTC

The reason I had done this was that for a while I had two mail accounts on the same server (alex@alexschroeder.ch and notifications@alexschroeder.ch). How do you set that up correctly, without delivering all the mails to a single account?

– Alex Schroeder 2019-12-15 12:07 UTC

No idea why Gnus is so popular! It’s OK for NNTP but not for e-mail. Ditch Gnus and user Wanderlust! 🙂

– zapata 2019-12-15 12:23 UTC

But I’ve been using Gnus for twenty years! I’ve got code in Gnus. I got the mug!

But yeah, perhaps one day I’ll do it.

– Alex Schroeder 2019-12-15 14:40 UTC

Setting up some stuff... starting M-x wl...

condition-case: Wrong type argument: arrayp, nil

This is not a good omen. 😐🔥🔥

M-x toggle-debug-on-error and then:

Debugger entered--Lisp error: (wrong-type-argument arrayp nil)
  signal(wrong-type-argument (arrayp nil))
  (condition-case obj (progn (if check (progn (message "Checking environment...") (wl-check-environment arg) (message "Checking environment...done") (message "Checking type of variables...") (wl-check-variables) (wl-check-variables-2) (message "Checking type of variables...done"))) (let ((inhibit-quit t)) (wl-plugged-init (wl-folder))) (if arg nil (run-hooks 'wl-auto-check-folder-pre-hook) (wl-folder-auto-check) (run-hooks 'wl-auto-check-folder-hook))) (error (if (buffer-live-p demo-buf) (kill-buffer demo-buf)) (signal (car obj) (cdr obj))) (quit))
  (let (demo-buf check) (if wl-init nil (if wl-demo (setq demo-buf (wl-demo))) (setq check t)) (wl-init) (condition-case obj (progn (if check (progn (message "Checking environment...") (wl-check-environment arg) (message "Checking environment...done") (message "Checking type of variables...") (wl-check-variables) (wl-check-variables-2) (message "Checking type of variables...done"))) (let ((inhibit-quit t)) (wl-plugged-init (wl-folder))) (if arg nil (run-hooks 'wl-auto-check-folder-pre-hook) (wl-folder-auto-check) (run-hooks 'wl-auto-check-folder-hook))) (error (if (buffer-live-p demo-buf) (kill-buffer demo-buf)) (signal (car obj) (cdr obj))) (quit)) (if wl-biff-check-folder-list (progn (if arg nil (wl-biff-check-folders)) (wl-biff-start))) (if (buffer-live-p demo-buf) (kill-buffer demo-buf)))

The problem appears to be this, when running edebug on wl-check-environment:

(wl-folder-get-elmo-folder "+draft")

And that’s even though (wl-folder-get-elmo-folder "+queue") returns nil, no error.

That’s because (wl-folder-make-elmo-folder wl-draft-folder) returns nil in wl-draft-get-folder.

I was debugging somewhere in the depths of elmo-make-folder when I decided to give and return to Gnus.

– Alex Schroeder 2019-12-15 19:39 UTC

As DEUX MAX said, you definitely shouldn’t configure the same email account several times.

I’ve switched to setting gnus-select-method to nnnil, and configuring everything in gnus-secondary-select-methods, to avoid confusing myself with the special status of the single account configured in gnus-select-method. I recommend that for everybody.

You can name methods in Gnus, so you can easily have multiple accounts on the same mail server:

(setq gnus-select-method '(nnnil))
(setq gnus-secondary-select-methods
        (nnimap "one" (nnimap-address "your.mailserver.example.org"))
        (nnimap "two" (nnimap-address "your.mailserver.example.org"))

and then in your .authinfo.gpg you’d have something like:

machine one login yourlogin1 password ***** force yes port imaps
machine two login yourlogin2 password ***** force yes port imaps

Or something to that effect.

Your groups will then show up as nnimap+one:blabla, nnimap+two:INBOX etc.

Adam 2019-12-18 19:58 UTC

Thanks! Will try that.

– Alex Schroeder 2019-12-18 21:44 UTC

I agree with Adam. It is best to ditch the gnus-select-method and move everything (configuration wise) in gnus-secondary-select-methods.
Treating an arbitrary method as special (primary) is bad holdover.
So yes, do use the The Empty backend :

(setq gnus-select-method '(nnnil ""))

Alternative configuration, for using two accounts on the same imap server, can be:

(setq gnus-secondary-select-methods
  '((nnimap "one" (nnimap-address "imap.mailserver.org")(nnimap-user "user1")...) 
    (nnimap "two" (nnimap-address "imap.mailserver.org")(nnimap-user "user2")...) 

and the .authinfo.gpg file:

machine imap.mailserver.org login user1 password user1secret ....
machine imap.mailserver.org login user2 password user2secret ....

This way, accounts get selected by the different user-names.
The strings “one” and “two” become just server labels, that can be conveniently chosen to provide for good looking gnus group names (nnimap+serverlabel:Groupname) that display nicely in the Group Buffer.

– DEUS MAX 2019-12-20 01:04 UTC

Thank you both.

– Alex Schroeder 2019-12-20 10:05 UTC

When you’re in the 17-mail inbox, what does C-h v gnus-newsgroup-name say? What does M-: (length gnus-newsgroup-headers) say?

When you’re in the 50-mail inbox, same questions.

– dickmao 2019-12-20 14:28 UTC

Somebody convinced me to simply go ahead and delete the ~/.newsrc* files. As my setup was simple and I didn’t have much marked, it was no problem at all ­– and currently the two look alike again.

I’ll remember to do that, next time this happens though.

– Alex Schroeder 2019-12-20 20:20 UTC

Yes, ~/.newsrc* state more than occasionally gets corrupted when gnus gets confused. Glad you’re back on track.

– dickmao 2019-12-21 16:02 UTC

The problem hast reappeared.

Here are the two last emails in my inbox:

... (16 other mails)
O    2020-02-18 [   7: xxxxxxxxx      ] über amazon data
O    2020-02-19 [   5: xxxxxxxxx      ] BBC - Travel - Japan’s perfectly imperfect garden


(length gnus-newsgroup-headers) → 18 (which is what I see)

When I got to the server buffer, I see the IMAP server:

     {nnimap:migadu} (opened)

When I browse it, it looks just fine:

      89: Archive
       7: Drafts
    1317: INBOX
    9954: Junk
       4: Notes
      75: Sent
    1162: Trash

When I try to enter the INBOX, however (using both RET and C-u RET):

Group nnimap+migadu:INBOX contains no messages
gnus-browse-read-group: Couldn’t enter nnimap+migadu:INBOX

And on the iPhone, the last four messages are:

  • über amazon data
  • Update Februar 2020 – Geheimdienst, E-Voting, E-ID, Julian Assange, Privacy Camp, Jahresbericht, Zmittag
  • BBC - Travel - Japan’s perfectly imperfect garden
  • Re: “Permanent Record”: Ein Hörbuch für Dich!

So, I can see two emails on the phone that Gnus isn’t showing, and this time around the server setup is broken in some way.


Am I going to delete the ~/.newsrc* files again? Probably.

Is this making me distrust Gnus? Definitely.

– Alex Schroeder 2020-02-23 10:45 UTC

Actually, a new development. I entered the group and used Z G to rescan the group, then / o to show the old messages – and now I have more messages in the summary buffer!

– Alex Schroeder 2020-02-24 00:16 CET

Add Comment

2019-08-02 Use of Emacs

Two Years With Emacs as a CEO (and now CTO) is the followup to A CEO's Guide to Emacs. The author talks about life with Emacs.

So many cool quotes in that article!

On using a tool that isn’t designed to do a task (an application) but on using a tool help you do your task. Emacs is a tool, not an app.

Emacs is a portal into the power of the computer itself, and that is a rabbit hole worth descending. Its idioms are paths to discovering and creating your own, and that for me is the definition of creativity. One of the sad things about modern computing is that it is largely made up of black boxes with shiny interfaces that provide momentary gratification rather than real satisfaction. This makes us into consumers rather than creators/makers of technology. I don’t care who you are or what your background is; you can understand your computer, and you can make things with it.

On not using Emacs for shared todo items and calendar stuff:

I gave up on using Org-mode for to dos and the like, as I have to coordinate many meetings and calls every day with dozens of people, and I cannot ask the rest of the world to adapt to my choice of tools, nor do I have the time to transcribe or automate moving things to Org.

On not using Emacs for takin notes during meetings because it’s often better to use a pen (unless the point of the meeting is to write a document).

I also use a plain old pen for note-taking during meetings, as I find laptop/keyboard use in meetings to be rude and limiting to my ability to listen and think.

Ah yes. At work, I usually joke that Emacs is just my IRC client... 🙂


Add Comment

2019-06-21 Gopher Clients for Emacs

“Always two there are...” – Yoda

I’ve been using the Gopher app on my iOS devices for a while, now, as well as VF-1 on the command line. For Emacs, I was using gopher.el. But yesterday, @gcupc mentioned a second Gopher client for Emacs: Elpher. Indeed, there are at least two implementations of everything in Emacs! 😓

The number one thing I’ve thought when I gave Elpher a try was: there’s no browsing history! There’s no way to say “back”, or “next” (if reading a text file in a menu). When I read the History and Caching entry on GitHub, however, it seems that the up command does what I’d think a back command would do.

And something else I’ve noticed: there’s no TLS support. gophers://alexschroeder.ch:7443 can’t be accessed. I’ve added that to gopher.el, I might as well try and add it to Elpher, I guess?

UTF-8 works. 👍


Add Comment

2019-04-07 Using magit and forge

Following @algernon’s suggestion, I’m trying forge for magit.

Install it via M-x package-list-packages.

My setup is this: my origin remote points to my remote git repo. There’s also a cgit running on that server, but what I really care about is the alternative github remote I have installed. I had to set the name of this remote in a git config option via the command line:

git config --add "forge.remote" "github"

I was told to M-x forge-pull when I tried to look at the issues using ' l i. When I did that, it told me that it was going to create a token in ~/.authinfo and if I didn’t want that, I’d have to abort and configure auth-sources. So I did that:

(setq auth-sources '("~/.authinfo.gpg"))

So I tried again. forge-pull said it was going to create a token and save it in ~/.authinfo.gpg and I agreed. Sadly, it didn’t work:

ghub--handle-response-headers: BUG: missing headers
  See https://github.com/magit/ghub/issues/81.
  headers: nil
  status: nil
  buffer: #<buffer  *http api.github.com:443*>
  --- end of buffer-string ---

I wonder why.

I restarted Emacs. Visited my repo. Ran magit-status. Ran forge-pull. And got the error: “transient--layout-member: magit-dispatch is not a transient command”.

I have no idea what this means. Fiddled some more, went through the process again, got the missing headers error again. I’m not happy.

Now I’m following the hints in the Ghub manual about manually creating the personal access token I need. Turns out that the token was created on the site, but the line was missing in my ~/.authinfo.gpg. So no I’m adding it manually.

machine api.github.com login kensanata^forge password *secret*

And I’m still getting the same error.

ghub--handle-response-headers: BUG: missing headers
  See https://github.com/magit/ghub/issues/81.
  headers: nil
  status: nil
  buffer: #<buffer  *http api.github.com:443*>
  --- end of buffer-string ---

Looking at #81 and reading through the entire thread it seems the answer is installing Emacs 27, or using (setq gnutls-log-level 1) but “only because it slows things down slightly,” perhaps.

By now I’m sick and tired of the entire thing. I remember why using special clients written to new APIs is a pain. For the moment, this doesn’t seem to be better than using either the websites directly, or an email based git workflow and keeping track of issues elsewhere.

I’m going to drop this for a while.


Comments on 2019-04-07 Using magit and forge

Fair enough. But some comments.

When I did that, it told me that it was going to create a token in ~/.authinfo and if I didn’t want that, I’d have to abort and configure auth-sources.

Seems reasonable to inform you that the default is not safe. Since I have no control over the default that’s the best I can do.

BUG: missing headers

There is a severe bug in Emacs and once again this is completely beyond my control. This is going to haunt me forever because it will take half a decade for almost everyone to update to the (as of now unreleased) version of Emacs that fixes that bug.

Turns out that the token was created on the site, but the line was missing in my ~/.authinfo.gpg.

The above bug kicked in at a very unfortunate time. There is no way for me to make this change atomic. Telling Github to create a new token succeeded, but then the bug prevented Emacs from receiving the token and storing it locally.

And got the error: “transient--layout-member: magit-dispatch is not a transient command”.

It means you haven’t updated Magit in a long time. The version you have installed is to old to be compatible with Forge. I have now added some safety-nets that should prevent that when installing Forge from Melpa. It will probably take a few hours for them to become active and won’t help if you have already installed Forge. Just make sure to update Ghub, Magit and Forge to the latest snapshots.

By now I’m sick and tired of the entire thing. I remember why using special clients written to new APIs is a pain.

Fair enough. Though I would like to point out that many of these issues are beyond my control.

For the moment, this doesn’t seem to be better than using either the websites directly, or an email based git workflow and keeping track of issues elsewhere.

The setup process was painful but it would be a shame to give up now. You didn’t actually get a change to see whether the current implementation would already be an improvement for you. (Which it might not, many features are still missing.)

Cheers, Jonas

Ps: I wish bug reports came with such a clear description of what the user tried and how things failed.

– Jonas Bernoulli 2019-04-10 11:08 UTC

No worries. I will try again when I get Emacs 27.

– Alex Schroeder 2019-04-10 11:41 UTC

Add Comment

2018-12-16 Importing old Google Plus posts

As Google is planning to sunset Google+ by April 2019, you need to make a backup right now or you’ll forget!

I have written a little tool to help me browse my Google+ archive using Emacs. I posted over 2000 times on Google+, and left even more comments. Browsing speed is essential.

In addition to just browsing, I also want to copy some of these to my blog. They all need some editing before I do that, however: links need to be checked and fixed, tags need to be added, and so on.

Here’s how to get started: get a copy of my Google+ Stream archive from Google Takeout:

  1. select specific data and pick Posts
  2. change the format from HTML to JSON

This is what it should look like:


Download the archive when it’s ready and unpack it.

For Emacs, you need the following:


As you can see, the archive contains my posts and all the comments people left on it.

I’m happy to answer any questions or help you adapt the code to your own platform.

Also, remember that if your target platform is Wordpress or Blogger, you can always use Friends+Me to handle 3000 posts or less, or pay $20...

Anyway, expect to see some old, backdated posts pop up on this wiki as I work through my list.


Add Comment

2018-08-30 Learning to Type

OK, so I want to practice typing using the Workman Keyboard Layout. But how to practice?

Atreus keyboard

Recently, codesections@fosstodon.org had a post about typing lessons for programmers using GNU Typist. I also found that my distro also offers Speedpad, a sort of game. And that reminded me of Typing of the Dead, which inspired The Typing of Emacs, a game I once wrote.

 T h e   T y p i n g   O f   E m a c s . . .
 elt - Wow!
 any - Hit!
 but - Go ahead!
 own - You can do it!
 nil - That's it!
 Done - done? - Desist! - 2 LIVES LEFT!
 such - You can do it!
 sort - Hit!
 made - Amazing!
 used - OK!
 which - yes!
 words - Hit!
 write - Excellent.
 parse - Wow!
 takes - Wow!
 format - Hit!
 Upcase - Updcase? - Nooooo! - 1 LIVES LEFT!
 random - YES!
 giving - gibuing? - Shame on you! - 0 LIVES LEFT!
 You have reached 180 characters per minute in 26 seconds by typing 18 words.

OK, but now I want to start working on the new Workman layout. Let’s see... I need a “ranking” so that I can start with some “easy” keys and make it progressively harder. Let’s take another look at the basic layer.

the basic layer

Here’s the plan:

  1. start with the home row: just words containing ashtgyneoi
  2. add some easy to reach keys, for example the three most easily reachable above the left and the right: adding drwfup
  3. add the three most easily reachable below the left and the right: adding xmcl (ignoring the comma and dot for the moment)
  4. all the letters

OK, so let’s prepare a file! Let’s use -i to ignore case. Use that Shift key!

grep -i '^[ashtgyneoi]*$' < /etc/dictionaries-common/words > workman-1.txt
grep -i '^[ashtgyneoidrwfup]*$' < /etc/dictionaries-common/words > workman-2.txt
grep -i '^[ashtgyneoidrwxmcfupl]*$' < /etc/dictionaries-common/words > workman-3.txt
grep -i '^[a-z]*$' < /etc/dictionaries-common/words > workman-4.txt

And since this is so new, I also need to change something in my setup:

(setq toe-starting-time-per-word 10)

The default is 3s per word and I basically can’t type anything in the time required.

That should give you a quick selection of difficulty levels. Feel free to introduce keys more gradually.

Here’s how to combine two words from the first file:

sort --random-sort workman-one.txt | paste -d ' ' workman-1.txt - > workman-1b.txt

The result:

A gaits
Aegean assigning
Aeneas ah
Ag Se
Agassi ignition
Agatha ginning
Aggie gayest
Agnes hoot
Agni geneses
Aisha ING

Yet another interesting take would be to use the 2000 most common words from the Brown corpus... And so on! :)

Well, back to the workman-1.txt file for me!

T h e   T y p i n g   O f   E m a c s . . .

hie - Wow!
tie - OK!
shy - Amazing!
Noh - You can do it!
GTE - Done!
sags - Wonderful!
goes - OK!
oats - Amazing!
test - You can do it!
heat - Great!
goose - Go ahead!
hoots - That's it!
shoon - Amazing!
gains - Excellent.
tangs - You can do it!
ninths - Hit!
Athena - You can do it!
testis - Hit!
giants - Done!
sanity - Timeout! - Desist! - 2 LIVES LEFT!
hatting - Wonderful!
assigns - Hit!
entente - Timeout! - Nooooo! - 1 LIVES LEFT!
hyaenas - ? - No! - 0 LIVES LEFT!
You have reached 47 characters per minute in 140 seconds by typing 23 words.

Hall Of Fame

  1. Alex Schroeder    45 cpm    157 sec     24 words  2018-08-30 00:43
  2. Alex Schroeder    47 cpm    140 sec     23 words  2018-08-30 14:53
  3. Alex Schroeder    12 cpm     30 sec      2 words  2018-08-30 14:51
  4. Alex Schroeder    13 cpm     26 sec      2 words  2018-08-30 14:50
  5. Alex Schroeder    40 cpm      9 sec      2 words  2018-08-30 00:40


Add Comment

2018-08-27 Mastodon and rcirc

If you use rcirc (one of the two Emacs IRC clients) and the Bitlbee Mastodon plugin to communicate with a Mastodon instance via Bitlbee, and you want to “dim” the notifications of follows, boosts and favourites:

(eval-after-load 'rcirc
  '(add-to-list 'rcirc-markup-text-functions 'asc:rcirc-dim-keywords))

(defvar asc:rcirc-dim-keywords
  '("favourited your status: "
    "boosted your status: "
    " followed you")
  "Keywords which result in the entire message being dimmed.")

(defun asc:rcirc-dim-keywords (_senders _response)
  "Dim message if it contains particular phrases.
Phrases to take are from `asc:rcirc-dim-keywords'.
Each function takes two arguments, SENDER, and RESPONSE.  The
buffer is narrowed with the text to be printed and the point is
at the beginning of the ‘rcirc-text’ propertized text."
  (dolist (str asc:rcirc-dim-keywords)
    (goto-char (point-min))
    (when (search-forward str nil t)
      (rcirc-add-face (point-min) (point-max) 'rcirc-dim-nick))))

(Mastodon is a free, open-source, decentralized microblogging network. Bitlbee is an IRC server connecting to various other text messaging services. You run Bitlbee and connect to it using an IRC client, then configure Bitlbee to connect to other services, such as a Mastodon instance where you already have an account. The benefit is that you can now use any IRC client you want to connect to Mastodon.)


Add Comment

2018-08-02 Why Emacs?

I found this great section in the README to remacs, a “community-driven port of Emacs to Rust.” I had never heard of this effort before, probably because I’m so disconnected from everything.

The entire project uses the GPLv3 so that holds for this section, too. Users who have contributed to the README.md file: Wilfred shaleh jaccarmac birkenfeld mrwacky42 jeandudey db48× brotzeit vic setupminimal pnkfelix necto yqrashawn mjfeller andrewmcveigh Fuco1 spacecowboy dk87 c-nixon gitter-badger.

Anyway, on to the text:

Why Emacs?

Emacs will change how you think about programming.

Emacs is totally introspectable. You can always find out ‘what code runs when I press this button?’.

Emacs is an incremental programming environment. There’s no edit-compile-run cycle. There isn’t even an edit-run cycle. You can execute snippets of code and gradually turn them into a finished project. There’s no distinction between your editor and your interpreter.

Emacs is a mutable environment. You can set variables, tweak functions with advice, or redefine entire functions. Nothing is off-limits.

Emacs provides functionality without applications. Rather than separate applications, functionality is all integrated into your Emacs instance. Amazingly, this works. Ever wanted to use the same snippet tool for writing C++ classes as well as emails?

Emacs is full of incredible software concepts that haven’t hit the mainstream yet. For example:

  • Many platforms have a single item clipboard. Emacs has an infinite clipboard.
  • If you undo a change, and then continue editing, you can’t redo the original change. Emacs allows undoing to any historical state, even allowing tree-based exploration of history.
  • Emacs supports a reverse variable search: you can find variables with a given value.
  • You can perform structural editing of code, allowing you to make changes without breaking syntax. This works for lisps (paredit) and non-lisps (smartparens).
  • Many applications use a modal GUI: for example, you can’t do other edits during a find-and-replace operation. Emacs provides recursive editing that allow you to suspend what you’re currently doing, perform other edits, then continue the original task.

Emacs has a documentation culture. Emacs includes a usage manual, a lisp programming manual, pervasive docstrings and even an interactive tutorial.

Emacs has a broad ecosystem. If you want to edit code in a niche language, there’s probably an Emacs package for it.

Emacs doesn’t have a monopoly on good ideas, and there are other great tools out there. Nonetheless, we believe the Emacs learning curve pays off.

Also check out the post by Per Abrahamsen from 2000, what's so fun about emacs? but keep in mind that it was also posted to the newsgroup alt.religion.emacs.


Add Comment

2018-02-27 Emacs Packages

My Emacs setup is on GitHub but I might have to finally get rid of my special package handling code and move to something else instead.

How about using straight together with use-package?

One of these days!


Comments on 2018-02-27 Emacs Packages

I’m having the same questions. The functional approach of straight is very appealing. Would this approach be able to increase the security ? With security, I mean the fact that the melpa is vulnerable to attacks, much more than a debian/any-other-distro repo or github for example.

– JeanMichel 2018-02-28 12:07 UTC

[of course you keep my email adress for you ;-) ]

– JeanMichel 2018-02-28 12:08 UTC

To be honest, I have never thought much about the security of MELPA and friends. I suspect it is terrible, but then again, perhaps it is not if HTTPS is enabled and certificates are checked and all that, perhaps it is good enough? Debian doesn’t have HTTPS for its repos but has signature checking. We don’t have signatures but HTTPS? Fair? 🤷 I have no idea.

– Alex Schroeder 2018-02-28 13:54 UTC

Well, I started to worry about security in emacs after this discussion : https://www.reddit.com/r/emacs/comments/63e8hu/are_emacs_package_repositories_a_security_risk/?st=jejp9fmz&sh=a7ade519

Since then, there have been other discussions, which I have not followed accurately. I’m not a specialist, but for those who use emace for everything like notes, mail etc, the possibility of an infected package should be a concern, and i’d love if there would be an approach to solve this.

But ... that is not your point in this post ! ;-)

– JeanMichel 2018-03-09 08:55 UTC


I found this a while ago, which says you have to do extra work to get Emacs to actually verify https.

– jpkotta 2018-03-09 17:03 UTC

Thank you both! Very interesting.

– Alex Schroeder 2018-03-11 21:17 UTC

straight.el uses hashes and a lockfile


– straight user 2018-04-12 23:27 UTC

Add Comment

2018-02-12 Buttery Smooth Emacs

This is the best blog post about Emacs in a long time. I’m still laughing. Buttery Smooth Emacs, Friday, October 28, 2016.

«GNU Emacs is an old-school C program emulating a 1980s Symbolics Lisp Machine emulating an old-fashioned Motif-style Xt toolkit emulating a 1970s text terminal emulating a 1960s teletype.»

«Emacs organizes its view of the outside world into frames (what the rest of the world calls “windows”), windows (which the rest of the world calls “panes”), and buffers (which the rest of the world calls “documents”).»

«Did Emacs just adapt to whatever these non-Xt toolkits did? Did Emacs adopt modern best practices? GTK+ is a modern GUI library. Emacs supports GTK+. Is Emacs a well-behaved GTK+ program now?»

«What’s particularly hilarious is that SIGIO can happen in the middle of redisplay. The REPL loop (in the Emacs case, not Read Eval Print, but Read Eval WTF) can be recursive.»

No, really. This blog post just keeps on giving.

(I don’t get why people use Facebook as their blog but whatever, this blog post is great.)


Comments on 2018-02-12 Buttery Smooth Emacs

It’s a great write-up, but this isn’t right: “...a 1980s Symbolics Lisp Machine emulating an old-fashioned Motif-style Xt toolkit....” Symbolics certainly didn’t get its window system ideas from Xt.

Arthur A. Gleckler 2018-02-13 01:25 UTC

I’d be surprised if everything else is right! :)

– Alex Schroeder 2018-02-13 07:08 UTC

More tales from redisplay.

AlokSingh 2018-02-14 06:39 UTC

The joy of CTRL S and CTRL Q! «It is also a great tragedy that you don’t get DSR/DTR lines on these “modern” serial ports, which means you have to use inline XON/XOFF flow control. Like an animal.»

Good stuff, thanks Alok!

– Alex Schroeder 2018-02-14 13:12 UTC

Add Comment



Please make sure you contribute only your own work, or work licensed under the GNU Free Documentation License. Note: in order to facilitate peer review and fight vandalism, we will store your IP number for a number of days. See Privacy Policy for more information. See Info for text formatting rules. You can edit the comment page if you need to fix typos. You can subscribe to new comments by email without leaving a comment.

To save this page you must answer this question:

Please say HELLO.

Referrers: Planet Emacslife