aboutsummaryrefslogtreecommitdiffstats
path: root/etc/NEWS
blob: 62755a433cc79c1441309bf9cd114625b6d9ccf7 (plain) (blame)
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
GNU Emacs NEWS -- history of user-visible changes.

Copyright (C) 2022-2025 Free Software Foundation, Inc.
See the end of the file for license conditions.

Please send Emacs bug reports to 'bug-gnu-emacs@gnu.org'.
If possible, use 'M-x report-emacs-bug'.

This file is about changes in Emacs version 31.

See file HISTORY for a list of GNU Emacs versions and release dates.
See files NEWS.30, NEWS.29, ..., NEWS.18, and NEWS.1-17 for changes
in older Emacs versions.

You can narrow news to a specific version by calling 'view-emacs-news'
with a prefix argument or by typing 'C-u C-h C-n'.

Temporary note:
+++ indicates that all relevant manuals in doc/ have been updated.
--- means no change in the manuals is needed.
When you add a new item, use the appropriate mark if you are sure it
applies, and please also update docstrings as needed.


* Installation Changes in Emacs 31.1

+++
** Unexec dumper removed.
The traditional unexec dumper, deprecated since Emacs 27, has been
removed.

---
** Emacs's old 'ctags' program is no longer built or installed.
You are encouraged to use Universal Ctags <https://ctags.io/> instead.
For now, to get the old 'ctags' behavior you can can run 'etags --ctags'
or use a shell script named 'ctags' that runs 'etags --ctags "$@"'.

---
** Changed GCC default options on 32-bit x86 systems.
When using GCC 4 or later to build Emacs on 32-bit x86 systems,
'configure' now defaults to using the GCC options '-mfpmath=sse' (if the
host system supports SSE2) or '-fno-tree-sra' (if not).  These GCC
options work around GCC bug 58416, which can cause Emacs to behave
incorrectly in rare cases.

---
** New configure option '--with-systemduserunitdir'.
This allows to specify the directory where the user unit file for
systemd is installed; default is '${prefix}/usr/lib/systemd/user'.


* Startup Changes in Emacs 31.1

** In compatible terminals, 'xterm-mouse-mode' is turned on by default.
For these terminals the mouse will work by default.  A compatible
terminal is one that supports Emacs setting and getting the OS selection
data (a.k.a. the clipboard) and mouse button and motion events.  With
'xterm-mouse-mode' enabled, you must use Emacs keybindings to copy to the
OS selection instead of terminal-specific keybindings.

You can keep the old behavior by putting '(xterm-mouse-mode -1)' in your
init file.

+++
** 'site-start.el' is now loaded before the user's early init file.
Previously, the order was early-init.el, site-start.el and then the
user's regular init file, but now site-start.el comes first.  This
allows site administrators to customize things that can normally only be
done from early-init.el, such as adding to 'package-directory-list'.


* Changes in Emacs 31.1

** 'prettify-symbols-mode' attempts to ignore undisplayable characters.
Previously, such characters would be rendered as, e.g., white boxes.

+++
** 'standard-display-table' now has more extra slots.
'standard-display-table' has been extended to allow specifying glyphs
that are used for borders around child frames and menu separators on TTY
frames.

Call the function 'standard-display-unicode-special-glyphs' to set up
the 'standard-display-table's extra slots with Unicode characters.
Please see the documentation of that function to see which slots of the
display table it changes.

+++
** Child frames are now supported on TTY frames.
This supports use-cases like Posframe, Corfu, and child frames acting
like tooltips.

To enable tooltips on TTY frames, call 'tty-tip-mode'.

The presence of child frame support on TTY frames can be checked with
'(featurep 'tty-child-frames)'.

Recent versions of Posframe and Corfu are known to use child frames on
TTYs if they are supported.

+++
** Several font-lock face variables are now obsolete.
The following variables are now obsolete: 'font-lock-builtin-face',
'font-lock-comment-delimiter-face', 'font-lock-comment-face',
'font-lock-constant-face', 'font-lock-doc-face',
'font-lock-doc-markup-face', 'font-lock-function-name-face',
'font-lock-keyword-face', 'font-lock-negation-char-face',
'font-lock-preprocessor-face', 'font-lock-string-face',
'font-lock-type-face', 'font-lock-variable-name-face', and
'font-lock-warning-face'.

These variables contributed both to confusion about the relation between
faces and variables, and to inconsistency when major mode authors used
one or the other (sometimes interchangeably).  We always recommended
using faces directly, and not creating variables going by the same name.

If you have customized these variables, you should now customize the
corresponding faces instead, using something like:

    M-x customize-face RET font-lock-string-face RET

If you have been using these variables in Lisp code (for example, in
font-lock rules), simply quote the symbol, to use the face directly
instead of its now-obsolete variable.

** Network Security Manager (NSM) is now more strict.

*** NSM warns about TLS 1.1 by default.
It has been deprecated by RFC 8996, published in 2021.

*** NSM warns about DHE and RSA key exchange by default.
Emacs now warns about ephemeral Diffie-Hellman key exchange, and static
RSA key exchange, also when 'network-security-level' is customized to
its default 'medium' value.

** Etags

+++
*** New command-line options for handling unrecognized programming languages.
The new command-line option '--no-fallback-lang' disables attempts to
parse as Fortran or C/C++ files whose programming language 'etags' could
not determine.  This allows to avoid false positives and reduces the time
required to scan directories with many such files.  Another new option
'--no-empty-file-entries' disables generation of file entries in tags
tables for files in which no tags were found.

---
** find-func.el commands now have history enabled.
The 'find-function', 'find-library', 'find-face-definition', and
'find-variable' commands now allow retrieving previous input using the
usual minibuffer history commands.  Each command has a separate history.

---
** New minor mode 'find-function-mode' replaces 'find-function-setup-keys'.
The new minor mode defines the keys at a higher precedence level than
the old function, one more usual for a minor mode.  To restore the old
behavior, customize 'find-function-mode-lower-precedence' to non-nil.

---
** 'find-function' can now find 'cl-defmethod' invocations inside macros.

** Minibuffer and Completions

+++
*** Support for immediate display of the "*Completions*" buffer.
Whenever a minibuffer with completion is opened, the "*Completions*"
buffer will now be displayed immediately if the completion property
'eager-display', set by the completion table, is non-nil.  This property
can be overridden for different completion categories by customizing
'completion-category-overrides'.  Alternatively, the new user option
'completion-eager-display' can be set to t to force eager display of
"*Completions*" for all minibuffers, or nil to suppress this for all
minibuffers.

---
*** Support for completion category inheritance.
You can now define completion categories that inherit properties from
existing categories, using the new function 'define-completion-category'.

+++
*** Support for updating "*Completions*" as you type.
If the "*Completions*" buffer is displayed, it will now be updated as
you type if the completion property 'eager-update', set by the
completion table, is non-nil.  This property can be overridden for
different completion categories by customizing
'completion-category-overrides'.  Alternatively, the new user option
'completion-eager-update can be set to t to make "*Completions*" always
be updated as you type, or nil to suppress this always.  Note that for
large or inefficient completion tables this can slow down typing.

---
*** 'RET' chooses the completion selected with 'M-<up>/M-<down>'.
If a completion candidate is selected with 'M-<up>' or 'M-<down>',
hitting 'RET' will exit completion with that as the result.  This works
both in minibuffer completion and in-buffer completion.  This supersedes
'minibuffer-completion-auto-choose', which previously provided similar
behavior; that variable is now nil by default.

+++
*** New user option 'completion-pcm-leading-wildcard'.
This option configures how the partial-completion style does completion.
It defaults to nil, which preserves the existing behavior.  When it is set
to t, the partial-completion style behaves more like the substring
style, in that a string being completed can match against a candidate
anywhere in the candidate string.

+++
*** 'completion-styles' now can contain lists of bindings.
In addition to being a symbol naming a completion style, an element of
'completion-styles' can now be a list of the form '(STYLE ((VARIABLE
VALUE) ...))' where STYLE is a symbol naming a completion style.
VARIABLE will be bound to VALUE (without evaluating it) while the style
is executing.  This allows multiple references to the same style with
different values for completion-affecting variables like
'completion-pcm-leading-wildcard' or 'completion-ignore-case'.  This also
applies for the styles configuration in 'completion-category-overrides'
and 'completion-category-defaults'.

---
*** Selected completion candidate is preserved across "*Completions*" updates.
When point is on a completion candidate in the "*Completions*" buffer
(because of 'minibuffer-next-completion' or for any other reason), point
will still be on that candidate after "*Completions*" is updated with a
new list of completions.  The candidate is automatically deselected when
the "*Completions*" buffer is hidden.

---
*** "*Completions*" is now displayed faster when there are many candidates.
As before, if there are more completion candidates than can be displayed
in the current frame, only a subset of the candidates is displayed.
This process is now faster: only that subset of the candidates is
actually inserted into "*Completions*" until you run a command which
interacts with the text of the "*Completions*" buffer.  This
optimization only applies when 'completions-format' is 'horizontal' or
'one-column'.

---
*** New user option 'crm-prompt' for 'completing-read-multiple'.
This option configures the prompt format of 'completing-read-multiple'.
By default, the prompt indicates to the user that the completion command
accepts a comma-separated list.  The prompt format can include the
separator description and the separator string, which are both stored as
text properties of the 'crm-separator' regular expression.

---
*** New user option 'completion-preview-sort-function'.
This option controls how Completion Preview mode sorts completion
candidates.  If you use this mode together with an in-buffer completion
popup interface, such as the interfaces that the GNU ELPA packages Corfu
and Company provide, you can set this option to the same sort function
that your popup interface uses for a more integrated experience.

('completion-preview-sort-function' was already present in Emacs 30.1,
but as a plain Lisp variable, not a user option.)

** Mouse

---
*** 'context-menu-mode now' includes a "Send to..." menu item.
The menu item enables sending current file(s) or region text to external
(non-Emacs) applications or services.  See send-to.el for customisations.

** Windows

+++
*** New commands to modify window layouts.

- 'C-x w t' and 'C-x w r <left>/<right>' rotate the window layout.
- 'C-x w o <left>/<right>' rotate the windows within the current layout.
- 'C-x w f <left>/<right>/<up>/<down>' flip window layouts.

By default, these commands operate on the selected frame's root window.
With a prefix argument, they operate on the selected window's parent.

+++
*** Windmove commands now move to skipped windows if invoked twice in a row.
The new user option 'windmove-allow-repeated-command-override' controls
this behavior: if it is non-nil, invoking the same windmove command twice
overrides the 'no-other-window' property, allowing navigation to windows
that would normally be skipped.  The default is t; customize it to nil
if you want the old behavior.

+++
*** New hook 'window-deletable-functions'.
This abnormal hook gives its client a way to save a window from getting
deleted implicitly by functions like 'kill-buffer', 'bury-buffer' and
'quit-restore-window'.

+++
*** New user option 'quit-window-kill-buffer'.
This option specifies whether 'quit-window' should preferably kill or
bury the buffer shown by the window to quit.  The default is nil.
Customize it to t to always kill the buffer; customize to a list of
major modes to kill if the buffer's major mode is one of those.

+++
*** New user option 'kill-buffer-quit-windows'.
This option has 'kill-buffer' call 'quit-restore-window' to handle the
further destiny of any window showing the buffer to be killed.

+++
*** 'split-window' can optionally resurrect deleted windows.
A new argument REFER of 'split-window' makes it possible to, instead of
making a new window object, reuse an existing, deleted one.  This can be
used to preserve the identity of windows when swapping or transposing
them.

+++
*** New window parameter 'quit-restore-prev'.
This parameter is set up by 'display-buffer' when it detects that the
window used already has a 'quit-restore' parameter.  Its presence gives
'quit-restore-window' a way to undo a sequence of buffer display
operations more intuitively.

+++
*** 'quit-restore-window' handles new values for BURY-OR-KILL argument.
The values 'killing' and 'burying' are like 'kill' and 'bury' but assume
that the actual killing or burying of the buffer is done by the caller.

+++
*** New user option 'quit-restore-window-no-switch'.
With this option set, 'quit-restore-window' will delete its window more
aggressively rather than switching to some other buffer in it.

---
*** The user option 'display-comint-buffer-action' has been removed.
It has been obsolete since Emacs 30.1.  Use '(category . comint)' instead.
Another user option 'display-tex-shell-buffer-action' has been removed too
for which you can use '(category . tex-shell)'.

+++
*** New user option 'split-window-preferred-direction'.
Users can now choose in which direction Emacs tries to split first:
vertical or horizontal.  With this new setting, when the frame is in
landscape shape for instance, Emacs could split horizontally before
splitting vertically.  The default setting preserves Emacs historical
behavior to try to split vertically first.

+++
*** New argument INDIRECT for 'get-buffer-window-list'.
With this argument non-nil, 'get-buffer-window-list' will include in the
return value windows whose buffers share their text with BUFFER-OR-NAME.

+++
*** New 'display-buffer' action alist entry 'reuse-indirect'.
With such an entry, 'display-buffer-reuse-window' may also choose a
window whose buffer shares text with the buffer to display.

+++
*** New variable 'window-state-normalize-buffer-name'.
When bound to non-nil, 'window-state-get' will normalize 'uniquify'
managed buffer names by removing 'uniquify' prefixes and suffixes.  This
helps to restore window buffers across Emacs sessions.

+++
*** New action alist entry 'this-command' for 'display-buffer'.
You can use this in 'display-buffer-alist' to match buffers displayed
during the execution of particular commands.

*** New command 'other-window-backward' ('C-x O').
This moves in the opposite direction of 'other-window' and is for its
default keybinding consistent with 'repeat-mode'.

** Frames

+++
*** New function 'frame-deletable-p'.
If this function returns nil, the following call to 'delete-frame' might
fail to delete its argument FRAME or might signal an error.  It is
therefore advisable to use this function as part of a condition that
determines whether to call 'delete-frame'.

+++
*** New value 'force' for user option 'frame-inhibit-implied-resize'.
This will inhibit implied resizing while a new frame is made and can be
useful on tiling window managers where the initial frame size should be
specified by external means.

** Mode Line

+++
*** New user option 'mode-line-collapse-minor-modes'.
If non-nil, minor mode lighters on the mode line are collapsed into a
single button.  The value could also be a list to specify minor mode
lighters to hide or show.  The default value is nil, which retains the
previous behavior of showing all minor mode lighters.

*** New user option 'mode-line-modes-delimiters'.
This option allows changing or removing the delimiters shown around
the major mode and list of minor modes in the mode line.  The default
retains the existing behavior of inserting parentheses.

+++
*** New minor mode 'mode-line-invisible-mode'.
This minor mode makes the mode line of the current buffer invisible.
The command 'mode-line-invisible-mode' toggles the visibility of the
current-buffer's mode line.  The default is to show the mode line of
every buffer.

** Tab Bars and Tab Lines

---
*** New abnormal hook 'tab-bar-auto-width-functions'.
This hook allows you to control which tab-bar tabs are auto-resized.

---
*** 'mouse-face' properties are now supported on the 'tab-bar'.
'tab-bar' tab "buttons" are now highlighted when the mouse pointer
hovers over them.  You can customize the new face
'tab-bar-tab-highlight'.

---
*** New abnormal hook 'tab-bar-post-undo-close-tab-functions'.
This hook allows you to operate on a reopened tab.

This is useful when you define custom tab parameters that may need
adjustment when a tab is restored, and avoids advice.

---
*** New user option 'tab-bar-define-keys'.
This controls which key bindings tab-bar creates.  Values are t, the
default, which defines all keys and is backwards compatible, 'numeric'
(tab number selection only), 'tab' ('TAB' and 'S-TAB' keys only), nil
(which defines none).

This is useful to avoid key binding conflicts, such as when folding in
outline mode using 'TAB' keys, or when a user wants to define her own
tab-bar keys without first having to remove the defaults.

---
*** New variable 'tab-bar-format-tab-help-text-function'.
This variable may be overridden with a user-provided function to
customize help text for tabs displayed on the tab-bar.  Help text is
normally shown in the echo area or via tooltips.  See the variable's
docstring for arguments passed to a help-text function.

---
*** New variable 'tab-bar-truncate'.
When non-nil, it truncates the tab bar, and therefore prevents
wrapping and resizing the tab bar to more than one line.

---
*** New user option 'tab-line-define-keys'.
When t, the default, it redefines window buffer switching keys
such as 'C-x <left>' and 'C-x <right>' to tab-line specific variants
for switching tabs.

---
*** New command 'tab-line-move-tab-forward' ('C-x M-<right>').
Together with the new command 'tab-line-move-tab-backward'
('C-x M-<left>'), it can be used to move the current tab
on the tab line to a different position.

---
*** New command 'tab-line-close-other-tabs'.
It is bound to the tab's context menu item "Close other tabs".

---
*** New user option 'tab-line-exclude-buffers'.
This user option controls where 'tab-line-mode' should not be enabled in
a buffer.  The value must be a condition which is passed to
'buffer-match-p'.

---
*** New user option 'tab-line-close-modified-button-show'.
With this user option, if non-nil (the default), the tab close button
will change its appearance if the tab buffer has been modified.

---
*** New user option 'tab-line-tabs-window-buffers-filter-function'.
This user option controls which buffers should appear in the tab line.
By default, this is set to not filter the buffers.

** Project

---
*** New command 'project-root-find-file'.
It is equivalent to running 'project-any-command' with 'find-file'.

---
*** New command 'project-customize-dirlocals'.
It is equivalent to running 'project-any-command' with
'customize-dirlocals'.

---
*** Improved prompt for 'project-switch-project'.
The prompt now displays the chosen project on which to invoke a command.

---
*** 'project-prompter' values may be called with up to three arguments.
These allow callers of the value of 'project-prompter' to specify a
prompt string; prompt the user to choose between a subset of all the
known projects; and disallow returning arbitrary directories.
See the docstring of 'project-prompter' for a full specification of
these new optional arguments.

---
*** 'project-current' has a new optional argument, MAYBE-PROMPT.
If 'project-current' is called with this argument non-nil, then it is
passed to the 'project-prompter' to use as a prompt string.
Callers can use this to indicate the reason for which or context in
which Emacs should ask the user to select a project.

---
*** New command 'project-find-matching-buffer'.
It can be used when switching between projects with similar file trees
(such as Git worktrees of the same repository).  It supports being
invoked standalone or from the 'project-switch-commands' dispatch menu.

---
*** New variable 'project-find-matching-buffer-function'.
Major modes can set this to major mode-specific functions to control how
'project-find-matching-buffer' finds matching buffers.

+++
*** New user option 'project-list-exclude'.
This user option describes projects that should always be skipped by
'project-remember-project'.

---
*** New user option 'project-prune-zombie-projects'.
This user option controls the automatic deletion of projects from
'project-list-file' that cannot be accessed when prompting for a
project.

The value must be an alist where each element must be in the form:

    (WHEN . PREDICATE)

where WHEN specifies where the deletion will be performed, and PREDICATE
is a function which takes one argument, and must return non-nil if the
project should be removed.

---
*** New command 'project-save-some-buffers' bound to 'C-x p C-x s'.
This is like 'C-x s', but only for this project's buffers.

*** 'project-remember-project' can now be called interactively.

---
*** 'project-shell' and 'project-eshell' support numeric prefix buffer naming.
They now accept numeric prefix arguments to select or create numbered
shell sessions.  For example, 'C-2 C-x p s' switches to or creates a
buffer named "*name-of-project-shell<2>*".  By comparison, a plain
universal argument as in 'C-u C-x p s' always creates a new session.

---
*** 'project-switch-buffer' re-uniquifies buffer names while prompting.
When 'uniquify-buffer-name-style' is non-nil, 'project-switch-buffer'
changes the buffer names to only make them unique within the given
project, during completion.  That makes some items shorter.

*** 'project-switch-buffer' uses 'project-buffer' as completion category.
The category defaults are the same as for 'buffer' but any user
customizations would need to be re-added.

** Registers

*** New functions 'buffer-to-register' and 'file-to-register'.
These allow users to interactively store file and buffers in registers.
Killed buffers stored in a register using 'buffer-to-register' are
automatically converted to a file-query value if the buffer was visiting
a file.

** IDLWAVE has been moved to GNU ELPA.
The version bundled with Emacs is out-of-date, and is now marked as
obsolete.  Use 'M-x list-packages' to install the 'idlwave' package from
GNU ELPA instead.

+++
** New faces 'header-line-active' and 'header-line-inactive'.
These inherit from the 'header-line' face, but the faces actually used
on the header lines are now these two: the selected window uses
'header-line-active', non-selected windows use 'header-line-inactive'.

** In 'customize-face', the "Font family" attribute now supports completion.

** 'process-adaptive-read-buffering' is now nil by default.
Setting this variable to a non-nil value reduces performance and leads
to wrong results in some cases.  We believe that it is no longer useful;
please contact us if you still need it for some reason.

---
** 'byte-compile-cond-use-jump-table' is now obsolete.

---
** Modified settings for an enabled theme now apply immediately.
Evaluating a 'custom-theme-set-faces' or 'custom-theme-set-variables'
call for an enabled theme causes the settings to apply immediately,
without a need to re-load the theme.

---
** 'describe-variable' now automatically says if 'setopt' is needed.
If a user option has a defcustom ':set' function, users will normally
need to set it with 'setopt' for it to take an effect.  If the docstring
doesn't already mention 'setopt', the 'describe-variable' command will
now add a note about this automatically.

+++
** New user option 'eldoc-help-at-pt' to show help at point via ElDoc.
When enabled, display the 'help-at-pt-kbd-string' via ElDoc.  This
setting is an alternative to 'help-at-pt-display-when-idle'.

---
** New user option 'native-comp-async-on-battery-power'.
Customize this to nil to disable starting new asynchronous native
compilations while AC power is not connected.

** New user option 'show-paren-not-in-comments-or-strings'.
If this option is non-nil, it tells 'show-paren-mode' not to highlight
the parens that are inside comments and strings.  If set to 'all',
'show-paren-mode' will never highlight parens that are inside comments
or strings.  If set to 'on-mismatch', mismatched parens inside comments
and strings will not be highlighted.  If set to nil (the default),
highlight the parens wherever they are.

** Change in SVG foreground color handling.
SVG images no longer have the 'fill' attribute set to the value of
':foreground' or the current text foreground color.  The 'currentcolor'
CSS attribute continues to be set as before.

This change should result in more consistent display of SVG images.

To use the ':foreground' or current text color ensure the 'fill' attribute
in the SVG is set to 'currentcolor', or set the image spec's ':css'
value to 'svg {fill: currentcolor;}'.

---
** Errors signaled by 'emacsclient' connections can now enter the debugger.
If 'debug-on-error' is non-nil, errors signaled by Lisp programs
executed due to 'emacsclient' connections will now enter the Lisp
debugger and show the backtrace.  If 'debug-on-error' is nil, these
errors will be sent to 'emacsclient', as before, and will be displayed
on the terminal from which 'emacsclient' was invoked.


* Editing Changes in Emacs 31.1

** Commands for keyboard translation.
'key-translate' is now interactive.  It prompts for a key to translate
from, and another to translate to, and sets 'keyboard-translate-table'.
The new command 'key-translate-remove' prompts for a key/translation
pair with 'completing-read', and removes it from the translation table.

** Internationalization

---
*** Emacs now supports Unicode Standard version 17.0.

---
*** New input method 'greek-polytonic'.
This input method has support for polytonic and archaic Greek
characters.

---
*** New language environment and input method for Tifinagh.
The Tifinagh script is used to write the Berber languages.

---
*** New input methods for Northern Iroquoian languages.
Input methods are now implemented for Haudenosaunee languages in the
Northern Iroquoian language family: 'mohawk-postfix' (Mohawk
[Kanien’kéha / Kanyen’kéha / Onkwehonwehnéha]), 'oneida-postfix' (Oneida
[Onʌyote’a·ká· / Onyota’a:ká: / Ukwehuwehnéha]), 'cayuga-postfix'
(Cayuga [Gayogo̱ho:nǫhnéha:ˀ]), 'onondaga-postfix' (Onondaga
[Onųdaʔgegáʔ]), and 'seneca-postfix' (Seneca [Onödowá’ga:’]).
Additionally, there is a general-purpose 'haudenosaunee-postfix' input
method to facilitate writing in the orthographies of the five languages
simultaneously.

---
*** New input methods for languages based on Burmese.
These include: Burmese, Burmese (visual order), Shan, and Mon.

---
** 'visual-wrap-prefix-mode' now supports variable-pitch fonts.
When using 'visual-wrap-prefix-mode' in buffers with variable-pitch
fonts, the wrapped text will now be lined up correctly so that it is
exactly below the text after the prefix on the first line.

---
** New commands 'unix-word-rubout' and 'unix-filename-rubout'.
Unix-words are words separated by whitespace regardless of the buffer's
syntax table.  In a Unix terminal or shell, 'C-w' kills by Unix-word.
The new commands 'unix-word-rubout' and 'unix-filename-rubout' allow
you to bind keys to operate more similarly to the terminal.

---
** New user option 'kill-region-dwim'.
This option, if non-nil, modifies the fall-back behavior of
'kill-region' ('C-w') if no region is active, and will kill the last word
instead of raising an error.  Note that if you have disabled Transient
Mark mode you might prefer to use 'unix-word-rubout', as this feature
relies on there being an active region.

---
** New user option 'delete-pair-push-mark'.
This option, if non-nil, makes 'delete-pair' push a mark at the end of
the region enclosed by the deleted delimiters.  This makes it easy to
act on that region.  For example, we can highlight it using 'C-x C-x'.

** Electric Pair mode

+++
*** Electric Pair mode can now pair multiple delimiters at once.
You can now insert or wrap text with multiple sets of parentheses and
other matching delimiters at once with Electric Pair mode, by providing
a prefix argument when inserting one of the delimiters.

---
*** Electric Pair mode now supports multi-character paired delimiters.
'electric-pair-pairs' and 'electric-pair-text-pairs' now allow using
strings for multi-character paired delimiters.

To use this, add a list to both electric pair user options: '("/*" . "*/")'.

You can also specify to insert an extra space after the first string
pair: '("/*" " */" t)'.

+++
** You can now use 'M-~' during 'C-x s' ('save-some-buffers').
Typing 'M-~' while saving some buffers means not to save the buffer and
also to mark it as unmodified.  This is an alternative way to mark a
buffer as unmodified which doesn't require switching to that buffer.

** New minor mode 'delete-selection-local-mode'.
This mode sets 'delete-selection-mode' buffer-locally.  This can be
useful for enabling or disabling the features of 'delete-selection-mode'
based on the state of the buffer, such as for the different states of
modal editing packages.

** New user variable 'exchange-point-and-mark-highlight-region'.
When set to nil, this modifies 'exchange-point-and-mark' so that it doesn't
activate the mark if it is not already active.
The default value is t, which retains the old behavior.
This variable has no effect when Transient Mark mode is off.

---
** New commands for filling text using semantic linefeeds.
The new command 'fill-paragraph-semlf' fills a paragraph of text using
"semantic linefeeds", whereby a newline is inserted after every
sentence.  The new command 'fill-region-as-paragraph-semlf' fills a
region of text using semantic linefeeds as if the region were a single
paragraph.  You can set the variable 'fill-region-as-paragraph-function'
to the value 'fill-region-as-paragraph-semlf' to enable functions like
'fill-paragraph' and 'fill-region' to fill text using "semantic
linefeeds".

---
** Temporary files are named differently when 'file-precious-flag' is set.
When the user option 'file-precious-flag' is set to a non-nil value,
Emacs now names the temporary file it creates while saving buffers using
the original file name with ".tmp" appended to it.  Thus, if saving the
buffer fails for some reason, and the temporary file is not renamed back
to the original file's name, you can easily identify which file's saving
failed.

+++
** 'C-u C-x .' clears the fill prefix.
You can now use 'C-u C-x .' to clear the fill prefix, similarly to how
you could already use 'C-u C-x C-n' to clear the goal column.


* Changes in Specialized Modes and Packages in Emacs 31.1

** Auth Source

+++
*** Non-existing or empty files are ignored in 'auth-sources'.
File-based data stores are ignored in ‘auth-sources’, if the underlying
data file does not exist.  This is relevant, if a new secret is stored
in such a file; the first usable entry of ‘auth-sources’ is selected as
target.  If you want also not existing files to be selected, set the
user option ‘auth-source-ignore-non-existing-file’ to nil.

** Autoinsert

+++
*** New condition for 'auto-insert-alist'.
'auto-insert-alist' now also allows to have a predicate taking no
argument as conditions.  These types of conditions should be declared
with '(predicate FUNCTION)'.  This allows to trigger 'auto-insert'
with finer grained control.

** Register

*** The "*Register Preview*" buffer shows only suitable registers.
That was already the case for the "fancy" UI but is now also true in
the default UI you get, i.e., when 'register-use-preview' is 'traditional'.

** Tree-sitter

+++
*** New user option 'treesit-enabled-modes'.
You can customize it either to t to enable all available tree-sitter
based modes, or to select a list of tree-sitter based modes to enable.
Depending on customization, it modifies the variable
'major-mode-remap-alist' from the corresponding variable
'treesit-major-mode-remap-alist' prepared by tree-sitter based mode
packages.

*** New user option 'treesit-auto-install-grammar'.
It controls the automatic installation of tree-sitter grammar libraries
needed for tree-sitter based modes, if these grammar libraries are not
available when such modes are turned on.

*** 'treesit-language-source-alist' supports keywords.
The language and URL are mandatory, but remaining data can use keywords:
'(json "https://github.com/tree-sitter/tree-sitter-json" :commit "4d770d3")'.

*** The file treesit-x.el defines a number of simple tree-sitter modes.
Using the new macro 'define-treesit-generic-mode', generic modes are
defined including, but not limited to, 'gitattributes-generic-ts-mode'.
Visiting a file in such mode asks for confirmation before installing
its tree-sitter grammar.  Then it highlights the visited file
according to the syntax defined by the grammar.

*** New command 'treesit-cycle-sexp-thing'.
It cycles the type of navigation for commands that move across sexp's
and lists, such as 'treesit-forward-sexp', 'treesit-forward-list',
'treesit-down-list', and 'treesit-up-list'.  The type can be either
'list', the default, or 'sexp'.
With the default 'list' type these commands move using syntax tables for
symbols and using the thing 'list' for lists.
With the 'sexp' type these commands move across nodes defined by
the tree-sitter thing 'sexp' in 'treesit-thing-settings'.

+++
*** Indirect buffers can have their own parser list.
Before, indirect buffers share their base buffer’s parser list and
parsers.  Now they can have their own parser list.

+++
*** New variable 'treesit-language-remap-alist'.
This variable allows a user to remap one language into another, such
that creating a parser for language A actually creates a parser for
language B.  By extension, any font-lock rules or indentation rules for
language A will be applied to language B instead.

This is useful for reusing font-lock rules and indentation rules of
language A for language B, when language B is a strict superset of
language A.

+++
*** New accessor functions for each setting in 'treesit-font-lock-settings'.
Now users can access a setting's query, feature, enable flag, and
override flag by 'treesit-font-lock-setting-query',
'treesit-font-lock-setting-feature', 'treesit-font-lock-setting-enable',
and 'treesit-font-lock-setting-override'.

*** New tree-sitter thing 'list'.
Unlike the existing thing 'sexp' that defines both lists and atoms,
'list' defines only lists to be navigated by 'forward-sexp'.
The new function 'treesit-forward-sexp-list' uses 'list'
to move across lists.  But to move across atoms inside the list
it uses 'forward-sexp-default-function'.

*** New tree-sitter based functions for moving by lists.
If a major mode defines 'list' in 'treesit-thing-settings',
tree-sitter setup for these modes sets 'forward-list-function' to
'treesit-forward-list', 'up-list-function' to 'treesit-up-list', and
'down-list-function' to 'treesit-down-list'.  This enables the
'forward-list', 'up-list', and 'down-list' motion commands for those
modes.

*** Tree-sitter enabled modes now properly support 'show-paren-mode'.
They do that by letting 'show-paren-mode' use the results of parsing by
the tree-sitter library.  The new function 'treesit-show-paren-data' is
used to communicate the tree-sitter parsing results to 'show-paren-mode'.

*** Tree-sitter enabled modes now properly support 'hs-minor-mode'.
All commands from hideshow.el can selectively display blocks
defined by the new tree-sitter thing 'list'.

*** New tree-sitter thing 'comment'.
The new variable 'forward-comment-function' is set to the new function
'treesit-forward-comment' if a major mode defines the thing 'comment'.

+++
*** New function 'treesit-language-display-name'.
This new function returns the display name of a language given the
language symbol.  For example, 'cpp' is translated to "C++".  A new
variable 'treesit-language-display-name-alist' holds the translations of
language symbols where that translation is not trivial.

*** New function 'treesit-merge-font-lock-feature-list'.
This function merges two tree-sitter font-lock feature lists.  It
returns a new font-lock feature list with no duplicates in the same
level.  It can be used to merge font-lock feature lists in a
multi-language major mode.

*** New function 'treesit-replace-font-lock-feature-settings'.
Given two tree-sitter font-lock settings, it replaces the feature in the
second font-lock settings with the same feature in the first font-lock
settings.  In a multi-language major mode it is sometimes necessary to
replace features from one of the major modes with others, that are
better suited to the new multilingual context.

*** New function 'treesit-simple-indent-modify-rules'.
Given two tree-sitter indent rules, it replaces, adds, or prepends rules
in the old rules with new ones, then returns the modified rules.  In a
multi-language major mode it is sometimes necessary to modify rules from
one of the major modes to better suit the new multilingual context.

+++
*** New variable 'treesit-aggregated-simple-imenu-settings'.
This variable allows major modes to setup Imenu for multiple languages.

+++
*** New variable 'treesit-aggregated-outline-predicate'.
This variable allows major modes to setup 'outline-minor-mode'
for multiple languages.

*** New function 'treesit-simple-indent-add-rules'.
This new function makes it easier to customize indent rules for
tree-sitter modes.

*** New variable 'treesit-simple-indent-override-rules'.
Users can customize this variable to add simple custom indentation rules
for tree-sitter major modes.

+++
*** New variable 'treesit-languages-require-line-column-tracking'.
Now Emacs can optionally track line and column numbers for buffer edits
and send that information to tree-sitter parsers.  Parsers of languages
in this list will receive line and column information.  This is only
needed for very few languages.  So far only Haskell is known to need it.

+++
*** New function 'treesit-tracking-line-column-p'.
New function to check if a buffer is tracking line and column for buffer
edits.

+++
*** New function 'treesit-parser-tracking-line-column-p'.
New function to check if a parser is receiving line and column
information.

+++
*** 'treesit-language-at-point-function' is now optional.
Multi-language major modes can rely on the default return value from
'treesit-language-at' that uses the new function 'treesit-parsers-at'.

+++
*** New command 'treesit-explore'.
This command replaces 'treesit-explore-mode'.  It turns on
'treesit-explore-mode' if it is not on, and pops up the explorer buffer
if it is already on.

+++
*** 'treesit-explore-mode' now supports local parsers.
Now 'treesit-explore-mode' (or 'treesit-explore') prompts for a parser
rather than a language, and it is now possible to select a local parser
at point to explore.

** Hideshow

*** New user option 'hs-display-lines-hidden'.
If this option is non-nil, Hideshow displays the number of hidden
lines next to the ellipsis.

** C-ts mode

+++
*** New user option 'c-ts-mode-enable-doxygen'.
By default, this is nil, and the Doxygen comment blocks in C/C++ sources
are highlighted like other comments.  When non-nil, Doxygen comment
blocks are syntax-highlighted if the Doxygen grammar library is
available.

** Go-ts mode

+++
*** New unit test commands.
Three new commands are now available to run unit tests.

The 'go-ts-mode-test-function-at-point' command runs the unit test at
point.  If a region is active, it runs all the unit tests under the
region.  It is bound to 'C-c C-t t' in 'go-ts-mode'.

The 'go-ts-mode-test-this-file' command runs all unit tests in the current
file.  It is bound to 'C-c C-t f' in 'go-ts-mode'.

The 'go-ts-mode-test-this-package' command runs all unit tests under the
package of the current buffer.  It is bound to 'C-c C-t p' in 'go-ts-mode'.

The 'go-ts-mode-build-tags' user option is available to set a list of
build tags for the test commands.

The 'go-ts-mode-test-flags' user option is available to set a list of
additional flags to pass to the go test command line.

** Lua-ts mode

---
*** New user option 'lua-ts-auto-close-block-comments'.
When non-nil, inserting a block comment "--[[" will close it by
inserting its respective "]]".  By default, this is disabled.

** Java-ts mode

+++
*** New user option 'java-ts-mode-enable-doxygen'.
By default, this is nil, and the Doxygen comment blocks in Java sources
are highlighted like other comments.  When non-nil, Doxygen comment
blocks are syntax-highlighted if the Doxygen grammar library is
available.

---
*** New user option 'java-ts-mode-method-chaining-indent-offset'.
Now method chaining is indented by 8 spaces rather than 4, and this
option controls how much is indented for method chaining.

** PHP-ts mode

---
*** 'php-ts-mode' now depends on 'mhtml-ts-mode'.
The direct dependency on 'js-ts-mode', 'css-ts-mode' and 'html-ts-mode'
has now been replaced by ‘mhtml-ts-mode’.  Navigation, Outline and Imenu
work for all languages, and code maintenance is easier.

---
*** 'php-ts-mode-run-php-webserver' can now accept a custom "php.ini" file.
You can use the new optional argument CONFIG when calling
'php-ts-mode-run-php-webserver' to pass an alternative "php.ini" file to
the built-in Web server.  Interactively, when invoked with a prefix
argument, 'php-ts-mode-run-php-webserver' prompts for the config file as
well as for other connection parameters.

---
*** The user option 'php-ts-mode-css-fontify-colors' has been removed.
'mhtml-ts-mode-css-fontify-colors' replaces this option.

---
*** New user option 'php-ts-mode-html-relative-indent'.
In buffers containing both PHP and HTML, this option allows you to
define how the PHP code should be indented relative to the position of
the HTML tags.

---
*** New user option 'php-ts-mode-html-indent-offset'.
Offset of PHP code block relative to HTML tags.

---
*** New user option 'php-ts-mode-find-sibling-rules'.
Rules for finding siblings of a PHP file.

---
*** New user option 'php-ts-mode-phpdoc-highlight-errors'.
When non nil, it highlights unknown PHPDOC tags using
'font-lock-warning-face' so that the user can identify them more easily.

---
*** New command 'php-ts-mode-show-ini'.
Show the location of the PHP ini files.  If the current buffer is
associated to a remote PHP file, show the remote PHP ini files.

** Rust-ts mode

---
*** New user option 'rust-ts-mode-fontify-number-suffix-as-type'.
Rust number literals may have an optional type suffix.  When this option
is non-nil, this suffix is fontified using 'font-lock-type-face'.

** EIEIO

---
*** New value 'warn' for 'eieio-backward-compatibility'.
This is the new default value and causes warnings to be emitted
at run-time for the use of the associated deprecated features.
'(setq eieio-backward-compatibility t)' can be used to recover
the previous silence.

** Text mode

---
*** New commands to convert between ASCII and full-width characters.
New commands 'fullwidth-region' and 'fullwidth-word' convert ASCII
characters in region or in the word at point to the corresponding
full-width characters, which are customarily used instead of ASCII
characters in CJK texts.  For example, 'A' is converted to 'A', '1' is
converted to '1', etc.  Companion commands 'halfwidth-region' and
'halfwidth-word' perform the opposite conversion.

** Texinfo mode

---
*** texinfo-mode now can auto-close the ``'' pairs.
Now inserting `` in 'texinfo-mode' will close it by inserting its
respective '', if 'electric-pair-mode' is enabled.


** ASM mode

---
*** 'asm-mode-set-comment-hook' is obsolete.
You can now set 'asm-comment-char' from 'asm-mode-hook' instead.

** Ibuffer

---
*** New column 'recency' in Ibuffer display.
The user option 'ibuffer-formats' configures the Ibuffer formats.  Add
'recency' to the format to display the column.

---
*** New value 'title' for the user option 'ibuffer-use-header-line'.
Display column titles in the header line if 'ibuffer-use-header-line' is
set to 'title'.

---
*** New user option 'ibuffer-human-readable-size'.
When non-nil, buffer sizes are shown in human readable format.

---
*** 'define-ibuffer-op' prompts can now be functions.
The prompts 'opstring' and 'active-opstring' can now either be strings
or functions.  This is useful when your prompts can benefit from dynamic
content.

** ElDoc

---
*** New ElDoc function 'elisp-eldoc-funcall-with-docstring'.
This function includes the current function's docstring in the ElDoc
echo area and can be used as a more detailed alternative to
'elisp-eldoc-funcall'.

---
*** New user option 'elisp-eldoc-funcall-with-docstring-length'.
This user option specifies how long function docstrings must be
displayed in 'elisp-eldoc-funcall-with-docstring'.  If set to 'short'
(the default), only display the first sentence of the docstring.
Otherwise, if set to 'full', display the full docstring.

---
*** New user option 'elisp-eldoc-docstring-length-limit'.
This user option controls the maximum length of docstrings in character
units that 'elisp-eldoc-funcall-with-docstring' and
'elisp-eldoc-var-docstring-with-value' will show.  By default, it is set
to 1000 characters.

** Buffer Menu

---
*** New user option 'Buffer-menu-human-readable-sizes'.
When non-nil, buffer sizes are shown in human readable format.  The
default is nil, which retains the old format.

** Term

*** The terminal emulator now supports auto-margins control.
Term mode now handles DECAWM escape sequences that control whether text
automatically wraps at the right margin:

- \e[?7h enables auto-margins (default)
- \e[?7l disables auto-margins

When auto-margins is disabled, characters that would go beyond the right margin
are discarded, which matches the behavior of physical terminals and other
terminal emulators. Control sequences and escape sequences are still processed
correctly regardless of margin position.

---
** SMerge

*** New command 'smerge-extend' extends a conflict over surrounding lines.

*** New command 'smerge-refine-exchange-point' to jump to the other side.
When used inside a refined chunk, it jumps to the matching position in
the "other" side of the refinement: if you're in the new text, it jumps
to the corresponding position in the old text and vice versa.

*** New user option 'smerge-refine-shadow-cursor'.
When 'smerge-refine' shows the conflict diffs at word granularity, a
"shadow cursor" is now displayed in the "lower" version when point
is in the "upper" version, and vice versa.  The "shadow cursor" is
just the character corresponding to the position where
'smerge-refine-exchange-point' would jump, shown in a new distinct
face 'smerge-refine-shadow-cursor', by default a box face.

** Cursor Sensor mode

+++
*** New direction 'moved' used when the cursor moved within the active area.

** Image Dired

*** 'image-dired-show-all-from-dir' takes the same first argument as 'dired'.
This allows passing a string with wildcards, or a cons cell where the
first element is a list and the rest is a list of files.

*** Bound unused letters in 'image-dired-thumbnail-mode-map'.
For a more comfortable navigation experience (as in, no modifier keys),
the keys 'f', 'b', 'n', 'p', 'a' and 'e' are now bound to the
same functions as their 'C-' counterparts.

** Browse URL

*** New user option 'browse-url-transform-alist'.
This user option is an alist that allows transforming URLs before asking
a web browser to load them.  For example, it could be used like this:

    (add-to-list 'browse-url-transform-alist
                 '("www.google.com" . "www.duckduckgo.com"))

*** New function 'browse-url-qutebrowser' for Qutebrowser.
For better integration with Qutebrowser, set
'browse-url(-secondary)-browser-function' to 'browse-url-qutebrowser'.

*** New GTK-native launch mode.
For better Wayland support, the pgtk toolkit exposes a new
'x-gtk-launch-uri' browse-url handler and uses it by default when URLs
are browsed from a PGTK frame.  For other frames, we fall back to the
default URL launch function.  This change allows us to properly raise
browser windows under Wayland using the xdg_activation_v1 protocol.

*** Removed support for some obsolete web browsers.
Conkeror (obsolete since Emacs 28.1), gnome-moz-remote (obsolete since
Emacs 25.1), and gnudoit (obsolete since Emacs 25.1).

** CL-Lib

+++
*** Derived types (i.e. 'cl-deftype')  can now be used as method specializers.
As part of this new support, the new function 'cl-types-of' returns
the list of types to which a value belongs.

+++
*** Some cl-lib functions and macros are now built-in.
These functions or macros have been added to Emacs Lisp, and the old
names are now aliases for the built-in equivalents:

- 'cl-incf'   renamed to 'incf'
- 'cl-decf'   renamed to 'decf'
- 'cl-oddp'   renamed to 'oddp'
- 'cl-evenp'  renamed to 'evenp'
- 'cl-plusp'  renamed to 'plusp'
- 'cl-minusp' renamed to 'minusp'

The old names are considered deprecated, and will be marked as obsolete
in some future release.

+++
*** 'cl-labels' now also accepts '(FUNC EXP)' bindings, like 'cl-flet'.
Such bindings make it possible to compute which function to bind to FUNC.

---
*** 'cl-block' names are now lexically scoped, as documented.

+++
*** 'cl-locally' is now obsolete.
It is an alias for the 'progn' special-form.

+++
*** 'cl-declare' is now obsolete; use 'defvar' instead.

+++
*** 'cl-gensym' is now obsolete; use 'gensym' instead.

+++
*** New macro 'cl-with-accessors'.
This macro is similar to 'with-slots', but uses accessor functions
instead of slot names.  It is useful when slots' accessor functions are
used repeatedly, such as reading from a slot and then writing to that
slot.  Symbol macros are created for the accessor functions using
'cl-symbol-macrolet', so that they can be used with 'setq' and 'setf'.

** Whitespace

---
*** 'whitespace-cleanup' now adds missing newline at end of file.
If 'whitespace-style' includes 'missing-newline-at-eof' (which is the
default), the 'whitespace-cleanup' function will now add the newline.

---
*** 'whitespace-mode' now can prettify page delimiter characters ('^L').
If 'page-delimiters' is set in 'whitespace-style', or the new minor mode
'whitespace-page-delimiters-mode' is on, the page delimiter characters
('^L') are displayed as a pretty horizontal line that spans the entire
width of the window.  The new 'whitespace-page-delimiter' face can be
used to customize the appearence.

** Bookmark

---
*** Bookmark history now saves each bookmark only once.
Previously, the variable 'bookmark-history' accumulated duplicate
bookmark names when bookmark features were used interactively.  This
made their history larger than necessary for frequent bookmark users.
Bookmark names are now saved uniquely.

---
*** New user option 'bookmark-bmenu-type-column-width'.
This user option controls the width of the type column on the bookmark
menu 'bookmark-bmenu-list'.  The default value is 8 which is backwards
compatible.

** Recentf

---
*** New user option 'recentf-show-messages'.
'recentf-save-list' can print a message when saving the recentf list.
The new option, if set to nil, suppresses this message.

---
*** New user option 'recentf-suppress-open-file-help'.
By default, invoking 'recentf-open-files' displays a message saying what
action clicking or typing 'RET' on the item at point executes, and tabbing
between items in the "*Open Recent*" buffer likewise displays such
messages.  To suppress these messages, customize the user option
'recentf-suppress-open-file-help' to non-nil.  The default value of this
option is nil.

** Saveplace

---
*** You can now regularly auto-save places.
Customize user option 'save-place-autosave-interval' to the number of
seconds between auto saving places.  For example, to save places every 5
minutes:

    M-x customize-option RET save-place-autosave-interval RET 300

Or in Elisp:

    (setopt save-place-autosave-interval (* 60 5))

If 'save-place-autosave-interval' is nil, auto saving is disabled; this
is the default.  As before, saved places are scheduled to be saved at
Emacs exit.

** Savehist

---
*** The history file can be modified by external tools.
Emacs can now handle this case gracefully by merging the external
and internal history information.
This feature is activated only when 'savehist-additional-variables' is nil.

---
*** Savehist no longer saves additional variables more than once.
If you configured 'savehist-additional-variables' with variables that
were also dynamically accumulated in minibuffer history during
minibuffer use, they are now saved only once in the file specified by
'savehist-file'.  Previously, they were saved twice.

** Rectangle Mark

---
*** New user option to control whether empty rectangle selections are shown.
The new user option 'rectangle-indicate-zero-width-rectangle' can be
used to disable the default display of empty rectangular selections.
The default is t; set it to nil to disable the indication (which causes
a horizontal shift of text on display, and thus could be annoying).

** Message

---
*** "In-Reply-To" header contains only a message id.
The "In-Reply-To" header created when replying to a message now contains
only the originating message's id, conforming to RFC 5322.  The previous
behavior included additional information about the originating message.
The new variable 'message-header-use-obsolete-in-reply-to', nil by
default, can be set to a non-nil value to restore the previous behavior.

+++
*** Hashcash support has been removed.
It is believed to no longer be useful as a method to fight spam.  The
'message-generate-hashcash' option is now obsolete and has no effect.

** Gnus

---
*** Replying to icalendar events now supports specifying a comment.
When called with a prefix argument, accepting, declining, or tentatively
accepting an icalendar event will prompt for a comment to add to the
response.

+++
*** Hashcash support has been removed.
It is believed to no longer be useful as a method to fight spam.  The
'spam-use-hashcash' hook is now obsolete and has no effect.

** Sieve

+++
*** New keybinding to refresh buffer in 'sieve-manage-mode'.
'sieve-refresh-scriptlist' is now bound to 'g' to refresh the contents
of the current sieve buffer.

** Button

+++
*** New function 'unbuttonize-region'.
It removes all the buttons in the specified region.

+++
*** Disabling 'button-mode' now removes all buttons in the current buffer.

** Shell

+++
*** Shell buffers now support bookmarks.
You can now bookmark local and remote shell buffers using the bookmark
menu 'bookmark-bmenu-list', or by using the command 'bookmark-set'.
Shell bookmarks can be loaded via the menu and by using the command
'bookmark-jump', which open a bookmarked shell, restore its buffer name,
its current directory, and create a remote connection, if necessary.
You can customize 'shell-bookmark-name-function'.

*** New command to complete the shell history.
'comint-complete-input-ring' ('C-x <up>') is like 'minibuffer-complete-history'
but completes on comint inputs.

---
*** 'ansi-osc-directory-tracker' now respects remote directories.
Remote directories are now retained when changes to 'default-directory'
are detected by this filter.  For example, "/ssh:hostname:/home/username"
would have been stripped to just "/home/username" before.

** Eshell

---
*** New interactive command 'eshell-clear'.
This command scrolls the screen so that only the current prompt is
visible, optionally erasing all the previous input/output as well.
Previously, the Eshell built-in command 'eshell/clear' supported this
(e.g., to call it via 'M-x'), but this new command behaves more
consistently if you have a partially-typed command at the Eshell prompt.

---
*** New user option 'eshell-command-async-buffer'.
This option lets you tell 'eshell-command' how to respond if its output
buffer is already in use by another invocation of 'eshell-command', much
like 'async-shell-command-buffer' does for 'shell-command'.  By default,
this will prompt for confirmation before creating a new buffer when
necessary.  To restore the previous behavior, set this option to
'confirm-kill-process'.

+++
*** 'eshell-execute-file' is now an interactive command.
Interactively, this now prompts for a script file to execute.  With the
prefix argument, it will also insert any output into the current buffer
at point.

+++
*** 'eshell-command' and 'eshell-execute-file' can now set where stderr goes.
These functions now take an optional ERROR-TARGET argument to control
where to send the standard error output.  See the "(eshell) Entry
Points" node in the Eshell manual for more details.

+++
*** You can now loop over ranges of integers with the Eshell 'for' command.
When passing a range like 'BEGIN..END' to the Eshell 'for' command,
Eshell will now iterate over each integer between BEGIN and END, not
including END.

+++
*** Conditional statements in Eshell now use an 'else' keyword.
Eshell now prefers the following form when writing conditionals:

    if {conditional} {true-subcommand} else {false-subcommand}

The old form (without the 'else' keyword) is retained for compatibility.

+++
*** You can now chain conditional statements in Eshell.
When using the newly-preferred conditional form in Eshell, you can now
chain together multiple 'if'/'else' statements.  For more information,
see "(eshell) Control Flow" in the Eshell manual.

+++
*** Eshell's built-in 'wait' command now accepts a timeout.
By passing '-t' or '--timeout', you can specify a maximum time to wait
for the processes to exit.  Additionally, you can now wait for external
processes by passing their PIDs.

---
*** New hook 'eshell-after-initialize-hook'.
This hook runs after an Eshell session has been fully initialized,
immediately before running 'eshell-post-command-hook' for the first
time.

+++
*** Improved history Isearch.
History Isearch in Eshell is reworked.  Two new commands
'eshell-isearch-backward-regexp' and 'eshell-isearch-forward-regexp' are
added for incrementally searching through the input history.
'eshell-isearch-backward-regexp' is bound to 'M-r' by default, and 'M-s'
is freed for normal search commands.  If you would like to restore the
previous key-bindings for the non-incremental search commands, put in
your configuration:

    (with-eval-after-load 'em-hist
      (keymap-set eshell-hist-mode-map "M-r"
                  #'eshell-previous-matching-input)
      (keymap-set eshell-hist-mode-map "M-s"
                  #'eshell-next-matching-input))

+++
*** New user option 'eshell-history-isearch'.
When 'eshell-history-isearch' is nil (the default), Isearch commands
search in the buffer contents.  If you customize it to t, those commands
only search in input history.  If you customize it to the symbol 'dwim',
those commands search in input history only when the point is after the
last prompt.

** Mail Utils

+++
*** New user option 'mail-re-regexps'.
This contains the list of regular expressions used to match "Re:" and
international variants of it when modifying the Subject field in
replies.

** Imap

---
*** 'imap-authenticate' can now use PLAIN authentication.
"AUTH=PLAIN" support is auto-enabled if the IMAP server supports it.  If
you do not wish to use "AUTH=PLAIN", pass a specific authentication type
to 'imap-open' for 'imap-authenticate' to use, or remove 'plain' from
'imap-authenticators'.

** Rmail

+++
*** 'rmail-re-abbrevs' default value is now derived from 'mail-re-regexps'.
'mail-re-regexps' is a new user option that is easier to customize than
'rmail-re-abbrevs'.  'rmail-re-abbrevs' is still honored if it was
already set.

+++
*** New user option 'rmail-mime-save-action'.
This option specifies an action to take after saving a MIME attachment.
Predefined values include visiting the file in Emacs, jumping to the
file in Dired, or opening the file with an external program.  You can
also provide a custom function.

** Message

+++
*** 'message-subject-re-regexp' default value is now derived from 'mail-re-regexps'.
'mail-re-regexps' is a new user option that is easier to customize than
'message-subject-re-regexp'.  'message-subject-re-regexp' is still
honored if it was already set.

+++
*** 'message-strip-subject-re' now matches case-insensitively.

** SHR

+++
*** SHR now slices large images into rows.
Sliced images allow for more intuitive scrolling up/down by letting you
scroll past each slice, instead of jumping past the entire image.
Previously, SHR sliced images when zoomed to their original size, no
matter how large or small that was.  Now, SHR slices any images taller
than 'shr-sliced-image-height'.  For more information, see the "(eww)
Advanced" node in the EWW manual.

---
*** You can now customize the image zoom levels to cycle through.
By customizing 'shr-image-zoom-levels', you can change the list of zoom
levels that SHR cycles through when calling 'shr-zoom-image'.

---
*** New user option 'shr-fill-text'.
When 'shr-fill-text' is non-nil (the default), SHR will fill text
according to the width of the window.  If you customize it to nil, SHR
will leave the text as-is; in that case, EWW will automatically enable
'visual-line-mode' when displaying a page so that long lines are
visually wrapped at word boundaries.

** EWW

---
*** EWW now enables 'visual-wrap-prefix-mode' when 'shr-fill-text' is nil.
By default, 'shr-fill-text' is t, and EWW fills the text according to
the width of the window.  If you customize 'shr-fill-text' to nil, EWW
will now automatically turn on 'visual-wrap-prefix-mode' in addition to
'visual-line-mode', so that long lines are wrapped at word boundaries
near window edge and the continuation lines are indented using prefixes
computed from surrounding context.

---
*** New user option 'eww-guess-content-type-functions'.
The value is a list of functions that EWW should call to determine the
content-type of Web pages which don't have a valid 'Content-Type'
header.  The default value is a function that considers a page with an
HTML 'doctype' declaration to have context-type "text/html".

+++
*** 'eww-switch-to-buffer' falls back to 'eww'.
When there is no EWW buffer, 'eww-switch-to-buffer' falls back to
calling 'eww'.

** Url Queue

---
*** 'url-queue-retrieve' now makes use of some url request variables.
The variables 'url-request-data', 'url-request-method', and
'url-request-extra-headers' can now be bound around a call to
'url-queue-retrieve'.  Binding them has the same effect as for
'url-retrieve'.

** CC mode

+++
*** New type of 'c-offsets-alist' element.
The 'cdr' of such an alist element may now be a syntactic symbol.  A
source line with a syntactic element whose symbol is the 'car' of that
alist element is indented as though it were the 'cdr'.

+++
*** Enums now have their own syntactic symbols.
The new symbols 'enum-open', 'enum-close', 'enum-intro' and
'enum-entry' are used in the analysis of enum constructs.  Previously,
they were given 'brace-list-open', etc.  These are fully described in
the "(ccmode) Enum Symbols" node of the CC mode manual.

+++
*** Enums are now, by default, indented like classes, not brace-lists.
To get the old behavior back, add an element '(enum-open
. brace-list-open)' to 'c-offsets-alist' in your CC mode style, or amend
'c-offsets-alist' likewise in any of the other ways detailed in the
"(ccmode) Config Basics" node of the CC mode manual.

** Emacs Lisp mode

---
*** Checkdoc no longer warns about missing footer lines in some cases.
Emacs Lisp libraries have traditionally ended with a footer line
(sometimes referred to as "terminating comment").  Their purpose was to
easily detect files that had been truncated in transit on ancient and
less reliable connections:

    ;; some-cool-package.el ends here

'checkdoc' will no longer warn if that line is missing for packages that
explicitly only support Emacs 30.1 or later, as specified in the
"Package-Requires" header.  The reason for keeping the warning for
packages that support earlier versions of Emacs is that package.el in
those versions can't install packages where that line is missing.

This change affects both 'M-x checkdoc' and the corresponding flymake
backend.

---
*** Checkdoc no longer warns about wide docstrings.
The Checkdoc warning for wide docstrings duplicates the byte-compiler
warning added in Emacs 28.1.  This redundancy is now removed.

---
*** New user option 'checkdoc-arguments-missing-flag'.
Set this to nil to disable warnings for function arguments that are not
documented in docstrings.

---
*** Checkdoc will now flag incorrect formatting in warnings.
This affects calls to 'warn', 'lwarn', 'display-warning', and
'message-box'.

---
*** New user option 'checkdoc-allow-quoting-nil-and-t'.
Customizing this option to a non-nil value stops checkdoc from warning
for docstrings where symbols 'nil' and 't' are in quotes.

---
*** The default of 'checkdoc-verb-check-experimental-flag' is now nil.
In most cases, having it enabled leads to a large amount of false
positives.

** IELM

---
*** IELM input history is now saved also when the IELM process is killed.
When you kill the IELM process with 'C-c C-c', the input history is now
saved to the file specified by 'ielm-history-file-name', just like when
you exit the Emacs session or kill the IELM buffer.

** DocView

---
*** Dedicated buffer for plain text contents.
When switching to the plain text contents with 'doc-view-open-text',
DocView now creates a dedicated buffer to display it.  'C-c C-c' gets you
back to the real DocView buffer if it still exists.

+++
*** New commands to save and restore pages in buffer-local registers.
Docview can store the current page to buffer-local registers with the new
command 'doc-view-page-to-register' (bound to 'm'), and later the stored
page can be restored with 'doc-view-jump-to-register' (bound to ''').

+++
*** Docview can generate imenu indices for DjVu and ODF documents.
When the 'djvused' program is available, Docview can now generate an imenu
index for DjVu files from its outline.  Indices for Open Document Format
(ODF) files as used by OpenOffice and LibreOffice are generated using
the 'mutool' program after their initial conversion to PDF format.  The
name of the 'djvused' program can be customized by changing the user
option 'doc-view-djvused-program'.

** Ispell

---
*** The default value of 'ispell-help-timeout' has changed.
The default value is now 30 seconds, as the old value was too short to
allow reading the help text.

** Flyspell

---
*** New user option 'flyspell-delay-use-timer'.
By default, Flyspell waits after so-called "delayed" commands by calling
'sit-for'.  If you customize this option to non-nil, Flyspell instead
sets up a timer to perform spell-checking after a short delay, which
allows idle timers and other code to run during this delay period.  We
consider making this behavior the default in a future Emacs version, so
we invite Flyspell users to enable this new option and report issues.

---
*** 'turn-on-flyspell' and 'turn-off-flyspell' are obsolete.
To unconditionally enable 'flyspell-mode' from a hook, use this instead:

    (add-hook 'text-mode-hook #'flyspell-mode)

** Tramp

+++
*** New command 'tramp-cleanup-bufferless-connections'.
Connection-related objects for which no associated buffers exist, except
for Tramp internal buffers, are flushed.  This is helpful to prune
connections after you close remote-file buffers without having to either
cherry pick via 'tramp-cleanup-connection' or clear them all via
'tramp-cleanup-all-connections'.

+++
*** New command 'tramp-dired-find-file-with-sudo'.
This command, bound to '@' in Dired, visits the file or directory on the
recent Dired line with superuser, or root, permissions.

+++
*** 'C-x x @' is now bound to 'tramp-revert-buffer-with-sudo'.
You can use 'C-u C-x x @' to select a Tramp method other than the
default, "sudo".

+++
*** 'tramp-file-name-with-method' can now be set as connection-local variable.

+++
*** Connection method "kubernetes" supports now optional namespace.
The host name for Kubernetes connections can be of kind
[CONTAINER.]POD[%NAMESPACE], in order to specify the namespace to be
used.  This overrides the setting in 'tramp-kubernetes-namespace', if
any.

+++
*** Different proxies for the same destination host name can be specified.
A typical example are docker containers, which run on different hosts
under the same docker name.  When the user option
'tramp-show-ad-hoc-proxies' is non-nil, such ad-hoc multi-hop file names
can be used in parallel.  Example: on both remote hosts "host1" and
"host2" there is a docker container "name", respectively:

    /ssh:user1@host1|docker:name:
    /ssh:user2@host2|docker:name:

This feature is experimental.

---
*** Implementation of filesystem notifications for connection method "smb".

+++
*** New functions to extend the set of operations with a remote implementation.
The new functions 'tramp-add-external-operation' and
'tramp-remove-external-operation' allow to add an implementation for
other operations but the defined set of magic file name operations.
This can be used by external ELPA packages for performance optimizations
in special cases.  For more information, see "(tramp) New operations" in
the Tramp manual.

** Diff

---
*** New command 'diff-kill-ring-save'.
This command copies to the 'kill-ring' a region of text modified
according to diffs in the current buffer, but without applying the diffs
to the original text.  If the selected range extends a hunk, the
command attempts to look up and copy the text in between the hunks.

+++
*** New command 'diff-revert-and-kill-hunk' bound to 'C-c M-r'.
This command reverts the hunk at point (i.e., applies the reverse of the
hunk), and then removes the hunk from the diffs.
This is useful to undo or revert changes, committed and uncommitted, when
you are in buffers generated by 'C-x v =' and 'C-x v D'.

---
*** 'diff-file-prev' and 'diff-hunk-prev' always move to start of header.
Previously, 'diff-file-prev' and 'diff-hunk-prev' would move when point
is after the corresponding file or hunk header, but not when inside it.
Now they will always move to the start of the current header.

+++
*** New command 'diff-delete-other-hunks' bound to 'C-c RET n'.
This command deletes all hunks other than the current hunk.  It is
useful to prepare a "*vc-diff*" buffer for committing a single hunk.
When the region is active, it deletes all hunks that the region does not
overlap.

*** 'diff-apply-hunk' now supports creating and deleting files.

---
*** 'vc-version-diff' and 'vc-root-version-diff' changed default for REV1.
They suggest the previous revision as the default for REV1, not the last
one as before.  This makes them different from 'vc-diff' and
'vc-root-diff' when those are called without a prefix argument.

** Ediff

+++
*** Ediff's copy commands now apply to all changes with 'C-u' prefix.
The Ediff copy commands, bound to 'a', 'b', 'ab', etc., now copy all
changes when supplied with a universal prefix argument via 'C-u':

- 'C-u a' copies all changes from buffer A to buffer B (in 2-way diff)
  or to buffer C (in 3-way diff or merge).
- 'C-u b' copies all changes from buffer B to buffer A (in 2-way diff)
  or to buffer C (in 3-way diff or merge).
- 'C-u a b' copies all changes from buffer A to buffer B.
- 'C-u b a' copies all changes from buffer B to buffer A.
- 'C-u a c' copies all changes from buffer A to buffer C.
- 'C-u b c' copies all changes from buffer B to buffer C.
- 'C-u c a' copies all changes from buffer C to buffer A.
- 'C-u c b' copies all changes from buffer C to buffer B.

+++
*** Ediff now supports more flexible custom window layouts.
Custom implementations of 'ediff-window-setup-function' no
longer need to display *all* Ediff windows.  Any of the A, B, C,
and control windows can be left undisplayed and the corresponding
variable set to nil.  This change enables custom layouts without
a control panel window.

** Dired

---
*** New user option 'dired-create-empty-file-in-current-directory'.
When non-nil, 'dired-create-empty-file' creates a new empty file and
adds an entry for it (or its topmost new parent directory if created)
under the current subdirectory in the Dired buffer by default
(otherwise, it adds the new file (and new subdirectories if provided) to
whichever directory the user enters at the prompt).  When nil,
'dired-create-empty-file' acts on the default directory by default.

Note that setting this user option to non-nil makes invoking
'dired-create-empty-file' outside of a Dired buffer raise an error (like
other Dired commands that always prompt with the current subdirectory,
such as 'dired-create-directory').

+++
*** New user option 'dired-check-symlinks' allows disabling validity checks.
Dired uses 'file-truename' to check symbolic link validity when
fontifying them, which can be slow for remote directories.  Setting
'dired-check-symlinks' to nil disables these checks.  Defaults to t, can
be set as a connection-local variable.

---
*** New user option 'dired-hide-details-hide-absolute-location'.
When Dired's 'dired-hide-details-mode' is enabled, also hide the
'default-directory' absolute location, typically displayed as the first
line in a Dired buffer.

With 'dired-hide-details-hide-absolute-location':

    project: (100 GiB available)

Without 'dired-hide-details-hide-absolute-location':

    /absolute/path/to/my/important/project: (100 GiB available)

---
*** Clicking on base name of directory reverts buffer.
When 'dired-make-directory-clickable' is non-nil, clicking on the base
name of the directory now reverts the Dired buffer.

*** 'dired-copy-filename-as-kill' supports project-relative names.
With a new value of the prefix argument (1), this command copies file
names relative to the root directory of the current project.

** Grep

+++
*** Grep results can be edited to reflect changes in the originating file.
Like Occur Edit mode, typing 'e' in the "*grep*" buffer will now make
the 'grep' results editable.  The edits will be reflected in the buffer
visiting the originating file.  Typing 'C-c C-c' will leave the Grep
Edit mode.

** Imenu

---
*** New user option 'imenu-allow-duplicate-menu-items'.
This specifies whether Imenu can include duplicate menu items.
Duplicate items are now allowed by default (option value t), which
restores the behavior before Emacs 29.  Customize this to nil to get the
behavior of Emacs 29 and Emacs 30.

** Time Stamp

---
*** 'time-stamp' can up-case, capitalize and down-case date words.
This control can be useful in languages in which days of the week and/or
month names are capitalized only at the beginning of a sentence.  For
details, see the built-in documentation for user option 'time-stamp-format'.

Because this feature is new in Emacs 31.1, do not use it in the local
variables section of any file that might be edited by an older version
of Emacs.

---
*** Some historical 'time-stamp' conversions now warn.
'time-stamp-pattern' and 'time-stamp-format' had quietly accepted
several 'time-stamp' conversions (e.g., "%:y") that have been deprecated
since Emacs 27.1.  These now generate a warning with a suggested
migration.

Merely having '(add-hook 'before-save-hook 'time-stamp)'
in your Emacs init file does not expose you to this change.
However, if you set 'time-stamp-format' or 'time-stamp-pattern'
with a file-local variable, you may be asked to update the value.

** TeX modes

+++
*** New Xref backend for TeX modes.
The new backend ('tex-etags') is on by default, and improves the
functionality of the standard 'xref' commands in TeX buffers.  You can
restore the standard 'etags' backend with the 'M-x xref-etags-mode'
toggle.

** BibTeX mode

---
*** New user options facilitate customization of BibTeX and biblatex entries.
Entry definitions via the user options 'bibtex-BibTeX-aux-entry-alist',
'bibtex-biblatex-aux-entry-alist', 'bibtex-BibTeX-aux-opt-alist', and
'bibtex-biblatex-aux-opt-alist' take precedence over
'bibtex-BibTeX-entry-alist' and 'bibtex-biblatex-entry-alist'.
These user options now support the definition of aliases that inherit
the definition of another entry.

---
*** 'bibtex-user-optional-fields' has been renamed to 'bibtex-aux-opt-alist'.
The old name is an obsolete alias.

---
*** 'bibtex-include-OPTkey' is now obsolete and its default is nil.
Use 'bibtex-aux-opt-alist' instead.

---
*** New user option 'bibtex-entry-ask-for-key'.
When enabled, 'bibtex-entry' asks for a key.

---
*** 'bibtex-string-file-path' and 'bibtex-file-path' are lists of directories.
For backward compatibility, considered obsolete, these user options
may still be strings with colon separated lists of directories.

** Midnight mode

---
*** Change for activating the mode.
Putting '(require 'midnight)' in your init file no longer activates the
mode.  Now, one needs to say '(midnight-mode +1)' instead.

** Python mode

*** New 'repeat-map' for Python indentation commands.
The commands 'python-indent-shift-left' and 'python-indent-shift-right'
can now be repeated using 'repeat-mode'.  With 'repeat-mode' enabled,
after invoking one of these commands via 'C-c <' or 'C-c >', you can
press '<' or '>' to repeat the command.

---
*** Prefer "python" for 'python-interpreter' and 'python-shell-interpreter'.
On recent versions of mainstream GNU/Linux distributions, "python"
either does not exist or it points to Python 3.  These user options now
default to using "python", falling back to "python3" if it does not
exist.  If "python" points to Python 2 on your system, you now have to
customize these variables to "python3" if you want to use Python 3
instead.

---
*** Python 2 support is now optional and disabled by default.
Since Python 2 EOL was over 5 years ago, this release removes Python
2-only builtins such as "file" from the default highlighting in
'python-mode' and 'python-ts-mode'.  If you would like them highlighted,
customize the new user option 'python-2-support' to a non-nil value and
restart Emacs.

---
*** Support of 'electric-layout-mode' added.

---
*** 'DEL' now deletes the text in the active region.
When point is between indentation, the command
'python-indent-dedent-line-backspace' (by default bound to 'DEL') now
deletes the text in the region and deactivates the mark if Transient
Mark mode is enabled, the mark is active, and prefix argument is 1.

** Tmm Menubar

---
*** A new shortcut to navigate to previous menu.
The hardcoded '^' shortcut gets you back to the previous menu.

---
*** New user option 'tmm-shortcut-inside-entry'.
When non-nil, highlight the character shortcut in the menu entry's
string instead of preprending it and 'tmm-mid-prompt' to said entry.

** Foldout

---
*** New command 'foldout-widen-to-current-fold'.
This command widens the view to the current fold level when in a fold,
or behaves like 'widen' if not in a fold.

** MPC

---
*** New user option 'mpc-notifications'.
When non-nil, MPC (the Emacs front-end to Music Player Daemon) displays
a desktop notification when the song changes, using
'notifications-notify'.  The notification's title and body can be
customized using the new user options 'mpc-notifications-title' and
'mpc-notifications-body'.

---
*** New user option 'mpc-crossfade-time'.
When non-nil, MPC will crossfade between songs for the specified number
of seconds.  Crossfading can be toggled using the command
'mpc-toggle-crossfade' or from the MPC menu.

---
*** New command 'mpc-describe-song'.
This command displays information about the currently playing song or
song at point in the "*MPC-Songs*" buffer.  The list of tags to display
can be customized using the new user option 'mpc-song-viewer-tags' and
the appearance of the list with the new faces 'mpc-table-key',
'mpc-table-value', and 'mpc-table-empty'.

---
*** New command 'mpc-server-stats'.
This command displays information about the connected MPD server.  The
appearance of the list can be customized with the new faces
'mpc-table-key' and 'mpc-table-value'.

** VC

+++
*** New commands to handle repositories with multiple working trees.
Some VCS support more than one working tree with the same backing
revisions store, such as with Git's 'worktree' subcommand and
Mercurial's 'share' extension.  Emacs now has some commands to manage
other working trees:

- 'C-x v w c': Add a new working tree.
- 'C-x v w w': Visit this file in another working tree.
- 'C-x v w s': Like 'C-x p p' but limited to other working trees.
- 'C-x v w a': Copy or move fileset changes to another working tree.
- 'C-x v w A': Copy or move all changes to another working tree.
- 'C-x v w x': Delete a working tree you no longer need.
- 'C-x v w R': Relocate a working tree to another file name.

The new user option 'vc-no-confirm-moving-changes' controls whether
'C-x v w a' and 'C-x v w A' ask for confirmation when moving changes
between working trees.  The default is to ask for confirmation.

In addition, Lisp programs that extend VC can invoke the new backend
functions to obtain a list of other working trees, and to add, remove
and relocate them.

---
*** Using 'e' from Log View mode to modify change comments now works for Git.

---
*** New user option 'vc-allow-rewriting-published-history'.
Some VCS commands can change your copy of published change history
without warning.  In VC we try to detect before that happens, and stop.
You can customize this option to permit rewriting history even though
Emacs thinks it is dangerous.

---
*** 'vc-clone' is now an interactive command.
When called interactively, 'vc-clone' now prompts for the remote
repository address, and the directory into which to clone the
repository.  It tries to automatically determine the VC backend for
cloning, or prompts for that, too.

---
*** 'vc-clone' now accepts an optional argument OPEN-DIR.
When the argument is non-nil, the function switches to a buffer visiting
the directory into which the repository was cloned.

---
*** 'C-x v u' ('vc-revert') now works on directories listed in VC Directory.
Reverting a directory means reverting changes to all files inside it.

+++
*** New global minor mode 'vc-auto-revert-mode'.
This is like 'global-auto-revert-mode' but limited to VCS-tracked files.
As compared with VC's existing, default support for reverting files
after VCS operations, the new mode is a more reliable way to ensure that
Emacs reverts buffers visiting tracked files when VCS operations change
the contents of those files.

*** New command 'log-edit-done-strip-cvs-lines'.
This command strips all lines beginning with "CVS:" from the buffer.
It is intended to be added to the 'log-edit-done-hook' so that
'vc-cvs-checkin' behaves like invoking 'cvs commit [files...]' from the
command line.

---
*** New user options 'vc-resolve-conflicts' and 'vc-*-resolve-conflicts'.
They control whether to mark a conflicted file as resolved when saving.
You can now control it globally, with 'vc-resolve-conflicts', or for
specific backends with 'vc-bzr-resolve-conflicts',
'vc-hg-resolve-conflicts', and 'vc-svn-resolve-conflicts'.

---
*** New value for 'vc-git-resolve-conflicts'.
The option now accepts the symbol 'default' as a value, which is
its default value.  Effectively, the default value hasn't changed,
since 'vc-resolve-conflicts' defaults to t, the previous default value
for 'vc-git-resolve-conflicts'.

---
*** VC Directory can now automatically add and remove marks on other lines.
When you try to use a mark or unmark command where doing so would only
be permitted if other lines were marked or unmarked first, Emacs
will now ask you if you'd like to change the marks on those other lines.
For example, if you try to mark a file contained within a directory that
is already marked, Emacs will offer to unmark the directory, first.
Previously, Emacs would simply refuse to make any changes.
You can customize 'vc-dir-allow-mass-mark-changes' to restore the old
behavior or dispense with the prompting.

---
*** New VC Directory bindings 'z d' and 'D' to delete Git stashes.
These correspond to the existing 'z p' to pop a stash and 'P' to pop the
stash at point (deleting the stash at point is also bound to 'C-k').

---
*** VC Directory can now register files when checking in mixed filesets.
Previously, if some files to be checked in were unregistered but others
were added, removed or edited, Emacs would refuse to proceed.
Now Emacs prompts to register the unregistered files, so that all
files in the fileset are in a compatible state for a checkin.

+++
*** 'C-x v v' handles missing and removed files more consistently.
Missing files are those which have been removed from the filesystem but
which are still tracked by version control.  Removed files are those
scheduled to be removed from version control in the next commit.
Previously, different backends were inconsistent about applying these
statuses to files, and 'C-x v v' behaved subtly differently for the two
statuses.  The combination of these differences between backends and in
'C-x v v' behavior was confusing.  Now,

- in VC Directory, you can use 'C-x v v' on missing files to mark them as
  removed
- when committing, you can include missing files in a set of files with
  different statuses, just like you've always been able to include
  removed files.

In addition, the Git backend has been fixed to display missing files as
'missing' instead of incorrectly subsuming them to the 'removed' status.

There is still some further work to do to rationalize VC's handling of
file removal.

---
*** New user option 'vc-dir-hide-up-to-date-on-revert'.
If you customize this option to non-nil, the 'g' command to refresh
the VC Directory buffer also has the effect of the 'x' command.
That is, typing 'g' refreshes the buffer and also hides items in the
'up-to-date' and 'ignored' states.

---
*** New user option 'vc-dir-save-some-buffers-on-revert'.
If you customize this option to non-nil, Emacs will offer to save
relevant buffers before generating the contents of a VC Directory buffer
(like the third-party package Magit does with its status buffer).

+++
*** New commands to report incoming and outgoing diffs.
'vc-root-diff-incoming' and 'vc-root-diff-outgoing' report diffs of all
the changes that would be pulled and would be pushed, respectively.
They are the diff analogues of the existing commands 'vc-log-incoming'
and 'vc-log-outgoing'.

In particular, 'vc-root-diff-outgoing' is useful as a way to preview
your push and ensure that all and only the changes you intended to
include were committed and will be pushed.

'vc-diff-incoming' and 'vc-diff-outgoing' are similar but limited to the
current VC fileset.

+++
*** New commands to report diffs of outstanding changes.
'C-x v B =' ('vc-diff-outgoing-base') and 'C-x v B D'
('vc-root-diff-outgoing-base') report diffs of changes since the merge
base with the remote branch, including uncommitted changes.
They are useful to view all outstanding (unmerged, unpushed) changes on
the current branch.

+++
*** New user option 'vc-use-incoming-outgoing-prefixes'.
If this is customized to non-nil, 'C-x v I' and 'C-x v O' become prefix
commands, such that the new incoming and outgoing commands have global
bindings:

- 'C-x v I L' is bound to 'vc-log-incoming'
- 'C-x v I D' is bound to 'vc-root-diff-incoming'
- 'C-x v O L' is bound to 'vc-log-outgoing'
- 'C-x v O D' is bound to 'vc-root-diff-outgoing'.

+++
*** New user option 'vc-async-checkin' to enable async checkin operations.
Currently only supported by the Git and Mercurial backends.

---
*** New 'log-edit-hook' option to display diff of changes to commit.
You can customize 'log-edit-hook' to include its new
'log-edit-maybe-show-diff' option to enable displaying a diff of the
changes to be committed in a window.  This is like the 'C-c C-d' command
in Log Edit mode buffers, except that it does not select the "*vc-diff*"
buffer's window, and so works well when added to 'log-edit-hook'.

+++
*** 'vc-rename-file' is now bound to 'C-x v R'.

---
*** 'vc-annotate' now abbreviates the Git revision in more cases.
In Emacs 30, 'vc-annotate' gained the ability to abbreviate the Git
revision in the buffer name.  Now, it also abbreviates the Git revision
when visiting other revisions, such as with
'vc-annotate-revision-previous-to-line'.

---
*** New buffer-local variable 'vc-buffer-overriding-fileset'.
Primarily intended for buffers not visiting files, this specifies the
VC backend and VCS-managed file name or file names to which the buffer's
contents corresponds.  It overrides the behavior of 'vc-deduce-fileset'.
This replaces and generalizes the old 'vc-annotate-parent-file'.

---
*** New buffer-local variable 'vc-buffer-revision'.
This specifies the revision to which the buffer's contents corresponds.
This replaces and generalizes the old 'vc-annotate-parent-rev'.

---
*** vc-dav.el is now obsolete.

---
*** The 'log-incoming' and 'log-outgoing' functions are deprecated.
Backend authors should implement the 'incoming-revision' and 'mergebase'
backend functions instead.  These are jointly sufficient to support the
'C-x v I' and 'C-x v O' commands.

---
*** Marking revisions in Log View now works more like other modes.
Previously, 'm' toggled whether the current revision was marked, and
didn't advance point.  Now 'm' only adds marks, 'u' removes marks, and
both advance point, like how marking works in Dired and VC Directory.
You can get back the old behavior with something like this:

    (with-eval-after-load 'log-view
      (keymap-set log-view-mode-map "m" #'log-view-toggle-mark-entry))

** Diff mode

+++
*** 'diff-apply-buffer' now considers the region and can reverse-apply.
If the region is active, this command now applies all hunks that the
region overlaps; otherwise, it applies all hunks.
With a prefix argument, it now reverse-applies the hunks.
This matches the existing prefix argument to 'diff-apply-hunk'.

** Package

+++
*** No longer warn if a package has no footer line.
package.el no longer warns for packages without a "footer line", which
is the line that usually appears at the very end of an Emacs Lisp file:

    ;;; FILENAME ends here

---
*** New optional argument to 'package-autoremove'.
An optional argument NOCONFIRM has been added to 'package-autoremove'.
If it is non-nil, or when invoked with a prefix argument,
'package-autoremove' will not prompt the user for confirmation before
removing packages.

---
*** New prefix argument for 'package-install-selected-packages'.
When invoked with a prefix argument, 'package-install-selected-packages'
will not prompt the user for confirmation before installing packages.

---
*** 'package-refresh-contents' runs asynchronously.
Refreshing the package index will no longer block when invoked
interactively.

---
*** 'package-upgrade' no longer accepts a string argument.
When called from Lisp, it now only accepts a symbol.

---
*** 'package-install-from-buffer' respects files marked by Dired.
When invoking the command in a Dired buffer with marked files,
the command will only copy those files.

+++
*** package-x.el is now obsolete.

---
*** Package menu now highlights packages marked for installation or deletion.

*** Package menu now displays the total number of the package type.
Package menu now displays in the mode line the total number of packages
installed, total number of packages from all the package archives, total
number of packages to upgrade and total number of new packages
available.

+++
*** New functions to query builtin package information.
'package-versioned-builtin-packages' returns a list of symbols of
built-in packages; 'package-builtin-package-version' returns the
version-list of a given package symbol.  These functions provide public
interfaces for external tools to query information about built-in
packages.

** Rcirc

+++
*** Authentication via NickServ can access passwords with auth-source.el.
For details, consult 'rcirc-authinfo'.

** Xref

---
*** Xref commands that jump to some location use 'display-buffer'.
The commands that jump to some location use 'display-buffer' and specify
the category 'xref-jump'.  As a result, you can customize how the
destination window is chosen using 'display-buffer-alist'.  Example:

    (setq display-buffer-alist '(((category . xref-jump)
                                  (display-buffer-reuse-window
                                   display-buffer-use-some-window)
                                  (some-window . mru))))

** Revert

+++
*** Variable 'revert-buffer-in-progress' has been renamed.
The old name, 'revert-buffer-in-progress-p', is kept as obsolete
variable alias.

Symbol names with a trailing '-p' are reserved for predicates.  Calling
a variable like this was a mistake.

** Autorevert

+++
*** New variable 'inhibit-auto-revert-buffers'.
While a buffer is member of this variable, a list of buffers,
auto-reverting of this buffer is suppressed.

+++
*** New macro 'inhibit-auto-revert'.
This macro adds the current buffer to 'inhibit-auto-revert-buffers',
runs its body, and removes the current buffer from
'inhibit-auto-revert-buffers' afterwards.

+++
*** New variable 'auto-revert-buffer-in-progress'.
'auto-revert-buffer' binds this variable to a non-nil value while it is
working.  This can be used by major mode 'revert-buffer-function'
implementations to suppress messages in Auto Revert modes, for example.

** Strokes

--
*** 'strokes-mode' no longer demands the presence of a mouse.
'strokes-mode' now permits itself to be enabled if no mouse is
connected, to facilitate enabling 'strokes-mode' in sessions where the
availability of a mouse device varies during execution (as is frequently
observed on Android).

** Yank Media

+++
*** 'yank-media' now auto-selects the most preferred MIME type.
Major-mode authors can customize the variables
'yank-media-autoselect-function' and/or 'yank-media-preferred-types' to
change the selection rules.

** Remember

---
*** Remember mode is now a minor mode.
The 'remember' command enables the major mode set in
'remember-initial-major-mode' and then the 'remember-mode' minor mode in
the 'remember-buffer'.  This allows users to customize the major mode
used to write notes.

---
*** New handler that appends remember data in directory.
The 'remember-append-in-data-directory' handler appends remember data in
a file, that file being choosen by the user through the minibuffer.

---
*** New prefix map for remember commands.
Meant to be given a global binding convenient to the user.  Example:

    (keymap-global-set "C-c r" 'remember-prefix-map)

** Speedbar

+++
*** New commands for Speedbar.

- 'speedbar-window-mode' opens Speedbar in a window instead of a frame.
- 'speedbar-window' is an alias for 'speedbar-window-mode'.

+++
*** New user options for Speedbar.

- 'speedbar-prefer-window' tells 'speedbar' to open a side window
  instead of a frame.
- 'speedbar-dedicated-window' defines whether the 'speedbar' is
  displayed in a dedicated window.
- 'speedbar-window-default-width' defines the initial width of the
  'speedbar-window'.
- 'speedbar-window-max-width' defines the maximum width of the
  'speedbar-window' when it is closed and then restored.

---
*** 'speedbar-easymenu-definition-trailer' is now a function.

** Icomplete

*** New user options for 'icomplete-vertical-mode'.
New user options have been added to enhance 'icomplete-vertical-mode':

- 'icomplete-vertical-in-buffer-adjust-list' aligns in-buffer
  completion to the original cursor column.
- 'icomplete-vertical-render-prefix-indicator' adds a prefix indicator
  to completion candidates.
- 'icomplete-vertical-selected-prefix-indicator' specifies the prefix
  string for the selected candidate.
- 'icomplete-vertical-unselected-prefix-indicator' specifies the prefix
  string for unselected candidates.

*** New faces for 'icomplete-vertical-mode'.
New faces have been added to 'icomplete-vertical-mode':

- 'icomplete-vertical-selected-prefix-indicator-face' controls the
  appearance of the selected candidate prefix.
- 'icomplete-vertical-unselected-prefix-indicator-face' controls the
  appearance of unselected candidate prefixes.

** Customize

---
*** New major mode 'Customize-dirlocals-mode'.
This is intended for customizing directory-local variables in the
current directory's ".dir-locals.el" file.

** Pulse

--
*** New function 'pulse-faces'.
This function pulses a specified list of faces.  The pulse duration is
determined by the new user option 'pulse-face-duration'.

** Miscellaneous

---
*** 'tooltip-mode' now shows tooltips after delay on TTY frames.
Display of tooltips on text-only terminals now happens after
'tooltip-delay' as it does on GUI terminals.  To get back the old
behavior, customize the value of 'tooltip-delay' to zero.

---
*** New user option 'follow-mode-prefix-key'.
This user option replaces 'follow-mode-prefix', which had to be set
before loading Follow mode.  This new option allows you to change the
prefix even after it was loaded, using 'customize-option' or 'setopt'.

---
*** cdl.el is now obsolete.
Use 'shell-command' and 'shell-command-on-region' instead.

---
*** echistory.el is now obsolete.

---
*** hashcash.el is now obsolete.
It is believed to no longer be useful as a method to fight spam.

---
*** kermit.el is now obsolete.

---
*** New user option 'ns-click-through' on Nextstep (GNUstep/Mac OS).
This controls whether activation clicks are passed through to Emacs
commands.  When nil, clicking on an inactive Emacs frame will only
activate it.  When t (the default), the click will both activate the
frame and be interpreted as a command.

---
*** New user option 'global-hl-line-modes'.
This specifies in which major modes should the 'global-hl-line-mode' be
switched on.  The default is t, which means enable it in all major
modes.

---
*** New user option 'display-fill-column-indicator-warning'.
Customize it to a non-nil value to have the fill-column indicators
change their face if the current line exceeds the 'fill-column'.  The
new face 'display-fill-column-indicator-warning-face' is used to
highlight the fill-column indicators.  By default, this is disabled.

---
*** New function 'flash-face-bell-function'.
This function flashes a face briefly.
It is intended to be used in 'ring-bell-function'.

---
*** New function 'flash-echo-area-bell-function'.
This function flashes the current echo area briefly.
It is intended to be used in 'ring-bell-function'.

---
*** New user option 'flash-face-duration'.
This option controls the flash duration for 'flash-face-bell-function'
and 'flash-echo-area-bell-function'.

---
*** New user option 'flash-face-faces'.
This option tells 'flash-face-bell-function' which faces should flash.

---
*** New user option 'flash-face-attributes'
This option tells 'flash-face-bell-function' and
'flash-echo-area-bell-function' which face attributes should be used
for flash.

+++
*** 'face-all-attributes' now accepts an optional argument INHERIT.
It has the same meaning as the INHERIT argument to 'face-attribute',
which already takes this argument for a single attribute.  This is
useful when you want the face attributes to be absolute and not
'unspecified'.

---
*** New user option 'ffap-prefer-remote-file'.
If non-nil, FFAP always finds remote files in buffers with remote
'default-directory'.  If nil, FFAP finds local files first for absolute
file names in above buffers.  The default is nil.

** Edebug

+++
*** New command 'edebug-bounce-to-previous-value' (bound to 'P').
This command temporarily displays the outside current buffer with the
outside point corresponding to the previous value, where the previous
value is what Edebug has evaluated before its last stop point or what
the user has evaluated in the context outside of Edebug.

This replaces the binding of command 'edebug-view-outside' to 'P', which
is still available on 'v'.

---
** Flymake

*** Enhanced 'flymake-show-diagnostics-at-end-of-line'
The new value 'fancy' allowed for this user option will attempt to
layout diagnostics below the affected line using unicode graphics to
point to diagnostic locus.

*** Enhanced 'flymake-show-buffer-diagnostics'.
The command 'flymake-show-buffer-diagnostics' is now capable of
highlighting a nearby diagnostic in the resulting listing.  Additionally,
it is bound to mouse clicks on fringe and margin indicators, operating
on the diagnostics of the corresponding line.  The user may bind it in
other situations such as the diagnostic overlay map.

*** More powerful 'flymake-make-diagnostic' API.
Flymake backends can now specify origin and code attributes, allowing
Flymake and other extensions to segregate diagnostics based on this
extended information.

*** New user option 'flymake-diagnostic-format-alist'.
This provides fine-grained control over diagnostic formatting across
different contexts, allowing you to specify which components (origin,
code, message or one-liner message) appear in each output destination.

*** Dynamic column sizing in diagnostic listings.
The tabulated listings produced by 'flymake-show-buffer-diagnostics' and
'flymake-show-project-diagnostics' now automatically adjust their column
widths based on content, optimizing display space and readability.

*** New user option 'elisp-flymake-byte-compile-executable'.
This allows customizing the Emacs executable used for Flymake byte
compilation in 'emacs-lisp-mode'.  This option should be set when editing
Lisp code which will run with a different Emacs version than the running
Emacs, such as code from an older or newer version of Emacs.  This will
provide more accurate warnings from byte compilation.

** SQLite

+++
*** SQLite databases can now be opened in read-only mode.
The new optional argument READONLY to 'sqlite-open' function allows to
open an existing database only for reading.

*** 'sqlite-open' now recognizes 'file://' URIs as well as file names.
The 'file://' URIs are supported by default.  In the unusual case that a
normal file name starts with "file:", you can disable the URI
recognition by invoking 'sqlite-open' with the new optional argument
DISABLE-URI non-nil.

** GUD

+++
*** 'pdb', 'perldb', and 'guiler' suggest debugging the current file via 'M-n'.
When starting these debuggers (e.g., 'M-x pdb') while visiting a file,
pressing 'M-n' in the command prompt suggests a command line including
the file name, using the minibuffer's "future history".

** Calendar

+++
*** New command 'calendar-recenter'.
This command recenters the month of the date at point.  By default, it
is bound to 'C-l' in the calendar buffer.

---
*** Mouse wheel bindings for scrolling the calendar.
You can now use the mouse wheel to scroll the calendar by 3 months.
With the shift modifier, it scrolls by one month.  With the meta
modifier, it scrolls by year.

*** Simpler key bindings for navigation in calendar by months and by years.
The month and year navigation key bindings 'M-}', 'M-{', 'C-x ]' and
'C-x [' now have the alternative keys '}', '{', ']' and '['.

---
*** Avoid modifying Calendar's user options.
The user options 'calendar-mark-holidays-flag' and
'calendar-mark-diary-entries-flag' are not modified anymore when
changing the marking state in the calendar buffer.

** Calc

*** New user option 'calc-string-maximum-character'.
Previously, the 'calc-display-strings', 'string', and 'bstring'
functions only considered integer vectors whose elements are all in the
Latin-1 range 0-255.  This hard-coded maximum is replaced by
'calc-string-maximum-character', and setting it to a higher value allows
the display of matching vectors as Unicode strings.  The default value
is 0xFF or 255 to preserve the existing behavior.

+++
*** New user option 'calc-inhibit-startup-message'.
If it is non-nil, inhibit Calc from printing its startup message.  The
default value is nil to preserve the existing behavior.

** Time

*** New user option 'world-clock-sort-order'.
This option controls the order of timezone entries in the 'world-clock'.
By default, no sorting is done, and entries appear in the same order as
in 'world-clock-list'.  Any format understood by 'format-time-string'
can be used to specify a key for the sort order, which is updated upon
each refresh.  The sort direction can be controlled by using a cons cell
of a format string and a boolean.  Alternatively, a sorting function can
be provided directly.

** Fill

+++
*** New variable 'fill-region-as-paragraph-function'.
The new variable 'fill-region-as-paragraph-function' provides a way to
override how functions like 'fill-paragraph' and 'fill-region' fill
text.  Major modes can bind this variable to a function that fits their
needs.  It defaults to 'fill-region-as-paragraph-default'.

---
** 'report-emacs-bug' now checks whether the bug report is about Org.
The command 'report-emacs-bug' looks in the report text for symbols that
indicate problems in Org, and if found, will ask whether the bug report
is actually about Org (in which case users should use the Org-specific
command for reporting bugs).

---
** The elint package is now obsolete.
Use the byte-compiler instead; it provides more and more useful warnings.

** Newsticker

---
*** New user option 'newsticker-hide-old-feed-header'.
It controls whether to automatically hide the header of feeds whose
items are all old or obsolete in the plainview "*newsticker*" buffer.
This is only visually interesting if the content of those feeds are also
hidden (see 'newsticker-hide-old-items-in-newsticker-buffer' and
'newsticker-show-descriptions-of-new-items').

---
*** New commands to hide and show headers of old newsticker feeds.
The new commands 'newsticker-hide-old-feed-header' and
'newsticker-show-old-feed-header', bound to 'h h' and 's h' keys,
respectively, hide and show the headers of feeds whose items are all old
or obsolete.

** CPerl mode

*** Syntax of Perl up to version 5.42 is supported.
CPerl mode creates imenu entries for ":writer" generated accessors and
recognizes the new functions "all" and "any".
See https://perldoc.perl.org/5.42.0/perldelta for details.


* New Modes and Packages in Emacs 31.1

** New minor mode 'delete-trailing-whitespace-mode'.
A simple buffer-local mode that runs 'delete-trailing-whitespace'
before saving the buffer.

** New major mode 'conf-npmrc-mode'.
A major mode based on 'conf-mode' for editing ".npmrc" files.

** New major modes based on the tree-sitter library

*** New major mode 'markdown-ts-mode'.
A major mode based on the tree-sitter library for editing Markdown files.

*** New major mode 'mhtml-ts-mode'.
An optional major mode based on the tree-sitter library for editing HTML
files.  This mode handles indentation, fontification, and commenting for
embedded JavaScript and CSS.

---
*** New major mode 'go-work-ts-mode'.
A major mode based on the tree-sitter library for editing "go.work"
files.  If tree-sitter is properly set-up by the user, it can be
enabled for files named "go.work".

** New package 'lua-mode'.
The 'lua-mode' package from NonGNU ELPA is now included in Emacs.

** New library 'timeout'.
This library provides functions to throttle or debounce Emacs Lisp
functions.  This is useful for corralling overeager code that is slow
and blocks Emacs, or does not provide ways to limit how often it runs.


* Incompatible Lisp Changes in Emacs 31.1

+++
** String mutation has been restricted further.
'aset' on unibyte strings now requires the new character to be a single
byte (0-255).  On multibyte strings the new character and the character
being replaced must both be ASCII (0-127).

These rules ensure that mutation will never transform a unibyte string
to multibyte, and that the size of a string in bytes (as reported by
'string-bytes') never changes.  They also allow strings to be
represented more efficiently in the future.

Other functions that use 'aset' to modify string data, such as
'subst-char-in-string' with a non-nil INPLACE argument, will signal an
error if called with arguments that would violate these rules.

** Nested backquotes are not supported any more in Pcase patterns.

---
** The obsolete variable 'redisplay-dont-pause' has been removed.

** The 'rx' category name 'chinese-two-byte' must now be spelled correctly.
An old alternative name (without the first 'e') has been removed.

+++
** 'text-property-default-nonsticky' is now buffer-local.
This variable now becomes buffer-local when set.  Use 'setq-default' in
(the unlikely) case you want to change the global value.

---
** All the digit characters now have the 'digit' category.
All the characters whose Unicode general-category is Nd now have the
'digit' category, whose mnemonic is '6'.  This includes both ASCII and
non-ASCII digit characters.

---
** All the symbol characters now have the 'symbol' category.
All the characters that belong to the 'symbol' script (according to
'char-script-table') now have the 'symbol' category, whose mnemonic is
'5'.

** Some libraries obsolete since Emacs 24.4 and 24.5 have been removed:
cc-compat.el, info-edit.el, meese.el, otodo-mode.el, rcompile.el,
sup-mouse.el, terminal.el, vi.el, vip.el, ws-mode.el, and yow.el.

+++
** 'if-let' and 'when-let' are now obsolete.
Use 'if-let*', 'when-let*' and 'and-let*' instead.

This effectively obsoletes the old '(if-let (SYMBOL SOMETHING) ...)'
single binding syntax, which we'd kept only for backwards compatibility.

---
** The Eshell 'pwd' command now expands the directory name on all systems.
This ensures that user directories are properly expanded to their full
name.  Previously, Eshell only did this for MS-Windows systems. To
restore the old behavior, you can set 'eshell-pwd-convert-function' to
'identity'.

---
** The rx 'eval' form now uses the current Elisp dialect for evaluation.
Previously, its argument was always evaluated using dynamic binding.

---
** Unused block comment variables have been removed.
The unused variables 'block-comment-start' and 'block-comment-end',
which never actually had any effect when set by major modes, have been
removed.

+++
** 'delete-frame' now needs non-nil FORCE argument to delete daemon frame.
The initial terminal frame of an Emacs process running as daemon can be
deleted via 'delete-frame' if and only if its optional FORCE argument is
non-nil.

---
** 'date-to-time' no longer accepts malformed times with time zone like "EDT".
Time strings like "2025-06-04T13:21:00 EDT" are not in valid ISO 8601
time format, and 'date-to-time' now signals an error for them.  Use a
numerical time-zone specification, like "2025-06-04T13:21:00-0400",
instead, which gives the time offset as +/-hh or +/-hh:mm.  A designator
"Z" for UTC time is also supported.  Less formal space-separated time
formats, like "2025-06-04 13:21:00 EDT", without the ISO 8601 "T"
separator, are also supported.

---
** The obsolete variable 'load-convert-to-unibyte' has been removed.

+++
** The 'exec-path' variable now uses same default PATH as other programs.
That is, if the PATH environment variable is unset or empty, 'exec-path'
now acts as if PATH is the system default, which is "/bin:/usr/bin"
on GNU/Linux systems.

---
** New variable 'tty-cursor-movement-use-TAB-BS'.
The display optimization where the combination 'TAB' characters +
'BACKSPACE' is used to move to a position on a TTY frame is now disabled
by default and controlled by this variable; it can be set to non-nil
to keep the old behavior.  This change is to accomodate screen
readers.

+++
** A thread's current buffer can now be killed.
We introduce a new attribute for threads called 'buffer-disposition'.
See the new argument in 'make-thread'.  The default value allows the
thread's current buffer to be killed by another thread.  This does not
apply to the main thread's buffer.


* Lisp Changes in Emacs 31.1

+++
** Improve 'replace-region-contents' to accept more forms of sources.
It has been promoted from 'subr-x' to the C code.
You can now directly pass it a string or a buffer rather than a function.
Actually passing it a function is now deprecated.

+++
** New function 'char-displayable-on-frame-p'.
'char-displayable-on-frame-p' returns non-nil if Emacs ought to be able
to display its char argument on a given frame.  This new function,
unlike 'char-displayable-p', does not check whether the character can be
encoded by the underlying terminal.

+++
** New macros 'static-when' and 'static-unless'.
Like 'static-if', these macros evaluate their condition at
macro-expansion time and are useful for writing code that can work
across different Emacs versions.

+++
** New feature to speed up repeated lookup of Lisp files in 'load-path'.
If the new variable 'load-path-filter-function' is set to the new
function 'load-path-filter-cache-directory-files', calling 'load' will
cache the directories it scans and their files, and the following
lookups should be faster.

+++
** 'let-alist' supports indexing into lists.
The macro 'let-alist' now interprets symbols containing numbers as list
indices.  For example, '.key.0' looks up 'key' in the alist and then
returns its first element.

** Lexical binding

---
*** You can change the default value of 'lexical-binding'.
While the default is still the use of dynamic binding dialect of Elisp
in those places that don't explicitly set 'lexical-binding' you can
change it globally with:

    (set-default-toplevel-value 'lexical-binding t)

---
*** Loading a file displays a warning if there is no 'lexical-binding' cookie.

+++
** New macros 'incf' and 'decf'.
They increment or decrement the value stored in a variable (a symbol),
or in a generalized variable.

+++
** New functions 'plusp' and 'minusp'.
They return non-nil if a number is positive or negative, respectively,
and signal an error if they are given a non-number.

+++
** New functions 'oddp' and 'evenp'.
They return non-nil if an integer is odd or even, respectively, and
signal an error if they are given a non-integer.

+++
** The 'defvar-local' macro second argument is now optional.
This means that you can now call it with just one argument, like
'defvar', to declare a variable both special, and buffer-local.

** ERT

*** Some experimental ERT macros are now considered stable.
The following macros, previously only available in the experimental
'ert-x' module, are now considered stable and have been moved to 'ert':

- 'ert-with-test-buffer'
- 'ert-with-buffer-selected'
- 'ert-with-buffer-renamed'

See "(ert) Helper Functions" node in the ERT manual for more information.

** Time & Date

+++
*** 'seconds-to-string' supports new formatting options.
Optional arguments are provided to produce human-readable time-duration
strings in a variety of formats, for example "6 months 3 weeks" or "5m
52.5s".

+++
** New function 'hash-table-contains-p'.
This function returns non-nil if a given key is present in a hash table.

+++
** The function 'purecopy' is now an obsolete alias for 'identity'.

** New function 'native-compile-directory'.
This function natively compiles all Lisp files in a directory and in its
sub-directories, recursively, which were not already natively compiled.

---
** New function 'color-blend'.
This function takes two RGB lists and optional ALPHA and returns an RGB
list whose elements are blended in linear space proportional to ALPHA.

+++
** New function 'dom-inner-text'.
This function gets all the text within a DOM node recursively, returning
it as a concatenated string.  It replaces the now-obsolete functions
'dom-text' and 'dom-texts'.

+++
** The 'defcustom' ':local' keyword can now be 'permanent-only'.
This means that the variable's 'permanent-local' property is set to t,
without marking it as automatically buffer-local.

---
** The obsolete face attribute ':reverse-video' has been removed.
Use ':inverse-video' instead.

+++
** Support interactive D-Bus authorization.
A new ':authorizable t' parameter has been added to 'dbus-call-method'
and 'dbus-call-method-asynchronously' to allow the user to interactively
authorize the invoked D-Bus method (for example via polkit).

** The customization group 'wp' has been removed.
It has been obsolete since Emacs 26.1.  Use the group 'text' instead.

+++
** New optional BUFFER argument for 'string-pixel-width'.
If supplied, 'string-pixel-width' will use any face remappings from
BUFFER when computing the string's width.

---
** New macro 'with-work-buffer'.
This macro is similar to the already existing macro 'with-temp-buffer',
except that it does not allocate a new temporary buffer on each call,
but tries to reuse those previously allocated (up to a number defined by
the new variable 'work-buffer-limit', which defaults to 10).

+++
** 'date-to-time' now defaults to local time.
The function now assumes local time instead of Universal Time when
its argument lacks explicit time zone information.  This has been the
de-facto behavior since Emacs 24 although documentation said otherwise.
Also, the fallback on 'timezone-make-date-arpa-standard' has been
removed because its supported date styles can be handled by
'parse-time-string'.  To restore the previously documented behavior,
specify "+0000" or "Z" as the time zone in the argument.

---
** The 'min-width' property is now supported for overlays as well.
This 'display' property was previously supported only as text property.
Now overlays can also have this property, with the same effect for the
text "covered" by the overlay.

+++
** New function 'remove-display-text-property'.
This function removes a display property from the specified region of
text, preserving any other display properties already set for that
region.

+++
** New macro 'cond*'.
The new macro 'cond*' is an alternative to 'cond' and 'pcase'.
Like them, it can be used to define several clauses, each one with its
own condition; the first clause that matches will cause its body to be
evaluated.
'cond*' can use Pcase's pattern matching syntax and also provides
another pattern matching syntax that is different from that of 'pcase',
which some users might find less cryptic.
See the Info node "(elisp) cond* Macro" for details.

---
** New function 'shell-command-do-open'.
This lets a Lisp program access the core functionality of the
'dired-do-open' command.  It opens a file or files using an external
program, choosing the program according to the operating system's
conventions.

+++
** 'make-vtable' can create an empty vtable.
It is now possible to create a vtable without data, by leaving the
':objects' list empty, or by providing an ':objects-function' that
(initially) produces no data.  In such a case, it is necessary to
provide a ':columns' spec, so that the number of columns and their
widths can be determined.  Column widths can be set explicitly, or they
will be calculated based on the window width.

+++
** New symbol property 'repeat-continue' for 'repeat-mode'.
A command with the 'repeat-continue' symbol property, which can be a
list of keymaps or t, will continue an already active repeating sequence
for a keymap in that list (resp. all keymaps).  The new property does
not affect whether the command starts a repeating sequence, which
remains governed by the 'repeat-map' property.  'defvar-keymap' supports
a new keyword ':continue', a list of commands, and adds the keymap to
the 'repeat-continue' property of each command in that list.  The
'use-package' and 'bind-keys' macros support a similar keyword
':continue-only'.

** New function 'completion-table-with-metadata'.
It offers a more concise way to create a completion table with metadata.

+++
** 'all-completions' and 'unintern' no longer support old calling conventions.

+++
** New symbol property 'find-function-type-alist' used by 'find-function' etc.
Macros that define an object in a way that makes the object's name and
the macro call site defining the object hard to associate can add an
entry to the property 'find-function-type-alist' on the object's name to
provide instructions for finding the definition.

New convenience function 'find-function-update-type-alist' offers a
concise way to update a symbol's 'find-function-type-alist' property.

---
** New function variable 'comment-setup-function' for multi-language modes.
It can set comment-related variables such as 'comment-start'
depending on the language under point.

+++
** 'inhibit-message' can now inhibit clearing of the echo area.
Binding 'inhibit-message' to a non-nil value will now suppress both
the display of messages and the clearing of the echo area, such as
caused by calling 'message' with a nil argument.

** Special Events

+++
*** New primitive 'insert-special-event'.
This function inserts the special EVENT into the input event queue.

+++
*** New event type 'sleep-event'.
This event is sent when the device running Emacs enters or leaves the
sleep state.

** Function aliases obsolete since Emacs 23.2 have been removed:
'advertised-undo', 'advertised-widget-backward', and
'dired-advertised-find-file'.

+++
** New functions to get and set top-level buffer-local values.
'buffer-local-toplevel-value' and 'set-buffer-local-toplevel-value' get
and set the top-level buffer-local value of a variable.  A top-level
value is the one that variable has outside of any let-bindings.

** New function 'exec-suffixes'.
This function by default returns the value of the corresponding user
option, but can optionally return the equivalent of 'exec-suffixes' from
a remote host.  It must be used in conjunction with the function
'exec-path'.

+++
** 'read-directory-name' now accepts an optional PREDICATE argument.

---
** JSON parse error line and column are now obsolete.
The column number is no longer available; the line number will be
removed in next Emacs release.


* Changes in Emacs 31.1 on Non-Free Operating Systems

---
** Process execution has been optimized on Android.
The run-time performance of subprocesses on recent Android releases,
where a userspace executable loader is required, has been optimized on
systems featuring Linux 3.5.0 and above.

---
** It is now possible to read GUI events from non-main Lisp threads on Android.
Put differently, this enables input events to be read and recursive
editing sessions to be started from non-main threads.  The only platform
where this remains unsupported is Nextstep (GNUstep or Mac OS).

---
** 'desktop-restore-frames' has been disabled by default on Android systems.
Restrictions imposed on clients by the window manager on these systems
are too prohibitive and don't allow restoring frame configurations.
(For the same reason many window management facilities are also not
implemented by Emacs.)

---
** Emacs responds to runtime display configuration changes on Android.
The upshot of this is that Emacs will adapt to display resolution /
layout changes applied while an Emacs session is active, which is
possible on some recently released devices.

---
** 'NSSpeechRecognitionUsageDescription' now included in "Info.plist" (macOS).
Should Emacs (or any built-in shell) invoke a process using macOS speech
recognition APIs, the relevant permission dialog is now displayed, thus
allowing Emacs users access to speech recognition utilities.

Note: Accepting this permission allows the use of system APIs, which may
send user data to Apple's speech recognition servers.

---
** Re-introduced dictation, lost in Emacs v30 (macOS).
We lost macOS dictation in v30 when migrating to NSTextInputClient.
Implemented 'selectedRange' in 'nsterm.m' to enable in new subsystem.
You may notice a slight change in dictation UI provided by macOS.

+++
** On Mac OS X, stipples now render with color.

---
** Emacs on MS-Windows now supports GUI dialogs and message boxes better.
In particular, it is now possible to show text with embedded newlines in
a dialog popped by 'message-box'.  This is supported on Windows Vista
and later versions.

---
** Emacs on MS-Windows now supports drag-n-drop of text into a buffer.
This is in addition to drag-n-drop of files, that was already
supported.  As on X, the user options 'dnd-scroll-margin' and
'dnd-indicate-insertion-point' can be used to customize the process.

---
** Emacs on MS-Windows now supports color fonts.
On Windows 8.1 and later versions Emacs now uses DirectWrite to draw
text, which supports color fonts.  This can be disabled by setting the
variable 'w32-inhibit-dwrite' to t.  Also see 'w32-dwrite-available' and
'w32-dwrite-reinit' to check availability and to configure the
DirectWrite rendering parameters.

To show color Emojis in Emacs, customize the default fontset to use a
color Emoji font installed on your system for the 'emoji' script.

+++
** Emacs on MS-Windows now supports 'yank-media'.
This command inserts clipboard data of different formats into the
current buffer, if the major mode supports it.  (Support for
'yank-media' will be unavailable on MS-Windows if Emacs was configured
'--without-native-image-api'.)

---
** Emacs on MS-Windows now supports up to 1024 sub-processes.
Changes in implementation of monitoring sub-processes allow Emacs on
MS-Windows to start up to 1024 sub-processes, similar to GNU/Linux and
other free systems.

---
** Images on MS-Windows now support the ':transform-smoothing' flag.
Transformed images are smoothed using the bilinear interpolation by
means of the GDI+ library.

---
** Emacs on MS-Windows now supports the ':data' keyword for 'play-sound'.
In addition to ':file FILE' for playing a sound from a file, ':data
DATA' can now be used to play a sound from memory.

---
** The MS-DOS port of Emacs now supports more recent releases of GCC and Binutils.
Accordingly, we have revised our recommendations for a suitable DJGPP
toolchain to GCC 14.2.0 and Binutils 2.35.1 in lieu of GCC 3.4.x and
Binutils 2.26.


----------------------------------------------------------------------
This file is part of GNU Emacs.

GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.


Local variables:
coding: utf-8
mode: outline
mode: emacs-news
paragraph-separate: "[	 ]"
end: