1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955
|
#+title: Modus themes for GNU Emacs
#+author: Protesilaos Stavrou
#+email: info@protesilaos.com
#+language: en
#+options: ':t toc:nil author:t email:t num:t
#+startup: content
#+macro: stable-version 4.4.0
#+macro: release-date 2024-03-17
#+macro: development-version 4.5.0-dev
#+macro: file @@texinfo:@file{@@$1@@texinfo:}@@
#+macro: space @@texinfo:@: @@
#+macro: kbd @@texinfo:@kbd{@@$1@@texinfo:}@@
#+texinfo_filename: modus-themes.info
#+texinfo_dir_category: Emacs misc features
#+texinfo_dir_title: Modus Themes: (modus-themes)
#+texinfo_dir_desc: Elegant, highly legible and customizable themes
#+texinfo_header: @set MAINTAINERSITE @uref{https://protesilaos.com,maintainer webpage}
#+texinfo_header: @set MAINTAINER Protesilaos Stavrou
#+texinfo_header: @set MAINTAINEREMAIL @email{info@protesilaos.com}
#+texinfo_header: @set MAINTAINERCONTACT @uref{mailto:info@protesilaos.com,contact the maintainer}
#+texinfo: @insertcopying
This manual, written by Protesilaos Stavrou, describes the
customization options for the Modus themes, and provides every other
piece of information pertinent to them.
The documentation furnished herein corresponds to stable version
{{{stable-version}}}, released on {{{release-date}}}. Any reference
to a newer feature which does not yet form part of the latest tagged
commit, is explicitly marked as such.
Current development target is {{{development-version}}}.
+ Package name (GNU ELPA): ~modus-themes~
+ Official manual: <https://protesilaos.com/emacs/modus-themes>
+ Change log: <https://protesilaos.com/emacs/modus-themes-changelog>
+ Color palette: <https://protesilaos.com/emacs/modus-themes-colors>
+ Sample pictures: <https://protesilaos.com/emacs/modus-themes-pictures>
+ Git repositories:
+ GitHub: <https://github.com/protesilaos/modus-themes>
+ GitLab: <https://gitlab.com/protesilaos/modus-themes>
+ Backronym: My Old Display Unexpectedly Sharpened ... themes.
#+toc: headlines 8 insert TOC here, with eight headline levels
* COPYING
:properties:
:copying: t
:custom_id: h:b14c3fcb-13dd-4144-9d92-2c58b3ed16d3
:end:
Copyright (C) 2020-2025 Free Software Foundation, Inc.
#+begin_quote
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with the Front-Cover Texts being “A GNU Manual,” and
with the Back-Cover Texts as in (a) below. A copy of the license is
included in the section entitled “GNU Free Documentation License.”
(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and
modify this GNU manual.”
#+end_quote
* Overview
:properties:
:custom_id: h:f0f3dbcb-602d-40cf-b918-8f929c441baf
:end:
The Modus themes are designed for accessible readability. They
conform with the highest standard for color contrast between
combinations of background and foreground values. For small sized
text, this corresponds to the WCAG AAA standard, which specifies a
minimum rate of distance in relative luminance of 7:1.
The Modus themes consist of eight themes, divided into four subgroups.
- Main themes :: ~modus-operandi~ is the project's main light theme,
while ~modus-vivendi~ is its dark counterpart. These two themes are
part of the project since its inception. They are designed to cover
a broad range of needs and are, in the opinion of the author, the
reference for what a highly legible "default" theme should look
like.
- Tinted themes :: ~modus-operandi-tinted~ and ~modus-vivendi-tinted~
are variants of the two main themes. They slightly tone down the
intensity of the background and provide a bit more color variety.
~modus-operandi-tinted~ has a set of base tones that are shades of
light ocher (earthly colors), while ~modus-vivendi-tinted~ gives a
night sky impression.
- Deuteranopia themes :: ~modus-operandi-deuteranopia~ and its
companion ~modus-vivendi-deuteranopia~ are optimized for users with
red-green color deficiency. This means that they do not use red and
green hues for color-coding purposes, such as for diff removed and
added lines. Instead, they implement colors that are discernible by
users with deueteranopia or deuteranomaly (mostly yellow and blue
hues).
- Tritanopia themes :: ~modus-operandi-tritanopia~ and its counterpart
~modus-vivendi-tritanopia~ are optimized for users with blue-yellow
color deficiency. The idea is the same as with the deuteranopia
variants: color coding relies only on hues that are accessible to
people with tritanopia or tritanomaly, namely, shades of red and
cyan.
To ensure that users have a consistently accessible experience, the
themes strive to achieve as close to full face coverage as possible,
while still targeting a curated list of well-maintained packages
([[#h:a9c8f29d-7f72-4b54-b74b-ddefe15d6a19][Face coverage]]).
The overarching objective of this project is to always offer
accessible color combinations. There shall never be a compromise on
this principle. If there arises an inescapable trade-off between
usability and stylistic considerations, we will always opt for the
former.
Starting with version 0.12.0 and onwards, the themes are built into GNU
Emacs.
** How do the themes look like
:properties:
:custom_id: h:69b92089-069c-4ba1-9d94-cc3415fc4f87
:end:
#+cindex: Screenshots
Check the web page with [[https://protesilaos.com/emacs/modus-themes-pictures/][the screen shots]]. Note that the themes are
highly customizable ([[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization options]]).
** Learn about the latest changes
:properties:
:custom_id: h:2cc37c36-6c1a-48b2-a010-1050b270ee18
:end:
#+cindex: Changelog
Please refer to the [[https://protesilaos.com/emacs/modus-themes-changelog][web page with the change log]]. It is comprehensive
and covers everything that goes into every tagged release of the themes.
* Installation
:properties:
:custom_id: h:1af85373-7f81-4c35-af25-afcef490c111
:end:
The Modus themes are distributed with Emacs starting with version 28.1.
On older versions of Emacs, they can be installed using Emacs's package
manager or manually from their code repository. There also exist
packages for distributions of GNU/Linux.
Emacs 28 ships with ~modus-themes~ version =1.6.0=. Emacs 29 includes
version =3.0.0=. Emacs 30 provides a newer, refactored version that
thoroughly refashions how the themes are implemented and customized.
Such major versions are not backward-compatible due to the limited
resources at the maintainer's disposal to support multiple versions of
Emacs and of the themes across the years.
** Install manually from source
:properties:
:custom_id: h:da3414b7-1426-46b8-8e76-47b845b76fd0
:end:
In the following example, we are assuming that your Emacs files are
stored in {{{file(~/.emacs.d)}}} and that you want to place the Modus
themes in {{{file(~/.emacs.d/modus-themes)}}}.
1. Get the source and store it in the desired path by running the
following in the command line shell:
: $ git clone https://gitlab.com/protesilaos/modus-themes.git ~/.emacs.d/modus-themes
2. Add that path to your known Elisp libraries' list, by placing this
snippet of Emacs Lisp in your init file (e.g. {{{file(init.el)}}}):
#+begin_src emacs-lisp
(add-to-list 'load-path "~/.emacs.d/modus-themes")
#+end_src
The themes are now ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]].
** Install from the archives
:properties:
:custom_id: h:c4b10085-149f-43e2-bd4d-347f33aee054
:end:
The ~modus-themes~ package is available from the GNU ELPA archive, which
is configured by default.
Prior to querying any package archive, make sure to update the index,
with {{{kbd(M-x package-refresh-contents)}}}. Then all you need to do
is type {{{kbd(M-x package-install)}}} and specify the ~modus-themes~.
Once installed, the themes are ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]].
** Install on GNU/Linux
:properties:
:custom_id: h:da640eb1-95dd-4e86-bb4e-1027b27885f0
:end:
The themes are also available from the archives of some distributions of
GNU/Linux. These should correspond to a tagged release rather than
building directly from the latest Git commit. It all depends on the
distro's packaging policies.
*** Debian 11 Bullseye
:properties:
:custom_id: h:7e570360-9ee6-4bc5-8c04-9dc11418a3e4
:end:
The themes are part of Debian 11 Bullseye. Get them with:
#+begin_src sh
sudo apt install elpa-modus-themes
#+end_src
They are now ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]].
NOTE that Debian's package is severely out-of-date as of this writing
2022-07-24 09:57 +0300.
*** GNU Guix
:properties:
:custom_id: h:a4ca52cd-869f-46a5-9e16-4d9665f5b88e
:end:
Users of Guix can get the themes with this command:
#+begin_src sh
guix package -i emacs-modus-themes
#+end_src
They are now ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]].
** Dealing with byte compilation errors
:properties:
:custom_id: h:e6268471-e847-4c9d-998f-49a83257b7f1
:end:
From time to time, we receive bug reports pertaining to errors with
byte compilation. These seldom have to do with faulty code in the
themes: it might be a shortcoming of {{{file(package.el)}}}, some
regression in the current development target of Emacs, a
misconfiguration in an otherwise exotic setup, and the like.
The common solution with a stable version of Emacs is to:
1. Delete the ~modus-themes~ package.
2. Close the current Emacs session.
3. Install the ~modus-themes~ again.
For those building Emacs directly from source, the solution may involve
reverting to an earlier commit in emacs.git.
At any rate, if you encounter such an issue please report it: we will
either fix the bug on our end if it is truly ours, or help forward it to
the relevant upstream maintainer. Whatever you do, please understand
that a build failure does not mean we are necessarily doing something
wrong.
[[#h:6536c8d5-3f98-43ab-a787-b94120e735e8][Issues you can help with]].
* Enable and load
:properties:
:custom_id: h:3f3c3728-1b34-437d-9d0c-b110f5b161a9
:end:
#+cindex: Essential configuration
NOTE that Emacs can load multiple themes, which typically produces
undesirable results and undoes the work of the designer. Use the
~disable-theme~ command if you are trying other themes beside the
Modus collection ([[#h:adb0c49a-f1f9-4690-868b-013a080eed68][Option for disabling other themes while loading Modus]]).
Users of the built-in themes cannot ~require~ the package as usual
because there is no package to speak of. Instead, things are simpler
as built-in themes are considered safe. All one needs is to load the
theme of their preference by adding either form to their init file:
#+begin_src emacs-lisp
(load-theme 'modus-operandi) ; Light theme
(load-theme 'modus-vivendi) ; Dark theme
#+end_src
Remember that there are multiple Modus themes ([[#h:f0f3dbcb-602d-40cf-b918-8f929c441baf][Overview]]). Adapt the
above snippet accordingly.
Users of packaged variants of the themes must add a few more lines to
ensure that everything works as intended. First, one has to require the
main library before loading one of the themes:
#+begin_src emacs-lisp
(require 'modus-themes)
#+end_src
One can activate a theme with something like the following expression,
replacing ~modus-operandi~ with their preferred Modus theme:
#+begin_src emacs-lisp
(load-theme 'modus-operandi :no-confirm)
#+end_src
Changes to the available customization options must always be evaluated
before loading a theme ([[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization Options]]). Reload a theme for
new changes to take effect.
This is how a basic setup could look like ([[#h:b66b128d-54a4-4265-b59f-4d1ea2feb073][The require-theme for built-in Emacs themes]]):
#+begin_src emacs-lisp
;;; For the built-in themes which cannot use `require'.
(require-theme 'modus-themes)
;; Add all your customizations prior to loading the themes.
(setq modus-themes-italic-constructs t
modus-themes-bold-constructs nil)
;; Load the theme of your choice.
(load-theme 'modus-operandi)
;; Optionally define a key to switch between Modus themes. Also check
;; the user option `modus-themes-to-toggle'.
(define-key global-map (kbd "<f5>") #'modus-themes-toggle)
;;; For packaged versions which must use `require'.
(require 'modus-themes)
;; Add all your customizations prior to loading the themes
(setq modus-themes-italic-constructs t
modus-themes-bold-constructs nil)
;; Load the theme of your choice.
(load-theme 'modus-operandi :no-confirm)
(define-key global-map (kbd "<f5>") #'modus-themes-toggle)
#+end_src
[[#h:e979734c-a9e1-4373-9365-0f2cd36107b8][Sample configuration with and without use-package]].
To disable other themes before loading a Modus theme, use something
like this:
#+begin_src emacs-lisp
(mapc #'disable-theme custom-enabled-themes)
(load-theme 'modus-operandi :no-confirm)
#+end_src
#+findex: modus-themes-load-theme
Instead of using the basic ~load-theme~ function, users can rely on
the ~modus-themes-load-theme~. It accepts a single argument, which is
a symbol representing the Modus theme of choice, such as:
#+begin_src emacs-lisp
(modus-themes-load-theme 'modus-operandi)
#+end_src
#+vindex: modus-themes-after-load-theme-hook
#+vindex: modus-themes-post-load-hook
The ~modus-themes-load-theme~ takes care to disable other themes, if
the user opts in ([[#h:adb0c49a-f1f9-4690-868b-013a080eed68][Option for disabling other themes while loading Modus]]).
After loading the theme of choice, this function calls the
hook ~modus-themes-after-load-theme-hook~ (alias ~modus-themes-post-load-hook~).
Users can add their own functions to this hook to make further
customizations ([[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]]).
#+findex: modus-themes-toggle
#+findex: modus-themes-select
The commands ~modus-themes-toggle~ and ~modus-themes-select~ use
~modus-themes-load-theme~ internally ([[#h:4fbfed66-5a89-447a-a07d-a03f6819c5bd][Option for which themes to toggle]]).
The aforementioned hold true for them as well.
** The ~require-theme~ for built-in Emacs themes
:PROPERTIES:
:CUSTOM_ID: h:b66b128d-54a4-4265-b59f-4d1ea2feb073
:END:
The version of the Modus themes that is included in Emacs CANNOT use
the standard ~require~. This is because the built-in themes are not
included in the ~load-path~ (not my decision). The ~require-theme~
function must be used in this case as a replacement. For example:
#+begin_src emacs-lisp
(require-theme 'modus-themes)
;; All customizations here
(setq modus-themes-bold-constructs t
modus-themes-italic-constructs t)
;; Maybe define some palette overrides, such as by using our presets
(setq modus-themes-common-palette-overrides
modus-themes-preset-overrides-intense)
;; Load the theme of choice (built-in themes are always "safe" so they
;; do not need the `no-require' argument of `load-theme').
(load-theme 'modus-operandi)
(define-key global-map (kbd "<f5>") #'modus-themes-toggle)
#+end_src
** Sample configuration with and without use-package
:properties:
:custom_id: h:e979734c-a9e1-4373-9365-0f2cd36107b8
:end:
#+cindex: use-package configuration
#+cindex: sample configuration
What follows is a variant of what we demonstrate in the previous
section ([[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]).
It is common for Emacs users to rely on ~use-package~ for declaring
package configurations in their setup. We use this as an example:
#+begin_src emacs-lisp
;;; For the built-in themes which cannot use `require'.
(use-package emacs
:config
(require-theme 'modus-themes) ; `require-theme' is ONLY for the built-in Modus themes
;; Add all your customizations prior to loading the themes
(setq modus-themes-italic-constructs t
modus-themes-bold-constructs nil)
;; Maybe define some palette overrides, such as by using our presets
(setq modus-themes-common-palette-overrides
modus-themes-preset-overrides-intense)
;; Load the theme of your choice.
(load-theme 'modus-operandi)
(define-key global-map (kbd "<f5>") #'modus-themes-toggle))
;;; For packaged versions which must use `require'.
(use-package modus-themes
:ensure t
:config
;; Add all your customizations prior to loading the themes
(setq modus-themes-italic-constructs t
modus-themes-bold-constructs nil)
;; Maybe define some palette overrides, such as by using our presets
(setq modus-themes-common-palette-overrides
modus-themes-preset-overrides-intense)
;; Load the theme of your choice.
(load-theme 'modus-operandi)
(define-key global-map (kbd "<f5>") #'modus-themes-toggle))
#+end_src
The same without ~use-package~:
#+begin_src emacs-lisp
(require 'modus-themes) ; OR for the built-in themes: (require-theme 'modus-themes)
;; Add all your customizations prior to loading the themes
(setq modus-themes-italic-constructs t
modus-themes-bold-constructs nil)
;; Maybe define some palette overrides, such as by using our presets
(setq modus-themes-common-palette-overrides
modus-themes-preset-overrides-intense)
;; Load the theme of your choice:
(load-theme 'modus-operandi :no-confirm)
(define-key global-map (kbd "<f5>") #'modus-themes-toggle)
#+end_src
[[#h:e68560b3-7fb0-42bc-a151-e015948f8a35][Differences between loading and enabling]].
Note: make sure not to customize the variable ~custom-theme-load-path~
or ~custom-theme-directory~ after the themes' package declaration. That
will lead to failures in loading the files. If either or both of those
variables need to be changed, their values should be defined before the
package declaration of the themes.
** Differences between loading and enabling
:properties:
:custom_id: h:e68560b3-7fb0-42bc-a151-e015948f8a35
:end:
#+cindex: load-theme VS enable-theme
The reason we recommend ~load-theme~ instead of the other option of
~enable-theme~ is that the former does a kind of "reset" on the face
specs. It quite literally loads (or reloads) the theme. Whereas the
~enable-theme~ function simply puts an already loaded theme to the top
of the list of enabled items, reusing whatever state was last loaded.
As such, ~load-theme~ reads all customizations that may happen during
any given Emacs session: even after the initial setup of a theme.
Examples are calls to ~custom-set-faces~, as well as new values assigned
to the options the Modus themes provide ([[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization Options]]).
Our tests show that ~enable-theme~ does not read such variables anew, so
it might appear to the unsuspecting user that the themes are somehow
broken whenever they try to assign a new value to a customization option
or some face.
This "reset" that ~load-theme~ brings about does, however, come at the
cost of being somewhat slower than ~enable-theme~. Users who have a
stable setup and who seldom update their variables during a given Emacs
session, are better off using something like this:
#+begin_src emacs-lisp
(require 'modus-themes)
;; Activate your desired themes here
(load-theme 'modus-operandi t t)
(load-theme 'modus-vivendi t t)
;; Enable the preferred one
(enable-theme 'modus-operandi)
#+end_src
[[#h:b40aca50-a3b2-4c43-be58-2c26fcd14237][Toggle themes without reloading them]].
[[#h:e979734c-a9e1-4373-9365-0f2cd36107b8][Sample configuration with and without use-package]].
With the above granted, other sections of the manual discuss how to
configure custom faces, where ~load-theme~ is expected, though
~enable-theme~ could still apply in stable setups:
[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]].
* Customization options
:properties:
:custom_id: h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f
:end:
The Modus themes are highly configurable, though they should work well
without any further tweaks. We provide a variety of user options.
The following code block provides an overview. In addition to those
variables, the themes support a comprehensive system of overrides: it
can be used to make thoroughgoing changes to the looks of the themes
([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). We document everything at length in
the pages of this manual and also provide ready-to-use code samples.
Remember that all customization options must be evaluated before loading
a theme ([[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]). If the theme is already active, it must be
reloaded for changes to take effect.
#+begin_src emacs-lisp
;; In all of the following, WEIGHT is a symbol such as `semibold',
;; `light', `bold', or anything mentioned in `modus-themes-weights'.
(setq modus-themes-italic-constructs t
modus-themes-bold-constructs nil
modus-themes-mixed-fonts t
modus-themes-variable-pitch-ui nil
modus-themes-custom-auto-reload t
modus-themes-disable-other-themes t
;; Options for `modus-themes-prompts' are either nil (the
;; default), or a list of properties that may include any of those
;; symbols: `italic', `WEIGHT'
modus-themes-prompts '(italic bold)
;; The `modus-themes-completions' is an alist that reads two
;; keys: `matches', `selection'. Each accepts a nil value (or
;; empty list) or a list of properties that can include any of
;; the following (for WEIGHT read further below):
;;
;; `matches' :: `underline', `italic', `WEIGHT'
;; `selection' :: `underline', `italic', `WEIGHT'
modus-themes-completions
'((matches . (extrabold))
(selection . (semibold italic text-also)))
modus-themes-org-blocks 'gray-background ; {nil,'gray-background,'tinted-background}
;; The `modus-themes-headings' is an alist: read the manual's
;; node about it or its doc string. Basically, it supports
;; per-level configurations for the optional use of
;; `variable-pitch' typography, a height value as a multiple of
;; the base font size (e.g. 1.5), and a `WEIGHT'.
modus-themes-headings
'((1 . (variable-pitch 1.5))
(2 . (1.3))
(agenda-date . (1.3))
(agenda-structure . (variable-pitch light 1.8))
(t . (1.1))))
;; Remember that more (MUCH MORE) can be done with overrides, which we
;; document extensively in this manual.
#+end_src
** Option for reloading the theme on custom change
:properties:
:alt_title: Custom reload theme
:description: Toggle auto-reload of the theme when setting custom variables
:custom_id: h:9001527a-4e2c-43e0-98e8-3ef72d770639
:end:
#+vindex: modus-themes-custom-auto-reload
Brief: Toggle reloading of the active theme when an option is changed
through the Custom UI.
Symbol: ~modus-themes-custom-auto-reload~ (=boolean= type)
Possible values:
1. ~nil~
2. ~t~ (default)
All theme user options take effect when a theme is loaded. Any
subsequent changes require the theme to be reloaded.
When this variable has a non-~nil~ value, any change made via the Custom
UI or related functions such as ~customize-set-variable~ and ~setopt~
(Emacs 29), will trigger a reload automatically.
With a ~nil~ value, changes to user options have no further consequences:
the user must manually reload the theme ([[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]).
** Option for disabling other themes while loading Modus
:properties:
:alt_title: Disable other themes
:description: Determine whether loading a Modus themes disables all others
:custom_id: h:adb0c49a-f1f9-4690-868b-013a080eed68
:end:
#+vindex: modus-themes-disable-other-themes
Brief: Disable all other themes when loading a Modus theme.
Symbol: ~modus-themes-disable-other-themes~ (=boolean= type)
Possible values:
1. ~nil~
2. ~t~ (default)
When the value is non-~nil~, the commands ~modus-themes-toggle~ and
~modus-themes-select~, as well as the ~modus-themes-load-theme~
function, will disable all other themes while loading the specified
Modus theme ([[#h:4fbfed66-5a89-447a-a07d-a03f6819c5bd][Option for which themes to toggle]]). This is done to
ensure that Emacs does not blend two or more themes: such blends lead
to awkward results that undermine the work of the designer.
When the value is ~nil~, the aforementioned commands and function will
only disable other themes within the Modus collection.
This option is provided because Emacs themes are not necessarily
limited to colors/faces: they can consist of an arbitrary set of
customizations. Users who use such customization bundles must set
this variable to a ~nil~ value.
** Option for more bold constructs
:properties:
:alt_title: Bold constructs
:description: Toggle bold constructs in code
:custom_id: h:b25714f6-0fbe-41f6-89b5-6912d304091e
:end:
#+vindex: modus-themes-bold-constructs
Brief: Use bold for code syntax highlighting and related.
Symbol: ~modus-themes-bold-constructs~ (=boolean= type)
Possible values:
1. ~nil~ (default)
2. ~t~
The default is to use a bold typographic weight only when it is
required.
With a non-~nil~ value (~t~) display several syntactic constructs in
bold weight. This concerns keywords and other important aspects of
code syntax. It also affects certain mode line indicators and command
prompts.
Advanced users may also want to configure the exact attributes of the
~bold~ face.
[[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]].
** Option for more italic constructs
:properties:
:alt_title: Italic constructs
:description: Toggle italic font constructs in code
:custom_id: h:977c900d-0d6d-4dbb-82d9-c2aae69543d6
:end:
#+vindex: modus-themes-italic-constructs
Brief: Use italics for code syntax highlighting and related.
Symbol: ~modus-themes-italic-constructs~ (=boolean= type)
Possible values:
1. ~nil~ (default)
2. ~t~
The default is to not use slanted text forms (italics) unless it is
absolutely necessary.
With a non-~nil~ value (~t~) choose to render more faces in italics. This
typically affects documentation strings and code comments.
Advanced users may also want to configure the exact attributes of the
~italic~ face.
[[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]].
** Option for which themes to toggle
:PROPERTIES:
:CUSTOM_ID: h:4fbfed66-5a89-447a-a07d-a03f6819c5bd
:END:
#+vindex: modus-themes-to-toggle
Brief: Choose to Modus themes to toggle between
Symbol: ~modus-themes-to-toggle~ (=list= type)
Default value: ='(modus-operandi modus-vivendi)=
Possible values:
- ~modus-operandi~
- ~modus-vivendi~
- ~modus-operandi-tinted~
- ~modus-vivendi-tinted~
- ~modus-operandi-deuteranopia~
- ~modus-vivendi-deuteranopia~
- ~modus-operandi-tritanopia~
- ~modus-vivendi-tritanopia~
Specify two themes to toggle between using the command
~modus-themes-toggle~.
** Option for font mixing
:properties:
:alt_title: Mixed fonts
:description: Toggle mixing of font families
:custom_id: h:115e6c23-ee35-4a16-8cef-e2fcbb08e28b
:end:
#+vindex: modus-themes-mixed-fonts
Brief: Toggle the use of monospaced fonts for spacing-sensitive
constructs (affects font families).
Symbol: ~modus-themes-mixed-fonts~ (=boolean= type)
Possible values:
1. ~nil~ (default)
2. ~t~
When set to non-~nil~ (~t~), configure some spacing-sensitive faces like Org
tables and code blocks to always inherit from the ~fixed-pitch~ face.
This is to ensure that certain constructs like code blocks and tables
remain monospaced even when users opt for a mode that remaps typeface
families, such as the built-in {{{kbd(M-x variable-pitch-mode)}}}. Otherwise
the layout can appear broken, due to how spacing is done.
For a consistent experience, user may need to specify the font family of
the ~fixed-pitch~ face.
[[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and others]].
** Option for command prompt styles
:properties:
:alt_title: Command prompts
:description: Control the style of command prompts
:custom_id: h:db5a9a7c-2928-4a28-b0f0-6f2b9bd52ba1
:end:
#+vindex: modus-themes-prompts
Brief: Control the style of command prompts (e.g. minibuffer, shell, IRC
clients).
Symbol: ~modus-themes-prompts~ (=choice= type, list of properties)
Possible values are expressed as a list of properties (default is ~nil~ or
an empty list). The list can include any of the following symbols:
+ ~italic~
+ ~italic~
+ A font weight, which must be supported by the underlying typeface:
- ~thin~
- ~ultralight~
- ~extralight~
- ~light~
- ~semilight~
- ~regular~
- ~medium~
- ~semibold~
- ~bold~
- ~heavy~
- ~extrabold~
- ~ultrabold~
The default (a ~nil~ value or an empty list) means to only use a subtle
colored foreground color.
The ~italic~ property adds a slant to the font's forms (italic or
oblique forms, depending on the typeface).
The symbol of a font weight attribute such as ~light~, ~semibold~, et
cetera, adds the given weight to links. Valid symbols are defined in
the variable ~modus-themes-weights~. The absence of a weight means
that the one of the underlying text will be used.
Combinations of any of those properties are expressed as a list, like in
these examples:
#+begin_src emacs-lisp
(bold italic)
(italic semibold)
#+end_src
The order in which the properties are set is not significant.
In user configuration files the form may look like this:
#+begin_src emacs-lisp
(setq modus-themes-prompts '(extrabold italic))
#+end_src
[[#h:bd75b43a-0bf1-45e7-b8b4-20944ca8b7f8][Make prompts more or less colorful]].
** Option for completion framework aesthetics
:properties:
:alt_title: Completion UIs
:description: Choose among several styles for completion UIs
:custom_id: h:f1c20c02-7b34-4c35-9c65-99170efb2882
:end:
#+vindex: modus-themes-completions
Brief: Set the overall style of completion framework interfaces.
Symbol: ~modus-themes-completions~ (=alist= type properties)
This affects Company, Corfu, Flx, Icomplete/Fido, Ido, Ivy, Orderless,
Vertico, and the standard =*Completions*= buffer. The value is an
alist of expressions, each of which takes the form of =(KEY . LIST-OF-PROPERTIES)=.
=KEY= is a symbol, while =PROPERTIES= is a list. Here is a sample,
followed by a description of the particularities:
#+begin_src emacs-lisp
(setq modus-themes-completions
'((matches . (extrabold underline))
(selection . (semibold italic))))
#+end_src
The ~matches~ key refers to the highlighted characters that correspond
to the user's input. When its properties are ~nil~ or an empty list,
matching characters in the user interface will have a bold weight and
a colored foreground. The list of properties may include any of the
following symbols regardless of the order they may appear in:
- ~underline~ to draw a line below the characters;
- ~italic~ to use a slanted font (italic or oblique forms);
- The symbol of a font weight attribute such as ~light~,
~semibold~, et cetera. Valid symbols are defined in the
variable ~modus-themes-weights~. The absence of a weight means
that bold will be used.
The ~selection~ key applies to the current line or currently matched
candidate, depending on the specifics of the user interface. When its
properties are ~nil~ or an empty list, it has a subtle gray background,
a bold weight, and the base foreground value for the text. The list
of properties it accepts is as follows (order is not significant):
- ~underline~ to draw a line below the characters;
- ~italic~ to use a slanted font (italic or oblique forms);
- The symbol of a font weight attribute such as ~light~,
~semibold~, et cetera. Valid symbols are defined in the
variable ~modus-themes-weights~. The absence of a weight means
that bold will be used.
Apart from specifying each key separately, a catch-all list is
accepted. This is only useful when the desired aesthetic is the same
across all keys that are not explicitly referenced. For example,
this:
#+begin_src emacs-lisp
(setq modus-themes-completions
'((t . (extrabold underline))))
#+end_src
Is the same as:
#+begin_src emacs-lisp
(setq modus-themes-completions
'((matches . (extrabold underline))
(selection . (extrabold underline))))
#+end_src
[[#h:d959f789-0517-4636-8780-18123f936f91][Make completion matches more or less colorful]].
** Option for org-mode block styles
:properties:
:alt_title: Org mode blocks
:description: Choose among plain, gray, or tinted backgrounds
:custom_id: h:b7e328c0-3034-4db7-9cdf-d5ba12081ca2
:end:
#+vindex: modus-themes-org-blocks
As part of version =4.4.0=, the ~modus-themes-org-blocks~ is no more.
Users can apply palette overrides to set a style that fits their
preference (purple, blue, yellow, green, etc.). It is more flexible
and more powerful ([[#h:f44cc6e3-b0f1-4a5e-8a90-9e48fa557b50][DIY Make Org block colors more or less colorful]])
For the option to change the background of Org source blocks, we
provide the relevant setup ([[#h:8c842804-43b7-4287-b4e9-8c07d04d1f89][DIY Use colored Org source blocks per language]]).
** Option for the headings' overall style
:properties:
:alt_title: Heading styles
:description: Choose among several styles, also per heading level
:custom_id: h:271eff19-97aa-4090-9415-a6463c2f9ae1
:end:
#+vindex: modus-themes-headings
Brief: Heading styles with optional list of values per heading level.
Symbol: ~modus-themes-headings~ (=alist= type, multiple properties)
This is an alist that accepts a =(KEY . LIST-OF-VALUES)= combination.
The =KEY= is either a number, representing the heading's level (0
through 8) or ~t~, which pertains to the fallback style. The named
keys =agenda-date= and =agenda-structure= apply to the Org agenda.
Level 0 is a special heading: it is used for what counts as a document
title or equivalent, such as the =#+title= construct we find in Org
files. Levels 1-8 are regular headings.
The =LIST-OF-VALUES= covers symbols that refer to properties, as
described below. Here is a complete sample with various stylistic
combinations, followed by a presentation of all available properties:
#+begin_src emacs-lisp
(setq modus-themes-headings
'((1 . (variable-pitch 1.5))
(2 . (1.3))
(agenda-date . (1.3))
(agenda-structure . (variable-pitch light 1.8))
(t . (1.1))))
#+end_src
Properties:
+ A font weight, which must be supported by the underlying typeface:
- ~thin~
- ~ultralight~
- ~extralight~
- ~light~
- ~semilight~
- ~regular~
- ~medium~
- ~semibold~
- ~bold~ (default)
- ~heavy~
- ~extrabold~
- ~ultrabold~
+ A floating point as a height multiple of the default or a cons cell in
the form of =(height . FLOAT)=.
By default (a ~nil~ value for this variable), all headings have a bold
typographic weight and use a desaturated text color.
A ~variable-pitch~ property changes the font family of the heading to that
of the ~variable-pitch~ face (normally a proportionately spaced typeface).
The symbol of a weight attribute adjusts the font of the heading
accordingly, such as ~light~, ~semibold~, etc. Valid symbols are
defined in the variable ~modus-themes-weights~. The absence of a weight
means that bold will be used by virtue of inheriting the ~bold~ face.
[[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]].
A number, expressed as a floating point (e.g. 1.5), adjusts the height
of the heading to that many times the base font size. The default
height is the same as 1.0, though it need not be explicitly stated.
Instead of a floating point, an acceptable value can be in the form of a
cons cell like =(height . FLOAT)= or =(height FLOAT)=, where FLOAT is
the given number.
Combinations of any of those properties are expressed as a list, like in
these examples:
#+begin_src emacs-lisp
(semibold)
(variable-pitch semibold 1.3)
(variable-pitch semibold (height 1.3)) ; same as above
(variable-pitch semibold (height . 1.3)) ; same as above
#+end_src
The order in which the properties are set is not significant.
In user configuration files the form may look like this:
#+begin_src emacs-lisp
(setq modus-themes-headings
'((1 . (variable-pitch 1.5))
(2 . (1.3))
(agenda-date . (1.3))
(agenda-structure . (variable-pitch light 1.8))
(t . (1.1))))
#+end_src
When defining the styles per heading level, it is possible to pass a
non-~nil~ value (~t~) instead of a list of properties. This will retain the
original aesthetic for that level. For example:
#+begin_src emacs-lisp
(setq modus-themes-headings
'((1 . t) ; keep the default style
(2 . (semibold 1.2))
(t . (rainbow)))) ; style for all other headings
(setq modus-themes-headings
'((1 . (variable-pitch 1.5))
(2 . (semibold))
(t . t))) ; default style for all other levels
#+end_src
Note that the text color of headings, of their background, and
overline can all be set via the overrides. It is possible to have any
color combination for any heading level (something that could not be
done in older versions of the themes).
[[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]].
[[#h:11297984-85ea-4678-abe9-a73aeab4676a][Make headings more or less colorful]].
** Option for variable-pitch font in UI elements
:properties:
:alt_title: UI typeface
:description: Toggle the use of variable-pitch across the User Interface
:custom_id: h:16cf666c-5e65-424c-a855-7ea8a4a1fcac
:end:
#+vindex: modus-themes-variable-pitch-ui
Brief: Toggle the use of proportionately spaced (~variable-pitch~) fonts
in the User Interface.
Symbol: ~modus-themes-variable-pitch-ui~ (=boolean= type)
Possible values:
1. ~nil~ (default)
2. ~t~
This option concerns User Interface elements that are under the direct
control of Emacs. In particular: the mode line, header line, tab bar,
and tab line.
The default is to use the same font as the rest of Emacs, which usually
is a monospaced family.
With a non-~nil~ value (~t~) apply a proportionately spaced typeface. This
is done by assigning the ~variable-pitch~ face to the relevant items.
[[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and others]].
** Option for palette overrides
:properties:
:alt_title: Palette overrides
:description: Refashion color values and/or semantic color mappings
:custom_id: h:34c7a691-19bb-4037-8d2f-67a07edab150
:end:
This section describes palette overrides in detail. For a simpler
alternative, use the presets we provide ([[#h:b0bc811c-227e-42ec-bf67-15e1f41eb7bc][Palette override presets]]).
Each Modus theme specifies a color palette that declares named color
values and semantic color mappings:
+ Named colors consist of a symbol and a string that specifies a
hexadecimal RGB value. For example: =(blue-warmer "#354fcf")=.
+ The semantic color mappings associate an abstract construct with a
given named color from the palette, like =(heading-2 yellow-faint)=.
Both elements of the list are symbols, though the ~cadr~ (value) can
be a string that specifies a color, such as =(heading-2 "#354fcf")=.
#+vindex: modus-themes-common-palette-overrides
Both of those subsets can be overridden, thus refashioning the theme.
Overrides are either shared, by being stored in the user option
~modus-themes-common-palette-overrides~, or they are specific to the
theme they name. In the latter case, the naming scheme of each
palette variable is =THEME-NAME-palette-overrides=, thus yielding:
#+vindex: modus-operandi-palette-overrides
+ ~modus-operandi-palette-overrides~
#+vindex: modus-operandi-deuteranopia-palette-overrides
+ ~modus-operandi-deuteranopia-palette-overrides~
#+vindex: modus-operandi-tinted-palette-overrides
+ ~modus-operandi-tinted-palette-overrides~
#+vindex: modus-operandi-tritanopia-palette-overrides
+ ~modus-operandi-tritanopia-palette-overrides~
#+vindex: modus-vivendi-palette-overrides
+ ~modus-vivendi-palette-overrides~
#+vindex: modus-vivendi-deuteranopia-palette-overrides
+ ~modus-vivendi-deuteranopia-palette-overrides~
#+vindex: modus-vivendi-tinted-palette-overrides
+ ~modus-vivendi-tinted-palette-overrides~
#+vindex: modus-vivendi-tritanopia-palette-overrides
+ ~modus-vivendi-tritanopia-palette-overrides~
Theme-specific overrides take precedence over the shared ones. It is
strongly advised that shared overrides do NOT alter color values, as
those will not be appropriate for both dark and light themes. Common
overrides are best limited to the semantic color mappings as those use
the color value that corresponds to the active theme (e.g. make the
cursor =blue-warmer= in all themes, whatever the value of
=blue-warmer= is in each theme).
The value of any overrides' variable must mirror a theme's palette.
Palette variables are named after their theme as =THEME-NAME-palette=.
For example, the ~modus-operandi-palette~ is like this:
#+begin_src emacs-lisp
(defconst modus-operandi-palette
'(
;;; Basic values
(bg-main "#ffffff")
(bg-dim "#f0f0f0")
(fg-main "#000000")
;; ...
(red "#a60000")
(red-warmer "#972500")
(red-cooler "#a0132f")
(red-faint "#7f0000")
(red-intense "#d00000")
;; ...
;;;; Mappings
;; ...
(cursor fg-main)
(builtin magenta-warmer)
(comment fg-dim)
(constant blue-cooler)
(docstring green-faint)
(fnname magenta)
(keyword magenta-cooler)
;; ...
))
#+end_src
The ~modus-operandi-palette-overrides~ targets the entries that need
to be changed. For example, to make the main foreground color a dark
gray instead of pure black, use a shade of red for comments, and apply
a cyan hue to keywords:
#+begin_src emacs-lisp
(setq modus-operandi-palette-overrides
'((fg-main "#333333")
(comment red-faint)
(keyword cyan-cooler)))
#+end_src
Changes take effect upon theme reload ([[#h:9001527a-4e2c-43e0-98e8-3ef72d770639][Custom reload theme]]).
Overrides are removed by setting their variable to a ~nil~ value.
The common accented foregrounds in each palette follow a predictable
naming scheme: =HUE{,-warmer,-cooler,-faint,-intense}=. =HUE= is one
of the six basic colors: red, green, blue, yellow, magenta, cyan.
Named colors that are meant to be used as backgrounds contain =bg= in
their name, such as =bg-red-intense=. While special purpose
foregrounds that are meant to be combined with such backgrounds,
contain =fg= in their name, such as =fg-removed= which complements
=bg-removed=.
Named colors can be previewed, such as with the command
~modus-themes-list-colors~ ([[#h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d][Preview theme colors]]).
For a video tutorial that users of all skill levels can approach,
watch: https://protesilaos.com/codelog/2022-12-17-modus-themes-v4-demo/.
* Preview theme colors
:properties:
:custom_id: h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d
:end:
#+cindex: Preview named colors or semantic color mappings
#+findex: modus-themes-list-colors
The command ~modus-themes-list-colors~ uses minibuffer completion to
select an item from the Modus themes and then produces a buffer with
previews of its color palette entries. The buffer has a naming scheme
that reflects the given choice, like =modus-operandi-list-colors= for
the ~modus-operandi~ theme.
#+findex: modus-themes-list-colors-current
The command ~modus-themes-list-colors-current~ skips the minibuffer
selection process and just produces a preview for the current Modus
theme.
When called with a prefix argument (=C-u= with the default key
bindings), these commands will show a preview of the palette's
semantic color mappings instead of the named colors. In this context,
"named colors" are entries that associate a symbol to a string color
value, such as =(blue-warmer "#354fcf")=. Whereas "semantic color
mappings" associate a named color to a symbol, like =(string
blue-warmer)=, thus making the theme render all string constructs in
the =blue-warmer= color value ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]).
#+findex: modus-themes-preview-colors
#+findex: modus-themes-preview-colors-current
Aliases for those commands are ~modus-themes-preview-colors~ and
~modus-themes-preview-colors-current~.
Each row shows a foreground and background coloration using the
underlying value it references. For example a line with =#a60000= (a
shade of red) will show red text followed by a stripe with that same
color as a backdrop.
The name of the buffer describes the given Modus theme and what the
contents are, such as =*modus-operandi-list-colors*= for named colors
and ==*modus-operandi-list-mappings*= for the semantic color mappings.
* Use colors from the Modus themes palette
:PROPERTIES:
:CUSTOM_ID: h:33460ae8-984b-40fd-8baa-383cc5fc2698
:END:
The Modus themes provide the means to access the palette of (i) the
active theme or (ii) any theme in the Modus collection. These are
useful for Do-It-Yourself customizations ([[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]]),
though it can also be helpful in other cases, such as to reuse a color
value in some other application.
- Function :: [[#h:1cc552c1-5f5f-4a56-ae78-7b69e8512c4e][Get a single color from the palette with ~modus-themes-get-color-value~]]
- Macro :: [[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with ~modus-themes-with-colors~]].
** Get a single color from the palette with ~modus-themes-get-color-value~
:PROPERTIES:
:CUSTOM_ID: h:1cc552c1-5f5f-4a56-ae78-7b69e8512c4e
:END:
#+findex: modus-themes-get-color-value
The function ~modus-themes-get-color-value~ can be called from Lisp to
return the value of a color from the active Modus theme palette. It
takea a =COLOR= argument and an optional =OVERRIDES=. It also accepts
a third =THEME= argument, to get the color from the given theme.
=COLOR= is a symbol that represents a named color entry in the
palette ([[#h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d][Preview theme colors]]).
If the value is the name of another color entry in the palette (so a
mapping), this function recurs until it finds the underlying color
value.
With an optional =OVERRIDES= argument as a non-~nil~ value, it
accounts for palette overrides. Else it reads only the default palette
([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]])
With an optional =THEME= as a symbol among the ~modus-themes-items~
(alias ~modus-themes-collection~), it uses the palette of that theme.
Else it uses the current Modus theme.
If =COLOR= is not present in the palette, this function returns the
~unspecified~ symbol, which is safe when used as a face attribute's
value.
An example with ~modus-operandi~ to show how this function behaves
with/without overrides and when recursive mappings are introduced.
#+begin_src emacs-lisp
;; Here we show the recursion of palette mappings. In general, it is
;; better for the user to specify named colors to avoid possible
;; confusion with their configuration, though those still work as
;; expected.
(setq modus-themes-common-palette-overrides
'((cursor red)
(fg-mode-line-active cursor)
(border-mode-line-active fg-mode-line-active)))
;; Ignore the overrides and get the original value.
(modus-themes-get-color-value 'border-mode-line-active)
;; => "#5a5a5a"
;; Read from the overrides and deal with any recursion to find the
;; underlying value.
(modus-themes-get-color-value 'border-mode-line-active :overrides)
;; => "#a60000"
#+end_src
** Use theme colors in code with ~modus-themes-with-colors~
:properties:
:custom_id: h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae
:end:
#+cindex: Use colors from the palette anywhere
[ Note that for common cases the following is not not needed. Just rely on
the comprehensive overrides we provide ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). ]
#+findex: modus-themes-with-colors
Advanced users may want to apply many colors from the palette of the
active Modus theme in their custom code. In such a case, retrieving
each value with the function ~modus-themes-get-color-value~ is
inefficient ([[#h:1cc552c1-5f5f-4a56-ae78-7b69e8512c4e][Get a single color from the palette]]). The Lisp macro
~modus-themes-with-colors~ provides the requisite functionality. It
supplies the current theme's palette to the code called from inside of
it. For example:
#+begin_src emacs-lisp
(modus-themes-with-colors
(list blue-warmer magenta-cooler fg-added warning variable fg-heading-4))
;; => ("#354fcf" "#531ab6" "#005000" "#884900" "#005e8b" "#721045")
#+end_src
The above return value is for ~modus-operandi~ when that is the active
theme. Switching to another theme and evaluating this code anew will
return the relevant results for that theme (remember that since
version 4, the Modus themes consist of many items ([[#h:f0f3dbcb-602d-40cf-b918-8f929c441baf][Overview]])). The
same with ~modus-vivendi~ as the active theme:
#+begin_src emacs-lisp
(modus-themes-with-colors
(list blue-warmer magenta-cooler fg-added warning variable fg-heading-4))
;; => ("#79a8ff" "#b6a0ff" "#a0e0a0" "#fec43f" "#00d3d0" "#feacd0")
#+end_src
The ~modus-themes-with-colors~ has access to the whole palette of the
active theme, meaning that it can instantiate both (i) named colors
like =blue-warmer= and (ii) semantic color mappings like =warning=.
We provide commands to inspect those ([[#h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d][Preview theme colors]]).
Others sections in this manual show how to use the aforementioned
macro ([[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]]). In practice, the use of a hook will
also be needed ([[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][DIY Use a hook at the post-load-theme phase]]).
* Advanced customization
:properties:
:custom_id: h:f4651d55-8c07-46aa-b52b-bed1e53463bb
:end:
Unlike the predefined customization options which follow a clear
pattern of allowing the user to quickly specify their preference, the
themes also provide a more flexible, albeit a bit more difficult,
mechanism to control things with precision ([[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization Options]]).
This section is of interest only to users who are prepared to maintain
their own local tweaks and who are willing to deal with any possible
incompatibilities between versioned releases of the themes. As such,
they are labeled as "do-it-yourself" or "DIY".
** DIY Palette override presets
:PROPERTIES:
:CUSTOM_ID: h:b0bc811c-227e-42ec-bf67-15e1f41eb7bc
:END:
This section shows how to refashion the themes by opting in to the
stylistic presets we provide. Those presets override the default
color mappings to amplify, tone down, or refashion the overall
coloration of the themes.
To make almost all aspects of the themes less intense, use this:
#+begin_src emacs-lisp
;; Always remember to reload the theme for changes to take effect!
(setq modus-themes-common-palette-overrides modus-themes-preset-overrides-faint)
#+end_src
#+vindex: modus-themes-preset-overrides-faint
With ~modus-themes-preset-overrides-faint~ the grays are toned down,
gray backgrounds are removed from some contexts, and almost all accent
colors are desaturated. It makes the themes less attention-grabbing.
On the opposite end of the stylistic spectrum, we have this
#+begin_src emacs-lisp
;; Always remember to reload the theme for changes to take effect!
(setq modus-themes-common-palette-overrides modus-themes-preset-overrides-intense)
#+end_src
#+vindex: modus-themes-preset-overrides-intense
The ~modus-themes-preset-overrides-intense~ makes many background
colors accented instead of gray and increases coloration in a number
of places. Colors stand out more and are made easier to spot.
#+vindex: modus-themes-preset-overrides-cooler
#+vindex: modus-themes-preset-overrides-warmer
For some stylistic variation try the "cooler" and "warmer" presets:
#+begin_src emacs-lisp
;; This:
(setq modus-themes-common-palette-overrides modus-themes-preset-overrides-cooler)
;; Or:
(setq modus-themes-common-palette-overrides modus-themes-preset-overrides-warmer)
#+end_src
Note that the user is not limited to those presets. The system of
overrides we provide makes it possible to tweak the value of each
individual named color and to change how values are assigned to
semantic color mappings ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). Subsequent
sections provide examples ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]).
It is also possible to use those presets as a basis and, for example,
add to them code from the subsequent sections of this manual. This is
the general idea (extra space for didactic purposes):
#+begin_src emacs-lisp
(setq modus-themes-common-palette-overrides
`(
;; From the section "Make the mode line borderless"
(border-mode-line-active unspecified)
(border-mode-line-inactive unspecified)
;; From the section "Make matching parenthesis more or less intense"
(bg-paren-match bg-magenta-intense)
(underline-paren-match fg-main)
;; And expand the preset here. Note that the ,@ works because
;; we use the backtick for this list, instead of a straight
;; quote.
,@modus-themes-preset-overrides-intense))
#+end_src
** DIY Stylistic variants using palette overrides
:PROPERTIES:
:CUSTOM_ID: h:df1199d8-eaba-47db-805d-6b568a577bf3
:END:
This section contains practical examples of overriding the palette of
the themes ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). Users can copy the code to
their init file, evaluate it, and then re-load the theme for changes
to take effect. To apply overrides at startup simply define them
before the call that loads the theme. Remember that we also provide
presets that are easier to apply ([[#h:b0bc811c-227e-42ec-bf67-15e1f41eb7bc][Palette override presets]]).
*** DIY Make the mode line borderless
:PROPERTIES:
:CUSTOM_ID: h:80ddba52-e188-411f-8cc0-480ebd75befe
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). To
hide the border around the active and inactive mode lines, we need to
set their color to that of the underlying background.
[[#h:e8d781be-eefc-4a81-ac4e-5ed156190df7][Make the active mode line colorful]].
[[#h:5a0c58cc-f97f-429c-be08-927b9fbb0a9c][Add padding to mode line]].
#+begin_src emacs-lisp
;; Remove the border
(setq modus-themes-common-palette-overrides
'((border-mode-line-active unspecified)
(border-mode-line-inactive unspecified)))
;; Keep the border but make it the same color as the background of the
;; mode line (thus appearing borderless). The difference with the
;; above is that this version is a bit thicker because the border are
;; still there.
(setq modus-themes-common-palette-overrides
'((border-mode-line-active bg-mode-line-active)
(border-mode-line-inactive bg-mode-line-inactive)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make the active mode line colorful
:PROPERTIES:
:CUSTOM_ID: h:e8d781be-eefc-4a81-ac4e-5ed156190df7
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]).
Here we show some snippets that apply different stylistic variants.
Of course, it is possible to use theme-specific overrides to, say,
have a blue mode line for ~modus-operandi~ and a red one for
~modus-vivendi~.
[[#h:80ddba52-e188-411f-8cc0-480ebd75befe][Make the mode line borderless]].
[[#h:5a0c58cc-f97f-429c-be08-927b9fbb0a9c][Add padding to mode line]].
#+begin_src emacs-lisp
;; Blue background, neutral foreground, intense blue border
(setq modus-themes-common-palette-overrides
'((bg-mode-line-active bg-blue-intense)
(fg-mode-line-active fg-main)
(border-mode-line-active blue-intense)))
;; Subtle blue background, neutral foreground, intense blue border
(setq modus-themes-common-palette-overrides
'((bg-mode-line-active bg-blue-subtle)
(fg-mode-line-active fg-main)
(border-mode-line-active blue-intense)))
;; Sage (green/cyan) background, neutral foreground, slightly distinct green border
(setq modus-themes-common-palette-overrides
'((bg-mode-line-active bg-sage)
(fg-mode-line-active fg-main)
(border-mode-line-active bg-green-intense)))
;; As above, but with a purple style
(setq modus-themes-common-palette-overrides
'((bg-mode-line-active bg-lavender)
(fg-mode-line-active fg-main)
(border-mode-line-active bg-magenta-intense)))
;; As above, but with an earthly style
(setq modus-themes-common-palette-overrides
'((bg-mode-line-active bg-ochre)
(fg-mode-line-active fg-main)
(border-mode-line-active bg-yellow-intense)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make the tab bar more or less colorful
:PROPERTIES:
:CUSTOM_ID: h:096658d7-a0bd-4a99-b6dc-9b20a20cda37
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]).
Here we show how to affect the colors of the built-in ~tab-bar-mode~
and ~tab-line-mode~.
For consistent theme-wide results, consider changing the mode line,
fringes, and line numbers. These are shown in other sections of this
manual.
#+begin_src emacs-lisp
;; Make the `tab-bar-mode' mode subtle while keepings its original
;; gray aesthetic.
(setq modus-themes-common-palette-overrides
'((bg-tab-bar bg-main)
(bg-tab-current bg-active)
(bg-tab-other bg-dim)))
;; Like the above, but the current tab has a colorful background and
;; the inactive tabs have a slightly more noticeable gray background.
(setq modus-themes-common-palette-overrides
'((bg-tab-bar bg-main)
(bg-tab-current bg-cyan-intense)
(bg-tab-other bg-inactive)))
;; Make the tabs colorful, using a monochromatic pattern (e.g. shades
;; of cyan).
(setq modus-themes-common-palette-overrides
'((bg-tab-bar bg-cyan-nuanced)
(bg-tab-current bg-cyan-intense)
(bg-tab-other bg-cyan-subtle)))
;; Like the above, but with a dichromatic pattern (cyan and magenta).
(setq modus-themes-common-palette-overrides
'((bg-tab-bar bg-cyan-nuanced)
(bg-tab-current bg-magenta-intense)
(bg-tab-other bg-cyan-subtle)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make the fringe invisible or another color
:PROPERTIES:
:CUSTOM_ID: h:c312dcac-36b6-4a1f-b1f5-ab1c9abe27b0
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]).
Here we show how to make the fringe invisible or how to assign to it a
different color. The "fringe" is a small area to the right and left
side of the Emacs window which shows indicators such as for truncation
or continuation lines.
#+begin_src emacs-lisp
;; Make the fringe invisible
(setq modus-themes-common-palette-overrides
'((fringe unspecified)))
;; Make the fringe more intense
(setq modus-themes-common-palette-overrides
'((fringe bg-active)))
;; Make the fringe colorful, but nuanced
(setq modus-themes-common-palette-overrides
'((fringe bg-blue-nuanced)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make links use subtle or no underlines
:PROPERTIES:
:CUSTOM_ID: h:6c1d1dea-5cbf-4d92-b7bb-570a7a23ffe9
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In
this example, we showcase the special use of the ~unspecified~ symbol
that underline mappings can read correctly.
#+begin_src emacs-lisp
;; Subtle underlines
(setq modus-themes-common-palette-overrides
'((underline-link border)
(underline-link-visited border)
(underline-link-symbolic border)))
;; No underlines
(setq modus-themes-common-palette-overrides
'((underline-link unspecified)
(underline-link-visited unspecified)
(underline-link-symbolic unspecified)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make prompts more or less colorful
:PROPERTIES:
:CUSTOM_ID: h:bd75b43a-0bf1-45e7-b8b4-20944ca8b7f8
:END:
This section contains practical examples of overriding the palette of
the themes ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). In the following code
block we show how to add or remove color from prompts.
[[#h:db5a9a7c-2928-4a28-b0f0-6f2b9bd52ba1][Option for command prompt styles]].
#+begin_src emacs-lisp
;; Keep the background unspecified (like the default), but use a faint
;; foreground color.
(setq modus-themes-common-palette-overrides
'((fg-prompt cyan-faint)
(bg-prompt unspecified)))
;; Add a nuanced background to prompts that complements their foreground.
(setq modus-themes-common-palette-overrides
'((fg-prompt cyan)
(bg-prompt bg-cyan-nuanced)))
;; Add a yellow background and adjust the foreground accordingly.
(setq modus-themes-common-palette-overrides
'((fg-prompt fg-main)
(bg-prompt bg-yellow-subtle))) ; try to replace "subtle" with "intense"
#+end_src
Reload the theme for changes to take effect.
*** DIY Make completion matches more or less colorful
:PROPERTIES:
:CUSTOM_ID: h:d959f789-0517-4636-8780-18123f936f91
:END:
This section contains practical examples of overriding the palette of
the themes ([[#h:34c7a691-19bb-4037-8d2f-67a07edab150][Option for palette overrides]]). Here we demonstrate how
to activate background coloration for completion matches. We show
three different degrees of intensity.
[[#h:f1c20c02-7b34-4c35-9c65-99170efb2882][Option for completion framework aesthetics]].
#+begin_src emacs-lisp
;; Add a nuanced background color to completion matches, while keeping
;; their foreground intact (foregrounds do not need to be specified in
;; this case, but we do it for didactic purposes).
(setq modus-themes-common-palette-overrides
'((fg-completion-match-0 blue)
(fg-completion-match-1 magenta-warmer)
(fg-completion-match-2 cyan)
(fg-completion-match-3 red)
(bg-completion-match-0 bg-blue-nuanced)
(bg-completion-match-1 bg-magenta-nuanced)
(bg-completion-match-2 bg-cyan-nuanced)
(bg-completion-match-3 bg-red-nuanced)))
;; Add intense background colors to completion matches and adjust the
;; foregrounds accordingly.
(setq modus-themes-common-palette-overrides
'((fg-completion-match-0 fg-main)
(fg-completion-match-1 fg-main)
(fg-completion-match-2 fg-main)
(fg-completion-match-3 fg-main)
(bg-completion-match-0 bg-blue-intense)
(bg-completion-match-1 bg-yellow-intense)
(bg-completion-match-2 bg-cyan-intense)
(bg-completion-match-3 bg-red-intense)))
;; Like the above, but with subtle backgrounds.
(setq modus-themes-common-palette-overrides
'((fg-completion-match-0 fg-main)
(fg-completion-match-1 fg-main)
(fg-completion-match-2 fg-main)
(fg-completion-match-3 fg-main)
(bg-completion-match-0 bg-blue-subtle)
(bg-completion-match-1 bg-yellow-subtle)
(bg-completion-match-2 bg-cyan-subtle)
(bg-completion-match-3 bg-red-subtle)))
#+end_src
Adding to the above, it is possible to, say, reduce the number of
colors to two:
#+begin_src emacs-lisp
;; No backgrounds (like the default) and just use two colors.
(setq modus-themes-common-palette-overrides
'((fg-completion-match-0 blue)
(fg-completion-match-1 yellow)
(fg-completion-match-2 blue)
(fg-completion-match-3 yellow)
(bg-completion-match-0 unspecified)
(bg-completion-match-1 unspecified)
(bg-completion-match-2 unspecified)
(bg-completion-match-3 unspecified)))
;; Again, a two-color style but this time with backgrounds
(setq modus-themes-common-palette-overrides
'((fg-completion-match-0 blue)
(fg-completion-match-1 yellow)
(fg-completion-match-2 blue)
(fg-completion-match-3 yellow)
(bg-completion-match-0 bg-blue-nuanced)
(bg-completion-match-1 bg-yellow-nuanced)
(bg-completion-match-2 bg-blue-nuanced)
(bg-completion-match-3 bg-yellow-nuanced)))
#+end_src
The user can mix and match to their liking.
Reload the theme for changes to take effect.
*** DIY Make comments yellow and strings green
:PROPERTIES:
:CUSTOM_ID: h:26f53daa-0065-48dc-88ab-6a718d16cd95
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In
previous versions of the themes, we provided an option for yellow-ish
comments and green-ish strings. For some users, those were still not
good enough, as the exact values were hardcoded. Here we show how to
reproduce the effect, but also how to tweak it to one's liking.
[[#h:c8767172-bf11-4c96-81dc-e736c464fc9c][Make code syntax use the old alt-syntax style]].
[[#h:943063da-7b27-4ba4-9afe-f8fe77652fd1][Make use of alternative styles for code syntax]].
#+begin_src emacs-lisp
;; Yellow comments and green strings like older versions of the Modus
;; themes
(setq modus-themes-common-palette-overrides
'((comment yellow-cooler)
(string green-cooler)))
;; Faint yellow comments and a different shade of green for strings
(setq modus-themes-common-palette-overrides
'((comment yellow-faint)
(string green-warmer)))
;; Green comments and yellow strings, because now the user has the
;; freedom to do it
(setq modus-themes-common-palette-overrides
'((comment green)
(string yellow-cooler)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make code syntax use the old alt-syntax style
:PROPERTIES:
:CUSTOM_ID: h:c8767172-bf11-4c96-81dc-e736c464fc9c
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In
this section we show how to reproduce what previous versions of the
Modus themes provided as a stylistic alternative for code syntax. The
upside of using overrides for this purpose is that we can tweak the
style to our liking, but first let's start with its recreation:
#+begin_src emacs-lisp
;; The old "alt-syntax" (before version 4.0.0 of the Modus themes)
(setq modus-themes-common-palette-overrides
'((builtin magenta)
(comment fg-dim)
(constant magenta-cooler)
(docstring magenta-faint)
(docmarkup green-faint)
(fnname magenta-warmer)
(keyword cyan)
(preprocessor cyan-cooler)
(string red-cooler)
(type magenta-cooler)
(variable blue-warmer)
(rx-construct magenta-warmer)
(rx-backslash blue-cooler)))
#+end_src
The "alt-syntax" could optionally use green strings and yellow
comments ([[#h:26f53daa-0065-48dc-88ab-6a718d16cd95][Make comments yellow and strings green]]):
#+begin_src emacs-lisp
;; Same as above, but with yellow comments and green strings
(setq modus-themes-common-palette-overrides
'((builtin magenta)
(comment yellow-faint)
(constant magenta-cooler)
(docstring green-faint)
(docmarkup magenta-faint)
(fnname magenta-warmer)
(keyword cyan)
(preprocessor cyan-cooler)
(string green-cooler)
(type magenta-cooler)
(variable blue-warmer)
(rx-construct magenta-warmer)
(rx-backslash blue-cooler)))
#+end_src
The standard "alt-syntax" has red strings. As such, it is interesting
to experiment with faintly red colored comments:
#+begin_src emacs-lisp
;; Like the old "alt-syntax" but with faint red comments
(setq modus-themes-common-palette-overrides
'((builtin magenta)
(comment red-faint)
(constant magenta-cooler)
(docstring magenta-faint)
(docmarkup green-faint)
(fnname magenta-warmer)
(keyword cyan)
(preprocessor cyan-cooler)
(string red-cooler)
(type magenta-cooler)
(variable blue-warmer)
(rx-construct magenta-warmer)
(rx-backslash blue-cooler)))
#+end_src
The user can always mix and match styles to their liking.
[[#h:943063da-7b27-4ba4-9afe-f8fe77652fd1][Make use of alternative styles for code syntax]].
Reload the theme for changes to take effect.
*** DIY Make use of alternative styles for code syntax
:PROPERTIES:
:CUSTOM_ID: h:943063da-7b27-4ba4-9afe-f8fe77652fd1
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). The
idea here is to change how named colors are mapped to code syntax.
Each of the following snippets give the ~modus-themes~ a different
feel while editing code.
Note that my ~modus-themes~ and ~ef-themes~ do not use the same
palettes, so some things are different. If you copy from the latter
to the former, double-check that the entries exist in the given Modus
theme palette.
[[#h:26f53daa-0065-48dc-88ab-6a718d16cd95][Make comments yellow and strings green]].
[[#h:c8767172-bf11-4c96-81dc-e736c464fc9c][Make code syntax use the old alt-syntax style]].
#+begin_src emacs-lisp
;; Mimic `ef-night' theme (from my `ef-themes') for code syntax
;; highlighting, while still using the Modus colors (and other
;; mappings).
(setq modus-themes-common-palette-overrides
'((builtin green-cooler)
(comment yellow-faint)
(constant magenta-cooler)
(fnname cyan-cooler)
(keyword blue-warmer)
(preprocessor red-warmer)
(docstring cyan-faint)
(string blue-cooler)
(type magenta-cooler)
(variable cyan)))
;; Mimic `ef-summer' theme (from my `ef-themes') for code syntax
;; highlighting, while still using the Modus colors (and other
;; mappings).
(setq modus-themes-common-palette-overrides
'((builtin magenta)
(comment yellow-faint)
(constant red-cooler)
(fnname magenta-warmer)
(keyword magenta-cooler)
(preprocessor green-warmer)
(docstring cyan-faint)
(string yellow-warmer)
(type cyan-warmer)
(variable blue-warmer)))
;; Mimic `ef-bio' theme (from my `ef-themes') for code syntax
;; highlighting, while still using the Modus colors (and other
;; mappings).
(setq modus-themes-common-palette-overrides
'((builtin green)
(comment yellow-faint)
(constant blue)
(fnname green-warmer)
(keyword green-cooler)
(preprocessor green)
(docstring green-faint)
(string magenta-cooler)
(type cyan-warmer)
(variable blue-warmer)))
;; Mimic `ef-trio-light' theme (from my `ef-themes') for code syntax
;; highlighting, while still using the Modus colors (and other
;; mappings).
(setq modus-themes-common-palette-overrides
'((builtin magenta-cooler)
(comment yellow-faint)
(constant magenta-warmer)
(fnname blue-warmer)
(keyword magenta)
(preprocessor red-cooler)
(docstring magenta-faint)
(string green-cooler)
(type cyan-cooler)
(variable cyan-warmer)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make matching parenthesis more or less intense
:PROPERTIES:
:CUSTOM_ID: h:259cf8f5-48ec-4b13-8a69-5d6387094468
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In
this code block we show how to change the background of matching
delimiters when ~show-paren-mode~ is enabled. We also demonstrate how
to enable underlines for those highlights.
#+begin_src emacs-lisp
;; Change the background to a shade of magenta
(setq modus-themes-common-palette-overrides
'((bg-paren-match bg-magenta-intense)))
;; Enable underlines by applying a color to them
(setq modus-themes-common-palette-overrides
'((bg-paren-match bg-magenta-intense)
(underline-paren-match fg-main)))
;; Do not use any background color and instead apply an intense red
;; foreground.
(setq modus-themes-common-palette-overrides
'((bg-paren-match unspecified)
(fg-paren-match red-intense)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make box buttons more or less gray
:PROPERTIES:
:CUSTOM_ID: h:4f6b6ca3-f5bb-4830-8312-baa232305360
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). By
default, the boxed buttons that appear in {{{kbd(M-x customize)}}} and
related are distinct shades of gray. The following set of overrides
removes the gray from the active buttons and amplifies it for the
inactive ones.
#+begin_src emacs-lisp
(setq modus-themes-common-palette-overrides
'((bg-button-active bg-main)
(fg-button-active fg-main)
(bg-button-inactive bg-inactive)
(fg-button-inactive "gray50")))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make TODO and DONE more or less intense
:PROPERTIES:
:CUSTOM_ID: h:b57bb50b-a863-4ea8-bb38-6de2275fa868
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]).
Here we show how to affect just the =TODO= and =DONE= keywords that we
encounter in Org buffers. The idea is to make those pop out more or
to subdue them.
[[#h:11297984-85ea-4678-abe9-a73aeab4676a][Make headings more or less colorful]].
[[#h:bb5b396f-5532-4d52-ab13-149ca24854f1][Make inline code in prose use alternative styles]].
#+begin_src emacs-lisp
;; Increase intensity
(setq modus-themes-common-palette-overrides
'((prose-done green-intense)
(prose-todo red-intense)))
;; Tone down intensity
(setq modus-themes-common-palette-overrides
'((prose-done green-faint) ; OR replace `green-faint' with `olive'
(prose-todo red-faint))) ; OR replace `red-faint' with `rust'
;; Keep TODO at its default (so no override for it), but make DONE
;; gray.
(setq modus-themes-common-palette-overrides
'((prose-done fg-dim)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make headings more or less colorful
:PROPERTIES:
:CUSTOM_ID: h:11297984-85ea-4678-abe9-a73aeab4676a
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]).
Here we show how to alter the looks of headings, such as in Org mode.
Using overrides here offers far more flexibility than what we could
achieve with previous versions of the themes: the user can mix and
match styles at will.
[[#h:b57bb50b-a863-4ea8-bb38-6de2275fa868][Make TODO and DONE more intense]].
#+begin_src emacs-lisp
;; Apply more colorful foreground to some headings (headings 0-8).
;; Level 0 is for Org #+title and related.
(setq modus-themes-common-palette-overrides
'((fg-heading-1 blue-warmer)
(fg-heading-2 yellow-cooler)
(fg-heading-3 cyan-cooler)))
;; Like the above, but with gradient colors
(setq modus-themes-common-palette-overrides
'((fg-heading-1 blue)
(fg-heading-2 cyan)
(fg-heading-3 green)))
;; Add color to level 1 heading, but use the main foreground for
;; others
(setq modus-themes-common-palette-overrides
'((fg-heading-1 blue)
(fg-heading-2 fg-main)
(fg-heading-3 fg-main)))
;; Apply colorful foreground, background, and overline (headings 0-8)
(setq modus-themes-common-palette-overrides
'((fg-heading-1 blue-warmer)
(bg-heading-1 bg-blue-nuanced)
(overline-heading-1 blue)))
;; Apply gray scale foreground, background, and overline (headings 0-8)
(setq modus-themes-common-palette-overrides
'((fg-heading-1 fg-main)
(bg-heading-1 bg-dim)
(overline-heading-1 border)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make Org block colors more or less colorful
:properties:
:custom_id: h:f44cc6e3-b0f1-4a5e-8a90-9e48fa557b50
:end:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). Here
we show how to change the presentation of Org blocks (and other such
blocks like Markdown fenced code sections, though the exact
presentation depends on each major mode).
The default style of Org blocks is a subtle gray background for the
contents and for the delimiter lines (the =#+begin_= and =#+end_=
parts). The text of the delimiter lines is a subtle gray foreground
color.
[[#h:bb5b396f-5532-4d52-ab13-149ca24854f1][Make inline code in prose use alternative styles]].
#+begin_src emacs-lisp
;; Make code blocks (in Org, for example) use a more colorful style
;; for their delimiter lines as well as their contents. Give this a
;; purple feel. Make the delimiter lines distinct from the contents.
(setq modus-themes-common-palette-overrides
'((bg-prose-block-contents bg-magenta-nuanced)
(bg-prose-block-delimiter bg-lavender)
(fg-prose-block-delimiter fg-main)))
;; As above, but with a more blue feel.
(setq modus-themes-common-palette-overrides
'((bg-prose-block-contents bg-blue-nuanced)
(bg-prose-block-delimiter bg-lavender)
(fg-prose-block-delimiter fg-main)))
;; As above, but with a green feel.
(setq modus-themes-common-palette-overrides
'((bg-prose-block-contents bg-green-nuanced)
(bg-prose-block-delimiter bg-sage)
(fg-prose-block-delimiter fg-main)))
;; As above, but with a yellow/gold feel.
(setq modus-themes-common-palette-overrides
'((bg-prose-block-contents bg-yellow-nuanced)
(bg-prose-block-delimiter bg-ochre)
(fg-prose-block-delimiter fg-main)))
;; As above, but with a slightly more red feel.
(setq modus-themes-common-palette-overrides
'((bg-prose-block-contents bg-red-nuanced)
(bg-prose-block-delimiter bg-ochre)
(fg-prose-block-delimiter fg-main)))
#+end_src
The previous examples differentiate the delimiter lines from the
block's contents. Though we can mimic the default aesthetic of a
uniform background, while changing the applicable colors. Here are
some nice combinations:
#+begin_src emacs-lisp
;; Solid green style.
(setq modus-themes-common-palette-overrides
'((bg-prose-block-contents bg-green-nuanced)
(bg-prose-block-delimiter bg-green-nuanced)
(fg-prose-block-delimiter green-warmer)))
;; Solid yellow style.
(setq modus-themes-common-palette-overrides
'((bg-prose-block-contents bg-yellow-nuanced)
(bg-prose-block-delimiter bg-yellow-nuanced)
(fg-prose-block-delimiter yellow-cooler)))
;; Solid cyan style.
(setq modus-themes-common-palette-overrides
'((bg-prose-block-contents bg-cyan-nuanced)
(bg-prose-block-delimiter bg-cyan-nuanced)
(fg-prose-block-delimiter cyan-cooler)))
#+end_src
[ Combine the above with a suitable mode line style for maximum effect
([[#h:e8d781be-eefc-4a81-ac4e-5ed156190df7][DIY Make the active mode line colorful]]). ]
Finally, the following makes code blocks have no distinct background.
The minimal styles are applied to the delimiter lines, which only use
a subtle gray foreground. This was the default for the Modus themes up
until version 4.3.0.
#+begin_src emacs-lisp
;; Make code blocks more minimal, so that (i) the delimiter lines have
;; no background, (ii) the delimiter foreground is a subtle gray, and
;; (iii) the block contents have no distinct background either. This
;; was the default in versions of the Modus themes before 4.4.0
(setq modus-themes-common-palette-overrides
'((bg-prose-block-contents unspecified)
(bg-prose-block-delimiter unspecified)
(fg-prose-block-delimiter fg-dim)))
#+end_src
[[#h:8c842804-43b7-4287-b4e9-8c07d04d1f89][DIY Use colored Org source blocks per language]].
*** DIY Make Org agenda more or less colorful
:PROPERTIES:
:CUSTOM_ID: h:a5af0452-a50f-481d-bf60-d8143f98105f
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]).
Here we provide three distinct code blocks. The first adds
alternative and more varied colors to the Org agenda (and related).
The second uses faint coloration. The third makes the agenda use
various shades of blue. Mix and match at will, while also combining
these styles with what we show in the other chapters with practical
stylistic variants.
#+begin_src emacs-lisp
;; Make the Org agenda use alternative and varied colors.
(setq modus-themes-common-palette-overrides
'((date-common cyan) ; default value (for timestamps and more)
(date-deadline red-warmer)
(date-event magenta-warmer)
(date-holiday blue) ; for M-x calendar
(date-now yellow-warmer)
(date-scheduled magenta-cooler)
(date-weekday cyan-cooler)
(date-weekend blue-faint)))
#+end_src
An example with faint coloration:
#+begin_src emacs-lisp
;; Make the Org agenda use faint colors.
(setq modus-themes-common-palette-overrides
'((date-common cyan-faint) ; for timestamps and more
(date-deadline red-faint)
(date-event fg-alt) ; default
(date-holiday magenta) ; default (for M-x calendar)
(date-now fg-main) ; default
(date-scheduled yellow-faint)
(date-weekday fg-alt)
(date-weekend fg-dim)))
#+end_src
A third example that makes the agenda more blue:
#+begin_src emacs-lisp
;; Make the Org agenda use more blue instead of yellow and red.
(setq modus-themes-common-palette-overrides
'((date-common cyan) ; default value (for timestamps and more)
(date-deadline blue-cooler)
(date-event blue-faint)
(date-holiday blue) ; for M-x calendar
(date-now blue-faint)
(date-scheduled blue)
(date-weekday fg-main)
(date-weekend fg-dim)))
#+end_src
Yet another example that also affects =DONE= and =TODO= keywords:
#+begin_src emacs-lisp
;; Change dates to a set of more subtle combinations. Deadlines are a
;; shade of magenta, scheduled dates are a shade of green that
;; complements that of the deadlines, weekday headings use the main
;; foreground color while weekends are a shade of gray. The DONE
;; keyword is a faint blue-gray while TODO is yellow.
(setq modus-themes-common-palette-overrides
'((date-deadline magenta-warmer)
(date-scheduled green-cooler)
(date-weekday fg-main)
(date-event fg-dim)
(date-now blue)
(prose-done fg-alt)
(prose-todo yellow)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make inline code in prose use alternative styles
:PROPERTIES:
:CUSTOM_ID: h:bb5b396f-5532-4d52-ab13-149ca24854f1
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In
the following code block we show how to affect constructs such as
Org's verbatim, code, and macro entries. We also provide mappings for
tables, property drawers, tags, and code block delimiters, though we
do not show every possible permutation.
- [[#h:b57bb50b-a863-4ea8-bb38-6de2275fa868][Make TODO and DONE more or less intense]].
- [[#h:f44cc6e3-b0f1-4a5e-8a90-9e48fa557b50][DIY Make Org block colors more or less colorful]].
#+begin_src emacs-lisp
;; A nuanced accented background, combined with a suitable foreground.
(setq modus-themes-common-palette-overrides
'((bg-prose-code bg-green-nuanced)
(fg-prose-code green-cooler)
(bg-prose-verbatim bg-magenta-nuanced)
(fg-prose-verbatim magenta-warmer)
(bg-prose-macro bg-blue-nuanced)
(fg-prose-macro magenta-cooler)))
;; A more noticeable accented background, combined with a suitable foreground.
(setq modus-themes-common-palette-overrides
'((bg-prose-code bg-sage)
(fg-prose-code green-faint)
(bg-prose-verbatim bg-ochre)
(fg-prose-verbatim red-faint)
(bg-prose-macro bg-lavender)
(fg-prose-macro blue-faint)))
;; Leave the backgrounds without a color and simply make the foregrounds more intense.
(setq modus-themes-common-palette-overrides
'((bg-prose-code unspecified)
(fg-prose-code green-intense)
(bg-prose-verbatim unspecified)
(fg-prose-verbatim magenta-intense)
(bg-prose-macro unspecified)
(fg-prose-macro cyan-intense)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make mail citations and headers more or less colorful
:PROPERTIES:
:CUSTOM_ID: h:7da7a4ad-5d3a-4f11-9796-5a1abed0f0c4
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In
this section we show how to change the coloration of email message
headers and citations. Before we show the code, this is the anatomy
of a message:
#+begin_example message
From: Protesilaos <info@protesilaos.com>
To: Modus-Themes Development <~protesilaos/modus-themes@lists.sr.ht>
Subject: Test subject
--- Headers above this line; message and citations below ---
This is some sample text
> > Older quote
> Newer quote
#+end_example
We thus have the following:
#+begin_src emacs-lisp
;; Reduce the intensity of mail citations and headers
(setq modus-themes-common-palette-overrides
'((mail-cite-0 cyan-faint)
(mail-cite-1 yellow-faint)
(mail-cite-2 green-faint)
(mail-cite-3 red-faint)
(mail-part olive)
(mail-recipient indigo)
(mail-subject maroon)
(mail-other slate)))
;; Make mail citations more intense; adjust the headers accordingly
(setq modus-themes-common-palette-overrides
'((mail-cite-0 blue)
(mail-cite-1 yellow)
(mail-cite-2 green)
(mail-cite-3 magenta)
(mail-part magenta-cooler)
(mail-recipient cyan)
(mail-subject red-warmer)
(mail-other cyan-cooler)))
;; Make all citations faint and neutral; make most headers green but
;; use red for the subject lie so that it stands out
(setq modus-themes-common-palette-overrides
'((mail-cite-0 fg-dim)
(mail-cite-1 fg-alt)
(mail-cite-2 fg-dim)
(mail-cite-3 fg-alt)
(mail-part yellow-cooler)
(mail-recipient green-cooler)
(mail-subject red-cooler)
(mail-other green)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make the region preserve text colors, plus other styles
:PROPERTIES:
:CUSTOM_ID: h:c8605d37-66e1-42aa-986e-d7514c3af6fe
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]).
Here we show how to make the region respect the underlying text colors
or how to make the background more/less intense while combining it
with an appropriate foreground value.
[[#h:a5140c9c-18b2-45db-8021-38d0b5074116][Do not extend the region background]].
#+begin_src emacs-lisp
;; A background with no specific foreground (use foreground of
;; underlying text)
(setq modus-themes-common-palette-overrides
'((bg-region bg-ochre) ; try to replace `bg-ochre' with `bg-lavender', `bg-sage'
(fg-region unspecified)))
;; Subtle gray with a prominent blue foreground
(setq modus-themes-common-palette-overrides
'((bg-region bg-dim)
(fg-region blue-cooler)))
;; Intense magenta background combined with the main foreground
(setq modus-themes-common-palette-overrides
'((bg-region bg-magenta-intense)
(fg-region fg-main)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make mouse highlights more or less colorful
:PROPERTIES:
:CUSTOM_ID: h:b5cab69d-d7cb-451c-8ff9-1f545ceb6caf
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In
the following code block we show how to affect the semantic color
mapping that covers mouse hover effects and related highlights:
#+begin_src emacs-lisp
;; Make the background an intense yellow
(setq modus-themes-common-palette-overrides
'((bg-hover bg-yellow-intense)))
;; Make the background subtle green
(setq modus-themes-common-palette-overrides
'((bg-hover bg-green-subtle)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make language underlines less colorful
:PROPERTIES:
:CUSTOM_ID: h:03dbd5af-6bae-475e-85a2-cec189f69598
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]).
Here we show how to affect the color of the underlines that are used
by code linters and prose spell checkers.
#+begin_src emacs-lisp
;; Make the underlines less intense
(setq modus-themes-common-palette-overrides
'((underline-err red-faint)
(underline-warning yellow-faint)
(underline-note cyan-faint)))
;; Change the color-coding of the underlines
(setq modus-themes-common-palette-overrides
'((underline-err yellow-intense)
(underline-warning magenta-intense)
(underline-note green-intense)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make line numbers use alternative styles
:PROPERTIES:
:CUSTOM_ID: h:b6466f51-cb58-4007-9ebe-53a27af655c7
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In
this section we show how to affect the ~display-line-numbers-mode~.
#+begin_src emacs-lisp
;; Make line numbers less intense
(setq modus-themes-common-palette-overrides
'((fg-line-number-inactive "gray50")
(fg-line-number-active fg-main)
(bg-line-number-inactive unspecified)
(bg-line-number-active unspecified)))
;; Like the above, but use a shade of red for the current line number
(setq modus-themes-common-palette-overrides
'((fg-line-number-inactive "gray50")
(fg-line-number-active red-cooler)
(bg-line-number-inactive unspecified)
(bg-line-number-active unspecified)))
;; Make all numbers more intense, use a more pronounce gray
;; background, and make the current line have a colored background
(setq modus-themes-common-palette-overrides
'((fg-line-number-inactive fg-main)
(fg-line-number-active fg-main)
(bg-line-number-inactive bg-inactive)
(bg-line-number-active bg-cyan-intense)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make diffs use only a foreground
:PROPERTIES:
:CUSTOM_ID: h:b3761482-bcbf-4990-a41e-4866fb9dad15
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In
this section we show how to change diff buffers (e.g. in ~magit~) to
only use color-coded text without any added background. What we
basically do is to disable the applicable backgrounds and then
intensify the foregrounds. Since the deuteranopia-optimized themes do
not use the red-green color coding, we make an extra set of
adjustments for them by overriding their palettes directly instead of
just using the "common" overrides.
#+begin_src emacs-lisp
;; Diffs with only foreground colors. Word-wise ("refined") diffs
;; have a gray background to draw attention to themselves.
(setq modus-themes-common-palette-overrides
'((bg-added unspecified)
(bg-added-faint unspecified)
(bg-added-refine bg-inactive)
(fg-added green)
(fg-added-intense green-intense)
(bg-changed unspecified)
(bg-changed-faint unspecified)
(bg-changed-refine bg-inactive)
(fg-changed yellow)
(fg-changed-intense yellow-intense)
(bg-removed unspecified)
(bg-removed-faint unspecified)
(bg-removed-refine bg-inactive)
(fg-removed red)
(fg-removed-intense red-intense)
(bg-diff-context unspecified)))
;; Because deuteranopia cannot use the typical red-yellow-green
;; combination, we need to arrange for a yellow-purple-blue sequence.
;; Notice that the above covers the "common" overrides, so we do not
;; need to reproduce the whole list of them.
(setq modus-operandi-deuteranopia-palette-overrides
'((fg-added blue)
(fg-added-intense blue-intense)
(fg-changed magenta-cooler)
(fg-changed-intense magenta-intense)
(fg-removed yellow-warmer)
(fg-removed-intense yellow-intense)))
(setq modus-vivendi-deuteranopia-palette-overrides
'((fg-added blue)
(fg-added-intense blue-intense)
(fg-changed magenta-cooler)
(fg-changed-intense magenta-intense)
(fg-removed yellow)
(fg-removed-intense yellow-intense)))
#+end_src
Reload the theme for changes to take effect.
*** DIY Make deuteranopia diffs red and blue instead of yellow and blue
:PROPERTIES:
:CUSTOM_ID: h:16389ea1-4cb6-4b18-9409-384324113541
:END:
This is one of our practical examples to override the semantic colors
of the Modus themes ([[#h:df1199d8-eaba-47db-805d-6b568a577bf3][Stylistic variants using palette overrides]]). In
this section we show how to implement a red+blue color coding for
diffs in the themes ~modus-operandi-deuteranopia~ and
~modus-vivendi-deuteranopia~. As those themes are optimized for users
with red-green color deficiency, they do not use the typical red+green
color coding for diffs, defaulting instead to yellow+blue which are
discernible. Users with deuteranomaly or, generally, those who like a
different aesthetic, can use the following to make diffs use the
red+yellow+blue color coding for removed, changed, and added lines
respectively. This is achieved by overriding the "changed" and
"removed" entries to use the colors of regular ~modus-operandi~ and
~modus-vivendi~.
#+begin_src emacs-lisp
(setq modus-operandi-deuteranopia-palette-overrides
'((bg-changed "#ffdfa9")
(bg-changed-faint "#ffefbf")
(bg-changed-refine "#fac090")
(bg-changed-fringe "#d7c20a")
(fg-changed "#553d00")
(fg-changed-intense "#655000")
(bg-removed "#ffd8d5")
(bg-removed-faint "#ffe9e9")
(bg-removed-refine "#f3b5af")
(bg-removed-fringe "#d84a4f")
(fg-removed "#8f1313")
(fg-removed-intense "#aa2222")))
(setq modus-vivendi-deuteranopia-palette-overrides
'((bg-changed "#363300")
(bg-changed-faint "#2a1f00")
(bg-changed-refine "#4a4a00")
(bg-changed-fringe "#8a7a00")
(fg-changed "#efef80")
(fg-changed-intense "#c0b05f")
(bg-removed "#4f1119")
(bg-removed-faint "#380a0f")
(bg-removed-refine "#781a1f")
(bg-removed-fringe "#b81a1f")
(fg-removed "#ffbfbf")
(fg-removed-intense "#ff9095")))
#+end_src
Reload the theme for changes to take effect.
** DIY More accurate colors in terminal emulators
:PROPERTIES:
:CUSTOM_ID: h:fbb5e254-afd6-4313-bb05-93b3b4f67358
:END:
#+cindex: Color accuracy of terminal emulators
[ This is based on partial information. Please help verify and/or
expand these findings. ]
The graphical version of Emacs can reproduce color values accurately.
Whereas things get more tricky when Emacs is used in a terminal
emulator, because the terminals' own capabilities determine the number
of colors that may be displayed: the Modus themes don't look as good in
that case.
There is, however, a way to instruct supported terminal emulators to use
more accurate colors. In a shell prompt type =toe -a | grep direct= to
get a list of relevant terminfo entries. There should be items such as
=xterm-direct=, =alacritty-direct=, =kitty-direct=. Once you find the one
that corresponds to your terminal, call Emacs with an environment
variable like =TERM=xterm-direct=. Example that can be adapted to shell
aliases:
: TERM=xterm-direct emacsclient -nw
Another example that can be bound to a key:
: TERM=xterm-direct uxterm -e emacsclient -nw
** DIY Range of color with terminal emulators
:PROPERTIES:
:CUSTOM_ID: h:6b8211b0-d11b-4c00-9543-4685ec3b742f
:END:
#+cindex: Pure white and pure black in terminal emulators
[ This is based on partial information. Please help verify and/or
expand these findings. ]
When Emacs runs in a non-windowed session its color reproduction
capacity is framed or determined by the underlying terminal emulator
([[#h:fbb5e254-afd6-4313-bb05-93b3b4f67358][More accurate colors in terminal emulators]]). Emacs cannot produce a
color that lies outside the range of what the terminal's color palette
renders possible.
This is immediately noticeable when the terminal's first 16 codes do not
include a pure black value for the =termcol0= entry and a pure white for
=termcol15=. Emacs cannot set the correct background (white for
~modus-operandi~; black for ~modus-vivendi~) or foreground (inverse of
the background). It thus falls back to the closest approximation, which
seldom is appropriate for the purposes of the Modus themes.
In such a case, the user is expected to update their terminal's color
palette such as by adapting these resources ([[#h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d][Preview theme colors]]):
#+begin_src emacs-lisp
! Theme: modus-operandi
! Description: XTerm port of modus-operandi (Modus themes for GNU Emacs)
! Author: Protesilaos Stavrou, <https://protesilaos.com>
xterm*background: #ffffff
xterm*foreground: #000000
xterm*color0: #000000
xterm*color1: #a60000
xterm*color2: #005e00
xterm*color3: #813e00
xterm*color4: #0031a9
xterm*color5: #721045
xterm*color6: #00538b
xterm*color7: #bfbfbf
xterm*color8: #595959
xterm*color9: #972500
xterm*color10: #315b00
xterm*color11: #70480f
xterm*color12: #2544bb
xterm*color13: #5317ac
xterm*color14: #005a5f
xterm*color15: #ffffff
! Theme: modus-vivendi
! Description: XTerm port of modus-vivendi (Modus themes for GNU Emacs)
! Author: Protesilaos Stavrou, <https://protesilaos.com>
xterm*background: #000000
xterm*foreground: #ffffff
xterm*color0: #000000
xterm*color1: #ff8059
xterm*color2: #44bc44
xterm*color3: #d0bc00
xterm*color4: #2fafff
xterm*color5: #feacd0
xterm*color6: #00d3d0
xterm*color7: #bfbfbf
xterm*color8: #595959
xterm*color9: #ef8b50
xterm*color10: #70b900
xterm*color11: #c0c530
xterm*color12: #79a8ff
xterm*color13: #b6a0ff
xterm*color14: #6ae4b9
xterm*color15: #ffffff
#+end_src
** DIY Per-theme customization settings
:properties:
:custom_id: h:a897b302-8e10-4a26-beab-3caaee1e1193
:end:
If you prefer to maintain different customization options between the
two themes, it is best you write your own functions that first set those
options and then load the relevant theme. The following code does
exactly that by simply differentiating the two themes on the choice of
bold constructs in code syntax (enabled for one, disabled for the
other).
#+begin_src emacs-lisp
(defun my-demo-modus-operandi ()
(interactive)
(setq modus-themes-bold-constructs t) ; ENABLE bold
(modus-themes-load-theme 'modus-operandi))
(defun my-demo-modus-vivendi ()
(interactive)
(setq modus-themes-bold-constructs nil) ; DISABLE bold
(modus-themes-load-theme 'modus-vivendi))
(defun my-demo-modus-themes-toggle ()
(if (eq (car custom-enabled-themes) 'modus-operandi)
(my-demo-modus-vivendi)
(my-demo-modus-operandi)))
#+end_src
Then assign ~my-demo-modus-themes-toggle~ to a key instead of the
equivalent the themes provide.
For a more elaborate design, it is better to inspect the source code of
~modus-themes-toggle~ and relevant functions.
Reload the theme for changes to take effect.
** DIY Do not extend the region background
:PROPERTIES:
:CUSTOM_ID: h:a5140c9c-18b2-45db-8021-38d0b5074116
:END:
By default, the background of the ~region~ face extends from the
end of the line to the edge of the window. To limit it to the end of
the line, we need to override the face's =:extend= attribute. Adding
this to the Emacs configuration file will suffice:
#+begin_src emacs-lisp
;; Do not extend `region' background past the end of the line.
(custom-set-faces
'(region ((t :extend nil))))
#+end_src
[[#h:c8605d37-66e1-42aa-986e-d7514c3af6fe][Make the region preserve text colors, plus other styles]].
** DIY Add padding to the mode line
:PROPERTIES:
:CUSTOM_ID: h:5a0c58cc-f97f-429c-be08-927b9fbb0a9c
:END:
[ Consider using the ~spacious-padding~ package from GNU ELPA (by
Protesilaos) for more than just the mode line. ]
Emacs faces do not have a concept of "padding" for the space between
the text and its box boundaries. We can approximate the effect by
adding a =:box= attribute, making its border several pixels thick, and
using the mode line's background color for it. This way the thick
border will not stand out and will appear as a continuation of the
mode line.
[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]].
#+begin_src emacs-lisp
(defun my-modus-themes-custom-faces (&rest _)
(modus-themes-with-colors
(custom-set-faces
;; Add "padding" to the mode lines
`(mode-line ((,c :box (:line-width 10 :color ,bg-mode-line-active))))
`(mode-line-inactive ((,c :box (:line-width 10 :color ,bg-mode-line-inactive)))))))
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces)
#+end_src
[[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][Using a hook at the post-load-theme phase]].
The above has the effect of removing the border around the mode lines.
In older versions of the themes, we provided the option for a padded
mode line which could also have borders around it. Those were not
real border, however, but an underline and an overline. Adjusting the
above:
#+begin_src emacs-lisp
(defun my-modus-themes-custom-faces (&rest _)
(modus-themes-with-colors
(custom-set-faces
;; Add "padding" to the mode lines
`(mode-line ((,c :underline ,border-mode-line-active
:overline ,border-mode-line-active
:box (:line-width 10 :color ,bg-mode-line-active))))
`(mode-line-inactive ((,c :underline ,border-mode-line-inactive
:overline ,border-mode-line-inactive
:box (:line-width 10 :color ,bg-mode-line-inactive)))))))
;; ESSENTIAL to make the underline move to the bottom of the box:
(setq x-underline-at-descent-line t)
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces)
#+end_src
The reason we no longer provide this option is because it depends on a
non-~nil~ value for ~x-underline-at-descent-line~. That variable
affects ALL underlines, including those of links. The effect is
intrusive and looks awkward in prose.
As such, the Modus themes no longer provide that option but instead
offer this piece of documentation to make the user fully aware of the
state of affairs.
Reload the theme for changes to take effect.
** DIY Remap face with local value
:properties:
:custom_id: h:7a93cb6f-4eca-4d56-a85c-9dcd813d6b0f
:end:
#+cindex: Remapping faces
There are cases where we need to change the buffer-local attributes of a
face. This might be because we have our own minor mode that reuses a
face for a particular purpose, such as a line selection tool that
activates ~hl-line-mode~, but we wish to keep it distinct from other
buffers. This is where ~face-remap-add-relative~ can be applied and may
be combined with ~modus-themes-with-colors~ to deliver consistent results.
[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]].
In this example we will write a simple interactive function that adjusts
the background color of the ~region~ face. This is the sample code:
#+begin_src emacs-lisp
(defvar my-rainbow-region-colors
(modus-themes-with-colors
`((red . ,bg-red-subtle)
(green . ,bg-green-subtle)
(yellow . ,bg-yellow-subtle)
(blue . ,bg-blue-subtle)
(magenta . ,bg-magenta-subtle)
(cyan . ,bg-cyan-subtle)))
"Sample list of color values for `my-rainbow-region'.")
(defun my-rainbow-region (color)
"Remap buffer-local attribute of `region' using COLOR."
(interactive
(list
(completing-read "Pick a color: " my-rainbow-region-colors)))
(face-remap-add-relative
'region
`( :background ,(alist-get (intern color) my-rainbow-region-colors)
:foreground ,(face-attribute 'default :foreground))))
#+end_src
When ~my-rainbow-region~ is called interactively, it prompts for a color
to use. The list of candidates is drawn from the car of each
association in ~my-rainbow-region-colors~ (so "red", "green", etc.).
To extend this principle, we may write wrapper functions that pass a
color directly. Those can be useful in tandem with hooks. Consider
this example:
#+begin_src emacs-lisp
(defun my-rainbow-region-magenta ()
(my-rainbow-region 'magenta))
(add-hook 'diff-mode-hook #'my-rainbow-region-magenta)
#+end_src
Whenever we enter a ~diff-mode~ buffer, we now get a magenta-colored
region.
Perhaps you may wish to generalize those findings in to a set of
functions that also accept an arbitrary face. We shall leave the
experimentation up to you.
Reload the theme for changes to take effect.
** DIY Font configurations for Org and others
:properties:
:custom_id: h:defcf4fc-8fa8-4c29-b12e-7119582cc929
:end:
#+cindex: Font configurations
[ Consider using the ~fontaine~ package from GNU ELPA (by Protesilaos)
for all font-related configurations. ]
The themes are designed to optionally cope well with mixed font
configurations. This mostly concerns ~org-mode~ and ~markdown-mode~, though
expect to find it elsewhere like in ~Info-mode~.
[[#h:115e6c23-ee35-4a16-8cef-e2fcbb08e28b][Option for font mixing]].
In practice it means that the user can safely opt for a more
prose-friendly proportionately spaced typeface as their default, while
spacing-sensitive elements like tables and inline code always use a
monospaced font, by inheriting from the ~fixed-pitch~ face.
Users can try the built-in {{{kbd(M-x variable-pitch-mode)}}} to see the
effect in action.
To make everything use your desired font families, you need to configure
the ~variable-pitch~ (proportional spacing) and ~fixed-pitch~ (monospaced)
faces respectively. It may also be convenient to set your main typeface
by configuring the ~default~ face the same way.
Put something like this in your initialization file (also consider
reading the doc string of ~set-face-attribute~):
#+begin_src emacs-lisp
;; Main typeface
(set-face-attribute 'default nil :family "DejaVu Sans Mono" :height 110)
;; Proportionately spaced typeface
(set-face-attribute 'variable-pitch nil :family "DejaVu Serif" :height 1.0)
;; Monospaced typeface
(set-face-attribute 'fixed-pitch nil :family "DejaVu Sans Mono" :height 1.5)
#+end_src
Or employ the ~face-attribute~ function to read an existing value, such as
if you want to make ~fixed-pitch~ use the font family of the ~default~ face:
#+begin_src emacs-lisp
(set-face-attribute 'fixed-pitch nil :family (face-attribute 'default :family))
#+end_src
The next section shows how to make those work in a more elaborate setup
that is robust to changes between the Modus themes.
[[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]].
Note the differences in the ~:height~ property. The ~default~ face must
specify an absolute value, which is the point size × 10. So if you want
to use a font at point size =11=, you set the height to =110=.[fn:: ~:height~
values do not need to be rounded to multiples of ten: the likes of =115=
are perfectly valid—some typefaces will change to account for those
finer increments.] Whereas every other face must either not specify a
height or have a value that is relative to the default, represented as a
floating point. If you use an integer, then that means an absolute
height. This is of paramount importance: it ensures that all fonts can
scale gracefully when using something like the ~text-scale-adjust~ command
which only operates on the base font size (i.e. the ~default~ face's
absolute height).
[[#h:e6c5451f-6763-4be7-8fdb-b4706a422a4c][Note for EWW and Elfeed fonts]].
** DIY Configure bold and italic faces
:properties:
:custom_id: h:2793a224-2109-4f61-a106-721c57c01375
:end:
#+cindex: Bold and italic fonts
[ Consider using the ~fontaine~ package from GNU ELPA (by Protesilaos)
for all font-related configurations. ]
The Modus themes do not hardcode a ~:weight~ or ~:slant~ attribute in the
thousands of faces they cover. Instead, they configure the generic
faces called ~bold~ and ~italic~ to use the appropriate styles and then
instruct all relevant faces that require emphasis to inherit from them.
This practically means that users can change the particularities of what
it means for a construct to be bold/italic, by tweaking the ~bold~ and
~italic~ faces. Cases where that can be useful include:
+ The default typeface does not have a variant with slanted glyphs
(e.g. Fira Mono/Code as of this writing on 2021-07-07), so the user
wants to add another family for the italics, such as Hack.
+ The typeface of choice provides a multitude of weights and the user
prefers the light one by default. To prevent the bold weight from
being too heavy compared to the light one, they opt to make ~bold~ use a
semibold weight.
+ The typeface distinguishes between oblique and italic forms by
providing different font variants (the former are just slanted
versions of the upright forms, while the latter have distinguishing
features as well). In this case, the user wants to specify the font
that applies to the ~italic~ face.
To achieve those effects, one must first be sure that the fonts they use
have support for those features. It then is a matter of following the
instructions for all typeface tweaks.
[[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and others]].
In this example, we set the default font family to Fira Code, while we
choose to render italics in the Hack typeface (obviously you need to
pick fonts that work well together):
#+begin_src emacs-lisp
(set-face-attribute 'default nil :family "Fira Code" :height 110)
(set-face-attribute 'italic nil :family "Hack")
#+end_src
And here we play with different weights, using Source Code Pro:
#+begin_src emacs-lisp
(set-face-attribute 'default nil :family "Source Code Pro" :height 110 :weight 'light)
(set-face-attribute 'bold nil :weight 'semibold)
#+end_src
To reset the font family, one can use this:
#+begin_src emacs-lisp
(set-face-attribute 'italic nil :family 'unspecified)
#+end_src
To ensure that the effects persist after switching between the Modus
themes (such as with {{{kbd(M-x modus-themes-toggle)}}}), the user
needs to write their configurations to a function and pass it to the
~modus-themes-after-load-theme-hook~ ([[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]). This is
necessary because themes set the styles of faces upon activation,
overriding prior values where conflicts occur between the previous and
the current states (otherwise changing themes would not be possible).
[[#h:86f6906b-f090-46cc-9816-1fe8aeb38776][A theme-agnostic hook for theme loading]].
This is a minimal setup to preserve font configurations across theme
load phases. For a more permanent setup, it is better to rely on the
~custom-set-faces~ function: ~set-face-attribute~ works just fine, though it
probably is better suited for quick previews or for smaller scale
operations (~custom-set-faces~ follows the format used in the source code
of the themes, which can make it easier to redefine faces in bulk).
#+begin_src emacs-lisp
;; our generic function
(defun my-modes-themes-bold-italic-faces (&rest _)
(set-face-attribute 'default nil :family "Source Code Pro" :height 110)
(set-face-attribute 'bold nil :weight 'semibold))
;; or use this if you configure a lot of face and attributes and
;; especially if you plan to use `modus-themes-with-colors', as shown
;; elsewhere in the manual
(defun my-modes-themes-bold-italic-faces (&rest _)
(custom-set-faces
'(default ((t :family "Source Code Pro" :height 110)))
'(bold ((t :weight semibold)))))
;; and here is the hook
(add-hook 'modus-themes-after-load-theme-hook #'my-modes-themes-bold-italic-faces)
#+end_src
[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]].
[[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][Using a hook at the post-load-theme phase]].
Reload the theme for changes to take effect.
** DIY Custom Org todo keyword and priority faces
:properties:
:custom_id: h:89f0678d-c5c3-4a57-a526-668b2bb2d7ad
:end:
#+cindex: Org custom todo faces
Users of ~org-mode~ have the option to configure various keywords and
priority cookies to better match their workflow. User options are
~org-todo-keyword-faces~ and ~org-priority-faces~.
As those are meant to be custom faces, it is futile to have the themes
guess what each user wants to use, which keywords to target, and so on.
Instead, we can provide guidelines on how to customize things to one's
liking with the intent of retaining the overall aesthetic of the themes.
Please bear in mind that the end result of those is not controlled by
the active Modus theme but by how Org maps faces to its constructs.
Editing those while ~org-mode~ is active requires re-initialization of the
mode with {{{kbd(M-x org-mode-restart)}}} for changes to take effect.
Let us assume you wish to visually differentiate your keywords. You
have something like this:
#+begin_src emacs-lisp
(setq org-todo-keywords
'((sequence "TODO(t)" "|" "DONE(D)" "CANCEL(C)")
(sequence "MEET(m)" "|" "MET(M)")
(sequence "STUDY(s)" "|" "STUDIED(S)")
(sequence "WRITE(w)" "|" "WROTE(W)")))
#+end_src
You could then use a variant of the following to inherit from a face
that uses the styles you want and also to preserve the attributes
applied by the ~org-todo~ face (in case there is a difference between
the two):
#+begin_src emacs-lisp
(setq org-todo-keyword-faces
'(("MEET" . (:inherit (bold org-todo)))
("STUDY" . (:inherit (warning org-todo)))
("WRITE" . (:inherit (shadow org-todo)))))
#+end_src
This will refashion the keywords you specify, while letting the other
items in ~org-todo-keywords~ use their original styles, which are
defined in the ~org-todo~ and ~org-done~ faces.
If you want back the defaults, try specifying just the ~org-todo~ face:
#+begin_src emacs-lisp
(setq org-todo-keyword-faces
'(("MEET" . org-todo)
("STUDY" . org-todo)
("WRITE" . org-todo)))
#+end_src
Or set ~org-todo-keyword-faces~ to ~nil~.
When you inherit from multiple faces, you need to do it the way it is
shown further above. The order is significant: the first entry is
applied on top of the second, overriding any attributes that are
explicitly set for both of them: any attribute that is not specified
is not overridden, so, for example, if ~org-todo~ has a background and
a foreground, while ~font-lock-type-face~ only has a foreground, the
merged face will include the background of the former and the
foreground of the latter. If you do not want to blend multiple faces,
you only specify one by name without parentheses or an =:inherit=
keyword. A pattern of =keyword . face= will suffice.
Both approaches can be used simultaneously, as illustrated in this
configuration of the priority cookies:
#+begin_src emacs-lisp
(setq org-priority-faces
'((?A . (:inherit (bold org-priority)))
(?B . org-priority)
(?C . (:inherit (shadow org-priority)))))
#+end_src
To find all the faces that are loaded in your current Emacs session, use
{{{kbd(M-x list-faces-display)}}}. Try {{{kbd(M-x describe-variable)}}} as well and
then specify the name of each of those Org variables demonstrated above.
Their documentation strings will offer you further guidance.
Recall that the themes let you retrieve a color from their palette. Do
it if you plan to control face attributes.
[[#h:02e25930-e71a-493d-828a-8907fc80f874][Check color combinations]].
** DIY Custom Org emphasis faces
:properties:
:custom_id: h:26026302-47f4-4471-9004-9665470e7029
:end:
#+cindex: Org custom emphasis faces
Org provides the user option ~org-emphasis-alist~ which associates a
character with a face, list of faces, or face attributes. The default
specification of that variable looks like this:
#+begin_src emacs-lisp
(setq org-emphasis-alist
'(("*" bold)
("/" italic)
("_" underline)
("=" org-verbatim verbatim)
("~" org-code verbatim)
("+" (:strike-through t))))
#+end_src
With the exception of ~org-verbatim~ and ~org-code~ faces, everything else
uses the corresponding type of emphasis: a bold typographic weight, or
italicized, underlined, and struck through text.
The best way for users to add some extra attributes, such as a
foreground color, is to define their own faces and assign them to the
given emphasis marker/character.
This is a custom face that extends the standard ~bold~ face with a red
foreground value (so it colorises the text in addition to the bold
weight):
#+begin_src emacs-lisp
(defface my-org-emphasis-bold
'((default :inherit bold)
(((class color) (min-colors 88) (background light))
:foreground "#a60000")
(((class color) (min-colors 88) (background dark))
:foreground "#ff8059"))
"My bold emphasis for Org.")
#+end_src
This face definition reads as follows:
+ Always inherit the ~bold~ face ([[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]]).
+ For versions of Emacs that support at least 88 colors (graphical
Emacs, for example) and use a light background, apply the =#a60000=
value.
+ For the same kind of Emacs that has a dark background use the =#ff8059=
color instead.
Same principle for how to extend ~italic~ and ~underline~ with, for example,
green and yellow hues, respectively:
#+begin_src emacs-lisp
(defface my-org-emphasis-italic
'((default :inherit italic)
(((class color) (min-colors 88) (background light))
:foreground "#005e00")
(((class color) (min-colors 88) (background dark))
:foreground "#44bc44"))
"My italic emphasis for Org.")
(defface my-org-emphasis-underline
'((default :inherit underline)
(((class color) (min-colors 88) (background light))
:foreground "#813e00")
(((class color) (min-colors 88) (background dark))
:foreground "#d0bc00"))
"My underline emphasis for Org.")
#+end_src
In the case of a strike-through effect, we have no generic face to
inherit from, so we can write it as follows to also change the
foreground to a more subtle gray:
#+begin_src emacs-lisp
(defface my-org-emphasis-strike-through
'((default :strike-through t)
(((class color) (min-colors 88) (background light))
:foreground "#505050")
(((class color) (min-colors 88) (background dark))
:foreground "#a8a8a8"))
"My strike-through emphasis for Org.")
#+end_src
Or we can just change the color of the line that strikes through the
text to, for example, a shade of red:
#+begin_src emacs-lisp
(defface my-org-emphasis-strike-through
'((((class color) (min-colors 88) (background light))
:strike-through "#972500")
(((class color) (min-colors 88) (background dark))
:strike-through "#ef8b50"))
"My strike-through emphasis for Org.")
#+end_src
It is possible to combine those effects:
#+begin_src emacs-lisp
(defface my-org-emphasis-strike-through
'((((class color) (min-colors 88) (background light))
:strike-through "#972500" :foreground "#505050")
(((class color) (min-colors 88) (background dark))
:strike-through "#ef8b50" :foreground "#a8a8a8"))
"My strike-through emphasis for Org.")
#+end_src
One may inspect the variables ~modus-themes-operandi-colors~ and
~modus-themes-vivendi-colors~ for possible color values. Or call the
command ~modus-themes-list-colors~ to show a buffer that previews each
entry in the palette.
[[#h:f4d4b71b-2ca5-4c3d-b0b4-9bfd7aa7fb4d][Visualize the active Modus theme's palette]].
Once we have defined the faces we need, we must update the
~org-emphasis-alist~. Given that ~org-verbatim~ and ~org-code~ are already
styled by the themes, it probably is best not to edit them:
#+begin_src emacs-lisp
(setq org-emphasis-alist
'(("*" my-org-emphasis-bold)
("/" my-org-emphasis-italic)
("_" my-org-emphasis-underline)
("=" org-verbatim verbatim)
("~" org-code verbatim)
("+" my-org-emphasis-strike-through)))
#+end_src
That's it! For changes to take effect in already visited Org files,
invoke {{{kbd(M-x org-mode-restart)}}}.
** DIY Use colored Org source blocks per language
:PROPERTIES:
:CUSTOM_ID: h:8c842804-43b7-4287-b4e9-8c07d04d1f89
:END:
[[#h:f44cc6e3-b0f1-4a5e-8a90-9e48fa557b50][DIY Make Org block colors more or less colorful]].
In versions of the Modus themes before =4.4.0= there was an option to
change the coloration of Org source blocks so that certain languages
would have a distinctly colored background. This was not flexible
enough, because (i) we cannot cover all languages effectively and (ii)
the user had no choice over the =language --> color= mapping.
As such, the old user option is no more. Users can use the following
to achieve what they want:
[ All this is done by setting the Org user option ~org-src-block-faces~,
so it is not related to the palette overrides mechanism provided by
the Modus themes. ]
#+begin_src emacs-lisp
(defun my-modus-themes-org-block-faces (&rest _)
(modus-themes-with-colors
;; The `org-src-block-faces' does not get re-applied in existing
;; Org buffers. Do M-x org-mode-restart for changes to take
;; effect.
(setq org-src-block-faces
`(("emacs-lisp" modus-themes-nuanced-magenta)
("elisp" modus-themes-nuanced-magenta)
("clojure" modus-themes-nuanced-magenta)
("clojurescript" modus-themes-nuanced-magenta)
("c" modus-themes-nuanced-blue)
("c++" modus-themes-nuanced-blue)
("sh" modus-themes-nuanced-yellow)
("shell" modus-themes-nuanced-yellow)
("python" modus-themes-nuanced-yellow)
("ipython" modus-themes-nuanced-yellow)
("r" modus-themes-nuanced-yellow)
("html" modus-themes-nuanced-green)
("xml" modus-themes-nuanced-green)
("css" modus-themes-nuanced-red)
("scss" modus-themes-nuanced-red)
("yaml" modus-themes-nuanced-cyan)
("conf" modus-themes-nuanced-cyan)
("docker" modus-themes-nuanced-cyan)))))
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-org-block-faces)
#+end_src
[[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][DIY Use a hook at the post-load-theme phase]].
Note that the ~org-src-block-faces~ accepts a named face, as shown
above, as well as a list of face attributes. The latter approach is
not good enough because it hardcodes values in such a way that an
~org-mode-restart~ is necessary. Whereas the indirection of the named
face lets the theme change the values while Org buffers continue to
show the right colors.
Still, if a user prefers to hardcode face attributes, here is the
idea:
#+begin_src emacs-lisp
;; This is for the sake of completeness. I DO NOT RECOMMEND THIS
;; method because it hardcodes values and thus requires
;; `org-mode-restart' every time you change a theme.
(defun my-modus-themes-org-block-faces (&rest _)
(modus-themes-with-colors
(setq org-src-block-faces
`(("emacs-lisp" (:inherit org-block :background ,bg-magenta-nuanced))
("elisp" (:inherit org-block :background ,bg-magenta-nuanced))
("clojure" (:inherit org-block :background ,bg-magenta-nuanced))
("clojurescript" (:inherit org-block :background ,bg-magenta-nuanced))
("c" (:inherit org-block :background ,bg-blue-nuanced))
("c++" (:inherit org-block :background ,bg-blue-nuanced))
("sh" (:inherit org-block :background ,bg-yellow-nuanced))
("shell" (:inherit org-block :background ,bg-yellow-nuanced))
("python" (:inherit org-block :background ,bg-yellow-nuanced))
("ipython" (:inherit org-block :background ,bg-yellow-nuanced))
("r" (:inherit org-block :background ,bg-yellow-nuanced))
("html" (:inherit org-block :background ,bg-green-nuanced))
("xml" (:inherit org-block :background ,bg-green-nuanced))
("css" (:inherit org-block :background ,bg-red-nuanced))
("scss" (:inherit org-block :background ,bg-red-nuanced))
("yaml" (:inherit org-block :background ,bg-cyan-nuanced))
("conf" (:inherit org-block :background ,bg-cyan-nuanced))
("docker" (:inherit org-block :background ,bg-cyan-nuanced))))))
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-org-block-faces)
#+end_src
** DIY Measure color contrast
:properties:
:custom_id: h:02e25930-e71a-493d-828a-8907fc80f874
:end:
#+findex: modus-themes-contrast
#+findex: modus-themes-wcag-formula
#+cindex: Color contrast
The themes provide the functions ~modus-themes-wcag-formula~ and
~modus-themes-contrast~. The former is a direct implementation of the
WCAG formula: <https://www.w3.org/TR/WCAG20-TECHS/G18.html>. It
calculates the relative luminance of a color value that is expressed in
hexadecimal RGB notation. While the latter function is just a
convenient wrapper for comparing the relative luminance between two
colors.
In practice, one needs to work only with ~modus-themes-contrast~. It
accepts two color values and returns their contrast ratio. Values range
from 1 to 21 (lowest to highest). The themes are designed to always be
equal or higher than 7 for each combination of background and foreground
that they use (this is the WCAG AAA standard---the most demanding of its
kind).
A couple of examples (rounded numbers):
#+begin_src emacs-lisp
;; Pure white with pure green
(modus-themes-contrast "#ffffff" "#00ff00")
;; => 1.37
;; That is an outright inaccessible combo
;; Pure black with pure green
(modus-themes-contrast "#000000" "#00ff00")
;; => 15.3
;; That is a highly accessible combo
#+end_src
It does not matter which color value comes first. The ratio is always
the same.
If one does not wish to read all the decimal points, it is possible to
try something like this:
#+begin_src emacs-lisp
(format "%0.2f" (modus-themes-contrast "#000000" "#00ff00"))
#+end_src
While it is fine to perform such calculations on a case-by-case basis,
it is preferable to implement formulas and tables for more demanding
tasks. Such instruments are provided by ~org-mode~ or ~orgtbl-mode~, both
of which are built into Emacs. Below is such a table that derives the
contrast ratio of all colors in the first column (pure red, green, blue)
relative to the color specified in the first row of the second column
(pure white) and rounds the results:
#+begin_example
| | #ffffff |
|---------+---------|
| #ff0000 | 4.00 |
| #00ff00 | 1.37 |
| #0000ff | 8.59 |
#+tblfm: $2='(modus-themes-contrast $1 @1$2);%0.2f
#+end_example
To measure color contrast one needs to start from a known value. This
typically is the background. The Modus themes define an expanded
palette in large part because certain colors are only meant to be used
in combination with some others. Consult the source code for the
minutia and relevant commentary.
Such knowledge may prove valuable while attempting to customize the
theme's color palette.
** DIY Load theme depending on time of day
:properties:
:custom_id: h:1d1ef4b4-8600-4a09-993c-6de3af0ddd26
:end:
While we do provide ~modus-themes-toggle~ to manually switch between the
themes, users may also set up their system to perform such a task
automatically at sunrise and sunset.
This can be accomplished by specifying the coordinates of one's
location using the built-in {{{file(solar.el)}}} and then configuring
the ~circadian~ package:
#+begin_src emacs-lisp
(use-package solar ; built-in
:config
(setq calendar-latitude 35.17
calendar-longitude 33.36))
(use-package circadian ; you need to install this
:ensure t
:after solar
:config
(setq circadian-themes '((:sunrise . modus-operandi)
(:sunset . modus-vivendi)))
(circadian-setup))
#+end_src
** DIY Backdrop for pdf-tools
:properties:
:custom_id: h:ff69dfe1-29c0-447a-915c-b5ff7c5509cd
:end:
#+cindex: Remapping pdf-tools backdrop
Most PDF files use a white background for their page, making it
impossible to discern the file's boundaries in the buffer while using
the Modus Operandi theme. To introduce a distinction between the
buffer's backdrop and the PDF page's background, the former must be
rendered as some shade of gray. Ideally, ~pdf-tools~ would provide a face
that the themes could support directly, though this does not seem to be
the case for the time being. We must thus employ the face remapping
technique that is documented elsewhere in this document to change the
buffer-local value of the ~default~ face.
[[#h:7a93cb6f-4eca-4d56-a85c-9dcd813d6b0f][Remap face with local value]].
To remap the buffer's backdrop, we start with a function like this one:
#+begin_src emacs-lisp
(defun my-pdf-tools-backdrop (&rest _)
(modus-themes-with-colors
(face-remap-add-relative
'default
`(:background ,bg-dim))))
(add-hook 'pdf-tools-enabled-hook #'my-pdf-tools-backdrop)
#+end_src
The idea is to assign that function to a hook that gets called when
~pdf-tools~ renders the document: ~pdf-tools-enabled-hook~. This is enough
when you only use one theme. However it has the downside of setting the
background color value only at render time. In other words, the face
remapping function does not get evaluated anew whenever the theme
changes, such as upon invoking {{{kbd(M-x modus-themes-toggle)}}}
([[#h:4fbfed66-5a89-447a-a07d-a03f6819c5bd][Option for which themes to toggle]]).
To have our face remapping adapt gracefully while switching between the
Modus themes, we need to also account for the current theme and control
the activation of ~pdf-view-midnight-minor-mode~. To which end we arrive
at something like the following, which builds on the above example:
#+begin_src emacs-lisp
(defun my-pdf-tools-backdrop (&rest _)
(modus-themes-with-colors
(face-remap-add-relative
'default
`(:background ,bg-dim))))
(defun my-pdf-tools-midnight-mode-toggle (&rest _)
(when (derived-mode-p 'pdf-view-mode)
(if (eq (car custom-enabled-themes) 'modus-vivendi)
(pdf-view-midnight-minor-mode 1)
(pdf-view-midnight-minor-mode -1))
(my-pdf-tools-backdrop)))
(defun my-pdf-tools-themes-toggle (&rest _)
(mapc
(lambda (buf)
(with-current-buffer buf
(my-pdf-tools-midnight-mode-toggle)))
(buffer-list)))
(add-hook 'pdf-tools-enabled-hook #'my-pdf-tools-midnight-mode-toggle)
(add-hook 'modus-themes-after-load-theme-hook #'my-pdf-tools-themes-toggle)
#+end_src
[[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][Using a hook at the post-load-theme phase]].
With those in place, PDFs have a distinct backdrop for their page, while
buffers with major-mode as ~pdf-view-mode~ automatically switches to dark
mode when ~modus-themes-toggle~ is called.
Reload the theme for changes to take effect.
** DIY Toggle themes without reloading them
:properties:
:custom_id: h:b40aca50-a3b2-4c43-be58-2c26fcd14237
:end:
#+cindex: Switch themes without load-theme
Users who have a stable setup and who only ever need to toggle between
the themes without triggering a full reload, are better off defining
their own command which calls ~enable-theme~ instead of ~load-theme~:
#+begin_src emacs-lisp
(defun my-modus-themes-toggle ()
"Toggle between `modus-operandi' and `modus-vivendi' themes.
This uses `enable-theme' instead of the standard method of
`load-theme'. The technicalities are covered in the Modus themes
manual."
(interactive)
(pcase (modus-themes--current-theme)
('modus-operandi (progn (enable-theme 'modus-vivendi)
(disable-theme 'modus-operandi)))
('modus-vivendi (progn (enable-theme 'modus-operandi)
(disable-theme 'modus-vivendi)))
(_ (error "No Modus theme is loaded; evaluate `modus-themes-load-themes' first"))))
#+end_src
[[#h:e68560b3-7fb0-42bc-a151-e015948f8a35][Differences between loading and enabling]].
Recall that ~modus-themes-toggle~ uses ~load-theme~.
** DIY Use more spacious margins or padding in Emacs frames
:PROPERTIES:
:CUSTOM_ID: h:43bcb5d0-e25f-470f-828c-662cee9e21f1
:END:
[ UPDATE 2023-06-25: Instead of following these instructions, you can
simply install my ~spacious-padding~ package from GNU ELPA. It
implements the padding and provides relevant user options. ]
By default, Emacs frames try to maximize the number of characters that
fit in the current visible portion of the buffer. Users may prefer to
have some extra padding instead. This can make Emacs frames look more
pleasant, but also make it easier to identify the currently active
window.
The way to implement such padding is two-fold:
1. In the =early-init.el= file instruct Emacs to use a higher value
for the ~internal-border-width~ of all frames, as well as for the
~right-divider-width~. The former concerns the outer boundaries of
Emacs frames, while the latter pertains to dividers between Emacs
windows.
2. Make the relevant faces invisible by changing the value of their
relevant attributes to that of the current theme's main background.
The parameters of Emacs frames are specified in the variables
~initial-frame-alist~ and ~default-frame-alist~. The "initial frame"
refers to the first frame that appears on Emacs startup. The
"default" refers to the fallback values that apply to all other frames
that Emacs creates (unless those are explicitly overridden by a
bespoke ~make-frame~ call).
In detail, first we use the same values for the two frame alist variables:
#+begin_src emacs-lisp
;; This must go in the early-init.el so that it applies to the initial
;; frame.
(dolist (var '(default-frame-alist initial-frame-alist))
(add-to-list var '(right-divider-width . 20))
(add-to-list var '(internal-border-width . 20)))
#+end_src
What the ~dolist~ does is to call ~add-to-list~ for the two variables
we specify there. This economizes on typing.
Then we define a function that makes the relevant faces invisible.
The reason we do this with a function is so we can hook it to the
"post load" phase of a theme, thus applying the new background value
(otherwise you keep the old background, which likely means that the
faces will no longer be invisible).
#+begin_src emacs-lisp
(defun my-modus-themes-invisible-dividers (&rest _)
"Make window dividers invisible.
Add this to the `modus-themes-post-load-hook'."
(let ((bg (face-background 'default)))
(custom-set-faces
`(fringe ((t :background ,bg :foreground ,bg)))
`(window-divider ((t :background ,bg :foreground ,bg)))
`(window-divider-first-pixel ((t :background ,bg :foreground ,bg)))
`(window-divider-last-pixel ((t :background ,bg :foreground ,bg))))))
(add-hook 'modus-themes-post-load-hook #'my-modus-themes-invisible-dividers)
#+end_src
[[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][Using a hook at the post-load-theme phase]].
The above will work only for themes that belong to the Modus family.
For users of Emacs version 29 or higher, there exists a theme-agnostic
hook that takes a function with one argument---that of the theme---and
calls in the "post enable" phase of theme loading. Here is the
above snippet, with the necessary tweaks:
#+begin_src emacs-lisp
(defun my-modus-themes-invisible-dividers (&rest _)
"Make window dividers for THEME invisible."
(let ((bg (face-background 'default)))
(custom-set-faces
`(fringe ((t :background ,bg :foreground ,bg)))
`(window-divider ((t :background ,bg :foreground ,bg)))
`(window-divider-first-pixel ((t :background ,bg :foreground ,bg)))
`(window-divider-last-pixel ((t :background ,bg :foreground ,bg))))))
(add-hook 'enable-theme-functions #'my-modus-themes-invisible-dividers)
#+end_src
Users of older versions of Emacs can read the entry herein about
defining their own theme-agnostic hook ([[#h:86f6906b-f090-46cc-9816-1fe8aeb38776][A theme-agnostic hook for theme loading]]).
** DIY Custom hl-todo colors
:PROPERTIES:
:CUSTOM_ID: h:2ef83a21-2f0a-441e-9634-473feb940743
:END:
The ~hl-todo~ package provides the user option
~hl-todo-keyword-faces~: it specifies a pair of keyword and
corresponding color value. The Modus themes configure that option in
the interest of legibility. While this works for our purposes, users
may still prefer to apply their custom values, in which case the
following approach is necessary:
#+begin_src emacs-lisp
(defun my-modus-themes-hl-todo-faces (&rest _)
(setq hl-todo-keyword-faces '(("TODO" . "#ff0000")
("HACK" . "#ffff00")
("XXX" . "#00ffff")
("NOTE" . "#ff00ff"))))
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces)
#+end_src
[[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][Using a hook at the post-load-theme phase]].
Or include a ~let~ form, if needed:
#+begin_src emacs-lisp
(defun my-modus-themes-hl-todo-faces (&rest _)
(let ((red "#ff0000")
(blue "#0000ff"))
(setq hl-todo-keyword-faces `(("TODO" . ,blue)
("HACK" . ,red)
("XXX" . ,red)
("NOTE" . ,blue)))))
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces)
#+end_src
[[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][Using a hook at the post-load-theme phase]].
Normally, we do not touch user options, though this is an exception:
otherwise the defaults are not always legible.
Reload the theme for changes to take effect.
** DIY Add support for solaire-mode
:PROPERTIES:
:CUSTOM_ID: h:439c9e46-52e2-46be-b1dc-85841dd99671
:END:
The ~solaire-mode~ package dims the background of what it considers
ancillary "UI" buffers, such as the minibuffer and Dired buffers. The
Modus themes used to support Solaire on the premise that the user was
(i) opting in to it, (ii) understood why certain buffers were more gray,
and (iii) knew what other adjustments had to be made to prevent broken
visuals (e.g. the default style of the ~modus-themes-completions~ uses a
subtle gray background for the selection, which with Solaire becomes
practically invisible).
However, the assumption that users opt in to this feature does not
always hold true. There are cases where it is enabled by defaultsuch as
in the popular Doom Emacs configuration. Thus, the unsuspecting user
who loads ~modus-operandi~ or ~modus-vivendi~ without the requisite
customizations is getting a sub-par experience; an experience that we
did not intend and cannot genuinely fix.
Because the Modus themes are meant to work everywhere, we cannot make an
exception for Doom Emacs and/or Solaire users. Furthermore, we shall
not introduce hacks, such as by adding a check in all relevant faces to
be adjusted based on Solaire or whatever other package. Hacks of this
sort are unsustainable and penalize the entire userbase. Besides, the
themes are built into Emacs and we must keep their standard high.
The fundamental constraint with Solaire is that Emacs does not have a
real distinction between "content" and "UI" buffers. For themes to work
with Solaire, they need to be designed around that package. Such is an
arrangement that compromises on our accessibility standards and/or
hinders our efforts to provide the best possible experience while using
the Modus themes.
As such, ~solaire-mode~ is not---and will not be---supported by the
Modus themes (or any other of my themes, for that matter). Users who
want it must style the faces manually. Below is some sample code, based
on what we cover at length elsewhere in this manual:
[[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]].
[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]].
#+begin_src emacs-lisp
(defun my-modus-themes-custom-faces (&rest _)
(modus-themes-with-colors
(custom-set-faces
`(solaire-default-face ((,c :inherit default :background ,bg-dim :foreground ,fg-dim)))
`(solaire-line-number-face ((,c :inherit solaire-default-face :foreground ,fg-unfocused)))
`(solaire-hl-line-face ((,c :background ,bg-active)))
`(solaire-org-hide-face ((,c :background ,bg-dim :foreground ,bg-dim))))))
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces)
#+end_src
[[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][Using a hook at the post-load-theme phase]].
Reload the theme for changes to take effect.
** DIY Use a hook at the post-load-theme phase
:PROPERTIES:
:CUSTOM_ID: h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24
:END:
Many of the Do-It-Yourself (DIY) snippets provided herein make use of
a hook to apply the desired changes. In most examples, this hook is
the ~modus-themes-after-load-theme-hook~ (alias ~modus-themes-post-load-hook~).
This hook is provided by the Modus themes and is called at the end of
one the following:
- Command ~modus-themes-toggle~ :: [[#h:4fbfed66-5a89-447a-a07d-a03f6819c5bd][Option for which themes to toggle]].
- Command ~modus-themes-select~ :: Select a Modus theme using minibuffer
completion and then load it.
- Function ~modus-themes-load-theme~ :: Called only from Lisp, such as
in the user's init file, with the quoted symbol of a Modus theme as
an argument ([[#h:adb0c49a-f1f9-4690-868b-013a080eed68][Option for disabling other themes while loading Modus]]).
This function is used internally by ~modus-themes-toggle~ and
~modus-themes-select~.
Users who switch between themes that are not limited to the Modus
collection cannot benefit from the aforementioned hook: it only works
with the Modus themes. A theme-agnostic hook is needed in such a case.
Before Emacs 29, this had to be set up manually ([[#h:86f6906b-f090-46cc-9816-1fe8aeb38776][DIY A theme-agnostic hook for theme loading]]).
Starting with Emacs 29, the special hook ~enable-theme-functions~
works with anything that uses the basic ~enable-theme~ function.
To use the ~enable-theme-functions~ just add the given function to it
the way it is done with every hook:
#+begin_src emacs-lisp
(add-hook 'enable-theme-functions 'MY-FUNCTION-HERE)
#+end_src
Functions added to ~enable-theme-functions~ accept a single =THEME=
argument. The examples shown in this manual use the pattern =(&rest
_)=, which is how a function accepts one or more arguments but
declares it will not use them (in plain terms, the code works with or
without ~enable-theme-functions~).
*** DIY A theme-agnostic hook for theme loading
:properties:
:custom_id: h:86f6906b-f090-46cc-9816-1fe8aeb38776
:end:
[ NOTE: The following is for versions of Emacs before 29. For Emacs 29
or higher, users can rely on the built-in ~enable-theme-functions~
([[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][Using a hook at the post-load-theme phase]]). ]
The themes are designed with the intent to be useful to Emacs users of
varying skill levels, from beginners to experts. This means that we try
to make things easier by not expecting anyone reading this document to
be proficient in Emacs Lisp or programming in general.
Such a case is with the use of ~modus-themes-after-load-theme-hook~,
which runs after the ~modus-themes-load-theme~ function (used by the
command ~modus-themes-toggle~). We recommend using that hook for
advanced customizations, because (1) we know for sure that it is
available once the themes are loaded, and (2) anyone consulting this
manual, especially the sections on enabling and loading the themes,
will be in a good position to benefit from that hook.
Advanced users who have a need to switch between the Modus themes and
other items will find that such a hook does not meet their requirements:
it only works with the Modus themes and only with the aforementioned
functions.
A theme-agnostic setup can be configured thus:
#+begin_src emacs-lisp
(defvar after-enable-theme-hook nil
"Normal hook run after enabling a theme.")
(defun run-after-enable-theme-hook (&rest _args)
"Run `after-enable-theme-hook'."
(run-hooks 'after-enable-theme-hook))
(advice-add 'enable-theme :after #'run-after-enable-theme-hook)
#+end_src
This creates the ~after-enable-theme-hook~ and makes it run after each
call to ~enable-theme~, which means that it will work for all themes and
also has the benefit that it does not depend on functions such as
~modus-themes-toggle~ and the others mentioned above. ~enable-theme~ is
called internally by ~load-theme~, so the hook works everywhere.
The downside of the theme-agnostic hook is that any functions added to
it will likely not be able to benefit from macro calls that read the
active theme, such as ~modus-themes-with-colors~. Not all Emacs
themes have the same capabilities.
In this document, we cover ~modus-themes-after-load-theme-hook~ though
the user can replace it with ~after-enable-theme-hook~ should they
need to (provided they understand the implications).
* Face coverage
:properties:
:custom_id: h:a9c8f29d-7f72-4b54-b74b-ddefe15d6a19
:end:
The Modus themes try to provide as close to full face coverage as
possible. This is necessary to ensure a consistently accessible reading
experience across all available interfaces.
** Full support for packages or face groups
:properties:
:alt_title: Supported packages
:description: Full list of covered face groups
:custom_id: h:60ed4275-60d6-49f8-9287-9a64e54bea0e
:end:
#+cindex: Explicitly supported packages
This list will always be updated to reflect the current state of the
project. The idea is to offer an overview of the known status of all
affected face groups. The items with an appended asterisk =*= tend to
have lots of extensions, so the "full support" may not be 100% true…
+ ace-window
+ agda2-mode
+ all-the-icons
+ all-the-icons-dired
+ all-the-icons-ibuffer
+ annotate
+ ansi-color
+ anzu
+ auctex and TeX
+ auto-dim-other-buffers
+ avy
+ bbdb
+ binder
+ breadcrumb
+ bongo
+ boon
+ bookmark
+ calendar and diary
+ centaur-tabs
+ change-log and log-view (such as ~vc-print-log~, ~vc-print-root-log~)
+ chart
+ cider
+ circe
+ citar
+ clojure-mode
+ column-enforce-mode
+ company-mode*
+ compilation-mode
+ completions
+ consult
+ corfu
+ corfu-candidate-overlay
+ corfu-quick
+ counsel*
+ cperl-mode
+ crontab-mode
+ csv-mode
+ ctrlf
+ custom (what you get with {{{kbd(M-x customize)}}})
+ dashboard
+ deadgrep
+ debbugs
+ deft
+ denote
+ devdocs
+ dictionary
+ diff-hl
+ diff-mode
+ dim-autoload
+ dired
+ dired-async
+ dired-git
+ dired-git-info
+ dired-narrow
+ dired-subtree
+ diredfl
+ disk-usage
+ display-fill-column-indicator-mode
+ doom-modeline
+ ediff
+ ein (Emacs IPython Notebook)
+ eglot
+ el-search
+ eldoc-box
+ elfeed
+ elfeed-score
+ elpher
+ embark
+ ement
+ emms
+ enh-ruby-mode (enhanced-ruby-mode)
+ epa
+ erc
+ ert
+ erts-mode
+ eshell
+ eshell-fringe-status
+ evil* (evil-mode)
+ eww
+ exwm
+ eyebrowse
+ flycheck
+ flycheck-color-mode-line
+ flycheck-indicator
+ flymake
+ flyspell
+ flx
+ focus
+ fold-this
+ font-lock (generic syntax highlighting)
+ geiser
+ git-commit
+ git-gutter (and variants)
+ git-rebase
+ git-timemachine
+ gnus
+ gotest
+ golden-ratio-scroll-screen
+ helpful
+ highlight-numbers
+ highlight-parentheses ([[#h:24bab397-dcb2-421d-aa6e-ec5bd622b913][Note on highlight-parentheses.el]])
+ highlight-thing
+ hl-fill-column
+ hl-line-mode
+ hl-todo
+ hydra
+ ibuffer
+ icomplete
+ ido-mode
+ iedit
+ iflipb
+ image-dired
+ imenu-list
+ indium
+ info
+ info+ (info-plus)
+ info-colors
+ ioccur
+ isearch, occur, etc.
+ ivy*
+ ivy-posframe
+ japanese-holidays
+ jira (org-jira)
+ jit-spell
+ jinx
+ journalctl-mode
+ js2-mode
+ julia
+ kaocha-runner
+ keycast
+ ledger-mode
+ leerzeichen
+ line numbers (~display-line-numbers-mode~ and global variant)
+ magit
+ make-mode
+ man
+ marginalia
+ markdown-mode
+ markup-faces (~adoc-mode~)
+ mct
+ messages
+ minimap
+ mode-line
+ mood-line
+ mpdel
+ mu4e
+ multiple-cursors
+ nerd-icons
+ nerd-icons-completion
+ nerd-icons-dired
+ nerd-icons-ibuffer
+ neotree
+ notmuch
+ num3-mode
+ nxml-mode
+ olivetti
+ orderless
+ org*
+ org-journal
+ org-noter
+ org-pomodoro
+ org-recur
+ org-roam
+ org-superstar
+ org-table-sticky-header
+ org-tree-slide
+ origami
+ outline-mode
+ outline-minor-faces
+ package (what you get with {{{kbd(M-x list-packages)}}})
+ page-break-lines
+ pandoc-mode
+ paren-face
+ pass
+ pdf-tools
+ persp-mode
+ perspective
+ popup
+ powerline
+ prism ([[#h:a94272e0-99da-4149-9e80-11a7e67a2cf2][Note for prism.el]])
+ prescient
+ proced
+ prodigy
+ pulse
+ pyim
+ quick-peek
+ rainbow-delimiters
+ rcirc
+ rcirc-color
+ recursion-indicator
+ regexp-builder (also known as ~re-builder~)
+ rg (rg.el)
+ ripgrep
+ rmail
+ rst-mode
+ ruler-mode
+ sesman
+ shell-script-mode
+ shortdoc
+ show-paren-mode
+ shr
+ side-notes
+ sieve-mode
+ skewer-mode
+ slime (slbd)
+ sly
+ smart-mode-line
+ smerge
+ speedbar
+ spell-fu
+ stripes
+ suggest
+ switch-window
+ swiper
+ symbol-overlay
+ syslog-mode
+ tab-bar-mode
+ tab-line-mode
+ table (built-in {{{file(table.el)}}})
+ telega
+ terraform-mode
+ term
+ textsec
+ transient (pop-up windows such as Magit's)
+ trashed
+ tree-sitter
+ tty-menu
+ tuareg
+ typescript
+ undo-tree
+ vc ({{{file(vc-dir.el)}}}, {{{file(vc-hooks.el)}}})
+ vertico
+ vertico-quick
+ vimish-fold
+ visible-mark
+ visual-regexp
+ vterm
+ vundo
+ wcheck-mode
+ web-mode
+ wgrep
+ which-function-mode
+ which-key
+ whitespace-mode
+ window-divider-mode
+ writegood-mode
+ woman
+ xah-elisp-mode
+ xterm-color (and ansi-colors)
+ yaml-mode
+ yasnippet
+ ztree
Plus many other miscellaneous faces that are provided by Emacs.
** Indirectly covered packages
:properties:
:custom_id: h:2cb359c7-3a84-4262-bab3-dcdc1d0034d7
:end:
#+cindex: Implicitly supported packages
These do not require any extra styles because they are configured to
inherit from some basic faces or their dependencies which are directly
supported by the themes.
+ ag
+ apropos
+ apt-sources-list
+ bbdb
+ bm
+ breakpoint (provided by the built-in {{{file(gdb-mi.el)}}} library)
+ buffer-expose
+ bufler
+ counsel-notmuch
+ counsel-org-capture-string
+ css-mode
+ dashboard (emacs-dashboard)
+ define-word
+ denote
+ disk-usage
+ dtache
+ dynamic-ruler
+ easy-kill
+ ebdb
+ edit-indirect
+ egerrit
+ elfeed-summary
+ evil-owl
+ flyspell-correct
+ fortran-mode
+ freeze-it
+ forge
+ git-walktree
+ goggles
+ highlight-defined
+ highlight-escape-sequences (~hes-mode~)
+ icomplete-vertical
+ i3wm-config-mode
+ lin
+ minibuffer-line
+ no-emoji
+ org-remark
+ parrot
+ perl-mode
+ php-mode
+ pulsar
+ rjsx-mode
+ side-hustle
+ spell-fu
+ swift-mode
+ tab-bar-echo-area
+ tide
+ undo-hl
+ vdiff
+ vertico-indexed
+ vertico-mouse
+ xref
* Notes on individual packages
:properties:
:custom_id: h:4c4d901a-84d7-4f20-bd99-0808c2b06eba
:end:
This section covers information that may be of interest to users of
individual packages.
** Note on calendar.el weekday and weekend colors
:properties:
:custom_id: h:b2db46fb-32f4-44fd-8e11-d2b261cf51ae
:end:
By default, the {{{kbd(M-x calendar)}}} interface differentiates weekdays from
weekends by applying a gray color to the former and a faint red to the
latter. The idea for this approach is that the weekend should serve as
a subtle warning that no work is supposed to be done on that day, per
the design of traditional calendars.
Users who prefer all days to look the same can configure the variable
~calendar-weekend-days~ to either use gray of weekdays or the faint red of
weekends uniformly.
#+begin_src emacs-lisp
;; All are treated like weekdays (gray color)
(setq calendar-weekend-days nil)
;; All are treated like weekends (red-faint color)
(setq calendar-weekend-days (number-sequence 0 6))
;; The default marks the Saturday and Sunday as the weekend
(setq calendar-weekend-days '(0 6))
#+end_src
For changes to take effect, the Calendar buffer needs to be generated
anew.
** Note on git-gutter in Doom Emacs
:PROPERTIES:
:CUSTOM_ID: h:a195e37c-e58c-4148-b254-8ba1ed8a731a
:END:
The ~git-gutter~ and ~git-gutter-fr~ packages default to drawing
bitmaps for the indicators they display (e.g. bitmap of a plus sign
for added lines). In Doom Emacs, these bitmaps are replaced with
contiguous lines which may look nicer, but require a change to the
foreground of the relevant faces to yield the desired color
combinations.
Since this is Doom-specific, we urge users to apply changes in their
local setup. Below is some sample code, based on what we cover at
length elsewhere in this manual:
[[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]].
[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]].
#+begin_src emacs-lisp
(defun my-modus-themes-custom-faces (&rest _)
(modus-themes-with-colors
(custom-set-faces
;; Make foreground the same as background for a uniform bar on
;; Doom Emacs.
;;
;; Doom should not be implementing such hacks because themes
;; cannot support them:
;; <https://protesilaos.com/codelog/2022-08-04-doom-git-gutter-modus-themes/>.
`(git-gutter-fr:added ((,c :foreground ,bg-added-fringe)))
`(git-gutter-fr:deleted ((,c :foreground ,bg-removed-fringe)))
`(git-gutter-fr:modified ((,c :foreground ,bg-changed-fringe))))))
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces)
#+end_src
[[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][Using a hook at the post-load-theme phase]].
As always, re-load the theme for changes to take effect.
If the above does not work, try this instead:
#+begin_src emacs-lisp
(after! modus-themes
(modus-themes-with-colors
(custom-set-faces
;; Make foreground the same as background for a uniform bar on
;; Doom Emacs.
;;
;; Doom should not be implementing such hacks because themes
;; cannot support them:
;; <https://protesilaos.com/codelog/2022-08-04-doom-git-gutter-modus-themes/>.
`(git-gutter-fr:added ((,c :foreground ,bg-added-intense)))
`(git-gutter-fr:deleted ((,c :foreground ,bg-removed-intense)))
`(git-gutter-fr:modified ((,c :foreground ,bg-changed-intense))))))
#+end_src
** Note on php-mode multiline comments
:PROPERTIES:
:CUSTOM_ID: h:d0a3157b-9c04-46e8-8742-5fb2a7ae8798
:END:
Depending on your build of Emacs and/or the environment it runs in,
multiline comments in PHP with the ~php-mode~ package use the
~font-lock-doc-face~ instead of ~font-lock-comment-face~.
This seems to make all comments use the appropriate face:
#+begin_src emacs-lisp
(defun my-multine-comments (&rest _)
(setq-local c-doc-face-name 'font-lock-comment-face))
(add-hook 'php-mode-hook #'my-multine-comments)
#+end_src
As always, re-load the theme for changes to take effect.
** Note on underlines in compilation buffers
:properties:
:custom_id: h:420f5a33-c7a9-4112-9b04-eaf2cbad96bd
:end:
Various buffers that produce compilation results or run tests on code
apply an underline to the file names they reference or to relevant
messages. Users may consider this unnecessary or excessive.
To outright disable the effect, use this (buffers need to be generated
anew):
#+begin_src emacs-lisp
(setq compilation-message-face nil)
#+end_src
If some element of differentiation is still desired, a good option is to
render the affected text with the ~italic~ face:
#+begin_src emacs-lisp
(setq compilation-message-face 'italic)
#+end_src
[[#h:2793a224-2109-4f61-a106-721c57c01375][Configure bold and italic faces]].
** Note on inline Latex in Org buffers
:properties:
:custom_id: h:dd8478da-f56a-45cd-b199-b836c85c3c5a
:end:
Org can work with inline latex and related syntax. To actually fontify
those constructs, set the variable ~org-highlight-latex-and-related~ to
the desired list of values (per its doc string). For example:
#+begin_src emacs-lisp
(setq org-highlight-latex-and-related '(latex script))
#+end_src
Remember to use {{{kbd(M-x org-mode-restart)}}} for changes to take effect.
** Note on dimmer.el
:properties:
:custom_id: h:8eb4b758-d318-4480-9ead-357a571beb93
:end:
The {{{file(dimmer.el)}}} library by Neil Okamoto can be configured to
automatically dim the colors of inactive Emacs windows. To guarantee
consistent results with the Modus themes, we suggest some tweaks to the
default styles, such as in this minimal setup:
#+begin_src emacs-lisp
(use-package dimmer
:config
(setq dimmer-fraction 0.3)
(setq dimmer-adjustment-mode :foreground)
(setq dimmer-use-colorspace :rgb)
(dimmer-mode 1))
#+end_src
Of the above, we strongly recommend the RGB color space because it is
the one that remains faithful to the hueness of the colors used by the
themes. Whereas the default CIELAB space has a tendency to distort
colors in addition to applying the dim effect, which can be somewhat
disorienting.
The value of the ~dimmer-fraction~ has been selected empirically. Users
might prefer to tweak it further (increasing it makes the dim effect
more pronounced).
Changing the ~dimmer-adjustment-mode~ is a matter of preference. Though
because the Modus themes use black and white as their base colors, any
other value for that variable will turn the main background gray. This
inadvertently leads to the opposite of the intended utility of this
package: it draws too much attention to unfocused windows.
** Note on display-fill-column-indicator-mode
:properties:
:custom_id: h:2a602816-bc1b-45bf-9675-4cbbd7bf6cab
:end:
The ~display-fill-column-indicator-mode~ uses a typographic character to
draw its line. This has the downside of creating a dashed line. The
dashes are further apart depending on how tall the font's glyph height
is and what integer the ~line-spacing~ is set to.
At the theme level we eliminate this effect by making the character one
pixel tall: the line is contiguous. Users who prefer the dashed line
are advised to change the ~fill-column-indicator~ face, as explained
elsewhere in this document. For example:
#+begin_src emacs-lisp
(modus-themes-with-colors
(custom-set-faces
`(fill-column-indicator ((,c :foreground ,bg-active)))))
#+end_src
[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]].
To make the line thicker, set the height to be equal to the base font
size instead of the one pixel we use. This is done by specifying a rate
instead of an absolute number, as in =:height 1.0= versus =:height 1=.
For example:
#+begin_src emacs-lisp
(modus-themes-with-colors
(custom-set-faces
`(fill-column-indicator ((,c :height 1.0 :background ,bg-inactive :foreground ,bg-inactive)))))
#+end_src
** Note on highlight-parentheses.el
:PROPERTIES:
:CUSTOM_ID: h:24bab397-dcb2-421d-aa6e-ec5bd622b913
:END:
The ~highlight-parentheses~ package provides contextual coloration of
surrounding parentheses, highlighting only those which are around the
point. The package expects users to customize the applicable colors
on their own by configuring certain variables.
To make the Modus themes work as expected with this, we need to use some
of the techniques that are discussed at length in the various
"Do-It-Yourself" (DIY) sections, which provide insight into the more
advanced customization options of the themes.
[[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]].
In the following example, we are assuming that the user wants to (i)
reuse color variables provided by the themes, (ii) be able to retain
their tweaks while switching between ~modus-operandi~ and ~modus-vivendi~,
and (iii) have the option to highlight either the foreground of the
parentheses or the background as well.
We start by defining our own variable, which will serve as a toggle
between foreground and background coloration styles:
#+begin_src emacs-lisp
(defvar my-highlight-parentheses-use-background t
"Prefer `highlight-parentheses-background-colors'.")
#+end_src
Then we can update our preference with this:
#+begin_src emacs-lisp
;; Set to nil to disable backgrounds.
(setq my-highlight-parentheses-use-background nil)
#+end_src
To reuse colors from the themes, we must wrap our code in the
~modus-themes-with-colors~ macro. Our implementation must interface with
the variables ~highlight-parentheses-background-colors~ and/or
~highlight-parentheses-colors~.
So we can have something like this (the doc string of
~modus-themes-with-colors~ explains where the names of the colors can be
found):
#+begin_src emacs-lisp
(modus-themes-with-colors
;; Our preference for setting either background or foreground
;; styles, depending on `my-highlight-parentheses-use-background'.
(if my-highlight-parentheses-use-background
;; Here we set color combinations that involve both a background
;; and a foreground value.
(setq highlight-parentheses-background-colors (list bg-cyan-intense
bg-magenta-intense
bg-green-intense
bg-yellow-intense)
highlight-parentheses-colors (list cyan
magenta
green
yellow))
;; And here we pass only foreground colors while disabling any
;; backgrounds.
(setq highlight-parentheses-colors (list green-intense
magenta-intense
blue-intense
red-intense)
highlight-parentheses-background-colors nil)))
;; Include this if you also want to make the parentheses bold:
(set-face-attribute 'highlight-parentheses-highlight nil :inherit 'bold)
;; Our changes must be evaluated before enabling the relevant mode, so
;; this comes last.
(global-highlight-parentheses-mode 1)
#+end_src
For our changes to persist while switching between the Modus themes, we
need to include them in a function which can then get passed to
~modus-themes-after-load-theme-hook~. This is the complete
implementation:
#+begin_src emacs-lisp
;; Configurations for `highlight-parentheses':
(require 'highlight-parentheses)
(defvar my-highlight-parentheses-use-background t
"Prefer `highlight-parentheses-background-colors'.")
(setq my-highlight-parentheses-use-background nil) ; Set to nil to disable backgrounds
(defun my-modus-themes-highlight-parentheses (&rest _)
(modus-themes-with-colors
;; Our preference for setting either background or foreground
;; styles, depending on `my-highlight-parentheses-use-background'.
(if my-highlight-parentheses-use-background
;; Here we set color combinations that involve both a background
;; and a foreground value.
(setq highlight-parentheses-background-colors (list bg-cyan-intense
bg-magenta-intense
bg-green-intense
bg-yellow-intense)
highlight-parentheses-colors (list cyan
magenta
green
yellow))
;; And here we pass only foreground colors while disabling any
;; backgrounds.
(setq highlight-parentheses-colors (list green-intense
magenta-intense
blue-intense
red-intense)
highlight-parentheses-background-colors nil)))
;; Include this if you also want to make the parentheses bold:
(set-face-attribute 'highlight-parentheses-highlight nil :inherit 'bold)
;; Our changes must be evaluated before enabling the relevant mode, so
;; this comes last.
(global-highlight-parentheses-mode 1))
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-highlight-parentheses)
#+end_src
[[#h:d87673fe-2ce1-4c80-a4b8-be36ca9f2d24][Using a hook at the post-load-theme phase]].
As always, re-load the theme for changes to take effect.
** Note on mmm-mode.el background colors
:properties:
:custom_id: h:99cf0d6c-e478-4e26-9932-3bf3427d13f6
:end:
The faces used by {{{file(mmm-mode.el)}}} are expected to have a colorful
background, while they should not touch any foreground value. The idea
is that they must not interfere with existing fontification. Those
background colors need to be distinct from each other, such as an
unambiguous red juxtaposed with a clear blue.
While this design may be internally consistent with the raison d'être of
that library, it inevitably produces inaccessible color combinations.
There are two competing goals at play:
1. Legibility of the text, understood as the contrast ratio between the
background and the foreground.
2. Semantic precision of each face which entails faithfulness to
color-coding of the underlying background.
As the Modus themes are designed with the express purpose of conforming
with the first point, we have to forgo the apparent color-coding of the
background elements. Instead we use subtle colors that do not undermine
the legibility of the affected text while they still offer a sense of
added context.
Users who might prefer to fall below the minimum 7:1 contrast ratio in
relative luminance (the accessibility target we conform with), can opt
to configure the relevant faces on their own.
[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]].
This example uses more vivid background colors, though it comes at the
very high cost of degraded legibility.
#+begin_src emacs-lisp
(modus-themes-with-colors
(custom-set-faces
`(mmm-cleanup-submode-face ((,c :background ,bg-yellow-intense)))
`(mmm-code-submode-face ((,c :background ,bg-inactive)))
`(mmm-comment-submode-face ((,c :background ,bg-blue-intense)))
`(mmm-declaration-submode-face ((,c :background ,bg-cyan-intense)))
`(mmm-default-submode-face ((,c :background ,bg-dim)))
`(mmm-init-submode-face ((,c :background ,bg-magenta-intense)))
`(mmm-output-submode-face ((,c :background ,bg-red-intense)))
`(mmm-special-submode-face ((,c :background ,bg-green-intense)))))
#+end_src
** Note on prism.el
:properties:
:alt_title: Note for prism
:custom_id: h:a94272e0-99da-4149-9e80-11a7e67a2cf2
:end:
This package by Adam Porter, aka "alphapapa" or "github-alphapapa",
implements an alternative to the typical coloration of code. Instead of
highlighting the syntactic constructs, it applies color to different
levels of depth in the code structure.
As {{{file(prism.el)}}} offers a broad range of customizations, we
cannot style it directly at the theme level: that would run contrary
to the spirit of the package. Instead, we may offer preset color
schemes. Those should offer a starting point for users to adapt to
their needs.
In the following code snippets, we employ the ~modus-themes-with-colors~
macro: [[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Use theme colors in code with modus-themes-with-colors]].
These are the minimum recommended settings with 16 colors:
#+begin_src emacs-lisp
(setq prism-num-faces 16)
(prism-set-colors
:desaturations '(0) ; do not change---may lower the contrast ratio
:lightens '(0) ; same
:colors (modus-themes-with-colors
(list fg-main
magenta
cyan-cooler
magenta-cooler
blue
magenta-warmer
cyan-warmer
red-cooler
green
fg-main
cyan
yellow
blue-warmer
red-warmer
green-cooler
yellow-faint)))
#+end_src
With 8 colors:
#+begin_src emacs-lisp
(setq prism-num-faces 8)
(prism-set-colors
:desaturations '(0) ; do not change---may lower the contrast ratio
:lightens '(0) ; same
:colors (modus-themes-with-colors
(list blue
magenta
magenta-cooler
cyan-cooler
fg-main
blue-warmer
red-cooler
cyan)))
#+end_src
And this is with 4 colors, which produces results that are the closest
to the themes' default aesthetic:
#+begin_src emacs-lisp
(setq prism-num-faces 4)
(prism-set-colors
:desaturations '(0) ; do not change---may lower the contrast ratio
:lightens '(0) ; same
:colors (modus-themes-with-colors
(list blue
magenta
magenta-cooler
green-warmer)))
#+end_src
If you need to apply desaturation and lightening, you can use what the
{{{file(prism.el)}}} documentation recommends, like this (adapting to the
examples with the 4, 8, 16 colors):
#+begin_src emacs-lisp
(prism-set-colors
:desaturations (cl-loop for i from 0 below 16 collect (* i 2.5))
:lightens (cl-loop for i from 0 below 16 collect (* i 2.5))
:colors (modus-themes-with-colors
(list fg-main
cyan-cooler
magenta-cooler
magenta)))
#+end_src
** Note on company-mode overlay pop-up
:properties:
:custom_id: h:20cef8c4-d11f-4053-8b2c-2872925780b1
:end:
By default, the ~company-mode~ pop-up that lists completion candidates is
drawn using an overlay. This creates alignment issues every time it is
placed above a piece of text that has a different height than the
default.
The solution recommended by the project's maintainer is to use an
alternative front-end for drawing the pop-up which draws child frames
instead of overlays.[fn::
https://github.com/company-mode/company-mode/issues/1010][fn::
https://github.com/tumashu/company-posframe/]
Also consider the ~corfu~ package.
** Note on ERC escaped color sequences
:properties:
:custom_id: h:98bdf319-1e32-4469-8a01-771200fba65c
:end:
The built-in IRC client ~erc~ has the ability to colorize any text using
escape sequences that start with =^C= (inserted with {{{kbd(C-q C-c)}}}) and are
followed by a number for the foreground and background.[fn:: This page
explains the basics, though it is not specific to Emacs:
https://www.mirc.com/colors.html] Possible numbers are 0-15, with the
first entry being the foreground and the second the background,
separated by a comma. Like this =^C1,6=. The minimum setup is this:
#+begin_src emacs-lisp
(add-to-list 'erc-modules 'irccontrols)
(setq erc-interpret-controls-p t
erc-interpret-mirc-color t)
#+end_src
As this allows users the chance to make arbitrary combinations, it is
impossible to guarantee a consistently high contrast ratio. All we can
we do is provide guidance on the combinations that satisfy the
accessibility standard of the themes:
+ Modus Operandi :: Use foreground color 1 for all backgrounds from
2-15. Like so: {{{kbd(C-q C-c1,N)}}} where =N= is the background.
+ Modus Vivendi :: Use foreground color 0 for all backgrounds from
2-13. Use foreground =1= for backgrounds 14, 15.
Colors 0 and 1 are white and black respectively. So combine them
together, if you must.
** Note on powerline or spaceline
:properties:
:custom_id: h:9130a8ba-d8e3-41be-a58b-3cb1eb7b6d17
:end:
Both Powerline and Spaceline package users will likely need to use the
command ~powerline-reset~ whenever they make changes to their themes
and/or mode line setup.
** Note on SHR colors
:properties:
:custom_id: h:4cc767dc-ffef-4c5c-9f10-82eb7b8921bf
:end:
Emacs's HTML rendering library ({{{file(shr.el)}}}) may need explicit
configuration to respect the theme's colors instead of whatever
specifications the webpage provides.
Consult the doc string of ~shr-use-colors~.
** Note on SHR fonts
:properties:
:custom_id: h:e6c5451f-6763-4be7-8fdb-b4706a422a4c
:end:
#+cindex: Fonts in EWW, Elfeed, Ement, and SHR
By default, packages that build on top of the Simple HTML Remember
(~shr~) use proportionately spaced fonts. This is controlled by the
user option ~shr-use-fonts~, which is set to non-~nil~ by default. To
use the standard font instead, set that variable to ~nil~.
[[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and others]].
Packages affected by this are:
+ elfeed
+ ement
+ eww
This is a non-exhaustive list.
** Note on Ement colors and fonts
:properties:
:custom_id: h:8e636056-356c-4ca7-bc78-ebe61031f585
:end:
The {{{file(ement.el)}}} library by Adam Porter (also known as
"alphapapa") defaults to a method of colorizing usernames in a rainbow
style. This is controlled by the user option ~ement-room-prism~ and
can be disabled with:
#+begin_src emacs-lisp
(setq ement-room-prism nil)
#+end_src
The contrast ratio of these colors is governed by another user option:
~ement-room-prism-minimum-contrast~. By default, it is set to 6 which is
slightly below our nominal target. Try this instead:
#+begin_src emacs-lisp
(setq ement-room-prism-minimum-contrast 7)
#+end_src
With regard to fonts, Ement depends on ~shr~ ([[#h:e6c5451f-6763-4be7-8fdb-b4706a422a4c][Note on SHR fonts]]).
Since we are here, here is an excerpt from Ement's source code:
#+begin_src emacs-lisp
(defcustom ement-room-prism-minimum-contrast 6
"Attempt to enforce this minimum contrast ratio for user faces.
This should be a reasonable number from, e.g. 0-7 or so."
;; Prot would almost approve of this default. :) I would go all the way
;; to 7, but 6 already significantly dilutes the colors in some cases.
:type 'number)
#+end_src
Yes, I do approve of that default. Even a 4.5 (the WCAG AA rating)
would be a good baseline for many themes and/or user configurations.
Our target is the highest of the sort, though we do not demand that
everyone conforms with it.
** Note on pdf-tools link hints
:properties:
:custom_id: h:2659d13e-b1a5-416c-9a89-7c3ce3a76574
:end:
Hints are drawn by [[https://imagemagick.org/][ImageMagick]], not Emacs, i.e., ImageMagick doesn't
know about the hint face unless you tell ImageMagick about it. By
default, only the foreground and background color attributes are
passed. The below snippet adds to those the various font attributes. As
it queries various faces, specifically ~pdf-links-read-link~ and the faces
it inherits, it needs to be added to your initialization file after
you've customized any faces.
#+begin_src emacs-lisp
(use-package pdf-links
:config
(let ((spec
(apply #'append
(mapcar
(lambda (name)
(list name
(face-attribute 'pdf-links-read-link
name nil 'default)))
'(:family :width :weight :slant)))))
(setq pdf-links-read-link-convert-commands
`("-density" "96"
"-family" ,(plist-get spec :family)
"-stretch" ,(let* ((width (plist-get spec :width))
(name (symbol-name width)))
(replace-regexp-in-string "-" ""
(capitalize name)))
"-weight" ,(pcase (plist-get spec :weight)
('ultra-light "Thin")
('extra-light "ExtraLight")
('light "Light")
('semi-bold "SemiBold")
('bold "Bold")
('extra-bold "ExtraBold")
('ultra-bold "Black")
(_weight "Normal"))
"-style" ,(pcase (plist-get spec :slant)
('italic "Italic")
('oblique "Oblique")
(_slant "Normal"))
"-pointsize" "%P"
"-undercolor" "%f"
"-fill" "%b"
"-draw" "text %X,%Y '%c'"))))
#+end_src
** Note on the Notmuch logo
:properties:
:custom_id: h:636af312-54a5-4918-84a6-0698e85a3c6d
:end:
By default, the "hello" buffer of Notmuch includes a header with the
programs' logo and a couple of buttons. The logo has the effect of
enlarging the height of the line, which negatively impacts the shape of
those buttons. Disabling the logo fixes the problem:
#+begin_src emacs-lisp
(setq notmuch-show-logo nil)
#+end_src
** Note on goto-address-mode faces
:PROPERTIES:
:CUSTOM_ID: h:2d74236a-e41c-4616-8735-75f949a67334
:END:
The built-in ~goto-address-mode~ uses heuristics to identify URLs and
email addresses in the current buffer. It then applies a face to them
to change their style. Some packages, such as ~notmuch~, use this
minor-mode automatically.
The faces are not declared with ~defface~, meaning that it is better
that the theme does not modify them. The user is thus encouraged to
consider including (or equivalent) this in their setup:
#+begin_src emacs-lisp
(setq goto-address-url-face 'link
goto-address-url-mouse-face 'highlight
goto-address-mail-face 'link
goto-address-mail-mouse-face 'highlight)
#+end_src
My personal preference is to set ~goto-address-mail-face~ to ~nil~, as
it otherwise adds too much visual noise to the buffer (email addresses
stand out more, due to the use of the uncommon =@= character but also
because they are often enclosed in angled brackets).
* Frequently Asked Questions
:properties:
:custom_id: h:b3384767-30d3-4484-ba7f-081729f03a47
:end:
#+cindex: Frequently Asked Questions
In this section we provide answers related to some aspects of the Modus
themes' design and application.
** Is the contrast ratio about adjacent colors?
:properties:
:custom_id: h:5ce7ae2e-9348-4e55-b4cf-9302345b1826
:end:
#+cindex: Contrast between adjacent colors
The minimum contrast ratio in relative luminance that the themes conform
with always refers to any given combination of background and foreground
colors. If we have some blue colored text next to a magenta one, both
against a white background, we do not mean to imply that blue:magenta is
7:1 in terms of relative luminance. Rather, we state that blue:white
and magenta:white each are 7:1 or higher.
The point of reference is always the background. Because colors have
about the same minimum distance in luminance from their backdrop, they
necessarily are fairly close to each other in this measure. A possible
blue:magenta combination would naturally be around 1:1 in contrast of
the sort here considered.
To differentiate between sequential colors, we rely on hueness by
mapping contrasting hues to adjacent constructs, while avoiding
exaggerations. A blue next to a magenta can be told apart regardless of
their respective contrast ratio against their common background.
Exceptions would be tiny characters in arguably not so realistic cases,
such as two dots drawn side-by-side which for some reason would need to
be colored differently. They would still be legible though, which is
the primary objective of the Modus themes.
** What does it mean to avoid exaggerations?
:properties:
:custom_id: h:44284e1f-fab8-4c4f-92f0-544728a7c91e
:end:
#+cindex: Avoiding exaggerations in design
The Modus themes are designed with restraint, so that their default
looks do not overdo it with the application of color.
[[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization Options]].
This is the non-quantifiable aspect of the themes' design: the artistic
part, if you will. There are a lot of cases where color can be used
inconsiderately, without accounting for layout, typographic, or other
properties of the presentation. For example, two headings with distinct
markers, such as leading asterisks in Org buffers, do not have to have
highly contrasting hues between them in order to be told apart: the
added element of contrast in hueness does not contribute significantly
more to the distinction between the headings than colors whose hues are
relatively closer to each other in the color space.
Exaggerations can be hard to anticipate or identify. Multiple shades of
blue and magenta in the same context may not seem optimal: one might
think that it would be better to use highly contrasting hues to ensure
that all colors stand out, such as by placing blue next to yellow, next
to magenta, and green. That would, however, be a case of design for its
own sake; a case where color is being applied without consideration of
its end results in the given context. Too many contrasting hues in
close proximity force an erratic rate to how the eye jumps from one
piece of text to the next. Whereas multiple shades of, say, blue and
magenta can suffice to tell things apart and avoid excess coloration: a
harmonious rhythm.
** Why are colors mostly variants of blue, magenta, cyan?
:properties:
:custom_id: h:0b26cb47-9733-4cb1-87d9-50850cb0386e
:end:
#+cindex: Innate color qualities of the palette
Due to the innate properties of color, some options are better than
others for the accessibility purposes of the themes, the stylistic
consistency between ~modus-operandi~ and ~modus-vivendi~, and the avoidance
of exaggerations in design.
[[#h:44284e1f-fab8-4c4f-92f0-544728a7c91e][What does it mean to avoid exaggerations?]]
What we describe as color is a function of three distinct channels of
light: red, green, blue. In hexadecimal RGB notation, a color value is
read as three pairs of red, green, and blue light: =#RRGGBB=. Of those
three, the most luminant is green, while the least luminant is blue.
The three basic colors represent each of the channels of light. They
can be intermixed to give us six colors: red and green derive yellow,
green and blue make cyan, red and blue turn into magenta.
We can test the luminance of each of those against white and black to
get a sense of how not all colors are equally good for accessibility
(white is =#ffffff=, which means that all three light channels are fully
luminated, while black is =#000000= meaning that no light is present
(notwithstanding display technology)).
#+begin_example
| Name | | #ffffff | #000000 |
|---------+---------+---------+---------|
| red | #ff0000 | 4.00 | 5.25 |
| yellow | #ffff00 | 1.07 | 19.56 |
| green | #00ff00 | 1.37 | 15.30 |
| cyan | #00ffff | 1.25 | 16.75 |
| blue | #0000ff | 8.59 | 2.44 |
| magenta | #ff00ff | 3.14 | 6.70 |
#+end_example
[[#h:02e25930-e71a-493d-828a-8907fc80f874][Measure color contrast]].
By reading this table we learn that every color that has a high level of
green light (green, yellow, cyan) is virtually unreadable against a
white background and, conversely, can be easily read against black.
We can then infer that red and blue, in different combinations, with
green acting as calibrator for luminance, will give us fairly moderate
colors that pass the 7:1 target. Blue with a bit of green produce
appropriate variants of cyan. Similarly, blue combined with some red
and hints of green give us suitable shades of purple.
Due to the need of maintaining some difference in hueness between
adjacent colors, it is not possible to make red, green, and yellow the
main colors, because blue cannot be used to control their luminance and,
thus the relevant space will shrink considerably.
[[#h:5ce7ae2e-9348-4e55-b4cf-9302345b1826][Is the contrast ratio about adjacent colors?]]
This phenomenon is best illustrated by the following table that measures
the relative luminance of shades of red, yellow, magenta against white:
#+begin_example
| | #ffffff |
|---------+---------|
| #990000 | 8.92 |
| #995500 | 5.75 |
| #990099 | 7.46 |
#+end_example
We notice that equal values of red and blue light in =#990099= (magenta
shade) do not lead to a considerable change in luminance compared with
=#990000= (red variant). Whereas less amount of green light in =#995500=
leads to a major drop in luminance relative to white. It follows that
using the green channel of light to calibrate the luminance of colors is
more effective than trying to do the same with either red or blue (the
latter is the least effective in that regard).
When we need to work with several colors, it is always better to have
sufficient maneuvering space, especially since we cannot pick arbitrary
colors but only those that satisfy the accessibility objectives of the
themes.
As for why we do not mostly use green, yellow, cyan for the dark theme,
it is because those colors are far more luminant than their counterparts
on the other side of the spectrum, so to ensure that they all have about
the same contrast ratios we would have to alter their hueness
considerably. In short, the effect would not be optimal as it would
lead to exaggerations. Plus, it would make ~modus-vivendi~ look
completely different than ~modus-operandi~, to the effect that the two
could not be properly considered part of the same project.
** What is the best setup for legibility?
:properties:
:custom_id: h:f60cc2ae-129d-47c0-9849-4f6bbd87d8be
:end:
#+cindex: General setup for readability
The Modus themes can be conceptually simplified as combinations of color
values that account for relative luminance and inner harmony. Those
qualities do not guarantee that every end-user will have the same
experience, due to differences between people, but also because of
variances in hardware capabilities and configurations. For the purposes
of this document, we may only provide suggestions pertaining to the
latter case.
~modus-operandi~ is best used outdoors or in a room that either gets
direct sunlight or has plenty of light. Whereas ~modus-vivendi~ works
better when there is not a lot of sunshine or the room has a source of
light that is preferably a faint and/or warm one. It is possible to use
~modus-operandi~ at night and ~modus-vivendi~ during the day, though that
will depend on several variables, such as one's overall perception of
color, the paint on the walls and how that contributes to the impression
of lightness in the room, the sense of space within the eye's peripheral
vision, hardware specifications, and environmental factors.
In general, an additional source of light other than that of the monitor
can help reduce eye strain: the eyes are more relaxed when they do not
have to focus on one point to gather light.
The monitor's display settings must be accounted for. Gamma values, in
particular, need to be calibrated to neither amplify nor distort the
perception of black. Same principle for sharpness, brightness, and
contrast as determined by the hardware, which all have an effect on how
text is read on the screen.
There are software level methods on offer, such as the XrandR utility
for the X Window System (X.org), which can make gamma corrections for
each of the three channels of light (red, green, blue). For example:
: xrandr --output LVDS1 --brightness 1.0 --gamma 0.76:0.75:0.68
Typography is another variable. Some font families are blurry at small
point sizes. Others may have a regular weight that is lighter (thinner)
than that of their peers which may, under certain circumstances, cause a
halo effect around each glyph.
The gist is that legibility cannot be fully solved at the theme level.
The color combinations may have been optimized for accessibility, though
the remaining contributing factors in each case need to be considered in
full.
** Are these color schemes?
:properties:
:custom_id: h:a956dbd3-8fd2-4f5d-8b01-5f881268cf2b
:end:
#+cindex: Themes, not color schemes
No, the Modus themes are not color schemes.
A color scheme is a collection of colors. A good color scheme is a
combination of colors with an inner logic or abstract structure.
A theme is a set of patterns that are applied across different contexts.
A good theme is one that does so with consistency, though not
uniformity.
In practical terms, a color scheme is what one uses when, for example,
they replace the first sixteen escape sequences of a terminal emulator
with color values of their preference. The terminal offers the option
to choose, say, the exact value of what counts as "red", but does not
provide the means to control where that is mapped to and whether it
should also have other qualities such as a bold weight for the
underlying text or an added background color. In contradistinction,
Emacs uses constructs known as "faces" which allow the user/developer
to specify where a given color will be used and whether it should be
accompanied by other typographic or stylistic attributes.
By configuring the multitude of faces on offer we thus control both
which colors are applied and how they appear in their context. When a
package wants to render each instance of "foo" with the "bar" face, it
is not requesting a specific color, which makes things considerably more
flexible as we can treat "bar" in its own right without necessarily
having to use some color value that we hardcoded somewhere.
Which brings us to the distinction between consistency and uniformity
where our goal is always the former: we want things to look similar
across all interfaces, but we must never force a visual identity where
that runs contrary to the functionality of the given interface. For
instance, all links are underlined by default yet there are cases such
as when viewing listings of emails in Gnus (and Mu4e, Notmuch) where (i)
it is already understood that one must follow the indicator or headline
to view its contents and (ii) underlining everything would make the
interface virtually unusable.
Again, one must exercise judgment in order to avoid discrimination,
where "discrimination" refers to:
+ The treatment of substantially different magnitudes as if they were of
the same class.
+ Or the treatment of the same class of magnitudes as if they were of a
different class.
(To treat similar things differently; to treat dissimilar things alike.)
If, in other words, one is to enforce uniformity without accounting
for the particular requirements of each case---the contextual demands
for usability beyond matters of color---they are making a
not-so-obvious error of treating different cases as if they were the
same.
The Modus themes prioritize "thematic consistency" over abstract harmony
or regularity among their applicable colors. In concrete terms, we do
not claim that, say, our yellows are the best complements for our blues
because we generally avoid using complementary colors side-by-side, so
it is wrong to optimize for a decontextualised blue+yellow combination.
Not to imply that our colors do not work well together because they do,
just to clarify that consistency of context is what themes must strive
for, and that requires widening the scope of the design beyond the
particularities of a color scheme.
Long story short: color schemes and themes have different requirements.
Please do not conflate the two.
** Port the Modus themes to other platforms?
:properties:
:custom_id: h:7156b949-917d-488e-9a72-59f70d80729c
:end:
#+cindex: Porting the themes to other editors
There is no plan to port the themes to other platforms or text editors.
I (Protesilaos) only use GNU Emacs and thus cannot maintain code that
targets software I am either not familiar with or am not using on a
daily basis.
While it is possible to produce a simulacrum based on a given template,
doing so would run contrary to how this project is maintained where
details matter greatly.
Each program has its own requirements so it won't always be
possible---or indeed desirable---to have 1:1 correspondence between
what applies to Emacs and what should be done elsewhere. No port
should ever strive to be a copy of the Emacs implementation, as no
other program is an Emacs equivalent, but instead try to follow the
spirit of the design. For example, some of the customization options
accept a list as their value, or an alist, which may not be possible
to reproduce on other platforms.
[[#h:bf1c82f2-46c7-4eb2-ad00-dd11fdd8b53f][Customization options]].
In other words, if something must be done differently on a certain
editor then that is acceptable so long as (i) the accessibility
standards are not compromised and (ii) the overall character of the
themes remains consistent.
The former criterion should be crystal clear as it pertains to the
scientific foundations of the themes: high legibility and taking care
of the needs of users with red-green/blue-yellow color deficiency
(deuteranopia and tritanopia) by avoiding red+green color coding
paradigms and/or by providing yellow+blue variants for deuteranopia
and red+cyan for tritanopia ([[#h:f0f3dbcb-602d-40cf-b918-8f929c441baf][Overview]]).
The latter criterion is the "je ne sais quoi" of the artistic aspect of
the themes, which is partially fleshed out in this manual.
[[#h:b3384767-30d3-4484-ba7f-081729f03a47][Frequently Asked Questions]].
With regard to the artistic aspect (where "art" qua skill may amount to
an imprecise science), there is no hard-and-fast rule in effect as it
requires one to exercise discretion and make decisions based on
context-dependent information or constraints. As is true with most
things in life, when in doubt, do not cling on to the letter of the law
but try to understand its spirit.
For a trivial example: the curly underline that Emacs draws for spelling
errors is thinner than, e.g., what a graphical web browser has, so if I
was to design for an editor than has a thicker curly underline I would
make the applicable colors less intense to counterbalance the
typographic intensity of the added thickness.
With those granted, if anyone is willing to develop a port of the
themes, they are welcome to contact me and I will do my best to help
them in their efforts.
* Contributing
:properties:
:custom_id: h:9c3cd842-14b7-44d7-84b2-a5c8bc3fc3b1
:end:
This section documents the canonical sources of the themes and the ways
in which you can contribute to their ongoing development.
** Sources of the themes
:properties:
:custom_id: h:89504f1c-c9a1-4bd9-ab39-78fd0eddb47c
:end:
#+cindex: Sources of the themes
+ Package name (GNU ELPA): ~modus-themes~
+ Official manual: <https://protesilaos.com/emacs/modus-themes>
+ Change log: <https://protesilaos.com/emacs/modus-themes-changelog>
+ Color palette: <https://protesilaos.com/emacs/modus-themes-colors>
+ Sample pictures: <https://protesilaos.com/emacs/modus-themes-pictures>
+ Git repo on SourceHut: <https://git.sr.ht/~protesilaos/modus-themes>
- Mirrors:
+ GitHub: <https://github.com/protesilaos/modus-themes>
+ GitLab: <https://gitlab.com/protesilaos/modus-themes>
+ Mailing list: <https://lists.sr.ht/~protesilaos/modus-themes>
+ Backronym: My Old Display Unexpectedly Sharpened ... themes
** Issues you can help with
:properties:
:custom_id: h:6536c8d5-3f98-43ab-a787-b94120e735e8
:end:
#+cindex: Contributing
A few tasks you can help with by sending an email to the general
[[https://lists.sr.ht/~protesilaos/modus-themes][modus-themes public mailing list]].
+ Suggest refinements to packages that are covered.
+ Report packages not covered thus far.
+ Report bugs, inconsistencies, shortcomings.
+ Help expand the documentation of covered-but-not-styled packages.
+ Suggest refinements to the color palette.
+ Help expand this document or any other piece of documentation.
+ Send patches for code refinements (if you need, ask me for help with
Git---we all start out as beginners).
[[#h:111773e2-f26f-4b68-8c4f-9794ca6b9633][Patches require copyright assignment to the FSF]].
It is preferable that your feedback includes some screenshots, GIFs, or
short videos, as well as further instructions to reproduce a given
setup. Though this is not a requirement.
Whatever you do, bear in mind the overarching objective of the Modus
themes: to keep a contrast ratio that is greater or equal to 7:1 between
background and foreground colors. If a compromise is ever necessary
between aesthetics and accessibility, it shall always be made in the
interest of the latter.
** Patches require copyright assignment to the FSF
:properties:
:custom_id: h:111773e2-f26f-4b68-8c4f-9794ca6b9633
:end:
Code contributions are most welcome. For any major edit (more than 15
lines, or so, in aggregate per person), you need to make a copyright
assignment to the Free Software Foundation. This is necessary because
the themes are part of the upstream Emacs distribution: the FSF must at
all times be in a position to enforce the GNU General Public License.
Copyright assignment is a simple process. Check the request form below
(please adapt it accordingly). You must write an email to the address
mentioned in the form and then wait for the FSF to send you a legal
agreement. Sign the document and file it back to them. This could all
happen via email and take about a week. You are encouraged to go
through this process. You only need to do it once. It will allow you
to make contributions to Emacs in general.
#+begin_example text
Please email the following information to assign@gnu.org, and we
will send you the assignment form for your past and future changes.
Please use your full legal name (in ASCII characters) as the subject
line of the message.
REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES
[What is the name of the program or package you're contributing to?]
GNU Emacs
[Did you copy any files or text written by someone else in these changes?
Even if that material is free software, we need to know about it.]
Copied a few snippets from the same files I edited. Their author,
Protesilaos Stavrou, has already assigned copyright to the Free Software
Foundation.
[Do you have an employer who might have a basis to claim to own
your changes? Do you attend a school which might make such a claim?]
[For the copyright registration, what country are you a citizen of?]
[What year were you born?]
[Please write your email address here.]
[Please write your postal address here.]
[Which files have you changed so far, and which new files have you written
so far?]
#+end_example
* Acknowledgements
:properties:
:custom_id: h:95c3da23-217f-404e-b5f3-56c75760ebcf
:end:
#+cindex: Contributors
The Modus themes are a collective effort. Every bit of work matters.
+ Author/maintainer :: Protesilaos Stavrou.
+ Contributions to code or documentation :: Aleksei Gusev, Alex
Griffin, Anders Johansson, Antonio Ruiz, Basil L.{{{space()}}}
Contovounesios, Björn Lindström, Carlo Zancanaro, Christian Tietze,
Daniel Mendler, David Edmondson, Eli Zaretskii, Fritz Grabo, Gautier
Ponsinet, Illia Ostapyshyn, Kévin Le Gouguec, Koen van Greevenbroek,
Kostadin Ninev, Madhavan Krishnan, Manuel Giraud, Markus Beppler,
Matthew Stevenson, Mauro Aranda, Nacho Barrientos, Niall Dooley,
Nicolas De Jaeghere, Paul David, Philip Kaludercic, Pierre
Téchoueyres, Rudolf Adamkovič, Sergey Nichiporchik, Shreyas Ragavan,
Stefan Kangas, Stephen Berman, Stephen Gildea, Steve Downey, Tomasz
Hołubowicz, Utkarsh Singh, Vincent Murphy, Xinglu Chen, Yuanchen
Xie, fluentpwn, okamsn.
+ Ideas and user feedback :: Aaron Jensen, Adam Porter, Adam Spiers,
Adrian Manea, Aleksei Pirogov, Alex Griffin, Alex Koen, Alex
Peitsinis, Alexey Shmalko, Alok Singh, Anders Johansson, André
Alexandre Gomes, Andrew Tropin, Antonio Hernández Blas, Arif Rezai,
Augusto Stoffel, Basil L.{{{space()}}} Contovounesios, Bernd
Rellermeyer, Burgess Chang, Charlotte Van Petegem, Christian Tietze,
Christopher Dimech, Christopher League, Damien Cassou, Daniel
Mendler, Dario Gjorgjevski, David Edmondson, Davor Rotim, Divan
Santana, Eliraz Kedmi, Emanuele Michele Alberto Monterosso, Farasha
Euker, Feng Shu, Gautier Ponsinet, Gerry Agbobada, Gianluca Recchia,
Gonçalo Marrafa, Guilherme Semente, Gustavo Barros, Hörmetjan
Yiltiz, Ilja Kocken, Imran Khan, Iris Garcia, Ivan Popovych, James
Ferguson, Jeremy Friesen, Jerry Zhang, Johannes Grødem, John Haman,
John Wick, Jonas Collberg, Jorge Morais, Joshua O'Connor, Julio C.
Villasante, Kenta Usami, Kevin Fleming, Kévin Le Gouguec, Kevin
Kainan Li, Kostadin Ninev, Laith Bahodi, Lasse Lindner, Len Trigg,
Lennart C.{{{space()}}} Karssen, Luis Miguel Castañeda, Magne Hov, Manuel Giraud,
Manuel Uberti, Mark Bestley, Mark Burton, Mark Simpson, Marko Kocic,
Markus Beppler, Matt Armstrong, Matthias Fuchs, Mattias Engdegård,
Mauro Aranda, Maxime Tréca, Michael Goldenberg, Morgan Smith, Morgan
Willcock, Murilo Pereira, Nicky van Foreest, Nicolas De Jaeghere,
Nicolas Semrau, Olaf Meeuwissen, Oliver Epper, Pablo Stafforini,
Paul Poloskov, Pengji Zhang, Pete Kazmier, Peter Wu, Philip
Kaludercic, Pierre Téchoueyres, Przemysław Kryger, Robert Hepple,
Roman Rudakov, Russell Sim, Ryan Phillips, Rytis Paškauskas, Rudolf
Adamkovič, Sam Kleinman, Samuel Culpepper, Saša Janiška, Shreyas
Ragavan, Simon Pugnet, Steve Downey, Tassilo Horn, Thanos Apollo,
Thibaut Verron, Thomas Heartman, Togan Muftuoglu, Tony Zorman, Trey
Merkley, Tomasz Hołubowicz, Toon Claes, Uri Sharf, Utkarsh Singh,
Vincent Foley, Zoltan Kiraly. As well as users: Ben, CsBigDataHub1,
Emacs Contrib, Eugene, Fourchaux, Fredrik, Moesasji, Nick, Summer
Emacs, TheBlob42, TitusMu, Trey, bepolymathe, bit9tream,
bangedorrunt, derek-upham, doolio, fleimgruber, gitrj95, iSeeU,
jixiuf, ltmsyvag, okamsn, pRot0ta1p, soaringbird, tumashu,
wakamenod.
+ Packaging :: Basil L.{{{space()}}} Contovounesios, Eli Zaretskii,
Glenn Morris, Mauro Aranda, Richard Stallman, Stefan Kangas (core
Emacs), Stefan Monnier (GNU Elpa), André Alexandre Gomes, Andrew
Tropin, Dimakakos Dimos, Morgan Smith, Nicolas Goaziou (Guix), Dhavan
Vaidya (Debian).
+ Inspiration for certain features :: Bozhidar Batsov (zenburn-theme),
Fabrice Niessen (leuven-theme).
Special thanks (from A-Z) to Daniel Mendler, Gustavo Barros, Manuel
Uberti, Nicolas De Jaeghere, and Omar Antolín Camarena for their long
time contributions and insightful commentary on key aspects of the
themes' design and/or aspects of their functionality.
All errors are my own.
* GNU Free Documentation License
:properties:
:appendix: t
:custom_id: h:3077c3d2-7f90-4228-8f0a-73124f4026f6
:end:
#+texinfo: @include doclicense.texi
#+begin_export html
<pre>
GNU Free Documentation License
Version 1.3, 3 November 2008
Copyright (C) 2000-2002, 2007-2008, 2025 Free Software Foundation, Inc.
<https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.
This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense. It
complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does. But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book. We recommend this License
principally for works whose purpose is instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License. Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein. The "Document", below,
refers to any such manual or work. Any member of the public is a
licensee, and is addressed as "you". You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.
A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could fall
directly within that overall subject. (Thus, if the Document is in
part a textbook of mathematics, a Secondary Section may not explain
any mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.
The "Invariant Sections" are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License. If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant. The Document may contain zero
Invariant Sections. If the Document does not identify any Invariant
Sections then there are none.
The "Cover Texts" are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License. A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.
A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters. A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text. A copy that is not "Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
HTML, PostScript or PDF designed for human modification. Examples of
transparent image formats include PNG, XCF and JPG. Opaque formats
include proprietary formats that can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page. For works in
formats which do not have any title page as such, "Title Page" means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
The "publisher" means any person or entity that distributes copies of
the Document to the public.
A section "Entitled XYZ" means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a
specific section name mentioned below, such as "Acknowledgements",
"Dedications", "Endorsements", or "History".) To "Preserve the Title"
of such a section when you modify the Document means that it remains a
section "Entitled XYZ" according to this definition.
The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document. These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no
other conditions whatsoever to those of this License. You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute. However, you may accept
compensation in exchange for copies. If you distribute a large enough
number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and
you may publicly display copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify
you as the publisher of these copies. The front cover must present
the full title with all words of the title equally prominent and
visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.
If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.
It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to
give them a chance to provide you with an updated version of the
Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it. In addition, you must do these things in the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title distinct
from that of the Document, and from those of previous versions
(which should, if there were any, be listed in the History section
of the Document). You may use the same title as a previous version
if the original publisher of that version gives permission.
B. List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has fewer than five),
unless they release you from this requirement.
C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license notice
giving the public permission to use the Modified Version under the
terms of this License, in the form shown in the Addendum below.
G. Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document's license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title, and add
to it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page. If
there is no section Entitled "History" in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
J. Preserve the network location, if any, given in the Document for
public access to a Transparent copy of the Document, and likewise
the network locations given in the Document for previous versions
it was based on. These may be placed in the "History" section.
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications",
Preserve the Title of the section, and preserve in the section all
the substance and tone of each of the contributor acknowledgements
and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section titles.
M. Delete any section Entitled "Endorsements". Such a section
may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled "Endorsements"
or to conflict in title with any Invariant Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant. To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.
You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.
You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version. Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections Entitled "History"
in the various original documents, forming one section Entitled
"History"; likewise combine any sections Entitled "Acknowledgements",
and any sections Entitled "Dedications". You must delete all sections
Entitled "Endorsements".
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other
documents released under this License, and replace the individual
copies of this License in the various documents with a single copy
that is included in the collection, provided that you follow the rules
of this License for verbatim copying of each of the documents in all
other respects.
You may extract a single document from such a collection, and
distribute it individually under this License, provided you insert a
copy of this License into the extracted document, and follow this
License in all other respects regarding verbatim copying of that
document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an "aggregate" if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document's Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers. In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.
If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense, or distribute it is void, and
will automatically terminate your rights under this License.
However, if you cease all violation of this License, then your license
from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of the
GNU Free Documentation License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in
detail to address new problems or concerns. See
https://www.gnu.org/licenses/.
Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License "or any later version" applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation. If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy's public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.
11. RELICENSING
"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server. A
"Massive Multiauthor Collaboration" (or "MMC") contained in the site
means any set of copyrightable works thus published on the MMC site.
"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
"Incorporate" means to publish or republish a Document, in whole or in
part, as part of another Document.
An MMC is "eligible for relicensing" if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole or
in part into the MMC, (1) had no cover texts or invariant sections, and
(2) were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.
ADDENDUM: How to use this License for your documents
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:
Copyright (c) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled "GNU
Free Documentation License".
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the "with...Texts." line with this:
with the Invariant Sections being LIST THEIR TITLES, with the
Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.
</pre>
#+end_export
#+html: <!--
* Indices
:properties:
:custom_id: h:55104b26-8e94-46cf-9975-43ea00316489
:end:
** Function index
:properties:
:index: fn
:custom_id: h:6bec5005-529c-4521-ae05-3d990baffb5b
:end:
** Variable index
:properties:
:index: vr
:custom_id: h:16ad8df6-b015-40a9-9259-03d4f7a23ee4
:end:
** Concept index
:properties:
:index: cp
:custom_id: h:6aa7a656-884b-4c39-b759-087e412eec13
:end:
#+html: -->
|