• Stars
    star
    354
  • Rank 115,882 (Top 3 %)
  • Language
    Emacs Lisp
  • License
    GNU General Publi...
  • Created over 3 years ago
  • Updated 12 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Matrix client for Emacs

Ement.el

https://elpa.gnu.org/packages/ement.svg

Ement.el is a Matrix client for Emacs. It aims to be simple, fast, featureful, and reliable.

Feel free to join us in the chat room: https://img.shields.io/matrix/ement.el:matrix.org.svg?label=%23ement.el:matrix.org

Contents

Screenshots

The default formatting style resembles IRC clients, with each message being prefixed by the username (which enables powerful Emacs features, like using Occur to show all messages from or mentioning a user). Alternative, built-in styles include an Element-like one with usernames above groups of messages, as well as a classic, no-margins IRC style. Messages may be optionally displayed with unique colors for each user (with customizeable contrast), making it easier to follow conversations. Timestamp headers are optionally displayed where a certain amount of time passes between events, as well as where the date changes.

images/ement-for-twim.png

Two rooms shown in side-by-side buffers, showing inline images, reactions, date/time headings, room avatars, and messages colored by user (using the modus-vivendi Emacs theme).

images/emacs-with-fully-read-line.png

#emacs:libera.chat showing colored text from IRC users, replies with quoted parts, messages colored by user, addressed usernames colored by their user color, highlighted mentions, and the fully-read marker line (using the modus-vivendi Emacs theme).

images/screenshot5.png

Four rooms shown at once, with messages colored by user, in the default Emacs theme.

images/screenshot2.png

A room at the top in the “Elemental” display style, with sender names displayed over groups of messages, and only self-messages in an alternate color. The lower window shows an earlier version of the rooms list.

images/reactions.png

Reactions displayed as color emojis (may need proper Emacs configuration).

Installation

GNU ELPA

Ement.el is published in GNU ELPA as ement, so it may be installed in Emacs with the command M-x package-install RET ement RET. This is the recommended way to install Ement.el, as it will install the current stable release.

The latest development build may be installed from ELPA-devel or from Git (see below).

GNU Guix

Ement.el is available in GNU Guix as emacs-ement.

Debian, Ubuntu

Ement.el is available in Debian as elpa-ement and in Ubuntu as elpa-ement.

Nix

Ement.el is available in NixOS as emacsPackages.ement.

Other distributions

Ement.el is also available in some other distributions. See Repology for details.

Git master

The master branch of the Git repository is intended to be usable at all times; only minor bugs are expected to be found in it before a new stable release is made.

To install, it is recommended to use quelpa-use-package, like this (using this helpful command for upgrading versions):

;; Install and load `quelpa-use-package'.
(package-install 'quelpa-use-package)
(require 'quelpa-use-package)

;; Install Ement.
(use-package ement
  :quelpa (ement :fetcher github :repo "alphapapa/ement.el"))

One might also use systems like Elpaca or Straight (which is also used by DOOM), but the author cannot offer support for them.

Manual

Ement.el is intended to be installed with Emacs’s package system, which will ensure that the required autoloads are generated, etc. If you choose to install it manually, you’re on your own.

Usage

  1. Call command ement-connect to connect. Multiple sessions are supported, so you may call the command again to connect to another account.
  2. Wait for initial sync to complete (which can take a few moments–initial sync JSON requests can be large).
  3. Use these commands (room-related commands may be called with universal prefix to prompt for the room):
    • ement-list-rooms to view the list of joined rooms.
    • ement-view-room to view a room’s buffer, selected with completion.
    • ement-create-room to create a new room.
    • ement-create-space to create a space.
    • ement-invite-user to invite a user to a room.
    • ement-join-room to join a room.
    • ement-leave-room to leave a room.
    • ement-forget-room to forget a room.
    • ement-tag-room to toggle a tag on a room (including favorite/low-priority status).
    • ement-list-members to list members in a room.
    • ement-send-direct-message to send a direct message to a user (in an existing direct room, or creating a new one automatically).
    • ement-room-edit-message to edit a message at point.
    • ement-room-send-file to send a file.
    • ement-room-send-image to send an image.
    • ement-room-set-topic to set a room’s topic.
    • ement-room-occur to search in a room’s known events.
    • ement-room-override-name to override a room’s display name.
    • ement-ignore-user to ignore a user (or with interactive prefix, un-ignore).
    • ement-room-set-message-format to set a room’s message format buffer-locally.
    • ement-room-toggle-space to toggle a room’s membership in a space (a way to group rooms in Matrix).
    • ement-directory to view a room directory.
    • ement-directory-search to search a room directory.
  4. Use these special buffers to see events from multiple rooms (you can also reply to messages from these buffers!):
    • See all new events that mention you in the *Ement Mentions* buffer.
    • See all new events in rooms that have open buffers in the *Ement Notifications* buffer.

Bindings

These bindings are common to all of the following buffer types:

  • Switch to a room buffer: M-g M-r
  • Switch to the room list buffer: M-g M-l
  • Switch to the mentions buffer: M-g M-m
  • Switch to the notifications buffer: M-g M-n

Room buffers

  • Show command menu: ?

images/transient.png

Movement

  • Next event: n
  • Previous event: p
  • End of buffer: N
  • Scroll up and mark read: SPC
  • Scroll down: S-SPC
  • Jump to fully-read marker: M-g M-p
  • Move read markers to point: m
  • Load older messages: at top of buffer, scroll contents up (i.e. S-SPC, M-v or mwheel-scroll)

Switching

  • List rooms: M-g M-l
  • Switch to other room: M-g M-r
  • Switch to mentions buffer: M-g M-m
  • Switch to notifications buffer: M-g M-n
  • Quit window: q

Messages

  • Write message: RET
  • Write reply to event at point (when region is active, only quote marked text) : S-RET
  • Compose message in buffer: M-RET (while writing in minibuffer: C-c ') (Use command ement-room-compose-org to activate Org mode in the compose buffer.)
  • Edit message: <insert>
  • Delete message: C-k
  • Send reaction to event at point, or send same reaction at point: s r
  • Send emote: s e
  • Send file: s f
  • Send image: s i
  • View event source: v
  • Complete members and rooms at point: C-M-i (standard completion-at-point command). (Type an @ prefix for a member mention, a # prefix for a room alias, or a ! prefix for a room ID.)

Images

  • Toggle scale of image (between fit-to-window and thumbnail): mouse-1
  • Show image in new buffer at full size: double-mouse-1

Users

  • Send direct message: u RET
  • Invite user: u i
  • Ignore user: u I

Room

  • Occur search in room: M-s o
  • List members: r m
  • Set topic: r t
  • Set message format: r f
  • Set notification rules: r n
  • Override display name: r N
  • Tag/untag room: r T

Room membership

  • Create room: R c
  • Join room: R j
  • Leave room: R l
  • Forget room: R F
  • Toggle room’s spaces: R s

Other

  • Sync new messages (not necessary if auto sync is enabled; with prefix to force new sync): g

Room list buffer

  • Show buffer of room at point: RET
  • Show buffer of next unread room: SPC
  • Move between room names: TAB / <backtab>
  • Kill room’s buffer: k
  • Toggle room’s membership in a space: s

Directory buffers

  • View/join a room: RET / mouse-1
  • Load next batch of rooms: +

Mentions/notifications buffers

  • Move between events: TAB / <backtab>
  • Go to event at point in its room buffer: RET
  • Write reply to event at point (shows the event in its room while writing) : S-RET

Tips

  • Desktop notifications are enabled by default for events that mention the local user. They can also be shown for all events in rooms with open buffers.
  • Send messages in Org mode format by customizing the option ement-room-send-message-filter (which enables Org format by default), or by calling ement-room-compose-org in a compose buffer (which enables it for a single message). Then Org-formatted messages are automatically converted and sent as HTML-formatted messages (with the Org syntax as the plain-text fallback). You can send syntax such as:
    • Bold, italic, underline, strikethrough
    • Links
    • Tables
    • Source blocks (including results with :exports both)
    • Footnotes (okay, that might be pushing it, but you can!)
    • And, generally, anything that Org can export to HTML
  • Starting in the room list buffer, by pressing SPC repeatedly, you can cycle through and read all rooms with unread buffers. (If a room doesn’t have a buffer, it will not be included.)
  • Room buffers and the room-list buffer can be bookmarked in Emacs, i.e. using C-x r m. This is especially useful with Burly: you can arrange an Emacs frame with several room buffers displayed at once, use burly-bookmark-windows to bookmark the layout, and then you can restore that layout and all of the room buffers by opening the bookmark, rather than having to manually arrange them every time you start Emacs or change the window configuration.
  • Images and other files can be uploaded to rooms using drag-and-drop.
  • Mention members by typing a @ followed by their displayname or Matrix ID. (Members’ names and rooms’ aliases/IDs may be completed with completion-at-point commands.)
  • You can customize settings in the ement group.
    • Note: setq should not be used for certain options, because it will not call the associated setter function. Users who have an aversion to the customization system may experience problems.

Displaying symbols and emojis

Emacs may not display certain symbols and emojis well by default. Based on this question and answer, you may find that the simplest way to fix this is to install an appropriate font, like Noto Emoji, and then use this Elisp code:

(setf use-default-font-for-symbols nil)
(set-fontset-font t 'unicode "Noto Emoji" nil 'append)

Encrypted room support through Pantalaimon

Ement.el doesn’t support encrypted rooms natively, but it can be used transparently with the E2EE-aware reverse proxy daemon Pantalaimon. After configuring it according to its documentation, call ement-connect with the appropriate hostname and port, like:

(ement-connect :uri-prefix "http://localhost:8009")

Changelog

0.13-pre

Additions

  • Group joined direct rooms in directory buffers.
  • Command end-of-buffer is bound to N in room buffers.

Fixes

  • Name for direct rooms in directory buffers.

0.12

Additions

  • Command ement-notifications shows recent notifications, similar to the pane in the Element client. (This new command fetches recent notifications from the server and allows scrolling up to retrieve older ones. Newly received notifications, as configured in the ement-notify options, are displayed in the same buffer. This functionality will be consolidated in the future.)
  • Face ement-room-quote, applied to quoted parts of replies.

Changes

  • Commands ement-room-goto-next and ement-room-goto-prev work more usefully at the end of a room buffer. (Now pressing n on the last event moves point to the end of the buffer so it will scroll automatically for new messages, and then pressing p skips over any read marker to the last event.)
  • Room buffer bindings:
    • ement-room-goto-next and ement-room-goto-prev are bound to n and p, respectively.
    • ement-room-goto-fully-read-marker is bound to M-g M-p (the mnemonic being “go to previously read”).
  • The quoted part of a reply now omits the face applied to the rest of the message, helping to distinguish them.
  • Commands that read a string from the minibuffer in ement-room buffers and ement-connect user ID prompts use separate history list variables.
  • Use Emacs’s Jansson-based JSON-parsing functions when available. (This results in a 3-5x speed improvement for parsing JSON responses, which can be significant for large initial sync responses. Thanks to Ryan Rix for discovering this!)

Fixes

  • File event formatter assumed that file size metadata would be present (a malformed, e.g. spam, event might not have it).
  • Send correct file size when sending files/images.
  • Underscores are no longer interpreted as denoting subscripts when sending messages in Org format. (Thanks to Phil Sainty.)
  • Add workaround for savehist-mode’s serializing of the command-history variable’s arguments. (For ement- commands, that may include large data structures, like ement-session structs, which should never be serialized or reused, and savehist’s doing so could cause noticeable delays for users who enabled it). (See #216. Thanks to Phil Sainty and other users who helped to discover this problem.)

0.11

Additions

  • Commands ement-room-image-show and ement-room-image-scale (bound to RET and M-RET when point is at an image) view and scale images. (Thanks to Steven Allen for these and other image-related improvements.)
  • Command ement-room-image-show-mouse is used to show an image with the mouse.

Changes

  • Enable image-mode when showing images in a new buffer. (Thanks to Steven Allen.)
  • Command ement-room-image-show is not used for mouse events.
  • Show useful message in SSO login page.

Fixes

  • Allow editing of already-edited events.
  • Push rules’ actions may be listed in any order. (Fixes compatibility with v1.7 of the spec. Thanks to Steven Allen.)
  • Call external browser for SSO login page. (JavaScript is usually required, which EWW doesn’t support, and loading the page twice seems to change state on the server that causes the SSO login to fail, so it’s best to load the page in the external browser directly).
  • Clean up SSO server process after two minutes in case SSO login fails.
  • Don’t stop syncing if an error is signaled while sending a notification.
  • Command ement-room-list-next-unread could enter an infinite loop. (Thanks to Visuwesh and @mrtnmrtn:matrix.org.)
  • Events in notifications buffer could appear out-of-order. (#191. Thanks to Phil Sainty.)

Internal

  • The ement-read-receipt-idle-timer could be duplicated when using multiple sessions. (#196. Thanks to Phil Sainty.)

0.10

Security Fixes

  • When uploading a GPG-encrypted file (i.e. one whose filename ends in .gpg), if the recipient’s private key or the symmetric encryption key were cached by Emacs (or a configured agent, like gpg-agent), Emacs would automatically decrypt the file while reading its contents and then upload the decrypted contents. (This happened because the function insert-file-contents was used, which does many things automatically, some of which are not even mentioned in its docstring; refer to its entry in the Elisp Info manual for details. The fix is to use insert-file-contents-literally instead.) Thanks to @welkinsl:matrix.org for reporting.

Additions

Changes

  • Activating a space in the room list uses ement-view-space (which shows a directory of rooms in the space) instead of ement-view-room (which shows events in the space, which is generally not useful).
  • Command ement-view-room, when used for a space, shows a footer explaining that the buffer is showing a space rather than a normal room, with a button to call ement-view-space for it (which lists rooms in the space).
  • Command ement-describe-room shows whether a room is a space or a normal room.
  • Command ement-view-space shows the space’s name and alias.
  • Command ement-room-scroll-up-mark-read moves the fully read marker to the top of the window (when the marker’s position is within the range of known events), rather than only moving it when at the end of the buffer. (This eases the process of gradually reading a long backlog of messages.)
  • Improve readme export settings.

Fixes

  • Extra indentation of some membership events. (Thanks to Steven Allen.)
  • Customization group for faces.
  • Don’t reinitialize ement-room-list-mode when room list buffer is refreshed. (#146. Thanks to Ted Reed for reporting.)
  • Don’t fetch old events when scrolling to the bottom of a room buffer (only when scrolling to the top). (Thanks to Steven Allen.)
  • Minor improvements to auto-detection of homeserver URIs. (See #24. Thanks to Phil Sainty.)
  • Uploading of certain filetypes (e.g. Emacs would decompress some archives before uploading). Thanks to @welkinsl:matrix.org for reporting.
  • Messages edited multiple times sometimes weren’t correctly replaced.

0.9.3

Fixes

  • Another attempt at restoring position in room list when refreshing.
  • Command ement-room-list-next-unread.

0.9.2

Fixes

  • Restore position in room list when refreshing.
  • Completion in minibuffer.

0.9.1

Fixes

  • Error in ement-room-list command upon initial sync.

0.9

Additions

  • Option ement-room-timestamp-header-align controls how timestamp headers are aligned in room buffers.
  • Option ement-room-view-hook runs functions when ement-room-view is called. (By default, it refreshes the room list buffer.)
  • In the room list, middle-clicking a room which has a buffer closes its buffer.
  • Basic support for video events. (Thanks to Arto Jantunen.)

Changes

  • Using new option ement-room-timestamp-header-align, timestamp headers default to right-aligned. (With default settings, this keeps them near message timestamps and makes for a cleaner appearance.)

Fixes

  • Recognition of certain MXID or displayname forms in outgoing messages when linkifying (aka “pilling”) them.
  • Unreadable room avatar images no longer cause errors. (Fixes #147. Thanks to @jgarte for reporting.)
  • Don’t error in ement-room-list when no rooms are joined. (Fixes #123. Thanks to @Kabouik and Omar Antolín Camarena for reporting.)
  • Enable member/room completion in compose buffers. (Fixes #115. Thanks to Thanks to Justus Piater and Caleb Chase for reporting.)

0.8.3

Fixes

  • Avoid use of pcase’s (map :KEYWORD) form. (This can cause a broken installation on older versions of Emacs that have an older version of the map library loaded, such as Emacs 27.2 included in Debian 11. Since there’s no way to force Emacs to actually load the version of map required by this package before installing it (which would naturally happen upon restarting Emacs), we can only avoid using such forms while these versions of Emacs are widely used.)

0.8.2

Fixes

  • Deduplicate grouped membership events.

0.8.1

Added missing changelog entry (of course).

0.8

Additions

  • Command ement-create-space creates a new space.
  • Command ement-room-toggle-space toggles a room’s membership in a space (a way to group rooms in Matrix).
  • Visibility of sections in the room list is saved across sessions.
  • Command ement-room-list-kill-buffer kills a room’s buffer from the room list.
  • Set device_id and initial_device_display_name upon login (e.g. Ement.el: username@hostname). (#134. Thanks to Arto Jantunen for reporting.)

Changes

  • Room-related commands may be called interactively with a universal prefix to prompt for the room/session (allowing to send events or change settings in rooms other than the current one).
  • Command ement-room-list reuses an existing window showing the room list when possible. (#131. Thanks to Jeff Bowman for suggesting.)
  • Command ement-tag-room toggles tags (rather than adding by default and removing when called with a prefix).
  • Default room grouping now groups “spaced” rooms separately.

Fixes

  • Message format filter works properly when writing replies.
  • Improve insertion of sender name headers when using the “Elemental” message format.
  • Prompts in commands ement-leave-room and ement-forget-room.

0.7

Additions

  • Command ement-room-override-name sets a local override for a room’s display name. (Especially helpful for 1:1 rooms and bridged rooms. See MSC3015.)

Changes

  • Improve display of room tombstones (displayed at top and bottom of buffer, and new room ID is linked to join).
  • Use descriptive prompts in ement-leave-room and ement-forget-room commands.

Fixes

  • Command ement-view-space when called from a room buffer. (Thanks to Richard Brežák for reporting.)
  • Don’t call display-buffer when reverting room list buffer. (Fixes #121. Thanks to mekeor for reporting.)
  • Retry sync for network timeouts. (Accidentally broken in v0.6.)

Internal

  • Function ement-put-account-data accepts :room argument to put on a room’s account data.

0.6

Additions

  • Command ement-view-space to view a space’s rooms in a directory buffer.

Changes

  • Improve ement-describe-room command (formatting, bindings).

Fixes

  • Retry sync for HTTP 502 “Bad Gateway” errors.
  • Formatting of unban events.
  • Update password authentication according to newer Matrix spec. (Fixes compatibility with Conduit servers. #66. Thanks to Travis Peacock, Arto Jantunen, and Stephen D.)
  • Image scaling issues. (Thanks to Visuwesh.)

0.5.2

Fixes

  • Apply ement-initial-sync-timeout properly (important for when the homeserver is slow to respond).

0.5.1

Fixes

  • Autoload ement-directory commands.
  • Faces in ement-directory listings.

0.5

Additions

  • Present “joined-and-left” and “rejoined-and-left” membership event pairs as such.
  • Process and show rooms’ canonical alias events.

Changes

  • The taxy.el-based room list, with programmable, smart grouping, is now the default ement-room-list. (The old, tabulated-list-mode-based room list is available as ement-tabulated-room-list.)
  • When selecting a room to view with completion, don’t offer spaces.
  • When selecting a room with completion, empty aliases and topics are omitted instead of being displayed as nil.

Fixes

  • Use of send-message filter when replying.
  • Replies may be written in compose buffers.

0.4.1

Fixes

  • Don’t show “curl process interrupted” message when updating a read marker’s position again.

0.4

Additions

  • Option ement-room-unread-only-counts-notifications, now enabled by default, causes rooms’ unread status to be determined only by their notification counts (which are set by the server and depend on rooms’ notification settings).
  • Command ement-room-set-notification-state sets a room’s notification state (imitating Element’s user-friendly presets).
  • Room buffers’ Transient menus show the room’s notification state (imitating Element’s user-friendly presets).
  • Command ement-set-display-name sets the user’s global displayname.
  • Command ement-room-set-display-name sets the user’s displayname in a room (which is also now displayed in the room’s Transient menu).
  • Column Notifications in the ement-taxy-room-list buffer shows rooms’ notification state.
  • Option ement-interrupted-sync-hook allows customization of how sync interruptions are handled. (Now, by default, a warning is displayed instead of merely a message.)

Changes

  • When a room’s read receipt is updated, the room’s buffer is also marked as unmodified. (In concert with the new option, this makes rooms’ unread status more intuitive.)

Fixes

  • Binding of command ement-forget-room in room buffers.
  • Highlighting of @room mentions.

0.3.1

Fixes

  • Room unread status (when the last event in a room is sent by the local user, the room is considered read).

0.3

Additions

  • Command ement-directory shows a server’s room directory.
  • Command ement-directory-search searches a server’s room directory.
  • Command ement-directory-next fetches the next batch of rooms in a directory.
  • Command ement-leave-room accepts a FORCE-P argument (interactively, with prefix) to leave a room without prompting.
  • Command ement-forget-room accepts a FORCE-P argument (interactively, with prefix) to also leave the room, and to forget it without prompting.
  • Option ement-notify-mark-frame-urgent-predicates marks the frame as urgent when (by default) a message mentions the local user or “@room” and the message’s room has an open buffer.

Changes

  • Minor improvements to date/time headers.

Fixes

  • Command ement-describe-room for rooms without topics.
  • Improve insertion of old messages around existing timestamp headers.
  • Reduce D-Bus notification system check timeout to 2 seconds (from the default of 25).
  • Compatibility with Emacs 27.

0.2.1

Fixes

  • Info manual export filename.

0.2

Changes

  • Read receipts are re-enabled. (They’re now implemented with a global idle timer rather than window-scroll-functions, which sometimes caused a strange race condition that could cause Emacs to become unresponsive or crash.)
  • When determining whether a room is considered unread, non-message events like membership changes, reactions, etc. are ignored. This fixes a bug that caused certain rooms that had no message events (like some bridged rooms) to appear as unread when they shouldn’t have. But it’s unclear whether this is always preferable (e.g. one might want a member leaving a room to cause it to be marked unread), so this is classified as a change rather than simply a fix, and more improvements may be made to this in the future. (Fixes #97. Thanks to Julien Roy for reporting and testing.)
  • The ement-taxy-room-list view no longer automatically refreshes the list if the region is active in the buffer. (This allows the user to operate on multiple rooms without the contents of the buffer changing before completing the process.)

Fixes

  • Links to only rooms (as opposed to links to events in rooms) may be activated to join them.
  • Read receipts mark the last completely visible event (rather than one that’s only partially displayed).
  • Prevent error when a room avatar image fails to load.

0.1.4

Fixed

  • Info manual directory headers.

0.1.3

Fixed

  • Temporarily disable sending of read receipts due to an unusual bug that could cause Emacs to become unresponsive. (The feature will be re-enabled in a future release.)

0.1.2

Fixed

  • Function ement-room-sync correctly updates room-list buffers. (Thanks to Visuwesh.)
  • Only send D-Bus notifications when supported. (Fixes #83. Thanks to Tassilo Horn.)

0.1.1

Fixed

  • Function ement-room-scroll-up-mark-read selects the correct room window.
  • Option ement-room-list-avatars defaults to what function display-images-p returns.

0.1

After almost two years of development, the first tagged release. Submitted to GNU ELPA.

Development

Bug reports, feature requests, suggestions — oh my!

Copyright Assignment

Ement.el is published in GNU ELPA and is considered part of GNU Emacs. Therefore, cumulative contributions of more than 15 lines of code require that the author assign copyright of such contributions to the FSF. Authors who are interested in doing so may contact [email protected] to request the appropriate form.

Matrix spec in Org format

An Org-formatted version of the Matrix spec is available in the meta/spec branch.

Rationale

This section is preserved for posterity. As it says, Ement.el has long since surpassed ~matrix-client~, which should no longer be used.

Why write a new Emacs Matrix client when there is already matrix-client.el, by the same author, no less? A few reasons:

  • matrix-client uses an older version of the Matrix spec, r0.3.0, with a few elements of r0.4.0 grafted in. Bringing it up to date with the current version of the spec, r0.6.1, would be more work than to begin with the current version. Ement.el targets r0.6.1 from the beginning.
  • matrix-client does not use Matrix’s lazy-loading feature (which was added to the specification later), so initial sync requests can take a long time for the server to process and can be large (sometimes tens of megabytes of JSON for the client to process!). Ement.el uses lazy-loading, which significantly improves performance.
  • matrix-client automatically makes buffers for every room a user has joined, even if the user doesn’t currently want to watch a room. Ement.el opens room buffers on-demand, improving performance by not having to insert events into buffers for rooms the user isn’t watching.
  • matrix-client was developed without the intention of publishing it to, e.g. MELPA or ELPA. It has several dependencies, and its code does not always install or compile cleanly due to macro-expansion issues (apparently depending on the user’s Emacs config). Ement.el is designed to have minimal dependencies outside of Emacs (currently only one, plz, which could be imported into the project), and every file is linted and compiles cleanly using makem.sh.
  • matrix-client uses EIEIO, probably unnecessarily, since few, if any, of the benefits of EIEIO are realized in it. Ement.el uses structs instead.
  • matrix-client uses bespoke code for inserting messages into buffers, which works pretty well, but has a few minor bugs which are difficult to track down. Ement.el uses Emacs’s built-in (and perhaps little-known) ewoc library, which makes it much simpler and more reliable to insert and update messages in buffers, and enables the development of advanced UI features more easily.
  • matrix-client was, to a certain extent, designed to imitate other messaging apps. The result is, at least when used with the matrix-client-frame command, fairly pleasing to use, but isn’t especially “Emacsy.” Ement.el is intended to better fit into Emacs’s paradigms.
  • matrix-client’s long name makes for long symbol names, which makes for tedious, verbose code. ement is easy to type and makes for concise, readable code.
  • The author has learned much since writing matrix-client and hopes to write simpler, more readable, more maintainable code in Ement.el. It’s hoped that this will enable others to contribute more easily.

Note that, while matrix-client remains usable, and probably will for some time to come, Ement.el has now surpassed it in every way. The only reason to choose matrix-client instead is if one is using an older version of Emacs that isn’t supported by Ement.el.

License

GPLv3

More Repositories

1

org-super-agenda

Supercharge your Org daily/weekly agenda by grouping items
Emacs Lisp
1,182
star
2

org-ql

An Org-mode query language, including search commands and saved views
Emacs Lisp
1,159
star
3

emacs-package-dev-handbook

An Emacs package development handbook. Built with Emacs, by Emacs package developers, for Emacs package developers.
JavaScript
987
star
4

magit-todos

Show source files' TODOs (and FIXMEs, etc) in Magit status buffer
Emacs Lisp
601
star
5

org-web-tools

View, capture, and archive Web pages in Org-mode
Emacs Lisp
519
star
6

org-sidebar

A helpful sidebar for Org mode
Shell
492
star
7

org-rifle

Rifle through your Org-mode buffers and acquire your target
Emacs Lisp
488
star
8

org-protocol-capture-html

Capture HTML from the browser selection into Emacs as org-mode content
Emacs Lisp
442
star
9

bufler.el

A butler for your buffers. Group buffers into workspaces with programmable rules, and easily switch to and manipulate them.
Emacs Lisp
378
star
10

unpackaged.el

A collection of useful Emacs Lisp code that isn't substantial enough to be packaged
Emacs Lisp
345
star
11

solarized-everything-css

A collection of Solarized user-stylesheets for...everything?
CSS
275
star
12

burly.el

Save and restore frames and windows with their buffers in Emacs
Emacs Lisp
252
star
13

matrix-client.el

A Matrix client for Emacs! (deprecated in favor of Ement.el)
Emacs Lisp
241
star
14

prism.el

Disperse Lisp forms (and other languages) into a spectrum of colors by depth
Emacs Lisp
228
star
15

org-graph-view

View Org buffers as a clickable, graphical mind-map
Emacs Lisp
190
star
16

pocket-reader.el

Emacs client for Pocket reading list (getpocket.com)
Emacs Lisp
188
star
17

yequake

Drop-down Emacs frames, like Yakuake
Emacs Lisp
175
star
18

ts.el

Emacs timestamp and date-time library
Emacs Lisp
159
star
19

dogears.el

Never lose your place in Emacs again
Emacs Lisp
154
star
20

with-emacs.sh

Script to easily run Emacs with specified configurations
Shell
142
star
21

makem.sh

Makefile-like script for building and testing Emacs Lisp packages
Shell
128
star
22

plz.el

An HTTP library for Emacs
Emacs Lisp
126
star
23

bucket

A bucket for your shell (like a set of registers, or a clipboard manager)
Shell
118
star
24

restic-runner

Configure and run Restic more easily
Shell
108
star
25

hammy.el

Programmable, interactive interval timers (e.g. for working/resting)
Emacs Lisp
103
star
26

org-sticky-header

Show off-screen Org heading at top of window
Emacs Lisp
103
star
27

alpha-org

A powerful Org configuration
Emacs Lisp
100
star
28

org-make-toc

Automatic tables of contents for Org files
Shell
83
star
29

taxy.el

Programmable taxonomical hierarchies for arbitrary objects
Emacs Lisp
82
star
30

transclusion-in-emacs

Resources about implementing transclusion in Emacs
79
star
31

topsy.el

Simple sticky header showing definition beyond top of window
Emacs Lisp
77
star
32

org-bookmark-heading

Emacs bookmark support for Org-mode
Emacs Lisp
75
star
33

snow.el

Let it snow in Emacs!
Emacs Lisp
72
star
34

org-now

Conveniently show current Org tasks in a sidebar window
Emacs Lisp
50
star
35

bashcaster

An actually simple screen recorder for Linux
Shell
48
star
36

org-recent-headings

Go to recently used Org headings
Shell
47
star
37

obvious.el

Who needs comments when the code is so obvious
Emacs Lisp
46
star
38

frame-purpose.el

Purpose-specific frames for Emacs
Emacs Lisp
46
star
39

org-almanac

Almanac for Org mode
43
star
40

mosey.el

Mosey around inside your Emacs buffer
Emacs Lisp
37
star
41

org-html-theme-darksun

A Solarized Dark version of the Bigblow Org HTML export theme
JavaScript
36
star
42

salv.el

Local minor mode to save a buffer when Emacs is idle
Emacs Lisp
33
star
43

sword-to-org

Convert Sword modules to Org-mode outlines
Emacs Lisp
33
star
44

org-auto-expand

Automatically expand certain Org headings
Shell
28
star
45

mangle

Mangle man pages to show just the parts you need (suitable for aliasing to "man")
Shell
26
star
46

magit.sh

Run Magit in a separate Emacs instance
Shell
26
star
47

org-notely

Pop to new Org headings for quick notetaking
Shell
26
star
48

scrollkeeper.el

Configurable scrolling commands with visual guidelines, for Emacs
Emacs Lisp
22
star
49

ap.el

A simple, Emacs Lisp-focused Emacs config
Emacs Lisp
21
star
50

highlight-function-calls

Highlight function/macro calls in Emacs
Emacs Lisp
21
star
51

org-quick-peek

Quick inline peeks at agenda items and linked nodes in Org-mode
Emacs Lisp
21
star
52

defrepeater.el

Easily define repeatable Emacs commands
Emacs Lisp
20
star
53

pocket-lib.el

Emacs library for the getpocket.com API
Emacs Lisp
19
star
54

org-pocket

Tools to use Pocket with Org-mode
Emacs Lisp
16
star
55

elexandria

Alexandria-like library for Emacs Lisp
Emacs Lisp
13
star
56

sword-converter

Convert SWORD modules to JSON and SQLite and search the converted files
Emacs Lisp
13
star
57

frecency.el

Library to sort items by "frecency" in Emacs
Emacs Lisp
11
star
58

chromatext.el

Apply color gradients to lines of text in Emacs (possibly increasing legibility)
Emacs Lisp
9
star
59

plamix

Mix together M3U playlists, optionally with a desired duration, outputting either a list of files to STDOUT, or writing an M3U playlist to a file
Python
9
star
60

pyza

A command-line/terminal/console Songza player, using VLC or MPD to play audio
Python
8
star
61

melpa-stats

Stats tools for MELPA
Emacs Lisp
6
star
62

org-books

Tools for books in Org-mode
Emacs Lisp
5
star
63

rubbish.py

WIP: A CLI to the XDG trash bin in Python
Python
5
star
64

tp.el

Emacs text-property convenience library
Emacs Lisp
5
star
65

org-search-goto

org-search-goto
Emacs Lisp
5
star
66

buffer-groups.el

A lightweight, automatic grouping rule-based buffer grouper and switcher
Emacs Lisp
5
star
67

ibuffer-auto-groups

Automatically make groups for ibuffer
Emacs Lisp
5
star
68

ampd-tools

A small collection of MPD-related tools
Python
4
star
69

reddit-emacs-css

CSS for /r/emacs
CSS
4
star
70

ox-elisp

Export Org buffers to Emacs Lisp comments
Emacs Lisp
3
star
71

dbg.el

Simple debugging macros
Emacs Lisp
3
star
72

tabtint

Firefox extension which tints Firefox tabs to match color of web page
JavaScript
3
star
73

ya-solarized.el

Yet Another Solarized theme for Emacs
Emacs Lisp
2
star
74

overwatch-formula76

A racing custom game type for Overwatch
C
2
star
75

overwatch-custom-games

A collection of custom games for Overwatch
Emacs Lisp
2
star
76

listen.el

Audio/music player for Emacs
Emacs Lisp
2
star
77

unsplash.hy

Hy
1
star
78

helm-swish

Like helm-swoop, but a little bit faster
Emacs Lisp
1
star
79

greek-hebrew-emacs

How to set up Emacs to easily type Greek and Hebrew
1
star
80

source-status-linker

Turns output of Source engine's status command into links to Steam user profiles
Python
1
star
81

github-solarized

A Solarized user stylesheet for GitHub made with Stylus
CSS
1
star
82

pentadactyl-tabmattach

JavaScript
1
star