emacs

+1
flake.nix
···
# (_: { patches = [ ./pkgs/package.patch ]; });
neovim-unwrapped = final.overlay-unstable.neovim-unwrapped;
stig = final.overlay-unstable.stig;
+
pantalaimon = prev.callPackage ./pkgs/pantalaimon.nix { };
})
];
in {
+1 -1
home/default.nix
···
trust = "ultimate";
}];
};
-
services.gpg-agent.pinentryPackage = pkgs.pinentry-tty;
+
services.gpg-agent.pinentryPackage = pkgs.pinentry-qt;
programs.git = {
enable = true;
+26
home/emacs/config/appearance.el
···
+
(load-theme 'gruvbox-dark-medium t)
+
+
(defun set-transparent-background ()
+
(when (not (display-graphic-p))
+
(set-face-attribute 'default nil :background "unspecified-bg")
+
(set-face-attribute 'line-number nil :background "unspecified-bg")
+
(set-face-attribute 'line-number-current-line nil :background "unspecified-bg"))
+
(when (display-graphic-p)
+
(set-frame-parameter nil 'alpha-background 80)
+
(add-to-list 'default-frame-alist '(alpha-background . 80))
+
(set-face-attribute 'line-number nil :background nil)
+
(set-face-attribute 'line-number-current-line nil :background nil))
+
)
+
+
(add-hook 'window-setup-hook 'set-transparent-background)
+
+
; (menu-bar-mode -1)
+
(tool-bar-mode -1)
+
(scroll-bar-mode -1)
+
+
(set-face-attribute 'default nil :height 110)
+
+
(global-display-line-numbers-mode 1)
+
(setq display-line-numbers-type 'relative)
+
+
(setq completion-show-help nil)
+167
home/emacs/config/email.el
···
+
(require 'mu4e)
+
+
(setq mu4e-get-mail-command "mbsync -a")
+
+
(setq sendmail-program "msmtp")
+
(setq message-sendmail-f-is-evil t)
+
(setq message-sendmail-extra-arguments '("--read-envelope-from"))
+
(setq message-send-mail-function 'message-send-mail-with-sendmail)
+
+
(let ((full-name "Ryan Gibb")
+
(signature "Ryan Gibb"))
+
(setq mu4e-contexts
+
`(,
+
(let ((mail-address "ryan@freumh.org")
+
(dir-name (concat "/ryan@freumh.org")))
+
(make-mu4e-context
+
:name (concat "1 " mail-address)
+
:match-func
+
`(lambda (msg)
+
(when msg
+
(string-match-p
+
,(concat "^" dir-name)
+
(mu4e-message-field msg :maildir))))
+
:vars
+
`((user-mail-address . ,mail-address)
+
(user-full-name . ,full-name)
+
(mu4e-sent-folder . ,(concat dir-name "/Sent"))
+
(mu4e-drafts-folder . ,(concat dir-name "/Drafts"))
+
(mu4e-trash-folder . ,(concat dir-name "/Trash"))
+
(mu4e-refile-folder . ,(concat dir-name "/Archive"))
+
(mu4e-compose-signature . ,signature)
+
(mu4e-maildir-shortcuts .
+
,'((:maildir "/ryan@freumh.org/Inbox" :key ?i)
+
(:maildir "/ryan@freumh.org/Sent" :key ?s)
+
(:maildir "/ryan@freumh.org/Drafts" :key ?d)
+
(:maildir "/ryan@freumh.org/Archive" :key ?a)
+
(:maildir "/ryan@freumh.org/Trash" :key ?t)))
+
)))
+
,(let ((mail-address "ryangibb321@gmail.com")
+
(dir-name (concat "/ryangibb321@gmail.com")))
+
(make-mu4e-context
+
:name (concat "2 " mail-address)
+
:match-func
+
`(lambda (msg)
+
(when msg
+
(string-match-p
+
,(concat "^" dir-name)
+
(mu4e-message-field msg :maildir))))
+
:vars
+
`((user-mail-address . ,mail-address)
+
(user-full-name . ,full-name)
+
(mu4e-sent-folder . ,(concat dir-name "/[Gmail]/Sent Mail"))
+
(mu4e-drafts-folder . ,(concat dir-name "/[Gmail]/Drafts"))
+
(mu4e-trash-folder . ,(concat dir-name "/[Gmail]/Bin"))
+
(mu4e-refile-folder . ,(concat dir-name "/[Gmail]/All Mail"))
+
(mu4e-compose-signature . ,signature)
+
(mu4e-maildir-shortcuts .
+
,'((:maildir "/ryangibb321@gmail.com/Inbox" :key ?i)
+
(:maildir "/ryangibb321@gmail.com/[Gmail]/Sent Mail" :key ?s)
+
(:maildir "/ryangibb321@gmail.com/[Gmail]/Drafts" :key ?d)
+
(:maildir "/ryangibb321@gmail.com/[Gmail]/All Mail" :key ?a)
+
(:maildir "/ryangibb321@gmail.com/[Gmail]/Bin" :key ?t)))
+
)))
+
,(let ((mail-address "ryan.gibb@cl.cam.ac.uk")
+
(dir-name (concat "/ryan.gibb@cl.cam.ac.uk")))
+
(make-mu4e-context
+
:name (concat "3 " mail-address)
+
:match-func
+
`(lambda (msg)
+
(when msg
+
(string-match-p
+
,(concat "^" dir-name)
+
(mu4e-message-field msg :maildir))))
+
:vars
+
`((user-mail-address . ,mail-address)
+
(user-full-name . ,full-name)
+
(mu4e-sent-folder . ,(concat dir-name "/Sent"))
+
(mu4e-drafts-folder . ,(concat dir-name "/Drafts"))
+
(mu4e-trash-folder . ,(concat dir-name "/Trash"))
+
(mu4e-refile-folder . ,(concat dir-name "/Archive"))
+
(mu4e-compose-signature . ,signature)
+
(mu4e-maildir-shortcuts .
+
,'((:maildir "/ryan.gibb@cl.cam.ac.uk/Inbox" :key ?i)
+
(:maildir "/ryan.gibb@cl.cam.ac.uk/Sent" :key ?s)
+
(:maildir "/ryan.gibb@cl.cam.ac.uk/Drafts" :key ?d)
+
(:maildir "/ryan.gibb@cl.cam.ac.uk/Archive" :key ?a)
+
(:maildir "/ryan.gibb@cl.cam.ac.uk/Trash" :key ?t)))
+
)))
+
,(let ((mail-address "misc@freumh.org")
+
(dir-name (concat "/misc@freumh.org")))
+
(make-mu4e-context
+
:name (concat "4 " mail-address)
+
:match-func
+
`(lambda (msg)
+
(when msg
+
(string-match-p
+
,(concat "^" dir-name)
+
(mu4e-message-field msg :maildir))))
+
:vars
+
`((user-mail-address . ,mail-address)
+
(user-full-name . ,full-name)
+
(mu4e-sent-folder . ,(concat dir-name "/Sent"))
+
(mu4e-drafts-folder . ,(concat dir-name "/Drafts"))
+
(mu4e-trash-folder . ,(concat dir-name "/Trash"))
+
(mu4e-refile-folder . ,(concat dir-name "/Archive"))
+
(mu4e-compose-signature . ,signature)
+
(mu4e-maildir-shortcuts .
+
,'((:maildir "/misc@freumh.org/Inbox" :key ?i)
+
(:maildir "/misc@freumh.org/Sent" :key ?s)
+
(:maildir "/misc@freumh.org/Drafts" :key ?d)
+
(:maildir "/misc@freumh.org/Archive" :key ?a)
+
(:maildir "/misc@freumh.org/Trash" :key ?t)))
+
)))
+
+
)))
+
+
(setq mu4e-context-policy 'pick-first)
+
+
; Fixing duplicate UID errors when using mbsync and mu4e
+
(setq mu4e-change-filenames-when-moving t)
+
+
; (setq mu4e-use-fancy-chars t)
+
; (setq mu4e-attachment-dir "~/download")
+
(setq mu4e-view-show-images t)
+
+
(setq mu4e-bookmarks
+
'((:name "Unified Inbox"
+
:query "maildir:/ryan@freumh.org/Inbox OR maildir:/ryangibb321@gmail.com/Inbox OR maildir:/ryan.gibb@cl.cam.ac.uk/Inbox"
+
:favorite t
+
:key ?i)
+
(:name "Unread messages"
+
:query "flag:unread AND NOT flag:trashed AND NOT maildir:\"/ryangibb321@gmail.com/[Gmail]/All Mail\""
+
:key ?u)
+
(:name "Today's messages"
+
:query "date:today..now"
+
:key ?t)
+
(:name "Last 7 days"
+
:query "date:7d..now"
+
:hide-unread t
+
:key ?w)
+
(:name "Messages with images"
+
:query "mime:image/*"
+
:key ?p)))
+
+
(setq mu4e-headers-fields
+
'((:maildir . 40)
+
(:human-date . 12)
+
(:flags . 6)
+
(:mailing-list . 10)
+
(:from-or-to . 22)
+
(:thread-subject . nil)))
+
+
(setq mu4e-search-show-threads nil)
+
+
; (with-eval-after-load "mm-decode"
+
; (add-to-list 'mm-discouraged-alternatives "text/html")
+
; (add-to-list 'mm-discouraged-alternatives "text/richtext"))
+
(setq shr-color-visible-luminance-min 80)
+
+
(setq mail-user-agent 'mu4e-user-agent)
+
(setq message-dont-reply-to-names 'mu4e-personal-or-alternative-address-p)
+
+
(setq mu4e-search-include-related nil)
+
+
(evil-collection-define-key 'normal 'mu4e-main-mode-map (kbd "c") 'mu4e-search-query) ; should probably upsteam
+
(evil-collection-define-key 'normal 'mu4e-main-mode-map (kbd "i") 'mu4e-update-index)
+
+2
home/emacs/config/matrix.el
···
+
(setq ement-save-sessions t)
+
(evil-collection-define-key 'normal 'ement-room-mode-map (kbd "C-k") 'ement-view-room)
+17
home/emacs/config/save.el
···
+
(setq savehist-file "~/.emacs.d/savehist")
+
(savehist-mode 1)
+
(setq savehist-additional-variables
+
'(command-history
+
search-ring
+
regexp-search-ring
+
kill-ring))
+
(setq history-length 10000)
+
(setq savehist-save-minibuffer-history t)
+
+
(desktop-save-mode 1)
+
(setq desktop-dirname "~/.emacs.d/desktop/")
+
(setq desktop-save t)
+
(add-hook 'emacs-startup-hook 'desktop-read)
+
+
(setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
+
+80
home/emacs/config/vim.el
···
+
; https://github.com/emacs-evil/evil-collection
+
(setq evil-want-integration t)
+
(setq evil-want-keybinding nil)
+
+
(require 'evil)
+
(evil-mode 1)
+
+
(define-key evil-normal-state-map (kbd "C-u") 'evil-scroll-up)
+
(define-key evil-visual-state-map (kbd "C-u") 'evil-scroll-up)
+
(global-set-key (kbd "C-x u") 'universal-argument)
+
+
(add-hook 'minibuffer-setup-hook 'evil-insert-state)
+
+
(setq evil-want-empty-ex-last-command nil)
+
+
(global-undo-tree-mode)
+
(evil-set-undo-system 'undo-tree)
+
(setq undo-tree-visualizer-diff t)
+
(setq undo-tree-auto-save-history t)
+
(setq undo-tree-history-directory-alist
+
`(("." . ,(expand-file-name "undo-tree-history" user-emacs-directory))))
+
+
(require 'evil-leader)
+
(global-evil-leader-mode)
+
(evil-leader/set-leader "<SPC>")
+
(evil-leader/set-key
+
"w" 'save-buffer)
+
(evil-leader/set-key
+
"u" 'undo-tree-visualize)
+
(evil-leader/set-key
+
"fb" 'helm-buffers-list)
+
+
(require 'evil-collection)
+
; (evil-collection-init)
+
(with-eval-after-load 'mu4e (evil-collection-mu4e-setup))
+
+
; (require 'vertico)
+
; (vertico-mode)
+
;
+
; (require 'consult)
+
; (global-set-key (kbd "C-s") 'consult-line)
+
; (define-key minibuffer-local-map (kbd "C-r") 'consult-history)
+
;
+
; (require 'orderless)
+
; (setq completion-styles '(orderless)
+
; completion-category-defaults nil
+
; completion-category-overrides '((file (styles partial-completion))))
+
;
+
; (evil-leader/set-key
+
; "ff" 'consult-find
+
; "fg" 'consult-ripgrep)
+
;
+
; (require 'posframe)
+
;
+
; (require 'vertico-posframe)
+
; (setq vertico-posframe-poshandler 'posframe-poshandler-frame-center)
+
; (vertico-posframe-mode 1)
+
;
+
; (setq consult-async-min-input 1)
+
;
+
; (define-key minibuffer-local-map (kbd "C-w") 'backward-kill-word)
+
+
; esc quits
+
; https://stackoverflow.com/questions/8483182/evil-mode-best-practice
+
(defun minibuffer-keyboard-quit ()
+
"Abort recursive edit.
+
In Delete Selection mode, if the mark is active, just deactivate it;
+
then it takes a second \\[keyboard-quit] to abort the minibuffer."
+
(interactive)
+
(if (and delete-selection-mode transient-mark-mode mark-active)
+
(setq deactivate-mark t)
+
(when (get-buffer "*Completions*") (delete-windows-on "*Completions*"))
+
(abort-recursive-edit)))
+
(define-key evil-normal-state-map [escape] 'keyboard-quit)
+
(define-key evil-visual-state-map [escape] 'keyboard-quit)
+
(define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
+
(define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
+
(define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
+
(define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
+
(define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)
+30 -1
home/emacs/default.nix
···
extraPackages = epkgs: with epkgs; [
evil
evil-leader
+
evil-collection
+
evil-ledger
+
evil-org
undo-tree
gruvbox-theme
-
mu4e
+
helm
+
mu4e
+
ement
+
ledger-mode
+
org
+
org-evil
];
};
home.file = {
".emacs.d/init.el".source = ./init.el;
+
".emacs.d/config".source = ./config;
+
".mail.cap".text = ''
+
application/pdf; xdg-open %s
+
'';
+
};
+
+
services.pantalaimon = {
+
enable = true;
+
settings = {
+
Default = {
+
LogLevel = "Info";
+
SSL = true;
+
Notifications = "On";
+
};
+
Freumh = {
+
Homeserver = "https://matrix.freumh.org";
+
ListenAddress = "localhost";
+
ListenPort = 8009;
+
IgnoreVerification = true;
+
};
+
};
};
};
}
+9 -58
home/emacs/init.el
···
-
(require 'evil)
-
(evil-mode 1)
-
-
(define-key evil-normal-state-map (kbd "C-u") 'evil-scroll-up)
-
(define-key evil-visual-state-map (kbd "C-u") 'evil-scroll-up)
-
(global-set-key (kbd "C-x u") 'universal-argument)
-
-
(define-key evil-normal-state-map (kbd "C-i") 'evil-jump-forward)
-
(define-key evil-visual-state-map (kbd "C-i") 'evil-jump-forward)
-
-
(define-key evil-normal-state-map (kbd "C-o") 'evil-jump-backward)
-
(define-key evil-visual-state-map (kbd "C-o") 'evil-jump-backward)
-
-
(global-undo-tree-mode)
-
(evil-set-undo-system 'undo-tree)
-
(setq undo-tree-visualizer-diff t)
-
(setq undo-tree-auto-save-history t)
-
(setq undo-tree-history-directory-alist
-
`(("." . ,(expand-file-name "undo-tree-history" user-emacs-directory))))
+
(add-to-list 'load-path "~/.emacs.d/config")
-
(require 'evil-leader)
-
(global-evil-leader-mode)
-
(evil-leader/set-leader "<SPC>")
-
(evil-leader/set-key
-
"w" 'save-buffer)
-
(evil-leader/set-key
-
"u" 'undo-tree-visualize)
+
(load "vim")
+
(load "appearance")
+
(load "save")
+
(load "email")
+
(load "matrix")
;; (setq interprogram-cut-function nil)
;; (setq interprogram-paste-function nil)
-
(load-theme 'gruvbox-dark-medium t)
-
(set-frame-parameter nil 'alpha-background 70)
-
(add-to-list 'default-frame-alist '(alpha-background . 70))
-
;; (menu-bar-mode -1)
-
;; (tool-bar-mode -1)
-
;; (scroll-bar-mode -1)
-
(set-face-attribute 'default nil :height 110)
+
(require 'helm)
+
(helm-mode 1)
-
(global-display-line-numbers-mode 1)
-
(setq display-line-numbers-type 'relative)
-
(set-face-attribute 'line-number nil
-
:foreground "gray"
-
:background nil)
-
(set-face-attribute 'line-number-current-line nil
-
:foreground "orange"
-
:background nil)
+
(require 'ledger-mode)
-
(setq savehist-file "~/.emacs.d/savehist")
-
-
(savehist-mode 1)
-
(setq savehist-additional-variables
-
'(command-history
-
search-ring
-
regexp-search-ring
-
kill-ring))
-
(setq history-length 10000)
-
(setq savehist-save-minibuffer-history t)
-
-
(desktop-save-mode 1)
-
(setq desktop-dirname "~/.emacs.d/desktop/")
-
(setq desktop-save t)
-
(add-hook 'emacs-startup-hook 'desktop-read)
-
-
(setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
+8 -8
home/mail.nix
···
sync-mail = pkgs.writeScriptBin "sync-mail" ''
#!/usr/bin/env bash
${pkgs.isync}/bin/mbsync "$1"
-
${pkgs.mu}/bin/mu index
+
${pkgs.mu}/bin/mu index || ${pkgs.emacs29-pgtk}/bin/emacsclient --eval '(mu4e-update-index)'
'';
cfg = config.custom.mail;
in {
···
enable = true;
boxes = [ "Inbox" ];
onNotify =
-
"${pkgs.isync}/bin/mbsync ryan@freumh.org && ${pkgs.mu}/bin/mu index";
+
"${pkgs.isync}/bin/mbsync ryan@freumh.org && ${pkgs.mu}/bin/mu index || ${pkgs.emacs29-pgtk}/bin/emacsclient --eval '(mu4e-update-index)'";
};
mbsync = {
enable = true;
···
enable = true;
extraAccounts = {
check-mail-cmd =
-
"${pkgs.isync}/bin/mbsync ryan@freumh.org && ${pkgs.mu}/bin/mu index";
+
"${pkgs.isync}/bin/mbsync ryan@freumh.org && ${pkgs.mu}/bin/mu index || ${pkgs.emacs29-pgtk}/bin/emacsclient --eval '(mu4e-update-index)'";
check-mail-timeout = "1m";
check-mail = "1h";
folders-sort =
···
enable = true;
boxes = [ "Inbox" ];
onNotify =
-
"${pkgs.isync}/bin/mbsync misc@freumh.org && ${pkgs.mu}/bin/mu index";
+
"${pkgs.isync}/bin/mbsync misc@freumh.org && ${pkgs.mu}/bin/mu index || ${pkgs.emacs29-pgtk}/bin/emacsclient --eval '(mu4e-update-index)'";
};
mbsync = {
enable = true;
···
enable = true;
boxes = [ "Inbox" ];
onNotify =
-
"${pkgs.isync}/bin/mbsync ryan.gibb@cl.cam.ac.uk && ${pkgs.mu}/bin/mu index";
+
"${pkgs.isync}/bin/mbsync ryan.gibb@cl.cam.ac.uk && ${pkgs.mu}/bin/mu index || ${pkgs.emacs29-pgtk}/bin/emacsclient --eval '(mu4e-update-index)'";
};
mbsync = {
enable = true;
···
enable = true;
extraAccounts = {
check-mail-cmd =
-
"${pkgs.isync}/bin/mbsync ryan.gibb@cl.cam.ac.uk && ${pkgs.mu}/bin/mu index";
+
"${pkgs.isync}/bin/mbsync ryan.gibb@cl.cam.ac.uk && ${pkgs.mu}/bin/mu index || ${pkgs.emacs29-pgtk}/bin/emacsclient --eval '(mu4e-update-index)'";
check-mail-timeout = "1m";
check-mail = "1h";
aliases = "rtg24@cam.ac.uk";
···
enable = true;
boxes = [ "Inbox" ];
onNotify =
-
"${pkgs.isync}/bin/mbsync ryangibb321@gmail.com && ${pkgs.mu}/bin/mu index";
+
"${pkgs.isync}/bin/mbsync ryangibb321@gmail.com && ${pkgs.mu}/bin/mu index || ${pkgs.emacs29-pgtk}/bin/emacsclient --eval '(mu4e-update-index)'";
};
mbsync = {
enable = true;
···
enable = true;
extraAccounts = {
check-mail-cmd =
-
"${pkgs.isync}/bin/mbsync ryangibb321@gmail.com && ${pkgs.mu}/bin/mu index";
+
"${pkgs.isync}/bin/mbsync ryangibb321@gmail.com && ${pkgs.mu}/bin/mu index || ${pkgs.emacs29-pgtk}/bin/emacsclient --eval '(mu4e-update-index)'";
check-mail-timeout = "1m";
check-mail = "1h";
folders-sort = [
+95
pkgs/pantalaimon.nix
···
+
{ lib
+
, stdenv
+
, python3Packages
+
, fetchFromGitHub
+
, installShellFiles
+
, nixosTests
+
, gobject-introspection
+
, wrapGAppsNoGuiHook
+
, enableDbusUi ? true
+
}:
+
+
python3Packages.buildPythonApplication rec {
+
pname = "pantalaimon";
+
version = "0.10.5";
+
pyproject = true;
+
+
# pypi tarball miss tests
+
src = fetchFromGitHub {
+
owner = "matrix-org";
+
repo = "pantalaimon";
+
rev = version;
+
hash = "sha256-yMhE3wKRbFHoL0vdFR8gMkNU7Su4FHbAwKQYADaaWpk=";
+
};
+
+
build-system = [
+
installShellFiles
+
] ++ (with python3Packages; [
+
setuptools
+
pythonRelaxDepsHook
+
]);
+
+
pythonRelaxDeps = [
+
"matrix-nio"
+
];
+
+
dependencies = with python3Packages; [
+
aiohttp
+
appdirs
+
attrs
+
cachetools
+
click
+
janus
+
keyring
+
logbook
+
matrix-nio
+
peewee
+
prompt-toolkit
+
]
+
++ matrix-nio.optional-dependencies.e2e
+
++ lib.optionals enableDbusUi optional-dependencies.ui;
+
+
optional-dependencies.ui = with python3Packages; [
+
dbus-python
+
notify2
+
pygobject3
+
pydbus
+
];
+
+
nativeBuildInputs = [
+
wrapGAppsNoGuiHook
+
gobject-introspection
+
];
+
+
# Prevent double wrapping from wrapGApps and wrapPythonProgram
+
dontWrapGApps = true;
+
makeWrapperArgs = [
+
"\${gappsWrapperArgs[@]}"
+
];
+
+
nativeCheckInputs = with python3Packages; [
+
aioresponses
+
faker
+
pytest-aiohttp
+
pytestCheckHook
+
]
+
++ lib.flatten (lib.attrValues optional-dependencies);
+
+
# darwin has difficulty communicating with server, fails some integration tests
+
doCheck = !stdenv.isDarwin;
+
+
postInstall = ''
+
installManPage docs/man/*.[1-9]
+
'';
+
+
passthru.tests = {
+
inherit (nixosTests) pantalaimon;
+
};
+
+
meta = with lib; {
+
description = "End-to-end encryption aware Matrix reverse proxy daemon";
+
homepage = "https://github.com/matrix-org/pantalaimon";
+
license = licenses.asl20;
+
maintainers = with maintainers; [ valodim ];
+
};
+
}