File: README.org

package info (click to toggle)
ement-el 0.16-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,864 kB
  • sloc: lisp: 8,659; sh: 911; makefile: 38
file content (814 lines) | stat: -rw-r--r-- 51,017 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
#+TITLE: Ement.el

#+PROPERTY: LOGGING nil

# Export options.
#+OPTIONS: broken-links:t *:t num:1 toc:1

# Info export options.
#+EXPORT_FILE_NAME: ement.texi
#+TEXINFO_DIR_CATEGORY: Emacs
#+TEXINFO_DIR_TITLE: Ement: (ement)
#+TEXINFO_DIR_DESC: Matrix client for Emacs

# Note: This readme works with the org-make-toc <https://github.com/alphapapa/org-make-toc> package, which automatically updates the table of contents.

#+HTML: <img src="images/logo-128px.png" align="right">

# ELPA badge image.
[[https://elpa.gnu.org/packages/ement.html][https://elpa.gnu.org/packages/ement.svg]]

Ement.el is a [[http://www.matrix.org/][Matrix]] client for [[https://www.gnu.org/software/emacs/][GNU Emacs]].  It aims to be simple, fast, featureful, and reliable, while integrating naturally with Emacs.

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

* Contents                                                         :noexport:
:PROPERTIES:
:TOC:      :include siblings
:END:
:CONTENTS:
- [[#installation][Installation]]
- [[#usage][Usage]]
  - [[#bindings][Bindings]]
  - [[#tips][Tips]]
  - [[#encrypted-room-support-through-pantalaimon][Encrypted room support through Pantalaimon]]
- [[#changelog][Changelog]]
- [[#development][Development]]
:END:

* Screenshots                                                      :noexport:
:PROPERTIES:
:ID:       d818f690-5f22-4eb0-83e1-4d8ce16c9e5b
:END:

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 customizable 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 [[#displaying-symbols-and-emojis][proper Emacs configuration]])./

* Installation
:PROPERTIES:
:TOC:      :depth 0
:END:

** GNU ELPA

Ement.el is published in [[http://elpa.gnu.org/][GNU ELPA]] as [[https://elpa.gnu.org/packages/ement.html][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 [[https://elpa.gnu.org/devel/ement.html][ELPA-devel]] or from Git (see below).

** GNU Guix

Ement.el is available in [[https://guix.gnu.org/][GNU Guix]] as [[https://packages.guix.gnu.org/packages/emacs-ement/][emacs-ement]].

** Debian, Ubuntu

Ement.el is available in [[https://packages.debian.org/elpa-ement][Debian as elpa-ement]] and in [[https://packages.ubuntu.com/search?suite=default&section=all&arch=any&keywords=elpa-ement&searchon=names][Ubuntu as elpa-ement]].

** Nix

Ement.el is available in [[https://nixos.org/][NixOS]] as [[https://search.nixos.org/packages?channel=23.05&show=emacsPackages.ement&from=0&size=50&sort=relevance&type=packages&query=ement][emacsPackages.ement]].

** Other distributions

Ement.el is also available in some other distributions.  See [[https://repology.org/project/emacs:ement/related][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 [[https://github.com/quelpa/quelpa-use-package][quelpa-use-package]], like this (using [[https://github.com/alphapapa/unpackaged.el#upgrade-a-quelpa-use-package-forms-package][this helpful command]] for upgrading versions):

#+BEGIN_SRC elisp
  ;; 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"))
#+END_SRC

One might also use systems like [[https://github.com/progfolio/elpaca][Elpaca]] or [[https://github.com/radian-software/straight.el][Straight]] (which is also used by [[https://github.com/doomemacs/doomemacs][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
:PROPERTIES:
:TOC:      :include descendants :depth 1
:END:
:CONTENTS:
- [[#bindings][Bindings]]
- [[#tips][Tips]]
- [[#encrypted-room-support-through-pantalaimon][Encrypted room support through Pantalaimon]]
:END:

1. Call command ~ement-connect~ to connect.  Multiple sessions are supported: call the command again with a ~C-u~ universal prefix to connect to another account.
2. Wait for initial sync to complete (which can take a few moments--initial sync JSON responses 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

Note that if global minor mode ~ement-room-self-insert-mode~ is enabled (by default it is disabled), typing any of the common printable ascii characters (such as letters) in a room buffer will start a new message, and most of the following bindings are instead accessed via a prefix key.  See the minor mode docstring for details.  (The ~?~ binding is an exception; by default it opens the command menu regardless of this minor mode.)

+ 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~
+ Compose message in buffer: ~M-RET~ (while writing in minibuffer: ~C-c '‍~).  Customize the option ~ement-room-compose-method~ to make ~RET~ and the other message bindings use a compose buffer by default.  Use command ~ement-room-compose-org~ to activate Org mode in the compose buffer.
+ Write reply to event at point: ~S-<return>~
+ 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-<return>~

** Tips

# TODO: Show sending messages in Org format.

+ 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
  - Note that the default ~org-export-preserve-breaks~ value causes singular line breaks to be exported as spaces.  To preserve the line breaks, indentation, and blank lines in a region, but otherwise use normal formatting, you can use the ~verse~ block type.  Refer to ~(info "(org) Paragraphs")~ and ~(info "(org) Structure Templates")~ for details.
+ 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 [[https://github.com/alphapapa/burly.el][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.)
+ Customize ~ement-room-use-variable-pitch~ to render messages using proportional fonts.
+ 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 [[https://emacs.stackexchange.com/questions/62049/override-the-default-font-for-emoji-characters][this question and answer]], you may find that the simplest way to fix this is to install an appropriate font, like [[https://www.google.com/get/noto/#emoji-zsye][Noto Emoji]], and then use this Elisp code:

#+BEGIN_SRC elisp
  (setf use-default-font-for-symbols nil)
  (set-fontset-font t 'unicode "Noto Emoji" nil 'append)
#+END_SRC

** 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 [[https://github.com/matrix-org/pantalaimon/][Pantalaimon]].  After configuring it according to its documentation, call ~ement-connect~ with the appropriate hostname and port, like:

#+BEGIN_SRC elisp
  (ement-connect :uri-prefix "http://localhost:8009")
#+END_SRC

* Changelog
:PROPERTIES:
:TOC:      :depth 0
:END:

** 0.16

*Compatibility*

+ Use authenticated media requests (part of Matrix 1.11; see [[https://github.com/matrix-org/matrix-spec-proposals/pull/3916][MSC3916]] and [[https://matrix.org/blog/2024/06/26/sunsetting-unauthenticated-media/][matrix.org's sunsetting unauthenticated media]]).

*Additions*

+ When option ~ement-room-images~ is disabled (preventing automatic download and display of images), individual images may be shown by clicking the button in their events.

*Changes*

+ Option ~ement-room-coalesce-events~ may now be set to (and defaults to) a maximum number of events to coalesce together.  (This avoids potential performance problems in rare cases.  See [[https://github.com/alphapapa/ement.el/issues/247][#247]].  Thanks to [[https://github.com/viiru-][Arto Jantunen]] for reporting and [[https://github.com/sergiodj][Sergio Durigan Junior]] for testing.)

*Fixes*
+ Replies to edited messages are correctly sent to the original event (whereas previously they were sent to the edit, which caused reactions to not be shown).  ([[https://github.com/alphapapa/ement.el/issues/230][#230]], [[https://github.com/alphapapa/ement.el/issues/277][#277]].  Thanks to [[https://github.com/phil-s][Phil Sainty]] for suggesting, and to [[https://github.com/dionisos2][dionisos]] for reporting.)
+ Set ~filter-buffer-substring-function~ in room buffers to prevent undesired text properties from being included in copied text.  ([[https://github.com/alphapapa/ement.el/pull/278][#278]].  Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ Command ~ement-disconnect~ no longer shows an error message.  ([[https://github.com/alphapapa/ement.el/issues/208][#208]].)
+ Retrieval of earlier events in a just-joined room.  ([[https://github.com/alphapapa/ement.el/issues/148][#148]].  Thanks to [[https://github.com/MagicRB][Richard Brežák]] for reporting, and to [[https://github.com/phil-s][Phil Sainty]] for testing.)
+ Cache computed displaynames in rooms (avoiding unnecessary reiteration and recalculation).  ([[https://github.com/alphapapa/ement.el/issues/298][#298]].  Thanks to [[https://github.com/Rutherther][Rutherther]] for reporting and testing, and to [[https://github.com/phil-s][Phil Sainty]].)
+ Customization group for options ~ement-room-mode-hook~ and ~ement-room-self-insert-mode~.  (Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ Inheritance for some faces.  ([[https://github.com/alphapapa/ement.el/pull/303][#303]].  Thanks to [[https://github.com/tarsius][Jonas Bernoulli]].) 

** 0.15.1

*Fixes*
+ Handle unnamed rooms in ~ement-directory~ list.  (See [[https://github.com/alphapapa/ement.el/issues/248][#248]].  Thanks to [[https://github.com/hjozwiak][Hunter Jozwiak]] and [[https://github.com/bmp][Bharath Palavalli]] for reporting.)
+ Don't use ~cl-type~ ~pcase~ form in Emacs versions before 28.  ([[https://github.com/alphapapa/ement.el/issues/279][#279]].  Thanks to [[https://github.com/AdamBark][Adam Bark]] for reporting.)

** 0.15
:PROPERTIES:
:ID:       81b48364-56a7-4903-b354-b79905edb039
:END:

*Additions*

+ Configurable emoji picker for sending reactions.  ([[https://github.com/alphapapa/ement.el/issues/199][#199]], [[https://github.com/alphapapa/ement.el/pull/201][#201]].  Thanks to [[https://github.com/oantolin][Omar Antolín Camarena]].) ::
  - Option ~ement-room-reaction-picker~ sets the default picker.  Within that, the user may press ~C-g~ to choose a different one with a key bound in ~ement-room-reaction-map~.

+ A variety of enhancements for using compose buffers.  ([[https://github.com/alphapapa/ement.el/issues/140][#140]].  Thanks to [[https://github.com/phil-s][Phil Sainty]].) :: Chiefly, messages can now be composed in small windows below room windows, rather than in the minibuffer or a full-sized window.  A variety of options and commands are available related to these features.  See [[#compose-buffer-enhancements][compose buffer enhancements]].

+ Global minor mode ~ement-room-self-insert-mode~ enables "just typing" to start a message.  (Thanks to [[https://github.com/phil-s][Phil Sainty]].) :: See [[#ement-room-self-insert-mode][ement-room-self-insert-mode]].

+ Options affecting how images are displayed in room buffers. :: See [[#image-display][image display]].

*Changes*

+ Improve prompt used when viewing a room that is not joined.  ([[https://github.com/alphapapa/ement.el/issues/241][#241]].  Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ Format "was kicked and rejoined" membership event pairs.
+ Enclose reasons for membership events in quotes for clarity.
+ Improve default room list grouping.
+ When editing or replying to a message in a compose buffer, the related room event is highlighted persistently until the compose buffer is killed.  (Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ In compose buffers ~dabbrev~ will prioritise firstly the associated room, and secondly all other rooms, before looking to other buffers for completions.  (Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ Aborted messages are now added to ~ement-room-message-history~ rather than the kill-ring.  (Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ Prefix bindings in ~ement-room-mode-map~ now have named labels in ~which-key~ and similar.  (Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ Option: ~ement-room-use-variable-pitch~ (previously named ~ement-room-shr-use-fonts~) enables variable-pitch fonts for all message types.  (This option previously supported formatted messages, but now works for plain text messages as well.)  Note: users who have customized the ~ement-room-message-text~ face to be variable-pitch should revert that change, as it causes problems for formatted messages, and is no longer necessary.  ([[https://github.com/alphapapa/ement.el/issues/174][#174]].  Thanks to [[https://github.com/phil-s][Phil Sainty]].)

*Fixes*

+ Edits to previous edit events are correctly sent to the server as edits to the original message event.  ([[https://github.com/alphapapa/ement.el/issues/230][#230]].  Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ Completion at point works more reliably in compose buffers.  (Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ Toggling images to fill the window body no longer triggers unintended scrolling.  (Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ Recognition of mentions after a newline.  ([[https://github.com/alphapapa/ement.el/issues/267][#267]].  Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ Newlines in ~ement-room-message-format-spec~ are considered when calculating the wrap-prefix.  (Thanks to [[https://github.com/phil-s][Phil Sainty]].)
+ Weight of face ~ement-room-list-direct~ (now correctly bold in room list heading).

*** Compose buffer enhancements
:PROPERTIES:
:CUSTOM_ID: compose-buffer-enhancements
:END:

- Option ~ement-room-compose-buffer-display-action~ declares how and where a new compose buffer window should be displayed.  (By default, in a new window below the associated room buffer.)
- Option ~ement-room-compose-buffer-window-dedicated~ determines whether compose buffers will have dedicated windows.
- Option ~ement-room-compose-buffer-window-auto-height~ causes dynamic scaling of the compose buffer window height so that the full message is visible at all times.
- Option ~ement-room-compose-buffer-window-auto-height-min~ specifies the minimum window height when ~ement-room-compose-buffer-window-auto-height~ is enabled.
- Option ~ement-room-compose-buffer-window-auto-height-max~ specifies the maximum window height when ~ement-room-compose-buffer-window-auto-height~ is enabled.
- Option ~ement-room-compose-method~ chooses between minibuffer-centric or compose-buffer-centric behaviour.
- Command ~ement-room-dispatch-new-message~ starts writing a new message using your chosen ~ement-room-compose-method~.  (Bound to ~RET~ in room buffers.)
- Command ~ement-room-dispatch-new-message-alt~ starts writing a new message using the alternative method.  (Bound to ~M-RET~ in room buffers.)
- Command ~ement-room-dispatch-edit-message~ edits a message using your chosen ~ement-room-compose-method~.  (Bound to ~<insert>~ in room buffers.)
- Command ~ement-room-dispatch-reply-to-message~ replies to a message using your chosen ~ement-room-compose-method~.  (Bound to ~S-<return>~ in room buffers.)
- Command ~ement-room-compose-edit~ edits a message using a compose buffer.
- Command ~ement-room-compose-reply~ replies to a message using a compose buffer.
- Command ~ement-room-compose-send-direct~ sends a message directly from a compose buffer (without the minibuffer).  (Bound to ~C-x C-s~ in compose buffers.)
- Command ~ement-room-compose-abort~ kills the compose buffer and delete its window.  (Bound to ~C-c C-k~ in compose buffers.)
- Command ~ement-room-compose-abort-no-history~ does the same without adding to ~ement-room-message-history~.  (Equivalent to ~C-u C-c C-k~.)
- Command ~ement-room-compose-history-prev-message~ cycles backwards through ~ement-room-message-history~.  (Bound to ~M-p~ in compose buffers.)
- Command ~ement-room-compose-history-next-message~ cycles forwards through ~ement-room-message-history~.  (Bound to ~M-n~ in compose buffers.)
- Command ~ement-room-compose-history-isearch-backward~ initiates an isearch through ~ement-room-message-history~.  (Bound to ~M-r~ in compose buffers; continue searching with ~C-r~ or ~C-s~.)
- Command ~ement-room-compose-history-isearch-backward-regexp~ initiates a regexp isearch through ~ement-room-message-history~.  (Bound to ~C-M-r~ in compose buffers; continue searching with ~C-r~ or ~C-s~.)

*** ~ement-room-self-insert-mode~
:PROPERTIES:
:CUSTOM_ID: ement-room-self-insert-mode
:END:

- Option ~ement-room-self-insert-commands~ determines which commands will start a new message when ~ement-room-self-insert-mode~ is enabled (defaulting to ~self-insert-command~ and ~yank~).
- Option ~ement-room-self-insert-chars~ determines which typed characters will start a new message when ~ement-room-self-insert-mode~ is enabled (regardless of whether they are bound to ~self-insert-command~).
- Option ~ement-room-mode-map-prefix-key~ defines a prefix key for accessing the full ~ement-room-mode-map~ when ~ement-room-self-insert-mode~ is enabled.  (By default this key is ~DEL~.)
 
*** Image display
:PROPERTIES:
:CUSTOM_ID: image-display
:END:

- Option ~ement-room-image-margin~ is the number of pixels of margin around image thumbnails.
- Option ~ement-room-image-relief~ is the number of pixels of shadow rectangle around image thumbnails.
- Option ~ement-room-image-thumbnail-height~ is the window body height multiple to use when toggling full-sized images to thumbnails (by default, 0.2).
- Option ~ement-room-image-thumbnail-height-min~ is the minimum pixel height for thumbnail images (by default, 30 pixels).



** 0.14

*Additions*

+ Audio events are rendered as a link to the audio file.  (Thanks to [[https://github.com/viiru-][Arto Jantunen]].)
+ Customization group ~ement-room-list~.
+ Option ~ement-room-list-space-prefix~ is applied to space names in the room list (e.g. set to empty string for cleaner appearance).
+ Option ~ement-room-reaction-names-limit~ sets how many senders of a reaction are shown in the buffer (more than that many are shown in the tooltip).

*Changes*

+ Bind ~TAB~ / ~BACKTAB~ to move between links in room and like buffers.  ([[https://github.com/alphapapa/ement.el/issues/113][#113]].  Thanks to [[https://github.com/ericsfraga][Eric S. Fraga]] for suggesting.)

*Fixes*

+ Insertion of sender headers (when using "Elemental" message format).  (Refactoring contributed by [[https://github.com/Stebalien][Steven Allen]].)
+ Some room event data was being unintentionally serialized to disk when caching the room list visibility state. ([[https://github.com/alphapapa/ement.el/issues/256][#256]])
+ Notifications buffer restores properly when bookmarked.
+ Command ~ement-room-send-reaction~ checks for an event at point.  (Thanks to [[https://github.com/phil-s][Phil Sainty]].)

** 0.13

*Additions*

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

*Changes*

+ Command ~ement-room-image-show~ use frame parameters to maximize the frame, making it easier for users to override.  ([[https://github.com/alphapapa/ement.el/issues/223][#223]].  Thanks to [[https://github.com/progfolio][Nicholas Vollmer]].)

*Fixes*

+ Name for direct rooms in directory buffers.
+ Editing a message from the compose buffer would be sent as a reply to the edited message.  (Fixes [[https://github.com/alphapapa/ement.el/issues/189][#189]].  Thanks to [[https://github.com/phil-s][Phil Sainty]] for reporting.)
+ Editing an already-edited message.  ([[https://github.com/alphapapa/ement.el/issues/226][#226]].  Thanks to [[https://github.com/phil-s][Phil Sainty]] for reporting.)
+ Replying to an already-edited message.  ([[https://github.com/alphapapa/ement.el/issues/227][#227]].  Thanks to [[https://github.com/phil-s][Phil Sainty]] for reporting.)
+ Rendering redactions of edited messages.  ([[https://github.com/alphapapa/ement.el/issues/228][#228]].  Thanks to [[https://github.com/phil-s][Phil Sainty]] for reporting.)
+ Redacting an edited message.  ([[https://github.com/alphapapa/ement.el/issues/228][#228]].  Thanks to [[https://github.com/phil-s][Phil Sainty]] for reporting.)
+ Command ~ement-room-flush-colors~ maintains point position.

** 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 [[https://github.com/rrix/][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 [[https://github.com/phil-s][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 [[https://github.com/alphapapa/ement.el/issues/216][#216]].  Thanks to [[https://github.com/phil-s][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 [[https://github.com/Stebalien][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 [[https://github.com/Stebalien][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 [[https://spec.matrix.org/v1.7/client-server-api/#actions][v1.7 of the spec]].  Thanks to [[https://github.com/Stebalien][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 [[https://github.com/vizs][Visuwesh]] and ~@mrtnmrtn:matrix.org~.)
+ Events in notifications buffer could appear out-of-order.  ([[https://github.com/alphapapa/ement.el/issues/191][#191]].  Thanks to [[https://github.com/phil-s][Phil Sainty]].)

*Internal*
+ The ~ement-read-receipt-idle-timer~ could be duplicated when using multiple sessions.  ([[https://github.com/alphapapa/ement.el/issues/196][#196]].  Thanks to [[https://github.com/phil-s][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*
+ Support for Single Sign-On (SSO) authentication.  ([[https://github.com/alphapapa/ement.el/issues/24][#24]].  Thanks to [[https://github.com/Necronian][Jeffrey Stoffers]] for development, and to [[https://github.com/phil-s][Phil Sainty]], [[https://github.com/FrostyX][Jakub Kadlčík]], and [[https://github.com/oneingan][Juanjo Presa]] for testing.)
+ Bind ~m~ in room buffers to ~ement-room-mark-read~ (which moves read markers to point).

*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 [[https://github.com/Stebalien][Steven Allen]].)
+ Customization group for faces.
+ Don't reinitialize ~ement-room-list-mode~ when room list buffer is refreshed.  ([[https://github.com/alphapapa/ement.el/issues/146][#146]].  Thanks to [[https://github.com/treed][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 [[https://github.com/Stebalien][Steven Allen]].)
+ Minor improvements to auto-detection of homeserver URIs.  (See [[https://github.com/alphapapa/ement.el/issues/24#issuecomment-1569518713][#24]].  Thanks to [[https://github.com/phil-s][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 [[https://github.com/viiru-][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 [[https://github.com/alphapapa/ement.el/issues/147][#147]].  Thanks to [[https://github.com/jgarte][@jgarte]] for reporting.)
+ Don't error in ~ement-room-list~ when no rooms are joined.  (Fixes [[https://github.com/alphapapa/ement.el/issues/123][#123]].  Thanks to [[https://github.com/Kabouik][@Kabouik]] and [[https://github.com/oantolin][Omar Antolín Camarena]] for reporting.)
+ Enable member/room completion in compose buffers.  (Fixes [[https://github.com/alphapapa/ement.el/issues/115][#115]].  Thanks to Thanks to [[https://github.com/piater][Justus Piater]] and [[https://github.com/chasecaleb][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=).  ([[https://github.com/alphapapa/ement.el/issues/134][#134]].  Thanks to [[https://github.com/viiru-][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.  ([[https://github.com/alphapapa/ement.el/issues/131][#131]].  Thanks to [[https://github.com/jeffbowman][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 [[https://github.com/matrix-org/matrix-spec-proposals/pull/3015#issuecomment-1451017296][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 [[https://github.com/MagicRB][Richard Brežák]] for reporting.)
+ Don't call ~display-buffer~ when reverting room list buffer.  (Fixes [[https://github.com/alphapapa/ement.el/issues/121][#121]].  Thanks to [[https://github.com/mekeor][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.  [[https://github.com/alphapapa/ement.el/issues/66][#66]].  Thanks to [[https://github.com/tpeacock19][Travis Peacock]], [[https://github.com/viiru-][Arto Jantunen]], and [[https://github.com/scd31][Stephen D]].)
+ Image scaling issues.  (Thanks to [[https://github.com/vizs][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 [[https://github.com/alphapapa/taxy.el][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 [[https://github.com/alphapapa/ement.el/issues/97][#97]].  Thanks to [[https://github.com/MrRoy][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*
# + Read receipt-sending function was called too many times when scrolling.
# + Send read receipts even when the last receipt is outside the range of retrieved events.
+ 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 [[https://github.com/vizs][Visuwesh]].)
+ Only send D-Bus notifications when supported.  (Fixes [[https://github.com/alphapapa/ement.el/issues/83][#83]].  Thanks to [[https://github.com/tsdh][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
:PROPERTIES:
:TOC:      :include this :ignore descendants
:END:

Bug reports, feature requests, suggestions — /oh my/!

** Copyright Assignment
:PROPERTIES:
:TOC:      :ignore (this)
:END:

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 [[mailto:assign@gnu.org][assign@gnu.org]] to request the appropriate form.

** Matrix spec in Org format
:PROPERTIES:
:TOC:      :ignore (this)
:END:

An Org-formatted version of the Matrix spec is available in the [[https://github.com/alphapapa/ement.el/tree/meta/spec][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 [[https://github.com/alphapapa/matrix-client.el][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 [[https://github.com/alphapapa/makem.sh][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
:PROPERTIES:
:TOC:      :ignore (this)
:END:

GPLv3

* COMMENT Config                                                   :noexport:
:PROPERTIES:
:TOC:      :ignore (this descendants)
:END:

# NOTE: The #+OPTIONS: and other keywords did not take effect when in this section (perhaps due to file size or to changes in Org), so they were moved to the top of the file.

** File-local variables

# Local Variables:
# eval: (require 'org-make-toc)
# before-save-hook: org-make-toc
# org-export-with-properties: ()
# org-export-with-title: t
# End: