lem 
- Description
- A lemmy client
- Latest
- lem-0.24.tar (.sig), 2025-Nov-13, 1010 KiB
- Maintainer
- martian hiatus <mousebot@disroot.org>
- Website
- https://codeberg.org/martianh/lem.el
- Browse ELPA's repository
- CGit or Gitweb
- Badge
To install this package from Emacs, use package-install or list-packages.
Full description
1. lem.el
lem.el is an Emacs client library and interface for Lemmy, the federated
link-aggregator and discussion platform (alternative to reddit, lobsters, etc.). For information about Lemmy, see join-lemmy.org.
2. install
lem.el is on MELPA, so you can install it from there.
Add MELPA to your archives:
(require 'package)
(add-to-list 'package-archives
'("melpa" . "http://melpa.org/packages/") t)
Update and install:
M-x package-refresh-contents RET
M-x package-install RET lem RET
Otherwise you can pull from this repo, main or develop branch, add to load-path, and require.
3. logging in
First set lem-instance-url to your lemmy instance.
Then the first time you call lem you'll be asked for your username and password.
If lem-use-totp is set to a non-nil value, you will also be asked for your TOTP.
Upon logging in, your authentication details will be saved in a plstore under your emacs directory. You "shouldn't" have to provide your password again (unless server-side updates require new login).
If you don't want to have to provide your username, add (setq lem-current-user
"yourusername") to your init file.
4. encrypted authentication tokens
If you'd like to encrypt your authentication token in the plstore, set lem-encrypt-auth-tokens to non-nil, delete the file ~/.emacs.d/lem.plstore, and log in again. For this to work you probably need to set plstore-encrypt-to to a valid GPG key.
5. usage
5.1. basic commands
A full command index is available at the end of this readme, but here are a few commands to get you going. You can also view the keybindings of lem-mode-map by hitting ? from a lem.el buffer.
I-lem-ui-view-instance- load the instance view.S- jump to one of your subscribed communities.C-lem-ui-browse-communities- browse communities in a sortable table./- switch between livelem.elbuffers.
N-lem-post-compose- compose a new post.r-lem-post-comment- reply to post or comment at point.
RET-lem-ui-view-item-at-point- load view of item at point, e.g. on a post, view its full thread.n/p- next/previous itemTAB/<backtab>- next/previous tab item (hyperlink, etc.)h- search, for communities, posts, comments, users.B- view your inbox (mentions, replies, private messages)O- view your own profileA- view your saved (bookmarked) items
l- like item at pointa- save item at pointd- delete item at pointe- edit item at pointc- jump to current item's communityu- jump to current item's user
s- subscribe to community
5.2. sorting views
Lemmy makes heavy use of sorting. Item (posts, comments, users, communities) views can be ordered according to various factors. lem.el implements this sorting in three main cycling commands, which work in most views:
C-c C-c-lem-ui-cycle-listing-type- cycle between results from local/subscribed/all/moderated communities. To directly set a listing type, calllem-ui-choose-listing-type. In your inbox view, cycle between replies, mentions, and private messages.C-c C-s-lem-ui-cycle-sort- cycle between sort types (new, hot, active, top, old, etc.). To directly set sort, callo, orlem-ui-choose-sort. Full sort type lists are found inlem-sort-typesandlem-comment-sort-types, the list is chosen according to the present view.C-c C-v-lem-ui-cycle-items- toggle between posts or comments, and optionally overview if the view supports it (e.g. user views). In the inbox, cycle between inbox items.
Additionally, for search there is:
C-c C-h-lem-ui-cycle-search- cycle between search result types for the current query (users, posts, comments, communities).
5.3. sorting via widgets
Listing, sort, item, and search types are also visible and modifiable by drop-down widgets that appear near the top of a given view's buffer. A widget appears for each option that is applicable to the view. Click (or hit RET) on a widget to change it and reload the view.
5.4. folding and navigating comment trees
lem.el has a number of comment tree navigating and folding (hiding) commands:
M-p-lem-ui-prev-same-level- navigate to the previous same-level commentM-n-lem-ui-next-same-level- navigate to the next same-level commentM-u-lem-ui-branch-top-level- move to the comment at the top of branch point is in
f-lem-ui-comment-tree-fold- toggle folding of current comment, and all its children (but not its parents); this is also called by clicking the "+" widget on a commentF-lem-ui-comment-fold-toggle- toggle folding of current comment onlyM-f-lem-ui-fold-current-branch- toggle folding of current branch (parents and children)C-M-f-lem-ui-fold-all-toggle- toggle folding of all comments in bufferlem-ui-fold-all-comments- fold all comments in bufferlem-ui-unfold-all-comments- unfold all comments in buffer
You can also un-/fold community descriptions in community views.
6. dependencies
- fedi.el, a library to make writing a library of API requests easier.
- markdown-mode, which as per the
markdown-modedocs also requires that you have a markdown command installed and available in your path in order to render HTML output.markdown-modeandlem.elwill not install this for you, you must do it yourself. Examples includemarkdownandpandoc. Currentlylem.elrecommendsmarkdown, as its HTML output is slightly easier forshr.elto render, butpandocshould also be fine. Once you have one installed, customize the variablemarkdown-commandand point it to the exectuable. Seemarkdown-mode's installation instructions for more details: jrblevin/markdown-mode#installation.
hierarchy.elandvtable.elwhich should be included in your emacs.
7. API, other frontends
lem-api.el is the API requests layer. All functions make requests and return
JSON data pased into Elisp.
The idea is that it's then possible to write different frontends so users can read lemmy posts in whatever forms they like. Possibilities are notmuch, gnus, md4rd, or elfeed.
Most endpoints are implemented, as are most parameters for each endpoint.
There is an active todo list in lem-api.el.
New endpoints are trivial to implement with the lem-def-request macro.
lem-ui.el is our own interface layer. It takes inspiration and code from
mastodon.el, as that's what I know, and a lot of work has gone into it.
8. NB: API instability
The Lemmy developers have clearly stated that the current API version, v3, is
unstable and will likely be subject to breaking changes. This will mean lem.el
will have to play catch-up as things change.
9. contributions
Contributions are welcome. Open an issue to explain if you're working on
something, and if you want to work on lem-ui.el make sure that what you're
doing can't just be pulled in from mastodon.el to save work.
For pull requests, please always open them against the develop branch.
Also feel free to get in touch if you want to use lem-api.el to build another frontend.
10. Supporting lem.el
If you'd like to support continued development of lem.el, I accept donations
via paypal: paypal.me/martianh. If you would prefer a different payment
method, please write to me at <mousebot@disroot.org> and I can
provide IBAN or other bank account details.
I don't have a tech worker's income, so even a small tip would help out.
11. screenshots
12. commands index
| Binding | Command | Description |
|---|---|---|
| lem | Open lem, a Lemmy client. | |
| C-M-q | lem-kill-all-buffers | Kill all lem.el buffers. |
| lem-login-set-token | Login and set current user details. | |
| lem-mode | Major mode for Lemmy, the federated link-aggregator and forum. | |
| n | lem-next-item | Move to next item. |
| C-c C-k | lem-post-cancel | Kill new-post buffer/window. Does not POST content. |
| r | lem-post-comment | Reply to a post or comment. |
| lem-post-comment-mode | Minor mode for submitting comments to lemmy. | |
| lem-post-comment-simple | Reply to post or comment at point. | |
| N | lem-post-compose | Compose a new post. |
| lem-post-compose-simple | Create and submit new post, reading strings in the minibuffer. | |
| lem-post-create-community | Create a new community. | |
| lem-post-create-community-mode | Minor mode for creating new communities on lemmy. | |
| lem-post-edit | Edit the post at point if possible. | |
| lem-post-edit-comment | Edit comment at point if possible. | |
| e | lem-post-edit-post-or-comment | Try to edit item at point. |
| lem-post-item-author-private-message | Send a private message to the author of item at point. | |
| lem-post-mode | Minor mode for submitting posts to lemmy. | |
| lem-post-private-message | Send a private message to a user. | |
| lem-post-read-community-display-name | Read community display name (title - can be changed later). | |
| lem-post-read-community-name | Read community name (identifier - cannot be changed later). | |
| C-c C-t | lem-post-read-title | Read post title. |
| C-c C-u | lem-post-read-url | Read post URL. |
| C-c C-o | lem-post-select-community | Select community to post to. |
| C-c C-l | lem-post-set-post-language | Prompt for a language and set `fedi-post-language'. |
| C-c C-c | lem-post-submit | Submit the post, comment, or community to lemmy. |
| C-c C-n | lem-post-toggle-nsfw | Toggle `fedi-post-content-nsfw'. |
| lem-post-toggle-restricted-to-mods | Toggle `lem-post-community-restricted-to-mods'. | |
| p | lem-prev-item | Move to prev item. |
| lem-shr-insert-image | Insert the image under point into the buffer. | |
| lem-ui–follow-link-at-point | Follow link at point. | |
| lem-ui-block-community-at-point | Block community at point. | |
| lem-ui-block-item-instance | Block instance of item at point. | |
| lem-ui-block-user | Block author of item at point. | |
| M-u | lem-ui-branch-top-level | Move point to the top of the branch of comment at point. |
| C | lem-ui-browse-communities | View Lemmy communities in a sortable tabulated list. |
| lem-ui-choose-inbox-view | Prompt for an inbox view and load it. | |
| lem-ui-choose-listing-type | Prompt for a listing type, and use it to reload current view. | |
| lem-ui-choose-search-type | Choose a search type from `lem-search-types' and repeat current query. | |
| o | lem-ui-choose-sort | Prompt for a sort type, and use it to reload the current view. |
| F | lem-ui-comment-fold-toggle | Toggle invisibility of the comment at point. |
| f | lem-ui-comment-tree-fold | Toggle invisibility of current comment and all its children. |
| lem-ui-copy-item-url | Copy the URL (apid) of the post or comment at point. | |
| lem-ui-cycle-inbox | Cycle inbox to next item view in `lem-inbox-types'. | |
| C-c C-v | lem-ui-cycle-items | Switch between displaying posts or comments. |
| C-c C-c | lem-ui-cycle-listing-type | Cycle view between `lem-listing-types'. |
| lem-ui-cycle-saved-items | Cycle saved items view or view type ITEM. | |
| C-c C-h | lem-ui-cycle-search | Cycle current search. |
| C-c C-s | lem-ui-cycle-sort | Cycle view between some `lem-sort-types'. |
| lem-ui-delete-comment | Delete comment at point. | |
| lem-ui-delete-community | Prompt for a community moderated by the current user and delete it. | |
| lem-ui-delete-community-at-point | Delete community at point. | |
| lem-ui-delete-post | Delete post at point. | |
| d | lem-ui-delete-post-or-comment | Delete post or comment at point. |
| lem-ui-dislike-item | Dislike (downvote) item at point. | |
| lem-ui-edit-comment-brief | Edit comment at point if possible, in the minibuffer. | |
| lem-ui-feature-post | Feature (pin) a post, either to its instance or community. | |
| lem-ui-fold-all-comments | Fold all comments in current buffer. | |
| C-M-f | lem-ui-fold-all-toggle | Toggle folding status of all comments in the buffer. |
| lem-ui-fold-community-description | Fold community description in community view. | |
| M-f | lem-ui-fold-current-branch | Toggle folding of comment at point and all its parents and children. |
| lem-ui-fold-whole-top-level-branch | Toggle folding the branch of comment at point. | |
| lem-ui-jump-to-moderated | Prompt for a community moderated by the current user and view it. | |
| S | lem-ui-jump-to-subscribed | Prompt for a subscribed community and view it. |
| lem-ui-like-item | Like (upvote) item at point. | |
| l | lem-ui-like-item-toggle | Toggle like status of item at point. |
| lem-ui-mark-all-read | Mark all replies as read. | |
| lem-ui-mark-private-message-read | Mark the private message at point as read. | |
| lem-ui-mark-reply-comment-read | Mark the comment-reply at point as read. | |
| lem-ui-message-user-at-point | Send private message to user at point. | |
| lem-ui-more | Append more items to the current view. | |
| M-n | lem-ui-next-same-level | Move to next same level comment. |
| TAB | lem-ui-next-tab-item | Jump to next tab item. |
| M-p | lem-ui-prev-same-level | Move to previous same level comment. |
| <backtab> | lem-ui-prev-tab-item | Jump to prev tab item. |
| lem-ui-print-json | Fetch the JSON of item at point and pretty print it in a new buffer. | |
| g | lem-ui-reload-view | Reload the current view. |
| lem-ui-remove-comment | Remove the comment at point. | |
| lem-ui-remove-post | Remove the post at point. | |
| lem-ui-restore-comment | Restore deleted comment at point. | |
| lem-ui-restore-post | Restore deleted post at point. | |
| lem-ui-save-item | Save item at point. | |
| a | lem-ui-save-item-toggle | Toggle saved status of item at point. |
| SPC | lem-ui-scroll-up-command | Call `scroll-up-command', loading more toots if necessary. |
| h | lem-ui-search | Search for QUERY, of SEARCH-TYPE, one of the types in `lem-search-types'. |
| lem-ui-search-in-community | Search in the current community. | |
| lem-ui-search-in-user | Search in the user currently viewed. | |
| lem-ui-subscribe-to-community | Subscribe to a community, using ID or prompt for a handle. | |
| s | lem-ui-subscribe-to-community-at-point | Subscribe to community at point. |
| lem-ui-subscribe-to-item-community | Subscribe to community of item at point. | |
| lem-ui-unblock-community | Prompt for a blocked community, and unblock it. | |
| lem-ui-unblock-instance | Prompt for a blocked instance and unblock it. | |
| lem-ui-unblock-user | Prompt for a blocked user, and unblock them. | |
| lem-ui-unfeature-post | Unfeature (unpin) post at point. | |
| lem-ui-unfold-all-comments | Unfold all comment branches in the current buffer. | |
| lem-ui-unlike-item | Unlike item at point. | |
| lem-ui-unsave-item | Unsave item at point. | |
| lem-ui-unsubscribe-from-community | Prompt for a subscribed community and unsubscribe from it. | |
| lem-ui-url-lookup | Perform a webfinger lookup on URL and load the result in `lem.el'. | |
| lem-ui-view-comment-post | View post of comment at point, or of POST-ID. | |
| lem-ui-view-communities | View Lemmy communities. | |
| B | lem-ui-view-inbox | View user inbox, for replies, mentions, and PMs to the current user. |
| I | lem-ui-view-instance | View posts of current user's home instance. |
| lem-ui-view-instance-full | View full instance details. | |
| c | lem-ui-view-item-community | View community of item at point. |
| u | lem-ui-view-item-user | View user of item at point. |
| lem-ui-view-mentions | View reply comments to the current user. | |
| O | lem-ui-view-own-profile | View profile of the current user. |
| lem-ui-view-post-at-point | View post at point. | |
| lem-ui-view-private-messages | View reply comments to the current user. | |
| lem-ui-view-replies | View reply comments to the current user. | |
| lem-ui-view-replies-unread | View unread replies. | |
| A | lem-ui-view-saved-items | View saved items of the current user, or of user with ID. |
| RET | lem-ui-view-thing-at-point | View post, community or user at point. |
| lem-vtable-revert-command | Re-query data and regenerate the table under point. | |
| lem-vtable-sort-by-current-column | Sort the table under point by the column under point. |


