41 karma · joined September 14, 2020
You could say the same thing about any specification that involved multiple features.
> There may be one single reference, but it's constantly evolving.
So is HTML. But one of my Matrix clients from 7 years ago still works. How well would a 7-year-old Web browser work on today's Web? Could you use a 7-year-old version of a third-party Discord client?
> In a best case scenario, sure. The Discord version of your example would just be "Hello, world" without any of the other JSON.
So Discord encodes the message type in the URL instead of the body. So what? It has to go somewhere, and I'd generally rather have URLs include less, not more.
I actually messed up earlier: The `type` field is included in the event as seen after sending. The sent event could just be, e.g.
{
"content": {
"body": "Hello, world.",
"msgtype": "m.text"
}
}
I can't see anything to complain about there. (Sure, I'd prefer Lisp expressions over JSON, but come on.)> In practice, you need to deal with a whole range of message types with various references and slight variations.
Is the same not true for Discord? It supports a variety of message types as well, and Discord also constantly evolves the system and adds new features (every time I log on to it I'm bombarded with news of updates, yet I still can't find a way to view a simple list of "servers" I'm in by names instead of by unintelligible icons).
> In practice, you need to deal with a whole range of message types with various references and slight variations. Inner Matrix message bodies are essentially freeform, which makes Matrix quite powerful but also difficult to deal with compared to the "different HTTP endpoint per request type" approach Discord takes.
That seems to conflate two issues. And I don't see how it's more difficult to deal with than any key-value store in any program. You collect the values from the keys you care about. That's it. Every Matrix event has certain basic fields in common. A few are specific for message type (e.g. a filename field for a file or image upload event). Where's the problem? Destructuring incoming data is probably the easiest part of writing a messaging client.
> Sure, if you accept having your users install two different apps, one for encrypted chat and one for group chats.
I use unencrypted 1:1 chats as well (in which case it's no worse than IRC or Discord, where the server operator could read your messages).
I think that's pretty cool, frankly: that a modern system with well-audited end-to-end encryption still allows it to be used optionally. You're not required to deal with the complexity of key management and session verification if you don't need or want it. Matrix lets me choose.
And I can choose my homeserver or run my own. Can you run your own Discord server (actual server)?
The only significant appeal I see for Discord is the existing user base. Well, that didn't save AOL. I guess we'll see how it turns out.
There is one specification, available on the official site. It isn't, and never will be, required to implement all of it.
> a complex message format
It is a very simple format. Here's an example message (as sent by a client; additional fields are added by the server, such as server-side timestamp):
{
"content": {
"body": "Hello, world.",
"msgtype": "m.text"
},
"type": "m.room.message",
}
> and encryption to deal withThis is also optional. If you want to talk in unencrypted public rooms, for example, you needn't bother with it.
The spec is so simple that you can send a Matrix message from a shell with curl. It's just JSON over HTTP.
Do you still have the same email address at the .net domain? I'd like to contact you again. :)
Especially, see this example: https://github.com/alphapapa/taxy.el#sporty-understanding-co...
org-ql is a search tool. It provides an alternative to some parts of org-agenda and integrates with it to some extent. Its searching is much faster and more powerful than the built-in Org search tools; see its documentation for details.
org-super-agenda performs a different function, to group results in agenda buffers (which can be from org-agenda or org-ql). See https://github.com/alphapapa/org-super-agenda#faq
Please see https://github.com/alphapapa/org-ql, which implements agenda-like views with a much faster search backend.
I don't know if you're the Emacs type, but you might be interested in https://github.com/alphapapa/ement.el. It feels kind of like an upgraded IRC, with support for features like images and rich text, and it tries to be privacy-respecting (e.g. read receipts and typing notifications are enabled by default, to imitate Element, but optional).
It doesn't support E2EE natively, but E2EE works through the Pantalaimon proxy, so it can be used with E2EE rooms that way. (Or if you don't care about E2EE rooms, like me (I mostly don't), you can use it in unencrypted rooms without using Pantalaimon.)
It's not a power-user feature, and it shouldn't be considered one. It should be taught as a standard part of any workflow: before committing, look at the changes you're about to add, and use hunk-staging features (e.g. trivial using Magit) to stage and commit unrelated changes separately.
For example, did you clean up some comments and docstrings while you were adding a new feature? Commit those improvements separately, so that if you need to revert the feature commit later, the improvements won't also be reverted. It also makes reviewing much easier, as each commit or patch, having its own purpose, can easily be reviewed separately, and attention can be focused on parts that need changing.
> Again there are ways to achieve this without introducing new state (the index), for example by allowing to amend the last commit.
Amending a commit does not serve the same purpose as staging files and hunks separately into the index.
It's my impression that few git users understand the value of the index, because few of them use porcelains that expose its power in simple ways. If I had only "git add -p" to use, I might not, either. But Magit is, well, like its name implies, like magic.
At the top of your bug report, it says:
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 21526 in the body.
You can then email your comments to 21526 AT debbugs.gnu.org in the normal way.Emacs can certainly apply red squiggles and many other rich text formatting, through the use of faces (which is how all syntax highlighting is implemented). Emacs also has a rich text-properties API through which any part of a buffer's text may be propertized with metadata. And it also provides overlays, which "overlay" text, also optionally with additional properties, without modifying the buffer text itself.
Together, these features are used to implement GUIs such as the Customization system with widgets, buttons, clickable links, collapsible sections, etc., as well as red-squiggle-style linting tools like flymake, flycheck, and LSP-related tools.
Anyway, here's a random example that comes to mind: I have some sexps in a Lisp file and I want to sort them alphabetically. Each sexp (usually a top-level form, but not necessarily) usually spans multiple lines, so line-sorting won't do it. Since they may be top-level forms, there may be comments between them that would lose their context if their position relative to sexps were lost, so comments need to "stick to" sexps they're above.
How would you solve this in a random text editor?
In Emacs, I would develop a command that does what I need. At each stage of the development process, I evaluate the command's definition, and it's instantly available to be used and tested. I could even test the function on its own definition, if I wanted to be silly (undoing the sorting after testing, of course).
When I'm done, I save the command definition to my configuration, and it's now a permanent tool in my toolbox. I didn't have to recompile the editor and start a new process, nor did I have to submit a patch to an upstream and ask for it to be merged. Similarly to a carpenter (forgive me if it sounds silly), my editor is my workbench, and as wood is malleable, so is my editor.
So, here's the command I came up with (maybe not the prettiest implementation, but maybe not the worst): https://github.com/alphapapa/unpackaged.el#sort-sexps And using Emacs and Org mode, I publish it into this "unpackaged" package, which I then install into my configuration as a package, and other users can then easily install it into theirs, too.
I don't know of any other editor that can do all of this, certainly not so easily.
Please try `org-ql` and `helm-org-ql`; these newer search tools perform better than `org-rifle` and generally supersede it.
$ cat ~/bin/dired
#!/bin/bash
# Launch Dired in a plain Emacs configuration.
# Arguments are passed to Emacs, e.g. "-nw" works as expected.
emacs -q "$@" \
--eval "(dired default-directory)" \
--eval "(defun kill-window-or-emacs () (interactive) (if (one-window-p) (kill-emacs) (delete-window)))" \
--eval "(setq dired-dwim-target t delete-by-moving-to-trash t)" \
--eval "(define-key dired-mode-map (kbd \"q\") #'kill-window-or-emacs)" (concat (propertize "foo"
'face '(:weight bold))
" "
(propertize "bar"
'link "http://bar"))
;;=> #("foo bar" 0 3 (face (:weight bold)) 4 7 (link "http://bar"))Org mode works that way, as well as supporting the one-note-per-file paradigm. It's a very flexible tool.