--- /dev/null
+vim.opt_local.formatoptions:remove("o")
+vim.opt_local.formatoptions:remove("r")
+vim.opt_local.formatoptions:remove("l")
+vim.opt_local.formatoptions:append("a")
+vim.opt_local.formatoptions:append("w")
+vim.opt_local.formatoptions:append("n")
+
+vim.keymap.set("n", "<leader>p", "", { buffer = true, desc = "mailplate profiles" })
+
+vim.keymap.set(
+  "n",
+  "<leader>pp",
+  ":w<CR>:%!mailplate --auto --keep-unknown 2>/dev/null<CR>",
+  { buffer = true, desc = "Automatically determine mailplate profile" }
+)
+
+local function profile_keymap(key, profile)
+  vim.keymap.set(
+    "n",
+    "<leader>p<" .. key .. ">",
+    ":w<CR>:%!mailplate --keep-unknown " .. profile .. "<CR>",
+    { buffer = true, desc = "Switch to mailplate profile '" .. profile .. "'" }
+  )
+end
+
+profile_keymap("F1", "official")
+profile_keymap("F2", "pobox")
+profile_keymap("F3", "tahi")
+profile_keymap("F4", "toni")
+profile_keymap("F5", "kbkg")
+profile_keymap("F6", "krafftwerk")
+profile_keymap("F7", "siby")
+profile_keymap("F8", "debian")
+profile_keymap("F9", "uniwh")
+profile_keymap("F10", "mtfk")
+profile_keymap("F11", "sudetia")
+profile_keymap("F12", "default")
+
+local function write_mail_backup()
+  local tmpdir = vim.fn.expand(os.getenv("TMPDIR") or "/tmp") .. "/mail-backups"
+  vim.fn.mkdir(tmpdir, "p", "0o700")
+  local filename = os.date("%Y-%m-%d-%H%M%S") .. ".msg"
+  local file = io.open(tmpdir .. "/" .. filename, "a")
+  if file ~= nil then
+    local lines = vim.api.nvim_buf_get_lines(0, 1, -1, false) or {}
+    local content = table.concat(lines, "\n")
+    file:write(content)
+    file:close()
+    vim.notify("Saved a backup to " .. filename, vim.log.levels.INFO)
+  end
+end
+
+vim.api.nvim_create_autocmd({ "BufWrite" }, {
+  callback = write_mail_backup,
+  buffer = 0,
+})
+
+vim.cmd.runtime("greeting_abbrevs.vim")
 
+++ /dev/null
-setlocal textwidth=68
-setlocal formatoptions-=o
-setlocal formatoptions-=r
-setlocal formatoptions-=l
-setlocal formatoptions+=a
-setlocal formatoptions+=w
-setlocal formatoptions+=n
-setlocal formatexpr=
-
-setlocal comments=n:>
-
-"setlocal spell
-
-" augroup tsperrorinsert
-"   au!
-" augroup END
-" match none /\s*$/
-" augroup listinsert
-"   au!
-" augroup END
-" setlocal list&
-
-" Dynamically set format options, depending on where you are in a
-" mail, idea from Teemu Likonen:
-" http://groups.google.com/group/vim_use/msg/f59e5c1adc6be2b3
-
-" let s:defaults = "setlocal fo=".&fo
-" " tw=".&tw." ts=".&ts." sts=".&sts." sw=".&sw." fo=".&fo
-" execute s:defaults
-" let b:MailAreaDetect=1
-"
-" nnoremap <buffer><silent> <F9> :call <SID>MailAreaDetect_Switch(0)<CR>
-" inoremap <buffer><silent> <F9> <C-\><C-O>:call <SID>MailAreaDetect_Switch(1)<CR>
-"
-" function! s:MailAreaDetect_Switch(vmode)
-"     if b:MailAreaDetect
-"         silent call <SID>MailAreaDetect_Off()
-"         let b:MailAreaDetect=0
-"         echo 'MailAreaDetect Off'
-"     else
-"         silent call <SID>MailAreaDetect_On()
-"         let b:MailAreaDetect=1
-"         echo 'MailAreaDetect On'
-"     endif
-" endfu
-"
-" function! s:MailAreaDetect_On()
-"     silent autocmd! MailAreaDetect CursorMoved,CursorMoved
-"         \ <buffer> call <SID>AreaOptions()
-"     let b:MailAreaDetect=1
-" endfunction
-"
-" function! s:MailAreaDetect_Off()
-"     silent autocmd! MailAreaDetect
-"     execute s:defaults
-"     let b:MailAreaDetect=0
-" endfunction
-"
-" augroup MailAreaDetect
-"     autocmd!
-"     call <SID>MailAreaDetect_On()
-" augroup END
-"
-" function! s:AreaOptions()
-"     execute s:defaults
-"
-"     let s:synCur = synIDattr(synID(line("."),1,0),"name")
-"     let s:synNext = synIDattr(synID(line(".")+1,1,0),"name")
-"
-"     if s:synNext =~ '^mailQuote' && s:synCur == '' && getline('.') =~ '^.'
-"       " elseif getline('.') =~ '^\s*[^>]' && getline(line('.')+1) =~ '\m^\s*>'
-"       setlocal fo-=a
-"       "echo 'Quotation leader (fo='.&fo.')'
-"     elseif s:synCur =~ '^mailQuote'
-"       " elseif getline('.') =~ '\m^\s*>'
-"       setlocal fo-=a
-"       "echo 'Quotation (fo='.&fo.')'
-"     elseif <SID>CheckArea('\m^--- .*\n^+++ ','\v(^$|\n^-- $)')
-"       setlocal fo-=a fo-=w fo-=t noet
-"       "echo 'Patch (fo='.&fo.')'
-"     elseif s:synCur == '' && s:synNext =~ '^mailSignature'
-"       " elseif getline(line('.')+1) =~ '\m^-- $'
-"       setlocal fo-=a fo-=w fo-=t
-"       "echo 'Last line before signature (fo='.&fo.')'
-"     elseif s:synCur =~ '^mailSignature'
-"       " elseif <SID>CheckArea('^-- $','^$')
-"       setlocal fo-=a fo-=w fo-=t
-"       "echo 'Signature (fo='.&fo.')'
-"     elseif s:synCur =~ '^mail'
-"       " if <SID>CheckArea('\v^From( |: ).*\n','\v^$')
-"       setlocal fo-=a fo-=w fo-=t
-"       "echo 'Header (fo='.&fo.')'
-"     else
-"       "echo 'My text (fo='.&fo.')'
-"     endif
-" endfunction
-"
-" function! s:CheckArea(start, end)
-"     return (search(a:start,'bcnW')-line('.')) >
-"         \ (search(a:end,'bnW')-line('.'))
-" endfunction
-
-" function! FixQuotes()
-"   let l:i = 0
-"   let l:lineNxt = getline(l:i)
-"   let l:synNxt = synIDattr(synID(l:i,1,0),"name")
-"   while l:i < line('$')-1
-"     let l:lineCur = l:lineNxt
-"     let l:synCur = l:synNxt
-"     let l:lineNxt = getline(l:i+1)
-"     let l:synNxt = synIDattr(synID(l:i+1,1,0),"name")
-"     if l:synCur =~ '^mailQuote' && l:lineCur =~ '\w.*\S$' &&
-"           \ l:synNxt =~ '^mailQuote' && l:lineNxt =~ '\w'
-"       call setline(l:i, l:lineCur . ' ')
-"     endif
-"     let l:i += 1
-"   endwhile
-" endfunction
-"
-" augroup fixquotes
-"   au!
-"   autocmd BufWinEnter $TMPDIR/mutt-* call FixQuotes()
-" augroup END
-
-nmap <buffer> <C-P><F1> :w<CR>:%!mailplate --keep-unknown official<CR>
-nmap <buffer> <C-P><F2> :w<CR>:%!mailplate --keep-unknown pobox<CR>
-nmap <buffer> <C-P><F3> :w<CR>:%!mailplate --keep-unknown tahi<CR>
-nmap <buffer> <C-P><F4> :w<CR>:%!mailplate --keep-unknown toni<CR>
-
-nmap <buffer> <C-P><F5> :w<CR>:%!mailplate --keep-unknown kbkg<CR>
-nmap <buffer> <C-P><F6> :w<CR>:%!mailplate --keep-unknown krafftwerk<CR>
-nmap <buffer> <C-P><F7> :w<CR>:%!mailplate --keep-unknown siby<CR>
-nmap <buffer> <C-P><F8> :w<CR>:%!mailplate --keep-unknown debian<CR>
-
-nmap <buffer> <C-P><F9> :w<CR>:%!mailplate --keep-unknown uniwh<CR>
-nmap <buffer> <C-P><F10> :w<CR>:%!mailplate --keep-unknown mtfk<CR>
-nmap <buffer> <C-P><F11> :w<CR>:%!mailplate --keep-unknown sudetia<CR>
-nmap <buffer> <C-P><F12> :w<CR>:%!mailplate --keep-unknown default<CR>
-nmap <buffer> <F1> :w<CR>:%!mailplate --auto --keep-unknown 2>/dev/null<CR>
-
-" change subject line
-" Before: Subject: old
-" After : Subject: New (was: old)
-" http://strcat.de/wiki/dotfiles#vim
-" map ,sw 1G/^Subject: <CR>:s/Re:/was:/<CR>Wi (<C-O>$)<ESC>0Whi
-map <Leader>ns 1G/^Subject: /<CR>:s,\(Subject: \)\(Re: \)*\(.*\)$,\1 (was: \3),<CR>:set nohls<CR>f li
-
-" Delete 'was' in the Subject.
-" Before: Subject: New (was: old)
-" After : Subject: New
-" http://strcat.de/wiki/dotfiles#vim
-map <Leader>dw 1G/^Subject: /<CR>:s, *(was: .*)$<CR>:set nohls<CR>f l
-
-" packadd lbdbq
-"
-" http://dollyfish.net.nz/blog/2008-04-01/mutt-and-vim-custom-autocompletion
-" fun! LBDBCompleteFn(findstart, base)
-"   let line = getline('.')
-"   if a:findstart
-"     " locate the start of the word
-"     let start = col('.') - 1
-"     while start > 0 && line[start - 1] =~ '[^:,]'
-"       let start -= 1
-"     endwhile
-"     while start < col('.') && line[start] =~ '[:, ]'
-"       let start += 1
-"     endwhile
-"     return start
-"   else
-"     let res = []
-"     let query = substitute(a:base, '"', '', 'g')
-"     let query = substitute(query, '\s*<.*>\s*', '', 'g')
-"     for m in LbdbQuery(query)
-"       call complete_add(printf('"%s" <%s>', escape(m[0], '"'), m[1]))
-"       if complete_check()
-"         break
-"       endif
-"     endfor
-"     return res
-"   endif
-" endfun
-" setlocal completefunc=LBDBCompleteFn
-
-" And this magic by James Vega, which ensures that we only complete with lbdb
-" on the recipient lines of the mail header.
-" inoremap <expr> <C-n> DelegateCompletion(1)
-" inoremap <expr> <C-p> DelegateCompletion(0)
-
-" fun! DelegateCompletion(next)
-"   if getline('.') =~? '^\%(To\|B\=Cc\):'
-"     return "\x18\x15"
-"   elseif a:next
-"     return "\x0e"
-"   else
-"     return "\x10"
-"   endif
-" endfun
-
-function! WriteMailBackup()
-    let l:tmpdir = fnameescape(expand('$TMPDIR')) || '/tmp'
-    let l:tgtdir = l:tmpdir . '/mail-backups'
-    call mkdir(l:tgtdir, "p", 0o700)
-    let l:modified = &modified
-    let l:filename = l:tgtdir . '/' . strftime('%Y-%m-%d-%H%M%S') . '.msg'
-    exe 'silent update! ' . l:filename
-    if 0 && l:modified
-      echo 'Backup written to ' . l:filename
-    endif
-endfunction
-autocmd BufWritePre <buffer> call WriteMailBackup()
-
-let g:markdown_in_mail = 1
-runtime! ftplugin/markdown.vim
-
-runtime! greeting_abbrevs.vim