Files
neovim/src/nvim/version.c
bfredl a58bb21544 refactor(grid): get rid of unbatched grid_puts and grid_putchar
This finalizes the long running refactor from the old TUI-focused grid
implementation where text-drawing cursor was not separated from the
visible cursor.

Still, the pattern of setting cursor position together with updating a
line was convenient. Introduce grid_line_cursor_goto() to still allow
this but now being explicit about it.

Only having batched drawing functions makes code involving drawing
a bit longer. But it is better to be explicit, and this highlights
cases where multiple small redraws can be grouped together. This was the
case for most of the changed places (messages, lastline, and :intro)
2023-10-06 10:16:30 +02:00

2879 lines
30 KiB
C

// This is an open source non-commercial project. Dear PVS-Studio, please check
// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
/// @file version.c
///
/// Nvim was forked from Vim 7.4.160.
/// Vim originated from Stevie version 3.6 (Fish disk 217) by GRWalter (Fred).
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "auto/versiondef.h" // version info generated by the build system
#include "auto/versiondef_git.h"
#include "nvim/api/private/defs.h"
#include "nvim/api/private/helpers.h"
#include "nvim/ascii.h"
#include "nvim/buffer.h"
#include "nvim/charset.h"
#include "nvim/drawscreen.h"
#include "nvim/ex_cmds_defs.h"
#include "nvim/gettext.h"
#include "nvim/globals.h"
#include "nvim/grid.h"
#include "nvim/highlight_defs.h"
#include "nvim/lua/executor.h"
#include "nvim/mbyte.h"
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/option_vars.h"
#include "nvim/strings.h"
#include "nvim/version.h"
#include "nvim/vim.h"
// for ":version", ":intro", and "nvim --version"
#ifndef NVIM_VERSION_MEDIUM
# define NVIM_VERSION_MEDIUM "v" STR(NVIM_VERSION_MAJOR) \
"." STR(NVIM_VERSION_MINOR) "." STR(NVIM_VERSION_PATCH) \
NVIM_VERSION_PRERELEASE
#endif
#define NVIM_VERSION_LONG "NVIM " NVIM_VERSION_MEDIUM // NOLINT(bugprone-suspicious-missing-comma)
char *Version = VIM_VERSION_SHORT;
char *longVersion = NVIM_VERSION_LONG;
char *version_buildtype = "Build type: " NVIM_VERSION_BUILD_TYPE;
// Reproducible builds: omit compile info in Release builds. #15424
#ifndef NDEBUG
char *version_cflags = "Compilation: " NVIM_VERSION_CFLAGS;
#endif
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "version.c.generated.h"
#endif
// clang-format off
static const int included_patches[] = {
2424,
2423,
2422,
2421,
// 2420,
2419,
// 2418,
2417,
2416,
// 2415,
2414,
2413,
2412,
2411,
2410,
2409,
2408,
2407,
2406,
2405,
2404,
2403,
2402,
2401,
2400,
// 2399,
2398,
2397,
2396,
2395,
2394,
2393,
2392,
2391,
2390,
2389,
2388,
2387,
// 2386,
2385,
2384,
2383,
2382,
// 2381,
2380,
2379,
2378,
2377,
2376,
2375,
2374,
// 2373,
2372,
// 2371,
2370,
// 2369,
2368,
2367,
2366,
2365,
2364,
2363,
// 2362,
2361,
2360,
2359,
2358,
2357,
2356,
2355,
2354,
2353,
2352,
// 2351,
2350,
2349,
2348,
2347,
2346,
2345,
2344,
2343,
2342,
2341,
2340,
2339,
2338,
// 2337,
2336,
2335,
// 2334,
2333,
2332,
2331,
2330,
2329,
2328,
2327,
2326,
2325,
// 2324,
2323,
2322,
2321,
2320,
2319,
2318,
2317,
2316,
2315,
2314,
2313,
2312,
2311,
2310,
2309,
// 2308,
// 2307,
2306,
2305,
2304,
2303,
2302,
2301,
// 2300,
// 2299,
// 2298,
2297,
// 2296,
// 2295,
2294,
2293,
// 2292,
2291,
2290,
2289,
// 2288,
// 2287,
// 2286,
2285,
2284,
2283,
2282,
2281,
2280,
// 2279,
2278,
// 2277,
// 2276,
2275,
2274,
// 2273,
2272,
2271,
2270,
2269,
2268,
2267,
// 2266,
// 2265,
2264,
2263,
2262,
2261,
2260,
2259,
2258,
2257,
2256,
2255,
2254,
2253,
2252,
// 2251,
// 2250,
2249,
2248,
2247,
2246,
2245,
2244,
2243,
2242,
// 2241,
// 2240,
2239,
2238,
2237,
2236,
2235,
2234,
2233,
// 2232,
2231,
// 2230,
2229,
2228,
2227,
2226,
2225,
2224,
2223,
2222,
2221,
2220,
// 2219,
2218,
2217,
// 2216,
// 2215,
2214,
// 2213,
2212,
// 2211,
// 2210,
2209,
// 2208,
2207,
2206,
2205,
2204,
2203,
2202,
2201,
// 2200,
2199,
2198,
2197,
2196,
// 2195,
// 2194,
// 2193,
// 2192,
2191,
2190,
// 2189,
2188,
2187,
2186,
2185,
2184,
2183,
2182,
// 2181,
2180,
2179,
2178,
2177,
// 2176,
2175,
2174,
2173,
2172,
2171,
2170,
2169,
2168,
2167,
2166,
2165,
// 2164,
2163,
2162,
2161,
2160,
2159,
// 2158,
2157,
// 2156,
// 2155,
2154,
// 2153,
2152,
2151,
2150,
2149,
2148,
2147,
// 2146,
2145,
2144,
2143,
// 2142,
2141,
2140,
// 2139,
2138,
2137,
2136,
2135,
2134,
2133,
2132,
2131,
2130,
2129,
2128,
// 2127,
2126,
2125,
2124,
2123,
2122,
// 2121,
2120,
2119,
2118,
2117,
2116,
2115,
// 2114,
2113,
2112,
2111,
// 2110,
// 2109,
2108,
// 2107,
2106,
2105,
2104,
2103,
2102,
2101,
2100,
2099,
2098,
2097,
2096,
2095,
2094,
// 2093,
// 2092,
2091,
2090,
2089,
2088,
2087,
2086,
// 2085,
2084,
2083,
2082,
2081,
// 2080,
2079,
2078,
// 2077,
// 2076,
2075,
2074,
2073,
2072,
// 2071,
2070,
2069,
2068,
2067,
2066,
2065,
2064,
2063,
2062,
2061,
2060,
2059,
2058,
2057,
2056,
2055,
2054,
2053,
2052,
2051,
2050,
2049,
2048,
2047,
2046,
2045,
2044,
2043,
2042,
2041,
// 2040,
// 2039,
2038,
2037,
2036,
2035,
2034,
2033,
// 2032,
2031,
2030,
2029,
2028,
2027,
2026,
2025,
2024,
2023,
// 2022,
// 2021,
2020,
2019,
2018,
2017,
2016,
2015,
2014,
2013,
2012,
2011,
2010,
// 2009,
// 2008,
2007,
2006,
2005,
// 2004,
2003,
2002,
2001,
2000,
// 1999,
// 1998,
// 1997,
// 1996,
1995,
1994,
// 1993,
1992,
1991,
1990,
// 1989,
1988,
// 1987,
// 1986,
// 1985,
1984,
1983,
// 1982,
// 1981,
1980,
// 1979,
// 1978,
1977,
1976,
1975,
1974,
1973,
1972,
1971,
1970,
// 1969,
// 1968,
1967,
1966,
1965,
// 1964,
// 1963,
1962,
1961,
1960,
// 1959,
1958,
// 1957,
1956,
1955,
// 1954,
1953,
1952,
1951,
1950,
1949,
1948,
1947,
1946,
// 1945,
// 1944,
// 1943,
1942,
1941,
// 1940,
// 1939,
1938,
1937,
// 1936,
1935,
// 1934,
1933,
1932,
1931,
1930,
// 1929,
// 1928,
1927,
1926,
1925,
1924,
1923,
1922,
1921,
// 1920,
// 1919,
// 1918,
// 1917,
1916,
1915,
1914,
1913,
1912,
1911,
1910,
1909,
// 1908,
// 1907,
// 1906,
// 1905,
// 1904,
1903,
// 1902,
1901,
1900,
1899,
1898,
1897,
1896,
1895,
1894,
1893,
// 1892,
// 1891,
1890,
1889,
1888,
1887,
1886,
1885,
// 1884,
1883,
// 1882,
1881,
// 1880,
1879,
1878,
1877,
1876,
1875,
// 1874,
1873,
1872,
// 1871,
1870,
1869,
1868,
1867,
// 1866,
1865,
1864,
1863,
1862,
1861,
1860,
1859,
1858,
1857,
1856,
1855,
1854,
// 1853,
1852,
// 1851,
// 1850,
1849,
1848,
1847,
1846,
// 1845,
// 1844,
1843,
1842,
1841,
1840,
1839,
1838,
1837,
1836,
1835,
1834,
1833,
1832,
1831,
1830,
1829,
1828,
1827,
1826,
1825,
1824,
1823,
1822,
1821,
1820,
// 1819,
1818,
1817,
1816,
1815,
// 1814,
// 1813,
1812,
// 1811,
// 1810,
1809,
1808,
1807,
1806,
1805,
1804,
1803,
// 1802,
1801,
1800,
// 1799,
1798,
1797,
1796,
1795,
1794,
1793,
1792,
1791,
1790,
// 1789,
1788,
// 1787,
// 1786,
1785,
// 1784,
1783,
1782,
1781,
1780,
// 1779,
// 1778,
1777,
1776,
1775,
1774,
// 1773,
1772,
1771,
// 1770,
1769,
// 1768,
1767,
1766,
1765,
1764,
1763,
1762,
1761,
1760,
1759,
1758,
1757,
1756,
// 1755,
// 1754,
// 1753,
// 1752,
// 1751,
1750,
1749,
1748,
1747,
1746,
1745,
1744,
1743,
1742,
1741,
1740,
1739,
1738,
1737,
// 1736,
1735,
1734,
// 1733,
1732,
1731,
// 1730,
1729,
// 1728,
1727,
1726,
1725,
1724,
1723,
1722,
1721,
1720,
// 1719,
// 1718,
1717,
1716,
1715,
// 1714,
// 1713,
1712,
// 1711,
// 1710,
// 1709,
1708,
// 1707,
1706,
1705,
1704,
// 1703,
1702,
1701,
// 1700,
1699,
1698,
1697,
1696,
1695,
1694,
1693,
1692,
1691,
// 1690,
1689,
1688,
1687,
1686,
1685,
1684,
1683,
1682,
// 1681,
1680,
1679,
// 1678,
1677,
// 1676,
// 1675,
1674,
// 1673,
1672,
1671,
1670,
1669,
1668,
1667,
// 1666,
// 1665,
1664,
// 1663,
1662,
1661,
1660,
// 1659,
1658,
1657,
// 1656,
// 1655,
1654,
1653,
1652,
1651,
1650,
// 1649,
1648,
1647,
// 1646,
1645,
1644,
1643,
1642,
// 1641,
1640,
1639,
1638,
1637,
// 1636,
1635,
1634,
1633,
1632,
1631,
1630,
// 1629,
// 1628,
1627,
// 1626,
1625,
1624,
1623,
// 1622,
1621,
// 1620,
1619,
1618,
// 1617,
1616,
// 1615,
1614,
1613,
// 1612,
1611,
1610,
// 1609,
1608,
// 1607,
1606,
1605,
1604,
// 1603,
// 1602,
1601,
// 1600,
// 1599,
1598,
// 1597,
// 1596,
1595,
1594,
1593,
1592,
1591,
1590,
// 1589,
1588,
1587,
// 1586,
1585,
// 1584,
// 1583,
1582,
1581,
// 1580,
1579,
1578,
// 1577,
1576,
1575,
// 1574,
// 1573,
1572,
// 1571,
1570,
1569,
1568,
1567,
1566,
// 1565,
1564,
1563,
// 1562,
// 1561,
// 1560,
// 1559,
// 1558,
1557,
1556,
// 1555,
1554,
// 1553,
1552,
// 1551,
// 1550,
1549,
// 1548,
1547,
1546,
1545,
1544,
1543,
1542,
1541,
1540,
1539,
// 1538,
// 1537,
1536,
1535,
// 1534,
1533,
1532,
1531,
1530,
1529,
1528,
// 1527,
// 1526,
// 1525,
1524,
// 1523,
// 1522,
// 1521,
// 1520,
1519,
// 1518,
// 1517,
1516,
// 1515,
1514,
// 1513,
1512,
// 1511,
1510,
1509,
// 1508,
1507,
1506,
1505,
1504,
1503,
// 1502,
1501,
1500,
// 1499,
1498,
// 1497,
// 1496,
// 1495,
// 1494,
// 1493,
1492,
1491,
1490,
1489,
1488,
1487,
// 1486,
1485,
1484,
1483,
1482,
1481,
1480,
1479,
1478,
1477,
1476,
1475,
1474,
// 1473,
1472,
1471,
1470,
1469,
1468,
1467,
1466,
1465,
1464,
// 1463,
1462,
1461,
// 1460,
// 1459,
1458,
1457,
1456,
// 1455,
1454,
// 1453,
// 1452,
// 1451,
// 1450,
// 1449,
// 1448,
// 1447,
// 1446,
// 1445,
// 1444,
// 1443,
// 1442,
// 1441,
1440,
1439,
// 1438,
1437,
1436,
1435,
1434,
1433,
// 1432,
// 1431,
// 1430,
// 1429,
// 1428,
// 1427,
// 1426,
1425,
1424,
// 1423,
// 1422,
// 1421,
// 1420,
// 1419,
1418,
// 1417,
// 1416,
1415,
// 1414,
// 1413,
1412,
1411,
// 1410,
1409,
// 1408,
// 1407,
// 1406,
// 1405,
1404,
1403,
// 1402,
1401,
// 1400,
// 1399,
1398,
1397,
// 1396,
// 1395,
1394,
1393,
1392,
// 1391,
1390,
// 1389,
// 1388,
// 1387,
1386,
1385,
1384,
1383,
1382,
1381,
1380,
1379,
1378,
1377,
// 1376,
1375,
1374,
1373,
1372,
1371,
1370,
1369,
1368,
1367,
1366,
1365,
// 1364,
1363,
1362,
1361,
1360,
// 1359,
1358,
1357,
1356,
1355,
1354,
1353,
1352,
// 1351,
1350,
1349,
1348,
1347,
1346,
1345,
// 1344,
// 1343,
1342,
// 1341,
// 1340,
1339,
1338,
// 1337,
1336,
// 1335,
1334,
// 1333,
// 1332,
1331,
1330,
// 1329,
// 1328,
1327,
// 1326,
1325,
1324,
1323,
1322,
// 1321,
// 1320,
1319,
1318,
1317,
1316,
1315,
1314,
1313,
1312,
1311,
1310,
1309,
1308,
1307,
1306,
1305,
1304,
1303,
1302,
1301,
1300,
1299,
1298,
1297,
1296,
1295,
1294,
1293,
1292,
1291,
1290,
1289,
1288,
1287,
1286,
1285,
1284,
1283,
1282,
1281,
// 1280,
1279,
// 1278,
1277,
// 1276,
1275,
1274,
1273,
1272,
1271,
1270,
1269,
1268,
// 1267,
1266,
// 1265,
1264,
1263,
1262,
1261,
1260,
// 1259,
1258,
1257,
1256,
1255,
1254,
1253,
1252,
1251,
1250,
1249,
1248,
1247,
1246,
1245,
1244,
1243,
1242,
1241,
1240,
1239,
1238,
1237,
1236,
1235,
1234,
1233,
1232,
1231,
1230,
1229,
1228,
1227,
// 1226,
1225,
// 1224,
1223,
1222,
1221,
1220,
1219,
// 1218,
1217,
1216,
1215,
1214,
1213,
1212,
1211,
1210,
1209,
1208,
1207,
1206,
1205,
1204,
1203,
1202,
1201,
1200,
1199,
1198,
1197,
1196,
1195,
1194,
1193,
1192,
1191,
1190,
1189,
1188,
1187,
1186,
1185,
1184,
1183,
1182,
1181,
1180,
1179,
1178,
1177,
1176,
1175,
1174,
1173,
1172,
1171,
1170,
1169,
1168,
1167,
1166,
1165,
1164,
1163,
1162,
1161,
1160,
1159,
1158,
1157,
1156,
1155,
1154,
1153,
1152,
1151,
1150,
1149,
1148,
1147,
1146,
1145,
1144,
1143,
1142,
1141,
1140,
1139,
1138,
1137,
// 1136,
1135,
1134,
1133,
1132,
1131,
1130,
1129,
1128,
1127,
1126,
1125,
1124,
1123,
1122,
1121,
1120,
1119,
1118,
1117,
1116,
1115,
1114,
1113,
1112,
1111,
1110,
1109,
1108,
1107,
// 1106,
1105,
1104,
// 1103,
1102,
1101,
1100,
1099,
1098,
1097,
1096,
1095,
1094,
1093,
1092,
1091,
// 1090,
1089,
1088,
1087,
1086,
1085,
1084,
// 1083,
1082,
1081,
1080,
1079,
1078,
1077,
1076,
1075,
1074,
1073,
1072,
1071,
1070,
1069,
1068,
1067,
1066,
1065,
1064,
1063,
1062,
1061,
1060,
1059,
1058,
1057,
1056,
1055,
1054,
1053,
1052,
1051,
1050,
1049,
1048,
1047,
1046,
1045,
// 1044,
// 1043,
1042,
1041,
1040,
1039,
1038,
1037,
1036,
// 1035,
1034,
1033,
1032,
1031,
1030,
1029,
// 1028,
1027,
1026,
1025,
1024,
1023,
1022,
1021,
1020,
// 1019,
1018,
1017,
1016,
1015,
1014,
1013,
1012,
1011,
1010,
1009,
1008,
1007,
1006,
1005,
// 1004,
1003,
1002,
1001,
1000,
999,
998,
997,
996,
995,
994,
993,
992,
991,
990,
989,
988,
987,
986,
985,
984,
983,
982,
981,
980,
979,
978,
// 977,
976,
975,
974,
973,
972,
971,
// 970,
// 969,
968,
967,
966,
965,
964,
963,
962,
961,
960,
959,
958,
957,
956,
955,
954,
// 953,
952,
951,
950,
949,
948,
947,
946,
945,
944,
943,
942,
941,
// 940,
939,
938,
937,
936,
935,
934,
933,
932,
931,
930,
929,
// 928,
927,
926,
925,
924,
923,
922,
921,
920,
919,
// 918,
917,
916,
915,
// 914,
913,
912,
911,
910,
// 909,
908,
907,
// 906,
905,
904,
903,
902,
901,
900,
899,
898,
897,
896,
// 895,
// 894,
893,
892,
891,
// 890,
889,
888,
887,
886,
885,
884,
883,
882,
881,
// 880,
// 879,
878,
877,
// 876,
875,
874,
873,
872,
871,
// 870,
869,
868,
867,
866,
865,
864,
// 863,
862,
861,
860,
859,
858,
// 857,
856,
855,
854,
853,
852,
851,
850,
849,
848,
847,
846,
// 845,
844,
843,
842,
841,
840,
839,
838,
837,
836,
835,
834,
833,
832,
831,
830,
829,
828,
827,
826,
825,
// 824,
823,
822,
821,
820,
819,
818,
817,
816,
// 815,
814,
813,
812,
811,
810,
809,
808,
807,
806,
805,
804,
803,
802,
801,
800,
799,
798,
797,
796,
795,
794,
793,
792,
791,
790,
789,
788,
787,
786,
785,
784,
783,
782,
781,
780,
779,
778,
777,
776,
775,
774,
773,
772,
771,
// 770,
769,
// 768,
767,
766,
765,
764,
763,
762,
// 761,
760,
759,
758,
757,
756,
755,
754,
753,
752,
751,
750,
749,
748,
747,
746,
745,
744,
743,
742,
741,
740,
739,
738,
737,
736,
735,
734,
733,
732,
731,
730,
729,
728,
727,
726,
725,
724,
723,
722,
721,
720,
719,
718,
717,
716,
715,
714,
713,
712,
711,
// 710,
709,
708,
// 707,
706,
705,
704,
// 703,
702,
701,
700,
699,
698,
697,
696,
695,
// 694,
693,
692,
// 691,
// 690,
// 689,
// 688,
687,
686,
685,
// 684,
683,
// 682,
// 681,
680,
679,
678,
677,
// 676,
// 675,
674,
673,
672,
671,
670,
669,
668,
// 667,
666,
// 665,
664,
// 663,
662,
661,
660,
659,
658,
657,
656,
// 655,
// 654,
653,
652,
651,
650,
649,
648,
647,
646,
645,
644,
// 643,
642,
641,
640,
// 639,
// 638,
637,
// 636,
635,
// 634,
633,
632,
631,
630,
629,
628,
627,
626,
625,
624,
623,
622,
621,
620,
619,
618,
617,
616,
615,
614,
613,
// 612,
611,
610,
609,
608,
607,
606,
605,
604,
603,
602,
// 601,
600,
599,
598,
597,
596,
595,
594,
593,
592,
591,
590,
589,
588,
587,
586,
585,
584,
583,
// 582,
581,
580,
// 579,
578,
577,
576,
575,
574,
573,
572,
571,
570,
569,
568,
567,
566,
565,
564,
563,
562,
561,
560,
559,
558,
557,
556,
555,
554,
553,
552,
551,
550,
549,
548,
547,
546,
545,
544,
543,
542,
541,
540,
539,
538,
537,
536,
535,
534,
533,
532,
531,
530,
529,
528,
527,
526,
525,
524,
523,
522,
521,
520,
519,
518,
517,
516,
515,
514,
513,
512,
511,
510,
509,
508,
507,
506,
505,
504,
503,
502,
501,
500,
499,
498,
497,
496,
495,
494,
493,
492,
491,
490,
489,
488,
487,
486,
485,
484,
483,
482,
481,
480,
479,
478,
477,
476,
475,
474,
473,
472,
471,
470,
469,
468,
467,
466,
465,
464,
463,
462,
461,
460,
459,
458,
457,
456,
455,
454,
453,
452,
451,
450,
449,
448,
447,
446,
445,
444,
443,
442,
441,
440,
439,
438,
437,
436,
435,
434,
433,
432,
431,
430,
429,
428,
427,
426,
// 425,
424,
423,
422,
421,
420,
419,
418,
417,
416,
415,
414,
413,
412,
411,
410,
409,
408,
407,
406,
405,
404,
403,
402,
401,
400,
399,
398,
397,
396,
395,
394,
393,
392,
391,
390,
389,
388,
387,
386,
385,
384,
383,
382,
381,
380,
379,
378,
377,
376,
375,
374,
373,
372,
371,
370,
369,
368,
// 367,
366,
365,
364,
363,
362,
361,
360,
359,
358,
357,
356,
355,
354,
353,
352,
351,
350,
349,
348,
347,
346,
345,
344,
343,
342,
341,
340,
339,
338,
337,
336,
335,
334,
333,
332,
331,
330,
329,
// 328,
327,
326,
325,
324,
323,
322,
321,
320,
319,
318,
317,
316,
315,
314,
313,
// 312,
311,
310,
309,
308,
307,
306,
305,
// 304,
303,
302,
301,
300,
299,
298,
297,
296,
295,
294,
293,
292,
291,
290,
289,
288,
287,
286,
285,
284,
283,
282,
281,
280,
279,
278,
277,
276,
275,
274,
273,
272,
271,
270,
269,
268,
267,
266,
265,
264,
263,
262,
261,
260,
259,
258,
257,
256,
255,
254,
253,
252,
251,
250,
249,
248,
247,
246,
245,
244,
243,
242,
241,
240,
239,
238,
237,
236,
235,
234,
233,
232,
231,
230,
229,
228,
227,
226,
225,
224,
223,
222,
221,
220,
219,
218,
217,
216,
215,
214,
213,
212,
211,
210,
209,
208,
207,
206,
205,
204,
203,
202,
201,
200,
199,
198,
197,
196,
195,
194,
193,
192,
191,
190,
189,
188,
187,
186,
185,
184,
183,
182,
181,
180,
179,
178,
177,
176,
175,
174,
173,
172,
171,
170,
169,
168,
167,
166,
165,
164,
163,
162,
161,
160,
159,
// 158,
157,
156,
155,
154,
153,
152,
151,
150,
149,
148,
147,
146,
145,
144,
143,
142,
141,
140,
139,
138,
137,
136,
135,
134,
133,
132,
131,
130,
129,
128,
127,
126,
125,
124,
123,
122,
121,
120,
119,
118,
117,
116,
115,
114,
113,
112,
111,
110,
109,
108,
107,
106,
105,
104,
103,
102,
101,
100,
99,
98,
97,
96,
95,
94,
93,
92,
91,
90,
89,
88,
// 87,
86,
85,
84,
83,
82,
81,
80,
79,
78,
77,
76,
75,
74,
73,
// 72,
71,
70,
69,
68,
67,
66,
// 65,
64,
63,
// 62,
61,
60,
59,
// 58,
57,
56,
55,
54,
53,
52,
51,
// 50,
// 49,
48,
47,
46,
45,
44,
43,
42,
41,
40,
39,
38,
37,
36,
35,
34,
33,
32,
31,
30,
29,
28,
27,
26,
25,
24,
23,
22,
21,
20,
19,
18,
17,
16,
15,
14,
13,
12,
11,
10,
9,
8,
7,
6,
5,
4,
3,
2,
1,
// 0,
};
// clang-format on
/// Compares a version string to the current Nvim version.
///
/// @param version Version string like "1.3.42"
///
/// @return true if Nvim is at or above the version.
bool has_nvim_version(const char *const version_str)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
const char *p = version_str;
int major = 0;
int minor = 0;
int patch = 0;
if (!ascii_isdigit(*p)) {
return false;
}
major = atoi(p);
p = strchr(p, '.'); // Find the next dot.
if (p) {
p++; // Advance past the dot.
if (!ascii_isdigit(*p)) {
return false;
}
minor = atoi(p);
p = strchr(p, '.');
if (p) {
p++;
if (!ascii_isdigit(*p)) {
return false;
}
patch = atoi(p);
}
}
return (major < NVIM_VERSION_MAJOR
|| (major == NVIM_VERSION_MAJOR
&& (minor < NVIM_VERSION_MINOR
|| (minor == NVIM_VERSION_MINOR
&& patch <= NVIM_VERSION_PATCH))));
}
/// Checks whether a Vim patch has been included.
///
/// @param n Patch number.
///
/// @return true if patch `n` has been included.
bool has_vim_patch(int n)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
// Perform a binary search.
int l = 0;
int h = (int)(ARRAY_SIZE(included_patches)) - 1;
while (l < h) {
const int m = (l + h) / 2;
if (included_patches[m] == n) {
return true;
}
if (included_patches[m] < n) {
h = m;
} else {
l = m + 1;
}
}
return false;
}
Dictionary version_dict(void)
{
Dictionary d = ARRAY_DICT_INIT;
PUT(d, "major", INTEGER_OBJ(NVIM_VERSION_MAJOR));
PUT(d, "minor", INTEGER_OBJ(NVIM_VERSION_MINOR));
PUT(d, "patch", INTEGER_OBJ(NVIM_VERSION_PATCH));
#ifndef NVIM_VERSION_BUILD
PUT(d, "build", NIL);
#else
PUT(d, "build", CSTR_AS_OBJ(NVIM_VERSION_BUILD));
#endif
PUT(d, "prerelease", BOOLEAN_OBJ(NVIM_VERSION_PRERELEASE[0] != '\0'));
PUT(d, "api_level", INTEGER_OBJ(NVIM_API_LEVEL));
PUT(d, "api_compatible", INTEGER_OBJ(NVIM_API_LEVEL_COMPAT));
PUT(d, "api_prerelease", BOOLEAN_OBJ(NVIM_API_PRERELEASE));
return d;
}
void ex_version(exarg_T *eap)
{
// Ignore a ":version 9.99" command.
if (*eap->arg == NUL) {
msg_putchar('\n');
list_version();
}
}
/// Output a string for the version message. If it's going to wrap, output a
/// newline, unless the message is too long to fit on the screen anyway.
/// When "wrap" is true wrap the string in [].
/// @param s
/// @param wrap
static void version_msg_wrap(char *s, int wrap)
{
int len = vim_strsize(s) + (wrap ? 2 : 0);
if (!got_int
&& (len < Columns)
&& (msg_col + len >= Columns)
&& (*s != '\n')) {
msg_putchar('\n');
}
if (!got_int) {
if (wrap) {
msg_puts("[");
}
msg_puts(s);
if (wrap) {
msg_puts("]");
}
}
}
static void version_msg(char *s)
{
version_msg_wrap(s, false);
}
/// List string items nicely aligned in columns.
/// When "size" is < 0 then the last entry is marked with NULL.
/// The entry with index "current" is inclosed in [].
void list_in_columns(char **items, int size, int current)
{
int item_count = 0;
int width = 0;
// Find the length of the longest item, use that + 1 as the column width.
int i;
for (i = 0; size < 0 ? items[i] != NULL : i < size; i++) {
int l = vim_strsize(items[i]) + (i == current ? 2 : 0);
if (l > width) {
width = l;
}
item_count++;
}
width += 1;
if (Columns < width) {
// Not enough screen columns - show one per line
for (i = 0; i < item_count; i++) {
version_msg_wrap(items[i], i == current);
if (msg_col > 0 && i < item_count - 1) {
msg_putchar('\n');
}
}
return;
}
// The rightmost column doesn't need a separator.
// Sacrifice it to fit in one more column if possible.
int ncol = (Columns + 1) / width;
int nrow = item_count / ncol + (item_count % ncol ? 1 : 0);
int cur_row = 1;
// "i" counts columns then rows. "idx" counts rows then columns.
for (i = 0; !got_int && i < nrow * ncol; i++) {
int idx = (i / ncol) + (i % ncol) * nrow;
if (idx < item_count) {
int last_col = (i + 1) % ncol == 0;
if (idx == current) {
msg_putchar('[');
}
msg_puts(items[idx]);
if (idx == current) {
msg_putchar(']');
}
if (last_col) {
if (msg_col > 0 && cur_row < nrow) {
msg_putchar('\n');
}
cur_row++;
} else {
while (msg_col % width) {
msg_putchar(' ');
}
}
} else {
// this row is out of items, thus at the end of the row
if (msg_col > 0) {
if (cur_row < nrow) {
msg_putchar('\n');
}
cur_row++;
}
}
}
}
void list_lua_version(void)
{
char *code = "return ((jit and jit.version) and jit.version or _VERSION)";
Error err = ERROR_INIT;
Object ret = nlua_exec(cstr_as_string(code), (Array)ARRAY_DICT_INIT, &err);
assert(!ERROR_SET(&err));
assert(ret.type == kObjectTypeString);
msg(ret.data.string.data, 0);
api_free_object(ret);
}
void list_version(void)
{
msg(longVersion, 0);
msg(version_buildtype, 0);
list_lua_version();
if (p_verbose > 0) {
#ifndef NDEBUG
msg(version_cflags, 0);
#endif
version_msg("\n\n");
#ifdef SYS_VIMRC_FILE
version_msg(_(" system vimrc file: \""));
version_msg(SYS_VIMRC_FILE);
version_msg("\"\n");
#endif
#ifdef HAVE_PATHDEF
if (*default_vim_dir != NUL) {
version_msg(_(" fall-back for $VIM: \""));
version_msg(default_vim_dir);
version_msg("\"\n");
}
if (*default_vimruntime_dir != NUL) {
version_msg(_(" f-b for $VIMRUNTIME: \""));
version_msg(default_vimruntime_dir);
version_msg("\"\n");
}
#endif
}
version_msg(p_verbose > 0
? "\nRun :checkhealth for more info"
: (starting
? "\nRun \"nvim -V1 -v\" for more info"
: "\nRun \":verbose version\" for more info"));
}
/// Show the intro message when not editing a file.
void maybe_intro_message(void)
{
if (buf_is_empty(curbuf)
&& (curbuf->b_fname == NULL)
&& (firstwin->w_next == NULL)
&& (vim_strchr(p_shm, SHM_INTRO) == NULL)) {
intro_message(false);
}
}
/// Give an introductory message about Vim.
/// Only used when starting Vim on an empty file, without a file name.
/// Or with the ":intro" command (for Sven :-).
///
/// @param colon true for ":intro"
void intro_message(int colon)
{
static char *(lines[]) = {
N_(NVIM_VERSION_LONG),
"",
N_("Nvim is open source and freely distributable"),
"https://neovim.io/#chat",
"",
N_("type :help nvim<Enter> if you are new! "),
N_("type :checkhealth<Enter> to optimize Nvim"),
N_("type :q<Enter> to exit "),
N_("type :help<Enter> for help "),
"",
N_("type :help news<Enter> to see changes in v%s.%s"),
"",
N_("Help poor children in Uganda!"),
N_("type :help iccf<Enter> for information "),
};
// blanklines = screen height - # message lines
size_t lines_size = ARRAY_SIZE(lines);
assert(lines_size <= LONG_MAX);
long blanklines = Rows - ((long)lines_size - 1L);
// Don't overwrite a statusline. Depends on 'cmdheight'.
if (p_ls > 1) {
blanklines -= Rows - topframe->fr_height;
}
if (blanklines < 0) {
blanklines = 0;
}
// Show the sponsor and register message one out of four times, the Uganda
// message two out of four times.
int sponsor = (int)time(NULL);
sponsor = ((sponsor & 2) == 0) - ((sponsor & 4) == 0);
// start displaying the message lines after half of the blank lines
long row = blanklines / 2;
if (((row >= 2) && (Columns >= 50)) || colon) {
for (int i = 0; i < (int)ARRAY_SIZE(lines); i++) {
char *p = lines[i];
char *mesg = NULL;
int mesg_size = 0;
if (strstr(p, "news") != NULL) {
p = _(p);
mesg_size = snprintf(NULL, 0, p,
STR(NVIM_VERSION_MAJOR), STR(NVIM_VERSION_MINOR));
assert(mesg_size > 0);
mesg = xmallocz((size_t)mesg_size);
snprintf(mesg, (size_t)mesg_size + 1, p,
STR(NVIM_VERSION_MAJOR), STR(NVIM_VERSION_MINOR));
} else if (sponsor != 0) {
if (strstr(p, "children") != NULL) {
p = sponsor < 0
? N_("Sponsor Vim development!")
: N_("Become a registered Vim user!");
} else if (strstr(p, "iccf") != NULL) {
p = sponsor < 0
? N_("type :help sponsor<Enter> for information ")
: N_("type :help register<Enter> for information ");
}
}
if (mesg == NULL) {
if (*p != NUL) {
mesg = _(p);
} else {
mesg = "";
}
}
if (*mesg != NUL) {
do_intro_line((int)row, mesg, 0);
}
row++;
if (mesg_size > 0) {
XFREE_CLEAR(mesg);
}
}
}
}
static void do_intro_line(int row, char *mesg, int attr)
{
char *p;
int l;
// Center the message horizontally.
int col = vim_strsize(mesg);
col = (Columns - col) / 2;
if (col < 0) {
col = 0;
}
grid_line_start(&default_grid, row);
// Split up in parts to highlight <> items differently.
for (p = mesg; *p != NUL; p += l) {
for (l = 0;
p[l] != NUL && (l == 0 || (p[l] != '<' && p[l - 1] != '>'));
l++) {
l += utfc_ptr2len(p + l) - 1;
}
assert(row <= INT_MAX && col <= INT_MAX);
col += grid_line_puts(col, p, l, *p == '<' ? HL_ATTR(HLF_8) : attr);
}
grid_line_flush();
}
/// ":intro": clear screen, display intro screen and wait for return.
///
/// @param eap
void ex_intro(exarg_T *eap)
{
// TODO(bfredl): use msg_grid instead!
screenclear();
intro_message(true);
wait_return(true);
}