Skip to content

Instantly share code, notes, and snippets.

@mokrates
Last active September 20, 2023 22:23
Show Gist options
  • Save mokrates/c9131f2f04c01dfc58ee10bc351ccccf to your computer and use it in GitHub Desktop.
Save mokrates/c9131f2f04c01dfc58ee10bc351ccccf to your computer and use it in GitHub Desktop.
allow markdown in ement, allow C-$ to switch compose modes.
;; stuff taken and modified from ement-room.el -- ement-room-compose-org
(require 'ement)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;; revert to fundamental composing
(defun ement-room-compose-fundamental ()
"Activate `fundamental-mode' in current compose buffer.
Configures the buffer appropriately so that saving it will not use any filter"
(interactive)
(unless ement-room-compose-buffer
(user-error "This command should be run in a compose buffer. Use `ement-room-compose-message' first"))
;; Calling `fundamental-mode' seems to wipe out local variables.
(let ((room ement-room)
(session ement-session))
(fundamental-mode)
(ement-room-init-compose-buffer room session))
(setq-local ement-room-send-message-filter nil))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; markdown composing
(defun ement-room-compose-md ()
"Activate `markdown-mode' in current compose buffer.
Configures the buffer appropriately so that saving it will export
the markdown buffer's contents."
(interactive)
(unless ement-room-compose-buffer
(user-error "This command should be run in a compose buffer. Use `ement-room-compose-message' first"))
;; Calling `markdown-mode' seems to wipe out local variables.
(let ((room ement-room)
(session ement-session))
(markdown-mode)
(ement-room-init-compose-buffer room session))
(setq-local ement-room-send-message-filter #'ement-room-send-md-filter))
(defun ement-room-send-md-filter (content room)
"Return event CONTENT for ROOM having processed its markdown content.
The CONTENT's body is exported with
`markdown' (with some adjustments for
compatibility), and the result is added to the CONTENT as
\"formatted_body\"."
;; The CONTENT alist has string keys before being sent.
(let ((md-buf-name (format "*md export output %s*" (random))))
(pcase-let* ((body (alist-get "body" content nil nil #'equal))
(formatted-body
(save-window-excursion
(with-temp-buffer
(insert (ement--format-body-mentions body room
:template "[%s](https://matrix.to/#/%s)"))
(markdown md-buf-name)
(with-current-buffer md-buf-name
(prog1 (string-trim (buffer-string))
(kill-buffer)))))))
(setf (alist-get "formatted_body" content nil nil #'equal) formatted-body
(alist-get "format" content nil nil #'equal) "org.matrix.custom.html")
content)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; switching compose modes
(defun adv-ement-room-init-compose-buffer (room session)
;; map all the keys you want to have in compose buffer here
(use-local-map (if (current-local-map)
(copy-keymap (current-local-map))
(make-sparse-keymap)))
(let ((compose-mode-map (make-sparse-keymap "Use Mode")))
(define-key compose-mode-map (kbd "o")
(cons "Org mode" #'ement-room-compose-org))
(define-key compose-mode-map (kbd "m")
(cons "Markdown mode" #'ement-room-compose-md))
(define-key compose-mode-map (kbd "f")
(cons "Fundamental mode" #'ement-room-compose-fundamental))
(local-set-key (kbd "C-$")
(cons "Switch to mode" compose-mode-map))))
(advice-add 'ement-room-init-compose-buffer
:before
'adv-ement-room-init-compose-buffer)
@mokrates
Copy link
Author

Also:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; load ement-tracking
(load "~/.emacs.d/viiru-ement-tracking.el")
(tracking-mode t)

https://gist.github.com/viiru-/685134a1781816e83df68520a4862599

dependecy: tracking.el (available on melpa)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment