modus-themes-exporter: add new library

This is in response to issue 31 on my dotfiles repo,[0] as well as issue
116 in the Modus themes' repo.[1]

[0]: <https://gitlab.com/protesilaos/dotfiles/-/issues/31>.
[1]: <https://gitlab.com/protesilaos/modus-themes/-/issues/116>.
This commit is contained in:
Protesilaos Stavrou 2021-02-22 08:15:41 +02:00
parent 85f9764da9
commit 7db034da37
No known key found for this signature in database
GPG key ID: 99BD6459CD5CA3EA

View file

@ -0,0 +1,462 @@
;;; modus-themes-exporter.el --- Help port the active Modus theme to external applications -*- lexical-binding:t -*-
;; Copyright (C) 2021 Protesilaos Stavrou
;; Author: Protesilaos Stavrou <info@protesilaos.com>
;; URL: https://gitlab.com/protesilaos/modus-themes
;; Version: 0.0.0
;; Package-Requires: ((emacs "27.1"))
;; Keywords: faces, theme, accessibility
;; This file is NOT part of GNU Emacs.
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or (at
;; your option) any later version.
;;
;; This program is distributed in the hope that it will be useful, but
;; WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
;;
;; EXPERIMENTAL AND ONLY INTENDED FOR ADVANCED USERS
;;
;; Helper functions to produce a port of the currently
;; enabled Modus theme (`modus-operandi' or `modus-vivendi') for various
;; terminal emulators or text editors outside the Emacs milieu.
;;
;; Insofar as external text editors are concerned, such ports are not
;; meant to be treated as 'official themes'. This is a mere facility to
;; approximate the surface-level aesthetics of the Modus themes: a real
;; theme requires attention to detail; a requirement that no generic
;; template can satisfy.
;;
;; Consult the doc string of `modus-themes-exporter-export' for how to
;; use this library.
;;; Code:
(require 'modus-themes)
(defvar modus-themes-exporter-templates-alist
'(("urxvt" . modus-themes-exporter-urxvt)
("vim" . modus-themes-exporter-vim)
("xfce" . modus-themes-exporter-xfce)
("xterm" . modus-themes-exporter-xterm)))
(defun modus-themes-exporter-xterm ()
"Template for XTerm."
(modus-themes-with-colors
(let ((theme-name (format "%s" (car custom-enabled-themes))))
(with-temp-buffer
(concat
"! Theme: " theme-name "\n"
"! Description: XTerm port of " theme-name " (Modus themes for Emacs)" "\n"
"! Author: Protesilaos Stavrou, <https://protesilaos.com>" "\n"
"xterm*background: " bg-main "\n"
"xterm*foreground: " fg-main "\n"
"xterm*color0: " "#000000" "\n"
"xterm*color1: " red "\n"
"xterm*color2: " green "\n"
"xterm*color3: " yellow "\n"
"xterm*color4: " blue "\n"
"xterm*color5: " magenta "\n"
"xterm*color6: " cyan "\n"
"xterm*color7: " "#bfbfbf" "\n"
"xterm*color8: " "#595959" "\n"
"xterm*color9: " red-alt "\n"
"xterm*color10: " green-alt "\n"
"xterm*color11: " yellow-alt "\n"
"xterm*color12: " blue-alt "\n"
"xterm*color13: " magenta-alt-other "\n"
"xterm*color14: " cyan-alt-other "\n"
"xterm*color15: " "#ffffff" "\n")))))
(defun modus-themes-exporter-urxvt ()
"Template for URxvt (Rxvt-unicode)."
(modus-themes-with-colors
(let ((theme-name (format "%s" (car custom-enabled-themes))))
(with-temp-buffer
(concat
"! Theme: " theme-name "\n"
"! Description: URxvt port of " theme-name " (Modus themes for Emacs)" "\n"
"! Author: Protesilaos Stavrou, <https://protesilaos.com>" "\n"
"URxvt*background: " bg-main "\n"
"URxvt*foreground: " fg-main "\n"
"URxvt*cursorColor: " fg-main "\n"
"URxvt*cursorColor2: " bg-main "\n"
"URxvt*color0: " "#000000" "\n"
"URxvt*color1: " red "\n"
"URxvt*color2: " green "\n"
"URxvt*color3: " yellow "\n"
"URxvt*color4: " blue "\n"
"URxvt*color5: " magenta "\n"
"URxvt*color6: " cyan "\n"
"URxvt*color7: " "#bfbfbf" "\n"
"URxvt*color8: " "#595959" "\n"
"URxvt*color9: " red-alt "\n"
"URxvt*color10: " green-alt "\n"
"URxvt*color11: " yellow-alt "\n"
"URxvt*color12: " blue-alt "\n"
"URxvt*color13: " magenta-alt-other "\n"
"URxvt*color14: " cyan-alt-other "\n"
"URxvt*color15: " "#ffffff" "\n")))))
(defun modus-themes-exporter-xfce ()
"Template for Xfce terminal."
(modus-themes-with-colors
(let ((theme-name (format "%s" (car custom-enabled-themes))))
(with-temp-buffer
(concat
"[Scheme]" "\n"
"Name=" theme-name "\n"
"ColorForeground=" fg-main "\n"
"ColorBackground=" bg-main "\n"
"ColorCursor=" fg-main "\n"
"ColorBold=" fg-main "\n"
"ColorPalette="
"#000000;" red ";" green ";" yellow ";" blue ";" magenta ";" cyan ";" "#bfbfbf;"
"#595959;" red-alt ";" green-alt ";" yellow-alt ";" blue-alt ";" magenta-alt-other ";" cyan-alt-other ";"
"#ffffff" "\n"
"TabActivityColor=" magenta-alt "\n"
"ColorSelectionBackground=" bg-region "\n"
"ColorSelection=" fg-main "\n")))))
;; Please skip this. I only wrote it as an attempt to participate in
;; the contest for the ugliest concat ever imagined... Seriously
;; though, we should come up with a more elegant solution for complex
;; templates.
(defun modus-themes-exporter-vim ()
"Template for Vim."
(modus-themes-with-colors
(let* ((theme-name (format "%s" (car custom-enabled-themes)))
(theme-name-underscore (string-replace "-" "_" theme-name))
(variant (if (string= theme-name "modus-operandi") "light" "dark"))
(termcolbg (format "%s" (if (string= variant "light") 15 0)))
(termcolfg (format "%s" (if (string= variant "light") 0 15)))
(termcolbgalt (format "%s" (if (string= variant "light") 7 8)))
(termcolfgalt (format "%s" (if (string= variant "light") 8 7))))
(with-temp-buffer
(concat
"\" vi: ft=vim" "\n"
"\" Name: " theme-name-underscore "\n"
"\" Description: Vim port of " theme-name " (Modus themes for Emacs)" "\n"
"\" Author: Protesilaos Stavrou, <https://protesilaos.com>" "\n"
"\" Meta: Created with the modus-themes-exporter.el library" "\n"
"\" URL: https://gitlab.com/protesilaos/modus-themes" "\n"
"\n"
"set background=" variant "\n"
"hi clear" "\n"
"if exists('syntax_on')" "\n"
" syntax reset" "\n"
"endif" "\n"
"let g:colors_name = " "'" theme-name-underscore "'" "\n"
"\n"
"\" General" "\n"
"\" -------" "\n"
"if exists('g:modus_themes_enforce_background_color')" "\n"
" hi Normal guibg=" bg-main " guifg=" fg-main " ctermbg=" termcolbg " ctermfg=" termcolfg "" "\n"
"else" "\n"
" \" NOTE the ctermbg=none is for terminals with transparency" "\n"
" hi Normal guibg=" bg-main " guifg=" fg-main " ctermbg=none ctermfg=" termcolfg "" "\n"
"endif" "\n"
"" "\n"
"hi Visual guibg=" fg-main " guifg=" bg-main " ctermbg=" termcolfg " ctermfg=" termcolbg "" "\n"
"hi Search gui=underline,bold guibg=" bg-alt " guifg=" fg-main " cterm=underline,bold ctermbg=" termcolbgalt " ctermfg=3" "\n"
"hi IncSearch gui=underline,bold guibg=" fg-alt " guifg=" bg-main " term=none cterm=underline,bold ctermbg=" termcolfgalt " ctermfg=" termcolbg "" "\n"
"\n"
"hi StatusLine gui=none guibg=" fg-main " guifg=" bg-main " cterm=none ctermbg=" termcolfg " ctermfg=" termcolbg "" "\n"
"hi StatusLineNC gui=none guibg=" bg-alt " guifg=" fg-alt " cterm=none ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"hi StatusLineTerm gui=none guibg=" green " guifg=" bg-main " cterm=none ctermbg=2 ctermfg=" termcolbg "" "\n"
"hi StatusLineTermNC gui=none guibg=" bg-alt " guifg=" green " cterm=none ctermbg=" termcolbgalt " ctermfg=2" "\n"
"\n"
"hi VertSplit gui=none cterm=none" "\n"
"hi TabLine gui=none guibg=" bg-alt " guifg=" fg-alt " cterm=none ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"hi TabLineSel gui=none guibg=" cyan " guifg=" bg-main " cterm=none ctermbg=6 ctermfg=" termcolbg "" "\n"
"hi TabLineFill gui=none cterm=none" "\n"
"\n"
"hi Comment gui=italic guifg=" fg-alt " cterm=none ctermfg=" termcolfgalt "" "\n"
"hi Todo guibg=" bg-dim " guifg=" yellow-alt " ctermbg=" termcolbg " ctermfg=11" "\n"
"\n"
"hi Warning gui=none guibg=" yellow " guifg=" bg-main " cterm=none ctermbg=3 ctermfg=" termcolbg "" "\n"
"hi WarningMsg gui=none guibg=" yellow " guifg=" bg-main " cterm=none ctermbg=3 ctermfg=" termcolbg "" "\n"
"hi Error gui=none guibg=" red " guifg=" bg-main " cterm=none ctermbg=1 ctermfg=" termcolbg "" "\n"
"hi ErrorMsg gui=none guibg=" red " guifg=" bg-main " cterm=none ctermbg=1 ctermfg=" termcolbg "" "\n"
"\n"
"hi MatchParen gui=underline,bold guibg=" bg-alt " guifg=" fg-alt " cterm=underline,bold ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"\n"
"hi ToolbarLine guibg=" fg-alt " guifg=" bg-main " term=none ctermbg=" termcolfgalt " ctermfg=" termcolbg "" "\n"
"hi ToolbarButton gui=bold guibg=" fg-alt " guifg=" bg-main " term=none cterm=bold ctermbg=" termcolfgalt " ctermfg=" termcolbg "" "\n"
"\n"
"hi WildMenu guibg=" bg-main " guifg=" fg-main " term=standout ctermbg=" termcolbg " ctermfg=" termcolfg "" "\n"
"\n"
"hi Terminal guibg=" bg-main " guifg=" fg-main " term=none ctermbg=" termcolbg " ctermfg=" termcolfg "" "\n"
"\n"
"\" Constructs" "\n"
"\" ----------" "\n"
"hi Constant guifg=" blue-alt-other " ctermfg=4" "\n"
"hi Boolean guifg=" green " ctermfg=2" "\n"
"hi Number guifg=" blue-alt-other " ctermfg=4" "\n"
"hi Float guifg=" blue-alt-other " ctermfg=4" "\n"
"hi String guifg=" blue-alt " ctermfg=12" "\n"
"\n"
"hi Function guifg=" magenta " ctermfg=5" "\n"
"hi Identifier gui=none guifg=" cyan " cterm=none ctermfg=6" "\n"
"hi Label guifg=" magenta " ctermfg=5" "\n"
"hi Tag guifg=" magenta " ctermfg=5" "\n"
"hi Keyword gui=none guifg=" magenta-alt " cterm=none ctermfg=5" "\n"
"\n"
"hi Character gui=bold guifg=" cyan-alt-other " cterm=bold ctermfg=14" "\n"
"\n"
"hi Type gui=none,bold guifg=" cyan " term=none cterm=none,bold ctermfg=6" "\n"
"hi StorageClass guifg=" cyan " ctermfg=6" "\n"
"hi Structure guifg=" cyan " ctermfg=6" "\n"
"hi Typedef gui=bold guifg=" cyan-alt-other " cterm=bold ctermfg=14" "\n"
"\n"
"hi Conditional gui=none guifg=" magenta-alt-other " cterm=none ctermfg=13" "\n"
"hi Statement gui=none guifg=" magenta-alt-other " cterm=none ctermfg=13" "\n"
"hi Repeat gui=bold guifg=" magenta-alt " cterm=bold ctermfg=5" "\n"
"hi Operator gui=none guifg=" fg-main " cterm=none ctermfg=" termcolfg "\n"
"hi Exception gui=bold guifg=" yellow " cterm=bold ctermfg=2" "\n"
"\n"
"hi Preproc gui=none guifg=" red-alt " term=none cterm=none ctermfg=9" "\n"
"hi PreCondit gui=bold guifg=" red-alt " cterm=bold ctermfg=9" "\n"
"hi Macro gui=bold guifg=" magenta-alt " cterm=bold ctermfg=5" "\n"
"hi Include guifg=" red-alt " ctermfg=9" "\n"
"hi Define guifg=" red-alt " ctermfg=9" "\n"
"\n"
"hi Title gui=bold guibg=" bg-main " guifg=" cyan " cterm=bold ctermbg=" termcolbg " ctermfg=6" "\n"
"\n"
"hi Delimiter gui=none guifg=" fg-main " cterm=none ctermfg=" termcolfg "\n"
"hi SpecialComment gui=bold guifg=" yellow-alt-other " cterm=bold ctermfg=3" "\n"
"\n"
"hi Debug guifg=" magenta-alt " ctermfg=13" "\n"
"\n"
"\" Other" "\n"
"\" -----" "\n"
"hi LineNr guibg=" bg-alt " guifg=" fg-alt " term=none ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"hi Cursor guibg=" fg-main " guifg=" bg-main " ctermbg=" termcolfg " ctermfg=" termcolbg "" "\n"
"hi CursorLine gui=none guibg=" bg-alt " term=none cterm=none ctermbg=" termcolbgalt "" "\n"
"hi CursorColumn gui=none guibg=" bg-alt " term=none cterm=none ctermbg=" termcolbgalt "" "\n"
"hi CursorLineNr gui=bold guibg=" fg-alt " guifg=" bg-main " cterm=bold ctermbg=" termcolfgalt " ctermfg=" termcolbg "" "\n"
"hi ColorColumn guibg=" bg-alt " guifg=" fg-main " term=none ctermbg=" termcolbgalt " ctermfg=" termcolfg "" "\n"
"hi SignColumn guibg=" bg-alt " guifg=" fg-alt " term=none ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"\n"
"hi Folded guibg=" bg-alt " guifg=" fg-alt " ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"hi FoldColumn guibg=" bg-alt " guifg=" fg-alt " ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"\n"
"hi Special gui=none guifg=" green-alt-other " term=none cterm=none ctermfg=2" "\n"
"hi SpecialKey gui=none guibg=" bg-alt " guifg=" fg-alt " cterm=none ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"hi SpecialChar gui=bold guifg=" yellow-alt " cterm=bold ctermfg=11" "\n"
"hi NonText gui=none guibg=" bg-alt " guifg=" fg-alt " cterm=none ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"hi EndOfBuffer gui=bold guifg=" fg-alt " cterm=bold ctermfg=" termcolfgalt "" "\n"
"\n"
"hi Directory gui=none guifg=" green " term=none cterm=none ctermfg=2" "\n"
"hi Question gui=bold guifg=" yellow-alt " cterm=bold ctermfg=11" "\n"
"hi MoreMsg guifg=" green-alt " ctermfg=10" "\n"
"hi ModeMsg gui=bold guifg=" green " cterm=bold ctermfg=2" "\n"
"\n"
"hi VimOption guifg=" cyan-alt " ctermfg=6" "\n"
"hi VimGroup guifg=" cyan-alt " ctermfg=5" "\n"
"\n"
"hi Underlined gui=underline guifg=" fg-main " cterm=underline ctermfg=" termcolfg "" "\n"
"hi Ignore guibg=" bg-alt " guifg=" fg-alt " ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"hi Conceal guibg=" fg-alt " guifg=" bg-alt " ctermbg=" termcolfgalt " ctermfg=" termcolbgalt "" "\n"
"\n"
"hi SpellBad guibg=" red " guifg=" bg-main " ctermbg=1 ctermfg=" termcolbg "" "\n"
"hi SpellCap guibg=" yellow " guifg=" bg-main " ctermbg=3 ctermfg=" termcolbg "" "\n"
"hi SpellRare guibg=" magenta-alt-other " guifg=" bg-main " ctermbg=13 ctermfg=" termcolbg "" "\n"
"hi SpellLocal guibg=" cyan-alt-other " guifg=" bg-main " ctermbg=14 ctermfg=" termcolbg "" "\n"
"\n"
"hi Pmenu gui=italic guibg=" bg-alt " guifg=" fg-main " cterm=none ctermbg=" termcolbgalt " ctermfg=" termcolfg "" "\n"
"hi PmenuSel gui=none,bold guibg=" fg-alt " guifg=" bg-main " cterm=none,bold ctermbg=" termcolfgalt " ctermfg=" termcolbg "" "\n"
"hi PmenuSbar guibg=" bg-alt " ctermbg=" termcolbgalt "" "\n"
"hi PmenuThumb guibg=" fg-alt " ctermbg=" termcolfgalt "" "\n"
"\n"
"\" Terminal" "\n"
"\" --------" "\n"
"\n"
"if exists('*term_setansicolors')" "\n"
" let g:terminal_ansi_colors = [" "\n"
" \\ '#000000'," "\n"
" \\ '" red "'," "\n"
" \\ '" green "'," "\n"
" \\ '" yellow "'," "\n"
" \\ '" blue "'," "\n"
" \\ '" magenta "'," "\n"
" \\ '" cyan "'," "\n"
" \\ '#bfbfbf'," "\n"
" \\ '#595959'," "\n"
" \\ '" red-alt "'," "\n"
" \\ '" green-alt "'," "\n"
" \\ '" yellow-alt "'," "\n"
" \\ '" blue-alt "'," "\n"
" \\ '" magenta-alt-other "'," "\n"
" \\ '" cyan-alt-other "'," "\n"
" \\ '#ffffff'" "\n"
" \\ ]" "\n"
"endif" "\n"
"if has('nvim')" "\n"
" let g:terminal_color_0 = '#000000'" "\n"
" let g:terminal_color_1 = '" red "'" "\n"
" let g:terminal_color_2 = '" green "'" "\n"
" let g:terminal_color_3 = '" yellow "'" "\n"
" let g:terminal_color_4 = '" blue "'" "\n"
" let g:terminal_color_5 = '" magenta "'" "\n"
" let g:terminal_color_6 = '" cyan "'" "\n"
" let g:terminal_color_7 = '#bfbfbf'" "\n"
" let g:terminal_color_8 = '#595959'" "\n"
" let g:terminal_color_9 = '" red-alt "'" "\n"
" let g:terminal_color_10 = '" green-alt "'" "\n"
" let g:terminal_color_11 = '" yellow-alt "'" "\n"
" let g:terminal_color_12 = '" blue-alt "'" "\n"
" let g:terminal_color_13 = '" magenta-alt-other "'" "\n"
" let g:terminal_color_14 = '" cyan-alt-other "'" "\n"
" let g:terminal_color_15 = '#ffffff'" "\n"
"endif" "\n"
"\n"
"\" Diffs" "\n"
"\" -----" "\n"
"hi DiffAdd gui=bold guibg=" green " guifg=" bg-main " cterm=bold ctermbg=10 ctermfg=" termcolbg "" "\n"
"hi DiffDelete gui=none guibg=" red " guifg=" bg-main " cterm=none ctermbg=9 ctermfg=" termcolbg "" "\n"
"hi DiffChange gui=bold guibg=" bg-alt " guifg=" fg-alt " cterm=bold ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"hi DiffText gui=bold guibg=" bg-alt " guifg=" red-alt " cterm=bold ctermbg=" termcolbgalt " ctermfg=1" "\n"
"\n"
"hi diffAdded guifg=" green " ctermfg=2" "\n"
"hi diffRemoved guifg=" red " ctermfg=1" "\n"
"hi diffNewFile gui=none guifg=" blue " ctermfg=4" "\n"
"hi diffFile gui=none guifg=" yellow " cterm=none ctermfg=3" "\n"
"\n"
"hi GitGutterAdd guibg=" bg-alt " guifg=" green " ctermbg=" termcolbgalt " ctermfg=2" "\n"
"hi GitGutterChange gui=bold guibg=" bg-alt " guifg=" fg-alt " cterm=bold ctermbg=" termcolbgalt " ctermfg=" termcolfgalt "" "\n"
"hi GitGutterDelete guibg=" bg-alt " guifg=" red " ctermbg=" termcolbgalt " ctermfg=1" "\n"
"hi GitGutterChangeDelete gui=bold guibg=" bg-alt " guifg=" red " cterm=bold ctermbg=" termcolbgalt " ctermfg=1" "\n"
"\n"
"\" Neomake" "\n"
"\" -------" "\n"
"hi NeomakeError gui=none guibg=" red " guifg=" bg-main " cterm=none ctermbg=1 ctermfg=" termcolbg "" "\n"
"hi NeomakeInfo gui=none guibg=" cyan " guifg=" bg-main " cterm=none ctermbg=6 ctermfg=" termcolbg "" "\n"
"hi NeomakeWarning gui=none guibg=" yellow " guifg=" bg-main " cterm=none ctermbg=3 ctermfg=" termcolbg "" "\n"
"hi NeomakeMessage gui=none guibg=" yellow-alt " guifg=" bg-main " cterm=none ctermbg=11 ctermfg=" termcolbg "" "\n"
"\n"
"hi NeomakeVirtualtextInfoDefault guifg=" cyan-alt-other " ctermfg=14" "\n"
"hi NeomakeVirtualtextMessageDefault guifg=" yellow-alt " ctermfg=11" "\n"
"hi NeomakeVirtualtextWarningDefault guifg=" yellow " ctermfg=3" "\n"
"hi NeomakeVirtualtextErrorDefault guifg=" red " ctermfg=1" "\n"
"\n"
"hi NeomakeStatusGood gui=none guibg=" green " guifg=" bg-main " cterm=none ctermbg=2 ctermfg=" termcolbg "" "\n"
"hi NeomakeStatusGoodNC gui=none guibg=" bg-alt " guifg=" green " cterm=none ctermbg=" termcolbgalt " ctermfg=2" "\n"
"\n"
"hi NeomakeStatColorDefault gui=none guibg=" blue " guifg=" bg-main " cterm=none ctermbg=4 ctermfg=" termcolbg "" "\n"
"hi NeomakeStatColorTypeE gui=none guibg=" red " guifg=" bg-main " cterm=none ctermbg=1 ctermfg=" termcolbg "" "\n"
"hi NeomakeStatColorTypeW gui=none guibg=" yellow " guifg=" bg-main " cterm=none ctermbg=3 ctermfg=" termcolbg "" "\n"
"\n"
"\" Markdown" "\n"
"\" --------" "\n"
"hi MarkdownRule gui=bold guibg=" bg-alt " guifg=" green-alt " cterm=bold ctermbg=" termcolbgalt " ctermfg=10" "\n"
"\n"
"hi MarkdownHeading gui=bold guifg=" fg-main " cterm=bold ctermfg=" termcolfg "" "\n"
"hi default link MarkdownH1 MarkdownHeading" "\n"
"hi default link MarkdownH2 MarkdownHeading" "\n"
"hi default link MarkdownH3 MarkdownHeading" "\n"
"hi default link MarkdownH4 MarkdownHeading" "\n"
"hi default link MarkdownH5 MarkdownHeading" "\n"
"hi default link MarkdownH6 MarkdownHeading" "\n"
"hi default link MarkdownHeadingDelimiter MarkdownHeading" "\n"
"hi default link MarkdownHeadingRule MarkdownHeading" "\n"
"\n"
"hi MarkdownBold gui=bold guifg=" red-alt " cterm=bold ctermfg=9" "\n"
"hi default link MarkdownBoldDelimiter MarkdownBold" "\n"
"\n"
"hi MarkdownItalic gui=italic guifg=" yellow " cterm=none ctermfg=3" "\n"
"hi default link MarkdownItalicDelimiter MarkdownItalic" "\n"
"\n"
"hi MarkdownUrl gui=underline guifg=" blue " cterm=underline ctermfg=4" "\n"
"hi MarkdownLinkText gui=none guifg=" blue-alt " cterm=none ctermfg=12" "\n"
"hi MarkdownLinkDelimiter gui=bold guifg=" fg-main " cterm=bold ctermfg=" termcolfg "" "\n"
"hi default link MarkdownLinkTextDelimiter MarkdownLinkDelimiter" "\n"
"\n"
"hi MarkdownCode guifg=" magenta " ctermfg=5" "\n"
"hi default link MarkdownCodeDelimiter MarkdownCode" "\n"
"\n"
"hi MarkdownCodeBlock guifg=" fg-main " ctermfg=" termcolfg "" "\n"
"\n"
"hi MarkdownListMarker gui=none guifg=" green " cterm=none ctermfg=2" "\n"
"hi default link MarkdownOrderedListMarker MarkdownListMarker" "\n"
"\n"
"\" Linting" "\n"
"\" -------" "\n"
"hi YcmErrorSection gui=undercurl guisp=" fg-lang-error " cterm=underline" "\n"
"hi YcmWarningSection gui=undercurl guisp=" fg-lang-warning " cterm=underline" "\n"
"hi SyntasticError gui=undercurl guisp=" fg-lang-error " cterm=underline" "\n"
"hi SyntasticWarning gui=undercurl guisp=" fg-lang-warning " cterm=underline" "\n"
"hi SyntasticErrorSing guifg=" bg-main " guibg=" fg-lang-error " ctermfg=" termcolbg " ctermbg=1" "\n"
"hi SyntasticWarningSign guifg=" bg-main " guibg=" fg-lang-warning " ctermfg=" termcolbg " ctermbg=3" "\n")))))
(defvar modus-themes-exporter-template-hist '()
"History of inputs for templates.")
(defun modus-themes-exporter--export-prompt (apps)
"Helper for `modus-themes-exporter-export' to select among APPS."
(completing-read "Select template: " apps nil t nil 'modus-themes-exporter-template-hist))
;;;###autoload
(defun modus-themes-exporter-export (template &optional file no-visit)
"Export current Modus theme using TEMPLATE.
When called interactively, TEMPLATE is chosen from a list of candidates
using completion. Else it must be a string that corresponds to the car
of a cons cell in `modus-themes-exporter-templates-alist'.
The output is stored in the kill ring.
When called from Lisp with optional FILE as a path to a regular file,
write there directly. When called interactively with the universal
prefix argument (\\[universal-argument]), prompt for FILE instead:
supplying a non-existent path will create that file outright. Once the
output has been written to the file, prompt to visit it.
With optional NO-VISIT, either as a non-nil symbol in Lisp or a
double prefix argument interactively, do not prompt to visit the
file."
(interactive
(list
(modus-themes-exporter--export-prompt
(mapcar #'car modus-themes-exporter-templates-alist))
current-prefix-arg))
(let* ((modus-themes '(modus-operandi modus-vivendi))
(current-theme (car custom-enabled-themes))
(fn (funcall (cdr (assoc template modus-themes-exporter-templates-alist))))
(path (when file
(if (stringp file)
file
(expand-file-name
(read-file-name "Select file: " nil default-directory))))))
(unless (member current-theme modus-themes)
(error "`%s' is not a member of %s" current-theme modus-themes))
(cond
((when (and path (file-writable-p path) (file-regular-p path))
(with-temp-buffer
(insert (eval fn))
(write-region (point-min) (point-max) path))
(unless no-visit
(when (yes-or-no-p (format "Wrote to file; visit new %s?" path))
(find-file path)))))
((when (and path
(not (file-regular-p path)))
(when (yes-or-no-p "Not a valid FILE; print output at point instead?")
(insert (eval fn)))))
(t
(kill-new fn)
(message "Saved to kill-ring port of %s for %s" current-theme template)))))
(provide 'modus-themes-exporter)
;;; modus-themes-exporter.el ends here