diff -Nru vim-8.2.1913/.appveyor.yml vim-8.2.2434/.appveyor.yml --- vim-8.2.1913/.appveyor.yml 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/.appveyor.yml 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,34 @@ +version: "{build}" + +skip_tags: true + +environment: + matrix: + - FEATURE: HUGE +# disabled +# - FEATURE: TINY +# - FEATURE: SMALL +# - FEATURE: NORMAL +# - FEATURE: BIG + +matrix: + fast_finish: true + +before_build: + # Use Windows SDK 7.1 (= MSVC 2010) + - '"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64 /release' + - 'set INCLUDE=%INCLUDE%C:\Program Files (x86)\Windows Kits\8.1\Include\um' + +build_script: + - ci/appveyor.bat + +test_script: + - cd src/testdir + # Testing with MSVC gvim + - path C:\Python35-x64;%PATH% + - nmake -f Make_dos.mak VIMPROG=..\gvim + - nmake -f Make_dos.mak clean + # Testing with MSVC console version + - nmake -f Make_dos.mak VIMPROG=..\vim + +# vim: sw=2 sts=2 et ts=8 sr diff -Nru vim-8.2.1913/appveyor.yml vim-8.2.2434/appveyor.yml --- vim-8.2.1913/appveyor.yml 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/appveyor.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -version: "{build}" - -skip_tags: true - -environment: - matrix: - - FEATURE: HUGE -# disabled -# - FEATURE: TINY -# - FEATURE: SMALL -# - FEATURE: NORMAL -# - FEATURE: BIG - -matrix: - fast_finish: true - -before_build: - # Use Windows SDK 7.1 (= MSVC 2010) - - '"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64 /release' - - 'set INCLUDE=%INCLUDE%C:\Program Files (x86)\Windows Kits\8.1\Include\um' - -build_script: - - ci/appveyor.bat - -test_script: - - cd src/testdir - # Testing with MSVC gvim - - path C:\Python35-x64;%PATH% - - nmake -f Make_dos.mak VIMPROG=..\gvim - - nmake -f Make_dos.mak clean - # Testing with MSVC console version - - nmake -f Make_dos.mak VIMPROG=..\vim - -# vim: sw=2 sts=2 et ts=8 sr diff -Nru vim-8.2.1913/ci/build-snd-dummy.sh vim-8.2.2434/ci/build-snd-dummy.sh --- vim-8.2.1913/ci/build-snd-dummy.sh 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/ci/build-snd-dummy.sh 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,19 @@ +#!/bin/bash +set -eu + +LINUX_VERSION=$(uname -r | cut -d. -f1-2) +LINUX_ARCHIVE_FILE=v${LINUX_VERSION}.tar.gz +LINUX_SOURCE_DIR=linux-${LINUX_VERSION} + +mkdir -p "${TMPDIR}" +cd "${TMPDIR}" + +wget -q "https://github.com/torvalds/linux/archive/${LINUX_ARCHIVE_FILE}" + +tar -xf "${LINUX_ARCHIVE_FILE}" "${LINUX_SOURCE_DIR}/sound" +cd "${LINUX_SOURCE_DIR}/sound" + +CC=gcc make -C "/lib/modules/$(uname -r)/build" M="${PWD}" CONFIG_SOUND=m CONFIG_SND=m CONFIG_SND_PCM=m CONFIG_SND_DUMMY=m modules + +mkdir -p "${SND_DUMMY_DIR}" +cp soundcore.ko core/snd.ko core/snd-pcm.ko drivers/snd-dummy.ko "${SND_DUMMY_DIR}" diff -Nru vim-8.2.1913/ci/setup-xvfb.sh vim-8.2.2434/ci/setup-xvfb.sh --- vim-8.2.1913/ci/setup-xvfb.sh 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/ci/setup-xvfb.sh 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/bash +set -e + +apt-get install -y xvfb + +cat </etc/systemd/system/xvfb.service +[Unit] +Description=X Virtual Frame Buffer Service +After=network.target +[Service] +ExecStart=/usr/bin/Xvfb :99 -screen 0 1024x768x24 +[Install] +WantedBy=multi-user.target +EOT + +systemctl enable xvfb.service +systemctl start xvfb.service diff -Nru vim-8.2.1913/.cirrus.yml vim-8.2.2434/.cirrus.yml --- vim-8.2.1913/.cirrus.yml 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/.cirrus.yml 2021-01-30 22:05:11.000000000 +0000 @@ -3,6 +3,8 @@ FEATURES: huge freebsd_12_task: + only_if: $CIRRUS_TAG == '' + timeout_in: 20m freebsd_instance: image: freebsd-12-1-release-amd64 install_script: diff -Nru vim-8.2.1913/.codecov.yml vim-8.2.2434/.codecov.yml --- vim-8.2.1913/.codecov.yml 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/.codecov.yml 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,6 @@ +coverage: + range: "80...100" + status: + project: + default: + threshold: 0.05% diff -Nru vim-8.2.1913/.coveralls.yml vim-8.2.2434/.coveralls.yml --- vim-8.2.1913/.coveralls.yml 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/.coveralls.yml 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1 @@ +service_name: github-actions diff -Nru vim-8.2.1913/debian/changelog vim-8.2.2434/debian/changelog --- vim-8.2.1913/debian/changelog 2020-11-19 17:39:38.000000000 +0000 +++ vim-8.2.2434/debian/changelog 2021-02-15 12:29:39.000000000 +0000 @@ -1,3 +1,61 @@ +vim (2:8.2.2434-1ubuntu1) hirsute; urgency=low + + * Merge from Debian unstable. Remaining changes: + - debian/runtime/vimrc: + + "syntax on" is a sane default for non-tiny vim. + - debian/rules: + + Disable tests on riscv64 + - debian/patches/debian/ubuntu-grub-syntax.patch: + + Add Ubuntu-specific "quiet" keyword. + - debian/patches/debian/update-upstart-syntax.patch: + + Add setuid and setgid to syntax file. + - debian/patches/ubuntu-mouse-off.patch: + + Mouse mode is actively harmful in some chroots. + - debian/patches/patches/increase_timeout.diff: + + Increase timeout for the Test_pattern_compile_speed patch. + * Dropped changes, deprecated: + - patches/riscv64-test-timeout.patch + + Increase Test_mode_message_at_leaving_insert_with_esc_mapped timeout + for riscv64. + + It was changed to WaitForAssert(), our patch patches another function: + Test_mode_message_at_leaving_insert_by_ctrl_c() + * Dropped changes, included upstream: + - debian/patches/ubuntu-series-support.patch: + + Add hirsute, move eoan to unsupported + + -- Lukas Märdian Mon, 15 Feb 2021 13:29:39 +0100 + +vim (2:8.2.2434-1) unstable; urgency=medium + + * Merge upstream patch v8.2.2434 + + 8.2.2428: Fix handling of focus events when 'ttymouse' is unset. + (Closes: #980449) + + -- James McCoy Sat, 30 Jan 2021 23:47:07 -0500 + +vim (2:8.2.2367-1) unstable; urgency=medium + + * Merge upstream patch v8.2.2367 + + 8.2.2367: Fix test failures on armel/armhf/mipsel + + -- James McCoy Sun, 17 Jan 2021 10:53:54 -0500 + +vim (2:8.2.2344-2) unstable; urgency=medium + + * rules: Add dummy command to test target to fix make error when + DEB_BUILD_OPTIONS=nocheck + + -- James McCoy Thu, 14 Jan 2021 22:25:21 -0500 + +vim (2:8.2.2344-1) unstable; urgency=medium + + * Merge upstream patch v8.2.2344 + + ftplugin/spec.vim: Fix missing ":let" (Closes: #977429) + + syntax/cabal.vim: Add build-tools-depends keyword (Closes: #973548) + * rules: Sanitize locale-related environment variables (Closes: #973943) + + -- James McCoy Thu, 14 Jan 2021 21:40:26 -0500 + vim (2:8.2.1913-1ubuntu3) hirsute; urgency=medium * No-change rebuild to build with python3.9 as default. diff -Nru vim-8.2.1913/debian/changelog.upstream vim-8.2.2434/debian/changelog.upstream --- vim-8.2.1913/debian/changelog.upstream 2020-10-28 09:19:49.000000000 +0000 +++ vim-8.2.2434/debian/changelog.upstream 2021-01-31 09:42:29.000000000 +0000 @@ -1825,3 +1825,636 @@ 11989 8.2.1799 some Normal mode commands not fully tested 1670 8.2.1800 Vim9: memory leak if "if" condition is invalid 2963 8.2.1801 undo file not found when using ":args" or ":next" + 1942 8.2.1802 Vim9: crash with unterminated dict + 4105 8.2.1803 a few failures are not tested + 2042 8.2.1804 resolve('/') returns an empty string + 2417 8.2.1805 Unix: terminal mode changed when using ":shell" + 2476 8.2.1806 MS-Windows with Python: Vim freezes after import command + 2419 8.2.1807 can use :help in a terminal popup window + 2525 8.2.1808 no test coverage for ":spelldump!" + 6501 8.2.1809 mapping some keys with Ctrl does not work properly + 6325 8.2.1810 some code in normal.c not covered by tests + 5254 8.2.1811 mapping Ctrl-key does not work for '{', '}' and '|' + 3429 8.2.1812 Vim9: nested closure throws an internal error + 7815 8.2.1813 Vim9: can assign wrong type to script dict + 1589 8.2.1814 missing change to remove "static" + 3003 8.2.1815 Vim9: memory leak when using function reference + 3451 8.2.1816 Vim9: another memory leak when using function reference + 3643 8.2.1817 Vim9: wrong instruction when reusing a local variable spot + 1660 8.2.1818 SE Linux: deprecation warning for security_context_t + 12097 8.2.1819 Vim9: Memory leak when using a closure + 1580 8.2.1820 Vim9: crash when error happens in timer callback + 3469 8.2.1821 Vim9: concatenating to a NULL list doesn't work + 1830 8.2.1822 list test doesn't fail + 2554 8.2.1823 "gN" does not select the matched string + 9700 8.2.1824 Vim9: variables at the script level escape their scope + 2429 8.2.1825 Vim9: accessing freed memory + 7613 8.2.1826 Vim9: cannot use a {} block at script level + 47800 8.2.1827 filetype detection does not test enough file names + 1678 8.2.1828 build failure without the +eval feature + 2473 8.2.1829 warnings when executing Github actions + 3772 8.2.1830 MS-Windows: Python3 issue with stdin + 1427 8.2.1831 file missing from distribution + 2206 8.2.1832 readdirex() error is displayed as a message + 2252 8.2.1833 when reading from stdin dup() is called twice + 4615 8.2.1834 PyEval_InitThreads() is deprecated in Python 3.9 + 5959 8.2.1835 ":help ??" finds the "!!" tag + 3776 8.2.1836 autocmd test fails on pacifist systems + 4254 8.2.1837 using "gn" after "gN" does not work + 5844 8.2.1838 Vim9: cannot insert a comment line in an expression + 3240 8.2.1839 Vim9: memory leaks reported in assign test + 4499 8.2.1840 Vim9: error message is not clear about compilation error + 1798 8.2.1841 Vim9: test for compilation error fails in normal build + 3440 8.2.1842 crash when USE_FNAME_CASE is defined and using :browse + 2121 8.2.1843 Netbeans: with huge buffer number memory allocation may fail + 3792 8.2.1844 using "q" at the more prompt doesn't stop a long message + 16660 8.2.1845 Vim9: function defined in a block can't use block variables + 30419 8.2.1846 Vim9: block variables are not found in compiled function + 1462 8.2.1847 Vim9: using negative value for unsigned type + 2526 8.2.1848 crash when passing a NULL string or list to popup_settext() + 3974 8.2.1849 Vim9: garbage collection frees block-local variables + 2961 8.2.1850 "vat" does not select tags correctly over line break + 3690 8.2.1851 Vim9: "!" followed by space incorrectly used + 3705 8.2.1852 map() returing zero for NULL list is unexpected + 2186 8.2.1853 "to_f" is recognized at "topleft" modifier + 2954 8.2.1854 Vim9: crash when throwing exception for NULL string + 3963 8.2.1855 Vim9: get error message when nothing is wrong + 2709 8.2.1856 "2resize" uses size of current window + 2427 8.2.1857 Vim9: using job_status() on an unused var gives an error + 4524 8.2.1858 Vim9: filter functions return number instead of bool + 4184 8.2.1859 Vim9: crash in unpack assignment + 1340 8.2.1860 Vim9: memory leak when throwing empty string + 4284 8.2.1861 Vim9: no specific error when parsing lambda fails + 1381 8.2.1862 vim9: memory leak when compiling lambda fails + 3537 8.2.1863 json code not sufficiently tested + 19569 8.2.1864 Vim9: no error for wrong list type + 9162 8.2.1865 Vim9: add() does not check type of argument + 1960 8.2.1866 Vim9: appending to pushed blob gives wrong result + 7800 8.2.1867 Vim9: argument to add() not checked for blob + 2028 8.2.1868 Vim9: no error for missing space after comma in dict + 1338 8.2.1869 Vim9: memory leak when using add() + 10627 8.2.1870 Vim9: no need to keep all script variables + 2653 8.2.1871 using %v in 'errorformat' may fail before %Z + 6549 8.2.1872 matchfuzzy() does not prefer sequential matches + 2219 8.2.1873 Vim9: missing white space when using + 7151 8.2.1874 can't do something just before leaving Insert mode + 1942 8.2.1875 warning when building GTK gui +111920 8.2.1876 Vim9: argument types are not checked at compile time + 4573 8.2.1877 test for function list fails + 29348 8.2.1878 GTK: error for redefining function + 8707 8.2.1879 Vim9: argument types of insert() not checked when compiling + 2033 8.2.1880 Vim9: asan complains about adding zero to NULL + 4763 8.2.1881 cannot build with GTK3 + 3503 8.2.1882 Vim9: v:disallow_let is no longer needed + 20554 8.2.1883 compiler warnings when using Python + 2445 8.2.1884 compiler warning for uninitialized variable + 1506 8.2.1885 filetype tests unnessarily creates swap files + 3335 8.2.1886 using ":silent!" in a popup filter has unexpected effect + 1607 8.2.1887 Github actions not optimally configured + 2545 8.2.1888 Vim9: getbufline(-1, 1, '$') gives an error + 1974 8.2.1889 Vim9: errornous error for missing white space after {} + 3698 8.2.1890 Vim9: strange error for subtracting from a list + 6461 8.2.1891 Vim9: skipping over expression doesn't handle line breaks + 1809 8.2.1892 valgrind warns for using uninitialized access in tests + 30521 8.2.1893 fuzzy matching does not support multiple words + 8705 8.2.1894 Vim9: command modifiers are not supported + 1452 8.2.1895 Vim9: silent command modifier test fails + 1997 8.2.1896 valgrind warns for using uninitialized memory + 16058 8.2.1897 command modifiers are saved and set inconsistently + 95041 8.2.1898 command modifier parsing always uses global cmdmod + 1524 8.2.1899 crash in out-of-memory situation + 19086 8.2.1900 Vim9: command modifiers do not work + 3666 8.2.1901 variable completion does not work in command line window + 2177 8.2.1902 default option values changed with :badd for existing buffer + 1708 8.2.1903 buffer test fails with normal features + 6966 8.2.1904 still using default option values after using ":badd +1" + 3500 8.2.1905 the wininfo list may contain stale entries + 2973 8.2.1906 warning for signed/unsigned + 6757 8.2.1907 complete_info().selected may be wrong + 3381 8.2.1908 Lua is initialized even when not used + 26399 8.2.1909 number of status line items is limited to 80 + 2258 8.2.1910 reading past the end of the command line + 1811 8.2.1911 tiny build fails + 3038 8.2.1912 with Python 3.9 some tests fail + 2108 8.2.1913 GTK GUI: rounding for the cell height is too strict + 8479 8.2.1914 Vim9: cannot put line break in expression for '=' register + 2739 8.2.1915 Vim9: error for wrong number of arguments is not useful + 3525 8.2.1916 Vim9: function call is aborted even when "silent!" is used + 1598 8.2.1917 no test for improved Man command + 2506 8.2.1918 Vim9: E1100 mentions :let + 16311 8.2.1919 assert_fails() setting emsg_silent changes normal execution + 1808 8.2.1920 listlbr test fails when run after another test + 3900 8.2.1921 fuzzy matching does not recognize path separators + 5441 8.2.1922 Win32: scrolling problems when part of window is off-screen + 2326 8.2.1923 Vim9: "filter" command modifier doesn't work + 3346 8.2.1924 Vim9: crash when indexing dict with NULL key + 1730 8.2.1925 list/dict test fails + 2713 8.2.1926 cannot use a space in 'spellfile' + 5121 8.2.1927 Vim9: get unknown error with an error in a timer function + 2557 8.2.1928 Vim9: "silent!" not effective when list index is wrong + 1938 8.2.1929 MS-Windows: problem loading Perl 5.32 + 3202 8.2.1930 wrong input if removing shift results in special key code + 6643 8.2.1931 Vim9: arguments of extend() not checked at compile time + 4812 8.2.1932 compiler warnings when building with Athena GUI + 10348 8.2.1933 cannot sort using locale ordering + 7141 8.2.1934 Vim9: command modifiers in :def function not tested + 3907 8.2.1935 sort test fails on Mac + 3009 8.2.1936 session sets the local 'scrolloff' value to the global value + 2812 8.2.1937 Vim9: test for confirm modifier fails in some situations + 3467 8.2.1938 wiping out a terminal buffer makes some tests fail + 2855 8.2.1939 invalid memory access in Ex mode with global command + 1542 8.2.1940 Vim9: browse modifier test fails on Mac + 1400 8.2.1941 Ex mode test fails on MS-Windows with GUI + 18853 8.2.1942 insufficient test coverage for the Netbeans interface + 2586 8.2.1943 Vim9: wrong error message when colon is missing + 1746 8.2.1944 Netbeans test is flaky + 2689 8.2.1945 crash when passing NULL function to reduce() + 4154 8.2.1946 sort() with NULL string not tested + 1840 8.2.1947 crash when using "zj" without folds + 3239 8.2.1948 GUI: crash when handling message while closing a window + 5647 8.2.1949 Vim9: using extend() on null dict is silently ignored + 3472 8.2.1950 Vim9: crash when compiling function fails when getting type + 8017 8.2.1951 test for list and dict fails + 2974 8.2.1952 Vim9: crash when using a NULL dict key + 7241 8.2.1953 Vim9: extra "unknown" error after other error + 3443 8.2.1954 Vim9: not all command modifiers are tested + 3207 8.2.1955 Vim9: not all command modifiers are tested + 20070 8.2.1956 Vim9: cannot specify argument types for lambda + 8821 8.2.1957 diff and cursorcolumn highlighting don't mix + 1787 8.2.1958 build failure with timers + 4620 8.2.1959 crash when terminal buffer name is made empty + 1615 8.2.1960 warning for uninitialized variable + 3964 8.2.1961 various comments can be improved + 5973 8.2.1962 netbeans may access freed memory + 4665 8.2.1963 crash when using a popup window with "latin1" encoding + 2917 8.2.1964 not all ConTeXt files are recognized + 4962 8.2.1965 Vim9: tests fail without the channel feature + 8595 8.2.1966 popup becomes current window after closing a terminal window + 13352 8.2.1967 the session file does not restore the alternate file + 7333 8.2.1968 Vim9: has() assumes a feature does not change dynamically + 21150 8.2.1969 Vim9: map() may change the list or dict item type + 5264 8.2.1970 it is easy to make mistakes when cleaning up swap files + 1788 8.2.1971 memory leak when map() fails + 1887 8.2.1972 crash when recreating nested fold + 2152 8.2.1973 finding a patch number can be a bit slow + 2000 8.2.1974 Vim9: test for has('gui_running') fails with VIMDLL + 1448 8.2.1975 Win32: memory leak when encoding conversion fails + 2581 8.2.1976 cannot backspace in prompt buffer after using cursor-left + 15914 8.2.1977 Vim9: error for using a string in a condition is confusing + 33294 8.2.1978 making a mapping work in all modes is complicated + 3592 8.2.1979 "term_opencmd" option of term_start() is truncated + 56846 8.2.1980 Vim9: some tests are not done at the script level + 2115 8.2.1981 MinGW: parallel compilation might fail + 2653 8.2.1982 quickfix window not updated when adding invalid entries + 4506 8.2.1983 ml_get error when using to open a terminal + 5364 8.2.1984 cannot use :vimgrep in omni completion + 2853 8.2.1985 crash when closing terminal popup with mapping + 2317 8.2.1986 expression test is flaky on Appveyor + 3405 8.2.1987 MS-Windows: Win32.mak is no longer needed + 2472 8.2.1988 still in Insert mode when opening terminal popup + 2469 8.2.1989 info popup triggers WinEnter and WinLeave autocommands + 8043 8.2.1990 cursor position wrong in terminal popup with finished job + 1597 8.2.1991 Coverity warns for not using the ga_grow() return value + 1336 8.2.1992 build fails with small features + 2212 8.2.1993 occasional failure of the netbeans test + 3411 8.2.1994 MS-Windows: MinGW always does a full build + 2430 8.2.1995 the popup menu can cause too much redrawing + 7473 8.2.1996 Vim9: invalid error for argument of extend() + 2593 8.2.1997 window changes when using bufload() while in a terminal popup + 2013 8.2.1998 terminal Cmd test sometimes fails to close popup + 1752 8.2.1999 terminal popup test sometimes fails + 4364 8.2.2000 Vim9: dict.key assignment not implemented yet + 7485 8.2.2001 Vim9: :def function does not apply 'maxfuncdepth' + 2977 8.2.2002 Vim9: lambda argument shadowed by function name + 2078 8.2.2003 build error with +conceal but without +popupwin + 1593 8.2.2004 compiler warning for uninitialized variable + 4290 8.2.2005 redoing a mapping with doesn't work properly + 2377 8.2.2006 .pbtxt files are not recognized + 1698 8.2.2007 test for insert mode in popup is not reliable + 2829 8.2.2008 MS-Windows GUI: handling channel messages lags + 7230 8.2.2009 MS-Windows: setting $LANG in gvimext only causes problems + 3691 8.2.2010 Vim9: compiling fails for unreachable return statement + 4012 8.2.2011 "syn sync" reports a very large number + 3197 8.2.2012 Vim9: confusing error message when using bool wrongly + 2637 8.2.2013 Vim9: not skipping white space after unary minus + 2947 8.2.2014 using CTRL-O in a prompt buffer moves cursor to start + 11901 8.2.2015 Vim9: literal dict #{} is not like any other language + 2285 8.2.2016 swap file test is a little flaky + 2665 8.2.2017 missing part of the dict change + 2618 8.2.2018 Vim9: script variable not found from lambda + 2447 8.2.2019 swap file test fails on MS-Windows + 3444 8.2.2020 some compilers do not like the "namespace" argument + 6671 8.2.2021 Vim9: get E1099 when autocommand resets did_emsg + 2206 8.2.2022 Vim9: star command recognized errornously + 1600 8.2.2023 Vim: memory leak when :execute fails + 6790 8.2.2024 flicker when redrawing a popup with a title and border + 1744 8.2.2025 Amiga: Not all colors are used on OS4 + 1405 8.2.2026 Coverity warns for possibly using not NUL terminated string + 1278 8.2.2027 Coverity warns for uninitialized field + 1504 8.2.2028 Coverity warns for using an uninitialized variable + 1656 8.2.2029 Coverity warns for not checking return value + 4680 8.2.2030 some tests fail on Mac + 9065 8.2.2031 some tests fail when run under valgrind + 5059 8.2.2032 cabalconfig and cabalproject filetypes not recognized + 8734 8.2.2033 Vim9: :def without argument gives compilation error + 16763 8.2.2034 Vim9: list unpack in for statement not compiled yet + 3305 8.2.2035 MS-Windows: some tests may fail + 4133 8.2.2036 buffer messed up if creating the quickfix window fails + 3034 8.2.2037 compiler test depends on list of compiler plugins + 1646 8.2.2038 compiler test fails on MS-Windows + 3068 8.2.2039 viminfo is not written when creating a new file + 2724 8.2.2040 terminal buffer disappears even when 'bufhidden' is "hide" + 3631 8.2.2041 haskell filetype not optimally recognized + 2005 8.2.2042 build failure with +profile but without +reltime + 1935 8.2.2043 GTK3: white border around text stands out + 4224 8.2.2044 MS-Windows: swap file test sometimes fails + 5308 8.2.2045 highlighting a character too much with incsearch + 5626 8.2.2046 some test failures don't give a clear error + 1679 8.2.2047 Amiga: FEAT_ARP defined when it should not + 1626 8.2.2048 Amiga: obsolete code + 1825 8.2.2049 Amiga: obsolete function + 3205 8.2.2050 search test contains unneeded sleeps + 3906 8.2.2051 Vim9: crash when aborting a user function call + 8652 8.2.2052 Vim9: "edit +4 fname" gives an error + 2406 8.2.2053 Vim9: lamba doesn't accept argument types + 1909 8.2.2054 Amiga: FEAT_ARP defined when it should not + 2602 8.2.2055 MS-Windows: two Vim instances may use the same temp file + 2551 8.2.2056 configure fails if building with implicit-function-declaration + 4833 8.2.2057 getting the selection may trigger TextYankPost autocmd + 5332 8.2.2058 using mkview/loadview changes the jumplist + 2876 8.2.2059 Amiga: can't find plugins + 5234 8.2.2060 check for features implemented with "if" + 3155 8.2.2061 Vim9: E1030 error when using empty string for term_sendkeys() + 2147 8.2.2062 does not handle CTRL-V + 10981 8.2.2063 Vim9: only one level of indexing supported + 5127 8.2.2064 terminal: cursor is on while redrawing, causing flicker + 5826 8.2.2065 using map() and filter() on a range() is inefficient + 3767 8.2.2066 Vim9: assignment with += doesn't work + 3220 8.2.2067 cursor position in popup terminal is wrong + 5544 8.2.2068 transparent syntax item uses start/end of containing region + 5202 8.2.2069 the quickfix window is not updated after setqflist() + 6598 8.2.2070 can't get the exit value in VimLeave(Pre) autocommands + 3541 8.2.2071 Vim9: list assign doesn't except empty remainder list + 3533 8.2.2072 Vim9: list assign not well tested + 22348 8.2.2073 Vim9: for with unpack only works for local variables + 3523 8.2.2074 Vim9: using :normal from Vim9 script can't handle range + 3325 8.2.2075 error for const argument to mapnew() + 2718 8.2.2076 MS-Windows console: sometimes drops typed characters + 3278 8.2.2077 build failure with small features + 2426 8.2.2078 illegal memory access when using :print on invalid text + 2818 8.2.2079 Vim9: cannot put a linebreak before or after "in" of ":for" + 2397 8.2.2080 Vim9: no proper error message for using s:var in for loop + 3607 8.2.2081 Vim9: cannot handle a linebreak after "=" in assignment + 67573 8.2.2082 Vim9: can still use the depricated #{} dict syntax + 3423 8.2.2083 Vim9: crash when using ":silent!" and getting member fails + 9354 8.2.2084 CTRL-V U doesn't work to enter a Unicode character + 2989 8.2.2085 Qt translation file is recognized as typescript + 3938 8.2.2086 libvterm tests are only run on Linux + 1473 8.2.2087 Vim9: memory leak when statement is truncated + 1395 8.2.2088 Vim9: script test sometimes fails + 2136 8.2.2089 libvterm test fails to build on Mac + 8578 8.2.2090 Vim9: dict does not accept a key in quotes + 2299 8.2.2091 MS-Windows: build warnings + 11955 8.2.2092 Vim9: unpredictable errors for script tests + 1742 8.2.2093 Vim9: script test sometimes fails + 2224 8.2.2094 when an expression fails getting next command may be wrong + 2936 8.2.2095 Vim9: crash when failed dict member is followed by concat + 4935 8.2.2096 Vim9: command modifiers not restored after assignment + 5244 8.2.2097 Vim9: using :silent! when calling a function prevents abort + 2889 8.2.2098 Vim9: function argument of sort() and map() not tested + 9565 8.2.2099 Vim9: some checks are not tested + 4273 8.2.2100 insufficient testing for function range and dict + 1914 8.2.2101 Vim9: memory leak when literal dict has an error + 3413 8.2.2102 Vim9: not all error messages tested + 2010 8.2.2103 Vim9: unreachable code + 6159 8.2.2104 build problem with Ruby 2.7 + 3607 8.2.2105 sound test is a bit flaky + 2042 8.2.2106 TOML files are not recognized + 8996 8.2.2107 Vim9: some errors not tested + 3576 8.2.2108 Vim9: no test to check for :let error + 2229 8.2.2109 "vim -" does not work well when modifyOtherKeys is enabled + 1907 8.2.2110 cannot use ":shell" when reading from stdin + 3235 8.2.2111 GTK: menu background is the same color as the main window + 3900 8.2.2112 running tests may leave some files behind + 2179 8.2.2113 MS-Windows GUI: crash after using ":set guifont=" four times + 1619 8.2.2114 Vim9: unreachable code in assignment + 2387 8.2.2115 Vim9: some errors not tested for; dead code + 1953 8.2.2116 MS-Windows GUI: test for 'guifont' is incomplete + 11069 8.2.2117 some functions use any value as a string + 1831 8.2.2118 dead code in the job support + 2236 8.2.2119 GTK3: status line background color is wrong + 2597 8.2.2120 not all Perl functionality is tested + 3450 8.2.2121 internal error when using \ze before \zs in a pattern + 2390 8.2.2122 Vim9: crash when sourcing vim9script early + 2115 8.2.2123 after using a complete popup the buffer is listed + 8331 8.2.2124 Vim9: a range cannot be computed at runtime + 1607 8.2.2125 Vim9: leaking memory + 1316 8.2.2126 Ruby: missing function prototype + 2212 8.2.2127 Vim9: executing user command from Vim9 script not tested + 6777 8.2.2128 there is no way to do something on CTRL-Z + 2623 8.2.2129 MS-Windows: Checking if a file name is absolute is slow + 4283 8.2.2130 Insert mode completion messages end up in message history + 13181 8.2.2131 Vim9: crash when lambda uses same var as assignment + 4988 8.2.2132 padding not drawn properly for popup window with title + 10845 8.2.2133 Vim9: checking for a non-empty string is too strict + 2542 8.2.2134 Vim9: get E1099 when autocmd triggered in builtin function + 2690 8.2.2135 Vim9: #{ still seen as start of dict in some places + 2192 8.2.2136 Vim9: Using uninitialized variable + 7504 8.2.2137 Vim9: :echo and :execute give error for empty argument + 12924 8.2.2138 Vim9: "exit_cb" causes Vim to exit + 2346 8.2.2139 Vim9: unreachable code in assignment + 1866 8.2.2140 build failure with tiny features + 4206 8.2.2141 user command with try/catch may not catch an expression error + 1388 8.2.2142 memory leak when heredoc is not terminated + 1836 8.2.2143 Vim9: dead code in compiling :unlet + 3002 8.2.2144 Vim9: some corner cases not tested + 3691 8.2.2145 Vim9: concatenating lists does not adjust type of result + 2058 8.2.2146 Vim9: automatic conversion of number to string for dict key + 3580 8.2.2147 quickfix window title not updated in all tab pages + 2472 8.2.2148 Vim9: crash when user command doesn't match + 1787 8.2.2149 popupwin test for latin1 sometimes fails + 37152 8.2.2150 Github actions CI isn't used for all available platforms + 2273 8.2.2151 $dir not expanded when configure checks for moonjit + 2576 8.2.2152 screenpos() does not include the WinBar offset + 1622 8.2.2153 popupwin test for latin1 still fails sometimes + 2421 8.2.2154 popupwin test for terminal buffer fails sometimes + 1850 8.2.2155 warning from Github actions for code analysis + 4050 8.2.2156 Github actions run on pusing a tag + 2379 8.2.2157 Vim9: can delete a Vim9 script variable from a function + 2037 8.2.2158 CI on cirrus times out, coveralls doesn't always run + 3280 8.2.2159 Vim9: when declaring a list it is not allocated yet + 31506 8.2.2160 various typos + 3350 8.2.2161 arguments -T and -x not tested yet + 14465 8.2.2162 Vim9: Cannot load or store autoload variables + 2224 8.2.2163 crash when discarded exception is the current exception + 2947 8.2.2164 Vim9: autoload function doesn't work in uppercased script + 4221 8.2.2165 Vim9: assignment to dict member does not work + 2356 8.2.2166 auto format doesn't work when deleting text + 1999 8.2.2167 Vim9: assign test fails + 3647 8.2.2168 Vim9: error for assigning to dict of dict + 6432 8.2.2169 Vim9: test leaves file behind + 12049 8.2.2170 Vim9: a global function defined in a :def function fails + 1891 8.2.2171 valgrind warning for using uninitialized value + 6008 8.2.2172 Vim9: number of arguments is not always checked + 3388 8.2.2173 Vim9: get internal error when assigning to undefined variable + 1641 8.2.2174 Mac version doesn't specify the CPU architecture + 4485 8.2.2175 github actions: clang-11 handling suboptimal + 2085 8.2.2176 crash with a sequence of fold commands + 2675 8.2.2177 pattern "^" does not match if first character is combining + 6755 8.2.2178 Python 3: non-utf8 character cannot be handled + 16498 8.2.2179 Vim9: crash when indexing a dict with a number + 1868 8.2.2180 Vim9: test for error after error is flaky + 3866 8.2.2181 valgrind warnings for using uninitialized value + 23831 8.2.2182 Vim9: value of 'magic' is still relevant + 2026 8.2.2183 Vim9: value of 'edcompatible' and 'gdefault' are used + 3747 8.2.2184 Vim9: no error when using "2" for a line number + 55238 8.2.2185 BufUnload is not triggered for the quickfix dummy buffer + 4476 8.2.2186 Vim9: error when using 'opfunc' + 4068 8.2.2187 Python 3 test fails sometimes + 18894 8.2.2188 Vim9: crash when calling global function from :def function + 3189 8.2.2189 cannot repeat a command that uses the small delete register + 2485 8.2.2190 Vim9: crash when compiled with EXITFREE + 5469 8.2.2191 Vim9: using wrong name with lambda in nested function + 2470 8.2.2192 Codecov on github actions fails + 5117 8.2.2193 Vim9: can change constant in :def function + 10221 8.2.2194 Vim9: cannot use :const or :final at the script level + 3910 8.2.2195 failing tests for :const + 2698 8.2.2196 :version output has extra spaces in compile and link command + 1717 8.2.2197 assert arguments order reversed + 3936 8.2.2198 ml_get error when resizing window and using text property + 2487 8.2.2199 first write after setting 'eol' does not have NL added + 4594 8.2.2200 Vim9: lambda without white space around -> is confusing + 1752 8.2.2201 write file test fails on MS-Windows + 1753 8.2.2202 write file test still fails on MS-Windows + 2649 8.2.2203 Moodle gift files are not recognized + 27134 8.2.2204 Vim9: using -> both for method and lambda is confusing + 1891 8.2.2205 Vim9: memory leak when parsing lambda fails + 2626 8.2.2206 :exe command line completion only works for first argument + 7240 8.2.2207 illegal memory access if popup menu items are changed + 12482 8.2.2208 Vim9: after reloading a script variable index may be invalid + 24946 8.2.2209 Vim9: return type of => lambda not parsed + 3409 8.2.2210 Vim9: allocating a type to set TTFLAG_BOOL_OK + 3690 8.2.2211 MS-Windows: can't load Python dll if not in the path + 9594 8.2.2212 Vim9: lambda with => does not work at the script level + 1746 8.2.2213 checking white space around -> is not backwards compatible + 7098 8.2.2214 ":e#" does not give a warning for missing white space + 2512 8.2.2215 Vim9: `=expr` not recognized in global command + 3750 8.2.2216 Vim9: range with missing colon can be hard to spot + 2063 8.2.2217 Vim9: command modifiers not restored in catch block + 2651 8.2.2218 Vim9: failure if passing more args to lambda than expected + 8081 8.2.2219 Vim9: method call with expression not supported + 1394 8.2.2220 Vim9: memory leak when parsing nested parenthesis + 3653 8.2.2221 if is mapped on the command line 'wildchar' is inserted + 15837 8.2.2222 Vim9: cannot keep script variables when reloading + 8145 8.2.2223 Vim9: Reloading marks a :def function as deleted + 14266 8.2.2224 Vim9: crash if script reloaded with different variable type + 12065 8.2.2225 Vim9: error when using :import in legacy script twice + 1415 8.2.2226 Vim9: script test fails + 7953 8.2.2227 Vim9: recognizing lambda is too complicated + 7410 8.2.2228 Vim9: cannot use ":e #" because # starts a comment + 1645 8.2.2229 build failure without the +eval feature + 2552 8.2.2230 Vim9: insert completion runs into error + 2578 8.2.2231 when "--remote file" is used "file" is not reloaded + 1651 8.2.2232 compiler error for falling through into next case + 7147 8.2.2233 cannot convert a byte index into a character index + 2703 8.2.2234 command line wildmenu test often fails with Unix GUI + 11933 8.2.2235 build failure with some Ruby versions + 4778 8.2.2236 'scroll' option can change when setting the statusline + 1472 8.2.2237 CI on Mac fails in sed command + 23116 8.2.2238 Vim9: cannot load a Vim9 script without the +eval feature + 15191 8.2.2239 Vim9: concatenating lines with backslash is inconvenient + 3046 8.2.2240 clientserver test fails if full path is used + 2571 8.2.2241 Build with Ruby and clang may fail + 7409 8.2.2242 Vim9: bar line continuation does not work at script level + 2990 8.2.2243 crash when popup mask contains zeroes + 1989 8.2.2244 crash when making the window width negative + 2184 8.2.2245 Vim9: return value of winrestcmd() cannot be executed + 8956 8.2.2246 cursor keys not recognized at the hit-Enter prompt + 13752 8.2.2247 VMS: various smaller problems + 1986 8.2.2248 ASAN error on exit with GUI + 1949 8.2.2249 termcodes test is flaky when used over ssh + 17246 8.2.2250 Vim9: sublist is ambiguous + 1602 8.2.2251 test failures in legacy script + 3104 8.2.2252 Vim9: crash when using lambda without return type in dict + 1254 8.2.2253 Vim9: expr test fails + 18904 8.2.2254 Vim9: bool option type is number + 3341 8.2.2255 Tcl test fails + 2899 8.2.2256 Vim9: cannot use function( after line break in :def function + 38425 8.2.2257 Vim9: using -> for lambda is ambiguous + 4382 8.2.2258 not all OCaml related files are detected + 2016 8.2.2259 Test_Executable() fails when using chroot + 1704 8.2.2260 window resize test fails in very wide terminal + 2626 8.2.2261 Vim9: boolean option gets string type + 4412 8.2.2262 Vim9: converting bool to string prefixes v: + 7110 8.2.2263 Vim9: compilation error with try-catch in skipped block + 5196 8.2.2264 Vim9: no error for mismatched :endfunc or :enddef + 2240 8.2.2265 error message for missing endfunc/enddef is last line + 12515 8.2.2266 Vim9: it can be hard to see where white space is missing + 4046 8.2.2267 Vim9: cannot use unlet for a dict member + 10588 8.2.2268 Vim9: list unpack seen as declaration + 3552 8.2.2269 not all :hardcopy code covered by tests + 1747 8.2.2270 warning for size_t to int conversion + 2779 8.2.2271 ml_get error when changing hidden buffer in Python + 15452 8.2.2272 Vim9: extend() can violate the type of a variable + 1801 8.2.2273 build failure + 3894 8.2.2274 badge for Travis is outdated + 2145 8.2.2275 CTRL-C not recognized in Mintty + 6071 8.2.2276 list of distributed files is outdated + 1454 8.2.2277 missing backslash + 6889 8.2.2278 falling back to old regexp engine can some patterns + 1660 8.2.2279 Vim9: memory leak with catch in skipped block + 19607 8.2.2280 fuzzy matching doesn't give access to the scores + 2081 8.2.2281 Vim9: compiled "wincmd" cannot be followed by bar + 2064 8.2.2282 length check mismatch with argument of strncmp() + 2468 8.2.2283 Vim9: crash when lambda has fewer arguments than expected + 2577 8.2.2284 Vim9: cannot set an option to a boolean value + 2454 8.2.2285 Vim9: cannot set an option to a false + 6448 8.2.2286 sort test fails when locale is Canadian English + 5162 8.2.2287 sort test fails when locale is French Canadian + 9404 8.2.2288 Vim9: line break and comment not always skipped + 9004 8.2.2289 Vim9: 'cpo' can become empty + 4677 8.2.2290 Vim9: unlet of global variable cannot be compiled + 7482 8.2.2291 Vim9: cannot use "null" for v:null + 1909 8.2.2292 Vim: expr test fails + 1466 8.2.2293 build failure with Motif + 26434 8.2.2294 VMS: a few remaining problems + 18243 8.2.2295 incsearch does not detect empty pattern properly + 3461 8.2.2296 cannot use CTRL-N and CTRL-P in a popup menu + 2564 8.2.2297 Vim9: cannot set 'number' to a boolean value + 7672 8.2.2298 Vim9: comment right after "(" of function not recognized + 5002 8.2.2299 Vim9: invalid memory access making error message flaky + 1819 8.2.2300 Vim9: wrong order on type stack when using dict + 44724 8.2.2301 Vim9: cannot unlet a dict or list item + 2060 8.2.2302 Vim9: using an option value may use uninitialized memory + 2161 8.2.2303 Vim9: backtick expansion doesn't work for :foldopen + 4754 8.2.2304 Vim9: no test for unletting an imported variable + 6553 8.2.2305 Vim9: "++var" and "--var" are silently accepted + 23279 8.2.2306 Vim9: when using function reference type is not checked + 2123 8.2.2307 a shell command in the vimrc causes terminal output + 4302 8.2.2308 Vim9: no error when assigning lambda to funcref + 2653 8.2.2309 0o777 not recognized as octal + 2362 8.2.2310 Vim9: winsaveview() return type is too generic + 7479 8.2.2311 Vim9: cannot assign to variable that shadows command modifier + 1498 8.2.2312 build failure with Ruby 3.0 and 32 bits + 2440 8.2.2313 Vim9: using uninitialized field when parsing range + 13291 8.2.2314 Vim9: returning zero takes two instructions + 2742 8.2.2315 Vim9: "enddef" as dict key misintepreted as function end + 2755 8.2.2316 Vim9: cannot list a lambda function + 3507 8.2.2317 Vim9: command modifier before list unpack doesn't work + 11934 8.2.2318 Vim9: string and list index work differently + 12368 8.2.2319 "exptype_T" can be read as "expected type" + 3345 8.2.2320 Vim9: no error for comparing bool with string + 22245 8.2.2321 Vim9: cannot nest closures + 21500 8.2.2322 Vim9: closure nested limiting to one level + 3407 8.2.2323 Vim9: error when inferring type from empty dict/list + 50465 8.2.2324 not easy to get mark en cursor position by character count + 10521 8.2.2325 Vim9: crash if map() changes the item type + 1502 8.2.2326 build error with +eval feature but without +spell + 2239 8.2.2327 debugging code included + 2459 8.2.2328 some test files may not be deleted + 4988 8.2.2329 not all ways Vim can be started are tested + 2774 8.2.2330 Vim9: crash when using :trow in a not executed block + 12719 8.2.2331 Vim9: wrong error when modifying dict declared with :final + 10333 8.2.2332 Vim9: missing :endif not reported when using :windo + 1830 8.2.2333 Vim9: warning for uninitialized variable + 7653 8.2.2334 Pascal-like filetypes not always detected + 2392 8.2.2335 Vim9: "silent return" does not restore command modifiers + 11580 8.2.2336 Vim9: not possible to extend dictionary with different type + 2322 8.2.2337 configure test for GTK only says "no" + 3618 8.2.2338 Vim9: no error if using job_info() result wrongly + 6342 8.2.2339 cannot get the type of a value as a string + 2572 8.2.2340 win_execute() unexpectedly returns number zero when failing + 3340 8.2.2341 expression command line completion incomplete after "g:" + 12069 8.2.2342 "char" functions may return wrong column in Insert mode + 10134 8.2.2343 Vim9: return type of readfile() is any + 20850 8.2.2344 using inclusive index for slice is not always desired + 8627 8.2.2345 no focus events in a terminal + 3318 8.2.2346 Codecov reports every little coverage drop + 1593 8.2.2347 build failure without GUI + 2979 8.2.2348 no check for modified files after focus gained + 3304 8.2.2349 Vim9: cannot handle line break after parenthesis at line end + 1948 8.2.2350 using "void" for no reason + 2461 8.2.2351 Vim9: error msg for "throw" in function called with "silent!" + 2164 8.2.2352 if focus lost/gained is received twice code is not ignored + 2078 8.2.2353 spartql files are not detected + 8907 8.2.2354 crash with a weird combination of autocommands + 1889 8.2.2355 stray test failure on Appveyor + 5258 8.2.2356 Vim9: ":put =expr" does not handle a list properly + 2060 8.2.2357 Vim9: crash when parsing function return type fails + 2255 8.2.2358 wrong #ifdef for use_xterm_like_mouse() + 1914 8.2.2359 strange test failure with MS-Windows + 1443 8.2.2360 test leaves file behind + 1878 8.2.2361 Vim9: no highlight for "s///gc" when using 'opfunc' + 19936 8.2.2362 Vim9: check of builtin function argument type is incomplete + 2239 8.2.2363 curpos() does not accept a string argument as before + 4400 8.2.2364 Vim9: line break in lambda accesses freed memory + 8739 8.2.2365 Vim9: no check for map() changing item type at script level + 8671 8.2.2366 when using ":sleep" the cursor is always displayed + 6610 8.2.2367 test failures on some less often used systems + 3275 8.2.2368 insufficient tests for setting options + 29522 8.2.2369 Vim9: functions return true/false but can't be used as bool + 2630 8.2.2370 Vim9: command fails in catch block + 3643 8.2.2371 Vim9: crash when using types in :for with unpack + 2210 8.2.2372 confusing error message for wrong :let command + 3262 8.2.2373 Vim9: list assignment only accepts a number index + 1839 8.2.2374 accessing uninitialized memory in test_undo + 1971 8.2.2375 test for RGB color skipped in the terminal + 2628 8.2.2376 Vim9: crash when dividing by zero in compiled code + 3491 8.2.2377 Vim9: crash when using a range after another expression + 4405 8.2.2378 Vim9: no error message for dividing by zero + 2159 8.2.2379 do spell suggestions twice if 'spellsuggest' contains number + 2232 8.2.2380 Vim9: occasional crash when using try/catch and a timer + 9598 8.2.2381 Vim9: divide by zero does not abort expression execution + 2220 8.2.2382 build failure + 1666 8.2.2383 focus escape sequences are not named + 2465 8.2.2384 turtle filetype not recognized + 4333 8.2.2385 "gj" and "gk" do not work correctly when inside a fold + 3371 8.2.2386 Vim9: crash when using ":silent! put" + 8866 8.2.2387 runtime type check does not mention argument index + 6013 8.2.2388 no easy way to get the maximum or mininum number value + 3879 8.2.2389 test failure on a few systems + 4180 8.2.2390 Vim9: using positive offset is unexpected + 7859 8.2.2391 memory leak when creating a global function with closure + 3162 8.2.2392 fennel filetype not recognized + 2011 8.2.2393 Vim9: error message when script line starts with "[{" + 3168 8.2.2394 Vim9: min() and max() return type is "any" + 2418 8.2.2395 Vim9: error for wrong type may report wrong line number + 4732 8.2.2396 Vim9: no white space allowed before "->" + 2753 8.2.2397 Vim9: "%%" not seen as alternate file name for ":bdel" + 1751 8.2.2398 method test fails + 1731 8.2.2399 fold test fails in wide terminal + 42070 8.2.2400 Vim9: compiled functions are not profiled + 10340 8.2.2401 build fails without +profiling feature + 6014 8.2.2402 some filetypes not detected + 15523 8.2.2403 Vim9: profiling if/elseif/endif not correct + 18331 8.2.2404 Vim9: profiling try/catch not correct + 2458 8.2.2405 Vim9: no need to allow white space before "(" for :def + 1799 8.2.2406 Vim9: profiled :def function leaks memory + 2268 8.2.2407 old jumplist code is never used + 2530 8.2.2408 MinGW: "--preprocessor" flag no longer supported + 9346 8.2.2409 Vim9: profiling only works for one function + 1660 8.2.2410 build failure without the +profiling feature + 1867 8.2.2411 profile test fails on MS-Windows + 1792 8.2.2412 not all fields in "cstack" are initialized + 2823 8.2.2413 crash when using :all while using a cmdline window + 1899 8.2.2414 using freed memory when closing the cmdline window + 11004 8.2.2415 no way to check for the cmdwin feature + 2405 8.2.2416 may get stuck in command line window state + 1713 8.2.2417 condition stack values may be used when not set + 1699 8.2.2418 color not changed if ModeMsg highlight is set in InsertEnter + 2061 8.2.2419 autocmd test was failing on MS-Windows with GUI + 6333 8.2.2420 too many problems with using all autocommand events + 5632 8.2.2421 double free when using autocommand with "argdel" + 3025 8.2.2422 crash when deleting with line number out of range + 1583 8.2.2423 missing error message + 4530 8.2.2424 some tests are known to cause an error with ASAN + 1908 8.2.2425 cursor on invalid line with range and :substitute + 5772 8.2.2426 allowing 'completefunc' to switch windows causes trouble + 5114 8.2.2427 can still switch windows for 'completefunc' + 4505 8.2.2428 FocusGained does not work when 'ttymouse' is empty + 5606 8.2.2429 :goto does not work correctly with text properties + 3053 8.2.2430 :vimgrep expands wildcards twice + 3547 8.2.2431 warning for -fno-strength-reduce with Clang 11 + 2118 8.2.2432 libvterm tests are executed even when libtool doesn't work + 2466 8.2.2433 opening cmdline window gives error in BufLeave autocommand + 5804 8.2.2434 Vim9: no error when compiling str2nr() with a number diff -Nru vim-8.2.1913/debian/copyright vim-8.2.2434/debian/copyright --- vim-8.2.1913/debian/copyright 2020-10-28 09:19:50.000000000 +0000 +++ vim-8.2.2434/debian/copyright 2021-01-31 09:42:29.000000000 +0000 @@ -3,7 +3,7 @@ Source: https://github.com/vim/vim Files: * -Copyright: 2001-2020 Bram Moolenaar +Copyright: 2001-2021 Bram Moolenaar 2006 Benji Fisher 1999-2016 Charles E. Campbell, Jr. 2003 Fred Barnes @@ -35,6 +35,7 @@ Files: runtime/syntax/cmake.vim runtime/syntax/elm.vim + runtime/syntax/proto.vim runtime/syntax/tpp.vim runtime/indent/cmake.vim runtime/indent/elm.vim @@ -43,15 +44,14 @@ Dimitri Merejkowsky Gerfried Fuchs Joseph Hager + 2008 Google Inc. License: BSD-3-clause Files: runtime/ftplugin/wast.vim runtime/indent/wast.vim runtime/syntax/json.vim - runtime/syntax/proto.vim runtime/syntax/wast.vim Copyright: 2013, Jeroen Ruigrok van der Werven, Eli Parra - 2008 Google Inc. 2016 rhysd License: Expat diff -Nru vim-8.2.1913/debian/patches/debian/Add-recognition-of-more-LaTeX-commands-for-tex-filetype-d.patch vim-8.2.2434/debian/patches/debian/Add-recognition-of-more-LaTeX-commands-for-tex-filetype-d.patch --- vim-8.2.1913/debian/patches/debian/Add-recognition-of-more-LaTeX-commands-for-tex-filetype-d.patch 2020-10-28 09:19:50.000000000 +0000 +++ vim-8.2.2434/debian/patches/debian/Add-recognition-of-more-LaTeX-commands-for-tex-filetype-d.patch 2021-01-31 09:42:29.000000000 +0000 @@ -13,10 +13,10 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim -index 2c3179e..bfaa2dc 100644 +index 1ac74b5..4bb8917 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim -@@ -665,7 +665,7 @@ func dist#ft#FTtex() +@@ -684,7 +684,7 @@ func dist#ft#FTtex() call cursor(1,1) let firstNC = search('^\s*[^[:space:]%]', 'c', 1000) if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword. diff -Nru vim-8.2.1913/debian/patches/debian/Detect-the-rst-filetype-using-the-contents-of-the-file.patch vim-8.2.2434/debian/patches/debian/Detect-the-rst-filetype-using-the-contents-of-the-file.patch --- vim-8.2.1913/debian/patches/debian/Detect-the-rst-filetype-using-the-contents-of-the-file.patch 2020-10-28 09:19:50.000000000 +0000 +++ vim-8.2.2434/debian/patches/debian/Detect-the-rst-filetype-using-the-contents-of-the-file.patch 2021-01-31 09:42:29.000000000 +0000 @@ -8,10 +8,10 @@ 1 file changed, 8 insertions(+) diff --git a/runtime/scripts.vim b/runtime/scripts.vim -index 9c2787a..a707498 100644 +index 9217b44..37e05d5 100644 --- a/runtime/scripts.vim +++ b/runtime/scripts.vim -@@ -363,6 +363,14 @@ else +@@ -367,6 +367,14 @@ else elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme' set ft=scheme diff -Nru vim-8.2.1913/debian/patches/debian/Document-Debian-s-decision-to-disable-modelines-by-defaul.patch vim-8.2.2434/debian/patches/debian/Document-Debian-s-decision-to-disable-modelines-by-defaul.patch --- vim-8.2.1913/debian/patches/debian/Document-Debian-s-decision-to-disable-modelines-by-defaul.patch 2020-10-28 09:19:50.000000000 +0000 +++ vim-8.2.2434/debian/patches/debian/Document-Debian-s-decision-to-disable-modelines-by-defaul.patch 2021-01-31 09:42:29.000000000 +0000 @@ -15,10 +15,10 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt -index 239ecb2..e5c5e60 100644 +index 2963193..38c5998 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt -@@ -5151,7 +5151,7 @@ A jump table for the options with a short description can be found at |Q_op|. +@@ -5155,7 +5155,7 @@ A jump table for the options with a short description can be found at |Q_op|. *'modeline'* *'ml'* *'nomodeline'* *'noml'* 'modeline' 'ml' boolean (Vim default: on (off for root), diff -Nru vim-8.2.1913/debian/patches/debian/Support-sourcing-a-vimrc.tiny-when-Vim-is-invoked-as-vi.patch vim-8.2.2434/debian/patches/debian/Support-sourcing-a-vimrc.tiny-when-Vim-is-invoked-as-vi.patch --- vim-8.2.1913/debian/patches/debian/Support-sourcing-a-vimrc.tiny-when-Vim-is-invoked-as-vi.patch 2020-10-28 09:19:50.000000000 +0000 +++ vim-8.2.2434/debian/patches/debian/Support-sourcing-a-vimrc.tiny-when-Vim-is-invoked-as-vi.patch 2021-01-31 09:42:29.000000000 +0000 @@ -17,10 +17,10 @@ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c -index 53b8719..d869877 100644 +index ef53b33..6e67e72 100644 --- a/src/main.c +++ b/src/main.c -@@ -1865,6 +1865,10 @@ parse_command_name(mparm_T *parmp) +@@ -1868,6 +1868,10 @@ parse_command_name(mparm_T *parmp) } else if (STRNICMP(initstr, "vim", 3) == 0) initstr += 3; @@ -31,7 +31,7 @@ // Catch "[r][g]vimdiff" and "[r][g]viewdiff". if (STRICMP(initstr, "diff") == 0) -@@ -3120,7 +3124,12 @@ source_startup_scripts(mparm_T *parmp) +@@ -3130,7 +3134,12 @@ source_startup_scripts(mparm_T *parmp) * Get system wide defaults, if the file name is defined. */ #ifdef SYS_VIMRC_FILE @@ -45,7 +45,7 @@ #endif #ifdef MACOS_X (void)do_source((char_u *)"$VIMRUNTIME/macmap.vim", FALSE, -@@ -3159,6 +3168,9 @@ source_startup_scripts(mparm_T *parmp) +@@ -3169,6 +3178,9 @@ source_startup_scripts(mparm_T *parmp) #ifdef USR_EXRC_FILE2 && do_source((char_u *)USR_EXRC_FILE2, FALSE, DOSO_NONE, NULL) == FAIL @@ -56,10 +56,10 @@ && !has_dash_c_arg) { diff --git a/src/os_unix.h b/src/os_unix.h -index 9b7337a..dbb3d4c 100644 +index 83fe66d..8880fec 100644 --- a/src/os_unix.h +++ b/src/os_unix.h -@@ -217,6 +217,9 @@ typedef struct dsc$descriptor DESC; +@@ -219,6 +219,9 @@ typedef struct dsc$descriptor DESC; /* * Unix system-dependent file names */ @@ -70,10 +70,10 @@ # define SYS_VIMRC_FILE "$VIM/vimrc" #endif diff --git a/src/structs.h b/src/structs.h -index 007aa9d..95e22e8 100644 +index d6bf667..b978559 100644 --- a/src/structs.h +++ b/src/structs.h -@@ -4081,6 +4081,9 @@ typedef struct +@@ -4118,6 +4118,9 @@ typedef struct #ifdef FEAT_DIFF int diff_mode; // start with 'diff' set #endif diff -Nru vim-8.2.1913/debian/patches/riscv64-test-timeout.patch vim-8.2.2434/debian/patches/riscv64-test-timeout.patch --- vim-8.2.1913/debian/patches/riscv64-test-timeout.patch 2020-05-20 23:08:14.000000000 +0000 +++ vim-8.2.2434/debian/patches/riscv64-test-timeout.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -Index: vim-8.2.0716-3ubuntu1/src/testdir/test_messages.vim -=================================================================== ---- vim-8.2.0716-3ubuntu1.orig/src/testdir/test_messages.vim -+++ vim-8.2.0716-3ubuntu1/src/testdir/test_messages.vim -@@ -109,7 +109,7 @@ - - let rows = 10 - let buf = term_start([GetVimProg(), '--clean', '-S', testfile], {'term_rows': rows}) -- call TermWait(buf, 100) -+ call TermWait(buf, 400) - call assert_equal('run', job_status(term_getjob(buf))) - - call term_sendkeys(buf, "i") diff -Nru vim-8.2.1913/debian/patches/series vim-8.2.2434/debian/patches/series --- vim-8.2.1913/debian/patches/series 2020-11-18 19:54:07.000000000 +0000 +++ vim-8.2.2434/debian/patches/series 2021-02-15 12:29:39.000000000 +0000 @@ -1,4 +1,3 @@ -ubuntu-series-support.patch debian/Support-sourcing-a-vimrc.tiny-when-Vim-is-invoked-as-vi.patch debian/Detect-the-rst-filetype-using-the-contents-of-the-file.patch debian/Add-recognition-of-more-LaTeX-commands-for-tex-filetype-d.patch @@ -6,5 +5,4 @@ ubuntu-grub-syntax.patch update-upstart-syntax.patch ubuntu-mouse-off.patch -riscv64-test-timeout.patch increase_timeout.diff diff -Nru vim-8.2.1913/debian/patches/ubuntu-series-support.patch vim-8.2.2434/debian/patches/ubuntu-series-support.patch --- vim-8.2.1913/debian/patches/ubuntu-series-support.patch 2020-11-09 20:39:26.000000000 +0000 +++ vim-8.2.2434/debian/patches/ubuntu-series-support.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -Index: vim-8.2.1913-1ubuntu1/runtime/syntax/debsources.vim -=================================================================== ---- vim-8.2.1913-1ubuntu1.orig/runtime/syntax/debsources.vim -+++ vim-8.2.1913-1ubuntu1/runtime/syntax/debsources.vim -@@ -26,7 +26,7 @@ let s:supported = [ - \ 'wheezy', 'jessie', 'stretch', 'buster', 'bullseye', 'bookworm', - \ 'sid', 'rc-buggy', - \ -- \ 'trusty', 'xenial', 'bionic', 'eoan', 'focal', 'groovy', 'devel' -+ \ 'trusty', 'xenial', 'bionic', 'focal', 'groovy', 'hirsute', 'devel' - \ ] - let s:unsupported = [ - \ 'buzz', 'rex', 'bo', 'hamm', 'slink', 'potato', -@@ -36,7 +36,7 @@ let s:unsupported = [ - \ 'gutsy', 'hardy', 'intrepid', 'jaunty', 'karmic', 'lucid', - \ 'maverick', 'natty', 'oneiric', 'precise', 'quantal', 'raring', 'saucy', - \ 'utopic', 'vivid', 'wily', 'yakkety', 'zesty', 'artful', 'cosmic', -- \ 'disco' -+ \ 'disco', 'eoan' - \ ] - let &cpo=s:cpo - -Index: vim-8.2.1913-1ubuntu1/runtime/syntax/debchangelog.vim -=================================================================== ---- vim-8.2.1913-1ubuntu1.orig/runtime/syntax/debchangelog.vim -+++ vim-8.2.1913-1ubuntu1/runtime/syntax/debchangelog.vim -@@ -24,7 +24,7 @@ let s:supported = [ - \ 'wheezy', 'jessie', 'stretch', 'buster', 'bullseye', 'bookworm', - \ 'sid', 'rc-buggy', - \ -- \ 'trusty', 'xenial', 'bionic', 'eoan', 'focal', 'groovy', 'devel' -+ \ 'trusty', 'xenial', 'bionic', 'focal', 'groovy', 'hirsute', 'devel' - \ ] - let s:unsupported = [ - \ 'frozen', 'buzz', 'rex', 'bo', 'hamm', 'slink', 'potato', -@@ -34,7 +34,7 @@ let s:unsupported = [ - \ 'gutsy', 'hardy', 'intrepid', 'jaunty', 'karmic', 'lucid', - \ 'maverick', 'natty', 'oneiric', 'precise', 'quantal', 'raring', 'saucy', - \ 'utopic', 'vivid', 'wily', 'yakkety', 'zesty', 'artful', 'cosmic', -- \ 'disco' -+ \ 'disco', 'eoan' - \ ] - let &cpo=s:cpo - diff -Nru vim-8.2.1913/debian/rules vim-8.2.2434/debian/rules --- vim-8.2.1913/debian/rules 2020-10-28 09:19:49.000000000 +0000 +++ vim-8.2.2434/debian/rules 2021-01-31 09:42:29.000000000 +0000 @@ -229,8 +229,15 @@ test-vim-%: VARIANT=vim-$* test-vim-%: -# Ensure $TERM is set to a sane value for testing - [ $(MAKETEST) != "yes" ] || env LANG=C.UTF-8 TERM=xterm $(MAKE) -j1 -C src/$(VARIANT) test + : +ifeq (yes,$(MAKETEST)) +# Sanitize LC_* env so they don't leak through to child processes and cause problems in build chroots (e.g., missing locales) +# and set sane values for TERM/LC_ALL/LANG + for e in ADDRESS COLLATE CTYPE IDENTIFICATION MEASUREMENT MESSAGES MONETARY NAME NUMERIC PAPER TELEPHONE TIME; do \ + unset LC_$${e}; \ + done; \ + env TERM=xterm LC_ALL=C.UTF-8 LANG=C.UTF-8 $(MAKE) -j1 -C src/$(VARIANT) test +endif override_dh_auto_install-arch: diff -Nru vim-8.2.1913/Filelist vim-8.2.2434/Filelist --- vim-8.2.1913/Filelist 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/Filelist 2021-01-30 22:05:11.000000000 +0000 @@ -3,20 +3,23 @@ # source files for all source archives SRC_ALL = \ - .gitignore \ + .cirrus.yml \ + .coveralls.yml \ .gitattributes \ + .github/CODEOWNERS \ + .github/workflows/ci.yml \ + .github/workflows/codeql-analysis.yml \ + .gitignore \ .hgignore \ .lgtm.yml \ .travis.yml \ - .cirrus.yml \ - .github/workflows/ci-windows.yaml \ - .github/workflows/codeql-analysis.yml \ - .github/CODEOWNERS \ appveyor.yml \ ci/appveyor.bat \ + ci/build-snd-dummy.sh \ + ci/config.mk*.sed \ ci/if_ver*.vim \ ci/load-snd-dummy.sh \ - ci/config.mk*.sed \ + ci/setup-xvfb.sh \ src/Make_all.mak \ src/README.md \ src/alloc.h \ diff -Nru vim-8.2.1913/.github/CODEOWNERS vim-8.2.2434/.github/CODEOWNERS --- vim-8.2.1913/.github/CODEOWNERS 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/.github/CODEOWNERS 2021-01-30 22:05:11.000000000 +0000 @@ -19,6 +19,7 @@ runtime/autoload/rubycomplete.vim @segfault @dkearns runtime/autoload/tar.vim @cecamp runtime/autoload/vimball.vim @cecamp +runtime/autoload/xmlformat.vim @chrisbra runtime/autoload/zip.vim @cecamp runtime/compiler/checkstyle.vim @dkearns runtime/compiler/cucumber.vim @tpope @@ -30,6 +31,7 @@ runtime/compiler/dartdoc.vim @dkearns runtime/compiler/dartfmt.vim @dkearns runtime/compiler/eruby.vim @dkearns +runtime/compiler/fbc.vim @dkearns runtime/compiler/gawk.vim @dkearns runtime/compiler/gjs.vim @dkearns runtime/compiler/haml.vim @tpope @@ -57,37 +59,49 @@ runtime/compiler/typedoc.vim @dkearns runtime/compiler/xmllint.vim @dkearns runtime/compiler/xo.vim @dkearns +runtime/compiler/zsh.vim @dkearns runtime/doc/pi_getscript.txt @cecamp runtime/doc/pi_logipat.txt @cecamp runtime/doc/pi_netrw.txt @cecamp runtime/doc/pi_tar.txt @cecamp runtime/doc/pi_vimball.txt @cecamp runtime/doc/pi_zip.txt @cecamp +runtime/ftplugin/awk.vim @dkearns +runtime/ftplugin/basic.vim @dkearns runtime/ftplugin/bst.vim @tpope +runtime/ftplugin/cfg.vim @chrisbra runtime/ftplugin/css.vim @dkearns runtime/ftplugin/cucumber.vim @tpope runtime/ftplugin/eiffel.vim @dkearns runtime/ftplugin/eruby.vim @tpope @dkearns +runtime/ftplugin/freebasic.vim @dkearns runtime/ftplugin/git.vim @tpope runtime/ftplugin/gitcommit.vim @tpope runtime/ftplugin/gitconfig.vim @tpope runtime/ftplugin/gitrebase.vim @tpope runtime/ftplugin/gitsendemail.vim @tpope +runtime/ftplugin/gprof.vim @dpelle runtime/ftplugin/haml.vim @tpope runtime/ftplugin/hgcommit.vim @k-takata runtime/ftplugin/javascript.vim @dkearns runtime/ftplugin/javascriptreact.vim @dkearns +runtime/ftplugin/kconfig.vim @chrisbra runtime/ftplugin/liquid.vim @tpope runtime/ftplugin/markdown.vim @tpope runtime/ftplugin/matlab.vim @cecamp +runtime/ftplugin/nroff.vim @a-vrma runtime/ftplugin/nsis.vim @k-takata runtime/ftplugin/pdf.vim @tpope runtime/ftplugin/ruby.vim @tpope @dkearns runtime/ftplugin/sass.vim @tpope runtime/ftplugin/scss.vim @tpope +runtime/ftplugin/spec.vim @ignatenkobrain +runtime/ftplugin/tidy.vim @dkearns runtime/ftplugin/tmux.vim @ericpruitt runtime/ftplugin/typescript.vim @dkearns runtime/ftplugin/typescriptreact.vim @dkearns +runtime/ftplugin/xml.vim @chrisbra +runtime/ftplugin/zsh.vim @chrisbra runtime/indent/bst.vim @tpope runtime/indent/cucumber.vim @tpope runtime/indent/dosbatch.vim @k-takata @@ -99,18 +113,36 @@ runtime/indent/ruby.vim @AndrewRadev @dkearns runtime/indent/sass.vim @tpope runtime/indent/scss.vim @tpope +runtime/indent/sh.vim @chrisbra runtime/indent/teraterm.vim @k-takata +runtime/indent/xml.vim @chrisbra +runtime/indent/zsh.vim @chrisbra +runtime/keymap/tamil_tscii.vim @yegappan +runtime/pack/dist/opt/cfilter/plugin/cfilter.vim @yegappan +runtime/pack/dist/opt/matchit/ @chrisbra runtime/plugin/getscriptPlugin.vim @cecamp runtime/plugin/logiPat.vim @cecamp runtime/plugin/netrwPlugin.vim @cecamp runtime/plugin/tarPlugin.vim @cecamp runtime/plugin/vimballPlugin.vim @cecamp runtime/plugin/zipPlugin.vim @cecamp +runtime/syntax/aidl.vim @dpelle runtime/syntax/amiga.vim @cecamp +runtime/syntax/asm.vim @dkearns +runtime/syntax/asmh8300.vim @dkearns +runtime/syntax/awk.vim @dkearns +runtime/syntax/basic.vim @dkearns runtime/syntax/bst.vim @tpope +runtime/syntax/cabal.vim @coot +runtime/syntax/cabalconfig.vim @coot +runtime/syntax/cabalproject.vim @coot +runtime/syntax/cs.vim @nickspoons runtime/syntax/csh.vim @cecamp runtime/syntax/cucumber.vim @tpope +runtime/syntax/datascript.vim @dpelle runtime/syntax/dcl.vim @cecamp +runtime/syntax/doxygen.vim @frogonwheels +runtime/syntax/dtd.vim @chrisbra runtime/syntax/elmfilt.vim @cecamp runtime/syntax/eruby.vim @tpope @dkearns runtime/syntax/exports.vim @cecamp @@ -118,8 +150,11 @@ runtime/syntax/gitcommit.vim @tpope runtime/syntax/gitconfig.vim @tpope runtime/syntax/gitrebase.vim @tpope +runtime/syntax/gprof.vim @dpelle runtime/syntax/haml.vim @tpope +runtime/syntax/haskell.vim @coot runtime/syntax/hgcommit.vim @k-takata +runtime/syntax/kconfig.vim @chrisbra runtime/syntax/lex.vim @cecamp runtime/syntax/liquid.vim @tpope runtime/syntax/lisp.vim @cecamp @@ -134,12 +169,17 @@ runtime/syntax/pdf.vim @tpope runtime/syntax/php.vim @TysonAndre runtime/syntax/privoxy.vim @dkearns +runtime/syntax/prolog.vim @XVilka +runtime/syntax/rc.vim @chrisbra runtime/syntax/rpcgen.vim @cecamp runtime/syntax/ruby.vim @dkearns runtime/syntax/sass.vim @tpope runtime/syntax/scss.vim @tpope runtime/syntax/sh.vim @cecamp runtime/syntax/sm.vim @cecamp +runtime/syntax/spec.vim @ignatenkobrain +runtime/syntax/sqloracle.vim @chrisbra +runtime/syntax/sshdconfig.vim @Jakuje runtime/syntax/tags.vim @cecamp runtime/syntax/teraterm.vim @k-takata runtime/syntax/tex.vim @cecamp @@ -149,6 +189,15 @@ runtime/syntax/wget.vim @dkearns runtime/syntax/xbl.vim @dkearns runtime/syntax/xmath.vim @cecamp +runtime/syntax/xml.vim @chrisbra runtime/syntax/xslt.vim @Boobies runtime/syntax/xxd.vim @cecamp runtime/syntax/yacc.vim @cecamp +runtime/syntax/zsh.vim @chrisbra +runtime/tutor/tutor.eo @dpelle +runtime/tutor/tutor.eo.utf-8 @dpelle +runtime/tutor/tutor.fr @dpelle +runtime/tutor/tutor.fr.utf-8 @dpelle +src/po/de.po @chrisbra +src/po/eo.po @dpelle +src/po/fr.po @dpelle diff -Nru vim-8.2.1913/.github/workflows/ci-windows.yaml vim-8.2.2434/.github/workflows/ci-windows.yaml --- vim-8.2.1913/.github/workflows/ci-windows.yaml 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/.github/workflows/ci-windows.yaml 1970-01-01 00:00:00.000000000 +0000 @@ -1,229 +0,0 @@ -name: GitHub CI - -on: - push: - branches: - - '**' - pull_request: - -env: - VCVARSALL: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat - - # Interfaces - # Lua - LUA_VER: 54 - LUA_VER_DOT: '5.4' - LUA_RELEASE: 5.4.0 - LUA32_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win32_dllw6_lib.zip - LUA64_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win64_dllw6_lib.zip - LUA_DIR: D:\Lua - # Python 2 - PYTHON_VER: 27 - PYTHON_VER_DOT: '2.7' - # Python 3 - PYTHON3_VER: 38 - PYTHON3_VER_DOT: '3.8' - - # Other dependencies - # winpty - WINPTY_URL: https://github.com/rprichard/winpty/releases/download/0.4.3/winpty-0.4.3-msvc2015.zip - - # Escape sequences - COL_RED: "\x1b[31m" - COL_GREEN: "\x1b[32m" - COL_YELLOW: "\x1b[33m" - COL_RESET: "\x1b[m" - -jobs: - build: - runs-on: windows-latest - - strategy: - fail-fast: false - matrix: - toolchain: [msvc, mingw] - arch: [x64, x86] - features: [HUGE, NORMAL] - include: - - arch: x64 - vcarch: amd64 - warch: x64 - bits: 64 - msystem: MINGW64 - cygreg: registry - pyreg: "" - - arch: x86 - vcarch: x86 - warch: ia32 - bits: 32 - msystem: MINGW32 - cygreg: registry32 - pyreg: "-32" - exclude: - - toolchain: msvc - arch: x64 - features: NORMAL - - toolchain: mingw - arch: x86 - features: NORMAL - - steps: - - name: Initalize - id: init - shell: bash - run: | - git config --global core.autocrlf input - python_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON_VER_DOT}/InstallPath/@") - python3_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON3_VER_DOT}${{ matrix.pyreg }}/InstallPath/@") - echo "PYTHON_DIR=$python_dir" >> $GITHUB_ENV - echo "PYTHON3_DIR=$python3_dir" >> $GITHUB_ENV - - - uses: msys2/setup-msys2@v2 - if: matrix.toolchain == 'mingw' - with: - msystem: ${{ matrix.msystem }} - release: false - - - uses: actions/checkout@v2 - - - name: Create a list of download URLs - shell: cmd - run: | - type NUL > urls.txt - echo %LUA_RELEASE%>> urls.txt - echo %WINPTY_URL%>> urls.txt - - - name: Cache downloaded files - uses: actions/cache@v2 - with: - path: downloads - key: ${{ runner.os }}-${{ matrix.bits }}-${{ hashFiles('urls.txt') }} - - - name: Download dependencies - shell: cmd - run: | - path C:\Program Files\7-Zip;%path% - if not exist downloads mkdir downloads - - echo %COL_GREEN%Download Lua%COL_RESET% - call :downloadfile %LUA${{ matrix.bits }}_URL% downloads\lua.zip - 7z x downloads\lua.zip -o%LUA_DIR% > nul || exit 1 - - echo %COL_GREEN%Download winpty%COL_RESET% - call :downloadfile %WINPTY_URL% downloads\winpty.zip - 7z x -y downloads\winpty.zip -oD:\winpty > nul || exit 1 - copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty.dll src\winpty${{ matrix.bits }}.dll - copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty-agent.exe src\ - - goto :eof - - :downloadfile - :: call :downloadfile - if not exist %2 ( - curl -f -L %1 -o %2 - ) - if ERRORLEVEL 1 ( - rem Retry once. - curl -f -L %1 -o %2 || exit 1 - ) - goto :eof - - - name: Copy src directory to src2 - shell: cmd - run: | - xcopy src src2\ /E > nul - - - name: Build (MSVC) - if: matrix.toolchain == 'msvc' - shell: cmd - run: | - call "%VCVARSALL%" ${{ matrix.vcarch }} - cd src - :: Filter out the progress bar from the build log - sed -e "s/@<<$/@<< | sed -e 's#.*\\\\r.*##'/" Make_mvc.mak > Make_mvc2.mak - if "${{ matrix.features }}"=="HUGE" ( - nmake -nologo -f Make_mvc2.mak ^ - FEATURES=${{ matrix.features }} ^ - GUI=yes IME=yes ICONV=yes VIMDLL=yes ^ - DYNAMIC_LUA=yes LUA=%LUA_DIR% ^ - DYNAMIC_PYTHON=yes PYTHON=%PYTHON_DIR% ^ - DYNAMIC_PYTHON3=yes PYTHON3=%PYTHON3_DIR% - ) else ( - nmake -nologo -f Make_mvc2.mak ^ - FEATURES=${{ matrix.features }} ^ - GUI=yes IME=yes ICONV=yes VIMDLL=yes - ) - if not exist vim${{ matrix.bits }}.dll ( - echo %COL_RED%Build failure.%COL_RESET% - exit 1 - ) - - - name: Build (MinGW) - if: matrix.toolchain == 'mingw' - shell: msys2 {0} - run: | - cd src - if [ "${{ matrix.features }}" = "HUGE" ]; then - mingw32-make -f Make_ming.mak -j2 \ - FEATURES=${{ matrix.features }} \ - GUI=yes IME=yes ICONV=yes VIMDLL=yes \ - DYNAMIC_LUA=yes LUA=${LUA_DIR} \ - DYNAMIC_PYTHON=yes PYTHON=${PYTHON_DIR} \ - DYNAMIC_PYTHON3=yes PYTHON3=${PYTHON3_DIR} \ - STATIC_STDCPLUS=yes - else - mingw32-make -f Make_ming.mak -j2 \ - FEATURES=${{ matrix.features }} \ - GUI=yes IME=yes ICONV=yes VIMDLL=yes \ - STATIC_STDCPLUS=yes - fi - -# - name: Prepare Artifact -# shell: cmd -# run: | -# mkdir artifacts -# copy src\*vim.exe artifacts -# copy src\vim*.dll artifacts -# -# - name: Upload Artifact -# uses: actions/upload-artifact@v1 -# with: -# name: vim${{ matrix.bits }}-${{ matrix.toolchain }} -# path: ./artifacts - - - name: Test - shell: cmd - timeout-minutes: 20 - run: | - PATH %LUA_DIR%;C:\msys64\${{ matrix.msystem }}\bin;%PATH%;%PYTHON3_DIR% - call "%VCVARSALL%" ${{ matrix.vcarch }} - cd src - echo. - echo %COL_GREEN%vim version:%COL_RESET% - .\vim --version || exit 1 - - echo %COL_GREEN%Start testing vim in background.%COL_RESET% - start cmd /c "cd ..\src2\testdir & nmake -nologo -f Make_dos.mak VIMPROG=..\..\src\vim > nul & echo done>done.txt" - - echo %COL_GREEN%Test gvim:%COL_RESET% - cd testdir - nmake -nologo -f Make_dos.mak VIMPROG=..\gvim || exit 1 - cd .. - - echo %COL_GREEN%Wait for vim tests to finish.%COL_RESET% - cd ..\src2\testdir - :: Wait about 10 minutes. - for /L %%i in (1,1,60) do ( - if exist done.txt goto exitloop - timeout 10 - ) - set timeout=1 - :exitloop - - echo %COL_GREEN%Test results of vim:%COL_RESET% - if exist messages type messages - nmake -nologo -f Make_dos.mak report VIMPROG=..\..\src\vim || exit 1 - if "%timeout%"=="1" ( - echo %COL_RED%Timed out.%COL_RESET% - exit 1 - ) diff -Nru vim-8.2.1913/.github/workflows/ci.yml vim-8.2.2434/.github/workflows/ci.yml --- vim-8.2.1913/.github/workflows/ci.yml 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/.github/workflows/ci.yml 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,526 @@ +name: GitHub CI + +on: + push: + branches: ['**'] + pull_request: + +jobs: + linux: + runs-on: ubuntu-latest + + env: + CC: ${{ matrix.compiler }} + TEST: test + SRCDIR: ./src + LEAK_CFLAGS: -DEXITFREE + LOG_DIR: ${{ github.workspace }}/logs + TERM: xterm + DISPLAY: ':99' + DEBIAN_FRONTEND: noninteractive + + strategy: + fail-fast: false + matrix: + features: [tiny, small, normal, huge] + compiler: [clang, gcc] + extra: [none] + include: + - features: tiny + compiler: clang + extra: nogui + - features: tiny + compiler: gcc + extra: nogui + - features: normal + shadow: ./src/shadow + - features: huge + coverage: true + - features: huge + compiler: gcc + coverage: true + extra: testgui + - features: huge + compiler: clang + extra: asan + - features: huge + compiler: gcc + coverage: true + extra: unittests + - features: normal + compiler: gcc + extra: vimtags + + steps: + - uses: actions/checkout@v2 + + - name: Install packages + run: | + sudo apt-get install -y \ + autoconf \ + lcov \ + gettext \ + libcanberra-dev \ + libperl-dev \ + python-dev \ + python3-dev \ + liblua5.3-dev \ + lua5.3 \ + ruby-dev \ + tcl-dev \ + cscope \ + libgtk2.0-dev \ + desktop-file-utils \ + libtool-bin + + - name: Install clang-11 + if: matrix.compiler == 'clang' + run: | + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + . /etc/lsb-release + sudo add-apt-repository -y "deb http://apt.llvm.org/${DISTRIB_CODENAME}/ llvm-toolchain-${DISTRIB_CODENAME}-11 main" + sudo apt-get install -y clang-11 + sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-11 100 + sudo update-alternatives --set clang /usr/bin/clang-11 + sudo update-alternatives --install /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-11 100 + + - name: Set up environment + run: | + mkdir -p "${LOG_DIR}" + mkdir -p "${HOME}/bin" + echo "${HOME}/bin" >> $GITHUB_PATH + ( + echo "LINUX_VERSION=$(uname -r)" + echo "NPROC=$(getconf _NPROCESSORS_ONLN)" + echo "SND_DUMMY_DIR=${HOME}/snd-dummy" + echo "TMPDIR=${{ runner.temp }}" + + case "${{ matrix.features }}" in + tiny|small) + echo "TEST=testtiny" + if ${{ contains(matrix.extra, 'nogui') }}; then + echo "CONFOPT=--disable-gui" + fi + ;; + normal) + ;; + huge) + echo "TEST=scripttests test_libvterm" + echo "CONFOPT=--enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-tclinterp" + ;; + esac + + if ${{ matrix.coverage == true }}; then + echo "CFLAGS=--coverage -DUSE_GCOV_FLUSH" + echo "LDFLAGS=--coverage" + fi + if ${{ contains(matrix.extra, 'testgui') }}; then + echo "TEST=-C src testgui" + fi + if ${{ contains(matrix.extra, 'unittests') }}; then + echo "TEST=unittests" + fi + if ${{ contains(matrix.extra, 'asan') }}; then + echo "SANITIZER_CFLAGS=-g -O1 -DABORT_ON_INTERNAL_ERROR -DEXITFREE -fsanitize-recover=all -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer" + echo "ASAN_OPTIONS=print_stacktrace=1 log_path=${LOG_DIR}/asan" + echo "UBSAN_OPTIONS=print_stacktrace=1 log_path=${LOG_DIR}/ubsan" + echo "LSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/src/testdir/lsan-suppress.txt" + fi + if ${{ contains(matrix.extra, 'vimtags') }}; then + echo "TEST=-C runtime/doc vimtags VIMEXE=../../${SRCDIR}/vim" + fi + ) >> $GITHUB_ENV + + - name: Set up system + run: | + if [[ ${CC} = clang ]]; then + # Use llvm-cov instead of gcov when compiler is clang. + ln -fs /usr/bin/llvm-cov ${HOME}/bin/gcov + fi + # Setup lua5.3 manually since its package doesn't provide alternative. + # https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212 + if [[ ${CONFOPT} =~ luainterp ]]; then + sudo update-alternatives --install /usr/bin/lua lua /usr/bin/lua5.3 10 + fi + sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0 + sudo usermod -a -G audio "${USER}" + sudo bash ci/setup-xvfb.sh + + - name: Cache snd-dummy + uses: actions/cache@v2 + with: + path: ${{ env.SND_DUMMY_DIR }} + key: linux-${{ env.LINUX_VERSION }}-snd-dummy + + - name: Set up snd-dummy + run: | + if [[ ! -e ${SND_DUMMY_DIR}/snd-dummy.ko ]]; then + bash ci/build-snd-dummy.sh + fi + cd "${SND_DUMMY_DIR}" + sudo insmod soundcore.ko + sudo insmod snd.ko + sudo insmod snd-pcm.ko + sudo insmod snd-dummy.ko + + - name: Check autoconf + if: contains(matrix.extra, 'unittests') + run: | + make -C src autoconf + + - name: Set up shadow dir + if: matrix.shadow + run: | + make -C src shadow + echo "SRCDIR=${{ matrix.shadow }}" >> $GITHUB_ENV + echo "SHADOWOPT=-C ${{ matrix.shadow }}" >> $GITHUB_ENV + + - name: Configure + run: | + ./configure --with-features=${{ matrix.features }} ${CONFOPT} --enable-fail-if-missing + # Append various warning flags to CFLAGS. + sed -i -f ci/config.mk.sed ${SRCDIR}/auto/config.mk + sed -i -f ci/config.mk.${CC}.sed ${SRCDIR}/auto/config.mk + + - name: Build + if: (!contains(matrix.extra, 'unittests')) + run: | + make ${SHADOWOPT} -j${NPROC} + + - name: Check version + if: (!contains(matrix.extra, 'unittests')) + run: | + "${SRCDIR}"/vim --version + "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-1.vim -c quit + "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-2.vim -c quit + + - name: Test + timeout-minutes: 20 + run: | + do_test() { sg audio "sg $(id -gn) '$*'"; } + do_test make ${SHADOWOPT} ${TEST} + + - name: Coveralls + if: matrix.coverage && success() && github.event_name != 'pull_request' + env: + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_PARALLEL: true + TRAVIS_JOB_ID: ${{ github.run_id }} + run: | + sudo apt-get install -y python3-setuptools python3-wheel + # needed for https support for coveralls building cffi only works with gcc, not with clang + CC=gcc pip3 install --user cpp-coveralls pyopenssl ndg-httpsclient pyasn1 + ~/.local/bin/coveralls -b "${SRCDIR}" -x .xs -e "${SRCDIR}"/if_perl.c -e "${SRCDIR}"/xxd -e "${SRCDIR}"/libvterm --encodings utf-8 + + - name: Codecov + if: matrix.coverage && success() + run: | + cd "${SRCDIR}" + bash <(curl -s https://codecov.io/bash) -F "${{ matrix.features }}-${{ matrix.compiler }}-${{ matrix.extra }}" + + - name: ASan logs + if: contains(matrix.extra, 'asan') && !cancelled() + run: | + for f in $(grep -lR '#[[:digit:]]* *0x[[:digit:]a-fA-F]*' "${LOG_DIR}"); do + asan_symbolize-11 -l "$f" + false # in order to fail a job + done + + coveralls: + runs-on: ubuntu-latest + + needs: linux + if: always() && github.event_name != 'pull_request' + + steps: + - name: Parallel finished + env: + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + run: | + curl -k "https://coveralls.io/webhook?repo_token=${COVERALLS_REPO_TOKEN}" -d "payload[build_num]=${GITHUB_RUN_ID}&payload[status]=done" + + macos: + runs-on: macos-latest + + env: + CC: ${{ matrix.compiler }} + TEST: test + SRCDIR: ./src + LEAK_CFLAGS: -DEXITFREE + TERM: xterm + + strategy: + fail-fast: false + matrix: + features: [tiny, huge] + compiler: [clang, gcc] + + steps: + - uses: actions/checkout@v2 + + - name: Install packages + env: + HOMEBREW_NO_AUTO_UPDATE: 1 + run: | + brew install lua + echo "LUA_PREFIX=/usr/local" >> $GITHUB_ENV + + - name: Set up environment + run: | + ( + echo "NPROC=$(getconf _NPROCESSORS_ONLN)" + case "${{ matrix.features }}" in + tiny) + echo "TEST=testtiny" + echo "CONFOPT=--disable-gui" + ;; + huge) + echo "CONFOPT=--enable-perlinterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-tclinterp" + ;; + esac + ) >> $GITHUB_ENV + + - name: Configure + run: | + ./configure --with-features=${{ matrix.features }} ${CONFOPT} --enable-fail-if-missing + # Append various warning flags to CFLAGS. + # BSD sed needs backup extension specified. + sed -i.bak -f ci/config.mk.sed ${SRCDIR}/auto/config.mk + # On macOS, the entity of gcc is clang. + sed -i.bak -f ci/config.mk.clang.sed ${SRCDIR}/auto/config.mk + + - name: Build + env: + LC_ALL: C + run: | + make -j${NPROC} + + - name: Check version + run: | + "${SRCDIR}"/vim --version + "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-1.vim -c quit + "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-2.vim -c quit + + - name: Test + timeout-minutes: 20 + run: | + make ${TEST} + + windows: + runs-on: windows-latest + + env: + VCVARSALL: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat + # Interfaces + # Lua + LUA_VER: 54 + LUA_VER_DOT: '5.4' + LUA_RELEASE: 5.4.0 + LUA32_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win32_dllw6_lib.zip + LUA64_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win64_dllw6_lib.zip + LUA_DIR: D:\Lua + # Python 2 + PYTHON_VER: 27 + PYTHON_VER_DOT: '2.7' + # Python 3 + PYTHON3_VER: 38 + PYTHON3_VER_DOT: '3.8' + # Other dependencies + # winpty + WINPTY_URL: https://github.com/rprichard/winpty/releases/download/0.4.3/winpty-0.4.3-msvc2015.zip + # Escape sequences + COL_RED: "\x1b[31m" + COL_GREEN: "\x1b[32m" + COL_YELLOW: "\x1b[33m" + COL_RESET: "\x1b[m" + + strategy: + fail-fast: false + matrix: + toolchain: [msvc, mingw] + arch: [x64, x86] + features: [HUGE, NORMAL] + include: + - arch: x64 + vcarch: amd64 + warch: x64 + bits: 64 + msystem: MINGW64 + cygreg: registry + pyreg: "" + - arch: x86 + vcarch: x86 + warch: ia32 + bits: 32 + msystem: MINGW32 + cygreg: registry32 + pyreg: "-32" + exclude: + - toolchain: msvc + arch: x64 + features: NORMAL + - toolchain: mingw + arch: x86 + features: NORMAL + + steps: + - name: Initalize + id: init + shell: bash + run: | + git config --global core.autocrlf input + python_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON_VER_DOT}/InstallPath/@") + python3_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON3_VER_DOT}${{ matrix.pyreg }}/InstallPath/@") + echo "PYTHON_DIR=$python_dir" >> $GITHUB_ENV + echo "PYTHON3_DIR=$python3_dir" >> $GITHUB_ENV + + - uses: msys2/setup-msys2@v2 + if: matrix.toolchain == 'mingw' + with: + msystem: ${{ matrix.msystem }} + release: false + + - uses: actions/checkout@v2 + + - name: Create a list of download URLs + shell: cmd + run: | + type NUL > urls.txt + echo %LUA_RELEASE%>> urls.txt + echo %WINPTY_URL%>> urls.txt + + - name: Cache downloaded files + uses: actions/cache@v2 + with: + path: downloads + key: ${{ runner.os }}-${{ matrix.bits }}-${{ hashFiles('urls.txt') }} + + - name: Download dependencies + shell: cmd + run: | + path C:\Program Files\7-Zip;%path% + if not exist downloads mkdir downloads + + echo %COL_GREEN%Download Lua%COL_RESET% + call :downloadfile %LUA${{ matrix.bits }}_URL% downloads\lua.zip + 7z x downloads\lua.zip -o%LUA_DIR% > nul || exit 1 + + echo %COL_GREEN%Download winpty%COL_RESET% + call :downloadfile %WINPTY_URL% downloads\winpty.zip + 7z x -y downloads\winpty.zip -oD:\winpty > nul || exit 1 + copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty.dll src\winpty${{ matrix.bits }}.dll + copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty-agent.exe src\ + + goto :eof + + :downloadfile + :: call :downloadfile + if not exist %2 ( + curl -f -L %1 -o %2 + ) + if ERRORLEVEL 1 ( + rem Retry once. + curl -f -L %1 -o %2 || exit 1 + ) + goto :eof + + - name: Copy src directory to src2 + shell: cmd + run: | + xcopy src src2\ /E > nul + + - name: Build (MSVC) + if: matrix.toolchain == 'msvc' + shell: cmd + run: | + call "%VCVARSALL%" ${{ matrix.vcarch }} + cd src + :: Filter out the progress bar from the build log + sed -e "s/@<<$/@<< | sed -e 's#.*\\\\r.*##'/" Make_mvc.mak > Make_mvc2.mak + if "${{ matrix.features }}"=="HUGE" ( + nmake -nologo -f Make_mvc2.mak ^ + FEATURES=${{ matrix.features }} ^ + GUI=yes IME=yes ICONV=yes VIMDLL=yes ^ + DYNAMIC_LUA=yes LUA=%LUA_DIR% ^ + DYNAMIC_PYTHON=yes PYTHON=%PYTHON_DIR% ^ + DYNAMIC_PYTHON3=yes PYTHON3=%PYTHON3_DIR% + ) else ( + nmake -nologo -f Make_mvc2.mak ^ + FEATURES=${{ matrix.features }} ^ + GUI=yes IME=yes ICONV=yes VIMDLL=yes + ) + if not exist vim${{ matrix.bits }}.dll ( + echo %COL_RED%Build failure.%COL_RESET% + exit 1 + ) + + - name: Build (MinGW) + if: matrix.toolchain == 'mingw' + shell: msys2 {0} + run: | + cd src + if [ "${{ matrix.features }}" = "HUGE" ]; then + mingw32-make -f Make_ming.mak -j2 \ + FEATURES=${{ matrix.features }} \ + GUI=yes IME=yes ICONV=yes VIMDLL=yes \ + DYNAMIC_LUA=yes LUA=${LUA_DIR} \ + DYNAMIC_PYTHON=yes PYTHON=${PYTHON_DIR} \ + DYNAMIC_PYTHON3=yes PYTHON3=${PYTHON3_DIR} \ + STATIC_STDCPLUS=yes + else + mingw32-make -f Make_ming.mak -j2 \ + FEATURES=${{ matrix.features }} \ + GUI=yes IME=yes ICONV=yes VIMDLL=yes \ + STATIC_STDCPLUS=yes + fi + + #- name: Prepare Artifact + # shell: cmd + # run: | + # mkdir artifacts + # copy src\*vim.exe artifacts + # copy src\vim*.dll artifacts + # + #- name: Upload Artifact + # uses: actions/upload-artifact@v1 + # with: + # name: vim${{ matrix.bits }}-${{ matrix.toolchain }} + # path: ./artifacts + + - name: Test + shell: cmd + timeout-minutes: 20 + run: | + PATH %LUA_DIR%;C:\msys64\${{ matrix.msystem }}\bin;%PATH%;%PYTHON3_DIR% + call "%VCVARSALL%" ${{ matrix.vcarch }} + cd src + echo. + echo %COL_GREEN%vim version:%COL_RESET% + .\vim --version || exit 1 + + echo %COL_GREEN%Start testing vim in background.%COL_RESET% + start cmd /c "cd ..\src2\testdir & nmake -nologo -f Make_dos.mak VIMPROG=..\..\src\vim > nul & echo done>done.txt" + + echo %COL_GREEN%Test gvim:%COL_RESET% + cd testdir + nmake -nologo -f Make_dos.mak VIMPROG=..\gvim || exit 1 + cd .. + + echo %COL_GREEN%Wait for vim tests to finish.%COL_RESET% + cd ..\src2\testdir + :: Wait about 10 minutes. + for /L %%i in (1,1,60) do ( + if exist done.txt goto exitloop + timeout 10 > NUL 2>&1 + if ERRORLEVEL 1 ping -n 11 localhost > NUL + ) + set timeout=1 + :exitloop + + echo %COL_GREEN%Test results of vim:%COL_RESET% + if exist messages type messages + nmake -nologo -f Make_dos.mak report VIMPROG=..\..\src\vim || exit 1 + if "%timeout%"=="1" ( + echo %COL_RED%Timed out.%COL_RESET% + exit 1 + ) diff -Nru vim-8.2.1913/.github/workflows/codeql-analysis.yml vim-8.2.2434/.github/workflows/codeql-analysis.yml --- vim-8.2.1913/.github/workflows/codeql-analysis.yml 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/.github/workflows/codeql-analysis.yml 2021-01-30 22:05:11.000000000 +0000 @@ -31,15 +31,6 @@ steps: - name: Checkout repository uses: actions/checkout@v2 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff -Nru vim-8.2.1913/README.md vim-8.2.2434/README.md --- vim-8.2.1913/README.md 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/README.md 2021-01-30 22:05:11.000000000 +0000 @@ -1,15 +1,8 @@ -![Vim Logo](https://github.com/vim/vim/blob/master/runtime/vimlogo.gif) +[![Vim Logo](https://github.com/vim/vim/raw/master/runtime/vimlogo.gif)](https://www.vim.org) -[![Travis Build Status](https://travis-ci.org/vim/vim.svg?branch=master)](https://travis-ci.org/vim/vim) -[![Appveyor Build status](https://ci.appveyor.com/api/projects/status/o2qht2kjm02sgghk?svg=true)](https://ci.appveyor.com/project/chrisbra/vim) -[![Github Build status](https://github.com/vim/vim/workflows/GitHub%20CI/badge.svg)](https://github.com/vim/vim/actions?query=workflow%3A%22GitHub+CI%22) -[![Cirrus Build Status](https://api.cirrus-ci.com/github/vim/vim.svg)](https://cirrus-ci.com/github/vim/vim) -[![Coverage Status](https://codecov.io/gh/vim/vim/coverage.svg?branch=master)](https://codecov.io/gh/vim/vim?branch=master) -[![Coverity Scan](https://scan.coverity.com/projects/241/badge.svg)](https://scan.coverity.com/projects/vim) -[![Language Grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/vim/vim.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/vim/vim/context:cpp) -[![Debian CI](https://badges.debian.net/badges/debian/testing/vim/version.svg)](https://buildd.debian.org/vim) -[![Packages](https://repology.org/badge/tiny-repos/vim.svg)](https://repology.org/metapackage/vim) -For translations of this README see the end. +[![Github Build status](https://github.com/vim/vim/workflows/GitHub%20CI/badge.svg)](https://github.com/vim/vim/actions?query=workflow%3A%22GitHub+CI%22) [![Travis Build Status](https://travis-ci.com/vim/vim.svg?branch=master)](https://travis-ci.com/github/vim/vim) [![Appveyor Build status](https://ci.appveyor.com/api/projects/status/o2qht2kjm02sgghk?svg=true)](https://ci.appveyor.com/project/chrisbra/vim) [![Cirrus Build Status](https://api.cirrus-ci.com/github/vim/vim.svg)](https://cirrus-ci.com/github/vim/vim) [![Coverage Status](https://codecov.io/gh/vim/vim/coverage.svg?branch=master)](https://codecov.io/gh/vim/vim?branch=master) [![Coverity Scan](https://scan.coverity.com/projects/241/badge.svg)](https://scan.coverity.com/projects/vim) [![Language Grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/vim/vim.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/vim/vim/context:cpp) [![Debian CI](https://badges.debian.net/badges/debian/testing/vim/version.svg)](https://buildd.debian.org/vim) [![Packages](https://repology.org/badge/tiny-repos/vim.svg)](https://repology.org/metapackage/vim) [![Fossies codespell report](https://fossies.org/linux/test/vim-master.tar.gz/codespell.svg)](https://fossies.org/linux/test/vim-master.tar.gz/codespell.html) + +For translations of this README see the end. ## What is Vim? ## diff -Nru vim-8.2.1913/README_VIM9.md vim-8.2.2434/README_VIM9.md --- vim-8.2.1913/README_VIM9.md 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/README_VIM9.md 2021-01-30 22:05:11.000000000 +0000 @@ -159,18 +159,18 @@ make that mistake (after writing JavaScript especially). I think it is possible, if we make local variables shadow commands. That should be OK, if you shadow a command you want to use, just rename the variable. -Using "let" and "const" to declare a variable, like in JavaScript and +Using "var" and "const" to declare a variable, like in JavaScript and TypeScript, can work: ``` vim def MyFunction(arg: number): number - let local = 1 - let todo = arg + var local = 1 + var todo = arg const ADD = 88 while todo > 0 local += ADD - --todo + todo -= 1 endwhile return local enddef @@ -192,7 +192,7 @@ ``` vim vim9script " Vim9 script syntax used here -let local = 'local variable is not exported, script-local' +var local = 'local variable is not exported, script-local' export def MyFunction() " exported function ... @@ -248,10 +248,10 @@ return luaeval('sum') endfunc -def VimNew() - let sum = 0 +def VimNew(): number + var sum = 0 for i in range(1, 2999999) - let sum += i + sum += i endfor return sum enddef @@ -277,7 +277,7 @@ ``` vim def VimNew(): number - let totallen = 0 + var totallen = 0 for i in range(1, 100000) setline(i, ' ' .. getline(i)) totallen += len(getline(i)) diff -Nru vim-8.2.1913/runtime/autoload/ccomplete.vim vim-8.2.2434/runtime/autoload/ccomplete.vim --- vim-8.2.1913/runtime/autoload/ccomplete.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/autoload/ccomplete.vim 2021-01-30 22:05:11.000000000 +0000 @@ -1,13 +1,13 @@ " Vim completion script " Language: C " Maintainer: Bram Moolenaar -" Last Change: 2020 Apr 08 +" Last Change: 2020 Nov 14 let s:cpo_save = &cpo set cpo&vim " This function is used for the 'omnifunc' option. -function! ccomplete#Complete(findstart, base) +func ccomplete#Complete(findstart, base) if a:findstart " Locate the start of the item, including ".", "->" and "[...]". let line = getline('.') @@ -244,7 +244,7 @@ return map(res, 's:Tagline2item(v:val, brackets)') endfunc -function! s:GetAddition(line, match, memarg, bracket) +func s:GetAddition(line, match, memarg, bracket) " Guess if the item is an array. if a:bracket && match(a:line, a:match . '\s*\[') > 0 return '[' @@ -260,13 +260,13 @@ endif endif return '' -endfunction +endfunc " Turn the tag info "val" into an item for completion. " "val" is is an item in the list returned by taglist(). " If it is a variable we may add "." or "->". Don't do it for other types, " such as a typedef, by not including the info that s:GetAddition() uses. -function! s:Tag2item(val) +func s:Tag2item(val) let res = {'match': a:val['name']} let res['extra'] = s:Tagcmd2extra(a:val['cmd'], a:val['name'], a:val['filename']) @@ -289,10 +289,10 @@ endif return res -endfunction +endfunc " Use all the items in dictionary for the "info" entry. -function! s:Dict2info(dict) +func s:Dict2info(dict) let info = '' for k in sort(keys(a:dict)) let info .= k . repeat(' ', 10 - len(k)) @@ -307,7 +307,7 @@ endfunc " Parse a tag line and return a dictionary with items like taglist() -function! s:ParseTagline(line) +func s:ParseTagline(line) let l = split(a:line, "\t") let d = {} if len(l) >= 3 @@ -334,12 +334,12 @@ endif return d -endfunction +endfunc " Turn a match item "val" into an item for completion. " "val['match']" is the matching item. " "val['tagline']" is the tagline in which the last part was found. -function! s:Tagline2item(val, brackets) +func s:Tagline2item(val, brackets) let line = a:val['tagline'] let add = s:GetAddition(line, a:val['match'], [a:val], a:brackets == '') let res = {'word': a:val['match'] . a:brackets . add } @@ -377,10 +377,10 @@ let res['menu'] = s:Tagcmd2extra(s, a:val['match'], matchstr(line, '[^\t]*\t\zs[^\t]*\ze\t')) endif return res -endfunction +endfunc " Turn a command from a tag line to something that is useful in the menu -function! s:Tagcmd2extra(cmd, name, fname) +func s:Tagcmd2extra(cmd, name, fname) if a:cmd =~ '^/^' " The command is a search command, useful to see what it is. let x = matchstr(a:cmd, '^/^\s*\zs.*\ze$/') @@ -395,13 +395,13 @@ let x = a:cmd . ' - ' . a:fname endif return x -endfunction +endfunc " Find composing type in "lead" and match items[0] with it. " Repeat this recursively for items[1], if it's there. " When resolving typedefs "depth" is used to avoid infinite recursion. " Return the list of matches. -function! s:Nextitem(lead, items, depth, all) +func s:Nextitem(lead, items, depth, all) " Use the text up to the variable name and split it in tokens. let tokens = split(a:lead, '\s\+\|\<') @@ -485,7 +485,7 @@ endfor return res -endfunction +endfunc " Search for members of structure "typename" in tags files. @@ -493,7 +493,7 @@ " Each match is a dictionary with "match" and "tagline" entries. " When "all" is non-zero find all, otherwise just return 1 if there is any " member. -function! s:StructMembers(typename, items, all) +func s:StructMembers(typename, items, all) " Todo: What about local structures? let fnames = join(map(tagfiles(), 'escape(v:val, " \\#%")')) if fnames == '' @@ -586,12 +586,12 @@ " Failed to find anything. return [] -endfunction +endfunc " For matching members, find matches for following items. " When "all" is non-zero find all, otherwise just return 1 if there is any " member. -function! s:SearchMembers(matches, items, all) +func s:SearchMembers(matches, items, all) let res = [] for i in range(len(a:matches)) let typename = '' diff -Nru vim-8.2.1913/runtime/autoload/dist/ft.vim vim-8.2.2434/runtime/autoload/dist/ft.vim --- vim-8.2.1913/runtime/autoload/dist/ft.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/autoload/dist/ft.vim 2021-01-30 22:05:11.000000000 +0000 @@ -362,6 +362,10 @@ setf aspvbs elseif lines =~ "' + func dist#ft#FTprogress_pascal() if exists("g:filetype_p") exe "setf " . g:filetype_p @@ -419,8 +426,7 @@ let lnum = 1 while lnum <= 10 && lnum < line('$') let line = getline(lnum) - if line =~ '^\s*\(program\|unit\|procedure\|function\|const\|type\|var\)\>' - \ || line =~ '^\s*{' || line =~ '^\s*(\*' + if line =~ s:ft_pascal_comments || line =~? s:ft_pascal_keywords setf pascal return elseif line !~ '^\s*$' || line =~ '^/\*' @@ -433,6 +439,19 @@ setf progress endfunc +func dist#ft#FTpp() + if exists("g:filetype_pp") + exe "setf " . g:filetype_pp + else + let line = getline(nextnonblank(1)) + if line =~ s:ft_pascal_comments || line =~? s:ft_pascal_keywords + setf pascal + else + setf puppet + endif + endif +endfunc + func dist#ft#FTr() let max = line("$") > 50 ? 50 : line("$") diff -Nru vim-8.2.1913/runtime/autoload/tar.vim vim-8.2.2434/runtime/autoload/tar.vim --- vim-8.2.1913/runtime/autoload/tar.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/autoload/tar.vim 2021-01-30 22:05:11.000000000 +0000 @@ -163,7 +163,7 @@ " call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " - elseif tarfile =~# '\.\(tgz\)$' || tarfile =~# '\.\(tbz\)$' || tarfile =~# '\.\(txz\)$' + elseif tarfile =~# '\.\(tgz\)$' || tarfile =~# '\.\(tbz\)$' || tarfile =~# '\.\(txz\)$' || tarfile =~# '\.\(tzs\)$' if has("unix") && executable("file") let filekind= system("file ".shellescape(tarfile,1)) =~ "bzip2" else @@ -174,6 +174,8 @@ exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " elseif filekind =~ "XZ" exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " + elseif filekind =~ "Zstandard" + exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " else exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " endif @@ -190,6 +192,8 @@ elseif tarfile =~# '\.\(xz\|txz\)$' " call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " + elseif tarfile =~# '\.\(zst\|tzs\)$' + exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " else if tarfile =~ '^\s*-' " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. @@ -302,6 +306,9 @@ elseif fname =~ '\.xz$' && executable("xzcat") let decmp= "|xzcat" let doro = 1 + elseif fname =~ '\.zst$' && executable("zstdcat") + let decmp= "|zstdcat" + let doro = 1 else let decmp="" let doro = 0 @@ -331,6 +338,8 @@ exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp elseif filekind =~ "XZ" exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp + elseif filekind =~ "Zstandard" + exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp else exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp endif @@ -452,6 +461,10 @@ let tarfile = substitute(tarfile,'\.xz','','e') let compress= "xz -- ".shellescape(tarfile,0) " call Decho("compress<".compress.">") + elseif tarfile =~# '\.zst' + call system("zstd --decompress -- ".shellescape(tarfile,0)) + let tarfile = substitute(tarfile,'\.zst','','e') + let compress= "zstd -- ".shellescape(tarfile,0) elseif tarfile =~# '\.lzma' call system("lzma -d -- ".shellescape(tarfile,0)) let tarfile = substitute(tarfile,'\.lzma','','e') @@ -676,6 +689,28 @@ else echo "***note*** successfully extracted ".fname endif + + elseif filereadable(tarbase.".tzs") + let extractcmd= substitute(extractcmd,"-","--zstd","") +" call Decho("system(".extractcmd." ".shellescape(tarbase).".tzs ".shellescape(fname).")") + call system(extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname)) + if v:shell_error != 0 + echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tzs ".fname.": failed!" | echohl NONE +" call Decho("***error*** ".extractcmd." ".tarbase.".tzs ".fname.": failed!") + else + echo "***note*** successfully extracted ".fname + endif + + elseif filereadable(tarbase.".tar.zst") + let extractcmd= substitute(extractcmd,"-","--zstd","") +" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.zst ".shellescape(fname).")") + call system(extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname)) + if v:shell_error != 0 + echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.zst ".fname.": failed!" | echohl NONE +" call Decho("***error*** ".extractcmd." ".tarbase.".tar.zst ".fname.": failed!") + else + echo "***note*** successfully extracted ".fname + endif endif " restore option diff -Nru vim-8.2.1913/runtime/compiler/fbc.vim vim-8.2.2434/runtime/compiler/fbc.vim --- vim-8.2.1913/runtime/compiler/fbc.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/runtime/compiler/fbc.vim 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,27 @@ +" Vim compiler file +" Compiler: FreeBASIC Compiler +" Maintainer: Doug Kearns +" Last Change: 2015 Jan 10 + +if exists("current_compiler") + finish +endif +let current_compiler = "fbc" + +if exists(":CompilerSet") != 2 " older Vim always used :setlocal + command -nargs=* CompilerSet setlocal +endif + +let s:cpo_save = &cpo +set cpo&vim + +CompilerSet makeprg=fbc +CompilerSet errorformat=%-G%.%#Too\ many\ errors\\,\ exiting, + \%f(%l)\ %tarning\ %n(%\\d%\\+):\ %m, + \%E%f(%l)\ error\ %n:\ %m, + \%-Z%p^, + \%-C%.%#, + \%-G%.%# + +let &cpo = s:cpo_save +unlet s:cpo_save diff -Nru vim-8.2.1913/runtime/compiler/ocaml.vim vim-8.2.2434/runtime/compiler/ocaml.vim --- vim-8.2.1913/runtime/compiler/ocaml.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/compiler/ocaml.vim 2021-01-30 22:05:11.000000000 +0000 @@ -1,11 +1,11 @@ " Vim Compiler File " Compiler: ocaml " Maintainer: Markus Mottl -" URL: https://github.com/rgrinberg/vim-ocaml +" URL: https://github.com/ocaml/vim-ocaml " Last Change: +" 2020 Mar 28 - Improved error format (Thomas Leonard) " 2017 Nov 26 - Improved error format (Markus Mottl) " 2013 Aug 27 - Added a new OCaml error format (Markus Mottl) -" 2013 Jun 30 - Initial version (Marc Weber) " " Marc Weber's comments: " Setting makeprg doesn't make sense, because there is ocamlc, ocamlopt, @@ -21,6 +21,7 @@ " " So having it here makes people opt-in + if exists("current_compiler") finish endif @@ -30,6 +31,7 @@ set cpo&vim CompilerSet errorformat = + \%EFile\ \"%f\"\\,\ lines\ %*\\d-%l\\,\ characters\ %c-%*\\d:, \%EFile\ \"%f\"\\,\ line\ %l\\,\ characters\ %c-%*\\d:, \%EFile\ \"%f\"\\,\ line\ %l\\,\ characters\ %c-%*\\d\ %.%#, \%EFile\ \"%f\"\\,\ line\ %l\\,\ character\ %c:%m, diff -Nru vim-8.2.1913/runtime/compiler/tidy.vim vim-8.2.2434/runtime/compiler/tidy.vim --- vim-8.2.1913/runtime/compiler/tidy.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/compiler/tidy.vim 2021-01-30 22:05:11.000000000 +0000 @@ -1,7 +1,7 @@ " Vim compiler file " Compiler: HTML Tidy " Maintainer: Doug Kearns -" Last Change: 2016 Apr 21 +" Last Change: 2020 Sep 4 if exists("current_compiler") finish @@ -12,8 +12,15 @@ command -nargs=* CompilerSet setlocal endif -CompilerSet makeprg=tidy\ -quiet\ -errors\ --gnu-emacs\ yes\ %:S +let s:cpo_save = &cpo +set cpo&vim -" foo.html:8:1: Warning: inserting missing 'foobar' element -" foo.html:9:2: Error: is not recognized! -CompilerSet errorformat=%f:%l:%c:\ %trror:%m,%f:%l:%c:\ %tarning:%m,%-G%.%# +CompilerSet makeprg=tidy\ -quiet\ -errors\ --gnu-emacs\ yes +CompilerSet errorformat=%f:%l:%c:\ %trror:\ %m, + \%f:%l:%c:\ %tarning:\ %m, + \%f:%l:%c:\ %tnfo:\ %m, + \%f:%l:%c:\ %m, + \%-G%.%# + +let &cpo = s:cpo_save +unlet s:cpo_save diff -Nru vim-8.2.1913/runtime/compiler/zsh.vim vim-8.2.2434/runtime/compiler/zsh.vim --- vim-8.2.1913/runtime/compiler/zsh.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/runtime/compiler/zsh.vim 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,23 @@ +" Vim compiler file +" Compiler: Zsh +" Maintainer: Doug Kearns +" Last Change: 2020 Sep 6 + +if exists("current_compiler") + finish +endif +let current_compiler = "zsh" + +if exists(":CompilerSet") != 2 " older Vim always used :setlocal + command -nargs=* CompilerSet setlocal +endif + +let s:cpo_save = &cpo +set cpo&vim + +CompilerSet makeprg=zsh\ -n\ --\ %:S +CompilerSet errorformat=%f:\ line\ %l:\ %m, + \%-G%.%# + +let &cpo = s:cpo_save +unlet s:cpo_save diff -Nru vim-8.2.1913/runtime/doc/autocmd.txt vim-8.2.2434/runtime/doc/autocmd.txt --- vim-8.2.1913/runtime/doc/autocmd.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/autocmd.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*autocmd.txt* For Vim version 8.2. Last change: 2020 Oct 26 +*autocmd.txt* For Vim version 8.2. Last change: 2020 Dec 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -70,6 +70,11 @@ The special pattern or defines a buffer-local autocommand. See |autocmd-buflocal|. +If the `:autocmd` is in Vim9 script (a script that starts with `:vim9script` +and in a `:def` function) then {cmd} will be executed as in Vim9 +script. Thus this depends on where the autocmd is defined, not where it is +triggered. + Note: The ":autocmd" command can only be followed by another command when the '|' appears before {cmd}. This works: > :augroup mine | au! BufRead | augroup END @@ -301,6 +306,9 @@ |VimLeavePre| before exiting Vim, before writing the viminfo file |VimLeave| before exiting Vim, after writing the viminfo file +|VimSuspend| when suspending Vim +|VimResume| when Vim is resumed after being suspended + Terminal |TerminalOpen| after a terminal buffer was created |TerminalWinOpen| after a terminal buffer was created in a new window @@ -551,12 +559,15 @@ *CmdlineEnter* CmdlineEnter After moving the cursor to the command line, where the user can type a command or search - string. + string; including non-interactive use of ":" + in a mapping, but not when using ||. is set to a single character, indicating the type of command-line. |cmdwin-char| *CmdlineLeave* -CmdlineLeave Before leaving the command line. +CmdlineLeave Before leaving the command line; including + non-interactive use of ":" in a mapping, but + not when using ||. Also when abandoning the command line, after typing CTRL-C or . When the commands result in an error the @@ -840,6 +851,8 @@ when it's used. The pattern is matched against the function name. Both and are set to the name of the function. + Not triggered when compiling a |Vim9| + function. NOTE: When writing Vim scripts a better alternative is to use an autoloaded function. See |autoload-functions|. @@ -1207,6 +1220,7 @@ To detect an abnormal exit use |v:dying|. When v:dying is 2 or more this event is not triggered. + To get the exit code use |v:exiting|. *VimLeavePre* VimLeavePre Before exiting Vim, just before writing the .viminfo file. This is executed only once, @@ -1217,10 +1231,22 @@ < To detect an abnormal exit use |v:dying|. When v:dying is 2 or more this event is not triggered. + To get the exit code use |v:exiting|. *VimResized* VimResized After the Vim window was resized, thus 'lines' and/or 'columns' changed. Not when starting up though. + *VimResume* +VimResume When the Vim instance is resumed after being + suspended and |VimSuspend| was triggered. + Useful for triggering |:checktime| and ensure + the buffers content did not change while Vim + was suspended: > + :autocmd VimResume * checktime +< *VimSuspend* +VimSuspend When the Vim instance is suspended. Only when + CTRL-Z was typed inside Vim, not when the + SIGSTOP or SIGTSTP signal was sent to Vim. *WinEnter* WinEnter After entering another window. Not done for the first window, when Vim has just started. diff -Nru vim-8.2.1913/runtime/doc/change.txt vim-8.2.2434/runtime/doc/change.txt --- vim-8.2.1913/runtime/doc/change.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/change.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*change.txt* For Vim version 8.2. Last change: 2020 Aug 15 +*change.txt* For Vim version 8.2. Last change: 2021 Jan 21 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1631,24 +1631,31 @@ readability. letter meaning when present in 'formatoptions' ~ - + *fo-t* t Auto-wrap text using textwidth + *fo-c* c Auto-wrap comments using textwidth, inserting the current comment leader automatically. + *fo-r* r Automatically insert the current comment leader after hitting in Insert mode. + *fo-o* o Automatically insert the current comment leader after hitting 'o' or 'O' in Normal mode. + *fo-q* q Allow formatting of comments with "gq". Note that formatting will not change blank lines or lines containing only the comment leader. A new paragraph starts after such a line, or when the comment leader changes. + *fo-w* w Trailing white space indicates a paragraph continues in the next line. A line that ends in a non-white character ends a paragraph. + *fo-a* a Automatic formatting of paragraphs. Every time text is inserted or deleted the paragraph will be reformatted. See |auto-format|. When the 'c' flag is present this only happens for recognized comments. + *fo-n* n When formatting text, recognize numbered lists. This actually uses the 'formatlistpat' option, thus any kind of list can be used. The indent of the text after the number is used for the next line. The @@ -1659,6 +1666,7 @@ 1. the first item wraps 2. the second item +< *fo-2* 2 When formatting text, use the indent of the second line of a paragraph for the rest of the paragraph, instead of the indent of the first line. This supports paragraphs in which the first line has a @@ -1668,36 +1676,46 @@ second line of the same paragraph third line. < This also works inside comments, ignoring the comment leader. + *fo-v* v Vi-compatible auto-wrapping in insert mode: Only break a line at a blank that you have entered during the current insert command. (Note: this is not 100% Vi compatible. Vi has some "unexpected features" or bugs in this area. It uses the screen column instead of the line column.) + *fo-b* b Like 'v', but only auto-wrap if you enter a blank at or before the wrap margin. If the line was longer than 'textwidth' when you started the insert, or you do not enter a blank in the insert before reaching 'textwidth', Vim does not perform auto-wrapping. + *fo-l* l Long lines are not broken in insert mode: When a line was longer than 'textwidth' when the insert command started, Vim does not automatically format it. + *fo-m* m Also break at a multibyte character above 255. This is useful for Asian text where every character is a word on its own. + *fo-M* M When joining lines, don't insert a space before or after a multibyte character. Overrules the 'B' flag. + *fo-B* B When joining lines, don't insert a space between two multibyte characters. Overruled by the 'M' flag. + *fo-1* 1 Don't break a line after a one-letter word. It's broken before it instead (if possible). + *fo-]* ] Respect textwidth rigorously. With this flag set, no line can be longer than textwidth, unless line-break-prohibition rules make this impossible. Mainly for CJK scripts and works only if 'encoding' is "utf-8". + *fo-j* j Where it makes sense, remove a comment leader when joining lines. For example, joining: int i; // the index ~ // in the list ~ Becomes: int i; // the index in the list ~ + *fo-p* p Don't break lines at single spaces that follow periods. This is intended to complement 'joinspaces' and |cpo-J|, for prose with sentences separated by two spaces. For example, with 'textwidth' set @@ -1801,7 +1819,7 @@ found here: |sort()|, |uniq()|. *:sor* *:sort* -:[range]sor[t][!] [b][f][i][n][o][r][u][x] [/{pattern}/] +:[range]sor[t][!] [b][f][i][l][n][o][r][u][x] [/{pattern}/] Sort lines in [range]. When no range is given all lines are sorted. @@ -1809,6 +1827,16 @@ With [i] case is ignored. + With [l] sort uses the current collation locale. + Implementation details: strcoll() is used to compare + strings. See |:language| to check or set the collation + locale. Example: > + :language collate en_US.UTF-8 + :%sort l +< |v:collate| can also used to check the current locale. + Sorting using the locale typically ignores case. + This does not work properly on Mac. + Options [n][f][x][o][b] are mutually exclusive. With [n] sorting is done on the first decimal number @@ -1842,6 +1870,8 @@ When /{pattern}/ is specified and there is no [r] flag the text matched with {pattern} is skipped, so that you sort on what comes after the match. + 'ignorecase' applies to the pattern, but 'smartcase' + is not used. Instead of the slash any non-letter can be used. For example, to sort on the second comma-separated field: > @@ -1875,8 +1905,7 @@ Note that using `:sort` with `:global` doesn't sort the matching lines, it's quite useless. -The details about sorting depend on the library function used. There is no -guarantee that sorting obeys the current locale. You will have to try it out. +`:sort` does not use the current locale unless the l flag is used. Vim does do a "stable" sort. The sorting can be interrupted, but if you interrupt it too late in the diff -Nru vim-8.2.1913/runtime/doc/cmdline.txt vim-8.2.2434/runtime/doc/cmdline.txt --- vim-8.2.1913/runtime/doc/cmdline.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/cmdline.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*cmdline.txt* For Vim version 8.2. Last change: 2020 Sep 14 +*cmdline.txt* For Vim version 8.2. Last change: 2020 Dec 26 VIM REFERENCE MANUAL by Bram Moolenaar @@ -849,6 +849,16 @@ file name n. See |:oldfiles| or |v:oldfiles| to get the number. *E809* {only when compiled with the |+eval| and |+viminfo| features} +In |Vim9-script| # is used to start a comment, use %% for the alternate file +name: + % Is replaced with the current file name. + %% Is replaced with the alternate file name. *:_%%* *c_%%* + %%n (where n is a number) is replaced with *:_%%0* *:_%%n* + the file name of buffer n. "%%0" is the same as "%%". *c_%%n* + %%% Is replaced with all names in the argument *:_%%%* *c_%%%#* + list concatenated, separated by spaces. + %% 0) is replaced with old *:_%%<* *c_%%<* + file name n. Note that these, except "# is used for . This is default +If the 'fileformat' is "dos", is used for . This is default for Win32. On other systems the message "[dos format]" is shown to remind you that an unusual was used. *Unix-format-write* @@ -1419,8 +1419,8 @@ the file. It is also possible that you get an "out of memory" error when reading the file. - Make sure the 'binary' option is set BEFORE loading the - file. Otherwise both and are considered to end a line - and when the file is written the will be replaced with . + file. Otherwise both and are considered to end a line + and when the file is written the will be replaced with . - characters are shown on the screen as ^@. You can enter them with "CTRL-V CTRL-@" or "CTRL-V 000" - To insert a character in the file split a line. When writing the diff -Nru vim-8.2.1913/runtime/doc/eval.txt vim-8.2.2434/runtime/doc/eval.txt --- vim-8.2.1913/runtime/doc/eval.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/eval.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 8.2. Last change: 2020 Oct 23 +*eval.txt* For Vim version 8.2. Last change: 2021 Jan 22 VIM REFERENCE MANUAL by Bram Moolenaar @@ -49,7 +49,7 @@ *Number* *Integer* Number A 32 or 64 bit signed number. |expr-number| The number of bits is available in |v:numbersize|. - Examples: -123 0x10 0177 0b1011 + Examples: -123 0x10 0177 0o177 0b1011 Float A floating point number. |floating-point-format| *Float* {only when compiled with the |+float| feature} @@ -97,9 +97,10 @@ Conversion from a String to a Number only happens in legacy Vim script, not in Vim9 script. It is done by converting the first digits to a number. Hexadecimal "0xf9", Octal "017" or "0o17", and Binary "0b10" -numbers are recognized (NOTE: when using |scriptversion-4| octal with a -leading "0" is not recognized). If the String doesn't start with digits, the -result is zero. +numbers are recognized +NOTE: when using |scriptversion-4| octal with a leading "0" is not recognized. +The 0o notation requires patch 8.2.0886. +If the String doesn't start with digits, the result is zero. Examples: String "456" --> Number 456 ~ String "6bar" --> Number 6 ~ @@ -313,6 +314,9 @@ :let shortlist = mylist[2:2] " List with one item: [3] :let otherlist = mylist[:] " make a copy of the List +Notice that the last index is inclusive. If you prefer using an exclusive +index use the |slice()| method. + If the first index is beyond the last item of the List or the second item is before the first item, the result is an empty list. There is no error message. @@ -1150,7 +1154,7 @@ For '!' |TRUE| becomes |FALSE|, |FALSE| becomes |TRUE| (one). For '-' the sign of the number is changed. -For '+' the number is unchanged. +For '+' the number is unchanged. Note: "++" has no effect. A String will be converted to a Number first. @@ -1191,6 +1195,7 @@ If the length of the String is less than the index, the result is an empty String. A negative index always results in an empty string (reason: backward compatibility). Use [-1:] to get the last byte or character. +In Vim9 script a negative index is used like with a list: count from the end. If expr8 is a |List| then it results the item at index expr1. See |list-index| for possible index values. If the index is out of range this results in an @@ -1215,6 +1220,9 @@ In Vim9 script the indexes are character indexes. To use byte indexes use |strpart()|. +The item at index expr1b is included, it is inclusive. For an exclusive index +use the |slice()| function. + If expr1a is omitted zero is used. If expr1b is omitted the length of the string minus one is used. @@ -1318,8 +1326,8 @@ number ------ number number constant *expr-number* - *hex-number* *octal-number* *binary-number* + *0x* *hex-number* *0o* *octal-number* *binary-number* Decimal, Hexadecimal (starting with 0x or 0X), Binary (starting with 0b or 0B) and Octal (starting with 0, 0o or 0O). @@ -1572,7 +1580,7 @@ Lambda expressions have internal names like '42'. If you get an error for a lambda expression, you can find what it is with the following command: > - :function {'42'} + :function 42 See also: |numbered-function| ============================================================================== @@ -1850,6 +1858,13 @@ < Note: if another deadly signal is caught when v:dying is one, VimLeave autocommands will not be executed. + *v:exiting* *exiting-variable* +v:exiting Vim exit code. Normally zero, non-zero when something went + wrong. The value is v:null before invoking the |VimLeavePre| + and |VimLeave| autocmds. See |:q|, |:x| and |:cquit|. + Example: > + :au VimLeave * echo "Exit value is " .. v:exiting +< *v:echospace* *echospace-variable* v:echospace Number of screen cells that can be used for an `:echo` message in the last screen line before causing the |hit-enter-prompt|. @@ -2067,6 +2082,12 @@ That is so that eval() can parse the string back to the same value. Read-only. + *v:numbermax* *numbermax-variable* +v:numbermax Maximum value of a number. + + *v:numbermin* *numbermin-variable* +v:numbermin Minimum value of a number (negative) + *v:numbersize* *numbersize-variable* v:numbersize Number of bits in a Number. This is normally 64, but on some systems it may be 32. @@ -2468,10 +2489,13 @@ changenr() Number current change number char2nr({expr} [, {utf8}]) Number ASCII/UTF8 value of first char in {expr} charclass({string}) Number character class of {string} +charcol({expr}) Number column number of cursor or mark +charidx({string}, {idx} [, {countcc}]) + Number char index of byte {idx} in {string} chdir({dir}) String change current working directory cindent({lnum}) Number C indent for line {lnum} clearmatches([{win}]) none clear all matches -col({expr}) Number column nr of cursor or mark +col({expr}) Number column byte index of cursor or mark complete({startcol}, {matches}) none set Insert mode completion complete_add({expr}) Number add completion match complete_check() Number check for key typed during completion @@ -2512,6 +2536,9 @@ expandcmd({expr}) String expand {expr} like with `:edit` extend({expr1}, {expr2} [, {expr3}]) List/Dict insert items of {expr2} into {expr1} +extendnew({expr1}, {expr2} [, {expr3}]) + List/Dict like |extend()| but creates a new + List or Dictionary feedkeys({string} [, {mode}]) Number add key sequence to typeahead buffer filereadable({file}) Number |TRUE| if {file} is a readable file filewritable({file}) Number |TRUE| if {file} is a writable file @@ -2549,6 +2576,7 @@ getchangelist([{expr}]) List list of change list items getchar([expr]) Number get one character from the user getcharmod() Number modifiers for the last typed character +getcharpos({expr}) List position of cursor, mark, etc. getcharsearch() Dict last character search getcmdline() String return the current command-line getcmdpos() Number return cursor position in command-line @@ -2557,6 +2585,7 @@ getcompletion({pat}, {type} [, {filtered}]) List list of cmdline completion matches getcurpos([{winnr}]) List position of the cursor +getcursorcharpos([{winnr}]) List character position of the cursor getcwd([{winnr} [, {tabnr}]]) String get the current working directory getenv({name}) String return environment variable getfontname([{name}]) String name of font being used @@ -2669,8 +2698,9 @@ rhs of mapping {name} in mode {mode} mapcheck({name} [, {mode} [, {abbr}]]) String check for mappings matching {name} -mapset({mode}, {abbr}, {dict}) - none restore mapping from |maparg()| result +mapnew({expr1}, {expr2}) List/Dict like |map()| but creates a new List + or Dictionary +mapset({mode}, {abbr}, {dict}) none restore mapping from |maparg()| result match({expr}, {pat} [, {start} [, {count}]]) Number position where {pat} matches in {expr} matchadd({group}, {pattern} [, {priority} [, {id} [, {dict}]]]) @@ -2757,6 +2787,7 @@ rand([{expr}]) Number get pseudo-random number range({expr} [, {max} [, {stride}]]) List items from {expr} to {max} +readblob({fname}) Blob read a |Blob| from {fname} readdir({dir} [, {expr} [, {dict}]]) List file names in {dir} selected by {expr} readdirex({dir} [, {expr} [, {dict}]]) @@ -2818,8 +2849,10 @@ setbufvar({expr}, {varname}, {val}) none set {varname} in buffer {expr} to {val} setcellwidths({list}) none set character cell width overrides +setcharpos({expr}, {list}) Number set the {expr} position to {list} setcharsearch({dict}) Dict set character search from {dict} setcmdpos({pos}) Number set cursor position in command-line +setcursorcharpos({list}) Number move cursor to position in {list} setenv({name}, {val}) none set environment variable setfperm({fname}, {mode}) Number set {fname} file permissions to {mode} setline({lnum}, {line}) Number set line {lnum} to {line} @@ -2863,6 +2896,8 @@ simplify({filename}) String simplify filename as much as possible sin({expr}) Float sine of {expr} sinh({expr}) Float hyperbolic sine of {expr} +slice({expr}, {start} [, {end}]) String, List or Blob + slice of a String, List or Blob sort({list} [, {func} [, {dict}]]) List sort {list}, using {func} to compare sound_clear() none stop playing all sounds @@ -2996,7 +3031,8 @@ trim({text} [, {mask} [, {dir}]]) String trim characters in {mask} from {text} trunc({expr}) Float truncate Float {expr} -type({name}) Number type of variable {name} +type({expr}) Number type of value {expr} +typename({expr}) String representation of the type of {expr} undofile({name}) String undo file name for {name} undotree() List undo file tree uniq({list} [, {func} [, {dict}]]) @@ -3472,8 +3508,8 @@ Return byte index of the {nr}'th character in the string {expr}. Use zero for the first character, it then returns zero. - This function is only useful when there are multibyte - characters, otherwise the returned value is equal to {nr}. + If there are no multibyte characters the returned value is + equal to {nr}. Composing characters are not counted separately, their byte length is added to the preceding base character. See |byteidxcomp()| below for counting composing characters @@ -3503,8 +3539,8 @@ < The first and third echo result in 3 ('e' plus composing character is 3 bytes), the second echo results in 1 ('e' is one byte). - Only works differently from byteidx() when 'encoding' is set to - a Unicode encoding. + Only works differently from byteidx() when 'encoding' is set + to a Unicode encoding. Can also be used as a |method|: > GetName()->byteidxcomp(idx) @@ -3580,6 +3616,43 @@ other specific Unicode class The class is used in patterns and word motions. + *charcol()* +charcol({expr}) Same as |col()| but returns the character index of the column + position given with {expr} instead of the byte position. + + Example: + With the cursor on '세' in line 5 with text "여보세요": > + charcol('.') returns 3 + col('.') returns 7 + +< Can also be used as a |method|: > + GetPos()->col() +< + *charidx()* +charidx({string}, {idx} [, {countcc}]) + Return the character index of the byte at {idx} in {string}. + The index of the first character is zero. + If there are no multibyte characters the returned value is + equal to {idx}. + When {countcc} is omitted or zero, then composing characters + are not counted separately, their byte length is added to the + preceding base character. + When {countcc} is set to 1, then composing characters are + counted as separate characters. + Returns -1 if the arguments are invalid or if {idx} is greater + than the index of the last byte in {string}. An error is + given if the first argument is not a string, the second + argument is not a number or when the third argument is present + and is not zero or one. + See |byteidx()| and |byteidxcomp()| for getting the byte index + from the character index. + Examples: > + echo charidx('aÌbÌcÌ', 3) returns 1 + echo charidx('aÌbÌcÌ', 6, 1) returns 4 + echo charidx('aÌbÌcÌ', 16) returns -1 +< + Can also be used as a |method|: > + GetName()->charidx(idx) chdir({dir}) *chdir()* Change the current working directory to {dir}. The scope of @@ -3645,7 +3718,8 @@ out of range then col() returns zero. To get the line number use |line()|. To get both use |getpos()|. - For the screen column position use |virtcol()|. + For the screen column position use |virtcol()|. For the + character position use |charcol()|. Note that only marks in the current file can be used. Examples: > col(".") column of cursor @@ -3798,7 +3872,7 @@ not need to be the first letter: > confirm("file has been modified", "&Save\nSave &All") < For the console, the first letter of each choice is used as - the default shortcut key. + the default shortcut key. Case is ignored. The optional {default} argument is the number of the choice that is made if the user hits . Use 1 to make the first @@ -3946,6 +4020,9 @@ This is like the return value of |getpos()| or |getcurpos()|, but without the first item. + To position the cursor using the character count, use + |setcursorcharpos()|. + Does not change the jumplist. If {lnum} is greater than the number of lines in the buffer, the cursor will be positioned at the last line in the buffer. @@ -4013,8 +4090,9 @@ A symbolic link itself is deleted, not what it points to. - The result is a Number, which is 0 if the delete operation was - successful and -1 when the deletion failed or partly failed. + The result is a Number, which is 0/false if the delete + operation was successful and -1/true when the deletion failed + or partly failed. Use |remove()| to delete an item from a |List|. To delete a line from the buffer use |:delete| or @@ -4427,10 +4505,10 @@ |Dictionaries|. If they are |Lists|: Append {expr2} to {expr1}. - If {expr3} is given insert the items of {expr2} before item - {expr3} in {expr1}. When {expr3} is zero insert before the - first item. When {expr3} is equal to len({expr1}) then - {expr2} is appended. + If {expr3} is given insert the items of {expr2} before the + item with index {expr3} in {expr1}. When {expr3} is zero + insert before the first item. When {expr3} is equal to + len({expr1}) then {expr2} is appended. Examples: > :echo sort(extend(mylist, [7, 5])) :call extend(mylist, [2, 3], 1) @@ -4462,6 +4540,13 @@ mylist->extend(otherlist) +extendnew({expr1}, {expr2} [, {expr3}]) *extendnew()* + Like |extend()| but instead of adding items to {expr1} a new + List or Dictionary is created and returned. {expr1} remains + unchanged. Items can still be changed by {expr2}, if you + don't want that use |deepcopy()| first. + + feedkeys({string} [, {mode}]) *feedkeys()* Characters in {string} are queued for processing as if they come from a mapping or were typed by the user. @@ -4732,7 +4817,8 @@ :echo fnamemodify("main.c", ":p:h") < results in: > /home/mool/vim/vim/src -< Note: Environment variables don't work in {fname}, use +< If {mods} is empty then {fname} is returned. + Note: Environment variables don't work in {fname}, use |expand()| first then. Can also be used as a |method|: > @@ -5051,9 +5137,9 @@ The result is the value of option or local buffer variable {varname} in buffer {expr}. Note that the name without "b:" must be used. - When {varname} is empty returns a dictionary with all the + When {varname} is empty returns a |Dictionary| with all the buffer-local variables. - When {varname} is equal to "&" returns a dictionary with all + When {varname} is equal to "&" returns a |Dictionary| with all the buffer-local options. Otherwise, when {varname} starts with "&" returns the value of a buffer-local option. @@ -5135,7 +5221,10 @@ |xterm-bracketed-paste|. There is no prompt, you will somehow have to make clear to the - user that a character has to be typed. + user that a character has to be typed. The screen is not + redrawn, e.g. when resizing the window. When using a popup + window it should work better with a |popup-filter|. + There is no mapping for the character. Key codes are replaced, thus when the user presses the key you get the code for the key, not the raw character @@ -5181,6 +5270,20 @@ character itself are obtained. Thus Shift-a results in "A" without a modifier. + *getcharpos()* +getcharpos({expr}) + Get the position for {expr}. Same as |getpos()| but the column + number in the returned List is a character index instead of + a byte index. + + Example: + With the cursor on '세' in line 5 with text "여보세요": > + getcharpos('.') returns [0, 5, 3, 0] + getpos('.') returns [0, 5, 7, 0] +< + Can also be used as a |method|: > + GetMark()->getcharpos() + getcharsearch() *getcharsearch()* Return the current character search information as a {dict} with the following entries: @@ -5306,8 +5409,11 @@ includes an extra "curswant" item in the list: [0, lnum, col, off, curswant] ~ The "curswant" number is the preferred column when moving the - cursor vertically. Also see |getpos()|. - The first "bufnum" item is always zero. + cursor vertically. Also see |getcursorcharpos()| and + |getpos()|. + The first "bufnum" item is always zero. The byte position of + the cursor is returned in 'col'. To get the character + position, use |getcursorcharpos()|. The optional {winid} argument can specify the window. It can be the window number or the |window-ID|. The last known @@ -5321,7 +5427,24 @@ call setpos('.', save_cursor) < Note that this only works within the window. See |winrestview()| for restoring more state. - *getcwd()* + + Can also be used as a |method|: > + GetWinid()->getcurpos() + +< *getcursorcharpos()* +getcursorcharpos([{winid}]) + Same as |getcurpos()| but the column number in the returned + List is a character index instead of a byte index. + + Example: + With the cursor on 'ë³´' in line 3 with text "여보세요": > + getcursorcharpos() returns [0, 3, 2, 0, 3] + getcurpos() returns [0, 3, 4, 0, 3] + +< Can also be used as a |method|: > + GetWinid()->getcursorcharpos() + +< *getcwd()* getcwd([{winnr} [, {tabnr}]]) The result is a String, which is the name of the current working directory. @@ -5525,8 +5648,8 @@ |location-list-file-window| for more details. - Returns a Dictionary with default values if there is no location - list for the window {nr}. + Returns a |Dictionary| with default values if there is no + location list for the window {nr}. Returns an empty Dictionary if window {nr} does not exist. Examples (See also |getqflist-examples|): > @@ -5628,18 +5751,20 @@ Note that for '< and '> Visual mode matters: when it is "V" (visual line mode) the column of '< is zero and the column of '> is a large number. + The column number in the returned List is the byte position + within the line. To get the character position in the line, + use |getcharpos()| This can be used to save and restore the position of a mark: > let save_a_mark = getpos("'a") ... call setpos("'a", save_a_mark) -< Also see |getcurpos()| and |setpos()|. +< Also see |getcharpos()|, |getcurpos()| and |setpos()|. Can also be used as a |method|: > GetMark()->getpos() - getqflist([{what}]) *getqflist()* - Returns a list with all the current quickfix errors. Each + Returns a |List| with all the current quickfix errors. Each list item is a dictionary with these entries: bufnr number of buffer that has the file name, use bufname() to get the name @@ -6104,8 +6229,8 @@ has_key({dict}, {key}) *has_key()* - The result is a Number, which is 1 if |Dictionary| {dict} has - an entry with key {key}. Zero otherwise. + The result is a Number, which is TRUE if |Dictionary| {dict} + has an entry with key {key}. FALSE otherwise. Can also be used as a |method|: > mydict->has_key(key) @@ -6148,16 +6273,16 @@ GetWinnr()->haslocaldir() hasmapto({what} [, {mode} [, {abbr}]]) *hasmapto()* - The result is a Number, which is 1 if there is a mapping that - contains {what} in somewhere in the rhs (what it is mapped to) - and this mapping exists in one of the modes indicated by - {mode}. + The result is a Number, which is TRUE if there is a mapping + that contains {what} in somewhere in the rhs (what it is + mapped to) and this mapping exists in one of the modes + indicated by {mode}. When {abbr} is there and it is |TRUE| use abbreviations instead of mappings. Don't forget to specify Insert and/or Command-line mode. Both the global mappings and the mappings local to the current buffer are checked for a match. - If no matching mapping is found 0 is returned. + If no matching mapping is found FALSE is returned. The following characters are recognized in {mode}: n Normal mode v Visual and Select mode @@ -6193,8 +6318,8 @@ character is sufficient. If {item} does already exist in the history, it will be shifted to become the newest entry. - The result is a Number: 1 if the operation was successful, - otherwise 0 is returned. + The result is a Number: TRUE if the operation was successful, + otherwise FALSE is returned. Example: > :call histadd("input", strftime("%Y %b %d")) @@ -6217,8 +6342,8 @@ an index, see |:history-indexing|. The respective entry will be removed if it exists. - The result is a Number: 1 for a successful operation, - otherwise 0 is returned. + The result is TRUE for a successful operation, otherwise FALSE + is returned. Examples: Clear expression register history: > @@ -6270,7 +6395,7 @@ GetHistory()->histnr() < hlexists({name}) *hlexists()* - The result is a Number, which is non-zero if a highlight group + The result is a Number, which is TRUE if a highlight group called {name} exists. This is when the group has been defined in some way. Not necessarily when highlighting has been defined for it, it may also have been used for a syntax @@ -6443,7 +6568,7 @@ Restore typeahead that was saved with a previous |inputsave()|. Should be called the same number of times inputsave() is called. Calling it more often is harmless though. - Returns 1 when there is nothing to restore, 0 otherwise. + Returns TRUE when there is nothing to restore, FALSE otherwise. inputsave() *inputsave()* Preserve typeahead (also from mappings) and clear it, so that @@ -6451,7 +6576,7 @@ followed by a matching inputrestore() after the prompt. Can be used several times, in which case there must be just as many inputrestore() calls. - Returns 1 when out of memory, 0 otherwise. + Returns TRUE when out of memory, FALSE otherwise. inputsecret({prompt} [, {text}]) *inputsecret()* This function acts much like the |input()| function with but @@ -6927,7 +7052,7 @@ listener_remove({id}) *listener_remove()* Remove a listener previously added with listener_add(). - Returns zero when {id} could not be found, one when {id} was + Returns FALSE when {id} could not be found, TRUE when {id} was removed. Can also be used as a |method|: > @@ -6987,9 +7112,14 @@ < {only available when compiled with the |+lua| feature} map({expr1}, {expr2}) *map()* - {expr1} must be a |List| or a |Dictionary|. + {expr1} must be a |List|, |Blob| or |Dictionary|. Replace each item in {expr1} with the result of evaluating - {expr2}. {expr2} must be a |string| or |Funcref|. + {expr2}. For a |Blob| each byte is replaced. + If the item type changes you may want to use |mapnew()| to + create a new List or Dictionary. This is required when using + Vim9 script. + + {expr2} must be a |string| or |Funcref|. If {expr2} is a |string|, inside {expr2} |v:val| has the value of the current item. For a |Dictionary| |v:key| has the key @@ -7024,11 +7154,11 @@ |Dictionary| to remain unmodified make a copy first: > :let tlist = map(copy(mylist), ' v:val . "\t"') -< Returns {expr1}, the |List| or |Dictionary| that was filtered. - When an error is encountered while evaluating {expr2} no - further items in {expr1} are processed. When {expr2} is a - Funcref errors inside a function are ignored, unless it was - defined with the "abort" flag. +< Returns {expr1}, the |List|, |Blob| or |Dictionary| that was + filtered. When an error is encountered while evaluating + {expr2} no further items in {expr1} are processed. When + {expr2} is a Funcref errors inside a function are ignored, + unless it was defined with the "abort" flag. Can also be used as a |method|: > mylist->map(expr2) @@ -7137,7 +7267,14 @@ GetKey()->mapcheck('n') -mapset({mode}, {abbr}, {dict}) *mapset()* +mapnew({expr1}, {expr2}) *mapnew()* + Like |map()| but instead of replacing items in {expr1} a new + List or Dictionary is created and returned. {expr1} remains + unchanged. Items can still be changed by {expr2}, if you + don't want that use |deepcopy()| first. + + +mapset({mode}, {abbr}, {dict}) *mapset()* Restore a mapping from a dictionary returned by |maparg()|. {mode} and {abbr} should be the same as for the call to |maparg()|. *E460* @@ -7363,7 +7500,7 @@ matchfuzzy({list}, {str} [, {dict}]) *matchfuzzy()* - If {list} is a list of strings, then returns a list with all + If {list} is a list of strings, then returns a |List| with all the strings in {list} that fuzzy match {str}. The strings in the returned list are sorted based on the matching score. @@ -7420,22 +7557,24 @@ matchfuzzypos({list}, {str} [, {dict}]) *matchfuzzypos()* Same as |matchfuzzy()|, but returns the list of matched - strings and the list of character positions where characters - in {str} matches. + strings, the list of character positions where characters + in {str} matches and a list of matching scores. You can + use |byteidx()|to convert a character position to a byte + position. If {str} matches multiple times in a string, then only the positions for the best match is returned. If there are no matching strings or there is an error, then a - list with two empty list items is returned. + list with three empty list items is returned. Example: > :echo matchfuzzypos(['testing'], 'tsg') -< results in [['testing'], [[0, 2, 6]]] > +< results in [['testing'], [[0, 2, 6]], [99]] > :echo matchfuzzypos(['clay', 'lacy'], 'la') -< results in [['lacy', 'clay'], [[0, 1], [1, 2]]] > +< results in [['lacy', 'clay'], [[0, 1], [1, 2]], [153, 133]] > :echo [{'text': 'hello', 'id' : 10}]->matchfuzzypos('ll', {'key' : 'text'}) -< results in [{'id': 10, 'text': 'hello'}] [[2, 3]] +< results in [[{'id': 10, 'text': 'hello'}], [[2, 3]], [127]] matchlist({expr}, {pat} [, {start} [, {count}]]) *matchlist()* Same as |match()|, but return a |List|. The first item in the @@ -7489,8 +7628,10 @@ < *max()* -max({expr}) Return the maximum value of all items in {expr}. - {expr} can be a |List| or a |Dictionary|. For a Dictionary, +max({expr}) Return the maximum value of all items in {expr}. Example: > + echo max([apples, pears, oranges]) + +< {expr} can be a |List| or a |Dictionary|. For a Dictionary, it returns the maximum of all values in the Dictionary. If {expr} is neither a List nor a Dictionary, or one of the items in {expr} cannot be used as a Number this results in @@ -7560,8 +7701,10 @@ < *min()* -min({expr}) Return the minimum value of all items in {expr}. - {expr} can be a |List| or a |Dictionary|. For a Dictionary, +min({expr}) Return the minimum value of all items in {expr}. Example: > + echo min([apples, pears, oranges]) + +< {expr} can be a |List| or a |Dictionary|. For a Dictionary, it returns the minimum of all values in the Dictionary. If {expr} is neither a List nor a Dictionary, or one of the items in {expr} cannot be used as a Number this results in @@ -7578,13 +7721,13 @@ necessary. Otherwise it must be "". If {prot} is given it is used to set the protection bits of - the new directory. The default is 0755 (rwxr-xr-x: r/w for - the user readable for others). Use 0700 to make it unreadable - for others. This is only used for the last part of {name}. - Thus if you create /tmp/foo/bar then /tmp/foo will be created - with 0755. + the new directory. The default is 0o755 (rwxr-xr-x: r/w for + the user, readable for others). Use 0o700 to make it + unreadable for others. This is only used for the last part of + {name}. Thus if you create /tmp/foo/bar then /tmp/foo will be + created with 0o755. Example: > - :call mkdir($HOME . "/tmp/foo/bar", "p", 0700) + :call mkdir($HOME . "/tmp/foo/bar", "p", 0o700) < This function is not available in the |sandbox|. @@ -7592,8 +7735,8 @@ flag is passed (since patch 8.0.1708). However, without the "p" option the call will fail. - The function result is a Number, which is 1 if the call was - successful or 0 if the directory creation failed or partly + The function result is a Number, which is TRUE if the call was + successful or FALSE if the directory creation failed or partly failed. Not available on all systems. To check use: > @@ -8138,6 +8281,14 @@ :echo rand(seed) :echo rand(seed) % 16 " random number 0 - 15 < + +readblob({fname}) *readblob()* + Read file {fname} in binary mode and return a |Blob|. + When the file can't be opened an error message is given and + the result is an empty |Blob|. + Also see |readfile()| and |writefile()|. + + readdir({directory} [, {expr} [, {dict}]]) *readdir()* Return a list with file and directory names in {directory}. You can also use |glob()| if you don't need to do complicated @@ -8252,6 +8403,7 @@ Can also be used as a |method|: > GetDirName()->readdirex() < + *readfile()* readfile({fname} [, {type} [, {max}]]) Read file {fname} and return a |List|, each line of the file @@ -8263,8 +8415,6 @@ - When the last line ends in a NL an extra empty list item is added. - No CR characters are removed. - When {type} contains "B" a |Blob| is returned with the binary - data of the file unmodified. Otherwise: - CR characters that appear before a NL are removed. - Whether the last line ends in a NL or not does not matter. @@ -8282,6 +8432,9 @@ Note that without {max} the whole file is read into memory. Also note that there is no recognition of encoding. Read a file into a buffer if you need to. + Deprecated (use |readblob()| instead): When {type} contains + "B" a |Blob| is returned with the binary data of the file + unmodified. When the file can't be opened an error message is given and the result is an empty list. Also see |writefile()|. @@ -8319,15 +8472,18 @@ Returns an empty string when not recording. See |q|. reltime([{start} [, {end}]]) *reltime()* - Return an item that represents a time value. The format of - the item depends on the system. It can be passed to - |reltimestr()| to convert it to a string or |reltimefloat()| - to convert to a Float. - Without an argument it returns the current time. + Return an item that represents a time value. The item is a + list with items that depend on the system. In Vim 9 script + list can be used. + The item can be passed to |reltimestr()| to convert it to a + string or |reltimefloat()| to convert to a Float. + + Without an argument reltime() returns the current time. With one argument is returns the time passed since the time specified in the argument. With two arguments it returns the time passed between {start} and {end}. + The {start} and {end} arguments must be values returned by reltime(). @@ -8645,6 +8801,7 @@ the following mappings: > nnoremap GG ":echom ".screencol()."\n" nnoremap GG :echom screencol() + nnoremap GG echom screencol() < screenpos({winid}, {lnum}, {col}) *screenpos()* The result is a Dict with the screen position of the text @@ -8712,11 +8869,16 @@ 'ignorecase', 'smartcase' and 'magic' are used. - When the 'z' flag is not given, searching always starts in - column zero and then matches before the cursor are skipped. - When the 'c' flag is present in 'cpo' the next search starts - after the match. Without the 'c' flag the next search starts - one column further. + When the 'z' flag is not given, forward searching always + starts in column zero and then matches before the cursor are + skipped. When the 'c' flag is present in 'cpo' the next + search starts after the match. Without the 'c' flag the next + search starts one column further. This matters for + overlapping matches. + When searching backwards and the 'z' flag is given then the + search starts in column zero, thus no match in the current + line will be found (unless wrapping around the end of the + file). When the {stopline} argument is given then the search stops after searching this line. This is useful to restrict the @@ -8898,7 +9060,7 @@ result. if search exceeded total count, "total" value becomes `maxcount + 1` - (default: 0) + (default: 99) pos |List| `[lnum, col, off]` value when recomputing the result. this changes "current" result @@ -9050,6 +9212,7 @@ Send a reply string to {clientid}. The most recent {clientid} that sent a string can be retrieved with expand(""). {only available when compiled with the |+clientserver| feature} + Returns zero for success, -1 for failure. Note: This id has to be stored before the next command can be received. I.e. before returning from the received command and @@ -9138,6 +9301,19 @@ < You can use the script $VIMRUNTIME/tools/emoji_list.vim to see the effect for known emoji characters. +setcharpos({expr}, {list}) *setcharpos()* + Same as |setpos()| but uses the specified column number as the + character index instead of the byte index in the line. + + Example: + With the text "여보세요" in line 8: > + call setcharpos('.', [0, 8, 4, 0]) +< positions the cursor on the fourth character 'ìš”'. > + call setpos('.', [0, 8, 4, 0]) +< positions the cursor on the second character 'ë³´'. + + Can also be used as a |method|: > + GetPosition()->setcharpos('.') setcharsearch({dict}) *setcharsearch()* Set the current character search information to {dict}, @@ -9174,12 +9350,27 @@ before inserting the resulting text. When the number is too big the cursor is put at the end of the line. A number smaller than one has undefined results. - Returns 0 when successful, 1 when not editing the command - line. + Returns FALSE when successful, TRUE when not editing the + command line. Can also be used as a |method|: > GetPos()->setcmdpos() +setcursorcharpos({lnum}, {col} [, {off}]) *setcursorcharpos()* +setcursorcharpos({list}) + Same as |cursor()| but uses the specified column number as the + character index instead of the byte index in the line. + + Example: + With the text "여보세요" in line 4: > + call setcursorcharpos(4, 3) +< positions the cursor on the third character '세'. > + call cursor(4, 3) +< positions the cursor on the first character 'ì—¬'. + + Can also be used as a |method|: > + GetCursorPos()->setcursorcharpos() + setenv({name}, {val}) *setenv()* Set environment variable {name} to {val}. When {val} is |v:null| the environment variable is deleted. @@ -9219,8 +9410,8 @@ When {lnum} is just below the last line the {text} will be added below the last line. - If this succeeds, 0 is returned. If this fails (most likely - because {lnum} is invalid) 1 is returned. + If this succeeds, FALSE is returned. If this fails (most likely + because {lnum} is invalid) TRUE is returned. Example: > :call setline(5, strftime("%c")) @@ -9291,7 +9482,8 @@ "lnum" and "col" are the position in the buffer. The first column is 1. Use a zero "lnum" to delete a mark. If "col" is - smaller than 1 then 1 is used. + smaller than 1 then 1 is used. To use the character count + instead of the byte count, use |setcharpos()|. The "off" number is only used when 'virtualedit' is set. Then it is the offset in screen columns from the start of the @@ -9311,7 +9503,7 @@ Returns 0 when the position could be set, -1 otherwise. An error message is given if {expr} is invalid. - Also see |getpos()| and |getcurpos()|. + Also see |setcharpos()|, |getpos()| and |getcurpos()|. This does not restore the preferred column for moving vertically; if you set the cursor position with this, |j| and @@ -9686,6 +9878,18 @@ {only available when compiled with the |+float| feature} +slice({expr}, {start} [, {end}]) *slice()* + Similar to using a |slice| "expr[start : end]", but "end" is + used exclusive. And for a string the indexes are used as + character indexes instead of byte indexes, like in + |vim9script|. + When {end} is omitted the slice continues to the last item. + When {end} is -1 the last item is omitted. + + Can also be used as a |method|: > + GetList()->slice(offset) + + sort({list} [, {func} [, {dict}]]) *sort()* *E702* Sort the items in {list} in-place. Returns {list}. @@ -9700,8 +9904,25 @@ When {func} is given and it is '1' or 'i' then case is ignored. + When {func} is given and it is 'l' then the current collation + locale is used for ordering. Implementation details: strcoll() + is used to compare strings. See |:language| check or set the + collation locale. |v:collate| can also be used to check the + current locale. Sorting using the locale typically ignores + case. Example: > + " ö is sorted similarly to o with English locale. + :language collate en_US.UTF8 + :echo sort(['n', 'o', 'O', 'ö', 'p', 'z'], 'l') +< ['n', 'o', 'O', 'ö', 'p', 'z'] ~ +> + " ö is sorted after z with Swedish locale. + :language collate sv_SE.UTF8 + :echo sort(['n', 'o', 'O', 'ö', 'p', 'z'], 'l') +< ['n', 'o', 'O', 'p', 'z', 'ö'] ~ + This does not work properly on Mac. + When {func} is given and it is 'n' then all items will be - sorted numerical (Implementation detail: This uses the + sorted numerical (Implementation detail: this uses the strtod() function to parse numbers, Strings, Lists, Dicts and Funcrefs will be considered as being 0). @@ -10613,7 +10834,7 @@ taglist({expr} [, {filename}]) *taglist()* - Returns a list of tags matching the regular expression {expr}. + Returns a |List| of tags matching the regular expression {expr}. If {filename} is passed it is used to prioritize the results in the same way that |:tselect| does. See |tag-priority|. @@ -10705,7 +10926,7 @@ terminalprops() *terminalprops()* - Returns a dictionary with properties of the terminal that Vim + Returns a |Dictionary| with properties of the terminal that Vim detected from the response to |t_RV| request. See |v:termresponse| for the response itself. If |v:termresponse| is empty most values here will be 'u' for unknown. @@ -10794,6 +11015,8 @@ function or a |Funcref|. It is called with one argument, which is the timer ID. The callback is only invoked when Vim is waiting for input. + If you want to show a message look at |popup_notification()| + to avoid interfering with what the user is doing. {options} is a dictionary. Supported entries: "repeat" Number of times to repeat calling the @@ -10946,6 +11169,14 @@ < Can also be used as a |method|: > mylist->type() + +typename({expr}) *typename()* + Return a string representation of the type of {expr}. + Example: > + echo typename([1, 2, 3]) + list + + undofile({name}) *undofile()* Return the name of the undo file that would be used for a file with name {name} when writing. This uses the 'undodir' @@ -11103,16 +11334,18 @@ call win_execute(winid, 'set syntax=python') < Doing the same with `setwinvar()` would not trigger autocommands and not actually show syntax highlighting. + *E994* Not all commands are allowed in popup windows. - When window {id} does not exist then no error is given. + When window {id} does not exist then no error is given and + an empty string is returned. Can also be used as a |method|, the base is passed as the second argument: > GetCommand()->win_execute(winid) win_findbuf({bufnr}) *win_findbuf()* - Returns a list with |window-ID|s for windows that contain + Returns a |List| with |window-ID|s for windows that contain buffer {bufnr}. When there is none the list is empty. Can also be used as a |method|: > @@ -11153,7 +11386,7 @@ win_gotoid({expr}) *win_gotoid()* Go to window with ID {expr}. This may also change the current tabpage. - Return 1 if successful, 0 if the window cannot be found. + Return TRUE if successful, FALSE if the window cannot be found. Can also be used as a |method|: > GetWinid()->win_gotoid() @@ -11586,7 +11819,7 @@ mksession Compiled with support for |:mksession|. modify_fname Compiled with file name modifiers. |filename-modifiers| (always true) -mouse Compiled with support mouse. +mouse Compiled with support for mouse. mouse_dec Compiled with support for Dec terminal mouse. mouse_gpm Compiled with support for gpm (Linux console mouse) mouse_gpm_enabled GPM mouse is working @@ -12871,7 +13104,7 @@ :exe[cute] {expr1} .. Executes the string that results from the evaluation of {expr1} as an Ex command. Multiple arguments are concatenated, with a space in - between. To avoid the extra space use the "." + between. To avoid the extra space use the ".." operator to concatenate strings into one argument. {expr1} is used as the processed command, command line editing keys are not recognized. diff -Nru vim-8.2.1913/runtime/doc/filetype.txt vim-8.2.2434/runtime/doc/filetype.txt --- vim-8.2.1913/runtime/doc/filetype.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/filetype.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*filetype.txt* For Vim version 8.2. Last change: 2020 Sep 28 +*filetype.txt* For Vim version 8.2. Last change: 2021 Jan 21 VIM REFERENCE MANUAL by Bram Moolenaar @@ -147,6 +147,7 @@ *.w g:filetype_w |ft-cweb-syntax| *.i g:filetype_i |ft-progress-syntax| *.p g:filetype_p |ft-pascal-syntax| + *.pp g:filetype_pp |ft-pascal-syntax| *.sh g:bash_is_sh |ft-sh-syntax| *.tex g:tex_flavor |ft-tex-plugin| @@ -563,16 +564,15 @@ MAN *ft-man-plugin* *:Man* *man.vim* -Displays a manual page in a nice way. Also see the user manual -|find-manpage|. - -To start using the ":Man" command before any manual page was loaded, source -this script from your startup vimrc file: > +This plugin displays a manual page in a nice way. See |find-manpage| in the +user manual for more information. +To start using the |:Man| command before any manual page has been loaded, +source this script from your startup |vimrc| file: > runtime ftplugin/man.vim Options: -'iskeyword' the '.' character is added to be able to use CTRL-] on the +'iskeyword' The '.' character is added to support the use of CTRL-] on the manual page name. Commands: @@ -582,24 +582,25 @@ Global mapping: K Displays the manual page for the word under the cursor. -ManPreGetPage idem, allows for using a mapping: > - nmap ManPreGetPage +ManPreGetPage + idem, allows for using a mapping: > + nmap ManPreGetPage Local mappings: CTRL-] Jump to the manual page for the word under the cursor. CTRL-T Jump back to the previous manual page. -q Same as ":quit" +q Same as the |:quit| command. To use a vertical split instead of horizontal: > let g:ft_man_open_mode = 'vert' To use a new tab: > let g:ft_man_open_mode = 'tab' -To enable folding use this: > - let g:ft_man_folding_enable = 1 -If you do not like the default folding, use an autocommand to add your desired +To enable |folding|, use this: > + let g:ft_man_folding_enable = 1 +If you do not like the default folding, use an |autocommand| to add your desired folding style instead. For example: > - autocmd FileType man setlocal foldmethod=indent foldenable + autocmd FileType man setlocal foldmethod=indent foldenable If you would like :Man {number} {name} to behave like man {number} {name} by not running man {name} if no page is found, then use this: > @@ -612,7 +613,7 @@ MANPAGER *manpager.vim* -The :Man command allows you to turn Vim into a manpager (that syntax highlights +The |:Man| command allows you to turn Vim into a manpager (that syntax highlights manpages and follows linked manpages on hitting CTRL-]). For bash,zsh,ksh or dash, add to the config file (.bashrc,.zshrc, ...) diff -Nru vim-8.2.1913/runtime/doc/helphelp.txt vim-8.2.2434/runtime/doc/helphelp.txt --- vim-8.2.1913/runtime/doc/helphelp.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/helphelp.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*helphelp.txt* For Vim version 8.2. Last change: 2020 Jul 27 +*helphelp.txt* For Vim version 8.2. Last change: 2020 Dec 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -92,9 +92,9 @@ :help k| only < Note that a space before the '|' is seen as part of the ":help" argument. - You can also use or to separate the help + You can also use or to separate the help command from a following command. You need to type - CTRL-V first to insert the or . Example: > + CTRL-V first to insert the or . Example: > :help soonly :h[elp]! [subject] Like ":help", but in non-English help files prefer to @@ -158,9 +158,31 @@ will be opened. Otherwise the specified tag is searched for in all "doc/tags" files in the directories specified in the 'runtimepath' option. +If you would like to open the help in the current window, see this tip: +|help-curwin|. + The initial height of the help window can be set with the 'helpheight' option (default 20). +When the help buffer is created, several local options are set to make sure +the help text is displayed as it was intended: + 'iskeyword' nearly all ASCII chars except ' ', '*', '"' and '|' + 'foldmethod' "manual" + 'tabstop' 8 + 'arabic' off + 'binary' off + 'buflisted' off + 'cursorbind' off + 'diff' off + 'foldenable' off + 'list' off + 'modifiable' off + 'number' off + 'relativenumber' off + 'rightleft' off + 'scrollbind' off + 'spell' off + Jump to specific subjects by using tags. This can be done in two ways: - Use the "CTRL-]" command while standing on the name of a command or option. This only works when the tag is a keyword. "" and diff -Nru vim-8.2.1913/runtime/doc/index.txt vim-8.2.2434/runtime/doc/index.txt --- vim-8.2.1913/runtime/doc/index.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/index.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*index.txt* For Vim version 8.2. Last change: 2020 Oct 05 +*index.txt* For Vim version 8.2. Last change: 2021 Jan 15 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1590,6 +1590,8 @@ |:sign| :sig[n] manipulate signs |:silent| :sil[ent] run a command silently |:sleep| :sl[eep] do nothing for a few seconds +|:sleep!| :sl[eep]! do nothing for a few seconds, without the + cursor visible |:slast| :sla[st] split window and go to last file in the argument list |:smagic| :sm[agic] :substitute with 'magic' diff -Nru vim-8.2.1913/runtime/doc/intro.txt vim-8.2.2434/runtime/doc/intro.txt --- vim-8.2.1913/runtime/doc/intro.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/intro.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*intro.txt* For Vim version 8.2. Last change: 2020 Aug 15 +*intro.txt* For Vim version 8.2. Last change: 2020 Dec 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -434,7 +434,7 @@ command sequence intro ALT-Esc 155 ** CSI when typed in the GUI ** - end-of-line (can be , or , + end-of-line (can be , or , depends on system and 'fileformat') ** cursor-up *cursor-up* *cursor_up* @@ -678,8 +678,8 @@ Normal mode, without causing a beep like would. However, this does not work in Ex mode. When used after a command that takes an argument, such as |f| or |m|, the timeout set with 'ttimeoutlen' applies. -When focus is in a terminal window, CTRL-\ CTRL-N goes to Normal mode for only -one command, see |t_CTRL-\_CTRL-N|. +When focus is in a terminal window, CTRL-\ CTRL-N goes to Normal mode until an +edit command is entered, see |t_CTRL-\_CTRL-N|. *CTRL-\_CTRL-G* *i_CTRL-\_CTRL-G* *c_CTRL-\_CTRL-G* *v_CTRL-\_CTRL-G* The command CTRL-\ CTRL-G or can be used to go to Insert mode when diff -Nru vim-8.2.1913/runtime/doc/map.txt vim-8.2.2434/runtime/doc/map.txt --- vim-8.2.1913/runtime/doc/map.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/map.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*map.txt* For Vim version 8.2. Last change: 2020 Oct 07 +*map.txt* For Vim version 8.2. Last change: 2020 Dec 10 VIM REFERENCE MANUAL by Bram Moolenaar @@ -271,7 +271,7 @@ - The |:normal| command. - Moving the cursor is allowed, but it is restored afterwards. If you want the mapping to do any of these let the returned characters do -that. +that, or use a || mapping instead. You can use getchar(), it consumes typeahead if there is any. E.g., if you have these mappings: > @@ -303,6 +303,43 @@ Note that using 0x80 as a single byte before other text does not work, it will be seen as a special key. + ** *:map-cmd* +The special text begins a "command mapping", it executes the command +directly without changing modes. Where you might use ":..." in the +{rhs} of a mapping, you can instead use "...". +Example: > + noremap x echo mode(1) +< +This is more flexible than `:` in Visual and Operator-pending mode, or +`:` in Insert mode, because the commands are executed directly in the +current mode, instead of always going to Normal mode. Visual mode is +preserved, so tricks with |gv| are not needed. Commands can be invoked +directly in Command-line mode (which would otherwise require timer hacks). +Example of using halfway Insert mode: > + nnoremap aText echo mode(1) Added + +Unlike mappings, there are no special restrictions on the +command: it is executed as if an (unrestricted) |autocommand| was invoked. + +Note: +- Because avoids mode-changes it does not trigger |CmdlineEnter| and + |CmdlineLeave| events, because no user interaction is expected. +- For the same reason, |keycodes| like are interpreted as plain, + unmapped keys. +- The command is not echo'ed, no need for . +- In Visual mode you can use `line('v')` and `col('v')` to get one end of the + Visual area, the cursor is at the other end. +- In Select mode, |:map| and |:vmap| command mappings are executed in + Visual mode. Use |:smap| to handle Select mode differently. + + *E1135* *E1136* + commands must terminate, that is, they must be followed by in the +{rhs} of the mapping definition. |Command-line| mode is never entered. + + *E1137* + commands can have only normal characters and cannot contain special +characters like function keys. + 1.3 MAPPING AND MODES *:map-modes* *mapmode-nvo* *mapmode-n* *mapmode-v* *mapmode-o* @@ -872,7 +909,7 @@ 1.12 MAPPING AN OPERATOR *:map-operator* An operator is used before a {motion} command. To define your own operator -you must create mapping that first sets the 'operatorfunc' option and then +you must create a mapping that first sets the 'operatorfunc' option and then invoke the |g@| operator. After the user types the {motion} command the specified function will be called. @@ -1204,9 +1241,9 @@ If you need to get the script number to use in a complicated script, you can use this function: > - function s:SID() - return matchstr(expand(''), '\zs\d\+\ze_SID$') - endfun + func s:ScriptNumber() + return matchstr(expand(''), '\zs\d\+\ze_') + endfunc The "" will be shown when listing functions and mappings. This is useful to find out what they are defined to. @@ -1284,15 +1321,15 @@ See |:verbose-cmd| for more information. *E174* *E182* -:com[mand][!] [{attr}...] {cmd} {rep} +:com[mand][!] [{attr}...] {cmd} {repl} Define a user command. The name of the command is - {cmd} and its replacement text is {rep}. The command's - attributes (see below) are {attr}. If the command - already exists, an error is reported, unless a ! is - specified, in which case the command is redefined. - There is one exception: When sourcing a script again, - a command that was previously defined in that script - will be silently replaced. + {cmd} and its replacement text is {repl}. The + command's attributes (see below) are {attr}. If the + command already exists, an error is reported, unless a + ! is specified, in which case the command is + redefined. There is one exception: When sourcing a + script again, a command that was previously defined in + that script will be silently replaced. :delc[ommand] {cmd} *:delc* *:delcommand* *E184* @@ -1502,11 +1539,11 @@ Replacement text ~ -The replacement text for a user defined command is scanned for special escape -sequences, using <...> notation. Escape sequences are replaced with values -from the entered command line, and all other text is copied unchanged. The -resulting string is executed as an Ex command. To avoid the replacement use - in place of the initial <. Thus to include "" literally use +The replacement text {repl} for a user defined command is scanned for special +escape sequences, using <...> notation. Escape sequences are replaced with +values from the entered command line, and all other text is copied unchanged. +The resulting string is executed as an Ex command. To avoid the replacement +use in place of the initial <. Thus to include "" literally use "bang>". The valid escape sequences are @@ -1632,6 +1669,11 @@ This will invoke: > :call Allargs("%s/foo/bar/ge|update") < +If the command is defined in Vim9 script (a script that starts with +`:vim9script` and in a `:def` function) then {repl} will be executed as in Vim9 +script. Thus this depends on where the command is defined, not where it is +used. + When defining a user command in a script, it will be able to call functions local to the script and use mappings local to the script. When the user invokes the user command, it will run in the context of the script it was diff -Nru vim-8.2.1913/runtime/doc/message.txt vim-8.2.2434/runtime/doc/message.txt --- vim-8.2.1913/runtime/doc/message.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/message.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*message.txt* For Vim version 8.2. Last change: 2020 Sep 07 +*message.txt* For Vim version 8.2. Last change: 2020 Dec 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -794,6 +794,9 @@ -> Press or to redraw the screen and continue, without that key being used otherwise. -> Press ':' or any other Normal mode command character to start that command. + Note that after an external command some special keys, such as the cursor + keys, may not work normally, because the terminal is still set to a state + for executing the external command. -> Press 'k', , 'u', 'b' or 'g' to scroll back in the messages. This works the same way as at the |more-prompt|. Only works when 'compatible' is off and 'more' is on. diff -Nru vim-8.2.1913/runtime/doc/netbeans.txt vim-8.2.2434/runtime/doc/netbeans.txt --- vim-8.2.1913/runtime/doc/netbeans.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/netbeans.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*netbeans.txt* For Vim version 8.2. Last change: 2020 Aug 15 +*netbeans.txt* For Vim version 8.2. Last change: 2020 Nov 02 VIM REFERENCE MANUAL by Gordon Prieur et al. @@ -562,9 +562,10 @@ saved directly by the Vim Controller. New in version 2.3. -setReadOnly - Set a file as readonly - Implemented in version 2.3. +setReadOnly readonly + When the boolean argument "readonly" is "T" for True, mark the + buffer as readonly, when it is "F" for False, mark it as not + readonly. Implemented in version 2.3. setStyle Not implemented. diff -Nru vim-8.2.1913/runtime/doc/options.txt vim-8.2.2434/runtime/doc/options.txt --- vim-8.2.1913/runtime/doc/options.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/options.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*options.txt* For Vim version 8.2. Last change: 2020 Oct 10 +*options.txt* For Vim version 8.2. Last change: 2021 Jan 08 VIM REFERENCE MANUAL by Bram Moolenaar @@ -438,7 +438,7 @@ CTRL-? CTRL-H not CTRL-? CTRL-? - (CTRL-? is 0177 octal, 0x7f hex) + (CTRL-? is 0o177 octal, 0x7f hex) If your delete key terminal code is wrong, but the code for backspace is alright, you can put this in @@ -2801,6 +2801,7 @@ toggled each time the flag is given. See |complex-change|. See also 'gdefault' option. Switching this option on may break plugins! + This option is not used in |Vim9| script. *'emoji'* *'emo'* *'noemoji'* *'noemo'* 'emoji' 'emo' boolean (default: on) @@ -3121,7 +3122,7 @@ local to buffer This gives the of the current buffer, which is used for reading/writing the buffer from/to a file: - dos + dos unix mac When "dos" is used, CTRL-Z at the end of a file is ignored. @@ -3272,7 +3273,7 @@ See the 'endofline' option. *'fkmap'* *'fk'* *'nofkmap'* *'nofk'* -'fkmap' 'fk' boolean (default off) *E198* +'fkmap' 'fk' boolean (default off) global {only available when compiled with the |+rightleft| feature} @@ -3570,6 +3571,7 @@ DEPRECATED: Setting this option may break plugins that are not aware of this option. Also, many users get confused that adding the /g flag has the opposite effect of that it normally does. + This option is not used in |Vim9| script. *'grepformat'* *'gfm'* 'grepformat' 'gfm' string (default "%f:%l:%m,%f:%l%m,%f %l%m") @@ -4943,6 +4945,8 @@ Only switch it off when working with old Vi scripts. In any other situation write patterns that work when 'magic' is on. Include "\M" when you want to |/\M|. + In |Vim9| script the value of 'magic' is ignored, patterns behave like + it is always set. *'makeef'* *'mef'* 'makeef' 'mef' string (default: "") @@ -5217,7 +5221,7 @@ NOTE: This option is set to the Vi default value when 'compatible' is set and to the Vim default value when 'compatible' is reset. - *'mouse'* *E538* + *'mouse'* 'mouse' string (default "", "a" for GUI and Win32, set to "a" or "nvi" in |defaults.vim|) global @@ -6317,7 +6321,9 @@ local to window Number of lines to scroll with CTRL-U and CTRL-D commands. Will be set to half the number of lines in the window when the window size - changes. If you give a count to the CTRL-U or CTRL-D command it will + changes. This may happen when enabling the |status-line| or + 'tabline' option after setting the 'scroll' option. + If you give a count to the CTRL-U or CTRL-D command it will be used as the new value for 'scroll'. Reset to half the window height with ":set scroll=0". diff -Nru vim-8.2.1913/runtime/doc/os_vms.txt vim-8.2.2434/runtime/doc/os_vms.txt --- vim-8.2.1913/runtime/doc/os_vms.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/os_vms.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*os_vms.txt* For Vim version 8.2. Last change: 2020 Jun 07 +*os_vms.txt* For Vim version 8.2. Last change: 2021 Jan 04 VIM REFERENCE MANUAL @@ -72,7 +72,7 @@ 4. Problems *vms-problems* The code has been tested under Open VMS 6.2 - 8.2 on Alpha, VAX and IA64 -platforms with the DEC C compiler. It should work without big problems. +platforms with the DEC C compiler. It should work without major problems. If your system does not have some include libraries you can tune up in OS_VMS_CONF.H file. @@ -765,6 +765,15 @@ 9. VMS related changes *vms-changes* +Version 8.2 +- make all changes needed for clean compile build of v8.2 on VMS on all platforms +- fix the call mkdir bug (vicente_polo@yahoo.es) +- test on VSI OpenVMS Alpha and Itanium platforms +- added LUA support +- added XPM support - Motif GUI with toolbar on all platforms +- XPM v3.4.11 libraries for IA64, AXP and VAX are added +- start integrating the new test scripts + Version 8.1 - make necessary changes to build v8.1 on VMS diff -Nru vim-8.2.1913/runtime/doc/pattern.txt vim-8.2.2434/runtime/doc/pattern.txt --- vim-8.2.1913/runtime/doc/pattern.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/pattern.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*pattern.txt* For Vim version 8.2. Last change: 2020 Sep 01 +*pattern.txt* For Vim version 8.2. Last change: 2021 Jan 08 VIM REFERENCE MANUAL by Bram Moolenaar @@ -361,8 +361,8 @@ */atom* 5. An atom can be one of a long list of items. Many atoms match one character in the text. It is often an ordinary character or a character class. - Braces can be used to make a pattern into an atom. The "\z(\)" construct - is only for syntax highlighting. + Parentheses can be used to make a pattern into an atom. The "\z(\)" + construct is only for syntax highlighting. atom ::= ordinary-atom |/ordinary-atom| or \( pattern \) |/\(| @@ -394,15 +394,19 @@ ============================================================================== 3. Magic */magic* -Some characters in the pattern are taken literally. They match with the same -character in the text. When preceded with a backslash however, these -characters get a special meaning. +Some characters in the pattern, such as letters, are taken literally. They +match exactly the same character in the text. When preceded with a backslash +however, these characters may get a special meaning. For example, "a" matches +the letter "a", while "\a" matches any alphabetic character. Other characters have a special meaning without a backslash. They need to be -preceded with a backslash to match literally. +preceded with a backslash to match literally. For example "." matches any +character while "\." matches a dot. If a character is taken literally or not depends on the 'magic' option and the -items mentioned next. +items in the pattern mentioned next. The 'magic' option should always be set, +but it can be switched off for Vi compatibility. We mention the effect of +'nomagic' here for completeness, but we recommend against using that. */\m* */\M* Use of "\m" makes the pattern after it be interpreted as if 'magic' is set, ignoring the actual value of the 'magic' option. @@ -411,30 +415,28 @@ Use of "\v" means that after it, all ASCII characters except '0'-'9', 'a'-'z', 'A'-'Z' and '_' have special meaning: "very magic" -Use of "\V" means that after it, only a backslash and terminating character -(usually / or ?) have special meaning: "very nomagic" +Use of "\V" means that after it, only a backslash and the terminating +character (usually / or ?) have special meaning: "very nomagic" Examples: after: \v \m \M \V matches ~ 'magic' 'nomagic' - $ $ $ \$ matches end-of-line - . . \. \. matches any character + a a a a literal 'a' + \a \a \a \a any alphabetic character + . . \. \. any character + \. \. . . literal dot + $ $ $ \$ end-of-line * * \* \* any number of the previous atom ~ ~ \~ \~ latest substitute string - () \(\) \(\) \(\) grouping into an atom - | \| \| \| separating alternatives - \a \a \a \a alphabetic character + () \(\) \(\) \(\) group as an atom + | \| \| \| nothing: separates alternatives \\ \\ \\ \\ literal backslash - \. \. . . literal dot - \{ { { { literal '{' - a a a a literal 'a' + \{ { { { literal curly brace {only Vim supports \m, \M, \v and \V} -It is recommended to always keep the 'magic' option at the default setting, -which is 'magic'. This avoids portability problems. To make a pattern immune -to the 'magic' option being set or not, put "\m" or "\M" at the start of the -pattern. +If you want to you can make a pattern immune to the 'magic' option being set +or not by putting "\m" or "\M" at the start of the pattern. ============================================================================== 4. Overview of pattern items *pattern-overview* @@ -676,7 +678,7 @@ Note that using "\&" works the same as using "\@=": "foo\&.." is the same as "\(foo\)\@=..". But using "\&" is easier, you don't need the - braces. + parentheses. */\@!* @@ -1069,8 +1071,8 @@ [] (with 'nomagic': \[]) */[]* */\[]* */\_[]* */collection* \_[] - A collection. This is a sequence of characters enclosed in brackets. - It matches any single character in the collection. + A collection. This is a sequence of characters enclosed in square + brackets. It matches any single character in the collection. Example matches ~ [xyz] any 'x', 'y' or 'z' [a-zA-Z]$ any alphabetic character at the end of a line @@ -1129,11 +1131,12 @@ *[:ident:]* [:ident:] identifier character (same as "\i") *[:keyword:]* [:keyword:] keyword character (same as "\k") *[:fname:]* [:fname:] file name character (same as "\f") - The brackets in character class expressions are additional to the - brackets delimiting a collection. For example, the following is a - plausible pattern for a UNIX filename: "[-./[:alnum:]_~]\+" That is, - a list of at least one character, each of which is either '-', '.', - '/', alphabetic, numeric, '_' or '~'. + The square brackets in character class expressions are additional to + the square brackets delimiting a collection. For example, the + following is a plausible pattern for a UNIX filename: + "[-./[:alnum:]_~]\+". That is, a list of at least one character, + each of which is either '-', '.', '/', alphabetic, numeric, '_' or + '~'. These items only work for 8-bit characters, except [:lower:] and [:upper:] also work for multibyte characters when using the new regexp engine. See |two-engines|. In the future these items may @@ -1176,7 +1179,7 @@ \b \n line break, see above |/[\n]| \d123 decimal number of character - \o40 octal number of character up to 0377 + \o40 octal number of character up to 0o377 \x20 hexadecimal number of character up to 0xff \u20AC hex. number of multibyte character up to 0xffff \U1234 hex. number of multibyte character up to 0xffffffff @@ -1214,7 +1217,8 @@ \%d123 Matches the character specified with a decimal number. Must be followed by a non-digit. \%o40 Matches the character specified with an octal number up to 0377. - Numbers below 040 must be followed by a non-octal digit or a non-digit. + Numbers below 0o40 must be followed by a non-octal digit or a + non-digit. \%x2a Matches the character specified with up to two hexadecimal characters. \%u20AC Matches the character specified with up to four hexadecimal characters. diff -Nru vim-8.2.1913/runtime/doc/popup.txt vim-8.2.2434/runtime/doc/popup.txt --- vim-8.2.1913/runtime/doc/popup.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/popup.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*popup.txt* For Vim version 8.2. Last change: 2020 Oct 17 +*popup.txt* For Vim version 8.2. Last change: 2021 Jan 21 VIM REFERENCE MANUAL by Bram Moolenaar @@ -101,7 +101,7 @@ Normally the plugin that created the popup window is also in charge of closing it. If somehow a popup hangs around, you can close all of them with: > - call popup_clear() + call popup_clear(1) Some popups, such as notifications, close after a specified time. This can be set with the "time" property on `popup_create()`. Otherwise, a popup can be closed by clicking on the X in the top-right corner @@ -309,8 +309,8 @@ popup_filter_menu({id}, {key}) *popup_filter_menu()* Filter that can be used for a popup. These keys can be used: - j select item below - k select item above + j select item below + k select item above accept current selection x Esc CTRL-C cancel the menu Other keys are ignored. @@ -588,8 +588,6 @@ If you want to create a new buffer yourself use |bufadd()| and pass the buffer number to popup_create(). -It is not possible to use the buffer of a terminal window. *E278* You CAN -create a hidden terminal buffer and use that one in a popup window. The second argument of |popup_create()| is a dictionary with options: line Screen line where to position the popup. Can use a diff -Nru vim-8.2.1913/runtime/doc/repeat.txt vim-8.2.2434/runtime/doc/repeat.txt --- vim-8.2.1913/runtime/doc/repeat.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/repeat.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*repeat.txt* For Vim version 8.2. Last change: 2020 Oct 09 +*repeat.txt* For Vim version 8.2. Last change: 2021 Jan 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -354,6 +354,14 @@ Vim version, or update Vim to a newer version. See |vimscript-version| for what changed between versions. +:vim9[script] [noclear] *:vim9* *:vim9script* + Marks a script file as containing |Vim9-script| + commands. Also see |vim9-namespace|. + Must be the first command in the file. + For [noclear] see |vim9-reload|. + Without the |+eval| feature this changes the syntax + for some commands. + *:scr* *:scriptnames* :scr[iptnames] List all sourced script names, in the order they were first sourced. The number is used for the script ID @@ -891,8 +899,9 @@ matches ".../plugin/explorer.vim" and "explorer.vim" in any other directory. The match for functions is done against the name as it's shown in the output -of ":function". For local functions this means that something like "99_" -is prepended. +of ":function". However, for local functions the script-specific prefix such +as "99_" is ignored to make it easier to match script-local functions +without knowing the ID of the script. Note that functions are first loaded and later executed. When they are loaded the "file" breakpoints are checked, when they are executed the "func" @@ -947,10 +956,10 @@ Profiling means that Vim measures the time that is spent on executing functions and/or scripts. The |+profile| feature is required for this. -It is only included when Vim was compiled with "huge" features. +It is included when Vim was compiled with "huge" features. You can also use the |reltime()| function to measure time. This only requires -the |+reltime| feature, which is present more often. +the |+reltime| feature, which is present in more builds. For profiling syntax highlighting see |:syntime|. @@ -997,7 +1006,12 @@ You must always start with a ":profile start fname" command. The resulting -file is written when Vim exits. Here is an example of the output, with line +file is written when Vim exits. For example, to profile one specific +function: > + profile start /tmp/vimprofile + profile func MyFunc + +Here is an example of the output, with line numbers prepended for the explanation: 1 FUNCTION Test2() ~ diff -Nru vim-8.2.1913/runtime/doc/sign.txt vim-8.2.2434/runtime/doc/sign.txt --- vim-8.2.1913/runtime/doc/sign.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/sign.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*sign.txt* For Vim version 8.2. Last change: 2020 Aug 31 +*sign.txt* For Vim version 8.2. Last change: 2020 Oct 28 VIM REFERENCE MANUAL by Gordon Prieur @@ -81,6 +81,10 @@ independently of the sign group. The default priority for a sign is 10. The priority is assigned at the time of placing a sign. +When two signs with the same priority are present, and one has an icon or text +in the signcolumn while the other has line highlighting, then both are +displayed. + When the line on which the sign is placed is deleted, the sign is moved to the next line (or the last line of the buffer, if there is no next line). When the delete is undone the sign does not move back. @@ -458,11 +462,11 @@ entries The dictionary for each sign contains the following entries: - group sign group. Set to '' for the global group. - id identifier of the sign - lnum line number where the sign is placed - name name of the defined sign - priority sign priority + group sign group. Set to '' for the global group. + id identifier of the sign + lnum line number where the sign is placed + name name of the defined sign + priority sign priority The returned signs in a buffer are ordered by their line number and priority. diff -Nru vim-8.2.1913/runtime/doc/starting.txt vim-8.2.2434/runtime/doc/starting.txt --- vim-8.2.1913/runtime/doc/starting.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/starting.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*starting.txt* For Vim version 8.2. Last change: 2020 Sep 23 +*starting.txt* For Vim version 8.2. Last change: 2020 Dec 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -996,7 +996,7 @@ MS-Windows line separators ~ -On MS-Windows, Vim assumes that all the vimrc files have pairs as +On MS-Windows, Vim assumes that all the vimrc files have pairs as line separators. This will give problems if you have a file with only s and have a line like ":map xx yy^M". The trailing ^M will be ignored. diff -Nru vim-8.2.1913/runtime/doc/syntax.txt vim-8.2.2434/runtime/doc/syntax.txt --- vim-8.2.1913/runtime/doc/syntax.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/syntax.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*syntax.txt* For Vim version 8.2. Last change: 2020 Aug 15 +*syntax.txt* For Vim version 8.2. Last change: 2021 Jan 21 VIM REFERENCE MANUAL by Bram Moolenaar @@ -66,8 +66,8 @@ will start soon. See |'go-M'| about avoiding that. *:syn-on* *:syntax-on* -The `:syntax enable` command will keep your current color settings. This -allows using `:highlight` commands to set your preferred colors before or +The `:syntax enable` command will keep most of your current color settings. +This allows using `:highlight` commands to set your preferred colors before or after using this command. If you want Vim to overrule your settings with the defaults, use: > :syntax on @@ -2335,11 +2335,12 @@ PASCAL *pascal.vim* *ft-pascal-syntax* -Files matching "*.p" could be Progress or Pascal. If the automatic detection -doesn't work for you, or you don't edit Progress at all, use this in your -startup vimrc: > +Files matching "*.p" could be Progress or Pascal and those matching "*.pp" +could be Puppet or Pascal. If the automatic detection doesn't work for you, +or you only edit Pascal files, use this in your startup vimrc: > - :let filetype_p = "pascal" + :let filetype_p = "pascal" + :let filetype_pp = "pascal" The Pascal syntax file has been extended to take into account some extensions provided by Turbo Pascal, Free Pascal Compiler and GNU Pascal Compiler. @@ -3006,7 +3007,7 @@ (Adapted from the html.vim help text by Claudio Fleiner ) - *ft-posix-synax* *ft-dash-syntax* + *ft-posix-syntax* *ft-dash-syntax* SH *sh.vim* *ft-sh-syntax* *ft-bash-syntax* *ft-ksh-syntax* This covers syntax highlighting for the older Unix (Bourne) sh, and newer @@ -3183,6 +3184,7 @@ TEX *tex.vim* *ft-tex-syntax* *latex-syntax* + *syntax-tex* *syntax-latex* Tex Contents~ Tex: Want Syntax Folding? |tex-folding| @@ -3199,6 +3201,7 @@ Tex: Selective Conceal Mode |g:tex_conceal| Tex: Controlling iskeyword |g:tex_isk| Tex: Fine Subscript and Superscript Control |tex-supersub| + Tex: Match Check Control |tex-matchcheck| *tex-folding* *g:tex_fold_enabled* Tex: Want Syntax Folding? ~ @@ -3422,6 +3425,22 @@ < in ~/.vim/ftplugin/tex/tex.vim in order to avoid having inscrutable utf-8 glyphs appear. + *tex-matchcheck* *g:tex_matchcheck* + Tex: Match Check Control~ + + Sometimes one actually wants mismatched parentheses, square braces, + and or curly braces; for example, \text{(1,10] is a range from but + not including 1 to and including 10}. This wish, of course, conflicts + with the desire to provide delimiter mismatch detection. To + accommodate these conflicting goals, syntax/tex.vim provides > + g:tex_matchcheck = '[({[]' +< which is shown along with its default setting. So, if one doesn't + want [] and () to be checked for mismatches, try using > + let g:tex_matchcheck= '[{}]' +< If you don't want matching to occur inside bold and italicized + regions, > + let g:tex_excludematcher= 1 +< will prevent the texMatcher group from being included in those regions. TF *tf.vim* *ft-tf-syntax* @@ -5305,6 +5324,12 @@ Without the "default" in the C syntax file, the highlighting would be overruled when the syntax file is loaded. +To have a link survive `:highlight clear`, which is useful if you have +highlighting for a specific filetype and you want to keep it when selecting +another color scheme, put a command like this in the +"after/syntax/{filetype}.vim" file: > + highlight! default link cComment Question + ============================================================================== 15. Cleaning up *:syn-clear* *E391* diff -Nru vim-8.2.1913/runtime/doc/tags vim-8.2.2434/runtime/doc/tags --- vim-8.2.1913/runtime/doc/tags 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/tags 2021-01-30 22:05:11.000000000 +0000 @@ -1045,6 +1045,8 @@ 't_da' term.txt /*'t_da'* 't_db' term.txt /*'t_db'* 't_dl' term.txt /*'t_dl'* +'t_fd' term.txt /*'t_fd'* +'t_fe' term.txt /*'t_fe'* 't_fs' term.txt /*'t_fs'* 't_k1' term.txt /*'t_k1'* 't_k2' term.txt /*'t_k2'* @@ -1783,6 +1785,8 @@ 09.2 usr_09.txt /*09.2* 09.3 usr_09.txt /*09.3* 09.4 usr_09.txt /*09.4* +0o eval.txt /*0o* +0x eval.txt /*0x* 10.1 usr_10.txt /*10.1* 10.2 usr_10.txt /*10.2* 10.3 usr_10.txt /*10.3* @@ -1994,6 +1998,7 @@ :AdaTagFile ft_ada.txt /*:AdaTagFile* :AdaTypes ft_ada.txt /*:AdaTypes* :Arguments terminal.txt /*:Arguments* +:Asm terminal.txt /*:Asm* :Break terminal.txt /*:Break* :Cfilter quickfix.txt /*:Cfilter* :Clear terminal.txt /*:Clear* @@ -2072,6 +2077,11 @@ :_#< cmdline.txt /*:_#<* :_#n cmdline.txt /*:_#n* :_% cmdline.txt /*:_%* +:_%% cmdline.txt /*:_%%* +:_%%% cmdline.txt /*:_%%%* +:_%%0 cmdline.txt /*:_%%0* +:_%%< cmdline.txt /*:_%%<* +:_%%n cmdline.txt /*:_%%n* :_%: cmdline.txt /*:_%:* :_%< cmdline.txt /*:_%<* :a insert.txt /*:a* @@ -2125,6 +2135,7 @@ :bad windows.txt /*:bad* :badd windows.txt /*:badd* :ball windows.txt /*:ball* +:balt windows.txt /*:balt* :bar cmdline.txt /*:bar* :bd windows.txt /*:bd* :bdel windows.txt /*:bdel* @@ -2724,6 +2735,7 @@ :map- map.txt /*:map-* :map-alt-keys map.txt /*:map-alt-keys* :map-arguments map.txt /*:map-arguments* +:map-cmd map.txt /*:map-cmd* :map-commands map.txt /*:map-commands* :map-expression map.txt /*:map-expression* :map-local map.txt /*:map-local* @@ -3102,9 +3114,11 @@ :sip change.txt /*:sip* :sir change.txt /*:sir* :sl various.txt /*:sl* +:sl! various.txt /*:sl!* :sla windows.txt /*:sla* :slast windows.txt /*:slast* :sleep various.txt /*:sleep* +:sleep! various.txt /*:sleep!* :sm change.txt /*:sm* :smagic change.txt /*:smagic* :smap map.txt /*:smap* @@ -3387,8 +3401,8 @@ :vie editing.txt /*:vie* :view editing.txt /*:view* :vim quickfix.txt /*:vim* -:vim9 vim9.txt /*:vim9* -:vim9script vim9.txt /*:vim9script* +:vim9 repeat.txt /*:vim9* +:vim9script repeat.txt /*:vim9script* :vimgrep quickfix.txt /*:vimgrep* :vimgrepa quickfix.txt /*:vimgrepa* :vimgrepadd quickfix.txt /*:vimgrepadd* @@ -3506,6 +3520,7 @@ intro.txt /** map.txt /** map.txt /** + map.txt /** autocmd.txt /** os_mac.txt /** @@ -3923,6 +3938,9 @@ E1113 eval.txt /*E1113* E112 eval.txt /*E112* E113 eval.txt /*E113* +E1135 map.txt /*E1135* +E1136 map.txt /*E1136* +E1137 map.txt /*E1137* E114 eval.txt /*E114* E115 eval.txt /*E115* E116 eval.txt /*E116* @@ -4014,7 +4032,6 @@ E195 starting.txt /*E195* E196 various.txt /*E196* E197 mlang.txt /*E197* -E198 options.txt /*E198* E199 cmdline.txt /*E199* E20 motion.txt /*E20* E200 autocmd.txt /*E200* @@ -4100,7 +4117,6 @@ E275 textprop.txt /*E275* E276 eval.txt /*E276* E277 remote.txt /*E277* -E278 popup.txt /*E278* E279 terminal.txt /*E279* E28 syntax.txt /*E28* E280 if_tcl.txt /*E280* @@ -4166,7 +4182,6 @@ E338 editing.txt /*E338* E339 message.txt /*E339* E34 various.txt /*E34* -E340 vi_diff.txt /*E340* E341 message.txt /*E341* E342 message.txt /*E342* E343 options.txt /*E343* @@ -4374,7 +4389,6 @@ E535 options.txt /*E535* E536 options.txt /*E536* E537 options.txt /*E537* -E538 options.txt /*E538* E539 options.txt /*E539* E54 pattern.txt /*E54* E540 options.txt /*E540* @@ -5145,10 +5159,14 @@ VMS os_vms.txt /*VMS* Vi intro.txt /*Vi* View starting.txt /*View* +Vim9 vim9.txt /*Vim9* +Vim9-script vim9.txt /*Vim9-script* VimEnter autocmd.txt /*VimEnter* VimLeave autocmd.txt /*VimLeave* VimLeavePre autocmd.txt /*VimLeavePre* VimResized autocmd.txt /*VimResized* +VimResume autocmd.txt /*VimResume* +VimSuspend autocmd.txt /*VimSuspend* Vimball-copyright pi_vimball.txt /*Vimball-copyright* Virtual-Replace-mode insert.txt /*Virtual-Replace-mode* VisVim if_ole.txt /*VisVim* @@ -5554,6 +5572,10 @@ c_#< cmdline.txt /*c_#<* c_#n cmdline.txt /*c_#n* c_% cmdline.txt /*c_%* +c_%% cmdline.txt /*c_%%* +c_%%%# cmdline.txt /*c_%%%#* +c_%%< cmdline.txt /*c_%%<* +c_%%n cmdline.txt /*c_%%n* c_ cmdline.txt /*c_* c_ cmdline.txt /*c_* c_ cmdline.txt /*c_* @@ -5737,8 +5759,10 @@ characterwise-register change.txt /*characterwise-register* characterwise-visual visual.txt /*characterwise-visual* charclass() eval.txt /*charclass()* +charcol() eval.txt /*charcol()* charconvert_from-variable eval.txt /*charconvert_from-variable* charconvert_to-variable eval.txt /*charconvert_to-variable* +charidx() eval.txt /*charidx()* charity uganda.txt /*charity* charset mbyte.txt /*charset* charset-conversion mbyte.txt /*charset-conversion* @@ -6249,6 +6273,7 @@ exim starting.txt /*exim* exists() eval.txt /*exists()* exiting starting.txt /*exiting* +exiting-variable eval.txt /*exiting-variable* exp() eval.txt /*exp()* expand() eval.txt /*expand()* expand-env options.txt /*expand-env* @@ -6326,6 +6351,7 @@ expression-syntax eval.txt /*expression-syntax* exrc starting.txt /*exrc* extend() eval.txt /*extend()* +extendnew() eval.txt /*extendnew()* extension-removal cmdline.txt /*extension-removal* extensions-improvements todo.txt /*extensions-improvements* f motion.txt /*f* @@ -6405,7 +6431,26 @@ fname_out-variable eval.txt /*fname_out-variable* fnameescape() eval.txt /*fnameescape()* fnamemodify() eval.txt /*fnamemodify()* +fo-1 change.txt /*fo-1* +fo-2 change.txt /*fo-2* +fo-B change.txt /*fo-B* +fo-M change.txt /*fo-M* +fo-] change.txt /*fo-]* +fo-a change.txt /*fo-a* +fo-b change.txt /*fo-b* +fo-c change.txt /*fo-c* +fo-j change.txt /*fo-j* +fo-l change.txt /*fo-l* +fo-m change.txt /*fo-m* +fo-n change.txt /*fo-n* +fo-o change.txt /*fo-o* +fo-p change.txt /*fo-p* +fo-q change.txt /*fo-q* +fo-r change.txt /*fo-r* +fo-t change.txt /*fo-t* fo-table change.txt /*fo-table* +fo-v change.txt /*fo-v* +fo-w change.txt /*fo-w* fold-behavior fold.txt /*fold-behavior* fold-colors fold.txt /*fold-colors* fold-commands fold.txt /*fold-commands* @@ -6549,7 +6594,7 @@ ft-php3-syntax syntax.txt /*ft-php3-syntax* ft-phtml-syntax syntax.txt /*ft-phtml-syntax* ft-plaintex-syntax syntax.txt /*ft-plaintex-syntax* -ft-posix-synax syntax.txt /*ft-posix-synax* +ft-posix-syntax syntax.txt /*ft-posix-syntax* ft-postscr-syntax syntax.txt /*ft-postscr-syntax* ft-ppwiz-syntax syntax.txt /*ft-ppwiz-syntax* ft-printcap-syntax syntax.txt /*ft-printcap-syntax* @@ -6856,6 +6901,7 @@ g:tex_flavor filetype.txt /*g:tex_flavor* g:tex_fold_enabled syntax.txt /*g:tex_fold_enabled* g:tex_isk syntax.txt /*g:tex_isk* +g:tex_matchcheck syntax.txt /*g:tex_matchcheck* g:tex_no_error syntax.txt /*g:tex_no_error* g:tex_nospell syntax.txt /*g:tex_nospell* g:tex_stylish syntax.txt /*g:tex_stylish* @@ -6929,6 +6975,7 @@ getchangelist() eval.txt /*getchangelist()* getchar() eval.txt /*getchar()* getcharmod() eval.txt /*getcharmod()* +getcharpos() eval.txt /*getcharpos()* getcharsearch() eval.txt /*getcharsearch()* getcmdline() eval.txt /*getcmdline()* getcmdpos() eval.txt /*getcmdpos()* @@ -6936,6 +6983,7 @@ getcmdwintype() eval.txt /*getcmdwintype()* getcompletion() eval.txt /*getcompletion()* getcurpos() eval.txt /*getcurpos()* +getcursorcharpos() eval.txt /*getcursorcharpos()* getcwd() eval.txt /*getcwd()* getenv() eval.txt /*getenv()* getfontname() eval.txt /*getfontname()* @@ -7136,6 +7184,7 @@ hebrew.txt hebrew.txt /*hebrew.txt* help helphelp.txt /*help* help-context help.txt /*help-context* +help-curwin tips.txt /*help-curwin* help-summary usr_02.txt /*help-summary* help-tags tags 1 help-translated helphelp.txt /*help-translated* @@ -7745,6 +7794,7 @@ mapmode-t map.txt /*mapmode-t* mapmode-v map.txt /*mapmode-v* mapmode-x map.txt /*mapmode-x* +mapnew() eval.txt /*mapnew()* mapping map.txt /*mapping* mapping-functions usr_41.txt /*mapping-functions* mapset() eval.txt /*mapset()* @@ -8236,9 +8286,12 @@ notepad gui_w32.txt /*notepad* nr2char() eval.txt /*nr2char()* nroff.vim syntax.txt /*nroff.vim* +null vim9.txt /*null* null-variable eval.txt /*null-variable* number_relativenumber options.txt /*number_relativenumber* numbered-function eval.txt /*numbered-function* +numbermax-variable eval.txt /*numbermax-variable* +numbermin-variable eval.txt /*numbermin-variable* numbersize-variable eval.txt /*numbersize-variable* o insert.txt /*o* o_CTRL-V motion.txt /*o_CTRL-V* @@ -8649,6 +8702,7 @@ read-messages insert.txt /*read-messages* read-only-share editing.txt /*read-only-share* read-stdin version5.txt /*read-stdin* +readblob() eval.txt /*readblob()* readdir() eval.txt /*readdir()* readdirex() eval.txt /*readdirex()* readfile() eval.txt /*readfile()* @@ -8847,8 +8901,10 @@ setbufline() eval.txt /*setbufline()* setbufvar() eval.txt /*setbufvar()* setcellwidths() eval.txt /*setcellwidths()* +setcharpos() eval.txt /*setcharpos()* setcharsearch() eval.txt /*setcharsearch()* setcmdpos() eval.txt /*setcmdpos()* +setcursorcharpos() eval.txt /*setcursorcharpos()* setenv() eval.txt /*setenv()* setfperm() eval.txt /*setfperm()* setline() eval.txt /*setline()* @@ -8912,6 +8968,7 @@ skeleton autocmd.txt /*skeleton* skip_defaults_vim starting.txt /*skip_defaults_vim* slice eval.txt /*slice* +slice() eval.txt /*slice()* slow-fast-terminal term.txt /*slow-fast-terminal* slow-start starting.txt /*slow-start* slow-terminal term.txt /*slow-terminal* @@ -9167,8 +9224,10 @@ syntax syntax.txt /*syntax* syntax-functions usr_41.txt /*syntax-functions* syntax-highlighting syntax.txt /*syntax-highlighting* +syntax-latex syntax.txt /*syntax-latex* syntax-loading syntax.txt /*syntax-loading* syntax-printing usr_06.txt /*syntax-printing* +syntax-tex syntax.txt /*syntax-tex* syntax.txt syntax.txt /*syntax.txt* syntax_cmd syntax.txt /*syntax_cmd* sys-file-list help.txt /*sys-file-list* @@ -9305,6 +9364,8 @@ t_f7 version4.txt /*t_f7* t_f8 version4.txt /*t_f8* t_f9 version4.txt /*t_f9* +t_fd term.txt /*t_fd* +t_fe term.txt /*t_fe* t_float-variable eval.txt /*t_float-variable* t_fs term.txt /*t_fs* t_func-variable eval.txt /*t_func-variable* @@ -9527,6 +9588,7 @@ termdebug-starting terminal.txt /*termdebug-starting* termdebug-stepping terminal.txt /*termdebug-stepping* termdebug-variables terminal.txt /*termdebug-variables* +termdebug_disasm_window terminal.txt /*termdebug_disasm_window* termdebug_map_K terminal.txt /*termdebug_map_K* termdebug_popup terminal.txt /*termdebug_popup* termdebug_shortcuts terminal.txt /*termdebug_shortcuts* @@ -9603,6 +9665,7 @@ tex-conceal syntax.txt /*tex-conceal* tex-error syntax.txt /*tex-error* tex-folding syntax.txt /*tex-folding* +tex-matchcheck syntax.txt /*tex-matchcheck* tex-math syntax.txt /*tex-math* tex-morecommands syntax.txt /*tex-morecommands* tex-nospell syntax.txt /*tex-nospell* @@ -9677,6 +9740,7 @@ type-mistakes tips.txt /*type-mistakes* typecorr-settings usr_41.txt /*typecorr-settings* typecorr.txt usr_41.txt /*typecorr.txt* +typename() eval.txt /*typename()* u undo.txt /*u* uganda uganda.txt /*uganda* uganda.txt uganda.txt /*uganda.txt* @@ -9780,6 +9844,7 @@ v:errors eval.txt /*v:errors* v:event eval.txt /*v:event* v:exception eval.txt /*v:exception* +v:exiting eval.txt /*v:exiting* v:false eval.txt /*v:false* v:fcs_choice eval.txt /*v:fcs_choice* v:fcs_reason eval.txt /*v:fcs_reason* @@ -9803,6 +9868,8 @@ v:mouse_winid eval.txt /*v:mouse_winid* v:none eval.txt /*v:none* v:null eval.txt /*v:null* +v:numbermax eval.txt /*v:numbermax* +v:numbermin eval.txt /*v:numbermin* v:numbersize eval.txt /*v:numbersize* v:oldfiles eval.txt /*v:oldfiles* v:operator eval.txt /*v:operator* @@ -10045,6 +10112,7 @@ vim9 vim9.txt /*vim9* vim9-classes vim9.txt /*vim9-classes* vim9-const vim9.txt /*vim9-const* +vim9-curly vim9.txt /*vim9-curly* vim9-declaration vim9.txt /*vim9-declaration* vim9-declarations usr_46.txt /*vim9-declarations* vim9-differences vim9.txt /*vim9-differences* @@ -10052,11 +10120,13 @@ vim9-final vim9.txt /*vim9-final* vim9-gotchas vim9.txt /*vim9-gotchas* vim9-import vim9.txt /*vim9-import* +vim9-namespace vim9.txt /*vim9-namespace* vim9-rationale vim9.txt /*vim9-rationale* +vim9-reload vim9.txt /*vim9-reload* vim9-scopes vim9.txt /*vim9-scopes* -vim9-script vim9.txt /*vim9-script* vim9-script-intro usr_46.txt /*vim9-script-intro* vim9-types vim9.txt /*vim9-types* +vim9-user-command vim9.txt /*vim9-user-command* vim9.txt vim9.txt /*vim9.txt* vim9script vim9.txt /*vim9script* vim: options.txt /*vim:* @@ -10274,6 +10344,7 @@ xterm-copy-paste term.txt /*xterm-copy-paste* xterm-cursor-keys term.txt /*xterm-cursor-keys* xterm-end-home-keys term.txt /*xterm-end-home-keys* +xterm-focus-event term.txt /*xterm-focus-event* xterm-function-keys term.txt /*xterm-function-keys* xterm-modifier-keys term.txt /*xterm-modifier-keys* xterm-mouse options.txt /*xterm-mouse* diff -Nru vim-8.2.1913/runtime/doc/tagsrch.txt vim-8.2.2434/runtime/doc/tagsrch.txt --- vim-8.2.1913/runtime/doc/tagsrch.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/tagsrch.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*tagsrch.txt* For Vim version 8.2. Last change: 2020 Apr 19 +*tagsrch.txt* For Vim version 8.2. Last change: 2020 Dec 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -556,7 +556,7 @@ is the only format produced by traditional ctags implementations. This is often used for functions that are global, also referenced in other files. -The lines in the tags file can end in or . On the Macintosh +The lines in the tags file can end in or . On the Macintosh also works. The and characters can never appear inside a line. The second format is new. It includes additional information in optional diff -Nru vim-8.2.1913/runtime/doc/terminal.txt vim-8.2.2434/runtime/doc/terminal.txt --- vim-8.2.1913/runtime/doc/terminal.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/terminal.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*terminal.txt* For Vim version 8.2. Last change: 2020 Sep 04 +*terminal.txt* For Vim version 8.2. Last change: 2021 Jan 04 VIM REFERENCE MANUAL by Bram Moolenaar @@ -123,12 +123,14 @@ *options-in-terminal* After opening the terminal window and setting 'buftype' to "terminal" the -TerminalOpen autocommand event is triggered. This makes it possible to set -options specifically for the window and buffer. Example: > - au TerminalOpen * if &buftype == 'terminal' | setlocal bufhidden=hide | endif -The is set to the terminal buffer, but if there is no window (hidden -terminal) then setting options will happen in the wrong buffer, therefore the -check for &buftype in the example. +|TerminalWinOpen| autocommand event is triggered. This makes it possible to set +options specifically for the terminal window and buffer. Example: > + au TerminalWinOpen * setlocal bufhidden=hide + +There is also the |TerminalOpen| event, but this may be triggered for a hidden +terminal, and the current window and buffer may not be for the new terminal. +You need to use , which is set to the terminal buffer. Example: > + au TerminalOpen * call setbufvar(+expand(''), '&colorcolumn', 123) Mouse events (click and drag) are passed to the terminal. Mouse move events are only passed when Vim itself is receiving them. For a terminal that is @@ -503,6 +505,8 @@ a different attribute + missing position in first file - missing position in second file + > cursor position in first file, not in second + < cursor position in second file, not in first Using the "s" key the top and bottom parts are swapped. This makes it easy to spot a difference. @@ -738,6 +742,9 @@ The default is "Tapi_". When {expr} is an empty string then no |terminal-api| function can be used for {buf}. + When used as a method the base is used for {buf}: > + GetBufnr()->term_setapi({expr}) + term_setansicolors({buf}, {colors}) *term_setansicolors()* Set the ANSI color palette used by terminal {buf}. {colors} must be a List of 16 valid color names or hexadecimal @@ -1323,6 +1330,8 @@ *:Program* jump to the window with the running program *:Source* jump to the window with the source code, create it if there isn't one + *:Asm* jump to the window with the disassembly, create it if there + isn't one Prompt mode ~ @@ -1345,6 +1354,12 @@ The K key is normally mapped to :Evaluate. If you do not want this use: > let g:termdebug_map_K = 0 +< + *termdebug_disasm_window* +If you want the Asm window shown by default, set this to 1. Setting to +any value greater than 1 will set the Asm window height to that value: > + let g:termdebug_disasm_window = 15 +< Communication ~ *termdebug-communication* @@ -1411,16 +1426,18 @@ Vim window width *termdebug_wide* -To change the width of the Vim window when debugging starts, and use a -vertical split: > - let g:termdebug_wide = 163 -This will set &columns to 163 when `:Termdebug` is used. The value is restored -when quitting the debugger. -If g:termdebug_wide is set and &columns is already larger than -g:termdebug_wide then a vertical split will be used without changing &columns. -Set it to 1 to get a vertical split without every changing &columns (useful -for when the terminal can't be resized by Vim). +To change the width of the Vim window when debugging starts and use a vertical +split: > + let g:termdebug_wide = 163 + +This will set 'columns' to 163 when `:Termdebug` is used. The value is +restored when quitting the debugger. + +If g:termdebug_wide is set and 'columns' is already a greater value, then a +vertical split will be used without modifying 'columns'. +Set g:termdebug_wide to 1 to use a vertical split without ever changing +'columns'. This is useful when the terminal can't be resized by Vim. vim:tw=78:ts=8:noet:ft=help:norl: diff -Nru vim-8.2.1913/runtime/doc/term.txt vim-8.2.2434/runtime/doc/term.txt --- vim-8.2.1913/runtime/doc/term.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/term.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*term.txt* For Vim version 8.2. Last change: 2020 Apr 12 +*term.txt* For Vim version 8.2. Last change: 2021 Jan 14 VIM REFERENCE MANUAL by Bram Moolenaar @@ -217,6 +217,10 @@ Another speciality about these codes is that they are not overwritten by another code. That is to avoid that the codes obtained from xterm directly |t_RV| overwrite them. + +Another special value is a termcap entry ending in "@;*X". This is for cursor +keys, which either use "CSI X" or "CSI 1 ; modifier X". Thus the "@" +stands for either "1" if a modifier follows, or nothing. *xterm-scroll-region* The default termcap entry for xterm on Sun and other platforms does not contain the entry for scroll regions. Add ":cs=\E[%i%d;%dr:" to the xterm @@ -369,6 +373,10 @@ t_Ri restore icon text from stack *t_Ri* *'t_Ri'* t_TE end of "raw" mode *t_TE* *'t_TE'* t_TI put terminal into "raw" mode *t_TI* *'t_TI'* + t_fd disable focus-event tracking *t_fd* *'t_fd'* + |xterm-focus-event| + t_fe enable focus-event tracking *t_fe* *'t_fe'* + |xterm-focus-event| Some codes have a start, middle and end part. The start and end are defined by the termcap option, the middle part is text. @@ -542,6 +550,16 @@ value with the context menu (right mouse button while CTRL key is pressed), there should be a tick at allow-window-ops. + *xterm-focus-event* +Some terminals including xterm support the focus event tracking feature. +If this feature is enabled by the 't_fe' sequence, special key sequences are +sent from the terminal to Vim every time the terminal gains or loses focus. +Vim fires focus events (|FocusGained|/|FocusLost|) by handling them accordingly. +Focus event tracking is disabled by a 't_fd' sequence when exiting "raw" mode. +If you would like to disable this feature, add the following to your .vimrc: + `set t_fd=` + `set t_fe=` + *termcap-colors* Note about colors: The 't_Co' option tells Vim the number of colors available. When it is non-zero, the 't_AB' and 't_AF' options are used to set the color. diff -Nru vim-8.2.1913/runtime/doc/testing.txt vim-8.2.2434/runtime/doc/testing.txt --- vim-8.2.1913/runtime/doc/testing.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/testing.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*testing.txt* For Vim version 8.2. Last change: 2020 Sep 06 +*testing.txt* For Vim version 8.2. Last change: 2020 Dec 12 VIM REFERENCE MANUAL by Bram Moolenaar @@ -308,8 +308,11 @@ first reported error: > assert_fails('cmd', ['E987:.*expected bool']) < The second pattern, if present, is matched against the last - reported error. To only match the last error use an empty - string for the first error: > + reported error. + If there is only one error then both patterns must match. This + can be used to check that there is only one error. + To only match the last error use an empty string for the first + error: > assert_fails('cmd', ['', 'E987:']) < If {msg} is empty then it is not used. Do this to get the diff -Nru vim-8.2.1913/runtime/doc/tips.txt vim-8.2.2434/runtime/doc/tips.txt --- vim-8.2.1913/runtime/doc/tips.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/tips.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*tips.txt* For Vim version 8.2. Last change: 2009 Nov 07 +*tips.txt* For Vim version 8.2. Last change: 2020 Dec 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -30,6 +30,7 @@ Hex editing |hex-editing| Using <> notation in autocommands |autocmd-<>| Highlighting matching parens |match-parens| +Opening help in the current window |help-curwin| ============================================================================== Editing C programs *C-editing* @@ -530,4 +531,28 @@ autocmd InsertEnter * match none < +============================================================================== +Opening help in the current window *help-curwin* + +By default, help is displayed in a split window. If you prefer it opens in +the current window, try this custom `:HelpCurwin` command: +> + command -bar -nargs=? -complete=help HelpCurwin execute s:HelpCurwin() + let s:did_open_help = v:false + + function s:HelpCurwin(subject) abort + let mods = 'silent noautocmd keepalt' + if !s:did_open_help + execute mods .. ' help' + execute mods .. ' helpclose' + let s:did_open_help = v:true + endif + if !getcompletion(a:subject, 'help')->empty() + execute mods .. ' edit ' .. &helpfile + endif + return 'help ' .. a:subject + endfunction +< + + vim:tw=78:ts=8:noet:ft=help:norl: diff -Nru vim-8.2.1913/runtime/doc/todo.txt vim-8.2.2434/runtime/doc/todo.txt --- vim-8.2.1913/runtime/doc/todo.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/todo.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 8.2. Last change: 2020 Oct 26 +*todo.txt* For Vim version 8.2. Last change: 2021 Jan 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -38,65 +38,59 @@ *known-bugs* -------------------- Known bugs and current work ----------------------- -Sign highlight in signcolumn disappears if there is line highlighting. +test_autocmd failure in Windows: Something wrong with system()? -Making everything work: -- Test all command modifiers. -- Check many more builtin function arguments at compile time. -- Closure arguments should be more strict, like any function call? -- Invoke user command in a :def function -- Make map() give an error if the resulting type is wrong. - Add mapnew() or mapcopy() to create a new List/Dict for the result, which - can have a different value type. -- Error message for "'yes && 0" is "using String as a Number", should be "using - String as a Bool". -- Run the same tests in :def and Vim9 script, like in Test_expr7_not() -- In autocmd: use legacy syntax, not whatever the current script uses? -- need to check type when a declaration specifies a type: #6507 - let nr: number = 'asdf' -- Make sure that in vim9script a function call without namespace only finds - the script-local function, not a global one. -- Make sure that where a callback is expected a function can be used (without - quotes). E.g. sort() and map(). Also at the script level. -- assignment to more complex lval: list[1][2][3] = 8 - Also "list[0] += value". test in Test_assign_dict_unknown_type(). -- ":put" with ISN_PUT does not handle range correctly, e.g. ":$-2put". - Add command to parse range at runtime? -- When defining an :autocmd or :command, how to specify using Vim9 syntax? - - always do this when defined in a Vim9 script - - add some command modifier. -- For an :autocmd and :command argument, if a following line starts with "|" - append it. It's like line continuation. (#6702) +Vim9 - Make everything work: +- Add a test for profiling with nested function calls and lambda. +- Expand `=expr` in :next, :argedit, :argadd, :argdelete, :drop +- Expand `=expr` in :vimgrep, :vimgrepadd, :lvimgrep, :lvimgrepadd +- Expand `=expr` in :mkspell +- Unlet with range: "unlet list[a : b]" - Implement "export {one, two three}". - ISN_CHECKTYPE could use check_argtype() +- Using a script variable inside a :def function doesn't work if the variable + is inside a block, see Test_nested_function(). Should it work? - give error for variable name: - let p = function('NoSuchFunc') + var p = function('NoSuchFunc') +- Make closures work better: + - Create closure in a loop. Need to make a list of them. - If a :def function is called with a function reference, compile it to get the function type. def Filter(x: string, Cond: func(string): bool) - Filter(x, { v -> v =~ '^b' }) -- Expand `=expr` in :next, :argedit, :argadd, :argdelete, :drop -- Expand `=expr` in :vimgrep, :vimgrepadd, :lvimgrep, :lvimgrepadd -- Expand `=expr` in :mkspell -- Test that a function defined inside a :def function is local to that - function, g: functions can be defined and script-local functions cannot be - defined. -- Does this work already: can use func as reference: - def SomeFunc() ... - map(list, SomeFunc) + Filter(x, (v) => v =~ '^b') +- Make inline function work, to be used as a funcref: + var Ref = (arg: type): type => { + statement + return expr + } + var Ref = (arg: type) => { + statement + statement + } +- For builtin functions using tv_get_string*() use check_for_string() to be + more strict about the argument type. +- Implement :lockvar and :unlockvar. How about local variables? Perhaps only + allow this for global variables. Use :final or :const otherwise. +- Allow function names that will be script-local to start with lower case + letter? Or also require names with s: prefix to use upper case? + Also apply this function references "var ref = SomeFunc" - Support passing v:none to use the default argument value. (#6504) +- Run the same tests in :def and Vim9 script, like in Test_expr7_not() +- Check many more builtin function arguments at compile time. - make 0 == 'string' fail on the script level, like inside :def. - Check that when using a user function name without prefix, it does not find a global function. Prefixing g: is required. -- Compile: for [key, value] in items(map) -- Assignment to dict doesn't work: - let ret: dict = #{} - ret[i] = string(i) -- Appending to dict item doesn't work: - let d[i] ..= value +- Need the equivalent of get_lval() and set_var_lval() to implement assignment + to nested list and dict members. + - Assignment to dict doesn't work: + var ret: dict = #{} + ret[i] = string(i) + - Appending to dict item doesn't work: + var d[i] ..= value - Using ".." at script level doesn't convert arguments to a string. - Compile replacement of :s command: s/pat/\=expr/ - Compile redir to local variable: var_redir_start(). +- Implement type cast at the script level. - Compile builtin functions that access local variables: islocked() - When evaluating constants for script variables, some functions could work: @@ -104,56 +98,60 @@ - Implement "as Name" in "import Item as Name from ..." - Implement using imported items at script level from "import * as X" in eval_variable(). Should pass the ".xxx" that follows and return that. -- Disallow unlet for local/script/imported vars -- Make "++nr" work. -- Make closures work: - - Create closure in a loop. Need to make a list of them. - - nested closure only uses one context, not all (#7150) +- Make "++nr" work. "++g:count" doesn't work, thinks it is a range. +- Reload: How to make sure type of script function hasn't changed? - expandcmd() with `=expr` in filename uses legacy expression. - eval_expr() in ex_cexpr() - eval_expr() call in dbg_parsearg() and debuggy_find() -- has() is compiled as a constant, but some checks are dynamic. - Check for dynamic values, such as "gui_running". -New syntax and functionality: -Improve error checking: -- "echo Func()" is an error if Func() does not return anything. -Also: -- For range: make table of first ASCII character with flag to quickly check if - it can be a Vim9 command. E.g. "+" can, but "." can't. +- compile "skip" argument of searchpair() +- compile "expr" and "call" expression of a channel in channel_exe_cmd()? +- give an error for "echo Func()" if Func() does not return anything. +- Using "windo echo expr" does not accept a line break inside "expr" (in a + :def function and at script level in a not executed block). #7681 + +Once Vim9 is stable: +- Change the help to prefer Vim9 syntax where appropriate +- Use Vim9 for runtime files. + PR #7497 for autoload/ccomplete.vim +- Add all the error numbers in a good place in documentation. +- In the generic eval docs, point out the Vim9 syntax where it differs. + +Also for Vim9: - better implementation for partial and tests for that. - Make "g:imported = Export.exported" work in Vim9 script. - Make Foo.Bar() work to call the dict function. (#5676) - Error in any command in "vim9script" aborts sourcing. - Find a way to test expressions in legacy and Vim9 script without duplication -- Test each level of expressions properly, with type checking - Test try/catch and throw better, also nested. - Test return inside try/finally jumps to finally and then returns. -- Test: Function declared inside a :def function is local, disappears at the - end of the function. Unless g: is used, just like with variables. -- implement :type -- import type declaration? + Test that return inside try/finally jumps to finally and then returns. +- Test that a function defined inside a :def function is local to that + function, g: functions can be defined and script-local functions cannot be + defined. +- compile options that are an expression, e.g. "expr:" in 'spellsuggest', + 'foldexpr', 'foldtext', 'printexpr', 'diffexpr', 'patchexpr', 'charconvert', + 'balloonexpr', 'includeexpr', 'indentexpr', 'formatexpr'. + Give an error if compilation fails. (#7625) + Use the location where the option was set for deciding whether it's to be + evaluated in Vim9 script context. +- implement :type; import type declaration. +- implement enum; import enum. - Future work: See |vim9-classes| -- implement enum -- Make accessing varargs faster: arg[expr] - EVAL expr - LOADVARARG (varags idx) + Define the keywords and commands to make sure it will be backwards + compatible. - Make debugging work - at least per function. Need to recompile a function to step through it line-by-line? Evaluate the stack and variables on the stack? -- Make profiling work - Add ISN_PROFILE instructions after every line? - List commands when 'verbose' is set or :verbose is used. -Further improvements: -- compile options that are an expression, e.g. "expr:" in 'spellsuggest', - 'foldexpr', 'foldtext', 'printexpr', 'diffexpr', 'patchexpr', 'charconvert', - 'balloonexpr', 'includeexpr', 'indentexpr', 'formatexpr'. -- Make inline function work, to be used as a funcref: - let ref = def(arg: type): rettype - body - enddef + +Further Vim9 improvements, possibly after launch: +- For range: make table of first ASCII character with flag to quickly check if + it can be a Vim9 command. E.g. "+" can, but "." can't. - compile get_lambda_tv() in popup_add_timeout() - inline call to map() and filter() -- compile "skip" argument of searchpair() -- compile "expr" and "call" expression of a channel in channel_exe_cmd()? +- Make accessing varargs faster: arg[expr] + EVAL expr + LOADVARARG (varargs idx) + Popup windows: - Add a flag to make a popup window focusable? @@ -161,7 +159,6 @@ current window. ? - switch between current window and all popup windows Esc in popup window goes back to previous current window -- Cursor not updated before a redraw, making it jump. (#5943) - Add a termcap entry for changing the cursor when it goes under the popup and back. like t_SI and t_EI (t_SU and t_EU, where "U" means under?) - With terminal in popup, allow for popup_hide() to temporarily hide it.? @@ -186,11 +183,17 @@ - Figure out the size and position better if wrapping inserts indent Text properties: +- Popup attached to text property stays visible when text is no longer + visible. (#7736) +- Popup attached to text property stays visible when text is deleted with + "cc". (#7737) "C" works OK. - :goto does not go to the right place when text properties are present. (#5930) - "cc" does not call inserted_bytes(). (Axel Forsman, #5763) - Combining text property with 'cursorline' does not always work (Billie Cleek, #5533) +- Should we let the textprop highlight overrule other (e.g. diff) highlight if + the priority is above a certain value? (#7392) - See remarks at top of src/textprop.c 'incsearch' with :s: @@ -225,6 +228,7 @@ with another Vim instance. Terminal emulator window: +- Can escape a terminal popup with win_gotoid(), should be an error - No support for underline color, t_8u. - When in terminal-Normal mode when the job finishes, the cursor jumps to the end but the window is not updated. This only happens when typing "a". @@ -277,9 +281,15 @@ Patch to implement the vimtutor with a plugin: #6414 Was originally written by Felipe Morales. +Adding "10" to 'spellsuggest' causes spell suggestions to become very slow. +(#4087) Did patch 8.2.2379 help? + +Patch to find Python dll using registry key. (#7540) + Remove SPACE_IN_FILENAME ? It is only used for completion. -Patch to use collation based sorting. (Christian Brabandt, #6229) +Making breakat support multibyte characters (Yasuhiro Matsumoto, #6598) +Scroll doesn't work correctly, why? Add 'termguiattr' option, use "gui=" attributes in the terminal? Would work with 'termguicolors'. #1740 @@ -295,15 +305,24 @@ This is useful e.g. when a popup was created that disables mappings, we need to return from vgetc() to make this happen. #7011 -Making breakat support multibyte characters (Yasuhiro Matsumoto, #6598) -Scroll doesn't work correctly, why? - Expanding should put the tab number from cmdmod.tab before "tab". Any way to convert "$" back by using a special value? (#6901) Can we detect true color support? https://gist.github.com/XVilka/8346728 Try setting a color then request the current color, like using t_u7. +Regexp to search for duplicate lines does not work correctly: +/\(^.*\n\)\1 (Chris Morgan, #6239) + +Changing a capturing group to non-capturing changes the result: #7607 + :echo matchstr('aaa bbb', '\(.\{-1,}\>\)\|.*') + aaa + :echo matchstr('aaa bbb', '\%(.\{-1,}\>\)\|.*') + aaa bbb +Should also work without any group: + :echo matchstr('aaa bbb', '.\{-1,}\>\|.*') + aaa bbb (should be aaa) + Check out PR #543 (Roland Puntaier). Patch for multibyte characters in langmap and applying a mapping on them. (Christian Brabandt, 2015 Jun 12, update July 25) @@ -326,6 +345,9 @@ BufIsRenamed (after buffer ID gets another name) The buffer list and windows are locked, no changes possible +Add a ModeChanged autocommand that has an argument indicating the old and new +mode, as what's returned from mode(). Also used for switching Terminal mode. + Matchparen doesn't remove highlight after undo. (#7054) Is OK when syntax HL is active. @@ -348,6 +370,8 @@ Why does Test_invalid_sid() not work in the GUI? +":pedit" ignores the local working directory when 'pvp' is set (#7267) + Lua: updating wrong buffer when using newly created, unloaded buffer. (#6539) @@ -384,9 +408,6 @@ When 'lazyredraw' is set sometimes the title is not updated. (Jason Franklin, 2020 Feb 3) Looks like a race condition. -Regexp to search for duplicate lines does not work correctly: -/\(^.*\n\)\1 (Chris Morgan, #6239) - With bash ":make" does not set v:shell_error. Possible solution: set 'shellpipe' to "2>&1| tee %s; exit ${PIPESTATUS[0]}" #5994 @@ -417,9 +438,6 @@ Wrong error when using local arglist. (Harm te Hennepe, #6133) -Request to support in mappings, similar to how Neovim does this. -(Daniel Hahler, #4784) - Test loose_clipboard() by selecting text before suspending. Undo puts cursor in wrong line after "cG" undo. @@ -441,9 +459,6 @@ remains equal? Then %argdel to clean it up. Do try this with 'hidden' set. Also #5326: netrw buffers are not restored. -Alternate file is not set in the session file. Use setwintabvar("@#") ? -(#6714) - When 'backupdir' has a path ending in double slash (meaning: use full path of the file) combined with 'patchmode' the file name is wrong. (#5791) @@ -461,9 +476,6 @@ that entry is used. But instead it's always added. (#6210) Add flag AL_FIND_ADD, if there is one argument find it in the list. -Adding "10" to 'spellsuggest' causes spell suggestions to become very slow. -(#4087) - behavior of i_CTRl-R_CTRL-R differs from documentation. (Paul Desmond Parker, #5771) @@ -538,14 +550,6 @@ gvim window (with focus follows mouse), then the K_FOCUSLOST key is put in the input buffer. (#5302) -xterm should be able to pass focus changes to Vim, so that Vim can check for -buffers that changed. Perhaps in misc.c, function selectwindow(). -Xterm 224 supports it! -Patch to make FocusGained and FocusLost work in modern terminals. (Hayaki -Saito, 2013 Apr 24) Update 2016 Aug 12. -Also see issue #609. -We could add the enable/disable sequences to t_ti/t_te or t_ks/t_ke. - :buffer completion does not escape "+" properly and results in a regexp error. (#5467) @@ -667,6 +671,38 @@ 'sessionoptions', making it impossible to have a session with a relative path. (#4450) +Session file only contains local option values for buffers that are in a +window, not other buffers. (#7532) + +Script generated by :mksession does not work well if there are windows with +modified buffers + change "silent only" into "silent only!" + change "edit fname" of first buffer to "hide edit fname" + skip "badd fname" if "fname" is already in the buffer list + remove remark about unloading buffers from documentation + +When session file has name in argument list but the buffer was deleted, the +buffer is not deleted when using the session file. (#1393) +Should add the buffer in hidden state. + +When a session file is created and there are "nofile" buffers, these are not +filled. Need to trigger BufReadCmd autocommands. Also handle deleting the +initial empty buffer better. (ZyX, 2015 March 8) + +Setting the spell file in a session only reads the local additions, not the +normal spell file. (Enno Nagel, 2014 Mar 29) + +Directory wrong in session file, caused by ":lcd" in BufEnter autocommand. +(Felix Kater, 2009 Mar 3) + +Something wrong with session that has "cd" commands and "badd", in such a way +that Vim doesn't find the edited file in the buffer list, causing the +ATTENTION message? (Tony Mechelynck, 2008 Dec 1) +Also: swap files are in ~/tmp/ One has relative file name ".mozilla/...". + +'foldcolumn' in modeline applied to wrong window when using a session. (Teemu +Likonen, March 19) + When using a timer callback vgetc_busy is reset, allowing for using input(). But in a channel callback this does not happen. We need to do something similar to check_due_timer(). Also see #3809. @@ -773,6 +809,7 @@ Add buffer argument to undotree(). (#4001) +Memory leak in test_debugger Using uninitialized value in test_crypt (can't explain why). Memory leak in test_terminal_fail TODO: be able to run all parts of test_alot with valgrind separately @@ -855,13 +892,6 @@ Win32 key codes are messy. Mike Williams tried to fix that, but now old mappings no longer work. Create a new terminal for the better solution? -Script generated by :mksession does not work well if there are windows with -modified buffers - change "silent only" into "silent only!" - change "edit fname" of first buffer to "hide edit fname" - skip "badd fname" if "fname" is already in the buffer list - remove remark about unloading buffers from documentation - Compiler warnings (geeknik, 2017 Oct 26): - signed integer overflow in do_sub() (#2249) - signed integer overflow in get_address() (#2248) @@ -903,9 +933,6 @@ or asyncmake: https://github.com/yegappan/asyncmake -Add a ModeChanged autocommand that has an argument indicating the old and new -mode, as what's returned from mode(). Also used for switching Terminal mode. - Add an option with file patterns, to be used when unloading a buffer: If there is a match, remove entries for the buffer from marks, jumplist, etc. To be used for git temp files. @@ -1067,7 +1094,7 @@ Patch for improving detecting Ruby on Mac in configure. (Ilya Mikhaltsou, 2017 Nov 21) -When t_Co is changed from termresponse, the OptionSet autocmmand event isn't +When t_Co is changed from termresponse, the OptionSet autocommand event isn't triggered. Use the code from the end of set_num_option() in set_color_count(). @@ -1126,7 +1153,7 @@ #2089) Patch with possible solution by Björn Linse. The change list index is local to a buffer, but it doesn't make sense using it -for another buffer. (lacygoll) Copy w_changelistidx to wininfo_S and back. +for another buffer. (lacygoill) Copy w_changelistidx to wininfo_S and back. X11: Putting more than about 262040 characters of text on the clipboard and pasting it in another Vim doesn't work. (Dominique Pelle, 2008 Aug 21-23) @@ -1233,10 +1260,6 @@ import can't be used in define option when include matches too. (Romain Lafourcade, 2017 Jun 18, #1519) -When session file has name in argument list but the buffer was deleted, the -buffer is not deleted when using the session file. (#1393) -Should add the buffer in hidden state. - Wrong diff highlighting with three files. (2016 Oct 20, #1186) Also get E749 on exit. Another example in #1309 @@ -1292,9 +1315,6 @@ about /S and /D options (Ken Takata, 2016 Apr 13) Or point to nightly builds: https://github.com/vim/vim-win32-installer/releases -Problem passing non-UTF-8 strings to Python 3. (Björn Linse, 2016 Sep 11, -#1053) With patch, does it work? - ":sbr" docs state it respects 'switchbuf', but "vsplit" does not cause a vertical split. (Haldean Brown, 2017 Mar 1) @@ -1352,6 +1372,9 @@ sort() is not stable when using numeric/float sort (Nikolay Pavlov, 2016 Sep 4#1038) +sort() does not use 'smartcase' for the skip pattern, even though 'ignorecase' +is used. (Filipe Brandenburger, #7322) + +channel: - Add a in_cb, invoked when the write buffer has become empty. (Matteo Landi) - Add ch_readlines(): for a channel in NL mode, reads as many lines as are @@ -1695,10 +1718,6 @@ Patch to add a "literal" argument to bufnr(). (Olaf Dabrunz, 2015 Aug 4) -When a session file is created and there are "nofile" buffers, these are not -filled. Need to trigger BufReadCmd autocommands. Also handle deleting the -initial empty buffer better. (ZyX, 2015 March 8) - Extended file attributes lost on write (backupcopy=no). Issue 306. Patch to add :lockjumps. (Carlo Baldassi, 2015 May 25) @@ -1827,9 +1846,6 @@ - Development work on plugins (although diff with distributed version would be useful). -Setting the spell file in a session only reads the local additions, not the -normal spell file. (Enno Nagel, 2014 Mar 29) - When typing the first character of a command, e.g. "f", then using a menu, the menu item doesn't work. Clear typeahead when using a menu? @@ -2297,7 +2313,7 @@ CreateFile and CreateFileW are used without sharing, filewritable() fails when the file was already open (e.g. script is being sourced). Add FILE_SHARE_READ| -FILE_SHARE_WRITE in mch_access()? (Phillippe Vaucher, 2010 Nov 2) +FILE_SHARE_WRITE in mch_access()? (Philippe Vaucher, 2010 Nov 2) Is ~/bin (literally) in $PATH supposed to work? (Paul, 2010 March 29) Looks like only bash can do it. (Yakov Lerner) @@ -2478,9 +2494,6 @@ height. Also happens when there is another window in the frame, if it's not very high. (Yegappan Lakshmanan, 2010 Jul 22, Michael Peeters, 2010 Jul 22) -Directory wrong in session file, caused by ":lcd" in BufEnter autocommand. -(Felix Kater, 2009 Mar 3) - Session file generates error upon loading, cause by --remote-silent-tab. (7tommm (ytommm) 2010 Nov 24) @@ -2540,11 +2553,6 @@ "gqip" in Insert mode has an off-by-one error, causing it to reflow text. (Raul Coronado, 2009 Nov 2) -Something wrong with session that has "cd" commands and "badd", in such a way -that Vim doesn't find the edited file in the buffer list, causing the -ATTENTION message? (Tony Mechelynck, 2008 Dec 1) -Also: swap files are in ~/tmp/ One has relative file name ".mozilla/...". - MS-Windows: editing the first, empty buffer, 'ffs' set to "unix,dos", ":enew" doesn't set 'ff' to "unix". (Ben Fritz, 2008 Dec 5) Reusing the old buffer probably causes this. @@ -2741,9 +2749,6 @@ ":echoe" in catch block stops processing, while this doesn't happen outside of a catch block. (ZyX, 2011 Jun 2) -'foldcolumn' in modeline applied to wrong window when using a session. (Teemu -Likonen, March 19) - Test 54 uses shell commands, that doesn't work on non-Unix systems. Use some other way to test buffer-local autocommands. @@ -4014,8 +4019,6 @@ - if it can be undone (u/CTRL-R) and redone (.) - how it works for folded lines - how it works with multibyte characters -9 In change.txt, remark about Javadoc isn't right. Right alignment would - work too. 8 Spread the windows commands over the other files. For example, ":stag" should be with ":tag". Cross-link with tags to avoid too much double text. @@ -5472,7 +5475,7 @@ not the . 8 Give a warning when using CTRL-C in the lhs of a mapping. It will never (?) work. -7 Add <0x8f> (hex), <033> (octal) and <123> (decimal) to <> notation? +7 Add <0x8f> (hex), <0o33> (octal) and <123> (decimal) to <> notation? 7 When someone tries to unmap with a trailing space, and it fails, try unmapping without the trailing space. Helps for ":unmap xx | unmap yy". 6 Context-sensitive abbreviations: Specify syntax group(s) in which the @@ -5933,7 +5936,7 @@ losing the original when writing twice. (Slootman) 7 On non-Unix machines, also overwrite the original file in some situations (file system full, it's a link on an NFS partition). -7 When editing a file, check that it has been change outside of Vim more +7 When editing a file, check that it has been changed outside of Vim more often, not only when writing over it. E.g., at the time the swap file is flushed. Or every ten seconds or so (use the time of day, check it before waiting for a character to be typed). diff -Nru vim-8.2.1913/runtime/doc/undo.txt vim-8.2.2434/runtime/doc/undo.txt --- vim-8.2.1913/runtime/doc/undo.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/undo.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*undo.txt* For Vim version 8.2. Last change: 2020 Oct 18 +*undo.txt* For Vim version 8.2. Last change: 2020 Nov 30 VIM REFERENCE MANUAL by Bram Moolenaar @@ -65,9 +65,9 @@ the redo will not be possible anymore. 'u' included, the Vi-compatible way: -The undo command undoes the previous change, and also the previous undo command. -The redo command repeats the previous undo command. It does NOT repeat a -change command, use "." for that. +The undo command undoes the previous change, and also the previous undo +command. The redo command repeats the previous undo command. It does NOT +repeat a change command, use "." for that. Examples Vim way Vi-compatible way ~ "uu" two times undo no-op @@ -103,7 +103,7 @@ :undojoin | delete -After this an "u" command will undo the delete command and the previous +After this a "u" command will undo the delete command and the previous change. To do the opposite, break a change into two undo blocks, in Insert mode use diff -Nru vim-8.2.1913/runtime/doc/usr_03.txt vim-8.2.2434/runtime/doc/usr_03.txt --- vim-8.2.1913/runtime/doc/usr_03.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/usr_03.txt 2021-01-30 22:05:11.000000000 +0000 @@ -50,7 +50,7 @@ This is a line with example text ~ <----<----x---->------------> - 2ge ge e we + 2ge ge e 2e If you are at the last word of a line, the "w" command will take you to the first word in the next line. Thus you can use this to move through a diff -Nru vim-8.2.1913/runtime/doc/usr_23.txt vim-8.2.2434/runtime/doc/usr_23.txt --- vim-8.2.1913/runtime/doc/usr_23.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/usr_23.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*usr_23.txt* For Vim version 8.2. Last change: 2006 Apr 24 +*usr_23.txt* For Vim version 8.2. Last change: 2020 Dec 19 VIM USER MANUAL - by Bram Moolenaar @@ -28,9 +28,9 @@ (carriage return, ), another to move the paper up (line feed, ). When computers came out, storage was expensive. Some people decided that they did not need two characters for end-of-line. The UNIX people decided -they could use only for end-of-line. The Apple people -standardized on . The Microsoft Windows folks decided to keep -the old . +they could use or only for end-of-line. The Apple people +standardized on . The Microsoft Windows folks decided to keep the old + (we use for line feed in the help text). This means that if you try to move a file from one system to another, you have line-break problems. The Vim editor automatically recognizes the different file formats and handles things properly behind your back. @@ -55,20 +55,20 @@ The three names that Vim uses are: - unix - dos + unix + dos mac USING THE MAC FORMAT -On Unix, is used to break a line. It's not unusual to have a +On Unix, is used to break a line. It's not unusual to have a character halfway a line. Incidentally, this happens quite often in Vi (and Vim) scripts. On the Macintosh, where is the line break character, it's possible to -have a character halfway a line. +have a character halfway a line. The result is that it's not possible to be 100% sure whether a file -containing both and characters is a Mac or a Unix file. Therefore, +containing both and characters is a Mac or a Unix file. Therefore, Vim assumes that on Unix you probably won't edit a Mac file, and doesn't check for this type of file. To check for this format anyway, add "mac" to 'fileformats': > diff -Nru vim-8.2.1913/runtime/doc/usr_41.txt vim-8.2.2434/runtime/doc/usr_41.txt --- vim-8.2.1913/runtime/doc/usr_41.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/usr_41.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*usr_41.txt* For Vim version 8.2. Last change: 2020 Aug 30 +*usr_41.txt* For Vim version 8.2. Last change: 2021 Jan 13 VIM USER MANUAL - by Bram Moolenaar @@ -122,14 +122,14 @@ decimal number, it will be interpreted as an octal number! The ":echo" command always prints decimal numbers. Example: > - :echo 0x7f 036 + :echo 0x7f 0o36 < 127 30 ~ A number is made negative with a minus sign. This also works for hexadecimal, octal and binary numbers. A minus sign is also used for subtraction. Compare this with the previous example: > - :echo 0x7f -036 + :echo 0x7f -0o36 < 97 ~ White space in an expression is ignored. However, it's recommended to use it @@ -137,7 +137,7 @@ avoid the confusion with a negative number above, put a space between the minus sign and the following number: > - :echo 0x7f - 036 + :echo 0x7f - 0o36 ============================================================================== *41.2* Variables @@ -619,12 +619,15 @@ submatch() get a specific match in ":s" and substitute() strpart() get part of a string using byte index strcharpart() get part of a string using char index + slice() take a slice of a string, using char index in + Vim9 script strgetchar() get character from a string using char index expand() expand special keywords expandcmd() expand a command like done for `:edit` iconv() convert text from one encoding to another byteidx() byte index of a character in a string byteidxcomp() like byteidx() but count composing characters + charidx() character index of a byte in a string repeat() repeat a string multiple times eval() evaluate a string expression execute() execute an Ex command and get the output @@ -639,12 +642,15 @@ insert() insert an item somewhere in a List add() append an item to a List extend() append a List to a List + extendnew() make a new List and append items remove() remove one or more items from a List copy() make a shallow copy of a List deepcopy() make a full copy of a List filter() remove selected items from a List map() change each List item + mapnew() make a new List with changed items reduce() reduce a List to a value + slice() take a slice of a List sort() sort a List reverse() reverse the order of a List uniq() remove copies of repeated adjacent items @@ -667,8 +673,10 @@ empty() check if Dictionary is empty remove() remove an entry from a Dictionary extend() add entries from one Dictionary to another + extendnew() make a new Dictionary and append items filter() remove selected entries from a Dictionary map() change each Dictionary entry + mapnew() make a new Dictionary with changed items keys() get List of Dictionary keys values() get List of Dictionary values items() get List of Dictionary key-value pairs @@ -715,7 +723,8 @@ srand() initialize seed used by rand() Variables: *var-functions* - type() type of a variable + type() type of a variable as a number + typename() type of a variable as text islocked() check if a variable is locked funcref() get a Funcref for a function reference function() get a Funcref for a function name @@ -750,6 +759,11 @@ screenchar() get character code at a screen line/row screenchars() get character codes at a screen line/row screenstring() get string of characters at a screen line/row + charcol() character number of the cursor or a mark + getcharpos() get character position of cursor, mark, etc. + setcharpos() set character position of cursor, mark, etc. + getcursorcharpos() get character position of the cursor + setcursorcharpos() set character position of the cursor Working with text in the current buffer: *text-functions* getline() get a line or list of lines from the buffer @@ -809,6 +823,7 @@ setenv() set an environment variable hostname() name of the system readfile() read a file into a List of lines + readblob() read a file into a Blob readdir() get a List of file names in a directory readdirex() get a List of file information in a directory writefile() write a List of lines or Blob into a file @@ -1763,7 +1778,7 @@ elsewhere, but form a nice checklist. The end-of-line character depends on the system. For Unix a single -character is used. For MS-Windows and the like, is used. This is +character is used. For MS-Windows and the like, is used. This is important when using mappings that end in a . See |:source_crnl|. diff -Nru vim-8.2.1913/runtime/doc/various.txt vim-8.2.2434/runtime/doc/various.txt --- vim-8.2.1913/runtime/doc/various.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/various.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*various.txt* For Vim version 8.2. Last change: 2020 Aug 20 +*various.txt* For Vim version 8.2. Last change: 2021 Jan 16 VIM REFERENCE MANUAL by Bram Moolenaar @@ -142,15 +142,17 @@ quit < *:z* *E144* -:{range}z[+-^.=]{count} Display several lines of text surrounding the line - specified with {range}, or around the current line - if there is no {range}. If there is a {count}, that's - how many lines you'll see; if there is no {count} and - only one window then twice the value of the 'scroll' - option is used, otherwise the current window height - minus 3 is used. +:[range]z[+-^.=][count] Display several lines of text surrounding the line + specified with [range], or around the current line + if there is no [range]. + + If there is a [count], that's how many lines you'll + see; if there is no [count] and only one window then + twice the value of the 'scroll' option is used, + otherwise the current window height minus 3 is used. + This is the value of "scr" in the table below. - If there is a {count} the 'window' option is set to + If there is a [count] the 'window' option is set to its value. :z can be used either alone or followed by any of @@ -168,7 +170,7 @@ If the mark is "=", a line of dashes is printed around the current line. -:{range}z#[+-^.=]{count} *:z#* +:[range]z#[+-^.=][count] *:z#* Like ":z", but number the lines. *:=* @@ -409,7 +411,7 @@ B *+mouse_sgr* Unix only: sgr mouse handling |sgr-mouse| B *+mouse_urxvt* Unix only: urxvt mouse handling |urxvt-mouse| N *+mouse_xterm* Unix only: xterm mouse handling |xterm-mouse| -N *+multi_byte* 16 and 32 bit characters |multibyte| +T *+multi_byte* Unicode support, 16 and 32 bit characters |multibyte| *+multi_byte_ime* Win32 input method for multibyte chars |multibyte-ime| N *+multi_lang* non-English language support |multi-lang| m *+mzscheme* Mzscheme interface |mzscheme| @@ -705,12 +707,12 @@ not more than one line. [N]gs *gs* *:sl* *:sleep* -:[N]sl[eep] [N] [m] Do nothing for [N] seconds. When [m] is included, +:[N]sl[eep] [N][m] Do nothing for [N] seconds. When [m] is included, sleep for [N] milliseconds. The count for "gs" always uses seconds. The default is one second. > :sleep "sleep for one second :5sleep "sleep for five seconds - :sleep 100m "sleep for a hundred milliseconds + :sleep 100m "sleep for 100 milliseconds 10gs "sleep for ten seconds < Can be interrupted with CTRL-C (CTRL-Break on MS-Windows). "gs" stands for "goto sleep". @@ -720,6 +722,9 @@ available when compiled with the |+netbeans_intg| feature} + *:sl!* *:sleep!* +:[N]sl[eep]! [N] [m] Same as above, but hide the cursor + *:xrestore* *:xr* :xr[estore] [display] Reinitializes the connection to the X11 server. Useful after the X server restarts, e.g. when running Vim for diff -Nru vim-8.2.1913/runtime/doc/version5.txt vim-8.2.2434/runtime/doc/version5.txt --- vim-8.2.1913/runtime/doc/version5.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/version5.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*version5.txt* For Vim version 8.2. Last change: 2020 Sep 02 +*version5.txt* For Vim version 8.2. Last change: 2020 Dec 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -805,7 +805,7 @@ Unix: Besides using CTRL-C, also use the INTR character from the tty settings. Somebody has INTR set to DEL. -Allow a in a ":help" command argument to end the help command, so another +Allow a in a ":help" command argument to end the help command, so another command can follow. Doing "%" on a line that starts with " #if" didn't jump to matching "#else". diff -Nru vim-8.2.1913/runtime/doc/version6.txt vim-8.2.2434/runtime/doc/version6.txt --- vim-8.2.1913/runtime/doc/version6.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/version6.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1331,7 +1331,7 @@ executable() Checks if a program or batch script can be executed. filewritable() Checks if a file can be written. (Ron Aaron) foldclosed() Find out if there is a closed fold. (Johannes Zellner). -foldcloseend() Find the end of a closed fold. +foldclosedend() Find the end of a closed fold. foldlevel() Find out the foldlevel. (Johannes Zellner) foreground() Move the GUI window to the foreground. getchar() Get one character from the user. Can be used to define a @@ -9661,7 +9661,7 @@ Files: src/os_unix.c Patch 6.2f.018 -Problem: Mac OS X 10.2: OK is defined to zero in cursus.h while Vim uses +Problem: Mac OS X 10.2: OK is defined to zero in curses.h while Vim uses one. Redefining it causes a warning message. Solution: Undefine OK before defining it to one. (Taro Muraoka) Files: src/vim.h diff -Nru vim-8.2.1913/runtime/doc/version8.txt vim-8.2.2434/runtime/doc/version8.txt --- vim-8.2.1913/runtime/doc/version8.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/version8.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*version8.txt* For Vim version 8.2. Last change: 2020 Oct 25 +*version8.txt* For Vim version 8.2. Last change: 2020 Dec 24 VIM REFERENCE MANUAL by Bram Moolenaar @@ -76,7 +76,7 @@ Also asynchronous are timers. They can fire once or repeatedly and invoke a function to do any work. For example: > let tempTimer = timer_start(4000, 'CheckTemp') -This will call the CheckTemp() function four seconds (4000 milli seconds) +This will call the CheckTemp() function four seconds (4000 milliseconds) later. See |timer_start()|. @@ -3282,7 +3282,7 @@ Files: src/os_mswin.c Patch 7.4.472 -Problem: The "precedes" entry in 'listchar' will be drawn when 'showbreak' +Problem: The "precedes" entry in 'listchars' will be drawn when 'showbreak' is set and 'list' is not. Solution: Only draw this character when 'list' is on. (Christian Brabandt) Files: src/screen.c @@ -35835,7 +35835,7 @@ Patch 8.1.1592 Problem: May start file dialog while exiting. Solution: Ignore the "browse" modifier when exiting. (Ozaki Kiichi, - closes #4582 + closes #4582) Files: src/ex_cmds.c, src/terminal.c Patch 8.1.1593 @@ -42557,7 +42557,7 @@ src/testdir/dumps/Test_statusline_1.dump Patch 8.2.0236 -Problem: MS-Windows uninstall doesn't delete vimtutur.bat. +Problem: MS-Windows uninstall doesn't delete vimtutor.bat. Solution: Change directory before deletion. (Ken Takata, closes #5603) Files: src/uninstall.c @@ -46431,7 +46431,7 @@ Patch 8.2.0854 Problem: Xxd cannot show offset as a decimal number. -Solution: Add the "-d" flag. (Aapo Rantalainen, closes #5616 +Solution: Add the "-d" flag. (Aapo Rantalainen, closes #5616) Files: src/testdir/test_xxd.vim, src/xxd/xxd.c Patch 8.2.0855 @@ -46661,7 +46661,7 @@ Files: src/gui_xim.c Patch 8.2.0890 -Problem: No color in terminal window when 'termguicolor' is set. +Problem: No color in terminal window when 'termguicolors' is set. Solution: Clear the underline color. (closes #6186) Files: src/highlight.c @@ -46728,7 +46728,7 @@ Patch 8.2.0902 Problem: Using searchcount() in 'statusline' causes an error. -Solution: Avoid saving/restoring the search patten recursively. +Solution: Avoid saving/restoring the search pattern recursively. (closes #6194) Files: src/search.c, src/testdir/test_search_stat.vim, src/testdir/dumps/Test_searchstat_4.dump @@ -48832,7 +48832,7 @@ Patch 8.2.1260 Problem: There is no good test for CursorHold. Solution: Add a test. Remove duplicated test. (Yegappan Lakshmanan, - closes #6503 + closes #6503) Files: src/testdir/test_autocmd.vim, src/testdir/test_buffer.vim, src/testdir/test_normal.vim diff -Nru vim-8.2.1913/runtime/doc/vi_diff.txt vim-8.2.2434/runtime/doc/vi_diff.txt --- vim-8.2.1913/runtime/doc/vi_diff.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/vi_diff.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*vi_diff.txt* For Vim version 8.2. Last change: 2020 Aug 15 +*vi_diff.txt* For Vim version 8.2. Last change: 2021 Jan 21 VIM REFERENCE MANUAL by Bram Moolenaar @@ -73,7 +73,7 @@ Vim has only a few limits for the files that can be edited {Vi: can not handle characters and characters above 128, has limited line length, many other limits}. - *E340* + Maximum line length 2147483647 characters. Longer lines are split. Maximum number of lines 2147483647 lines. Maximum file size 2147483647 bytes (2 Gbyte) when a long integer is diff -Nru vim-8.2.1913/runtime/doc/vim.1 vim-8.2.2434/runtime/doc/vim.1 --- vim-8.2.1913/runtime/doc/vim.1 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/vim.1 2021-01-30 22:05:11.000000000 +0000 @@ -459,6 +459,9 @@ \-\-socketid {id} GTK GUI only: Use the GtkPlug mechanism to run gvim in another window. .TP +\-\-startuptime {file} +During startup write timing messages to the file {fname}. +.TP \-\-version Print version information and exit. .SH ON-LINE HELP diff -Nru vim-8.2.1913/runtime/doc/vim9.txt vim-8.2.2434/runtime/doc/vim9.txt --- vim-8.2.1913/runtime/doc/vim9.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/vim9.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*vim9.txt* For Vim version 8.2. Last change: 2020 Oct 17 +*vim9.txt* For Vim version 8.2. Last change: 2021 Jan 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -6,7 +6,7 @@ THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE -Vim9 script commands and expressions. *vim9* +Vim9 script commands and expressions. *Vim9* *vim9* Most expression help is in |eval.txt|. This file is about the new syntax and features in Vim9 script. @@ -14,7 +14,7 @@ THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE -1. What is Vim9 script? |vim9-script| +1. What is Vim9 script? |Vim9-script| 2. Differences |vim9-differences| 3. New style functions |fast-functions| 4. Types |vim9-types| @@ -25,7 +25,7 @@ ============================================================================== -1. What is Vim9 script? *vim9-script* +1. What is Vim9 script? *Vim9-script* THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE @@ -52,8 +52,9 @@ - a script file where the first command is `vim9script` - an autocommand defined in the context of the above -When using `:function` in a Vim9 script file the legacy syntax is used. -However, this can be confusing and is therefore discouraged. +When using `:function` in a Vim9 script file the legacy syntax is used, with +the highest |scriptversion|. However, this can be confusing and is therefore +discouraged. Vim9 script and legacy Vim script can be mixed. There is no requirement to rewrite old scripts, they keep working as before. You may want to use a few @@ -70,28 +71,29 @@ Brief summary of the differences you will most often encounter when using Vim9 script and `:def` functions; details are below: - Comments start with #, not ": > - echo "hello" # comment + echo "hello" # comment - Using a backslash for line continuation is hardly ever needed: > - echo "hello " + echo "hello " .. yourName .. ", how are you?" - White space is required in many places. - Assign values without `:let`, declare variables with `:var`: > - var count = 0 + var count = 0 count += 3 - Constants can be declared with `:final` and `:const`: > - final matches = [] # add matches + final matches = [] # add matches const names = ['Betty', 'Peter'] # cannot be changed - `:final` cannot be used as an abbreviation of `:finally`. - Variables and functions are script-local by default. - Functions are declared with argument types and return type: > def CallMe(count: number, message: string): bool - Call functions without `:call`: > - writefile(['done'], 'file.txt') + writefile(['done'], 'file.txt') - You cannot use `:xit`, `:t`, `:append`, `:change`, `:insert` or curly-braces names. - A range before a command must be prefixed with a colon: > - :%s/this/that + :%s/this/that +- Unless mentioned specifically, the highest |scriptversion| is used. Comments starting with # ~ @@ -112,8 +114,13 @@ 101 number To improve readability there must be a space between a command and the # -that starts a comment. Note that #{ is the start of a dictionary, therefore -it does not start a comment. +that starts a comment: > + var name = value # comment + var name = value# error! + +In legacy Vim script # is also used for the alternate file name. In Vim9 +script you need to use %% instead. Instead of ## use %%% (stands for all +arguments). Vim9 functions ~ @@ -124,8 +131,8 @@ Many errors are already found when compiling, before the function is executed. The syntax is strict, to enforce code that is easy to read and understand. -Compilation is done when: -- the function is first called +Compilation is done when either of these is encountered: +- the first time the function is called - when the `:defcompile` command is encountered in the script where the function was defined - `:disassemble` is used for the function. @@ -133,8 +140,9 @@ reference `:def` has no options like `:function` does: "range", "abort", "dict" or -"closure". A `:def` function always aborts on an error, does not get a range -passed and cannot be a "dict" function. +"closure". A `:def` function always aborts on an error (unless `:silent!` was +used for the command or inside a `:try` block), does not get a range passed +cannot be a "dict" function, and can always be a closure. The argument types and return type need to be specified. The "any" type can be used, type checking will then be done at runtime, like with legacy @@ -187,6 +195,33 @@ Vim9 script script-local functions are defined once when the script is sourced and cannot be deleted or replaced. +When compiling a function and a function call is encountered for a function +that is not (yet) defined, the |FuncUndefined| autocommand is not triggered. +You can use an autoload function if needed, or call a legacy function and have +|FuncUndefined| triggered there. + + +Reloading a Vim9 script clears functions and variables by default ~ + *vim9-reload* +When loading a legacy Vim script a second time nothing is removed, the +commands will replace existing variables and functions and create new ones. + +When loading a Vim9 script a second time all existing script-local functions +and variables are deleted, thus you start with a clean slate. This is useful +if you are developing a plugin and want to try a new version. If you renamed +something you don't have to worry about the old name still hanging around. + +If you do want to keep items, use: > + vim9script noclear + +You want to use this in scripts that use a `finish` command to bail out at +some point when loaded again. E.g. when a buffer local option is set: > + vim9script noclear + setlocal completefunc=SomeFunc + if exists('*g:SomeFunc') | finish | endif + def g:SomeFunc() + .... + Variable declarations with :var, :final and :const ~ *vim9-declaration* *:var* @@ -282,7 +317,7 @@ NAMES[0] = ["Jack"] # Error! NAMES[0][0] = "Jack" # Error! NAMES[1] = ["Emma"] # Error! - Names[1][0] = "Emma" # OK, now females[0] == "Emma" + NAMES[1][0] = "Emma" # OK, now females[0] == "Emma" < *E1092* Declaring more than one variable at a time, using the unpack notation, is @@ -303,8 +338,7 @@ myList->add(123) g:myList->add(123) [1, 2, 3]->Process() - #{a: 1, b: 2}->Process() - {'a': 1, 'b': 2}->Process() + {a: 1, b: 2}->Process() "foobar"->Process() ("foobar")->Process() 'foobar'->Process() @@ -336,17 +370,61 @@ number of arguments and any return type. The function can be defined later. +Lambda using => instead of -> ~ + +In legacy script there can be confusion between using "->" for a method call +and for a lambda. Also, when a "{" is found the parser needs to figure out if +it is the start of a lambda or a dictionary, which is now more complicated +because of the use of argument types. + +To avoid these problems Vim9 script uses a different syntax for a lambda, +which is similar to Javascript: > + var Lambda = (arg) => expression + +No line break is allowed in the arguments of a lambda up to and including the +"=>". This is OK: > + filter(list, (k, v) => + v > 0) +This does not work: > + filter(list, (k, v) + => v > 0) +This also does not work: > + filter(list, (k, + v) => v > 0) +But you can use a backslash to concatenate the lines before parsing: > + filter(list, (k, + \ v) + \ => v > 0) + +Additionally, a lambda can contain statements in {}: > + var Lambda = (arg) => { + g:was_called = 'yes' + return expression + } +NOT IMPLEMENTED YET + + *vim9-curly* +To avoid the "{" of a dictionary literal to be recognized as a statement block +wrap it in parenthesis: > + var Lambda = (arg) => ({key: 42}) + +Also when confused with the start of a command block: > + ({ + key: value + })->method() + + Automatic line continuation ~ In many cases it is obvious that an expression continues on the next line. In -those cases there is no need to prefix the line with a backslash -|line-continuation|. For example, when a list spans multiple lines: > +those cases there is no need to prefix the line with a backslash (see +|line-continuation|). For example, when a list spans multiple lines: > var mylist = [ 'one', 'two', ] And when a dict spans multiple lines: > - var mydict = #{ + var mydict = { one: 1, two: 2, } @@ -362,7 +440,7 @@ .. middle .. end var total = start + - end - + end - correction var result = positive ? PosFunc(arg) @@ -377,6 +455,12 @@ var result = MyDict .member +For commands that have an argument that is a list of commands, the | character +at the start of the line indicates line continuation: > + autocmd BufNewFile *.match if condition + | echo 'match' + | endif + < *E1050* To make it possible for the operator at the start of the line to be recognized, it is required to put a colon before a range. This will add @@ -390,6 +474,9 @@ var result = start :+ print +Note that the colon is not required for the |+cmd| argument: > + edit +6 fname + It is also possible to split a function header over multiple lines, in between arguments: > def MyFunc( @@ -397,6 +484,19 @@ separator = '-' ): string +Since a continuation line cannot be easily recognized the parsing of commands +has been made stricter. E.g., because of the error in the first line, the +second line is seen as a separate command: > + popup_create(some invalid expression, { + exit_cb: Func}) +Now "exit_cb: Func})" is actually a valid command: save any changes to the +file "_cb: Func})" and exit. To avoid this kind of mistake in Vim9 script +there must be white space between most command names and the argument. + +However, the argument of a command that is a command won't be recognized. For +example, after "windo echo expr" a line break inside "expr" will not be seen. + + Notes: - "enddef" cannot be used at the start of a continuation line, it ends the current function. @@ -416,20 +516,39 @@ < This does not work: > echo [1, 2] [3, 4] -- No line break is allowed in the arguments of a lambda, between the "{" and - "->". This is OK: > - filter(list, {k, v -> - v > 0}) -< This does not work: > - filter(list, {k, - v -> v > 0}) - No curly braces expansion ~ |curly-braces-names| cannot be used. +Dictionary literals ~ + +Traditionally Vim has supported dictionary literals with a {} syntax: > + let dict = {'key': value} + +Later it became clear that using a simple text key is very common, thus +literal dictionaries were introduced in a backwards compatible way: > + let dict = #{key: value} + +However, this #{} syntax is unlike any existing language. As it turns out +that using a literal key is much more common than using an expression, and +considering that JavaScript uses this syntax, using the {} form for dictionary +literals is considered a much more useful syntax. In Vim9 script the {} form +uses literal keys: > + var dict = {key: value} + +This works for alphanumeric characters, underscore and dash. If you want to +use another character, use a single or double quoted string: > + var dict = {'key with space': value} + var dict = {"key\twith\ttabs": value} + var dict = {'': value} # empty key + +In case the key needs to be an expression, square brackets can be used, just +like in JavaScript: > + var dict = {["key" .. nr]: value} + + No :xit, :t, :append, :change or :insert ~ These commands are too easily confused with local variable names. @@ -442,6 +561,29 @@ The 'ignorecase' option is not used for comparators that use strings. +For loop ~ + +Legacy Vim script has some tricks to make a for loop over a list handle +deleting items at the current or previous item. In Vim9 script it just uses +the index, if items are deleted then items in the list will be skipped. +Example legacy script: > + let l = [1, 2, 3, 4] + for i in l + echo i + call remove(l, index(l, i)) + endfor +Would echo: + 1 + 2 + 3 + 4 +In compiled Vim9 script you get: + 1 + 3 +Generally, you should not change the list that is iterated over. Make a copy +first if needed. + + White space ~ Vim9 script enforces proper use of white space. This is no longer allowed: > @@ -457,17 +599,26 @@ White space is required around most operators. +White space is required in a sublist (list slice) around the ":", except at +the start and end: > + otherlist = mylist[v : count] # v:count has a different meaning + otherlist = mylist[:] # make a copy of the List + otherlist = mylist[v :] + otherlist = mylist[: v] + White space is not allowed: - Between a function name and the "(": > - call Func (arg) # Error! - call Func + Func (arg) # Error! + Func \ (arg) # Error! - call Func(arg) # OK - call Func( - \ arg) # OK - call Func( - \ arg # OK - \ ) + Func + (arg) # Error! + Func(arg) # OK + Func( + arg) # OK + Func( + arg # OK + ) Conditions and expressions ~ @@ -487,7 +638,7 @@ empty list and dict is falsy: type truthy when ~ - bool v:true or 1 + bool true, v:true or 1 number non-zero float non-zero string non-empty @@ -495,11 +646,11 @@ list non-empty (different from JavaScript) dictionary non-empty (different from JavaScript) func when there is a function name - special v:true + special true or v:true job when not NULL channel when not NULL class when not NULL - object when not NULL (TODO: when isTrue() returns v:true) + object when not NULL (TODO: when isTrue() returns true) The boolean operators "||" and "&&" expect the values to be boolean, zero or one: > @@ -514,25 +665,37 @@ When using "!" for inverting, there is no error for using any type and the result is a boolean. "!!" can be used to turn any value into boolean: > - !'yes' == false + !'yes' == false !![] == false - !![1, 2, 3] == true + !![1, 2, 3] == true When using "`.."` for string concatenation arguments of simple types are always converted to string: > 'hello ' .. 123 == 'hello 123' - 'hello ' .. v:true == 'hello v:true' + 'hello ' .. v:true == 'hello true' Simple types are string, float, special and bool. For other types |string()| can be used. - *false* *true* -In Vim9 script one can use "true" for v:true and "false" for v:false. + *false* *true* *null* +In Vim9 script one can use "true" for v:true, "false" for v:false and "null" +for v:null. When converting a boolean to a string "false" and "true" are +used, not "v:false" and "v:true" like in legacy script. "v:none" is not +changed, it is only used in JSON and has no equivalent in other languages. -Indexing a string with [idx] or [idx, idx] uses character indexes instead of +Indexing a string with [idx] or [idx : idx] uses character indexes instead of byte indexes. Example: > echo 'bár'[1] In legacy script this results in the character 0xc3 (an illegal byte), in Vim9 script this results in the string 'á'. +A negative index is counting from the end, "[-1]" is the last character. +To exclude the last character use |slice()|. +If the index is out of range then an empty string results. + +In legacy script "++var" and "--var" would be silently accepted and have no +effect. This is an error in Vim9 script. + +Numbers starting with zero are not considered to be octal, only numbers +starting with "0o" are octal: "0o744". |scriptversion-4| What to watch out for ~ @@ -542,21 +705,22 @@ be made. Here is a summary of what might be unexpected. Ex command ranges need to be prefixed with a colon. > - -> # legacy Vim: shifts the previous line to the right - ->func() # Vim9: method call in continuation line - :-> # Vim9: shifts the previous line to the right + -> legacy Vim: shifts the previous line to the right + ->func() Vim9: method call in a continuation line + :-> Vim9: shifts the previous line to the right - %s/a/b # legacy Vim: substitute on all lines + %s/a/b legacy Vim: substitute on all lines x = alongname - % another # Vim9: line continuation without a backslash - :%s/a/b # Vim9: substitute on all lines - 'text'->func() # Vim9: method call - :'t # legacy Vim: jump to mark m + % another Vim9: modulo operator in a continuation line + :%s/a/b Vim9: substitute on all lines + 't legacy Vim: jump to mark t + 'text'->func() Vim9: method call + :'t Vim9: jump to mark t Some Ex commands can be confused with assignments in Vim9 script: > - g:name = value # assignment - g:pattern:cmd # invalid command - ERROR - :g:pattern:cmd # :global command + g:name = value # assignment + g:pattern:cmd # invalid command - ERROR + :g:pattern:cmd # :global command Functions defined with `:def` compile the whole function. Legacy functions can bail out, and the following lines are not parsed: > @@ -571,12 +735,12 @@ if !has('feature') return endif - use-feature # May give compilation error + use-feature # May give a compilation error enddef For a workaround, split it in two functions: > func Maybe() if has('feature') - call MaybyInner() + call MaybeInner() endif endfunc if has('feature') @@ -591,12 +755,38 @@ use-feature endif enddef +< *vim9-user-command* +Another side effect of compiling a function is that the presence of a user +command is checked at compile time. If the user command is defined later an +error will result. This works: > + command -nargs=1 MyCommand echom + def Works() + MyCommand 123 + enddef +This will give an error for "MyCommand" not being defined: > + def Works() + command -nargs=1 MyCommand echom + MyCommand 123 + enddef +A workaround is to invoke the command indirectly with `:execute`: > + def Works() + command -nargs=1 MyCommand echom + execute 'MyCommand 123' + enddef + Note that for unrecognized commands there is no check for "|" and a following command. This will give an error for missing `endif`: > def Maybe() if has('feature') | use-feature | endif enddef +Other differences ~ + +Patterns are used like 'magic' is set, unless explicitly overruled. +The 'edcompatible' option value is not used. +The 'gdefault' option value is not used. + + ============================================================================== 3. New style functions *fast-functions* @@ -657,21 +847,30 @@ Note that for command line completion of {func} you can prepend "s:" to find script-local functions. +:disa[ssemble]! {func} Like `:disassemble` but with the instructions used for + profiling. + Limitations ~ Local variables will not be visible to string evaluation. For example: > - def EvalString(): list + def MapList(): list var list = ['aa', 'bb', 'cc', 'dd'] return range(1, 2)->map('list[v:val]') enddef The map argument is a string expression, which is evaluated without the function scope. Instead, use a lambda: > - def EvalString(): list + def MapList(): list var list = ['aa', 'bb', 'cc', 'dd'] - return range(1, 2)->map({ _, v -> list[v] }) + return range(1, 2)->map(( _, v) => list[v]) enddef +The same is true for commands that are not compiled, such as `:global`. +For these the backtick expansion can be used. Example: > + def Replace() + var newText = 'blah' + g/pattern/s/^/`=newText`/ + enddef ============================================================================== @@ -766,12 +965,14 @@ This can be a problem when the "any" type is undesired and the actual type is expected to always be the same. For example, when declaring a list: > var l: list = [1, g:two] -This will give an error, because "g:two" has type "any". To avoid this, use a -type cast: > +At compile time Vim doesn't know the type of "g:two" and the expression type +becomes list. An instruction is generated to check the list type before +doing the assignment, which is a bit inefficient. + *type-casting* +To avoid this, use a type cast: > var l: list = [1, g:two] -< *type-casting* -The compiled code will then check that "g:two" is a number at runtime and give -an error if it isn't. This is called type casting. +The compiled code will then only check that "g:two" is a number and give an +error if it isn't. This is called type casting. The syntax of a type cast is: "<" {type} ">". There cannot be white space after the "<" or before the ">" (to avoid them being confused with @@ -813,6 +1014,12 @@ - Using a string value when setting a number options. - Using a number where a string is expected. *E1024* +One consequence is that the item type of a list or dict given to map() must +not change. This will give an error in compiled code: > + map([1, 2, 3], (i, v) => 'item ' .. i) + E1012: Type mismatch; expected list but got list +Instead use |mapnew()|. + ============================================================================== 5. Namespace, Import and Export @@ -829,7 +1036,7 @@ Namespace ~ - *:vim9script* *:vim9* + *vim9-namespace* To recognize a file that can be imported the `vim9script` statement must appear as the first statement in the file. It tells Vim to interpret the script in its own namespace, instead of the global namespace. If a file @@ -922,14 +1129,14 @@ 1. In the plugin define user commands, functions and/or mappings that refer to an autoload script. > - command -nargs=1 SearchForStuff call searchfor#Stuff() + command -nargs=1 SearchForStuff searchfor#Stuff() < This goes in .../plugin/anyname.vim. "anyname.vim" can be freely chosen. 2. In the autoload script do the actual work. You can import items from other files to split up functionality in appropriate pieces. > vim9script - import FilterFunc from "../import/someother.vim" + import FilterFunc from "../import/someother.vim" def searchfor#Stuff(arg: string) var filtered = FilterFunc(arg) ... @@ -1015,12 +1222,12 @@ should be done at compile time. Postponing it to runtime makes the execution slower and means mistakes are found only later. For example, when encountering the "+" character and compiling this into a generic add -instruction, at execution time the instruction would have to inspect the type -of the arguments and decide what kind of addition to do. And when the -type is dictionary throw an error. If the types are known to be numbers then -an "add number" instruction can be used, which is faster. The error can be -given at compile time, no error handling is needed at runtime, since adding -two numbers cannot fail. +instruction, at runtime the instruction would have to inspect the type of the +arguments and decide what kind of addition to do. And when the type is +dictionary throw an error. If the types are known to be numbers then an "add +number" instruction can be used, which is faster. The error can be given at +compile time, no error handling is needed at runtime, since adding two numbers +cannot fail. The syntax for types, using for compound types, is similar to Java. It is easy to understand and widely used. The type names are what were used in @@ -1103,7 +1310,7 @@ `:var`. This is used in many languages. The semantics might be slightly different, but it's easily recognized as a declaration. -Using `:const` for constants is common, but the semantics vary. Some +Using `:const` for constants is common, but the semantics varies. Some languages only make the variable immutable, others also make the value immutable. Since "final" is well known from Java for only making the variable immutable we decided to use that. And then `:const` can be used for making @@ -1163,7 +1370,7 @@ considered false. Thus using a string for a condition would often not give an error and be considered false. That is confusing. -In Vim9 type checking is more strict to avoid mistakes. Where a condition is +In Vim9 type checking is stricter to avoid mistakes. Where a condition is used, e.g. with the `:if` command and the `||` operator, only boolean-like values are accepted: true: `true`, `v:true`, `1`, `0 < 9` diff -Nru vim-8.2.1913/runtime/doc/vim.man vim-8.2.2434/runtime/doc/vim.man --- vim-8.2.1913/runtime/doc/vim.man 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/vim.man 2021-01-30 22:05:11.000000000 +0000 @@ -345,6 +345,9 @@ GTK GUI only: Use the GtkPlug mechanism to run gvim in an†other window. + --startuptime {file} + During startup write timing messages to the file {fname}. + --version Print version information and exit. ON-LINE HELP diff -Nru vim-8.2.1913/runtime/doc/windows.txt vim-8.2.2434/runtime/doc/windows.txt --- vim-8.2.1913/runtime/doc/windows.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/doc/windows.txt 2021-01-30 22:05:11.000000000 +0000 @@ -1,4 +1,4 @@ -*windows.txt* For Vim version 8.2. Last change: 2020 Sep 02 +*windows.txt* For Vim version 8.2. Last change: 2020 Dec 18 VIM REFERENCE MANUAL by Bram Moolenaar @@ -205,11 +205,6 @@ This behaves like a ":split" first, and then an ":enew" command. -:[N]vne[w] [++opt] [+cmd] [file] *:vne* *:vnew* - Like |:new|, but split vertically. If 'equalalways' is set - and 'eadirection' isn't "ver" the windows will be spread out - horizontally, unless a width was specified. - :[N]new [++opt] [+cmd] {file} :[N]sp[lit] [++opt] [+cmd] {file} *:split_f* Create a new window and start editing file {file} in it. This @@ -221,6 +216,11 @@ height). Reduces the current window height to create room (and others, if the 'equalalways' option is set). +:[N]vne[w] [++opt] [+cmd] [file] *:vne* *:vnew* + Like |:new|, but split vertically. If 'equalalways' is set + and 'eadirection' isn't "ver" the windows will be spread out + horizontally, unless a width was specified. + :[N]sv[iew] [++opt] [+cmd] [file] *:sv* *:sview* *splitview* Same as ":split", but set 'readonly' option for this buffer. @@ -1119,6 +1119,11 @@ line when the buffer is first entered. Note that other commands after the + will be ignored. + *:balt* +:balt [+lnum] {fname} + Like `:badd` and also set the alternate file for the current + window to {fname}. + :[N]bd[elete][!] *:bd* *:bdel* *:bdelete* *E516* :bd[elete][!] [N] Unload buffer [N] (default: current buffer) and delete it from diff -Nru vim-8.2.1913/runtime/filetype.vim vim-8.2.2434/runtime/filetype.vim --- vim-8.2.1913/runtime/filetype.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/filetype.vim 2021-01-30 22:05:11.000000000 +0000 @@ -1,7 +1,7 @@ " Vim support file to detect file types " " Maintainer: Bram Moolenaar -" Last Change: 2020 Oct 24 +" Last Change: 2021 Jan 21 " Listen very carefully, I will say this only once if exists("did_load_filetypes") @@ -499,6 +499,9 @@ " DOT au BufNewFile,BufRead *.dot,*.gv setf dot +" Dune +au BufNewFile,BufRead jbuild,dune,dune-project,dune-workspace setf dune + " Dylan - lid files au BufNewFile,BufRead *.lid setf dylanlid @@ -586,6 +589,9 @@ " Factor au BufNewFile,BufRead *.factor setf factor +" Fennel +autocmd BufRead,BufNewFile *.fnl setf fennel + " Fetchmail RC file au BufNewFile,BufRead .fetchmailrc setf fetchmail @@ -627,6 +633,9 @@ " Gedcom au BufNewFile,BufRead *.ged,lltxxxxx.txt setf gedcom +" Gift (Moodle) +autocmd BufRead,BufNewFile *.gift setf gift + " Git au BufNewFile,BufRead COMMIT_EDITMSG,MERGE_MSG,TAG_EDITMSG setf gitcommit au BufNewFile,BufRead *.git/config,.gitconfig,/etc/gitconfig setf gitconfig @@ -696,12 +705,15 @@ au BufNewFile,BufRead *.haml setf haml " Hamster Classic | Playground files -au BufNewFile,BufRead *.hsc,*.hsm setf hamster +au BufNewFile,BufRead *.hsm setf hamster " Haskell -au BufNewFile,BufRead *.hs,*.hs-boot setf haskell +au BufNewFile,BufRead *.hs,*.hsc,*.hs-boot setf haskell au BufNewFile,BufRead *.lhs setf lhaskell au BufNewFile,BufRead *.chs setf chaskell +au BufNewFile,BufRead cabal.project setf cabalproject +au BufNewFile,BufRead $HOME/.cabal/config setf cabalconfig +au BufNewFile,BufRead cabal.config setf cabalconfig " Haste au BufNewFile,BufRead *.ht setf haste @@ -1119,8 +1131,8 @@ " NSIS au BufNewFile,BufRead *.nsi,*.nsh setf nsis -" OCAML -au BufNewFile,BufRead *.ml,*.mli,*.mll,*.mly,.ocamlinit setf ocaml +" OCaml +au BufNewFile,BufRead *.ml,*.mli,*.mll,*.mly,.ocamlinit,*.mlt,*.mlp,*.mlip,*.mli.cppo,*.ml.cppo setf ocaml " Occam au BufNewFile,BufRead *.occ setf occam @@ -1128,6 +1140,9 @@ " Omnimark au BufNewFile,BufRead *.xom,*.xin setf omnimark +" OPAM +au BufNewFile,BufRead opam,*.opam,*.opam.template setf opam + " OpenROAD au BufNewFile,BufRead *.or setf openroad @@ -1161,8 +1176,11 @@ " Password file au BufNewFile,BufRead */etc/passwd,*/etc/passwd-,*/etc/passwd.edit,*/etc/shadow,*/etc/shadow-,*/etc/shadow.edit,*/var/backups/passwd.bak,*/var/backups/shadow.bak setf passwd -" Pascal (also *.p) -au BufNewFile,BufRead *.pas,*.pp setf pascal +" Pascal (also *.p, *.pp, *.inc) +au BufNewFile,BufRead *.pas setf pascal + +" Pascal or Puppet manifest +au BufNewFile,BufRead *.pp call dist#ft#FTpp() " Delphi or Lazarus program file au BufNewFile,BufRead *.dpr,*.lpr setf pascal @@ -1252,7 +1270,7 @@ " Povray configuration au BufNewFile,BufRead .povrayrc setf povini -" Povray, PHP or assembly +" Povray, Pascal, PHP or assembly au BufNewFile,BufRead *.inc call dist#ft#FTinc() " Printcap and Termcap @@ -1261,13 +1279,19 @@ au BufNewFile,BufRead *termcap \ let b:ptcap_type = "term" | setf ptcap -" PCCTS / ANTRL -"au BufNewFile,BufRead *.g setf antrl +" PCCTS / ANTLR +"au BufNewFile,BufRead *.g setf antlr au BufNewFile,BufRead *.g setf pccts " PPWizard au BufNewFile,BufRead *.it,*.ih setf ppwiz +" Puppet +au BufNewFile,BufRead Puppetfile setf ruby + +" Embedded Puppet +au BufNewFile,BufRead *.epp setf epuppet + " Obj 3D file format " TODO: is there a way to avoid MS-Windows Object files? au BufNewFile,BufRead *.obj setf obj @@ -1305,6 +1329,7 @@ " Google protocol buffers au BufNewFile,BufRead *.proto setf proto +au BufNewFile,BufRead *.pbtxt setf pbtxt " Protocols au BufNewFile,BufRead */etc/protocols setf protocols @@ -1409,8 +1434,8 @@ " RubyGems au BufNewFile,BufRead *.gemspec setf ruby -" Rust -au BufNewFile,BufRead *.rs setf rust +" RBS (Ruby Signature) +au BufNewFile,BufRead *.rbs setf rbs " Rackup au BufNewFile,BufRead *.ru setf ruby @@ -1424,6 +1449,9 @@ " Rantfile and Rakefile is like Ruby au BufNewFile,BufRead [rR]antfile,*.rant,[rR]akefile,*.rake setf ruby +" Rust +au BufNewFile,BufRead *.rs setf rust + " S-lang (or shader language, or SmallLisp) au BufNewFile,BufRead *.sl setf slang @@ -1540,6 +1568,9 @@ " Screen RC au BufNewFile,BufRead .screenrc,screenrc setf screen +" Sexplib +au BufNewFile,BufRead *.sexp setf sexplib + " Simula au BufNewFile,BufRead *.sim setf simula @@ -1600,6 +1631,9 @@ au BufNewFile,BufRead *.hog,snort.conf,vision.conf setf hog au BufNewFile,BufRead *.rules call dist#ft#FTRules() +" SPARQL queries +au BufNewFile,BufRead *.rq,*.sparql setf sparql + " Spec (Linux RPM) au BufNewFile,BufRead *.spec setf spec @@ -1710,8 +1744,13 @@ " Telix Salt au BufNewFile,BufRead *.slt setf tsalt -" Tera Term Language -au BufRead,BufNewFile *.ttl setf teraterm +" Tera Term Language or Turtle +au BufRead,BufNewFile *.ttl + \ if getline(1) =~ '^@\?\(prefix\|base\)' | + \ setf turtle | + \ else | + \ setf teraterm | + \ endif " Terminfo au BufNewFile,BufRead *.ti setf terminfo @@ -1721,7 +1760,7 @@ au BufNewFile,BufRead *.tex call dist#ft#FTtex() " ConTeXt -au BufNewFile,BufRead *.mkii,*.mkiv,*.mkvi setf context +au BufNewFile,BufRead *.mkii,*.mkiv,*.mkvi,*.mkxl,*.mklx setf context " Texinfo au BufNewFile,BufRead *.texinfo,*.texi,*.txi setf texinfo @@ -1738,6 +1777,9 @@ " tmux configuration au BufNewFile,BufRead {.,}tmux*.conf setf tmux +" TOML +au BufNewFile,BufRead *.toml setf toml + " TPP - Text Presentation Program au BufNewFile,BufReadPost *.tpp setf tpp @@ -1759,8 +1801,13 @@ " TWIG files au BufNewFile,BufReadPost *.twig setf twig -" Typescript -au BufNewFile,BufReadPost *.ts setf typescript +" Typescript or Qt translation file (which is XML) +au BufNewFile,BufReadPost *.ts + \ if getline(1) =~ ' -" Last Change: 2020 Sep 28 +" Language: awk, nawk, gawk, mawk +" Maintainer: Doug Kearns +" Previous Maintainer: Antonio Colombo +" Last Change: 2020 Sep 28 " This plugin was prepared by Mark Sikora " This plugin was updated as proposed by Doug Kearns diff -Nru vim-8.2.1913/runtime/ftplugin/basic.vim vim-8.2.2434/runtime/ftplugin/basic.vim --- vim-8.2.1913/runtime/ftplugin/basic.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/basic.vim 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,27 @@ +" Vim filetype plugin file +" Language: BASIC +" Maintainer: Doug Kearns +" Last Change: 2015 Jan 10 + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +let s:cpo_save = &cpo +set cpo&vim + +setlocal comments=:REM,:' +setlocal commentstring='\ %s +setlocal formatoptions-=t formatoptions+=croql + +if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") + let b:browsefilter = "BASIC Source Files (*.bas)\t*.bas\n" . + \ "All Files (*.*)\t*.*\n" +endif + +let b:undo_ftplugin = "setl fo< com< cms< sua<" . + \ " | unlet! b:browsefilter" + +let &cpo = s:cpo_save +unlet s:cpo_save diff -Nru vim-8.2.1913/runtime/ftplugin/bzl.vim vim-8.2.2434/runtime/ftplugin/bzl.vim --- vim-8.2.1913/runtime/ftplugin/bzl.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/bzl.vim 2021-01-30 22:05:11.000000000 +0000 @@ -1,7 +1,7 @@ " Vim filetype plugin file " Language: Bazel (http://bazel.io) " Maintainer: David Barnett (https://github.com/google/vim-ft-bzl) -" Last Change: 2015 Aug 11 +" Last Change: 2021 Jan 19 "" " @section Introduction, intro @@ -51,6 +51,8 @@ endif if exists('*BzlFoldText') + let &cpo = s:save_cpo + unlet s:save_cpo finish endif diff -Nru vim-8.2.1913/runtime/ftplugin/css.vim vim-8.2.2434/runtime/ftplugin/css.vim --- vim-8.2.1913/runtime/ftplugin/css.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/css.vim 2021-01-30 22:05:11.000000000 +0000 @@ -2,7 +2,7 @@ " Language: CSS " Maintainer: Doug Kearns " Previous Maintainer: Nikolai Weibull -" Latest Revision: 2008-07-09 +" Last Change: 2020 Dec 21 if exists("b:did_ftplugin") finish @@ -12,11 +12,12 @@ let s:cpo_save = &cpo set cpo&vim -let b:undo_ftplugin = "setl com< cms< inc< fo< ofu<" +let b:undo_ftplugin = "setl com< cms< inc< fo< ofu< isk<" setlocal comments=s1:/*,mb:*,ex:*/ commentstring& setlocal formatoptions-=t formatoptions+=croql setlocal omnifunc=csscomplete#CompleteCSS +setlocal iskeyword+=- let &l:include = '^\s*@import\s\+\%(url(\)\=' diff -Nru vim-8.2.1913/runtime/ftplugin/dune.vim vim-8.2.2434/runtime/ftplugin/dune.vim --- vim-8.2.1913/runtime/ftplugin/dune.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/dune.vim 2021-01-30 22:05:11.000000000 +0000 @@ -1,7 +1,7 @@ " Language: Dune buildsystem " Maintainer: Markus Mottl " Anton Kochkov -" URL: https://github.com/rgrinberg/vim-ocaml +" URL: https://github.com/ocaml/vim-ocaml " Last Change: " 2018 Nov 3 - Added commentstring (Markus Mottl) " 2017 Sep 6 - Initial version (Etienne Millon) diff -Nru vim-8.2.1913/runtime/ftplugin/erlang.vim vim-8.2.2434/runtime/ftplugin/erlang.vim --- vim-8.2.1913/runtime/ftplugin/erlang.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/erlang.vim 2021-01-30 22:05:11.000000000 +0000 @@ -1,87 +1,83 @@ " Vim ftplugin file -" Language: Erlang +" Language: Erlang (http://www.erlang.org) +" Maintainer: Csaba Hoch " Author: Oscar Hellström " Contributors: Ricardo Catalinas Jiménez " Eduardo Lopez (http://github.com/tapichu) +" Arvid Bjurklint (http://github.com/slarwise) +" Last Update: 2021-Jan-08 " License: Vim license -" Version: 2012/01/25 +" URL: https://github.com/vim-erlang/vim-erlang-runtime if exists('b:did_ftplugin') - finish -else - let b:did_ftplugin = 1 -endif - -if exists('s:did_function_definitions') - call s:SetErlangOptions() - finish -else - let s:did_function_definitions = 1 + finish endif +let b:did_ftplugin = 1 let s:cpo_save = &cpo set cpo&vim -if !exists('g:erlang_keywordprg') - let g:erlang_keywordprg = 'erl -man' -endif +let &l:keywordprg = get(g:, 'erlang_keywordprg', 'erl -man') -if !exists('g:erlang_folding') - let g:erlang_folding = 0 +if get(g:, 'erlang_folding', 0) + setlocal foldmethod=expr + setlocal foldexpr=GetErlangFold(v:lnum) + setlocal foldtext=ErlangFoldText() endif +setlocal comments=:%%%,:%%,:% +setlocal commentstring=%%s + +setlocal formatoptions+=ro + +setlocal suffixesadd=.erl,.hrl + +let &l:include = '^\s*-\%(include\|include_lib\)\s*("\zs\f*\ze")' +let &l:define = '^\s*-\%(define\|record\|type\|opaque\)' + let s:erlang_fun_begin = '^\a\w*(.*$' let s:erlang_fun_end = '^[^%]*\.\s*\(%.*\)\?$' -function s:SetErlangOptions() - if g:erlang_folding - setlocal foldmethod=expr - setlocal foldexpr=GetErlangFold(v:lnum) - setlocal foldtext=ErlangFoldText() - endif - - setlocal comments=:%%%,:%%,:% - setlocal commentstring=%%s - - setlocal formatoptions+=ro - let &l:keywordprg = g:erlang_keywordprg -endfunction - -function GetErlangFold(lnum) - let lnum = a:lnum - let line = getline(lnum) - - if line =~ s:erlang_fun_end - return '<1' - endif - - if line =~ s:erlang_fun_begin && foldlevel(lnum - 1) == 1 - return '1' - endif - - if line =~ s:erlang_fun_begin - return '>1' - endif - - return '=' -endfunction - -function ErlangFoldText() - let line = getline(v:foldstart) - let foldlen = v:foldend - v:foldstart + 1 - let lines = ' ' . foldlen . ' lines: ' . substitute(line, "[\ \t]*", '', '') - if foldlen < 10 - let lines = ' ' . lines - endif - let retval = '+' . v:folddashes . lines +if !exists('*GetErlangFold') + function GetErlangFold(lnum) + let lnum = a:lnum + let line = getline(lnum) + + if line =~ s:erlang_fun_end + return '<1' + endif + + if line =~ s:erlang_fun_begin && foldlevel(lnum - 1) == 1 + return '1' + endif + + if line =~ s:erlang_fun_begin + return '>1' + endif - return retval -endfunction + return '=' + endfunction +endif -call s:SetErlangOptions() +if !exists('*ErlangFoldText') + function ErlangFoldText() + let line = getline(v:foldstart) + let foldlen = v:foldend - v:foldstart + 1 + let lines = ' ' . foldlen . ' lines: ' . substitute(line, "[\ \t]*", '', '') + if foldlen < 10 + let lines = ' ' . lines + endif + let retval = '+' . v:folddashes . lines -let b:undo_ftplugin = "setlocal foldmethod< foldexpr< foldtext<" - \ . " comments< commentstring< formatoptions<" + return retval + endfunction +endif + +let b:undo_ftplugin = "setlocal keywordprg< foldmethod< foldexpr< foldtext<" + \ . " comments< commentstring< formatoptions< suffixesadd< include<" + \ . " define<" let &cpo = s:cpo_save unlet s:cpo_save + +" vim: sw=2 et diff -Nru vim-8.2.1913/runtime/ftplugin/framescript.vim vim-8.2.2434/runtime/ftplugin/framescript.vim --- vim-8.2.1913/runtime/ftplugin/framescript.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/framescript.vim 2021-01-30 22:05:11.000000000 +0000 @@ -3,14 +3,14 @@ " Previous Maintainer: Nikolai Weibull " Latest Revision: 2008-07-19 -let s:cpo_save = &cpo -set cpo&vim - if exists("b:did_ftplugin") finish endif let b:did_ftplugin = 1 +let s:cpo_save = &cpo +set cpo&vim + let b:undo_ftplugin = "setl com< cms< fo< inc< | unlet! b:matchwords" setlocal comments=s1:/*,mb:*,ex:*/,:// commentstring=/*\ %s\ */ diff -Nru vim-8.2.1913/runtime/ftplugin/freebasic.vim vim-8.2.2434/runtime/ftplugin/freebasic.vim --- vim-8.2.1913/runtime/ftplugin/freebasic.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/freebasic.vim 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,13 @@ +" Vim filetype plugin file +" Language: FreeBasic +" Maintainer: Doug Kearns +" Last Change: 2015 Jan 10 + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +runtime! ftplugin/basic.vim + +" vim: ts=8 diff -Nru vim-8.2.1913/runtime/ftplugin/fstab.vim vim-8.2.2434/runtime/ftplugin/fstab.vim --- vim-8.2.1913/runtime/ftplugin/fstab.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/fstab.vim 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,19 @@ +" Vim ftplugin file +" Language: fstab file +" Maintainer: Radu Dineiu +" URL: https://raw.github.com/rid9/vim-fstab/master/ftplugin/fstab.vim +" Last Change: 2021 Jan 02 +" Version: 1.0 +" +" Credits: +" Subhaditya Nath + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +setlocal commentstring=#%s +let b:undo_ftplugin = "setlocal commentstring<" + +" vim: ts=8 ft=vim diff -Nru vim-8.2.1913/runtime/ftplugin/hamster.vim vim-8.2.2434/runtime/ftplugin/hamster.vim --- vim-8.2.1913/runtime/ftplugin/hamster.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/hamster.vim 2021-01-30 22:05:11.000000000 +0000 @@ -2,7 +2,7 @@ " Language: Hamster Script " Version: 2.0.6.0 " Maintainer: David Fishburn -" Last Change: 2017 Mar 18 +" Last Change: 2021 Jan 19 " Only do this when not done yet for this buffer if exists("b:did_ftplugin") @@ -57,6 +57,9 @@ endif setlocal ignorecase + let &cpo = s:cpo_save unlet s:cpo_save -setlocal cpo+=M " makes \%( match \) + +" Disabled, 'cpo' is a global option. +" setlocal cpo+=M " makes \%( match \) diff -Nru vim-8.2.1913/runtime/ftplugin/nroff.vim vim-8.2.2434/runtime/ftplugin/nroff.vim --- vim-8.2.1913/runtime/ftplugin/nroff.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/nroff.vim 2021-01-30 22:05:11.000000000 +0000 @@ -1,7 +1,9 @@ " Vim filetype plugin " Language: roff(7) -" Maintainer: Chris Spiegel -" Last Change: 2019 Apr 24 +" Maintainer: Aman Verma +" Homepage: https://github.com/a-vrma/vim-nroff-ftplugin +" Previous Maintainer: Chris Spiegel +" Last Change: 2020 Nov 21 if exists("b:did_ftplugin") finish @@ -9,3 +11,7 @@ let b:did_ftplugin = 1 setlocal commentstring=.\\\"%s +setlocal comments=:.\\\" +setlocal sections+=Sh + +let b:undo_ftplugin = 'setlocal commentstring< comments< sections<' diff -Nru vim-8.2.1913/runtime/ftplugin/ocaml.vim vim-8.2.2434/runtime/ftplugin/ocaml.vim --- vim-8.2.1913/runtime/ftplugin/ocaml.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/ocaml.vim 2021-01-30 22:05:11.000000000 +0000 @@ -5,7 +5,7 @@ " Pierre Vittet " Stefano Zacchiroli " Vincent Aravantinos -" URL: https://github.com/rgrinberg/vim-ocaml +" URL: https://github.com/ocaml/vim-ocaml " Last Change: " 2013 Oct 27 - Added commentstring (MM) " 2013 Jul 26 - load default compiler settings (MM) @@ -38,7 +38,8 @@ set cpo&vim " Comment string -setlocal comments= +setlocal comments=sr:(*\ ,mb:\ ,ex:*) +setlocal comments^=sr:(**,mb:\ \ ,ex:*) setlocal commentstring=(*%s*) " Add mappings, unless the user didn't want this. @@ -158,6 +159,8 @@ " - Only definitions below, executed once ------------------------------------- if exists("*OMLetFoldLevel") + let &cpoptions = s:cposet + unlet s:cposet finish endif @@ -391,9 +394,9 @@ endif endfun - " This variable contain a dictionnary of list. Each element of the dictionnary - " represent an annotation system. An annotation system is a list with : - " - annotation file name as it's key + " This variable contains a dictionary of lists. Each element of the dictionary + " represents an annotation system. An annotation system is a list with: + " - annotation file name as its key " - annotation file path as first element of the contained list " - build path as second element of the contained list " - annot_file_last_mod (contain the date of .annot file) as third element @@ -521,7 +524,7 @@ "c. link this stuff with what the user wants " ie. get the expression selected/under the cursor - let s:ocaml_word_char = '\w|[À-ÿ]|''' + let s:ocaml_word_char = '\w|[\xc0-\xff]|''' "In: the current mode (eg. "visual", "normal", etc.) "Out: the borders of the expression we are looking for the type @@ -634,7 +637,7 @@ nnoremap OCamlPrintType :call Ocaml_print_type("normal") xnoremap OCamlPrintType :call Ocaml_print_type("visual")`< -let &cpoptions=s:cposet +let &cpoptions = s:cposet unlet s:cposet " vim:sw=2 fdm=indent diff -Nru vim-8.2.1913/runtime/ftplugin/pbtxt.vim vim-8.2.2434/runtime/ftplugin/pbtxt.vim --- vim-8.2.1913/runtime/ftplugin/pbtxt.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/pbtxt.vim 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,21 @@ +" Vim filetype plugin file +" Language: Protobuf Text Format +" Maintainer: Lakshay Garg +" Last Change: 2020 Nov 17 +" Homepage: https://github.com/lakshayg/vim-pbtxt + +if exists("b:did_ftplugin") + finish +endif + +let b:did_ftplugin = 1 + +let s:cpo_save = &cpo +set cpo&vim + +setlocal commentstring=#\ %s + +let &cpo = s:cpo_save +unlet s:cpo_save + +" vim: nowrap sw=2 sts=2 ts=8 noet diff -Nru vim-8.2.1913/runtime/ftplugin/sexplib.vim vim-8.2.2434/runtime/ftplugin/sexplib.vim --- vim-8.2.1913/runtime/ftplugin/sexplib.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/sexplib.vim 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,15 @@ +" Vim filetype plugin file +" Language: Sexplib +" Maintainer: Markus Mottl +" URL: https://github.com/ocaml/vim-ocaml +" Last Change: +" 2017 Apr 12 - First version (MM) + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin=1 + +" Comment string +setl commentstring=;\ %s +setl comments=:; diff -Nru vim-8.2.1913/runtime/ftplugin/spec.vim vim-8.2.2434/runtime/ftplugin/spec.vim --- vim-8.2.1913/runtime/ftplugin/spec.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/spec.vim 2021-01-30 22:05:11.000000000 +0000 @@ -73,23 +73,23 @@ let chgline = -1 while (line <= line("$")) let linestr = getline(line) - if (name == "" && linestr =~? '^Name:') + if name == "" && linestr =~? '^Name:' let nameline = line let name = substitute(strpart(linestr,5), '^[ ]*\([^ ]\+\)[ ]*$','\1','') - elseif (ver == "" && linestr =~? '^Version:') + elseif ver == "" && linestr =~? '^Version:' let verline = line let ver = substitute(strpart(linestr,8), '^[ ]*\([^ ]\+\)[ ]*$','\1','') - elseif (rel == "" && linestr =~? '^Release:') + elseif rel == "" && linestr =~? '^Release:' let relline = line let rel = substitute(strpart(linestr,8), '^[ ]*\([^ ]\+\)[ ]*$','\1','') - elseif (linestr =~? '^%changelog') + elseif linestr =~? '^%changelog' let chgline = line execute line break endif let line = line+1 endwhile - if (nameline != -1 && verline != -1 && relline != -1) + if nameline != -1 && verline != -1 && relline != -1 let include_release_info = exists("g:spec_chglog_release_info") let name = s:ParseRpmVars(name, nameline) let ver = s:ParseRpmVars(ver, verline) @@ -100,20 +100,20 @@ call s:GetRelVer() - if (chgline == -1) + if chgline == -1 let option = confirm("Can't find %changelog. Create one? ","&End of file\n&Here\n&Cancel",3) - if (option == 1) + if option == 1 call append(line("$"),"") call append(line("$"),"%changelog") execute line("$") let chgline = line(".") - elseif (option == 2) + elseif option == 2 call append(line("."),"%changelog") normal j - chgline = line(".") + let chgline = line(".") endif endif - if (chgline != -1) + if chgline != -1 let tmptime = v:lc_time language time C let parsed_format = "* ".strftime(format)." - ".ver."-".rel @@ -122,16 +122,16 @@ let wrong_format = 0 let wrong_release = 0 let insert_line = 0 - if (getline(chgline+1) != parsed_format) + if getline(chgline+1) != parsed_format let wrong_format = 1 endif - if (include_release_info && getline(chgline+2) != release_info) + if include_release_info && getline(chgline+2) != release_info let wrong_release = 1 endif - if (wrong_format || wrong_release) - if (include_release_info && !wrong_release && !exists("g:spec_chglog_never_increase_release")) + if wrong_format || wrong_release + if include_release_info && !wrong_release && !exists("g:spec_chglog_never_increase_release") let option = confirm("Increase release? ","&Yes\n&No",1) - if (option == 1) + if option == 1 execute relline normal  let rel = substitute(strpart(getline(relline),8), '^[ ]*\([^ ]\+\)[ ]*$','\1','') @@ -171,13 +171,13 @@ let ret = "" while (1) let start = match(a:str, "\%{", end+1) - if (start == -1) + if start == -1 let ret = ret . strpart(a:str, end+1) break endif let ret = ret . strpart(a:str, end+1, start-(end+1)) let end = match(a:str, "}", start) - if (end == -1) + if end == -1 let ret = ret . strpart(a:str, start) break endif @@ -185,7 +185,7 @@ execute a:strline let definestr = "^[ \t]*%\\(define\\|global\\)[ \t]\\+".varname."[ \t]\\+\\(.*\\)$" let linenum = search(definestr, "bW") - if (linenum != 0) + if linenum != 0 let ret = ret . substitute(getline(linenum), definestr, "\\2", "") endif endwhile diff -Nru vim-8.2.1913/runtime/ftplugin/swift.vim vim-8.2.2434/runtime/ftplugin/swift.vim --- vim-8.2.1913/runtime/ftplugin/swift.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/swift.vim 2021-01-30 22:05:11.000000000 +0000 @@ -6,7 +6,16 @@ " See https://swift.org/LICENSE.txt for license information " See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors " -" Vim maintainer: Emir SARI +" Vim maintainer: Emir SARI +" Last Change: 2021 Jan 08 + +" Only do this when not done yet for this buffer +if exists("b:did_ftplugin") + finish +endif + +let b:did_ftplugin = 1 +let b:undo_ftplugin = "setlocal comments< expandtab< tabstop< shiftwidth< smartindent<" setlocal comments=s1:/*,mb:*,ex:*/,:///,:// setlocal expandtab diff -Nru vim-8.2.1913/runtime/ftplugin/tidy.vim vim-8.2.2434/runtime/ftplugin/tidy.vim --- vim-8.2.1913/runtime/ftplugin/tidy.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/tidy.vim 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,32 @@ +" Vim filetype plugin file +" Language: HMTL Tidy Configuration +" Maintainer: Doug Kearns +" Last Change: 2020 Sep 4 + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +let s:cpo_save = &cpo +set cpo&vim + +setlocal comments=:#,:// +setlocal commentstring=#\ %s +setlocal formatoptions-=t formatoptions+=croql + +if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") + let b:browsefilter = "HTML Tidy Files (tidyrc, .tidyrc, tidy.conf)\ttidyrc;.tidyrc;tidy.conf\n" . + \ "HTML Files (*.html, *.htm)\t*.html;*.htm\n" . + \ "XHTML Files (*.xhtml, *.xhtm)\t*.xhtml;*.xhtm\n" . + \ "XML Files (*.xml)\t*.xml\n" . + \ "All Files (*.*)\t*.*\n" +endif + +let b:undo_ftplugin = "setl fo< com< cms<" . + \ " | unlet! b:browsefilter" + +let &cpo = s:cpo_save +unlet s:cpo_save + +" vim: nowrap sw=2 sts=2 ts=8 diff -Nru vim-8.2.1913/runtime/ftplugin/vim.vim vim-8.2.2434/runtime/ftplugin/vim.vim --- vim-8.2.1913/runtime/ftplugin/vim.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/vim.vim 2021-01-30 22:05:11.000000000 +0000 @@ -1,7 +1,7 @@ " Vim filetype plugin " Language: Vim " Maintainer: Bram Moolenaar -" Last Change: 2020 Aug 14 +" Last Change: 2021 Jan 23 " Only do this when not done yet for this buffer if exists("b:did_ftplugin") @@ -48,18 +48,23 @@ " Use :help to lookup the keyword under the cursor with K. setlocal keywordprg=:help -" Set 'comments' to format dashed lists in comments -" Avoid that #{} starts a comment. -setlocal com=sO:\"\ -,mO:\"\ \ ,sO:#\ -,mO:#\ \ ,eO:##,:\",b:# +if "\n" .. getline(1, 10)->join("\n") =~# '\n\s*vim9\%[script]\>' + " Set 'comments' to format dashed lists in comments + setlocal com=sO:#\ -,mO:#\ \ ,eO:##,:# + " Comments starts with # in Vim9 script + setlocal commentstring=#%s +else + setlocal com=sO:\"\ -,mO:\"\ \ ,:\" + " Comments starts with a double quote in legacy script + setlocal commentstring=\"%s +endif + " Format comments to be up to 78 characters long if &tw == 0 setlocal tw=78 endif -" Comments start with a double quote; in Vim9 script # would also work -setlocal commentstring=\"%s - if !exists("no_plugin_maps") && !exists("no_vim_maps") let b:did_add_maps = 1 @@ -83,8 +88,13 @@ " Let the matchit plugin know what items can be matched. if exists("loaded_matchit") let b:match_ignorecase = 0 + " "func" can also be used as a type: + " var Ref: func + " or to list functions: + " func name + " require a parenthesis following, then there can be an "endfunc". let b:match_words = - \ '\<\%(fu\%[nction]\|def\)\>)\@!:\:\<\%(endf\%[unction]\|enddef\)\>,' . + \ '\<\%(fu\%[nction]\|def\)\s\+\S\+(:\:\<\%(endf\%[unction]\|enddef\)\>,' . \ '\<\(wh\%[ile]\|for\)\>:\:\:\,' . \ '\:\:\,' . \ '{:},' . diff -Nru vim-8.2.1913/runtime/ftplugin/zsh.vim vim-8.2.2434/runtime/ftplugin/zsh.vim --- vim-8.2.1913/runtime/ftplugin/zsh.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/ftplugin/zsh.vim 2021-01-30 22:05:11.000000000 +0000 @@ -2,7 +2,7 @@ " Language: Zsh shell script " Maintainer: Christian Brabandt " Previous Maintainer: Nikolai Weibull -" Latest Revision: 2020-01-10 +" Latest Revision: 2020-09-01 " License: Vim (see :h license) " Repository: https://github.com/chrisbra/vim-zsh @@ -19,20 +19,21 @@ let b:undo_ftplugin = "setl com< cms< fo< " if executable('zsh') - if !has('gui_running') && executable('less') - command! -buffer -nargs=1 RunHelp silent exe '!zsh -ic "autoload -Uz run-help; run-help 2>/dev/null | LESS= less"' | redraw! - elseif has('terminal') - command! -buffer -nargs=1 RunHelp silent exe ':term zsh -ic "autoload -Uz run-help; run-help "' - else - command! -buffer -nargs=1 RunHelp echo system('zsh -ic "autoload -Uz run-help; run-help 2>/dev/null"') - endif + if !has('gui_running') && executable('less') + command! -buffer -nargs=1 RunHelp silent exe '!MANPAGER= zsh -ic "autoload -Uz run-help; run-help 2>/dev/null | LESS= less"' | redraw! + elseif has('terminal') + command! -buffer -nargs=1 RunHelp silent exe ':term zsh -ic "autoload -Uz run-help; run-help "' + else + command! -buffer -nargs=1 RunHelp echo system('zsh -ic "autoload -Uz run-help; run-help 2>/dev/null"') + endif + if !exists('current_compiler') + compiler zsh + endif setlocal keywordprg=:RunHelp - setlocal makeprg=zsh\ -n\ --\ %:S - setlocal errorformat=%f:\ line\ %l:\ %m - let b:undo_ftplugin .= 'keywordprg< errorformat< makeprg<' + let b:undo_ftplugin .= 'keywordprg<' endif -let b:match_words = ',\:\:\:\' +let b:match_words = '\:\:\:\' \ . ',\:^\s*([^)]*):\' \ . ',\<\%(select\|while\|until\|repeat\|for\%(each\)\=\)\>:\' let b:match_skip = 's:comment\|string\|heredoc\|subst' diff -Nru vim-8.2.1913/runtime/gvim.desktop vim-8.2.2434/runtime/gvim.desktop --- vim-8.2.1913/runtime/gvim.desktop 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/gvim.desktop 2021-01-30 22:05:11.000000000 +0000 @@ -15,7 +15,7 @@ GenericName[fr]=Éditeur de texte GenericName[ja]=テキストエディタ GenericName[ru]=ТекÑтовый редактор -GenericName[sr]=ТекÑÑ‚ Едитор +GenericName[sr]=Едитор текÑÑ‚ GenericName[tr]=Metin Düzenleyici GenericName=Text Editor # Translators: This is the comment used in the Vim desktop file @@ -24,7 +24,7 @@ Comment[fr]=Éditer des fichiers texte Comment[ja]=テキストファイルを編集ã—ã¾ã™ Comment[ru]=Редактирование текÑтовых файлов -Comment[sr]=Уређивање текÑÑ‚ фајлова +Comment[sr]=Уређујте текÑÑ‚ фајлове Comment[tr]=Metin dosyaları düzenleyin Comment=Edit text files # The translations should come from the po file. Leave them here for now, they will @@ -112,7 +112,6 @@ Icon[eo]=gvim Icon[fr]=gvim Icon[ru]=gvim -Icon[sr]=gvim Icon=gvim Categories=Utility;TextEditor; StartupNotify=true diff -Nru vim-8.2.1913/runtime/indent/dune.vim vim-8.2.2434/runtime/indent/dune.vim --- vim-8.2.1913/runtime/indent/dune.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/runtime/indent/dune.vim 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,13 @@ +" Vim indent file +" Language: dune +" Maintainers: Markus Mottl +" URL: https://github.com/ocaml/vim-ocaml +" Last Change: 2021 Jan 01 + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +" dune format-dune-file uses 1 space to indent +setlocal softtabstop=1 shiftwidth=1 expandtab diff -Nru vim-8.2.1913/runtime/indent/fortran.vim vim-8.2.2434/runtime/indent/fortran.vim --- vim-8.2.1913/runtime/indent/fortran.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/indent/fortran.vim 2021-01-30 22:05:11.000000000 +0000 @@ -74,11 +74,15 @@ if (b:fortran_fixed_source == 1) setlocal indentexpr=FortranGetFixedIndent() if exists("*FortranGetFixedIndent") + let &cpoptions = s:cposet + unlet s:cposet finish endif else setlocal indentexpr=FortranGetFreeIndent() if exists("*FortranGetFreeIndent") + let &cpoptions = s:cposet + unlet s:cposet finish endif endif @@ -213,7 +217,7 @@ return ind endfunction -let &cpoptions=s:cposet +let &cpoptions = s:cposet unlet s:cposet " vim:sw=2 tw=130 diff -Nru vim-8.2.1913/runtime/indent/html.vim vim-8.2.2434/runtime/indent/html.vim --- vim-8.2.1913/runtime/indent/html.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/indent/html.vim 2021-01-30 22:05:11.000000000 +0000 @@ -1,7 +1,7 @@ " Vim indent script for HTML " Maintainer: Bram Moolenaar " Original Author: Andy Wokula -" Last Change: 2020 Jul 06 +" Last Change: 2020 Dec 11 " Version: 1.0 "{{{ " Description: HTML indent script with cached state for faster indenting on a " range of lines. @@ -815,7 +815,7 @@ let idx = match(prevtext, '^\s*\zs 6) Sugar is sweet ---> 7) And so are you. -Doubling to operate on a line also works for operators mentioned below +Doubling to operate on a line also works for operators mentioned below. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lesson 2.7: THE UNDO COMMAND @@ -433,7 +433,7 @@ ---> This line has a few words that need changing using the change operator. Notice that ce deletes the word and places you in Insert mode. - cc does the same for the whole line + cc does the same for the whole line. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -804,7 +804,7 @@ b) NOTE: You can also use y as an operator: yw yanks one word, - yy yanks the whole line, then p puts that line + yy yanks the whole line, then p puts that line. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lesson 6.5: SET OPTION diff -Nru vim-8.2.1913/runtime/tutor/tutor.fr vim-8.2.2434/runtime/tutor/tutor.fr --- vim-8.2.1913/runtime/tutor/tutor.fr 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/tutor/tutor.fr 2021-01-30 22:05:11.000000000 +0000 @@ -906,9 +906,9 @@ soit appuyé. 6. Taper ":set xxx" active l'option "xxx". Quelques options sont : - 'ic' 'ingnorecase' pour ignorer la casse lors des recherches. - 'is' 'incsearch' pour montrer les appariements partiels. - 'hls' 'hlsearch' pour mettre en surbrillance les appariements. + 'ic' 'ignorecase' pour ignorer la casse lors des recherches. + 'is' 'incsearch' pour montrer les appariements partiels. + 'hls' 'hlsearch' pour mettre en surbrillance les appariements. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff -Nru vim-8.2.1913/runtime/tutor/tutor.fr.utf-8 vim-8.2.2434/runtime/tutor/tutor.fr.utf-8 --- vim-8.2.1913/runtime/tutor/tutor.fr.utf-8 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/tutor/tutor.fr.utf-8 2021-01-30 22:05:11.000000000 +0000 @@ -906,9 +906,9 @@ soit appuyé. 6. Taper ":set xxx" active l'option "xxx". Quelques options sont : - 'ic' 'ingnorecase' pour ignorer la casse lors des recherches. - 'is' 'incsearch' pour montrer les appariements partiels. - 'hls' 'hlsearch' pour mettre en surbrillance les appariements. + 'ic' 'ignorecase' pour ignorer la casse lors des recherches. + 'is' 'incsearch' pour montrer les appariements partiels. + 'hls' 'hlsearch' pour mettre en surbrillance les appariements. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff -Nru vim-8.2.1913/runtime/tutor/tutor.ko vim-8.2.2434/runtime/tutor/tutor.ko --- vim-8.2.1913/runtime/tutor/tutor.ko 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/tutor/tutor.ko 2021-01-30 22:05:11.000000000 +0000 @@ -907,7 +907,7 @@ 5. ì„ ëˆŒëŸ¬ ":edit" 명령어를 완성해 봅니다. - 6. ì´ì œ 빈칸 하나를 추가한 ë’¤, 존재 íŒŒì¼ ì´ë¦„ì„ ì•ž ë¶€ë¶„ì„ ìž…ë ¥í•©ë‹ˆë‹¤: :edit FIL + 6. ì´ì œ 빈칸 하나를 추가한 ë’¤, 존재하는 íŒŒì¼ ì´ë¦„ì˜ ì•ž ë¶€ë¶„ì„ ìž…ë ¥í•©ë‹ˆë‹¤: :edit FIL 7. ì„ ëˆŒëŸ¬ íŒŒì¼ ì´ë¦„ì„ ì™„ì„± 시킵니다. diff -Nru vim-8.2.1913/runtime/tutor/tutor.ko.euc vim-8.2.2434/runtime/tutor/tutor.ko.euc --- vim-8.2.1913/runtime/tutor/tutor.ko.euc 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/tutor/tutor.ko.euc 2021-01-30 22:05:11.000000000 +0000 @@ -907,7 +907,7 @@ 5. À» ´­·¯ ":edit" ¸í·É¾î¸¦ ¿Ï¼ºÇØ º¾´Ï´Ù. - 6. ÀÌÁ¦ ºóÄ­ Çϳª¸¦ Ãß°¡ÇÑ µÚ, Á¸Àç ÆÄÀÏ À̸§À» ¾Õ ºÎºÐÀ» ÀÔ·ÂÇÕ´Ï´Ù: :edit FIL + 6. ÀÌÁ¦ ºóÄ­ Çϳª¸¦ Ãß°¡ÇÑ µÚ, Á¸ÀçÇÏ´Â ÆÄÀÏ À̸§ÀÇ ¾Õ ºÎºÐÀ» ÀÔ·ÂÇÕ´Ï´Ù: :edit FIL 7. À» ´­·¯ ÆÄÀÏ À̸§À» ¿Ï¼º ½Ãŵ´Ï´Ù. diff -Nru vim-8.2.1913/runtime/tutor/tutor.ko.utf-8 vim-8.2.2434/runtime/tutor/tutor.ko.utf-8 --- vim-8.2.1913/runtime/tutor/tutor.ko.utf-8 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/tutor/tutor.ko.utf-8 2021-01-30 22:05:11.000000000 +0000 @@ -907,7 +907,7 @@ 5. ì„ ëˆŒëŸ¬ ":edit" 명령어를 완성해 봅니다. - 6. ì´ì œ 빈칸 하나를 추가한 ë’¤, 존재 íŒŒì¼ ì´ë¦„ì„ ì•ž ë¶€ë¶„ì„ ìž…ë ¥í•©ë‹ˆë‹¤: :edit FIL + 6. ì´ì œ 빈칸 하나를 추가한 ë’¤, 존재하는 íŒŒì¼ ì´ë¦„ì˜ ì•ž ë¶€ë¶„ì„ ìž…ë ¥í•©ë‹ˆë‹¤: :edit FIL 7. ì„ ëˆŒëŸ¬ íŒŒì¼ ì´ë¦„ì„ ì™„ì„± 시킵니다. diff -Nru vim-8.2.1913/runtime/tutor/tutor.utf-8 vim-8.2.2434/runtime/tutor/tutor.utf-8 --- vim-8.2.1913/runtime/tutor/tutor.utf-8 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/tutor/tutor.utf-8 2021-01-30 22:05:11.000000000 +0000 @@ -319,7 +319,7 @@ ---> 6) Sugar is sweet ---> 7) And so are you. -Doubling to operate on a line also works for operators mentioned below +Doubling to operate on a line also works for operators mentioned below. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lesson 2.7: THE UNDO COMMAND @@ -433,7 +433,7 @@ ---> This line has a few words that need changing using the change operator. Notice that ce deletes the word and places you in Insert mode. - cc does the same for the whole line + cc does the same for the whole line. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -804,7 +804,7 @@ b) NOTE: You can also use y as an operator: yw yanks one word, - yy yanks the whole line, then p puts that line + yy yanks the whole line, then p puts that line. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lesson 6.5: SET OPTION diff -Nru vim-8.2.1913/runtime/vim.desktop vim-8.2.2434/runtime/vim.desktop --- vim-8.2.1913/runtime/vim.desktop 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/runtime/vim.desktop 2021-01-30 22:05:11.000000000 +0000 @@ -15,7 +15,7 @@ GenericName[fr]=Éditeur de texte GenericName[ja]=テキストエディタ GenericName[ru]=ТекÑтовый редактор -GenericName[sr]=ТекÑÑ‚ Едитор +GenericName[sr]=Едитор текÑÑ‚ GenericName[tr]=Metin Düzenleyici GenericName=Text Editor # Translators: This is the comment used in the Vim desktop file @@ -24,7 +24,7 @@ Comment[fr]=Éditer des fichiers texte Comment[ja]=テキストファイルを編集ã—ã¾ã™ Comment[ru]=Редактирование текÑтовых файлов -Comment[sr]=Уређивање текÑÑ‚ фајлова +Comment[sr]=Уређујте текÑÑ‚ фајлове Comment[tr]=Metin dosyaları düzenleyin Comment=Edit text files # The translations should come from the po file. Leave them here for now, they will @@ -112,7 +112,6 @@ Icon[eo]=gvim Icon[fr]=gvim Icon[ru]=gvim -Icon[sr]=gvim Icon=gvim Categories=Utility;TextEditor; StartupNotify=false diff -Nru vim-8.2.1913/src/arglist.c vim-8.2.2434/src/arglist.c --- vim-8.2.1913/src/arglist.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/arglist.c 2021-01-30 22:05:11.000000000 +0000 @@ -17,12 +17,29 @@ #define AL_ADD 2 #define AL_DEL 3 +// This flag is set whenever the argument list is being changed and calling a +// function that might trigger an autocommand. +static int arglist_locked = FALSE; + + static int +check_arglist_locked(void) +{ + if (arglist_locked) + { + emsg(_(e_cannot_change_arglist_recursively)); + return FAIL; + } + return OK; +} + /* * Clear an argument list: free all file names and reset it to zero entries. */ void alist_clear(alist_T *al) { + if (check_arglist_locked() == FAIL) + return; while (--al->al_ga.ga_len >= 0) vim_free(AARGLIST(al)[al->al_ga.ga_len].ae_fname); ga_clear(&al->al_ga); @@ -126,14 +143,9 @@ int fnum_len) { int i; - static int recursive = 0; - if (recursive) - { - emsg(_(e_au_recursive)); + if (check_arglist_locked() == FAIL) return; - } - ++recursive; alist_clear(al); if (ga_grow(&al->al_ga, count) == OK) @@ -152,7 +164,11 @@ // May set buffer name of a buffer previously used for the // argument list, so that it's re-used by alist_add. if (fnum_list != NULL && i < fnum_len) + { + arglist_locked = TRUE; buf_set_name(fnum_list[i], files[i]); + arglist_locked = FALSE; + } alist_add(al, files[i], use_curbuf ? 2 : 1); ui_breakcheck(); @@ -163,8 +179,6 @@ FreeWild(count, files); if (al == &global_alist) arg_had_last = FALSE; - - --recursive; } /* @@ -179,6 +193,10 @@ { if (fname == NULL) // don't add NULL file names return; + if (check_arglist_locked() == FAIL) + return; + arglist_locked = TRUE; + #ifdef BACKSLASH_IN_FILENAME slash_adjust(fname); #endif @@ -187,6 +205,8 @@ AARGLIST(al)[al->al_ga.ga_len].ae_fnum = buflist_add(fname, BLN_LISTED | (set_fnum == 2 ? BLN_CURBUF : 0)); ++al->al_ga.ga_len; + + arglist_locked = FALSE; } #if defined(BACKSLASH_IN_FILENAME) || defined(PROTO) @@ -295,10 +315,10 @@ return FAIL; if (wig == TRUE) i = expand_wildcards(ga.ga_len, (char_u **)ga.ga_data, - fcountp, fnamesp, EW_FILE|EW_NOTFOUND); + fcountp, fnamesp, EW_FILE|EW_NOTFOUND|EW_NOTWILD); else i = gen_expand_wildcards(ga.ga_len, (char_u **)ga.ga_data, - fcountp, fnamesp, EW_FILE|EW_NOTFOUND); + fcountp, fnamesp, EW_FILE|EW_NOTFOUND|EW_NOTWILD); ga_clear(&ga); return i; @@ -334,7 +354,8 @@ int i; int old_argcount = ARGCOUNT; - if (ga_grow(&ALIST(curwin)->al_ga, count) == OK) + if (check_arglist_locked() != FAIL + && ga_grow(&ALIST(curwin)->al_ga, count) == OK) { if (after < 0) after = 0; @@ -343,6 +364,7 @@ if (after < ARGCOUNT) mch_memmove(&(ARGLIST[after + count]), &(ARGLIST[after]), (ARGCOUNT - after) * sizeof(aentry_T)); + arglist_locked = TRUE; for (i = 0; i < count; ++i) { int flags = BLN_LISTED | (will_edit ? BLN_CURBUF : 0); @@ -350,6 +372,7 @@ ARGLIST[after + i].ae_fname = files[i]; ARGLIST[after + i].ae_fnum = buflist_add(files[i], flags); } + arglist_locked = FALSE; ALIST(curwin)->al_ga.ga_len += count; if (old_argcount > 0 && curwin->w_arg_idx >= after) curwin->w_arg_idx += count; @@ -382,6 +405,9 @@ int match; int arg_escaped = TRUE; + if (check_arglist_locked() == FAIL) + return FAIL; + // Set default argument for ":argadd" command. if (what == AL_ADD && *str == NUL) { @@ -409,7 +435,7 @@ p = file_pat_to_reg_pat(p, NULL, NULL, FALSE); if (p == NULL) break; - regmatch.regprog = vim_regcomp(p, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp(p, magic_isset() ? RE_MAGIC : 0); if (regmatch.regprog == NULL) { vim_free(p); @@ -776,6 +802,9 @@ int i; int n; + if (check_arglist_locked() == FAIL) + return; + if (eap->addr_count > 0 || *eap->arg == NUL) { // ":argdel" works like ":.argdel" @@ -884,6 +913,13 @@ win_T *new_curwin = NULL; tabpage_T *new_curtab = NULL; +#ifdef FEAT_CMDWIN + if (cmdwin_type != 0) + { + emsg(_(e_cmdwin)); + return; + } +#endif if (ARGCOUNT <= 0) { // Don't give an error message. We don't want it when the ":all" diff -Nru vim-8.2.1913/src/auto/configure vim-8.2.2434/src/auto/configure --- vim-8.2.1913/src/auto/configure 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/auto/configure 2021-01-30 22:05:11.000000000 +0000 @@ -4510,9 +4510,9 @@ CLANG_VERSION=`expr $CLANG_MAJOR '*' 1000000 '+' $CLANG_MINOR '*' 1000 '+' $CLANG_REVISION` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CLANG_VERSION" >&5 $as_echo "$CLANG_VERSION" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if clang supports -fno-strength-reduce" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if clang supports -fno-strength-reduce" >&5 $as_echo_n "checking if clang supports -fno-strength-reduce... " >&6; } - if test "$CLANG_VERSION" -ge 500002075 ; then + if test "$CLANG_MAJOR" -ge 10 -o "$CLANG_VERSION" -ge 500002075 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } CFLAGS=`echo "$CFLAGS" | sed -e 's/-fno-strength-reduce/ /'` @@ -5006,9 +5006,9 @@ fi if test "$zOSUnix" = "yes"; then - QUOTESED="sed -e 's/[\\\\\"]/\\\\\\\\&/g' -e 's/\\\\\\\\\"/\"/' -e 's/\\\\\\\\\";\$\$/\";/'" + QUOTESED="sed -e 's/[\\\\\"]/\\\\\\\\&/g' -e 's/\\\\\\\\\"/\"/' -e 's/\\\\\\\\\";\$\$/\";/' -e 's/ */ /g'" else - QUOTESED="sed -e 's/[\\\\\"]/\\\\&/g' -e 's/\\\\\"/\"/' -e 's/\\\\\";\$\$/\";/'" + QUOTESED="sed -e 's/[\\\\\"]/\\\\&/g' -e 's/\\\\\"/\"/' -e 's/\\\\\";\$\$/\";/' -e 's/ */ /g'" fi @@ -5479,7 +5479,7 @@ inc_path="$vi_cv_path_lua_pfx/include" for dir in "$inc_path"/moonjit-[0-9]* ; do if test -d "$dir" ; then - lua_suf=`basename '$dir'` + lua_suf=`basename "$dir"` lua_suf="/$lua_suf" break fi @@ -7617,8 +7617,7 @@ librubyarg=`$vi_cv_path_ruby -r rbconfig -e "print $ruby_rbconfig.expand($ruby_rbconfig::CONFIG['LIBRUBYARG'])"` librubya=`$vi_cv_path_ruby -r rbconfig -e "print $ruby_rbconfig.expand($ruby_rbconfig::CONFIG['LIBRUBY_A'])"` rubylibdir=`$vi_cv_path_ruby -r rbconfig -e "print $ruby_rbconfig.expand($ruby_rbconfig::CONFIG['libdir'])"` - if test -f "$rubylibdir/$librubya"; then - librubyarg="$librubyarg" + if test -f "$rubylibdir/$librubya" || expr "$librubyarg" : "-lruby"; then RUBY_LIBS="$RUBY_LIBS -L$rubylibdir" elif test "$librubyarg" = "libruby.a"; then librubyarg="-lruby" @@ -7652,6 +7651,9 @@ RUBY_CFLAGS="-DDYNAMIC_RUBY_DLL=\\\"$libruby_soname\\\" $RUBY_CFLAGS" RUBY_LIBS= fi + if test "X$CLANG_VERSION" != "X" -a "$rubyversion" -ge 30; then + RUBY_CFLAGS="$RUBY_CFLAGS -fdeclspec" + fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found; disabling Ruby" >&5 $as_echo "not found; disabling Ruby" >&6; } @@ -9559,6 +9561,8 @@ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'` } else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK -dev package" >&5 +$as_echo_n "checking for GTK -dev package... " >&6; } no_gtk=yes fi @@ -9812,6 +9816,8 @@ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'` } else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK -dev package" >&5 +$as_echo_n "checking for GTK -dev package... " >&6; } no_gtk=yes fi @@ -12350,10 +12356,18 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +// These should be in stdlib.h, but it depends on _XOPEN_SOURCE. +char *ptsname(int); +int unlockpt(int); +int grantpt(int); + int main () { -ptsname(0);grantpt(0);unlockpt(0); + + ptsname(0); + grantpt(0); + unlockpt(0); ; return 0; } @@ -14853,6 +14867,8 @@ $as_echo "no" >&6; } fi +LDFLAGS=`echo "$LDFLAGS" | sed -e 's/-L /-L/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker --as-needed support" >&5 $as_echo_n "checking linker --as-needed support... " >&6; } LINK_AS_NEEDED= diff -Nru vim-8.2.1913/src/autocmd.c vim-8.2.2434/src/autocmd.c --- vim-8.2.1913/src/autocmd.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/autocmd.c 2021-01-30 22:05:11.000000000 +0000 @@ -55,9 +55,7 @@ char once; // "One shot": removed after execution char nested; // If autocommands nest here. char last; // last command in list -#ifdef FEAT_EVAL sctx_T script_ctx; // script context where defined -#endif struct AutoCmd *next; // next AutoCmd in list } AutoCmd; @@ -191,6 +189,8 @@ {"WinLeave", EVENT_WINLEAVE}, {"VimResized", EVENT_VIMRESIZED}, {"TextYankPost", EVENT_TEXTYANKPOST}, + {"VimSuspend", EVENT_VIMSUSPEND}, + {"VimResume", EVENT_VIMRESUME}, {NULL, (event_T)0} }; @@ -956,11 +956,14 @@ last_group = AUGROUP_ERROR; // for listing the group name if (*arg == '*' || *arg == NUL || *arg == '|') { - for (event = (event_T)0; (int)event < (int)NUM_EVENTS; - event = (event_T)((int)event + 1)) - if (do_autocmd_event(event, pat, - once, nested, cmd, forceit, group) == FAIL) - break; + if (!forceit && *cmd != NUL) + emsg(_(e_cannot_define_autocommands_for_all_events)); + else + for (event = (event_T)0; (int)event < (int)NUM_EVENTS; + event = (event_T)((int)event + 1)) + if (do_autocmd_event(event, pat, + once, nested, cmd, forceit, group) == FAIL) + break; } else { @@ -1247,8 +1250,8 @@ if (ac == NULL) return FAIL; ac->cmd = vim_strsave(cmd); -#ifdef FEAT_EVAL ac->script_ctx = current_sctx; +#ifdef FEAT_EVAL ac->script_ctx.sc_lnum += SOURCING_LNUM; #endif if (ac->cmd == NULL) @@ -1433,9 +1436,9 @@ // window. Expect a few side effects... win = curwin; - aco->save_curwin = curwin; + aco->save_curwin_id = curwin->w_id; aco->save_curbuf = curbuf; - aco->save_prevwin = prevwin; + aco->save_prevwin_id = prevwin == NULL ? 0 : prevwin->w_id; if (win != NULL) { // There is a window for "buf" in the current tab page, make it the @@ -1481,7 +1484,7 @@ curwin = aucmd_win; } curbuf = buf; - aco->new_curwin = curwin; + aco->new_curwin_id = curwin->w_id; set_bufref(&aco->new_curbuf, curbuf); } @@ -1493,7 +1496,8 @@ aucmd_restbuf( aco_save_T *aco) // structure holding saved values { - int dummy; + int dummy; + win_T *save_curwin; if (aco->use_aucmd_win) { @@ -1533,8 +1537,9 @@ (void)win_comp_pos(); // recompute window positions unblock_autocmds(); - if (win_valid(aco->save_curwin)) - curwin = aco->save_curwin; + save_curwin = win_find_by_id(aco->save_curwin_id); + if (save_curwin != NULL) + curwin = save_curwin; else // Hmm, original window disappeared. Just use the first one. curwin = firstwin; @@ -1543,9 +1548,7 @@ // May need to restore insert mode for a prompt buffer. entering_window(curwin); #endif - - if (win_valid(aco->save_prevwin)) - prevwin = aco->save_prevwin; + prevwin = win_find_by_id(aco->save_prevwin_id); #ifdef FEAT_EVAL vars_clear(&aucmd_win->w_vars->dv_hashtab); // free all w: variables hash_init(&aucmd_win->w_vars->dv_hashtab); // re-use the hashtab @@ -1571,13 +1574,15 @@ } else { - // restore curwin - if (win_valid(aco->save_curwin)) + // Restore curwin. Use the window ID, a window may have been closed + // and the memory re-used for another one. + save_curwin = win_find_by_id(aco->save_curwin_id); + if (save_curwin != NULL) { // Restore the buffer which was previously edited by curwin, if // it was changed, we are still the same window and the buffer is // valid. - if (curwin == aco->new_curwin + if (curwin->w_id == aco->new_curwin_id && curbuf != aco->new_curbuf.br_buf && bufref_valid(&aco->new_curbuf) && aco->new_curbuf.br_buf->b_ml.ml_mfp != NULL) @@ -1592,10 +1597,9 @@ ++curbuf->b_nwindows; } - curwin = aco->save_curwin; + curwin = save_curwin; curbuf = curwin->w_buffer; - if (win_valid(aco->save_prevwin)) - prevwin = aco->save_prevwin; + prevwin = win_find_by_id(aco->save_prevwin_id); // In case the autocommand moves the cursor to a position that // does not exist in curbuf. check_cursor(); @@ -1816,8 +1820,8 @@ static int nesting = 0; AutoPatCmd patcmd; AutoPat *ap; -#ifdef FEAT_EVAL sctx_T save_current_sctx; +#ifdef FEAT_EVAL funccal_entry_T funccal_entry; char_u *save_cmdarg; long save_cmdbang; @@ -2026,9 +2030,9 @@ estack_push(ETYPE_AUCMD, NULL, 0); ESTACK_CHECK_SETUP -#ifdef FEAT_EVAL save_current_sctx = current_sctx; +#ifdef FEAT_EVAL # ifdef FEAT_PROFILE if (do_profiling == PROF_YES) prof_child_enter(&wait_time); // doesn't count for the caller itself @@ -2135,8 +2139,8 @@ autocmd_fname_full = save_autocmd_fname_full; autocmd_bufnr = save_autocmd_bufnr; autocmd_match = save_autocmd_match; -#ifdef FEAT_EVAL current_sctx = save_current_sctx; +#ifdef FEAT_EVAL restore_funccal(); # ifdef FEAT_PROFILE if (do_profiling == PROF_YES) @@ -2367,9 +2371,7 @@ if (ac->once) au_del_cmd(ac); autocmd_nested = ac->nested; -#ifdef FEAT_EVAL current_sctx = ac->script_ctx; -#endif if (ac->last) acp->nextcmd = NULL; else diff -Nru vim-8.2.1913/src/buffer.c vim-8.2.2434/src/buffer.c --- vim-8.2.1913/src/buffer.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/buffer.c 2021-01-30 22:05:11.000000000 +0000 @@ -492,8 +492,10 @@ * supposed to close the window but autocommands close all other windows. * * When "ignore_abort" is TRUE don't abort even when aborting() returns TRUE. + * + * Return TRUE when we got to the end and b_nwindows was decremented. */ - void + int close_buffer( win_T *win, // if not NULL, set b_last_cursor buf_T *buf, @@ -540,7 +542,7 @@ if (wipe_buf || unload_buf) { if (!can_unload_buffer(buf)) - return; + return FALSE; // Wiping out or unloading a terminal buffer kills the job. free_terminal(buf); @@ -552,6 +554,11 @@ unload_buf = FALSE; } } + else if (buf->b_p_bh[0] == 'h' && !del_buf) + { + // Hide a terminal buffer. + unload_buf = FALSE; + } else { // A terminal buffer is wiped out if the job has finished. @@ -566,7 +573,7 @@ // Disallow deleting the buffer when it is locked (already being closed or // halfway a command that relies on it). Unloading is allowed. if ((del_buf || wipe_buf) && !can_unload_buffer(buf)) - return; + return FALSE; // check no autocommands closed the window if (win != NULL && win_valid_any_tab(win)) @@ -595,7 +602,7 @@ // Autocommands deleted the buffer. aucmd_abort: emsg(_(e_auabort)); - return; + return FALSE; } --buf->b_locked; if (abort_if_last && one_window()) @@ -620,7 +627,7 @@ #ifdef FEAT_EVAL // autocmds may abort script processing if (!ignore_abort && aborting()) - return; + return FALSE; #endif } @@ -648,7 +655,7 @@ // Return when a window is displaying the buffer or when it's not // unloaded. if (buf->b_nwindows > 0 || !unload_buf) - return; + return FALSE; // Always remove the buffer when there is no file name. if (buf->b_ffname == NULL) @@ -678,11 +685,11 @@ // Autocommands may have deleted the buffer. if (!bufref_valid(&bufref)) - return; + return FALSE; #ifdef FEAT_EVAL // autocmds may abort script processing if (!ignore_abort && aborting()) - return; + return FALSE; #endif /* @@ -693,7 +700,7 @@ * deleted buffer. */ if (buf == curbuf && !is_curbuf) - return; + return FALSE; if (win_valid_any_tab(win) && win->w_buffer == buf) win->w_buffer = NULL; // make sure we don't use the buffer now @@ -750,6 +757,7 @@ buf->b_p_bl = FALSE; } // NOTE: at this point "curbuf" may be invalid! + return TRUE; } /* @@ -2154,7 +2162,7 @@ if (top_file_num < 0) // wrap around (may cause duplicates) { emsg(_("W14: Warning: List of file names overflow")); - if (emsg_silent == 0) + if (emsg_silent == 0 && !in_assert_fails) { out_flush(); ui_delay(3001L, TRUE); // make sure it is noticed @@ -2556,12 +2564,15 @@ char_u *p; int toggledollar; - if (pattern_end == pattern + 1 && (*pattern == '%' || *pattern == '#')) + // "%" is current file, "%%" or "#" is alternate file + if ((pattern_end == pattern + 1 && (*pattern == '%' || *pattern == '#')) + || (in_vim9script() && pattern_end == pattern + 2 + && pattern[0] == '%' && pattern[1] == '%')) { - if (*pattern == '%') - match = curbuf->b_fnum; - else + if (*pattern == '#' || pattern_end == pattern + 2) match = curwin->w_alt_fnum; + else + match = curbuf->b_fnum; #ifdef FEAT_DIFF if (diffmode && !diff_mode_buf(buflist_findnr(match))) match = -1; @@ -2600,7 +2611,7 @@ p = pat; if (*p == '^' && !(attempt & 1)) // add/remove '^' ++p; - regmatch.regprog = vim_regcomp(p, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp(p, magic_isset() ? RE_MAGIC : 0); if (regmatch.regprog == NULL) { vim_free(pat); @@ -5366,9 +5377,8 @@ int vers; int end; int retval = OK; -#ifdef FEAT_EVAL sctx_T save_current_sctx; -#endif + ESTACK_CHECK_DECLARATION prev = -1; @@ -5452,22 +5462,22 @@ if (*s != NUL) // skip over an empty "::" { int secure_save = secure; -#ifdef FEAT_EVAL + save_current_sctx = current_sctx; + current_sctx.sc_version = 1; +#ifdef FEAT_EVAL current_sctx.sc_sid = SID_MODELINE; current_sctx.sc_seq = 0; current_sctx.sc_lnum = lnum; - current_sctx.sc_version = 1; #endif + // Make sure no risky things are executed as a side effect. secure = 1; retval = do_set(s, OPT_MODELINE | OPT_LOCAL | flags); secure = secure_save; -#ifdef FEAT_EVAL current_sctx = save_current_sctx; -#endif if (retval == FAIL) // stop if error found break; } @@ -5648,11 +5658,22 @@ } if (buf->b_fname == NULL) - return (char_u *)_("[No Name]"); + return buf_get_fname(buf); return NULL; } /* + * Get "buf->b_fname", use "[No Name]" if it is NULL. + */ + char_u * +buf_get_fname(buf_T *buf) +{ + if (buf->b_fname == NULL) + return (char_u *)_("[No Name]"); + return buf->b_fname; +} + +/* * Set 'buflisted' for curbuf to "on" and trigger autocommands if it changed. */ void diff -Nru vim-8.2.1913/src/bufwrite.c vim-8.2.2434/src/bufwrite.c --- vim-8.2.1913/src/bufwrite.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/bufwrite.c 2021-01-30 22:05:11.000000000 +0000 @@ -2031,7 +2031,7 @@ if (end == 0 || (lnum == end && (write_bin || !buf->b_p_fixeol) - && (lnum == buf->b_no_eol_lnum + && ((write_bin && lnum == buf->b_no_eol_lnum) || (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol)))) { @@ -2138,7 +2138,7 @@ if (!checking_conversion) { #if defined(UNIX) && defined(HAVE_FSYNC) - // On many journalling file systems there is a bug that causes both the + // On many journaling file systems there is a bug that causes both the // original and the backup file to be lost when halting the system // right after writing the file. That's because only the meta-data is // journalled. Syncing the file slows down the system, but assures it @@ -2579,6 +2579,12 @@ #endif } +#ifdef FEAT_VIMINFO + // Make sure marks will be written out to the viminfo file later, even when + // the file is new. + curbuf->b_marks_read = TRUE; +#endif + got_int |= prev_got_int; return retval; diff -Nru vim-8.2.1913/src/change.c vim-8.2.2434/src/change.c --- vim-8.2.1913/src/change.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/change.c 2021-01-30 22:05:11.000000000 +0000 @@ -115,7 +115,7 @@ // Wait two seconds, to make sure the user reads this unexpected // message. Since we could be anywhere, call wait_return() now, // and don't let the emsg() set msg_scroll. - if (need_wait_return && emsg_silent == 0) + if (need_wait_return && emsg_silent == 0 && !in_assert_fails) { out_flush(); ui_delay(2002L, TRUE); diff -Nru vim-8.2.1913/src/charset.c vim-8.2.2434/src/charset.c --- vim-8.2.1913/src/charset.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/charset.c 2021-01-30 22:05:11.000000000 +0000 @@ -1594,6 +1594,12 @@ return (c == '0' || c == '1'); } + static int +vim_isodigit(int c) +{ + return (c >= '0' && c <= '7'); +} + /* * Vim's own character class functions. These exist because many library * islower()/toupper() etc. do not work properly: they crash when used with @@ -1831,7 +1837,7 @@ // binary ptr += 2; else if ((what & STR2NR_OOCT) - && (pre == 'O' || pre == 'o') && vim_isbdigit(ptr[2]) + && (pre == 'O' || pre == 'o') && vim_isodigit(ptr[2]) && (maxlen == 0 || maxlen > 2)) // octal with prefix "0o" ptr += 2; diff -Nru vim-8.2.1913/src/cindent.c vim-8.2.2434/src/cindent.c --- vim-8.2.1913/src/cindent.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/cindent.c 2021-01-30 22:05:11.000000000 +0000 @@ -2121,7 +2121,7 @@ } // #defines and so on go at the left when included in 'cinkeys', - // exluding pragmas when customized in 'cinoptions' + // excluding pragmas when customized in 'cinoptions' if (*theline == '#' && (*linecopy == '#' || in_cinkeys('#', ' ', TRUE))) { char_u *directive = skipwhite(theline + 1); diff -Nru vim-8.2.1913/src/clipboard.c vim-8.2.2434/src/clipboard.c --- vim-8.2.1913/src/clipboard.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/clipboard.c 2021-01-30 22:05:11.000000000 +0000 @@ -2025,6 +2025,9 @@ && get_y_register(STAR_REGISTER)->y_array != NULL)) return; + // Avoid triggering autocmds such as TextYankPost. + block_autocmds(); + // Get the text between clip_star.start & clip_star.end old_y_previous = get_y_previous(); old_y_current = get_y_current(); @@ -2044,6 +2047,8 @@ ca.count1 = 1; ca.retval = CA_NO_ADJ_OP_END; do_pending_operator(&ca, 0, TRUE); + + // restore things set_y_previous(old_y_previous); set_y_current(old_y_current); curwin->w_cursor = old_cursor; @@ -2054,6 +2059,8 @@ curbuf->b_op_end = old_op_end; VIsual = old_visual; VIsual_mode = old_visual_mode; + + unblock_autocmds(); } else if (!is_clipboard_needs_update()) { diff -Nru vim-8.2.1913/src/cmdexpand.c vim-8.2.2434/src/cmdexpand.c --- vim-8.2.1913/src/cmdexpand.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/cmdexpand.c 2021-01-30 22:05:11.000000000 +0000 @@ -1049,7 +1049,7 @@ ++p; } - // If the cursor is touching the command, and it ends in an alpha-numeric + // If the cursor is touching the command, and it ends in an alphanumeric // character, complete the command name. if (*p == NUL && ASCII_ISALNUM(p[-1])) return NULL; @@ -1391,7 +1391,7 @@ if (*arg != NUL) { xp->xp_context = EXPAND_NOTHING; - arg = skip_regexp(arg + 1, *arg, p_magic); + arg = skip_regexp(arg + 1, *arg, magic_isset()); } } return find_nextcmd(arg); @@ -1429,7 +1429,7 @@ { // skip "from" part ++arg; - arg = skip_regexp(arg, delim, p_magic); + arg = skip_regexp(arg, delim, magic_isset()); } // skip "to" part while (arg[0] != NUL && arg[0] != delim) @@ -2077,7 +2077,7 @@ pat = tofree; } - regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp(pat, magic_isset() ? RE_MAGIC : 0); if (regmatch.regprog == NULL) return FAIL; @@ -2680,7 +2680,10 @@ // Hitting after "emenu Name.": complete submenu if (c == K_DOWN && cclp->cmdpos > 0 && cclp->cmdbuff[cclp->cmdpos - 1] == '.') + { c = p_wc; + KeyTyped = TRUE; // in case the key was mapped + } else if (c == K_UP) { // Hitting : Remove one submenu name in front of the @@ -2714,6 +2717,7 @@ if (i > 0) cmdline_del(cclp, i); c = p_wc; + KeyTyped = TRUE; // in case the key was mapped xp->xp_context = EXPAND_NOTHING; } } @@ -2738,6 +2742,7 @@ { // go down a directory c = p_wc; + KeyTyped = TRUE; // in case the key was mapped } else if (STRNCMP(xp->xp_pattern, upseg + 1, 3) == 0 && c == K_DOWN) { @@ -2763,6 +2768,7 @@ { cmdline_del(cclp, j - 2); c = p_wc; + KeyTyped = TRUE; // in case the key was mapped } } else if (c == K_UP) diff -Nru vim-8.2.1913/src/configure.ac vim-8.2.2434/src/configure.ac --- vim-8.2.1913/src/configure.ac 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/configure.ac 2021-01-30 22:05:11.000000000 +0000 @@ -127,8 +127,9 @@ dnl change the constant 500002075 below appropriately. To get the dnl integer corresponding to a version number, refer to the dnl definition of CLANG_VERSION above. + dnl Clang 11 reports "11", assume Clang 10 and later work like this. AC_MSG_CHECKING(if clang supports -fno-strength-reduce) - if test "$CLANG_VERSION" -ge 500002075 ; then + if test "$CLANG_MAJOR" -ge 10 -o "$CLANG_VERSION" -ge 500002075 ; then AC_MSG_RESULT(no) CFLAGS=`echo "$CFLAGS" | sed -e 's/-fno-strength-reduce/ /'` else @@ -437,9 +438,9 @@ dnl Set QUOTESED. Needs additional backslashes on zOS if test "$zOSUnix" = "yes"; then - QUOTESED="sed -e 's/[[\\\\\"]]/\\\\\\\\&/g' -e 's/\\\\\\\\\"/\"/' -e 's/\\\\\\\\\";\$\$/\";/'" + QUOTESED="sed -e 's/[[\\\\\"]]/\\\\\\\\&/g' -e 's/\\\\\\\\\"/\"/' -e 's/\\\\\\\\\";\$\$/\";/' -e 's/ */ /g'" else - QUOTESED="sed -e 's/[[\\\\\"]]/\\\\&/g' -e 's/\\\\\"/\"/' -e 's/\\\\\";\$\$/\";/'" + QUOTESED="sed -e 's/[[\\\\\"]]/\\\\&/g' -e 's/\\\\\"/\"/' -e 's/\\\\\";\$\$/\";/' -e 's/ */ /g'" fi AC_SUBST(QUOTESED) @@ -632,7 +633,7 @@ inc_path="$vi_cv_path_lua_pfx/include" for dir in "$inc_path"/moonjit-[[0-9]]* ; do if test -d "$dir" ; then - lua_suf=`basename '$dir'` + lua_suf=`basename "$dir"` lua_suf="/$lua_suf" break fi @@ -1965,8 +1966,7 @@ librubyarg=`$vi_cv_path_ruby -r rbconfig -e "print $ruby_rbconfig.expand($ruby_rbconfig::CONFIG[['LIBRUBYARG']])"` librubya=`$vi_cv_path_ruby -r rbconfig -e "print $ruby_rbconfig.expand($ruby_rbconfig::CONFIG[['LIBRUBY_A']])"` rubylibdir=`$vi_cv_path_ruby -r rbconfig -e "print $ruby_rbconfig.expand($ruby_rbconfig::CONFIG[['libdir']])"` - if test -f "$rubylibdir/$librubya"; then - librubyarg="$librubyarg" + if test -f "$rubylibdir/$librubya" || expr "$librubyarg" : "-lruby"; then RUBY_LIBS="$RUBY_LIBS -L$rubylibdir" elif test "$librubyarg" = "libruby.a"; then dnl required on Mac OS 10.3 where libruby.a doesn't exist @@ -2002,6 +2002,9 @@ RUBY_CFLAGS="-DDYNAMIC_RUBY_DLL=\\\"$libruby_soname\\\" $RUBY_CFLAGS" RUBY_LIBS= fi + if test "X$CLANG_VERSION" != "X" -a "$rubyversion" -ge 30; then + RUBY_CFLAGS="$RUBY_CFLAGS -fdeclspec" + fi else AC_MSG_RESULT(not found; disabling Ruby) fi @@ -2581,6 +2584,9 @@ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` } else + dnl Put some text before the "no" to hint at installing the gtk-dev + dnl packages. + AC_MSG_CHECKING(for GTK -dev package) no_gtk=yes fi @@ -3593,7 +3599,15 @@ AC_MSG_CHECKING(for SVR4 ptys) if test -c /dev/ptmx ; then - AC_TRY_LINK([], [ptsname(0);grantpt(0);unlockpt(0);], + AC_TRY_LINK([ +// These should be in stdlib.h, but it depends on _XOPEN_SOURCE. +char *ptsname(int); +int unlockpt(int); +int grantpt(int); + ], [ + ptsname(0); + grantpt(0); + unlockpt(0);], AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SVR4_PTYS), AC_MSG_RESULT(no)) else @@ -4459,6 +4473,10 @@ AC_MSG_RESULT(no) fi +dnl $LDFLAGS is passed to glibtool in libvterm, it doesn't like a space +dnl between "-L" and the path that follows. +LDFLAGS=`echo "$LDFLAGS" | sed -e 's/-L /-L/g'` + dnl link.sh tries to avoid overlinking in a hackish way. dnl At least GNU ld supports --as-needed which provides the same functionality dnl at linker level. Let's use it. diff -Nru vim-8.2.1913/src/debugger.c vim-8.2.2434/src/debugger.c --- vim-8.2.1913/src/debugger.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/debugger.c 2021-01-30 22:05:11.000000000 +0000 @@ -864,7 +864,7 @@ */ static linenr_T debuggy_find( - int file, // TRUE for a file, FALSE for a function + int is_file, // TRUE for a file, FALSE for a function char_u *fname, // file or function name linenr_T after, // after this line number garray_T *gap, // either &dbg_breakp or &prof_ga @@ -873,20 +873,25 @@ struct debuggy *bp; int i; linenr_T lnum = 0; - char_u *name = fname; + char_u *name = NULL; + char_u *short_name = fname; int prev_got_int; // Return quickly when there are no breakpoints. if (gap->ga_len == 0) return (linenr_T)0; - // Replace K_SNR in function name with "". - if (!file && fname[0] == K_SPECIAL) + // For a script-local function remove the prefix, so that + // "profile func Func" matches "Func" in any script. Otherwise it's very + // difficult to profile/debug a script-local function. It may match a + // function in the wrong script, but that is much better than not being + // able to profile/debug a function in a script with unknown ID. + // Also match a script-specific name. + if (!is_file && fname[0] == K_SPECIAL) { + short_name = vim_strchr(fname, '_') + 1; name = alloc(STRLEN(fname) + 3); - if (name == NULL) - name = fname; - else + if (name != NULL) { STRCPY(name, ""); STRCPY(name + 5, fname + 3); @@ -898,8 +903,8 @@ // Skip entries that are not useful or are for a line that is beyond // an already found breakpoint. bp = &DEBUGGY(gap, i); - if (((bp->dbg_type == DBG_FILE) == file && - bp->dbg_type != DBG_EXPR && ( + if (((bp->dbg_type == DBG_FILE) == is_file + && bp->dbg_type != DBG_EXPR && ( #ifdef FEAT_PROFILE gap == &prof_ga || #endif @@ -910,7 +915,10 @@ // while matching should abort it. prev_got_int = got_int; got_int = FALSE; - if (vim_regexec_prog(&bp->dbg_prog, FALSE, name, (colnr_T)0)) + if ((name != NULL + && vim_regexec_prog(&bp->dbg_prog, FALSE, name, (colnr_T)0)) + || vim_regexec_prog(&bp->dbg_prog, FALSE, + short_name, (colnr_T)0)) { lnum = bp->dbg_lnum; if (fp != NULL) diff -Nru vim-8.2.1913/src/dict.c vim-8.2.2434/src/dict.c --- vim-8.2.1913/src/dict.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/dict.c 2021-01-30 22:05:11.000000000 +0000 @@ -22,6 +22,7 @@ /* * Allocate an empty header for a dictionary. + * Caller should take care of the reference count. */ dict_T * dict_alloc(void) @@ -106,10 +107,13 @@ dict_free_contents(dict_T *d) { hashtab_free_contents(&d->dv_hashtab); + free_type(d->dv_type); + d->dv_type = NULL; } /* * Clear hashtab "ht" and dict items it contains. + * If "ht" is not freed then you should call hash_init() next! */ void hashtab_free_contents(hashtab_T *ht) @@ -781,19 +785,30 @@ } /* + * Advance over a literal key, including "-". If the first character is not a + * literal key character then "key" is returned. + */ + char_u * +skip_literal_key(char_u *key) +{ + char_u *p; + + for (p = key; ASCII_ISALNUM(*p) || *p == '_' || *p == '-'; ++p) + ; + return p; +} + +/* * Get the key for #{key: val} into "tv" and advance "arg". * Return FAIL when there is no valid key. */ static int -get_literal_key(char_u **arg, typval_T *tv) +get_literal_key_tv(char_u **arg, typval_T *tv) { - char_u *p; + char_u *p = skip_literal_key(*arg); - if (!ASCII_ISALNUM(**arg) && **arg != '_' && **arg != '-') + if (p == *arg) return FAIL; - - for (p = *arg; ASCII_ISALNUM(*p) || *p == '_' || *p == '-'; ++p) - ; tv->v_type = VAR_STRING; tv->vval.v_string = vim_strnsave(*arg, p - *arg); @@ -802,6 +817,47 @@ } /* + * Get a literal key for a Vim9 dict: + * {"name": value}, + * {'name': value}, + * {name: value} use "name" as a literal key + * Return the key in allocated memory or NULL in the case of an error. + * "arg" is advanced to just after the key. + */ + char_u * +get_literal_key(char_u **arg) +{ + char_u *key; + char_u *end; + typval_T rettv; + + if (**arg == '\'') + { + if (eval_lit_string(arg, &rettv, TRUE) == FAIL) + return NULL; + key = rettv.vval.v_string; + } + else if (**arg == '"') + { + if (eval_string(arg, &rettv, TRUE) == FAIL) + return NULL; + key = rettv.vval.v_string; + } + else + { + end = skip_literal_key(*arg); + if (end == *arg) + { + semsg(_(e_invalid_key_str), *arg); + return NULL; + } + key = vim_strnsave(*arg, end - *arg); + *arg = end; + } + return key; +} + +/* * Allocate a variable for a Dictionary and fill it from "*arg". * "*arg" points to the "{". * "literal" is TRUE for #{key: val} @@ -849,10 +905,38 @@ *arg = skipwhite_and_linebreak(*arg + 1, evalarg); while (**arg != '}' && **arg != NUL) { - if ((literal - ? get_literal_key(arg, &tvkey) - : eval1(arg, &tvkey, evalarg)) == FAIL) // recursive! - goto failret; + int has_bracket = vim9script && **arg == '['; + + if (literal) + { + if (get_literal_key_tv(arg, &tvkey) == FAIL) + goto failret; + } + else if (vim9script && !has_bracket) + { + tvkey.vval.v_string = get_literal_key(arg); + if (tvkey.vval.v_string == NULL) + goto failret; + tvkey.v_type = VAR_STRING; + } + else + { + if (has_bracket) + *arg = skipwhite(*arg + 1); + if (eval1(arg, &tvkey, evalarg) == FAIL) // recursive! + goto failret; + if (has_bracket) + { + *arg = skipwhite(*arg); + if (**arg != ']') + { + emsg(_(e_missing_matching_bracket_after_dict_key)); + clear_tv(&tvkey); + return FAIL; + } + ++*arg; + } + } // the colon should come right after the key, but this wasn't checked // previously, so only require it in Vim9 script. @@ -869,6 +953,11 @@ } if (evaluate) { + if (vim9script && check_for_string(&tvkey) == FAIL) + { + clear_tv(&tvkey); + goto failret; + } key = tv_get_string_buf_chk(&tvkey, buf); if (key == NULL) { @@ -943,7 +1032,8 @@ if (**arg != '}') { - semsg(_(e_missing_dict_end), *arg); + if (evalarg != NULL) + semsg(_(e_missing_dict_end), *arg); failret: if (d != NULL) dict_free(d); @@ -970,6 +1060,12 @@ hashitem_T *hi2; int todo; char_u *arg_errmsg = (char_u *)N_("extend() argument"); + type_T *type; + + if (d1->dv_type != NULL && d1->dv_type->tt_member != NULL) + type = d1->dv_type->tt_member; + else + type = NULL; todo = (int)d2->dv_hashtab.ht_used; for (hi2 = d2->dv_hashtab.ht_array; todo > 0; ++hi2) @@ -986,9 +1082,14 @@ && HI2DI(hi2)->di_tv.v_type == VAR_FUNC && var_wrong_func_name(hi2->hi_key, di1 == NULL)) break; - if (!valid_varname(hi2->hi_key)) + if (!valid_varname(hi2->hi_key, TRUE)) break; } + + if (type != NULL + && check_typval_type(type, &HI2DI(hi2)->di_tv, 0) == FAIL) + break; + if (di1 == NULL) { di1 = dictitem_copy(HI2DI(hi2)); diff -Nru vim-8.2.1913/src/drawline.c vim-8.2.2434/src/drawline.c --- vim-8.2.1913/src/drawline.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/drawline.c 2021-01-30 22:05:11.000000000 +0000 @@ -641,7 +641,7 @@ else tocol = MAXCOL; // do at least one character; happens when past end of line - if (fromcol == tocol) + if (fromcol == tocol && search_match_endcol) tocol = fromcol + 1; area_highlighting = TRUE; vi_attr = HL_ATTR(HLF_I); @@ -1873,6 +1873,7 @@ char_u *prev_ptr, *p; int len; hlf_T spell_hlf = HLF_COUNT; + if (has_mbyte) { prev_ptr = ptr - mb_l; @@ -2445,15 +2446,18 @@ && conceal_cursor_line(wp) && (int)wp->w_virtcol <= vcol + n_skip) { -# ifdef FEAT_RIGHTLEFT +# ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) wp->w_wcol = wp->w_width - col + boguscols - 1; else -# endif +# endif wp->w_wcol = col - boguscols; wp->w_wrow = row; did_wcol = TRUE; curwin->w_valid |= VALID_WCOL|VALID_WROW|VALID_VIRTCOL; +# ifdef FEAT_PROP_POPUP + curwin->w_flags &= ~(WFLAG_WCOL_OFF_ADDED | WFLAG_WROW_OFF_ADDED); +# endif } #endif @@ -2778,10 +2782,14 @@ // Also highlight the 'colorcolumn' if 'breakindent' and/or 'showbreak' // options are set vcol_save_attr = -1; - if ((draw_state == WL_LINE || + if (((draw_state == WL_LINE || draw_state == WL_BRI || draw_state == WL_SBR) && !lnum_in_visual_area && search_attr == 0 && area_attr == 0) +# ifdef FEAT_DIFF + && filler_todo <= 0 +# endif + ) { if (wp->w_p_cuc && VCOL_HLC == (long)wp->w_virtcol && lnum != wp->w_cursor.lnum) diff -Nru vim-8.2.1913/src/edit.c vim-8.2.2434/src/edit.c --- vim-8.2.1913/src/edit.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/edit.c 2021-01-30 22:05:11.000000000 +0000 @@ -196,6 +196,10 @@ #endif ins_apply_autocmds(EVENT_INSERTENTER); + // Check for changed highlighting, e.g. for ModeMsg. + if (need_highlight_changed) + highlight_changed(); + // Make sure the cursor didn't move. Do call check_cursor_col() in // case the text was modified. Since Insert mode was not started yet // a call to check_cursor_col() may move the cursor, especially with @@ -1031,6 +1035,15 @@ case K_IGNORE: // Something mapped to nothing break; + case K_COMMAND: // command + do_cmdline(NULL, getcmdkeycmd, NULL, 0); +#ifdef FEAT_TERMINAL + if (term_use_loop()) + // Started a terminal that gets the input, exit Insert mode. + goto doESCkey; +#endif + break; + case K_CURSORHOLD: // Didn't type something for a while. ins_apply_autocmds(EVENT_CURSORHOLDI); did_cursorhold = TRUE; @@ -1525,7 +1538,6 @@ { int c; int did_putchar = FALSE; - int prev_mod_mask = mod_mask; // may need to redraw when no more chars available now ins_redraw(FALSE); @@ -1541,7 +1553,9 @@ add_to_showcmd_c(Ctrl_V); #endif - c = get_literal(); + // Do not change any modifyOtherKeys ESC sequence to a normal key for + // CTRL-SHIFT-V. + c = get_literal(mod_mask & MOD_MASK_SHIFT); if (did_putchar) // when the line fits in 'columns' the '^' is at the start of the next // line and will not removed by the redraw @@ -1550,11 +1564,6 @@ clear_showcmd(); #endif - if ((c == ESC || c == CSI) && !(prev_mod_mask & MOD_MASK_SHIFT)) - // Using CTRL-V: Change any modifyOtherKeys ESC sequence to a normal - // key. Don't do this for CTRL-SHIFT-V. - c = decodeModifyOtherKeys(c); - insert_special(c, FALSE, TRUE); #ifdef FEAT_RIGHTLEFT revins_chars++; @@ -1581,7 +1590,7 @@ // Recognize: // form 0: {lead}{key};{modifier}u // form 1: {lead}27;{modifier};{key}~ - if ((c == CSI || (c == ESC && *p == '[')) && typebuf.tb_len >= 4) + if (typebuf.tb_len >= 4 && (c == CSI || (c == ESC && *p == '['))) { idx = (*p == '['); if (p[idx] == '2' && p[idx + 1] == '7' && p[idx + 2] == ';') @@ -1836,9 +1845,11 @@ * A one, two or three digit decimal number is interpreted as its byte value. * If one or two digits are entered, the next character is given to vungetc(). * For Unicode a character > 255 may be returned. + * If "noReduceKeys" is TRUE do not change any modifyOtherKeys ESC sequence + * into a normal key, return ESC. */ int -get_literal(void) +get_literal(int noReduceKeys) { int cc; int nc; @@ -1869,6 +1880,9 @@ for (;;) { nc = plain_vgetc(); + if ((nc == ESC || nc == CSI) && !noReduceKeys) + nc = decodeModifyOtherKeys(nc); + #ifdef FEAT_CMDL_INFO if (!(State & CMDLINE) && MB_BYTE2LEN_CHECK(nc) == 1) add_to_showcmd(nc); @@ -3803,8 +3817,7 @@ { if (State & VREPLACE_FLAG) restart_edit = 'V'; - else - if (State & REPLACE_FLAG) + else if (State & REPLACE_FLAG) restart_edit = 'R'; else restart_edit = 'I'; @@ -3946,8 +3959,11 @@ #endif ((curwin->w_cursor.lnum == 1 && curwin->w_cursor.col == 0) || (!can_bs(BS_START) - && (arrow_used - || (curwin->w_cursor.lnum == Insstart_orig.lnum + && ((arrow_used +#ifdef FEAT_JOB_CHANNEL + && !bt_prompt(curbuf) +#endif + ) || (curwin->w_cursor.lnum == Insstart_orig.lnum && curwin->w_cursor.col <= Insstart_orig.col))) || (!can_bs(BS_INDENT) && !arrow_used && ai_col > 0 && curwin->w_cursor.col <= ai_col) diff -Nru vim-8.2.1913/src/errors.h vim-8.2.2434/src/errors.h --- vim-8.2.1913/src/errors.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/errors.h 2021-01-30 22:05:11.000000000 +0000 @@ -16,27 +16,35 @@ EXTERN char e_undefined_variable_char_str[] INIT(= N_("E121: Undefined variable: %c:%s")); #endif +EXTERN char e_ambiguous_use_of_user_defined_command[] + INIT(= N_("E464: Ambiguous use of user-defined command")); EXTERN char e_invalid_command[] INIT(= N_("E476: Invalid command")); #ifdef FEAT_EVAL EXTERN char e_invalid_command_str[] INIT(= N_("E476: Invalid command: %s")); +EXTERN char e_list_value_has_more_items_than_targets[] + INIT(= N_("E710: List value has more items than targets")); +EXTERN char e_list_value_does_not_have_enough_items[] + INIT(= N_("E711: List value does not have enough items")); EXTERN char e_cannot_slice_dictionary[] INIT(= N_("E719: Cannot slice a Dictionary")); EXTERN char e_assert_fails_second_arg[] INIT(= N_("E856: \"assert_fails()\" second argument must be a string or a list with one or two strings")); EXTERN char e_cannot_index_special_variable[] INIT(= N_("E909: Cannot index a special variable")); -EXTERN char e_missing_let_str[] - INIT(= N_("E1100: Missing :let: %s")); +#endif +EXTERN char e_command_not_supported_in_vim9_script_missing_var_str[] + INIT(= N_("E1100: Command not supported in Vim9 script (missing :var?): %s")); +#ifdef FEAT_EVAL EXTERN char e_variable_not_found_str[] INIT(= N_("E1001: Variable not found: %s")); EXTERN char e_syntax_error_at_str[] INIT(= N_("E1002: Syntax error at %s")); EXTERN char e_missing_return_value[] INIT(= N_("E1003: Missing return value")); -EXTERN char e_white_space_required_before_and_after_str[] - INIT(= N_("E1004: White space required before and after '%s'")); +EXTERN char e_white_space_required_before_and_after_str_at_str[] + INIT(= N_("E1004: White space required before and after '%s' at \"%s\"")); EXTERN char e_too_many_argument_types[] INIT(= N_("E1005: Too many argument types")); EXTERN char e_str_is_used_as_argument[] @@ -57,7 +65,7 @@ INIT(= N_("E1013: Argument %d: type mismatch, expected %s but got %s")); EXTERN char e_invalid_key_str[] INIT(= N_("E1014: Invalid key: %s")); -EXTERN char e_name_expected[] +EXTERN char e_name_expected_str[] INIT(= N_("E1015: Name expected: %s")); EXTERN char e_cannot_declare_a_scope_variable[] INIT(= N_("E1016: Cannot declare a %s variable: %s")); @@ -76,7 +84,7 @@ EXTERN char e_type_or_initialization_required[] INIT(= N_("E1022: Type or initialization required")); EXTERN char e_using_number_as_bool_nr[] - INIT(= N_("E1023: Using a Number as a Bool: %d")); + INIT(= N_("E1023: Using a Number as a Bool: %lld")); EXTERN char e_using_number_as_string[] INIT(= N_("E1024: Using a Number as a String")); EXTERN char e_using_rcurly_outside_if_block_scope[] @@ -89,8 +97,8 @@ INIT(= N_("E1028: Compiling :def function failed")); EXTERN char e_expected_str_but_got_str[] INIT(= N_("E1029: Expected %s but got %s")); -EXTERN char e_using_string_as_number[] - INIT(= N_("E1030: Using a String as a Number")); +EXTERN char e_using_string_as_number_str[] + INIT(= N_("E1030: Using a String as a Number: \"%s\"")); EXTERN char e_cannot_use_void_value[] INIT(= N_("E1031: Cannot use void value")); EXTERN char e_missing_catch_or_finally[] @@ -109,8 +117,10 @@ INIT(= N_("E1038: \"vim9script\" can only be used in a script")); EXTERN char e_vim9script_must_be_first_command_in_script[] INIT(= N_("E1039: \"vim9script\" must be the first command in a script")); +#endif EXTERN char e_cannot_use_scriptversion_after_vim9script[] INIT(= N_("E1040: Cannot use :scriptversion after :vim9script")); +#ifdef FEAT_EVAL EXTERN char e_redefining_script_item_str[] INIT(= N_("E1041: Redefining script item %s")); EXTERN char e_export_can_only_be_used_in_vim9script[] @@ -129,8 +139,8 @@ INIT(= N_("E1048: Item not found in script: %s")); EXTERN char e_item_not_exported_in_script_str[] INIT(= N_("E1049: Item not exported in script: %s")); -EXTERN char e_colon_required_before_a_range[] - INIT(= N_("E1050: Colon required before a range")); +EXTERN char e_colon_required_before_range_str[] + INIT(= N_("E1050: Colon required before a range: %s")); EXTERN char e_wrong_argument_type_for_plus[] INIT(= N_("E1051: Wrong argument type for +")); EXTERN char e_cannot_declare_an_option[] @@ -286,4 +296,56 @@ INIT(= N_("E1130: Cannot add to null list")); EXTERN char e_cannot_add_to_null_blob[] INIT(= N_("E1131: Cannot add to null blob")); +EXTERN char e_missing_function_argument[] + INIT(= N_("E1132: Missing function argument")); +EXTERN char e_cannot_extend_null_dict[] + INIT(= N_("E1133: Cannot extend a null dict")); +EXTERN char e_cannot_extend_null_list[] + INIT(= N_("E1134: Cannot extend a null list")); +EXTERN char e_using_string_as_bool_str[] + INIT(= N_("E1135: Using a String as a Bool: \"%s\"")); #endif +EXTERN char e_cmd_mapping_must_end_with_cr[] + INIT(=N_("E1135: mapping must end with ")); +EXTERN char e_cmd_mapping_must_end_with_cr_before_second_cmd[] + INIT(=N_("E1136: mapping must end with before second ")); +EXTERN char e_cmd_maping_must_not_include_str_key[] + INIT(= N_("E1137: mapping must not include %s key")); +EXTERN char e_using_bool_as_number[] + INIT(= N_("E1138: Using a Bool as a Number")); +EXTERN char e_missing_matching_bracket_after_dict_key[] + INIT(= N_("E1139: Missing matching bracket after dict key")); +EXTERN char e_for_argument_must_be_sequence_of_lists[] + INIT(= N_("E1140: For argument must be a sequence of lists")); +EXTERN char e_indexable_type_required[] + INIT(= N_("E1141: Indexable type required")); +EXTERN char e_non_empty_string_required[] + INIT(= N_("E1142: Non-empty string required")); +EXTERN char e_empty_expression_str[] + INIT(= N_("E1143: Empty expression: \"%s\"")); +EXTERN char e_command_not_followed_by_white_space_str[] + INIT(= N_("E1144: Command is not followed by white space: %s")); +EXTERN char e_missing_heredoc_end_marker_str[] + INIT(= N_("E1145: Missing heredoc end marker: %s")); +EXTERN char e_command_not_recognized_str[] + INIT(= N_("E1146: Command not recognized: %s")); +EXTERN char e_list_not_set[] + INIT(= N_("E1147: List not set")); +EXTERN char e_cannot_index_str[] + INIT(= N_("E1148: Cannot index a %s")); +EXTERN char e_script_variable_invalid_after_reload_in_function_str[] + INIT(= N_("E1149: Script variable is invalid after reload in function %s")); +EXTERN char e_script_variable_type_changed[] + INIT(= N_("E1150: Script variable type changed")); +EXTERN char e_mismatched_endfunction[] + INIT(= N_("E1151: Mismatched endfunction")); +EXTERN char e_mismatched_enddef[] + INIT(= N_("E1152: Mismatched enddef")); +EXTERN char e_invalid_operation_for_bool[] + INIT(= N_("E1153: Invalid operation for bool")); +EXTERN char e_divide_by_zero[] + INIT(= N_("E1154: Divide by zero")); +EXTERN char e_cannot_define_autocommands_for_all_events[] + INIT(= N_("E1155: Cannot define autocommands for ALL events")); +EXTERN char e_cannot_change_arglist_recursively[] + INIT(= N_("E1156: Cannot change the argument list recursively")); diff -Nru vim-8.2.1913/src/evalbuffer.c vim-8.2.2434/src/evalbuffer.c --- vim-8.2.1913/src/evalbuffer.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/evalbuffer.c 2021-01-30 22:05:11.000000000 +0000 @@ -68,7 +68,7 @@ save_magic = p_magic; p_magic = TRUE; save_cpo = p_cpo; - p_cpo = (char_u *)""; + p_cpo = empty_option; buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name), TRUE, FALSE, curtab_only)); @@ -807,6 +807,9 @@ switch_buffer(bufref_T *save_curbuf, buf_T *buf) { block_autocmds(); +#ifdef FEAT_FOLDING + ++disable_fold_update; +#endif set_bufref(save_curbuf, curbuf); --curbuf->b_nwindows; curbuf = buf; @@ -821,6 +824,9 @@ restore_buffer(bufref_T *save_curbuf) { unblock_autocmds(); +#ifdef FEAT_FOLDING + --disable_fold_update; +#endif // Check for valid buffer, just in case. if (bufref_valid(save_curbuf)) { diff -Nru vim-8.2.1913/src/eval.c vim-8.2.2434/src/eval.c --- vim-8.2.1913/src/eval.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/eval.c 2021-01-30 22:05:11.000000000 +0000 @@ -57,14 +57,21 @@ /* * Return "n1" divided by "n2", taking care of dividing by zero. + * If "failed" is not NULL set it to TRUE when dividing by zero fails. */ varnumber_T -num_divide(varnumber_T n1, varnumber_T n2) +num_divide(varnumber_T n1, varnumber_T n2, int *failed) { varnumber_T result; - if (n2 == 0) // give an error message? + if (n2 == 0) { + if (in_vim9script()) + { + emsg(_(e_divide_by_zero)); + if (failed != NULL) + *failed = TRUE; + } if (n1 == 0) result = VARNUM_MIN; // similar to NaN else if (n1 < 0) @@ -80,11 +87,17 @@ /* * Return "n1" modulus "n2", taking care of dividing by zero. + * If "failed" is not NULL set it to TRUE when dividing by zero fails. */ varnumber_T -num_modulus(varnumber_T n1, varnumber_T n2) +num_modulus(varnumber_T n1, varnumber_T n2, int *failed) { - // Give an error when n2 is 0? + if (n2 == 0 && in_vim9script()) + { + emsg(_(e_divide_by_zero)); + if (failed != NULL) + *failed = TRUE; + } return (n2 == 0) ? 0 : (n1 % n2); } @@ -467,56 +480,82 @@ } /* - * Top level evaluation function, returning a string. Does not handle line - * breaks. + * Convert "tv" to a string. * When "convert" is TRUE convert a List into a sequence of lines and convert * a Float to a String. - * Return pointer to allocated memory, or NULL for failure. + * Returns an allocated string (NULL when out of memory). */ char_u * -eval_to_string( - char_u *arg, - int convert) +typval2string(typval_T *tv, int convert) { - typval_T tv; - char_u *retval; garray_T ga; + char_u *retval; #ifdef FEAT_FLOAT char_u numbuf[NUMBUFLEN]; #endif - if (eval0(arg, &tv, NULL, &EVALARG_EVALUATE) == FAIL) - retval = NULL; - else + if (convert && tv->v_type == VAR_LIST) { - if (convert && tv.v_type == VAR_LIST) + ga_init2(&ga, (int)sizeof(char), 80); + if (tv->vval.v_list != NULL) { - ga_init2(&ga, (int)sizeof(char), 80); - if (tv.vval.v_list != NULL) - { - list_join(&ga, tv.vval.v_list, (char_u *)"\n", TRUE, FALSE, 0); - if (tv.vval.v_list->lv_len > 0) - ga_append(&ga, NL); - } - ga_append(&ga, NUL); - retval = (char_u *)ga.ga_data; + list_join(&ga, tv->vval.v_list, (char_u *)"\n", TRUE, FALSE, 0); + if (tv->vval.v_list->lv_len > 0) + ga_append(&ga, NL); } + ga_append(&ga, NUL); + retval = (char_u *)ga.ga_data; + } #ifdef FEAT_FLOAT - else if (convert && tv.v_type == VAR_FLOAT) - { - vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv.vval.v_float); - retval = vim_strsave(numbuf); - } + else if (convert && tv->v_type == VAR_FLOAT) + { + vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv->vval.v_float); + retval = vim_strsave(numbuf); + } #endif - else - retval = vim_strsave(tv_get_string(&tv)); + else + retval = vim_strsave(tv_get_string(tv)); + return retval; +} + +/* + * Top level evaluation function, returning a string. Does not handle line + * breaks. + * When "convert" is TRUE convert a List into a sequence of lines and convert + * a Float to a String. + * Return pointer to allocated memory, or NULL for failure. + */ + char_u * +eval_to_string_eap( + char_u *arg, + int convert, + exarg_T *eap) +{ + typval_T tv; + char_u *retval; + evalarg_T evalarg; + + fill_evalarg_from_eap(&evalarg, eap, eap != NULL && eap->skip); + if (eval0(arg, &tv, NULL, &evalarg) == FAIL) + retval = NULL; + else + { + retval = typval2string(&tv, convert); clear_tv(&tv); } - clear_evalarg(&EVALARG_EVALUATE, NULL); + clear_evalarg(&evalarg, NULL); return retval; } + char_u * +eval_to_string( + char_u *arg, + int convert) +{ + return eval_to_string_eap(arg, convert, NULL); +} + /* * Call eval_to_string() without using current local variables and using * textwinlock. When "use_sandbox" is TRUE use the sandbox. @@ -644,10 +683,27 @@ } /* + * Call Vim script function like call_func_retnr() and drop the result. + * Returns FAIL when calling the function fails. + */ + int +call_func_noret( + char_u *func, + int argc, + typval_T *argv) +{ + typval_T rettv; + + if (call_vim_function(func, argc, argv, &rettv) == FAIL) + return FAIL; + clear_tv(&rettv); + return OK; +} + +/* * Call Vim script function "func" and return the result as a string. + * Uses "argv" and "argc" as call_func_retnr(). * Returns NULL when calling the function fails. - * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should - * have type VAR_UNKNOWN. */ void * call_func_retstr( @@ -668,8 +724,7 @@ /* * Call Vim script function "func" and return the result as a List. - * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should - * have type VAR_UNKNOWN. + * Uses "argv" and "argc" as call_func_retnr(). * Returns NULL when there is something wrong. */ void * @@ -694,8 +749,10 @@ #ifdef FEAT_FOLDING /* - * Evaluate 'foldexpr'. Returns the foldlevel, and any character preceding - * it in "*cp". Doesn't give error messages. + * Evaluate "arg", which is 'foldexpr'. + * Note: caller must set "curwin" to match "arg". + * Returns the foldlevel, and any character preceding it in "*cp". Doesn't + * give error messages. */ int eval_foldexpr(char_u *arg, int *cp) @@ -780,15 +837,16 @@ listitem_T *ni; char_u *key = NULL; int len; - hashtab_T *ht; + hashtab_T *ht = NULL; int quiet = flags & GLV_QUIET; + int writing; // Clear everything in "lp". CLEAR_POINTER(lp); - if (skip) + if (skip || (flags & GLV_COMPILING)) { - // When skipping just find the end of the name. + // When skipping or compiling just find the end of the name. lp->ll_name = name; lp->ll_name_end = find_name_end(name, NULL, NULL, FNE_INCL_BR | fne_flags); @@ -841,7 +899,9 @@ char_u *tp = skipwhite(p + 1); // parse the type after the name - lp->ll_type = parse_type(&tp, &si->sn_type_list); + lp->ll_type = parse_type(&tp, &si->sn_type_list, !quiet); + if (lp->ll_type == NULL && !quiet) + return NULL; lp->ll_name_end = tp; } } @@ -853,16 +913,23 @@ cc = *p; *p = NUL; - // Only pass &ht when we would write to the variable, it prevents autoload - // as well. - v = find_var(lp->ll_name, (flags & GLV_READ_ONLY) ? NULL : &ht, - flags & GLV_NO_AUTOLOAD); + // When we would write to the variable pass &ht and prevent autoload. + writing = !(flags & GLV_READ_ONLY); + v = find_var(lp->ll_name, writing ? &ht : NULL, + (flags & GLV_NO_AUTOLOAD) || writing); if (v == NULL && !quiet) semsg(_(e_undefined_variable_str), lp->ll_name); *p = cc; if (v == NULL) return NULL; + if (in_vim9script() && (flags & GLV_NO_DECL) == 0) + { + if (!quiet) + semsg(_(e_variable_already_declared), lp->ll_name); + return NULL; + } + /* * Loop until no more [idx] or .key is following. */ @@ -1038,7 +1105,7 @@ wrong = (lp->ll_dict->dv_scope == VAR_DEF_SCOPE && rettv->v_type == VAR_FUNC && var_wrong_func_name(key, lp->ll_di == NULL)) - || !valid_varname(key); + || !valid_varname(key, TRUE); if (len != -1) key[len] = prevval; if (wrong) @@ -1300,7 +1367,7 @@ { typval_T tv; - if (flags & ASSIGN_CONST) + if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) { emsg(_(e_cannot_mod)); *endp = cc; @@ -1338,7 +1405,7 @@ listitem_T *ll_li = lp->ll_li; int ll_n1 = lp->ll_n1; - if (flags & ASSIGN_CONST) + if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) { emsg(_("E996: Cannot lock a range")); return; @@ -1386,18 +1453,18 @@ ++lp->ll_n1; } if (ri != NULL) - emsg(_("E710: List value has more items than target")); + emsg(_(e_list_value_has_more_items_than_targets)); else if (lp->ll_empty2 ? (lp->ll_li != NULL && lp->ll_li->li_next != NULL) : lp->ll_n1 != lp->ll_n2) - emsg(_("E711: List value has not enough items")); + emsg(_(e_list_value_does_not_have_enough_items)); } else { /* * Assign to a List or Dictionary item. */ - if (flags & ASSIGN_CONST) + if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) { emsg(_("E996: Cannot lock a list or dict")); return; @@ -1459,6 +1526,7 @@ varnumber_T n; char_u numbuf[NUMBUFLEN]; char_u *s; + int failed = FALSE; // Can't do anything with a Funcref, Dict, v:true on the right. if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT @@ -1542,8 +1610,10 @@ case '+': n += tv_get_number(tv2); break; case '-': n -= tv_get_number(tv2); break; case '*': n *= tv_get_number(tv2); break; - case '/': n = num_divide(n, tv_get_number(tv2)); break; - case '%': n = num_modulus(n, tv_get_number(tv2)); break; + case '/': n = num_divide(n, tv_get_number(tv2), + &failed); break; + case '%': n = num_modulus(n, tv_get_number(tv2), + &failed); break; } clear_tv(tv1); tv1->v_type = VAR_NUMBER; @@ -1562,7 +1632,7 @@ tv1->v_type = VAR_STRING; tv1->vval.v_string = s; } - return OK; + return failed ? FAIL : OK; case VAR_FLOAT: #ifdef FEAT_FLOAT @@ -1712,7 +1782,7 @@ { forinfo_T *fi = (forinfo_T *)fi_void; int result; - int flag = in_vim9script() ? ASSIGN_NO_DECL : 0; + int flag = in_vim9script() ? ASSIGN_DECL : 0; listitem_T *item; if (fi->fi_blob != NULL) @@ -1870,6 +1940,24 @@ while ((c = *++arg) != NUL && (c == ' ' || c == '\t')) /* skip */ ; } + + // ":exe one two" completes "two" + if ((cmdidx == CMD_execute + || cmdidx == CMD_echo + || cmdidx == CMD_echon + || cmdidx == CMD_echomsg) + && xp->xp_context == EXPAND_EXPRESSION) + { + for (;;) + { + char_u *n = skiptowhite(arg); + + if (n == arg || IS_WHITE_OR_NUL(*skipwhite(n))) + break; + arg = skipwhite(n); + } + } + xp->xp_pattern = arg; } @@ -1886,7 +1974,7 @@ // avoid 'l' flag in 'cpoptions' save_cpo = p_cpo; - p_cpo = (char_u *)""; + p_cpo = empty_option; regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); if (regmatch.regprog != NULL) { @@ -1918,13 +2006,15 @@ int len = name_len; partial_T *partial; int ret = OK; + type_T *type = NULL; if (!evaluate) check_vars(s, len); // If "s" is the name of a variable of type VAR_FUNC // use its contents. - s = deref_func_name(s, &len, &partial, !evaluate); + s = deref_func_name(s, &len, &partial, + in_vim9script() ? &type : NULL, !evaluate); // Need to make a copy, in case evaluating the arguments makes // the name invalid. @@ -1942,6 +2032,7 @@ funcexe.evaluate = evaluate; funcexe.partial = partial; funcexe.basetv = basetv; + funcexe.check_type = type; ret = get_func_tv(s, len, rettv, arg, evalarg, &funcexe); } vim_free(s); @@ -2145,7 +2236,13 @@ && called_emsg == called_emsg_before && (flags & EVAL_CONSTANT) == 0) semsg(_(e_invexpr2), arg); - ret = FAIL; + + // Some of the expression may not have been consumed. Do not check for + // a next command to avoid more errors, unless "|" is following, which + // could only be a command separator. + if (eap != NULL && skipwhite(p)[0] == '|' && skipwhite(p)[1] != '|') + eap->nextcmd = check_nextcmd(p); + return FAIL; } if (eap != NULL) @@ -2589,7 +2686,7 @@ { char_u *p; int getnext; - exptype_T type = EXPR_UNKNOWN; + exprtype_T type = EXPR_UNKNOWN; int len = 2; int type_is = FALSE; @@ -2758,10 +2855,11 @@ int vim9script = in_vim9script(); // "." is only string concatenation when scriptversion is 1 + // "+=" and "-=" are assignment p = eval_next_non_blank(*arg, evalarg, &getnext); op = *p; concat = op == '.' && (*(p + 1) == '.' || current_sctx.sc_version < 2); - if (op != '+' && op != '-' && !concat) + if ((op != '+' && op != '-' && !concat) || p[1] == '=') break; evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); @@ -3111,12 +3209,16 @@ else #endif { + int failed = FALSE; + if (op == '*') n1 = n1 * n2; else if (op == '/') - n1 = num_divide(n1, n2); + n1 = num_divide(n1, n2, &failed); else - n1 = num_modulus(n1, n2); + n1 = num_modulus(n1, n2, &failed); + if (failed) + return FAIL; rettv->v_type = VAR_NUMBER; rettv->vval.v_number = n1; @@ -3127,6 +3229,28 @@ return OK; } + int +eval_leader(char_u **arg, int vim9) +{ + char_u *s = *arg; + char_u *p = *arg; + + while (*p == '!' || *p == '-' || *p == '+') + { + char_u *n = skipwhite(p + 1); + + // ++, --, -+ and +- are not accepted in Vim9 script + if (vim9 && (*p == '-' || *p == '+') && (*n == '-' || *n == '+')) + { + semsg(_(e_invexpr2), s); + return FAIL; + } + p = n; + } + *arg = p; + return OK; +} + /* * Handle sixth level expression: * number number constant @@ -3182,8 +3306,8 @@ * Skip '!', '-' and '+' characters. They are handled later. */ start_leader = *arg; - while (**arg == '!' || **arg == '-' || **arg == '+') - *arg = skipwhite(*arg + 1); + if (eval_leader(arg, in_vim9script()) == FAIL) + return FAIL; end_leader = *arg; if (**arg == '.' && (!isdigit(*(*arg + 1)) @@ -3242,7 +3366,7 @@ /* * Dictionary: #{key: val, key: val} */ - case '#': if ((*arg)[1] == '{') + case '#': if (!in_vim9script() && (*arg)[1] == '{') { ++*arg; ret = eval_dict(arg, rettv, evalarg, TRUE); @@ -3255,7 +3379,10 @@ * Lambda: {arg, arg -> expr} * Dictionary: {'key': val, 'key': val} */ - case '{': ret = get_lambda_tv(arg, rettv, evalarg); + case '{': if (in_vim9script()) + ret = NOTDONE; + else + ret = get_lambda_tv(arg, rettv, in_vim9script(), evalarg); if (ret == NOTDONE) ret = eval_dict(arg, rettv, evalarg, FALSE); break; @@ -3288,8 +3415,13 @@ /* * nested expression: (expression). + * lambda: (arg) => expr */ - case '(': { + case '(': ret = NOTDONE; + if (in_vim9script()) + ret = get_lambda_tv(arg, rettv, TRUE, evalarg); + if (ret == NOTDONE) + { *arg = skipwhite_and_linebreak(*arg + 1, evalarg); ret = eval1(arg, rettv, evalarg); // recursive! @@ -3344,12 +3476,19 @@ ret = OK; } else if (len == 5 && in_vim9script() - && STRNCMP(s, "false", 4) == 0) + && STRNCMP(s, "false", 5) == 0) { rettv->v_type = VAR_BOOL; rettv->vval.v_number = VVAL_FALSE; ret = OK; } + else if (len == 4 && in_vim9script() + && STRNCMP(s, "null", 4) == 0) + { + rettv->v_type = VAR_SPECIAL; + rettv->vval.v_number = VVAL_NULL; + ret = OK; + } else ret = eval_variable(s, len, rettv, NULL, TRUE, FALSE); } @@ -3427,7 +3566,15 @@ } #ifdef FEAT_FLOAT if (rettv->v_type == VAR_FLOAT) - f = !f; + { + if (in_vim9script()) + { + rettv->v_type = VAR_BOOL; + val = f == 0.0 ? VVAL_TRUE : VVAL_FALSE; + } + else + f = !f; + } else #endif { @@ -3524,7 +3671,7 @@ /* * Evaluate "->method()". - * "*arg" points to the '-'. + * "*arg" points to "method". * Returns FAIL or OK. "*arg" is advanced to after the ')'. */ static int @@ -3539,11 +3686,26 @@ typval_T base = *rettv; int ret; - // Skip over the ->. - *arg += 2; rettv->v_type = VAR_UNKNOWN; - ret = get_lambda_tv(arg, rettv, evalarg); + if (**arg == '{') + { + // ->{lambda}() + ret = get_lambda_tv(arg, rettv, FALSE, evalarg); + } + else + { + // ->(lambda)() + ++*arg; + ret = eval1(arg, rettv, evalarg); + *arg = skipwhite_and_linebreak(*arg, evalarg); + if (**arg != ')') + { + emsg(_(e_missing_close)); + ret = FAIL; + } + ++*arg; + } if (ret != OK) return FAIL; else if (**arg != '(') @@ -3571,7 +3733,7 @@ /* * Evaluate "->method()". - * "*arg" points to the '-'. + * "*arg" points to "method". * Returns FAIL or OK. "*arg" is advanced to after the ')'. */ static int @@ -3589,8 +3751,6 @@ int evaluate = evalarg != NULL && (evalarg->eval_flags & EVAL_EVALUATE); - // Skip over the ->. - *arg += 2; rettv->v_type = VAR_UNKNOWN; name = *arg; @@ -3651,6 +3811,7 @@ int range = FALSE; char_u *key = NULL; int keylen = -1; + int vim9 = in_vim9script(); if (check_can_index(rettv, evaluate, verbose) == FAIL) return FAIL; @@ -3681,6 +3842,13 @@ empty1 = TRUE; else if (eval1(arg, &var1, evalarg) == FAIL) // recursive! return FAIL; + else if (vim9 && **arg == ':') + { + semsg(_(e_white_space_required_before_and_after_str_at_str), + ":", *arg); + clear_tv(&var1); + return FAIL; + } else if (evaluate && tv_get_string_chk(&var1) == NULL) { // not a number or string @@ -3695,7 +3863,16 @@ if (**arg == ':') { range = TRUE; - *arg = skipwhite_and_linebreak(*arg + 1, evalarg); + ++*arg; + if (vim9 && !IS_WHITE_OR_NUL(**arg) && **arg != ']') + { + semsg(_(e_white_space_required_before_and_after_str_at_str), + ":", *arg - 1); + if (!empty1) + clear_tv(&var1); + return FAIL; + } + *arg = skipwhite_and_linebreak(*arg, evalarg); if (**arg == ']') empty2 = TRUE; else if (eval1(arg, &var2, evalarg) == FAIL) // recursive! @@ -3731,8 +3908,9 @@ if (evaluate) { int res = eval_index_inner(rettv, range, - empty1 ? NULL : &var1, empty2 ? NULL : &var2, + empty1 ? NULL : &var1, empty2 ? NULL : &var2, FALSE, key, keylen, verbose); + if (!empty1) clear_tv(&var1); if (range) @@ -3792,9 +3970,26 @@ } /* + * slice() function + */ + void +f_slice(typval_T *argvars, typval_T *rettv) +{ + if (check_can_index(argvars, TRUE, FALSE) == OK) + { + copy_tv(argvars, rettv); + eval_index_inner(rettv, TRUE, argvars + 1, + argvars[2].v_type == VAR_UNKNOWN ? NULL : argvars + 2, + TRUE, NULL, 0, FALSE); + } +} + +/* * Apply index or range to "rettv". * "var1" is the first index, NULL for [:expr]. * "var2" is the second index, NULL for [expr] and [expr: ] + * "exclusive" is TRUE for slice(): second index is exclusive, use character + * index for string. * Alternatively, "key" is not NULL, then key[keylen] is the dict index. */ int @@ -3803,12 +3998,13 @@ int is_range, typval_T *var1, typval_T *var2, + int exclusive, char_u *key, int keylen, int verbose) { - long n1, n2 = 0; - long len; + varnumber_T n1, n2 = 0; + long len; n1 = 0; if (var1 != NULL && rettv->v_type != VAR_DICT) @@ -3822,10 +4018,10 @@ emsg(_(e_cannot_slice_dictionary)); return FAIL; } - if (var2 == NULL) - n2 = -1; - else + if (var2 != NULL) n2 = tv_get_number(var2); + else + n2 = VARNUM_MAX; } switch (rettv->v_type) @@ -3848,10 +4044,10 @@ char_u *s = tv_get_string(rettv); len = (long)STRLEN(s); - if (in_vim9script()) + if (in_vim9script() || exclusive) { if (is_range) - s = string_slice(s, n1, n2); + s = string_slice(s, n1, n2, exclusive); else s = char_from_string(s, n1); } @@ -3869,6 +4065,8 @@ n2 = len + n2; else if (n2 >= len) n2 = len; + if (exclusive) + --n2; if (n1 >= len || n2 < 0 || n1 > n2) s = NULL; else @@ -3905,7 +4103,9 @@ if (n2 < 0) n2 = len + n2; else if (n2 >= len) - n2 = len - 1; + n2 = len - (exclusive ? 0 : 1); + if (exclusive) + --n2; if (n1 >= len || n2 < 0 || n1 > n2) { clear_tv(rettv); @@ -3957,9 +4157,9 @@ if (var1 == NULL) n1 = 0; if (var2 == NULL) - n2 = -1; + n2 = VARNUM_MAX; if (list_slice_or_index(rettv->vval.v_list, - is_range, n1, n2, rettv, verbose) == FAIL) + is_range, n1, n2, exclusive, rettv, verbose) == FAIL) return FAIL; break; @@ -4605,7 +4805,7 @@ * "numbuf" is used for a number. * When "copyID" is not NULL replace recursive lists and dicts with "...". * When both "echo_style" and "composite_val" are FALSE, put quotes around - * stings as "string()", otherwise does not put quotes around strings, as + * strings as "string()", otherwise does not put quotes around strings, as * ":echo" displays values. * When "restore_copyID" is FALSE, repeated items in dictionaries and lists * are replaced with "...". @@ -4908,6 +5108,74 @@ #endif /* + * Convert the specified byte index of line 'lnum' in buffer 'buf' to a + * character index. Works only for loaded buffers. Returns -1 on failure. + * The index of the first byte and the first character is zero. + */ + int +buf_byteidx_to_charidx(buf_T *buf, int lnum, int byteidx) +{ + char_u *str; + char_u *t; + int count; + + if (buf == NULL || buf->b_ml.ml_mfp == NULL) + return -1; + + if (lnum > buf->b_ml.ml_line_count) + lnum = buf->b_ml.ml_line_count; + + str = ml_get_buf(buf, lnum, FALSE); + if (str == NULL) + return -1; + + if (*str == NUL) + return 0; + + // count the number of characters + t = str; + for (count = 0; *t != NUL && t <= str + byteidx; count++) + t += mb_ptr2len(t); + + // In insert mode, when the cursor is at the end of a non-empty line, + // byteidx points to the NUL character immediately past the end of the + // string. In this case, add one to the character count. + if (*t == NUL && byteidx != 0 && t == str + byteidx) + count++; + + return count - 1; +} + +/* + * Convert the specified character index of line 'lnum' in buffer 'buf' to a + * byte index. Works only for loaded buffers. Returns -1 on failure. + * The index of the first byte and the first character is zero. + */ + int +buf_charidx_to_byteidx(buf_T *buf, int lnum, int charidx) +{ + char_u *str; + char_u *t; + + if (buf == NULL || buf->b_ml.ml_mfp == NULL) + return -1; + + if (lnum > buf->b_ml.ml_line_count) + lnum = buf->b_ml.ml_line_count; + + str = ml_get_buf(buf, lnum, FALSE); + if (str == NULL) + return -1; + + // Convert the character offset to a byte offset + t = str; + while (*t != NUL && --charidx > 0) + t += mb_ptr2len(t); + + return t - str; +} + +/* * Translate a String variable into a position. * Returns NULL when there is an error. */ @@ -4915,7 +5183,8 @@ var2fpos( typval_T *varp, int dollar_lnum, // TRUE when $ is last line - int *fnum) // set to fnum for '0, 'A, etc. + int *fnum, // set to fnum for '0, 'A, etc. + int charcol) // return character column { char_u *name; static pos_T pos; @@ -4937,7 +5206,10 @@ pos.lnum = list_find_nr(l, 0L, &error); if (error || pos.lnum <= 0 || pos.lnum > curbuf->b_ml.ml_line_count) return NULL; // invalid line number - len = (long)STRLEN(ml_get(pos.lnum)); + if (charcol) + len = (long)mb_charlen(ml_get(pos.lnum)); + else + len = (long)STRLEN(ml_get(pos.lnum)); // Get the column number // We accept "$" for the column number: last column. @@ -4972,18 +5244,29 @@ if (name == NULL) return NULL; if (name[0] == '.') // cursor - return &curwin->w_cursor; + { + pos = curwin->w_cursor; + if (charcol) + pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col); + return &pos; + } if (name[0] == 'v' && name[1] == NUL) // Visual start { if (VIsual_active) - return &VIsual; - return &curwin->w_cursor; + pos = VIsual; + else + pos = curwin->w_cursor; + if (charcol) + pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col); + return &pos; } if (name[0] == '\'') // mark { pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum); if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) return NULL; + if (charcol) + pp->col = buf_byteidx_to_charidx(curbuf, pp->lnum, pp->col); return pp; } @@ -5018,7 +5301,10 @@ else { pos.lnum = curwin->w_cursor.lnum; - pos.col = (colnr_T)STRLEN(ml_get_curline()); + if (charcol) + pos.col = (colnr_T)mb_charlen(ml_get_curline()); + else + pos.col = (colnr_T)STRLEN(ml_get_curline()); } return &pos; } @@ -5038,7 +5324,8 @@ typval_T *arg, pos_T *posp, int *fnump, - colnr_T *curswantp) + colnr_T *curswantp, + int charcol) { list_T *l = arg->vval.v_list; long i = 0; @@ -5070,6 +5357,18 @@ n = list_find_nr(l, i++, NULL); // col if (n < 0) return FAIL; + // If character position is specified, then convert to byte position + if (charcol) + { + buf_T *buf; + + // Get the text for the specified line in a loaded buffer + buf = buflist_findnr(fnump == NULL ? curbuf->b_fnum : *fnump); + if (buf == NULL || buf->b_ml.ml_mfp == NULL) + return FAIL; + + n = buf_charidx_to_byteidx(buf, posp->lnum, n) + 1; + } posp->col = n; n = list_find_nr(l, i, NULL); // off @@ -5403,97 +5702,6 @@ } /* - * Return the character "str[index]" where "index" is the character index. If - * "index" is out of range NULL is returned. - */ - char_u * -char_from_string(char_u *str, varnumber_T index) -{ - size_t nbyte = 0; - varnumber_T nchar = index; - size_t slen; - - if (str == NULL || index < 0) - return NULL; - slen = STRLEN(str); - while (nchar > 0 && nbyte < slen) - { - nbyte += MB_CPTR2LEN(str + nbyte); - --nchar; - } - if (nbyte >= slen) - return NULL; - return vim_strnsave(str + nbyte, MB_CPTR2LEN(str + nbyte)); -} - -/* - * Get the byte index for character index "idx" in string "str" with length - * "str_len". - * If going over the end return "str_len". - * If "idx" is negative count from the end, -1 is the last character. - * When going over the start return -1. - */ - static long -char_idx2byte(char_u *str, size_t str_len, varnumber_T idx) -{ - varnumber_T nchar = idx; - size_t nbyte = 0; - - if (nchar >= 0) - { - while (nchar > 0 && nbyte < str_len) - { - nbyte += MB_CPTR2LEN(str + nbyte); - --nchar; - } - } - else - { - nbyte = str_len; - while (nchar < 0 && nbyte > 0) - { - --nbyte; - nbyte -= mb_head_off(str, str + nbyte); - ++nchar; - } - if (nchar < 0) - return -1; - } - return (long)nbyte; -} - -/* - * Return the slice "str[first:last]" using character indexes. - * Return NULL when the result is empty. - */ - char_u * -string_slice(char_u *str, varnumber_T first, varnumber_T last) -{ - long start_byte, end_byte; - size_t slen; - - if (str == NULL) - return NULL; - slen = STRLEN(str); - start_byte = char_idx2byte(str, slen, first); - if (start_byte < 0) - start_byte = 0; // first index very negative: use zero - if (last == -1) - end_byte = (long)slen; - else - { - end_byte = char_idx2byte(str, slen, last); - if (end_byte >= 0 && end_byte < (long)slen) - // end index is inclusive - end_byte += MB_CPTR2LEN(str + end_byte); - } - - if (start_byte >= (long)slen || end_byte <= start_byte) - return NULL; - return vim_strnsave(str + start_byte, end_byte - start_byte); -} - -/* * Handle: * - expr[expr], expr[expr:expr] subscript * - ".name" lookup @@ -5553,11 +5761,11 @@ } else if (p[0] == '-' && p[1] == '>') { - *arg = p; + *arg = skipwhite(p + 2); if (ret == OK) { - if ((*arg)[2] == '{') - // expr->{lambda}() + if ((**arg == '{' && !in_vim9script()) || **arg == '(') + // expr->{lambda}() or expr->(lambda)() ret = eval_lambda(arg, rettv, evalarg, verbose); else // expr->name() @@ -6089,8 +6297,14 @@ if (p_cpo == empty_option) p_cpo = save_cpo; else + { // Darn, evaluating {sub} expression or {expr} changed the value. + // If it's still empty it was changed and restored, need to restore in + // the complicated way. + if (*p_cpo == NUL) + set_option_value((char_u *)"cpo", 0L, save_cpo, 0); free_string_option(save_cpo); + } return ret; } diff -Nru vim-8.2.1913/src/evalfunc.c vim-8.2.2434/src/evalfunc.c --- vim-8.2.1913/src/evalfunc.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/evalfunc.c 2021-01-30 22:05:11.000000000 +0000 @@ -47,6 +47,8 @@ #endif static void f_changenr(typval_T *argvars, typval_T *rettv); static void f_char2nr(typval_T *argvars, typval_T *rettv); +static void f_charcol(typval_T *argvars, typval_T *rettv); +static void f_charidx(typval_T *argvars, typval_T *rettv); static void f_col(typval_T *argvars, typval_T *rettv); static void f_confirm(typval_T *argvars, typval_T *rettv); static void f_copy(typval_T *argvars, typval_T *rettv); @@ -86,12 +88,14 @@ static void f_garbagecollect(typval_T *argvars, typval_T *rettv); static void f_get(typval_T *argvars, typval_T *rettv); static void f_getchangelist(typval_T *argvars, typval_T *rettv); +static void f_getcharpos(typval_T *argvars, typval_T *rettv); static void f_getcharsearch(typval_T *argvars, typval_T *rettv); static void f_getenv(typval_T *argvars, typval_T *rettv); static void f_getfontname(typval_T *argvars, typval_T *rettv); static void f_getjumplist(typval_T *argvars, typval_T *rettv); static void f_getpid(typval_T *argvars, typval_T *rettv); static void f_getcurpos(typval_T *argvars, typval_T *rettv); +static void f_getcursorcharpos(typval_T *argvars, typval_T *rettv); static void f_getpos(typval_T *argvars, typval_T *rettv); static void f_getreg(typval_T *argvars, typval_T *rettv); static void f_getreginfo(typval_T *argvars, typval_T *rettv); @@ -189,7 +193,9 @@ static void f_searchpair(typval_T *argvars, typval_T *rettv); static void f_searchpairpos(typval_T *argvars, typval_T *rettv); static void f_searchpos(typval_T *argvars, typval_T *rettv); +static void f_setcharpos(typval_T *argvars, typval_T *rettv); static void f_setcharsearch(typval_T *argvars, typval_T *rettv); +static void f_setcursorcharpos(typval_T *argvars, typval_T *rettv); static void f_setenv(typval_T *argvars, typval_T *rettv); static void f_setfperm(typval_T *argvars, typval_T *rettv); static void f_setpos(typval_T *argvars, typval_T *rettv); @@ -269,6 +275,7 @@ int arg_count; // actual argument count type_T **arg_types; // list of argument types int arg_idx; // current argument index (first arg is zero) + cctx_T *arg_cctx; } argcontext_T; // A function to check one argument type. The first argument is the type to @@ -276,6 +283,25 @@ // E.g. if "arg_idx" is 1, then (type - 1) is the first argument type. typedef int (*argcheck_T)(type_T *, argcontext_T *); +/* + * Call need_type() to check an argument type. + */ + static int +check_arg_type( + type_T *expected, + type_T *actual, + argcontext_T *context) +{ + // TODO: would be useful to know if "actual" is a constant and pass it to + // need_type() to get a compile time error if possible. + return need_type(actual, expected, + context->arg_idx - context->arg_count, context->arg_idx + 1, + context->arg_cctx, FALSE, FALSE); +} + +/* + * Check "type" is a float or a number. + */ static int arg_float_or_nr(type_T *type, argcontext_T *context) { @@ -286,12 +312,39 @@ return FAIL; } +/* + * Check "type" is a number. + */ static int arg_number(type_T *type, argcontext_T *context) { - return check_type(&t_number, type, TRUE, context->arg_idx + 1); + return check_arg_type(&t_number, type, context); +} + +/* + * Check "type" is a string. + */ + static int +arg_string(type_T *type, argcontext_T *context) +{ + return check_arg_type(&t_string, type, context); } +/* + * Check "type" is a bool or number 0 or 1. + */ + static int +arg_bool(type_T *type, argcontext_T *context) +{ + if (type->tt_type == VAR_ANY + || type->tt_type == VAR_NUMBER || type->tt_type == VAR_BOOL) + return OK; + return check_arg_type(&t_bool, type, context); +} + +/* + * Check "type" is a list or a blob. + */ static int arg_list_or_blob(type_T *type, argcontext_T *context) { @@ -303,7 +356,47 @@ } /* - * Check the type is an item of the list or blob of the previous arg. + * Check "type" is a list or a dict. + */ + static int +arg_list_or_dict(type_T *type, argcontext_T *context) +{ + if (type->tt_type == VAR_ANY + || type->tt_type == VAR_LIST || type->tt_type == VAR_DICT) + return OK; + arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); + return FAIL; +} + +/* + * Check "type" is the same type as the previous argument. + * Must not be used for the first argcheck_T entry. + */ + static int +arg_same_as_prev(type_T *type, argcontext_T *context) +{ + type_T *prev_type = context->arg_types[context->arg_idx - 1]; + + return check_arg_type(prev_type, type, context); +} + +/* + * Check "type" is the same basic type as the previous argument, checks list or + * dict vs other type, but not member type. + * Must not be used for the first argcheck_T entry. + */ + static int +arg_same_struct_as_prev(type_T *type, argcontext_T *context) +{ + type_T *prev_type = context->arg_types[context->arg_idx - 1]; + + if (prev_type->tt_type != context->arg_types[context->arg_idx]->tt_type) + return check_arg_type(prev_type, type, context); + return OK; +} + +/* + * Check "type" is an item of the list or blob of the previous arg. * Must not be used for the first argcheck_T entry. */ static int @@ -320,13 +413,33 @@ // probably VAR_ANY, can't check return OK; - return check_type(expected, type, TRUE, context->arg_idx + 1); + return check_arg_type(expected, type, context); } /* + * Check "type" which is the third argument of extend(). + */ + static int +arg_extend3(type_T *type, argcontext_T *context) +{ + type_T *first_type = context->arg_types[context->arg_idx - 2]; + + if (first_type->tt_type == VAR_LIST) + return arg_number(type, context); + if (first_type->tt_type == VAR_DICT) + return arg_string(type, context); + return OK; +} + + +/* * Lists of functions that check the argument types of a builtin function. */ +argcheck_T arg3_string_nr_bool[] = {arg_string, arg_number, arg_bool}; argcheck_T arg1_float_or_nr[] = {arg_float_or_nr}; +argcheck_T arg2_listblob_item[] = {arg_list_or_blob, arg_item_of_prev}; +argcheck_T arg23_extend[] = {arg_list_or_dict, arg_same_as_prev, arg_extend3}; +argcheck_T arg23_extendnew[] = {arg_list_or_dict, arg_same_struct_as_prev, arg_extend3}; argcheck_T arg3_insert[] = {arg_list_or_blob, arg_item_of_prev, arg_number}; /* @@ -349,6 +462,11 @@ return &t_bool; } static type_T * +ret_number_bool(int argcount UNUSED, type_T **argtypes UNUSED) +{ + return &t_number_bool; +} + static type_T * ret_number(int argcount UNUSED, type_T **argtypes UNUSED) { return &t_number; @@ -389,6 +507,13 @@ return &t_dict_any; } static type_T * +ret_job_info(int argcount, type_T **argtypes UNUSED) +{ + if (argcount == 0) + return &t_list_job; + return &t_dict_any; +} + static type_T * ret_dict_number(int argcount UNUSED, type_T **argtypes UNUSED) { return &t_dict_number; @@ -418,7 +543,6 @@ { return &t_job; } - static type_T * ret_first_arg(int argcount, type_T **argtypes) { @@ -426,6 +550,18 @@ return argtypes[0]; return &t_void; } +// for map(): returns first argument but item type may differ + static type_T * +ret_first_cont(int argcount UNUSED, type_T **argtypes) +{ + if (argtypes[0]->tt_type == VAR_LIST) + return &t_list_any; + if (argtypes[0]->tt_type == VAR_DICT) + return &t_dict_any; + if (argtypes[0]->tt_type == VAR_BLOB) + return argtypes[0]; + return &t_any; +} /* * Used for getqflist(): returns list if there is no argument, dict if there is @@ -567,14 +703,14 @@ ret_any, FLOAT_FUNC(f_abs)}, {"acos", 1, 1, FEARG_1, NULL, ret_float, FLOAT_FUNC(f_acos)}, - {"add", 2, 2, FEARG_1, NULL, + {"add", 2, 2, FEARG_1, NULL /* arg2_listblob_item */, ret_first_arg, f_add}, {"and", 2, 2, FEARG_1, NULL, ret_number, f_and}, {"append", 2, 2, FEARG_2, NULL, - ret_number, f_append}, + ret_number_bool, f_append}, {"appendbufline", 3, 3, FEARG_3, NULL, - ret_number, f_appendbufline}, + ret_number_bool, f_appendbufline}, {"argc", 0, 1, 0, NULL, ret_number, f_argc}, {"argidx", 0, 0, 0, NULL, @@ -586,29 +722,29 @@ {"asin", 1, 1, FEARG_1, NULL, ret_float, FLOAT_FUNC(f_asin)}, {"assert_beeps", 1, 2, FEARG_1, NULL, - ret_number, f_assert_beeps}, + ret_number_bool, f_assert_beeps}, {"assert_equal", 2, 3, FEARG_2, NULL, - ret_number, f_assert_equal}, + ret_number_bool, f_assert_equal}, {"assert_equalfile", 2, 3, FEARG_1, NULL, - ret_number, f_assert_equalfile}, + ret_number_bool, f_assert_equalfile}, {"assert_exception", 1, 2, 0, NULL, - ret_number, f_assert_exception}, + ret_number_bool, f_assert_exception}, {"assert_fails", 1, 5, FEARG_1, NULL, - ret_number, f_assert_fails}, + ret_number_bool, f_assert_fails}, {"assert_false", 1, 2, FEARG_1, NULL, - ret_number, f_assert_false}, + ret_number_bool, f_assert_false}, {"assert_inrange", 3, 4, FEARG_3, NULL, - ret_number, f_assert_inrange}, + ret_number_bool, f_assert_inrange}, {"assert_match", 2, 3, FEARG_2, NULL, - ret_number, f_assert_match}, + ret_number_bool, f_assert_match}, {"assert_notequal", 2, 3, FEARG_2, NULL, - ret_number, f_assert_notequal}, + ret_number_bool, f_assert_notequal}, {"assert_notmatch", 2, 3, FEARG_2, NULL, - ret_number, f_assert_notmatch}, + ret_number_bool, f_assert_notmatch}, {"assert_report", 1, 1, FEARG_1, NULL, - ret_number, f_assert_report}, + ret_number_bool, f_assert_report}, {"assert_true", 1, 2, FEARG_1, NULL, - ret_number, f_assert_true}, + ret_number_bool, f_assert_true}, {"atan", 1, 1, FEARG_1, NULL, ret_float, FLOAT_FUNC(f_atan)}, {"atan2", 2, 2, FEARG_1, NULL, @@ -644,19 +780,19 @@ {"bufadd", 1, 1, FEARG_1, NULL, ret_number, f_bufadd}, {"bufexists", 1, 1, FEARG_1, NULL, - ret_number, f_bufexists}, + ret_number_bool, f_bufexists}, {"buffer_exists", 1, 1, FEARG_1, NULL, // obsolete - ret_number, f_bufexists}, + ret_number_bool, f_bufexists}, {"buffer_name", 0, 1, FEARG_1, NULL, // obsolete ret_string, f_bufname}, {"buffer_number", 0, 1, FEARG_1, NULL, // obsolete ret_number, f_bufnr}, {"buflisted", 1, 1, FEARG_1, NULL, - ret_number, f_buflisted}, + ret_number_bool, f_buflisted}, {"bufload", 1, 1, FEARG_1, NULL, ret_void, f_bufload}, {"bufloaded", 1, 1, FEARG_1, NULL, - ret_number, f_bufloaded}, + ret_number_bool, f_bufloaded}, {"bufname", 0, 1, FEARG_1, NULL, ret_string, f_bufname}, {"bufnr", 0, 2, FEARG_1, NULL, @@ -676,7 +812,7 @@ {"ceil", 1, 1, FEARG_1, NULL, ret_float, FLOAT_FUNC(f_ceil)}, {"ch_canread", 1, 1, FEARG_1, NULL, - ret_number, JOB_FUNC(f_ch_canread)}, + ret_number_bool, JOB_FUNC(f_ch_canread)}, {"ch_close", 1, 1, FEARG_1, NULL, ret_void, JOB_FUNC(f_ch_close)}, {"ch_close_in", 1, 1, FEARG_1, NULL, @@ -717,6 +853,10 @@ ret_number, f_char2nr}, {"charclass", 1, 1, FEARG_1, NULL, ret_number, f_charclass}, + {"charcol", 1, 1, FEARG_1, NULL, + ret_number, f_charcol}, + {"charidx", 2, 3, FEARG_1, NULL, + ret_number, f_charidx}, {"chdir", 1, 1, FEARG_1, NULL, ret_string, f_chdir}, {"cindent", 1, 1, FEARG_1, NULL, @@ -730,7 +870,7 @@ {"complete_add", 1, 1, FEARG_1, NULL, ret_number, f_complete_add}, {"complete_check", 0, 0, 0, NULL, - ret_number, f_complete_check}, + ret_number_bool, f_complete_check}, {"complete_info", 0, 1, FEARG_1, NULL, ret_dict_any, f_complete_info}, {"confirm", 1, 4, FEARG_1, NULL, @@ -758,19 +898,19 @@ {"deepcopy", 1, 2, FEARG_1, NULL, ret_first_arg, f_deepcopy}, {"delete", 1, 2, FEARG_1, NULL, - ret_number, f_delete}, + ret_number_bool, f_delete}, {"deletebufline", 2, 3, FEARG_1, NULL, - ret_number, f_deletebufline}, + ret_number_bool, f_deletebufline}, {"did_filetype", 0, 0, 0, NULL, - ret_number, f_did_filetype}, + ret_number_bool, f_did_filetype}, {"diff_filler", 1, 1, FEARG_1, NULL, ret_number, f_diff_filler}, {"diff_hlID", 2, 2, FEARG_1, NULL, ret_number, f_diff_hlID}, {"echoraw", 1, 1, FEARG_1, NULL, - ret_number, f_echoraw}, + ret_void, f_echoraw}, {"empty", 1, 1, FEARG_1, NULL, - ret_number, f_empty}, + ret_number_bool, f_empty}, {"environ", 0, 0, 0, NULL, ret_dict_string, f_environ}, {"escape", 2, 2, FEARG_1, NULL, @@ -778,7 +918,7 @@ {"eval", 1, 1, FEARG_1, NULL, ret_any, f_eval}, {"eventhandler", 0, 0, 0, NULL, - ret_number, f_eventhandler}, + ret_number_bool, f_eventhandler}, {"executable", 1, 1, FEARG_1, NULL, ret_number, f_executable}, {"execute", 1, 2, FEARG_1, NULL, @@ -786,21 +926,23 @@ {"exepath", 1, 1, FEARG_1, NULL, ret_string, f_exepath}, {"exists", 1, 1, FEARG_1, NULL, - ret_number, f_exists}, + ret_number_bool, f_exists}, {"exp", 1, 1, FEARG_1, NULL, ret_float, FLOAT_FUNC(f_exp)}, {"expand", 1, 3, FEARG_1, NULL, ret_any, f_expand}, {"expandcmd", 1, 1, FEARG_1, NULL, ret_string, f_expandcmd}, - {"extend", 2, 3, FEARG_1, NULL, + {"extend", 2, 3, FEARG_1, arg23_extend, ret_first_arg, f_extend}, + {"extendnew", 2, 3, FEARG_1, arg23_extendnew, + ret_first_cont, f_extendnew}, {"feedkeys", 1, 2, FEARG_1, NULL, ret_void, f_feedkeys}, {"file_readable", 1, 1, FEARG_1, NULL, // obsolete - ret_number, f_filereadable}, + ret_number_bool, f_filereadable}, {"filereadable", 1, 1, FEARG_1, NULL, - ret_number, f_filereadable}, + ret_number_bool, f_filereadable}, {"filewritable", 1, 1, FEARG_1, NULL, ret_number, f_filewritable}, {"filter", 2, 2, FEARG_1, NULL, @@ -853,6 +995,8 @@ ret_number, f_getchar}, {"getcharmod", 0, 0, 0, NULL, ret_number, f_getcharmod}, + {"getcharpos", 1, 1, FEARG_1, NULL, + ret_list_number, f_getcharpos}, {"getcharsearch", 0, 0, 0, NULL, ret_dict_any, f_getcharsearch}, {"getcmdline", 0, 0, 0, NULL, @@ -867,6 +1011,8 @@ ret_list_string, f_getcompletion}, {"getcurpos", 0, 1, FEARG_1, NULL, ret_list_number, f_getcurpos}, + {"getcursorcharpos", 0, 1, FEARG_1, NULL, + ret_list_number, f_getcursorcharpos}, {"getcwd", 0, 2, FEARG_1, NULL, ret_string, f_getcwd}, {"getenv", 1, 1, FEARG_1, NULL, @@ -882,7 +1028,7 @@ {"getftype", 1, 1, FEARG_1, NULL, ret_string, f_getftype}, {"getimstatus", 0, 0, 0, NULL, - ret_number, f_getimstatus}, + ret_number_bool, f_getimstatus}, {"getjumplist", 0, 2, FEARG_1, NULL, ret_list_any, f_getjumplist}, {"getline", 1, 2, FEARG_1, NULL, @@ -934,21 +1080,21 @@ {"globpath", 2, 5, FEARG_2, NULL, ret_any, f_globpath}, {"has", 1, 2, 0, NULL, - ret_number, f_has}, + ret_number_bool, f_has}, {"has_key", 2, 2, FEARG_1, NULL, - ret_number, f_has_key}, + ret_number_bool, f_has_key}, {"haslocaldir", 0, 2, FEARG_1, NULL, ret_number, f_haslocaldir}, {"hasmapto", 1, 3, FEARG_1, NULL, - ret_number, f_hasmapto}, + ret_number_bool, f_hasmapto}, {"highlightID", 1, 1, FEARG_1, NULL, // obsolete ret_number, f_hlID}, {"highlight_exists",1, 1, FEARG_1, NULL, // obsolete - ret_number, f_hlexists}, + ret_number_bool, f_hlexists}, {"histadd", 2, 2, FEARG_2, NULL, - ret_number, f_histadd}, + ret_number_bool, f_histadd}, {"histdel", 1, 2, FEARG_1, NULL, - ret_number, f_histdel}, + ret_number_bool, f_histdel}, {"histget", 1, 2, FEARG_1, NULL, ret_string, f_histget}, {"histnr", 1, 1, FEARG_1, NULL, @@ -956,7 +1102,7 @@ {"hlID", 1, 1, FEARG_1, NULL, ret_number, f_hlID}, {"hlexists", 1, 1, FEARG_1, NULL, - ret_number, f_hlexists}, + ret_number_bool, f_hlexists}, {"hostname", 0, 0, 0, NULL, ret_string, f_hostname}, {"iconv", 3, 3, FEARG_1, NULL, @@ -972,9 +1118,9 @@ {"inputlist", 1, 1, FEARG_1, NULL, ret_number, f_inputlist}, {"inputrestore", 0, 0, 0, NULL, - ret_number, f_inputrestore}, + ret_number_bool, f_inputrestore}, {"inputsave", 0, 0, 0, NULL, - ret_number, f_inputsave}, + ret_number_bool, f_inputsave}, {"inputsecret", 1, 2, FEARG_1, NULL, ret_string, f_inputsecret}, {"insert", 2, 3, FEARG_1, arg3_insert, @@ -984,19 +1130,19 @@ {"invert", 1, 1, FEARG_1, NULL, ret_number, f_invert}, {"isdirectory", 1, 1, FEARG_1, NULL, - ret_number, f_isdirectory}, + ret_number_bool, f_isdirectory}, {"isinf", 1, 1, FEARG_1, NULL, ret_number, MATH_FUNC(f_isinf)}, {"islocked", 1, 1, FEARG_1, NULL, - ret_number, f_islocked}, + ret_number_bool, f_islocked}, {"isnan", 1, 1, FEARG_1, NULL, - ret_number, MATH_FUNC(f_isnan)}, + ret_number_bool, MATH_FUNC(f_isnan)}, {"items", 1, 1, FEARG_1, NULL, ret_list_any, f_items}, {"job_getchannel", 1, 1, FEARG_1, NULL, ret_channel, JOB_FUNC(f_job_getchannel)}, {"job_info", 0, 1, FEARG_1, NULL, - ret_dict_any, JOB_FUNC(f_job_info)}, + ret_job_info, JOB_FUNC(f_job_info)}, {"job_setoptions", 2, 2, FEARG_1, NULL, ret_void, JOB_FUNC(f_job_setoptions)}, {"job_start", 1, 2, FEARG_1, NULL, @@ -1004,7 +1150,7 @@ {"job_status", 1, 1, FEARG_1, NULL, ret_string, JOB_FUNC(f_job_status)}, {"job_stop", 1, 2, FEARG_1, NULL, - ret_number, JOB_FUNC(f_job_stop)}, + ret_number_bool, JOB_FUNC(f_job_stop)}, {"join", 1, 2, FEARG_1, NULL, ret_string, f_join}, {"js_decode", 1, 1, FEARG_1, NULL, @@ -1038,7 +1184,7 @@ {"listener_flush", 0, 1, FEARG_1, NULL, ret_void, f_listener_flush}, {"listener_remove", 1, 1, FEARG_1, NULL, - ret_number, f_listener_remove}, + ret_number_bool, f_listener_remove}, {"localtime", 0, 0, 0, NULL, ret_number, f_localtime}, {"log", 1, 1, FEARG_1, NULL, @@ -1054,11 +1200,13 @@ #endif }, {"map", 2, 2, FEARG_1, NULL, - ret_any, f_map}, + ret_first_cont, f_map}, {"maparg", 1, 4, FEARG_1, NULL, ret_maparg, f_maparg}, {"mapcheck", 1, 3, FEARG_1, NULL, ret_string, f_mapcheck}, + {"mapnew", 2, 2, FEARG_1, NULL, + ret_first_cont, f_mapnew}, {"mapset", 3, 3, FEARG_1, NULL, ret_void, f_mapset}, {"match", 2, 4, FEARG_1, NULL, @@ -1070,7 +1218,7 @@ {"matcharg", 1, 1, FEARG_1, NULL, ret_list_string, f_matcharg}, {"matchdelete", 1, 2, FEARG_1, NULL, - ret_number, f_matchdelete}, + ret_number_bool, f_matchdelete}, {"matchend", 2, 4, FEARG_1, NULL, ret_number, f_matchend}, {"matchfuzzy", 2, 3, FEARG_1, NULL, @@ -1084,7 +1232,7 @@ {"matchstrpos", 2, 4, FEARG_1, NULL, ret_list_any, f_matchstrpos}, {"max", 1, 1, FEARG_1, NULL, - ret_any, f_max}, + ret_number, f_max}, {"menu_info", 1, 2, FEARG_1, NULL, ret_dict_any, #ifdef FEAT_MENU @@ -1094,9 +1242,9 @@ #endif }, {"min", 1, 1, FEARG_1, NULL, - ret_any, f_min}, + ret_number, f_min}, {"mkdir", 1, 3, FEARG_1, NULL, - ret_number, f_mkdir}, + ret_number_bool, f_mkdir}, {"mode", 0, 1, FEARG_1, NULL, ret_string, f_mode}, {"mzeval", 1, 1, FEARG_1, NULL, @@ -1202,7 +1350,7 @@ {"pum_getpos", 0, 0, 0, NULL, ret_dict_number, f_pum_getpos}, {"pumvisible", 0, 0, 0, NULL, - ret_number, f_pumvisible}, + ret_number_bool, f_pumvisible}, {"py3eval", 1, 1, FEARG_1, NULL, ret_any, #ifdef FEAT_PYTHON3 @@ -1231,12 +1379,14 @@ ret_number, f_rand}, {"range", 1, 3, FEARG_1, NULL, ret_list_number, f_range}, + {"readblob", 1, 1, FEARG_1, NULL, + ret_blob, f_readblob}, {"readdir", 1, 3, FEARG_1, NULL, ret_list_string, f_readdir}, {"readdirex", 1, 3, FEARG_1, NULL, ret_list_dict_any, f_readdirex}, {"readfile", 1, 3, FEARG_1, NULL, - ret_any, f_readfile}, + ret_list_string, f_readfile}, {"reduce", 2, 3, FEARG_1, NULL, ret_any, f_reduce}, {"reg_executing", 0, 0, 0, NULL, @@ -1264,7 +1414,7 @@ {"remove", 2, 3, FEARG_1, NULL, ret_remove, f_remove}, {"rename", 2, 2, FEARG_1, NULL, - ret_number, f_rename}, + ret_number_bool, f_rename}, {"repeat", 2, 2, FEARG_1, NULL, ret_first_arg, f_repeat}, {"resolve", 1, 1, FEARG_1, NULL, @@ -1300,7 +1450,7 @@ {"searchcount", 0, 1, FEARG_1, NULL, ret_dict_any, f_searchcount}, {"searchdecl", 1, 3, FEARG_1, NULL, - ret_number, f_searchdecl}, + ret_number_bool, f_searchdecl}, {"searchpair", 3, 7, 0, NULL, ret_number, f_searchpair}, {"searchpairpos", 3, 7, 0, NULL, @@ -1308,41 +1458,45 @@ {"searchpos", 1, 5, FEARG_1, NULL, ret_list_number, f_searchpos}, {"server2client", 2, 2, FEARG_1, NULL, - ret_number, f_server2client}, + ret_number_bool, f_server2client}, {"serverlist", 0, 0, 0, NULL, ret_string, f_serverlist}, {"setbufline", 3, 3, FEARG_3, NULL, - ret_number, f_setbufline}, + ret_number_bool, f_setbufline}, {"setbufvar", 3, 3, FEARG_3, NULL, ret_void, f_setbufvar}, {"setcellwidths", 1, 1, FEARG_1, NULL, ret_void, f_setcellwidths}, + {"setcharpos", 2, 2, FEARG_2, NULL, + ret_number_bool, f_setcharpos}, {"setcharsearch", 1, 1, FEARG_1, NULL, ret_void, f_setcharsearch}, {"setcmdpos", 1, 1, FEARG_1, NULL, - ret_number, f_setcmdpos}, + ret_number_bool, f_setcmdpos}, + {"setcursorcharpos", 1, 3, FEARG_1, NULL, + ret_number_bool, f_setcursorcharpos}, {"setenv", 2, 2, FEARG_2, NULL, ret_void, f_setenv}, {"setfperm", 2, 2, FEARG_1, NULL, - ret_number, f_setfperm}, + ret_number_bool, f_setfperm}, {"setline", 2, 2, FEARG_2, NULL, - ret_number, f_setline}, + ret_number_bool, f_setline}, {"setloclist", 2, 4, FEARG_2, NULL, - ret_number, f_setloclist}, + ret_number_bool, f_setloclist}, {"setmatches", 1, 2, FEARG_1, NULL, - ret_number, f_setmatches}, + ret_number_bool, f_setmatches}, {"setpos", 2, 2, FEARG_2, NULL, - ret_number, f_setpos}, + ret_number_bool, f_setpos}, {"setqflist", 1, 3, FEARG_1, NULL, - ret_number, f_setqflist}, + ret_number_bool, f_setqflist}, {"setreg", 2, 3, FEARG_2, NULL, - ret_number, f_setreg}, + ret_number_bool, f_setreg}, {"settabvar", 3, 3, FEARG_3, NULL, ret_void, f_settabvar}, {"settabwinvar", 4, 4, FEARG_4, NULL, ret_void, f_settabwinvar}, {"settagstack", 2, 3, FEARG_2, NULL, - ret_number, f_settagstack}, + ret_number_bool, f_settagstack}, {"setwinvar", 3, 3, FEARG_3, NULL, ret_void, f_setwinvar}, {"sha256", 1, 1, FEARG_1, NULL, @@ -1370,9 +1524,9 @@ {"sign_placelist", 1, 1, FEARG_1, NULL, ret_list_number, SIGN_FUNC(f_sign_placelist)}, {"sign_undefine", 0, 1, FEARG_1, NULL, - ret_number, SIGN_FUNC(f_sign_undefine)}, + ret_number_bool, SIGN_FUNC(f_sign_undefine)}, {"sign_unplace", 1, 2, FEARG_1, NULL, - ret_number, SIGN_FUNC(f_sign_unplace)}, + ret_number_bool, SIGN_FUNC(f_sign_unplace)}, {"sign_unplacelist", 1, 2, FEARG_1, NULL, ret_list_number, SIGN_FUNC(f_sign_unplacelist)}, {"simplify", 1, 1, FEARG_1, NULL, @@ -1381,6 +1535,8 @@ ret_float, FLOAT_FUNC(f_sin)}, {"sinh", 1, 1, FEARG_1, NULL, ret_float, FLOAT_FUNC(f_sinh)}, + {"slice", 2, 3, FEARG_1, NULL, + ret_first_arg, f_slice}, {"sort", 1, 3, FEARG_1, NULL, ret_first_arg, f_sort}, {"sound_clear", 0, 0, 0, NULL, @@ -1409,7 +1565,7 @@ ret_float, FLOAT_FUNC(f_str2float)}, {"str2list", 1, 2, FEARG_1, NULL, ret_list_number, f_str2list}, - {"str2nr", 1, 3, FEARG_1, NULL, + {"str2nr", 1, 3, FEARG_1, arg3_string_nr_bool, ret_number, f_str2nr}, {"strcharpart", 2, 3, FEARG_1, NULL, ret_string, f_strcharpart}, @@ -1625,6 +1781,8 @@ ret_float, FLOAT_FUNC(f_trunc)}, {"type", 1, 1, FEARG_1, NULL, ret_number, f_type}, + {"typename", 1, 1, FEARG_1, NULL, + ret_string, f_typename}, {"undofile", 1, 1, FEARG_1, NULL, ret_string, f_undofile}, {"undotree", 0, 0, 0, NULL, @@ -1648,7 +1806,7 @@ {"win_gettype", 0, 1, FEARG_1, NULL, ret_string, f_win_gettype}, {"win_gotoid", 1, 1, FEARG_1, NULL, - ret_number, f_win_gotoid}, + ret_number_bool, f_win_gotoid}, {"win_id2tabwin", 1, 1, FEARG_1, NULL, ret_list_number, f_win_id2tabwin}, {"win_id2win", 1, 1, FEARG_1, NULL, @@ -1656,7 +1814,7 @@ {"win_screenpos", 1, 1, FEARG_1, NULL, ret_list_number, f_win_screenpos}, {"win_splitmove", 2, 3, FEARG_1, NULL, - ret_number, f_win_splitmove}, + ret_number_bool, f_win_splitmove}, {"winbufnr", 1, 1, FEARG_1, NULL, ret_number, f_winbufnr}, {"wincol", 0, 0, 0, NULL, @@ -1676,13 +1834,13 @@ {"winrestview", 1, 1, FEARG_1, NULL, ret_void, f_winrestview}, {"winsaveview", 0, 0, 0, NULL, - ret_dict_any, f_winsaveview}, + ret_dict_number, f_winsaveview}, {"winwidth", 1, 1, FEARG_1, NULL, ret_number, f_winwidth}, {"wordcount", 0, 0, 0, NULL, ret_dict_number, f_wordcount}, {"writefile", 2, 3, FEARG_1, NULL, - ret_number, f_writefile}, + ret_number_bool, f_writefile}, {"xor", 2, 2, FEARG_1, NULL, ret_number, f_xor}, }; @@ -1703,7 +1861,11 @@ { name = get_user_func_name(xp, idx); if (name != NULL) + { + if (*name != '<' && STRNCMP("g:", xp->xp_pattern, 2) == 0) + return cat_prefix_varname('g', name); return name; + } } if (++intidx < (int)(sizeof(global_functions) / sizeof(funcentry_T))) { @@ -1804,7 +1966,11 @@ * Return FAIL and gives an error message when a type is wrong. */ int -internal_func_check_arg_types(type_T **types, int idx, int argcount) +internal_func_check_arg_types( + type_T **types, + int idx, + int argcount, + cctx_T *cctx) { argcheck_T *argchecks = global_functions[idx].f_argcheck; int i; @@ -1815,6 +1981,7 @@ context.arg_count = argcount; context.arg_types = types; + context.arg_cctx = cctx; for (i = 0; i < argcount; ++i) if (argchecks[i] != NULL) { @@ -1838,6 +2005,15 @@ } /* + * Return TRUE if "idx" is for the map() function. + */ + int +internal_func_is_map(int idx) +{ + return global_functions[idx].f_func == f_map; +} + +/* * Check the argument count to use for internal function "idx". * Returns -1 for failure, 0 if no method base accepted, 1 if method base is * first argument, 2 if method base is second argument, etc. 9 if method base @@ -2346,34 +2522,19 @@ rettv->vval.v_number = tv_get_string(&argvars[0])[0]; } - win_T * -get_optional_window(typval_T *argvars, int idx) -{ - win_T *win = curwin; - - if (argvars[idx].v_type != VAR_UNKNOWN) - { - win = find_win_by_nr_or_id(&argvars[idx]); - if (win == NULL) - { - emsg(_(e_invalwindow)); - return NULL; - } - } - return win; -} - /* - * "col(string)" function + * Get the current cursor column and store it in 'rettv'. If 'charcol' is TRUE, + * returns the character index of the column. Otherwise, returns the byte index + * of the column. */ static void -f_col(typval_T *argvars, typval_T *rettv) +get_col(typval_T *argvars, typval_T *rettv, int charcol) { colnr_T col = 0; pos_T *fp; int fnum = curbuf->b_fnum; - fp = var2fpos(&argvars[0], FALSE, &fnum); + fp = var2fpos(&argvars[0], FALSE, &fnum, charcol); if (fp != NULL && fnum == curbuf->b_fnum) { if (fp->col == MAXCOL) @@ -2408,6 +2569,92 @@ } /* + * "charcol()" function + */ + static void +f_charcol(typval_T *argvars, typval_T *rettv) +{ + get_col(argvars, rettv, TRUE); +} + +/* + * "charidx()" function + */ + static void +f_charidx(typval_T *argvars, typval_T *rettv) +{ + char_u *str; + varnumber_T idx; + varnumber_T countcc = FALSE; + char_u *p; + int len; + int (*ptr2len)(char_u *); + + rettv->vval.v_number = -1; + + if (argvars[0].v_type != VAR_STRING || argvars[1].v_type != VAR_NUMBER + || (argvars[2].v_type != VAR_UNKNOWN + && argvars[2].v_type != VAR_NUMBER)) + { + emsg(_(e_invarg)); + return; + } + + str = tv_get_string_chk(&argvars[0]); + idx = tv_get_number_chk(&argvars[1], NULL); + if (str == NULL || idx < 0) + return; + + if (argvars[2].v_type != VAR_UNKNOWN) + countcc = tv_get_bool(&argvars[2]); + if (countcc < 0 || countcc > 1) + { + semsg(_(e_using_number_as_bool_nr), countcc); + return; + } + + if (enc_utf8 && countcc) + ptr2len = utf_ptr2len; + else + ptr2len = mb_ptr2len; + + for (p = str, len = 0; p <= str + idx; len++) + { + if (*p == NUL) + return; + p += ptr2len(p); + } + + rettv->vval.v_number = len > 0 ? len - 1 : 0; +} + + win_T * +get_optional_window(typval_T *argvars, int idx) +{ + win_T *win = curwin; + + if (argvars[idx].v_type != VAR_UNKNOWN) + { + win = find_win_by_nr_or_id(&argvars[idx]); + if (win == NULL) + { + emsg(_(e_invalwindow)); + return NULL; + } + } + return win; +} + +/* + * "col(string)" function + */ + static void +f_col(typval_T *argvars, typval_T *rettv) +{ + get_col(argvars, rettv, FALSE); +} + +/* * "confirm(message, buttons[, default [, type]])" function */ static void @@ -2505,26 +2752,24 @@ #endif /* - * "cursor(lnum, col)" function, or - * "cursor(list)" - * - * Moves the cursor to the specified line and column. - * Returns 0 when the position could be set, -1 otherwise. + * Set the cursor position. + * If 'charcol' is TRUE, then use the column number as a character offet. + * Otherwise use the column number as a byte offset. */ static void -f_cursor(typval_T *argvars, typval_T *rettv) +set_cursorpos(typval_T *argvars, typval_T *rettv, int charcol) { long line, col; long coladd = 0; int set_curswant = TRUE; rettv->vval.v_number = -1; - if (argvars[1].v_type == VAR_UNKNOWN) + if (argvars[0].v_type == VAR_LIST) { pos_T pos; colnr_T curswant = -1; - if (list2fpos(argvars, &pos, NULL, &curswant) == FAIL) + if (list2fpos(argvars, &pos, NULL, &curswant, charcol) == FAIL) { emsg(_(e_invarg)); return; @@ -2538,13 +2783,25 @@ set_curswant = FALSE; } } - else + else if ((argvars[0].v_type == VAR_NUMBER || + argvars[0].v_type == VAR_STRING) + && (argvars[1].v_type == VAR_NUMBER || + argvars[1].v_type == VAR_STRING)) { line = tv_get_lnum(argvars); + if (line < 0) + semsg(_(e_invarg2), tv_get_string(&argvars[0])); col = (long)tv_get_number_chk(&argvars[1], NULL); + if (charcol) + col = buf_charidx_to_byteidx(curbuf, line, col) + 1; if (argvars[2].v_type != VAR_UNKNOWN) coladd = (long)tv_get_number_chk(&argvars[2], NULL); } + else + { + emsg(_(e_invarg)); + return; + } if (line < 0 || col < 0 || coladd < 0) return; // type error; errmsg already given if (line > 0) @@ -2563,6 +2820,19 @@ rettv->vval.v_number = 0; } +/* + * "cursor(lnum, col)" function, or + * "cursor(list)" + * + * Moves the cursor to the specified line and column. + * Returns 0 when the position could be set, -1 otherwise. + */ + static void +f_cursor(typval_T *argvars, typval_T *rettv) +{ + set_cursorpos(argvars, rettv, FALSE); +} + #ifdef MSWIN /* * "debugbreak()" function @@ -2596,11 +2866,11 @@ static void f_deepcopy(typval_T *argvars, typval_T *rettv) { - int noref = 0; + varnumber_T noref = 0; int copyID; if (argvars[1].v_type != VAR_UNKNOWN) - noref = (int)tv_get_bool_chk(&argvars[1], NULL); + noref = tv_get_bool_chk(&argvars[1], NULL); if (noref < 0 || noref > 1) semsg(_(e_using_number_as_bool_nr), noref); else @@ -3367,7 +3637,8 @@ { name = s; trans_name = trans_function_name(&name, &is_global, FALSE, - TFN_INT | TFN_QUIET | TFN_NO_AUTOLOAD | TFN_NO_DEREF, NULL, NULL); + TFN_INT | TFN_QUIET | TFN_NO_AUTOLOAD | TFN_NO_DEREF, + NULL, NULL, NULL); if (*name != NUL) s = NULL; } @@ -3756,6 +4027,88 @@ #endif } + static void +getpos_both( + typval_T *argvars, + typval_T *rettv, + int getcurpos, + int charcol) +{ + pos_T *fp = NULL; + pos_T pos; + win_T *wp = curwin; + list_T *l; + int fnum = -1; + + if (rettv_list_alloc(rettv) == OK) + { + l = rettv->vval.v_list; + if (getcurpos) + { + if (argvars[0].v_type != VAR_UNKNOWN) + { + wp = find_win_by_nr_or_id(&argvars[0]); + if (wp != NULL) + fp = &wp->w_cursor; + } + else + fp = &curwin->w_cursor; + if (fp != NULL && charcol) + { + pos = *fp; + pos.col = + buf_byteidx_to_charidx(wp->w_buffer, pos.lnum, pos.col); + fp = &pos; + } + } + else + fp = var2fpos(&argvars[0], TRUE, &fnum, charcol); + if (fnum != -1) + list_append_number(l, (varnumber_T)fnum); + else + list_append_number(l, (varnumber_T)0); + list_append_number(l, (fp != NULL) ? (varnumber_T)fp->lnum + : (varnumber_T)0); + list_append_number(l, (fp != NULL) + ? (varnumber_T)(fp->col == MAXCOL ? MAXCOL : fp->col + 1) + : (varnumber_T)0); + list_append_number(l, (fp != NULL) ? (varnumber_T)fp->coladd : + (varnumber_T)0); + if (getcurpos) + { + int save_set_curswant = curwin->w_set_curswant; + colnr_T save_curswant = curwin->w_curswant; + colnr_T save_virtcol = curwin->w_virtcol; + + if (wp == curwin) + update_curswant(); + list_append_number(l, wp == NULL ? 0 : wp->w_curswant == MAXCOL + ? (varnumber_T)MAXCOL : (varnumber_T)wp->w_curswant + 1); + + // Do not change "curswant", as it is unexpected that a get + // function has a side effect. + if (wp == curwin && save_set_curswant) + { + curwin->w_set_curswant = save_set_curswant; + curwin->w_curswant = save_curswant; + curwin->w_virtcol = save_virtcol; + curwin->w_valid &= ~VALID_VIRTCOL; + } + } + } + else + rettv->vval.v_number = FALSE; +} + +/* + * "getcharpos()" function + */ + static void +f_getcharpos(typval_T *argvars UNUSED, typval_T *rettv) +{ + getpos_both(argvars, rettv, FALSE, TRUE); +} + /* * "getcharsearch()" function */ @@ -3888,77 +4241,19 @@ rettv->vval.v_number = mch_get_pid(); } - static void -getpos_both( - typval_T *argvars, - typval_T *rettv, - int getcurpos) -{ - pos_T *fp = NULL; - win_T *wp = curwin; - list_T *l; - int fnum = -1; - - if (rettv_list_alloc(rettv) == OK) - { - l = rettv->vval.v_list; - if (getcurpos) - { - if (argvars[0].v_type != VAR_UNKNOWN) - { - wp = find_win_by_nr_or_id(&argvars[0]); - if (wp != NULL) - fp = &wp->w_cursor; - } - else - fp = &curwin->w_cursor; - } - else - fp = var2fpos(&argvars[0], TRUE, &fnum); - if (fnum != -1) - list_append_number(l, (varnumber_T)fnum); - else - list_append_number(l, (varnumber_T)0); - list_append_number(l, (fp != NULL) ? (varnumber_T)fp->lnum - : (varnumber_T)0); - list_append_number(l, (fp != NULL) - ? (varnumber_T)(fp->col == MAXCOL ? MAXCOL : fp->col + 1) - : (varnumber_T)0); - list_append_number(l, (fp != NULL) ? (varnumber_T)fp->coladd : - (varnumber_T)0); - if (getcurpos) - { - int save_set_curswant = curwin->w_set_curswant; - colnr_T save_curswant = curwin->w_curswant; - colnr_T save_virtcol = curwin->w_virtcol; - - if (wp == curwin) - update_curswant(); - list_append_number(l, wp == NULL ? 0 : wp->w_curswant == MAXCOL - ? (varnumber_T)MAXCOL : (varnumber_T)wp->w_curswant + 1); - - // Do not change "curswant", as it is unexpected that a get - // function has a side effect. - if (wp == curwin && save_set_curswant) - { - curwin->w_set_curswant = save_set_curswant; - curwin->w_curswant = save_curswant; - curwin->w_virtcol = save_virtcol; - curwin->w_valid &= ~VALID_VIRTCOL; - } - } - } - else - rettv->vval.v_number = FALSE; -} - /* * "getcurpos()" function */ static void f_getcurpos(typval_T *argvars, typval_T *rettv) { - getpos_both(argvars, rettv, TRUE); + getpos_both(argvars, rettv, TRUE, FALSE); +} + + static void +f_getcursorcharpos(typval_T *argvars, typval_T *rettv) +{ + getpos_both(argvars, rettv, TRUE, TRUE); } /* @@ -3967,7 +4262,7 @@ static void f_getpos(typval_T *argvars, typval_T *rettv) { - getpos_both(argvars, rettv, FALSE); + getpos_both(argvars, rettv, FALSE, FALSE); } /* @@ -4369,6 +4664,13 @@ }, {"cmdline_compl", 1}, {"cmdline_hist", 1}, + {"cmdwin", +#ifdef FEAT_CMDWIN + 1 +#else + 0 +#endif + }, {"comments", 1}, {"conceal", #ifdef FEAT_CONCEAL @@ -5423,6 +5725,73 @@ } /* + * Return TRUE if "feature" can change later. + * Also when checking for the feature has side effects, such as loading a DLL. + */ + int +dynamic_feature(char_u *feature) +{ + return (feature == NULL +#if defined(FEAT_BEVAL) && defined(FEAT_GUI_MSWIN) + || STRICMP(feature, "balloon_multiline") == 0 +#endif +#if defined(FEAT_GUI) && defined(FEAT_BROWSE) + || (STRICMP(feature, "browse") == 0 && !gui.in_use) +#endif +#ifdef VIMDLL + || STRICMP(feature, "filterpipe") == 0 +#endif +#if defined(FEAT_GUI) && !defined(ALWAYS_USE_GUI) && !defined(VIMDLL) + // this can only change on Unix where the ":gui" command could be + // used. + || (STRICMP(feature, "gui_running") == 0 && !gui.in_use) +#endif +#if defined(USE_ICONV) && defined(DYNAMIC_ICONV) + || STRICMP(feature, "iconv") == 0 +#endif +#ifdef DYNAMIC_LUA + || STRICMP(feature, "lua") == 0 +#endif +#ifdef FEAT_MOUSE_GPM + || (STRICMP(feature, "mouse_gpm_enabled") == 0 && !gpm_enabled()) +#endif +#ifdef DYNAMIC_MZSCHEME + || STRICMP(feature, "mzscheme") == 0 +#endif +#ifdef FEAT_NETBEANS_INTG + || STRICMP(feature, "netbeans_enabled") == 0 +#endif +#ifdef DYNAMIC_PERL + || STRICMP(feature, "perl") == 0 +#endif +#ifdef DYNAMIC_PYTHON + || STRICMP(feature, "python") == 0 +#endif +#ifdef DYNAMIC_PYTHON3 + || STRICMP(feature, "python3") == 0 +#endif +#if defined(DYNAMIC_PYTHON) || defined(DYNAMIC_PYTHON3) + || STRICMP(feature, "pythonx") == 0 +#endif +#ifdef DYNAMIC_RUBY + || STRICMP(feature, "ruby") == 0 +#endif +#ifdef FEAT_SYN_HL + || STRICMP(feature, "syntax_items") == 0 +#endif +#ifdef DYNAMIC_TCL + || STRICMP(feature, "tcl") == 0 +#endif + // once "starting" is zero it will stay that way + || (STRICMP(feature, "vim_starting") == 0 && starting != 0) + || STRICMP(feature, "multi_byte_encoding") == 0 +#if defined(FEAT_TERMINAL) && defined(MSWIN) + || STRICMP(feature, "conpty") == 0 +#endif + ); +} + +/* * "haslocaldir()" function */ static void @@ -5985,14 +6354,14 @@ == OK) { check_cursor(); - fp = var2fpos(&argvars[0], TRUE, &fnum); + fp = var2fpos(&argvars[0], TRUE, &fnum, FALSE); } restore_win_noblock(save_curwin, save_curtab, TRUE); } } else // use current window - fp = var2fpos(&argvars[0], TRUE, &fnum); + fp = var2fpos(&argvars[0], TRUE, &fnum, FALSE); if (fp != NULL) lnum = fp->lnum; @@ -6119,7 +6488,7 @@ // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; - p_cpo = (char_u *)""; + p_cpo = empty_option; rettv->vval.v_number = -1; if (type == MATCH_LIST || type == MATCH_POS) @@ -6812,7 +7181,7 @@ static UINT32_T gx, gy, gz, gw; static int initialized = FALSE; listitem_T *lx, *ly, *lz, *lw; - UINT32_T x, y, z, w, t, result; + UINT32_T x = 0, y, z, w, t, result; if (argvars[0].v_type == VAR_UNKNOWN) { @@ -7827,8 +8196,14 @@ if (p_cpo == empty_option) p_cpo = save_cpo; else + { // Darn, evaluating the {skip} expression changed the value. + // If it's still empty it was changed and restored, need to restore in + // the complicated way. + if (*p_cpo == NUL) + set_option_value((char_u *)"cpo", 0L, save_cpo, 0); free_string_option(save_cpo); + } return retval; } @@ -7861,6 +8236,60 @@ list_append_number(rettv->vval.v_list, (varnumber_T)n); } +/* + * Set the cursor or mark position. + * If 'charpos' is TRUE, then use the column number as a character offet. + * Otherwise use the column number as a byte offset. + */ + static void +set_position(typval_T *argvars, typval_T *rettv, int charpos) +{ + pos_T pos; + int fnum; + char_u *name; + colnr_T curswant = -1; + + rettv->vval.v_number = -1; + + name = tv_get_string_chk(argvars); + if (name != NULL) + { + if (list2fpos(&argvars[1], &pos, &fnum, &curswant, charpos) == OK) + { + if (pos.col != MAXCOL && --pos.col < 0) + pos.col = 0; + if ((name[0] == '.' && name[1] == NUL)) + { + // set cursor; "fnum" is ignored + curwin->w_cursor = pos; + if (curswant >= 0) + { + curwin->w_curswant = curswant - 1; + curwin->w_set_curswant = FALSE; + } + check_cursor(); + rettv->vval.v_number = 0; + } + else if (name[0] == '\'' && name[1] != NUL && name[2] == NUL) + { + // set mark + if (setmark_pos(name[1], &pos, fnum) == OK) + rettv->vval.v_number = 0; + } + else + emsg(_(e_invarg)); + } + } +} +/* + * "setcharpos()" function + */ + static void +f_setcharpos(typval_T *argvars, typval_T *rettv) +{ + set_position(argvars, rettv, TRUE); +} + static void f_setcharsearch(typval_T *argvars, typval_T *rettv UNUSED) { @@ -7903,6 +8332,15 @@ } /* + * "setcursorcharpos" function + */ + static void +f_setcursorcharpos(typval_T *argvars, typval_T *rettv) +{ + set_cursorpos(argvars, rettv, TRUE); +} + +/* * "setenv()" function */ static void @@ -7961,41 +8399,7 @@ static void f_setpos(typval_T *argvars, typval_T *rettv) { - pos_T pos; - int fnum; - char_u *name; - colnr_T curswant = -1; - - rettv->vval.v_number = -1; - name = tv_get_string_chk(argvars); - if (name != NULL) - { - if (list2fpos(&argvars[1], &pos, &fnum, &curswant) == OK) - { - if (pos.col != MAXCOL && --pos.col < 0) - pos.col = 0; - if (name[0] == '.' && name[1] == NUL) - { - // set cursor; "fnum" is ignored - curwin->w_cursor = pos; - if (curswant >= 0) - { - curwin->w_curswant = curswant - 1; - curwin->w_set_curswant = FALSE; - } - check_cursor(); - rettv->vval.v_number = 0; - } - else if (name[0] == '\'' && name[1] != NUL && name[2] == NUL) - { - // set mark - if (setmark_pos(name[1], &pos, fnum) == OK) - rettv->vval.v_number = 0; - } - else - emsg(_(e_invarg)); - } - } + set_position(argvars, rettv, FALSE); } /* @@ -8526,7 +8930,7 @@ // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; - p_cpo = (char_u *)""; + p_cpo = empty_option; str = tv_get_string(&argvars[0]); if (argvars[1].v_type != VAR_UNKNOWN) @@ -8685,7 +9089,7 @@ what |= STR2NR_QUOTE; } - p = skipwhite(tv_get_string(&argvars[0])); + p = skipwhite(tv_get_string_strict(&argvars[0])); isneg = (*p == '-'); if (*p == '+' || *p == '-') p = skipwhite(p + 1); @@ -8806,12 +9210,12 @@ f_strchars(typval_T *argvars, typval_T *rettv) { char_u *s = tv_get_string(&argvars[0]); - int skipcc = FALSE; + varnumber_T skipcc = FALSE; varnumber_T len = 0; int (*func_mb_ptr2char_adv)(char_u **pp); if (argvars[1].v_type != VAR_UNKNOWN) - skipcc = (int)tv_get_bool(&argvars[1]); + skipcc = tv_get_bool(&argvars[1]); if (skipcc < 0 || skipcc > 1) semsg(_(e_using_number_as_bool_nr), skipcc); else @@ -9743,7 +10147,7 @@ int fnum = curbuf->b_fnum; int len; - fp = var2fpos(&argvars[0], FALSE, &fnum); + fp = var2fpos(&argvars[0], FALSE, &fnum, FALSE); if (fp != NULL && fp->lnum <= curbuf->b_ml.ml_line_count && fnum == curbuf->b_fnum) { diff -Nru vim-8.2.1913/src/evalvars.c vim-8.2.2434/src/evalvars.c --- vim-8.2.1913/src/evalvars.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/evalvars.c 2021-01-30 22:05:11.000000000 +0000 @@ -122,6 +122,8 @@ {VV_NAME("true", VAR_BOOL), VV_RO}, {VV_NAME("none", VAR_SPECIAL), VV_RO}, {VV_NAME("null", VAR_SPECIAL), VV_RO}, + {VV_NAME("numbermax", VAR_NUMBER), VV_RO}, + {VV_NAME("numbermin", VAR_NUMBER), VV_RO}, {VV_NAME("numbersize", VAR_NUMBER), VV_RO}, {VV_NAME("vim_did_enter", VAR_NUMBER), VV_RO}, {VV_NAME("testing", VAR_NUMBER), 0}, @@ -146,6 +148,7 @@ {VV_NAME("echospace", VAR_NUMBER), VV_RO}, {VV_NAME("argv", VAR_LIST), VV_RO}, {VV_NAME("collate", VAR_STRING), VV_RO}, + {VV_NAME("exiting", VAR_SPECIAL), VV_RO}, }; // shorthand @@ -218,6 +221,7 @@ set_vim_var_nr(VV_SEARCHFORWARD, 1L); set_vim_var_nr(VV_HLSEARCH, 1L); + set_vim_var_nr(VV_EXITING, VVAL_NULL); set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc_lock(VAR_FIXED)); set_vim_var_list(VV_ERRORS, list_alloc()); set_vim_var_dict(VV_EVENT, dict_alloc_lock(VAR_FIXED)); @@ -226,6 +230,8 @@ set_vim_var_nr(VV_TRUE, VVAL_TRUE); set_vim_var_nr(VV_NONE, VVAL_NONE); set_vim_var_nr(VV_NULL, VVAL_NULL); + set_vim_var_nr(VV_NUMBERMAX, VARNUM_MAX); + set_vim_var_nr(VV_NUMBERMIN, VARNUM_MIN); set_vim_var_nr(VV_NUMBERSIZE, sizeof(varnumber_T) * 8); set_vim_var_nr(VV_TYPE_NUMBER, VAR_TYPE_NUMBER); @@ -736,25 +742,27 @@ int first = TRUE; int concat; int has_assign; - int flags = eap->cmdidx == CMD_const ? ASSIGN_CONST : 0; + int flags = 0; int vim9script = in_vim9script(); if (eap->cmdidx == CMD_final && !vim9script) { - // In legacy Vim script ":final" is short for ":finally". - ex_finally(eap); - return; + // In legacy Vim script ":final" is short for ":finally". + ex_finally(eap); + return; } if (eap->cmdidx == CMD_let && vim9script) { emsg(_(e_cannot_use_let_in_vim9_script)); return; } - if (eap->cmdidx == CMD_const && !vim9script && !eap->forceit) - // In legacy Vim script ":const" works like ":final". - eap->cmdidx = CMD_final; - // detect Vim9 assignment without ":let" or ":const" + if (eap->cmdidx == CMD_const) + flags |= ASSIGN_CONST; + else if (eap->cmdidx == CMD_final) + flags |= ASSIGN_FINAL; + + // Vim9 assignment without ":let", ":const" or ":final" if (eap->arg == eap->cmd) flags |= ASSIGN_NO_DECL; @@ -780,7 +788,7 @@ { if (vim9script) { - // Vim9 declaration ":let var: type" + // Vim9 declaration ":var name: type" arg = vim9_declare_scriptvar(eap, arg); } else @@ -830,6 +838,8 @@ i = FAIL; if (has_assign || concat) { + int cur_lnum; + op[0] = '='; op[1] = NUL; if (*expr != '=') @@ -859,7 +869,8 @@ || !IS_WHITE_OR_NUL(*expr))) { vim_strncpy(op, expr - len, len); - semsg(_(e_white_space_required_before_and_after_str), op); + semsg(_(e_white_space_required_before_and_after_str_at_str), + op, argend); i = FAIL; } @@ -873,10 +884,15 @@ evalarg.eval_cookie = eap->cookie; } expr = skipwhite_and_linebreak(expr, &evalarg); + cur_lnum = SOURCING_LNUM; i = eval0(expr, &rettv, eap, &evalarg); if (eap->skip) --emsg_skip; clear_evalarg(&evalarg, eap); + + // Restore the line number so that any type error is given for the + // declaration, not the expression. + SOURCING_LNUM = cur_lnum; } if (eap->skip) { @@ -907,7 +923,7 @@ int copy, // copy values from "tv", don't move int semicolon, // from skip_var_list() int var_count, // from skip_var_list() - int flags, // ASSIGN_CONST, ASSIGN_NO_DECL + int flags, // ASSIGN_FINAL, ASSIGN_CONST, etc. char_u *op) { char_u *arg = arg_start; @@ -1014,7 +1030,7 @@ for (;;) { p = skipwhite(p + 1); // skip whites after '[', ';' or ',' - s = skip_var_one(p, FALSE); + s = skip_var_one(p, include_type); if (s == p) { if (!silent) @@ -1056,17 +1072,21 @@ char_u * skip_var_one(char_u *arg, int include_type) { - char_u *end; + char_u *end; + int vim9 = in_vim9script(); if (*arg == '@' && arg[1] != NUL) return arg + 2; end = find_name_end(*arg == '$' || *arg == '&' ? arg + 1 : arg, NULL, NULL, FNE_INCL_BR | FNE_CHECK_START); - if (include_type && in_vim9script()) + + // "a: type" is declaring variable "a" with a type, not "a:". + // Same for "s: type". + if (vim9 && end == arg + 2 && end[-1] == ':') + --end; + + if (include_type && vim9) { - // "a: type" is declaring variable "a" with a type, not "a:". - if (end == arg + 2 && end[-1] == ':') - --end; if (*end == ':') end = skip_type(skipwhite(end + 1), FALSE); } @@ -1262,7 +1282,7 @@ char_u *arg, // points to variable name typval_T *tv, // value to assign to variable int copy, // copy value from "tv" - int flags, // ASSIGN_CONST, ASSIGN_NO_DECL + int flags, // ASSIGN_CONST, ASSIGN_FINAL, etc. char_u *endchars, // valid chars after variable name or NULL char_u *op) // "+", "-", "." or NULL { @@ -1274,7 +1294,8 @@ int opt_flags; char_u *tofree = NULL; - if (in_vim9script() && (flags & ASSIGN_NO_DECL) == 0 + if (in_vim9script() && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0 + && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0 && vim_strchr((char_u *)"$@&", *arg) != NULL) { vim9_declare_error(arg); @@ -1284,7 +1305,7 @@ // ":let $VAR = expr": Set environment variable. if (*arg == '$') { - if (flags & ASSIGN_CONST) + if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) { emsg(_("E996: Cannot lock an environment variable")); return NULL; @@ -1336,7 +1357,7 @@ // ":let &g:option = expr": Set global option value. else if (*arg == '&') { - if (flags & ASSIGN_CONST) + if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) { emsg(_(e_const_option)); return NULL; @@ -1349,7 +1370,7 @@ else { long n = 0; - int opt_type; + getoption_T opt_type; long numval; char_u *stringval = NULL; char_u *s = NULL; @@ -1359,10 +1380,19 @@ *p = NUL; opt_type = get_option_value(arg, &numval, &stringval, opt_flags); - if ((opt_type == 1 || opt_type == -1) + if ((opt_type == gov_bool + || opt_type == gov_number + || opt_type == gov_hidden_bool + || opt_type == gov_hidden_number) && (tv->v_type != VAR_STRING || !in_vim9script())) - // number, possibly hidden - n = (long)tv_get_number(tv); + { + if (opt_type == gov_bool || opt_type == gov_hidden_bool) + // bool, possibly hidden + n = (long)tv_get_bool(tv); + else + // number, possibly hidden + n = (long)tv_get_number(tv); + } // Avoid setting a string option to the text "v:false" or similar. // In Vim9 script also don't convert a number to string. @@ -1372,8 +1402,9 @@ if (op != NULL && *op != '=') { - if ((opt_type == 1 && *op == '.') - || (opt_type == 0 && *op != '.')) + if (((opt_type == gov_bool || opt_type == gov_number) + && *op == '.') + || (opt_type == gov_string && *op != '.')) { semsg(_(e_letwrong), op); failed = TRUE; // don't set the value @@ -1381,18 +1412,23 @@ } else { - if (opt_type == 1) // number + // number, in legacy script also bool + if (opt_type == gov_number + || (opt_type == gov_bool && !in_vim9script())) { switch (*op) { case '+': n = numval + n; break; case '-': n = numval - n; break; case '*': n = numval * n; break; - case '/': n = (long)num_divide(numval, n); break; - case '%': n = (long)num_modulus(numval, n); break; + case '/': n = (long)num_divide(numval, n, + &failed); break; + case '%': n = (long)num_modulus(numval, n, + &failed); break; } } - else if (opt_type == 0 && stringval != NULL && s != NULL) + else if (opt_type == gov_string + && stringval != NULL && s != NULL) { // string s = concat_str(stringval, s); @@ -1404,7 +1440,7 @@ if (!failed) { - if (opt_type != 0 || s != NULL) + if (opt_type != gov_string || s != NULL) { set_option_value(arg, n, s, opt_flags); arg_end = p; @@ -1420,7 +1456,7 @@ // ":let @r = expr": Set register contents. else if (*arg == '@') { - if (flags & ASSIGN_CONST) + if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) { emsg(_("E996: Cannot lock a register")); return NULL; @@ -1462,7 +1498,9 @@ { lval_T lv; - p = get_lval(arg, tv, &lv, FALSE, FALSE, 0, FNE_CHECK_START); + p = get_lval(arg, tv, &lv, FALSE, FALSE, + (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) + ? GLV_NO_DECL : 0, FNE_CHECK_START); if (p != NULL && lv.ll_name != NULL) { if (endchars != NULL && vim_strchr(endchars, @@ -1552,7 +1590,7 @@ { // Parse the name and find the end. name_end = get_lval(arg, NULL, &lv, TRUE, eap->skip || error, - glv_flags, FNE_CHECK_START); + glv_flags | GLV_NO_DECL, FNE_CHECK_START); if (lv.ll_name == NULL) error = TRUE; // error but continue parsing if (name_end == NULL || (!VIM_ISWHITE(*name_end) @@ -1661,10 +1699,20 @@ dict_T *d; dictitem_T *di; + // can't :unlet a script variable in Vim9 script if (in_vim9script() && check_vim9_unlet(name) == FAIL) return FAIL; ht = find_var_ht(name, &varname); + + // can't :unlet a script variable in Vim9 script from a function + if (ht == get_script_local_ht() + && SCRIPT_ID_VALID(current_sctx.sc_sid) + && SCRIPT_ITEM(current_sctx.sc_sid)->sn_version + == SCRIPT_VERSION_VIM9 + && check_vim9_unlet(name) == FAIL) + return FAIL; + if (ht != NULL && *varname != NUL) { d = get_current_funccal_dict(ht); @@ -1921,7 +1969,7 @@ /* * Function to concatenate a prefix and a variable name. */ - static char_u * + char_u * cat_prefix_varname(int prefix, char_u *name) { int len; @@ -2045,10 +2093,10 @@ { switch (nr) { - case VVAL_FALSE: return "v:false"; - case VVAL_TRUE: return "v:true"; + case VVAL_FALSE: return in_vim9script() ? "false" : "v:false"; + case VVAL_TRUE: return in_vim9script() ? "true" : "v:true"; + case VVAL_NULL: return in_vim9script() ? "null" : "v:null"; case VVAL_NONE: return "v:none"; - case VVAL_NULL: return "v:null"; } internal_error("get_var_special_name()"); return "42"; @@ -2515,7 +2563,7 @@ rettv->vval.v_string = vim_strsave(import->imp_funcname); } } - else if (import->imp_all) + else if (import->imp_flags & IMP_FLAGS_STAR) { emsg("Sorry, 'import * as X' not implemented yet"); ret = FAIL; @@ -2553,7 +2601,22 @@ ret = FAIL; } else if (rettv != NULL) + { + // If a list or dict variable wasn't initialized, do it now. + if (tv->v_type == VAR_DICT && tv->vval.v_dict == NULL) + { + tv->vval.v_dict = dict_alloc(); + if (tv->vval.v_dict != NULL) + ++tv->vval.v_dict->dv_refcount; + } + else if (tv->v_type == VAR_LIST && tv->vval.v_list == NULL) + { + tv->vval.v_list = list_alloc(); + if (tv->vval.v_list != NULL) + ++tv->vval.v_list->lv_refcount; + } copy_tv(tv, rettv); + } } name[len] = cc; @@ -2593,8 +2656,7 @@ * Find variable "name" in the list of variables. * Return a pointer to it if found, NULL if not found. * Careful: "a:0" variables don't have a name. - * When "htp" is not NULL we are writing to the variable, set "htp" to the - * hashtab_T used. + * When "htp" is not NULL set "htp" to the hashtab_T used. */ dictitem_T * find_var(char_u *name, hashtab_T **htp, int no_autoload) @@ -2608,12 +2670,32 @@ *htp = ht; if (ht == NULL) return NULL; - ret = find_var_in_ht(ht, *name, varname, no_autoload || htp != NULL); + ret = find_var_in_ht(ht, *name, varname, no_autoload); if (ret != NULL) return ret; // Search in parent scope for lambda - return find_var_in_scoped_ht(name, no_autoload || htp != NULL); + ret = find_var_in_scoped_ht(name, no_autoload); + if (ret != NULL) + return ret; + + // in Vim9 script items without a scope can be script-local + if (in_vim9script() && name[0] != NUL && name[1] != ':') + { + ht = get_script_local_ht(); + if (ht != NULL) + { + ret = find_var_in_ht(ht, *name, varname, no_autoload); + if (ret != NULL) + { + if (htp != NULL) + *htp = ht; + return ret; + } + } + } + + return NULL; } /* @@ -2683,19 +2765,23 @@ /* * Look for "name[len]" in script-local variables. - * Return a non-NULL pointer when found, NULL when not found. + * Return OK when found, FAIL when not found. */ - void * -lookup_scriptvar(char_u *name, size_t len, cctx_T *dummy UNUSED) + int +lookup_scriptvar( + char_u *name, + size_t len, + void *lvar UNUSED, + cctx_T *dummy UNUSED) { hashtab_T *ht = get_script_local_ht(); char_u buffer[30]; char_u *p; - void *res; + int res; hashitem_T *hi; if (ht == NULL) - return NULL; + return FAIL; if (len < sizeof(buffer) - 1) { // avoid an alloc/free for short names @@ -2706,20 +2792,19 @@ { p = vim_strnsave(name, len); if (p == NULL) - return NULL; + return FAIL; } hi = hash_find(ht, p); - res = HASHITEM_EMPTY(hi) ? NULL : hi; + res = HASHITEM_EMPTY(hi) ? FAIL : OK; // if not script-local, then perhaps imported - if (res == NULL && find_imported(p, 0, NULL) != NULL) - res = p; + if (res == FAIL && find_imported(p, 0, NULL) != NULL) + res = OK; if (p != buffer) vim_free(p); - // Don't return "buffer", gcc complains. - return res == NULL ? NULL : IObuff; + return res; } /* @@ -2990,7 +3075,7 @@ typval_T *tv, int copy) // make copy of value in "tv" { - set_var_const(name, NULL, tv, copy, ASSIGN_NO_DECL); + set_var_const(name, NULL, tv, copy, ASSIGN_DECL); } /* @@ -3004,7 +3089,7 @@ type_T *type, typval_T *tv_arg, int copy, // make copy of value in "tv" - int flags) // ASSIGN_CONST, ASSIGN_NO_DECL + int flags) // ASSIGN_CONST, ASSIGN_FINAL, etc. { typval_T *tv = tv_arg; typval_T bool_tv; @@ -3024,7 +3109,8 @@ if (vim9script && !is_script_local - && (flags & ASSIGN_NO_DECL) == 0 + && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0 + && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0 && name[1] == ':') { vim9_declare_error(name); @@ -3054,7 +3140,7 @@ { if ((di->di_flags & DI_FLAGS_RELOAD) == 0) { - if (flags & ASSIGN_CONST) + if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) { emsg(_(e_cannot_mod)); goto failed; @@ -3062,7 +3148,7 @@ if (is_script_local && vim9script) { - if ((flags & ASSIGN_NO_DECL) == 0) + if ((flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0) { semsg(_(e_redefining_script_item_str), name); goto failed; @@ -3073,19 +3159,20 @@ goto failed; } - // Check in this order for backwards compatibility: - // - Whether the variable is read-only - // - Whether the variable value is locked - // - Whether the variable is locked - if (var_check_ro(di->di_flags, name, FALSE) - || value_check_lock(di->di_tv.v_lock, name, FALSE) - || var_check_lock(di->di_flags, name, FALSE)) + if (var_check_permission(di, name) == FAIL) goto failed; } else + { // can only redefine once di->di_flags &= ~DI_FLAGS_RELOAD; + // A Vim9 script-local variable is also present in sn_all_vars and + // sn_var_vals. It may set "type" from "tv". + if (is_script_local && vim9script) + update_vim9_script_var(FALSE, di, flags, tv, &type); + } + // existing variable, need to clear the value // Handle setting internal di: variables separately where needed to @@ -3135,8 +3222,15 @@ clear_tv(&di->di_tv); } - else // add a new variable + else { + // add a new variable + if (vim9script && is_script_local && (flags & ASSIGN_NO_DECL)) + { + semsg(_(e_unknown_variable_str), name); + goto failed; + } + // Can't add "v:" or "a:" variable. if (ht == &vimvarht || ht == get_funccal_args_ht()) { @@ -3144,8 +3238,10 @@ goto failed; } - // Make sure the variable name is valid. - if (!valid_varname(varname)) + // Make sure the variable name is valid. In Vim9 script an autoload + // variable must be prefixed with "g:". + if (!valid_varname(varname, !vim9script + || STRNCMP(name, "g:", 2) == 0)) goto failed; di = alloc(sizeof(dictitem_T) + STRLEN(varname)); @@ -3158,13 +3254,13 @@ goto failed; } di->di_flags = DI_FLAGS_ALLOC; - if (flags & ASSIGN_CONST) + if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) di->di_flags |= DI_FLAGS_LOCK; // A Vim9 script-local variable is also added to sn_all_vars and - // sn_var_vals. + // sn_var_vals. It may set "type" from "tv". if (is_script_local && vim9script) - add_vim9_script_var(di, tv, type); + update_vim9_script_var(TRUE, di, flags, tv, &type); } if (copy || tv->v_type == VAR_NUMBER || tv->v_type == VAR_FLOAT) @@ -3176,7 +3272,16 @@ init_tv(tv); } - // ":const var = val" locks the value + if (vim9script && type != NULL) + { + if (type->tt_type == VAR_DICT && di->di_tv.vval.v_dict != NULL) + di->di_tv.vval.v_dict->dv_type = alloc_type(type); + else if (type->tt_type == VAR_LIST && di->di_tv.vval.v_list != NULL) + di->di_tv.vval.v_list->lv_type = alloc_type(type); + } + + // ":const var = value" locks the value + // ":final var = value" locks "var" if (flags & ASSIGN_CONST) // Like :lockvar! name: lock the value and what it contains, but only // if the reference count is up to one. That locks only literal @@ -3189,6 +3294,22 @@ } /* + * Check in this order for backwards compatibility: + * - Whether the variable is read-only + * - Whether the variable value is locked + * - Whether the variable is locked + */ + int +var_check_permission(dictitem_T *di, char_u *name) +{ + if (var_check_ro(di->di_flags, name, FALSE) + || value_check_lock(di->di_tv.v_lock, name, FALSE) + || var_check_lock(di->di_flags, name, FALSE)) + return FAIL; + return OK; +} + +/* * Return TRUE if di_flags "flags" indicates variable "name" is read-only. * Also give an error message. */ @@ -3298,17 +3419,17 @@ } /* - * Check if a variable name is valid. + * Check if a variable name is valid. When "autoload" is true "#" is allowed. * Return FALSE and give an error if not. */ int -valid_varname(char_u *varname) +valid_varname(char_u *varname, int autoload) { char_u *p; for (p = varname; *p != NUL; ++p) if (!eval_isnamec1(*p) && (p == varname || !VIM_ISDIGIT(*p)) - && *p != AUTOLOAD_CHAR) + && !(autoload && *p == AUTOLOAD_CHAR)) { semsg(_(e_illvar), varname); return FALSE; @@ -3408,9 +3529,17 @@ char_u nbuf[NUMBUFLEN]; int error = FALSE; - if (!in_vim9script() || varp->v_type != VAR_STRING) - numval = (long)tv_get_number_chk(varp, &error); - strval = tv_get_string_buf_chk(varp, nbuf); + if (varp->v_type == VAR_BOOL) + { + numval = (long)varp->vval.v_number; + strval = (char_u *)"0"; // avoid using "false" + } + else + { + if (!in_vim9script() || varp->v_type != VAR_STRING) + numval = (long)tv_get_number_chk(varp, &error); + strval = tv_get_string_buf_chk(varp, nbuf); + } if (!error && strval != NULL) set_option_value(varname, numval, strval, OPT_LOCAL); } diff -Nru vim-8.2.1913/src/evalwindow.c vim-8.2.2434/src/evalwindow.c --- vim-8.2.1913/src/evalwindow.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/evalwindow.c 2021-01-30 22:05:11.000000000 +0000 @@ -673,6 +673,10 @@ win_T *save_curwin; tabpage_T *save_curtab; + // Return an empty string if something fails. + rettv->v_type = VAR_STRING; + rettv->vval.v_string = NULL; + if (wp != NULL && tp != NULL) { pos_T curpos = wp->w_cursor; @@ -1010,9 +1014,9 @@ ga_init2(&ga, (int)sizeof(char), 70); FOR_ALL_WINDOWS(wp) { - sprintf((char *)buf, "%dresize %d|", winnr, wp->w_height); + sprintf((char *)buf, ":%dresize %d|", winnr, wp->w_height); ga_concat(&ga, buf); - sprintf((char *)buf, "vert %dresize %d|", winnr, wp->w_width); + sprintf((char *)buf, "vert :%dresize %d|", winnr, wp->w_width); ga_concat(&ga, buf); ++winnr; } diff -Nru vim-8.2.1913/src/ex_cmdidxs.h vim-8.2.2434/src/ex_cmdidxs.h --- vim-8.2.1913/src/ex_cmdidxs.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/ex_cmdidxs.h 2021-01-30 22:05:11.000000000 +0000 @@ -7,30 +7,30 @@ { /* a */ 0, /* b */ 19, - /* c */ 42, - /* d */ 108, - /* e */ 133, - /* f */ 156, - /* g */ 173, - /* h */ 179, - /* i */ 188, - /* j */ 207, - /* k */ 209, - /* l */ 214, - /* m */ 276, - /* n */ 294, - /* o */ 314, - /* p */ 326, - /* q */ 365, - /* r */ 368, - /* s */ 388, - /* t */ 457, - /* u */ 502, - /* v */ 513, - /* w */ 533, - /* x */ 547, - /* y */ 557, - /* z */ 558 + /* c */ 43, + /* d */ 109, + /* e */ 134, + /* f */ 157, + /* g */ 174, + /* h */ 180, + /* i */ 189, + /* j */ 208, + /* k */ 210, + /* l */ 215, + /* m */ 277, + /* n */ 295, + /* o */ 315, + /* p */ 327, + /* q */ 366, + /* r */ 369, + /* s */ 389, + /* t */ 458, + /* u */ 503, + /* v */ 514, + /* w */ 534, + /* x */ 548, + /* y */ 558, + /* z */ 559 }; /* @@ -42,7 +42,7 @@ static const unsigned char cmdidxs2[26][26] = { /* a b c d e f g h i j k l m n o p q r s t u v w x y z */ /* a */ { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0, 7, 15, 0, 16, 0, 0, 0, 0, 0 }, - /* b */ { 2, 0, 0, 4, 5, 7, 0, 0, 0, 0, 0, 8, 9, 10, 11, 12, 0, 13, 0, 0, 0, 0, 22, 0, 0, 0 }, + /* b */ { 2, 0, 0, 5, 6, 8, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 23, 0, 0, 0 }, /* c */ { 3, 12, 16, 18, 20, 22, 25, 0, 0, 0, 0, 33, 37, 40, 46, 56, 58, 59, 60, 0, 62, 0, 65, 0, 0, 0 }, /* d */ { 0, 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 19, 0, 0, 20, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0 }, /* e */ { 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 10, 0, 0, 0, 0, 0, 0, 0, 17, 0, 18, 0, 0 }, @@ -69,4 +69,4 @@ /* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; -static const int command_count = 573; +static const int command_count = 574; diff -Nru vim-8.2.1913/src/ex_cmds.c vim-8.2.2434/src/ex_cmds.c --- vim-8.2.1913/src/ex_cmds.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/ex_cmds.c 2021-01-30 22:05:11.000000000 +0000 @@ -277,6 +277,7 @@ static char_u *sortbuf1; static char_u *sortbuf2; +static int sort_lc; // sort using locale static int sort_ic; // ignore case static int sort_nr; // sort on number static int sort_rx; // sort on regex instead of skipping it @@ -307,7 +308,13 @@ } st_u; } sorti_T; -static int sort_compare(const void *s1, const void *s2); + static int +string_compare(const void *s1, const void *s2) +{ + if (sort_lc) + return strcoll((char *)s1, (char *)s2); + return sort_ic ? STRICMP(s1, s2) : STRCMP(s1, s2); +} static int sort_compare(const void *s1, const void *s2) @@ -350,8 +357,7 @@ l2.st_u.line.end_col_nr - l2.st_u.line.start_col_nr + 1); sortbuf2[l2.st_u.line.end_col_nr - l2.st_u.line.start_col_nr] = 0; - result = sort_ic ? STRICMP(sortbuf1, sortbuf2) - : STRCMP(sortbuf1, sortbuf2); + result = string_compare(sortbuf1, sortbuf2); } // If two lines have the same value, preserve the original line order. @@ -398,7 +404,7 @@ if (nrs == NULL) goto sortend; - sort_abort = sort_ic = sort_rx = sort_nr = 0; + sort_abort = sort_ic = sort_lc = sort_rx = sort_nr = 0; #ifdef FEAT_FLOAT sort_flt = 0; #endif @@ -409,6 +415,8 @@ ; else if (*p == 'i') sort_ic = TRUE; + else if (*p == 'l') + sort_lc = TRUE; else if (*p == 'r') sort_rx = TRUE; else if (*p == 'n') @@ -614,8 +622,7 @@ change_occurred = TRUE; s = ml_get(get_lnum); - if (!unique || i == 0 - || (sort_ic ? STRICMP(s, sortbuf1) : STRCMP(s, sortbuf1)) != 0) + if (!unique || i == 0 || string_compare(s, sortbuf1) != 0) { // Copy the line into a buffer, it may become invalid in // ml_append(). And it's needed for "unique". @@ -1247,6 +1254,16 @@ if (read_linecount >= linecount) // move all marks from old lines to new lines mark_adjust(line1, line2, linecount, 0L); + else if (save_cmod_flags & CMOD_LOCKMARKS) + { + // Move marks from the lines below the new lines down by + // the number of lines lost. + // Move marks from the lines that will be deleted to the + // new lines and below. + mark_adjust(line2 + 1, (linenr_T)MAXLNUM, + linecount - read_linecount, 0L); + mark_adjust(line1, line2, linecount, 0L); + } else { // move marks from old lines to new lines, delete marks @@ -1343,8 +1360,8 @@ #endif #ifdef MSWIN int winstart = FALSE; - int keep_termcap = FALSE; #endif + int keep_termcap = !termcap_active; /* * Disallow shell commands for "rvim". @@ -1378,9 +1395,7 @@ msg_putchar('\r'); // put cursor at start of line if (!autocmd_busy) { -#ifdef MSWIN if (!keep_termcap) -#endif stoptermcap(); } #ifdef MSWIN @@ -1471,9 +1486,7 @@ } #endif // FEAT_GUI_MSWIN -#ifdef MSWIN if (!keep_termcap) // if keep_termcap is TRUE didn't stop termcap -#endif starttermcap(); // start termcap if not done by wait_return() /* @@ -2442,6 +2455,7 @@ * ECMD_OLDBUF: use existing buffer if it exists * ECMD_FORCEIT: ! used for Ex command * ECMD_ADDBUF: don't edit, just add to buffer list + * ECMD_ALTBUF: like ECMD_ADDBUF and also set the alternate file * oldwin: Should be "curwin" when editing a new buffer in the current * window, NULL when splitting the window first. When not NULL info * of the previous buffer for "oldwin" is stored. @@ -2538,7 +2552,8 @@ fname_case(sfname, 0); // set correct case for sfname #endif - if ((flags & ECMD_ADDBUF) && (ffname == NULL || *ffname == NUL)) + if ((flags & (ECMD_ADDBUF | ECMD_ALTBUF)) + && (ffname == NULL || *ffname == NUL)) goto theend; if (ffname == NULL) @@ -2567,7 +2582,7 @@ */ if ( ((!other_file && !(flags & ECMD_OLDBUF)) || (curbuf->b_nwindows == 1 - && !(flags & (ECMD_HIDE | ECMD_ADDBUF)))) + && !(flags & (ECMD_HIDE | ECMD_ADDBUF | ECMD_ALTBUF)))) && check_changed(curbuf, (p_awa ? CCGD_AW : 0) | (other_file ? 0 : CCGD_MULTWIN) | ((flags & ECMD_FORCEIT) ? CCGD_FORCEIT : 0) @@ -2616,7 +2631,7 @@ */ if (other_file) { - if (!(flags & ECMD_ADDBUF)) + if (!(flags & (ECMD_ADDBUF | ECMD_ALTBUF))) { if ((cmdmod.cmod_flags & CMOD_KEEPALT) == 0) curwin->w_alt_fnum = curbuf->b_fnum; @@ -2628,11 +2643,12 @@ buf = buflist_findnr(fnum); else { - if (flags & ECMD_ADDBUF) + if (flags & (ECMD_ADDBUF | ECMD_ALTBUF)) { // Default the line number to zero to avoid that a wininfo item // is added for the current window. linenr_T tlnum = 0; + buf_T *newbuf; if (command != NULL) { @@ -2640,10 +2656,12 @@ if (tlnum <= 0) tlnum = 1L; } - // Add BLN_NOCURWIN to avoid a new wininfo items is assocated + // Add BLN_NOCURWIN to avoid a new wininfo items are associated // with the current window. - (void)buflist_new(ffname, sfname, tlnum, + newbuf = buflist_new(ffname, sfname, tlnum, BLN_LISTED | BLN_NOCURWIN); + if (newbuf != NULL && (flags & ECMD_ALTBUF)) + curwin->w_alt_fnum = newbuf->b_fnum; goto theend; } buf = buflist_new(ffname, sfname, 0L, @@ -2692,6 +2710,12 @@ */ if (buf != curbuf) { +#ifdef FEAT_CMDWIN + int save_cmdwin_type = cmdwin_type; + + // BufLeave applies to the old buffer. + cmdwin_type = 0; +#endif /* * Be careful: The autocommands may delete any buffer and change * the current buffer. @@ -2706,6 +2730,9 @@ new_name = vim_strsave(buf->b_fname); set_bufref(&au_new_curbuf, buf); apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); +#ifdef FEAT_CMDWIN + cmdwin_type = save_cmdwin_type; +#endif if (!bufref_valid(&au_new_curbuf)) { // new buffer has been deleted @@ -2724,6 +2751,8 @@ else { win_T *the_curwin = curwin; + int did_decrement; + buf_T *was_curbuf = curbuf; // Set the w_closing flag to avoid that autocommands close the // window. And set b_locked for the same reason. @@ -2736,7 +2765,7 @@ // Close the link to the current buffer. This will set // oldwin->w_buffer to NULL. u_sync(FALSE); - close_buffer(oldwin, curbuf, + did_decrement = close_buffer(oldwin, curbuf, (flags & ECMD_HIDE) ? 0 : DOBUF_UNLOAD, FALSE, FALSE); the_curwin->w_closing = FALSE; @@ -2758,7 +2787,15 @@ goto theend; } if (buf == curbuf) // already in new buffer + { + // close_buffer() has decremented the window count, + // increment it again here and restore w_buffer. + if (did_decrement && buf_valid(was_curbuf)) + ++was_curbuf->b_nwindows; + if (win_valid_any_tab(oldwin) && oldwin->w_buffer == NULL) + oldwin->w_buffer = was_curbuf; auto_buf = TRUE; + } else { #ifdef FEAT_SYN_HL @@ -2801,7 +2838,7 @@ } else // !other_file { - if ((flags & ECMD_ADDBUF) || check_fname() == FAIL) + if ((flags & (ECMD_ADDBUF | ECMD_ALTBUF)) || check_fname() == FAIL) goto theend; oldbuf = (flags & ECMD_OLDBUF); @@ -3101,7 +3138,7 @@ #endif if (command != NULL) - do_cmdline(command, NULL, NULL, DOCMD_VERBOSE); + do_cmdline(command, NULL, NULL, DOCMD_VERBOSE|DOCMD_RANGEOK); #ifdef FEAT_KEYMAP if (curbuf->b_kmap_state & KEYMAP_INIT) @@ -3649,7 +3686,8 @@ which_pat = RE_LAST; // use last used regexp delimiter = *cmd++; // remember delimiter character pat = cmd; // remember start of search pat - cmd = skip_regexp_ex(cmd, delimiter, p_magic, &eap->arg, NULL); + cmd = skip_regexp_ex(cmd, delimiter, magic_isset(), + &eap->arg, NULL, NULL); if (cmd[0] == delimiter) // end delimiter found *cmd++ = NUL; // replace it with a NUL } @@ -3718,6 +3756,8 @@ { linenr_T joined_lines_count; + if (eap->skip) + return; curwin->w_cursor.lnum = eap->line1; if (*cmd == 'l') eap->flags = EXFLAG_LIST; @@ -3741,7 +3781,7 @@ } if ((cmdmod.cmod_flags & CMOD_KEEPPATTERNS) == 0) - save_re_pat(RE_SUBST, pat, p_magic); + save_re_pat(RE_SUBST, pat, magic_isset()); // put pattern in history add_to_history(HIST_SEARCH, pat, TRUE, NUL); @@ -3755,6 +3795,15 @@ ++cmd; else { +#ifdef FEAT_EVAL + if (in_vim9script()) + { + // ignore 'gdefault' and 'edcompatible' + subflags.do_all = FALSE; + subflags.do_ask = FALSE; + } + else +#endif if (!p_ed) { if (p_gd) // default is global on @@ -3875,7 +3924,7 @@ * But don't do it when it starts with "\=", then it's an expression. */ if (!(sub[0] == '\\' && sub[1] == '=')) - sub = regtilde(sub, p_magic); + sub = regtilde(sub, magic_isset()); /* * Check for a match on each line. @@ -4120,6 +4169,7 @@ { char_u *orig_line = NULL; int len_change = 0; + int save_p_lz = p_lz; #ifdef FEAT_FOLDING int save_p_fen = curwin->w_p_fen; @@ -4130,6 +4180,9 @@ temp = RedrawingDisabled; RedrawingDisabled = 0; + // avoid calling update_screen() in vgetorpeek() + p_lz = FALSE; + if (new_start != NULL) { // There already was a substitution, we would @@ -4205,6 +4258,7 @@ msg_didout = FALSE; // don't scroll up msg_col = 0; gotocmdline(TRUE); + p_lz = save_p_lz; // restore the line if (orig_line != NULL) @@ -4287,7 +4341,7 @@ // get length of substitution part sublen = vim_regsub_multi(®match, sub_firstlnum - regmatch.startpos[0].lnum, - sub, sub_firstline, FALSE, p_magic, TRUE); + sub, sub_firstline, FALSE, magic_isset(), TRUE); #ifdef FEAT_EVAL // If getting the substitute string caused an error, don't do // the replacement. @@ -4391,7 +4445,7 @@ (void)vim_regsub_multi(®match, sub_firstlnum - regmatch.startpos[0].lnum, - sub, new_end, TRUE, p_magic, TRUE); + sub, new_end, TRUE, magic_isset(), TRUE); sub_nsubs++; did_sub = TRUE; @@ -4824,7 +4878,7 @@ if (delim) ++cmd; // skip delimiter if there is one pat = cmd; // remember start of pattern - cmd = skip_regexp_ex(cmd, delim, p_magic, &eap->arg, NULL); + cmd = skip_regexp_ex(cmd, delim, magic_isset(), &eap->arg, NULL, NULL); if (cmd[0] == delim) // end delimiter found *cmd++ = NUL; // replace it with a NUL } @@ -5139,6 +5193,15 @@ { goto_tabpage_win(tp, wp); curwin->w_arg_idx = 0; + if (!bufIsChanged(curbuf)) + { + int save_ar = curbuf->b_p_ar; + + // reload the file if it is newer + curbuf->b_p_ar = TRUE; + buf_check_timestamp(curbuf, FALSE); + curbuf->b_p_ar = save_ar; + } return; } } diff -Nru vim-8.2.1913/src/ex_cmds.h vim-8.2.2434/src/ex_cmds.h --- vim-8.2.1913/src/ex_cmds.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/ex_cmds.h 2021-01-30 22:05:11.000000000 +0000 @@ -55,6 +55,7 @@ #define EX_LOCK_OK 0x1000000 // command can be executed when textlock is // set; when missing disallows editing another // buffer when curbuf_lock is set +#define EX_NONWHITE_OK 0x2000000 // command can be followed by non-white #define EX_FILES (EX_XFILE | EX_EXTRA) // multiple extra files allowed #define EX_FILE1 (EX_FILES | EX_NOSPC) // 1 file, defaults to current file @@ -178,6 +179,9 @@ EXCMD(CMD_badd, "badd", ex_edit, EX_NEEDARG|EX_FILE1|EX_CMDARG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, ADDR_NONE), +EXCMD(CMD_balt, "balt", ex_edit, + EX_NEEDARG|EX_FILE1|EX_CMDARG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, + ADDR_NONE), EXCMD(CMD_bdelete, "bdelete", ex_bunload, EX_BANG|EX_RANGE|EX_BUFNAME|EX_COUNT|EX_EXTRA|EX_TRLBAR, ADDR_BUFFERS), @@ -485,7 +489,7 @@ EX_BANG|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, ADDR_NONE), EXCMD(CMD_disassemble, "disassemble", ex_disassemble, - EX_EXTRA|EX_NEEDARG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, + EX_BANG|EX_EXTRA|EX_NEEDARG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, ADDR_NONE), EXCMD(CMD_djump, "djump", ex_findpat, EX_BANG|EX_RANGE|EX_DFLALL|EX_WHOLEFOLD|EX_EXTRA, @@ -629,7 +633,7 @@ EX_EXTRA|EX_BANG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK, ADDR_NONE), EXCMD(CMD_global, "global", ex_global, - EX_RANGE|EX_WHOLEFOLD|EX_BANG|EX_EXTRA|EX_DFLALL|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK, + EX_RANGE|EX_WHOLEFOLD|EX_BANG|EX_EXTRA|EX_DFLALL|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK, ADDR_LINES), EXCMD(CMD_goto, "goto", ex_goto, EX_RANGE|EX_COUNT|EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK, @@ -926,10 +930,10 @@ EX_RANGE|EX_FILE1|EX_NEEDARG|EX_CMDWIN|EX_LOCK_OK|EX_RESTRICT, ADDR_LINES), EXCMD(CMD_lvimgrep, "lvimgrep", ex_vimgrep, - EX_RANGE|EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_TRLBAR|EX_XFILE, + EX_RANGE|EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_TRLBAR|EX_XFILE|EX_LOCK_OK, ADDR_OTHER), EXCMD(CMD_lvimgrepadd, "lvimgrepadd", ex_vimgrep, - EX_RANGE|EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_TRLBAR|EX_XFILE, + EX_RANGE|EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_TRLBAR|EX_XFILE|EX_LOCK_OK, ADDR_OTHER), EXCMD(CMD_lwindow, "lwindow", ex_cwindow, EX_RANGE|EX_COUNT|EX_TRLBAR, @@ -1274,7 +1278,7 @@ EX_BANG|EX_FILE1|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, ADDR_NONE), EXCMD(CMD_substitute, "substitute", ex_substitute, - EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK, + EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK, ADDR_LINES), EXCMD(CMD_sNext, "sNext", ex_previous, EX_EXTRA|EX_RANGE|EX_COUNT|EX_BANG|EX_CMDARG|EX_ARGOPT|EX_TRLBAR, @@ -1361,13 +1365,13 @@ EX_NEEDARG|EX_EXTRA|EX_BANG|EX_NOTRLCOM|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK, ADDR_NONE), EXCMD(CMD_sleep, "sleep", ex_sleep, - EX_RANGE|EX_COUNT|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, + EX_BANG|EX_RANGE|EX_COUNT|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, ADDR_OTHER), EXCMD(CMD_slast, "slast", ex_last, EX_EXTRA|EX_BANG|EX_CMDARG|EX_ARGOPT|EX_TRLBAR, ADDR_NONE), EXCMD(CMD_smagic, "smagic", ex_submagic, - EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK, + EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK, ADDR_LINES), EXCMD(CMD_smap, "smap", ex_map, EX_EXTRA|EX_TRLBAR|EX_NOTRLCOM|EX_CTRLV|EX_CMDWIN|EX_LOCK_OK, @@ -1382,7 +1386,7 @@ EX_RANGE|EX_BANG|EX_FILES|EX_CMDARG|EX_ARGOPT|EX_TRLBAR, ADDR_OTHER), EXCMD(CMD_snomagic, "snomagic", ex_submagic, - EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK, + EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK, ADDR_LINES), EXCMD(CMD_snoremap, "snoremap", ex_map, EX_EXTRA|EX_TRLBAR|EX_NOTRLCOM|EX_CTRLV|EX_CMDWIN|EX_LOCK_OK, @@ -1649,7 +1653,7 @@ EX_RANGE|EX_WHOLEFOLD|EX_BANG|EX_FILE1|EX_ARGOPT|EX_DFLALL|EX_TRLBAR, ADDR_LINES), EXCMD(CMD_vglobal, "vglobal", ex_global, - EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_DFLALL|EX_CMDWIN|EX_LOCK_OK, + EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_DFLALL|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK, ADDR_LINES), EXCMD(CMD_var, "var", ex_var, EX_EXTRA|EX_NOTRLCOM|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK, @@ -1670,13 +1674,13 @@ EX_BANG|EX_FILE1|EX_CMDARG|EX_ARGOPT|EX_TRLBAR, ADDR_NONE), EXCMD(CMD_vimgrep, "vimgrep", ex_vimgrep, - EX_RANGE|EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_TRLBAR|EX_XFILE, + EX_RANGE|EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_TRLBAR|EX_XFILE|EX_LOCK_OK, ADDR_OTHER), EXCMD(CMD_vimgrepadd, "vimgrepadd", ex_vimgrep, - EX_RANGE|EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_TRLBAR|EX_XFILE, + EX_RANGE|EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_TRLBAR|EX_XFILE|EX_LOCK_OK, ADDR_OTHER), EXCMD(CMD_vim9script, "vim9script", ex_vim9script, - EX_CMDWIN|EX_LOCK_OK, + EX_WORD1|EX_CMDWIN|EX_LOCK_OK, ADDR_NONE), EXCMD(CMD_viusage, "viusage", ex_viusage, EX_TRLBAR, @@ -1789,16 +1793,16 @@ // commands that don't start with a letter EXCMD(CMD_bang, "!", ex_bang, - EX_RANGE|EX_WHOLEFOLD|EX_BANG|EX_FILES|EX_CMDWIN|EX_LOCK_OK, + EX_RANGE|EX_WHOLEFOLD|EX_BANG|EX_FILES|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK, ADDR_LINES), EXCMD(CMD_pound, "#", ex_print, EX_RANGE|EX_WHOLEFOLD|EX_COUNT|EX_FLAGS|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, ADDR_LINES), EXCMD(CMD_and, "&", ex_substitute, - EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY, + EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY|EX_NONWHITE_OK, ADDR_LINES), EXCMD(CMD_star, "*", ex_at, - EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, + EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK, ADDR_LINES), EXCMD(CMD_lshift, "<", ex_operators, EX_RANGE|EX_WHOLEFOLD|EX_COUNT|EX_FLAGS|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY, @@ -1810,7 +1814,7 @@ EX_RANGE|EX_WHOLEFOLD|EX_COUNT|EX_FLAGS|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY, ADDR_LINES), EXCMD(CMD_at, "@", ex_at, - EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, + EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK, ADDR_LINES), EXCMD(CMD_block, "{{{{{{{{", ex_block, // not found normally 0, @@ -1819,7 +1823,7 @@ EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, ADDR_NONE), EXCMD(CMD_tilde, "~", ex_substitute, - EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY, + EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY|EX_NONWHITE_OK, ADDR_LINES), // commands that start with an uppercase letter diff -Nru vim-8.2.1913/src/ex_docmd.c vim-8.2.2434/src/ex_docmd.c --- vim-8.2.1913/src/ex_docmd.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/ex_docmd.c 2021-01-30 22:05:11.000000000 +0000 @@ -274,7 +274,6 @@ # define ex_continue ex_ni # define ex_debug ex_ni # define ex_debuggreedy ex_ni -# define ex_def ex_ni # define ex_defcompile ex_ni # define ex_delfunction ex_ni # define ex_disassemble ex_ni @@ -305,7 +304,6 @@ # define ex_try ex_ni # define ex_unlet ex_ni # define ex_unlockvar ex_ni -# define ex_vim9script ex_ni # define ex_while ex_ni # define ex_import ex_ni # define ex_export ex_ni @@ -596,6 +594,17 @@ } /* + * Execute the "+cmd" argument of "edit +cmd fname" and the like. + * This allows for using a range without ":" in Vim9 script. + */ + int +do_cmd_argument(char_u *cmd) +{ + return do_cmdline(cmd, NULL, NULL, + DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_KEYTYPED|DOCMD_RANGEOK); +} + +/* * do_cmdline(): execute one Ex command line * * 1. Execute "cmdline" when it is not NULL. @@ -687,11 +696,8 @@ ++call_depth; #ifdef FEAT_EVAL + CLEAR_FIELD(cstack); cstack.cs_idx = -1; - cstack.cs_looplevel = 0; - cstack.cs_trylevel = 0; - cstack.cs_emsg_silent_list = NULL; - cstack.cs_lflags = 0; ga_init2(&lines_ga, (int)sizeof(wcmd_T), 10); real_cookie = getline_cookie(fgetline, cookie); @@ -747,6 +753,9 @@ * cancel the whole command line, and any if/endif or loop. * If force_abort is set, we cancel everything. */ +#ifdef FEAT_EVAL + did_emsg_cumul += did_emsg; +#endif did_emsg = FALSE; /* @@ -778,7 +787,12 @@ && !(getline_is_func && func_has_abort(real_cookie)) #endif ) + { +#ifdef FEAT_EVAL + did_emsg_cumul += did_emsg; +#endif did_emsg = FALSE; + } /* * 1. If repeating a line in a loop, get a line from lines_ga. @@ -849,7 +863,7 @@ if (do_profiling == PROF_YES) { if (getline_is_func) - func_line_start(real_cookie); + func_line_start(real_cookie, SOURCING_LNUM); else if (getline_equal(fgetline, cookie, getsourceline)) script_line_start(); } @@ -872,7 +886,8 @@ #else 0 #endif - , TRUE)) == NULL) + , in_vim9script() ? GETLINE_CONCAT_CONTBAR + : GETLINE_CONCAT_CONT)) == NULL) { // Don't call wait_return for aborted command line. The NULL // returned for the end of a sourced file or executed function @@ -982,7 +997,7 @@ * "cmdline_copy" can change, e.g. for '%' and '#' expansion. */ ++recursive; - next_cmdline = do_one_cmd(&cmdline_copy, flags & DOCMD_VERBOSE, + next_cmdline = do_one_cmd(&cmdline_copy, flags, #ifdef FEAT_EVAL &cstack, #endif @@ -1026,7 +1041,10 @@ if (did_emsg && !force_abort && getline_equal(fgetline, cookie, get_func_line) && !func_has_abort(real_cookie)) + { + // did_emsg_cumul is not set here did_emsg = FALSE; + } if (cstack.cs_looplevel > 0) { @@ -1247,7 +1265,7 @@ */ if (did_throw) { - void *p = NULL; + char *p = NULL; msglist_T *messages = NULL, *next; /* @@ -1262,7 +1280,7 @@ vim_snprintf((char *)IObuff, IOSIZE, _("E605: Exception not caught: %s"), current_exception->value); - p = vim_strsave(IObuff); + p = (char *)vim_strsave(IObuff); break; case ET_ERROR: messages = current_exception->messages; @@ -1662,7 +1680,7 @@ { #ifdef FEAT_EVAL if (in_vim9script()) - return p[0] == '#' && p[1] != '{' && !starts_with_colon; + return p[0] == '#' && !starts_with_colon; #endif return *p == '"'; } @@ -1675,7 +1693,8 @@ /* * Execute one Ex command. * - * If 'sourcing' is TRUE, the command will be included in the error message. + * If "flags" has DOCMD_VERBOSE, the command will be included in the error + * message. * * 1. skip comment lines and leading space * 2. handle command modifiers @@ -1698,7 +1717,7 @@ static char_u * do_one_cmd( char_u **cmdlinep, - int sourcing, + int flags, #ifdef FEAT_EVAL cstack_T *cstack, #endif @@ -1719,7 +1738,9 @@ #ifdef FEAT_EVAL int may_have_range; int vim9script = in_vim9script(); + int did_set_expr_line = FALSE; #endif + int sourcing = flags & DOCMD_VERBOSE; CLEAR_FIELD(ea); ea.line1 = 1; @@ -1781,24 +1802,44 @@ */ cmd = ea.cmd; #ifdef FEAT_EVAL - // In Vim9 script a colon is required before the range. - may_have_range = !vim9script || starts_with_colon; + // In Vim9 script a colon is required before the range. This may also be + // after command modifiers. + if (vim9script && (flags & DOCMD_RANGEOK) == 0) + { + may_have_range = FALSE; + for (p = ea.cmd; p >= *cmdlinep; --p) + { + if (*p == ':') + may_have_range = TRUE; + if (p < ea.cmd && !VIM_ISWHITE(*p)) + break; + } + } + else + may_have_range = TRUE; if (may_have_range) #endif ea.cmd = skip_range(ea.cmd, TRUE, NULL); #ifdef FEAT_EVAL - if (vim9script && !starts_with_colon) + if (vim9script && !may_have_range) { if (ea.cmd == cmd + 1 && *cmd == '$') // should be "$VAR = val" --ea.cmd; - else if (ea.cmd > cmd) + p = find_ex_command(&ea, NULL, lookup_scriptvar, NULL); + if (ea.cmdidx == CMD_SIZE) { - emsg(_(e_colon_required_before_a_range)); - goto doend; + char_u *ar = skip_range(ea.cmd, TRUE, NULL); + + // If a ':' before the range is missing, give a clearer error + // message. + if (ar > ea.cmd) + { + semsg(_(e_colon_required_before_range_str), ea.cmd); + goto doend; + } } - p = find_ex_command(&ea, NULL, lookup_scriptvar, NULL); } else #endif @@ -1981,7 +2022,7 @@ if (p == NULL) { if (!ea.skip) - errormsg = _("E464: Ambiguous use of user-defined command"); + errormsg = _(e_ambiguous_use_of_user_defined_command); goto doend; } // Check for wrong commands. @@ -2315,8 +2356,9 @@ // for '=' register: accept the rest of the line as an expression if (ea.arg[-1] == '=' && ea.arg[0] != NUL) { - set_expr_line(vim_strsave(ea.arg)); + set_expr_line(vim_strsave(ea.arg), &ea); ea.arg += STRLEN(ea.arg); + did_set_expr_line = TRUE; } #endif ea.arg = skipwhite(ea.arg); @@ -2549,7 +2591,7 @@ // Set flag that any command was executed, used by ex_vim9script(). if (getline_equal(ea.getline, ea.cookie, getsourceline) && current_sctx.sc_sid > 0) - SCRIPT_ITEM(current_sctx.sc_sid)->sn_had_command = TRUE; + SCRIPT_ITEM(current_sctx.sc_sid)->sn_state = SN_STATE_HAD_COMMAND; /* * If the command just executed called do_cmdline(), any throw or ":return" @@ -2595,6 +2637,9 @@ do_errthrow(cstack, (ea.cmdidx != CMD_SIZE && !IS_USER_CMDIDX(ea.cmdidx)) ? cmdnames[(int)ea.cmdidx].cmd_name : (char_u *)NULL); + + if (did_set_expr_line) + set_expr_line(NULL, NULL); #endif undo_cmdmod(&cmdmod); @@ -2690,6 +2735,28 @@ } p = skip_range(eap->cmd, TRUE, NULL); + + // In Vim9 script a variable can shadow a command modifier: + // verbose = 123 + // verbose += 123 + // silent! verbose = func() + // verbose.member = 2 + // verbose[expr] = 2 + // But not: + // verbose [a, b] = list + if (in_vim9script()) + { + char_u *s, *n; + + for (s = p; ASCII_ISALPHA(*s); ++s) + ; + n = skipwhite(s); + if (vim_strchr((char_u *)".=", *n) != NULL + || *s == '[' + || (*n != NUL && n[1] == '=')) + break; + } + switch (*p) { // When adding an entry, also modify cmd_exists(). @@ -2758,7 +2825,7 @@ } #ifdef FEAT_EVAL // Avoid that "filter(arg)" is recognized. - if (in_vim9script() && !VIM_ISWHITE(*p)) + if (in_vim9script() && !VIM_ISWHITE(p[-1])) break; #endif if (skip_only) @@ -3223,7 +3290,7 @@ find_ex_command( exarg_T *eap, int *full UNUSED, - void *(*lookup)(char_u *, size_t, cctx_T *) UNUSED, + int (*lookup)(char_u *, size_t, void *, cctx_T *) UNUSED, cctx_T *cctx UNUSED) { int len; @@ -3243,8 +3310,9 @@ if (vim_strchr((char_u *)"{('[\"@", *p) != NULL || ((p = to_name_const_end(pskip)) > eap->cmd && *p != NUL)) { - int oplen; - int heredoc; + int oplen; + int heredoc; + char_u *swp = skipwhite(p); if ( // "(..." is an expression. @@ -3262,7 +3330,7 @@ || eap->cmd[1] == ':' ) // "varname->func()" is an expression. - : (*p == '-' && p[1] == '>'))) + : (*swp == '-' && swp[1] == '>'))) { if (*eap->cmd == '{' && ends_excmd(*skipwhite(eap->cmd + 1))) { @@ -3284,9 +3352,15 @@ // When followed by "=" or "+=" then it is an assignment. ++emsg_silent; - if (skip_expr(&after, NULL) == OK - && (*after == '=' - || (*after != NUL && after[1] == '='))) + if (*after == '.') + after = skipwhite(after + 1); + if (skip_expr(&after, NULL) == OK) + after = skipwhite(after); + else + after = (char_u *)""; + if (*after == '=' || (*after != NUL && after[1] == '=') + || (after[0] == '.' && after[1] == '.' + && after[2] == '=')) eap->cmdidx = CMD_var; else eap->cmdidx = CMD_eval; @@ -3304,7 +3378,14 @@ if (*eap->cmd == '[') { p = to_name_const_end(eap->cmd); - if (p == eap->cmd || *skipwhite(p) != '=') + if (p == eap->cmd && *p == '[') + { + int count = 0; + int semicolon = FALSE; + + p = skip_var_list(eap->cmd, TRUE, &count, &semicolon, TRUE); + } + if (p == NULL || p == eap->cmd || *skipwhite(p) != '=') { eap->cmdidx = CMD_eval; return eap->cmd; @@ -3328,7 +3409,7 @@ || *eap->cmd == '&' || *eap->cmd == '$' || *eap->cmd == '@' - || lookup(eap->cmd, p - eap->cmd, cctx) != NULL) + || lookup(eap->cmd, p - eap->cmd, NULL, cctx) == OK) { eap->cmdidx = CMD_var; return eap->cmd; @@ -3446,6 +3527,11 @@ break; } + // Not not recognize ":*" as the star command unless '*' is in + // 'cpoptions'. + if (eap->cmdidx == CMD_star && vim_strchr(p_cpo, CPO_STAR) == NULL) + p = eap->cmd; + // Look for a user defined command as a last resort. Let ":Print" be // overruled by a user defined command. if ((eap->cmdidx == CMD_SIZE || eap->cmdidx == CMD_Print) @@ -3456,7 +3542,7 @@ ++p; p = find_ucmd(eap, p, full, NULL, NULL); } - if (p == eap->cmd) + if (p == NULL || p == eap->cmd) eap->cmdidx = CMD_SIZE; } @@ -3464,6 +3550,18 @@ if (eap->cmdidx == CMD_final && p - eap->cmd == 4) eap->cmdidx = CMD_finally; +#ifdef FEAT_EVAL + if (eap->cmdidx < CMD_SIZE + && in_vim9script() + && !IS_WHITE_OR_NUL(*p) && *p != '\n' && *p != '!' + && (eap->cmdidx < 0 || + (cmdnames[eap->cmdidx].cmd_argt & EX_NONWHITE_OK) == 0)) + { + semsg(_(e_command_not_followed_by_white_space_str), eap->cmd); + eap->cmdidx = CMD_SIZE; + } +#endif + return p; } @@ -3875,7 +3973,7 @@ } if (skip) // skip "/pat/" { - cmd = skip_regexp(cmd, c, (int)p_magic); + cmd = skip_regexp(cmd, c, magic_isset()); if (*cmd == c) ++cmd; } @@ -4716,7 +4814,6 @@ || (*p == '#' && in_vim9script() && !(eap->argt & EX_NOTRLCOM) - && p[1] != '{' && p > eap->cmd && VIM_ISWHITE(p[-1])) #endif || *p == '|' || *p == '\n') @@ -4969,7 +5066,7 @@ else goto_buffer(eap, DOBUF_FIRST, FORWARD, (int)eap->line2); if (eap->do_ecmd_cmd != NULL) - do_cmdline_cmd(eap->do_ecmd_cmd); + do_cmd_argument(eap->do_ecmd_cmd); } } @@ -4982,7 +5079,7 @@ { goto_buffer(eap, DOBUF_MOD, FORWARD, (int)eap->line2); if (eap->do_ecmd_cmd != NULL) - do_cmdline_cmd(eap->do_ecmd_cmd); + do_cmd_argument(eap->do_ecmd_cmd); } /* @@ -4997,7 +5094,7 @@ goto_buffer(eap, DOBUF_CURRENT, FORWARD, (int)eap->line2); if (eap->do_ecmd_cmd != NULL) - do_cmdline_cmd(eap->do_ecmd_cmd); + do_cmd_argument(eap->do_ecmd_cmd); } /* @@ -5014,7 +5111,7 @@ goto_buffer(eap, DOBUF_CURRENT, BACKWARD, (int)eap->line2); if (eap->do_ecmd_cmd != NULL) - do_cmdline_cmd(eap->do_ecmd_cmd); + do_cmd_argument(eap->do_ecmd_cmd); } /* @@ -5031,7 +5128,7 @@ goto_buffer(eap, DOBUF_FIRST, FORWARD, 0); if (eap->do_ecmd_cmd != NULL) - do_cmdline_cmd(eap->do_ecmd_cmd); + do_cmd_argument(eap->do_ecmd_cmd); } /* @@ -5046,12 +5143,12 @@ goto_buffer(eap, DOBUF_LAST, BACKWARD, 0); if (eap->do_ecmd_cmd != NULL) - do_cmdline_cmd(eap->do_ecmd_cmd); + do_cmd_argument(eap->do_ecmd_cmd); } /* * Check if "c" ends an Ex command. - * In Vim9 script does not check for white space before # or #{. + * In Vim9 script does not check for white space before #. */ int ends_excmd(int c) @@ -5800,6 +5897,7 @@ { if (!eap->forceit) autowrite_all(); + apply_autocmds(EVENT_VIMSUSPEND, NULL, NULL, FALSE, NULL); windgoto((int)Rows - 1, 0); out_char('\n'); out_flush(); @@ -5817,6 +5915,7 @@ scroll_start(); // scroll screen before redrawing redraw_later_clear(); shell_resized(); // may have resized window + apply_autocmds(EVENT_VIMRESUME, NULL, NULL, FALSE, NULL); } } @@ -6458,9 +6557,9 @@ { // ":open /pattern/": put cursor in column found with pattern ++eap->arg; - p = skip_regexp(eap->arg, '/', p_magic); + p = skip_regexp(eap->arg, '/', magic_isset()); *p = NUL; - regmatch.regprog = vim_regcomp(eap->arg, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp(eap->arg, magic_isset() ? RE_MAGIC : 0); if (regmatch.regprog != NULL) { regmatch.rm_ic = p_ic; @@ -6481,7 +6580,7 @@ } /* - * ":edit", ":badd", ":visual". + * ":edit", ":badd", ":balt", ":visual". */ static void ex_edit(exarg_T *eap) @@ -6585,7 +6684,8 @@ else if (eap->cmdidx == CMD_enew) readonlymode = FALSE; // 'readonly' doesn't make sense in an // empty buffer - setpcmark(); + if (eap->cmdidx != CMD_balt && eap->cmdidx != CMD_badd) + setpcmark(); if (do_ecmd(0, (eap->cmdidx == CMD_enew ? NULL : eap->arg), NULL, eap, // ":edit" goes to first line if Vi compatible @@ -6596,7 +6696,8 @@ + (eap->forceit ? ECMD_FORCEIT : 0) // after a split we can use an existing buffer + (old_curwin != NULL ? ECMD_OLDBUF : 0) - + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0 ) + + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0) + + (eap->cmdidx == CMD_balt ? ECMD_ALTBUF : 0) , old_curwin == NULL ? curwin : NULL) == FAIL) { // Editing the file failed. If the window was split, close it. @@ -6639,7 +6740,7 @@ else { if (eap->do_ecmd_cmd != NULL) - do_cmdline_cmd(eap->do_ecmd_cmd); + do_cmd_argument(eap->do_ecmd_cmd); #ifdef FEAT_TITLE n = curwin->w_arg_idx_invalid; #endif @@ -7122,14 +7223,17 @@ case NUL: len *= 1000L; break; default: semsg(_(e_invarg2), eap->arg); return; } - do_sleep(len); + + // Hide the cursor if invoked with ! + do_sleep(len, eap->forceit); } /* * Sleep for "msec" milliseconds, but keep checking for a CTRL-C every second. + * Hide the cursor if "hide_cursor" is TRUE. */ void -do_sleep(long msec) +do_sleep(long msec, int hide_cursor) { long done = 0; long wait_now; @@ -7141,7 +7245,11 @@ ELAPSED_INIT(start_tv); # endif - cursor_on(); + if (hide_cursor) + cursor_off(); + else + cursor_on(); + out_flush_cursor(FALSE, FALSE); while (!got_int && done < msec) { @@ -7450,11 +7558,12 @@ static void ex_submagic(exarg_T *eap) { - int magic_save = p_magic; + optmagic_T saved = magic_overruled; - p_magic = (eap->cmdidx == CMD_smagic); + magic_overruled = eap->cmdidx == CMD_smagic + ? OPTION_MAGIC_ON : OPTION_MAGIC_OFF; ex_substitute(eap); - p_magic = magic_save; + magic_overruled = saved; } /* @@ -7929,9 +8038,12 @@ sst->save_opcount = opcount; sst->save_reg_executing = reg_executing; - msg_scroll = FALSE; // no msg scrolling in Normal mode - restart_edit = 0; // don't go to Insert mode - p_im = FALSE; // don't use 'insertmode' + msg_scroll = FALSE; // no msg scrolling in Normal mode + restart_edit = 0; // don't go to Insert mode + p_im = FALSE; // don't use 'insertmode' + + sst->save_script_version = current_sctx.sc_version; + current_sctx.sc_version = 1; // not in Vim9 script /* * Save the current typeahead. This is required to allow using ":normal" @@ -7955,6 +8067,7 @@ opcount = sst->save_opcount; reg_executing = sst->save_reg_executing; msg_didout |= sst->save_msg_didout; // don't reset msg_didout now + current_sctx.sc_version = sst->save_script_version; // Restore the state (needed when called from a function executed for // 'indentexpr'). Update the mouse and cursor, they may have changed. @@ -8122,6 +8235,9 @@ restart_edit = 'i'; curwin->w_curswant = 0; // avoid MAXCOL } + + if (VIsual_active) + showmode(); } /* @@ -8244,7 +8360,7 @@ { whole = FALSE; ++eap->arg; - p = skip_regexp(eap->arg, '/', p_magic); + p = skip_regexp(eap->arg, '/', magic_isset()); if (*p) { *p++ = NUL; @@ -8446,18 +8562,19 @@ /* * Evaluate cmdline variables. * - * change '%' to curbuf->b_ffname - * '#' to curwin->w_altfile - * '' to word under the cursor - * '' to WORD under the cursor - * '' to C-expression under the cursor - * '' to path name under the cursor - * '' to sourced file name - * '' to call stack - * '' to sourced file line number - * '' to file name for autocommand - * '' to buffer number for autocommand - * '' to matching name for autocommand + * change "%" to curbuf->b_ffname + * "#" to curwin->w_alt_fnum + * "%%" to curwin->w_alt_fnum in Vim9 script + * "" to word under the cursor + * "" to WORD under the cursor + * "" to C-expression under the cursor + * "" to path name under the cursor + * "" to sourced file name + * "" to call stack + * "" to sourced file line number + * "" to file name for autocommand + * "" to buffer number for autocommand + * "" to matching name for autocommand * * When an error is detected, "errormsg" is set to a non-NULL pointer (may be * "" for error without a message) and NULL is returned. @@ -8538,47 +8655,60 @@ */ else { + int off = 0; + switch (spec_idx) { - case SPEC_PERC: // '%': current file - if (curbuf->b_fname == NULL) - { - result = (char_u *)""; - valid = 0; // Must have ":p:h" to be valid - } - else + case SPEC_PERC: +#ifdef FEAT_EVAL + if (!in_vim9script() || src[1] != '%') +#endif { - result = curbuf->b_fname; - tilde_file = STRCMP(result, "~") == 0; + // '%': current file + if (curbuf->b_fname == NULL) + { + result = (char_u *)""; + valid = 0; // Must have ":p:h" to be valid + } + else + { + result = curbuf->b_fname; + tilde_file = STRCMP(result, "~") == 0; + } + break; } - break; - +#ifdef FEAT_EVAL + // "%%" alternate file + off = 1; +#endif + // FALLTHROUGH case SPEC_HASH: // '#' or "#99": alternate file - if (src[1] == '#') // "##": the argument list + if (off == 0 ? src[1] == '#' : src[2] == '%') { + // "##" or "%%%": the argument list result = arg_all(); resultbuf = result; - *usedlen = 2; + *usedlen = off + 2; if (escaped != NULL) *escaped = TRUE; skip_mod = TRUE; break; } - s = src + 1; + s = src + off + 1; if (*s == '<') // "#<99" uses v:oldfiles ++s; i = (int)getdigits(&s); - if (s == src + 2 && src[1] == '-') + if (s == src + off + 2 && src[off + 1] == '-') // just a minus sign, don't skip over it s--; *usedlen = (int)(s - src); // length of what we expand - if (src[1] == '<' && i != 0) + if (src[off + 1] == '<' && i != 0) { - if (*usedlen < 2) + if (*usedlen < off + 2) { // Should we give an error message for # 1) - *usedlen = 1; + if (i == 0 && src[off + 1] == '<' && *usedlen > off + 1) + *usedlen = off + 1; buf = buflist_findnr(i); if (buf == NULL) { diff -Nru vim-8.2.1913/src/ex_eval.c vim-8.2.2434/src/ex_eval.c --- vim-8.2.1913/src/ex_eval.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/ex_eval.c 2021-01-30 22:05:11.000000000 +0000 @@ -606,6 +606,8 @@ { char_u *saved_IObuff; + if (current_exception == excp) + current_exception = NULL; if (excp == NULL) { internal_error("discard_exception()"); @@ -654,10 +656,7 @@ discard_current_exception(void) { if (current_exception != NULL) - { discard_exception(current_exception, FALSE); - current_exception = NULL; - } did_throw = FALSE; need_rethrow = FALSE; } @@ -921,6 +920,13 @@ cstack->cs_block_id[cstack->cs_idx] = ++si->sn_last_block_id; si->sn_current_block_id = si->sn_last_block_id; } + else + { + // Just in case in_vim9script() does not return the same value when the + // block ends. + cstack->cs_script_var_len[cstack->cs_idx] = 0; + cstack->cs_block_id[cstack->cs_idx] = 0; + } } static void @@ -1696,7 +1702,7 @@ *end = NUL; } save_cpo = p_cpo; - p_cpo = (char_u *)""; + p_cpo = empty_option; // Disable error messages, it will make current_exception // invalid. ++emsg_off; @@ -2284,8 +2290,8 @@ // Cancel the pending exception. This is in the // finally clause, so that the stack of the // caught exceptions is not involved. - discard_exception((except_T *) - cstack->cs_exception[idx], + discard_exception( + (except_T *)cstack->cs_exception[idx], FALSE); } else diff -Nru vim-8.2.1913/src/ex_getln.c vim-8.2.2434/src/ex_getln.c --- vim-8.2.1913/src/ex_getln.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/ex_getln.c 2021-01-30 22:05:11.000000000 +0000 @@ -52,6 +52,9 @@ static int cmdline_paste(int regname, int literally, int remcr); static void redrawcmdprompt(void); static int ccheck_abbr(int); +#ifdef FEAT_SEARCH_EXTRA +static int empty_pattern_magic(char_u *pat, size_t len, magic_T magic_val); +#endif #ifdef FEAT_CMDWIN static int open_cmdwin(void); @@ -89,15 +92,34 @@ * as a trailing \|, which can happen while typing a pattern. */ static int -empty_pattern(char_u *p) +empty_pattern(char_u *p, int delim) { - size_t n = STRLEN(p); + size_t n = STRLEN(p); + magic_T magic_val = MAGIC_ON; + + if (n > 0) + (void) skip_regexp_ex(p, delim, magic_isset(), NULL, NULL, &magic_val); + else + return TRUE; + + return empty_pattern_magic(p, n, magic_val); +} + static int +empty_pattern_magic(char_u *p, size_t len, magic_T magic_val) +{ // remove trailing \v and the like - while (n >= 2 && p[n - 2] == '\\' - && vim_strchr((char_u *)"mMvVcCZ", p[n - 1]) != NULL) - n -= 2; - return n == 0 || (n >= 2 && p[n - 2] == '\\' && p[n - 1] == '|'); + while (len >= 2 && p[len - 2] == '\\' + && vim_strchr((char_u *)"mMvVcCZ", p[len - 1]) != NULL) + len -= 2; + + // true, if the pattern is empty, or the pattern ends with \| and magic is + // set (or it ends with '|' and very magic is set) + return len == 0 || (len > 1 + && ((p[len - 2] == '\\' + && p[len - 1] == '|' && magic_val == MAGIC_ON) + || (p[len - 2] != '\\' + && p[len - 1] == '|' && magic_val == MAGIC_ALL))); } // Struct to store the viewstate during 'incsearch' highlighting. @@ -142,22 +164,24 @@ typedef struct { pos_T search_start; // where 'incsearch' starts searching pos_T save_cursor; + int winid; // window where this state is valid viewstate_T init_viewstate; viewstate_T old_viewstate; pos_T match_start; pos_T match_end; int did_incsearch; int incsearch_postponed; - int magic_save; + optmagic_T magic_overruled_save; } incsearch_state_T; static void init_incsearch_state(incsearch_state_T *is_state) { + is_state->winid = curwin->w_id; is_state->match_start = curwin->w_cursor; is_state->did_incsearch = FALSE; is_state->incsearch_postponed = FALSE; - is_state->magic_save = p_magic; + is_state->magic_overruled_save = magic_overruled; CLEAR_POS(&is_state->match_end); is_state->save_cursor = curwin->w_cursor; // may be restored later is_state->search_start = curwin->w_cursor; @@ -205,6 +229,7 @@ pos_T save_cursor; int use_last_pat; int retval = FALSE; + magic_T magic = 0; *skiplen = 0; *patlen = ccline.cmdlen; @@ -250,9 +275,9 @@ || STRNCMP(cmd, "vglobal", p - cmd) == 0) { if (*cmd == 's' && cmd[1] == 'm') - p_magic = TRUE; + magic_overruled = OPTION_MAGIC_ON; else if (*cmd == 's' && cmd[1] == 'n') - p_magic = FALSE; + magic_overruled = OPTION_MAGIC_OFF; } else if (STRNCMP(cmd, "sort", MAX(p - cmd, 3)) == 0) { @@ -286,7 +311,7 @@ p = skipwhite(p); delim = (delim_optional && vim_isIDc(*p)) ? ' ' : *p++; *search_delim = delim; - end = skip_regexp(p, delim, p_magic); + end = skip_regexp_ex(p, delim, magic_isset(), NULL, NULL, &magic); use_last_pat = end == p && *end == delim; @@ -300,7 +325,7 @@ int empty; *end = NUL; - empty = empty_pattern(p); + empty = empty_pattern_magic(p, STRLEN(p), magic); *end = c; if (empty) goto theend; @@ -370,7 +395,7 @@ search_first_line = 0; search_last_line = MAXLNUM; - p_magic = is_state->magic_save; + magic_overruled = is_state->magic_overruled_save; validate_cursor(); // needed for TAB redraw_all_later(SOME_VALID); @@ -533,7 +558,8 @@ { next_char = ccline.cmdbuff[skiplen + patlen]; ccline.cmdbuff[skiplen + patlen] = NUL; - if (empty_pattern(ccline.cmdbuff) && !no_hlsearch) + if (empty_pattern(ccline.cmdbuff + skiplen, search_delim) + && !no_hlsearch) { redraw_all_later(SOME_VALID); set_no_hlsearch(TRUE); @@ -711,7 +737,7 @@ if (p_ic && p_scs && !pat_has_uppercase(ccline.cmdbuff + skiplen)) *c = MB_TOLOWER(*c); if (*c == search_delim || vim_strchr((char_u *)( - p_magic ? "\\~^$.*[" : "\\^$"), *c) != NULL) + magic_isset() ? "\\~^$.*[" : "\\^$"), *c) != NULL) { // put a backslash before special characters stuffcharReadbuff(*c); @@ -1703,13 +1729,17 @@ // Trigger SafeState if nothing is pending. may_trigger_safestate(xpc.xp_numfiles <= 0); - cursorcmd(); // set the cursor on the right spot - // Get a character. Ignore K_IGNORE and K_NOP, they should not do // anything, such as stop completion. do + { + cursorcmd(); // set the cursor on the right spot c = safe_vgetc(); - while (c == K_IGNORE || c == K_NOP); + } while (c == K_IGNORE || c == K_NOP); + + if (c == K_COMMAND + && do_cmdline(NULL, getcmdkeycmd, NULL, DOCMD_NOWAIT) == OK) + goto cmdline_changed; if (KeyTyped) { @@ -2200,13 +2230,14 @@ case Ctrl_V: case Ctrl_Q: { - int prev_mod_mask = mod_mask; - ignore_drag_release = TRUE; putcmdline('^', TRUE); - no_reduce_keys = TRUE; // don't merge modifyOtherKeys - c = get_literal(); // get next (two) character(s) - no_reduce_keys = FALSE; + + // Get next (two) character(s). Do not change any + // modifyOtherKeys ESC sequence to a normal key for + // CTRL-SHIFT-V. + c = get_literal(mod_mask & MOD_MASK_SHIFT); + do_abbr = FALSE; // don't do abbreviation now extra_char = NUL; // may need to remove ^ when composing char was typed @@ -2217,13 +2248,6 @@ msg_putchar(' '); cursorcmd(); } - - if ((c == ESC || c == CSI) - && !(prev_mod_mask & MOD_MASK_SHIFT)) - // Using CTRL-V: Change any modifyOtherKeys ESC - // sequence to a normal key. Don't do this for - // CTRL-SHIFT-V. - c = decodeModifyOtherKeys(c); } break; @@ -2323,6 +2347,11 @@ #endif cmdline_changed: +#ifdef FEAT_SEARCH_EXTRA + // If the window changed incremental search state is not valid. + if (is_state.winid != curwin->w_id) + init_incsearch_state(&is_state); +#endif // Trigger CmdlineChanged autocommands. trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED); @@ -4176,15 +4205,18 @@ // Don't let quitting the More prompt make this fail. got_int = FALSE; + // Set "cmdwin_type" before any autocommands may mess things up. + cmdwin_type = get_cmdline_type(); + // Create the command-line buffer empty. if (do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL) == FAIL) { // Some autocommand messed it up? win_close(curwin, TRUE); ga_clear(&winsizes); + cmdwin_type = 0; return Ctrl_C; } - cmdwin_type = get_cmdline_type(); apply_autocmds(EVENT_BUFFILEPRE, NULL, NULL, FALSE, curbuf); (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE); @@ -4364,10 +4396,15 @@ // Avoid command-line window first character being concealed. curwin->w_p_cole = 0; # endif + // First go back to the original window. wp = curwin; set_bufref(&bufref, curbuf); win_goto(old_curwin); - win_close(wp, TRUE); + + // win_goto() may trigger an autocommand that already closes the + // cmdline window. + if (win_valid(wp)) + win_close(wp, TRUE); // win_close() may have already wiped the buffer when 'bh' is // set to 'wipe' diff -Nru vim-8.2.1913/src/feature.h vim-8.2.2434/src/feature.h --- vim-8.2.1913/src/feature.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/feature.h 2021-01-30 22:05:11.000000000 +0000 @@ -937,7 +937,7 @@ * +mouse_sgr Unix only: Include code for for SGR-styled mouse. * +mouse_sysmouse Unix only: Include code for FreeBSD and DragonFly * console mouse handling. - * +mouse_urxvt Unix only: Include code for for urxvt mosue handling. + * +mouse_urxvt Unix only: Include code for for urxvt mouse handling. * +mouse Any mouse support (any of the above enabled). * Always included, since either FEAT_MOUSE_XTERM or * DOS_MOUSE is defined. @@ -1089,11 +1089,11 @@ /* * +ARP Amiga only. Use arp.library, DOS 2.0 is not required. */ -#if !defined(NO_ARP) && !defined(__amigaos4__) +#if defined(AMIGA) && !defined(NO_ARP) && !defined(__amigaos4__) \ + && !defined(__MORPHOS__) && !defined(__AROS__) # define FEAT_ARP #endif - /* * +ole Win32 OLE automation: Use Makefile.ovc. */ diff -Nru vim-8.2.1913/src/fileio.c vim-8.2.2434/src/fileio.c --- vim-8.2.1913/src/fileio.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/fileio.c 2021-01-30 22:05:11.000000000 +0000 @@ -16,10 +16,13 @@ #if defined(__TANDEM) # include // for SSIZE_MAX #endif -#if defined(UNIX) && defined(FEAT_EVAL) +#if (defined(UNIX) || defined(VMS)) && defined(FEAT_EVAL) # include # include #endif +#if defined(VMS) && defined(HAVE_XOS_R_H) +# include +#endif // Is there any system that doesn't have access()? #define USE_MCH_ACCESS @@ -338,7 +341,7 @@ if (!read_stdin && !read_buffer && !read_fifo) { -#ifdef UNIX +#if defined(UNIX) || defined(VMS) /* * On Unix it is possible to read a directory, so we have to * check for it before the mch_open(). @@ -2280,6 +2283,7 @@ else { int fdflags = fcntl(fd, F_GETFD); + if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0) (void)fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC); } @@ -4208,7 +4212,7 @@ msg_puts_attr(mesg2, HL_ATTR(HLF_W) + MSG_HIST); msg_clr_eos(); (void)msg_end(); - if (emsg_silent == 0) + if (emsg_silent == 0 && !in_assert_fails) { out_flush(); #ifdef FEAT_GUI @@ -4622,11 +4626,13 @@ q = (char_u*)pw->pw_name; if (dict_add_string(item, "user", q) == FAIL) goto theend; +# if !defined(VMS) || (defined(VMS) && defined(HAVE_XOS_R_H)) gr = getgrgid(st.st_gid); if (gr == NULL) q = (char_u*)""; else q = (char_u*)gr->gr_name; +# endif if (dict_add_string(item, "group", q) == FAIL) goto theend; } @@ -5167,17 +5173,24 @@ # ifdef MSWIN WCHAR wszTempFile[_MAX_PATH + 1]; WCHAR buf4[4]; + WCHAR *chartab = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char_u *retval; char_u *p; + long i; wcscpy(itmp, L""); if (GetTempPathW(_MAX_PATH, wszTempFile) == 0) { wszTempFile[0] = L'.'; // GetTempPathW() failed, use current dir - wszTempFile[1] = NUL; + wszTempFile[1] = L'\\'; + wszTempFile[2] = NUL; } wcscpy(buf4, L"VIM"); - buf4[2] = extra_char; // make it "VIa", "VIb", etc. + + // randomize the name to avoid collisions + i = mch_get_pid() + extra_char; + buf4[1] = chartab[i % 36]; + buf4[2] = chartab[101 * i % 36]; if (GetTempFileNameW(wszTempFile, buf4, 0, itmp) == 0) return NULL; if (!keep) diff -Nru vim-8.2.1913/src/filepath.c vim-8.2.2434/src/filepath.c --- vim-8.2.1913/src/filepath.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/filepath.c 2021-01-30 22:05:11.000000000 +0000 @@ -861,10 +861,11 @@ void f_executable(typval_T *argvars, typval_T *rettv) { - char_u *name = tv_get_string(&argvars[0]); + if (in_vim9script() && check_for_string(&argvars[0]) == FAIL) + return; // Check in $PATH and also check directly if there is a directory name. - rettv->vval.v_number = mch_can_exe(name, NULL, TRUE); + rettv->vval.v_number = mch_can_exe(tv_get_string(&argvars[0]), NULL, TRUE); } /* @@ -875,6 +876,8 @@ { char_u *p = NULL; + if (in_vim9script() && check_for_nonempty_string(&argvars[0]) == FAIL) + return; (void)mch_can_exe(tv_get_string(&argvars[0]), &p, TRUE); rettv->v_type = VAR_STRING; rettv->vval.v_string = p; @@ -890,6 +893,8 @@ char_u *p; int n; + if (in_vim9script() && check_for_string(&argvars[0]) == FAIL) + return; #ifndef O_NONBLOCK # define O_NONBLOCK 0 #endif @@ -913,6 +918,8 @@ void f_filewritable(typval_T *argvars, typval_T *rettv) { + if (in_vim9script() && check_for_string(&argvars[0]) == FAIL) + return; rettv->vval.v_number = filewritable(tv_get_string(&argvars[0])); } @@ -935,6 +942,8 @@ rettv->vval.v_string = NULL; rettv->v_type = VAR_STRING; + if (in_vim9script() && check_for_nonempty_string(&argvars[0]) == FAIL) + return; #ifdef FEAT_SEARCHPATH fname = tv_get_string(&argvars[0]); @@ -1010,18 +1019,22 @@ char_u *fname; char_u *mods; int usedlen = 0; - int len; + int len = 0; char_u *fbuf = NULL; char_u buf[NUMBUFLEN]; + if (in_vim9script() && (check_for_string(&argvars[0]) == FAIL + || check_for_string(&argvars[1]) == FAIL)) + return; fname = tv_get_string_chk(&argvars[0]); mods = tv_get_string_buf_chk(&argvars[1], buf); - if (fname == NULL || mods == NULL) + if (mods == NULL || fname == NULL) fname = NULL; else { len = (int)STRLEN(fname); - (void)modify_fname(mods, FALSE, &usedlen, &fname, &fbuf, &len); + if (mods != NULL && *mods != NUL) + (void)modify_fname(mods, FALSE, &usedlen, &fname, &fbuf, &len); } rettv->v_type = VAR_STRING; @@ -1122,6 +1135,8 @@ char_u *perm = NULL; char_u permbuf[] = "---------"; + if (in_vim9script() && check_for_string(&argvars[0]) == FAIL) + return; fname = tv_get_string(&argvars[0]); rettv->v_type = VAR_STRING; @@ -1139,10 +1154,10 @@ char_u *fname; stat_T st; - fname = tv_get_string(&argvars[0]); - - rettv->v_type = VAR_NUMBER; + if (in_vim9script() && check_for_string(&argvars[0]) == FAIL) + return; + fname = tv_get_string(&argvars[0]); if (mch_stat((char *)fname, &st) >= 0) { if (mch_isdir(fname)) @@ -1169,8 +1184,9 @@ char_u *fname; stat_T st; + if (in_vim9script() && check_for_string(&argvars[0]) == FAIL) + return; fname = tv_get_string(&argvars[0]); - if (mch_stat((char *)fname, &st) >= 0) rettv->vval.v_number = (varnumber_T)st.st_mtime; else @@ -1214,6 +1230,8 @@ stat_T st; char_u *type = NULL; + if (in_vim9script() && check_for_string(&argvars[0]) == FAIL) + return; fname = tv_get_string(&argvars[0]); rettv->v_type = VAR_STRING; @@ -1622,11 +1640,11 @@ /* * "readfile()" function */ - void -f_readfile(typval_T *argvars, typval_T *rettv) + static void +read_file_or_blob(typval_T *argvars, typval_T *rettv, int always_blob) { int binary = FALSE; - int blob = FALSE; + int blob = always_blob; int failed = FALSE; char_u *fname; FILE *fd; @@ -1778,7 +1796,8 @@ if (dest < buf) { - adjust_prevlen = (int)(buf - dest); // must be 1 or 2 + // must be 1 or 2 + adjust_prevlen = (int)(buf - dest); dest = buf; } if (readlen > p - buf + 1) @@ -1849,6 +1868,24 @@ } /* + * "readblob()" function + */ + void +f_readblob(typval_T *argvars, typval_T *rettv) +{ + read_file_or_blob(argvars, rettv, TRUE); +} + +/* + * "readfile()" function + */ + void +f_readfile(typval_T *argvars, typval_T *rettv) +{ + read_file_or_blob(argvars, rettv, FALSE); +} + +/* * "resolve()" function */ void diff -Nru vim-8.2.1913/src/fold.c vim-8.2.2434/src/fold.c --- vim-8.2.1913/src/fold.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/fold.c 2021-01-30 22:05:11.000000000 +0000 @@ -640,7 +640,10 @@ break; } } - i = (int)(fp - (fold_T *)gap->ga_data); + if (gap->ga_len == 0) + i = 0; + else + i = (int)(fp - (fold_T *)gap->ga_data); } if (ga_grow(gap, 1) == OK) @@ -902,6 +905,8 @@ // that moves the cursor is used. lnum_off = 0; gap = &curwin->w_folds; + if (gap->ga_len == 0) + break; use_level = FALSE; maybe_small = FALSE; lnum_found = curwin->w_cursor.lnum; @@ -911,7 +916,7 @@ { if (!foldFind(gap, curwin->w_cursor.lnum - lnum_off, &fp)) { - if (!updown) + if (!updown || gap->ga_len == 0) break; // When moving up, consider a fold above the cursor; when diff -Nru vim-8.2.1913/src/getchar.c vim-8.2.2434/src/getchar.c --- vim-8.2.1913/src/getchar.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/getchar.c 2021-01-30 22:05:11.000000000 +0000 @@ -2155,7 +2155,8 @@ // Do not handle messages while redrawing, because it may cause buffers to // change or be wiped while they are being redrawn. - if (updating_screen) + // Also bail out when parsing messages was explicitly disabled. + if (updating_screen || dont_parse_messages) return; // If memory allocation fails during startup we'll exit but curbuf or @@ -2263,7 +2264,7 @@ } /* - * Check if typebuf.tb_buf[] contains a modifer plus key that can be changed + * Check if typebuf.tb_buf[] contains a modifier plus key that can be changed * into just a key, apply that. * Check from typebuf.tb_buf[typebuf.tb_off] to typebuf.tb_buf[typebuf.tb_off * + "max_offset"]. @@ -2579,11 +2580,10 @@ typebuf.tb_off] == RM_YES)) && !*timedout) { - keylen = check_termcode(max_mlen + 1, - NULL, 0, NULL); + keylen = check_termcode(max_mlen + 1, NULL, 0, NULL); - // If no termcode matched but 'pastetoggle' matched partially it's - // like an incomplete key sequence. + // If no termcode matched but 'pastetoggle' matched partially + // it's like an incomplete key sequence. if (keylen == 0 && save_keylen == KEYLEN_PART_KEY) keylen = KEYLEN_PART_KEY; @@ -3618,3 +3618,104 @@ ); } #endif + +/* + * Function passed to do_cmdline() to get the command after a key from + * typeahead. + */ + char_u * +getcmdkeycmd( + int promptc UNUSED, + void *cookie UNUSED, + int indent UNUSED, + getline_opt_T do_concat UNUSED) +{ + garray_T line_ga; + int c1 = -1; + int c2; + int cmod = 0; + int aborted = FALSE; + + ga_init2(&line_ga, 1, 32); + + // no mapping for these characters + no_mapping++; + + got_int = FALSE; + while (c1 != NUL && !aborted) + { + if (ga_grow(&line_ga, 32) != OK) + { + aborted = TRUE; + break; + } + + if (vgetorpeek(FALSE) == NUL) + { + // incomplete is an error, because there is not much the user + // could do in this state. + emsg(_(e_cmd_mapping_must_end_with_cr)); + aborted = TRUE; + break; + } + + // Get one character at a time. + c1 = vgetorpeek(TRUE); + + // Get two extra bytes for special keys + if (c1 == K_SPECIAL) + { + c1 = vgetorpeek(TRUE); + c2 = vgetorpeek(TRUE); + if (c1 == KS_MODIFIER) + { + cmod = c2; + continue; + } + c1 = TO_SPECIAL(c1, c2); + } + if (c1 == Ctrl_V) + { + // CTRL-V is followed by octal, hex or other characters, reverses + // what AppendToRedobuffLit() does. + no_reduce_keys = TRUE; // don't merge modifyOtherKeys + c1 = get_literal(TRUE); + no_reduce_keys = FALSE; + } + + if (got_int) + aborted = TRUE; + else if (c1 == '\r' || c1 == '\n') + c1 = NUL; // end the line + else if (c1 == ESC) + aborted = TRUE; + else if (c1 == K_COMMAND) + { + // give a nicer error message for this special case + emsg(_(e_cmd_mapping_must_end_with_cr_before_second_cmd)); + aborted = TRUE; + } + else if (IS_SPECIAL(c1)) + { + if (c1 == K_SNR) + ga_concat(&line_ga, (char_u *)""); + else + { + semsg(e_cmd_maping_must_not_include_str_key, + get_special_key_name(c1, cmod)); + aborted = TRUE; + } + } + else + ga_append(&line_ga, (char)c1); + + cmod = 0; + } + + no_mapping--; + + if (aborted) + ga_clear(&line_ga); + + return (char_u *)line_ga.ga_data; +} diff -Nru vim-8.2.1913/src/globals.h vim-8.2.2434/src/globals.h --- vim-8.2.1913/src/globals.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/globals.h 2021-01-30 22:05:11.000000000 +0000 @@ -221,7 +221,6 @@ EXTERN int emsg_severe INIT(= FALSE); // use message of next of several // emsg() calls for throw // used by assert_fails() -EXTERN int emsg_assert_fails_used INIT(= FALSE); EXTERN char_u *emsg_assert_fails_msg INIT(= NULL); EXTERN long emsg_assert_fails_lnum INIT(= 0); EXTERN char_u *emsg_assert_fails_context INIT(= NULL); @@ -231,6 +230,10 @@ EXTERN int did_emsg; // set by emsg() when the message // is displayed or thrown #ifdef FEAT_EVAL +EXTERN int did_emsg_def; // set by emsg() when emsg_silent + // is set before calling a function +EXTERN int did_emsg_cumul; // cumulative did_emsg, increased + // when did_emsg is reset. EXTERN int called_vim_beep; // set if vim_beep() is called EXTERN int did_uncaught_emsg; // emsg() was called and did not // cause an exception @@ -287,6 +290,14 @@ // line number in the message source or zero #define SOURCING_LNUM (((estack_T *)exestack.ga_data)[exestack.ga_len - 1].es_lnum) +// Script CTX being sourced or was sourced to define the current function. +EXTERN sctx_T current_sctx +#ifdef FEAT_EVAL + INIT4(0, 0, 0, 0); +#else + INIT(= {0}); +#endif + #ifdef FEAT_EVAL // whether inside compile_def_function() EXTERN int estack_compiling INIT(= FALSE); @@ -389,9 +400,6 @@ EXTERN int want_garbage_collect INIT(= FALSE); EXTERN int garbage_collect_at_exit INIT(= FALSE); -// Script CTX being sourced or was sourced to define the current function. -EXTERN sctx_T current_sctx INIT4(0, 0, 0, 0); - // Commonly used types. EXTERN type_T t_unknown INIT6(VAR_UNKNOWN, 0, 0, TTFLAG_STATIC, NULL, NULL); @@ -400,6 +408,7 @@ EXTERN type_T t_bool INIT6(VAR_BOOL, 0, 0, TTFLAG_STATIC, NULL, NULL); EXTERN type_T t_special INIT6(VAR_SPECIAL, 0, 0, TTFLAG_STATIC, NULL, NULL); EXTERN type_T t_number INIT6(VAR_NUMBER, 0, 0, TTFLAG_STATIC, NULL, NULL); +EXTERN type_T t_number_bool INIT6(VAR_NUMBER, 0, 0, TTFLAG_STATIC|TTFLAG_BOOL_OK, NULL, NULL); EXTERN type_T t_float INIT6(VAR_FLOAT, 0, 0, TTFLAG_STATIC, NULL, NULL); EXTERN type_T t_string INIT6(VAR_STRING, 0, 0, TTFLAG_STATIC, NULL, NULL); EXTERN type_T t_blob INIT6(VAR_BLOB, 0, 0, TTFLAG_STATIC, NULL, NULL); @@ -424,6 +433,7 @@ EXTERN type_T t_list_bool INIT6(VAR_LIST, 0, 0, TTFLAG_STATIC, &t_bool, NULL); EXTERN type_T t_list_number INIT6(VAR_LIST, 0, 0, TTFLAG_STATIC, &t_number, NULL); EXTERN type_T t_list_string INIT6(VAR_LIST, 0, 0, TTFLAG_STATIC, &t_string, NULL); +EXTERN type_T t_list_job INIT6(VAR_LIST, 0, 0, TTFLAG_STATIC, &t_job, NULL); EXTERN type_T t_list_dict_any INIT6(VAR_LIST, 0, 0, TTFLAG_STATIC, &t_dict_any, NULL); EXTERN type_T t_dict_bool INIT6(VAR_DICT, 0, 0, TTFLAG_STATIC, &t_bool, NULL); @@ -582,6 +592,12 @@ // ('lines' and 'rows') must not be changed. EXTERN int updating_screen INIT(= FALSE); +#ifdef MESSAGE_QUEUE +// While closing windows or buffers messages should not be handled to avoid +// using invalid windows or buffers. +EXTERN int dont_parse_messages INIT(= FALSE); +#endif + #ifdef FEAT_MENU // The root of the menu hierarchy. EXTERN vimmenu_T *root_menu INIT(= NULL); @@ -1127,9 +1143,15 @@ EXTERN int msg_silent INIT(= 0); // don't print messages EXTERN int emsg_silent INIT(= 0); // don't print error messages +#ifdef FEAT_EVAL +EXTERN int emsg_silent_def INIT(= 0); // value of emsg_silent when a :def + // function is called +#endif EXTERN int emsg_noredir INIT(= 0); // don't redirect error messages EXTERN int cmd_silent INIT(= FALSE); // don't echo the command line +EXTERN int in_assert_fails INIT(= FALSE); // assert_fails() active + EXTERN int swap_exists_action INIT(= SEA_NONE); // For dialog when swap file already // exists. @@ -1698,7 +1720,7 @@ EXTERN char e_toomanyarg[] INIT(= N_("E118: Too many arguments for function: %s")); EXTERN char e_toofewarg[] INIT(= N_("E119: Not enough arguments for function: %s")); EXTERN char e_func_deleted[] INIT(= N_("E933: Function was deleted: %s")); -EXTERN char e_dictkey[] INIT(= N_("E716: Key not present in Dictionary: %s")); +EXTERN char e_dictkey[] INIT(= N_("E716: Key not present in Dictionary: \"%s\"")); EXTERN char e_listreq[] INIT(= N_("E714: List required")); EXTERN char e_listblobreq[] INIT(= N_("E897: List or Blob required")); EXTERN char e_list_end[] INIT(= N_("E697: Missing end of List ']': %s")); @@ -1923,3 +1945,7 @@ #define FOR_ALL_LIST_ITEMS(l, li) \ for ((li) = (l)->lv_first; (li) != NULL; (li) = (li)->li_next) + +// While executing a regexp and set to OPTION_MAGIC_ON or OPTION_MAGIC_OFF this +// overrules p_magic. Otherwise set to OPTION_MAGIC_NOT_SET. +EXTERN optmagic_T magic_overruled INIT(= OPTION_MAGIC_NOT_SET); diff -Nru vim-8.2.1913/src/gui_at_fs.c vim-8.2.2434/src/gui_at_fs.c --- vim-8.2.1913/src/gui_at_fs.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui_at_fs.c 2021-01-30 22:05:11.000000000 +0000 @@ -179,9 +179,9 @@ static void SFdrawList(int n, int doScroll); static void SFclearList(int n, int doScroll); static char SFstatChar(stat_T *statBuf); -static void SFmotionList(Widget w, int n, XMotionEvent *event); +static void SFmotionList(Widget w, XtPointer np, XMotionEvent *event, Boolean *cont); static void SFvSliderMovedCallback(Widget w, int n, int nw); -static Boolean SFworkProc(void); +static Boolean SFworkProc(void *); static int SFcompareEntries(const void *p, const void *q); ////////////////// xstat.h @@ -798,19 +798,22 @@ static void SFbuttonPressList( - Widget w UNUSED, - int n UNUSED, - XButtonPressedEvent *event UNUSED) + Widget w UNUSED, + XtPointer np UNUSED, + XEvent *event UNUSED, + Boolean *cont UNUSED) { SFbuttonPressed = 1; } static void SFbuttonReleaseList( - Widget w, - int n, - XButtonReleasedEvent *event) + Widget w UNUSED, + XtPointer np, + XEvent *event UNUSED, + Boolean *cont UNUSED) { + long n = (long)np; SFDir *dir; SFbuttonPressed = 0; @@ -823,7 +826,7 @@ dir = &(SFdirs[SFdirPtr + n]); SFreplaceText(dir, dir->entries[dir->vOrigin + SFcurrentInvert[n]].shown); - SFmotionList(w, n, (XMotionEvent *) event); + SFmotionList(w, (XtPointer)(long)n, (XMotionEvent *)event, 0); } } @@ -1600,9 +1603,14 @@ } static void -SFenterList(Widget w UNUSED, int n, XEnterWindowEvent *event) +SFenterList( + Widget w UNUSED, + XtPointer np, + XEvent *event, + Boolean *cont UNUSED) { - int nw; + long n = (long)np; + int nw; // sanity if (SFcurrentInvert[n] != -1) @@ -1620,8 +1628,14 @@ } static void -SFleaveList(Widget w UNUSED, int n, XEvent *event UNUSED) +SFleaveList( + Widget w UNUSED, + XtPointer np, + XEvent *event UNUSED, + Boolean *cont UNUSED) { + long n = (long)np; + if (SFcurrentInvert[n] != -1) { SFinvertEntry(n); @@ -1630,8 +1644,13 @@ } static void -SFmotionList(Widget w UNUSED, int n, XMotionEvent *event) +SFmotionList( + Widget w UNUSED, + XtPointer np, + XMotionEvent *event UNUSED, + Boolean *cont UNUSED) { + long n = (long)np; int nw; nw = SFnewInvertEntry(n, event); @@ -1954,7 +1973,7 @@ } static Boolean -SFworkProc(void) +SFworkProc(void *arg UNUSED) { SFDir *dir; SFEntry *entry; diff -Nru vim-8.2.1913/src/gui.c vim-8.2.2434/src/gui.c --- vim-8.2.1913/src/gui.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui.c 2021-01-30 22:05:11.000000000 +0000 @@ -2412,21 +2412,13 @@ if (highlight_mask & (HL_INVERSE | HL_STANDOUT)) { -#if defined(AMIGA) - gui_mch_set_colors(bg_color, fg_color); -#else gui_mch_set_fg_color(bg_color); gui_mch_set_bg_color(fg_color); -#endif } else { -#if defined(AMIGA) - gui_mch_set_colors(fg_color, bg_color); -#else gui_mch_set_fg_color(fg_color); gui_mch_set_bg_color(bg_color); -#endif } gui_mch_set_sp_color(sp_color); diff -Nru vim-8.2.1913/src/gui_dwrite.cpp vim-8.2.2434/src/gui_dwrite.cpp --- vim-8.2.1913/src/gui_dwrite.cpp 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui_dwrite.cpp 2021-01-30 22:05:11.000000000 +0000 @@ -239,7 +239,8 @@ if (mItems[n].pTextFormat != item.pTextFormat) { SafeRelease(&mItems[n].pTextFormat); - item.pTextFormat->AddRef(); + if (item.pTextFormat != NULL) + item.pTextFormat->AddRef(); } mItems[n] = item; slide(n); diff -Nru vim-8.2.1913/src/gui_gtk_vms.h vim-8.2.2434/src/gui_gtk_vms.h --- vim-8.2.1913/src/gui_gtk_vms.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui_gtk_vms.h 2021-01-30 22:05:11.000000000 +0000 @@ -435,6 +435,7 @@ #define XmRemoveProtocolCallback XMREMOVEPROTOCOLCALLBACK #define XmRepTypeGetId XMREPTYPEGETID #define XmRepTypeGetRecord XMREPTYPEGETRECORD +#define XmRepTypeInstallTearOffModelCon XMREPTYPEINSTALLTEAROFFMODELCON #define XmRepTypeRegister XMREPTYPEREGISTER #define XmRepTypeValidValue XMREPTYPEVALIDVALUE #define XmScrollBarSetValues XMSCROLLBARSETVALUES @@ -722,17 +723,6 @@ // R5 or earlier #define _XtRegisterWindow _XTREGISTERWINDOW #define _XtUnregisterWindow _XTUNREGISTERWINDOW -// original code is fixed so we don't need this now -#if 0 -#define XtRegisterDrawable(display,drawable,widget) \ -{ extern void _XtRegisterWindow(Window,Widget); \ - _XtRegisterWindow(drawable,widget); \ -} -#define XtUnregisterDrawable(display,drawable) \ -{ extern void _XtUnregisterWindow(Window,Widget); \ - _XtUnregisterWindow(drawable,XtWindowToWidget(display,drawable)); \ -} -#endif #else // R6 or later #define XtRegisterDrawable XTREGISTERDRAWABLE diff -Nru vim-8.2.1913/src/gui_gtk_x11.c vim-8.2.2434/src/gui_gtk_x11.c --- vim-8.2.1913/src/gui_gtk_x11.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui_gtk_x11.c 2021-01-30 22:05:11.000000000 +0000 @@ -3816,11 +3816,11 @@ #if !GTK_CHECK_VERSION(3,0,0) gtk_widget_set_events(gui.formwin, GDK_EXPOSURE_MASK); #endif - - gui.drawarea = gtk_drawing_area_new(); #if GTK_CHECK_VERSION(3,22,2) - gtk_widget_set_name(gui.drawarea, "vim-gui-drawarea"); + gtk_widget_set_name(gui.formwin, "vim-gtk-form"); #endif + + gui.drawarea = gtk_drawing_area_new(); #if GTK_CHECK_VERSION(3,0,0) gui.surface = NULL; gui.by_signal = FALSE; @@ -4031,18 +4031,21 @@ void gui_mch_new_colors(void) { - if (gui.drawarea != NULL && gtk_widget_get_window(gui.drawarea) != NULL) + if (gui.drawarea != NULL +#if GTK_CHECK_VERSION(3,22,2) + && gui.formwin != NULL +#endif + && gtk_widget_get_window(gui.drawarea) != NULL) { #if !GTK_CHECK_VERSION(3,22,2) GdkWindow * const da_win = gtk_widget_get_window(gui.drawarea); #endif - #if GTK_CHECK_VERSION(3,22,2) - GtkStyleContext * const context - = gtk_widget_get_style_context(gui.drawarea); + GtkStyleContext * const context = + gtk_widget_get_style_context(gui.formwin); GtkCssProvider * const provider = gtk_css_provider_new(); gchar * const css = g_strdup_printf( - "widget#vim-gui-drawarea {\n" + "widget#vim-gtk-form {\n" " background-color: #%.2lx%.2lx%.2lx;\n" "}\n", (gui.back_pixel >> 16) & 0xff, diff -Nru vim-8.2.1913/src/gui.h vim-8.2.2434/src/gui.h --- vim-8.2.1913/src/gui.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui.h 2021-01-30 22:05:11.000000000 +0000 @@ -24,7 +24,8 @@ # ifdef MIN # undef MIN # endif -# endif +# include "gui_gtk_vms.h" +# endif // VMS # include # include #endif diff -Nru vim-8.2.1913/src/gui_haiku.cc vim-8.2.2434/src/gui_haiku.cc --- vim-8.2.1913/src/gui_haiku.cc 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui_haiku.cc 2021-01-30 22:05:11.000000000 +0000 @@ -3411,7 +3411,7 @@ thread_id tid = gui.vimWindow->Thread(); gui.vimWindow->Lock(); gui.vimWindow->Quit(); - // Wait until it is truely gone + // Wait until it is truly gone int32 exitcode; wait_for_thread(tid, &exitcode); } diff -Nru vim-8.2.1913/src/gui_motif.c vim-8.2.2434/src/gui_motif.c --- vim-8.2.1913/src/gui_motif.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui_motif.c 2021-01-30 22:05:11.000000000 +0000 @@ -1242,7 +1242,6 @@ } else { - // Test_colorscheme() if (menu->xpm_fname != NULL) { XtSetArg(args[n], XmNpixmapFile, menu->xpm_fname); n++; @@ -3526,7 +3525,7 @@ char_u *save_cpo = p_cpo; // No need to be Vi compatible here. - p_cpo = (char_u *)""; + p_cpo = empty_option; u_undo(1); p_cpo = save_cpo; gui_update_screen(); diff -Nru vim-8.2.1913/src/gui_w32.c vim-8.2.2434/src/gui_w32.c --- vim-8.2.1913/src/gui_w32.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui_w32.c 2021-01-30 22:05:11.000000000 +0000 @@ -2134,7 +2134,10 @@ break; } else if (input_available() - || MsgWaitForMultipleObjects(0, NULL, FALSE, 100, + // TODO: The 10 msec is a compromise between laggy response + // and consuming more CPU time. Better would be to handle + // channel messages when they arrive. + || MsgWaitForMultipleObjects(0, NULL, FALSE, 10, QS_ALLINPUT) != WAIT_TIMEOUT) break; } @@ -2986,6 +2989,42 @@ } /* + * Check if the specified point is on-screen. (multi-monitor aware) + */ + static BOOL +is_point_onscreen(int x, int y) +{ + POINT pt = {x, y}; + + return MonitorFromPoint(pt, MONITOR_DEFAULTTONULL) != NULL; +} + +/* + * Check if the whole area of the specified window is on-screen. + * + * Note about DirectX: Windows 10 1809 or above no longer maintains image of + * the window portion that is off-screen. Scrolling by DWriteContext_Scroll() + * only works when the whole window is on-screen. + */ + static BOOL +is_window_onscreen(HWND hwnd) +{ + RECT rc; + + GetWindowRect(hwnd, &rc); + + if (!is_point_onscreen(rc.left, rc.top)) + return FALSE; + if (!is_point_onscreen(rc.left, rc.bottom)) + return FALSE; + if (!is_point_onscreen(rc.right, rc.top)) + return FALSE; + if (!is_point_onscreen(rc.right, rc.bottom)) + return FALSE; + return TRUE; +} + +/* * Return flags used for scrolling. * The SW_INVALIDATE is required when part of the window is covered or * off-screen. Refer to MS KB Q75236. @@ -2996,15 +3035,12 @@ HWND hwnd; RECT rcVim, rcOther, rcDest; - GetWindowRect(s_hwnd, &rcVim); - - // Check if the window is partly above or below the screen. We don't care - // about partly left or right of the screen, it is not relevant when - // scrolling up or down. - if (rcVim.top < 0 || rcVim.bottom > GetSystemMetrics(SM_CYFULLSCREEN)) + // Check if the window is (partly) off-screen. + if (!is_window_onscreen(s_hwnd)) return SW_INVALIDATE; // Check if there is an window (partly) on top of us. + GetWindowRect(s_hwnd, &rcVim); for (hwnd = s_hwnd; (hwnd = GetWindow(hwnd, GW_HWNDPREV)) != (HWND)0; ) if (IsWindowVisible(hwnd)) { @@ -3046,14 +3082,17 @@ rc.bottom = FILL_Y(gui.scroll_region_bot + 1); #if defined(FEAT_DIRECTX) - if (IS_ENABLE_DIRECTX()) + if (IS_ENABLE_DIRECTX() && is_window_onscreen(s_hwnd)) { DWriteContext_Scroll(s_dwc, 0, -num_lines * gui.char_height, &rc); - DWriteContext_Flush(s_dwc); } else #endif { +#if defined(FEAT_DIRECTX) + if (IS_ENABLE_DIRECTX()) + DWriteContext_Flush(s_dwc); +#endif intel_gpu_workaround(); ScrollWindowEx(s_textArea, 0, -num_lines * gui.char_height, &rc, &rc, NULL, NULL, get_scroll_flags()); @@ -3088,14 +3127,17 @@ rc.bottom = FILL_Y(gui.scroll_region_bot + 1); #if defined(FEAT_DIRECTX) - if (IS_ENABLE_DIRECTX()) + if (IS_ENABLE_DIRECTX() && is_window_onscreen(s_hwnd)) { DWriteContext_Scroll(s_dwc, 0, num_lines * gui.char_height, &rc); - DWriteContext_Flush(s_dwc); } else #endif { +#if defined(FEAT_DIRECTX) + if (IS_ENABLE_DIRECTX()) + DWriteContext_Flush(s_dwc); +#endif intel_gpu_workaround(); // The SW_INVALIDATE is required when part of the window is covered or // off-screen. How do we avoid it when it's not needed? @@ -8419,7 +8461,7 @@ TOOLINFOW *pti; int ToolInfoSize; - if (multiline_balloon_available() == TRUE) + if (multiline_balloon_available()) ToolInfoSize = sizeof(TOOLINFOW_NEW); else ToolInfoSize = sizeof(TOOLINFOW); @@ -8442,7 +8484,7 @@ pti->hinst = 0; // Don't use string resources pti->uId = ID_BEVAL_TOOLTIP; - if (multiline_balloon_available() == TRUE) + if (multiline_balloon_available()) { RECT rect; TOOLINFOW_NEW *ptin = (TOOLINFOW_NEW *)pti; diff -Nru vim-8.2.1913/src/gui_x11.c vim-8.2.2434/src/gui_x11.c --- vim-8.2.1913/src/gui_x11.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui_x11.c 2021-01-30 22:05:11.000000000 +0000 @@ -95,8 +95,8 @@ * normal font (current_fontset == NULL, use gui.text_gc and gui.back_gc). */ static XFontSet current_fontset = NULL; - -#define XDrawString(dpy, win, gc, x, y, str, n) \ +# if !defined(XDrawString) +# define XDrawString(dpy, win, gc, x, y, str, n) \ do \ { \ if (current_fontset != NULL) \ @@ -104,8 +104,9 @@ else \ XDrawString(dpy, win, gc, x, y, str, n); \ } while (0) - -#define XDrawString16(dpy, win, gc, x, y, str, n) \ +# endif +# if !defined(XDrawString16) +# define XDrawString16(dpy, win, gc, x, y, str, n) \ do \ { \ if (current_fontset != NULL) \ @@ -113,8 +114,9 @@ else \ XDrawString16(dpy, win, gc, x, y, (XChar2b *)str, n); \ } while (0) - -#define XDrawImageString16(dpy, win, gc, x, y, str, n) \ +# endif +# if !defined(XDrawImageString16) +# define XDrawImageString16(dpy, win, gc, x, y, str, n) \ do \ { \ if (current_fontset != NULL) \ @@ -122,7 +124,7 @@ else \ XDrawImageString16(dpy, win, gc, x, y, (XChar2b *)str, n); \ } while (0) - +# endif static int check_fontset_sanity(XFontSet fs); static int fontset_width(XFontSet fs); static int fontset_ascent(XFontSet fs); diff -Nru vim-8.2.1913/src/gui_xmdlg.c vim-8.2.2434/src/gui_xmdlg.c --- vim-8.2.1913/src/gui_xmdlg.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui_xmdlg.c 2021-01-30 22:05:11.000000000 +0000 @@ -497,7 +497,7 @@ } /* - * Now loop trough the remaining lists and set them up. + * Now loop through the remaining lists and set them up. */ for (idx = (int)NAME; idx < (int)NONE; ++idx) { diff -Nru vim-8.2.1913/src/gui_xmebw.c vim-8.2.2434/src/gui_xmebw.c --- vim-8.2.1913/src/gui_xmebw.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/gui_xmebw.c 2021-01-30 22:05:11.000000000 +0000 @@ -69,6 +69,20 @@ _XmDrawHighlight(a, b, c, d, e, f, g, h, LineSolid) #endif +// Older VMS systems do not have xos_r.h and cannot haldle XtProcessLocking +#if defined(VMS) +# if defined(HAVE_XOS_R_H) +# define XTPROCESS_LOCK XtProcessLock() +# define XTPROCESS_UNLOCK XtProcessUnlock() +# else +# define XTPROCESS_LOCK +# define XTPROCESS_UNLOCK +# endif +#else +# define XTPROCESS_LOCK XtProcessLock() +# define XTPROCESS_UNLOCK XtProcessUnlock() +#endif + /* * Motif internals we have to cheat around with. */ @@ -714,9 +728,9 @@ { XtExposeProc expose; - XtProcessLock(); + XTPROCESS_LOCK; expose = xmLabelClassRec.core_class.expose; - XtProcessUnlock(); + XTPROCESS_UNLOCK; (*expose)((Widget) eb, event, region); } @@ -809,9 +823,9 @@ _XmPrimitiveEnter((Widget) eb, event, NULL, NULL); if (eb->pushbutton.armed == TRUE) { - XtProcessLock(); + XTPROCESS_LOCK; expose = XtClass(eb)->core_class.expose; - XtProcessUnlock(); + XTPROCESS_UNLOCK; (*expose) (wid, event, (Region) NULL); } @@ -887,9 +901,9 @@ { XtExposeProc expose; eb->pushbutton.armed = FALSE; - XtProcessLock(); + XTPROCESS_LOCK; expose = XtClass(eb)->core_class.expose; - XtProcessUnlock(); + XTPROCESS_UNLOCK; (*expose) (wid, event, (Region)NULL); draw_unhighlight(eb); draw_pixmap(eb, event, NULL); @@ -973,9 +987,9 @@ // Invoke Label's Resize procedure. { XtWidgetProc resize; - XtProcessLock(); + XTPROCESS_LOCK; resize = xmLabelClassRec.core_class.resize; - XtProcessUnlock(); + XTPROCESS_UNLOCK; (* resize) ((Widget) newtb); } @@ -988,9 +1002,9 @@ XmEnhancedButtonWidget eb = (XmEnhancedButtonWidget)ebw; XtWidgetProc resize; - XtProcessLock(); + XTPROCESS_LOCK; resize = xmLabelClassRec.core_class.resize; - XtProcessUnlock(); + XTPROCESS_UNLOCK; // Create a bitmap for stippling (Drawable resources are cheap). if (STIPPLE_BITMAP == None) diff -Nru vim-8.2.1913/src/GvimExt/gvimext.cpp vim-8.2.2434/src/GvimExt/gvimext.cpp --- vim-8.2.1913/src/GvimExt/gvimext.cpp 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/GvimExt/gvimext.cpp 2021-01-30 22:05:11.000000000 +0000 @@ -161,7 +161,6 @@ static int dyn_libintl_init(char *dir); static void dyn_libintl_end(void); -static wchar_t *oldenv = NULL; static HINSTANCE hLibintlDLL = 0; static char *(*dyn_libintl_gettext)(const char *) = null_libintl_gettext; static char *(*dyn_libintl_textdomain)(const char *) = null_libintl_textdomain; @@ -205,17 +204,17 @@ if (buf != NULL && buf2 != NULL) { GetEnvironmentVariableW(L"PATH", buf, len); -#ifdef _WIN64 +# ifdef _WIN64 _snwprintf(buf2, len2, L"%S\\GvimExt64;%s", dir, buf); -#else +# else _snwprintf(buf2, len2, L"%S\\GvimExt32;%s", dir, buf); -#endif +# endif SetEnvironmentVariableW(L"PATH", buf2); hLibintlDLL = LoadLibrary(GETTEXT_DLL); -#ifdef GETTEXT_DLL_ALT +# ifdef GETTEXT_DLL_ALT if (!hLibintlDLL) hLibintlDLL = LoadLibrary(GETTEXT_DLL_ALT); -#endif +# endif SetEnvironmentVariableW(L"PATH", buf); } free(buf); @@ -273,56 +272,7 @@ dyn_gettext_load(void) { char szBuff[BUFSIZE]; - char szLang[BUFSIZE]; DWORD len; - HKEY keyhandle; - int gotlang = 0; - - strcpy(szLang, "LANG="); - - // First try getting the language from the registry, this can be - // used to overrule the system language. - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Vim\\Gvim", 0, - KEY_READ, &keyhandle) == ERROR_SUCCESS) - { - len = BUFSIZE; - if (RegQueryValueEx(keyhandle, "lang", 0, NULL, (BYTE*)szBuff, &len) - == ERROR_SUCCESS) - { - szBuff[len] = 0; - strcat(szLang, szBuff); - gotlang = 1; - } - RegCloseKey(keyhandle); - } - - if (!gotlang && getenv("LANG") == NULL) - { - // Get the language from the system. - // Could use LOCALE_SISO639LANGNAME, but it's not in Win95. - // LOCALE_SABBREVLANGNAME gives us three letters, like "enu", we use - // only the first two. - len = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, - (LPTSTR)szBuff, BUFSIZE); - if (len >= 2 && _strnicmp(szBuff, "en", 2) != 0) - { - // There are a few exceptions (probably more) - if (_strnicmp(szBuff, "cht", 3) == 0 - || _strnicmp(szBuff, "zht", 3) == 0) - strcpy(szBuff, "zh_TW"); - else if (_strnicmp(szBuff, "chs", 3) == 0 - || _strnicmp(szBuff, "zhc", 3) == 0) - strcpy(szBuff, "zh_CN"); - else if (_strnicmp(szBuff, "jp", 2) == 0) - strcpy(szBuff, "ja"); - else - szBuff[2] = 0; // truncate to two-letter code - strcat(szLang, szBuff); - gotlang = 1; - } - } - if (gotlang) - putenv(szLang); // Try to locate the runtime files. The path is used to find libintl.dll // and the vim.mo files. @@ -378,10 +328,8 @@ inc_cRefThisDLL() { #ifdef FEAT_GETTEXT - if (g_cRefThisDll == 0) { + if (g_cRefThisDll == 0) dyn_gettext_load(); - oldenv = GetEnvironmentStringsW(); - } #endif InterlockedIncrement((LPLONG)&g_cRefThisDll); } @@ -390,13 +338,8 @@ dec_cRefThisDLL() { #ifdef FEAT_GETTEXT - if (InterlockedDecrement((LPLONG)&g_cRefThisDll) == 0) { + if (InterlockedDecrement((LPLONG)&g_cRefThisDll) == 0) dyn_gettext_free(); - if (oldenv != NULL) { - FreeEnvironmentStringsW(oldenv); - oldenv = NULL; - } - } #else InterlockedDecrement((LPLONG)&g_cRefThisDll); #endif @@ -967,8 +910,8 @@ NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. - oldenv == NULL ? 0 : CREATE_UNICODE_ENVIRONMENT, - oldenv, // Use unmodified environment block. + 0, // No creation flags. + NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. &pi) // Pointer to PROCESS_INFORMATION structure. @@ -1057,8 +1000,8 @@ NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. - oldenv == NULL ? 0 : CREATE_UNICODE_ENVIRONMENT, - oldenv, // Use unmodified environment block. + 0, // No creation flags. + NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. &pi) // Pointer to PROCESS_INFORMATION structure. diff -Nru vim-8.2.1913/src/GvimExt/Make_ming.mak vim-8.2.2434/src/GvimExt/Make_ming.mak --- vim-8.2.1913/src/GvimExt/Make_ming.mak 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/GvimExt/Make_ming.mak 2021-01-30 22:05:11.000000000 +0000 @@ -49,8 +49,8 @@ endif CXX := $(CROSS_COMPILE)g++ WINDRES := $(CROSS_COMPILE)windres -WINDRES_CXX = $(CXX) -WINDRES_FLAGS = --preprocessor="$(WINDRES_CXX) -E -xc" -DRC_INVOKED +# this used to have --preprocessor, but it's no longer supported +WINDRES_FLAGS = LIBS := -luuid -lgdi32 RES := gvimext.res DEFFILE = gvimext_ming.def diff -Nru vim-8.2.1913/src/help.c vim-8.2.2434/src/help.c --- vim-8.2.1913/src/help.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/help.c 2021-01-30 22:05:11.000000000 +0000 @@ -325,7 +325,7 @@ char_u *s, *d; int i; // Specific tags that either have a specific replacement or won't go - // throught the generic rules. + // through the generic rules. static char *(except_tbl[][2]) = { {"*", "star"}, {"g*", "gstar"}, @@ -647,6 +647,8 @@ // Always set these options after jumping to a help tag, because the // user may have an autocommand that gets in the way. + // When adding an option here, also update the help file helphelp.txt. + // Accept all ASCII chars for keywords, except ' ', '*', '"', '|', and // latin1 word characters (for translated help files). // Only set it when needed, buf_init_chartab() is some work. diff -Nru vim-8.2.1913/src/if_mzsch.c vim-8.2.2434/src/if_mzsch.c --- vim-8.2.1913/src/if_mzsch.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/if_mzsch.c 2021-01-30 22:05:11.000000000 +0000 @@ -1712,7 +1712,7 @@ Vim_Prim *prim = (Vim_Prim *)data; long value; char *strval; - int rc; + getoption_T rc; Scheme_Object *rval = NULL; Scheme_Object *name = NULL; int opt_flags = 0; @@ -1754,27 +1754,30 @@ scheme_wrong_type(prim->name, "vim-buffer/window", 1, argc, argv); } - rc = get_option_value(BYTE_STRING_VALUE(name), &value, (char_u **)&strval, opt_flags); + rc = get_option_value(BYTE_STRING_VALUE(name), &value, (char_u **)&strval, + opt_flags); curbuf = save_curb; curwin = save_curw; switch (rc) { - case 1: + case gov_bool: + case gov_number: MZ_GC_UNREG(); return scheme_make_integer_value(value); - case 0: + case gov_string: rval = scheme_make_byte_string(strval); MZ_GC_CHECK(); vim_free(strval); MZ_GC_UNREG(); return rval; - case -1: - case -2: + case gov_hidden_bool: + case gov_hidden_number: + case gov_hidden_string: MZ_GC_UNREG(); raise_vim_exn(_("hidden option")); //NOTREACHED - case -3: + case gov_unknown: MZ_GC_UNREG(); raise_vim_exn(_("unknown option")); //NOTREACHED diff -Nru vim-8.2.1913/src/if_ole.cpp vim-8.2.2434/src/if_ole.cpp --- vim-8.2.1913/src/if_ole.cpp 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/if_ole.cpp 2021-01-30 22:05:11.000000000 +0000 @@ -635,7 +635,7 @@ LPOLESTR wGUID = NULL; StringFromCLSID(guid, &wGUID); - // Covert from wide characters to non-wide + // Convert from wide characters to non-wide wcstombs(GUID, wGUID, length); // Free memory diff -Nru vim-8.2.1913/src/if_perl.xs vim-8.2.2434/src/if_perl.xs --- vim-8.2.1913/src/if_perl.xs 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/if_perl.xs 2021-01-30 22:05:11.000000000 +0000 @@ -44,12 +44,13 @@ # define PERL_NO_INLINE_FUNCTIONS #endif -/* Work around for using MSVC and ActivePerl 5.18. */ #ifdef _MSC_VER +// Work around for using MSVC and ActivePerl 5.18. # define __inline__ __inline - // Work around for using MSVC and Strawberry Perl 5.30. # define __builtin_expect(expr, val) (expr) +// Work around for using MSVC and Strawberry Perl 5.32. +# define NO_THREAD_SAFE_LOCALE #endif #ifdef __GNUC__ diff -Nru vim-8.2.1913/src/if_py_both.h vim-8.2.2434/src/if_py_both.h --- vim-8.2.1913/src/if_py_both.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/if_py_both.h 2021-01-30 22:05:11.000000000 +0000 @@ -130,10 +130,11 @@ { PyObject *bytes; - if (!(bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, NULL))) + if (!(bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, + ERRORS_ENCODE_ARG))) return NULL; - if(PyBytes_AsStringAndSize(bytes, (char **) &str, NULL) == -1 + if (PyBytes_AsStringAndSize(bytes, (char **) &str, NULL) == -1 || str == NULL) { Py_DECREF(bytes); @@ -4243,7 +4244,8 @@ } else if (PyUnicode_Check(obj)) { - if (!(bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, NULL))) + if (!(bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, + ERRORS_ENCODE_ARG))) return NULL; if (PyBytes_AsStringAndSize(bytes, &str, &len) == -1 @@ -6290,11 +6292,11 @@ PyObject *bytes; char_u *str; - bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, NULL); + bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, ERRORS_ENCODE_ARG); if (bytes == NULL) return -1; - if(PyBytes_AsStringAndSize(bytes, (char **) &str, NULL) == -1) + if (PyBytes_AsStringAndSize(bytes, (char **) &str, NULL) == -1) return -1; if (str == NULL) return -1; diff -Nru vim-8.2.1913/src/if_python3.c vim-8.2.2434/src/if_python3.c --- vim-8.2.1913/src/if_python3.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/if_python3.c 2021-01-30 22:05:11.000000000 +0000 @@ -81,12 +81,15 @@ // Python 3 does not support CObjects, always use Capsules #define PY_USE_CAPSULE +#define ERRORS_DECODE_ARG CODEC_ERROR_HANDLER +#define ERRORS_ENCODE_ARG ERRORS_DECODE_ARG + #define PyInt Py_ssize_t #ifndef PyString_Check # define PyString_Check(obj) PyUnicode_Check(obj) #endif #define PyString_FromString(repr) \ - PyUnicode_Decode(repr, STRLEN(repr), ENC_OPT, NULL) + PyUnicode_Decode(repr, STRLEN(repr), ENC_OPT, ERRORS_DECODE_ARG) #define PyString_FromFormat PyUnicode_FromFormat #ifndef PyInt_Check # define PyInt_Check(obj) PyLong_Check(obj) @@ -668,6 +671,65 @@ # define PyType_HasFeature(t,f) py3_PyType_HasFeature(t,f) # endif +# ifdef MSWIN +/* + * Look up the library "libname" using the InstallPath registry key. + * Return NULL when failed. Return an allocated string when successful. + */ + static char * +py3_get_system_libname(const char *libname) +{ + const char *cp = libname; + char subkey[128]; + HKEY hKey; + char installpath[MAXPATHL]; + LONG len = sizeof(installpath); + LSTATUS rc; + size_t sysliblen; + char *syslibname; + + while (*cp != '\0') + { + if (*cp == ':' || *cp == '\\' || *cp == '/') + { + // Bail out if "libname" contains path separator, assume it is + // an absolute path. + return NULL; + } + ++cp; + } + vim_snprintf(subkey, sizeof(subkey), +# ifdef _WIN64 + "Software\\Python\\PythonCore\\%d.%d\\InstallPath", +# else + "Software\\Python\\PythonCore\\%d.%d-32\\InstallPath", +# endif + PY_MAJOR_VERSION, PY_MINOR_VERSION); + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, subkey, 0, KEY_QUERY_VALUE, &hKey) + != ERROR_SUCCESS) + return NULL; + rc = RegQueryValueA(hKey, NULL, installpath, &len); + RegCloseKey(hKey); + if (ERROR_SUCCESS != rc) + return NULL; + cp = installpath + len; + // Just in case registry value contains null terminators. + while (cp > installpath && *(cp-1) == '\0') + --cp; + // Remove trailing path separators. + while (cp > installpath && (*(cp-1) == '\\' || *(cp-1) == '/')) + --cp; + // Ignore if InstallPath is effectively empty. + if (cp <= installpath) + return NULL; + sysliblen = (cp - installpath) + 1 + STRLEN(libname) + 1; + syslibname = alloc(sysliblen); + vim_snprintf(syslibname, sysliblen, "%.*s\\%s", + (int)(cp - installpath), installpath, libname); + return syslibname; +} +# endif + /* * Load library and get all pointers. * Parameter 'libname' provides name of DLL. @@ -698,6 +760,20 @@ return OK; hinstPy3 = load_dll(libname); +# ifdef MSWIN + if (!hinstPy3) + { + // Attempt to use the path from InstallPath as stored in the registry. + char *syslibname = py3_get_system_libname(libname); + + if (syslibname != NULL) + { + hinstPy3 = load_dll(syslibname); + vim_free(syslibname); + } + } +# endif + if (!hinstPy3) { if (verbose) @@ -1088,8 +1164,8 @@ // PyRun_SimpleString expects a UTF-8 string. Wrong encoding may cause // SyntaxError (unicode error). cmdstr = PyUnicode_Decode(cmd, strlen(cmd), - (char *)ENC_OPT, CODEC_ERROR_HANDLER); - cmdbytes = PyUnicode_AsEncodedString(cmdstr, "utf-8", CODEC_ERROR_HANDLER); + (char *)ENC_OPT, ERRORS_DECODE_ARG); + cmdbytes = PyUnicode_AsEncodedString(cmdstr, "utf-8", ERRORS_ENCODE_ARG); Py_XDECREF(cmdstr); run(PyBytes_AsString(cmdbytes), arg, &pygilstate); @@ -1745,7 +1821,7 @@ } *p = '\0'; - result = PyUnicode_Decode(tmp, len, (char *)ENC_OPT, CODEC_ERROR_HANDLER); + result = PyUnicode_Decode(tmp, len, (char *)ENC_OPT, ERRORS_DECODE_ARG); vim_free(tmp); return result; diff -Nru vim-8.2.1913/src/if_python.c vim-8.2.2434/src/if_python.c --- vim-8.2.1913/src/if_python.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/if_python.c 2021-01-30 22:05:11.000000000 +0000 @@ -69,6 +69,10 @@ # undef PY_SSIZE_T_CLEAN #endif +// these are NULL for Python 2 +#define ERRORS_DECODE_ARG NULL +#define ERRORS_ENCODE_ARG ERRORS_DECODE_ARG + #undef main // Defined in python.h - aargh #undef HAVE_FCNTL_H // Clash with os_win32.h diff -Nru vim-8.2.1913/src/if_ruby.c vim-8.2.2434/src/if_ruby.c --- vim-8.2.1913/src/if_ruby.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/if_ruby.c 2021-01-30 22:05:11.000000000 +0000 @@ -32,8 +32,9 @@ # define RUBYEXTERN extern #endif -#if defined(DYNAMIC_RUBY) && RUBY_VERSION >= 24 -# define USE_RUBY_INTEGER +// suggested by Ariya Mizutani +#if (_MSC_VER == 1200) +# undef _WIN32_WINNT #endif #ifdef DYNAMIC_RUBY @@ -42,6 +43,10 @@ * definition. This function use these variables. But we want function to * use dll_* variables. */ +# if RUBY_VERSION >= 24 +# define USE_RUBY_INTEGER +# endif + # define rb_cFalseClass (*dll_rb_cFalseClass) # define rb_cFixnum (*dll_rb_cFixnum) # if defined(USE_RUBY_INTEGER) @@ -54,6 +59,7 @@ # define rb_cString (*dll_rb_cString) # define rb_cSymbol (*dll_rb_cSymbol) # define rb_cTrueClass (*dll_rb_cTrueClass) + # if RUBY_VERSION >= 18 /* * On ver 1.8, all Ruby functions are exported with "__declspec(dllimport)" @@ -64,40 +70,41 @@ # define RUBY_EXPORT # endif -#endif // ifdef DYNAMIC_RUBY - -// suggested by Ariya Mizutani -#if (_MSC_VER == 1200) -# undef _WIN32_WINNT -#endif - -#if defined(DYNAMIC_RUBY) && RUBY_VERSION >= 19 +# if RUBY_VERSION >= 19 // Ruby 1.9 defines a number of static functions which use rb_num2long and // rb_int2big -# define rb_num2long rb_num2long_stub -# define rb_int2big rb_int2big_stub -#endif +# define rb_num2long rb_num2long_stub +# define rb_int2big rb_int2big_stub -#if defined(DYNAMIC_RUBY) && RUBY_VERSION >= 19 \ - && VIM_SIZEOF_INT < VIM_SIZEOF_LONG +# if RUBY_VERSION >= 30 || VIM_SIZEOF_INT < VIM_SIZEOF_LONG // Ruby 1.9 defines a number of static functions which use rb_fix2int and // rb_num2int if VIM_SIZEOF_INT < VIM_SIZEOF_LONG (64bit) -# define rb_fix2int rb_fix2int_stub -# define rb_num2int rb_num2int_stub -#endif +# define rb_fix2int rb_fix2int_stub +# define rb_num2int rb_num2int_stub +# endif +# endif -#if defined(DYNAMIC_RUBY) && RUBY_VERSION == 21 +# if RUBY_VERSION == 21 // Ruby 2.1 adds new GC called RGenGC and RARRAY_PTR uses // rb_gc_writebarrier_unprotect_promoted if USE_RGENGC -# define rb_gc_writebarrier_unprotect_promoted rb_gc_writebarrier_unprotect_promoted_stub -#endif -#if defined(DYNAMIC_RUBY) && RUBY_VERSION >= 22 -# define rb_gc_writebarrier_unprotect rb_gc_writebarrier_unprotect_stub -#endif +# define rb_gc_writebarrier_unprotect_promoted rb_gc_writebarrier_unprotect_promoted_stub +# endif -#if defined(DYNAMIC_RUBY) && RUBY_VERSION >= 26 -# define rb_ary_detransient rb_ary_detransient_stub -#endif +# if RUBY_VERSION >= 22 +# define rb_gc_writebarrier_unprotect rb_gc_writebarrier_unprotect_stub +# endif + +# if RUBY_VERSION >= 26 +# define rb_ary_detransient rb_ary_detransient_stub +# endif + +# if RUBY_VERSION >= 30 +# define rb_check_type rb_check_type_stub +# define rb_num2uint rb_num2uint_stub +# define ruby_malloc_size_overflow ruby_malloc_size_overflow_stub +# endif + +#endif // ifdef DYNAMIC_RUBY // On macOS pre-installed Ruby defines "SIZEOF_TIME_T" as "SIZEOF_LONG" so it // conflicts with the definition in config.h then causes a macro-redefined @@ -232,7 +239,9 @@ # define rb_assoc_new dll_rb_assoc_new # define rb_cObject (*dll_rb_cObject) # define rb_class_new_instance dll_rb_class_new_instance -# define rb_check_type dll_rb_check_type +# if RUBY_VERSION < 30 +# define rb_check_type dll_rb_check_type +# endif # ifdef USE_TYPEDDATA # define rb_check_typeddata dll_rb_check_typeddata # endif @@ -283,7 +292,9 @@ # define rb_fix2int dll_rb_fix2int # define rb_num2int dll_rb_num2int # endif -# define rb_num2uint dll_rb_num2uint +# if RUBY_VERSION < 30 +# define rb_num2uint dll_rb_num2uint +# endif # endif # define rb_num2dbl dll_rb_num2dbl # define rb_lastline_get dll_rb_lastline_get @@ -501,7 +512,7 @@ static VALUE (*dll_rb_enc_str_new) (const char*, long, rb_encoding*); static VALUE (*dll_rb_sprintf) (const char*, ...); static VALUE (*dll_rb_require) (const char*); -static void* (*ruby_options)(int, char**); +static void* (*dll_ruby_options)(int, char**); # endif # if defined(USE_RGENGC) && USE_RGENGC @@ -512,28 +523,38 @@ # endif # endif -# if (RUBY_VERSION >= 19) && !defined(PROTO) -# if RUBY_VERSION >= 22 +# if RUBY_VERSION >= 30 +NORETURN(static void (*dll_ruby_malloc_size_overflow)(size_t, size_t)); +# endif + +# if RUBY_VERSION >= 26 +void rb_ary_detransient_stub(VALUE x); +# endif + +// Do not generate a prototype here, VALUE isn't always defined. +# ifndef PROTO +# if RUBY_VERSION >= 19 +# if RUBY_VERSION >= 22 long rb_num2long_stub(VALUE x) -# else +# else SIGNED_VALUE rb_num2long_stub(VALUE x) -# endif +# endif { return dll_rb_num2long(x); } -# if RUBY_VERSION >= 26 +# if RUBY_VERSION >= 26 VALUE rb_int2big_stub(intptr_t x) -# else +# else VALUE rb_int2big_stub(SIGNED_VALUE x) -# endif +# endif { return dll_rb_int2big(x); } -# if (RUBY_VERSION >= 19) && (VIM_SIZEOF_INT < VIM_SIZEOF_LONG) +# if VIM_SIZEOF_INT < VIM_SIZEOF_LONG long rb_fix2int_stub(VALUE x) { @@ -544,50 +565,67 @@ { return dll_rb_num2int(x); } -# endif -# if RUBY_VERSION >= 20 +# endif +# if RUBY_VERSION >= 20 VALUE rb_float_new_in_heap(double d) { return dll_rb_float_new(d); } -# if RUBY_VERSION >= 22 +# if RUBY_VERSION >= 22 unsigned long rb_num2ulong(VALUE x) -# else +# else VALUE rb_num2ulong(VALUE x) -# endif +# endif { return (long)RSHIFT((SIGNED_VALUE)(x),1); } +# endif # endif -# endif - - // Do not generate a prototype here, VALUE isn't always defined. -# if defined(USE_RGENGC) && USE_RGENGC && !defined(PROTO) -# if RUBY_VERSION == 21 +# if defined(USE_RGENGC) && USE_RGENGC +# if RUBY_VERSION == 21 void rb_gc_writebarrier_unprotect_promoted_stub(VALUE obj) { dll_rb_gc_writebarrier_unprotect_promoted(obj); } -# else +# else void rb_gc_writebarrier_unprotect_stub(VALUE obj) { dll_rb_gc_writebarrier_unprotect(obj); } +# endif # endif -# endif - -# if RUBY_VERSION >= 26 +# if RUBY_VERSION >= 26 void rb_ary_detransient_stub(VALUE x) { dll_rb_ary_detransient(x); } -# endif +# endif +# if RUBY_VERSION >= 30 + void +rb_check_type_stub(VALUE obj, int t) +{ + dll_rb_check_type(obj, t); +} +# if VIM_SIZEOF_INT < VIM_SIZEOF_LONG // 64 bits only + unsigned long +rb_num2uint_stub(VALUE x) +{ + return dll_rb_num2uint(x); +} +# endif + void +ruby_malloc_size_overflow_stub(size_t x, size_t y) +{ + dll_ruby_malloc_size_overflow(x, y); +} +# endif +# endif // ifndef PROTO static HINSTANCE hinstRuby = NULL; // Instance of ruby.dll @@ -744,6 +782,9 @@ {"rb_gc_writebarrier_unprotect", (RUBY_PROC*)&dll_rb_gc_writebarrier_unprotect}, # endif # endif +# if RUBY_VERSION >= 30 + {"ruby_malloc_size_overflow", (RUBY_PROC*)&dll_ruby_malloc_size_overflow}, +# endif {"", NULL}, }; @@ -826,13 +867,11 @@ vim_str2rb_enc_str(const char *s) { #if RUBY_VERSION >= 19 - int isnum; long lval; char_u *sval; rb_encoding *enc; - isnum = get_option_value((char_u *)"enc", &lval, &sval, 0); - if (isnum == 0) + if (get_option_value((char_u *)"enc", &lval, &sval, 0) == gov_string) { enc = rb_enc_find((char *)sval); vim_free(sval); @@ -847,14 +886,12 @@ eval_enc_string_protect(const char *str, int *state) { #if RUBY_VERSION >= 19 - int isnum; long lval; char_u *sval; rb_encoding *enc; VALUE v; - isnum = get_option_value((char_u *)"enc", &lval, &sval, 0); - if (isnum == 0) + if (get_option_value((char_u *)"enc", &lval, &sval, 0) == gov_string) { enc = rb_enc_find((char *)sval); vim_free(sval); @@ -1300,13 +1337,19 @@ } static VALUE -buffer_s_current(void) +buffer_s_current(VALUE self UNUSED) +{ + return buffer_new(curbuf); +} + + static VALUE +buffer_s_current_getter(ID id UNUSED, VALUE *x UNUSED) { return buffer_new(curbuf); } static VALUE -buffer_s_count(void) +buffer_s_count(VALUE self UNUSED) { buf_T *b; int n = 0; @@ -1566,7 +1609,13 @@ } static VALUE -window_s_current(void) +window_s_current(VALUE self UNUSED) +{ + return window_new(curwin); +} + + static VALUE +window_s_current_getter(ID id UNUSED, VALUE *x UNUSED) { return window_new(curwin); } @@ -1576,7 +1625,7 @@ * SegPhault - 03/07/05 */ static VALUE -line_s_current(void) +line_s_current(VALUE self UNUSED) { return get_buffer_line(curbuf, curwin->w_cursor.lnum); } @@ -1588,13 +1637,13 @@ } static VALUE -current_line_number(void) +current_line_number(VALUE self UNUSED) { return INT2FIX((int)curwin->w_cursor.lnum); } static VALUE -window_s_count(void) +window_s_count(VALUE self UNUSED) { win_T *w; int n = 0; @@ -1794,8 +1843,8 @@ rb_define_method(cVimWindow, "cursor", window_cursor, 0); rb_define_method(cVimWindow, "cursor=", window_set_cursor, 1); - rb_define_virtual_variable("$curbuf", buffer_s_current, 0); - rb_define_virtual_variable("$curwin", window_s_current, 0); + rb_define_virtual_variable("$curbuf", buffer_s_current_getter, 0); + rb_define_virtual_variable("$curwin", window_s_current_getter, 0); } void @@ -1811,7 +1860,7 @@ dict_T *d = (dict_T *)arg; dictitem_T *di; - di = dictitem_alloc((char_u *)RSTRING_PTR(RSTRING(rb_obj_as_string(key)))); + di = dictitem_alloc((char_u *)RSTRING_PTR(rb_obj_as_string(key))); if (di == NULL || ruby_convert_to_vim_value(val, &di->di_tv) != OK || dict_add(d, di) != OK) { diff -Nru vim-8.2.1913/src/if_tcl.c vim-8.2.2434/src/if_tcl.c --- vim-8.2.1913/src/if_tcl.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/if_tcl.c 2021-01-30 22:05:11.000000000 +0000 @@ -1281,7 +1281,7 @@ { int err, nobjs, idx; char_u *option; - int isnum; + getoption_T gov; long lval; char_u *sval; Tcl_Obj *resobj; @@ -1298,15 +1298,16 @@ option = (char_u *)Tcl_GetStringFromObj(objv[objn], NULL); ++objn; - isnum = get_option_value(option, &lval, &sval, 0); + gov = get_option_value(option, &lval, &sval, 0); err = TCL_OK; - switch (isnum) + switch (gov) { - case 0: + case gov_string: Tcl_SetResult(interp, (char *)sval, TCL_VOLATILE); vim_free(sval); break; - case 1: + case gov_bool: + case gov_number: resobj = Tcl_NewLongObj(lval); Tcl_SetObjResult(interp, resobj); break; @@ -1316,7 +1317,7 @@ } if (nobjs == 2) { - if (isnum) + if (gov != gov_string) { sval = NULL; // avoid compiler warning err = Tcl_GetIndexFromObj(interp, objv[objn], optkw, "", 0, &idx); @@ -1326,17 +1327,19 @@ err = Tcl_GetLongFromObj(interp, objv[objn], &lval); } else - switch (idx) { - case OPT_ON: - lval = 1; - break; - case OPT_OFF: - lval = 0; - break; - case OPT_TOGGLE: - lval = !lval; - break; + switch (idx) + { + case OPT_ON: + lval = 1; + break; + case OPT_OFF: + lval = 0; + break; + case OPT_TOGGLE: + lval = !lval; + break; + } } } else diff -Nru vim-8.2.1913/src/insexpand.c vim-8.2.2434/src/insexpand.c --- vim-8.2.1913/src/insexpand.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/insexpand.c 2021-01-30 22:05:11.000000000 +0000 @@ -121,7 +121,6 @@ static char e_hitend[] = N_("Hit end of paragraph"); # ifdef FEAT_COMPL_FUNC -static char e_complwin[] = N_("E839: Completion function changed window"); static char e_compldel[] = N_("E840: Completion function deleted text"); # endif @@ -298,7 +297,7 @@ msg_attr(dict_opt ? _("'dictionary' option is empty") : _("'thesaurus' option is empty"), HL_ATTR(HLF_E)); - if (emsg_silent == 0) + if (emsg_silent == 0 && !in_assert_fails) { vim_beep(BO_COMPL); setcursor(); @@ -1020,7 +1019,7 @@ #if defined(FEAT_EVAL) // Dirty hard-coded hack: remove any matchparen highlighting. - do_cmdline_cmd((char_u *)"if exists('g:loaded_matchparen')|3match none|endif"); + do_cmdline_cmd((char_u *)"if exists('g:loaded_matchparen')|:3match none|endif"); #endif // Update the screen later, before drawing the popup menu over it. @@ -1216,7 +1215,7 @@ } else { - regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp(pat, magic_isset() ? RE_MAGIC : 0); if (regmatch.regprog == NULL) goto theend; } @@ -1298,6 +1297,7 @@ fp = mch_fopen((char *)files[i], "r"); // open dictionary file if (flags != DICT_EXACT) { + msg_hist_off = TRUE; // reset in msg_trunc_attr() vim_snprintf((char *)IObuff, IOSIZE, _("Scanning dictionary: %s"), (char *)files[i]); (void)msg_trunc_attr((char *)IObuff, TRUE, HL_ATTR(HLF_R)); @@ -1822,7 +1822,7 @@ // Ignore end of Select mode mapping and mouse scroll buttons. if (c == K_SELECT || c == K_MOUSEDOWN || c == K_MOUSEUP - || c == K_MOUSELEFT || c == K_MOUSERIGHT) + || c == K_MOUSELEFT || c == K_MOUSERIGHT || c == K_COMMAND) return retval; #ifdef FEAT_PROP_POPUP @@ -2198,8 +2198,6 @@ typval_T args[3]; char_u *funcname; pos_T pos; - win_T *curwin_save; - buf_T *curbuf_save; typval_T rettv; int save_State = State; @@ -2215,11 +2213,10 @@ args[2].v_type = VAR_UNKNOWN; pos = curwin->w_cursor; - curwin_save = curwin; - curbuf_save = curbuf; - // Lock the text to avoid weird things from happening. Do allow switching - // to another window temporarily. - ++textlock; + // Lock the text to avoid weird things from happening. Also disallow + // switching to another window, it should not be needed and may end up in + // Insert mode in another buffer. + ++textwinlock; // Call a function, which returns a list or dict. if (call_vim_function(funcname, 2, args, &rettv) == OK) @@ -2242,13 +2239,8 @@ break; } } - --textlock; + --textwinlock; - if (curwin_save != curwin || curbuf_save != curbuf) - { - emsg(_(e_complwin)); - goto theend; - } curwin->w_cursor = pos; // restore the cursor position validate_cursor(); if (!EQUAL_POS(curwin->w_cursor, pos)) @@ -2778,6 +2770,7 @@ dict = ins_buf->b_fname; dict_f = DICT_EXACT; } + msg_hist_off = TRUE; // reset in msg_trunc_attr() vim_snprintf((char *)IObuff, IOSIZE, _("Scanning: %s"), ins_buf->b_fname == NULL ? buf_spname(ins_buf) @@ -2812,6 +2805,7 @@ #endif else if (*e_cpt == ']' || *e_cpt == 't') { + msg_hist_off = TRUE; // reset in msg_trunc_attr() type = CTRL_X_TAGS; vim_snprintf((char *)IObuff, IOSIZE, _("Scanning tags.")); (void)msg_trunc_attr((char *)IObuff, TRUE, HL_ATTR(HLF_R)); @@ -3223,7 +3217,7 @@ return -1; if (compl_leader != NULL - && (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT) == 0) + && (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT) == 0) { // Set "compl_shown_match" to the actually shown match, it may differ // when "compl_leader" is used to omit some of the matches. @@ -3423,9 +3417,11 @@ MB_PTR_ADV(s); } } + msg_hist_off = TRUE; vim_snprintf((char *)IObuff, IOSIZE, "%s %s%s", lead, s > compl_shown_match->cp_fname ? "<" : "", s); msg((char *)IObuff); + msg_hist_off = FALSE; redraw_cmdline = FALSE; // don't overwrite! } } @@ -3623,7 +3619,7 @@ // line (probably) wrapped, set compl_startpos to the // first non_blank in the line, if it is not a wordchar // include it to get a better pattern, but then we don't - // want the "\\<" prefix, check it bellow + // want the "\\<" prefix, check it below compl_col = (colnr_T)getwhitecols(line); compl_startpos.col = compl_col; compl_startpos.lnum = curwin->w_cursor.lnum; @@ -3837,8 +3833,6 @@ int col; char_u *funcname; pos_T pos; - win_T *curwin_save; - buf_T *curbuf_save; int save_State = State; // Call 'completefunc' or 'omnifunc' and get pattern length as a @@ -3860,16 +3854,11 @@ args[1].vval.v_string = (char_u *)""; args[2].v_type = VAR_UNKNOWN; pos = curwin->w_cursor; - curwin_save = curwin; - curbuf_save = curbuf; + ++textwinlock; col = call_func_retnr(funcname, 2, args); + --textwinlock; State = save_State; - if (curwin_save != curwin || curbuf_save != curbuf) - { - emsg(_(e_complwin)); - return FAIL; - } curwin->w_cursor = pos; // restore the cursor position validate_cursor(); if (!EQUAL_POS(curwin->w_cursor, pos)) @@ -4105,9 +4094,13 @@ if (edit_submode_extra != NULL) { if (!p_smd) + { + msg_hist_off = TRUE; msg_attr((char *)edit_submode_extra, edit_submode_highl < HLF_COUNT ? HL_ATTR(edit_submode_highl) : 0); + msg_hist_off = FALSE; + } } else msg_clr_cmdline(); // necessary for "noshowmode" @@ -4166,7 +4159,7 @@ break; // FALLTHROUGH case '~': - if (!p_magic) // quote these only if magic is set + if (!magic_isset()) // quote these only if magic is set break; // FALLTHROUGH case '\\': diff -Nru vim-8.2.1913/src/INSTALLmac.txt vim-8.2.2434/src/INSTALLmac.txt --- vim-8.2.1913/src/INSTALLmac.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/INSTALLmac.txt 2021-01-30 22:05:11.000000000 +0000 @@ -3,7 +3,7 @@ This file contains instructions for compiling Vim. If you already have an executable version of Vim, you don't need this. -First, make sure you've installed Xcode or CommandLineToots. If not, open a +First, make sure you've installed Xcode or CommandLineTools. If not, open a terminal and do $ make --version diff -Nru vim-8.2.1913/src/INSTALLpc.txt vim-8.2.2434/src/INSTALLpc.txt --- vim-8.2.1913/src/INSTALLpc.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/INSTALLpc.txt 2021-01-30 22:05:11.000000000 +0000 @@ -264,11 +264,6 @@ "Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1" You don't need the examples and documentation. -If you get an error that Win32.mak can't be found, you have to set the -variable SDK_INCLUDE_DIR. For example, on Windows 10, installation of MSVC -puts include files in the following directory: - set SDK_INCLUDE_DIR=C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include - 2. MSYS2 with MinGW =================== @@ -385,7 +380,7 @@ Once you have downloaded the compiler binaries, unpack them on your hard disk somewhere, and put them on your PATH. Go to the Control Panel, (Performance and Maintenance), System, Advanced, and edit the environment from there. If -you use the standalone MinGW-w64 compiler, the path may depends on your +you use the standalone MinGW-w64 compiler, the path may depend on your installation. If you use msys2 compilers, set your installed paths (normally one of the following): diff -Nru vim-8.2.1913/src/INSTALLvms.txt vim-8.2.2434/src/INSTALLvms.txt --- vim-8.2.1913/src/INSTALLvms.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/INSTALLvms.txt 2021-01-30 22:05:11.000000000 +0000 @@ -9,12 +9,12 @@ If you skip settings described here, then you will get the default Vim behavior as it is documented, which should be fine for most users. -The file "feature.h" can be edited to match your preferences, but this files +The file "feature.h" can be edited to match your preferences, but this file does not describe possibilities hidden in feature.h acrobatics, however -parameters from MAKE_VMS.MMS actively uses and sets up parameters in relation +parameters from MAKE_VMS.MMS actively use and set up parameters in relation with feature.h -More information and case analysis you can found in os_vms.txt +More information and case analysis you can find in os_vms.txt ([runtime.doc]os_vms.txt or :help vms from vim prompt) Contents: @@ -145,7 +145,7 @@ Parameter name : VIM_XIM Description : X Input Method. For entering special languages - like chinese and Japanese. Please define just + like Chinese and Japanese. Please define just one: VIM_XIM or VIM_HANGULIN Options: : YES - Build with support Uncommented - build without support. @@ -210,7 +210,7 @@ XXD.EXE you should change to subdirectory <.CTAGS> or <.XXD> and build them separately. -5.2. In these directories you can found one make file for VMS as well. +5.2. In these directories you can find one make file for VMS as well. Please read the detailed build instructions in the related *.MMS file. 6. Deployment @@ -300,7 +300,7 @@ So far it works just on Alpha and IA64. More information at: http://www.openvms.compaq.com/openvms/products/ips/gtk.html - You need also the OpenVMS Porting Library: + You also need the OpenVMS Porting Library: http://www.openvms.compaq.com/openvms/products/ips/porting.html Source code for GTK and porting library that is used to build @@ -346,7 +346,7 @@ Edit PERL_INC = to point to perl includes directory where is extern.h - Build as usually. + Build as usual. 7.4 PYTHON @@ -358,7 +358,7 @@ python.h is located. Enable Python feature at make_vms.mms with VIM_PYTHON = YES - Build as usually. + Build as usual. 7.5 TCL @@ -371,13 +371,13 @@ Edit TCL_INC = to point to TCL includes directory where is tcl.h - Build as usually. + Build as usual. 8. Notes 8.1. New Compaq C compiler - If you are using Compaq C compiler V6.2 or newer, Informational messages + If you are using Compaq C compiler V6.2 or newer, informational messages of the type QUESTCOMPARE will be displayed. You should ignore those messages ; they are generated only because some test comparisons are done with variables which type vary depending on the OS. Under VMS, those are diff -Nru vim-8.2.1913/src/INSTALLx.txt vim-8.2.2434/src/INSTALLx.txt --- vim-8.2.1913/src/INSTALLx.txt 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/INSTALLx.txt 2021-01-30 22:05:11.000000000 +0000 @@ -131,14 +131,6 @@ Whether the "toupper" C library function works correctly. Set to "yes" if you know it's broken, otherwise set to "no". -vim_cv_tty_group: - The default group of pseudo terminals. Either set to the numeric value - of your tty group or to "world" if they are world accessible. - -vim_cv_tty_mode: - The default mode of pseudo terminals if they are not world accessible. - Most probably the value "0620". - 4. EXAMPLE: =========== @@ -153,7 +145,6 @@ vim_cv_tgetent=zero \ vim_cv_terminfo=yes \ vim_cv_toupper_broken=no \ -vim_cv_tty_group=world \ ./configure \ --build=i586-linux \ --host=armeb-xscale-linux-gnu \ diff -Nru vim-8.2.1913/src/job.c vim-8.2.2434/src/job.c --- vim-8.2.1913/src/job.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/job.c 2021-01-30 22:05:11.000000000 +0000 @@ -887,6 +887,11 @@ } #endif +// Unix uses argv[] for the command, other systems use a string. +#if defined(UNIX) +# define USE_ARGV +#endif + #if !defined(USE_ARGV) || defined(PROTO) /* * Escape one argument for an external command. @@ -1269,9 +1274,7 @@ char **argv = NULL; int argc = 0; int i; -#if defined(UNIX) -# define USE_ARGV -#else +#ifndef USE_ARGV garray_T ga; #endif jobopt_T opt; @@ -1628,7 +1631,7 @@ if (cmdchar_todo == 'A') coladvance((colnr_T)MAXCOL); - if (cmdchar_todo == 'I' || curwin->w_cursor.col <= (int)STRLEN(prompt)) + if (curwin->w_cursor.col < (int)STRLEN(prompt)) curwin->w_cursor.col = (int)STRLEN(prompt); // Make sure the cursor is in a valid position. check_cursor(); diff -Nru vim-8.2.1913/src/keymap.h vim-8.2.2434/src/keymap.h --- vim-8.2.1913/src/keymap.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/keymap.h 2021-01-30 22:05:11.000000000 +0000 @@ -274,6 +274,7 @@ , KE_FOCUSLOST = 99 // focus lost , KE_MOUSEMOVE = 100 // mouse moved with no button down , KE_CANCEL = 101 // return from vgetc() + , KE_COMMAND = 102 // special key }; /* @@ -449,11 +450,11 @@ #define K_RIGHTMOUSE TERMCAP2KEY(KS_EXTRA, KE_RIGHTMOUSE) #define K_RIGHTDRAG TERMCAP2KEY(KS_EXTRA, KE_RIGHTDRAG) #define K_RIGHTRELEASE TERMCAP2KEY(KS_EXTRA, KE_RIGHTRELEASE) -#define K_X1MOUSE TERMCAP2KEY(KS_EXTRA, KE_X1MOUSE) -#define K_X1MOUSE TERMCAP2KEY(KS_EXTRA, KE_X1MOUSE) +#define K_X1MOUSE TERMCAP2KEY(KS_EXTRA, KE_X1MOUSE) +#define K_X1MOUSE TERMCAP2KEY(KS_EXTRA, KE_X1MOUSE) #define K_X1DRAG TERMCAP2KEY(KS_EXTRA, KE_X1DRAG) #define K_X1RELEASE TERMCAP2KEY(KS_EXTRA, KE_X1RELEASE) -#define K_X2MOUSE TERMCAP2KEY(KS_EXTRA, KE_X2MOUSE) +#define K_X2MOUSE TERMCAP2KEY(KS_EXTRA, KE_X2MOUSE) #define K_X2DRAG TERMCAP2KEY(KS_EXTRA, KE_X2DRAG) #define K_X2RELEASE TERMCAP2KEY(KS_EXTRA, KE_X2RELEASE) @@ -477,6 +478,8 @@ #define K_CURSORHOLD TERMCAP2KEY(KS_EXTRA, KE_CURSORHOLD) +#define K_COMMAND TERMCAP2KEY(KS_EXTRA, KE_COMMAND) + // Bits for modifier mask // 0x01 cannot be used, because the modifier must be 0x02 or higher #define MOD_MASK_SHIFT 0x02 diff -Nru vim-8.2.1913/src/libvterm/Makefile vim-8.2.2434/src/libvterm/Makefile --- vim-8.2.1913/src/libvterm/Makefile 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/libvterm/Makefile 2021-01-30 22:05:11.000000000 +0000 @@ -78,7 +78,7 @@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(CFLAGS) -o $@ -c $< t/harness: t/harness.lo $(LIBRARY) - $(LIBTOOL) --mode=link --tag=CC $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + $(LIBTOOL) --mode=link --tag=CC $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -static .PHONY: test test: $(LIBRARY) t/harness diff -Nru vim-8.2.1913/src/libvterm/t/run-test.pl vim-8.2.2434/src/libvterm/t/run-test.pl --- vim-8.2.1913/src/libvterm/t/run-test.pl 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/libvterm/t/run-test.pl 2021-01-30 22:05:11.000000000 +0000 @@ -8,7 +8,7 @@ use POSIX qw( WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG ); my $VALGRIND = 0; -my $EXECUTABLE = "t/.libs/harness"; +my $EXECUTABLE = "t/harness"; GetOptions( 'valgrind|v+' => \$VALGRIND, 'executable|e=s' => \$EXECUTABLE, @@ -17,7 +17,6 @@ my ( $hin, $hout, $hpid ); { - local $ENV{LD_LIBRARY_PATH} = ".libs"; my @command = $EXECUTABLE; unshift @command, "valgrind", "--tool=memcheck", "--leak-check=yes", "--num-callers=25", "--log-file=valgrind.out", "--error-exitcode=126" if $VALGRIND; diff -Nru vim-8.2.1913/src/list.c vim-8.2.2434/src/list.c --- vim-8.2.1913/src/list.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/list.c 2021-01-30 22:05:11.000000000 +0000 @@ -270,6 +270,7 @@ if (l->lv_used_next != NULL) l->lv_used_next->lv_used_prev = l->lv_used_prev; + free_type(l->lv_type); vim_free(l); } @@ -689,13 +690,17 @@ /* * Insert typval_T "tv" in list "l" before "item". * If "item" is NULL append at the end. - * Return FAIL when out of memory. + * Return FAIL when out of memory or the type is wrong. */ int list_insert_tv(list_T *l, typval_T *tv, listitem_T *item) { - listitem_T *ni = listitem_alloc(); + listitem_T *ni; + if (l->lv_type != NULL && l->lv_type->tt_member != NULL + && check_typval_type(l->lv_type->tt_member, tv, 0) == FAIL) + return FAIL; + ni = listitem_alloc(); if (ni == NULL) return FAIL; copy_tv(tv, &ni->li_tv); @@ -867,6 +872,7 @@ if (l == NULL) return FAIL; tv->v_type = VAR_LIST; + tv->v_lock = 0; tv->vval.v_list = l; if (l1 == NULL) ++l->lv_refcount; @@ -899,14 +905,15 @@ list_slice_or_index( list_T *list, int range, - long n1_arg, - long n2_arg, + varnumber_T n1_arg, + varnumber_T n2_arg, + int exclusive, typval_T *rettv, int verbose) { long len = list_len(list); - long n1 = n1_arg; - long n2 = n2_arg; + varnumber_T n1 = n1_arg; + varnumber_T n2 = n2_arg; typval_T var1; if (n1 < 0) @@ -918,7 +925,7 @@ if (!range) { if (verbose) - semsg(_(e_listidx), n1); + semsg(_(e_listidx), (long)n1_arg); return FAIL; } n1 = n1 < 0 ? 0 : len; @@ -930,7 +937,9 @@ if (n2 < 0) n2 = len + n2; else if (n2 >= len) - n2 = len - 1; + n2 = len - (exclusive ? 0 : 1); + if (exclusive) + --n2; if (n2 < 0 || n2 + 1 < n1) n2 = -1; l = list_slice(list, n1, n2); @@ -1264,7 +1273,7 @@ had_comma = **arg == ','; if (had_comma) { - if (vim9script && !IS_WHITE_OR_NUL((*arg)[1])) + if (vim9script && !IS_WHITE_OR_NUL((*arg)[1]) && (*arg)[1] != ']') { semsg(_(e_white_space_required_after_str), ","); goto failret; @@ -1443,7 +1452,7 @@ listitem_T *item, *item2; listitem_T *li; int error = FALSE; - int idx; + long idx; if ((l = argvars[0].vval.v_list) == NULL || value_check_lock(l->lv_lock, arg_errmsg, TRUE)) @@ -1466,7 +1475,7 @@ else { // Remove range of items, return list with values. - int end = (long)tv_get_number_chk(&argvars[2], &error); + long end = (long)tv_get_number_chk(&argvars[2], &error); if (error) ; // type error: do nothing @@ -1516,6 +1525,7 @@ typedef struct { int item_compare_ic; + int item_compare_lc; int item_compare_numeric; int item_compare_numbers; #ifdef FEAT_FLOAT @@ -1594,10 +1604,10 @@ p2 = (char_u *)""; if (!sortinfo->item_compare_numeric) { - if (sortinfo->item_compare_ic) - res = STRICMP(p1, p2); + if (sortinfo->item_compare_lc) + res = strcoll((char *)p1, (char *)p2); else - res = STRCMP(p1, p2); + res = sortinfo->item_compare_ic ? STRICMP(p1, p2): STRCMP(p1, p2); } else { @@ -1706,6 +1716,7 @@ goto theend; // short list sorts pretty quickly info.item_compare_ic = FALSE; + info.item_compare_lc = FALSE; info.item_compare_numeric = FALSE; info.item_compare_numbers = FALSE; #ifdef FEAT_FLOAT @@ -1773,6 +1784,11 @@ info.item_compare_func = NULL; info.item_compare_ic = TRUE; } + else if (STRCMP(info.item_compare_func, "l") == 0) + { + info.item_compare_func = NULL; + info.item_compare_lc = TRUE; + } } } @@ -1896,38 +1912,42 @@ do_sort_uniq(argvars, rettv, FALSE); } +typedef enum { + FILTERMAP_FILTER, + FILTERMAP_MAP, + FILTERMAP_MAPNEW +} filtermap_T; + /* * Handle one item for map() and filter(). + * Sets v:val to "tv". Caller must set v:key. */ static int -filter_map_one(typval_T *tv, typval_T *expr, int map, int *remp) +filter_map_one( + typval_T *tv, // original value + typval_T *expr, // callback + filtermap_T filtermap, + typval_T *newtv, // for map() and mapnew(): new value + int *remp) // for filter(): remove flag { - typval_T rettv; typval_T argv[3]; int retval = FAIL; copy_tv(tv, get_vim_var_tv(VV_VAL)); argv[0] = *get_vim_var_tv(VV_KEY); argv[1] = *get_vim_var_tv(VV_VAL); - if (eval_expr_typval(expr, argv, 2, &rettv) == FAIL) + if (eval_expr_typval(expr, argv, 2, newtv) == FAIL) goto theend; - if (map) - { - // map(): replace the list item value - clear_tv(tv); - rettv.v_lock = 0; - *tv = rettv; - } - else + if (filtermap == FILTERMAP_FILTER) { int error = FALSE; // filter(): when expr is zero remove the item if (in_vim9script()) - *remp = !tv2bool(&rettv); + *remp = !tv2bool(newtv); else - *remp = (tv_get_number_chk(&rettv, &error) == 0); - clear_tv(&rettv); + *remp = (tv_get_number_chk(newtv, &error) == 0); + clear_tv(newtv); // On type error, nothing has been removed; return FAIL to stop the // loop. The error message was given by tv_get_number_chk(). if (error) @@ -1943,7 +1963,7 @@ * Implementation of map() and filter(). */ static void -filter_map(typval_T *argvars, typval_T *rettv, int map) +filter_map(typval_T *argvars, typval_T *rettv, filtermap_T filtermap) { typval_T *expr; listitem_T *li, *nli; @@ -1955,36 +1975,67 @@ blob_T *b = NULL; int rem; int todo; - char_u *ermsg = (char_u *)(map ? "map()" : "filter()"); - char_u *arg_errmsg = (char_u *)(map ? N_("map() argument") - : N_("filter() argument")); + char_u *ermsg = (char_u *)(filtermap == FILTERMAP_MAP ? "map()" + : filtermap == FILTERMAP_MAPNEW ? "mapnew()" + : "filter()"); + char_u *arg_errmsg = (char_u *)(filtermap == FILTERMAP_MAP + ? N_("map() argument") + : filtermap == FILTERMAP_MAPNEW + ? N_("mapnew() argument") + : N_("filter() argument")); int save_did_emsg; int idx = 0; + type_T *type = NULL; + garray_T type_list; - // Always return the first argument, also on failure. - copy_tv(&argvars[0], rettv); + // map() and filter() return the first argument, also on failure. + if (filtermap != FILTERMAP_MAPNEW) + copy_tv(&argvars[0], rettv); + if (filtermap == FILTERMAP_MAP && in_vim9script()) + { + // Check that map() does not change the type of the dict. + ga_init2(&type_list, sizeof(type_T *), 10); + type = typval2type(argvars, &type_list); + } if (argvars[0].v_type == VAR_BLOB) { + if (filtermap == FILTERMAP_MAPNEW) + { + rettv->v_type = VAR_BLOB; + rettv->vval.v_blob = NULL; + } if ((b = argvars[0].vval.v_blob) == NULL) - return; + goto theend; } else if (argvars[0].v_type == VAR_LIST) { + if (filtermap == FILTERMAP_MAPNEW) + { + rettv->v_type = VAR_LIST; + rettv->vval.v_list = NULL; + } if ((l = argvars[0].vval.v_list) == NULL - || (!map && value_check_lock(l->lv_lock, arg_errmsg, TRUE))) - return; + || (filtermap == FILTERMAP_FILTER + && value_check_lock(l->lv_lock, arg_errmsg, TRUE))) + goto theend; } else if (argvars[0].v_type == VAR_DICT) { + if (filtermap == FILTERMAP_MAPNEW) + { + rettv->v_type = VAR_DICT; + rettv->vval.v_dict = NULL; + } if ((d = argvars[0].vval.v_dict) == NULL - || (!map && value_check_lock(d->dv_lock, arg_errmsg, TRUE))) - return; + || (filtermap == FILTERMAP_FILTER + && value_check_lock(d->dv_lock, arg_errmsg, TRUE))) + goto theend; } else { semsg(_(e_listdictblobarg), ermsg); - return; + goto theend; } expr = &argvars[1]; @@ -2007,8 +2058,16 @@ if (argvars[0].v_type == VAR_DICT) { int prev_lock = d->dv_lock; + dict_T *d_ret = NULL; + + if (filtermap == FILTERMAP_MAPNEW) + { + if (rettv_dict_alloc(rettv) == FAIL) + goto theend; + d_ret = rettv->vval.v_dict; + } - if (map && d->dv_lock == 0) + if (filtermap != FILTERMAP_FILTER && d->dv_lock == 0) d->dv_lock = VAR_LOCKED; ht = &d->dv_hashtab; hash_lock(ht); @@ -2017,22 +2076,50 @@ { if (!HASHITEM_EMPTY(hi)) { - int r; + int r; + typval_T newtv; --todo; di = HI2DI(hi); - if (map && (value_check_lock(di->di_tv.v_lock, + if (filtermap == FILTERMAP_MAP + && (value_check_lock(di->di_tv.v_lock, arg_errmsg, TRUE) || var_check_ro(di->di_flags, arg_errmsg, TRUE))) break; set_vim_var_string(VV_KEY, di->di_key, -1); - r = filter_map_one(&di->di_tv, expr, map, &rem); + r = filter_map_one(&di->di_tv, expr, filtermap, + &newtv, &rem); clear_tv(get_vim_var_tv(VV_KEY)); if (r == FAIL || did_emsg) + { + clear_tv(&newtv); break; - if (!map && rem) + } + if (filtermap == FILTERMAP_MAP) + { + if (type != NULL && check_typval_type(type->tt_member, + &newtv, 0) == FAIL) + { + clear_tv(&newtv); + break; + } + // map(): replace the dict item value + clear_tv(&di->di_tv); + newtv.v_lock = 0; + di->di_tv = newtv; + } + else if (filtermap == FILTERMAP_MAPNEW) { + // mapnew(): add the item value to the new dict + r = dict_add_tv(d_ret, (char *)di->di_key, &newtv); + clear_tv(&newtv); + if (r == FAIL) + break; + } + else if (filtermap == FILTERMAP_FILTER && rem) + { + // filter(false): remove the item from the dict if (var_check_fixed(di->di_flags, arg_errmsg, TRUE) || var_check_ro(di->di_flags, arg_errmsg, TRUE)) break; @@ -2048,27 +2135,39 @@ int i; typval_T tv; varnumber_T val; + blob_T *b_ret = b; + + if (filtermap == FILTERMAP_MAPNEW) + { + if (blob_copy(b, rettv) == FAIL) + goto theend; + b_ret = rettv->vval.v_blob; + } // set_vim_var_nr() doesn't set the type set_vim_var_type(VV_KEY, VAR_NUMBER); for (i = 0; i < b->bv_ga.ga_len; i++) { + typval_T newtv; + tv.v_type = VAR_NUMBER; val = blob_get(b, i); tv.vval.v_number = val; set_vim_var_nr(VV_KEY, idx); - if (filter_map_one(&tv, expr, map, &rem) == FAIL || did_emsg) + if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) == FAIL + || did_emsg) break; - if (tv.v_type != VAR_NUMBER) + if (newtv.v_type != VAR_NUMBER) { + clear_tv(&newtv); emsg(_(e_invalblob)); break; } - if (map) + if (filtermap != FILTERMAP_FILTER) { - if (tv.vval.v_number != val) - blob_set(b, i, tv.vval.v_number); + if (newtv.vval.v_number != val) + blob_set(b_ret, i, newtv.vval.v_number); } else if (rem) { @@ -2084,27 +2183,123 @@ } else // argvars[0].v_type == VAR_LIST { - int prev_lock = l->lv_lock; + int prev_lock = l->lv_lock; + list_T *l_ret = NULL; + if (filtermap == FILTERMAP_MAPNEW) + { + if (rettv_list_alloc(rettv) == FAIL) + goto theend; + l_ret = rettv->vval.v_list; + } // set_vim_var_nr() doesn't set the type set_vim_var_type(VV_KEY, VAR_NUMBER); - CHECK_LIST_MATERIALIZE(l); - if (map && l->lv_lock == 0) + if (filtermap != FILTERMAP_FILTER && l->lv_lock == 0) l->lv_lock = VAR_LOCKED; - for (li = l->lv_first; li != NULL; li = nli) + + if (l->lv_first == &range_list_item) { - if (map && value_check_lock(li->li_tv.v_lock, arg_errmsg, TRUE)) - break; - nli = li->li_next; - set_vim_var_nr(VV_KEY, idx); - if (filter_map_one(&li->li_tv, expr, map, &rem) == FAIL - || did_emsg) - break; - if (!map && rem) - listitem_remove(l, li); - ++idx; + varnumber_T val = l->lv_u.nonmat.lv_start; + int len = l->lv_len; + int stride = l->lv_u.nonmat.lv_stride; + + // List from range(): loop over the numbers + if (filtermap != FILTERMAP_MAPNEW) + { + l->lv_first = NULL; + l->lv_u.mat.lv_last = NULL; + l->lv_len = 0; + l->lv_u.mat.lv_idx_item = NULL; + } + + for (idx = 0; idx < len; ++idx) + { + typval_T tv; + typval_T newtv; + + tv.v_type = VAR_NUMBER; + tv.v_lock = 0; + tv.vval.v_number = val; + set_vim_var_nr(VV_KEY, idx); + if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) + == FAIL) + break; + if (did_emsg) + { + clear_tv(&newtv); + break; + } + if (filtermap != FILTERMAP_FILTER) + { + if (filtermap == FILTERMAP_MAP && type != NULL + && check_typval_type(type->tt_member, + &newtv, 0) == FAIL) + { + clear_tv(&newtv); + break; + } + // map(), mapnew(): always append the new value to the + // list + if (list_append_tv_move(filtermap == FILTERMAP_MAP + ? l : l_ret, &newtv) == FAIL) + break; + } + else if (!rem) + { + // filter(): append the list item value when not rem + if (list_append_tv_move(l, &tv) == FAIL) + break; + } + + val += stride; + } } + else + { + // Materialized list: loop over the items + for (li = l->lv_first; li != NULL; li = nli) + { + typval_T newtv; + + if (filtermap == FILTERMAP_MAP && value_check_lock( + li->li_tv.v_lock, arg_errmsg, TRUE)) + break; + nli = li->li_next; + set_vim_var_nr(VV_KEY, idx); + if (filter_map_one(&li->li_tv, expr, filtermap, + &newtv, &rem) == FAIL) + break; + if (did_emsg) + { + clear_tv(&newtv); + break; + } + if (filtermap == FILTERMAP_MAP) + { + if (type != NULL && check_typval_type(type->tt_member, + &newtv, 0) == FAIL) + { + clear_tv(&newtv); + break; + } + // map(): replace the list item value + clear_tv(&li->li_tv); + newtv.v_lock = 0; + li->li_tv = newtv; + } + else if (filtermap == FILTERMAP_MAPNEW) + { + // mapnew(): append the list item value + if (list_append_tv_move(l_ret, &newtv) == FAIL) + break; + } + else if (filtermap == FILTERMAP_FILTER && rem) + listitem_remove(l, li); + ++idx; + } + } + l->lv_lock = prev_lock; } @@ -2113,6 +2308,10 @@ did_emsg |= save_did_emsg; } + +theend: + if (type != NULL) + clear_type_list(&type_list); } /* @@ -2121,7 +2320,7 @@ void f_filter(typval_T *argvars, typval_T *rettv) { - filter_map(argvars, rettv, FALSE); + filter_map(argvars, rettv, FILTERMAP_FILTER); } /* @@ -2130,7 +2329,16 @@ void f_map(typval_T *argvars, typval_T *rettv) { - filter_map(argvars, rettv, TRUE); + filter_map(argvars, rettv, FILTERMAP_MAP); +} + +/* + * "mapnew()" function + */ + void +f_mapnew(typval_T *argvars, typval_T *rettv) +{ + filter_map(argvars, rettv, FILTERMAP_MAPNEW); } /* @@ -2280,14 +2488,11 @@ } /* - * "extend(list, list [, idx])" function - * "extend(dict, dict [, action])" function + * "extend()" or "extendnew()" function. "is_new" is TRUE for extendnew(). */ - void -f_extend(typval_T *argvars, typval_T *rettv) + static void +extend(typval_T *argvars, typval_T *rettv, char_u *arg_errmsg, int is_new) { - char_u *arg_errmsg = (char_u *)N_("extend() argument"); - if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST) { list_T *l1, *l2; @@ -2296,10 +2501,22 @@ int error = FALSE; l1 = argvars[0].vval.v_list; + if (l1 == NULL) + { + emsg(_(e_cannot_extend_null_list)); + return; + } l2 = argvars[1].vval.v_list; - if (l1 != NULL && !value_check_lock(l1->lv_lock, arg_errmsg, TRUE) - && l2 != NULL) + if ((is_new || !value_check_lock(l1->lv_lock, arg_errmsg, TRUE)) + && l2 != NULL) { + if (is_new) + { + l1 = list_copy(l1, FALSE, get_copyID()); + if (l1 == NULL) + return; + } + if (argvars[2].v_type != VAR_UNKNOWN) { before = (long)tv_get_number_chk(&argvars[2], &error); @@ -2322,7 +2539,14 @@ item = NULL; list_extend(l1, l2, item); - copy_tv(&argvars[0], rettv); + if (is_new) + { + rettv->v_type = VAR_LIST; + rettv->vval.v_list = l1; + rettv->v_lock = FALSE; + } + else + copy_tv(&argvars[0], rettv); } } else if (argvars[0].v_type == VAR_DICT && argvars[1].v_type == VAR_DICT) @@ -2332,10 +2556,22 @@ int i; d1 = argvars[0].vval.v_dict; + if (d1 == NULL) + { + emsg(_(e_cannot_extend_null_dict)); + return; + } d2 = argvars[1].vval.v_dict; - if (d1 != NULL && !value_check_lock(d1->dv_lock, arg_errmsg, TRUE) - && d2 != NULL) + if ((is_new || !value_check_lock(d1->dv_lock, arg_errmsg, TRUE)) + && d2 != NULL) { + if (is_new) + { + d1 = dict_copy(d1, FALSE, get_copyID()); + if (d1 == NULL) + return; + } + // Check the third argument. if (argvars[2].v_type != VAR_UNKNOWN) { @@ -2358,11 +2594,42 @@ dict_extend(d1, d2, action); - copy_tv(&argvars[0], rettv); + if (is_new) + { + rettv->v_type = VAR_DICT; + rettv->vval.v_dict = d1; + rettv->v_lock = FALSE; + } + else + copy_tv(&argvars[0], rettv); } } else - semsg(_(e_listdictarg), "extend()"); + semsg(_(e_listdictarg), is_new ? "extendnew()" : "extend()"); +} + +/* + * "extend(list, list [, idx])" function + * "extend(dict, dict [, action])" function + */ + void +f_extend(typval_T *argvars, typval_T *rettv) +{ + char_u *errmsg = (char_u *)N_("extend() argument"); + + extend(argvars, rettv, errmsg, FALSE); +} + +/* + * "extendnew(list, list [, idx])" function + * "extendnew(dict, dict [, action])" function + */ + void +f_extendnew(typval_T *argvars, typval_T *rettv) +{ + char_u *errmsg = (char_u *)N_("extendnew() argument"); + + extend(argvars, rettv, errmsg, TRUE); } /* @@ -2519,7 +2786,7 @@ } /* - * "reduce(list, { accumlator, element -> value } [, initial])" function + * "reduce(list, { accumulator, element -> value } [, initial])" function */ void f_reduce(typval_T *argvars, typval_T *rettv) @@ -2545,8 +2812,11 @@ } else func_name = tv_get_string(&argvars[1]); - if (*func_name == NUL) - return; // type error or empty name + if (func_name == NULL || *func_name == NUL) + { + emsg(_(e_missing_function_argument)); + return; + } vim_memset(&funcexe, 0, sizeof(funcexe)); funcexe.evaluate = TRUE; diff -Nru vim-8.2.1913/src/macros.h vim-8.2.2434/src/macros.h --- vim-8.2.1913/src/macros.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/macros.h 2021-01-30 22:05:11.000000000 +0000 @@ -158,10 +158,9 @@ # define mch_access(n, p) access(vms_fixfilename(n), (p)) // see mch_open() comment # define mch_fopen(n, p) fopen(vms_fixfilename(n), (p)) -# define mch_fstat(n, p) fstat(vms_fixfilename(n), (p)) - // VMS does not have lstat() +# define mch_fstat(n, p) fstat((n), (p)) +# undef HAVE_LSTAT // VMS does not have lstat() # define mch_stat(n, p) stat(vms_fixfilename(n), (p)) -# define mch_rmdir(n) rmdir(vms_fixfilename(n)) #else # ifndef MSWIN # define mch_access(n, p) access((n), (p)) diff -Nru vim-8.2.1913/src/main.c vim-8.2.2434/src/main.c --- vim-8.2.1913/src/main.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/main.c 2021-01-30 22:05:11.000000000 +0000 @@ -432,6 +432,13 @@ if (p_lpl) { char_u *rtp_copy = NULL; + char_u *plugin_pattern = (char_u *) +# if defined(VMS) || defined(AMIGA) // VMS and Amiga don't handle the "**". + "plugin/*.vim" +# else + "plugin/**/*.vim" +# endif + ; // First add all package directories to 'runtimepath', so that their // autoload directories can be found. Only if not done already with a @@ -444,12 +451,7 @@ add_pack_start_dirs(); } - source_in_path(rtp_copy == NULL ? p_rtp : rtp_copy, -# ifdef VMS // Somehow VMS doesn't handle the "**". - (char_u *)"plugin/*.vim", -# else - (char_u *)"plugin/**/*.vim", -# endif + source_in_path(rtp_copy == NULL ? p_rtp : rtp_copy, plugin_pattern, DIP_ALL | DIP_NOAFTER, NULL); TIME_MSG("loading plugins"); vim_free(rtp_copy); @@ -460,13 +462,8 @@ load_start_packages(); TIME_MSG("loading packages"); -# ifdef VMS // Somehow VMS doesn't handle the "**". - source_runtime((char_u *)"plugin/*.vim", DIP_ALL | DIP_AFTER); -# else - source_runtime((char_u *)"plugin/**/*.vim", DIP_ALL | DIP_AFTER); -# endif + source_runtime(plugin_pattern, DIP_ALL | DIP_AFTER); TIME_MSG("loading after plugins"); - } #endif @@ -1508,7 +1505,8 @@ /* - * Exit properly. + * Exit properly. This is the only way to exit Vim after startup has + * succeeded. We are certain to exit here, no way to abort it. */ void getout(int exitval) @@ -1524,6 +1522,11 @@ if (exmode_active) exitval += ex_exitval; +#ifdef FEAT_EVAL + set_vim_var_type(VV_EXITING, VAR_NUMBER); + set_vim_var_nr(VV_EXITING, exitval); +#endif + // Position the cursor on the last screen line, below all the text #ifdef FEAT_GUI if (!gui.in_use) @@ -2706,7 +2709,6 @@ set_buflisted(TRUE); // Create memfile and read from stdin. - // This will also dup stdin from stderr to read commands from. (void)open_buffer(TRUE, NULL, 0); no_wait_return = FALSE; @@ -2714,6 +2716,14 @@ TIME_MSG("reading stdin"); check_swap_exists_action(); + +#if !(defined(AMIGA) || defined(MACOS_X)) + // Dup stdin from stderr to read commands from, so that shell commands + // work. + // TODO: why is this needed, even though readfile() has done this? + close(0); + vim_ignored = dup(2); +#endif } /* @@ -3259,9 +3269,8 @@ int is_viminit) // when TRUE, called for VIMINIT { char_u *initstr; -#ifdef FEAT_EVAL sctx_T save_current_sctx; -#endif + ESTACK_CHECK_DECLARATION if ((initstr = mch_getenv(env)) != NULL && *initstr != NUL) @@ -3270,20 +3279,19 @@ vimrc_found(NULL, NULL); estack_push(ETYPE_ENV, env, 0); ESTACK_CHECK_SETUP -#ifdef FEAT_EVAL save_current_sctx = current_sctx; + current_sctx.sc_version = 1; +#ifdef FEAT_EVAL current_sctx.sc_sid = SID_ENV; current_sctx.sc_seq = 0; current_sctx.sc_lnum = 0; - current_sctx.sc_version = 1; #endif + do_cmdline_cmd(initstr); ESTACK_CHECK_NOW estack_pop(); -#ifdef FEAT_EVAL current_sctx = save_current_sctx; -#endif return OK; } return FAIL; diff -Nru vim-8.2.1913/src/Make_cyg_ming.mak vim-8.2.2434/src/Make_cyg_ming.mak --- vim-8.2.1913/src/Make_cyg_ming.mak 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/Make_cyg_ming.mak 2021-01-30 22:05:11.000000000 +0000 @@ -220,7 +220,6 @@ else WINDRES := windres endif -WINDRES_CC = $(CC) # Get the default ARCH. ifndef ARCH @@ -514,7 +513,8 @@ CFLAGS = -I. -Iproto $(DEFINES) -pipe -march=$(ARCH) -Wall CXXFLAGS = -std=gnu++11 -WINDRES_FLAGS = --preprocessor="$(WINDRES_CC) -E -xc" -DRC_INVOKED +# This used to have --preprocessor, but it's no longer supported +WINDRES_FLAGS = EXTRA_LIBS = ifdef GETTEXT @@ -1055,17 +1055,23 @@ uninstall.exe: uninstall.c dosinst.h version.h $(CC) $(CFLAGS) -o uninstall.exe uninstall.c $(LIB) -lole32 +$(OBJ): | $(OUTDIR) + +$(EXEOBJG): | $(OUTDIR) + +$(EXEOBJC): | $(OUTDIR) + ifeq ($(VIMDLL),yes) -$(TARGET): $(OUTDIR) $(OBJ) +$(TARGET): $(OBJ) $(LINK) $(CFLAGS) $(LFLAGS) -o $@ $(OBJ) $(LIB) -lole32 -luuid -lgdi32 $(LUA_LIB) $(MZSCHEME_LIBDIR) $(MZSCHEME_LIB) $(PYTHONLIB) $(PYTHON3LIB) $(RUBYLIB) -$(GVIMEXE): $(OUTDIR) $(EXEOBJG) $(VIMDLLBASE).dll +$(GVIMEXE): $(EXEOBJG) $(VIMDLLBASE).dll $(CC) -L. $(EXELFLAGS) -mwindows -o $@ $(EXEOBJG) -l$(VIMDLLBASE) -$(VIMEXE): $(OUTDIR) $(EXEOBJC) $(VIMDLLBASE).dll +$(VIMEXE): $(EXEOBJC) $(VIMDLLBASE).dll $(CC) -L. $(EXELFLAGS) -o $@ $(EXEOBJC) -l$(VIMDLLBASE) else -$(TARGET): $(OUTDIR) $(OBJ) +$(TARGET): $(OBJ) $(LINK) $(CFLAGS) $(LFLAGS) -o $@ $(OBJ) $(LIB) -lole32 -luuid $(LUA_LIB) $(MZSCHEME_LIBDIR) $(MZSCHEME_LIB) $(PYTHONLIB) $(PYTHON3LIB) $(RUBYLIB) endif @@ -1280,7 +1286,7 @@ $(CC) -c $(CFLAGS) $< -o $@ -$(PATHDEF_SRC): Make_cyg_ming.mak Make_cyg.mak Make_ming.mak +$(PATHDEF_SRC): Make_cyg_ming.mak Make_cyg.mak Make_ming.mak | $(OUTDIR) ifneq (sh.exe, $(SHELL)) @echo creating $(PATHDEF_SRC) @echo '/* pathdef.c */' > $(PATHDEF_SRC) diff -Nru vim-8.2.1913/src/Makefile vim-8.2.2434/src/Makefile --- vim-8.2.1913/src/Makefile 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/Makefile 2021-01-30 22:05:11.000000000 +0000 @@ -2293,11 +2293,13 @@ $(VALGRIND) ./$(MESSAGE_TEST_TARGET) || exit 1; echo $* passed; # Run the libvterm tests. -# This currently doesn't work on Mac, only run on Linux for now. +# This works only on GNU make, not on BSD make. +# Libtool requires "gcc". test_libvterm: - @if test `uname` = "Linux"; then \ - cd libvterm; $(MAKE) -f Makefile test \ - CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"; \ + @if $(MAKE) --version 2>/dev/null | grep -qs "GNU Make"; then \ + if test -x "/usr/bin/gcc"; then \ + cd libvterm; $(MAKE) -f Makefile test CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"; \ + fi \ fi # Run individual OLD style test. diff -Nru vim-8.2.1913/src/Make_mvc.mak vim-8.2.2434/src/Make_mvc.mak --- vim-8.2.1913/src/Make_mvc.mak 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/Make_mvc.mak 2021-01-30 22:05:11.000000000 +0000 @@ -15,11 +15,7 @@ # This will build the console version of Vim with no additional interfaces. # To add features, define any of the following: # -# For MSVC 11, if you want to include Win32.mak, you need to specify -# where the file is, e.g.: -# SDK_INCLUDE_DIR="C:\Program Files\Microsoft SDKs\Windows\v7.1\Include" -# -# !!!! After changing features do "nmake clean" first !!!! +# !!!! After changing any features do "nmake clean" first !!!! # # Feature Set: FEATURES=[TINY, SMALL, NORMAL, BIG, HUGE] (default is HUGE) # @@ -209,9 +205,6 @@ OBJDIR = $(OBJDIR)d !endif -# If you include Win32.mak, it requires that CPU be set appropriately. -# To cross-compile for Win64, set CPU=AMD64 or CPU=IA64. - !ifdef PROCESSOR_ARCHITECTURE # We're on Windows NT or using VC 6+ ! ifdef CPU @@ -251,18 +244,7 @@ MAKEFLAGS_GVIMEXT = DEBUG=yes !endif - -# Get all sorts of useful, standard macros from the Platform SDK, -# if SDK_INCLUDE_DIR is set or USE_WIN32MAK is set to "yes". - -!ifdef SDK_INCLUDE_DIR -! include $(SDK_INCLUDE_DIR)\Win32.mak -!elseif "$(USE_WIN32MAK)"=="yes" -! include -!else link = link -!endif - # Check VC version. !if [echo MSVCVER=_MSC_VER> msvcver.c && $(CC) /EP msvcver.c > msvcver.~ 2> nul] diff -Nru vim-8.2.1913/src/Make_vms.mms vim-8.2.2434/src/Make_vms.mms --- vim-8.2.1913/src/Make_vms.mms 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/Make_vms.mms 2021-01-30 22:05:11.000000000 +0000 @@ -2,7 +2,7 @@ # Makefile for Vim on OpenVMS # # Maintainer: Zoltan Arpadffy -# Last change: 2020 Aug 13 +# Last change: 2021 Jan 04 # # This script has been tested on VMS 6.2 to 8.4 on DEC Alpha, VAX and IA64 # with MMS and MMK @@ -38,13 +38,13 @@ # GUI or terminal mode executable. # Comment out if you want just the character terminal mode only. # GUI with Motif -GUI = YES +# GUI = YES # GUI with GTK # If you have GTK installed you might want to enable this option. # NOTE: you will need to properly define GTK_DIR below -# NOTE: since Vim 7.3 GTK 2+ is used that is not ported to VMS, -# therefore this option should not be used +# NOTE: since Vim 7.3 GTK 2+ is used that is not ported to VMS, +# therefore this option should not be used # GTK = YES # GUI/Motif with XPM @@ -59,7 +59,7 @@ # Uncomment if want a debug version. Resulting executable is DVIM.EXE # Development purpose only! Normally, it should not be defined. !!! -# DEBUG = YES +# DEBUG = YES # Languages support for Perl, Python, TCL etc. # If you don't need it really, leave them behind the comment. @@ -68,6 +68,7 @@ # VIM_PERL = YES # VIM_PYTHON = YES # VIM_RUBY = YES +# VIM_LUA = YES # X Input Method. For entering special languages like chinese and # Japanese. @@ -97,7 +98,7 @@ .IFDEF MMSVAX .IFDEF DECC # VAX with DECC CC_DEF = cc # /decc # some versions require /decc switch but when it is not required /ver might fail -PREFIX = /prefix=all +PREFIX = /prefix=all/name=(upper,short) OPTIMIZE= /noopt # do not optimize on VAX. The compiler has hard time with crypto functions .ELSE # VAX with VAXC CC_DEF = cc @@ -107,7 +108,7 @@ .ENDIF .ELSE # AXP and IA64 with DECC CC_DEF = cc -PREFIX = /prefix=all +PREFIX = /prefix=all/name=(upper,short) OPTIMIZE= /opt .ENDIF @@ -165,7 +166,7 @@ GTK_DIR = DKA0:[WORK.GTK1210.] DEFS = "HAVE_CONFIG_H","FEAT_GUI_GTK" LIBS = ,OS_VMS_GTK.OPT/OPT -GUI_FLAG = /name=(as_is,short)/float=ieee/ieee=denorm +GUI_FLAG = /float=ieee/ieee=denorm GUI_SRC = gui.c gui_gtk.c gui_gtk_f.c gui_gtk_x11.c gui_beval.c pty.c GUI_OBJ = gui.obj gui_gtk.obj gui_gtk_f.obj gui_gtk_x11.obj gui_beval.obj pty.obj GUI_INC = ,"/gtk_root/gtk","/gtk_root/glib" @@ -177,9 +178,10 @@ .IFDEF XPM DEFS = "HAVE_CONFIG_H","FEAT_GUI_MOTIF","HAVE_XPM" XPM_INC = ,[.xpm.include] +XPM_LIB = ,OS_VMS_XPM.OPT/OPT .ELSE DEFS = "HAVE_CONFIG_H","FEAT_GUI_MOTIF" -XPM_INC = +XPM_INC = .ENDIF LIBS = ,OS_VMS_MOTIF.OPT/OPT GUI_FLAG = @@ -236,6 +238,15 @@ RUBY_INC = .ENDIF +.IFDEF VIM_LUA +# LUA related setup. +LUA_DEF = ,"FEAT_LUA" +LUA_SRC = if_lua.c +LUA_OBJ = if_lua.obj +LUA_LIB = ,OS_VMS_LUA.OPT/OPT +LUA_INC = ,LUA$ROOT:[INCLUDE] +.ENDIF + .IFDEF VIM_XIM # XIM related setup. .IFDEF GUI @@ -246,7 +257,7 @@ .IFDEF VIM_MZSCHEME # MZSCHEME related setup MZSCH_DEF = ,"FEAT_MZSCHEME" -MZSCH_SRC = if_mzsch.c +MZSCH_SRC = if_mzsch.c MZSCH_OBJ = if_mzsch.obj .ENDIF @@ -257,7 +268,7 @@ # XDIFF related setup. XDIFF_SRC = xdiffi.c,xemit.c,xprepare.c,xutils.c,xhistogram.c,xpatience.c -XDIFF_OBJ = xdiffi.obj,xemit.obj,xprepare.obj,xutils.obj,xhistogram.obj,xpatience.obj +XDIFF_OBJ = xdiffi.obj,xemit.obj,xprepare.obj,xutils.obj,xhistogram.obj,xpatience.obj XDIFF_INC = ,[.xdiff] ###################################################################### @@ -274,7 +285,7 @@ .SUFFIXES : .obj .c ALL_CFLAGS = /def=($(MODEL_DEF)$(DEFS)$(DEBUG_DEF)$(PERL_DEF)$(PYTHON_DEF) - - $(TCL_DEF)$(RUBY_DEF)$(XIM_DEF)$(TAG_DEF)$(MZSCH_DEF) - + $(TCL_DEF)$(RUBY_DEF)$(LUA_DEF)$(XIM_DEF)$(TAG_DEF)$(MZSCH_DEF) - $(ICONV_DEF)) - $(CFLAGS)$(GUI_FLAG) - /include=($(C_INC)$(GUI_INC_DIR)$(GUI_INC)$(PERL_INC)$(PYTHON_INC) - @@ -285,14 +296,14 @@ # as $(GUI_INC) - replaced with $(GUI_INC_VER) # Otherwise should not be any other difference. ALL_CFLAGS_VER = /def=($(MODEL_DEF)$(DEFS)$(DEBUG_DEF)$(PERL_DEF)$(PYTHON_DEF) - - $(TCL_DEF)$(RUBY_DEF)$(XIM_DEF)$(TAG_DEF)$(MZSCH_DEF) - + $(TCL_DEF)$(RUBY_DEF)$(LUA_DEF)$(XIM_DEF)$(TAG_DEF)$(MZSCH_DEF) - $(ICONV_DEF)) - $(CFLAGS)$(GUI_FLAG) - /include=($(C_INC)$(GUI_INC_DIR)$(GUI_INC_VER)$(PERL_INC)$(PYTHON_INC) - $(TCL_INC)$(XDIFF_INC)$(XPM_INC)) -ALL_LIBS = $(LIBS) $(GUI_LIB_DIR) $(GUI_LIB) \ - $(PERL_LIB) $(PYTHON_LIB) $(TCL_LIB) $(RUBY_LIB) +ALL_LIBS = $(LIBS) $(GUI_LIB_DIR) $(GUI_LIB) $(XPM_LIB)\ + $(PERL_LIB) $(PYTHON_LIB) $(TCL_LIB) $(RUBY_LIB) $(LUA_LIB) SRC = \ arabic.c \ @@ -407,6 +418,7 @@ $(PYTHON_SRC) \ $(TCL_SRC) \ $(RUBY_SRC) \ + $(LUA_SRC) \ $(MZSCH_SRC) \ $(XDIFF_SRC) @@ -524,11 +536,12 @@ $(PYTHON_OBJ) \ $(TCL_OBJ) \ $(RUBY_OBJ) \ + $(LUA_OBJ) \ $(MZSCH_OBJ) \ $(XDIFF_OBJ) # Default target is making the executable -all : [.auto]config.h mmk_compat motif_env gtk_env perl_env python_env tcl_env ruby_env $(TARGET) +all : [.auto]config.h mmk_compat motif_env gtk_env perl_env python_env tcl_env ruby_env lua_env $(TARGET) ! $@ [.auto]config.h : $(CONFIG_H) @@ -546,6 +559,7 @@ -@ if "''F$SEARCH("pathdef.c")'" .NES. "" then delete/noconfirm/nolog pathdef.c;* -@ if "''F$SEARCH("if_perl.c")'" .NES. "" then delete/noconfirm/nolog if_perl.c;* -@ if "''F$SEARCH("*.opt")'" .NES. "" then delete/noconfirm/nolog *.opt;* + -@ if "''F$SEARCH("*.dmp")'" .NES. "" then delete/noconfirm/nolog *.dmp;* # Link the target $(TARGET) : $(OBJ) @@ -599,6 +613,18 @@ motif_env : .IFDEF XPM -@ write sys$output "using DECW/Motif/XPM environment." + -@ write sys$output "creating OS_VMS_XPM.OPT file." + -@ open/write opt_file OS_VMS_XPM.OPT +.IFDEF MMSVAX + -@ write opt_file "[.xpm.vms.vax]libxpm.olb/lib" +.ENDIF +.IFDEF MMSALPHA + -@ write opt_file "[.xpm.vms.axp]libxpm.olb/lib" +.ENDIF +.IFDEF MMSIA64 + -@ write opt_file "[.xpm.vms.ia64]libxpm.olb/lib" +.ENDIF + -@ close opt_file .ELSE -@ write sys$output "using DECW/Motif environment." .ENDIF @@ -695,11 +721,24 @@ -@ ! .ENDIF +.IFDEF VIM_LUA +lua_env : + -@ write sys$output "using LUA environment:" + -@ write sys$output " include path: ""$(LUA_INC)""" + -@ write sys$output "creating OS_VMS_LUA.OPT file." + -@ open/write opt_file OS_VMS_LUA.OPT + -@ write opt_file "LUA$ROOT:[LIB]LUA$SHR.EXE /share" + -@ close opt_file +.ELSE +lua_env : + -@ ! +.ENDIF + arabic.obj : arabic.c vim.h arglist.obj : arglist.c vim.h [.auto]config.h feature.h os_unix.h autocmd.obj : autocmd.c vim.h [.auto]config.h feature.h os_unix.h blowfish.obj : blowfish.c vim.h [.auto]config.h feature.h os_unix.h -blob.obj : blob.c vim.h [.auto]config.h feature.h os_unix.h +blob.obj : blob.c vim.h [.auto]config.h feature.h os_unix.h buffer.obj : buffer.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h structs.h regexp.h \ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ @@ -859,7 +898,7 @@ if_mzsch.obj : if_mzsch.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h beval.h [.proto]gui_beval.pro ex_cmds.h proto.h \ - errors.h globals.h if_mzsch.h + errors.h globals.h if_mzsch.h indent.obj : indent.c vim.h [.auto]config.h feature.h os_unix.h insexpand.obj : insexpand.c vim.h [.auto]config.h feature.h os_unix.h json.obj : json.c vim.h [.auto]config.h feature.h os_unix.h \ @@ -1153,6 +1192,8 @@ ascii.h keymap.h term.h macros.h structs.h regexp.h \ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ errors.h globals.h version.h +if_lua.obj : if_lua.c vim.h [.auto]config.h feature.h os_unix.h \ + errors.h globals.h version.h beval.obj : beval.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h structs.h regexp.h \ gui.h beval.h option.h ex_cmds.h proto.h \ @@ -1172,4 +1213,4 @@ xprepare.obj : [.xdiff]xprepare.c [.xdiff]xinclude.h [.auto]config.h vim.h feature.h os_unix.h xutils.obj : [.xdiff]xutils.c [.xdiff]xinclude.h [.auto]config.h vim.h feature.h os_unix.h xhistogram.obj : [.xdiff]xhistogram.c [.xdiff]xinclude.h [.auto]config.h vim.h feature.h os_unix.h -xpatience.obj : [.xdiff]xpatience.c [.xdiff]xinclude.h [.auto]config.h vim.h feature.h os_unix.h +xpatience.obj : [.xdiff]xpatience.c [.xdiff]xinclude.h [.auto]config.h vim.h feature.h os_unix.h diff -Nru vim-8.2.1913/src/map.c vim-8.2.2434/src/map.c --- vim-8.2.1913/src/map.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/map.c 2021-01-30 22:05:11.000000000 +0000 @@ -1639,8 +1639,7 @@ * Returns NULL when out of memory. */ char_u * -vim_strsave_escape_csi( - char_u *p) +vim_strsave_escape_csi(char_u *p) { char_u *res; char_u *s, *d; @@ -2222,7 +2221,7 @@ if (did_simplify) { // When the lhs is being simplified the not-simplified keys are - // preferred for priting, like in do_map(). + // preferred for printing, like in do_map(). // The "rhs" and "buffer_local" values are not expected to change. mp_simplified = mp; (void)replace_termcodes(keys, &alt_keys_buf, @@ -2476,7 +2475,7 @@ char_u *s; char_u *cpo_save = p_cpo; - p_cpo = (char_u *)""; // Allow <> notation + p_cpo = empty_option; // Allow <> notation s = vim_strsave(map); if (s != NULL) { diff -Nru vim-8.2.1913/src/mark.c vim-8.2.2434/src/mark.c --- vim-8.2.1913/src/mark.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/mark.c 2021-01-30 22:05:11.000000000 +0000 @@ -140,9 +140,6 @@ int i; xfmark_T *fm; #endif -#ifdef JUMPLIST_ROTATE - xfmark_T tempmark; -#endif // for :global the mark is set only once if (global_busy || listcmd_busy || (cmdmod.cmod_flags & CMOD_KEEPJUMPS)) @@ -152,24 +149,6 @@ curwin->w_pcmark = curwin->w_cursor; #ifdef FEAT_JUMPLIST -# ifdef JUMPLIST_ROTATE - /* - * If last used entry is not at the top, put it at the top by rotating - * the stack until it is (the newer entries will be at the bottom). - * Keep one entry (the last used one) at the top. - */ - if (curwin->w_jumplistidx < curwin->w_jumplistlen) - ++curwin->w_jumplistidx; - while (curwin->w_jumplistidx < curwin->w_jumplistlen) - { - tempmark = curwin->w_jumplist[curwin->w_jumplistlen - 1]; - for (i = curwin->w_jumplistlen - 1; i > 0; --i) - curwin->w_jumplist[i] = curwin->w_jumplist[i - 1]; - curwin->w_jumplist[0] = tempmark; - ++curwin->w_jumplistidx; - } -# endif - // If jumplist is full: remove oldest entry if (++curwin->w_jumplistlen > JUMPLISTSIZE) { diff -Nru vim-8.2.1913/src/mbyte.c vim-8.2.2434/src/mbyte.c --- vim-8.2.1913/src/mbyte.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/mbyte.c 2021-01-30 22:05:11.000000000 +0000 @@ -4299,7 +4299,7 @@ return count; } -#if defined(FEAT_SPELL) || defined(PROTO) +#if (defined(FEAT_SPELL) || defined(FEAT_EVAL)) || defined(PROTO) /* * Like mb_charlen() but for a string with specified length. */ @@ -5551,13 +5551,8 @@ void f_charclass(typval_T *argvars, typval_T *rettv UNUSED) { - if (argvars[0].v_type != VAR_STRING - || argvars[0].vval.v_string == NULL - || *argvars[0].vval.v_string == NUL) - { - emsg(_(e_stringreq)); + if (check_for_string(&argvars[0]) == FAIL) return; - } rettv->vval.v_number = mb_get_class(argvars[0].vval.v_string); } #endif diff -Nru vim-8.2.1913/src/memfile.c vim-8.2.2434/src/memfile.c --- vim-8.2.1913/src/memfile.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/memfile.c 2021-01-30 22:05:11.000000000 +0000 @@ -507,17 +507,6 @@ mf_ins_free(mfp, hp); // put *hp in the free list } -#if defined(__MORPHOS__) && defined(__libnix__) -// function is missing in MorphOS libnix version -extern unsigned long *__stdfiledes; - - static unsigned long -fdtofh(int filedescriptor) -{ - return __stdfiledes[filedescriptor]; -} -#endif - /* * Sync the memory file *mfp to disk. * Flags: diff -Nru vim-8.2.1913/src/memline.c vim-8.2.2434/src/memline.c --- vim-8.2.1913/src/memline.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/memline.c 2021-01-30 22:05:11.000000000 +0000 @@ -1690,7 +1690,17 @@ } else msg(_("Recovery completed. Buffer contents equals file contents.")); - msg_puts(_("\nYou may want to delete the .swp file now.\n\n")); + msg_puts(_("\nYou may want to delete the .swp file now.")); +#if defined(UNIX) || defined(MSWIN) + if (mch_process_running(char_to_long(b0p->b0_pid))) + { + // Warn there could be an active Vim on the same file, the user may + // want to kill it. + msg_puts(_("\nNote: process STILL RUNNING: ")); + msg_outnum(char_to_long(b0p->b0_pid)); + } +#endif + msg_puts("\n\n"); cmdline_row = msg_row; } #ifdef FEAT_CRYPT @@ -2230,14 +2240,31 @@ ret = FALSE; #if defined(UNIX) || defined(MSWIN) + // Host name must be known and must equal the current host name, otherwise + // comparing pid is meaningless. + if (*(b0.b0_hname) == NUL) + { + ret = FALSE; + } + else + { + char_u hostname[B0_HNAME_SIZE]; + + mch_get_host_name(hostname, B0_HNAME_SIZE); + hostname[B0_HNAME_SIZE - 1] = NUL; + b0.b0_hname[B0_HNAME_SIZE - 1] = NUL; // in case of corruption + if (STRICMP(b0.b0_hname, hostname) != 0) + ret = FALSE; + } + // process must be known and not be running pid = char_to_long(b0.b0_pid); if (pid == 0L || mch_process_running(pid)) ret = FALSE; #endif - // TODO: Should we check if the swap file was created on the current - // system? And the current user? + // We do not check the user, it should be irrelevant for whether the swap + // file is still useful. close(fd); return ret; @@ -5535,7 +5562,7 @@ && buf->b_ml.ml_line_count - line <= 1) { /* - * We are in the last chunk and it is cheap to crate a new one + * We are in the last chunk and it is cheap to create a new one * after this. Do it now to avoid the loop above later on */ curchnk = buf->b_ml.ml_chunksize + curix + 1; @@ -5674,6 +5701,10 @@ while ((lnum != 0 && curline < lnum) || (offset != 0 && size < offset)) { +#ifdef FEAT_PROP_POPUP + size_t textprop_total = 0; +#endif + if (curline > buf->b_ml.ml_line_count || (hp = ml_find_line(buf, curline, ML_FIND)) == NULL) return -1; @@ -5695,18 +5726,16 @@ } else { -#ifdef FEAT_PROP_POPUP - size_t textprop_total = 0; - size_t textprop_size = 0; - char_u *l1, *l2; -#endif - extra = 0; for (;;) { #ifdef FEAT_PROP_POPUP + size_t textprop_size = 0; + if (buf->b_has_textprop) { + char_u *l1, *l2; + // compensate for the extra bytes taken by textprops l1 = (char_u *)dp + ((dp->db_index[idx]) & DB_INDEX_MASK); l2 = (char_u *)dp + (idx == 0 ? dp->db_txt_end @@ -5736,7 +5765,7 @@ } } #ifdef FEAT_PROP_POPUP - if (buf->b_has_textprop) + if (buf->b_has_textprop && lnum != 0) { int i; @@ -5744,12 +5773,18 @@ // lengths. len = 0; for (i = start_idx; i <= idx; ++i) - len += (int)STRLEN((char_u *)dp - + ((dp->db_index[i]) & DB_INDEX_MASK)) + 1; + { + char_u *p = (char_u *)dp + ((dp->db_index[i]) & DB_INDEX_MASK); + len += (int)STRLEN(p) + 1; + } } else #endif - len = text_end - ((dp->db_index[idx]) & DB_INDEX_MASK); + len = text_end - ((dp->db_index[idx]) & DB_INDEX_MASK) +#ifdef FEAT_PROP_POPUP + - (long)textprop_total +#endif + ; size += len; if (offset != 0 && size >= offset) { @@ -5759,7 +5794,11 @@ *offp = offset - size + len; else *offp = offset - size + len - - (text_end - ((dp->db_index[idx - 1]) & DB_INDEX_MASK)); + - (text_end - ((dp->db_index[idx - 1]) & DB_INDEX_MASK)) +#ifdef FEAT_PROP_POPUP + + (long)textprop_total +#endif + ; curline += idx - start_idx + extra; if (curline > buf->b_ml.ml_line_count) return -1; // exactly one byte beyond the end diff -Nru vim-8.2.1913/src/menu.c vim-8.2.2434/src/menu.c --- vim-8.2.1913/src/menu.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/menu.c 2021-01-30 22:05:11.000000000 +0000 @@ -2310,11 +2310,7 @@ if (idx < 0) { // Use the Insert mode entry when returning to Insert mode. - if (restart_edit -#ifdef FEAT_EVAL - && !current_sctx.sc_sid -#endif - ) + if (restart_edit && !current_sctx.sc_sid) { idx = MENU_INDEX_INSERT; } @@ -2384,11 +2380,7 @@ // When executing a script or function execute the commands right now. // Also for the window toolbar. // Otherwise put them in the typeahead buffer. - if (eap == NULL -#ifdef FEAT_EVAL - || current_sctx.sc_sid != 0 -#endif - ) + if (eap == NULL || current_sctx.sc_sid != 0) { save_state_T save_state; diff -Nru vim-8.2.1913/src/message.c vim-8.2.2434/src/message.c --- vim-8.2.1913/src/message.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/message.c 2021-01-30 22:05:11.000000000 +0000 @@ -659,7 +659,7 @@ return TRUE; } - if (emsg_assert_fails_used && emsg_assert_fails_msg == NULL) + if (in_assert_fails && emsg_assert_fails_msg == NULL) { emsg_assert_fails_msg = vim_strsave(s); emsg_assert_fails_lnum = SOURCING_LNUM; @@ -697,6 +697,12 @@ } redir_write(s, -1); } +#ifdef FEAT_EVAL + // Only increment did_emsg_def when :silent! wasn't used inside the + // :def function. + if (emsg_silent == emsg_silent_def) + ++did_emsg_def; +#endif #ifdef FEAT_JOB_CHANNEL ch_log(NULL, "ERROR silent: %s", (char *)s); #endif @@ -1859,7 +1865,11 @@ else if (has_mbyte && (l = (*mb_ptr2len)(s)) > 1) { col += (*mb_ptr2cells)(s); - if (lcs_nbsp != NUL && list + if (l >= MB_MAXBYTES) + { + STRCPY(buf, "?"); + } + else if (lcs_nbsp != NUL && list && (mb_ptr2char(s) == 160 || mb_ptr2char(s) == 0x202f)) { diff -Nru vim-8.2.1913/src/misc1.c vim-8.2.2434/src/misc1.c --- vim-8.2.1913/src/misc1.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/misc1.c 2021-01-30 22:05:11.000000000 +0000 @@ -1063,7 +1063,7 @@ called_vim_beep = TRUE; #endif - if (emsg_silent == 0) + if (emsg_silent == 0 && !in_assert_fails) { if (!((bo_flags & val) || (bo_flags & BO_ALL))) { @@ -2568,6 +2568,7 @@ * But don't allow a space in the path, so that this works: * "/usr/bin/csh --rcfile ~/.cshrc" * But don't do that for Windows, it's common to have a space in the path. + * Returns NULL when out of memory. */ char_u * get_isolated_shell_name(void) diff -Nru vim-8.2.1913/src/misc2.c vim-8.2.2434/src/misc2.c --- vim-8.2.1913/src/misc2.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/misc2.c 2021-01-30 22:05:11.000000000 +0000 @@ -1131,7 +1131,7 @@ free_signs(); # endif # ifdef FEAT_EVAL - set_expr_line(NULL); + set_expr_line(NULL, NULL); # endif # ifdef FEAT_DIFF if (curtab != NULL) @@ -2530,6 +2530,9 @@ {K_PLUG, (char_u *)"Plug"}, {K_CURSORHOLD, (char_u *)"CursorHold"}, {K_IGNORE, (char_u *)"Ignore"}, + {K_COMMAND, (char_u *)"Cmd"}, + {K_FOCUSGAINED, (char_u *)"FocusGained"}, + {K_FOCUSLOST, (char_u *)"FocusLost"}, {0, NULL} // NOTE: When adding a long name update MAX_KEY_NAME_LEN. }; diff -Nru vim-8.2.1913/src/mouse.c vim-8.2.2434/src/mouse.c --- vim-8.2.1913/src/mouse.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/mouse.c 2021-01-30 22:05:11.000000000 +0000 @@ -2929,10 +2929,12 @@ // skip line number and fold column in front of the line col -= win_col_off(win); - if (col < 0) + if (col <= 0) { #ifdef FEAT_NETBEANS_INTG - netbeans_gutter_click(lnum); + // if mouse is clicked on the gutter, then inform the netbeans server + if (*colp < win_col_off(win)) + netbeans_gutter_click(lnum); #endif col = 0; } diff -Nru vim-8.2.1913/src/move.c vim-8.2.2434/src/move.c --- vim-8.2.1913/src/move.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/move.c 2021-01-30 22:05:11.000000000 +0000 @@ -196,6 +196,7 @@ // the cursor line. if (!screen_valid(TRUE) || curwin->w_height == 0) { + check_cursor_lnum(); curwin->w_topline = curwin->w_cursor.lnum; curwin->w_botline = curwin->w_topline; curwin->w_valid |= VALID_BOTLINE|VALID_BOTLINE_AP; @@ -540,6 +541,8 @@ #endif // Approximate the value of w_botline wp->w_botline += lnum - wp->w_topline; + if (wp->w_botline > wp->w_buffer->b_ml.ml_line_count + 1) + wp->w_botline = wp->w_buffer->b_ml.ml_line_count + 1; wp->w_topline = lnum; wp->w_topline_was_set = TRUE; #ifdef FEAT_DIFF @@ -594,8 +597,17 @@ void validate_botline(void) { - if (!(curwin->w_valid & VALID_BOTLINE)) - comp_botline(curwin); + validate_botline_win(curwin); +} + +/* + * Make sure the value of wp->w_botline is valid. + */ + void +validate_botline_win(win_T *wp) +{ + if (!(wp->w_valid & VALID_BOTLINE)) + comp_botline(wp); } /* @@ -867,6 +879,9 @@ curwin->w_wcol = col; curwin->w_valid |= VALID_WCOL; +#ifdef FEAT_PROP_POPUP + curwin->w_flags &= ~WFLAG_WCOL_OFF_ADDED; +#endif } } @@ -1179,7 +1194,10 @@ { curwin->w_wrow += popup_top_extra(curwin); curwin->w_wcol += popup_left_extra(curwin); + curwin->w_flags |= WFLAG_WCOL_OFF_ADDED + WFLAG_WROW_OFF_ADDED; } + else + curwin->w_flags &= ~(WFLAG_WCOL_OFF_ADDED + WFLAG_WROW_OFF_ADDED); #endif // now w_leftcol is valid, avoid check_cursor_moved() thinking otherwise @@ -1240,7 +1258,7 @@ // character is left or right of the window row = scol = ccol = ecol = 0; } - *rowp = wp->w_winrow + row + rowoff; + *rowp = W_WINROW(wp) + row + rowoff; *scolp = scol + coloff; *ccolp = ccol + coloff; *ecolp = ecol + coloff; diff -Nru vim-8.2.1913/src/netbeans.c vim-8.2.2434/src/netbeans.c --- vim-8.2.1913/src/netbeans.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/netbeans.c 2021-01-30 22:05:11.000000000 +0000 @@ -572,7 +572,7 @@ buf = buf_list[i]; vim_free(buf.displayname); vim_free(buf.signmap); - if (buf.bufp != NULL) + if (buf.bufp != NULL && buf_valid(buf.bufp)) { buf.bufp->b_netbeans_file = FALSE; buf.bufp->b_was_netbeans_file = FALSE; @@ -1943,15 +1943,13 @@ if (STRLEN(fg) > MAX_COLOR_LENGTH || STRLEN(bg) > MAX_COLOR_LENGTH) { emsg("E532: highlighting color name too long in defineAnnoType"); - vim_free(typeName); + VIM_CLEAR(typeName); parse_error = TRUE; } else if (typeName != NULL && tooltip != NULL && glyphFile != NULL) addsigntype(buf, typeNum, typeName, tooltip, glyphFile, fg, bg); - else - vim_free(typeName); - // don't free typeName; it's used directly in addsigntype() + vim_free(typeName); vim_free(fg); vim_free(bg); vim_free(tooltip); @@ -3240,7 +3238,7 @@ } } - globalsignmap[i] = (char *)typeName; + globalsignmap[i] = (char *)vim_strsave(typeName); globalsignmapused = i + 1; } diff -Nru vim-8.2.1913/src/normal.c vim-8.2.2434/src/normal.c --- vim-8.2.1913/src/normal.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/normal.c 2021-01-30 22:05:11.000000000 +0000 @@ -375,6 +375,7 @@ #endif {K_CURSORHOLD, nv_cursorhold, NV_KEEPREG, 0}, {K_PS, nv_edit, 0, 0}, + {K_COMMAND, nv_colon, 0, 0}, }; // Number of commands in nv_cmds[]. @@ -629,7 +630,7 @@ } else ca.count0 = ca.count0 * 10 + (c - '0'); - if (ca.count0 < 0) // got too large! + if (ca.count0 < 0) // overflow ca.count0 = 999999999L; #ifdef FEAT_EVAL // Set v:count here, when called from main() and not a stuffed @@ -700,6 +701,8 @@ ca.count0 *= ca.opcount; else ca.count0 = ca.opcount; + if (ca.count0 < 0) // overflow + ca.count0 = 999999999L; } /* @@ -992,7 +995,7 @@ // something different from CTRL-N. Can't be avoided. while ((c = vpeekc()) <= 0 && towait > 0L) { - do_sleep(towait > 50L ? 50L : towait); + do_sleep(towait > 50L ? 50L : towait, FALSE); towait -= 50L; } if (c > 0) @@ -1154,6 +1157,7 @@ && stuff_empty() && typebuf_typed() && emsg_silent == 0 + && !in_assert_fails && !did_wait_return && oap->op_type == OP_NOP) { @@ -1323,6 +1327,26 @@ } } +#if defined(FEAT_CLIPBOARD) && defined(FEAT_EVAL) +/* + * Call yank_do_autocmd() for "regname". + */ + static void +call_yank_do_autocmd(int regname) +{ + oparg_T oa; + yankreg_T *reg; + + clear_oparg(&oa); + oa.regname = regname; + oa.op_type = OP_YANK; + oa.is_VIsual = TRUE; + reg = get_register(regname, TRUE); + yank_do_autocmd(&oa, reg); + free_register(reg); +} +#endif + /* * End Visual mode. * This function should ALWAYS be called to end Visual mode, except from @@ -1340,6 +1364,18 @@ */ if (clip_star.available && clip_star.owned) clip_auto_select(); + +# if defined(FEAT_EVAL) + // Emit a TextYankPost for the automatic copy of the selection into the + // star and/or plus register. + if (has_textyankpost()) + { + if (clip_isautosel_star()) + call_yank_do_autocmd('*'); + if (clip_isautosel_plus()) + call_yank_do_autocmd('+'); + } +# endif #endif VIsual_active = FALSE; @@ -2536,12 +2572,6 @@ else { // to previous line - if (curwin->w_cursor.lnum == 1) - { - retval = FAIL; - break; - } - --curwin->w_cursor.lnum; #ifdef FEAT_FOLDING // Move to the start of a closed fold. Don't do that when // 'foldopen' contains "all": it will open in a moment. @@ -2549,6 +2579,13 @@ (void)hasFolding(curwin->w_cursor.lnum, &curwin->w_cursor.lnum, NULL); #endif + if (curwin->w_cursor.lnum == 1) + { + retval = FAIL; + break; + } + --curwin->w_cursor.lnum; + linelen = linetabsize(ml_get_curline()); if (linelen > width1) curwin->w_curswant += (((linelen - width1 - 1) / width2) @@ -3311,10 +3348,11 @@ static void nv_colon(cmdarg_T *cap) { - int old_p_im; - int cmd_result; + int old_p_im; + int cmd_result; + int is_cmdkey = cap->cmdchar == K_COMMAND; - if (VIsual_active) + if (VIsual_active && !is_cmdkey) nv_operator(cap); else { @@ -3324,7 +3362,7 @@ cap->oap->motion_type = MCHAR; cap->oap->inclusive = FALSE; } - else if (cap->count0) + else if (cap->count0 && !is_cmdkey) { // translate "count:" into ":.,.+(count - 1)" stuffcharReadbuff('.'); @@ -3342,7 +3380,7 @@ old_p_im = p_im; // get a command line and execute it - cmd_result = do_cmdline(NULL, getexline, NULL, + cmd_result = do_cmdline(NULL, is_cmdkey ? getcmdkeycmd : getexline, NULL, cap->oap->op_type != OP_NOP ? DOCMD_KEEPLINE : 0); // If 'insertmode' changed, enter or exit Insert mode @@ -3703,9 +3741,9 @@ else { if (cmdchar == '*') - aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\"); + aux_ptr = (char_u *)(magic_isset() ? "/.*~[^$\\" : "/^$\\"); else if (cmdchar == '#') - aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\"); + aux_ptr = (char_u *)(magic_isset() ? "/?.*~[^$\\" : "/?^$\\"); else if (tag_cmd) { if (curbuf->b_help) @@ -4739,6 +4777,8 @@ else curwin->w_cursor.lnum = (curbuf->b_ml.ml_line_count * cap->count0 + 99L) / 100L; + if (curwin->w_cursor.lnum < 1) + curwin->w_cursor.lnum = 1; if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count) curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count; beginline(BL_SOL | BL_FIX); @@ -4892,7 +4932,7 @@ if (cap->nchar == Ctrl_V) { had_ctrl_v = Ctrl_V; - cap->nchar = get_literal(); + cap->nchar = get_literal(FALSE); // Don't redo a multibyte character with CTRL-V. if (cap->nchar > DEL) had_ctrl_v = NUL; @@ -5173,7 +5213,7 @@ else { if (cap->extra_char == Ctrl_V) // get another character - cap->extra_char = get_literal(); + cap->extra_char = get_literal(FALSE); stuffcharReadbuff(cap->extra_char); stuffcharReadbuff(ESC); if (virtual_active()) @@ -5337,7 +5377,7 @@ nv_subst(cmdarg_T *cap) { #ifdef FEAT_TERMINAL - // When showing output of term_dumpdiff() swap the top and botom. + // When showing output of term_dumpdiff() swap the top and bottom. if (term_swap_diff() == OK) return; #endif @@ -5752,7 +5792,7 @@ clearop(cap->oap); if (VIsual_active) end_visual_mode(); // stop Visual mode - do_cmdline_cmd((char_u *)"st"); + do_cmdline_cmd((char_u *)"stop"); } /* @@ -5922,13 +5962,8 @@ */ case 'j': case K_DOWN: - // with 'nowrap' it works just like the normal "j" command; also when - // in a closed fold - if (!curwin->w_p_wrap -#ifdef FEAT_FOLDING - || hasFolding(curwin->w_cursor.lnum, NULL, NULL) -#endif - ) + // with 'nowrap' it works just like the normal "j" command. + if (!curwin->w_p_wrap) { oap->motion_type = MLINE; i = cursor_down(cap->count1, oap->op_type == OP_NOP); @@ -5941,13 +5976,8 @@ case 'k': case K_UP: - // with 'nowrap' it works just like the normal "k" command; also when - // in a closed fold - if (!curwin->w_p_wrap -#ifdef FEAT_FOLDING - || hasFolding(curwin->w_cursor.lnum, NULL, NULL) -#endif - ) + // with 'nowrap' it works just like the normal "k" command. + if (!curwin->w_p_wrap) { oap->motion_type = MLINE; i = cursor_up(cap->count1, oap->op_type == OP_NOP); @@ -6195,7 +6225,7 @@ * "gs": Goto sleep. */ case 's': - do_sleep(cap->count1 * 1000L); + do_sleep(cap->count1 * 1000L, FALSE); break; /* diff -Nru vim-8.2.1913/src/ops.c vim-8.2.2434/src/ops.c --- vim-8.2.1913/src/ops.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/ops.c 2021-01-30 22:05:11.000000000 +0000 @@ -9,7 +9,7 @@ /* * ops.c: implementation of various operators: op_shift, op_delete, op_tilde, - * op_change, op_yank, do_put, do_join + * op_change, op_yank, do_join */ #include "vim.h" @@ -938,6 +938,7 @@ curwin->w_cursor = curpos; // restore curwin->w_cursor (void)do_join(2, FALSE, FALSE, FALSE, FALSE); } + auto_format(FALSE, TRUE); } msgmore(curbuf->b_ml.ml_line_count - old_lcount); @@ -3298,7 +3299,7 @@ // function. virtual_op = MAYBE; - (void)call_func_retnr(p_opfunc, 1, argv); + (void)call_func_noret(p_opfunc, 1, argv); virtual_op = save_virtual_op; if (cmdmod.cmod_flags & CMOD_LOCKMARKS) @@ -3465,8 +3466,9 @@ if ((redo_yank || oap->op_type != OP_YANK) && ((!VIsual_active || oap->motion_force) // Also redo Operator-pending Visual mode mappings - || (VIsual_active && cap->cmdchar == ':' - && oap->op_type != OP_COLON)) + || (VIsual_active + && (cap->cmdchar == ':' || cap->cmdchar == K_COMMAND) + && oap->op_type != OP_COLON)) && cap->cmdchar != 'D' #ifdef FEAT_FOLDING && oap->op_type != OP_FOLD @@ -3490,7 +3492,7 @@ AppendToRedobuffLit(cap->searchbuf, -1); AppendToRedobuff(NL_STR); } - else if (cap->cmdchar == ':') + else if (cap->cmdchar == ':' || cap->cmdchar == K_COMMAND) { // do_cmdline() has stored the first typed line in // "repeat_cmdline". When several lines are typed repeating @@ -3688,7 +3690,7 @@ get_op_char(oap->op_type), get_extra_op_char(oap->op_type), oap->motion_force, cap->cmdchar, cap->nchar); - else if (cap->cmdchar != ':') + else if (cap->cmdchar != ':' && cap->cmdchar != K_COMMAND) { int nchar = oap->op_type == OP_REPLACE ? cap->nchar : NUL; @@ -3870,9 +3872,10 @@ else { (void)op_delete(oap); - if (oap->motion_type == MLINE && has_format_option(FO_AUTO)) - u_save_cursor(); // cursor line wasn't saved yet - auto_format(FALSE, TRUE); + // save cursor line for undo if it wasn't saved yet + if (oap->motion_type == MLINE && has_format_option(FO_AUTO) + && u_save_cursor() == OK) + auto_format(FALSE, TRUE); } break; diff -Nru vim-8.2.1913/src/option.c vim-8.2.2434/src/option.c --- vim-8.2.1913/src/option.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/option.c 2021-01-30 22:05:11.000000000 +0000 @@ -3834,13 +3834,15 @@ * Get the value for an option. * * Returns: - * Number or Toggle option: 1, *numval gets value. - * String option: 0, *stringval gets allocated string. - * Hidden Number or Toggle option: -1. - * hidden String option: -2. - * unknown option: -3. + * Number option: gov_number, *numval gets value. + * Toggle option: gov_bool, *numval gets value. + * String option: gov_string, *stringval gets allocated string. + * Hidden Number option: gov_hidden_number. + * Hidden Toggle option: gov_hidden_bool. + * Hidden String option: gov_hidden_string. + * Unknown option: gov_unknown. */ - int + getoption_T get_option_value( char_u *name, long *numval, @@ -3851,16 +3853,17 @@ char_u *varp; opt_idx = findoption(name); - if (opt_idx < 0) // unknown option + if (opt_idx < 0) // option not in the table { int key; if (STRLEN(name) == 4 && name[0] == 't' && name[1] == '_' - && (key = find_key_option(name, FALSE)) != 0) + && (key = find_key_option(name, FALSE)) != 0) { char_u key_name[2]; char_u *p; + // check for a terminal option if (key < 0) { key_name[0] = KEY2TERMCAP0(key); @@ -3876,10 +3879,10 @@ { if (stringval != NULL) *stringval = vim_strsave(p); - return 0; + return gov_string; } } - return -3; + return gov_unknown; } varp = get_varp_scope(&(options[opt_idx]), opt_flags); @@ -3887,7 +3890,7 @@ if (options[opt_idx].flags & P_STRING) { if (varp == NULL) // hidden option - return -2; + return gov_hidden_string; if (stringval != NULL) { #ifdef FEAT_CRYPT @@ -3899,11 +3902,12 @@ #endif *stringval = vim_strsave(*(char_u **)(varp)); } - return 0; + return gov_string; } if (varp == NULL) // hidden option - return -1; + return (options[opt_idx].flags & P_NUM) + ? gov_hidden_number : gov_hidden_bool; if (options[opt_idx].flags & P_NUM) *numval = *(long *)varp; else @@ -3915,7 +3919,7 @@ else *numval = (long) *(int *)varp; } - return 1; + return (options[opt_idx].flags & P_NUM) ? gov_number : gov_bool; } #endif @@ -6996,3 +7000,22 @@ return OK; } #endif + +/* + * Get the value of 'magic' adjusted for Vim9 script. + */ + int +magic_isset(void) +{ + switch (magic_overruled) + { + case OPTION_MAGIC_ON: return TRUE; + case OPTION_MAGIC_OFF: return FALSE; + case OPTION_MAGIC_NOT_SET: break; + } +#ifdef FEAT_EVAL + if (in_vim9script()) + return TRUE; +#endif + return p_magic; +} diff -Nru vim-8.2.1913/src/optiondefs.h vim-8.2.2434/src/optiondefs.h --- vim-8.2.1913/src/optiondefs.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/optiondefs.h 2021-01-30 22:05:11.000000000 +0000 @@ -2957,6 +2957,8 @@ p_term("t_EC", T_CEC) p_term("t_EI", T_CEI) p_term("t_fs", T_FS) + p_term("t_fd", T_FD) + p_term("t_fe", T_FE) p_term("t_GP", T_CGP) p_term("t_IE", T_CIE) p_term("t_IS", T_CIS) diff -Nru vim-8.2.1913/src/option.h vim-8.2.2434/src/option.h --- vim-8.2.1913/src/option.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/option.h 2021-01-30 22:05:11.000000000 +0000 @@ -60,6 +60,17 @@ #define P_RWINONLY 0x10000000L // only redraw current window #define P_MLE 0x20000000L // under control of 'modelineexpr' +// Returned by get_option_value(). +typedef enum { + gov_unknown, + gov_bool, + gov_number, + gov_string, + gov_hidden_bool, + gov_hidden_number, + gov_hidden_string +} getoption_T; + /* * Default values for 'errorformat'. * The "%f|%l| %m" one is used for when the contents of the quickfix window is diff -Nru vim-8.2.1913/src/os_mswin.c vim-8.2.2434/src/os_mswin.c --- vim-8.2.1913/src/os_mswin.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/os_mswin.c 2021-01-30 22:05:11.000000000 +0000 @@ -387,21 +387,13 @@ int mch_isFullName(char_u *fname) { - // WinNT and later can use _MAX_PATH wide characters for a pathname, which - // means that the maximum pathname is _MAX_PATH * 3 bytes when 'enc' is - // UTF-8. - char szName[_MAX_PATH * 3 + 1]; - - // A name like "d:/foo" and "//server/share" is absolute - if ((fname[0] && fname[1] == ':' && (fname[2] == '/' || fname[2] == '\\')) - || (fname[0] == fname[1] && (fname[0] == '/' || fname[0] == '\\'))) - return TRUE; - - // A name that can't be made absolute probably isn't absolute. - if (mch_FullName(fname, (char_u *)szName, sizeof(szName) - 1, FALSE) == FAIL) - return FALSE; - - return pathcmp((const char *)fname, (const char *)szName, -1) == 0; + // A name like "d:/foo" and "//server/share" is absolute. "d:foo" is not. + // Another way to check is to use mch_FullName() and see if the result is + // the same as the name or mch_FullName() fails. However, this has quite a + // bit of overhead, so let's not do that. + return ((ASCII_ISALPHA(fname[0]) && fname[1] == ':' + && (fname[2] == '/' || fname[2] == '\\')) + || (fname[0] == fname[1] && (fname[0] == '/' || fname[0] == '\\'))); } /* diff -Nru vim-8.2.1913/src/os_unix.c vim-8.2.2434/src/os_unix.c --- vim-8.2.1913/src/os_unix.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/os_unix.c 2021-01-30 22:05:11.000000000 +0000 @@ -5273,8 +5273,10 @@ { long delay_msec = 1; - out_str(T_CTE); // possibly disables modifyOtherKeys, so that - // the system can recognize CTRL-C + if (tmode == TMODE_RAW) + // possibly disables modifyOtherKeys, so that the system + // can recognize CTRL-C + out_str(T_CTE); /* * Similar to the loop above, but only handle X events, no @@ -5316,7 +5318,9 @@ delay_msec = 10; } - out_str(T_CTI); // possibly enables modifyOtherKeys again + if (tmode == TMODE_RAW) + // possibly enables modifyOtherKeys again + out_str(T_CTI); } # endif diff -Nru vim-8.2.1913/src/os_unix.h vim-8.2.2434/src/os_unix.h --- vim-8.2.1913/src/os_unix.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/os_unix.h 2021-01-30 22:05:11.000000000 +0000 @@ -73,8 +73,9 @@ // always use unlink() to remove files #ifndef PROTO # ifdef VMS -# define mch_remove(x) delete((char *)(x)) -# define vim_mkdir(x, y) mkdir((char *)(x), y) +# define vim_mkdir(x, y) mkdir((char *)vms_fixfilename(x), y) +# define mch_rmdir(x) delete((char *)vms_fixfilename(x)) +# define mch_remove(x) delete((char *)vms_fixfilename(x)) # else # define vim_mkdir(x, y) mkdir((char *)(x), y) # define mch_rmdir(x) rmdir((char *)(x)) @@ -199,10 +200,11 @@ # include # include -# ifdef FEAT_GUI_GTK -# include "gui_gtk_vms.h" +# if defined(FEAT_GUI_MOTIF) +# define XFree XFREE +# define XmRepTypeInstallTearOffModelCon XMREPTYPEINSTALLTEAROFFMODELCON # endif -#endif +#endif // VMS #ifdef HAVE_FLOCK # include diff -Nru vim-8.2.1913/src/os_vms.c vim-8.2.2434/src/os_vms.c --- vim-8.2.1913/src/os_vms.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/os_vms.c 2021-01-30 22:05:11.000000000 +0000 @@ -672,9 +672,18 @@ else if (strchr(instring,'"') == NULL) // password in the path? { // Seems it is a regular file, let guess that it is pure Unix fspec - if (decc$to_vms(instring, vms_fspec_proc, 0, 0) <= 0) - // No... it must be mixed + if ( (strchr(instring,'[') == NULL) && (strchr(instring,'<') == NULL) && + (strchr(instring,']') == NULL) && (strchr(instring,'>') == NULL) && + (strchr(instring,':') == NULL) ) + { + // It must be a truly unix fspec + decc$to_vms(instring, vms_fspec_proc, 0, 0); + } + else + { + // It is a mixed fspec vms_unix_mixed_filespec(instring, buf); + } } else // we have a password in the path diff -Nru vim-8.2.1913/src/os_vms_conf.h vim-8.2.2434/src/os_vms_conf.h --- vim-8.2.1913/src/os_vms_conf.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/os_vms_conf.h 2021-01-30 22:05:11.000000000 +0000 @@ -146,6 +146,7 @@ #undef HAVE_SYS_POLL_H #undef HAVE_FCHDIR #undef HAVE_LSTAT +#undef HAVE_STDINT_H // Hardware specific #ifdef VAX @@ -155,8 +156,12 @@ #undef HAVE_STRINGS_H #undef HAVE_SIGSETJMP #undef HAVE_ISNAN +#undef HAVE_XOS_R_H #define HAVE_NO_LONG_LONG #define VIM_SIZEOF_LONG 4 +#define LONG_LONG_MIN (-2147483647-1) +#define LONG_LONG_MAX (2147483647) +#define ULONG_LONG_MAX (4294967295U) #else // AXP and IA64 #define HAVE_GETTIMEOFDAY #define HAVE_USLEEP @@ -164,7 +169,12 @@ #define HAVE_STRINGS_H #define HAVE_SIGSETJMP #define HAVE_ISNAN +#define HAVE_XOS_R_H +#define HAVE_NO_LONG_LONG #define VIM_SIZEOF_LONG 8 +#define LONG_LONG_MIN (-9223372036854775807-1) +#define LONG_LONG_MAX (9223372036854775807) +#define ULONG_LONG_MAX (18446744073709551615U) #endif // Compiler specific @@ -177,7 +187,7 @@ #define BROKEN_LOCALE #undef DYNAMIC_ICONV #undef HAVE_STRFTIME -#else +#else // DECC #define HAVE_SELECT #define HAVE_FCNTL_H #define HAVE_UNISTD_H 1 @@ -198,7 +208,10 @@ // GUI support defines #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) +#define X_INCLUDE_GRP_H // To use getgrgid +#define XUSE_MTSAFE_API #define HAVE_X11 +#define WANT_X11 #ifdef HAVE_XPM #define HAVE_X11_XPM_H #endif diff -Nru vim-8.2.1913/src/os_win32.c vim-8.2.2434/src/os_win32.c --- vim-8.2.1913/src/os_win32.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/os_win32.c 2021-01-30 22:05:11.000000000 +0000 @@ -860,6 +860,12 @@ } #endif +#ifdef _MSC_VER +// Suppress the deprecation warning for using GetVersionEx(). +// It is needed for implementing "windowsversion()". +# pragma warning(push) +# pragma warning(disable: 4996) +#endif /* * Set "win8_or_later" and fill in "windowsVersion" if possible. */ @@ -890,6 +896,9 @@ done = TRUE; } } +#ifdef _MSC_VER +# pragma warning(pop) +#endif #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL) @@ -1588,26 +1597,14 @@ { DWORD dwWaitTime = dwEndTime - dwNow; -# ifdef FEAT_JOB_CHANNEL - // Check channel while waiting for input. - if (dwWaitTime > 100) - { - dwWaitTime = 100; - // If there is readahead then parse_queued_messages() timed out - // and we should call it again soon. - if (channel_any_readahead()) - dwWaitTime = 10; - } -# endif -# ifdef FEAT_BEVAL_GUI - if (p_beval && dwWaitTime > 100) - // The 'balloonexpr' may indirectly invoke a callback while - // waiting for a character, need to check often. - dwWaitTime = 100; -# endif + // Don't wait for more than 11 msec to avoid dropping characters, + // check channel while waiting for input and handle a callback from + // 'balloonexpr'. + if (dwWaitTime > 11) + dwWaitTime = 11; + # ifdef FEAT_MZSCHEME - if (mzthreads_allowed() && p_mzq > 0 - && (msec < 0 || (long)dwWaitTime > p_mzq)) + if (mzthreads_allowed() && p_mzq > 0 && (long)dwWaitTime > p_mzq) dwWaitTime = p_mzq; // don't wait longer than 'mzquantum' # endif # ifdef FEAT_TIMERS @@ -3532,7 +3529,10 @@ wn = enc_to_utf16(fname, NULL); if (wn == NULL) + { + vim_free(p); return NULL; + } // Try to retrieve the entire security descriptor. err = GetNamedSecurityInfoW( @@ -7113,13 +7113,12 @@ /* * SUB STREAM (aka info stream) handling: * - * NTFS can have sub streams for each file. Normal contents of file is - * stored in the main stream, and extra contents (author information and - * title and so on) can be stored in sub stream. After Windows 2000, user - * can access and store those informations in sub streams via explorer's - * property menuitem in right click menu. Those informations in sub streams - * were lost when copying only the main stream. So we have to copy sub - * streams. + * NTFS can have sub streams for each file. The normal contents of a file is + * stored in the main stream, and extra contents (author information, title and + * so on) can be stored in a sub stream. After Windows 2000, the user can + * access and store this information in sub streams via an explorer's property + * menu item in the right click menu. This information in sub streams was lost + * when copying only the main stream. Therefore we have to copy sub streams. * * Incomplete explanation: * http://msdn.microsoft.com/library/en-us/dnw2k/html/ntfs5.asp diff -Nru vim-8.2.1913/src/po/de.po vim-8.2.2434/src/po/de.po --- vim-8.2.1913/src/po/de.po 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/po/de.po 2021-01-30 22:05:11.000000000 +0000 @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: Vim\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-06 12:56+0200\n" +"POT-Creation-Date: 2020-11-23 13:13+0100\n" "PO-Revision-Date: 2008-05-24 17:26+0200\n" "Last-Translator: Christian Brabandt \n" "Language-Team: German\n" @@ -30,6 +30,9 @@ msgid "E165: Cannot go beyond last file" msgstr "E165: Kann nicht über die letzte Datei hinausgehen" +msgid "E610: No argument to delete" +msgstr "E610: Fehlendes zu löschendes Argument" + msgid "E249: window layout changed unexpectedly" msgstr "E249: Fensterlayout änderte sich unerwartet" @@ -71,7 +74,7 @@ #, c-format msgid "E680: : invalid buffer number " -msgstr "E680: : Ungültige Puffernummer " +msgstr "E680: : Ungültige Buffernummer " msgid "E217: Can't execute autocommands for ALL events" msgstr "E217: Autokommandos können nicht für ALL Ereignisse ausgeführt werden" @@ -119,64 +122,64 @@ msgstr "E855: Autokommandos führten zu einem Abbruch." msgid "E82: Cannot allocate any buffer, exiting..." -msgstr "E82: Kann keinen Puffer zuweisen; beende..." +msgstr "E82: Kann keinen Buffer zuweisen; beende..." msgid "E83: Cannot allocate buffer, using other one..." -msgstr "E83: Kann den Puffer nicht zuweisen; benutze einen anderen..." +msgstr "E83: Kann den Buffer nicht zuweisen; benutze einen anderen..." msgid "E931: Buffer cannot be registered" -msgstr "E931: Puffer kann nicht registriert werden." +msgstr "E931: Buffer kann nicht registriert werden." #, c-format msgid "E937: Attempt to delete a buffer that is in use: %s" -msgstr "E937: Versuch, Puffer %s zu löschen, der noch benutzt wird." +msgstr "E937: Versuch, Buffer %s zu löschen, der noch benutzt wird." msgid "E515: No buffers were unloaded" -msgstr "E515: Kein Puffer wurde entladen." +msgstr "E515: Kein Buffer wurde entladen." msgid "E516: No buffers were deleted" -msgstr "E516: Kein Puffer wurde gelöscht." +msgstr "E516: Kein Buffer wurde gelöscht." msgid "E517: No buffers were wiped out" -msgstr "E517: Kein Puffer wurde vollständig gelöscht." +msgstr "E517: Kein Buffer wurde vollständig gelöscht." #, c-format msgid "%d buffer unloaded" msgid_plural "%d buffers unloaded" -msgstr[0] "%d Puffer entladen" -msgstr[1] "%d Puffer entladen" +msgstr[0] "%d Buffer entladen" +msgstr[1] "%d Buffer entladen" #, c-format msgid "%d buffer deleted" msgid_plural "%d buffers deleted" -msgstr[0] "%d Puffer gelöscht" -msgstr[1] "%d Puffer gelöscht" +msgstr[0] "%d Buffer gelöscht" +msgstr[1] "%d Buffer gelöscht" #, c-format msgid "%d buffer wiped out" msgid_plural "%d buffers wiped out" -msgstr[0] "%d Puffer vollständig gelöscht" -msgstr[1] "%d Puffer vollständig gelöscht" +msgstr[0] "%d Buffer vollständig gelöscht" +msgstr[1] "%d Buffer vollständig gelöscht" msgid "E90: Cannot unload last buffer" -msgstr "E90: Kann letzten Puffer nicht entladen" +msgstr "E90: Kann letzten Buffer nicht entladen" msgid "E84: No modified buffer found" -msgstr "E84: Keinen veränderter Puffer gefunden" +msgstr "E84: Keinen veränderter Buffer gefunden" msgid "E85: There is no listed buffer" -msgstr "E85: Es gibt keine angezeigten Puffer." +msgstr "E85: Es gibt keine angezeigten Buffer." msgid "E87: Cannot go beyond last buffer" -msgstr "E87: Kann nicht über den letzten Puffer hinaus gehen." +msgstr "E87: Kann nicht über den letzten Buffer hinaus gehen." msgid "E88: Cannot go before first buffer" -msgstr "E88: Kann nicht vor den ersten Puffer gehen." +msgstr "E88: Kann nicht vor den ersten Buffer gehen." #, c-format msgid "E89: No write since last change for buffer %d (add ! to override)" msgstr "" -"E89: Puffer %d seit der letzten Änderung nicht gesichert (erzwinge mit !)" +"E89: Buffer %d seit der letzten Änderung nicht gesichert (erzwinge mit !)" msgid "E948: Job still running (add ! to end the job)" msgstr "E948: Job läuft noch (Beenden mit !)" @@ -195,7 +198,7 @@ #, c-format msgid "E92: Buffer %d not found" -msgstr "E92: Puffer %d nicht gefunden." +msgstr "E92: Buffer %d nicht gefunden." #, c-format msgid "E93: More than one match for %s" @@ -203,14 +206,14 @@ #, c-format msgid "E94: No matching buffer for %s" -msgstr "E94: Kein übereinstimmender Puffer für %s." +msgstr "E94: Kein übereinstimmender Buffer für %s." #, c-format msgid "line %ld" msgstr "Zeile %ld" msgid "E95: Buffer with this name already exists" -msgstr "E95: Ein Puffer mit diesem Namen existiert bereits." +msgstr "E95: Ein Buffer mit diesem Namen existiert bereits." msgid " [Modified]" msgstr " [Verändert]" @@ -283,11 +286,11 @@ msgstr "[Neue Datei]" msgid "E676: No matching autocommands for acwrite buffer" -msgstr "E676: Keine übereinstimmenden Autokommandos für acwrite Puffer" +msgstr "E676: Keine übereinstimmenden Autokommandos für acwrite Buffer" msgid "E203: Autocommands deleted or unloaded buffer to be written" msgstr "" -"E203: Autokommandos haben den zu schreibenden Puffer gelöscht oder entladen" +"E203: Autokommandos haben den zu schreibenden Buffer gelöscht oder entladen" msgid "E204: Autocommand changed number of lines in unexpected way" msgstr "" @@ -295,10 +298,10 @@ "verändert" msgid "NetBeans disallows writes of unmodified buffers" -msgstr "NetBeans verweigert das Schreiben von unveränderten Puffern." +msgstr "NetBeans verweigert das Schreiben von unveränderten Buffern." msgid "Partial writes disallowed for NetBeans buffers" -msgstr "Partielles Schreiben für NetBeans Puffer verweigert" +msgstr "Partielles Schreiben für NetBeans Buffer verweigert" msgid "is a directory" msgstr "ist ein Verzeichnis" @@ -457,19 +460,6 @@ "E912: Kann ch_evalexpr()/ch_sendexpr() nicht mit einem Raw oder NL Channel " "benutzen." -msgid "E920: _io file requires _name to be set" -msgstr "E920: Für _io Datei muss _name gesetzt ist." - -msgid "E915: in_io buffer requires in_buf or in_name to be set" -msgstr "E915: Für in_io Puffer muss in_buf oder in_name gesetzt sein." - -#, c-format -msgid "E918: buffer must be loaded: %s" -msgstr "E918: Puffer muss geladen sein: %s." - -msgid "E916: not a valid job" -msgstr "E916: kein gültiger Job" - msgid "No display" msgstr "Keine Anzeige" @@ -592,12 +582,12 @@ #, c-format msgid "E96: Cannot diff more than %d buffers" -msgstr "E96: Kann Diff für mehr als %d Puffer nicht erstellen." +msgstr "E96: Kann Diff für mehr als %d Buffer nicht erstellen." #, c-format msgid "Not enough memory to use internal diff for buffer \"%s\"" msgstr "" -"Nicht genügend Speicher vorhanden, um Puffer \"%s\" mit internem " +"Nicht genügend Speicher vorhanden, um Buffer \"%s\" mit internem " "Diffalgorithmus zu nutzen." msgid "E810: Cannot read or write temp files" @@ -622,27 +612,27 @@ msgstr "E959: Ungültiges Diff-Format" msgid "E99: Current buffer is not in diff mode" -msgstr "E99: Aktueller Puffer ist nicht im Diff-Modus." +msgstr "E99: Aktueller Buffer ist nicht im Diff-Modus." msgid "E793: No other buffer in diff mode is modifiable" -msgstr "E793: Kein weiterer Puffer im diff-Modues ist modifizierbar." +msgstr "E793: Kein weiterer Buffer im diff-Modues ist modifizierbar." msgid "E100: No other buffer in diff mode" -msgstr "E100: Kein weiterer Puffer ist im Diff-Modus." +msgstr "E100: Kein weiterer Buffer ist im Diff-Modus." msgid "E101: More than two buffers in diff mode, don't know which one to use" -msgstr "E101: Mehrdeutigkeit: Mehr als zwei Puffer im Diff-Modus." +msgstr "E101: Mehrdeutigkeit: Mehr als zwei Buffer im Diff-Modus." #, c-format msgid "E102: Can't find buffer \"%s\"" -msgstr "E102: Kann Puffer \"%s\" nicht finden." +msgstr "E102: Kann Buffer \"%s\" nicht finden." #, c-format msgid "E103: Buffer \"%s\" is not in diff mode" -msgstr "E103: Puffer \"%s\" ist nicht im Diff-Modus." +msgstr "E103: Buffer \"%s\" ist nicht im Diff-Modus." msgid "E787: Buffer changed unexpectedly" -msgstr "E787: Puffer änderte sich unerwartet." +msgstr "E787: Buffer änderte sich unerwartet." msgid "E104: Escape not allowed in digraph" msgstr "E104: ist in einem Digraphen nicht erlaubt." @@ -731,9 +721,6 @@ msgid "E791: Empty keymap entry" msgstr "E791: Leerer keymap Eintrag" -msgid "E719: Cannot use [:] with a Dictionary" -msgstr "E719: Kann [:] nicht mit einem Dictionary verwenden" - msgid "E689: Can only index a List, Dictionary or Blob" msgstr "E689: Kann nur Listen, Dictionary oder Blob indizieren" @@ -749,12 +736,6 @@ msgid "E996: Cannot lock a range" msgstr "E996: Kann Bereich nicht sperren" -msgid "E710: List value has more items than target" -msgstr "E710: Listenwert hat mehr Einträge als das Ziel." - -msgid "E711: List value has not enough items" -msgstr "E711: Listenwert hat nicht genügend Einträge." - msgid "E996: Cannot lock a list or dict" msgstr "E996: Kann List oder Dictionary nicht sperren" @@ -764,9 +745,6 @@ msgid "E695: Cannot index a Funcref" msgstr "E695: Kann keine Funktionsreferenz indizieren." -msgid "E909: Cannot index a special variable" -msgstr "E909: Kann Spezialvariable nicht indexieren." - msgid "Not enough memory to set references, garbage collection aborted!" msgstr "" "Nicht genügend Speicher um Referenzen zu setzen, Garbagecollection " @@ -790,7 +768,7 @@ #, c-format msgid "E158: Invalid buffer name: %s" -msgstr "E158: ungültige Puffernummer: %s" +msgstr "E158: ungültige Buffernummer: %s" msgid "&Ok" msgstr "&Ok" @@ -853,7 +831,7 @@ msgid "E990: Missing end marker '%s'" msgstr "E990: Fehlende Endmarkierung nach '%s'" -msgid "E985: .= is not supported with script version 2" +msgid "E985: .= is not supported with script version >= 2" msgstr "E985: .= wird mit Scriptversion 2 nicht mehr unterstützt." msgid "E687: Less targets than List items" @@ -882,13 +860,6 @@ msgid "E743: variable nested too deep for (un)lock" msgstr "E743: Variable ist zu tief verschachtelt zum (ent)sperren." -msgid "E1063: type mismatch for v: variable" -msgstr "E1063: Typendiskrepanz für v: Variable" - -#, c-format -msgid "E1041: Redefining script item %s" -msgstr "E1041: Neudefinition von Scriptelement %s" - #, c-format msgid "E963: setting %s to value with wrong type" msgstr "E963: %s auf Wert mit falschem Typ gesetzt" @@ -958,7 +929,7 @@ msgstr "%ld Zeilen gefiltert" msgid "E135: *Filter* Autocommands must not change current buffer" -msgstr "E135: *Filter*-Autokommandos dürfen den aktuellen Puffer nicht ändern" +msgstr "E135: *Filter*-Autokommandos dürfen den aktuellen Buffer nicht ändern" msgid "[No write since last change]\n" msgstr "[Nicht geschrieben seit der letzten Änderung]\n" @@ -970,7 +941,7 @@ msgstr "Partielle Datei schreiben?" msgid "E140: Use ! to write partial buffer" -msgstr "E140: Zum Schreiben von partiellen Puffern ! verwenden" +msgstr "E140: Zum Schreiben von partiellen Buffern ! verwenden" #, c-format msgid "Overwrite existing file \"%s\"?" @@ -986,7 +957,7 @@ #, c-format msgid "E141: No file name for buffer %ld" -msgstr "E141: Kein Dateiname für Puffer %ld" +msgstr "E141: Kein Dateiname für Buffer %ld" msgid "E142: File not written: Writing is disabled by 'write' option" msgstr "" @@ -1020,7 +991,7 @@ #, c-format msgid "E143: Autocommands unexpectedly deleted new buffer %s" -msgstr "E143: Autokommandos löschten unerwartet neuen Puffer %s" +msgstr "E143: Autokommandos löschten unerwartet neuen Buffer %s" msgid "E144: non-numeric argument to :z" msgstr "E144: Nicht-numerisches Argument für :z" @@ -1078,46 +1049,6 @@ msgid "Pattern not found: %s" msgstr "Muster nicht gefunden: %s" -msgid "E478: Don't panic!" -msgstr "E478: Nur keine Panik!" - -#, c-format -msgid "E661: Sorry, no '%s' help for %s" -msgstr "E661: Schade, keine '%s' Hilfe für %s" - -#, c-format -msgid "E149: Sorry, no help for %s" -msgstr "E149: Schade, keine Hilfe für %s" - -#, c-format -msgid "Sorry, help file \"%s\" not found" -msgstr "Hilfe-Datei \"%s\" nicht gefunden" - -#, c-format -msgid "E151: No match: %s" -msgstr "E151: Kein Treffer: %s" - -#, c-format -msgid "E152: Cannot open %s for writing" -msgstr "E152: %s kann nicht zum Schreiben geöffnet werden." - -#, c-format -msgid "E153: Unable to open %s for reading" -msgstr "E153: %s kann nicht zum Lesen geöffnet werden." - -#, c-format -msgid "E670: Mix of help file encodings within a language: %s" -msgstr "" -"E670: Mischung von Kodierungen einer Hilfedatei innerhalb einer Sprache: %s" - -#, c-format -msgid "E154: Duplicate tag \"%s\" in file %s/%s" -msgstr "E154: Doppelter Tag \"%s\" in der Datei %s/%s" - -#, c-format -msgid "E150: Not a directory: %s" -msgstr "E150: Kein Verzeichnis: %s" - msgid "No old files" msgstr "Keine Alt-Dateien" @@ -1127,15 +1058,15 @@ #, c-format msgid "E947: Job still running in buffer \"%s\"" -msgstr "E947: Job noch aktiv in Puffer \"%s\"" +msgstr "E947: Job noch aktiv in Buffer \"%s\"" #, c-format msgid "E162: No write since last change for buffer \"%s\"" -msgstr "E162: Puffer \"%s\" wurde seit der letzten Änderung nicht geschrieben." +msgstr "E162: Buffer \"%s\" wurde seit der letzten Änderung nicht geschrieben." msgid "Warning: Entered other buffer unexpectedly (check autocommands)" msgstr "" -"Achtung: Unerwartetet einen andren Puffer geöffnet (überprüfen Sie die " +"Achtung: Unerwartetet einen andren Buffer geöffnet (überprüfen Sie die " "Autokommandos)" #, c-format @@ -1152,14 +1083,6 @@ msgstr "" "W21: Erforderliche Python Version 3.x nicht unterstützt, ignoriere Datei: %s" -#, c-format -msgid "Current %slanguage: \"%s\"" -msgstr "Momentane %sSprache: \"%s\"" - -#, c-format -msgid "E197: Cannot set language to \"%s\"" -msgstr "E197: Sprache kann nicht auf \"%s\" gesetzt werden" - msgid "Entering Ex mode. Type \"visual\" to go to Normal mode." msgstr "" "Ex-Modus. Geben Sie \"visual\" ein, um zum Normal-Modus zurückzukehren." @@ -1202,16 +1125,16 @@ msgid "E494: Use w or w>>" msgstr "E494: Verwenden Sie w oder w>>" +msgid "E943: Command table needs to be updated, run 'make cmdidxs'" +msgstr "" +"E943: Befehlstabelle muss aktualisiert werden, führe 'make cmdidxs' aus" + msgid "" "INTERNAL: Cannot use EX_DFLALL with ADDR_NONE, ADDR_UNSIGNED or ADDR_QUICKFIX" msgstr "" "INTERN: Kann EX_DFLALL nicht zusammen mit ADDR_NONE, ADDR_UNSIGNED oder " "ADDR_QUICKFIX nutzen" -msgid "E943: Command table needs to be updated, run 'make cmdidxs'" -msgstr "" -"E943: Befehlstabelle muss aktualisiert werden, führe 'make cmdidxs' aus" - msgid "E319: Sorry, the command is not available in this version" msgstr "E319: Der Befehl ist in dieser Version nicht implementiert" @@ -1261,7 +1184,7 @@ msgid "E747: Cannot change directory, buffer is modified (add ! to override)" msgstr "" -"E747: Kann das Verzeichnis nicht wechseln, da der Puffer verändert wurde " +"E747: Kann das Verzeichnis nicht wechseln, da der Buffer verändert wurde " "(erzwinge mit !)" msgid "E186: No previous directory" @@ -1321,7 +1244,7 @@ msgstr "E495: Kein Autokommando-Dateiname zur Ersetzung mit \"\"" msgid "E496: no autocommand buffer number to substitute for \"\"" -msgstr "E496: Keine Autokommando-Puffernummer zur Ersetzung mit \"\"" +msgstr "E496: Keine Autokommando-Buffernummer zur Ersetzung mit \"\"" msgid "E497: no autocommand match name to substitute for \"\"" msgstr "" @@ -1330,6 +1253,9 @@ msgid "E498: no :source file name to substitute for \"\"" msgstr "E498: kein :source Dateiname zur Ersetzung mit \"\"" +msgid "E489: no call stack to substitute for \"\"" +msgstr "E489: kein CallStack zur Ersetzung mit \"\" vorhanden" + msgid "E842: no line number to use for \"\"" msgstr "E842: Keine Zeilennummer für \"\" vorhanden." @@ -1414,6 +1340,9 @@ msgid "E733: Using :endwhile with :for" msgstr "E733: Nutzung von :endwhile mit :for" +msgid "E579: block nesting too deep" +msgstr "E579: Block Schachtelung zu tief" + msgid "E601: :try nesting too deep" msgstr "E601: :try Schachtelung zu tief" @@ -1427,16 +1356,16 @@ msgstr "E193: :endfunction außerhalb einer Funktion" msgid "E788: Not allowed to edit another buffer now" -msgstr "E788: Einen weiteren Puffer zu editieren ist im Moment nicht erlaubt" +msgstr "E788: Einen weiteren Buffer zu editieren ist im Moment nicht erlaubt" msgid "E811: Not allowed to change buffer information now" -msgstr "E811: Puffer Information darf momentan nicht geändert werden." +msgstr "E811: Buffer Information darf momentan nicht geändert werden." msgid "E199: Active window or buffer deleted" -msgstr "E199: Aktives Fenster oder Puffer gelöscht" +msgstr "E199: Aktives Fenster oder Buffer gelöscht" msgid "E812: Autocommands changed buffer or buffer name" -msgstr "E812: Autokommandos veränderten Puffer oder Puffername." +msgstr "E812: Autokommandos veränderten Buffer oder Buffername." msgid "Illegal file name" msgstr "Unzulässiger Dateiname" @@ -1461,7 +1390,7 @@ msgid "E201: *ReadPre autocommands must not change current buffer" msgstr "" -"E201: *ReadPre Autokommandos dürfen nicht den aktuellen Puffer wechseln" +"E201: *ReadPre Autokommandos dürfen nicht den aktuellen Buffer wechseln" msgid "Vim: Reading from stdin...\n" msgstr "Vim: Lese von stdin...\n" @@ -1556,7 +1485,7 @@ msgstr "E210: Fehler beim Lesen von \"%s\"" msgid "E246: FileChangedShell autocommand deleted buffer" -msgstr "E246: FileChangedShell-Autokommando löschte Puffer" +msgstr "E246: FileChangedShell-Autokommando löschte Buffer" #, c-format msgid "E211: File \"%s\" no longer available" @@ -1567,7 +1496,7 @@ "W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as " "well" msgstr "" -"W12: Achtung: Datei \"%s\" wurde verändert und der Puffer wurde in Vim " +"W12: Achtung: Datei \"%s\" wurde verändert und der Buffer wurde in Vim " "ebenfalls verändert" msgid "See \":help W12\" for more info." @@ -1767,15 +1696,15 @@ "E232: BalloonEval kann nicht sowohl mit \"message\" als auch \"callback\" " "erzeugt werden" -msgid "_Cancel" -msgstr "_Abbrechen" - msgid "_Save" msgstr "_Speichern" msgid "_Open" msgstr "_Öffnen" +msgid "_Cancel" +msgstr "_Abbrechen" + msgid "_OK" msgstr "_OK" @@ -2101,6 +2030,46 @@ msgid "Print job sent." msgstr "Druckauftrag abgeschickt" +msgid "E478: Don't panic!" +msgstr "E478: Nur keine Panik!" + +#, c-format +msgid "E661: Sorry, no '%s' help for %s" +msgstr "E661: Schade, keine '%s' Hilfe für %s" + +#, c-format +msgid "E149: Sorry, no help for %s" +msgstr "E149: Schade, keine Hilfe für %s" + +#, c-format +msgid "Sorry, help file \"%s\" not found" +msgstr "Hilfe-Datei \"%s\" nicht gefunden" + +#, c-format +msgid "E151: No match: %s" +msgstr "E151: Kein Treffer: %s" + +#, c-format +msgid "E152: Cannot open %s for writing" +msgstr "E152: %s kann nicht zum Schreiben geöffnet werden." + +#, c-format +msgid "E153: Unable to open %s for reading" +msgstr "E153: %s kann nicht zum Lesen geöffnet werden." + +#, c-format +msgid "E670: Mix of help file encodings within a language: %s" +msgstr "" +"E670: Mischung von Kodierungen einer Hilfedatei innerhalb einer Sprache: %s" + +#, c-format +msgid "E154: Duplicate tag \"%s\" in file %s/%s" +msgstr "E154: Doppelter Tag \"%s\" in der Datei %s/%s" + +#, c-format +msgid "E150: Not a directory: %s" +msgstr "E150: Kein Verzeichnis: %s" + msgid "E679: recursive loop loading syncolor.vim" msgstr "E679: Rekursive Schleife beim Laden von syncolor.vim" @@ -2367,7 +2336,7 @@ msgstr "Fensterindex außerhalb des zulässigen Bereichs" msgid "couldn't open buffer" -msgstr "konnte Puffer nicht öffnen" +msgstr "konnte Buffer nicht öffnen" msgid "cannot delete line" msgstr "Zeile kann nicht gelöscht werden" @@ -2391,7 +2360,7 @@ msgstr "Vim Fehler" msgid "buffer is invalid" -msgstr "ungültiger Puffer" +msgstr "ungültiger Buffer" msgid "window is invalid" msgstr "ungültiges Fenster" @@ -2457,7 +2426,7 @@ msgstr "E273: Unbekannter longjmp Status %d" msgid "invalid buffer number" -msgstr "ungültige Puffernummer" +msgstr "ungültige Buffernummer" msgid "not implemented yet" msgstr "nicht implementiert" @@ -2492,12 +2461,12 @@ msgid "cannot create buffer/window command: object is being deleted" msgstr "" -"Puffer/Fenster-Befehl kann nicht ausgeführt werden: das Objekt wird gelöscht" +"Buffer/Fenster-Befehl kann nicht ausgeführt werden: das Objekt wird gelöscht" msgid "" "cannot register callback command: buffer/window is already being deleted" msgstr "" -"kann keinen Callback-Befehl registrieren: Puffer/Fenster ist bereits gelöscht" +"kann keinen Callback-Befehl registrieren: Buffer/Fenster ist bereits gelöscht" msgid "" "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim." @@ -2508,7 +2477,7 @@ msgid "cannot register callback command: buffer/window reference not found" msgstr "" -"kann keinen Callback-Befehl registrieren: Puffer/Fenster-Referenz nicht " +"kann keinen Callback-Befehl registrieren: Buffer/Fenster-Referenz nicht " "gefunden" msgid "" @@ -2650,6 +2619,19 @@ msgid "match %d" msgstr "Treffer %d" +msgid "E920: _io file requires _name to be set" +msgstr "E920: Für _io Datei muss _name gesetzt ist." + +msgid "E915: in_io buffer requires in_buf or in_name to be set" +msgstr "E915: Für in_io Buffer muss in_buf oder in_name gesetzt sein." + +#, c-format +msgid "E918: buffer must be loaded: %s" +msgstr "E918: Buffer muss geladen sein: %s." + +msgid "E916: not a valid job" +msgstr "E916: kein gültiger Job" + #, c-format msgid "E491: json decode error at '%s'" msgstr "E491: JSON Dekodierungsfehler in Zeile '%s'" @@ -2687,6 +2669,9 @@ msgid "map() argument" msgstr "map() Argument" +msgid "mapnew() argument" +msgstr "mapnew() Argument" + msgid "filter() argument" msgstr "filter() Argument" @@ -2702,6 +2687,14 @@ msgid "reverse() argument" msgstr "reverse() Argument" +#, c-format +msgid "Current %slanguage: \"%s\"" +msgstr "Momentane %sSprache: \"%s\"" + +#, c-format +msgid "E197: Cannot set language to \"%s\"" +msgstr "E197: Sprache kann nicht auf \"%s\" gesetzt werden" + msgid "Unknown option argument" msgstr "Unbekanntes Optionsargument" @@ -3431,16 +3424,21 @@ "und \"diff\" mit der Original-Datei ausführen, um Änderungen zu prüfen)" msgid "Recovery completed. Buffer contents equals file contents." -msgstr "Recovery durchgeführt. Pufferinhalt entspricht Dateiinhalt." +msgstr "Recovery durchgeführt. Bufferinhalt entspricht Dateiinhalt." msgid "" "\n" -"You may want to delete the .swp file now.\n" -"\n" +"You may want to delete the .swp file now." msgstr "" "\n" -"Sie können die Swap Datei jetzt löschen.\n" +"Sie können die Swap Datei .swp jetzt löschen." + +msgid "" +"\n" +"Note: process STILL RUNNING: " +msgstr "" "\n" +" (Prozess LÄUFT NOCH)" msgid "Using crypt key from swap file for the text file.\n" msgstr "Benutze den Schlüssel der Swap Datei für die Textdatei.\n" @@ -3553,7 +3551,7 @@ #, c-format msgid "E316: ml_get: cannot find line %ld in buffer %d %s" -msgstr "E316: ml_get: kann Zeile %ld in Puffer %d %s nicht finden" +msgstr "E316: ml_get: kann Zeile %ld in Buffer %d %s nicht finden" msgid "E317: pointer block id wrong 3" msgstr "E317: Zeiger Block id falsch 3" @@ -3747,6 +3745,10 @@ msgstr "E337: Menü nicht gefunden - überprüfe Menü-Namen" #, c-format +msgid "Error detected while compiling %s:" +msgstr "Fehler beim Ausführen von %s:" + +#, c-format msgid "Error detected while processing %s:" msgstr "Fehler beim Ausführen von \"%s\":" @@ -3813,11 +3815,12 @@ msgid "Type number and or click with the mouse (q or empty cancels): " msgstr "" -"Bitte Nummer und eingeben oder mit der Maus auswählen " -"(abbrechen mit q oder ): " +"Bitte Nummer und eingeben oder mit der Maus auswählen (abbrechen mit " +"q oder ): " msgid "Type number and (q or empty cancels): " -msgstr "Gewünschte Nummer und eingeben (abbrechen mit q oder ): " +msgstr "" +"Gewünschte Nummer und eingeben (abbrechen mit q oder ): " #, c-format msgid "%ld more line" @@ -3894,7 +3897,7 @@ #, c-format msgid "E658: NetBeans connection lost for buffer %d" -msgstr "E658: Verbindung zu NetBeans für Puffer %d verloren" +msgstr "E658: Verbindung zu NetBeans für Buffer %d verloren" msgid "E838: netbeans is not supported with this GUI" msgstr "E838: netbeans wird nicht unterstützt mit dieser GUI." @@ -4098,7 +4101,6 @@ msgid "E540: Unclosed expression sequence" msgstr "E540: Nicht-geschlossene Ausdrucksfolge" - msgid "E542: unbalanced groups" msgstr "E542: Unausgewogene Gruppen" @@ -4401,7 +4403,7 @@ msgstr "E861: Kann kein zweites Popup mit Terminal öffen" msgid "E450: buffer number, text or a list required" -msgstr "E450: Puffernummer, Text oder Liste erforderlich" +msgstr "E450: Buffernummer, Text oder Liste erforderlich" #, c-format msgid "E997: Tabpage not found: %d" @@ -4423,6 +4425,9 @@ msgid "E553: No more items" msgstr "E553: Keine weiteren Einträge" +msgid "E925: Current quickfix list was changed" +msgstr "E925: Aktuelle Quickfix Liste wurde geändert." + msgid "E926: Current location list was changed" msgstr "E926: Aktuelle Positionsliste wurde geändert." @@ -4458,9 +4463,6 @@ msgid "E924: Current window was closed" msgstr "E924: Aktuelles Fenster wurde geschlossen." -msgid "E925: Current quickfix was changed" -msgstr "E925: Aktuelle Quickfix wurde geändert." - #, c-format msgid "(%d of %d)%s%s: " msgstr "(%d aus %d)%s%s: " @@ -4495,7 +4497,7 @@ msgstr "Kann nicht sowohl Liste und ein \"what\" Argument haben" msgid "E681: Buffer is not loaded" -msgstr "E681: Puffer ist nicht geladen" +msgstr "E681: Buffer ist nicht geladen" msgid "E777: String or List expected" msgstr "E777: Zeichenkette oder Liste erwartet" @@ -4846,9 +4848,6 @@ msgid "E984: :scriptversion used outside of a sourced file" msgstr "E984: :scriptversion außerhalb einer eingelesenen Datei" -msgid "E1040: Cannot use :scriptversion after :vim9script" -msgstr "E1040: :scriptversion kann nicht nach :vim9script verwendet werden" - #, c-format msgid "E999: scriptversion not supported: %d" msgstr "E999: scriptversion nicht unterstützt: %d" @@ -4966,7 +4965,7 @@ msgstr "E157: Ungültige Zeichen-ID: %d" msgid "E934: Cannot jump to a buffer that does not have a name" -msgstr "E934: Kann nicht zu einem Puffer ohne Namen springen." +msgstr "E934: Kann nicht zu einem Buffer ohne Namen springen." #, c-format msgid "E160: Unknown sign command: %s" @@ -4992,7 +4991,7 @@ "Achtung: Kann Wortliste \"%s.%s.spl\" oder \"%s.ascii.spl\" nicht finden" msgid "E797: SpellFileMissing autocommand deleted buffer" -msgstr "E797: SpellFileMissing-Autokommando löschte Puffer" +msgstr "E797: SpellFileMissing-Autokommando löschte Buffer" #, c-format msgid "Warning: region %s not supported" @@ -5354,7 +5353,7 @@ msgstr "E390: Unerlaubtes Argument: %s" msgid "No Syntax items defined for this buffer" -msgstr "Keine Syntax-Elemente für diesen Puffer definiert" +msgstr "Keine Syntax-Elemente für diesen Buffer definiert" msgid "'redrawtime' exceeded, syntax highlighting disabled" msgstr "'redrawtime' überschritten, Syntaxhighlighting deaktiviert" @@ -5404,6 +5403,9 @@ msgid "no syncing" msgstr "keine Synchronisation" +msgid "syncing starts at the first line" +msgstr "Synchronisation beginnt in der ersten Zeile" + msgid "syncing starts " msgstr "Synchronisation beginnt " @@ -5435,6 +5437,9 @@ msgid "E392: No such syntax cluster: %s" msgstr "E392: Kein solcher Syntax-Cluster: %s" +msgid "from the first line" +msgstr " aus der ersten Zeile" + msgid "minimal " msgstr "minimal " @@ -5693,7 +5698,7 @@ msgstr "E953: Datei existiert bereits: %s" msgid "E955: Not a terminal buffer" -msgstr "E955: Kein Terminal Puffer" +msgstr "E955: Kein Terminal Buffer" msgid "E982: ConPTY is not available" msgstr "E982: ConPTY ist nicht verfügbar" @@ -5714,7 +5719,7 @@ msgstr "E965: Fehlender Eigenschaften Typname" msgid "E275: Cannot add text property to unloaded buffer" -msgstr "E275: Kann Texteigenschaft nicht einem entladenen Puffer hinzufügen" +msgstr "E275: Kann Texteigenschaft nicht einem entladenen Buffer hinzufügen" msgid "E967: text property info corrupted" msgstr "E967: Texteigenschaft-Info beschädigt" @@ -5758,6 +5763,9 @@ msgid "E728: Using a Dictionary as a Number" msgstr "E728: Dictionary als Zahl verwendet." +msgid "E611: Using a Special as a Number" +msgstr "E611: Special als Zahl verwendet." + msgid "E910: Using a Job as a Number" msgstr "E910: Job als Zahl verwendet." @@ -6065,17 +6073,6 @@ msgid "E853: Duplicate argument name: %s" msgstr "E853: Doppelter Argumentname: %s" -#, c-format -msgid "E1059: No white space allowed before colon: %s" -msgstr "E1059: Keine Leerzeichen erlaubt vor : %s" - -#, c-format -msgid "E1077: Missing argument type for %s" -msgstr "E1077: Fehlender Argumenttyp für %s" - -msgid "E1055: Missing name after ..." -msgstr "E1055: Fehlender Name nach ..." - msgid "E989: Non-default argument follows default argument" msgstr "E989: Nicht-default Argument folgt auf default Argument" @@ -6154,17 +6151,10 @@ msgstr "E862: g: kann hier nicht genutzt werden" #, c-format -msgid "E1056: expected a type: %s" -msgstr "E1056: Typ erwartet: %s" - -#, c-format msgid "E932: Closure function should not be at top level: %s" msgstr "" "E932: Closure Funktion kann nicht auf äussersten Level definiert sein: %s" -msgid "E1057: Missing :enddef" -msgstr "E1057: Fehlendes :enddef" - msgid "E126: Missing :endfunction" msgstr "E126: Fehlendes :endfunction" @@ -6176,9 +6166,6 @@ msgid "W22: Text found after :endfunction: %s" msgstr "W22: Überschüssiger Text nach :endfunction: %s" -msgid "E1058: function nesting too deep" -msgstr "E1058: Funktions-Schachtelung zu tief" - #, c-format msgid "E707: Function name conflicts with variable: %s" msgstr "E707: Funktionsname kollidiert mit Variable: %s" @@ -6196,10 +6183,6 @@ msgid "E131: Cannot delete function %s: It is in use" msgstr "E131: Funktion %s kann nicht gelöscht werden: sie ist in Verwendung" -#, c-format -msgid "E1084: Cannot delete Vim9 script function %s" -msgstr "E1084: Vim9 Funktion %s kann nicht gelöscht werden" - msgid "E133: :return not inside a function" msgstr "E133: :return außerhalb einer Funktion" @@ -6365,12 +6348,6 @@ msgid "with GUI." msgstr "mit GUI." -msgid "with Carbon GUI." -msgstr "mit Carbon GUI." - -msgid "with Cocoa GUI." -msgstr "mit Cocoa GUI." - msgid " Features included (+) or not (-):\n" msgstr " Ein- (+) oder ausschließlich (-) der Eigenschaften:\n" @@ -6499,322 +6476,61 @@ msgid "menu Help->Sponsor/Register for information " msgstr "Menü Hilfe->Sponsor/Register für mehr Informationen " -#, c-format -msgid "E1001: variable not found: %s" -msgstr "E1001: Variable nicht gefunden: %s" +msgid "[end of lines]" +msgstr "[Zeilenende]" -#, c-format -msgid "E1002: Syntax error at %s" -msgstr "E1002: Syntaxfehler bei %s" +msgid "global" +msgstr "global" -#, c-format -msgid "E1006: %s is used as an argument" -msgstr "E1006: %s wird als Argument verwendet" +msgid "buffer" +msgstr "Buffer" -msgid "E1031: Cannot use void value" -msgstr "E1031: Kann nicht void Wert verwenden" +msgid "window" +msgstr "Fenster" -#, c-format -msgid "E1013: type mismatch, expected %s but got %s" -msgstr "E1013: Typendiskrepanz, erwartete %s erhielt jedoch %s" +msgid "tab" +msgstr "Reiter" + +msgid "" +"\n" +"# Buffer list:\n" +msgstr "" +"\n" +"# Liste der Buffer:\n" #, c-format -msgid "E1013: argument %d: type mismatch, expected %s but got %s" -msgstr "E1013: Argument %d: Typendiskrepanz, erwartete %s erhielt jedoch %s" +msgid "" +"\n" +"# %s History (newest to oldest):\n" +msgstr "" +"\n" +"# %s Geschichte (neueste bis älteste):\n" -msgid "E1051: wrong argument type for +" -msgstr "E1051: Falscher Argumenttyp für +" +msgid "Command Line" +msgstr "Befehlszeile" -#, c-format -msgid "E1036: %c requires number or float arguments" -msgstr "E1036: %c benötigt Nummer oder Float als Argument" +msgid "Search String" +msgstr "Suchausdruck" -msgid "E1035: % requires number arguments" -msgstr "E1035: % benötigt numerische Argumente" +msgid "Expression" +msgstr "Ausdruck" -#, c-format -msgid "E1037: Cannot use \"%s\" with %s" -msgstr "E1037: Kann nicht \"%s\" mit %s verwenden" +msgid "Input Line" +msgstr "Eingabe-Zeile" -#, c-format -msgid "E1072: Cannot compare %s with %s" -msgstr "E1072: Kann %s nicht mit %s vergleichen" +msgid "Debug Line" +msgstr "Debug-Zeile" + +msgid "" +"\n" +"# Bar lines, copied verbatim:\n" +msgstr "" +"\n" +"# |-Zeilen, wortwörtlich kopiert:\n" #, c-format -msgid "E1085: Not a callable type: %s" -msgstr "E1085: Kein aufrufbarer Typ: %s" - -msgid "E1008: Missing " -msgstr "E1008: Fehlendes " - -msgid "E1009: Missing > after type" -msgstr "E1009: Fehlendes '>' nach Typ" - -msgid "E1076: This Vim is not compiled with float support" -msgstr "E1076: Vim wurde nicht mit der \"float\"-Eigenschaft übersetzt." - -msgid "E1007: mandatory argument after optional argument" -msgstr "E1007: obligatories Argument nach optionalem Argument" - -msgid "E740: Too many argument types" -msgstr "E740: Zu viele Argumenttypen" - -#, c-format -msgid "E1010: Type not recognized: %s" -msgstr "E1010: Unbekannter Typ: %s" - -#, c-format -msgid "E1060: expected dot after name: %s" -msgstr "E1060: erwarte Punkt nach Name: %s" - -msgid "E1074: no white space allowed after dot" -msgstr "E1074: Keine Leerzeichen nach Punkt erlaubt" - -#, c-format -msgid "E1050: Item not found: %s" -msgstr "E1050: Element nicht gefunden: %s" - -#, c-format -msgid "E1011: name too long: %s" -msgstr "E1011: Name zu lang: %s" - -#, c-format -msgid "E1014: Invalid key: %s" -msgstr "E1014: Ungültiger Schlüssel: %s" - -msgid "[end of lines]" -msgstr "[Zeilenende]" - -#, c-format -msgid "E1015: Name expected: %s" -msgstr "E1015: Name erwartet: %s" - -msgid "E1096: Returning a value in a function without a return type" -msgstr "E1096: Rückgabe eines Wertes einer Funktion ohne Rückgabetyp" - -msgid "E1003: Missing return value" -msgstr "E1003: Fehlender Returnwert" - -msgid "global" -msgstr "global" - -msgid "buffer" -msgstr "Puffer" - -msgid "window" -msgstr "Fenster" - -msgid "tab" -msgstr "Reiter" - -msgid "E1092: Cannot use a list for a declaration" -msgstr "E1092: Kann Liste nicht als Deklaration verwenden" - -#, c-format -msgid "E1052: Cannot declare an option: %s" -msgstr "E1052: Kann keine Option deklarieren: %s" - -#, c-format -msgid "E1066: Cannot declare a register: %s" -msgstr "E1066: Kann kein Register deklarieren: %s" - -#, c-format -msgid "E1034: Cannot use reserved name %s" -msgstr "E1034: Kann reservierten Namen nicht benutzen %s" - -#, c-format -msgid "E1017: Variable already declared: %s" -msgstr "E1017: Variable bereits deklariert: %s" - -#, c-format -msgid "E1018: Cannot assign to a constant: %s" -msgstr "E1018: Kann nicht einer Konstante zuweisen: %s" - -#, c-format -msgid "E1054: Variable already declared in the script: %s" -msgstr "E1054: Variable bereits in Script %s deklariert" - -#, c-format -msgid "E1082: Cannot use a namespaced variable: %s" -msgstr "E1082: Kann eine Variable im Namesraum nicht verwenden: %s" - -#, c-format -msgid "E1089: unknown variable: %s" -msgstr "E1089: Unbekannte Variable: %s" - -msgid "E1019: Can only concatenate to string" -msgstr "E1019: Kann nur zu einer Zeichenkette verkettet werden" - -#, c-format -msgid "E1020: cannot use an operator on a new variable: %s" -msgstr "E1020: kann Operator nicht auf eine neue Variable %s anwenden" - -msgid "E1087: cannot use an index when declaring a variable" -msgstr "E1087: Kann Index nicht verwenden, wenn eine Variable deklariert wird" - -#, c-format -msgid "E1088: cannot use an index on %s" -msgstr "E1088: Kann Index auf: %s nicht verwenden" - -#, c-format -msgid "E1090: Cannot assign to argument %s" -msgstr "E1090: Kann dem Argument nicht zuweisen %s" - -#, c-format -msgid "E1081: Cannot unlet %s" -msgstr "E1081: Kann Variable nicht entfernen %s" - -#, c-format -msgid "E1023: variable already defined: %s" -msgstr "E1023: Variable existiert bereits: %s" - -msgid "E1033: catch unreachable after catch-all" -msgstr "E1033: catch unerreichbar nach catch-all" - -#, c-format -msgid "E1067: Separator mismatch: %s" -msgstr "E1067: Separator-Unstimmigkeit %s" - -msgid "E1032: missing :catch or :finally" -msgstr "E1032: fehlendes :catch oder :finally" - -msgid "E1083: missing backtick" -msgstr "E1083: Fehlender Backtick" - -#, c-format -msgid "E488: Trailing characters: %s" -msgstr "E488: Überschüssige Zeichen: %s" - -msgid "E1025: using } outside of a block scope" -msgstr "E1025: } außerhalb eines Blockbereichs verwendet" - -msgid "E1095: Unreachable code after :return" -msgstr "E1095: Nicht erreichbarer Code nach :return" - -msgid "E1086: Cannot use :function inside :def" -msgstr "E1086: Kann :function nicht innerhalb von :def verwenden" - -msgid "E1026: Missing }" -msgstr "E1026: Fehlendes }" - -msgid "E1027: Missing return statement" -msgstr "E1027: Fehlende Return Anweisung" - -msgid "E1028: compile_def_function failed" -msgstr "E1028: compile_def_function fehlgeschlagen" - -#, c-format -msgid "E1091: Function is not compiled: %s" -msgstr "E1091: Funktion ist nicht kompiliert: %s" - -#, c-format -msgid "E121: Undefined variable: %c:%s" -msgstr "E121: Undefinierte Variable: %c:%s" - -#, c-format -msgid "E1029: Expected %s but got %s" -msgstr "E1029: Erwartete %s, aber erhielt %s" - -#, c-format -msgid "E1093: Expected %d items but got %d" -msgstr "E1093: Erwartete %d Einträge, aber erhielt %d" - -#, c-format -msgid "E1061: Cannot find function %s" -msgstr "E1061: Funktion %s nicht gefunden" - -#, c-format -msgid "E1062: Function %s is not compiled" -msgstr "E1062: Funktion %s ist nicht kompiliert" - -msgid "E1030: Using a String as a Number" -msgstr "E1030: Verwende Zeichenkette als Nummer" - -msgid "E1042: export can only be used in vim9script" -msgstr "E1042: export kann nur für Vim9script verwendet werden" - -msgid "E1038: vim9script can only be used in a script" -msgstr "E1038: vim9script kann nur innerhalb eines Scripts verwendet werden" - -msgid "E1039: vim9script must be the first command in a script" -msgstr "E1039: vim9script muss erster Befehl in einem Script sein" - -msgid "E1044: export with invalid argument" -msgstr "E1044: export mit ungültigem Argument" - -msgid "E1043: Invalid command after :export" -msgstr "E1043: Ungültiger Befehl nach :export" - -msgid "E1094: import can only be used in a script" -msgstr "E1094: import kann nur innerhalb eines Scripts verwendet werden" - -#, c-format -msgid "E1049: Item not exported in script: %s" -msgstr "E1049: Element nicht exportiert in Script: %s" - -#, c-format -msgid "E1048: Item not found in script: %s" -msgstr "E1048: Element nicht in Script %s gefunden" - -msgid "E1047: syntax error in import" -msgstr "E1047: Syntaxfehler in import" - -msgid "E1046: Missing comma in import" -msgstr "E1046: Fehlendes Komma in import" - -msgid "E1045: Missing \"as\" after *" -msgstr "E1045: Fehlendes \"as\" nach *" - -msgid "E1070: Missing \"from\"" -msgstr "E1070: Fehlendes \"from\"" - -msgid "E1071: Invalid string after \"from\"" -msgstr "E1071: Ungültige Zeichenkette nach \"from\"" - -#, c-format -msgid "E1053: Could not import \"%s\"" -msgstr "E1053: Konnte \"%s\" nicht importieren" - -msgid "" -"\n" -"# Buffer list:\n" -msgstr "" -"\n" -"# Liste der Puffer:\n" - -#, c-format -msgid "" -"\n" -"# %s History (newest to oldest):\n" -msgstr "" -"\n" -"# %s Geschichte (neueste bis älteste):\n" - -msgid "Command Line" -msgstr "Befehlszeile" - -msgid "Search String" -msgstr "Suchausdruck" - -msgid "Expression" -msgstr "Ausdruck" - -msgid "Input Line" -msgstr "Eingabe-Zeile" - -msgid "Debug Line" -msgstr "Debug-Zeile" - -msgid "" -"\n" -"# Bar lines, copied verbatim:\n" -msgstr "" -"\n" -"# |-Zeilen, wortwörtlich kopiert:\n" - -#, c-format -msgid "%sviminfo: %s in line: " -msgstr "%sviminfo: %s in Zeile: " +msgid "%sviminfo: %s in line: " +msgstr "%sviminfo: %s in Zeile: " msgid "E136: viminfo: Too many errors, skipping rest of file" msgstr "E136: viminfo: Zu viele Fehler; überspringe Rest der Datei" @@ -6947,7 +6663,7 @@ #, c-format msgid "E92: Buffer %ld not found" -msgstr "E92: Puffer %ld nicht gefunden." +msgstr "E92: Buffer %ld nicht gefunden." msgid "E441: There is no preview window" msgstr "E441: Es gibt kein Vorschaufenster" @@ -7020,928 +6736,2758 @@ msgid "Path length too long!" msgstr "Die Länge des Pfads ist zu groß!" -msgid "--No lines in buffer--" -msgstr "--Keine Zeilen im Puffer--" +#, c-format +msgid "E121: Undefined variable: %s" +msgstr "E121: Undefinierte Variable: %s" -msgid "E470: Command aborted" -msgstr "E470: Befehl abgebrochen" +#, c-format +msgid "E121: Undefined variable: %c:%s" +msgstr "E121: Undefinierte Variable: %c:%s" -msgid "E471: Argument required" -msgstr "E471: Argument benötigt" +msgid "E476: Invalid command" +msgstr "E476: Ungültiger Befehl" -msgid "E10: \\ should be followed by /, ? or &" -msgstr "E10: \\ sollte von /, ? oder & gefolgt werden" +#, c-format +msgid "E476: Invalid command: %s" +msgstr "E476: Ungültiger Befehl: %s" -msgid "E11: Invalid in command-line window; executes, CTRL-C quits" -msgstr "E11: Ungültig im Kommandozeilenfenster; führt aus, CTRL-C beendet" +msgid "E710: List value has more items than targets" +msgstr "E710: Listenwert hat mehr Einträge als das Ziel" -msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search" -msgstr "" -"E12: Befehl nicht zulässig vom exrc/vimrc in der momentanen Verzeichnis- " -"oder Tag-Suche" +msgid "E711: List value does not have enough items" +msgstr "E711: Listenwert hat nicht genügend Einträge" -msgid "E171: Missing :endif" -msgstr "E171: Fehlendes :endif" +msgid "E719: Cannot slice a Dictionary" +msgstr "E719: Kann Slice [:] nicht mit einem Dictionary verwenden" -msgid "E603: :catch without :try" -msgstr "E603: :catch ohne :try" +msgid "" +"E856: \"assert_fails()\" second argument must be a string or a list with one " +"or two strings" +msgstr "" +"E856: \"assert_fails()\" zweites Argument muss eine Zeichenkette oder eine Liste " +"von ein oder zwei Zeichenketten sein" -msgid "E606: :finally without :try" -msgstr "E606: :finally ohne :try" +msgid "E909: Cannot index a special variable" +msgstr "E909: Kann Spezialvariable nicht indexieren." -msgid "E607: multiple :finally" -msgstr "E607: Mehrere :finally" +#, c-format +msgid "E1100: Missing :var: %s" +msgstr "E1100: Fehlende Variable: %s" -msgid "E600: Missing :endtry" -msgstr "E600: Fehlendes :endtry" +#, c-format +msgid "E1001: Variable not found: %s" +msgstr "E1001: Variable nicht gefunden: %s" -msgid "E602: :endtry without :try" -msgstr "E602: :endtry ohne :try" +#, c-format +msgid "E1002: Syntax error at %s" +msgstr "E1002: Syntaxfehler bei %s" -msgid "E170: Missing :endwhile" -msgstr "E170: fehlendes :endwhile" +msgid "E1003: Missing return value" +msgstr "E1003: Fehlender Returnwert" -msgid "E170: Missing :endfor" -msgstr "E170: Fehlendes :endfor" +#, c-format +msgid "E1004: White space required before and after '%s'" +msgstr "E1004: Leerzeichen vor und nach '%s' benötigt" -msgid "E588: :endwhile without :while" -msgstr "E588: :endwhile ohne :while" +msgid "E1005: Too many argument types" +msgstr "E1005: Zu viele Argumenttypen" -msgid "E588: :endfor without :for" -msgstr "E588: :endfor ohne :for" +#, c-format +msgid "E1006: %s is used as an argument" +msgstr "E1006: %s wird als Argument verwendet" -msgid "E13: File exists (add ! to override)" -msgstr "E13: Datei existiert bereits (erzwinge mit !)" +msgid "E1007: Mandatory argument after optional argument" +msgstr "E1007: obligatorisches Argument nach optionalem Argument" -msgid "E472: Command failed" -msgstr "E472: Befehl fehlgeschlagen" +msgid "E1008: Missing " +msgstr "E1008: Fehlendes " + +msgid "E1009: Missing > after type" +msgstr "E1009: Fehlendes '>' nach Typ" #, c-format -msgid "E234: Unknown fontset: %s" -msgstr "E234: Unbekannter Fontset: %s" +msgid "E1010: Type not recognized: %s" +msgstr "E1010: Unbekannter Typ: %s" #, c-format -msgid "E235: Unknown font: %s" -msgstr "E235: Unbekannte Schriftart: %s" +msgid "E1011: Name too long: %s" +msgstr "E1011: Name zu lang: %s" #, c-format -msgid "E236: Font \"%s\" is not fixed-width" -msgstr "E236: Schriftart \"%s\" hat keine feste Breite" +msgid "E1012: Type mismatch; expected %s but got %s" +msgstr "E1012: Typendiskrepanz, erwartete %s erhielt jedoch %s" -msgid "E473: Internal error" -msgstr "E473: Interner Fehler" +#, c-format +msgid "E1013: Argument %d: type mismatch, expected %s but got %s" +msgstr "E1013: Argument %d: Typendiskrepanz, erwartete %s erhielt jedoch %s" #, c-format -msgid "E685: Internal error: %s" -msgstr "E685: Interner Fehler: %s" +msgid "E1014: Invalid key: %s" +msgstr "E1014: Ungültiger Schlüssel: %s" -msgid "Interrupted" -msgstr "Unterbrochen" +#, c-format +msgid "E1015: Name expected: %s" +msgstr "E1015: Name erwartet: %s" -msgid "E474: Invalid argument" -msgstr "E474: Ungültiges Argument" +#, c-format +msgid "E1016: Cannot declare a %s variable: %s" +msgstr "E1016: Kann eine %s Variable nicht deklarieren: %s" #, c-format -msgid "E475: Invalid argument: %s" -msgstr "E475: Ungültiges Argument: %s" +msgid "E1016: Cannot declare an environment variable: %s" +msgstr "E1016: Kann eine Umgebungsvariable nicht deklarieren: %s" #, c-format -msgid "E983: Duplicate argument: %s" -msgstr "E983: Doppeltes Argument: %s" +msgid "E1017: Variable already declared: %s" +msgstr "E1017: Variable bereits deklariert: %s" #, c-format -msgid "E475: Invalid value for argument %s" -msgstr "E475: Ungültiger Wert für Argument: %s" +msgid "E1018: Cannot assign to a constant: %s" +msgstr "E1018: Kann nicht einer Konstante zuweisen: %s" + +msgid "E1019: Can only concatenate to string" +msgstr "E1019: Kann nur zu einer Zeichenkette verkettet werden" #, c-format -msgid "E475: Invalid value for argument %s: %s" -msgstr "E475: Ungültiger Wert für Argument %s: %s" +msgid "E1020: Cannot use an operator on a new variable: %s" +msgstr "E1020: kann Operator nicht auf eine neue Variable %s anwenden" + +msgid "E1021: Const requires a value" +msgstr "E1021: const erfordert einen Wert" + +msgid "E1022: Type or initialization required" +msgstr "E1022: Typ oder Initialisierung erforderlich" #, c-format -msgid "E15: Invalid expression: %s" -msgstr "E15: ungültiger Ausdruck: %s" +msgid "E1023: Using a Number as a Bool: %d" +msgstr "E1023: Zahl: %d als Bool verwendet" -msgid "E16: Invalid range" -msgstr "E16: Ungültiger Bereich" +msgid "E1024: Using a Number as a String" +msgstr "E1024: Zahl als String verwendet" -msgid "E476: Invalid command" -msgstr "E476: Ungültiger Befehl" +msgid "E1025: Using } outside of a block scope" +msgstr "E1025: } außerhalb eines Blockbereichs verwendet" + +msgid "E1026: Missing }" +msgstr "E1026: Fehlendes }" + +msgid "E1027: Missing return statement" +msgstr "E1027: Fehlende Return Anweisung" + +msgid "E1028: Compiling :def function failed" +msgstr "E1028: Kompilieren von :def Funktion fehlgeschlagen" #, c-format -msgid "E17: \"%s\" is a directory" -msgstr "E17: \"%s\" ist ein Verzeichnis" +msgid "E1029: Expected %s but got %s" +msgstr "E1029: Erwartete %s, aber erhielt %s" -msgid "E756: Spell checking is not possible" -msgstr "E756: Rechtschreibprüfung ist nicht möglich" +#, c-format +msgid "E1030: Using a String as a Number: \"%s\"" +msgstr "E1030: Verwende Zeichenkette als Nummer: \"%s\"" + +msgid "E1031: Cannot use void value" +msgstr "E1031: Kann nicht void Wert verwenden" + +msgid "E1032: Missing :catch or :finally" +msgstr "E1032: fehlendes :catch oder :finally" + +msgid "E1033: Catch unreachable after catch-all" +msgstr "E1033: catch unerreichbar nach catch-all" #, c-format -msgid "E364: Library call failed for \"%s()\"" -msgstr "E364: Bibliotheksaufruf für \"%s()\" schlug fehl" +msgid "E1034: Cannot use reserved name %s" +msgstr "E1034: Kann reservierten Namen nicht benutzen %s" -msgid "E667: Fsync failed" -msgstr "E667: Fsync fehlgeschlagen" +msgid "E1035: % requires number arguments" +msgstr "E1035: % benötigt numerische Argumente" #, c-format -msgid "E448: Could not load library function %s" -msgstr "E448: Bibliotheksfunktion %s konnte nicht geladen werden" +msgid "E1036: %c requires number or float arguments" +msgstr "E1036: %c benötigt Nummer oder Float als Argument" -msgid "E19: Mark has invalid line number" -msgstr "E19: Markierung hat ungültige Zeilennummer" +#, c-format +msgid "E1037: Cannot use \"%s\" with %s" +msgstr "E1037: Kann nicht \"%s\" mit %s verwenden" -msgid "E20: Mark not set" -msgstr "E20: Markierung nicht gesetzt" +msgid "E1038: \"vim9script\" can only be used in a script" +msgstr "E1038: \"vim9script\" kann nur innerhalb eines Scripts verwendet werden" -msgid "E21: Cannot make changes, 'modifiable' is off" -msgstr "E21: Kann keine Änderungen machen, 'modifiable' ist aus" +msgid "E1039: \"vim9script\" must be the first command in a script" +msgstr "E1039: \"vim9script\" muss erster Befehl in einem Script sein" -msgid "E22: Scripts nested too deep" -msgstr "E22: Skript ist zu tief verschachtelt" +msgid "E1040: Cannot use :scriptversion after :vim9script" +msgstr "E1040: :scriptversion kann nicht nach :vim9script verwendet werden" -msgid "E23: No alternate file" -msgstr "E23: Keine alternative Datei" +#, c-format +msgid "E1041: Redefining script item %s" +msgstr "E1041: Neudefinition von Scriptelement %s" -msgid "E24: No such abbreviation" -msgstr "E24: Diese Kurzform nicht gefunden" +msgid "E1042: Export can only be used in vim9script" +msgstr "E1042: Export kann nur für Vim9script verwendet werden" -msgid "E477: No ! allowed" -msgstr "E477: Kein ! erlaubt" +msgid "E1043: Invalid command after :export" +msgstr "E1043: Ungültiger Befehl nach :export" -msgid "E25: GUI cannot be used: Not enabled at compile time" -msgstr "" -"E25: GUI kann nicht benutzt werden: wurde zum Zeitpunkt des Übersetzens " -"nicht eingeschaltet." +msgid "E1044: Export with invalid argument" +msgstr "E1044: export mit ungültigem Argument" -msgid "E26: Hebrew cannot be used: Not enabled at compile time\n" -msgstr "" -"E26: Hebräisch kann nicht benutzt werden: wurde zum Zeitpunkt des " -"Übersetzens nicht eingeschaltet.\n" +msgid "E1045: Missing \"as\" after *" +msgstr "E1045: Fehlendes \"as\" nach *" -msgid "E27: Farsi support has been removed\n" -msgstr "E27: Farsi Unterstützung wurde entfernt\n" +msgid "E1046: Missing comma in import" +msgstr "E1046: Fehlendes Komma in import" -msgid "E800: Arabic cannot be used: Not enabled at compile time\n" -msgstr "" -"E800: Arabisch kann nicht benutzt werden: wurde zum Zeitpunkt des " -"Übersetzens nicht eingeschaltet.\n" +msgid "E1047: Syntax error in import" +msgstr "E1047: Syntaxfehler in import" #, c-format -msgid "E28: No such highlight group name: %s" -msgstr "E28: Hervorhebungsgruppe existiert nicht: %s" +msgid "E1048: Item not found in script: %s" +msgstr "E1048: Element nicht in Script %s gefunden" -msgid "E29: No inserted text yet" -msgstr "E29: Noch kein eingefügter Text" +#, c-format +msgid "E1049: Item not exported in script: %s" +msgstr "E1049: Element nicht exportiert in Script: %s" -msgid "E30: No previous command line" -msgstr "E30: Keine vorherige Befehlszeile" +msgid "E1050: Colon required before a range" +msgstr "E1050: Doppelpunkt vor einem Bereich benötigt" -msgid "E31: No such mapping" -msgstr "E31: Kein Mapping gefunden" +msgid "E1051: Wrong argument type for +" +msgstr "E1051: Falscher Argumenttyp für +" -msgid "E479: No match" -msgstr "E479: Kein Treffer" +#, c-format +msgid "E1052: Cannot declare an option: %s" +msgstr "E1052: Kann keine Option deklarieren: %s" #, c-format -msgid "E480: No match: %s" -msgstr "E480: Kein Treffer: %s" +msgid "E1053: Could not import \"%s\"" +msgstr "E1053: Konnte \"%s\" nicht importieren" -msgid "E32: No file name" -msgstr "E32: Kein Dateiname" +#, c-format +msgid "E1054: Variable already declared in the script: %s" +msgstr "E1054: Variable bereits in Script %s deklariert" -msgid "E33: No previous substitute regular expression" -msgstr "E33: Kein vorheriger regulärer Ersetzungsausdruck" +msgid "E1055: Missing name after ..." +msgstr "E1055: Fehlender Name nach ..." -msgid "E34: No previous command" -msgstr "E34: Kein vorheriger Befehl" +#, c-format +msgid "E1056: Expected a type: %s" +msgstr "E1056: Typ erwartet: %s" -msgid "E35: No previous regular expression" -msgstr "E35: Keine vorheriger regulärer Ausdruck" +msgid "E1057: Missing :enddef" +msgstr "E1057: Fehlendes :enddef" -msgid "E481: No range allowed" -msgstr "E481: Kein Bereich erlaubt" +msgid "E1058: Function nesting too deep" +msgstr "E1058: Funktions-Schachtelung zu tief" -msgid "E36: Not enough room" -msgstr "E36: Zu wenig Platz" +#, c-format +msgid "E1059: No white space allowed before colon: %s" +msgstr "E1059: Keine Leerzeichen erlaubt vor : %s" #, c-format -msgid "E247: no registered server named \"%s\"" -msgstr "E247: Kein registrierter Servername \"%s\"" +msgid "E1060: Expected dot after name: %s" +msgstr "E1060: erwarte Punkt nach Name: %s" + +#, c-format +msgid "E1061: Cannot find function %s" +msgstr "E1061: Funktion %s nicht gefunden" + +msgid "E1062: Cannot index a Number" +msgstr "E1062: Kann Index nicht mit Zahl verwenden" + +msgid "E1063: Type mismatch for v: variable" +msgstr "E1063: Typendiskrepanz für v: Variable" + +#, c-format +msgid "E1066: Cannot declare a register: %s" +msgstr "E1066: Kann kein Register deklarieren: %s" + +#, c-format +msgid "E1067: Separator mismatch: %s" +msgstr "E1067: Separator-Unstimmigkeit %s" + +#, c-format +msgid "E1068: No white space allowed before '%s'" +msgstr "E1068: Keine Leerzeichen vor '%s' erlaubt" + +#, c-format +msgid "E1069: White space required after '%s'" +msgstr "E1069: Leerzeichen benötigt nach '%s'" + +msgid "E1070: Missing \"from\"" +msgstr "E1070: Fehlendes \"from\"" + +msgid "E1071: Invalid string after \"from\"" +msgstr "E1071: Ungültige Zeichenkette nach \"from\"" + +#, c-format +msgid "E1072: Cannot compare %s with %s" +msgstr "E1072: Kann %s nicht mit %s vergleichen" + +#, c-format +msgid "E1073: Name already defined: %s" +msgstr "E1073: Name existiert bereits: %s" + +msgid "E1074: No white space allowed after dot" +msgstr "E1074: Keine Leerzeichen nach Punkt erlaubt" + +#, c-format +msgid "E1075: Namespace not supported: %s" +msgstr "E1075: Namespace nicht unterstützt: %s" + +msgid "E1076: This Vim is not compiled with float support" +msgstr "E1076: Vim wurde nicht mit der \"float\"-Eigenschaft übersetzt." + +#, c-format +msgid "E1077: Missing argument type for %s" +msgstr "E1077: Fehlender Argumenttyp für %s" + +#, c-format +msgid "E1081: Cannot unlet %s" +msgstr "E1081: Kann Variable nicht entfernen %s" + +#, c-format +msgid "E1082: Cannot use a namespaced variable: %s" +msgstr "E1082: Kann eine Variable im Namesraum nicht verwenden: %s" + +msgid "E1083: Missing backtick" +msgstr "E1083: Fehlender Backtick:" + +#, c-format +msgid "E1084: Cannot delete Vim9 script function %s" +msgstr "E1084: Vim9 Funktion %s kann nicht gelöscht werden" + +#, c-format +msgid "E1085: Not a callable type: %s" +msgstr "E1085: Kein aufrufbarer Typ: %s" + +msgid "E1086: Cannot use :function inside :def" +msgstr "E1086: Kann :function nicht innerhalb von :def verwenden" + +msgid "E1087: Cannot use an index when declaring a variable" +msgstr "E1087: Kann Index nicht verwenden, wenn eine Variable deklariert wird" + +#, c-format +msgid "E1089: Unknown variable: %s" +msgstr "E1089: Unbekannte Variable: %s" + +#, c-format +msgid "E1090: Cannot assign to argument %s" +msgstr "E1090: Kann dem Argument nicht zuweisen %s" + +#, c-format +msgid "E1091: Function is not compiled: %s" +msgstr "E1091: Funktion ist nicht kompiliert: %s" + +msgid "E1092: Cannot use a list for a declaration" +msgstr "E1092: Kann Liste nicht als Deklaration verwenden" + +#, c-format +msgid "E1093: Expected %d items but got %d" +msgstr "E1093: Erwartete %d Einträge, aber erhielt %d" + +msgid "E1094: Import can only be used in a script" +msgstr "E1094: import kann nur innerhalb eines Scripts verwendet werden" + +msgid "E1095: Unreachable code after :return" +msgstr "E1095: Nicht erreichbarer Code nach :return" + +msgid "E1096: Returning a value in a function without a return type" +msgstr "E1096: Rückgabe eines Wertes einer Funktion ohne Rückgabetyp" + +msgid "E1097: Line incomplete" +msgstr "E1097: Zeile unvollständig" + +#, c-format +msgid "E1099: Unknown error while executing %s" +msgstr "E1099: Unbekannter Fehler beim Ausführen von %s" + +#, c-format +msgid "E1101: Cannot declare a script variable in a function: %s" +msgstr "E1101: Kann eine Scriptvariable nicht in einer Funktion deklarieren: %s" + +#, c-format +msgid "E1102: Lambda function not found: %s" +msgstr "E1102: Lambdafunktion nicht gefunden: %s" + +msgid "E1103: Dictionary not set" +msgstr "E1103: Dictionary nicht gesetzt" + +msgid "E1104: Missing >" +msgstr "E1104: Fehlendes >" + +#, c-format +msgid "E1105: Cannot convert %s to string" +msgstr "E1105: kann %s nicht in Zeichenkette umwandeln" + +msgid "E1106: One argument too many" +msgstr "E1106: Ein Argument zu viel" + +#, c-format +msgid "E1106: %d arguments too many" +msgstr "E1106: %d Argumente zu viel" + +msgid "E1107: String, List, Dict or Blob required" +msgstr "E1107: Zeichenkette, Liste, Dictionary oder Blob benötigt" + +#, c-format +msgid "E1108: Item not found: %s" +msgstr "E1108: Element nicht gefunden: %s" + +#, c-format +msgid "E1109: List item %d is not a List" +msgstr "E1109: Listenwert %d ist keine Liste" + +#, c-format +msgid "E1110: List item %d does not contain 3 numbers" +msgstr "E1110: Listenwert %d enthält keine 3 Zahlen" + +#, c-format +msgid "E1111: List item %d range invalid" +msgstr "E1111: Listenwert %d Bereich ungültig" + +#, c-format +msgid "E1112: List item %d cell width invalid" +msgstr "E1112: Listenwert %d Zellbreite ungültig" + +#, c-format +msgid "E1113: Overlapping ranges for 0x%lx" +msgstr "E1113: Überlappender Bereich für 0x%lx" + +msgid "E1114: Only values of 0x100 and higher supported" +msgstr "E1114: Nur Werte oberhalb 0x100 unterstützt" + +msgid "E1115: \"assert_fails()\" fourth argument must be a number" +msgstr "E1115: \"assert_fails()\" viertes Argument muss eine Zahl sein" + +msgid "E1116: \"assert_fails()\" fifth argument must be a string" +msgstr "E1116: \"assert_fails()\" fünftes Argument muss eine Zahl sein" + +msgid "E1117: Cannot use ! with nested :def" +msgstr "E1117: Kann nicht ! innerhalb verschachtelter :def verwenden" + +msgid "E1118: Cannot change list" +msgstr "E1118: Kann Liste nicht ändern" + +msgid "E1119: Cannot change list item" +msgstr "E1119: Kann Listenwert nicht ändern" + +msgid "E1120: Cannot change dict" +msgstr "E1120: Kann Dictionary nicht ändern" + +msgid "E1121: Cannot change dict item" +msgstr "E1121: Kann Dictionarywert nicht ändern" + +#, c-format +msgid "E1122: Variable is locked: %s" +msgstr "E1122: Variable ist gesperrt: %s" + +#, c-format +msgid "E1123: Missing comma before argument: %s" +msgstr "E1123: Fehlendes Komma vor Argument: %s" + +#, c-format +msgid "E1124: \"%s\" cannot be used in legacy Vim script" +msgstr "E1124: \"%s\" kann nicht innerhalb von Legacy Vim Script verwendet werden" + +msgid "E1125: Final requires a value" +msgstr "E1125: Final benötigt einen Wert" + +msgid "E1126: Cannot use :let in Vim9 script" +msgstr "E1126: Kann :let nicht in Vim9 Script verwenden" + +msgid "E1127: Missing name after dot" +msgstr "E1127: Fehlender Name nach Punkt" + +msgid "E1128: } without {" +msgstr "E1128: } ohne { verwendet" + +msgid "E1129: Throw with empty string" +msgstr "E1129: throw mit leerer Zeichenkette" + +msgid "E1130: Cannot add to null list" +msgstr "E1130: Kann nicht zu Null-Liste hinzufügen" + +msgid "E1131: Cannot add to null blob" +msgstr "E1131: Kann nicht zu Null-Blob hinzufügen" + +msgid "E1132: Missing function argument" +msgstr "E1132: Fehlendes Funktionsargument" + +msgid "E1133: Cannot extend a null dict" +msgstr "E1133: Kann Null-Dictionary nicht erweitern" + +msgid "E1134: Cannot extend a null list" +msgstr "E1134: Kann Null-Liste nicht erweitern" + +#, c-format +msgid "E1135: Using a String as a Bool: \"%s\"" +msgstr "E1135: Verwende Zeichenkette als Bool: \"%s\"" + +msgid "E1135: mapping must end with " +msgstr "E1135: Mapping muss mit enden" + +msgid "E1136: mapping must end with before second " +msgstr "E1136: Mapping muss mit vor weiterem enden" + +#, c-format +msgid "E1137: mapping must not include %s key" +msgstr "E1137: Mapping darf %s Taste nicht enthalten" + +msgid "E1138: Using a Bool as a Number" +msgstr "E1138: Bool als Zahl verwendet" + +msgid "E1139: Missing matching bracket after dict key" +msgstr "E1139: Fehlende zugehörige eckige Klammer nach Dict Schlüssel" + +msgid "E1140: For argument must be a sequence of lists" +msgstr "E1140: Argument muss eine Folge von Listen sein." + +msgid "--No lines in buffer--" +msgstr "--Keine Zeilen im Buffer--" + +msgid "E470: Command aborted" +msgstr "E470: Befehl abgebrochen" + +msgid "E471: Argument required" +msgstr "E471: Argument benötigt" + +msgid "E10: \\ should be followed by /, ? or &" +msgstr "E10: \\ sollte von /, ? oder & gefolgt werden" + +msgid "E11: Invalid in command-line window; executes, CTRL-C quits" +msgstr "E11: Ungültig im Kommandozeilen-Fenster; führt aus, CTRL-C beendet" + +msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search" +msgstr "" +"E12: Befehl nicht zulässig vom exrc/vimrc in der momentanen Verzeichnis- " +"oder Tag-Suche" + +msgid "E171: Missing :endif" +msgstr "E171: Fehlendes :endif" + +msgid "E603: :catch without :try" +msgstr "E603: :catch ohne :try" + +msgid "E606: :finally without :try" +msgstr "E606: :finally ohne :try" + +msgid "E607: multiple :finally" +msgstr "E607: Mehrere :finally" + +msgid "E600: Missing :endtry" +msgstr "E600: Fehlendes :endtry" + +msgid "E602: :endtry without :try" +msgstr "E602: :endtry ohne :try" + +msgid "E170: Missing :endwhile" +msgstr "E170: fehlendes :endwhile" + +msgid "E170: Missing :endfor" +msgstr "E170: Fehlendes :endfor" + +msgid "E588: :endwhile without :while" +msgstr "E588: :endwhile ohne :while" + +msgid "E588: :endfor without :for" +msgstr "E588: :endfor ohne :for" + +msgid "E13: File exists (add ! to override)" +msgstr "E13: Datei existiert bereits (erzwinge mit !)" + +msgid "E472: Command failed" +msgstr "E472: Befehl fehlgeschlagen" + +#, c-format +msgid "E234: Unknown fontset: %s" +msgstr "E234: Unbekannter Fontset: %s" + +#, c-format +msgid "E235: Unknown font: %s" +msgstr "E235: Unbekannte Schriftart: %s" + +#, c-format +msgid "E236: Font \"%s\" is not fixed-width" +msgstr "E236: Schriftart \"%s\" hat keine feste Breite" + +msgid "E473: Internal error" +msgstr "E473: Interner Fehler" + +#, c-format +msgid "E685: Internal error: %s" +msgstr "E685: Interner Fehler: %s" + +msgid "Interrupted" +msgstr "Unterbrochen" + +msgid "E474: Invalid argument" +msgstr "E474: Ungültiges Argument" + +#, c-format +msgid "E475: Invalid argument: %s" +msgstr "E475: Ungültiges Argument: %s" + +#, c-format +msgid "E983: Duplicate argument: %s" +msgstr "E983: Doppeltes Argument: %s" + +#, c-format +msgid "E475: Invalid value for argument %s" +msgstr "E475: Ungültiger Wert für Argument: %s" + +#, c-format +msgid "E475: Invalid value for argument %s: %s" +msgstr "E475: Ungültiger Wert für Argument %s: %s" + +#, c-format +msgid "E15: Invalid expression: %s" +msgstr "E15: ungültiger Ausdruck: %s" + +msgid "E16: Invalid range" +msgstr "E16: Ungültiger Bereich" + +#, c-format +msgid "E17: \"%s\" is a directory" +msgstr "E17: \"%s\" ist ein Verzeichnis" + +msgid "E756: Spell checking is not possible" +msgstr "E756: Rechtschreibprüfung ist nicht möglich" + +#, c-format +msgid "E364: Library call failed for \"%s()\"" +msgstr "E364: Bibliotheksaufruf für \"%s()\" schlug fehl" + +msgid "E667: Fsync failed" +msgstr "E667: Fsync fehlgeschlagen" + +#, c-format +msgid "E448: Could not load library function %s" +msgstr "E448: Bibliotheksfunktion %s konnte nicht geladen werden" + +msgid "E19: Mark has invalid line number" +msgstr "E19: Markierung hat ungültige Zeilennummer" + +msgid "E20: Mark not set" +msgstr "E20: Markierung nicht gesetzt" + +msgid "E21: Cannot make changes, 'modifiable' is off" +msgstr "E21: Kann keine Änderungen machen, 'modifiable' ist aus" + +msgid "E22: Scripts nested too deep" +msgstr "E22: Skript ist zu tief verschachtelt" + +msgid "E23: No alternate file" +msgstr "E23: Keine alternative Datei" + +msgid "E24: No such abbreviation" +msgstr "E24: Diese Kurzform nicht gefunden" + +msgid "E477: No ! allowed" +msgstr "E477: Kein ! erlaubt" + +msgid "E25: GUI cannot be used: Not enabled at compile time" +msgstr "" +"E25: GUI kann nicht benutzt werden: wurde zum Zeitpunkt des Übersetzens " +"nicht eingeschaltet." + +msgid "E26: Hebrew cannot be used: Not enabled at compile time\n" +msgstr "" +"E26: Hebräisch kann nicht benutzt werden: wurde zum Zeitpunkt des " +"Übersetzens nicht eingeschaltet.\n" + +msgid "E27: Farsi support has been removed\n" +msgstr "E27: Farsi Unterstützung wurde entfernt\n" + +msgid "E800: Arabic cannot be used: Not enabled at compile time\n" +msgstr "" +"E800: Arabisch kann nicht benutzt werden: wurde zum Zeitpunkt des " +"Übersetzens nicht eingeschaltet.\n" + +#, c-format +msgid "E28: No such highlight group name: %s" +msgstr "E28: Hervorhebungsgruppe existiert nicht: %s" + +msgid "E29: No inserted text yet" +msgstr "E29: Noch kein eingefügter Text" + +msgid "E30: No previous command line" +msgstr "E30: Keine vorherige Befehlszeile" + +msgid "E31: No such mapping" +msgstr "E31: Kein Mapping gefunden" + +msgid "E479: No match" +msgstr "E479: Kein Treffer" + +#, c-format +msgid "E480: No match: %s" +msgstr "E480: Kein Treffer: %s" + +msgid "E32: No file name" +msgstr "E32: Kein Dateiname" + +msgid "E33: No previous substitute regular expression" +msgstr "E33: Kein vorheriger regulärer Ersetzungsausdruck" + +msgid "E34: No previous command" +msgstr "E34: Kein vorheriger Befehl" + +msgid "E35: No previous regular expression" +msgstr "E35: Keine vorheriger regulärer Ausdruck" + +msgid "E481: No range allowed" +msgstr "E481: Kein Bereich erlaubt" + +msgid "E36: Not enough room" +msgstr "E36: Zu wenig Platz" + +#, c-format +msgid "E247: no registered server named \"%s\"" +msgstr "E247: Kein registrierter Servername \"%s\"" + +#, c-format +msgid "E482: Can't create file %s" +msgstr "E482: Kann Datei %s nicht erzeugen" + +msgid "E483: Can't get temp file name" +msgstr "E483: Kann den Namen der temporären Datei nicht ermitteln" + +#, c-format +msgid "E484: Can't open file %s" +msgstr "E484: Kann die Datei %s nicht öffnen" + +#, c-format +msgid "E485: Can't read file %s" +msgstr "E485: Kann Datei %s nicht lesen" + +msgid "E38: Null argument" +msgstr "E38: Null-Argument" + +msgid "E39: Number expected" +msgstr "E39: Nummer erwartet" + +#, c-format +msgid "E40: Can't open errorfile %s" +msgstr "E40: Fehlerdatei %s kann nicht geöffnet werden" + +msgid "E233: cannot open display" +msgstr "E233: Display kann nicht geöffnet werden" + +msgid "E41: Out of memory!" +msgstr "E41: Speicher erschöpft!" + +msgid "Pattern not found" +msgstr "Muster nicht gefunden" + +#, c-format +msgid "E486: Pattern not found: %s" +msgstr "E486: Muster nicht gefunden: %s" + +msgid "E487: Argument must be positive" +msgstr "E487: Argument muss positiv sein" + +msgid "E459: Cannot go back to previous directory" +msgstr "E459: Kann nicht ins vorhergehende Verzeichnis wechseln" + +msgid "E42: No Errors" +msgstr "E42: Keine Fehler" + +msgid "E776: No location list" +msgstr "E776: Keine Positionsliste" + +msgid "E43: Damaged match string" +msgstr "E43: Beschädigter Suchausdruck" + +msgid "E44: Corrupted regexp program" +msgstr "E44: schadhaftes regexp Programm" + +msgid "E45: 'readonly' option is set (add ! to override)" +msgstr "E45: Die Option 'readonly' ist gesetzt (erzwinge mit !)" + +#, c-format +msgid "E734: Wrong variable type for %s=" +msgstr "E734: Falscher Variablentyp für %s=" + +#, c-format +msgid "E461: Illegal variable name: %s" +msgstr "E461: Unzulässiger Variablenname: %s" + +msgid "E995: Cannot modify existing variable" +msgstr "E995: Kann existierende Variable nicht ändern" + +#, c-format +msgid "E46: Cannot change read-only variable \"%s\"" +msgstr "E46: Variable \"%s\" kann nur gelesen werden" + +#, c-format +msgid "E794: Cannot set variable in the sandbox: \"%s\"" +msgstr "E794: Variable kann nicht in der Sandbox gesetzt werden: \"%s\"" + +msgid "E928: String required" +msgstr "E928: String wird benötigt." + +msgid "E713: Cannot use empty key for Dictionary" +msgstr "E713: Der Schlüssel für das Dictionary darf nicht leer sein" + +msgid "E715: Dictionary required" +msgstr "E715: Dictionary benötigt" + +#, c-format +msgid "E684: list index out of range: %ld" +msgstr "E684: Index der Liste außerhalb des zulässigen Bereichs: %ld" + +#, c-format +msgid "E979: Blob index out of range: %ld" +msgstr "E979: Blobindex außerhalb des Bereichs: %ld" + +msgid "E978: Invalid operation for Blob" +msgstr "E978: Unzulässige Operation für Blob" + +#, c-format +msgid "E118: Too many arguments for function: %s" +msgstr "E118: Zu viele Argumente für Funktion: %s" + +#, c-format +msgid "E119: Not enough arguments for function: %s" +msgstr "E119: Zu wenige Argumente für Funktion: %s" + +#, c-format +msgid "E933: Function was deleted: %s" +msgstr "E933: Funktion wurde gelöscht: %s" + +#, c-format +msgid "E716: Key not present in Dictionary: \"%s\"" +msgstr "E716: Schlüssel \"%s\" nicht im Dictionary vorhanden." + +msgid "E714: List required" +msgstr "E714: Liste benötigt" + +msgid "E897: List or Blob required" +msgstr "E897: Liste oder Blob benötigt" + +#, c-format +msgid "E697: Missing end of List ']': %s" +msgstr "E697: Fehlendes Ende der Liste ']': %s" + +#, c-format +msgid "E712: Argument of %s must be a List or Dictionary" +msgstr "E712: Argument von %s muss eine Liste oder ein Dictionary sein." + +#, c-format +msgid "E896: Argument of %s must be a List, Dictionary or Blob" +msgstr "E896: Argument von %s muss eine Liste, Dictionary oder ein Blob sein." + +msgid "E804: Cannot use '%' with Float" +msgstr "E804: Kann '%' mit Floats benutzen." + +msgid "E908: using an invalid value as a String" +msgstr "E908: Ungültiger Wert als String verwendet." + +msgid "E996: Cannot lock an option" +msgstr "E996: Kann Option nicht sperren" + +#, c-format +msgid "E113: Unknown option: %s" +msgstr "E113: Unbekannte Option: %s" + +msgid "E18: Unexpected characters in :let" +msgstr "E18: Unerwartete Zeichen in :let" + +#, c-format +msgid "E998: Reduce of an empty %s with no initial value" +msgstr "E998: Reduzierung einer leeren %s ohne initialen Anfangswert" + +#, c-format +msgid "E857: Dictionary key \"%s\" required" +msgstr "E857: Dictionary Schlüssel \"%s\" benötigt" + +msgid "E47: Error while reading errorfile" +msgstr "E47: Fehler während des Lesens der Fehlerdatei" + +msgid "E48: Not allowed in sandbox" +msgstr "E48: In einer Sandbox nicht erlaubt" + +msgid "E523: Not allowed here" +msgstr "E523: Hier nicht erlaubt" + +msgid "E578: Not allowed to change text here" +msgstr "E578: Nicht erlaubt Text hier zu ändern" + +msgid "E565: Not allowed to change text or change window" +msgstr "E565: Es ist nicht erlaubt Text oder Fenster zu ändern" + +msgid "E359: Screen mode setting not supported" +msgstr "E359: Bildschirm-Modus wird nicht unterstützt" + +msgid "E49: Invalid scroll size" +msgstr "E49: Ungültige Scroll-Größe" + +msgid "E91: 'shell' option is empty" +msgstr "E91: Die Option 'shell' ist leer" + +msgid "E255: Couldn't read in sign data!" +msgstr "E255: Fehler -- Sign-Daten konnten nicht gelesen werden" + +msgid "E72: Close error on swap file" +msgstr "E72: Fehler beim Schließen der Auslagerungsdatei" + +msgid "E73: tag stack empty" +msgstr "E73: Tag Stack leer." + +msgid "E74: Command too complex" +msgstr "E74: Befehl zu komplex" + +msgid "E75: Name too long" +msgstr "E75: Name zu lang" + +msgid "E76: Too many [" +msgstr "E76: Zu viele [" + +msgid "E77: Too many file names" +msgstr "E77: Zu viele Dateinamen" + +msgid "E488: Trailing characters" +msgstr "E488: Überschüssige Zeichen" + +#, c-format +msgid "E488: Trailing characters: %s" +msgstr "E488: Überschüssige Zeichen: %s" + +msgid "E78: Unknown mark" +msgstr "E78: Unbekannte Markierung" + +msgid "E79: Cannot expand wildcards" +msgstr "E79: Kann die Platzhalter nicht erweitern" + +msgid "E591: 'winheight' cannot be smaller than 'winminheight'" +msgstr "E591: 'winheight' darf nicht kleiner sein als 'winminheight'" + +msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'" +msgstr "E592: 'winwidth' darf nicht kleiner sein als 'winminwidth'" + +msgid "E80: Error while writing" +msgstr "E80: Fehler während des Schreibens" + +msgid "E939: Positive count required" +msgstr "E939: Positive Zahl benötigt" + +msgid "E81: Using not in a script context" +msgstr "E81: wurde nicht in einer Skript-Umgebung benutzt" + +#, c-format +msgid "E107: Missing parentheses: %s" +msgstr "E107: Fehlende Klammern: %s" + +msgid "E110: Missing ')'" +msgstr "E110: Fehlendes ')'" + +#, c-format +msgid "E720: Missing colon in Dictionary: %s" +msgstr "E720: Fehlender Doppelpunkt im Dictionary: %s" + +#, c-format +msgid "E721: Duplicate key in Dictionary: \"%s\"" +msgstr "E721: Doppelter Schlüssel im Dictionary: \"%s\"" + +#, c-format +msgid "E722: Missing comma in Dictionary: %s" +msgstr "E722: Fehlendes Komma im Dictionary: %s" + +#, c-format +msgid "E723: Missing end of Dictionary '}': %s" +msgstr "E723: Fehlendes Ende des Dictionary '}': %s" + +msgid "E449: Invalid expression received" +msgstr "E449: Ungültiger Ausdruck" + +msgid "E463: Region is guarded, cannot modify" +msgstr "E463: Region ist geschützt; keine Änderung möglich" + +msgid "E744: NetBeans does not allow changes in read-only files" +msgstr "E744: NetBeans erlaubt keine Änderungen in schreibgeschützten Dateien" + +msgid "E363: pattern uses more memory than 'maxmempattern'" +msgstr "E363: Muster benötigt mehr Speicher als 'maxmempattern'" + +msgid "E749: empty buffer" +msgstr "E749: Leerer Buffer" + +#, c-format +msgid "E86: Buffer %ld does not exist" +msgstr "E86: Buffer %ld existiert nicht." + +msgid "E682: Invalid search pattern or delimiter" +msgstr "E682: Ungültiges Suchmuster oder Trennzeichen" + +msgid "E139: File is loaded in another buffer" +msgstr "E139: Datei ist in einem anderen Buffer geladen" + +#, c-format +msgid "E764: Option '%s' is not set" +msgstr "E764: Option '%s' ist nicht gesetzt" + +msgid "E850: Invalid register name" +msgstr "E850: Ungültiger Register Name" + +msgid "E806: using Float as a String" +msgstr "E806: Float als String benutzt." + +#, c-format +msgid "E919: Directory not found in '%s': \"%s\"" +msgstr "E919: Verzeichnis nicht gefunden in '%s': \"%s\"" + +msgid "E952: Autocommand caused recursive behavior" +msgstr "E952: Autokommando verursachten Rekursion" + +msgid "E813: Cannot close autocmd or popup window" +msgstr "" +"E813: Autokommando-Fenster oder Popup-Fenster kann nicht geschlossen werden" + +msgid "E328: Menu only exists in another mode" +msgstr "E328: Menü existiert nur in anderen Modi" + +msgid "E957: Invalid window number" +msgstr "E957: Ungültige Fensternummer" + +#, c-format +msgid "E686: Argument of %s must be a List" +msgstr "E686: Argument von %s muss eine Liste sein." + +msgid "E109: Missing ':' after '?'" +msgstr "E109: Fehlender ':' nach '?'" + +msgid "E690: Missing \"in\" after :for" +msgstr "E690: Fehlendes \"in\" nach :for" + +#, c-format +msgid "E117: Unknown function: %s" +msgstr "E117: Unbekannte Funktion: %s" + +msgid "E111: Missing ']'" +msgstr "E111: Fehlende ']'" + +msgid "E581: :else without :if" +msgstr "E581: :else ohne :if" + +msgid "E582: :elseif without :if" +msgstr "E582: :elseif ohne :if" + +msgid "E580: :endif without :if" +msgstr "E580: :endif ohne :if" + +msgid "E586: :continue without :while or :for" +msgstr "E586: :continue ohne :while or :for" + +msgid "E587: :break without :while or :for" +msgstr "E587: :break ohne :while oder :for" + +msgid "E274: No white space allowed before parenthesis" +msgstr "E274: Keine Leerzeichen vor Klammern erlaubt" + +#, c-format +msgid "E940: Cannot lock or unlock variable %s" +msgstr "E940: Kann Variable \"%s\" nicht sperren bzw. entsperren." + +#, c-format +msgid "E254: Cannot allocate color %s" +msgstr "E254: Kann die Farbe %s nicht zuweisen." + +msgid "search hit TOP, continuing at BOTTOM" +msgstr "Suche erreichte den ANFANG und wurde am ENDE fortgesetzt" + +msgid "search hit BOTTOM, continuing at TOP" +msgstr "Suche erreichte das ENDE und wurde am ANFANG fortgesetzt" + +msgid " line " +msgstr " Zeile " + +#, c-format +msgid "Need encryption key for \"%s\"" +msgstr "Geben Sie bitte den Schlüssel für \"%s\" ein: " + +msgid "empty keys are not allowed" +msgstr "Leerer Schlüssel nicht erlaubt" + +msgid "dictionary is locked" +msgstr "Dictionary ist gesperrt" + +msgid "list is locked" +msgstr "Liste ist gesperrt" + +#, c-format +msgid "failed to add key '%s' to dictionary" +msgstr "Konnte Schlüssel '%s' zu Dictionary nicht hinzufügen." + +#, c-format +msgid "index must be int or slice, not %s" +msgstr "Index muss eine Int oder Slice sein, nicht %s" + +#, c-format +msgid "expected str() or unicode() instance, but got %s" +msgstr "erwartete str() oder unicode() Instanz, erhielt jedoch %s" + +#, c-format +msgid "expected bytes() or str() instance, but got %s" +msgstr "Erwartete bytes() oder str() Instanz, erhielt jedoch %s" + +#, c-format +msgid "" +"expected int(), long() or something supporting coercing to long(), but got %s" +msgstr "" +"erwartete int(), long() or etwas was sich zu long() wandeln lässt, erhielt " +"jedoch %s" + +#, c-format +msgid "expected int() or something supporting coercing to int(), but got %s" +msgstr "" +"erwartete int() oder etwas was sich zu int() wandeln lässt, erhielt jedoch %s" + +msgid "value is too large to fit into C int type" +msgstr "Wert zu groß für einen C Integerwert" + +msgid "value is too small to fit into C int type" +msgstr "Wert zu klein für einen C Integerwert" + +msgid "number must be greater than zero" +msgstr "Nummer muss größer als 0 sein" + +msgid "number must be greater or equal to zero" +msgstr "Nummer muss größer gleich 0 sein" + +msgid "can't delete OutputObject attributes" +msgstr "OutputObject-Attribute können nicht gelöscht werden" + +#, c-format +msgid "invalid attribute: %s" +msgstr "unzulässiges Attribut: %s" + +msgid "E264: Python: Error initialising I/O objects" +msgstr "E264: Python: Fehler bei der Initialisierung von I/O Objekten" + +msgid "failed to change directory" +msgstr "Verzeichniswechsel fehlgeschlagen" + +#, c-format +msgid "expected 3-tuple as imp.find_module() result, but got %s" +msgstr "" +"erwartete 3 Tuple als Ergebnis von imp.find_module(), erhielt jedoch %s" + +#, c-format +msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d" +msgstr "" +"erwartete 3 Tuple als Ergebnis von find_module(), but erhielt Tuple der " +"Größe %d" + +msgid "internal error: imp.find_module returned tuple with NULL" +msgstr "interner Fehler: imp.find_module gab Tuple mit NULL zurück" + +msgid "cannot delete vim.Dictionary attributes" +msgstr "kann vim.Dictionary Attribute nicht löschen" + +msgid "cannot modify fixed dictionary" +msgstr "Kann festes Dictionary nicht ändern" + +#, c-format +msgid "cannot set attribute %s" +msgstr "Kann nicht Attribut %s setzen" + +msgid "hashtab changed during iteration" +msgstr "Hashtab veränderte sich während der Initialisierung" + +#, c-format +msgid "expected sequence element of size 2, but got sequence of size %d" +msgstr "" +"erwartete Sequenz Element der Größe 2, erhielt jedoch Sequenz der Größe %d" + +msgid "list constructor does not accept keyword arguments" +msgstr "Listen Konstruktor akzeptiert keine Keyword Argumente" + +msgid "list index out of range" +msgstr "Listen Index außerhalb des gültigen Bereichs" + +#, c-format +msgid "internal error: failed to get Vim list item %d" +msgstr "interner Fehler: Zugriff auf Vim Listobjekt %d fehlgeschlagen" + +msgid "slice step cannot be zero" +msgstr "Slice Schritt kann nicht Null sein" + +#, c-format +msgid "attempt to assign sequence of size greater than %d to extended slice" +msgstr "" +"Versuch der Zuweisung von Sequenzgröße größer als %d zu erweiterten Slice" + +#, c-format +msgid "internal error: no Vim list item %d" +msgstr "interner Fehler: Kein Vim Listobjekt %d" + +msgid "internal error: not enough list items" +msgstr "interner Fehler: nicht genügend Listobjekte" + +msgid "internal error: failed to add item to list" +msgstr "interner Fehler: konnte Objekt nicht Liste hinzufügen" + +#, c-format +msgid "attempt to assign sequence of size %d to extended slice of size %d" +msgstr "" +"Versuch der Zuweisung von Sequenzgröße %d zu erweiterten Slice der Größe %d" + +msgid "failed to add item to list" +msgstr "Hinzufügen von Objekt zu Liste fehlgeschlagen" + +msgid "cannot delete vim.List attributes" +msgstr "kann vim.List Attribute nicht löschen" + +msgid "cannot modify fixed list" +msgstr "kann feste Liste nicht modifizieren" + +#, c-format +msgid "unnamed function %s does not exist" +msgstr "Unbenannte Funktion %s existiert nicht" + +#, c-format +msgid "function %s does not exist" +msgstr "Funktion %s existiert nicht" + +#, c-format +msgid "failed to run function %s" +msgstr "Fehler beim Ausführen der Funktion %s" + +msgid "unable to get option value" +msgstr "konnte Optionswert nicht erhalten" + +msgid "internal error: unknown option type" +msgstr "interner Fehler: unbekannter Optionstyp" + +msgid "problem while switching windows" +msgstr "Problem beim Wechseln der Fenster" + +#, c-format +msgid "unable to unset global option %s" +msgstr "Konnte globale Option %s nicht aufheben" + +#, c-format +msgid "unable to unset option %s which does not have global value" +msgstr "konnte Option %s nicht aufheben, da sie keinen globalen Wert hat" + +msgid "attempt to refer to deleted tab page" +msgstr "Versuch, Bezug auf einen gelöschten Reiter zu nehmen" + +msgid "no such tab page" +msgstr "kein solcher Reiter vorhanden" + +msgid "attempt to refer to deleted window" +msgstr "Versuch, Bezug auf eine gelöschtes Fenster zu nehmen" + +msgid "readonly attribute: buffer" +msgstr "nur-Lesen Attribut: Buffer" + +msgid "cursor position outside buffer" +msgstr "Cursor Position außerhalb des Buffers" + +msgid "no such window" +msgstr "ungültiges Fenster" + +msgid "attempt to refer to deleted buffer" +msgstr "Versuch, Bezug auf einen gelöschten Buffer zu nehmen" + +msgid "failed to rename buffer" +msgstr "Umbenennen des Buffers fehlgeschlagen" + +msgid "mark name must be a single character" +msgstr "Markierung muss ein einzelner Buchstabe sein" + +#, c-format +msgid "expected vim.Buffer object, but got %s" +msgstr "erwartete vim.Buffer Objekt, erhielt jedoch %s" + +#, c-format +msgid "failed to switch to buffer %d" +msgstr "Wechsel zu Buffer %d fehlgeschlagen" + +#, c-format +msgid "expected vim.Window object, but got %s" +msgstr "erwartete vim.Window Objekt, erhielt jedoch %s" + +msgid "failed to find window in the current tab page" +msgstr "konnte Fenster im aktuellen Reiter nicht finden" + +msgid "did not switch to the specified window" +msgstr "konnte nicht zu spezifizierten Fenster wechseln" + +#, c-format +msgid "expected vim.TabPage object, but got %s" +msgstr "erwartete vim.TabPage Objekt, erhielt jedoch %s" + +msgid "did not switch to the specified tab page" +msgstr "konnte nicht zu spezifiziertem Reiter wechseln" + +msgid "failed to run the code" +msgstr "Ausführen des Codes fehlgeschlagen." + +msgid "E858: Eval did not return a valid python object" +msgstr "E858: Eval hat kein gültiges Pythonobjekt zurückgegeben" + +msgid "E859: Failed to convert returned python object to a Vim value" +msgstr "" +"E859: Konvertierung von zurückgegebenen Pythonobjekt zu Vim Wert " +"fehlgeschlagen" + +#, c-format +msgid "unable to convert %s to a Vim dictionary" +msgstr "konnte nicht %s zu Vim Dictionary konvertieren" + +#, c-format +msgid "unable to convert %s to a Vim list" +msgstr "konnte %s nicht zu Vim Liste konvertieren" + +#, c-format +msgid "unable to convert %s to a Vim structure" +msgstr "konnte %s nicht zu Vim Struktur konvertieren" + +msgid "internal error: NULL reference passed" +msgstr "interner Fehler: NULL Referenz übermittelt" + +msgid "internal error: invalid value type" +msgstr "interner Fehler: ungültiger Werttyp" + +msgid "" +"Failed to set path hook: sys.path_hooks is not a list\n" +"You should now do the following:\n" +"- append vim.path_hook to sys.path_hooks\n" +"- append vim.VIM_SPECIAL_PATH to sys.path\n" +msgstr "" +"Fehler beim setzen des Path hooks: sys.path_hooks ist keine Liste\n" +"Sie sollten jetzt eine der folgenden Alternativen tun:\n" +"- vim.path_hook zu sys.path_hooks hinzufügen\n" +"- vim.VIM_SPECIAL_PATH zu sys.path hinzufügen\n" + +msgid "" +"Failed to set path: sys.path is not a list\n" +"You should now append vim.VIM_SPECIAL_PATH to sys.path" +msgstr "" +"Fehler beim setzen des Pfades: sys.path ist keine Liste\n" +"Fügen Sie vim.VIM_SPECIAL_PATH zu sys.path hinzu" + +msgid "" +"Vim macro files (*.vim)\t*.vim\n" +"All Files (*.*)\t*.*\n" +msgstr "" +"Vim Dateien (*.vim)\t*.vim\n" +"Alle Dateien (*.*)\t*.*\n" + +msgid "All Files (*.*)\t*.*\n" +msgstr "Alle Dateien (*.*)\t*.*\n" + +msgid "" +"All Files (*.*)\t*.*\n" +"C source (*.c, *.h)\t*.c;*.h\n" +"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"VB code (*.bas, *.frm)\t*.bas;*.frm\n" +"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +msgstr "" +"Alle Dateien (*.*)\t*.*\n" +"C Quellcode (*.c, *.h)\t*.c;*.h\n" +"C++ Quellcode (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"VB Quellcode (*.bas, *.frm)\t*.bas;*.frm\n" +"Vim Dateien (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" + +msgid "" +"Vim macro files (*.vim)\t*.vim\n" +"All Files (*)\t*\n" +msgstr "" +"Vim Dateien (*.vim)\t*.vim\n" +"Alle Dateien (*)\t*\n" + +msgid "All Files (*)\t*\n" +msgstr "Alle Dateien (*)\t*\n" + +msgid "" +"All Files (*)\t*\n" +"C source (*.c, *.h)\t*.c;*.h\n" +"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +msgstr "" +"Alle Dateien (*)\t*\n" +"C Quellcode (*.c, *.h)\t*.c;*.h\n" +"C++ Quellcode (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"Vim Dateien (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" + +msgid "GVim" +msgstr "GVim" + +msgid "Text Editor" +msgstr "Texteditor" + +msgid "Edit text files" +msgstr "Textdateien bearbeiten" + +msgid "Text;editor;" +msgstr "Text;Editor;" + +msgid "gvim" +msgstr "gvim" + +msgid "Vim" +msgstr "Vim" + +msgid "(local to window)" +msgstr "(lokal zum Fenster)" + +msgid "(local to buffer)" +msgstr "(lokal zum Buffer)" + +msgid "(global or local to buffer)" +msgstr "(global oder lokal zum Buffer)" + +msgid "" +"\" Each \"set\" line shows the current value of an option (on the left)." +msgstr "" +"\" Jede \"set\" Zeile zeigt den aktuellen Werte der Option auf der linken Seite." + +msgid "\" Hit on a \"set\" line to execute it." +msgstr "\" Drücke auf einer \"set\" Zeile zum auführen." + +msgid "\" A boolean option will be toggled." +msgstr "\" Eine Bool-Option wird umgeschaltet." + +msgid "" +"\" For other options you can edit the value before hitting " +"." +msgstr "" +"\" Andere Optionen können editiert werden vor den Drücken von " +"." + +msgid "\" Hit on a help line to open a help window on this option." +msgstr "\" Drücke auf einer Hilfe-Zeile um die zugehörige Hilfe dieser Option anzuzeigen." + +msgid "\" Hit on an index line to jump there." +msgstr "\" Drücke auf einer Index Zeile um dorthin zu springen." + +msgid "\" Hit on a \"set\" line to refresh it." +msgstr "\" Drücke auf einer \"set\" Zeile um sie zu aktualisieren." + +msgid "important" +msgstr "wichtig" + +msgid "behave very Vi compatible (not advisable)" +msgstr "sich sehr Vi kompatibel verhalten (nicht ratsam)" + +msgid "list of flags to specify Vi compatibility" +msgstr "Liste Flags um Vi-Kompatibilität zu spezifizieren" + +msgid "use Insert mode as the default mode" +msgstr "nutze Einfüge-Modus als Standard Modus" + +msgid "paste mode, insert typed text literally" +msgstr "Paste Modus, um getippten Text literal einzufügen" + +msgid "key sequence to toggle paste mode" +msgstr "Tastenkombination zum Umschalten des Paste Modus" + +msgid "list of directories used for runtime files and plugins" +msgstr "Liste von Verzeichnissen für die Runtime Dateien und Plugins" + +msgid "list of directories used for plugin packages" +msgstr "Liste von Verzeichnissen für die Plugin Pakete" + +msgid "name of the main help file" +msgstr "Dateiname der Haupthilfe" + +msgid "moving around, searching and patterns" +msgstr "Bewegen, Suchen und Muster" + +msgid "list of flags specifying which commands wrap to another line" +msgstr "Liste von Flags zum Definieren welche Befehle zur nächsten Zeile umbrechen" + +msgid "" +"many jump commands move the cursor to the first non-blank\n" +"character of a line" +msgstr "" +"viele Sprungbefehle bewegen den Cursor zum ersten Nicht-Leerzeichen\n" +"einer Zeile" + +msgid "nroff macro names that separate paragraphs" +msgstr "nroff Makros die Absätze trennen" + +msgid "nroff macro names that separate sections" +msgstr "nroff Makros die Abschnitte trennen" + +msgid "list of directory names used for file searching" +msgstr "Liste von Verzeichnissen zum Suchen von Dateien" + +msgid "list of directory names used for :cd" +msgstr "Liste von Verzeichnissen für :cd Befehl" + +msgid "change to directory of file in buffer" +msgstr "Ins Verzeichnis der zugehörigen Datei wechseln" + +msgid "search commands wrap around the end of the buffer" +msgstr "Such-Befehle beginne von vorn am Ende des Buffers" + +msgid "show match for partly typed search command" +msgstr "Zeige Übereinstimmung für eingetippten Suchbefehl" + +msgid "change the way backslashes are used in search patterns" +msgstr "Ändert die Art wie Backslashes in Suchmustern verwendet werden" + +msgid "select the default regexp engine used" +msgstr "Wählt die Standard-Regexp-Engine aus " + +msgid "ignore case when using a search pattern" +msgstr "Groß-/Kleinbuchstaben ignorieren bei der Suche" + +msgid "override 'ignorecase' when pattern has upper case characters" +msgstr "'ignorecase' Option aufheben, wenn Muster mit Großbuchstaben beginnt" + +msgid "what method to use for changing case of letters" +msgstr "Welche Methode verwendet werden soll zum Ändern von Groß-/Kleinbuchstaben" + +msgid "maximum amount of memory in Kbyte used for pattern matching" +msgstr "Maximaler zu nutzender Speichers für die Suche in Kbyte" + +msgid "pattern for a macro definition line" +msgstr "Muster um eine Makrodefinition zu finden" + +msgid "pattern for an include-file line" +msgstr "Muster um eine \"include\" Zeile zu finden" + +msgid "expression used to transform an include line to a file name" +msgstr "Ausdruck um eine \"include\" Zeile zu einem Dateinamen umzuwandeln" + +msgid "tags" +msgstr "tags" + +msgid "use binary searching in tags files" +msgstr "Binärsuche für die Suche in Tags-Dateien verwenden" + +msgid "number of significant characters in a tag name or zero" +msgstr "Anzahl signifikanter Buchstaben in einem Tagnamen (oder Null)" + +msgid "list of file names to search for tags" +msgstr "Liste an Dateinamen zum Suchen für Tags" + +msgid "" +"how to handle case when searching in tags files:\n" +"\"followic\" to follow 'ignorecase', \"ignore\" or \"match\"" +msgstr "" +"wie Unterschiede in Groß-/Kleinschreibung für die Suche in Tag-Dateien:\n" +"\"followic\" folgt 'ignorecase' Option, \"ignore\" oder \"match\"" + +msgid "file names in a tags file are relative to the tags file" +msgstr "Dateinamen in einer Tags-Datei sind relativ zur selbigen" + +msgid "a :tag command will use the tagstack" +msgstr "ein :tag Befehl nutzt den Tagstack" + +msgid "when completing tags in Insert mode show more info" +msgstr "beim vervollständigen von Tags im Einfüge-Modus weitere Infos anzeigen" + +msgid "a function to be used to perform tag searches" +msgstr "eine Funktion für die Tag-Suche verwenden" + +msgid "command for executing cscope" +msgstr "Befehl zum Ausführen von cscope" + +msgid "use cscope for tag commands" +msgstr "Benutze cscope für tag Befehle" + +msgid "0 or 1; the order in which \":cstag\" performs a search" +msgstr "0 oder 1; Reihenfolge wie \":cstag\" eine Suche durchführt" + +msgid "give messages when adding a cscope database" +msgstr "Nachricht geben, wenn eine cscope-Datenbank hinzugefügt wird" + +msgid "how many components of the path to show" +msgstr "wie viele Komponenten des Pfades anzuzeigen" + +msgid "when to open a quickfix window for cscope" +msgstr "Ob das Quickfix Fenster für cscope zu nutzen ist" + +msgid "file names in a cscope file are relative to that file" +msgstr "Dateinamen in einer cscope Datei sind relativ zu dieser" + +msgid "displaying text" +msgstr "anzuzeigender Text" + +msgid "number of lines to scroll for CTRL-U and CTRL-D" +msgstr "Anzahl zu scrollender Zeilen für CTRL-U und CTRL-D" + +msgid "number of screen lines to show around the cursor" +msgstr "Anzahl anzuzeigender Zeilen um den Cursor herum" + +msgid "long lines wrap" +msgstr "lange Zeilen umbrechen" + +msgid "wrap long lines at a character in 'breakat'" +msgstr "lange Zeilen an Zeichen in 'breakat' umbrechen" + +msgid "preserve indentation in wrapped text" +msgstr "Einrückungen beibehalten in umbrochenen Text" + +msgid "adjust breakindent behaviour" +msgstr "breakindent Verhalten anpassen" + +msgid "which characters might cause a line break" +msgstr "welche Zeichen einen Zeilenumbruch verursachen können" + +msgid "string to put before wrapped screen lines" +msgstr "Zeichenkette die vor einem Zeilenbumbruch angezeigt wird" + +msgid "minimal number of columns to scroll horizontally" +msgstr "minimale Spaltenanzahl zum horizontalen Scrollen " + +msgid "minimal number of columns to keep left and right of the cursor" +msgstr "minimale anzuzeigende Spaltenanzahl rechts und links des Cursor" + +msgid "" +"include \"lastline\" to show the last line even if it doesn't fit\n" +"include \"uhex\" to show unprintable characters as a hex number" +msgstr "" +"füge \"lastline\" hinzu um die letzte Zeile anzuzeigen, auch wenn sie nicht passt\n" +"füge \"uhex\" hinzu um nicht druckbare Zeichen als Hex-Wert anzuzeigen" + +msgid "characters to use for the status line, folds and filler lines" +msgstr "zu verwendende Zeichen für die Statuszeile, Folds und Füllzeilen" + +msgid "number of lines used for the command-line" +msgstr "Anzahl zu verwendender Zeilen für die Commandline" + +msgid "width of the display" +msgstr "Anzahl an Spalten des Displays" + +msgid "number of lines in the display" +msgstr "Anzahl an Zeilen des Displays" + +msgid "number of lines to scroll for CTRL-F and CTRL-B" +msgstr "Anzahl zu scrollender Zeilen für CTRL-F und CTRL-B" + +msgid "don't redraw while executing macros" +msgstr "währed der Ausführung von Makros nicht neu zeichnen" + +msgid "timeout for 'hlsearch' and :match highlighting in msec" +msgstr "Timeout für 'hlsearch' und :match Highlights in msec" + +msgid "" +"delay in msec for each char written to the display\n" +"(for debugging)" +msgstr "" +"Verzögerung in msec für jedes zu zeichnendes Zeichen\n" +"(zum Debuggen)" + +msgid "show as ^I and end-of-line as $" +msgstr "zeige als ^I und Zeilenende als $" + +msgid "list of strings used for list mode" +msgstr "Liste an Zeichenketten für die Nutzung des List Modus" + +msgid "show the line number for each line" +msgstr "Zeilennummerierung anzeigen" + +msgid "show the relative line number for each line" +msgstr "relative Zeilennummerierung anzeigen" + +msgid "number of columns to use for the line number" +msgstr "zu verwendede Spaltenanzahl für die Zeilennummerierung" + +msgid "controls whether concealable text is hidden" +msgstr "ob verdeckter Text anzuzeigen ist" + +msgid "modes in which text in the cursor line can be concealed" +msgstr "Modi in denen Text innhalb der Cursorzeile verdeckt werden kann" + +msgid "syntax, highlighting and spelling" +msgstr "Syntax, Hervorhebung und Rechtschreibprüfung" + +msgid "\"dark\" or \"light\"; the background color brightness" +msgstr "\"dark\" oder \"light\"; die Helligkeit des Hintergrunds" + +msgid "type of file; triggers the FileType event when set" +msgstr "Dateityp; löst das FileType Autokommando aus" + +msgid "name of syntax highlighting used" +msgstr "Name der zu verwendenen Syntax Hervorhebung" + +msgid "maximum column to look for syntax items" +msgstr "maximale Spaltenanzahl, in der nach Syntaxelementen gesucht werden soll" + +msgid "which highlighting to use for various occasions" +msgstr "welche Hervorherbung für unterschiedlice Gelegenheiten genutzt werden soll" + +msgid "highlight all matches for the last used search pattern" +msgstr "Hervorhebung des letzten Suchmuchsters" + +msgid "highlight group to use for the window" +msgstr "für das Fenster zu verwendende Hervorhebungsgruppe" + +msgid "use GUI colors for the terminal" +msgstr "GUI Farben im Terminal nutzen" + +msgid "highlight the screen column of the cursor" +msgstr "Cursorspalte hervorheben" + +msgid "highlight the screen line of the cursor" +msgstr "Cursorzeile hervorheben" + +msgid "specifies which area 'cursorline' highlights" +msgstr "angeben wo 'cursorline' hervorhebt" + +msgid "columns to highlight" +msgstr "extra hervorzuhebende Spalten" + +msgid "highlight spelling mistakes" +msgstr "Rechtschreibfehler hervorheben" + +msgid "list of accepted languages" +msgstr "Liste zu prüfender Sprachen" + +msgid "file that \"zg\" adds good words to" +msgstr "Datei zu der \"zg\" richtige Wörter hinzufügt" + +msgid "pattern to locate the end of a sentence" +msgstr "Muster um Ende eines Satzes zu finden" + +msgid "flags to change how spell checking works" +msgstr "Flags, welche die Rechtschreibprüfung beeinflussen" + +msgid "methods used to suggest corrections" +msgstr "Methoden um Korrekturen vorzuschlagen" + +msgid "amount of memory used by :mkspell before compressing" +msgstr "Speichermenge die von :mkspell vor der Komprimierung verwendet wird" + +msgid "multiple windows" +msgstr "mehrere Fenster" + +msgid "0, 1 or 2; when to use a status line for the last window" +msgstr "0, 1 oder 2; wann eine Statuszeile verwendet wird" + +msgid "alternate format to be used for a status line" +msgstr "Format das für die Statuszeile verwendet wird" + +msgid "make all windows the same size when adding/removing windows" +msgstr "alle Fenster gleich groß machen, wenn ein neues Fenster hinzukommt oder entfernt wird" + +msgid "in which direction 'equalalways' works: \"ver\", \"hor\" or \"both\"" +msgstr "für welche Richtung 'equalalways' verwendet wird: \"ver\", \"hor\" oder \"both\"" + +msgid "minimal number of lines used for the current window" +msgstr "minimal zu verwendende Zeilenanzahl für aktuelles Fenster" + +msgid "minimal number of lines used for any window" +msgstr "minmal zu verwendende Zeilenanzahl für alle Fenster" + +msgid "keep the height of the window" +msgstr "aktuelle Größe des Fenster beibehalten" + +msgid "keep the width of the window" +msgstr "aktuelle Breite des Fensters beibehalten" + +msgid "minimal number of columns used for the current window" +msgstr "minimale Spaltenanzahl für das aktuelle Fenster" + +msgid "minimal number of columns used for any window" +msgstr "minimale Spaltenanzahl für alle Fenster" + +msgid "initial height of the help window" +msgstr "initiale Größe des Hilfefensters " + +msgid "use a popup window for preview" +msgstr "ein Popup-Fenster als Vorschaufenster nutzen" + +msgid "default height for the preview window" +msgstr "Standard Höhe für das Vorschaufenster" + +msgid "identifies the preview window" +msgstr "identifiziert ein Vorschaufenster" + +msgid "don't unload a buffer when no longer shown in a window" +msgstr "Buffer nicht entladen, wenn er nicht länger in einem Fenster angezeigt wird" + +msgid "" +"\"useopen\" and/or \"split\"; which window to use when jumping\n" +"to a buffer" +msgstr "" +"\"useopen\" und/oder/or \"split\"; welches Fenster beim Springen zum Buffer zu verwenden ist" + +msgid "a new window is put below the current one" +msgstr "neues Fenster wird unter dem aktuellen geöffnet" + +msgid "a new window is put right of the current one" +msgstr "neues Fenster wird rechts neben dem aktuellen geöffnet" + +msgid "this window scrolls together with other bound windows" +msgstr "dieses Fenster scrollt zusammen mit anderen verbundenen Fenstern" + +msgid "\"ver\", \"hor\" and/or \"jump\"; list of options for 'scrollbind'" +msgstr "\"ver\", \"hor\" und/oder \"jump\"; Liste von Optionen für 'scrollbind'" + +msgid "this window's cursor moves together with other bound windows" +msgstr "Cursor des aktuellen Fensters bewegt sich gleichzeitig mit anderen verbundenen Fenstern" + +msgid "size of a terminal window" +msgstr "Größe des Terminal Fensters" + +msgid "key that precedes Vim commands in a terminal window" +msgstr "Taste, die anderen Vim Befehlen im Terminalfenster vorausgeht" + +msgid "max number of lines to keep for scrollback in a terminal window" +msgstr "maximale zu behaltende Zeilenanzahl für das Zurückscrollen im Terminalfenster" + +msgid "type of pty to use for a terminal window" +msgstr "Typ des zu verwendenen ptys für das Terminalfenster" + +msgid "name of the winpty dynamic library" +msgstr "Name der winpty-dynamischen Bibliothek" + +msgid "multiple tab pages" +msgstr "mehrere Tab Seiten" + +msgid "0, 1 or 2; when to use a tab pages line" +msgstr "0, 1, oder 2; wann eine Tabseitenzeile verwendet wird" + +msgid "maximum number of tab pages to open for -p and \"tab all\"" +msgstr "maximale Anzahl an zu öffnenden Tabseiten (für -p und \"tab all\")" + +msgid "custom tab pages line" +msgstr "benutzerdefinierte Tabseitenzeile" + +msgid "custom tab page label for the GUI" +msgstr "benutzerdefinierte Tabseitenbeschriftung für die GUI" + +msgid "custom tab page tooltip for the GUI" +msgstr "benutzerdefinierter Tabseiten-Tooltip für die GUI" + +msgid "terminal" +msgstr "Terminal" + +msgid "name of the used terminal" +msgstr "Name des zu verwendenen Terminals" + +msgid "alias for 'term'" +msgstr "Alias für 'term'" + +msgid "check built-in termcaps first" +msgstr "eingebautes Termcap zuerst prüfen" + +msgid "terminal connection is fast" +msgstr "schnelle Terminalverbindung" + +msgid "terminal that requires extra redrawing" +msgstr "Terminal benötigt zusätzliche Redraws" + +msgid "recognize keys that start with in Insert mode" +msgstr "erkennt Tasten die mit in Einfüge-Modus anfangen" + +msgid "minimal number of lines to scroll at a time" +msgstr "minimale gleichzeitig zu scrollende Zeilenanzahl" + +msgid "maximum number of lines to use scrolling instead of redrawing" +msgstr "maximal zu scrollende Zeilenanzahl bevor neu gezeichnet wird" + +msgid "specifies what the cursor looks like in different modes" +msgstr "definiert wie der Cursor in unterschiedlichen Modi aussieht" + +msgid "show info in the window title" +msgstr "zeige Infos im Fenstertitel" + +msgid "percentage of 'columns' used for the window title" +msgstr "für den Fentertitel zu verwendender Prozentsatz" + +msgid "when not empty, string to be used for the window title" +msgstr "wenn nicht leer, Zeichenkette, die im Fenstertitel angezeigt wird" + +msgid "string to restore the title to when exiting Vim" +msgstr "Zeichenkette zum Wiederherstellen des Fenstertitels beim Beenden" + +msgid "set the text of the icon for this window" +msgstr "den Symboltext für das Fenster setzen" + +msgid "when not empty, text for the icon of this window" +msgstr "wenn nicht leer, Symboltext des Fensters setzen" + +msgid "restore the screen contents when exiting Vim" +msgstr "den Bildschirminhalt beim Beenden wiederherstellen" + +msgid "using the mouse" +msgstr "Mausnutzung" + +msgid "list of flags for using the mouse" +msgstr "Liste an Flags zur Nutzung der Maus" + +msgid "the window with the mouse pointer becomes the current one" +msgstr "das Fenster mit dem Mauszeiger wird das aktuelle" + +msgid "the window with the mouse pointer scrolls with the mouse wheel" +msgstr "das Fenster mit dem Mauszeiger wird mit der Maus gescrollt" + +msgid "hide the mouse pointer while typing" +msgstr "den Mauszeiger beim Tippen verstecken" + +msgid "" +"\"extend\", \"popup\" or \"popup_setpos\"; what the right\n" +"mouse button is used for" +msgstr "" +"\"extend\", \"popup\" oder \"popup_setpos\"; wofür die rechte\n" +"Maustaste genutzt wird" + +msgid "maximum time in msec to recognize a double-click" +msgstr "maximale Anzahl in msec um einen Doppelclick zu erkennen" + +msgid "\"xterm\", \"xterm2\", \"sgr\", etc.; type of mouse" +msgstr "\"xterm\", \"xterm2\", \"sgr\", etc.; Maustyp" + +msgid "what the mouse pointer looks like in different modes" +msgstr "wie der Mauszeiger in unterschiedliechen Modi aussieht" + +msgid "GUI" +msgstr "GUI" + +msgid "list of font names to be used in the GUI" +msgstr "Liste an zu verwendenden Schriften für die GUI" + +msgid "pair of fonts to be used, for multibyte editing" +msgstr "zu verwendende Schriftartenpaar für die Multibyte-Bearbeitung" + +msgid "list of font names to be used for double-wide characters" +msgstr "Liste der zu verwendenden Schriftarten für doppelt-breite Zeichen" + +msgid "use smooth, antialiased fonts" +msgstr "glatte, antialiasierte Schriften verwenden" + +msgid "list of flags that specify how the GUI works" +msgstr "Liste von Flags, die das Verhalten der GUI beeinflußen" + +msgid "\"icons\", \"text\" and/or \"tooltips\"; how to show the toolbar" +msgstr "\"icons\", \"text\" und/oder \"tooltips\"; wie die Toolbar angezeigt wird" + +msgid "size of toolbar icons" +msgstr "Größe der Toolbar Icons" + +msgid "room (in pixels) left above/below the window" +msgstr "reservierter Platz (in Pixel) oberhalb/unterhalb des Fensters" + +msgid "options for text rendering" +msgstr "Optionen zum Textrendering" + +msgid "use a pseudo-tty for I/O to external commands" +msgstr "ein Pseudo-TTY für I/O zu externen Befehlen verwenden" + +msgid "" +"\"last\", \"buffer\" or \"current\": which directory used for the file " +"browser" +msgstr "" +"\"last\", \"buffer\" oder \"current\": zu nutzendes Verzeichnis für den Dateibrowser" + +msgid "language to be used for the menus" +msgstr "zu verwendende Sprache für die Menüs" + +msgid "maximum number of items in one menu" +msgstr "maximale Anzahl an Elementen in einem Menü" + +msgid "\"no\", \"yes\" or \"menu\"; how to use the ALT key" +msgstr "\"no\", \"yes\" oder \"menu\"; wie die ALT Taste genutzt wird" + +msgid "number of pixel lines to use between characters" +msgstr "Anzahl an zu nutzenden Pixelzeilen zwischen Zeichen" + +msgid "delay in milliseconds before a balloon may pop up" +msgstr "Verzögerung in msec bevor ein Ballon erscheint" + +msgid "use balloon evaluation in the GUI" +msgstr "verwende die Ballon-eval Funktion in der GUI" + +msgid "use balloon evaluation in the terminal" +msgstr "verwende die Ballon-eval Funktion im Terminal" + +msgid "expression to show in balloon eval" +msgstr "Textausdruck, der bei der Verwendung des Ballons angezeigt werden soll" + +msgid "printing" +msgstr "Drucken" + +msgid "list of items that control the format of :hardcopy output" +msgstr "Anzahl an Elementen die das Format der :hardcopy Ausgabe steuern" + +msgid "name of the printer to be used for :hardcopy" +msgstr "zu verwendender Druckername" + +msgid "expression used to print the PostScript file for :hardcopy" +msgstr "Ausdruck der zum Drucken der PostScriptdatei für :hardcopy genutzt wird" + +msgid "name of the font to be used for :hardcopy" +msgstr "Schriftname, der für :hardcopy genutzt wird" + +msgid "format of the header used for :hardcopy" +msgstr "Format der Kopfzeile die für :hardcopy verwendet wird" + +msgid "encoding used to print the PostScript file for :hardcopy" +msgstr "zum Drucken der PostScriptdatei verwendete Kodierung für :hardcopy" + +msgid "the CJK character set to be used for CJK output from :hardcopy" +msgstr "der für die CJK-Ausgabe zu verwendende CJK-Zeichensatz von :hardcopy" + +msgid "list of font names to be used for CJK output from :hardcopy" +msgstr "List an Schriftarten die für die CJK-Ausgabe von :hardcopy genutzt wird" + +msgid "messages and info" +msgstr "Meldungen und Informationen" + +msgid "add 's' flag in 'shortmess' (don't show search message)" +msgstr "füge 's' Flag in 'shortmess' hinzu (keine Suchmeldung anzeigen)" + +msgid "list of flags to make messages shorter" +msgstr "Liste an Flags um Meldungen kürzer auszugeben" + +msgid "show (partial) command keys in the status line" +msgstr "zeige (partielle) Befehlstasten in der Statuszeile" + +msgid "display the current mode in the status line" +msgstr "zeige aktuellen Modus in der Statuszeile" + +msgid "show cursor position below each window" +msgstr "zeige Cursor Position unter jedem Fenster" + +msgid "alternate format to be used for the ruler" +msgstr "alternatives Format für die 'ruler' Option" + +msgid "threshold for reporting number of changed lines" +msgstr "Schwellwert für die Meldung der Anzeige geänderter Zeilen" + +msgid "the higher the more messages are given" +msgstr "je höher desto mehr Meldungen werden ausgegeben" + +msgid "file to write messages in" +msgstr "Datei in die Meldungen geschrieben werden" + +msgid "pause listings when the screen is full" +msgstr "halte Auflistung von Meldungen an, wenn der Bildschirm voll ist" + +msgid "start a dialog when a command fails" +msgstr "führe einen Dialog aus, wenn ein Befehl fehlschlägt" + +msgid "ring the bell for error messages" +msgstr "bei Fehlermeldungen piepen" + +msgid "use a visual bell instead of beeping" +msgstr "nutze eine grafische Klingel" + +msgid "do not ring the bell for these reasons" +msgstr "aus den folgenden Gründen nicht piepen" + +msgid "list of preferred languages for finding help" +msgstr "Liste der bevorzugten Sprachen für die Hilfe" + +msgid "selecting text" +msgstr "Textauswahl" + +msgid "\"old\", \"inclusive\" or \"exclusive\"; how selecting text behaves" +msgstr "\"old\", \"inclusive\" oder \"exclusive\"; wie sich die Textauswahl verhält" + +msgid "" +"\"mouse\", \"key\" and/or \"cmd\"; when to start Select mode\n" +"instead of Visual mode" +msgstr "" +"\"mouse\", \"key\" und/oder \"cmd\"; wann Select Modus\n" +"anstelle von Visual Modus genutzt wird" + +msgid "" +"\"unnamed\" to use the * register like unnamed register\n" +"\"autoselect\" to always put selected text on the clipboard" +msgstr "" +"\"unnamed\" nutzt das * Register wie das unbenannte Register\n" +"\"autoselect\" ausgewählten Text automatisch in der Zwischenablage speichern" + +msgid "\"startsel\" and/or \"stopsel\"; what special keys can do" +msgstr "\"startsel\" und/oder \"stopsel\"; was bestimmte Tasten machen" + +msgid "editing text" +msgstr "Textbearbeitung" + +msgid "maximum number of changes that can be undone" +msgstr "maximale Anzahl an Änderungen, die rückgängig gemacht werden können" + +msgid "automatically save and restore undo history" +msgstr "automatisches Sichern und Wiederherstellen der Undo-Historie" + +msgid "list of directories for undo files" +msgstr "Verzeichnisliste für Undo-Dateien" + +msgid "maximum number lines to save for undo on a buffer reload" +msgstr "maximale Anzahl zu speichernder Zeilen beim neu laden des Buffers" + +msgid "changes have been made and not written to a file" +msgstr "Änderungen wurde gemacht und nicht in die Datei zurück geschrieben" + +msgid "buffer is not to be written" +msgstr "Buffer soll nicht geschrieben werden" + +msgid "changes to the text are possible" +msgstr "Änderungen am Text sind möglich" + +msgid "line length above which to break a line" +msgstr "Zeilenlänge ab wann umgebrochen wird" + +msgid "margin from the right in which to break a line" +msgstr "Rand von rechts an dem eine Zeile umbrochen wird" + +msgid "specifies what , CTRL-W, etc. can do in Insert mode" +msgstr "definiert, wie sich , CTRL-W etc. im Einfüge-Modus verhält" + +msgid "definition of what comment lines look like" +msgstr "Definition einer Kommentarzeile" + +msgid "list of flags that tell how automatic formatting works" +msgstr "Liste von Flags, die automatisches Formatieren beeinflußen" + +msgid "pattern to recognize a numbered list" +msgstr "Muster um eine Aufzählungsliste zu erkennen" + +msgid "expression used for \"gq\" to format lines" +msgstr "Ausdruck für \"gq\" zur Formatierung von Zeilen" + +msgid "specifies how Insert mode completion works for CTRL-N and CTRL-P" +msgstr "legt fest, wie Vervollständigen im Einfüge-Modus mit CTRL-N und CTRL-P funktioniert" + +msgid "whether to use a popup menu for Insert mode completion" +msgstr "ob ein Popup-Menü bei der Verfollständigen im Einfüge-Modus genutzt wird" + +msgid "options for the Insert mode completion info popup" +msgstr "Optionen für das Popup bei der Einfüge-Modus Vervollständigung" + +msgid "maximum height of the popup menu" +msgstr "maximale Höhe des Popup-Menüs" + +msgid "minimum width of the popup menu" +msgstr "minimale Breite des Popup-Menüs" + +msgid "user defined function for Insert mode completion" +msgstr "benutzerdefinierte Funktion für Vervollständigung im Einfüge-Modus" + +msgid "function for filetype-specific Insert mode completion" +msgstr "Funktion für Dateityp-spezifische Vervollständigung im Einfüge-Modus" -#, c-format -msgid "E482: Can't create file %s" -msgstr "E482: Kann Datei %s nicht erzeugen" +msgid "list of dictionary files for keyword completion" +msgstr "Liste von Wörterbuchdateien für Keyword-Vervollständigung" -msgid "E483: Can't get temp file name" -msgstr "E483: Kann den Namen der temporären Datei nicht ermitteln" +msgid "list of thesaurus files for keyword completion" +msgstr "List von Thesaurusdateien für Keyword-Vervollständigung" -#, c-format -msgid "E484: Can't open file %s" -msgstr "E484: Kann die Datei %s nicht öffnen" +msgid "adjust case of a keyword completion match" +msgstr "Groß-/Kleinschreibung für Keyword-Vervollständigung anpassen" -#, c-format -msgid "E485: Can't read file %s" -msgstr "E485: Kann Datei %s nicht lesen" +msgid "enable entering digraphs with c1 c2" +msgstr "erlaubt das Eingeben von Digraphs mittels c1 c2" -msgid "E38: Null argument" -msgstr "E38: Null-Argument" +msgid "the \"~\" command behaves like an operator" +msgstr "der \"~\" Befehl verhält sich wie ein Operator" -msgid "E39: Number expected" -msgstr "E39: Nummer erwartet" +msgid "function called for the \"g@\" operator" +msgstr "aufzurufende Funktion für den \"g@\" Operator" -#, c-format -msgid "E40: Can't open errorfile %s" -msgstr "E40: Fehlerdatei %s kann nicht geöffnet werden" +msgid "when inserting a bracket, briefly jump to its match" +msgstr "bei der Eingabe von Klammern, kurz zur zugehörigen Klammer springen" -msgid "E233: cannot open display" -msgstr "E233: Display kann nicht geöffnet werden" +msgid "tenth of a second to show a match for 'showmatch'" +msgstr "Anzahl an Zentelsekunden um zugehörige Klammer anzuzeigen" -msgid "E41: Out of memory!" -msgstr "E41: Speicher erschöpft!" +msgid "list of pairs that match for the \"%\" command" +msgstr "Liste an zugehörigen Paaren für den \"%\" Befehl" -msgid "Pattern not found" -msgstr "Muster nicht gefunden" +msgid "use two spaces after '.' when joining a line" +msgstr "nutze zwei Leerzeichen nach einem '.' beim Verbinden einer Zeile" -#, c-format -msgid "E486: Pattern not found: %s" -msgstr "E486: Muster nicht gefunden: %s" +msgid "" +"\"alpha\", \"octal\", \"hex\", \"bin\" and/or \"unsigned\"; number formats\n" +"recognized for CTRL-A and CTRL-X commands" +msgstr "" +"\"alpha\", \"octal\", \"hex\", \"bin\" und/oder \"unsigned\"; zu erkennende Zahlenformate\n" +"für CTRL-A und CTRL-X Befehle" -msgid "E487: Argument must be positive" -msgstr "E487: Argument muss positiv sein" +msgid "tabs and indenting" +msgstr "Tabs und Einrückungen" -msgid "E459: Cannot go back to previous directory" -msgstr "E459: Kann nicht ins vorhergehende Verzeichnis wechseln" +msgid "number of spaces a in the text stands for" +msgstr "Anzahl an Leerzeichen für einen im Text" -msgid "E42: No Errors" -msgstr "E42: Keine Fehler" +msgid "number of spaces used for each step of (auto)indent" +msgstr "zu nutzende Anzahl an Leerzeichen je Einrückungsebene" -msgid "E776: No location list" -msgstr "E776: Keine Positionsliste" +msgid "list of number of spaces a tab counts for" +msgstr "Anzahl an Leerzeichen für einen " -msgid "E43: Damaged match string" -msgstr "E43: Beschädigter Suchausdruck" +msgid "list of number of spaces a soft tabsstop counts for" +msgstr "Anzahl an Leerzeichen für einen Soft-Tabstop" -msgid "E44: Corrupted regexp program" -msgstr "E44: schadhaftes regexp Programm" +msgid "a in an indent inserts 'shiftwidth' spaces" +msgstr "ein beim Einrücken fügt 'shiftwidth' Leerzeichen ein" -msgid "E45: 'readonly' option is set (add ! to override)" -msgstr "E45: Die Option 'readonly' ist gesetzt (erzwinge mit !)" +msgid "if non-zero, number of spaces to insert for a " +msgstr "wenn ungleich 0, Anzahl an einzufügenden Leerzeichen für einen " -#, c-format -msgid "E121: Undefined variable: %s" -msgstr "E121: Undefinierte Variable: %s" +msgid "round to 'shiftwidth' for \"<<\" and \">>\"" +msgstr "runde Einrückung zum nächsten 'shiftwidth' für \"<<\" und \">>\"" -#, c-format -msgid "E734: Wrong variable type for %s=" -msgstr "E734: Falscher Variablentyp für %s=" +msgid "expand to spaces in Insert mode" +msgstr "ersetze durch Leerzeichen im Einfüge-Modus" -#, c-format -msgid "E461: Illegal variable name: %s" -msgstr "E461: Unzulässiger Variablenname: %s" +msgid "automatically set the indent of a new line" +msgstr "automatisches Einrücken neuer Zeilen" -msgid "E995: Cannot modify existing variable" -msgstr "E995: Kann existierende Variable nicht ändern" +msgid "do clever autoindenting" +msgstr "cleveres automatisches Einrücken vornehmen" -#, c-format -msgid "E46: Cannot change read-only variable \"%s\"" -msgstr "E46: Variable \"%s\" kann nur gelesen werden" +msgid "enable specific indenting for C code" +msgstr "erlaube C-Code spezifisches Einrücken" -#, c-format -msgid "E794: Cannot set variable in the sandbox: \"%s\"" -msgstr "E794: Variable kann nicht in der Sandbox gesetzt werden: \"%s\"" +msgid "options for C-indenting" +msgstr "Optionen für C-Code spezifisches Einrücken" -msgid "E928: String required" -msgstr "E928: String wird benötigt." +msgid "keys that trigger C-indenting in Insert mode" +msgstr "Tasten, die C-Code Einrücken im Einfüge-Modus auslösen" -msgid "E713: Cannot use empty key for Dictionary" -msgstr "E713: Der Schlüssel für das Dictionary darf nicht leer sein" +msgid "list of words that cause more C-indent" +msgstr "Liste an Wörtern, die ein eweiteres C-Code Einrücken auslösen" -msgid "E715: Dictionary required" -msgstr "E715: Dictionary benötigt" +msgid "expression used to obtain the indent of a line" +msgstr "Ausdruck um den Einzug einer Zeile zu erhalten" -#, c-format -msgid "E684: list index out of range: %ld" -msgstr "E684: Index der Liste außerhalb des zulässigen Bereichs: %ld" +msgid "keys that trigger indenting with 'indentexpr' in Insert mode" +msgstr "Tasten, die das Einrücken von 'indentexpr' im Einfüge-Modus auslösen" -#, c-format -msgid "E979: Blob index out of range: %ld" -msgstr "E979: Blobindex außerhalb des Bereichs: %ld" +msgid "copy whitespace for indenting from previous line" +msgstr "Einfügen von Leerzeichen aus der vorherigen Zeile kopieren" -msgid "E978: Invalid operation for Blob" -msgstr "E978: Unzulässige Operation für Blob" +msgid "preserve kind of whitespace when changing indent" +msgstr "Art von Leerzeichen beim Ändern des Einzugs beibehalten" -#, c-format -msgid "E118: Too many arguments for function: %s" -msgstr "E118: Zu viele Argumente für Funktion: %s" +msgid "enable lisp mode" +msgstr "aktiviere Lisp Modus" -#, c-format -msgid "E119: Not enough arguments for function: %s" -msgstr "E119: Zu wenige Argumente für Funktion: %s" +msgid "words that change how lisp indenting works" +msgstr "Wörter, die die Funktionsweise des Lisp-Einzugs ändern" -#, c-format -msgid "E933: Function was deleted: %s" -msgstr "E933: Funktion wurde gelöscht: %s" +msgid "folding" +msgstr "Faltung" -#, c-format -msgid "E716: Key not present in Dictionary: %s" -msgstr "E716: Schlüssel %s nicht im Dictionary vorhanden." +msgid "unset to display all folds open" +msgstr "ausschalten um alle Faltungen zu öffnen" -msgid "E714: List required" -msgstr "E714: Liste benötigt" +msgid "folds with a level higher than this number will be closed" +msgstr "Faltungen eines höheren Levels werden geschlossen" -msgid "E1090: List, Dict or Blob required" -msgstr "E1090: Liste, Dictionary oder Blob benötigt" +msgid "value for 'foldlevel' when starting to edit a file" +msgstr "Wert von 'foldlevel' beim Start des Editierens einer Datei" -msgid "E897: List or Blob required" -msgstr "E897: Liste oder Blob benötigt" +msgid "width of the column used to indicate folds" +msgstr "Breite der Spalte die Faltungen anzeigt" -#, c-format -msgid "E697: Missing end of List ']': %s" -msgstr "E697: Fehlendes Ende der Liste ']': %s" +msgid "expression used to display the text of a closed fold" +msgstr "Ausdruck, der verwendet wird, um den Text einer geschlossene Faltung anzuzeigen" -#, c-format -msgid "E712: Argument of %s must be a List or Dictionary" -msgstr "E712: Argument von %s muss eine Liste oder ein Dictionary sein." +msgid "set to \"all\" to close a fold when the cursor leaves it" +msgstr "setze auf \"all\" um eine Faltung zu schließen, wenn der Cursor sie verlässt" -#, c-format -msgid "E896: Argument of %s must be a List, Dictionary or Blob" -msgstr "E896: Argument von %s muss eine Liste, Dictionary oder ein Blob sein." +msgid "specifies for which commands a fold will be opened" +msgstr "definiert für welche Befehle eine Faltung geöffnet wird" -msgid "E804: Cannot use '%' with Float" -msgstr "E804: Kann '%' mit Floats benutzen." +msgid "minimum number of screen lines for a fold to be closed" +msgstr "minimale Anzahl an Bildschirmzeilen damit Faltung geschlossen wird" -msgid "E908: using an invalid value as a String" -msgstr "E908: Ungültiger Wert als String verwendet." +msgid "template for comments; used to put the marker in" +msgstr "Template für Kommentare; wird verwendet um Faltungs-Marker einzufügen" -msgid "E996: Cannot lock an option" -msgstr "E996: Kann Option nicht sperren" +msgid "" +"folding type: \"manual\", \"indent\", \"expr\", \"marker\",\n" +"\"syntax\" or \"diff\"" +msgstr "" +"Faltungstypen: \"manual\", \"indent\", \"expr\", \"marker\",\n" +"\"syntax\" oder \"diff\"" -#, c-format -msgid "E113: Unknown option: %s" -msgstr "E113: Unbekannte Option: %s" +msgid "expression used when 'foldmethod' is \"expr\"" +msgstr "Ausdruck der genutzt wird, wenn 'foldmethod' \"expr\" ist" -msgid "E18: Unexpected characters in :let" -msgstr "E18: Unerwartete Zeichen in :let" +msgid "used to ignore lines when 'foldmethod' is \"indent\"" +msgstr "wird genutzt um Zeilen zu ignorieren wenn 'foldmethod' \"indent\" ist" -#, c-format -msgid "E998: Reduce of an empty %s with no initial value" -msgstr "E998: Reduzierung einer leeren %s ohne initialen Anfangswert" +msgid "markers used when 'foldmethod' is \"marker\"" +msgstr "genutzte Marker wenn 'foldmethod' \"marker\" ist" -#, c-format -msgid "E857: Dictionary key \"%s\" required" -msgstr "E857: Dictionary Schlüssel \"%s\" benötigt" +msgid "maximum fold depth for when 'foldmethod' is \"indent\" or \"syntax\"" +msgstr "maximale Faltungstiefe, wenn 'foldmethod' \"indent\" oder \"syntax\" ist" -msgid "E47: Error while reading errorfile" -msgstr "E47: Fehler während des Lesens der Fehlerdatei" +msgid "diff mode" +msgstr "Diff Modus" -msgid "E48: Not allowed in sandbox" -msgstr "E48: In einer Sandbox nicht erlaubt" +msgid "use diff mode for the current window" +msgstr "nutze Diff Modus im aktuellen Fenster" -msgid "E523: Not allowed here" -msgstr "E523: Hier nicht erlaubt" +msgid "options for using diff mode" +msgstr "Optionen für den Diff Modus" -msgid "E578: Not allowed to change text here" -msgstr "E578: Nicht erlaubt Text hier zu ändern" +msgid "expression used to obtain a diff file" +msgstr "Ausdrücke um einen Diff zu erhalten" -msgid "E565: Not allowed to change text or change window" -msgstr "E565: Es ist nicht erlaubt Text oder Fenster zu ändern" +msgid "expression used to patch a file" +msgstr "verwendeter Ausdruck um einen Datei zu patchen" -msgid "E359: Screen mode setting not supported" -msgstr "E359: Bildschirm-Modus wird nicht unterstützt" +msgid "mapping" +msgstr "Mapping" -msgid "E49: Invalid scroll size" -msgstr "E49: Ungültige Scroll-Größe" +msgid "maximum depth of mapping" +msgstr "maximale Tiefe eins Mappings" -msgid "E91: 'shell' option is empty" -msgstr "E91: Die Option 'shell' ist leer" +msgid "recognize mappings in mapped keys" +msgstr "erkenne Mappings in gemappten Tasten" -msgid "E255: Couldn't read in sign data!" -msgstr "E255: Fehler -- Sign-Daten konnten nicht gelesen werden" +msgid "allow timing out halfway into a mapping" +msgstr "erlaube Timeouts von Mappings" -msgid "E72: Close error on swap file" -msgstr "E72: Fehler beim Schließen der Auslagerungsdatei" +msgid "allow timing out halfway into a key code" +msgstr "erlaube Timeouts von Tasten" -msgid "E73: tag stack empty" -msgstr "E73: Tag Stack leer." +msgid "time in msec for 'timeout'" +msgstr "Zeit in msec für 'timeout'" -msgid "E74: Command too complex" -msgstr "E74: Befehl zu komplex" +msgid "time in msec for 'ttimeout'" +msgstr "Zeit in msec für 'ttimeout'" -msgid "E75: Name too long" -msgstr "E75: Name zu lang" +msgid "reading and writing files" +msgstr "Lesen und Schreiben von Dateien" -msgid "E76: Too many [" -msgstr "E76: Zu viele [" +msgid "enable using settings from modelines when reading a file" +msgstr "erlaube das Setzen von Optionen in Modelines beim Lesen einer Datei" -msgid "E77: Too many file names" -msgstr "E77: Zu viele Dateinamen" +msgid "allow setting expression options from a modeline" +msgstr "erlaube das Setzen von Ausdrucks-Optionen ('*expr') aus einer Modeline" -msgid "E488: Trailing characters" -msgstr "E488: Überschüssige Zeichen" +msgid "number of lines to check for modelines" +msgstr "zu checkende Zeilenanzahl für Modelines" -msgid "E78: Unknown mark" -msgstr "E78: Unbekannte Markierung" +msgid "binary file editing" +msgstr "binäres Dateibearbeiten" -msgid "E79: Cannot expand wildcards" -msgstr "E79: Kann die Platzhalter nicht erweitern" +msgid "last line in the file has an end-of-line" +msgstr "letzte Zeile einer Datei hat ein Zeilenendezeichen" -msgid "E591: 'winheight' cannot be smaller than 'winminheight'" -msgstr "E591: 'winheight' darf nicht kleiner sein als 'winminheight'" +msgid "fixes missing end-of-line at end of text file" +msgstr "behebt ein fehlendes Zeilenendezeichen am Ende einer Textdatei" -msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'" -msgstr "E592: 'winwidth' darf nicht kleiner sein als 'winminwidth'" +msgid "prepend a Byte Order Mark to the file" +msgstr "Byte Order Mark am Anfang einer Datei hinzufügen" -msgid "E80: Error while writing" -msgstr "E80: Fehler während des Schreibens" +msgid "end-of-line format: \"dos\", \"unix\" or \"mac\"" +msgstr "Zeilenendezeichenformat: \"dos\", \"unix\" oder \"mac\"" -msgid "E939: Positive count required" -msgstr "E939: Positive Zahl benötigt" +msgid "list of file formats to look for when editing a file" +msgstr "List von zu erkennenden Zeilenformaten beim Bearbeiten einer Datei" -msgid "E81: Using not in a script context" -msgstr "E81: wurde nicht in einer Skript-Umgebung benutzt" +msgid "obsolete, use 'fileformat'" +msgstr "veraltet, verwende 'fileformat'" -#, c-format -msgid "E107: Missing parentheses: %s" -msgstr "E107: Fehlende Klammern: %s" +msgid "obsolete, use 'fileformats'" +msgstr "veraltet, verwende 'fileformats'" -msgid "E110: Missing ')'" -msgstr "E110: Fehlendes ')'" +msgid "writing files is allowed" +msgstr "Schreiben von Dateien ist erlaubt" -#, c-format -msgid "E720: Missing colon in Dictionary: %s" -msgstr "E720: Fehlender Doppelpunkt im Dictionary: %s" +msgid "write a backup file before overwriting a file" +msgstr "eine Backupdatei vor dem Überschreiben anlegen" -#, c-format -msgid "E721: Duplicate key in Dictionary: \"%s\"" -msgstr "E721: Doppelter Schlüssel im Dictionary: \"%s\"" +msgid "keep a backup after overwriting a file" +msgstr "behalte Backup nach dem Überschreiben einer Datei" -#, c-format -msgid "E722: Missing comma in Dictionary: %s" -msgstr "E722: Fehlendes Komma im Dictionary: %s" +msgid "patterns that specify for which files a backup is not made" +msgstr "Muster, das angibt für welche Dateien kein Backup erstellt wird" -#, c-format -msgid "E723: Missing end of Dictionary '}': %s" -msgstr "E723: Fehlendes Ende des Dictionary '}': %s" +msgid "whether to make the backup as a copy or rename the existing file" +msgstr "ob ein Backup als Kopie oder die vorhandene Datei umbenannt werden soll" -msgid "E449: Invalid expression received" -msgstr "E449: Ungültiger Ausdruck" +msgid "list of directories to put backup files in" +msgstr "Liste an Verzeichnissen, wo Backupdateien gespeichert werden" -msgid "E463: Region is guarded, cannot modify" -msgstr "E463: Region ist geschützt; keine Änderung möglich" +msgid "file name extension for the backup file" +msgstr "Dateiendung für die Backupdatei" -msgid "E744: NetBeans does not allow changes in read-only files" -msgstr "E744: NetBeans erlaubt keine Änderungen in schreibgeschützten Dateien" +msgid "automatically write a file when leaving a modified buffer" +msgstr "Datei automatisch schreiben beim Verlassen eines geänderten Buffers" -msgid "E363: pattern uses more memory than 'maxmempattern'" -msgstr "E363: Muster benötigt mehr Speicher als 'maxmempattern'" +msgid "as 'autowrite', but works with more commands" +msgstr "wie 'autowrite', aber funktioniert mit mehr Befehlen" -msgid "E749: empty buffer" -msgstr "E749: Leerer Puffer" +msgid "always write without asking for confirmation" +msgstr "immer schreiben, ohne nach einer Bestätigung zu fragen" -#, c-format -msgid "E86: Buffer %ld does not exist" -msgstr "E86: Puffer %ld existiert nicht." +msgid "automatically read a file when it was modified outside of Vim" +msgstr "Datei automatisch lesen wenn sie außerhalb von Vim geändert wurde" -msgid "E682: Invalid search pattern or delimiter" -msgstr "E682: Ungültiges Suchmuster oder Trennzeichen" +msgid "keep oldest version of a file; specifies file name extension" +msgstr "älteste Version einer Datei behalten; definiert Dateiendung" -msgid "E139: File is loaded in another buffer" -msgstr "E139: Datei ist in einem anderen Puffer geladen" +msgid "forcibly sync the file to disk after writing it" +msgstr "nach dem Schreiben die Datei zwangsweise mit der Festplatte synchronisieren" -#, c-format -msgid "E764: Option '%s' is not set" -msgstr "E764: Option '%s' ist nicht gesetzt" +msgid "use 8.3 file names" +msgstr "nutze 8.3 Dateinamen" -msgid "E850: Invalid register name" -msgstr "E850: Ungültiger Register Name" +msgid "encryption method for file writing: zip, blowfish or blowfish2" +msgstr "Verschlüsselungsmethode: zip, blowfish oder blowfish2" -msgid "E806: using Float as a String" -msgstr "E806: Float als String benutzt." +msgid "the swap file" +msgstr "Keine Auslagerungsdatei" -#, c-format -msgid "E919: Directory not found in '%s': \"%s\"" -msgstr "E919: Verzeichnis nicht gefunden in '%s': \"%s\"" +msgid "list of directories for the swap file" +msgstr "Liste an Verzeichnissen, wo Auslagerungsdateien gespeichert werden" -msgid "E952: Autocommand caused recursive behavior" -msgstr "E952: Autokommando verursachten Rekursion" +msgid "use a swap file for this buffer" +msgstr "eine Auslagerungsdatei für diesen Buffer nutzen" -msgid "E813: Cannot close autocmd or popup window" -msgstr "" -"E813: Autokommando-Fenster oder Popup-Fenster kann nicht geschlossen werden" +msgid "\"sync\", \"fsync\" or empty; how to flush a swap file to disk" +msgstr "\"sync\", \"fsync\" oder leer; wie eine Auslagerungsdatei auf Festplatte geschrieben wird" -msgid "E328: Menu only exists in another mode" -msgstr "E328: Menü existiert nur in anderen Modi" +msgid "number of characters typed to cause a swap file update" +msgstr "Anzahl eingegebenen Zeichen nachdem eine Auslagerungsdatei aktualisiert wird" -msgid "E957: Invalid window number" -msgstr "E957: Ungültige Fensternummer" +msgid "time in msec after which the swap file will be updated" +msgstr "Zeit in msec nachdem eine Auslagerungsdatei aktualisiert wird" -#, c-format -msgid "E686: Argument of %s must be a List" -msgstr "E686: Argument von %s muss eine Liste sein." +msgid "maximum amount of memory in Kbyte used for one buffer" +msgstr "maximale Speichermenge in Kilobyte für einen Buffer" -msgid "E109: Missing ':' after '?'" -msgstr "E109: Fehlender ':' nach '?'" +msgid "maximum amount of memory in Kbyte used for all buffers" +msgstr "maximale Speichermenge in Kilobyte für alle Buffer" -msgid "E690: Missing \"in\" after :for" -msgstr "E690: Fehlendes \"in\" nach :for" +msgid "command line editing" +msgstr "Befehlszeile" -#, c-format -msgid "E117: Unknown function: %s" -msgstr "E117: Unbekannte Funktion: %s" +msgid "how many command lines are remembered" +msgstr "wie viele Befehle gespeichert werden" -msgid "E111: Missing ']'" -msgstr "E111: Fehlende ']'" +msgid "key that triggers command-line expansion" +msgstr "Taste, welche die Kommandozeilen-Vervollständigung auslöst" -msgid "E581: :else without :if" -msgstr "E581: :else ohne :if" +msgid "like 'wildchar' but can also be used in a mapping" +msgstr "wie 'wildchar' aber für Makros" -msgid "E582: :elseif without :if" -msgstr "E582: :elseif ohne :if" +msgid "specifies how command line completion works" +msgstr "definiert wie die Kommandozeilen-Vervollständigung funktioniert" -msgid "E580: :endif without :if" -msgstr "E580: :endif ohne :if" +msgid "empty or \"tagfile\" to list file name of matching tags" +msgstr "leer oder \"tagfile\" um Dateinamen von passenden Tags anzuzeigen" -msgid "E586: :continue without :while or :for" -msgstr "E586: :continue ohne :while or :for" +msgid "list of file name extensions that have a lower priority" +msgstr "Liste von Dateieindungen mit einer geringen Priorität" -msgid "E587: :break without :while or :for" -msgstr "E587: :break ohne :while oder :for" +msgid "list of file name extensions added when searching for a file" +msgstr "Liste von zusätzlichen Dateiendungen wenn Dateien gesucht werden" -msgid "E274: No white space allowed before parenthesis" -msgstr "E274: Keine Leerzeichen vor Klammern erlaubt" +msgid "list of patterns to ignore files for file name completion" +msgstr "Liste an zu ignorierenden Dateimustern für die Dateinamens-Vervollständigung" -#, c-format -msgid "E1004: white space required before and after '%s'" -msgstr "E1004: Leerzeichen vor und nach '%s' benötigt" +msgid "ignore case when using file names" +msgstr "Groß-/Kleinschreibung bei Dateinamen ignorieren" -#, c-format -msgid "E1069: white space required after '%s'" -msgstr "E1069: Leerzeichen benötigt nach '%s'" +msgid "ignore case when completing file names" +msgstr "Groß-/Kleinschreibug bei Dateinamens-Vervollständigung ignorieren" -#, c-format -msgid "E1068: No white space allowed before '%s'" -msgstr "E1068: Keine Leerzeichen vor '%s' erlaubt" +msgid "command-line completion shows a list of matches" +msgstr "Kommandozeilen-Vervollständigung zeigt Vorschläge an" -#, c-format -msgid "E940: Cannot lock or unlock variable %s" -msgstr "E940: Kann Variable \"%s\" nicht sperren bzw. entsperren." +msgid "key used to open the command-line window" +msgstr "Taste um das Kommandozeilen-Fenster zu öffnen" -msgid "E1021: const requires a value" -msgstr "E1021: const erfordert einen Wert" +msgid "height of the command-line window" +msgstr "Höhe des Kommandozeilen-Fensters" -msgid "E1022: type or initialization required" -msgstr "E1022: Typ oder Initialisierung erforderlich" +msgid "executing external commands" +msgstr "externe Befehle ausführen" -#, c-format -msgid "E1016: Cannot declare a %s variable: %s" -msgstr "E1016: Kann eine %s Variable nicht deklarieren: %s" +msgid "name of the shell program used for external commands" +msgstr "Name der Shell zum Ausführen externer Befehle" -#, c-format -msgid "E1016: Cannot declare an environment variable: %s" -msgstr "E1016: Kann eine Umgebungsvariable nicht deklarieren: %s" +msgid "when to use the shell or directly execute a command" +msgstr "wann eine Shell oder direkt der Befehl ausgeführt wird" -msgid "E1050: Colon required before a range" -msgstr "E1050: Doppelpunkt vor einem Bereich benötigt" +msgid "character(s) to enclose a shell command in" +msgstr "Zeichen zum Einschließen eines Shell-Befehls" -#, c-format -msgid "E254: Cannot allocate color %s" -msgstr "E254: Kann die Farbe %s nicht zuweisen." +msgid "like 'shellquote' but include the redirection" +msgstr "wie 'shellquote', aber schließen auch die Umleitung ein" -msgid "search hit TOP, continuing at BOTTOM" -msgstr "Suche erreichte den ANFANG und wurde am ENDE fortgesetzt" +msgid "characters to escape when 'shellxquote' is (" +msgstr "Zeichen, die zu escapen sind, wenn 'shellxquote' \"(\" ist" -msgid "search hit BOTTOM, continuing at TOP" -msgstr "Suche erreichte das ENDE und wurde am ANFANG fortgesetzt" +msgid "argument for 'shell' to execute a command" +msgstr "Argument für 'shell' um ein Befehl auszuführen" -msgid " line " -msgstr " Zeile " +msgid "used to redirect command output to a file" +msgstr "verwendet um Befehl in eine Datei umzuleiten" -#, c-format -msgid "Need encryption key for \"%s\"" -msgstr "Geben Sie bitte den Schlüssel für \"%s\" ein: " +msgid "use a temp file for shell commands instead of using a pipe" +msgstr "nutzt eine temporäre Datei für Shell-Befehle anstatt einer Pipe" -msgid "empty keys are not allowed" -msgstr "Leerer Schlüssel nicht erlaubt" +msgid "program used for \"=\" command" +msgstr "zu verwendendes Programm für \"=\" Befehl" -msgid "dictionary is locked" -msgstr "Dictionary ist gesperrt" +msgid "program used to format lines with \"gq\" command" +msgstr "zu verwendendes Programm für \"gq\" Befehl" -msgid "list is locked" -msgstr "Liste ist gesperrt" +msgid "program used for the \"K\" command" +msgstr "zu verwendendes Programm für \"K\" Befehl" -#, c-format -msgid "failed to add key '%s' to dictionary" -msgstr "Konnte Schlüssel '%s' zu Dictionary nicht hinzufügen." +msgid "warn when using a shell command and a buffer has changes" +msgstr "warne wenn ein Shell-Befehl genutzt wird und ein Buffer Änderung hat" -#, c-format -msgid "index must be int or slice, not %s" -msgstr "Index muss eine Int oder Slice sein, nicht %s" +msgid "running make and jumping to errors (quickfix)" +msgstr "Make aufrufen und zu Fehler springen (Quickfix)" -#, c-format -msgid "expected str() or unicode() instance, but got %s" -msgstr "erwartete str() oder unicode() Instanz, erhielt jedoch %s" +msgid "name of the file that contains error messages" +msgstr "Dateiname der Datei mit den Fehlermeldungen" -#, c-format -msgid "expected bytes() or str() instance, but got %s" -msgstr "Erwartete bytes() oder str() Instanz, erhielt jedoch %s" +msgid "list of formats for error messages" +msgstr "Liste an Formaten für Fehlermeldungen" -#, c-format -msgid "" -"expected int(), long() or something supporting coercing to long(), but got %s" -msgstr "" -"erwartete int(), long() or etwas was sich zu long() wandeln lässt, erhielt " -"jedoch %s" +msgid "program used for the \":make\" command" +msgstr "zu verwendendes Programm für \":make\" Befehl" -#, c-format -msgid "expected int() or something supporting coercing to int(), but got %s" -msgstr "" -"erwartete int() oder etwas was sich zu int() wandeln lässt, erhielt jedoch %s" +msgid "string used to put the output of \":make\" in the error file" +msgstr "Zeichenkette um Ausgabe von \":make\" in Fehlerdatei umzuleiten" -msgid "value is too large to fit into C int type" -msgstr "Wert zu groß für einen C Integerwert" +msgid "name of the errorfile for the 'makeprg' command" +msgstr "Name der Fehlerdatei für 'makeprg' Befehl" -msgid "value is too small to fit into C int type" -msgstr "Wert zu klein für einen C Integerwert" +msgid "program used for the \":grep\" command" +msgstr "zu verwendendes Programm für \":grep\" Befehl" -msgid "number must be greater than zero" -msgstr "Nummer muss größer als 0 sein" +msgid "list of formats for output of 'grepprg'" +msgstr "Liste an Formaten für die Ausgabe von 'grepprg'" -msgid "number must be greater or equal to zero" -msgstr "Nummer muss größer gleich 0 sein" +msgid "encoding of the \":make\" and \":grep\" output" +msgstr "Kodierung von \":make\" und \":grep\" Ausgabe" -msgid "can't delete OutputObject attributes" -msgstr "OutputObject-Attribute können nicht gelöscht werden" +msgid "function to display text in the quickfix window" +msgstr "Funktion um Text im Quickfix Fenster anzuzeigen" -#, c-format -msgid "invalid attribute: %s" -msgstr "unzulässiges Attribut: %s" +msgid "system specific" +msgstr "System spezifisch" -msgid "E264: Python: Error initialising I/O objects" -msgstr "E264: Python: Fehler bei der Initialisierung von I/O Objekten" +msgid "use forward slashes in file names; for Unix-like shells" +msgstr "nutze (vorwärts) Schrägstriche in Dateinamen; für Unix-artige Shells" -msgid "failed to change directory" -msgstr "Verzeichniswechsel fehlgeschlagen" +msgid "specifies slash/backslash used for completion" +msgstr "spezifiziert Slash/Backslash für Vervollständigung" -#, c-format -msgid "expected 3-tuple as imp.find_module() result, but got %s" -msgstr "" -"erwartete 3 Tuple als Ergebnis von imp.find_module(), erhielt jedoch %s" +msgid "language specific" +msgstr "Sprachspezifisch" -#, c-format -msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d" -msgstr "" -"erwartete 3 Tuple als Ergebnis von find_module(), but erhielt Tuple der " -"Größe %d" +msgid "specifies the characters in a file name" +msgstr "spezifiziert Zeichen in einem Dateinamen" -msgid "internal error: imp.find_module returned tuple with NULL" -msgstr "interner Fehler: imp.find_module gab Tuple mit NULL zurück" +msgid "specifies the characters in an identifier" +msgstr "spezifiziert Zeichen in einer Kennung (identifier)" -msgid "cannot delete vim.Dictionary attributes" -msgstr "kann vim.Dictionary Attribute nicht löschen" +msgid "specifies the characters in a keyword" +msgstr "spezifiziert Zeichen in einem Keyword" -msgid "cannot modify fixed dictionary" -msgstr "Kann festes Dictionary nicht ändern" +msgid "specifies printable characters" +msgstr "spezifiziert druckbare Zeichen" -#, c-format -msgid "cannot set attribute %s" -msgstr "Kann nicht Attribut %s setzen" +msgid "specifies escape characters in a string" +msgstr "spezifiziert Escape-Zeichen einer Zeichenkette" -msgid "hashtab changed during iteration" -msgstr "Hashtab veränderte sich während der Initialisierung" +msgid "display the buffer right-to-left" +msgstr "den Inhalt eines Buffers von rechts nach links anzeigen" -#, c-format -msgid "expected sequence element of size 2, but got sequence of size %d" -msgstr "" -"erwartete Sequenz Element der Größe 2, erhielt jedoch Sequenz der Größe %d" +msgid "when to edit the command-line right-to-left" +msgstr "wann die Kommandozeile von rechts nach links zu bearbeiten ist" -msgid "list constructor does not accept keyword arguments" -msgstr "Listen Konstruktor akzeptiert keine Keyword Argumente" +msgid "insert characters backwards" +msgstr "Zeichen rückwärts einfügen" -msgid "list index out of range" -msgstr "Listen Index außerhalb des gültigen Bereichs" +msgid "allow CTRL-_ in Insert and Command-line mode to toggle 'revins'" +msgstr "erlaubt CTRL-_ im Einfüge- und Kommandozeilen-Modus" -#, c-format -msgid "internal error: failed to get Vim list item %d" -msgstr "interner Fehler: Zugriff auf Vim Listobjekt %d fehlgeschlagen" +msgid "the ASCII code for the first letter of the Hebrew alphabet" +msgstr "der ASCII Code für den ersten Buchstaben des hebräischen Alphabets" -msgid "slice step cannot be zero" -msgstr "Slice Schritt kann nicht Null sein" +msgid "use Hebrew keyboard mapping" +msgstr "hebräische Tastaturbelegung nutzen" -#, c-format -msgid "attempt to assign sequence of size greater than %d to extended slice" -msgstr "" -"Versuch der Zuweisung von Sequenzgröße größer als %d zu erweiterten Slice" +msgid "use phonetic Hebrew keyboard mapping" +msgstr "phonetische hebräische Tastaturbelegung nutzen" -#, c-format -msgid "internal error: no Vim list item %d" -msgstr "interner Fehler: Kein Vim Listobjekt %d" +msgid "prepare for editing Arabic text" +msgstr "beginne Bearbeitung von arabischen Text" -msgid "internal error: not enough list items" -msgstr "interner Fehler: nicht genügend Listobjekte" +msgid "perform shaping of Arabic characters" +msgstr "Formen arabischer Zeichen durchführen" -msgid "internal error: failed to add item to list" -msgstr "interner Fehler: konnte Objekt nicht Liste hinzufügen" +msgid "terminal will perform bidi handling" +msgstr "Terminal führt Bidi-Handhabung durch" -#, c-format -msgid "attempt to assign sequence of size %d to extended slice of size %d" -msgstr "" -"Versuch der Zuweisung von Sequenzgröße %d zu erweiterten Slice der Größe %d" +msgid "name of a keyboard mapping" +msgstr "Name einer Tastatusbelegung" -msgid "failed to add item to list" -msgstr "Hinzufügen von Objekt zu Liste fehlgeschlagen" +msgid "list of characters that are translated in Normal mode" +msgstr "Liste von Zeichen, die im Normal-Modus übersetzt werden" -msgid "cannot delete vim.List attributes" -msgstr "kann vim.List Attribute nicht löschen" +msgid "apply 'langmap' to mapped characters" +msgstr "'langmap' auf gemappted Zeichen anwenden" -msgid "cannot modify fixed list" -msgstr "kann feste Liste nicht modifizieren" +msgid "when set never use IM; overrules following IM options" +msgstr "wenn gesetzt, nutzt kein IM, überstimmt folgende IM Optionen" -#, c-format -msgid "unnamed function %s does not exist" -msgstr "Unbenannte Funktion %s existiert nicht" +msgid "in Insert mode: 1: use :lmap; 2: use IM; 0: neither" +msgstr "im Einfüge-Modus: 1: nutzt :lmap; 2: nutzt IM; 0: keine" -#, c-format -msgid "function %s does not exist" -msgstr "Funktion %s existiert nicht" +msgid "input method style, 0: on-the-spot, 1: over-the-spot" +msgstr "Eingabemethode: 0: On-the-spot, 1: Over-the-spot" -#, c-format -msgid "failed to run function %s" -msgstr "Fehler beim Ausführen der Funktion %s" +msgid "entering a search pattern: 1: use :lmap; 2: use IM; 0: neither" +msgstr "Eingabe eines Suchmusters: 1: nutzt :lmap; 2: nutzt IM; 0: keine" -msgid "unable to get option value" -msgstr "konnte Optionswert nicht erhalten" +msgid "when set always use IM when starting to edit a command line" +msgstr "wenn gesetzt, nutzt immer IM beim Bearbeiten der Kommandozeile" -msgid "internal error: unknown option type" -msgstr "interner Fehler: unbekannter Optionstyp" +msgid "function to obtain IME status" +msgstr "Funktion um den IME Status zu erhalten" -msgid "problem while switching windows" -msgstr "Problem beim Wechseln der Fenster" +msgid "function to enable/disable IME" +msgstr "Funktion um IME zu aktivieren/deaktivieren" -#, c-format -msgid "unable to unset global option %s" -msgstr "Konnte globale Option %s nicht aufheben" +msgid "multi-byte characters" +msgstr "Multi-Byte Zeichen" -#, c-format -msgid "unable to unset option %s which does not have global value" -msgstr "konnte Option %s nicht aufheben, da sie keinen globalen Wert hat" +msgid "" +"character encoding used in Vim: \"latin1\", \"utf-8\",\n" +"\"euc-jp\", \"big5\", etc." +msgstr "" +"in Vim genutzte Zeichenkodierung: \"latin1\", \"utf-8\",\n" +"\"euc-jp\", \"big5\", etc." -msgid "attempt to refer to deleted tab page" -msgstr "Versuch, Bezug auf einen gelöschten Reiter zu nehmen" +msgid "character encoding for the current file" +msgstr "Zeichenkodierung der aktuellen Datei" -msgid "no such tab page" -msgstr "kein solcher Reiter vorhanden" +msgid "automatically detected character encodings" +msgstr "automatisch erkannte Zeichenkodierung" -msgid "attempt to refer to deleted window" -msgstr "Versuch, Bezug auf eine gelöschtes Fenster zu nehmen" +msgid "character encoding used by the terminal" +msgstr "Zeichenkodierung des Terminals" -msgid "readonly attribute: buffer" -msgstr "nur-Lesen Attribut: Puffer" +msgid "expression used for character encoding conversion" +msgstr "zur Zeichenkonvertierung zu nutzender Ausdruck" -msgid "cursor position outside buffer" -msgstr "Cursor Position außerhalb des Puffers" +msgid "delete combining (composing) characters on their own" +msgstr "kombinierende (composing) Zeichen einzeln löschen" -msgid "no such window" -msgstr "ungültiges Fenster" +msgid "maximum number of combining (composing) characters displayed" +msgstr "maximale Anzahl an anzuzeigenden kombinierenden (composing) Zeichen" -msgid "attempt to refer to deleted buffer" -msgstr "Versuch, Bezug auf einen gelöschten Puffer zu nehmen" +msgid "key that activates the X input method" +msgstr "Taste, die die X-Eingabemethode aktiviert" -msgid "failed to rename buffer" -msgstr "Umbenennen des Puffers fehlgeschlagen" +msgid "width of ambiguous width characters" +msgstr "Breite von ambiguous-width Zeichen" -msgid "mark name must be a single character" -msgstr "Markierung muss ein einzelner Buchstabe sein" +msgid "emoji characters are full width" +msgstr "Emoji Zeichen haben volle Breite" -#, c-format -msgid "expected vim.Buffer object, but got %s" -msgstr "erwartete vim.Puffer Objekt, erhielt jedoch %s" +msgid "various" +msgstr "Verschiedenes" -#, c-format -msgid "failed to switch to buffer %d" -msgstr "Wechsel zu Puffer %d fehlgeschlagen" +msgid "" +"when to use virtual editing: \"block\", \"insert\", \"all\"\n" +"and/or \"onemore\"" +msgstr "" +"Wann virtuelles Bearbeiteni genutzt wird: \"block\", \"insert\", \"all\"\n" +"und/oder \"onemore\"" -#, c-format -msgid "expected vim.Window object, but got %s" -msgstr "erwartete vim.Window Objekt, erhielt jedoch %s" +msgid "list of autocommand events which are to be ignored" +msgstr "Liste von zu ignorierenden Autokommando Ereignisse" -msgid "failed to find window in the current tab page" -msgstr "konnte Fenster im aktuellen Reiter nicht finden" +msgid "load plugin scripts when starting up" +msgstr "Lade Plugins beim Start" -msgid "did not switch to the specified window" -msgstr "konnte nicht zu spezifizierten Fenster wechseln" +msgid "enable reading .vimrc/.exrc/.gvimrc in the current directory" +msgstr "erlaube das Lesen von .vimrc/.exrc/.gvimrc im aktuellen Verzeichnis" -#, c-format -msgid "expected vim.TabPage object, but got %s" -msgstr "erwartete vim.TabPage Objekt, erhielt jedoch %s" +msgid "safer working with script files in the current directory" +msgstr "sicheres Arbeiten von Script Dateien im aktuellen Verzeichnis" -msgid "did not switch to the specified tab page" -msgstr "konnte nicht zu spezifiziertem Reiter wechseln" +msgid "use the 'g' flag for \":substitute\"" +msgstr "nutze das 'g' Flag für \":substitute\"" -msgid "failed to run the code" -msgstr "Ausführen des Codes fehlgeschlagen." +msgid "'g' and 'c' flags of \":substitute\" toggle" +msgstr "'g' und 'c' Flags für \":substitute\" umschalten" -msgid "E858: Eval did not return a valid python object" -msgstr "E858: Eval hat kein gültiges Pythonobjekt zurückgegeben" +msgid "allow reading/writing devices" +msgstr "erlaube Lesen/Schreiben von Geräten" -msgid "E859: Failed to convert returned python object to a Vim value" -msgstr "" -"E859: Konvertierung von zurückgegebenen Pythonobjekt zu Vim Wert " -"fehlgeschlagen" +msgid "maximum depth of function calls" +msgstr "maximale Tiefe von Funktionsaufrufen" -#, c-format -msgid "unable to convert %s to a Vim dictionary" -msgstr "konnte nicht %s zu Vim Dictionary konvertieren" +msgid "list of words that specifies what to put in a session file" +msgstr "Liste von Wörtern, die konfigurieren, was in einer Session Datei gespeichert wird" -#, c-format -msgid "unable to convert %s to a Vim list" -msgstr "konnte %s nicht zu Vim Liste konvertieren" +msgid "list of words that specifies what to save for :mkview" +msgstr "Liste von Wörtern, die konfigurieren, was in einer Datei für :mkview gespeichert wird" -#, c-format -msgid "unable to convert %s to a Vim structure" -msgstr "konnte %s nicht zu Vim Struktur konvertieren" +msgid "directory where to store files with :mkview" +msgstr "Verzeichnis in dem Dateien für :mkview gespeichert werden" -msgid "internal error: NULL reference passed" -msgstr "interner Fehler: NULL Referenz übermittelt" +msgid "list that specifies what to write in the viminfo file" +msgstr "Liste die definiert, was in der Viminfo Datei gespeichert wird" -msgid "internal error: invalid value type" -msgstr "interner Fehler: ungültiger Werttyp" +msgid "file name used for the viminfo file" +msgstr "Dateiname für die Viminfo Datei" -msgid "" -"Failed to set path hook: sys.path_hooks is not a list\n" -"You should now do the following:\n" -"- append vim.path_hook to sys.path_hooks\n" -"- append vim.VIM_SPECIAL_PATH to sys.path\n" -msgstr "" -"Fehler beim setzen des Path hooks: sys.path_hooks ist keine Liste\n" -"Sie sollten jetzt eine der folgenden Alternativen tun:\n" -"- vim.path_hook zu sys.path_hooks hinzufügen\n" -"- vim.VIM_SPECIAL_PATH zu sys.path hinzufügen\n" +msgid "what happens with a buffer when it's no longer in a window" +msgstr "was passiert, wenn ein Buffer nicht länger in einem Fenster angezeigt wird" -msgid "" -"Failed to set path: sys.path is not a list\n" -"You should now append vim.VIM_SPECIAL_PATH to sys.path" -msgstr "" -"Fehler beim setzen des Pfades: sys.path ist keine Liste\n" -"Fügen Sie vim.VIM_SPECIAL_PATH zu sys.path hinzu" +msgid "empty, \"nofile\", \"nowrite\", \"quickfix\", etc.: type of buffer" +msgstr "leer, \"nofile\", \"nowrite\", \"quickfix\", etc: Buffertyp" -msgid "" -"Vim macro files (*.vim)\t*.vim\n" -"All Files (*.*)\t*.*\n" -msgstr "" -"Vim Dateien (*.vim)\t*.vim\n" -"Alle Dateien (*.*)\t*.*\n" +msgid "whether the buffer shows up in the buffer list" +msgstr "ob der Buffer in der Bufferliste angezeigt wird" -msgid "All Files (*.*)\t*.*\n" -msgstr "Alle Dateien (*.*)\t*.*\n" +msgid "set to \"msg\" to see all error messages" +msgstr "setze auf \"msg\" um alle Fehlermeldungen zu sehen" -msgid "" -"All Files (*.*)\t*.*\n" -"C source (*.c, *.h)\t*.c;*.h\n" -"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n" -"VB code (*.bas, *.frm)\t*.bas;*.frm\n" -"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" -msgstr "" -"Alle Dateien (*.*)\t*.*\n" -"C Quellcode (*.c, *.h)\t*.c;*.h\n" -"C++ Quellcode (*.cpp, *.hpp)\t*.cpp;*.hpp\n" -"VB Quellcode (*.bas, *.frm)\t*.bas;*.frm\n" -"Vim Dateien (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +msgid "whether to show the signcolumn" +msgstr "ob die Zeichenspalte (signcolumn) angezeigt wird" -msgid "" -"Vim macro files (*.vim)\t*.vim\n" -"All Files (*)\t*\n" -msgstr "" -"Vim Dateien (*.vim)\t*.vim\n" -"Alle Dateien (*)\t*\n" +msgid "interval in milliseconds between polls for MzScheme threads" +msgstr "Intervall in Millisekunden zwischen Abrufen der MzScheme Threads" -msgid "All Files (*)\t*\n" -msgstr "Alle Dateien (*)\t*\n" +msgid "name of the Lua dynamic library" +msgstr "Name der dynamischen Lua Bibliothek" -msgid "" -"All Files (*)\t*\n" -"C source (*.c, *.h)\t*.c;*.h\n" -"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n" -"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" -msgstr "" -"Alle Dateien (*)\t*\n" -"C Quellcode (*.c, *.h)\t*.c;*.h\n" -"C++ Quellcode (*.cpp, *.hpp)\t*.cpp;*.hpp\n" -"Vim Dateien (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +msgid "name of the Perl dynamic library" +msgstr "Name der dynamischen Perl Bibliothek" -msgid "GVim" -msgstr "GVim" +msgid "whether to use Python 2 or 3" +msgstr "ob Python 2 oder 3 verwendet wird" -msgid "Text Editor" -msgstr "Texteditor" +msgid "name of the Python 2 dynamic library" +msgstr "Name der dynamischen Python 2 Bibliothek" -msgid "Edit text files" -msgstr "Textdateien bearbeiten" +msgid "name of the Python 2 home directory" +msgstr "Name des Python 2 Home-Verzeichnis" -msgid "Text;editor;" -msgstr "Text;Editor;" +msgid "name of the Python 3 dynamic library" +msgstr "Name der dynamischen Python 3 Bibliothek" -msgid "gvim" -msgstr "gvim" +msgid "name of the Python 3 home directory" +msgstr "Name des Python 3 Home-Verzeichnis" -msgid "Vim" -msgstr "Vim" +msgid "name of the Ruby dynamic library" +msgstr "Name der dynamischen Ruby Bibliothek" + +msgid "name of the Tcl dynamic library" +msgstr "Name der dynamischen Tcl Bibliothek" +msgid "name of the MzScheme dynamic library" +msgstr "Name der dynamischen MzScheme Bibliothek" +msgid "name of the MzScheme GC dynamic library" +msgstr "Name der dynamischen MzScheme GC Bibliothek" diff -Nru vim-8.2.1913/src/po/fr.po vim-8.2.2434/src/po/fr.po --- vim-8.2.1913/src/po/fr.po 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/po/fr.po 2021-01-30 22:05:11.000000000 +0000 @@ -6,14 +6,14 @@ # FIRST AUTHOR DindinX 2000. # SECOND AUTHOR Adrien Beau 2002, 2003. # THIRD AUTHOR David Blanchet 2006, 2008. -# FOURTH AUTHOR Dominique Pellé 2008, 2019. +# FOURTH AUTHOR Dominique Pellé 2008, 2020. # msgid "" msgstr "" -"Project-Id-Version: Vim 8.1\n" +"Project-Id-Version: Vim\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-07 11:35+0100\n" -"PO-Revision-Date: 2019-12-07 12:32+0100\n" +"POT-Creation-Date: 2020-12-25 13:48+0100\n" +"PO-Revision-Date: 2020-12-29 10:49+0100\n" "Last-Translator: Dominique Pellé \n" "Language-Team: French\n" "Language: fr\n" @@ -31,6 +31,9 @@ msgid "E165: Cannot go beyond last file" msgstr "E165: Impossible d'aller au-delà du dernier fichier" +msgid "E610: No argument to delete" +msgstr "E610: Aucun argument à supprimer" + msgid "E249: window layout changed unexpectedly" msgstr "E249: l'arrangement de fenêtre a été changé inopinément" @@ -232,9 +235,6 @@ msgid "[Not edited]" msgstr "[Non édité]" -msgid "[New file]" -msgstr "[Nouveau fichier]" - msgid "[Read errors]" msgstr "[Erreurs de lecture]" @@ -305,6 +305,12 @@ msgid "Do you really want to write to it" msgstr "Voulez-vous vraiment écrire dedans" +msgid "[New]" +msgstr "[Nouveau]" + +msgid "[New File]" +msgstr "[Nouveau fichier]" + msgid "E676: No matching autocommands for acwrite buffer" msgstr "E676: Pas d'autocommande correspondante pour le tampon acwrite" @@ -401,12 +407,6 @@ msgid "[Device]" msgstr "[Périph.]" -msgid "[New]" -msgstr "[Nouveau]" - -msgid "[New File]" -msgstr "[Nouveau fichier]" - msgid " [a]" msgstr " [a]" @@ -447,12 +447,16 @@ msgid "E902: Cannot connect to port" msgstr "E902: Impossible de se connecter au port" +msgid "E898: socket() in channel_connect()" +msgstr "E898: socket() dans channel_connect()" + +#, c-format +msgid "E901: getaddrinfo() in channel_open(): %s" +msgstr "E901: getaddrinfo() dans channel_open(): %s" + msgid "E901: gethostbyname() in channel_open()" msgstr "E901: gethostbyname() dans channel_open()" -msgid "E898: socket() in channel_open()" -msgstr "E898: socket() dans channel_open()" - msgid "E903: received command with non-string argument" msgstr "E903: commande reçue avec un argument qui n'est pas une chaîne" @@ -486,18 +490,49 @@ "E912: Impossible d'utiliser ch_evalexpr()/ch_sendexpr() avec un canal brut " "ou nl" -msgid "E920: _io file requires _name to be set" -msgstr "E920: fichier _io nécessite _name" +msgid "No display" +msgstr "Aucun display" -msgid "E915: in_io buffer requires in_buf or in_name to be set" -msgstr "E915: tampon in_io nécessite in_buf ou in_name " +msgid ": Send failed.\n" +msgstr " : L'envoi a échoué.\n" + +msgid ": Send failed. Trying to execute locally\n" +msgstr " : L'envoi a échoué. Tentative d'exécution locale\n" #, c-format -msgid "E918: buffer must be loaded: %s" -msgstr "E918: le tampon doit être chargé : %s" +msgid "%d of %d edited" +msgstr "%d édités sur %d" -msgid "E916: not a valid job" -msgstr "E916: tâche invalide" +msgid "No display: Send expression failed.\n" +msgstr "Aucun display : L'envoi de l'expression a échoué.\n" + +msgid ": Send expression failed.\n" +msgstr " : L'envoi de l'expression a échoué.\n" + +msgid "E240: No connection to the X server" +msgstr "E240: Pas de connexion au serveur X" + +# AB - La version française est meilleure que la version anglaise. +#, c-format +msgid "E241: Unable to send to %s" +msgstr "E241: L'envoi au serveur %s a échoué" + +msgid "E277: Unable to read a server reply" +msgstr "E277: Impossible de lire la réponse du serveur" + +msgid "E941: already started a server" +msgstr "E941: serveur déjà démarré" + +msgid "E942: +clientserver feature not available" +msgstr "E942: La fonctionnalité +clientserver n'est pas disponible" + +# AB - La version française est meilleure que la version anglaise. +msgid "E258: Unable to send to client" +msgstr "E258: La réponse n'a pas pu être envoyée au client" + +# DB - Message de débogage. +msgid "Used CUT_BUFFER0 instead of empty selection" +msgstr "CUT_BUFFER0 utilisé plutôt qu'une sélection vide" # DB - TODO : Pas compris le message ni comment le déclencher malgré une visite # dans le code. @@ -579,22 +614,6 @@ msgid "%3d expr %s" msgstr "%3d expr %s" -#, c-format -msgid "E720: Missing colon in Dictionary: %s" -msgstr "E720: Il manque ':' dans le Dictionnaire %s" - -#, c-format -msgid "E721: Duplicate key in Dictionary: \"%s\"" -msgstr "E721: Clé dupliquée dans le Dictionnaire : %s" - -#, c-format -msgid "E722: Missing comma in Dictionary: %s" -msgstr "E722: Il manque une virgule dans le Dictionnaire : %s" - -#, c-format -msgid "E723: Missing end of Dictionary '}': %s" -msgstr "E723: Il manque '}' à la fin du Dictionnaire : %s" - msgid "extend() argument" msgstr "argument de extend()" @@ -748,18 +767,6 @@ msgid "E791: Empty keymap entry" msgstr "E791: Entrée du descripteur de clavier (keymap) vide" -msgid "E111: Missing ']'" -msgstr "E111: ']' manquant" - -msgid "E719: Cannot use [:] with a Dictionary" -msgstr "E719: Utilisation de [:] impossible avec un Dictionnaire" - -msgid "E806: using Float as a String" -msgstr "E806: Utilisation d'un Flottant comme une Chaîne" - -msgid "E274: No white space allowed before parenthesis" -msgstr "E274: espace interdite avant une parenthèse" - msgid "E689: Can only index a List, Dictionary or Blob" msgstr "E689: Seul une Liste, un Dictionnaire ou un Blob peut être indexé" @@ -775,64 +782,15 @@ msgid "E996: Cannot lock a range" msgstr "E996: Impossible de verrouiller une plage" -msgid "E710: List value has more items than target" -msgstr "E710: La Liste a plus d'éléments que la destination" - -msgid "E711: List value has not enough items" -msgstr "E711: La Liste n'a pas assez d'éléments" - msgid "E996: Cannot lock a list or dict" msgstr "E996: Impossible de verrouiller une liste ou un dictionnaire" -msgid "E690: Missing \"in\" after :for" -msgstr "E690: \"in\" manquant après :for" - -# AB - Je suis partagé entre la concision d'une traduction assez littérale et -# la lourdeur d'une traduction plus correcte. -msgid "E109: Missing ':' after '?'" -msgstr "E109: Il manque ':' après '?'" - -msgid "E804: Cannot use '%' with Float" -msgstr "E804: Impossible d'utiliser '%' avec un Flottant" - -msgid "E973: Blob literal should have an even number of hex characters" -msgstr "" -"E973: Un littéral de Blob doit avoir un nombre pair de caractères " -"hexadécimaux" - -msgid "E110: Missing ')'" -msgstr "E110: ')' manquant" - msgid "E260: Missing name after ->" msgstr "E260: Nom manquant après ->" msgid "E695: Cannot index a Funcref" msgstr "E695: Impossible d'indexer une Funcref" -msgid "E909: Cannot index a special variable" -msgstr "E909: Impossible d'indexer une variable spéciale" - -# AB - La version française est meilleure que la version anglaise. -#, c-format -msgid "E112: Option name missing: %s" -msgstr "E112: Il manque un nom d'option après %s" - -#, c-format -msgid "E113: Unknown option: %s" -msgstr "E113: Option inconnue : %s" - -# AB - La version française est meilleure que la version anglaise, qui est -# erronée, d'ailleurs : il s'agit d'une "double quote" et non d'une -# "quote". -#, c-format -msgid "E114: Missing quote: %s" -msgstr "E114: Il manque \" à la fin de %s" - -# AB - La version française est meilleure que la version anglaise. -#, c-format -msgid "E115: Missing quote: %s" -msgstr "E115: Il manque ' à la fin de %s" - msgid "Not enough memory to set references, garbage collection aborted!" msgstr "" "Pas assez de mémoire pour les références, arrêt du ramassage de miètes !" @@ -840,66 +798,6 @@ msgid "E724: variable nested too deep for displaying" msgstr "E724: variable trop imbriquée pour être affichée" -msgid "E805: Using a Float as a Number" -msgstr "E805: Utilisation d'un Flottant comme un Nombre" - -msgid "E703: Using a Funcref as a Number" -msgstr "E703: Utilisation d'une Funcref comme un Nombre" - -msgid "E745: Using a List as a Number" -msgstr "E745: Utilisation d'une Liste comme un Nombre" - -msgid "E728: Using a Dictionary as a Number" -msgstr "E728: Utilisation d'un Dictionnaire comme un Nombre" - -msgid "E910: Using a Job as a Number" -msgstr "E910: Utilisation d'une Tâche comme un Nombre" - -msgid "E913: Using a Channel as a Number" -msgstr "E913: Utilisation d'un Canal comme un Nombre" - -msgid "E974: Using a Blob as a Number" -msgstr "E974: Utilisation d'un Blob comme un Nombre" - -msgid "E891: Using a Funcref as a Float" -msgstr "E891: Utilisation d'une Funcref comme un Flottant" - -msgid "E892: Using a String as a Float" -msgstr "E892: Utilisation d'une Chaîne comme un Flottant" - -msgid "E893: Using a List as a Float" -msgstr "E893: Utilisation d'une Liste comme un Flottant" - -msgid "E894: Using a Dictionary as a Float" -msgstr "E894: Utilisation d'un Dictionnaire comme un Flottant" - -msgid "E907: Using a special value as a Float" -msgstr "E907: Utilisation d'une valeur spéciale comme un Flottant" - -msgid "E911: Using a Job as a Float" -msgstr "E911: Utilisation d'une Tâche comme un Flottant" - -msgid "E914: Using a Channel as a Float" -msgstr "E914: Utilisation d'un Canal comme un Flottant" - -msgid "E975: Using a Blob as a Float" -msgstr "E975: Utilisation d'un Blob comme un Flottant" - -msgid "E729: using Funcref as a String" -msgstr "E729: Utilisation d'une Funcref comme une Chaîne" - -msgid "E730: using List as a String" -msgstr "E730: Utilisation d'une Liste comme une Chaîne" - -msgid "E731: using Dictionary as a String" -msgstr "E731: Utilisation d'un Dictionnaire comme une Chaîne" - -msgid "E976: using Blob as a String" -msgstr "E976: Utilisation d'un Blob comme une Chaîne" - -msgid "E908: using an invalid value as a String" -msgstr "E908: Utilisation d'une valeur invalide comme une Chaîne" - msgid "E698: variable nested too deep for making a copy" msgstr "E698: variable trop imbriquée pour en faire une copie" @@ -911,27 +809,6 @@ "\n" "\tModifié la dernière fois dans " -msgid " line " -msgstr " ligne " - -msgid "E977: Can only compare Blob with Blob" -msgstr "E977: Un Blob ne peut être comparé qu'avec un Blob" - -msgid "E691: Can only compare List with List" -msgstr "E691: Une Liste ne peut être comparée qu'avec une Liste" - -msgid "E692: Invalid operation for List" -msgstr "E692: Opération invalide avec les Liste" - -msgid "E735: Can only compare Dictionary with Dictionary" -msgstr "E735: Un Dictionnaire ne peut être comparé qu'avec un Dictionnaire" - -msgid "E736: Invalid operation for Dictionary" -msgstr "E736: Opération invalide avec les Dictionnaires" - -msgid "E694: Invalid operation for Funcrefs" -msgstr "E694: Opération invalide avec les Funcrefs" - msgid "E808: Number or Float required" msgstr "E808: Nombre ou Flottant requis" @@ -984,41 +861,14 @@ msgid "E727: Start past end" msgstr "E727: Début au-delà de la fin" -msgid "E240: No connection to the X server" -msgstr "E240: Pas de connexion au serveur X" - -# AB - La version française est meilleure que la version anglaise. -#, c-format -msgid "E241: Unable to send to %s" -msgstr "E241: L'envoi au serveur %s a échoué" - -msgid "E277: Unable to read a server reply" -msgstr "E277: Impossible de lire la réponse du serveur" - -msgid "E941: already started a server" -msgstr "E941: serveur déjà démarré" - -msgid "E942: +clientserver feature not available" -msgstr "E942: La fonctionnalité +clientserver n'est pas disponible" - -# AB - La version française est meilleure que la version anglaise. -msgid "E258: Unable to send to client" -msgstr "E258: La réponse n'a pas pu être envoyée au client" - #, c-format msgid "E962: Invalid action: '%s'" msgstr "E962: Action invalide : « %s »" -msgid "(Invalid)" -msgstr "(Invalide)" - #, c-format msgid "E935: invalid submatch number: %d" msgstr "E935: numéro de submatch invalide : %d" -msgid "E18: Unexpected characters in :let" -msgstr "E18: Caractères inattendus avant '='" - msgid "E991: cannot use =<< here" msgstr "E991: Impossible d'utiliser =<< ici" @@ -1032,8 +882,8 @@ msgid "E990: Missing end marker '%s'" msgstr "E990: Marqueur de fin manquant « %s »" -msgid "E985: .= is not supported with script version 2" -msgstr "E985: .= non supporté avec la version de script 2" +msgid "E985: .= is not supported with script version >= 2" +msgstr "E985: .= non supporté avec la version de script >= 2" # DB - todo : trouver mieux que "destinations". msgid "E687: Less targets than List items" @@ -1043,8 +893,8 @@ msgid "E688: More targets than List items" msgstr "E688: Plus de destinations que d'éléments dans la Liste" -msgid "Double ; in list of variables" -msgstr "Double ; dans une liste de variables" +msgid "E452: Double ; in list of variables" +msgstr "E452: Double ; dans une liste de variables" #, c-format msgid "E738: Can't list variables for %s" @@ -1053,9 +903,6 @@ msgid "E996: Cannot lock an environment variable" msgstr "E996: Impossible de verrouiller une variable d'environnement" -msgid "E996: Cannot lock an option" -msgstr "E996: Impossible de verrouiller une option" - msgid "E996: Cannot lock a register" msgstr "E996: Impossible de verrouiller un registre" @@ -1063,10 +910,6 @@ msgid "E108: No such variable: \"%s\"" msgstr "E108: Variable inexistante : %s" -#, c-format -msgid "E940: Cannot lock or unlock variable %s" -msgstr "E940: Impossible de (dé)verrouiller la variable %s" - msgid "E743: variable nested too deep for (un)lock" msgstr "E743: variable trop imbriquée pour la (dé)verrouiller" @@ -1290,51 +1133,6 @@ msgid "Pattern not found: %s" msgstr "Motif introuvable : %s" -# This message should *so* be E42! -msgid "E478: Don't panic!" -msgstr "E478: Pas de panique !" - -#, c-format -msgid "E661: Sorry, no '%s' help for %s" -msgstr "E661: Désolé, aucune aide en langue '%s' pour %s" - -#, c-format -msgid "E149: Sorry, no help for %s" -msgstr "E149: Désolé, aucune aide pour %s" - -#, c-format -msgid "Sorry, help file \"%s\" not found" -msgstr "Désolé, le fichier d'aide \"%s\" est introuvable" - -#, c-format -msgid "E151: No match: %s" -msgstr "E151: Aucune correspondance : %s" - -#, c-format -msgid "E152: Cannot open %s for writing" -msgstr "E152: Impossible d'ouvrir %s en écriture" - -#, c-format -msgid "E153: Unable to open %s for reading" -msgstr "E153: Impossible d'ouvrir %s en lecture" - -#, c-format -msgid "E670: Mix of help file encodings within a language: %s" -msgstr "E670: Encodages différents dans les fichiers d'aide en langue %s" - -# AB - L'étiquette la plus longue fait 27 caractères. Le nom de fichier le plus -# long fait 12 caractères. Il faudrait donc idéalement faire une -# traduction de 40 caractères ou moins. Ce qui est loin d'être le cas -# présent. -# DB - Suggestion. -#, c-format -msgid "E154: Duplicate tag \"%s\" in file %s/%s" -msgstr "E154: Marqueur \"%s\" dupliqué dans le fichier %s/%s" - -#, c-format -msgid "E150: Not a directory: %s" -msgstr "E150: %s n'est pas un répertoire" - msgid "No old files" msgstr "Aucun vieux fichier" @@ -1369,16 +1167,6 @@ msgid "W21: Required python version 3.x not supported, ignoring file: %s" msgstr "W21: Python 3.x non supporté, fichier %s ignoré" -# DB - Le premier %s est, au choix : "time ", "ctype " ou "messages ", -# sans qu'il soit possible de les traduire. -#, c-format -msgid "Current %slanguage: \"%s\"" -msgstr "Langue courante pour %s : \"%s\"" - -#, c-format -msgid "E197: Cannot set language to \"%s\"" -msgstr "E197: Impossible de choisir la langue \"%s\"" - msgid "Entering Ex mode. Type \"visual\" to go to Normal mode." msgstr "Mode Ex activé. Tapez \"visual\" pour passer en mode Normal." @@ -1420,15 +1208,16 @@ msgid "E494: Use w or w>>" msgstr "E494: Utilisez w ou w>>" -msgid "" -"INTERNAL: Cannot use EX_DFLALL with ADDR_NONE, ADDR_UNSIGNED or ADDR_QUICKFIX" -msgstr "" -"INTERNE: Impossible d'utiliser EX_DFLALL avec ADDR_NONE, ADDR_UNSIGNED ou ADDR_QUICKFIX" - msgid "E943: Command table needs to be updated, run 'make cmdidxs'" msgstr "" "E943: La table des commandes doit être mise à jour, lancez 'make cmdidxs'" +msgid "" +"INTERNAL: Cannot use EX_DFLALL with ADDR_NONE, ADDR_UNSIGNED or ADDR_QUICKFIX" +msgstr "" +"INTERNE: Impossible d'utiliser EX_DFLALL avec ADDR_NONE, ADDR_UNSIGNED ou " +"ADDR_QUICKFIX" + msgid "E319: Sorry, the command is not available in this version" msgstr "E319: Désolé, cette commande n'est pas disponible dans cette version" @@ -1616,15 +1405,6 @@ msgid "E579: :if nesting too deep" msgstr "E579: Imbrication de :if trop importante" -msgid "E580: :endif without :if" -msgstr "E580: :endif sans :if" - -msgid "E581: :else without :if" -msgstr "E581: :else sans :if" - -msgid "E582: :elseif without :if" -msgstr "E582: :elseif sans :if" - msgid "E583: multiple :else" msgstr "E583: Il ne peut y avoir qu'un seul :else" @@ -1634,35 +1414,23 @@ msgid "E585: :while/:for nesting too deep" msgstr "E585: Imbrication de :while ou :for trop importante" -msgid "E586: :continue without :while or :for" -msgstr "E586: :continue sans :while ou :for" - -msgid "E587: :break without :while or :for" -msgstr "E587: :break sans :while ou :for" - msgid "E732: Using :endfor with :while" msgstr "E732: Utilisation de :endfor avec :while" msgid "E733: Using :endwhile with :for" msgstr "E733: Utilisation de :endwhile avec :for" +msgid "E579: block nesting too deep" +msgstr "E579: Imbrication de bloc trop importante" + msgid "E601: :try nesting too deep" msgstr "E601: Imbrication de :try trop importante" -msgid "E603: :catch without :try" -msgstr "E603: :catch sans :try" - msgid "E604: :catch after :finally" msgstr "E604: :catch après :finally" -msgid "E606: :finally without :try" -msgstr "E606: :finally sans :try" - -msgid "E607: multiple :finally" -msgstr "E607: Il ne peut y avoir qu'un seul :finally" - -msgid "E602: :endtry without :try" -msgstr "E602: :endtry sans :try" +msgid "E193: :enddef not inside a function" +msgstr "E193: :enddef en dehors d'une fonction" msgid "E193: :endfunction not inside a function" msgstr "E193: :endfunction en dehors d'une fonction" @@ -1776,10 +1544,10 @@ msgstr[1] "%ld lignes, " #, c-format -msgid "%lld character" -msgid_plural "%lld characters" -msgstr[0] "%lld caractère" -msgstr[1] "%lld caractères" +msgid "%lld byte" +msgid_plural "%lld bytes" +msgstr[0] "%lld octet" +msgstr[1] "%lld octets" msgid "[noeol]" msgstr "[noeol]" @@ -1867,6 +1635,9 @@ msgid "E655: Too many symbolic links (cycle?)" msgstr "E655: Trop de liens symboliques (cycle ?)" +msgid "writefile() first argument must be a List or a Blob" +msgstr "le premier argument de writefile() doit être une Liste ou un Blob" + # DB : Les trois messages qui suivent sont des titres de boîtes # de dialogue par défaut. msgid "Select Directory dialog" @@ -1881,6 +1652,9 @@ msgid "E338: Sorry, no file browser in console mode" msgstr "E338: Désolé, pas de sélecteur de fichiers en mode console" +msgid "no matches" +msgstr "aucune correspondance" + msgid "E854: path too long for completion" msgstr "E854: chemin trop long pour complètement" @@ -1968,10 +1742,6 @@ msgid "E599: Value of 'imactivatekey' is invalid" msgstr "E599: Valeur de 'imactivatekey' invalide" -#, c-format -msgid "E254: Cannot allocate color %s" -msgstr "E254: Impossible d'allouer la couleur %s" - msgid "No match at cursor, finding next" msgstr "Aucune correspondance sous le curseur, recherche de la suivante" @@ -2006,15 +1776,15 @@ msgid "E232: Cannot create BalloonEval with both message and callback" msgstr "E232: Impossible de créer un BalloonEval avec message ET callback" -msgid "_Cancel" -msgstr "_Annuler" - msgid "_Save" msgstr "_Enregistrer" msgid "_Open" msgstr "_Ouvrir" +msgid "_Cancel" +msgstr "_Annuler" + msgid "_OK" msgstr "_Ok" @@ -2159,7 +1929,9 @@ msgstr "E243: Argument non supporté : \"-%s\" ; Utilisez la version OLE." msgid "E988: GUI cannot be used. Cannot execute gvim.exe." -msgstr "E988: L'interface graphique ne peut pas être utilisée. Impossible d'exécuter gvim.exe." +msgstr "" +"E988: L'interface graphique ne peut pas être utilisée. Impossible d'exécuter " +"gvim.exe." msgid "E672: Unable to open window inside MDI application" msgstr "E672: Impossible d'ouvrir une fenêtre dans une application MDI" @@ -2207,6 +1979,27 @@ msgid "Font%d width: %d" msgstr "Largeur de Font%d : %d" +msgid "E284: Cannot set IC values" +msgstr "E284: Impossible de régler les valeurs IC" + +msgid "E285: Failed to create input context" +msgstr "E285: Échec de la création du contexte de saisie" + +msgid "E286: Failed to open input method" +msgstr "E286: Échec de l'ouverture de la méthode de saisie" + +msgid "E287: Warning: Could not set destroy callback to IM" +msgstr "" +"E287: Alerte : Impossible d'inscrire le callback de destruction dans la MS" + +msgid "E288: input method doesn't support any style" +msgstr "E288: la méthode de saisie ne supporte aucun style" + +msgid "E289: input method doesn't support my preedit type" +msgstr "" +"E289: le type de préédition de Vim n'est pas supporté par la méthode de " +"saisie" + # DB - todo : Pas certain de mon coup, ici... msgid "Invalid font specification" msgstr "La spécification de la police est invalide" @@ -2336,6 +2129,51 @@ msgid "Print job sent." msgstr "Tâche d'impression envoyée." +# This message should *so* be E42! +msgid "E478: Don't panic!" +msgstr "E478: Pas de panique !" + +#, c-format +msgid "E661: Sorry, no '%s' help for %s" +msgstr "E661: Désolé, aucune aide en langue '%s' pour %s" + +#, c-format +msgid "E149: Sorry, no help for %s" +msgstr "E149: Désolé, aucune aide pour %s" + +#, c-format +msgid "Sorry, help file \"%s\" not found" +msgstr "Désolé, le fichier d'aide \"%s\" est introuvable" + +#, c-format +msgid "E151: No match: %s" +msgstr "E151: Aucune correspondance : %s" + +#, c-format +msgid "E152: Cannot open %s for writing" +msgstr "E152: Impossible d'ouvrir %s en écriture" + +#, c-format +msgid "E153: Unable to open %s for reading" +msgstr "E153: Impossible d'ouvrir %s en lecture" + +#, c-format +msgid "E670: Mix of help file encodings within a language: %s" +msgstr "E670: Encodages différents dans les fichiers d'aide en langue %s" + +# AB - L'étiquette la plus longue fait 27 caractères. Le nom de fichier le plus +# long fait 12 caractères. Il faudrait donc idéalement faire une +# traduction de 40 caractères ou moins. Ce qui est loin d'être le cas +# présent. +# DB - Suggestion. +#, c-format +msgid "E154: Duplicate tag \"%s\" in file %s/%s" +msgstr "E154: Marqueur \"%s\" dupliqué dans le fichier %s/%s" + +#, c-format +msgid "E150: Not a directory: %s" +msgstr "E150: %s n'est pas un répertoire" + msgid "E679: recursive loop loading syncolor.vim" msgstr "E679: boucle récursive lors du chargement de syncolor.vim" @@ -2376,6 +2214,9 @@ msgid "E420: BG color unknown" msgstr "E420: Couleur d'arrière-plan inconnue" +msgid "E453: UL color unknown" +msgstr "E453: Couleur d'UL inconnue" + #, c-format msgid "E421: Color name or number not recognized: %s" msgstr "E421: Nom ou numéro de couleur non reconnu : %s" @@ -2401,29 +2242,6 @@ msgid "E849: Too many highlight and syntax groups" msgstr "E849: Trop de groupes de surbrillance et de syntaxe" -#, c-format -msgid "E799: Invalid ID: %d (must be greater than or equal to 1)" -msgstr "E799: ID invalide : %d (doit être plus grand ou égal à 1)" - -#, c-format -msgid "E801: ID already taken: %d" -msgstr "E801: ID déjà pris : %d" - -msgid "E290: List or number required" -msgstr "E290: Liste ou nombre requis" - -#, c-format -msgid "E802: Invalid ID: %d (must be greater than or equal to 1)" -msgstr "E802: ID invalide : %d (doit être plus grand ou égal à 1)" - -#, c-format -msgid "E803: ID not found: %d" -msgstr "E803: ID introuvable : %d" - -#, c-format -msgid "E798: ID is reserved for \":match\": %d" -msgstr "E798: ID est réservé pour \":match\" : %d" - msgid "Add a new database" msgstr "Ajouter une base de données" @@ -2939,6 +2757,23 @@ msgid "match %d" msgstr "Correspondance %d" +msgid "E920: _io file requires _name to be set" +msgstr "E920: fichier _io nécessite _name" + +msgid "E915: in_io buffer requires in_buf or in_name to be set" +msgstr "E915: tampon in_io nécessite in_buf ou in_name " + +#, c-format +msgid "E918: buffer must be loaded: %s" +msgstr "E918: le tampon doit être chargé : %s" + +msgid "E916: not a valid job" +msgstr "E916: tâche invalide" + +#, c-format +msgid "E491: json decode error at '%s'" +msgstr "E491: Erreur de décodage json près de '%s'" + #, c-format msgid "E938: Duplicate key in JSON: \"%s\"" msgstr "E938: Clé dupliquée dans le document JSON : \"%s\"" @@ -2947,14 +2782,16 @@ msgid "E899: Argument of %s must be a List or Blob" msgstr "E899: L'argument de %s doit être une Liste ou un Blob" +msgid "E900: maxdepth must be non-negative number" +msgstr "E900: maxdepth doit être un nombre positif" + +msgid "flatten() argument" +msgstr "argument de flatten()" + #, c-format msgid "E696: Missing comma in List: %s" msgstr "E696: Il manque une virgule dans la Liste %s" -#, c-format -msgid "E697: Missing end of List ']': %s" -msgstr "E697: Il manque ']' à la fin de la Liste %s" - msgid "sort() argument" msgstr "argument de sort()" @@ -2970,6 +2807,9 @@ msgid "map() argument" msgstr "argument de map()" +msgid "mapnew() argument" +msgstr "argument de mapnew()" + msgid "filter() argument" msgstr "argument de filter()" @@ -2985,6 +2825,16 @@ msgid "reverse() argument" msgstr "argument de reverse()" +# DB - Le premier %s est, au choix : "time ", "ctype " ou "messages ", +# sans qu'il soit possible de les traduire. +#, c-format +msgid "Current %slanguage: \"%s\"" +msgstr "Langue courante pour %s : \"%s\"" + +#, c-format +msgid "E197: Cannot set language to \"%s\"" +msgstr "E197: Impossible de choisir la langue \"%s\"" + msgid "Unknown option argument" msgstr "Option inconnue" @@ -3405,25 +3255,6 @@ msgid "--windowid \tOpen Vim inside another win32 widget" msgstr "--windowid \tOuvrir Vim dans un autre widget win32" -msgid "No display" -msgstr "Aucun display" - -msgid ": Send failed.\n" -msgstr " : L'envoi a échoué.\n" - -msgid ": Send failed. Trying to execute locally\n" -msgstr " : L'envoi a échoué. Tentative d'exécution locale\n" - -#, c-format -msgid "%d of %d edited" -msgstr "%d édités sur %d" - -msgid "No display: Send expression failed.\n" -msgstr "Aucun display : L'envoi de l'expression a échoué.\n" - -msgid ": Send expression failed.\n" -msgstr " : L'envoi de l'expression a échoué.\n" - #, c-format msgid "E224: global abbreviation already exists for %s" msgstr "E224: une abréviation globale existe déjà pour %s" @@ -3449,6 +3280,9 @@ msgid "E228: makemap: Illegal mode" msgstr "E228: makemap : mode invalide" +msgid "E460: entries missing in mapset() dict argument" +msgstr "E460: entrées manquantes dans l'argument dict de mapset()" + #, c-format msgid "E357: 'langmap': Matching character missing for %s" msgstr "E357: 'langmap' : Aucun caractère correspondant pour %s" @@ -3485,29 +3319,31 @@ "\n" "modif ligne col fichier/texte" -msgid "E543: Not a valid codepage" -msgstr "E543: Page de codes non valide" +#, c-format +msgid "E799: Invalid ID: %d (must be greater than or equal to 1)" +msgstr "E799: ID invalide : %d (doit être plus grand ou égal à 1)" -msgid "E284: Cannot set IC values" -msgstr "E284: Impossible de régler les valeurs IC" +#, c-format +msgid "E801: ID already taken: %d" +msgstr "E801: ID déjà pris : %d" -msgid "E285: Failed to create input context" -msgstr "E285: Échec de la création du contexte de saisie" +msgid "E290: List or number required" +msgstr "E290: Liste ou nombre requis" -msgid "E286: Failed to open input method" -msgstr "E286: Échec de l'ouverture de la méthode de saisie" +#, c-format +msgid "E802: Invalid ID: %d (must be greater than or equal to 1)" +msgstr "E802: ID invalide : %d (doit être plus grand ou égal à 1)" -msgid "E287: Warning: Could not set destroy callback to IM" -msgstr "" -"E287: Alerte : Impossible d'inscrire le callback de destruction dans la MS" +#, c-format +msgid "E803: ID not found: %d" +msgstr "E803: ID introuvable : %d" -msgid "E288: input method doesn't support any style" -msgstr "E288: la méthode de saisie ne supporte aucun style" +#, c-format +msgid "E798: ID is reserved for \":match\": %d" +msgstr "E798: ID est réservé pour \":match\" : %d" -msgid "E289: input method doesn't support my preedit type" -msgstr "" -"E289: le type de préédition de Vim n'est pas supporté par la méthode de " -"saisie" +msgid "E543: Not a valid codepage" +msgstr "E543: Page de codes non valide" msgid "E293: block was not locked" msgstr "E293: le bloc n'était pas verrouillé" @@ -3715,12 +3551,17 @@ msgid "" "\n" -"You may want to delete the .swp file now.\n" -"\n" +"You may want to delete the .swp file now." msgstr "" "\n" -"Il est conseillé d'effacer maintenant le fichier .swp.\n" +"Il est conseillé d'effacer maintenant le fichier .swp." + +msgid "" +"\n" +"Note: process STILL RUNNING: " +msgstr "" "\n" +"Note : processus EN COURS D'EXECUTION : " msgid "Using crypt key from swap file for the text file.\n" msgstr "" @@ -3742,9 +3583,6 @@ msgid " -- none --\n" msgstr " -- aucun --\n" -msgid "%a %b %d %H:%M:%S %Y" -msgstr "%a %b %d %H:%M:%S %Y" - msgid " owned by: " msgstr " propriété de : " @@ -4030,6 +3868,10 @@ msgstr "E337: Menu introuvable - vérifiez les noms des menus" #, c-format +msgid "Error detected while compiling %s:" +msgstr "Erreur détectée lors de la compilation %s" + +#, c-format msgid "Error detected while processing %s:" msgstr "Erreur détectée en traitant %s :" @@ -4094,11 +3936,12 @@ msgid "E767: Too many arguments to printf()" msgstr "E767: Trop d'arguments pour printf()" -msgid "Type number and or click with mouse (empty cancels): " -msgstr "Tapez un nombre et ou cliquez avec la souris (rien annule) :" +msgid "Type number and or click with the mouse (q or empty cancels): " +msgstr "" +"Tapez un nombre et ou cliquez avec la souris (q ou rien annule) :" -msgid "Type number and (empty cancels): " -msgstr "Tapez un nombre et (rien annule) :" +msgid "Type number and (q or empty cancels): " +msgstr "Tapez un nombre et (q ou rien annule) :" #, c-format msgid "%ld more line" @@ -4121,12 +3964,6 @@ msgid "E677: Error writing temp file" msgstr "E677: Erreur lors de l'écriture du fichier temporaire" -#, c-format -msgid "%ld second ago" -msgid_plural "%ld seconds ago" -msgstr[0] "il y a %ld seconde" -msgstr[1] "il y a %ld secondes" - msgid "ERROR: " msgstr "ERREUR : " @@ -4245,6 +4082,12 @@ msgstr[1] "%ld lignes modifiées" #, c-format +msgid "%d line changed" +msgid_plural "%d lines changed" +msgstr[0] "%d ligne modifiée" +msgstr[1] "%d lignes modifiées" + +#, c-format msgid "%ld Cols; " msgstr "%ld Colonnes ; " @@ -4295,7 +4138,8 @@ msgstr "E520: Non autorisé dans une ligne de mode" msgid "E992: Not allowed in a modeline when 'modelineexpr' is off" -msgstr "E992: Non autorisé dans une ligne de mode avec 'modelineexpr' désélectionnée" +msgstr "" +"E992: Non autorisé dans une ligne de mode avec 'modelineexpr' désélectionnée" msgid "E846: Key code not set" msgstr "E846: Le code de touche n'est pas configuré" @@ -4380,7 +4224,6 @@ msgid "E540: Unclosed expression sequence" msgstr "E540: '}' manquant" - msgid "E542: unbalanced groups" msgstr "E542: parenthèses non équilibrées" @@ -4426,7 +4269,8 @@ msgstr "E528: Une valeur ' doit être spécifiée" msgid "E595: 'showbreak' contains unprintable or wide character" -msgstr "E595: 'showbreak' contient des caractères à largeur double ou non imprimables" +msgstr "" +"E595: 'showbreak' contient des caractères à largeur double ou non imprimables" msgid "E596: Invalid font(s)" msgstr "E596: Police(s) invalide(s)" @@ -4681,8 +4525,11 @@ msgid "shell returned %d" msgstr "le shell a retourné %d" -msgid "E278: Cannot put a terminal buffer in a popup window" -msgstr "E278: Impossible de mettre un tampon de terminal dans une fenêtre contextuelle" +msgid "E861: Cannot open a second popup with a terminal" +msgstr "E861: Impossible d'ouvrir une seconde fenêtre contextuelle avec un terminal" + +msgid "E450: buffer number, text or a list required" +msgstr "E450: numéro de tampon, texte ou une liste requis" #, c-format msgid "E997: Tabpage not found: %d" @@ -4695,16 +4542,21 @@ msgid "E994: Not allowed in a popup window" msgstr "E994: Opération interdite dans une fenêtre contextuelle" +msgid "E863: Not allowed for a terminal in a popup window" +msgstr "E863: Opération interdite pour un terminal dans une fenêtre contextuelle" + msgid "E750: First use \":profile start {fname}\"" msgstr "E750: Utilisez d'abord \":profile start {nomfichier}\"" msgid "E553: No more items" msgstr "E553: Plus d'éléments" +msgid "E925: Current quickfix list was changed" +msgstr "E925: La liste quickfix courante a changé" + msgid "E926: Current location list was changed" msgstr "E926: La liste d'emplacements courante a changé" -#, c-format msgid "E372: Too many %%%c in format string" msgstr "E372: Trop de %%%c dans la chaîne de format" @@ -4736,9 +4588,6 @@ msgid "E924: Current window was closed" msgstr "E924: La fenêtre courante doit être fermée" -msgid "E925: Current quickfix was changed" -msgstr "E925: Le quickfix courant a changé" - #, c-format msgid "(%d of %d)%s%s: " msgstr "(%d sur %d)%s%s : " @@ -4769,6 +4618,9 @@ msgid "Cannot open file \"%s\"" msgstr "Impossible d'ouvrir le fichier \"%s\"" +msgid "cannot have both a list and a \"what\" argument" +msgstr "impossible d'avoir une liste et un argument \"what\" en même temps" + msgid "E681: Buffer is not loaded" msgstr "E681: le tampon n'est pas chargé" @@ -4823,6 +4675,10 @@ msgstr "E956: Impossible d'utiliser le motif récursivement" #, c-format +msgid "E654: missing delimiter after search pattern: %s" +msgstr "E654: il manque un délimiteur après le motif de recherche : %s" + +#, c-format msgid "E554: Syntax error in %s{...}" msgstr "E554: Erreur de syntaxe dans %s{...}" @@ -4904,13 +4760,13 @@ msgid "E877: (NFA regexp) Invalid character class: %d" msgstr "E877: (regexp NFA) Classe de caractère invalide : %d" +msgid "E951: \\% value too large" +msgstr "E951: valeur \\% trop grande" + #, c-format msgid "E867: (NFA) Unknown operator '\\z%c'" msgstr "E867: (NFA) Opérateur inconnu '\\z%c'" -msgid "E951: \\% value too large" -msgstr "E951: valeur \\% trop grande" - #, c-format msgid "E867: (NFA) Unknown operator '\\%%%c'" msgstr "E867: (NFA) Opérateur inconnu '\\%%%c'" @@ -5259,9 +5115,6 @@ msgid " (not supported)" msgstr " (non supporté)" -msgid "E756: Spell checking is not enabled" -msgstr "E756: La vérification orthographique n'est pas activée" - #, c-format msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\"" msgstr "Alerte : Liste de mots \"%s_%s.spl\" ou \"%s_ascii.spl\" introuvable" @@ -5509,32 +5362,36 @@ msgstr "Lecture de la liste de mots %s..." #, c-format -msgid "Duplicate /encoding= line ignored in %s line %d: %s" -msgstr "Ligne /encoding= en double ignorée dans %s ligne %d : %s" +msgid "Conversion failure for word in %s line %ld: %s" +msgstr "Échec de conversion du mot dans %s ligne %ld : %s" + +#, c-format +msgid "Duplicate /encoding= line ignored in %s line %ld: %s" +msgstr "Ligne /encoding= en double ignorée dans %s ligne %ld : %s" #, c-format -msgid "/encoding= line after word ignored in %s line %d: %s" -msgstr "Ligne /encoding= après des mots ignorée dans %s ligne %d : %s" +msgid "/encoding= line after word ignored in %s line %ld: %s" +msgstr "Ligne /encoding= après des mots ignorée dans %s ligne %ld : %s" #, c-format -msgid "Duplicate /regions= line ignored in %s line %d: %s" -msgstr "Ligne /regions= en double ignorée dans %s ligne %d : %s" +msgid "Duplicate /regions= line ignored in %s line %ld: %s" +msgstr "Ligne /regions= en double ignorée dans %s ligne %ld : %s" #, c-format -msgid "Too many regions in %s line %d: %s" -msgstr "Trop de régions dans %s ligne %d : %s" +msgid "Too many regions in %s line %ld: %s" +msgstr "Trop de régions dans %s ligne %ld : %s" #, c-format -msgid "/ line ignored in %s line %d: %s" -msgstr "Ligne / ignorée dans %s ligne %d : %s" +msgid "/ line ignored in %s line %ld: %s" +msgstr "Ligne / ignorée dans %s ligne %ld : %s" #, c-format -msgid "Invalid region nr in %s line %d: %s" -msgstr "Numéro de région invalide dans %s ligne %d : %s" +msgid "Invalid region nr in %s line %ld: %s" +msgstr "Numéro de région invalide dans %s ligne %ld : %s" #, c-format -msgid "Unrecognized flags in %s line %d: %s" -msgstr "Drapeaux non reconnus dans %s ligne %d : %s" +msgid "Unrecognized flags in %s line %ld: %s" +msgstr "Drapeaux non reconnus dans %s ligne %ld : %s" #, c-format msgid "Ignored %d words with non-ASCII characters" @@ -5544,8 +5401,8 @@ msgstr "E845: mémoire insuffisante, liste de mots peut-être incomplète" #, c-format -msgid "Compressed %d of %d nodes; %d (%d%%) remaining" -msgstr "%d noeuds compressés sur %d ; %d (%d%%) restants " +msgid "Compressed %s: %ld of %ld nodes; %ld (%ld%%) remaining" +msgstr "Compressé %s : %ld/%ld noeuds ; %ld (%ld%%) restants" msgid "Reading back spell file..." msgstr "Relecture du fichier orthographique" @@ -5626,6 +5483,10 @@ msgid " < \"%.*s\"" msgstr " < \"%.*s\"" +#, c-format +msgid "E390: Illegal argument: %s" +msgstr "E390: Argument invalide : %s" + msgid "No Syntax items defined for this buffer" msgstr "Aucun élément de syntaxe défini pour ce tampon" @@ -5638,22 +5499,12 @@ msgid "syntax conceal off" msgstr "\"syntax conceal\" désactivée" -#, c-format -msgid "E390: Illegal argument: %s" -msgstr "E390: Argument invalide : %s" - msgid "syntax case ignore" msgstr "syntaxe ignore la casse" msgid "syntax case match" msgstr "syntaxe respecte la casse" -msgid "syntax spell toplevel" -msgstr "contrôle orthographique dans le texte sans groupe syntaxique" - -msgid "syntax spell notoplevel" -msgstr "pas de contrôle orthographique dans le texte sans groupe syntaxique" - msgid "syntax spell default" msgstr "" "contrôle orthographique dans le texte sans groupe syntaxique, sauf si @Spell/" @@ -5675,9 +5526,11 @@ msgid "no syncing" msgstr "Aucune synchronisation" -# DB - Les deux messages qui suivent vont ensemble. +msgid "syncing starts at the first line" +msgstr "la synchronisation débute à la première ligne" + msgid "syncing starts " -msgstr "La synchronisation débute " +msgstr "la synchronisation débute " msgid " lines before top line" msgstr " lignes avant la ligne du haut" @@ -5707,6 +5560,9 @@ msgid "E392: No such syntax cluster: %s" msgstr "E392: Aucune grappe de syntaxe %s" +msgid "from the first line" +msgstr "à partir de la première ligne" + msgid "minimal " msgstr "minimum " @@ -5987,7 +5843,8 @@ msgstr "E965: nom du type de propriété absent" msgid "E275: Cannot add text property to unloaded buffer" -msgstr "E275: Impossible d'ajouter des propriétés de texte à un tampon déchargé" +msgstr "" +"E275: Impossible d'ajouter des propriétés de texte à un tampon déchargé" msgid "E967: text property info corrupted" msgstr "E967: information de propriété de texte corrompu" @@ -5995,6 +5852,9 @@ msgid "E968: Need at least one of 'id' or 'type'" msgstr "E968: Au moins « id » ou « type » sont nécessaires" +msgid "E860: Need 'id' and 'type' with 'both'" +msgstr "E860: 'id' et 'type' requis avec 'both'" + #, c-format msgid "E969: Property type %s already defined" msgstr "E969: Type de propriété %s déjà défini" @@ -6003,16 +5863,127 @@ msgid "E970: Unknown highlight group name: '%s'" msgstr "E970: Nom de groupe de surbrillance inconnu : « %s »" +msgid "(Invalid)" +msgstr "(Invalide)" + +msgid "%a %b %d %H:%M:%S %Y" +msgstr "%a %b %d %H:%M:%S %Y" + +#, c-format +msgid "%ld second ago" +msgid_plural "%ld seconds ago" +msgstr[0] "il y a %ld seconde" +msgstr[1] "il y a %ld secondes" + +msgid "E805: Using a Float as a Number" +msgstr "E805: Utilisation d'un Flottant comme un Nombre" + +msgid "E703: Using a Funcref as a Number" +msgstr "E703: Utilisation d'une Funcref comme un Nombre" + +msgid "E745: Using a List as a Number" +msgstr "E745: Utilisation d'une Liste comme un Nombre" + +msgid "E728: Using a Dictionary as a Number" +msgstr "E728: Utilisation d'un Dictionnaire comme un Nombre" + +msgid "E611: Using a Special as a Number" +msgstr "E611: Utilisation d'une valeur Spéciale comme Nombre" + +msgid "E910: Using a Job as a Number" +msgstr "E910: Utilisation d'une Tâche comme un Nombre" + +msgid "E913: Using a Channel as a Number" +msgstr "E913: Utilisation d'un Canal comme un Nombre" + +msgid "E974: Using a Blob as a Number" +msgstr "E974: Utilisation d'un Blob comme un Nombre" + +msgid "E891: Using a Funcref as a Float" +msgstr "E891: Utilisation d'une Funcref comme un Flottant" + +msgid "E892: Using a String as a Float" +msgstr "E892: Utilisation d'une Chaîne comme un Flottant" + +msgid "E893: Using a List as a Float" +msgstr "E893: Utilisation d'une Liste comme un Flottant" + +msgid "E894: Using a Dictionary as a Float" +msgstr "E894: Utilisation d'un Dictionnaire comme un Flottant" + +msgid "E362: Using a boolean value as a Float" +msgstr "E362: Utilisation d'une valeur Booléenne comme un Flottant" + +msgid "E907: Using a special value as a Float" +msgstr "E907: Utilisation d'une valeur spéciale comme un Flottant" + +msgid "E911: Using a Job as a Float" +msgstr "E911: Utilisation d'une Tâche comme un Flottant" + +msgid "E914: Using a Channel as a Float" +msgstr "E914: Utilisation d'un Canal comme un Flottant" + +msgid "E975: Using a Blob as a Float" +msgstr "E975: Utilisation d'un Blob comme un Flottant" + +msgid "E729: using Funcref as a String" +msgstr "E729: Utilisation d'une Funcref comme une Chaîne" + +msgid "E730: using List as a String" +msgstr "E730: Utilisation d'une Liste comme une Chaîne" + +msgid "E731: using Dictionary as a String" +msgstr "E731: Utilisation d'un Dictionnaire comme une Chaîne" + +msgid "E976: using Blob as a String" +msgstr "E976: Utilisation d'un Blob comme une Chaîne" + +msgid "E977: Can only compare Blob with Blob" +msgstr "E977: Un Blob ne peut être comparé qu'avec un Blob" + +msgid "E691: Can only compare List with List" +msgstr "E691: Une Liste ne peut être comparée qu'avec une Liste" + +msgid "E692: Invalid operation for List" +msgstr "E692: Opération invalide avec les Liste" + +msgid "E735: Can only compare Dictionary with Dictionary" +msgstr "E735: Un Dictionnaire ne peut être comparé qu'avec un Dictionnaire" + +msgid "E736: Invalid operation for Dictionary" +msgstr "E736: Opération invalide avec les Dictionnaires" + +msgid "E694: Invalid operation for Funcrefs" +msgstr "E694: Opération invalide avec les Funcrefs" + +# AB - La version française est meilleure que la version anglaise. +#, c-format +msgid "E112: Option name missing: %s" +msgstr "E112: Il manque un nom d'option après %s" + +msgid "E973: Blob literal should have an even number of hex characters" +msgstr "" +"E973: Un littéral de Blob doit avoir un nombre pair de caractères " +"hexadécimaux" + +# AB - La version française est meilleure que la version anglaise, qui est +# erronée, d'ailleurs : il s'agit d'une "double quote" et non d'une +# "quote". +#, c-format +msgid "E114: Missing quote: %s" +msgstr "E114: Il manque \" à la fin de %s" + +# AB - La version française est meilleure que la version anglaise. +#, c-format +msgid "E115: Missing quote: %s" +msgstr "E115: Il manque ' à la fin de %s" + msgid "new shell started\n" msgstr "nouveau shell démarré\n" msgid "Vim: Error reading input, exiting...\n" msgstr "Vim : Erreur lors de la lecture de l'entrée, sortie...\n" -# DB - Message de débogage. -msgid "Used CUT_BUFFER0 instead of empty selection" -msgstr "CUT_BUFFER0 utilisé plutôt qu'une sélection vide" - msgid "E881: Line count changed unexpectedly" msgstr "E881: Le nombre de lignes a été changé inopinément" @@ -6233,7 +6204,13 @@ msgstr "E853: Nom d'argument dupliqué : %s" msgid "E989: Non-default argument follows default argument" -msgstr "E989: Argument sans valeur par défaut ne peut pas suivre un argument avec valeur par défaut" +msgstr "" +"E989: Argument sans valeur par défaut ne peut pas suivre un argument avec " +"valeur par défaut" + +#, c-format +msgid "E451: Expected }: %s" +msgstr "E451: signe } attendu : %s" #, c-format msgid "E740: Too many arguments for function %s" @@ -6273,22 +6250,10 @@ msgstr "E699: Trop d'arguments" #, c-format -msgid "E117: Unknown function: %s" -msgstr "E117: Fonction inconnue : %s" - -#, c-format msgid "E276: Cannot use function as a method: %s" msgstr "E276: Impossible d'utiliser une fonction comme méthode : %s" #, c-format -msgid "E933: Function was deleted: %s" -msgstr "E933: La fonction a été effacée : %s" - -#, c-format -msgid "E119: Not enough arguments for function: %s" -msgstr "E119: La fonction %s n'a pas reçu assez d'arguments" - -#, c-format msgid "E120: Using not in a script context: %s" msgstr "E120: utilisé en dehors d'un script : %s" @@ -6310,6 +6275,9 @@ "E884: Le nom de la fonction ne peut pas contenir le caractère deux-points : " "%s" +msgid "E454: function list was modified" +msgstr "E454: la liste de fonctions a été modifiée" + #, c-format msgid "E123: Undefined function: %s" msgstr "E123: Fonction non définie : %s" @@ -6333,6 +6301,10 @@ msgstr "E126: Il manque :endfunction" #, c-format +msgid "W1001: Text found after :enddef: %s" +msgstr "W1001: Texte trouvé après :enddef : %s" + +#, c-format msgid "W22: Text found after :endfunction: %s" msgstr "W22: Texte trouvé après :endfunction : %s" @@ -6513,18 +6485,15 @@ msgid "with X11-Athena GUI." msgstr "avec interface graphique X11-Athena." +msgid "with Haiku GUI." +msgstr "avec interface graphique Haiku." + msgid "with Photon GUI." msgstr "avec interface graphique Photon." msgid "with GUI." msgstr "avec une interface graphique." -msgid "with Carbon GUI." -msgstr "avec interface graphique Carbon." - -msgid "with Cocoa GUI." -msgstr "avec interface graphique Cocoa." - msgid " Features included (+) or not (-):\n" msgstr " Fonctionnalités incluses (+) ou non (-) :\n" @@ -6535,16 +6504,16 @@ msgstr " fichier vimrc utilisateur : \"" msgid " 2nd user vimrc file: \"" -msgstr " 2me fichier vimrc utilisateur : \"" +msgstr " 2e fichier vimrc utilisateur : \"" msgid " 3rd user vimrc file: \"" -msgstr " 3me fichier vimrc utilisateur : \"" +msgstr " 3e fichier vimrc utilisateur : \"" msgid " user exrc file: \"" msgstr " fichier exrc utilisateur : \"" msgid " 2nd user exrc file: \"" -msgstr " 2me fichier exrc utilisateur : \"" +msgstr " 2e fichier exrc utilisateur : \"" msgid " system gvimrc file: \"" msgstr " fichier gvimrc système : \"" @@ -6553,10 +6522,10 @@ msgstr " fichier gvimrc utilisateur : \"" msgid "2nd user gvimrc file: \"" -msgstr "2me fichier gvimrc utilisateur : \"" +msgstr " 2e fichier gvimrc utilisateur : \"" msgid "3rd user gvimrc file: \"" -msgstr "3me fichier gvimrc utilisateur : \"" +msgstr " 3e fichier gvimrc utilisateur : \"" msgid " defaults file: \"" msgstr " fichier de valeurs par défaut : \"" @@ -6657,6 +6626,21 @@ msgid "menu Help->Sponsor/Register for information " msgstr "menu Aide->Sponsor/Enregistrement pour plus d'info" +msgid "[end of lines]" +msgstr "[fin des lignes]" + +msgid "global" +msgstr "global" + +msgid "buffer" +msgstr "tampon" + +msgid "window" +msgstr "fenêtre" + +msgid "tab" +msgstr "onglet" + msgid "" "\n" "# Buffer list:\n" @@ -6807,8 +6791,8 @@ # DB - ... dont les valeurs possibles sont les messages # qui suivent. #, c-format -msgid "Reading viminfo file \"%s\"%s%s%s" -msgstr "Lecture du fichier viminfo \"%s\"%s%s%s" +msgid "Reading viminfo file \"%s\"%s%s%s%s" +msgstr "Lecture du fichier viminfo \"%s\"%s%s%s%s" # AB - Ce texte fait partie d'un message de débogage. # DB - Voir ci-dessus. @@ -6883,9 +6867,6 @@ msgid "E444: Cannot close last window" msgstr "E444: Impossible de fermer la dernière fenêtre" -msgid "E813: Cannot close autocmd or popup window" -msgstr "E813: Impossible de fermer la fenêtre des autocommandes ou contextuelle" - msgid "E814: Cannot close window, only autocmd window would remain" msgstr "" "E814: Impossible de fermer la fenêtre, seule la fenêtre des autocommandes " @@ -6894,6 +6875,9 @@ msgid "E445: Other window contains changes" msgstr "E445: Les modifications de l'autre fenêtre n'ont pas été enregistrées" +msgid "E366: Not allowed to enter a popup window" +msgstr "E366: Interdit d'entrer dans une fenêtre contextuelle" + #, c-format msgid "E370: Could not load library %s" msgstr "E370: Impossible de charger la bibliothèque %s" @@ -6938,37 +6922,398 @@ msgid "Path length too long!" msgstr "Le chemin est trop long !" -# msgstr "--Pas de lignes dans le tampon--" -# DB - todo : ou encore : msgstr "--Aucune ligne dans le tampon--" -msgid "--No lines in buffer--" -msgstr "--Le tampon est vide--" +#, c-format +msgid "E121: Undefined variable: %s" +msgstr "E121: Variable non définie : %s" -msgid "E470: Command aborted" -msgstr "E470: Commande annulée" +#, c-format +msgid "E121: Undefined variable: %c:%s" +msgstr "E121: Variable non définie : %c:%s" -msgid "E471: Argument required" -msgstr "E471: Argument requis" +msgid "E476: Invalid command" +msgstr "E476: Commande invalide" -msgid "E10: \\ should be followed by /, ? or &" -msgstr "E10: \\ devrait être suivi de /, ? ou &" +#, c-format +msgid "E476: Invalid command: %s" +msgstr "E476: Commande invalide : %s" -msgid "E11: Invalid in command-line window; executes, CTRL-C quits" -msgstr "" -"E11: Invalide dans la fenêtre ligne-de-commande ; exécute, CTRL-C quitte" +msgid "E710: List value has more items than targets" +msgstr "E710: La Liste a plus d'éléments que la destination" -msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search" -msgstr "" -"E12: commande non autorisée depuis un exrc/vimrc dans répertoire courant ou " -"une recherche de marqueur" +msgid "E711: List value does not have enough items" +msgstr "E711: La Liste n'a pas assez d'éléments" -msgid "E171: Missing :endif" -msgstr "E171: :endif manquant" +msgid "E719: Cannot slice a Dictionary" +msgstr "E719: Utilisation de [:] impossible avec un Dictionnaire" -msgid "E600: Missing :endtry" -msgstr "E600: :endtry manquant" +msgid "" +"E856: \"assert_fails()\" second argument must be a string or a list with one " +"or two strings" +msgstr "E856: le second argument d'\"assert_fails()\" doit être une chaîne ou une liste avec une ou deux chaînes" -msgid "E170: Missing :endwhile" -msgstr "E170: :endwhile manquant" +msgid "E909: Cannot index a special variable" +msgstr "E909: Impossible d'indexer une variable spéciale" + +#, c-format +msgid "E1100: Missing :var: %s" +msgstr "E1100: Il manque :var: %s" + +#, c-format +msgid "E1001: Variable not found: %s" +msgstr "E1001: Variable introuvable: %s" + +#, c-format +msgid "E1002: Syntax error at %s" +msgstr "E1002: Erreur de syntaxe dans %s" + +msgid "E1003: Missing return value" +msgstr "E1003: Valeur de retour manquante" + +#, c-format +msgid "E1004: White space required before and after '%s'" +msgstr "E1004: Espace requise avant et après '%s'" + +msgid "E1005: Too many argument types" +msgstr "E1005: Trop de types d'arguments" + +#, c-format +msgid "E1006: %s is used as an argument" +msgstr "E1006: %s est utilisé comme argument" + +msgid "E1007: Mandatory argument after optional argument" +msgstr "E1007: Argument obligatoire après un argument optionnel" + +msgid "E1008: Missing " +msgstr "E1008: manquant" + +msgid "E1009: Missing > after type" +msgstr "E1009: Il manque > après type" + +#, c-format +msgid "E1010: Type not recognized: %s" +msgstr "E1010: Type non reconnu : %s" + +#, c-format +msgid "E1011: Name too long: %s" +msgstr "E1011: Nom trop long : %s" + +#, c-format +msgid "E1012: Type mismatch; expected %s but got %s" +msgstr "E1012: Type inconsistant ; attendu %s mais reçu %s" + +#, c-format +msgid "E1013: Argument %d: type mismatch, expected %s but got %s" +msgstr "E1013: Argument %d : type inconsistant, attendu %s mais reçu %s" + +#, c-format +msgid "E1014: Invalid key: %s" +msgstr "E1014: clé invalide : %s" + +#, c-format +msgid "E1015: Name expected: %s" +msgstr "E1015: Nom attendu : %s" + +#, c-format +msgid "E1016: Cannot declare a %s variable: %s" +msgstr "E1016: Impossible de déclarer variable %s : %s" + +#, c-format +msgid "E1016: Cannot declare an environment variable: %s" +msgstr "E1016: Impossible de déclarer une variable d'environnement : %s" + +#, c-format +msgid "E1017: Variable already declared: %s" +msgstr "E1017: Variable déjà déclarée : %s" + +#, c-format +msgid "E1018: Cannot assign to a constant: %s" +msgstr "E1018: Impossible d'assigner à une constante : %s" + +msgid "E1019: Can only concatenate to string" +msgstr "E1019: Seules les chaînes peuvent être concaténées" + +#, c-format +msgid "E1020: Cannot use an operator on a new variable: %s" +msgstr "E1020: Impossible d'utiliser un opérateur sur une nouvelle variable : %s" + +msgid "E1021: Const requires a value" +msgstr "E1021: Const nécessite une valeur" + +msgid "E1022: Type or initialization required" +msgstr "E1022: Type ou initialisation requis" + +#, c-format +msgid "E1023: Using a Number as a Bool: %d" +msgstr "E1023: Utilisation d'un Nombre comme un Booléen : %d" + +msgid "E1024: Using a Number as a String" +msgstr "E1024: Utilisation d'un Nombre comme une Chaîne" + +msgid "E1025: Using } outside of a block scope" +msgstr "E1025: Utilisation de } hors d'un bloc de portée" + +msgid "E1026: Missing }" +msgstr "E1026: } manquant" + +msgid "E1027: Missing return statement" +msgstr "E1027: commande 'return' manquante" + +msgid "E1028: Compiling :def function failed" +msgstr "E1028: Compilation de function :def a échoué" + +#, c-format +msgid "E1029: Expected %s but got %s" +msgstr "E1029: %s attendu mais %s reçu" + +#, c-format +msgid "E1030: Using a String as a Number: \"%s\"" +msgstr "E1030: Utilisation d'une Chaîne comme Nombre : \"%s\"" + +msgid "E1031: Cannot use void value" +msgstr "E1031: Impossible d'utiliser une valeur 'void'" + +msgid "E1032: Missing :catch or :finally" +msgstr "E1032: :catch ou :finally manquant" + +#, c-format +msgid "E1034: Cannot use reserved name %s" +msgstr "E1034: Impossible d'utiliser le nom réservé %s" + +msgid "E1035: % requires number arguments" +msgstr "E1035: % nécessite des arguments numériques" + +#, c-format +msgid "E1036: %c requires number or float arguments" +msgstr "E1036: %c nécessite des arguments numériques ou flottants" + +#, c-format +msgid "E1037: Cannot use \"%s\" with %s" +msgstr "E1037: Impossible d'utiliser \"%s\" avec %s" + +msgid "E1038: \"vim9script\" can only be used in a script" +msgstr "E1038: \"vim9script\" ne peut être utilisé que dans un script" + +msgid "E1039: \"vim9script\" must be the first command in a script" +msgstr "E1039: \"vim9script\" doit être la première commande dans un script" + +msgid "E1040: Cannot use :scriptversion after :vim9script" +msgstr "E1040: Impossible d'utiliser :scriptversion après :vim9script" + +#, c-format +msgid "E1041: Redefining script item %s" +msgstr "E1041: Redéfinition de l'élément de script %s" + +msgid "E1042: Export can only be used in vim9script" +msgstr "E1042: Export ne peut être utilisé que dans vim9script" + +msgid "E1043: Invalid command after :export" +msgstr "E1043: Commande invalide après :export" + +msgid "E1044: Export with invalid argument" +msgstr "E1044: Export avec argument invalide" + +msgid "E1045: Missing \"as\" after *" +msgstr "E1045: \"as\" manquant après *" + +msgid "E1046: Missing comma in import" +msgstr "E1046: virgule manquante dans import" + +msgid "E1047: Syntax error in import" +msgstr "E1047: Erreur de syntaxe dans import" + +#, c-format +msgid "E1048: Item not found in script: %s" +msgstr "E1048: Élément non trouvé dans le script : %s" + +#, c-format +msgid "E1049: Item not exported in script: %s" +msgstr "E1049: Élément non exporté dans le script : %s" + +#, c-format +msgid "E1052: Cannot declare an option: %s" +msgstr "E1052: Impossible de déclarer un option : %s" + +#, c-format +msgid "E1053: Could not import \"%s\"" +msgstr "E1053: Impossible d'importer \"%s\"" + +#, c-format +msgid "E1054: Variable already declared in the script: %s" +msgstr "E1054: Variable déjà déclarée dans le script : %s" + +msgid "E1055: Missing name after ..." +msgstr "E1055: Nom manquant après ..." + +#, c-format +msgid "E1056: Expected a type: %s" +msgstr "E1056: Type attendu : %s" + +msgid "E1057: Missing :enddef" +msgstr "E1057: :enddef manquant" + +msgid "E1058: Function nesting too deep" +msgstr "E1058: Fonctions trop imbriquées" + +#, c-format +msgid "E1059: No white space allowed before colon: %s" +msgstr "E1059: Espace interdite avant les deux-points : %s" + +#, c-format +msgid "E1060: Expected dot after name: %s" +msgstr "E1060: point attendu après le nom : %s" + +#, c-format +msgid "E1061: Cannot find function %s" +msgstr "E1061: Impossible de trouver la fonction : %s" + +msgid "E1062: Cannot index a Number" +msgstr "E1062: Impossible d'indexer un Nombre" + +msgid "E1063: Type mismatch for v: variable" +msgstr "E1063: Type inconsistant pour la variable v:" + +#, c-format +msgid "E1066: Cannot declare a register: %s" +msgstr "E1066: Impossible déclarer un registre : %s" + +#, c-format +msgid "E1067: Separator mismatch: %s" +msgstr "E1067: Séparateur inconsistant : %s" + +#, c-format +msgid "E1068: No white space allowed before '%s'" +msgstr "E1068: Espace interdite avant '%s'" + +#, c-format +msgid "E1069: White space required after '%s'" +msgstr "E1069: Espace interdite après '%s'" + +msgid "E1070: Missing \"from\"" +msgstr "E1070: \"from\" manquant" + +msgid "E1071: Invalid string after \"from\"" +msgstr "E1071: Chaîne invalide après \"from\"" + +#, c-format +msgid "E1072: Cannot compare %s with %s" +msgstr "E1072: Impossible de comparer %s avec %s" + +#, c-format +msgid "E1073: Name already defined: %s" +msgstr "E1073: Nom déjà défini : %s" + +msgid "E1074: No white space allowed after dot" +msgstr "E1074: Espace interdite après un point" + +#, c-format +msgid "E1084: Cannot delete Vim9 script function %s" +msgstr "E1084: Impossible de supprimer la fonction %s du script vim9" + +msgid "E1086: Cannot use :function inside :def" +msgstr "E1086: Impossible d'utiliser :function dans :def" + +msgid "E1119: Cannot change list item" +msgstr "E1119: Impossible de changer un élément de liste" + +msgid "E1120: Cannot change dict" +msgstr "E1120: Impossible de changer un dictionnaire" + +msgid "E1121: Cannot change dict item" +msgstr "E1121: Impossible de changer un élément de dictionnaire" + +#, c-format +msgid "E1122: Variable is locked: %s" +msgstr "E1122: Variable verrouillée : %s" + +#, c-format +msgid "E1123: Missing comma before argument: %s" +msgstr "E1123: Virgule manquante avant un argument : %s" + +msgid "E1127: Missing name after dot" +msgstr "E1127: Nom manquant après un point" + +msgid "E1128: } without {" +msgstr "E1128: } sans {" + +msgid "E1130: Cannot add to null list" +msgstr "E1130: Impossible d'ajouter à une liste nulle" + +msgid "E1131: Cannot add to null blob" +msgstr "E1131: Impossible d'ajouter à un Blob nul" + +msgid "E1132: Missing function argument" +msgstr "E1132: Argument de fonction manquant" + +msgid "E1133: Cannot extend a null dict" +msgstr "E1133: Impossible d'étendre un dictionnaire nul" + +#, c-format +msgid "E1135: Using a String as a Bool: \"%s\"" +msgstr "E1135: Utilisation d'une Chaîne comme un Booléen : \"%s\"" + +msgid "E1138: Using a Bool as a Number" +msgstr "E1138: Utilisation d'un Booléen comme un Nombre" + +msgid "E1141: Indexable type required" +msgstr "E1141: Type indexable requis" + +msgid "E1142: Non-empty string required" +msgstr "E1142: Chaîne non vide requise" + +#, c-format +msgid "E1143: Empty expression: \"%s\"" +msgstr "E1143: Expression vide : \"%s\"" + +#, c-format +msgid "E1146: Command not recognized: %s" +msgstr "E1146: Commande non reconnue : %s" + +#, c-format +msgid "E1148: Cannot index a %s" +msgstr "E1148: Impossible d'indexer %s" + +# DB - todo : ou encore : msgstr "--Aucune ligne dans le tampon--" +msgid "--No lines in buffer--" +msgstr "--Le tampon est vide--" + +msgid "E470: Command aborted" +msgstr "E470: Commande annulée" + +msgid "E471: Argument required" +msgstr "E471: Argument requis" + +msgid "E10: \\ should be followed by /, ? or &" +msgstr "E10: \\ devrait être suivi de /, ? ou &" + +msgid "E11: Invalid in command-line window; executes, CTRL-C quits" +msgstr "" +"E11: Invalide dans la fenêtre ligne-de-commande ; exécute, CTRL-C quitte" + +msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search" +msgstr "" +"E12: commande non autorisée depuis un exrc/vimrc dans répertoire courant ou " +"une recherche de marqueur" + +msgid "E171: Missing :endif" +msgstr "E171: :endif manquant" + +msgid "E603: :catch without :try" +msgstr "E603: :catch sans :try" + +msgid "E606: :finally without :try" +msgstr "E606: :finally sans :try" + +msgid "E607: multiple :finally" +msgstr "E607: Il ne peut y avoir qu'un seul :finally" + +msgid "E600: Missing :endtry" +msgstr "E600: :endtry manquant" + +msgid "E602: :endtry without :try" +msgstr "E602: :endtry sans :try" + +msgid "E170: Missing :endwhile" +msgstr "E170: :endwhile manquant" msgid "E170: Missing :endfor" msgstr "E170: :endfor manquant" @@ -7033,13 +7378,13 @@ msgid "E16: Invalid range" msgstr "E16: Plage invalide" -msgid "E476: Invalid command" -msgstr "E476: Commande invalide" - #, c-format msgid "E17: \"%s\" is a directory" msgstr "E17: \"%s\" est un répertoire" +msgid "E756: Spell checking is not possible" +msgstr "E756: La vérification orthographique n'est pas possible" + #, c-format msgid "E364: Library call failed for \"%s()\"" msgstr "E364: L'appel à la bibliothèque a échoué pour \"%s()\"" @@ -7187,10 +7532,6 @@ msgstr "E45: L'option 'readonly' est activée (ajoutez ! pour passer outre)" #, c-format -msgid "E121: Undefined variable: %s" -msgstr "E121: Variable non définie : %s" - -#, c-format msgid "E734: Wrong variable type for %s=" msgstr "E734: Type de variable erroné avec %s=" @@ -7236,8 +7577,16 @@ msgstr "E118: La fonction %s a reçu trop d'arguments" #, c-format -msgid "E716: Key not present in Dictionary: %s" -msgstr "E716: La clé %s n'existe pas dans le Dictionnaire" +msgid "E119: Not enough arguments for function: %s" +msgstr "E119: La fonction %s n'a pas reçu assez d'arguments" + +#, c-format +msgid "E933: Function was deleted: %s" +msgstr "E933: La fonction a été effacée : %s" + +#, c-format +msgid "E716: Key not present in Dictionary: \"%s\"" +msgstr "E716: La clé n'existe pas dans le Dictionnaire : \"%s\"" msgid "E714: List required" msgstr "E714: Liste requise" @@ -7246,6 +7595,10 @@ msgstr "E897: Liste ou Blob requis" #, c-format +msgid "E697: Missing end of List ']': %s" +msgstr "E697: Il manque ']' à la fin de la Liste %s" + +#, c-format msgid "E712: Argument of %s must be a List or Dictionary" msgstr "E712: L'argument de %s doit être une Liste ou un Dictionnaire" @@ -7253,6 +7606,26 @@ msgid "E896: Argument of %s must be a List, Dictionary or Blob" msgstr "E896: L'argument de %s doit être une Liste, Dictionnaire ou un Blob" +msgid "E804: Cannot use '%' with Float" +msgstr "E804: Impossible d'utiliser '%' avec un Flottant" + +msgid "E908: using an invalid value as a String" +msgstr "E908: Utilisation d'une valeur invalide comme une Chaîne" + +msgid "E996: Cannot lock an option" +msgstr "E996: Impossible de verrouiller une option" + +#, c-format +msgid "E113: Unknown option: %s" +msgstr "E113: Option inconnue : %s" + +msgid "E18: Unexpected characters in :let" +msgstr "E18: Caractères inattendus avant '='" + +#, c-format +msgid "E857: Dictionary key \"%s\" required" +msgstr "E857: Clé de Dictionnaire \"%s\" requis" + msgid "E47: Error while reading errorfile" msgstr "E47: Erreur lors de la lecture du fichier d'erreurs" @@ -7260,7 +7633,13 @@ msgstr "E48: Opération interdite dans le bac à sable" msgid "E523: Not allowed here" -msgstr "E523: Interdit à cet endroit" +msgstr "E523: Interdit ici" + +msgid "E578: Not allowed to change text here" +msgstr "E578: Interdit de changer le texte ici" + +msgid "E565: Not allowed to change text or change window" +msgstr "E565: Interdit de changer le texte ou la fenêtre" msgid "E359: Screen mode setting not supported" msgstr "E359: Choix du mode d'écran non supporté" @@ -7295,6 +7674,10 @@ msgid "E488: Trailing characters" msgstr "E488: Caractères surnuméraires" +#, c-format +msgid "E488: Trailing characters: %s" +msgstr "E488: Caractères surnuméraires : %s" + msgid "E78: Unknown mark" msgstr "E78: Marque inconnue" @@ -7320,6 +7703,25 @@ msgid "E107: Missing parentheses: %s" msgstr "E107: Parenthèses manquantes : %s" +msgid "E110: Missing ')'" +msgstr "E110: ')' manquant" + +#, c-format +msgid "E720: Missing colon in Dictionary: %s" +msgstr "E720: Il manque ':' dans le Dictionnaire %s" + +#, c-format +msgid "E721: Duplicate key in Dictionary: \"%s\"" +msgstr "E721: Clé dupliquée dans le Dictionnaire : %s" + +#, c-format +msgid "E722: Missing comma in Dictionary: %s" +msgstr "E722: Il manque une virgule dans le Dictionnaire : %s" + +#, c-format +msgid "E723: Missing end of Dictionary '}': %s" +msgstr "E723: Il manque '}' à la fin du Dictionnaire : %s" + msgid "E449: Invalid expression received" msgstr "E449: Expression invalide reçue" @@ -7353,6 +7755,9 @@ msgid "E850: Invalid register name" msgstr "E850: Nom de registre invalide" +msgid "E806: using Float as a String" +msgstr "E806: Utilisation d'un Flottant comme une Chaîne" + #, c-format msgid "E919: Directory not found in '%s': \"%s\"" msgstr "E919: Répertoire introuvable dans '%s' : \"%s\"" @@ -7360,6 +7765,10 @@ msgid "E952: Autocommand caused recursive behavior" msgstr "E952: Une autocommande a causé une récursivité" +msgid "E813: Cannot close autocmd or popup window" +msgstr "" +"E813: Impossible de fermer la fenêtre des autocommandes ou contextuelle" + # DB - todo : J'hésite avec # msgstr "E328: Le menu n'existe pas dans ce mode" msgid "E328: Menu only exists in another mode" @@ -7372,12 +7781,56 @@ msgid "E686: Argument of %s must be a List" msgstr "E686: L'argument de %s doit être une Liste" +# AB - Je suis partagé entre la concision d'une traduction assez littérale et +# la lourdeur d'une traduction plus correcte. +msgid "E109: Missing ':' after '?'" +msgstr "E109: Il manque ':' après '?'" + +msgid "E690: Missing \"in\" after :for" +msgstr "E690: \"in\" manquant après :for" + +#, c-format +msgid "E117: Unknown function: %s" +msgstr "E117: Fonction inconnue : %s" + +msgid "E111: Missing ']'" +msgstr "E111: ']' manquant" + +msgid "E581: :else without :if" +msgstr "E581: :else sans :if" + +msgid "E582: :elseif without :if" +msgstr "E582: :elseif sans :if" + +msgid "E580: :endif without :if" +msgstr "E580: :endif sans :if" + +msgid "E586: :continue without :while or :for" +msgstr "E586: :continue sans :while ou :for" + +msgid "E587: :break without :while or :for" +msgstr "E587: :break sans :while ou :for" + +msgid "E274: No white space allowed before parenthesis" +msgstr "E274: espace interdite avant une parenthèse" + +#, c-format +msgid "E940: Cannot lock or unlock variable %s" +msgstr "E940: Impossible de (dé)verrouiller la variable %s" + +#, c-format +msgid "E254: Cannot allocate color %s" +msgstr "E254: Impossible d'allouer la couleur %s" + msgid "search hit TOP, continuing at BOTTOM" msgstr "La recherche a atteint le HAUT, et continue en BAS" msgid "search hit BOTTOM, continuing at TOP" msgstr "La recherche a atteint le BAS, et continue en HAUT" +msgid " line " +msgstr " ligne " + #, c-format msgid "Need encryption key for \"%s\"" msgstr "Besoin de la clé de chiffrement pour \"%s\"" @@ -7708,3 +8161,69 @@ msgid "Vim" msgstr "Vim" + +msgid "(local to buffer)" +msgstr "(local au tampon)" + +msgid "(global or local to buffer)" +msgstr "(global ou local au tampon)" + +msgid "number of lines used for the command-line" +msgstr "nombre de lignes utilisée pour la ligne de commande" + +msgid "don't redraw while executing macros" +msgstr "ne pas rafraîchir l'écran lors de l'exécution des macros" + +msgid "show as ^I and end-of-line as $" +msgstr "montrer ^I pour et $ pour la fin de ligne" + +msgid "show the line number for each line" +msgstr "montrer le numéro de chaque ligne" + +msgid "terminal" +msgstr "terminal" + +msgid "enable lisp mode" +msgstr "activer le mode lisp" + +msgid "folding" +msgstr "repli" + +msgid "list of directories to put backup files in" +msgstr "liste des répertoires des copies de secours dans" + +msgid "the swap file" +msgstr "le fichier d'échange" + +msgid "list of directories for the swap file" +msgstr "liste des répertoires du fichier d'échange" + +msgid "command line editing" +msgstr "édition de ligne de commande" + +msgid "multi-byte characters" +msgstr "caractères multi-octets" + +msgid "various" +msgstr "divers" + +msgid "name of the Lua dynamic library" +msgstr "nom de la bibliothèque dynamique Lua" + +msgid "name of the Perl dynamic library" +msgstr "nom de la bibliothèque dynamique Perl" + +msgid "whether to use Python 2 or 3" +msgstr "utilisation de Python 2 ou 3" + +msgid "name of the Python 2 dynamic library" +msgstr "nom de la bibliothèque dynamique Python 2" + +msgid "name of the Ruby dynamic library" +msgstr "nom de la bibliothèque dynamique Ruby" + +msgid "name of the Tcl dynamic library" +msgstr "nom de la bibliothèque dynamique Tcl" + +msgid "name of the MzScheme dynamic library" +msgstr "nom de la bibliothèque dynamique MzScheme" diff -Nru vim-8.2.1913/src/po/sr.po vim-8.2.2434/src/po/sr.po --- vim-8.2.1913/src/po/sr.po 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/po/sr.po 2021-01-30 22:05:11.000000000 +0000 @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: Vim(Serbian)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-11-18 10:14+0400\n" -"PO-Revision-Date: 2018-05-15 10:50+0400\n" +"POT-Creation-Date: 2020-11-23 22:13+0400\n" +"PO-Revision-Date: 2020-11-27 00:43+0400\n" "Last-Translator: Ivan PeÅ¡ić \n" "Language-Team: Serbian\n" "Language: sr\n" @@ -30,6 +30,9 @@ msgid "E165: Cannot go beyond last file" msgstr "E165: Ðе може да Ñе иде иза поÑледњег фајла" +msgid "E610: No argument to delete" +msgstr "E610: Ðема аргумента за бриÑање" + msgid "E249: window layout changed unexpectedly" msgstr "E249: раÑпоред прозора Ñе нечекивано променио" @@ -179,8 +182,7 @@ #, c-format msgid "E89: No write since last change for buffer %d (add ! to override)" msgstr "" -"E89: Од поÑледње измене није било упиÑа за бафер %d (додајте ! да " -"премоÑтите)" +"E89: Од поÑледње измене није било упиÑа за бафер %d (додајте ! да премоÑтите)" msgid "E948: Job still running (add ! to end the job)" msgstr "E948: Задатак Ñе још извршава (додајте ! да зауÑтавите задатак)" @@ -222,9 +224,6 @@ msgid "[Not edited]" msgstr "[Ðије уређивано]" -msgid "[New file]" -msgstr "[Ðов фајл]" - msgid "[Read errors]" msgstr "[Грешке при читању]" @@ -284,6 +283,12 @@ msgid "Do you really want to write to it" msgstr "Да ли заиÑта желите да пишете у њега" +msgid "[New]" +msgstr "[Ðово]" + +msgid "[New File]" +msgstr "[Ðов фајл]" + msgid "E676: No matching autocommands for acwrite buffer" msgstr "E676: Ðема одговарајућих аутокоманди за acwrite бафер" @@ -379,12 +384,6 @@ msgid "[Device]" msgstr "[Уређај]" -msgid "[New]" -msgstr "[Ðово]" - -msgid "[New File]" -msgstr "[Ðов фајл]" - msgid " [a]" msgstr " [н]" @@ -422,12 +421,16 @@ msgid "E902: Cannot connect to port" msgstr "E902: Повезивање на порт није могуће" +msgid "E898: socket() in channel_connect()" +msgstr "E898: socket() у channel_connect()" + +#, c-format +msgid "E901: getaddrinfo() in channel_open(): %s" +msgstr "E901: getaddrinfo() у channel_open(): %s" + msgid "E901: gethostbyname() in channel_open()" msgstr "E901: gethostbyname() у channel_open()" -msgid "E898: socket() in channel_open()" -msgstr "E898: socket() у channel_open()" - msgid "E903: received command with non-string argument" msgstr "E903: примњена команда Ñа аргуменом који није Ñтринг" @@ -460,18 +463,46 @@ msgstr "" "E912: ch_evalexpr()/ch_sendexpr() не може да Ñе кориÑти Ñа raw или nl каналом" -msgid "E920: _io file requires _name to be set" -msgstr "E920: _io фајл захтева да _name буде поÑтављено" +msgid "No display" +msgstr "Ðема приказа" -msgid "E915: in_io buffer requires in_buf or in_name to be set" -msgstr "E915: in_io бафер захтева да in_buf или in_name буде поÑтављено" +msgid ": Send failed.\n" +msgstr ": Слање није уÑпело.\n" + +msgid ": Send failed. Trying to execute locally\n" +msgstr ": Слање није уÑпело. Покушава Ñе локално извршавање\n" #, c-format -msgid "E918: buffer must be loaded: %s" -msgstr "E918: бафер мора бити учитан: %s" +msgid "%d of %d edited" +msgstr "%d од %d уређено" -msgid "E916: not a valid job" -msgstr "E916: није валидан job" +msgid "No display: Send expression failed.\n" +msgstr "Ðема приказа: Израз Ñлања није уÑпео.\n" + +msgid ": Send expression failed.\n" +msgstr ": Израз Ñлања није уÑпео.\n" + +msgid "E240: No connection to the X server" +msgstr "E240: Ðема везе Ñа X Ñервером" + +#, c-format +msgid "E241: Unable to send to %s" +msgstr "E241: Слање ка %s није могуће" + +msgid "E277: Unable to read a server reply" +msgstr "E277: Ðе може да Ñе прочита одговор Ñервера" + +msgid "E941: already started a server" +msgstr "E941: Ñервер је већ покренут" + +msgid "E942: +clientserver feature not available" +msgstr "E942: МогућноÑÑ‚ +clientserver није доÑтупна" + +msgid "E258: Unable to send to client" +msgstr "E258: Слање ка клијенту није могуће" + +msgid "Used CUT_BUFFER0 instead of empty selection" +msgstr "УмеÑто празне Ñелекције корићен је CUT_BUFFER0" msgid "tagname" msgstr "ознака" @@ -545,22 +576,6 @@ msgid "%3d expr %s" msgstr "%3d израз %s" -#, c-format -msgid "E720: Missing colon in Dictionary: %s" -msgstr "E720: ÐедоÑтаје тачка-зарез у Речнику: %s" - -#, c-format -msgid "E721: Duplicate key in Dictionary: \"%s\"" -msgstr "E721: Дупликат кључа у Речнику: \"%s\"" - -#, c-format -msgid "E722: Missing comma in Dictionary: %s" -msgstr "E722: ÐедоÑтаје зарез у Речнику: %s" - -#, c-format -msgid "E723: Missing end of Dictionary '}': %s" -msgstr "E723: ÐедоÑтаје крај Речника '}': %s" - msgid "extend() argument" msgstr "extend() аргумент" @@ -707,82 +722,30 @@ msgid "E791: Empty keymap entry" msgstr "E791: Празна keymap Ñтавка" -msgid "E111: Missing ']'" -msgstr "E111: ÐедоÑтаје ']'" - -msgid "E719: Cannot use [:] with a Dictionary" -msgstr "E719: Ðе може да Ñе кориÑти [:] Ñа Речником" - -msgid "E806: using Float as a String" -msgstr "E806: коришћење Float као String" - -msgid "E274: No white space allowed before parenthesis" -msgstr "E274: ИÑпред заграде није дозвољен празан карактер" - msgid "E689: Can only index a List, Dictionary or Blob" -msgstr "E689: Само ЛиÑта, Речник или Blob могу да Ñе индекÑирају" +msgstr "E689: Само ЛиÑта, Речник или Блоб могу да Ñе индекÑирају" msgid "E708: [:] must come last" msgstr "E708: [:] мора да буде поÑледња" msgid "E709: [:] requires a List or Blob value" -msgstr "E709: [:] захтева вредноÑÑ‚ типа List или Blob" +msgstr "E709: [:] захтева вредноÑÑ‚ типа ЛиÑта или Блоб" msgid "E972: Blob value does not have the right number of bytes" -msgstr "E972: Blob вредноÑÑ‚ нема одговарајући број бајтова" +msgstr "E972: Блоб вредноÑÑ‚ нема одговарајући број бајтова" msgid "E996: Cannot lock a range" msgstr "E996: ОпÑег не може да Ñе закључа" -msgid "E710: List value has more items than target" -msgstr "E710: ВредноÑÑ‚ типа List има више Ñтавки него одредиште" - -msgid "E711: List value has not enough items" -msgstr "E711: ВредноÑÑ‚ типа List нема довољно Ñтавки" - msgid "E996: Cannot lock a list or dict" msgstr "E996: ЛиÑта или Речник не могу да Ñе закључају" -msgid "E690: Missing \"in\" after :for" -msgstr "E690: ÐедоÑтаје \"in\" након :for" - -msgid "E109: Missing ':' after '?'" -msgstr "E109: ÐедоÑтаје ':' након '?'" - -msgid "E804: Cannot use '%' with Float" -msgstr "E804: '%' не може да Ñе кориÑти Ñа Float" - -msgid "E973: Blob literal should have an even number of hex characters" -msgstr "E973: Blob литерал би требало да има паран број Ñ…ÐµÐºÑ ÐºÐ°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð°" - -msgid "E110: Missing ')'" -msgstr "E110: ÐедоÑтаје ')'" - msgid "E260: Missing name after ->" msgstr "E260: ÐедоÑтаје име након ->" msgid "E695: Cannot index a Funcref" msgstr "E695: Funcref не може да Ñе индекÑира" -msgid "E909: Cannot index a special variable" -msgstr "E909: Специјална променљива не може да Ñе индекÑира" - -#, c-format -msgid "E112: Option name missing: %s" -msgstr "E112: ÐедоÑтаје име опције: %s" - -#, c-format -msgid "E113: Unknown option: %s" -msgstr "E113: Ðепозната опција: %s" - -#, c-format -msgid "E114: Missing quote: %s" -msgstr "E114: ÐедоÑтаје наводник: %s" - -#, c-format -msgid "E115: Missing quote: %s" -msgstr "E115: ÐедоÑтаје наводник: %s" - msgid "Not enough memory to set references, garbage collection aborted!" msgstr "" "Ðема довољно меморије за поÑтављање референци, прекинуто је Ñкупљање отпада" @@ -790,66 +753,6 @@ msgid "E724: variable nested too deep for displaying" msgstr "E724: променљива је угњеждена предубоко да би Ñе приказала" -msgid "E805: Using a Float as a Number" -msgstr "E805: КориÑти Ñе Float као Number" - -msgid "E703: Using a Funcref as a Number" -msgstr "E703: КориÑти Ñе Funcref као Number" - -msgid "E745: Using a List as a Number" -msgstr "E745: КориÑти Ñе List као Number" - -msgid "E728: Using a Dictionary as a Number" -msgstr "E728: КориÑти Ñе Dictionary као Number" - -msgid "E910: Using a Job as a Number" -msgstr "E910: КориÑти Ñе Job као Number" - -msgid "E913: Using a Channel as a Number" -msgstr "E913: КориÑти Ñе Channel као Number" - -msgid "E974: Using a Blob as a Number" -msgstr "E974: КориÑти Ñе Blob као Number" - -msgid "E891: Using a Funcref as a Float" -msgstr "E891: КориÑти Ñе Funcref као Float" - -msgid "E892: Using a String as a Float" -msgstr "E892: КориÑти Ñе String као Float" - -msgid "E893: Using a List as a Float" -msgstr "E893: КориÑти Ñе List као Float" - -msgid "E894: Using a Dictionary as a Float" -msgstr "E894: КориÑти Ñе Dictionary као Float" - -msgid "E907: Using a special value as a Float" -msgstr "E907: КориÑти Ñе Ñпецијална вредноÑÑ‚ као Float" - -msgid "E911: Using a Job as a Float" -msgstr "E911: КориÑти Ñе Job као Float" - -msgid "E914: Using a Channel as a Float" -msgstr "E914: КориÑти Ñе Channel као Float" - -msgid "E975: Using a Blob as a Float" -msgstr "E975: КориÑти Ñе Blob као Float" - -msgid "E729: using Funcref as a String" -msgstr "E729: кориÑти Ñе Funcref као String" - -msgid "E730: using List as a String" -msgstr "E730: кориÑти Ñе List као String" - -msgid "E731: using Dictionary as a String" -msgstr "E731: кориÑти Ñе Dictionary као String" - -msgid "E976: using Blob as a String" -msgstr "E976: коришћење Blob као String" - -msgid "E908: using an invalid value as a String" -msgstr "E908: кориÑти Ñе недозвољена вредноÑÑ‚ као String" - msgid "E698: variable nested too deep for making a copy" msgstr "E698: променљива је предубоко угњеждена да би Ñе направила копија" @@ -860,29 +763,8 @@ "\n" "\tПоÑледње поÑтављено из " -msgid " line " -msgstr " линија " - -msgid "E977: Can only compare Blob with Blob" -msgstr "E977: Blob може да Ñе пореди Ñамо Ñа Blob" - -msgid "E691: Can only compare List with List" -msgstr "E691: List може да Ñе пореди Ñамо Ñа List" - -msgid "E692: Invalid operation for List" -msgstr "E692: ÐеиÑправна операција за List" - -msgid "E735: Can only compare Dictionary with Dictionary" -msgstr "E735: Dictionary може да Ñе пореди Ñамо Ñа Dictionary" - -msgid "E736: Invalid operation for Dictionary" -msgstr "E736: ÐеиÑправна операција за Dictionary" - -msgid "E694: Invalid operation for Funcrefs" -msgstr "E694: ÐеиÑправна операција за Funcrefs" - msgid "E808: Number or Float required" -msgstr "E808: Захтева Ñе Number или Float" +msgstr "E808: Захтева Ñе Број или Покретни" #, c-format msgid "E158: Invalid buffer name: %s" @@ -926,39 +808,14 @@ msgid "E727: Start past end" msgstr "E727: Почетак иза краја" -msgid "E240: No connection to the X server" -msgstr "E240: Ðема везе Ñа X Ñервером" - -#, c-format -msgid "E241: Unable to send to %s" -msgstr "E241: Слање ка %s није могуће" - -msgid "E277: Unable to read a server reply" -msgstr "E277: Ðе може да Ñе прочита одговор Ñервера" - -msgid "E941: already started a server" -msgstr "E941: Ñервер је већ покренут" - -msgid "E942: +clientserver feature not available" -msgstr "E942: МогућноÑÑ‚ +clientserver није доÑтупна" - -msgid "E258: Unable to send to client" -msgstr "E258: Слање ка клијенту није могуће" - #, c-format msgid "E962: Invalid action: '%s'" msgstr "E962: ÐеиÑправна акција: '%s'" -msgid "(Invalid)" -msgstr "(ÐеиÑправно)" - #, c-format msgid "E935: invalid submatch number: %d" msgstr "E935: неиÑправан број подпоклапања: %d" -msgid "E18: Unexpected characters in :let" -msgstr "E18: Ðеочекивани карактери у :let" - msgid "E991: cannot use =<< here" msgstr "E991: овде не може да Ñе кориÑти =<<" @@ -972,8 +829,8 @@ msgid "E990: Missing end marker '%s'" msgstr "E990: ÐедоÑтаје маркер краја '%s'" -msgid "E985: .= is not supported with script version 2" -msgstr "E985: .= није подржано Ñа Ñкрипт верзијом 2" +msgid "E985: .= is not supported with script version >= 2" +msgstr "E985: .= није подржано Ñа Ñкрипт верзијом >= 2" msgid "E687: Less targets than List items" msgstr "E687: Мање одредишта него Ñтавки ЛиÑте" @@ -981,8 +838,8 @@ msgid "E688: More targets than List items" msgstr "E688: Више одредишта него Ñтавки ЛиÑте" -msgid "Double ; in list of variables" -msgstr "Дупле ; у лиÑти променљивих" +msgid "E452: Double ; in list of variables" +msgstr "E452: ДвоÑтруке ; у лиÑти променљивих" #, c-format msgid "E738: Can't list variables for %s" @@ -991,9 +848,6 @@ msgid "E996: Cannot lock an environment variable" msgstr "E996: Променљива окружења не може да Ñе закључа" -msgid "E996: Cannot lock an option" -msgstr "E996: Опција не може да Ñе закључа" - msgid "E996: Cannot lock a register" msgstr "E996: РегиÑтар не може да Ñе закључа" @@ -1001,12 +855,8 @@ msgid "E108: No such variable: \"%s\"" msgstr "E108: Ðе поÑтоји таква променљива: \"%s\"" -#, c-format -msgid "E940: Cannot lock or unlock variable %s" -msgstr "E940: Ðе може да Ñе откључа или закључа променљива %s" - msgid "E743: variable nested too deep for (un)lock" -msgstr "E743: променљива је угњеждена Ñувише дубоко да би Ñе за(от)кључала" +msgstr "E743: променљива је угњеждена Ñувише дубоко да би Ñе (за/от)кључала" #, c-format msgid "E963: setting %s to value with wrong type" @@ -1097,11 +947,11 @@ #, c-format msgid "Swap file \"%s\" exists, overwrite anyway?" -msgstr "Swap фајл \"%s\" поÑтоји, да га препишем у Ñваком Ñлучају?" +msgstr "Привремени фајл \"%s\" поÑтоји, да га препишем у Ñваком Ñлучају?" #, c-format msgid "E768: Swap file exists: %s (:silent! overrides)" -msgstr "E768: Swap фајл поÑтоји: %s (:silent! премошћава)" +msgstr "E768: Привремени фајл поÑтоји: %s (:silent! премошћава)" #, c-format msgid "E141: No file name for buffer %ld" @@ -1197,45 +1047,6 @@ msgid "Pattern not found: %s" msgstr "Шаблон није пронађен: %s" -msgid "E478: Don't panic!" -msgstr "E478: Ðе паничите!" - -#, c-format -msgid "E661: Sorry, no '%s' help for %s" -msgstr "E661: Жао нам је, нема '%s' помоћи за %s" - -#, c-format -msgid "E149: Sorry, no help for %s" -msgstr "E149: Жао нам је, нема помоћи за %s" - -#, c-format -msgid "Sorry, help file \"%s\" not found" -msgstr "Жао нам је, фајл помоћи \"%s\" није пронађен" - -#, c-format -msgid "E151: No match: %s" -msgstr "E151: Ðема подударања: %s" - -#, c-format -msgid "E152: Cannot open %s for writing" -msgstr "E152: %s не може да Ñе отвори за упиÑ" - -#, c-format -msgid "E153: Unable to open %s for reading" -msgstr "E153: %s не може да Ñе отвори за читање" - -#, c-format -msgid "E670: Mix of help file encodings within a language: %s" -msgstr "E670: Помешано је више кодирања фајлова помоћи за језик: %s" - -#, c-format -msgid "E154: Duplicate tag \"%s\" in file %s/%s" -msgstr "E154: Дуплирана ознака \"%s\" у фајлу %s/%s" - -#, c-format -msgid "E150: Not a directory: %s" -msgstr "E150: Ðије директоријум: %s" - msgid "No old files" msgstr "Ðема Ñтарих фајлова" @@ -1266,17 +1077,9 @@ msgid "W21: Required python version 3.x not supported, ignoring file: %s" msgstr "W21: Захтевани python верзије 3.x није подржан, фајл: %s Ñе игнорише" -#, c-format -msgid "Current %slanguage: \"%s\"" -msgstr "Текући %sјезик: \"%s\"" - -#, c-format -msgid "E197: Cannot set language to \"%s\"" -msgstr "E197: Језик не може да Ñе поÑтави на \"%s\"" - -msgid "Entering Ex mode. Type \"visual\" to go to Normal mode." -msgstr "" -"Улазак у Ex режим. Откуцајте \"visual\" да биÑте прешли у Ðормални режим." +msgid "Entering Ex mode. Type \"visual\" to go to Normal mode." +msgstr "" +"Улазак у Ex режим. Откуцајте \"visual\" да биÑте прешли у Ðормални режим." msgid "E501: At end-of-file" msgstr "E501: Ðа крају-фајла" @@ -1316,15 +1119,15 @@ msgid "E494: Use w or w>>" msgstr "E494: КориÑтите w или w>>" +msgid "E943: Command table needs to be updated, run 'make cmdidxs'" +msgstr "E943: Табела команди мора да Ñе оÑвежи, покрените 'make cmdidxs'" + msgid "" "INTERNAL: Cannot use EX_DFLALL with ADDR_NONE, ADDR_UNSIGNED or ADDR_QUICKFIX" msgstr "" "ИÐТЕРÐО: EX_DFLALL не може да Ñе кориÑти Ñа ADDR_NONE, ADDR_UNSIGNED или " "ADDR_QUICKFIX" -msgid "E943: Command table needs to be updated, run 'make cmdidxs'" -msgstr "E943: Табела команди мора да Ñе оÑвежи, покрените 'make cmdidxs'" - msgid "E319: Sorry, the command is not available in this version" msgstr "E319: Жао нам је, та команда није доÑтупна у овој верзији" @@ -1369,7 +1172,7 @@ msgstr "Картица %d" msgid "No swap file" -msgstr "Ðема swap фајла" +msgstr "Ðема привременог фајла" msgid "Append File" msgstr "Додавање на крај Фајла" @@ -1440,6 +1243,9 @@ msgid "E498: no :source file name to substitute for \"\"" msgstr "E498: нема имена :source фајла које би заменило \"\"" +msgid "E489: no call stack to substitute for \"\"" +msgstr "E489: нема Ñтека позива који би заменио \"\"" + msgid "E842: no line number to use for \"\"" msgstr "E842: нема броја линије који би Ñе кориÑтио за \"\"" @@ -1509,15 +1315,6 @@ msgid "E579: :if nesting too deep" msgstr "E579: :if угњеждавање је Ñувише дубоко" -msgid "E580: :endif without :if" -msgstr "E580: :endif без :if" - -msgid "E581: :else without :if" -msgstr "E581: :else без :if" - -msgid "E582: :elseif without :if" -msgstr "E582: :elseif без :if" - msgid "E583: multiple :else" msgstr "E583: вишеÑтруко :else" @@ -1527,35 +1324,23 @@ msgid "E585: :while/:for nesting too deep" msgstr "E585: :while/:for угњеждавање је Ñувише дубоко" -msgid "E586: :continue without :while or :for" -msgstr "E586: :continue без :while или :for" - -msgid "E587: :break without :while or :for" -msgstr "E587: :break без :while или :for" - msgid "E732: Using :endfor with :while" msgstr "E732: Коришћење :endfor Ñа :while" msgid "E733: Using :endwhile with :for" msgstr "E733: Коришћење :endwhile Ñа :for" +msgid "E579: block nesting too deep" +msgstr "E579: угњеждавање блокова је Ñувише дубоко" + msgid "E601: :try nesting too deep" msgstr "E601: :try угњеждавање је Ñувише дубоко" -msgid "E603: :catch without :try" -msgstr "E603: :catch без :try" - msgid "E604: :catch after :finally" msgstr "E604: :catch након :finally" -msgid "E606: :finally without :try" -msgstr "E606: :finally без :try" - -msgid "E607: multiple :finally" -msgstr "E607: вишеÑтруко :finally" - -msgid "E602: :endtry without :try" -msgstr "E602: :endtry без :try" +msgid "E193: :enddef not inside a function" +msgstr "E193: :enddef није унутар функције" msgid "E193: :endfunction not inside a function" msgstr "E193: :endfunction није унутар функције" @@ -1666,11 +1451,11 @@ msgstr[2] "%ld линија, " #, c-format -msgid "%lld character" -msgid_plural "%lld characters" -msgstr[0] "%lld карактера" -msgstr[1] "%lld карактера" -msgstr[2] "%lld карактера" +msgid "%lld byte" +msgid_plural "%lld bytes" +msgstr[0] "%lld бајт" +msgstr[1] "%lld бајта" +msgstr[2] "%lld бајтова" msgid "[noeol]" msgstr "[noeol]" @@ -1757,6 +1542,9 @@ msgid "E655: Too many symbolic links (cycle?)" msgstr "E655: Превише Ñимболичких веза (циклуÑ?)" +msgid "writefile() first argument must be a List or a Blob" +msgstr "Први аргумент writefile() мора бити ЛиÑта или Блоб" + msgid "Select Directory dialog" msgstr "Дијалог избора директоријума" @@ -1769,6 +1557,9 @@ msgid "E338: Sorry, no file browser in console mode" msgstr "E338: Жао нам је, нема претраживача фајлова у конзолном режиму" +msgid "no matches" +msgstr "нема подударања" + msgid "E854: path too long for completion" msgstr "E854: путања је Ñувише дугачка да би Ñе довршила" @@ -1854,10 +1645,6 @@ msgid "E599: Value of 'imactivatekey' is invalid" msgstr "E599: ВредноÑÑ‚ 'imactivatekey' није иÑправна" -#, c-format -msgid "E254: Cannot allocate color %s" -msgstr "E254: Боја %s не може да Ñе алоцира" - msgid "No match at cursor, finding next" msgstr "Ðема подударања на меÑту курÑора, тражи Ñе даље" @@ -1893,15 +1680,15 @@ msgstr "" "E232: Ðе може да Ñе креира BalloonEval и Ñа поруком и Ñа повратним позивом" -msgid "_Cancel" -msgstr "_Откажи" - msgid "_Save" msgstr "_Сачувај" msgid "_Open" msgstr "_Отвори" +msgid "_Cancel" +msgstr "_Откажи" + msgid "_OK" msgstr "_OK" @@ -2082,6 +1869,25 @@ msgid "Font%d width: %d" msgstr "Фонт%d ширина: %d" +msgid "E284: Cannot set IC values" +msgstr "E284: IC вредноÑти не могу да Ñе поÑтаве" + +msgid "E285: Failed to create input context" +msgstr "E285: Креирање контекÑта уноÑа није уÑпело" + +msgid "E286: Failed to open input method" +msgstr "E286: Отварање методе уноÑа није уÑпело" + +msgid "E287: Warning: Could not set destroy callback to IM" +msgstr "" +"E287: Упозорење: ПоÑтављање повратне функције за уништење IM није уÑпело" + +msgid "E288: input method doesn't support any style" +msgstr "E288: метод уноÑа не подржава ниједан Ñтил" + +msgid "E289: input method doesn't support my preedit type" +msgstr "E289: метод уноÑа не подржава мој preedit тип" + msgid "Invalid font specification" msgstr "ÐеиÑправна Ñпецификација фонта" @@ -2112,9 +1918,6 @@ msgid "Size:" msgstr "Величина:" -msgid "E256: Hangul automata ERROR" -msgstr "E256: ГРЕШКРHangul аутомата" - msgid "E550: Missing colon" msgstr "E550: ÐедоÑтаје двотачка" @@ -2208,6 +2011,45 @@ msgid "Print job sent." msgstr "Задатак штампе је поÑлат" +msgid "E478: Don't panic!" +msgstr "E478: Ðе паничите!" + +#, c-format +msgid "E661: Sorry, no '%s' help for %s" +msgstr "E661: Жао нам је, нема '%s' помоћи за %s" + +#, c-format +msgid "E149: Sorry, no help for %s" +msgstr "E149: Жао нам је, нема помоћи за %s" + +#, c-format +msgid "Sorry, help file \"%s\" not found" +msgstr "Жао нам је, фајл помоћи \"%s\" није пронађен" + +#, c-format +msgid "E151: No match: %s" +msgstr "E151: Ðема подударања: %s" + +#, c-format +msgid "E152: Cannot open %s for writing" +msgstr "E152: %s не може да Ñе отвори за упиÑ" + +#, c-format +msgid "E153: Unable to open %s for reading" +msgstr "E153: %s не може да Ñе отвори за читање" + +#, c-format +msgid "E670: Mix of help file encodings within a language: %s" +msgstr "E670: Помешано је више кодирања фајлова помоћи за језик: %s" + +#, c-format +msgid "E154: Duplicate tag \"%s\" in file %s/%s" +msgstr "E154: Дуплирана ознака \"%s\" у фајлу %s/%s" + +#, c-format +msgid "E150: Not a directory: %s" +msgstr "E150: Ðије директоријум: %s" + msgid "E679: recursive loop loading syncolor.vim" msgstr "E679: Рекурзивна петља код учитавања syncolor.vim" @@ -2248,6 +2090,9 @@ msgid "E420: BG color unknown" msgstr "E420: Ðепозната BG боја" +msgid "E453: UL color unknown" +msgstr "E453: Ðепозната UL боја" + #, c-format msgid "E421: Color name or number not recognized: %s" msgstr "E421: Име боје или број ниÑу препознати: %s" @@ -2272,29 +2117,6 @@ msgid "E849: Too many highlight and syntax groups" msgstr "E849: Превише ÑинтакÑних и група иÑтицања" -#, c-format -msgid "E799: Invalid ID: %d (must be greater than or equal to 1)" -msgstr "E799: Ðеважећи ИД: %d (мора бити веће или једнако од 1)" - -#, c-format -msgid "E801: ID already taken: %d" -msgstr "E801: ИД је већ заузет: %d" - -msgid "E290: List or number required" -msgstr "E290: Захтева Ñе лиÑта или број" - -#, c-format -msgid "E802: Invalid ID: %d (must be greater than or equal to 1)" -msgstr "E802: Ðеважећи ИД: %d (мора бити веће или једнако од 1)" - -#, c-format -msgid "E803: ID not found: %d" -msgstr "E803: ИД није пронађен: %d" - -#, c-format -msgid "E798: ID is reserved for \":match\": %d" -msgstr "E798: ИД је резервиÑан за \":match\": %d" - msgid "Add a new database" msgstr "Додај нову базу" @@ -2566,7 +2388,7 @@ msgstr "E837: Овај Vim не може да изврши :py3 након коришћења :python" msgid "E265: $_ must be an instance of String" -msgstr "E265: $_ мора да буде инÑтанца String-а" +msgstr "E265: $_ мора да буде инÑтанца Стринга" msgid "" "E266: Sorry, this command is disabled, the Ruby library could not be loaded." @@ -2791,22 +2613,41 @@ msgid "match %d" msgstr "подударање %d" +msgid "E920: _io file requires _name to be set" +msgstr "E920: _io фајл захтева да _name буде поÑтављено" + +msgid "E915: in_io buffer requires in_buf or in_name to be set" +msgstr "E915: in_io бафер захтева да in_buf или in_name буде поÑтављено" + +#, c-format +msgid "E918: buffer must be loaded: %s" +msgstr "E918: бафер мора бити учитан: %s" + +msgid "E916: not a valid job" +msgstr "E916: није валидан job" + +#, c-format +msgid "E491: json decode error at '%s'" +msgstr "E491: грешка json декодирања на '%s'" + #, c-format msgid "E938: Duplicate key in JSON: \"%s\"" msgstr "E938: Дупли кључ у JSON: \"%s\"" #, c-format msgid "E899: Argument of %s must be a List or Blob" -msgstr "E899: Ðргумент за %s мора бити ЛиÑта или Blob" +msgstr "E899: Ðргумент за %s мора бити ЛиÑта или Блоб" + +msgid "E900: maxdepth must be non-negative number" +msgstr "E900: maxdepth не Ñме да буде негативан број" + +msgid "flatten() argument" +msgstr "flatten() аргумент" #, c-format msgid "E696: Missing comma in List: %s" msgstr "E696: У ЛиÑти недоÑтаје зарез: %s" -#, c-format -msgid "E697: Missing end of List ']': %s" -msgstr "E697: ÐедоÑтаје крај ЛиÑте ']': %s" - msgid "sort() argument" msgstr "sort() аргумент" @@ -2822,6 +2663,9 @@ msgid "map() argument" msgstr "map() аргумент" +msgid "mapnew() argument" +msgstr "mapnew() аргумент" + msgid "filter() argument" msgstr "filter() аргумент" @@ -2837,6 +2681,14 @@ msgid "reverse() argument" msgstr "reverse() аргумент" +#, c-format +msgid "Current %slanguage: \"%s\"" +msgstr "Текући %sјезик: \"%s\"" + +#, c-format +msgid "E197: Cannot set language to \"%s\"" +msgstr "E197: Језик не може да Ñе поÑтави на \"%s\"" + msgid "Unknown option argument" msgstr "Ðепознат аргумент опције" @@ -3019,10 +2871,10 @@ msgstr "-D\t\t\tDebugging режим" msgid "-n\t\t\tNo swap file, use memory only" -msgstr "-n\t\t\tБез swap фајла, кориÑти Ñамо меморију" +msgstr "-n\t\t\tБез привременог фајла, кориÑти Ñамо меморију" msgid "-r\t\t\tList swap files and exit" -msgstr "-r\t\t\tИзлиÑтај swap фајлове и изађи" +msgstr "-r\t\t\tИзлиÑтај привремене фајлове и изађи" msgid "-r (with file name)\tRecover crashed session" msgstr "-r (Ñа именом фајла)\tОбнови Ñрушену ÑеÑију" @@ -3247,25 +3099,6 @@ msgid "--windowid \tOpen Vim inside another win32 widget" msgstr "--windowid \tОтвори Vim унутар другог win32 виџета" -msgid "No display" -msgstr "Ðема приказа" - -msgid ": Send failed.\n" -msgstr ": Слање није уÑпело.\n" - -msgid ": Send failed. Trying to execute locally\n" -msgstr ": Слање није уÑпело. Покушава Ñе локално извршавање\n" - -#, c-format -msgid "%d of %d edited" -msgstr "%d од %d уређено" - -msgid "No display: Send expression failed.\n" -msgstr "Ðема приказа: Израз Ñлања није уÑпео.\n" - -msgid ": Send expression failed.\n" -msgstr ": Израз Ñлања није уÑпео.\n" - #, c-format msgid "E224: global abbreviation already exists for %s" msgstr "E224: глобална Ñкраћеница за %s већ поÑтоји" @@ -3291,6 +3124,9 @@ msgid "E228: makemap: Illegal mode" msgstr "E228: makemap: Ðедозвољен режим" +msgid "E460: entries missing in mapset() dict argument" +msgstr "E460: недоÑтају Ñтавке у mapset() dict аргументу" + #, c-format msgid "E357: 'langmap': Matching character missing for %s" msgstr "E357: 'langmap': ÐедоÑтаје одговарајући карактер за %s" @@ -3327,45 +3163,49 @@ "\n" "измена лин кол текÑÑ‚" -msgid "E543: Not a valid codepage" -msgstr "E543: Ðеважећа кодна Ñтрана" +#, c-format +msgid "E799: Invalid ID: %d (must be greater than or equal to 1)" +msgstr "E799: Ðеважећи ИД: %d (мора бити веће или једнако од 1)" -msgid "E284: Cannot set IC values" -msgstr "E284: IC вредноÑти не могу да Ñе поÑтаве" +#, c-format +msgid "E801: ID already taken: %d" +msgstr "E801: ИД је већ заузет: %d" -msgid "E285: Failed to create input context" -msgstr "E285: Креирање контекÑта уноÑа није уÑпело" +msgid "E290: List or number required" +msgstr "E290: Захтева Ñе лиÑта или број" -msgid "E286: Failed to open input method" -msgstr "E286: Отварање методе уноÑа није уÑпело" +#, c-format +msgid "E802: Invalid ID: %d (must be greater than or equal to 1)" +msgstr "E802: Ðеважећи ИД: %d (мора бити веће или једнако од 1)" -msgid "E287: Warning: Could not set destroy callback to IM" -msgstr "" -"E287: Упозорење: ПоÑтављање повратне функције за уништење IM није уÑпело" +#, c-format +msgid "E803: ID not found: %d" +msgstr "E803: ИД није пронађен: %d" -msgid "E288: input method doesn't support any style" -msgstr "E288: метод уноÑа не подржава ниједан Ñтил" +#, c-format +msgid "E798: ID is reserved for \":match\": %d" +msgstr "E798: ИД је резервиÑан за \":match\": %d" -msgid "E289: input method doesn't support my preedit type" -msgstr "E289: метод уноÑа не подржава мој preedit тип" +msgid "E543: Not a valid codepage" +msgstr "E543: Ðеважећа кодна Ñтрана" msgid "E293: block was not locked" msgstr "E293: блок није закључан" msgid "E294: Seek error in swap file read" -msgstr "E294: Грешка код поÑтављања показивача за читање swap фајла" +msgstr "E294: Грешка код поÑтављања показивача за читање из привременог фајла" msgid "E295: Read error in swap file" -msgstr "E295: Грешка при читању swap фајла" +msgstr "E295: Грешка при читању привременог фајла" msgid "E296: Seek error in swap file write" -msgstr "E296: Грешка код поÑтављања показивача за ÑƒÐ¿Ð¸Ñ swap фајла" +msgstr "E296: Грешка код поÑтављања показивача за ÑƒÐ¿Ð¸Ñ Ñƒ привремени фајл" msgid "E297: Write error in swap file" -msgstr "E297: Грешка при упиÑу swap фајла" +msgstr "E297: Грешка при упиÑу преивременог фајла" msgid "E300: Swap file already exists (symlink attack?)" -msgstr "E300: Swap фајл већ поÑтоји (symlink напад?)" +msgstr "E300: Привремени фајл већ поÑтоји (symlink напад?)" msgid "E298: Didn't get block nr 0?" msgstr "E298: Блок бр 0 није добављен?" @@ -3377,27 +3217,29 @@ msgstr "E298: Блок бр 2 није добављен?" msgid "E843: Error while updating swap file crypt" -msgstr "E843: Грешка приликом оÑвежавања криптовања swap фајла" +msgstr "E843: Грешка приликом оÑвежавања шифрирања привременог фајла" msgid "E301: Oops, lost the swap file!!!" -msgstr "E301: УупÑ, swap фајл је изгубљен!!!" +msgstr "E301: УупÑ, привремени фајл је изгубљен!!!" msgid "E302: Could not rename swap file" -msgstr "E302: Промена имена swap фајла није уÑпела" +msgstr "E302: Промена имена привременог фајла није уÑпела" #, c-format msgid "E303: Unable to open swap file for \"%s\", recovery impossible" -msgstr "E303: Отварање swap фајла за \"%s\" није уÑпело, опоравак је немогућ" +msgstr "" +"E303: Отварање привременог фајла за \"%s\" није уÑпело, опоравак је немогућ" msgid "E304: ml_upd_block0(): Didn't get block 0??" msgstr "E304: ml_upd_block0(): Блок бр 0 није добављен??" #, c-format msgid "E305: No swap file found for %s" -msgstr "E305: За %s није пронађен swap фајл" +msgstr "E305: За %s није пронађен привремени фајл" msgid "Enter number of swap file to use (0 to quit): " -msgstr "УнеÑите број swap фајла који ће да Ñе кориÑти (0 за отказивање): " +msgstr "" +"УнеÑите број привременог фајла који ће да Ñе кориÑти (0 за отказивање): " #, c-format msgid "E306: Cannot open %s" @@ -3411,17 +3253,17 @@ "Maybe no changes were made or Vim did not update the swap file." msgstr "" "\n" -"Можда ниÑу направљене никакве измене или Vim није оÑвежио swap фајл." +"Можда ниÑу направљене никакве измене или Vim није оÑвежио привремени фајл." msgid " cannot be used with this version of Vim.\n" msgstr " не може да Ñе кориÑти Ñа овом верзијом Vim-а.\n" msgid "Use Vim version 3.0.\n" -msgstr "КориÑтите Vim верзијe 3.0.\n" +msgstr "КориÑти Ñе Vim верзијe 3.0.\n" #, c-format msgid "E307: %s does not look like a Vim swap file" -msgstr "E307: %s не изгледа као Vim swap фајл" +msgstr "E307: %s не изгледа као Vim привремени фајл" msgid " cannot be used on this computer.\n" msgstr " не може да Ñе кориÑти на овом компјутеру.\n" @@ -3446,7 +3288,7 @@ #, c-format msgid "Using swap file \"%s\"" -msgstr "КориÑти Ñе swap фајл \"%s\"" +msgstr "КориÑти Ñе привремени фајл \"%s\"" #, c-format msgid "Original file \"%s\"" @@ -3457,7 +3299,7 @@ #, c-format msgid "Swap file is encrypted: \"%s\"" -msgstr "Swap фајл је шифрован: \"%s\"" +msgstr "Привремени фајл је шифрован: \"%s\"" msgid "" "\n" @@ -3486,7 +3328,7 @@ "to use the same key for text file and swap file" msgstr "" "\n" -"да биÑте кориÑтили иÑти кључ за текÑÑ‚ фајл и swap фајл" +"да биÑте кориÑтили иÑти кључ за текÑÑ‚ фајл и привремени фајл" #, c-format msgid "E309: Unable to read block 1 from %s" @@ -3550,18 +3392,23 @@ msgid "" "\n" -"You may want to delete the .swp file now.\n" -"\n" +"You may want to delete the .swp file now." msgstr "" "\n" -"Сада можда желите да обришете .swp фајл.\n" +"Сада би могли да обришете .swp фајл." + +msgid "" +"\n" +"Note: process STILL RUNNING: " +msgstr "" "\n" +"Ðапомена: Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñе ЈОШ УВЕК ИЗВРШÐÐ’Ð: " msgid "Using crypt key from swap file for the text file.\n" -msgstr "За текÑÑ‚ фајл Ñе кориÑти кључ за шифрирање из swap фајла.\n" +msgstr "За текÑÑ‚ фајл Ñе кориÑти кључ за шифрирање из привременог фајла.\n" msgid "Swap files found:" -msgstr "Пронађени Ñу swap фајлови:" +msgstr "Пронађени Ñу привремени фајлови:" msgid " In current directory:\n" msgstr " У текућем директоријуму:\n" @@ -3575,9 +3422,6 @@ msgid " -- none --\n" msgstr " -- ниједан --\n" -msgid "%a %b %d %H:%M:%S %Y" -msgstr "%a %b %d %H:%M:%S %Y" - msgid " owned by: " msgstr " који поÑедује: " @@ -3591,7 +3435,7 @@ msgstr " [од Vim верзије 3.0]" msgid " [does not look like a Vim swap file]" -msgstr " [не изгледа као Vim swap фајл]" +msgstr " [не изгледа као Vim привремени фајл]" msgid " file name: " msgstr " име фајла: " @@ -3657,13 +3501,13 @@ msgstr " [не може да Ñе отвори]" msgid "E313: Cannot preserve, there is no swap file" -msgstr "E313: Ðе може да Ñе презервира, нема swap фајла" +msgstr "E313: Ðе може да Ñе очува, нема привременог фајла" msgid "File preserved" -msgstr "Фајл је презервиран" +msgstr "Фајл је очуван" msgid "E314: Preserve failed" -msgstr "E314: Презервација није уÑпела" +msgstr "E314: Очување није уÑпело" #, c-format msgid "E315: ml_get: invalid lnum: %ld" @@ -3724,7 +3568,7 @@ "Found a swap file by the name \"" msgstr "" "\n" -"Пронађен је swap фајл под именом \"" +"Пронађен је привремени фајл под именом \"" msgid "While opening file \"" msgstr "Док Ñе отварао фајл \"" @@ -3733,7 +3577,7 @@ msgstr " ÐИЈЕ ПРОÐÐЂЕÐО" msgid " NEWER than swap file!\n" -msgstr " ÐОВИЈИ од swap фајла!\n" +msgstr " ÐОВИЈИ од привременог фајла!\n" msgid "" "\n" @@ -3760,7 +3604,7 @@ " да опоравите измене (погледајте \":help recovery\").\n" msgid " If you did this already, delete the swap file \"" -msgstr " Ðко Ñте ово већ учинили, обришите swap фајл \"" +msgstr " Ðко Ñте ово већ учинили, обришите привремени фајл \"" msgid "" "\"\n" @@ -3770,10 +3614,10 @@ " како би избегли ову поруку.\n" msgid "Found a swap file that is not useful, deleting it" -msgstr "Пронађен је беÑкориÑтан swap фајл, брише Ñе" +msgstr "Пронађен је беÑкориÑтан привремени фајл, брише Ñе" msgid "Swap file \"" -msgstr "Swap фајл \"" +msgstr "Привремени фајл \"" msgid "\" already exists!" msgstr "\" већ поÑтоји!" @@ -3782,7 +3626,7 @@ msgstr "VIM - ПÐЖЊÐ" msgid "Swap file already exists!" -msgstr "Swap фајл већ поÑтоји!" +msgstr "Привремени фајл већ поÑтоји!" msgid "" "&Open Read-Only\n" @@ -3813,7 +3657,7 @@ "&Прекини" msgid "E326: Too many swap files found" -msgstr "E326: Пронађено је превише swap фајлова" +msgstr "E326: Пронађено је превише привремених фајлова" msgid "E327: Part of menu-item path is not sub-menu" msgstr "E327: Део путање Ñтавке менија није подмени" @@ -3862,6 +3706,10 @@ msgstr "E337: Мени није пронађен - проверите имена менија" #, c-format +msgid "Error detected while compiling %s:" +msgstr "Откривена је грешка током компајлирања %s:" + +#, c-format msgid "Error detected while processing %s:" msgstr "Откривена је грешка током обраде %s:" @@ -3919,16 +3767,16 @@ msgstr "E766: Ðедовољно аргумената за printf()" msgid "E807: Expected Float argument for printf()" -msgstr "E807: Очекује Ñе Float аргумент за printf()" +msgstr "E807: Очекује Ñе аргумент типа Покретни за printf()" msgid "E767: Too many arguments to printf()" msgstr "E767: Сувише аргумената за printf()" -msgid "Type number and or click with mouse (empty cancels): " -msgstr "УнеÑите број и <Ентер> или кликните мишем (ништа за отказ): " +msgid "Type number and or click with the mouse (q or empty cancels): " +msgstr "УнеÑите број и <Ентер> или кликните мишем (q или ништа за отказ): " -msgid "Type number and (empty cancels): " -msgstr "УнеÑите број и <Ентер> (ништа за отказ): " +msgid "Type number and (q or empty cancels): " +msgstr "УнеÑите број и <Ентер> (q или ништа за отказ): " #, c-format msgid "%ld more line" @@ -3953,13 +3801,6 @@ msgid "E677: Error writing temp file" msgstr "E677: Грешка при упиÑу temp фајла" -#, c-format -msgid "%ld second ago" -msgid_plural "%ld seconds ago" -msgstr[0] "пре %ld Ñекунде" -msgstr[1] "пре %ld Ñекунде" -msgstr[2] "пре %ld Ñекунди" - msgid "ERROR: " msgstr "ГРЕШКÐ: " @@ -4076,6 +3917,13 @@ msgstr[2] "%ld линија је промењено" #, c-format +msgid "%d line changed" +msgid_plural "%d lines changed" +msgstr[0] "%d линија је промењена" +msgstr[1] "%d линије је промењено" +msgstr[2] "%d линија је промењено" + +#, c-format msgid "%ld Cols; " msgstr "%ld Кол; " @@ -4123,7 +3971,8 @@ msgstr "E520: Ðије довољено у режимÑкој линији" msgid "E992: Not allowed in a modeline when 'modelineexpr' is off" -msgstr "E992: Ðије дозвољено у режимÑкој линији када је 'modelineexpr' иÑкључена" +msgstr "" +"E992: Ðије дозвољено у режимÑкој линији када је 'modelineexpr' иÑкључена" msgid "E846: Key code not set" msgstr "E846: Ðије поÑтављeн код таÑтера" @@ -4205,7 +4054,6 @@ msgid "E540: Unclosed expression sequence" msgstr "E540: Ðиз израза није затворен" - msgid "E542: unbalanced groups" msgstr "E542: неуравнотежене групе" @@ -4250,8 +4098,10 @@ msgid "E528: Must specify a ' value" msgstr "E528: Мора да Ñе наведе ' вредноÑÑ‚" -msgid "E595: contains unprintable or wide character" -msgstr "E595: Ñадржи карактер који не може да Ñе одштампа, или широки карактер" +msgid "E595: 'showbreak' contains unprintable or wide character" +msgstr "" +"E595: 'showbreak' Ñадржи карактер који не може да Ñе одштампа, или широки " +"карактер" msgid "E596: Invalid font(s)" msgstr "E596: ÐеиÑправни фонт(ови)" @@ -4503,8 +4353,11 @@ msgid "shell returned %d" msgstr "командно окружење је вратило %d" -msgid "E278: Cannot put a terminal buffer in a popup window" -msgstr "E278: ТерминалÑки бафер не може да Ñе Ñтави у иÑкачући прозор" +msgid "E861: Cannot open a second popup with a terminal" +msgstr "E861: Са терминалом није могуће да Ñе отвори други иÑкачући прозор" + +msgid "E450: buffer number, text or a list required" +msgstr "E450: Захтева број бафера Број или Покретни" #, c-format msgid "E997: Tabpage not found: %d" @@ -4517,22 +4370,28 @@ msgid "E994: Not allowed in a popup window" msgstr "E994: Ðије дозвољено у иÑкачућем прозору" +msgid "E863: Not allowed for a terminal in a popup window" +msgstr "E863: За терминал није дозвољено у иÑкачућем прозору" + msgid "E750: First use \":profile start {fname}\"" -msgstr "E750: Ðајпре кориÑтите \":profile start {fname}\"" +msgstr "E750: Ðајпре употребите „:profile start {имеф}â€" msgid "E553: No more items" msgstr "E553: Ðема више Ñтавки" +msgid "E925: Current quickfix list was changed" +msgstr "E925: Текућа quickfix лиÑта је измењена" + msgid "E926: Current location list was changed" -msgstr "E926: Текућа лиÑта локација је промењена" +msgstr "E926: Текућа лиÑта локација је измењена" #, c-format msgid "E372: Too many %%%c in format string" -msgstr "E372: Превише %%%c Ñтрингу формата" +msgstr "E372: Превише %%%c у Ñтрингу формата" #, c-format msgid "E373: Unexpected %%%c in format string" -msgstr "E373: Ðеочекивано %%%c Ñтрингу формата" +msgstr "E373: Ðеочекивано %%%c у Ñтрингу формата" msgid "E374: Missing ] in format string" msgstr "E374: ÐедоÑтаје ] у Ñтрингу формата" @@ -4558,9 +4417,6 @@ msgid "E924: Current window was closed" msgstr "E924: Текући прозор је затворен" -msgid "E925: Current quickfix was changed" -msgstr "E925: Текући quickfix је промењен" - #, c-format msgid "(%d of %d)%s%s: " msgstr "(%d од %d)%s%s: " @@ -4591,11 +4447,14 @@ msgid "Cannot open file \"%s\"" msgstr "Фајл \"%s\" не може да Ñе отвори" +msgid "cannot have both a list and a \"what\" argument" +msgstr "не може да Ñе има и лиÑта и \"what\" аргумент" + msgid "E681: Buffer is not loaded" msgstr "E681: Бафер није учитан" msgid "E777: String or List expected" -msgstr "E777: Очекује Ñе String или List" +msgstr "E777: Очекује Ñе Стринг или ЛиÑта" #, c-format msgid "E927: Invalid action: '%s'" @@ -4645,22 +4504,26 @@ msgstr "E956: Шаблон не може да Ñе кориÑти рекурзивно" #, c-format +msgid "E654: missing delimiter after search pattern: %s" +msgstr "E654: недоÑтаје граничник иза шаблона претраге: %s" + +#, c-format msgid "E554: Syntax error in %s{...}" msgstr "E554: СинтакÑна грешка у %s{...}" #, c-format msgid "E888: (NFA regexp) cannot repeat %s" -msgstr "E888: (NFA regexp) не може да Ñе понови %s" +msgstr "E888: (ÐКРрегизраз) не може да Ñе понови %s" msgid "" "E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " "used " msgstr "" "E864: Иза \\%#= може да Ñледи једино 0, 1, или 2. КориÑтиће Ñе аутоматÑки " -"енџин " +"механизам " msgid "Switching to backtracking RE engine for pattern: " -msgstr "Пребацивање на backtracking RE енџин за шаблон: " +msgstr "Пребацивање на РИ механизам Ñа погледом уназад за шаблон: " msgid "E65: Illegal back reference" msgstr "E65: Ðеважећа повратна референца" @@ -4713,51 +4576,51 @@ msgstr "E339: Шаблон је предугачак" msgid "External submatches:\n" -msgstr "Спољна подпоклапања:\n" +msgstr "Спољна под-подударања:\n" msgid "E865: (NFA) Regexp end encountered prematurely" -msgstr "E865: Крај (NFA) Regexp израза је доÑтигнут прерано" +msgstr "E865: (ÐКÐ) прерано је доÑтигнут крај регизраза" #, c-format msgid "E866: (NFA regexp) Misplaced %c" -msgstr "E866: (NFA regexp) %c је на погрешном меÑту" +msgstr "E866: (ÐКРрегизраз) %c је на погрешном меÑту" #, c-format msgid "E877: (NFA regexp) Invalid character class: %d" -msgstr "E877: (NFA regexp) Ðеважећа карактер клаÑа: %d" - -#, c-format -msgid "E867: (NFA) Unknown operator '\\z%c'" -msgstr "E867: (NFA) Ðепознати оператор '\\z%c'" +msgstr "E877: (ÐКРрегизраз) Ðеважећа карактер клаÑа: %d" msgid "E951: \\% value too large" msgstr "E951: ВредноÑÑ‚ \\% је предугачка" #, c-format -msgid "E867: (NFA) Unknown operator '\\%%%c'" -msgstr "E867: (NFA) Ðепознати оператор '\\%%%c'" +msgid "E867: (NFA) Unknown operator '\\z%c'" +msgstr "E867: (ÐКÐ) Ðепознати оператор '\\z%c'" + +#, c-format +msgid "E867: (NFA) Unknown operator '\\%%%c'" +msgstr "E867: (ÐКÐ) Ðепознати оператор '\\%%%c'" msgid "E868: Error building NFA with equivalence class!" -msgstr "E868: Грешка при грађењу NFA Ñа клаÑом еквиваленције!" +msgstr "E868: Грешка при грађењу ÐКРÑа клаÑом еквиваленције!" #, c-format msgid "E869: (NFA) Unknown operator '\\@%c'" -msgstr "E869: (NFA) Ðепознати оператор '\\@%c'" +msgstr "E869: (ÐКÐ) Ðепознати оператор '\\@%c'" msgid "E870: (NFA regexp) Error reading repetition limits" -msgstr "E870: (NFA regexp) Грешка при читању граница понављања" +msgstr "E870: (ÐКРрегизраз) Грешка при читању граница понављања" msgid "E871: (NFA regexp) Can't have a multi follow a multi" -msgstr "E871: (NFA regexp) Мулти не може Ñледи иза мулти" +msgstr "E871: (ÐКРрегизраз) Мулти не може Ñледи иза мулти" msgid "E872: (NFA regexp) Too many '('" -msgstr "E872: (NFA regexp) Превише '('" +msgstr "E872: (ÐКРрегизраз) Превише '('" msgid "E879: (NFA regexp) Too many \\z(" -msgstr "E879: (NFA regexp) Превише \\z(" +msgstr "E879: (ÐКРрегизраз) Превише \\z(" msgid "E873: (NFA regexp) proper termination error" -msgstr "E873: (NFA regexp) грешка правилне терминације" +msgstr "E873: (ÐКРрегизраз) грешка правилне терминације" msgid "Could not open temporary log file for writing, displaying on stderr... " msgstr "" @@ -4765,21 +4628,21 @@ "stderr... " msgid "E874: (NFA) Could not pop the stack!" -msgstr "E874: (NFA) Скидање Ñа Ñтека није уÑпело!" +msgstr "E874: (ÐКÐ) Скидање Ñа Ñтека није уÑпело!" msgid "" "E875: (NFA regexp) (While converting from postfix to NFA), too many states " "left on stack" msgstr "" -"E875: (NFA regexp) (Док је вршена конверзија из postfix у NFA), превише " -"Ñтања је оÑтало на Ñтеку" +"E875: (ÐКРрегизраз) (Док је вршена конверзија из поÑтфикног облика у ÐКÐ), " +"превише Ñтања је оÑтало на Ñтеку" msgid "E876: (NFA regexp) Not enough space to store the whole NFA " msgstr "" -"E876: (NFA regexp) Ðема довољно проÑтора да Ñе уÑкладишти комплетан NFA " +"E876: (ÐКРрегизраз) Ðема довољно проÑтора да Ñе уÑкладишти комплетан ÐКР" msgid "E878: (NFA) Could not allocate memory for branch traversal!" -msgstr "E878: (NFA) Ðије могла да Ñе алоцира меморија за обилазак грана!" +msgstr "E878: (ÐКÐ) Ðије могла да Ñе алоцира меморија за обилазак грана!" msgid "E748: No previously used register" msgstr "E748: Ðема претходно коришћеног региÑтра" @@ -5074,9 +4937,6 @@ msgid " (not supported)" msgstr " (није подржано)" -msgid "E756: Spell checking is not enabled" -msgstr "E756: Провера правопиÑа није омогућена" - #, c-format msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\"" msgstr "" @@ -5326,43 +5186,47 @@ msgstr "Читање фајла речи %s..." #, c-format -msgid "Duplicate /encoding= line ignored in %s line %d: %s" -msgstr "Дупликат /encoding= линија је игнориÑана у %s линија %d: %s" +msgid "Conversion failure for word in %s line %ld: %s" +msgstr "ÐеуÑпешна конверзија за реч у %s линија %ld: %s" + +#, c-format +msgid "Duplicate /encoding= line ignored in %s line %ld: %s" +msgstr "Дупликат /encoding= линије sе игнорише у %s линија %ld: %s" #, c-format -msgid "/encoding= line after word ignored in %s line %d: %s" -msgstr "/encoding= линија након речи је игнориÑана у %s линија %d: %s" +msgid "/encoding= line after word ignored in %s line %ld: %s" +msgstr "/encoding= линија након речи Ñе игнорише у %s линија %ld: %s" #, c-format -msgid "Duplicate /regions= line ignored in %s line %d: %s" -msgstr "Дупликат /regions= линија је игнориÑана у %s линија %d: %s" +msgid "Duplicate /regions= line ignored in %s line %ld: %s" +msgstr "Дупликат /regions= линије Ñе игнорише у %s линија %ld: %s" #, c-format -msgid "Too many regions in %s line %d: %s" -msgstr "Превише региона у %s линија %d: %s" +msgid "Too many regions in %s line %ld: %s" +msgstr "Превише региона у %s линија %ld: %s" #, c-format -msgid "/ line ignored in %s line %d: %s" -msgstr "/ линија игнориÑана у %s линија %d: %s" +msgid "/ line ignored in %s line %ld: %s" +msgstr "/ линија Ñе игнорише у %s линија %ld: %s" #, c-format -msgid "Invalid region nr in %s line %d: %s" -msgstr "Ðеважећи број региона у %s линија %d: %s" +msgid "Invalid region nr in %s line %ld: %s" +msgstr "Ðеважећи број региона у %s линија %ld: %s" #, c-format -msgid "Unrecognized flags in %s line %d: %s" -msgstr "Ðепрепознати индикатори у %s линија %d: %s" +msgid "Unrecognized flags in %s line %ld: %s" +msgstr "Ðепрепознатe заÑтавице у %s линија %ld: %s" #, c-format msgid "Ignored %d words with non-ASCII characters" -msgstr "ИгнориÑано је %d рћи Ñа не-ASCII карактерима" +msgstr "ИгнориÑано је %d речи Ñа не-ASCII карактерима" msgid "E845: Insufficient memory, word list will be incomplete" msgstr "E845: Ðедовољно меморије, лиÑта речи неће бити комплетна" #, c-format -msgid "Compressed %d of %d nodes; %d (%d%%) remaining" -msgstr "КомпреÑовано је %d од %d чворова; преоÑтало је још %d (%d%%)" +msgid "Compressed %s: %ld of %ld nodes; %ld (%ld%%) remaining" +msgstr "КомпреÑовано је %s: %ld од %ld чворова; преоÑтало је још %ld (%ld%%)" msgid "Reading back spell file..." msgstr "Читање правопиÑног фајла..." @@ -5440,8 +5304,12 @@ msgid " < \"%.*s\"" msgstr " < \"%.*s\"" +#, c-format +msgid "E390: Illegal argument: %s" +msgstr "E390: Ðеважећи аргумент: %s" + msgid "No Syntax items defined for this buffer" -msgstr "СинтакÑне Ñтавке ниÑу дефиниÑане за овај бафер" +msgstr "Ðиједна ÑинтакÑна Ñтавка није дефиниÑана за овај бафер" msgid "'redrawtime' exceeded, syntax highlighting disabled" msgstr "Прекорачено је 'redrawtime', иÑтицање ÑинтакÑе је иÑкључено" @@ -5452,34 +5320,36 @@ msgid "syntax conceal off" msgstr "ÑинтакÑно Ñкривање иÑкључено" -#, c-format -msgid "E390: Illegal argument: %s" -msgstr "E390: Ðеважећи аргумент: %s" - msgid "syntax case ignore" msgstr "мала/велика Ñлова Ñе не разликују у ÑинтакÑи" msgid "syntax case match" msgstr "мала/велика Ñлова Ñе разликују у ÑинтакÑи" +msgid "syntax foldlevel start" +msgstr "ÑинтакÑни foldlevel start" + +msgid "syntax foldlevel minimum" +msgstr "ÑинтакÑни foldlevel minimum" + msgid "syntax spell toplevel" -msgstr "ÑинтакÑа правопиÑа toplevel" +msgstr "ÑинтакÑни Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ toplevel" msgid "syntax spell notoplevel" -msgstr "ÑинтакÑа правопиÑа notoplevel" +msgstr "ÑинтакÑни Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ notoplevel" msgid "syntax spell default" -msgstr "ÑинтакÑа правопиÑа подразумевано" +msgstr "ÑинтакÑни Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ Ð¿Ð¾Ð´Ñ€Ð°Ð·ÑƒÐ¼ÐµÐ²Ð°Ð½Ð¾" msgid "syntax iskeyword " -msgstr "ÑинтакÑа iskeyword " +msgstr "ÑинтакÑна iskeyword " msgid "syntax iskeyword not set" -msgstr "ÑинтакÑа iskeyword није поÑтављена" +msgstr "ÑинтакÑна iskeyword није поÑтављена" #, c-format msgid "E391: No such syntax cluster: %s" -msgstr "E391: Ðе поÑтоји такав ÑинтакÑни клаÑтер: %s" +msgstr "E391: Ðе поÑтоји таква ÑинтакÑна Ñкупина: %s" msgid "syncing on C-style comments" msgstr "Ñинхронизација на коментарима C-Ñтила" @@ -5487,6 +5357,9 @@ msgid "no syncing" msgstr "без Ñинхронизације" +msgid "syncing starts at the first line" +msgstr "Ñинхронизација почиње од прве линије" + msgid "syncing starts " msgstr "Ñинхронизација почиње " @@ -5512,12 +5385,15 @@ "--- Syntax items ---" msgstr "" "\n" -"--- Ставке ÑинтакÑе ---" +"--- СинтакÑне Ñтавке ---" #, c-format msgid "E392: No such syntax cluster: %s" msgstr "E392: не поÑтоји такав ÑинтакÑни клаÑтер: %s" +msgid "from the first line" +msgstr "од прве линије" + msgid "minimal " msgstr "минимално " @@ -5659,7 +5535,7 @@ msgstr "E429: Фајл \"%s\" не поÑтоји" msgid " # pri kind tag" -msgstr " # pri ознака врÑта" +msgstr " # при врÑта ознака" msgid "file\n" msgstr "фајл\n" @@ -5679,9 +5555,6 @@ msgid "E430: Tag file path truncated for %s\n" msgstr "E430: Путања фајла ознака је прекинута за %s\n" -msgid "Ignoring long line in tags file" -msgstr "Дугачка линија у фајлу ознака Ñе игнорише" - #, c-format msgid "E431: Format error in tags file \"%s\"" msgstr "E431: Грешка формата у фајлу ознака \"%s\"" @@ -5697,6 +5570,9 @@ msgid "E433: No tags file" msgstr "E433: Ðема фајла ознака" +msgid "Ignoring long line in tags file" +msgstr "Дугачка линија у фајлу ознака Ñе игнорише" + msgid "E434: Can't find tag pattern" msgstr "E434: Ðе може да Ñе пронађе шаблон ознаке" @@ -5802,6 +5678,9 @@ msgid "E968: Need at least one of 'id' or 'type'" msgstr "E968: Ðеопхпдан је бар један од 'id' или 'type'" +msgid "E860: Need 'id' and 'type' with 'both'" +msgstr "E860: 'id' и 'type' Ñу потребни уз 'both'" + #, c-format msgid "E969: Property type %s already defined" msgstr "E969: Тип оÑобине %s је већ дефиниÑан" @@ -5810,15 +5689,121 @@ msgid "E970: Unknown highlight group name: '%s'" msgstr "E970: Ðепознато име групе иÑтицања: '%s'" +msgid "(Invalid)" +msgstr "(ÐеиÑправно)" + +msgid "%a %b %d %H:%M:%S %Y" +msgstr "%a %b %d %H:%M:%S %Y" + +#, c-format +msgid "%ld second ago" +msgid_plural "%ld seconds ago" +msgstr[0] "пре %ld Ñекунде" +msgstr[1] "пре %ld Ñекунде" +msgstr[2] "пре %ld Ñекунди" + +msgid "E805: Using a Float as a Number" +msgstr "E805: Покретни Ñе кориÑти као Број" + +msgid "E703: Using a Funcref as a Number" +msgstr "E703: Funcref Ñе кориÑти као Број" + +msgid "E745: Using a List as a Number" +msgstr "E745: ЛиÑта Ñе кориÑти као Број" + +msgid "E728: Using a Dictionary as a Number" +msgstr "E728: Речник Ñе кориÑти као Број" + +msgid "E611: Using a Special as a Number" +msgstr "E611: Специјал Ñе кориÑти као Број" + +msgid "E910: Using a Job as a Number" +msgstr "E910: ПоÑао Ñе кориÑти као Број" + +msgid "E913: Using a Channel as a Number" +msgstr "E913: Канал Ñе кориÑти као Број" + +msgid "E974: Using a Blob as a Number" +msgstr "E974: Блоб Ñе кориÑти као Број" + +msgid "E891: Using a Funcref as a Float" +msgstr "E891: Funcref Ñе кориÑти као Покретни" + +msgid "E892: Using a String as a Float" +msgstr "E892: Стринг Ñе кориÑти као Покретни" + +msgid "E893: Using a List as a Float" +msgstr "E893: ЛиÑта Ñе кориÑти као Покретни" + +msgid "E894: Using a Dictionary as a Float" +msgstr "E894: Речник Ñе кориÑти као Покретни" + +msgid "E362: Using a boolean value as a Float" +msgstr "E362: Логичка вредноÑÑ‚ Ñе кориÑти као Покретни" + +msgid "E907: Using a special value as a Float" +msgstr "E907: Специјална вредноÑÑ‚ Ñе кориÑти као Покретни" + +msgid "E911: Using a Job as a Float" +msgstr "E911: ПоÑао Ñе кориÑти као Покретни" + +msgid "E914: Using a Channel as a Float" +msgstr "E914: Канал Ñе кориÑти као Покретни" + +msgid "E975: Using a Blob as a Float" +msgstr "E975: Блоб Ñе кориÑти као Покретни" + +msgid "E729: using Funcref as a String" +msgstr "E729: Funcref Ñе кориÑти као Стринг" + +msgid "E730: using List as a String" +msgstr "E730: ЛиÑта Ñе кориÑти као Стринг" + +msgid "E731: using Dictionary as a String" +msgstr "E731: Речник Ñе кориÑти као Стринг" + +msgid "E976: using Blob as a String" +msgstr "E976: Блоб Ñе кориÑти као Стринг" + +msgid "E977: Can only compare Blob with Blob" +msgstr "E977: Блоб може да Ñе пореди Ñамо Ñа Блоб" + +msgid "E691: Can only compare List with List" +msgstr "E691: ЛиÑта може да Ñе пореди Ñамо Ñа ЛиÑта" + +msgid "E692: Invalid operation for List" +msgstr "E692: ÐеиÑправна операција за ЛиÑту" + +msgid "E735: Can only compare Dictionary with Dictionary" +msgstr "E735: Речник може да Ñе пореди Ñамо Ñа Речником" + +msgid "E736: Invalid operation for Dictionary" +msgstr "E736: ÐеиÑправна операција за Речник" + +msgid "E694: Invalid operation for Funcrefs" +msgstr "E694: ÐеиÑправна операција за Funcrefs" + +#, c-format +msgid "E112: Option name missing: %s" +msgstr "E112: ÐедоÑтаје име опције: %s" + +msgid "E973: Blob literal should have an even number of hex characters" +msgstr "E973: Блоб литерал би требало да има паран број Ñ…ÐµÐºÑ ÐºÐ°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð°" + +#, c-format +msgid "E114: Missing quote: %s" +msgstr "E114: ÐедоÑтаје наводник: %s" + +#, c-format +msgid "E115: Missing quote: %s" +msgstr "E115: ÐедоÑтаје наводник: %s" + msgid "new shell started\n" msgstr "покренуто ново командно окружење\n" msgid "Vim: Error reading input, exiting...\n" msgstr "Vim: Грешка при читању улаза, излазак...\n" -msgid "Used CUT_BUFFER0 instead of empty selection" -msgstr "УмеÑто празне Ñелекције корићен је CUT_BUFFER0" - msgid "E881: Line count changed unexpectedly" msgstr "E881: Број линија Ñе неочекивано променио" @@ -6037,6 +6022,10 @@ msgstr "E989: Ðеподразумевани аргумент Ñледи иза подразумеваног аргумента" #, c-format +msgid "E451: Expected }: %s" +msgstr "E451: Очекује Ñе }: %s" + +#, c-format msgid "E740: Too many arguments for function %s" msgstr "E740: Превише аргумената за функцију %s" @@ -6067,22 +6056,10 @@ msgstr "E699: Сувише аргумената" #, c-format -msgid "E117: Unknown function: %s" -msgstr "E117: Ðепозната функција: %s" - -#, c-format msgid "E276: Cannot use function as a method: %s" msgstr "E276: Функција не може да Ñе кориÑти као метода: %s" #, c-format -msgid "E933: Function was deleted: %s" -msgstr "E933: Функција је обриÑана: %s" - -#, c-format -msgid "E119: Not enough arguments for function: %s" -msgstr "E119: Ðема довољно аргумената за функцију: %s" - -#, c-format msgid "E120: Using not in a script context: %s" msgstr "E120: Коришћење ван Ñкрипт контекÑта: %s" @@ -6101,6 +6078,9 @@ msgid "E884: Function name cannot contain a colon: %s" msgstr "E884: Име функције не може да Ñадржи двотачку: %s" +msgid "E454: function list was modified" +msgstr "E454: лиÑта функције је измењена" + #, c-format msgid "E123: Undefined function: %s" msgstr "E123: ÐедефиниÑана функција: %s" @@ -6120,6 +6100,10 @@ msgstr "E126: ÐедоÑтаје :endfunction" #, c-format +msgid "W1001: Text found after :enddef: %s" +msgstr "W1001: Пронађен је текÑÑ‚ након :enddef: %s" + +#, c-format msgid "W22: Text found after :endfunction: %s" msgstr "W22: Пронађен текÑÑ‚ након :endfunction: %s" @@ -6295,18 +6279,15 @@ msgid "with X11-Athena GUI." msgstr "Ñа X11-Athena ГКИ." +msgid "with Haiku GUI." +msgstr "Ñа Haiku ГКИ." + msgid "with Photon GUI." msgstr "Ñа Photon ГКИ." msgid "with GUI." msgstr "Ñа ГКИ." -msgid "with Carbon GUI." -msgstr "Ñа Carbon ГКИ." - -msgid "with Cocoa GUI." -msgstr "Ñа Cocoa ГКИ." - msgid " Features included (+) or not (-):\n" msgstr " МогућноÑти укључене (+) или не (-):\n" @@ -6433,6 +6414,21 @@ msgid "menu Help->Sponsor/Register for information " msgstr "мени Помоћ->Спонзор/РегиÑтруј Ñе за информације " +msgid "[end of lines]" +msgstr "[крај линија]" + +msgid "global" +msgstr "глобална" + +msgid "buffer" +msgstr "бафер" + +msgid "window" +msgstr "прозор" + +msgid "tab" +msgstr "картица" + msgid "" "\n" "# Buffer list:\n" @@ -6562,8 +6558,8 @@ msgstr "# ВредноÑÑ‚ опције 'encoding' када је овај фајл запиÑан\n" #, c-format -msgid "Reading viminfo file \"%s\"%s%s%s" -msgstr "Читање viminfo фајла \"%s\"%s%s%s" +msgid "Reading viminfo file \"%s\"%s%s%s%s" +msgstr "Читање viminfo фајла \"%s\"%s%s%s%s" msgid " info" msgstr " инфо" @@ -6622,17 +6618,16 @@ msgid "E444: Cannot close last window" msgstr "E444: ПоÑледњи прозор не може да Ñе затвори" -msgid "E813: Cannot close autocmd or popup window" -msgstr "E813: Прозор аутокоманде или иÑкачући прозор не може да Ñе затвори" - msgid "E814: Cannot close window, only autocmd window would remain" msgstr "" -"E814: Прозор не може да Ñе затвори, преоÑтао би једино прозор " -"аутокоманде" +"E814: Прозор не може да Ñе затвори, преоÑтао би једино прозор аутокоманде" msgid "E445: Other window contains changes" msgstr "E445: Други прозори Ñадрже измене" +msgid "E366: Not allowed to enter a popup window" +msgstr "E366: Ðије дозвољено да Ñе уђе у иÑкачући прозор" + msgid "Edit with &multiple Vims" msgstr "Уређуј Ñа &више Vim-ова" @@ -6664,766 +6659,2820 @@ msgid "Path length too long!" msgstr "Путања је предугачка!" -msgid "--No lines in buffer--" -msgstr "--У баферу нема линија--" - -msgid "E470: Command aborted" -msgstr "E470: Команда прекинута" +#, c-format +msgid "E121: Undefined variable: %s" +msgstr "E121: ÐедефиниÑана променљива: %s" -msgid "E471: Argument required" -msgstr "E471: Потребан је аргумент" +#, c-format +msgid "E121: Undefined variable: %c:%s" +msgstr "E121: ÐедефиниÑана променљива: %c:%s" -msgid "E10: \\ should be followed by /, ? or &" -msgstr "E10: Иза \\ треба да је /, ? или &" +msgid "E476: Invalid command" +msgstr "E476: Ðеважећа команда" -msgid "E11: Invalid in command-line window; executes, CTRL-C quits" -msgstr "" -"E11: Ðеважеће у прозору командне линије; извршава, CTRL-C отказује" +#, c-format +msgid "E476: Invalid command: %s" +msgstr "E476: Ðеважећа команда: %s" -msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search" -msgstr "" -"E12: ПоÑтоји забрана за команду у exrc/vimrc у текућој претрази " -"директоријума или ознаке" +msgid "E710: List value has more items than targets" +msgstr "E710: ВредноÑÑ‚ типа ЛиÑта има више Ñтавки него одредишта" -msgid "E171: Missing :endif" -msgstr "E171: ÐедоÑтаје :endif" +msgid "E711: List value does not have enough items" +msgstr "E711: ВредноÑÑ‚ типа ЛиÑта нема довољно Ñтавки" -msgid "E600: Missing :endtry" -msgstr "E600: ÐедоÑтаје :endtry" +msgid "E719: Cannot slice a Dictionary" +msgstr "E719: Речник не може да Ñе Ñече" -msgid "E170: Missing :endwhile" -msgstr "E170: ÐедоÑтаје :endwhile" +msgid "" +"E856: \"assert_fails()\" second argument must be a string or a list with one " +"or two strings" +msgstr "" +"E856: \"assert_fails()\" други аргумент мора бити Ñтринг или лиÑта Ñа једним " +"или два Ñтринга" -msgid "E170: Missing :endfor" -msgstr "E170: ÐедоÑтаје :endfor" +msgid "E909: Cannot index a special variable" +msgstr "E909: Специјална променљива не може да Ñе индекÑира" -msgid "E588: :endwhile without :while" -msgstr "E588: :endwhile без :while" +#, c-format +msgid "E1100: Missing :var: %s" +msgstr "E1100: ÐедоÑтаје :var: %s" -msgid "E588: :endfor without :for" -msgstr "E588: :endfor без :for" +#, c-format +msgid "E1001: Variable not found: %s" +msgstr "E1001: Променљива није пронађена: %s" -msgid "E13: File exists (add ! to override)" -msgstr "E13: Фајл поÑтоји (додајте ! за премошћавање)" +#, c-format +msgid "E1002: Syntax error at %s" +msgstr "E1002: СинтакÑна грешка код %s" -msgid "E472: Command failed" -msgstr "E472: Команда није уÑпела" +msgid "E1003: Missing return value" +msgstr "E1003: ÐедоÑтаје повратна вредноÑÑ‚" #, c-format -msgid "E234: Unknown fontset: %s" -msgstr "E234: Ðепознат fontset: %s" +msgid "E1004: White space required before and after '%s'" +msgstr "E1004: Ðеопходан је празан проÑтор иÑпред и иза '%s'" -#, c-format -msgid "E235: Unknown font: %s" -msgstr "E235: Ðепознат фонт: %s" +msgid "E1005: Too many argument types" +msgstr "E1005: Сувише типова аргумената" #, c-format -msgid "E236: Font \"%s\" is not fixed-width" -msgstr "E236: Фонт \"%s\" није фикÑне ширине" +msgid "E1006: %s is used as an argument" +msgstr "E1006: %s је употребљено као аргумент" -msgid "E473: Internal error" -msgstr "E473: Интерна грешка" +msgid "E1007: Mandatory argument after optional argument" +msgstr "E1007: Обавезни аргумент након необавезног аргумента" -#, c-format -msgid "E685: Internal error: %s" -msgstr "E685: Интерна грешка: %s" +msgid "E1008: Missing " +msgstr "E1008: ÐедоÑтаје " -msgid "Interrupted" -msgstr "Прекинуто" +msgid "E1009: Missing > after type" +msgstr "E1009: ÐедоÑтаје > након type" -msgid "E474: Invalid argument" -msgstr "E474: Ðеважећи аргумент" +#, c-format +msgid "E1010: Type not recognized: %s" +msgstr "E1010: Тип Ñе не препознаје: %s" #, c-format -msgid "E475: Invalid argument: %s" -msgstr "E475: Ðеважећи аргумент: %s" +msgid "E1011: Name too long: %s" +msgstr "E1011: Предугачко име: %s" #, c-format -msgid "E983: Duplicate argument: %s" -msgstr "E983: Дуплирани аргумент: %s" +msgid "E1012: Type mismatch; expected %s but got %s" +msgstr "E1012: Ðеодговарајући тип; очекује Ñе %s али је наведено %s" #, c-format -msgid "E475: Invalid value for argument %s" -msgstr "E475: Ðеважећa вредноÑÑ‚ за аргумент: %s" +msgid "E1013: Argument %d: type mismatch, expected %s but got %s" +msgstr "" +"E1013: Ðргумент %d: неодговарајући тип, очекује Ñе %s али је наведено %s" #, c-format -msgid "E475: Invalid value for argument %s: %s" -msgstr "E475: Ðеважећa вредноÑÑ‚ за аргумент %s: %s" +msgid "E1014: Invalid key: %s" +msgstr "E1014: Ðеважећи кључ: %s" #, c-format -msgid "E15: Invalid expression: %s" -msgstr "E15: Ðеважећи израз: %s" +msgid "E1015: Name expected: %s" +msgstr "E1015: Очекује Ñе име: %s" -msgid "E16: Invalid range" -msgstr "E16: Ðеважећи опÑег" +#, c-format +msgid "E1016: Cannot declare a %s variable: %s" +msgstr "E1016: Ðе може да Ñе декларише %s променљива: %s" -msgid "E476: Invalid command" -msgstr "E476: Ðеважећа команда" +#, c-format +msgid "E1016: Cannot declare an environment variable: %s" +msgstr "E1016: Ðе може да Ñе декларише променљива окружења: %s" #, c-format -msgid "E17: \"%s\" is a directory" -msgstr "E17: \"%s\" је директоријум" +msgid "E1017: Variable already declared: %s" +msgstr "E1017: Променљива је већ деклариÑана: %s" #, c-format -msgid "E364: Library call failed for \"%s()\"" -msgstr "E364: Позив библиотеке није уÑпео за \"%s()\"" +msgid "E1018: Cannot assign to a constant: %s" +msgstr "E1018: КонÑтанти не Ñме да Ñе додељује: %s" -msgid "E667: Fsync failed" -msgstr "E667: Fsync није уÑпео" +msgid "E1019: Can only concatenate to string" +msgstr "E1019: Може да Ñе надовеже Ñамо у Ñтринг" #, c-format -msgid "E448: Could not load library function %s" -msgstr "E448: Библиотечка функција %s није могла да Ñе учита" +msgid "E1020: Cannot use an operator on a new variable: %s" +msgstr "E1020: Оператор не може да Ñе употреби над новом променљивом: %s" -msgid "E19: Mark has invalid line number" -msgstr "E19: Маркер Ñадржи неиÑправан број линије" +msgid "E1021: Const requires a value" +msgstr "E1021: Const захтева вредноÑÑ‚" -msgid "E20: Mark not set" -msgstr "E20: Маркер није поÑтављен" +msgid "E1022: Type or initialization required" +msgstr "E1022: Потребан је тип или иницијализација" -msgid "E21: Cannot make changes, 'modifiable' is off" -msgstr "E21: Измене не могу да Ñе учине, опција 'modifiable' је иÑкључена" +#, c-format +msgid "E1023: Using a Number as a Bool: %d" +msgstr "E1023: Број Ñе кориÑти као Логичка: %d" -msgid "E22: Scripts nested too deep" -msgstr "E22: Скрипте Ñу предубоко угњеждене" +msgid "E1024: Using a Number as a String" +msgstr "E1024: Број Ñе кориÑти као Стринг" -msgid "E23: No alternate file" -msgstr "E23: Ðема алтернативног фајла" +msgid "E1025: Using } outside of a block scope" +msgstr "E1025: } Ñе кориÑти ван опÑега важења блока" -msgid "E24: No such abbreviation" -msgstr "E24: Таква Ñкраћеница не поÑтоји" +msgid "E1026: Missing }" +msgstr "E1026: ÐедоÑтаје }" -msgid "E477: No ! allowed" -msgstr "E477: ! није дозвољен" +msgid "E1027: Missing return statement" +msgstr "E1027: ÐедоÑтаје наредба повратка" -msgid "E25: GUI cannot be used: Not enabled at compile time" -msgstr "E25: ГКИ не може да Ñе кориÑти: Ðије омогућен у време компилације" +msgid "E1028: Compiling :def function failed" +msgstr "E1028: Компајлирање :def функције није уÑпело" -msgid "E26: Hebrew cannot be used: Not enabled at compile time\n" -msgstr "" -"E26: хебрејÑки не може да Ñе кориÑти: Ðије омогућен у време компилације\n" +#, c-format +msgid "E1029: Expected %s but got %s" +msgstr "E1029: Очекује Ñе %s али је наведено %s" -msgid "E27: Farsi support has been removed\n" -msgstr "E27: Подршка за фарÑи је уклоњена\n" +#, c-format +msgid "E1030: Using a String as a Number: \"%s\"" +msgstr "E1030: Стринг Ñе кориÑти као Број: \"%s\"" -msgid "E800: Arabic cannot be used: Not enabled at compile time\n" -msgstr "" -"E800: арапÑки не може да Ñе кориÑти: Ðије омогућен у време компилације\n" +msgid "E1031: Cannot use void value" +msgstr "E1031: Ðе може да Ñе употреби празна вредноÑÑ‚" -#, c-format -msgid "E28: No such highlight group name: %s" -msgstr "E28: Ðема групе иÑтицања Ñа таквим именом: %s" +msgid "E1032: Missing :catch or :finally" +msgstr "E1032: ÐедоÑтаје :catch или :finally" -msgid "E29: No inserted text yet" -msgstr "E29: ТекÑÑ‚ још није унет" +msgid "E1033: Catch unreachable after catch-all" +msgstr "E1033: Catch не може да Ñе доÑегне након catch-all" -msgid "E30: No previous command line" -msgstr "E30: Ðема претходне командне линије" +#, c-format +msgid "E1034: Cannot use reserved name %s" +msgstr "E1034: Ðе може да Ñе употреби резервиÑано име %s" -msgid "E31: No such mapping" -msgstr "E31: Такво мапирање не поÑтоји" +msgid "E1035: % requires number arguments" +msgstr "E1035: % захтева аргументе типа Број" -msgid "E479: No match" -msgstr "E479: Ðема подударања" +#, c-format +msgid "E1036: %c requires number or float arguments" +msgstr "E1036: %c захтева аргументе типа Број или Покретни" #, c-format -msgid "E480: No match: %s" -msgstr "E480: Ðема подударања: %s" +msgid "E1037: Cannot use \"%s\" with %s" +msgstr "E1037: \"%s\" не може да Ñе кориÑти Ñа %s" -msgid "E32: No file name" -msgstr "E32: Ðема имена фајла" +msgid "E1038: \"vim9script\" can only be used in a script" +msgstr "E1038: \"vim9script\" може да Ñе кориÑти Ñамо у Ñкрипти" -msgid "E33: No previous substitute regular expression" -msgstr "E33: Ðема претходног регуларног израза за замену" +msgid "E1039: \"vim9script\" must be the first command in a script" +msgstr "E1039: \"vim9script\" мора да буде прва команда у Ñкрипти" -msgid "E34: No previous command" -msgstr "E34: Ðема претходне команде" +msgid "E1040: Cannot use :scriptversion after :vim9script" +msgstr "E1040: :scriptversion не може да Ñе употреби након :vim9script" -msgid "E35: No previous regular expression" -msgstr "E35: Ðема претходног регуларног израза" +#, c-format +msgid "E1041: Redefining script item %s" +msgstr "E1041: РедефиниÑање Ñкрипт Ñтавке %s" -msgid "E481: No range allowed" -msgstr "E481: ОпÑег није дозвољен" +msgid "E1042: Export can only be used in vim9script" +msgstr "E1042: Export може да Ñе кориÑти Ñамо у vim9script" -msgid "E36: Not enough room" -msgstr "E36: Ðема довољно проÑтора" +msgid "E1043: Invalid command after :export" +msgstr "E1043: Ðеважећа команда након :export" -#, c-format -msgid "E247: no registered server named \"%s\"" -msgstr "E247: нема региÑтованог Ñервера под именом \"%s\"" +msgid "E1044: Export with invalid argument" +msgstr "E1044: Export Ñа неважећим аргументом" -#, c-format -msgid "E482: Can't create file %s" -msgstr "E482: Фајл %s не може да Ñе креира" +msgid "E1045: Missing \"as\" after *" +msgstr "E1045: ÐедоÑтаје \"as\" након *" -msgid "E483: Can't get temp file name" -msgstr "E483: Име привременог фајла не може да Ñе добије" +msgid "E1046: Missing comma in import" +msgstr "E1046: ÐедоÑтаје зарез у import" + +msgid "E1047: Syntax error in import" +msgstr "E1047: СинтакÑна грешка у import" #, c-format -msgid "E484: Can't open file %s" -msgstr "E484: Фајл %s не може да Ñе отвори" +msgid "E1048: Item not found in script: %s" +msgstr "E1048: Ставка није пронађена у Ñкрипти: %s" #, c-format -msgid "E485: Can't read file %s" -msgstr "E485: Фајл %s не може да Ñе прочита" +msgid "E1049: Item not exported in script: %s" +msgstr "E1049: Ставка није екÑпортована у Ñкрипт: %s" -msgid "E38: Null argument" -msgstr "E38: Празан аргумент" +msgid "E1050: Colon required before a range" +msgstr "E1050: ИÑпред опÑега је неопходна двотачка" -msgid "E39: Number expected" -msgstr "E39: Очекује Ñе број" +msgid "E1051: Wrong argument type for +" +msgstr "E1051: Погрешан тип аргумента за +" #, c-format -msgid "E40: Can't open errorfile %s" -msgstr "E40: Фајл грешке %s не може да Ñе отвори" +msgid "E1052: Cannot declare an option: %s" +msgstr "E1052: Опција не може да Ñе декларише: %s" -msgid "E233: cannot open display" -msgstr "E233: приказ не може да Ñе отвори" +#, c-format +msgid "E1053: Could not import \"%s\"" +msgstr "E1053: \"%s\" није могло да Ñе увезе" -msgid "E41: Out of memory!" -msgstr "E41: Ðема више меморије!" +#, c-format +msgid "E1054: Variable already declared in the script: %s" +msgstr "E1054: Променљива је већ деклариÑана у Ñкрипти: %s" -msgid "Pattern not found" -msgstr "Шаблон није пронађен" +# +msgid "E1055: Missing name after ..." +msgstr "E1055: ÐедоÑтаје име након ..." #, c-format -msgid "E486: Pattern not found: %s" -msgstr "E486: Шаблон није пронађен: %s" +msgid "E1056: Expected a type: %s" +msgstr "E1056: Очекивао Ñе тип: %s" -msgid "E487: Argument must be positive" -msgstr "E487: Ðргумент мора бити позитиван" +msgid "E1057: Missing :enddef" +msgstr "E1057: ÐедоÑтаје :enddef" -msgid "E459: Cannot go back to previous directory" -msgstr "E459: Ðе може да Ñе оде назад на претходни директоријум" +msgid "E1058: Function nesting too deep" +msgstr "E1058: Угњеждавање функције је Ñувише дубоко" -msgid "E42: No Errors" -msgstr "E42: Ðема грешака" +#, c-format +msgid "E1059: No white space allowed before colon: %s" +msgstr "E1059: ИÑпред двотачке није дозвољен празан проÑтор: %s" -msgid "E776: No location list" -msgstr "E776: Ðема лиÑте локација" +#, c-format +msgid "E1060: Expected dot after name: %s" +msgstr "E1060: Очекује Ñе тачка иза имена: %s" -msgid "E43: Damaged match string" -msgstr "E43: Оштећен Ñтринг за подударање" +#, c-format +msgid "E1061: Cannot find function %s" +msgstr "E1061: Ðе може да Ñе пронађе функција %s" -msgid "E44: Corrupted regexp program" -msgstr "E44: regexp програм је покварен" +msgid "E1062: Cannot index a Number" +msgstr "E1062: Број не може да Ñе индекÑира" -msgid "E45: 'readonly' option is set (add ! to override)" -msgstr "E45: ПоÑтављена је 'readonly' опција (додајте ! за премошћавање)" +msgid "E1063: Type mismatch for v: variable" +msgstr "E1063: Ðеодговарајући тип за v: променљиву" #, c-format -msgid "E121: Undefined variable: %s" -msgstr "E121: ÐедефиниÑана променљива: %s" +msgid "E1066: Cannot declare a register: %s" +msgstr "E1066: РегиÑтар не може да Ñе декларише: %s" #, c-format -msgid "E734: Wrong variable type for %s=" -msgstr "E734: Погрешан тип променљиве за %s=" +msgid "E1067: Separator mismatch: %s" +msgstr "E1067: Граничници Ñе не подударају: %s" #, c-format -msgid "E461: Illegal variable name: %s" -msgstr "E461: Ðедозвољено име променљиве: %s" +msgid "E1068: No white space allowed before '%s'" +msgstr "E1068: Ðије дозвољен празан проÑтор иÑпред '%s'" -msgid "E995: Cannot modify existing variable" -msgstr "E995: ПоÑтојећа променљива не може да Ñе измени" +#, c-format +msgid "E1069: White space required after '%s'" +msgstr "E1069: Потребан је празан проÑтор након '%s'" + +msgid "E1070: Missing \"from\"" +msgstr "E1070: ÐедоÑтаје \"from\"" + +msgid "E1071: Invalid string after \"from\"" +msgstr "E1071: Ðеважећи Ñтринг након \"from\"" #, c-format -msgid "E46: Cannot change read-only variable \"%s\"" -msgstr "E46: Променљива Ñамо за читање \"%s\" не може да Ñе измени" +msgid "E1072: Cannot compare %s with %s" +msgstr "E1072: Ðе може да Ñе пореди %s Ñа %s" #, c-format -msgid "E794: Cannot set variable in the sandbox: \"%s\"" -msgstr "E794: Ðе може да Ñе поÑтави променљива у sandbox-у: \"%s\"" +msgid "E1073: Name already defined: %s" +msgstr "E1073: Име је већ дефиниÑано: %s" -msgid "E928: String required" -msgstr "E928: Захтева Ñе String" +msgid "E1074: No white space allowed after dot" +msgstr "E1074: ИÑпред тачке није дозвољен празан проÑтор" -msgid "E713: Cannot use empty key for Dictionary" -msgstr "E713: Ðе може да Ñе кориÑти празан кључ за Речник" +#, c-format +msgid "E1075: Namespace not supported: %s" +msgstr "E1075: Ðије подржан проÑтор имена: %s" -msgid "E715: Dictionary required" -msgstr "E715: Потребан Речник" +msgid "E1076: This Vim is not compiled with float support" +msgstr "E1076: Овај Vim није компајлиран Ñа подршком за Покретни" #, c-format -msgid "E684: list index out of range: %ld" -msgstr "E684: Ð¸Ð½Ð´ÐµÐºÑ Ð»Ð¸Ñте је ван опÑега: %ld" +msgid "E1077: Missing argument type for %s" +msgstr "E1077: ÐедоÑтаје тип аргумента за %s" #, c-format -msgid "E979: Blob index out of range: %ld" -msgstr "E979: Ð˜Ð½Ð´ÐµÐºÑ Blob-а је ван опÑега: %ld" +msgid "E1081: Cannot unlet %s" +msgstr "E1081: Ðе може да Ñе уради unlet %s" -msgid "E978: Invalid operation for Blob" -msgstr "E978: ÐеиÑправна операција за Blob" +#, c-format +msgid "E1082: Cannot use a namespaced variable: %s" +msgstr "E1082: Ðе може да Ñе кориÑти променљива Ñа проÑтором имена: %s" + +msgid "E1083: Missing backtick" +msgstr "E1083: ÐедоÑтаје краткоузлазни акценат" #, c-format -msgid "E118: Too many arguments for function: %s" -msgstr "E118: Превише аргумената за функцију: %s" +msgid "E1084: Cannot delete Vim9 script function %s" +msgstr "E1084: Vim9 Ñкрипт функција не може да Ñе обрише %s" #, c-format -msgid "E716: Key not present in Dictionary: %s" -msgstr "E716: У Речнику нема кључа: %s" +msgid "E1085: Not a callable type: %s" +msgstr "E1085: Тип који не може да Ñе позива: %s" -msgid "E714: List required" -msgstr "E714: Потребна ЛиÑта" +msgid "E1086: Cannot use :function inside :def" +msgstr "E1086: :function не може да Ñе кориÑти унутар :def" -msgid "E897: List or Blob required" -msgstr "E897: Потребна је ЛиÑта или Blob" +msgid "E1087: Cannot use an index when declaring a variable" +msgstr "E1087: Ðије дозвољена употреба индекÑа када Ñе декларише променљива" #, c-format -msgid "E712: Argument of %s must be a List or Dictionary" -msgstr "E712: Ðргумент за %s мора бити ЛиÑта или Речник" +msgid "E1089: Unknown variable: %s" +msgstr "E1089: Ðепозната променљива: %s" #, c-format -msgid "E896: Argument of %s must be a List, Dictionary or Blob" -msgstr "E896: Ðргумент за %s мора бити ЛиÑта, Речник или Blob" +msgid "E1090: Cannot assign to argument %s" +msgstr "E1090: Ðе може да Ñе врши додела аргументу %s" -msgid "E47: Error while reading errorfile" -msgstr "E47: Грешка приликом читања фајла грешке" +#, c-format +msgid "E1091: Function is not compiled: %s" +msgstr "E1091: Функција није компајлирана: %s" -msgid "E48: Not allowed in sandbox" -msgstr "E48: Ðије дозвољено у sandbox-у" +msgid "E1092: Cannot use a list for a declaration" +msgstr "E1092: ЛиÑта не може да Ñе кориÑти за декларацију" -msgid "E523: Not allowed here" -msgstr "E523: Ðије дозвољено овде" +#, c-format +msgid "E1093: Expected %d items but got %d" +msgstr "E1093: Очекује Ñе %d Ñтавки али је наведено %d" -msgid "E359: Screen mode setting not supported" -msgstr "E359: Подешавање режима екрана није подржано" +msgid "E1094: Import can only be used in a script" +msgstr "E1094: Import може да Ñе употреби Ñамо у Ñкрипти" -msgid "E49: Invalid scroll size" -msgstr "E49: Ðеважећа величина линије за Ñкроловање" +msgid "E1095: Unreachable code after :return" +msgstr "E1095: Код не може да Ñе доÑегне након :return" -msgid "E91: 'shell' option is empty" -msgstr "E91: Опција 'shell' је празна" +msgid "E1096: Returning a value in a function without a return type" +msgstr "E1096: Враћа Ñе вредноÑÑ‚ из функције без наведеног повратног типа" -msgid "E255: Couldn't read in sign data!" -msgstr "E255: Подаци за знак ниÑу могли да Ñе прочитају!" +msgid "E1097: Line incomplete" +msgstr "E1097: Линија није комплетна" -msgid "E72: Close error on swap file" -msgstr "E72: Грешка код затварања swap фајла" +#, c-format +msgid "E1099: Unknown error while executing %s" +msgstr "E1099: Ðепозната грешка током извршавања %s" -msgid "E73: tag stack empty" -msgstr "E73: Ñтек ознака је празан" +#, c-format +msgid "E1101: Cannot declare a script variable in a function: %s" +msgstr "E1101: У функцији не може да Ñе декларише Ñкрипт променљива: %s" -msgid "E74: Command too complex" -msgstr "E74: Команда је Ñувише комплекÑна" +#, c-format +msgid "E1102: Lambda function not found: %s" +msgstr "E1102: Ðије пронађена ламбда функција: %s" -msgid "E75: Name too long" -msgstr "E75: Име је предугачко" +msgid "E1103: Dictionary not set" +msgstr "E1103: Речник није поÑтављен" -msgid "E76: Too many [" -msgstr "E76: Превише [" +msgid "E1104: Missing >" +msgstr "E1104: ÐедоÑтаје >" -msgid "E77: Too many file names" -msgstr "E77: Превише имена фајлова" +#, c-format +msgid "E1105: Cannot convert %s to string" +msgstr "E1105: %s не може да Ñе ковертује у Ñтринг" -msgid "E488: Trailing characters" -msgstr "E488: Карактери вишка на крају" +msgid "E1106: One argument too many" +msgstr "E1106: Један аргумент вишка" -msgid "E78: Unknown mark" -msgstr "E78: Ðепознат маркер" +#, c-format +msgid "E1106: %d arguments too many" +msgstr "E1106: %d аргумената вишка" -msgid "E79: Cannot expand wildcards" -msgstr "E79: Ðокери не могу да Ñе развију" +msgid "E1107: String, List, Dict or Blob required" +msgstr "E1107: Потребан је Стринг ЛиÑта, Речн или Блоб" -msgid "E591: 'winheight' cannot be smaller than 'winminheight'" -msgstr "E591: 'winheight' не може да буде мање од 'winminheight'" +#, c-format +msgid "E1108: Item not found: %s" +msgstr "E1108: Ставка није пронађена: %s" -msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'" -msgstr "E592: 'winwidth' не може да буде мање од 'winminwidth'" +#, c-format +msgid "E1109: List item %d is not a List" +msgstr "E1109: Ставка лиÑте %d није ЛиÑта" -msgid "E80: Error while writing" -msgstr "E80: Грешка приликом упиÑа" +#, c-format +msgid "E1110: List item %d does not contain 3 numbers" +msgstr "E1110: Ставка лиÑте %d не Ñадржи 3 броја" -msgid "E939: Positive count required" -msgstr "E939: Потребан је позитиван број" +#, c-format +msgid "E1111: List item %d range invalid" +msgstr "E1111: ОпÑег Ñтавке лиÑте %d је неважћи" -msgid "E81: Using not in a script context" -msgstr "E81: Ñе кориÑти ван Ñкрипт контекÑта" +#, c-format +msgid "E1112: List item %d cell width invalid" +msgstr "E1112: Ширина ћелије Ñтавке лиÑте %d је неважећа" #, c-format -msgid "E107: Missing parentheses: %s" -msgstr "E107: ÐедоÑтају заграде: %s" +msgid "E1113: Overlapping ranges for 0x%lx" +msgstr "E1113: ОпÑези за 0x%lx Ñе преклапају" -msgid "E449: Invalid expression received" -msgstr "E449: Примљен је неважећи израз" +msgid "E1114: Only values of 0x100 and higher supported" +msgstr "E1114: Подржавају Ñе Ñамо вредноÑти од 0x100 и веће" -msgid "E463: Region is guarded, cannot modify" -msgstr "E463: Регион је чуван, измена није могућа" +msgid "E1115: \"assert_fails()\" fourth argument must be a number" +msgstr "E1115: \"assert_fails()\" четврти аргумент мора бити број" -msgid "E744: NetBeans does not allow changes in read-only files" -msgstr "" -"E744: NetBeans не дозвољава измене на фајловима који Ñмеју Ñамо да Ñе читају" +msgid "E1116: \"assert_fails()\" fifth argument must be a string" +msgstr "E1116: \"assert_fails()\" пети аргумент мора бити Ñтринг" -msgid "E363: pattern uses more memory than 'maxmempattern'" -msgstr "E363: шаблон кориÑти више меморије од 'maxmempattern'" +msgid "E1117: Cannot use ! with nested :def" +msgstr "E1117: ! не може да Ñе кориÑти Ñа угњежденим :def" -msgid "E749: empty buffer" -msgstr "E749: празан бафер" +msgid "E1118: Cannot change list" +msgstr "E1118: ЛиÑта не може да Ñе измени" -#, c-format -msgid "E86: Buffer %ld does not exist" -msgstr "E86: Бафер %ld не поÑтоји" +msgid "E1119: Cannot change list item" +msgstr "E1119: Ставка лиÑте не може да Ñе измени" -msgid "E682: Invalid search pattern or delimiter" -msgstr "E682: Ðеважећи шаблон претраге или раздвојни карактер" +msgid "E1120: Cannot change dict" +msgstr "E1120: Речн не може да Ñе измени" -msgid "E139: File is loaded in another buffer" -msgstr "E139: Фајл је учитан у други бафер" +msgid "E1121: Cannot change dict item" +msgstr "E1121: Ставка речн не може да Ñе измени" #, c-format -msgid "E764: Option '%s' is not set" -msgstr "E764: Опција '%s' није поÑтављена" - -msgid "E850: Invalid register name" -msgstr "E850: Ðеважеће име региÑтра" +msgid "E1122: Variable is locked: %s" +msgstr "E1122: Променљива је закључана: %s" #, c-format -msgid "E919: Directory not found in '%s': \"%s\"" -msgstr "E919: Ðије пронађен директоријум у '%s': \"%s\"" +msgid "E1123: Missing comma before argument: %s" +msgstr "E1123: ÐедоÑтаје зарез иÑпред аргумента: %s" -msgid "E952: Autocommand caused recursive behavior" -msgstr "E952: Ðутокомандa je изазвала рекурзивно понашање" +#, c-format +msgid "E1124: \"%s\" cannot be used in legacy Vim script" +msgstr "E1124: \"%s\" не може да Ñе кориÑти у заÑтарелом Vim Ñкрипту" -msgid "E328: Menu only exists in another mode" -msgstr "E328: Мени поÑтоји Ñамо у другом режиму" +msgid "E1125: Final requires a value" +msgstr "E1125: Final захтева вредноÑÑ‚" +msgid "E1126: Cannot use :let in Vim9 script" +msgstr "E1126: :let не може да Ñе кориÑти у Vim9 Ñкрипти" -msgid "E957: Invalid window number" -msgstr "E957: ÐеиÑправан број прозора" +msgid "E1127: Missing name after dot" +msgstr "E1127: ÐедоÑтаје име иза тачке" -#, c-format -msgid "E686: Argument of %s must be a List" -msgstr "E686: Ðргумент за %s мора бити ЛиÑта" +msgid "E1128: } without {" +msgstr "E1128: } без {" -msgid "search hit TOP, continuing at BOTTOM" -msgstr "претрага је доÑтигла ВРХ, наÑтавља Ñе од ДÐÐ" +msgid "E1129: Throw with empty string" +msgstr "E1129: Throw Ñа празним Ñтрингом" -msgid "search hit BOTTOM, continuing at TOP" -msgstr "претрага је доÑтигла ДÐО, наÑтавља Ñе од ВРХÐ" +msgid "E1130: Cannot add to null list" +msgstr "E1130: null не може да Ñе дода лиÑти" -#, c-format -msgid "Need encryption key for \"%s\"" -msgstr "Потребан је кључ за шифровање \"%s\"" +msgid "E1131: Cannot add to null blob" +msgstr "E1131: Ðе може да Ñе дода на null блоб" -msgid "empty keys are not allowed" -msgstr "празни кључеви ниÑу дозвољени" +msgid "E1132: Missing function argument" +msgstr "E1132: ÐедоÑтаје аргумент функције" -msgid "dictionary is locked" -msgstr "речник је закључан" +msgid "E1133: Cannot extend a null dict" +msgstr "E1133: Ðе може да Ñе прошири null речн" -msgid "list is locked" -msgstr "лиÑта је закључана" +msgid "E1134: Cannot extend a null list" +msgstr "E1134: Ðе може да Ñе прошири null лиÑта" #, c-format -msgid "failed to add key '%s' to dictionary" -msgstr "кључ '%s' није могао да Ñе дода у речник" +msgid "E1135: Using a String as a Bool: \"%s\"" +msgstr "E1135: Стринг Ñе кориÑти као Логичка: \"%s\"" -#, c-format -msgid "index must be int or slice, not %s" -msgstr "index мора бити типа int или slice, не %s" +msgid "E1135: mapping must end with " +msgstr "E1135: мапирање мора да Ñе заврши Ñа " -#, c-format -msgid "expected str() or unicode() instance, but got %s" -msgstr "очекивала Ñе инÑтанца str() или unicode(), али је добијена %s" +msgid "E1136: mapping must end with before second " +msgstr "E1136: мапирање мора да Ñе заврђи Ñа пре другог " #, c-format -msgid "expected bytes() or str() instance, but got %s" -msgstr "очекивала Ñе инÑтанца bytes() или str(), али је добијена %s" +msgid "E1137: mapping must not include %s key" +msgstr "E1137: мапирање не Ñме да има таÑтер %s" -#, c-format -msgid "" -"expected int(), long() or something supporting coercing to long(), but got %s" -msgstr "" -"очекивало Ñе int(), long() или нешто што подржава Ñпајање Ñа long(), али је " -"добијено %s" +msgid "E1138: Using a Bool as a Number" +msgstr "E1138: Логичка Ñе кориÑти као Број" -#, c-format -msgid "expected int() or something supporting coercing to int(), but got %s" -msgstr "" -"очекивало Ñе int() или нешто што подржава Ñпајање Ñа int(), али је добијено " -"%s" +msgid "E1139: Missing matching bracket after dict key" +msgstr "E1139: ÐедоÑтаје одговарајућа заграда након кључа речн" -msgid "value is too large to fit into C int type" -msgstr "вредноÑÑ‚ је Ñувише велика да Ñе ÑмеÑти у C int тип" +msgid "E1140: For argument must be a sequence of lists" +msgstr "E1140: For аргумент мора бити низ лиÑти" -msgid "value is too small to fit into C int type" -msgstr "вредноÑÑ‚ је Ñувише мала да Ñе ÑмеÑти у C int тип" +msgid "--No lines in buffer--" +msgstr "--У баферу нема линија--" -msgid "number must be greater than zero" -msgstr "број мора бити већи од нуле" +msgid "E470: Command aborted" +msgstr "E470: Команда прекинута" -msgid "number must be greater or equal to zero" -msgstr "број мора бити већи од или једнак нули" +msgid "E471: Argument required" +msgstr "E471: Потребан је аргумент" -msgid "can't delete OutputObject attributes" -msgstr "атрибути OutputObject не могу да Ñе обришу" +msgid "E10: \\ should be followed by /, ? or &" +msgstr "E10: Иза \\ треба да је /, ? или &" -#, c-format -msgid "invalid attribute: %s" -msgstr "неважећи атрибут: %s" +msgid "E11: Invalid in command-line window; executes, CTRL-C quits" +msgstr "" +"E11: Ðеважеће у прозору командне линије; извршава, CTRL-C отказује" -msgid "E264: Python: Error initialising I/O objects" -msgstr "E264: Python: Грешка код иницијализације У/И објеката" +msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search" +msgstr "" +"E12: ПоÑтоји забрана за команду у exrc/vimrc у текућој претрази " +"директоријума или ознаке" + +msgid "E171: Missing :endif" +msgstr "E171: ÐедоÑтаје :endif" + +msgid "E603: :catch without :try" +msgstr "E603: :catch без :try" + +msgid "E606: :finally without :try" +msgstr "E606: :finally без :try" + +msgid "E607: multiple :finally" +msgstr "E607: вишеÑтруко :finally" + +msgid "E600: Missing :endtry" +msgstr "E600: ÐедоÑтаје :endtry" + +msgid "E602: :endtry without :try" +msgstr "E602: :endtry без :try" + +msgid "E170: Missing :endwhile" +msgstr "E170: ÐедоÑтаје :endwhile" + +msgid "E170: Missing :endfor" +msgstr "E170: ÐедоÑтаје :endfor" + +msgid "E588: :endwhile without :while" +msgstr "E588: :endwhile без :while" + +msgid "E588: :endfor without :for" +msgstr "E588: :endfor без :for" + +msgid "E13: File exists (add ! to override)" +msgstr "E13: Фајл поÑтоји (додајте ! за премошћавање)" + +msgid "E472: Command failed" +msgstr "E472: Команда није уÑпела" + +#, c-format +msgid "E234: Unknown fontset: %s" +msgstr "E234: Ðепознат fontset: %s" + +#, c-format +msgid "E235: Unknown font: %s" +msgstr "E235: Ðепознат фонт: %s" + +#, c-format +msgid "E236: Font \"%s\" is not fixed-width" +msgstr "E236: Фонт \"%s\" није фикÑне ширине" + +msgid "E473: Internal error" +msgstr "E473: Интерна грешка" + +#, c-format +msgid "E685: Internal error: %s" +msgstr "E685: Интерна грешка: %s" + +msgid "Interrupted" +msgstr "Прекинуто" + +msgid "E474: Invalid argument" +msgstr "E474: Ðеважећи аргумент" + +#, c-format +msgid "E475: Invalid argument: %s" +msgstr "E475: Ðеважећи аргумент: %s" + +#, c-format +msgid "E983: Duplicate argument: %s" +msgstr "E983: Дуплирани аргумент: %s" + +#, c-format +msgid "E475: Invalid value for argument %s" +msgstr "E475: Ðеважећa вредноÑÑ‚ за аргумент: %s" + +#, c-format +msgid "E475: Invalid value for argument %s: %s" +msgstr "E475: Ðеважећa вредноÑÑ‚ за аргумент %s: %s" + +#, c-format +msgid "E15: Invalid expression: %s" +msgstr "E15: Ðеважећи израз: %s" + +msgid "E16: Invalid range" +msgstr "E16: Ðеважећи опÑег" + +#, c-format +msgid "E17: \"%s\" is a directory" +msgstr "E17: \"%s\" је директоријум" + +msgid "E756: Spell checking is not possible" +msgstr "E756: Провера правопиÑа није могућа" + +#, c-format +msgid "E364: Library call failed for \"%s()\"" +msgstr "E364: Позив библиотеке није уÑпео за \"%s()\"" + +msgid "E667: Fsync failed" +msgstr "E667: Fsync није уÑпео" + +#, c-format +msgid "E448: Could not load library function %s" +msgstr "E448: Библиотечка функција %s није могла да Ñе учита" + +msgid "E19: Mark has invalid line number" +msgstr "E19: Маркер Ñадржи неиÑправан број линије" + +msgid "E20: Mark not set" +msgstr "E20: Маркер није поÑтављен" + +msgid "E21: Cannot make changes, 'modifiable' is off" +msgstr "E21: Измене не могу да Ñе учине, опција 'modifiable' је иÑкључена" + +msgid "E22: Scripts nested too deep" +msgstr "E22: Скрипте Ñу предубоко угњеждене" + +msgid "E23: No alternate file" +msgstr "E23: Ðема алтернативног фајла" + +msgid "E24: No such abbreviation" +msgstr "E24: Таква Ñкраћеница не поÑтоји" + +msgid "E477: No ! allowed" +msgstr "E477: ! није дозвољен" + +msgid "E25: GUI cannot be used: Not enabled at compile time" +msgstr "E25: ГКИ не може да Ñе кориÑти: Ðије омогућен у време компилације" + +msgid "E26: Hebrew cannot be used: Not enabled at compile time\n" +msgstr "" +"E26: хебрејÑки не може да Ñе кориÑти: Ðије омогућен у време компилације\n" + +msgid "E27: Farsi support has been removed\n" +msgstr "E27: Подршка за фарÑи је уклоњена\n" + +msgid "E800: Arabic cannot be used: Not enabled at compile time\n" +msgstr "" +"E800: арапÑки не може да Ñе кориÑти: Ðије омогућен у време компилације\n" + +#, c-format +msgid "E28: No such highlight group name: %s" +msgstr "E28: Ðема групе иÑтицања Ñа таквим именом: %s" + +msgid "E29: No inserted text yet" +msgstr "E29: ТекÑÑ‚ још није унет" + +msgid "E30: No previous command line" +msgstr "E30: Ðема претходне командне линије" + +msgid "E31: No such mapping" +msgstr "E31: Такво мапирање не поÑтоји" + +msgid "E479: No match" +msgstr "E479: Ðема подударања" + +#, c-format +msgid "E480: No match: %s" +msgstr "E480: Ðема подударања: %s" + +msgid "E32: No file name" +msgstr "E32: Ðема имена фајла" + +msgid "E33: No previous substitute regular expression" +msgstr "E33: Ðема претходног регуларног израза за замену" + +msgid "E34: No previous command" +msgstr "E34: Ðема претходне команде" + +msgid "E35: No previous regular expression" +msgstr "E35: Ðема претходног регуларног израза" + +msgid "E481: No range allowed" +msgstr "E481: ОпÑег није дозвољен" + +msgid "E36: Not enough room" +msgstr "E36: Ðема довољно проÑтора" + +#, c-format +msgid "E247: no registered server named \"%s\"" +msgstr "E247: нема региÑтованог Ñервера под именом \"%s\"" + +#, c-format +msgid "E482: Can't create file %s" +msgstr "E482: Фајл %s не може да Ñе креира" + +msgid "E483: Can't get temp file name" +msgstr "E483: Име привременог фајла не може да Ñе добије" + +#, c-format +msgid "E484: Can't open file %s" +msgstr "E484: Фајл %s не може да Ñе отвори" + +#, c-format +msgid "E485: Can't read file %s" +msgstr "E485: Фајл %s не може да Ñе прочита" + +msgid "E38: Null argument" +msgstr "E38: Празан аргумент" + +msgid "E39: Number expected" +msgstr "E39: Очекује Ñе број" + +#, c-format +msgid "E40: Can't open errorfile %s" +msgstr "E40: Фајл грешке %s не може да Ñе отвори" + +msgid "E233: cannot open display" +msgstr "E233: приказ не може да Ñе отвори" + +msgid "E41: Out of memory!" +msgstr "E41: Ðема више меморије!" + +msgid "Pattern not found" +msgstr "Шаблон није пронађен" + +#, c-format +msgid "E486: Pattern not found: %s" +msgstr "E486: Шаблон није пронађен: %s" + +msgid "E487: Argument must be positive" +msgstr "E487: Ðргумент мора бити позитиван" + +msgid "E459: Cannot go back to previous directory" +msgstr "E459: Ðе може да Ñе оде назад на претходни директоријум" + +msgid "E42: No Errors" +msgstr "E42: Ðема грешака" + +msgid "E776: No location list" +msgstr "E776: Ðема лиÑте локација" + +msgid "E43: Damaged match string" +msgstr "E43: Оштећен Ñтринг за подударање" + +msgid "E44: Corrupted regexp program" +msgstr "E44: regexp програм је покварен" + +msgid "E45: 'readonly' option is set (add ! to override)" +msgstr "E45: ПоÑтављена је 'readonly' опција (додајте ! за премошћавање)" + +#, c-format +msgid "E734: Wrong variable type for %s=" +msgstr "E734: Погрешан тип променљиве за %s=" + +#, c-format +msgid "E461: Illegal variable name: %s" +msgstr "E461: Ðедозвољено име променљиве: %s" + +msgid "E995: Cannot modify existing variable" +msgstr "E995: ПоÑтојећа променљива не може да Ñе измени" + +#, c-format +msgid "E46: Cannot change read-only variable \"%s\"" +msgstr "E46: Променљива Ñамо за читање \"%s\" не може да Ñе измени" + +#, c-format +msgid "E794: Cannot set variable in the sandbox: \"%s\"" +msgstr "E794: Ðе може да Ñе поÑтави променљива у sandbox-у: \"%s\"" + +msgid "E928: String required" +msgstr "E928: Захтева Ñе Стринг" + +msgid "E713: Cannot use empty key for Dictionary" +msgstr "E713: Ðе може да Ñе кориÑти празан кључ за Речник" + +msgid "E715: Dictionary required" +msgstr "E715: Потребан Речник" + +#, c-format +msgid "E684: list index out of range: %ld" +msgstr "E684: Ð¸Ð½Ð´ÐµÐºÑ Ð»Ð¸Ñте је ван опÑега: %ld" + +#, c-format +msgid "E979: Blob index out of range: %ld" +msgstr "E979: Ð˜Ð½Ð´ÐµÐºÑ Ð‘Ð»Ð¾Ð±Ð° је ван опÑега: %ld" + +msgid "E978: Invalid operation for Blob" +msgstr "E978: ÐеиÑправна операција за Блоб" + +#, c-format +msgid "E118: Too many arguments for function: %s" +msgstr "E118: Превише аргумената за функцију: %s" + +#, c-format +msgid "E119: Not enough arguments for function: %s" +msgstr "E119: Ðема довољно аргумената за функцију: %s" + +#, c-format +msgid "E933: Function was deleted: %s" +msgstr "E933: Функција је обриÑана: %s" + +#, c-format +msgid "E716: Key not present in Dictionary: \"%s\"" +msgstr "E716: У Речнику нема кључа: \"%s\"" + +msgid "E714: List required" +msgstr "E714: Потребна ЛиÑта" + +msgid "E897: List or Blob required" +msgstr "E897: Потребна је ЛиÑта или Блоб" + +#, c-format +msgid "E697: Missing end of List ']': %s" +msgstr "E697: ÐедоÑтаје крај ЛиÑте ']': %s" + +#, c-format +msgid "E712: Argument of %s must be a List or Dictionary" +msgstr "E712: Ðргумент за %s мора бити ЛиÑта или Речник" + +#, c-format +msgid "E896: Argument of %s must be a List, Dictionary or Blob" +msgstr "E896: Ðргумент за %s мора бити ЛиÑта, Речник или Блоб" + +msgid "E804: Cannot use '%' with Float" +msgstr "E804: '%' не може да Ñе кориÑти Ñа Покретни" + +msgid "E908: using an invalid value as a String" +msgstr "E908: КориÑти Ñе недозвољена вредноÑÑ‚ као Стринг" + +msgid "E996: Cannot lock an option" +msgstr "E996: Опција не може да Ñе закључа" + +#, c-format +msgid "E113: Unknown option: %s" +msgstr "E113: Ðепозната опција: %s" + +msgid "E18: Unexpected characters in :let" +msgstr "E18: Ðеочекивани карактери у :let" + +#, c-format +msgid "E998: Reduce of an empty %s with no initial value" +msgstr "E998: Редукција празне %s без почетне вредноÑти" + +#, c-format +msgid "E857: Dictionary key \"%s\" required" +msgstr "E857: Потребан је кључ Речника \"%s\"" + +msgid "E47: Error while reading errorfile" +msgstr "E47: Грешка приликом читања фајла грешке" + +msgid "E48: Not allowed in sandbox" +msgstr "E48: Ðије дозвољено у sandbox-у" + +msgid "E523: Not allowed here" +msgstr "E523: Ðије дозвољено овде" + +msgid "E578: Not allowed to change text here" +msgstr "E578: Овде није дозвољена измена текÑта" + +msgid "E565: Not allowed to change text or change window" +msgstr "E565: Ðије дозвољена измена текÑта или мењање прозора" + +msgid "E359: Screen mode setting not supported" +msgstr "E359: Подешавање режима екрана није подржано" + +msgid "E49: Invalid scroll size" +msgstr "E49: Ðеважећа величина линије за Ñкроловање" + +msgid "E91: 'shell' option is empty" +msgstr "E91: Опција 'shell' је празна" + +msgid "E255: Couldn't read in sign data!" +msgstr "E255: Подаци за знак ниÑу могли да Ñе прочитају!" + +msgid "E72: Close error on swap file" +msgstr "E72: Грешка код затварања привременог фајла" + +msgid "E73: tag stack empty" +msgstr "E73: Ñтек ознака је празан" + +msgid "E74: Command too complex" +msgstr "E74: Команда је Ñувише комплекÑна" + +msgid "E75: Name too long" +msgstr "E75: Име је предугачко" + +msgid "E76: Too many [" +msgstr "E76: Превише [" + +msgid "E77: Too many file names" +msgstr "E77: Превише имена фајлова" + +msgid "E488: Trailing characters" +msgstr "E488: Карактери вишка на крају" + +#, c-format +msgid "E488: Trailing characters: %s" +msgstr "E488: Карактери вишка на крају: %s" + +msgid "E78: Unknown mark" +msgstr "E78: Ðепознат маркер" + +msgid "E79: Cannot expand wildcards" +msgstr "E79: Ðокери не могу да Ñе развију" + +msgid "E591: 'winheight' cannot be smaller than 'winminheight'" +msgstr "E591: 'winheight' не може да буде мање од 'winminheight'" + +msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'" +msgstr "E592: 'winwidth' не може да буде мање од 'winminwidth'" + +msgid "E80: Error while writing" +msgstr "E80: Грешка приликом упиÑа" + +msgid "E939: Positive count required" +msgstr "E939: Потребан је позитиван број" + +msgid "E81: Using not in a script context" +msgstr "E81: Ñе кориÑти ван Ñкрипт контекÑта" + +#, c-format +msgid "E107: Missing parentheses: %s" +msgstr "E107: ÐедоÑтају заграде: %s" + +msgid "E110: Missing ')'" +msgstr "E110: ÐедоÑтаје ')'" + +#, c-format +msgid "E720: Missing colon in Dictionary: %s" +msgstr "E720: ÐедоÑтаје тачка-зарез у Речнику: %s" + +#, c-format +msgid "E721: Duplicate key in Dictionary: \"%s\"" +msgstr "E721: Дупликат кључа у Речнику: \"%s\"" + +#, c-format +msgid "E722: Missing comma in Dictionary: %s" +msgstr "E722: ÐедоÑтаје зарез у Речнику: %s" + +#, c-format +msgid "E723: Missing end of Dictionary '}': %s" +msgstr "E723: ÐедоÑтаје крај Речника '}': %s" + +msgid "E449: Invalid expression received" +msgstr "E449: Примљен је неважећи израз" + +msgid "E463: Region is guarded, cannot modify" +msgstr "E463: Регион је чуван, измена није могућа" + +msgid "E744: NetBeans does not allow changes in read-only files" +msgstr "" +"E744: NetBeans не дозвољава измене на фајловима који Ñмеју Ñамо да Ñе читају" + +msgid "E363: pattern uses more memory than 'maxmempattern'" +msgstr "E363: шаблон кориÑти више меморије од 'maxmempattern'" + +msgid "E749: empty buffer" +msgstr "E749: празан бафер" + +#, c-format +msgid "E86: Buffer %ld does not exist" +msgstr "E86: Бафер %ld не поÑтоји" + +msgid "E682: Invalid search pattern or delimiter" +msgstr "E682: Ðеважећи шаблон претраге или раздвојни карактер" + +msgid "E139: File is loaded in another buffer" +msgstr "E139: Фајл је учитан у други бафер" + +#, c-format +msgid "E764: Option '%s' is not set" +msgstr "E764: Опција '%s' није поÑтављена" + +msgid "E850: Invalid register name" +msgstr "E850: Ðеважеће име региÑтра" + +msgid "E806: using Float as a String" +msgstr "E806: Коришћење Покретни као Стринг" + +#, c-format +msgid "E919: Directory not found in '%s': \"%s\"" +msgstr "E919: Ðије пронађен директоријум у '%s': \"%s\"" + +msgid "E952: Autocommand caused recursive behavior" +msgstr "E952: Ðутокомандa je изазвала рекурзивно понашање" + +msgid "E813: Cannot close autocmd or popup window" +msgstr "E813: Прозор аутокоманде или иÑкачући прозор не може да Ñе затвори" + +msgid "E328: Menu only exists in another mode" +msgstr "E328: Мени поÑтоји Ñамо у другом режиму" + +msgid "E957: Invalid window number" +msgstr "E957: ÐеиÑправан број прозора" + +#, c-format +msgid "E686: Argument of %s must be a List" +msgstr "E686: Ðргумент за %s мора бити ЛиÑта" + +msgid "E109: Missing ':' after '?'" +msgstr "E109: ÐедоÑтаје ':' након '?'" + +msgid "E690: Missing \"in\" after :for" +msgstr "E690: ÐедоÑтаје \"in\" након :for" + +#, c-format +msgid "E117: Unknown function: %s" +msgstr "E117: Ðепозната функција: %s" + +msgid "E111: Missing ']'" +msgstr "E111: ÐедоÑтаје ']'" + +msgid "E581: :else without :if" +msgstr "E581: :else без :if" + +msgid "E582: :elseif without :if" +msgstr "E582: :elseif без :if" + +msgid "E580: :endif without :if" +msgstr "E580: :endif без :if" + +msgid "E586: :continue without :while or :for" +msgstr "E586: :continue без :while или :for" + +msgid "E587: :break without :while or :for" +msgstr "E587: :break без :while или :for" + +msgid "E274: No white space allowed before parenthesis" +msgstr "E274: ИÑпред заграде није дозвољен празан карактер" + +#, c-format +msgid "E940: Cannot lock or unlock variable %s" +msgstr "E940: Ðе може да Ñе откључа или закључа променљива %s" + +#, c-format +msgid "E254: Cannot allocate color %s" +msgstr "E254: Боја %s не може да Ñе алоцира" + +msgid "search hit TOP, continuing at BOTTOM" +msgstr "претрага је доÑтигла ВРХ, наÑтавља Ñе од ДÐÐ" + +msgid "search hit BOTTOM, continuing at TOP" +msgstr "претрага је доÑтигла ДÐО, наÑтавља Ñе од ВРХÐ" + +msgid " line " +msgstr " линија " + +#, c-format +msgid "Need encryption key for \"%s\"" +msgstr "Потребан је кључ за шифровање \"%s\"" + +msgid "empty keys are not allowed" +msgstr "празни кључеви ниÑу дозвољени" + +msgid "dictionary is locked" +msgstr "речник је закључан" + +msgid "list is locked" +msgstr "лиÑта је закључана" + +#, c-format +msgid "failed to add key '%s' to dictionary" +msgstr "кључ '%s' није могао да Ñе дода у речник" + +#, c-format +msgid "index must be int or slice, not %s" +msgstr "index мора бити типа int или slice, не %s" + +#, c-format +msgid "expected str() or unicode() instance, but got %s" +msgstr "очекивала Ñе инÑтанца str() или unicode(), али је добијена %s" + +#, c-format +msgid "expected bytes() or str() instance, but got %s" +msgstr "очекивала Ñе инÑтанца bytes() или str(), али је добијена %s" + +#, c-format +msgid "" +"expected int(), long() or something supporting coercing to long(), but got %s" +msgstr "" +"очекивало Ñе int(), long() или нешто што подржава Ñпајање Ñа long(), али је " +"добијено %s" + +#, c-format +msgid "expected int() or something supporting coercing to int(), but got %s" +msgstr "" +"очекивало Ñе int() или нешто што подржава Ñпајање Ñа int(), али је добијено " +"%s" + +msgid "value is too large to fit into C int type" +msgstr "вредноÑÑ‚ је Ñувише велика да Ñе ÑмеÑти у C int тип" + +msgid "value is too small to fit into C int type" +msgstr "вредноÑÑ‚ је Ñувише мала да Ñе ÑмеÑти у C int тип" + +msgid "number must be greater than zero" +msgstr "број мора бити већи од нуле" + +msgid "number must be greater or equal to zero" +msgstr "број мора бити већи од или једнак нули" + +msgid "can't delete OutputObject attributes" +msgstr "атрибути OutputObject не могу да Ñе обришу" + +#, c-format +msgid "invalid attribute: %s" +msgstr "неважећи атрибут: %s" + +msgid "E264: Python: Error initialising I/O objects" +msgstr "E264: Python: Грешка код иницијализације У/И објеката" + +msgid "failed to change directory" +msgstr "не може да Ñе промени директоријум" + +#, c-format +msgid "expected 3-tuple as imp.find_module() result, but got %s" +msgstr "Као резултат imp.find_module() очекује Ñе триплет, али је добијено %s" + +#, c-format +msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d" +msgstr "" +"Као резултат imp.find_module() очекује Ñе триплет, али је добијена н-торка " +"величине %d" + +msgid "internal error: imp.find_module returned tuple with NULL" +msgstr "интерна грешка: imp.find_module је вратио н-торку Ñа NULL" + +msgid "cannot delete vim.Dictionary attributes" +msgstr "vim.Dictionary атрибути не могу да Ñе обришу" + +msgid "cannot modify fixed dictionary" +msgstr "фикÑни речник не може да Ñе измени" + +#, c-format +msgid "cannot set attribute %s" +msgstr "атрибут %s не може да Ñе поÑтави" + +msgid "hashtab changed during iteration" +msgstr "hashtab је промењен током итерације" + +#, c-format +msgid "expected sequence element of size 2, but got sequence of size %d" +msgstr "" +"очекивао Ñе елемент Ñеквенце величине 2, али је добијена Ñеквенца величине %d" + +msgid "list constructor does not accept keyword arguments" +msgstr "конÑтруктор лиÑте не прихвата кључне речи за аргументе" + +msgid "list index out of range" +msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ð»Ð¸Ñте је ван опÑега" + +#, c-format +msgid "internal error: failed to get Vim list item %d" +msgstr "интерна грешка: Ñтавка %d vim лиÑте није могла да Ñе добије" + +msgid "slice step cannot be zero" +msgstr "slice корак не може да буде нула" + +#, c-format +msgid "attempt to assign sequence of size greater than %d to extended slice" +msgstr "покушај доделе Ñеквенце величине веће од %d како би Ñе продужио slice" + +#, c-format +msgid "internal error: no Vim list item %d" +msgstr "интерна грешка: нема Ñтавке %d у vim лиÑти" + +msgid "internal error: not enough list items" +msgstr "интерна грешка: нема довољно Ñтавки лиÑте" + +msgid "internal error: failed to add item to list" +msgstr "интерна грешка: Ñтавка није могла да Ñе дода лиÑти" + +#, c-format +msgid "attempt to assign sequence of size %d to extended slice of size %d" +msgstr "" +"покушај доделе Ñеквенце величине %d како би Ñе продужио slice величине %d" + +msgid "failed to add item to list" +msgstr "Ñтавка није могла да Ñе дода лиÑти" + +msgid "cannot delete vim.List attributes" +msgstr "vim.List атрибути не могу да Ñе обришу" + +msgid "cannot modify fixed list" +msgstr "фикÑна лиÑта не може да Ñе измени" + +#, c-format +msgid "unnamed function %s does not exist" +msgstr "неименована функција %s не поÑтоји" + +#, c-format +msgid "function %s does not exist" +msgstr "функција %s не поÑтоји" + +#, c-format +msgid "failed to run function %s" +msgstr "функција %s није могла да Ñе покрене" + +msgid "unable to get option value" +msgstr "вредноÑÑ‚ опције није могла да Ñе добије" + +msgid "internal error: unknown option type" +msgstr "интерна грешка: непознат тип опције" + +msgid "problem while switching windows" +msgstr "проблем код пребацивања прозора" + +#, c-format +msgid "unable to unset global option %s" +msgstr "глобална опција %s није могла да Ñе иÑкључи" + +#, c-format +msgid "unable to unset option %s which does not have global value" +msgstr "опција %s која нема глобалну вредноÑÑ‚ није могла да Ñе иÑкључи" + +msgid "attempt to refer to deleted tab page" +msgstr "покушај рефериÑања на обриÑану картицу" + +msgid "no such tab page" +msgstr "не поÑтоји таква картица" + +msgid "attempt to refer to deleted window" +msgstr "покушај рефериÑања на обриÑан прозор" + +msgid "readonly attribute: buffer" +msgstr "атрибут Ñамо за читање: бафер" + +msgid "cursor position outside buffer" +msgstr "позиција курÑора је ван бафера" + +msgid "no such window" +msgstr "нема таквог прозора" + +msgid "attempt to refer to deleted buffer" +msgstr "покушај рефериÑања на обриÑан бафер" + +msgid "failed to rename buffer" +msgstr "име бафера није могло да Ñе промени" + +msgid "mark name must be a single character" +msgstr "име маркера мора бити Ñамо један карактер" + +#, c-format +msgid "expected vim.Buffer object, but got %s" +msgstr "очекивао Ñе vim.Buffer објекат, али је добијен %s" + +#, c-format +msgid "failed to switch to buffer %d" +msgstr "прелазак на бафер %d није био могућ" + +#, c-format +msgid "expected vim.Window object, but got %s" +msgstr "очекивао Ñе vim.Window објекат, али је добијен %s" + +msgid "failed to find window in the current tab page" +msgstr "прозор није пронађен у текућој картици" + +msgid "did not switch to the specified window" +msgstr "није Ñе прешло у наведени прозор" + +#, c-format +msgid "expected vim.TabPage object, but got %s" +msgstr "очекивао Ñе vim.TabPage објекат, али је добијен %s" + +msgid "did not switch to the specified tab page" +msgstr "није Ñе прешло у наведену картицу" + +msgid "failed to run the code" +msgstr "кôд није могао да Ñе покрене" + +msgid "E858: Eval did not return a valid python object" +msgstr "E858: Eval није вратио важећи python објекат" + +msgid "E859: Failed to convert returned python object to a Vim value" +msgstr "E859: Конверзија враћеног python објекта у vim вредноÑÑ‚ није уÑпела" + +#, c-format +msgid "unable to convert %s to a Vim dictionary" +msgstr "%s не може да Ñе конвертује у vim речник" + +#, c-format +msgid "unable to convert %s to a Vim list" +msgstr "%s не може да Ñе конвертује у vim лиÑту" + +#, c-format +msgid "unable to convert %s to a Vim structure" +msgstr "%s не може да Ñе конвертује у vim Ñтруктуру" + +msgid "internal error: NULL reference passed" +msgstr "интерна грешка: проÑлеђена је NULL референца" + +msgid "internal error: invalid value type" +msgstr "интерна грешка: вредноÑÑ‚ неважећег типа" + +msgid "" +"Failed to set path hook: sys.path_hooks is not a list\n" +"You should now do the following:\n" +"- append vim.path_hook to sys.path_hooks\n" +"- append vim.VIM_SPECIAL_PATH to sys.path\n" +msgstr "" +"Кука за путању није могла да Ñе поÑтави: sys.path_hooks није у лиÑти\n" +"Сада би требало да урадите Ñледеће:\n" +"- додајте vim.path_hook на крај sys.path_hooks\n" +"- додајте vim.VIM_SPECIAL_PATH на крај sys.path\n" + +msgid "" +"Failed to set path: sys.path is not a list\n" +"You should now append vim.VIM_SPECIAL_PATH to sys.path" +msgstr "" +"Путања није могла да Ñе поÑтави: sys.path није у лиÑти\n" +"Сада би требало да додате vim.VIM_SPECIAL_PATH на крај sys.path" + +msgid "" +"Vim macro files (*.vim)\t*.vim\n" +"All Files (*.*)\t*.*\n" +msgstr "" +"Vim макро фајлови (*.vim)\t*.vim\n" +"Сви фајлови (*.*)\t*.*\n" + +msgid "All Files (*.*)\t*.*\n" +msgstr "Сви фајлови (*.*)\t*.*\n" + +msgid "" +"All Files (*.*)\t*.*\n" +"C source (*.c, *.h)\t*.c;*.h\n" +"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"VB code (*.bas, *.frm)\t*.bas;*.frm\n" +"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +msgstr "" +"Сви фајлови (*.*)\t*.*\n" +"C изворни код (*.c, *.h)\t*.c;*.h\n" +"C++ изворни код (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"VB код (*.bas, *.frm)\t*.bas;*.frm\n" +"Vim фајлови (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" + +msgid "" +"Vim macro files (*.vim)\t*.vim\n" +"All Files (*)\t*\n" +msgstr "" +"Vim макро фајлови (*.vim)\t*.vim\n" +"Сви фајлови (*)\t*\n" + +msgid "All Files (*)\t*\n" +msgstr "Сви фајлови (*)\t*\n" + +msgid "" +"All Files (*)\t*\n" +"C source (*.c, *.h)\t*.c;*.h\n" +"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +msgstr "" +"Сви фајлови (*)\t*\n" +"C изворни код (*.c, *.h)\t*.c;*.h\n" +"C++ изворни код (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"Vim фајлови (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" + +msgid "GVim" +msgstr "GVim" + +msgid "Text Editor" +msgstr "Едитор текÑÑ‚" + +msgid "Edit text files" +msgstr "Уређујте текÑÑ‚ фајлове" + +msgid "Text;editor;" +msgstr "ТекÑÑ‚;едитор;" + +msgid "Vim" +msgstr "Vim" + +msgid "(local to window)" +msgstr "(локално за прозор)" + +msgid "(local to buffer)" +msgstr "(локално за бафер)" + +msgid "(global or local to buffer)" +msgstr "(глобално или локално за бафер)" + +msgid "" +"\" Each \"set\" line shows the current value of an option (on the left)." +msgstr "\" Свака „set†линија приказује текућу вредноÑÑ‚ опције (Ñа леве Ñтране)." + +msgid "\" Hit on a \"set\" line to execute it." +msgstr "\" ПритиÑните <Ентер> на „set†линији да је извршите." + +msgid "\" A boolean option will be toggled." +msgstr "\" Логичка опција ће променити Ñтање." + +msgid "" +"\" For other options you can edit the value before hitting " +"." +msgstr "" +"\" ОÑталим опцијама можете променити вредноÑÑ‚ пре притиÑка " +"на <Ентер>." + +msgid "\" Hit on a help line to open a help window on this option." +msgstr "\" ПритиÑните <Ентер> на линији помоћи да Ñе отвори прозор помоћи за ову опцију." + +msgid "\" Hit on an index line to jump there." +msgstr "\" ПритиÑните <Ентер> на линији индекÑа да Ñкочите тамо." + +msgid "\" Hit on a \"set\" line to refresh it." +msgstr "\" ПритиÑните на „set†линији да је оÑвежите." + +msgid "important" +msgstr "важно" + +msgid "behave very Vi compatible (not advisable)" +msgstr "понаша Ñе веома Vi компатибилно (не препоручује Ñе)" + +msgid "list of flags to specify Vi compatibility" +msgstr "лиÑта заÑтавица за навођење Vi компатибилноÑти" + +msgid "use Insert mode as the default mode" +msgstr "режим Уметање Ñе кориÑти као подразумевани режим" + +msgid "paste mode, insert typed text literally" +msgstr "режим налепљивања, откуцани текÑÑ‚ Ñе умеће доÑловно" + +msgid "key sequence to toggle paste mode" +msgstr "низ таÑтера којим Ñе преклапа режим налепљивања" + +msgid "list of directories used for runtime files and plugins" +msgstr "" +"лиÑта директоријума који Ñе кориÑте за фајлове за време\n" +"извршавања и додатке" + +msgid "list of directories used for plugin packages" +msgstr "лиÑта директоријума који Ñе кориÑте за пакете додатака" + +msgid "name of the main help file" +msgstr "име главног фајла помоћи" + +msgid "moving around, searching and patterns" +msgstr "кретање наоколо, претрага и шаблони" + +msgid "list of flags specifying which commands wrap to another line" +msgstr "" +"лиÑта заÑтавица која наводи које команде обавијају у наредну\n" +"линију" + +msgid "" +"many jump commands move the cursor to the first non-blank\n" +"character of a line" +msgstr "" +"многе команде померају курÑор на први непразни карактер у\n" +"линији" + +msgid "nroff macro names that separate paragraphs" +msgstr "имена nroff макроа који одвајају паÑуÑе" + +msgid "nroff macro names that separate sections" +msgstr "имена nroff макроа који одвајају одељке" + +msgid "list of directory names used for file searching" +msgstr "лиÑта имена директоријума који Ñе кориÑте за претрагу фајлова" + +msgid "list of directory names used for :cd" +msgstr "лиÑта имена директоријума који Ñе кориÑте за :cd" + +msgid "change to directory of file in buffer" +msgstr "мења на директоријум фајла у баферу" + +msgid "search commands wrap around the end of the buffer" +msgstr "команде претраге Ñе обавијају око краја бафера" + +msgid "show match for partly typed search command" +msgstr "приказује подударање за делимично откуцану команду претраге" + +msgid "change the way backslashes are used in search patterns" +msgstr "" +"мења начин на који Ñе кориÑте обрнуте коÑе црте у шаблонима\n" +"претраге" + +msgid "select the default regexp engine used" +msgstr "бира подразумевани регизраз механизам" + +msgid "ignore case when using a search pattern" +msgstr "не прави разлику у величини Ñлова када Ñе кориÑти шаблон претраге" + +msgid "override 'ignorecase' when pattern has upper case characters" +msgstr "премошћава 'ignorecase' када шаблон Ñадржи велика Ñлова" + +msgid "what method to use for changing case of letters" +msgstr "који метод Ñе кориÑти за промену величине Ñлова" + +msgid "maximum amount of memory in Kbyte used for pattern matching" +msgstr "" +"макÑимална количина меморије у Кбајтима која Ñе кориÑти за\n" +"подударање шаблона" + +msgid "pattern for a macro definition line" +msgstr "шаблона за линију која дефинише макро" + +msgid "pattern for an include-file line" +msgstr "шаблон за линију која укључује фајл" + +msgid "expression used to transform an include line to a file name" +msgstr "" +"израз који Ñе кориÑти за транÑформацију линије укључивања фајла у\n" +"име фајла" + +msgid "tags" +msgstr "ознаке" + +msgid "use binary searching in tags files" +msgstr "кориÑти бинарно претраживање у фајловима ознака" + +msgid "number of significant characters in a tag name or zero" +msgstr "број значајних карактера у имену ознаке или нула" + +msgid "list of file names to search for tags" +msgstr "лиÑта имена фајлова који Ñе претражују на ознаке" + +msgid "" +"how to handle case when searching in tags files:\n" +"\"followic\" to follow 'ignorecase', \"ignore\" or \"match\"" +msgstr "" +"како Ñе обрађује величина Ñлова када Ñе претражују фајлови\n" +"ознака: „followic†да Ñе Ñледи 'ignorecase', „ignore†или „matchâ€" + +msgid "file names in a tags file are relative to the tags file" +msgstr "имена фајлова у фајлу ознака Ñу релативна у одноÑу на фајл ознака" + +msgid "a :tag command will use the tagstack" +msgstr "Команда :tag ће да кориÑти Ñтек ознака" + +msgid "when completing tags in Insert mode show more info" +msgstr "када Ñе довршавају ознаке у режиму Уметање приказује Ñе још инфо" + +msgid "a function to be used to perform tag searches" +msgstr "функција која Ñе кориÑти за обављање претраге ознака" + +msgid "command for executing cscope" +msgstr "команда за извршавање cscope" + +msgid "use cscope for tag commands" +msgstr "cscope Ñе кориÑти за команде ознака" + +msgid "0 or 1; the order in which \":cstag\" performs a search" +msgstr "0 или 1; редоÑлед по коме „:cstag†врши претрагу" + +msgid "give messages when adding a cscope database" +msgstr "враћа поруке када Ñе додаје cscope база података" + +msgid "how many components of the path to show" +msgstr "колико компоненти путање Ñе приказује" + +msgid "when to open a quickfix window for cscope" +msgstr "када Ñе за cscope отвара quickfix прозор" + +msgid "file names in a cscope file are relative to that file" +msgstr "имена фајлова у cscope фајлу Ñу релативна у одноÑу на тај фајл" + +msgid "displaying text" +msgstr "приказ текÑта" + +msgid "number of lines to scroll for CTRL-U and CTRL-D" +msgstr "број линија које Ñкролују CTRL-U и CTRL-D" + +msgid "number of screen lines to show around the cursor" +msgstr "број екранÑких линија које Ñе пеиказују око курÑора" + +msgid "long lines wrap" +msgstr "дуге линије Ñе обавијају" + +msgid "wrap long lines at a character in 'breakat'" +msgstr "дугачке линије Ñе преламају на карактеру из 'breakat'" + +msgid "preserve indentation in wrapped text" +msgstr "задржава Ñе увлачење у обавијеном текÑту" + +msgid "adjust breakindent behaviour" +msgstr "подешавање breakindent понашања" + +msgid "which characters might cause a line break" +msgstr "који карактери би могли да преломе линију" + +msgid "string to put before wrapped screen lines" +msgstr "Ñтринг који Ñе поÑтавља иÑпред обавијених екранÑких линија" + +msgid "minimal number of columns to scroll horizontally" +msgstr "минимални број колона које Ñе Ñкролују хоризонтално" + +msgid "minimal number of columns to keep left and right of the cursor" +msgstr "минимални број колона које Ñе задржавају лево и деÑно од курÑора" + +msgid "" +"include \"lastline\" to show the last line even if it doesn't fit\n" +"include \"uhex\" to show unprintable characters as a hex number" +msgstr "" +"укључује „lastline†за приказивање поÑледње линије, чак и ако не\n" +"Ñтаје\n" +"укључује „uhex†за приказ карактера који Ñе не штампају као хекÑ\n" +"броја" + +msgid "characters to use for the status line, folds and filler lines" +msgstr "" +"карактери који Ñе кориÑте за ÑтатуÑну линију, Ñвијутке и линије\n" +"иÑпуне" + +msgid "number of lines used for the command-line" +msgstr "број линија резервиÑаних за командну-линију" + +msgid "width of the display" +msgstr "ширина приказа" + +msgid "number of lines in the display" +msgstr "број линија у приказу" + +msgid "number of lines to scroll for CTRL-F and CTRL-B" +msgstr "број линија који Ñкролују CTRL-F и CTRL-B" + +msgid "don't redraw while executing macros" +msgstr "екран Ñе не иÑцртава током извршавања макроа" + +msgid "timeout for 'hlsearch' and :match highlighting in msec" +msgstr "тајмаут за 'hlsearch' и :match иÑтицање у милиÑекундама" + +msgid "" +"delay in msec for each char written to the display\n" +"(for debugging)" +msgstr "" +"кашњење у милиÑекундама за Ñваки карактер иÑпиÑан на екран\n" +"(за дибагинг)" + +msgid "show as ^I and end-of-line as $" +msgstr "приказује као ^I и крај-линије као $" + +msgid "list of strings used for list mode" +msgstr "лиÑта Ñтрингова који Ñе кориÑте за режим лиÑте" + +msgid "show the line number for each line" +msgstr "приказује број линије за Ñваку линију" + +msgid "show the relative line number for each line" +msgstr "приказује релативни број линије за Ñваку линију" + +msgid "number of columns to use for the line number" +msgstr "број колона које Ñе кориÑте за број линије" + +msgid "controls whether concealable text is hidden" +msgstr "контролише да ли Ñе Ñкрива текÑÑ‚ који може да Ñе Ñакрије" + +msgid "modes in which text in the cursor line can be concealed" +msgstr "режими у којима текÑÑ‚ у курÑорÑкој линији може да Ñе Ñакрива" + +msgid "syntax, highlighting and spelling" +msgstr "ÑинтакÑа, иÑтицање и провера правопиÑа" + +msgid "\"dark\" or \"light\"; the background color brightness" +msgstr "„dark†или „lightâ€; Ñветлина боје позадине" + +msgid "type of file; triggers the FileType event when set" +msgstr "тип фајла; када је поÑтављена окида FileType догађај" + +msgid "name of syntax highlighting used" +msgstr "име иÑтицања ÑинтакÑе које Ñе кориÑти" + +msgid "maximum column to look for syntax items" +msgstr "макÑималан број колона које Ñе претражују на ÑинтакÑне Ñтавке" + +msgid "which highlighting to use for various occasions" +msgstr "које иÑтицање Ñе кориÑти у разним Ñитуацијама" + +msgid "highlight all matches for the last used search pattern" +msgstr "иÑтичу Ñе Ñва подударања поÑледње коришћеног шаблона претраге" + +msgid "highlight group to use for the window" +msgstr "група иÑтицања која Ñе кориÑти за прозор" + +msgid "use GUI colors for the terminal" +msgstr "за терминал Ñе кориÑте ГКИ боје" + +msgid "highlight the screen column of the cursor" +msgstr "иÑтиче Ñе екранÑка колона у којој је курÑор" + +msgid "highlight the screen line of the cursor" +msgstr "иÑтиче Ñе екранÑка линија у којој је курÑор" + +msgid "specifies which area 'cursorline' highlights" +msgstr "наводи површину коју иÑтиче 'cursorline'" + +msgid "columns to highlight" +msgstr "колоне које Ñе иÑтичу" + +msgid "highlight spelling mistakes" +msgstr "иÑтицање правопиÑних грешака" + +msgid "list of accepted languages" +msgstr "лиÑта језика који Ñе прихватају" + +msgid "file that \"zg\" adds good words to" +msgstr "фајл у који „zg†додаје добро иÑпиÑане речи" + +msgid "pattern to locate the end of a sentence" +msgstr "шаблон којим Ñе лоцира крај реченице" + +msgid "flags to change how spell checking works" +msgstr "заÑтавице које мењају начин рада провере правопиÑа" + +msgid "methods used to suggest corrections" +msgstr "методе које Ñе кориÑте за правопиÑне предлоге" + +msgid "amount of memory used by :mkspell before compressing" +msgstr "количина меморије коју кориÑти :mkspell пре компреÑије" + +msgid "multiple windows" +msgstr "вишеÑтруки прозори" + +msgid "0, 1 or 2; when to use a status line for the last window" +msgstr "0, 1 или 2; када Ñе кориÑти ÑтатуÑна линија за поÑледњи прозор" + +msgid "alternate format to be used for a status line" +msgstr "алтернативни формат који ће Ñе кориÑтити за ÑтатуÑну линију" + +msgid "make all windows the same size when adding/removing windows" +msgstr "" +"поÑтавља Ñве прозоре на иÑту величину када Ñе прозори\n" +"додају/уклањају" + +msgid "in which direction 'equalalways' works: \"ver\", \"hor\" or \"both\"" +msgstr "у ком Ñмеру функционише 'equalalways': „verâ€, „hor†или „bothâ€" + +msgid "minimal number of lines used for the current window" +msgstr "минимални број линија који Ñе кориÑти за текући прозор" + +msgid "minimal number of lines used for any window" +msgstr "минимални број линија који Ñе кориÑти за било који прозор" + +msgid "keep the height of the window" +msgstr "задржава Ñе виÑина прозора" + +msgid "keep the width of the window" +msgstr "задржава Ñе ширина прозора" + +msgid "minimal number of columns used for the current window" +msgstr "минимални број колона које Ñе кориÑте за текући прозор" + +msgid "minimal number of columns used for any window" +msgstr "минимални број колона које Ñе кориÑте за било који прозор" + +msgid "initial height of the help window" +msgstr "иницијална виÑина прозора помоћи" + +msgid "use a popup window for preview" +msgstr "за преглед Ñе кориÑти иÑкачући прозор" + +msgid "default height for the preview window" +msgstr "подразумевана виÑина прозора за преглед" + +msgid "identifies the preview window" +msgstr "идентификује прозора за преглед" + +msgid "don't unload a buffer when no longer shown in a window" +msgstr "" +"бафер Ñе не уклања из меморије када Ñе више не приказује у\n" +"прозору" + +msgid "" +"\"useopen\" and/or \"split\"; which window to use when jumping\n" +"to a buffer" +msgstr "" +"„useopen†и/или „splitâ€; који прозор Ñе кориÑти када Ñе Ñкаче на\n" +"бафер" + +msgid "a new window is put below the current one" +msgstr "нови прозор Ñе поÑтавља иÑпод текућег" + +msgid "a new window is put right of the current one" +msgstr "нови прозор Ñе поÑтавља деÑно од текућег" + +msgid "this window scrolls together with other bound windows" +msgstr "овај прозор Ñе Ñкролује заједно Ñа оÑталим везаним прозорима" + +msgid "\"ver\", \"hor\" and/or \"jump\"; list of options for 'scrollbind'" +msgstr "„verâ€, „hor†и/или „jumpâ€; лиÑта опција за 'scrollbind'" + +msgid "this window's cursor moves together with other bound windows" +msgstr "" +"курÑор овог прозора Ñе помера заједно Ñа оÑталим везаним\n" +"прозорима" + +msgid "size of a terminal window" +msgstr "величина терминалÑког прозора" + +msgid "key that precedes Vim commands in a terminal window" +msgstr "таÑтер који иде иÑпред Vim команди у терминалÑком прозору" + +msgid "max number of lines to keep for scrollback in a terminal window" +msgstr "" +"макÑималан број линија које Ñе чувају за Ñкроловање уназад у\n" +"терминалÑком прозору" + +msgid "type of pty to use for a terminal window" +msgstr "тип pty који Ñе кориÑти за терминалÑки прозор" + +msgid "name of the winpty dynamic library" +msgstr "име winpty динамичке библиотеке" + +msgid "multiple tab pages" +msgstr "вишеÑтруке картице" + +msgid "0, 1 or 2; when to use a tab pages line" +msgstr "0, 1 или 2; када Ñе кориÑти линија Ñа картицама" + +msgid "maximum number of tab pages to open for -p and \"tab all\"" +msgstr "макÑимални број картица које Ñе отварају за -p и „tab allâ€" + +msgid "custom tab pages line" +msgstr "прилагођена линија Ñа картицама" + +msgid "custom tab page label for the GUI" +msgstr "лабела прилагођене линије Ñа картицама у ГКИ" + +msgid "custom tab page tooltip for the GUI" +msgstr "прилагођени Ñавет алата за картицу у ГКИ" + +msgid "terminal" +msgstr "терминал" + +msgid "name of the used terminal" +msgstr "име терминала који Ñе кориÑти" + +msgid "alias for 'term'" +msgstr "Ð°Ð»Ð¸Ñ˜Ð°Ñ Ð·Ð° 'term'" + +msgid "check built-in termcaps first" +msgstr "најпре Ñе проверава уграђени termcaps" + +msgid "terminal connection is fast" +msgstr "веза Ñа терминалом је брза" + +msgid "terminal that requires extra redrawing" +msgstr "терминал који тражи додатно поновно иÑцртавање" + +msgid "recognize keys that start with in Insert mode" +msgstr "препознају Ñе таÑтери који у режиму Уметање почињу Ñа " + +msgid "minimal number of lines to scroll at a time" +msgstr "минимални број линија које Ñе одједном Ñкролују" + +msgid "maximum number of lines to use scrolling instead of redrawing" +msgstr "" +"макÑимални број линија за које Ñе умеÑто поновног иÑцртавања\n" +"кориÑти Ñкроловање" + +msgid "specifies what the cursor looks like in different modes" +msgstr "наводи како у различитим режимима изгледа курÑор" + +msgid "show info in the window title" +msgstr "у наÑлову прозора Ñе приказују инфомрмације" + +msgid "percentage of 'columns' used for the window title" +msgstr "проценат 'columns' који Ñе кориÑти за наÑлов прозора" + +msgid "when not empty, string to be used for the window title" +msgstr "када није празна, Ñтринг који Ñе кориÑти за наÑлов прозора" + +msgid "string to restore the title to when exiting Vim" +msgstr "Ñтринг који Ñе поÑтавља као наÑлов прозора када Ñе напушта Vim" + +msgid "set the text of the icon for this window" +msgstr "поÑтавља текÑÑ‚ иконе за овај прозор" + +msgid "when not empty, text for the icon of this window" +msgstr "када није празна, текÑÑ‚ за икону овог прозора" + +msgid "restore the screen contents when exiting Vim" +msgstr "враћа Ñадржај екрана када Ñе напушта Vim" + +msgid "using the mouse" +msgstr "употреба миша" + +msgid "list of flags for using the mouse" +msgstr "лиÑта заÑтавица за коришћење миша" + +msgid "the window with the mouse pointer becomes the current one" +msgstr "прозор Ñа показивачем миша поÑтаје текући" + +msgid "the window with the mouse pointer scrolls with the mouse wheel" +msgstr "прозор Ñа показивачем миша Ñе Ñкролује точкићем миша" + +msgid "hide the mouse pointer while typing" +msgstr "показивач миша Ñе Ñакрива док Ñе куца" + +msgid "" +"\"extend\", \"popup\" or \"popup_setpos\"; what the right\n" +"mouse button is used for" +msgstr "" +"„extendâ€, „popup†или „popup_setposâ€; за шта Ñе кориÑти деÑни\n" +"таÑтер миша" + +msgid "maximum time in msec to recognize a double-click" +msgstr "макÑимално време у милиÑекундама за препознавање двоÑтруког клика" + +msgid "\"xterm\", \"xterm2\", \"sgr\", etc.; type of mouse" +msgstr "„xtermâ€, „xterm2â€, „sgrâ€, итд.; тип миша" + +msgid "what the mouse pointer looks like in different modes" +msgstr "како изгледа показивач миша у различитим режимима" + +msgid "GUI" +msgstr "ГКИ" + +msgid "list of font names to be used in the GUI" +msgstr "лиÑта имена фонтова који ће да Ñе кориÑте у ГКИ" + +msgid "pair of fonts to be used, for multibyte editing" +msgstr "пар фонтова који ће да Ñе кориÑте, за уређевање вишебајтног текÑта" + +msgid "list of font names to be used for double-wide characters" +msgstr "" +"лиÑта имена фонтова који треба да Ñе кориÑте за карактере\n" +"двоÑтруке ширине" + +msgid "use smooth, antialiased fonts" +msgstr "кориÑте Ñе глатки, неназубљени фонтови" + +msgid "list of flags that specify how the GUI works" +msgstr "лиÑта заÑтавица које наводе како ради ГКИ" + +msgid "\"icons\", \"text\" and/or \"tooltips\"; how to show the toolbar" +msgstr "„iconsâ€, „text†и/или „tooltipsâ€; како Ñе приказује алатна линија" + +msgid "size of toolbar icons" +msgstr "величина икона алатне линије" + +msgid "room (in pixels) left above/below the window" +msgstr "меÑто (у пикÑелима) лево изнад/иÑпод прозора" + +msgid "options for text rendering" +msgstr "опције за иÑцртавање текÑта" + +msgid "use a pseudo-tty for I/O to external commands" +msgstr "кориÑти Ñе пÑеудо-tty за У/И у Ñпољне команде" + +msgid "" +"\"last\", \"buffer\" or \"current\": which directory used for the file " +"browser" +msgstr "" +"„lastâ€, „buffer†или „currentâ€: који директоријум Ñе кориÑти за\n" +"прегледач фајлова" + +msgid "language to be used for the menus" +msgstr "језик који Ñе кориÑти за меније" + +msgid "maximum number of items in one menu" +msgstr "макÑимални број Ñтавки у једном менију" + +msgid "\"no\", \"yes\" or \"menu\"; how to use the ALT key" +msgstr "„noâ€, „yes†или „menuâ€; како Ñе кориÑти таÑтер ALT" + +msgid "number of pixel lines to use between characters" +msgstr "број пикÑел линија које Ñе кориÑте између карактера" + +msgid "delay in milliseconds before a balloon may pop up" +msgstr "кашњење у милиÑекундама пре него што балон може да иÑкочи" + +msgid "use balloon evaluation in the GUI" +msgstr "у ГКИ Ñе кориÑти израчунавање балона" + +msgid "use balloon evaluation in the terminal" +msgstr "у терминалу Ñе кориÑти израчунавање балона" + +msgid "expression to show in balloon eval" +msgstr "израз који Ñе приказује у балону" + +msgid "printing" +msgstr "штампање" + +msgid "list of items that control the format of :hardcopy output" +msgstr "лиÑта Ñтавки које контролишу формат излаза :hardcopy" + +msgid "name of the printer to be used for :hardcopy" +msgstr "име штампача који Ñе кориÑти за :hardcopy" + +msgid "expression used to print the PostScript file for :hardcopy" +msgstr "израз који Ñе кориÑти код штампања PostScript фајла за :hardcopy" + +msgid "name of the font to be used for :hardcopy" +msgstr "име фонта који ће Ñе кориÑтити за :hardcopy" + +msgid "format of the header used for :hardcopy" +msgstr "формат заглавља које Ñе кориÑти за :hardcopy" + +msgid "encoding used to print the PostScript file for :hardcopy" +msgstr "" +"кодирање које Ñе кориÑти код штампања PostScript фајла за\n" +":hardcopy" + +msgid "the CJK character set to be used for CJK output from :hardcopy" +msgstr "CJK Ñкуп карактера који ће Ñе кориÑтити за CJK излаз из :hardcopy" + +msgid "list of font names to be used for CJK output from :hardcopy" +msgstr "" +"лиÑта имена фонтова који ће Ñе кориÑтити за CJK излаз из\n" +":hardcopy" + +msgid "messages and info" +msgstr "поруке и информације" + +msgid "add 's' flag in 'shortmess' (don't show search message)" +msgstr "" +"додаје Ñе заÑтавица ’s’ у 'shortmess' (не приказује Ñе порука\n" +"претраге)" + +msgid "list of flags to make messages shorter" +msgstr "лиÑта заÑтавица за Ñкраћивање порука" + +msgid "show (partial) command keys in the status line" +msgstr "у ÑтатуÑној линији Ñе приказују (делимични) таÑтери команде" + +msgid "display the current mode in the status line" +msgstr "у ÑтатуÑној линији Ñе приказује текући режим" + +msgid "show cursor position below each window" +msgstr "позиција курÑора Ñе приказује иÑпод Ñваког прозора" + +msgid "alternate format to be used for the ruler" +msgstr "алтернативни формат који ће Ñе кориÑтити за лењир" + +msgid "threshold for reporting number of changed lines" +msgstr "граница за извештавање о броју измењених линија" + +msgid "the higher the more messages are given" +msgstr "што је веће, издаје Ñе више порука" + +msgid "file to write messages in" +msgstr "фајл у који ће да Ñе упиÑују поруке" + +msgid "pause listings when the screen is full" +msgstr "иÑпиÑи Ñе паузирају када Ñе екран напуни" + +msgid "start a dialog when a command fails" +msgstr "када команда не уÑпе да Ñе изврши, покреће Ñе дијалог" + +msgid "ring the bell for error messages" +msgstr "позвони приликом порука о грешки" + +msgid "use a visual bell instead of beeping" +msgstr "употребљава Ñе визуелно звонце умеÑто звучног" + +msgid "do not ring the bell for these reasons" +msgstr "звонце Ñе неће оглашавати у Ñледећим Ñлучајевима" + +msgid "list of preferred languages for finding help" +msgstr "лиÑта жељених језика за проналажење помоћи" + +msgid "selecting text" +msgstr "избор текÑта" + +msgid "\"old\", \"inclusive\" or \"exclusive\"; how selecting text behaves" +msgstr "„oldâ€, „inclusive†или „exclusiveâ€; како Ñе понаша избор текÑта" + +msgid "" +"\"mouse\", \"key\" and/or \"cmd\"; when to start Select mode\n" +"instead of Visual mode" +msgstr "" +"„mouseâ€, „key†и/или „cmdâ€; када Ñе умеÑто Визуелног режима\n" +"покреће режим Избор" + +msgid "" +"\"unnamed\" to use the * register like unnamed register\n" +"\"autoselect\" to always put selected text on the clipboard" +msgstr "" +"„unnamed†да Ñе кориÑти * региÑтар као неименовани региÑтар\n" +"„autoselect†да Ñе изабрани текÑÑ‚ увек Ñтавља у клипборд" + +msgid "\"startsel\" and/or \"stopsel\"; what special keys can do" +msgstr "„startsel†и/или „stopselâ€; шта могу да ураде Ñпецијални таÑтери" + +msgid "editing text" +msgstr "уређивање текÑта" + +msgid "maximum number of changes that can be undone" +msgstr "макÑималан број измена које могу да Ñе пониште" + +msgid "automatically save and restore undo history" +msgstr "иÑторија поништавања Ñе аутоматÑки чува и враћа" + +msgid "list of directories for undo files" +msgstr "лиÑта директоријума за фајлове поништавања" + +msgid "maximum number lines to save for undo on a buffer reload" +msgstr "" +"макÑимални број линија које Ñе чувају за поништавање приликом\n" +"поновног учитавања бафера" + +msgid "changes have been made and not written to a file" +msgstr "промене Ñу извршене, а ниÑу упиÑане у фајл" + +msgid "buffer is not to be written" +msgstr "бафер не може да Ñе упиÑује" + +msgid "changes to the text are possible" +msgstr "могуће Ñу измене текÑта" + +msgid "line length above which to break a line" +msgstr "дужина линије преко које Ñе линија прелама" + +msgid "margin from the right in which to break a line" +msgstr "маргина Ñа деÑне Ñтране у којој Ñе прелама линија" + +msgid "specifies what , CTRL-W, etc. can do in Insert mode" +msgstr "наводи шта у режиму Уметање могу , CTRL-W, итд." + +msgid "definition of what comment lines look like" +msgstr "дефиниција изгледа линије коментара" + +msgid "list of flags that tell how automatic formatting works" +msgstr "лиÑта заÑтавица које говоре како ради аутоматÑко форматирање" + +msgid "pattern to recognize a numbered list" +msgstr "шаблон који препознаје нумериÑану лиÑту" + +msgid "expression used for \"gq\" to format lines" +msgstr "израз који „gq†кориÑти да форматира линије" + +msgid "specifies how Insert mode completion works for CTRL-N and CTRL-P" +msgstr "наводи како ради довршавање у режиму Уметање за CTRL-N и CTRL-P" + +msgid "whether to use a popup menu for Insert mode completion" +msgstr "да ли Ñе за довршавање у режиму Уметање кориÑти иÑкачући мени" + +msgid "options for the Insert mode completion info popup" +msgstr "опције за иÑкачући мени за довршавање у режиму Уметање" + +msgid "maximum height of the popup menu" +msgstr "макÑимална виÑина иÑкачућег менија" + +msgid "minimum width of the popup menu" +msgstr "минимална ширина иÑкачућег менија" + +msgid "user defined function for Insert mode completion" +msgstr "кориÑнички дефиниÑана фунцкија за довршавање у режиму Уметање" + +msgid "function for filetype-specific Insert mode completion" +msgstr "фунцкија за довршавање у режиму Уметање Ñпецифично за тип фајла" + +msgid "list of dictionary files for keyword completion" +msgstr "лиÑта фајлова речника за довршавање кључних речи" + +msgid "list of thesaurus files for keyword completion" +msgstr "лиÑта Ñ‚ÐµÐ·Ð°ÑƒÑ€ÑƒÑ Ñ„Ð°Ñ˜Ð»Ð¾Ð²Ð° за довршавање кључних речи" + +msgid "adjust case of a keyword completion match" +msgstr "" +"подешавање величине Ñлова за подударања код довршавања кључних\n" +"речи" + +msgid "enable entering digraphs with c1 c2" +msgstr "укључивање уноÑа диграфа Ñа к1 к2" + +msgid "the \"~\" command behaves like an operator" +msgstr "команда „~†Ñе понаша као оператор" + +msgid "function called for the \"g@\" operator" +msgstr "функција која Ñе позива за оператор „g@â€" + +msgid "when inserting a bracket, briefly jump to its match" +msgstr "када Ñе умеће заграда, кратко Ñе Ñкаче на њену одговарајућу" + +msgid "tenth of a second to show a match for 'showmatch'" +msgstr "деÑетинки Ñекунде Ñе приказује подударање за 'showmatch'" + +msgid "list of pairs that match for the \"%\" command" +msgstr "лиÑта парова који Ñе подударају командом „%â€" + +msgid "use two spaces after '.' when joining a line" +msgstr "кориÑте Ñе Ñва размака након ’.’ када Ñе Ñпаја линија" + +msgid "" +"\"alpha\", \"octal\", \"hex\", \"bin\" and/or \"unsigned\"; number formats\n" +"recognized for CTRL-A and CTRL-X commands" +msgstr "" +"„alphaâ€, „octalâ€, „hexâ€, „bin†и/или „unsignedâ€; формати бројева\n" +"које препознају команде CTRL-A и CTRL-X" + +msgid "tabs and indenting" +msgstr "табулатори и увлачење" + +msgid "number of spaces a in the text stands for" +msgstr "број размака којим Ñе у текÑту мења један " + +msgid "number of spaces used for each step of (auto)indent" +msgstr "број размака који Ñе кориÑте за Ñваки корак (ауто)увлачења" + +msgid "list of number of spaces a tab counts for" +msgstr "лиÑта броја размака које вреди таб" + +msgid "list of number of spaces a soft tabsstop counts for" +msgstr "лиÑта броја размака које вреди Ñофт табÑтоп" + +msgid "a in an indent inserts 'shiftwidth' spaces" +msgstr " у увлачењу умеће 'shiftwidth' размака" + +msgid "if non-zero, number of spaces to insert for a " +msgstr "ако је различито од нуле, број разнака који Ñе умеће за " + +msgid "round to 'shiftwidth' for \"<<\" and \">>\"" +msgstr "заокружено на 'shiftwidth' за „<<†и „>>â€" + +msgid "expand to spaces in Insert mode" +msgstr "у режиму Уметање Ñе развија у размаке" + +msgid "automatically set the indent of a new line" +msgstr "увлачење нове линије Ñе поÑтавља аутоматÑки" + +msgid "do clever autoindenting" +msgstr "врши Ñе паметно аутоувлачење" + +msgid "enable specific indenting for C code" +msgstr "укључивање увлачења Ñпецифично за C кôд" + +msgid "options for C-indenting" +msgstr "опције за C-увлачење" + +msgid "keys that trigger C-indenting in Insert mode" +msgstr "таÑтери који окидају C-увлачење у режиму Уметање" + +msgid "list of words that cause more C-indent" +msgstr "лиÑта речи које изазивају још C-увлачења" + +msgid "expression used to obtain the indent of a line" +msgstr "израз који Ñе кориÑти за израчунавање увлачњеа линије" + +msgid "keys that trigger indenting with 'indentexpr' in Insert mode" +msgstr "таÑтери који окидају увлачење Ñа 'indentexpr' у режиму Уметање" + +msgid "copy whitespace for indenting from previous line" +msgstr "копира Ñе празан проÑтор за увлачење из претходне линије" + +msgid "preserve kind of whitespace when changing indent" +msgstr "задржава Ñе врÑта празног проÑтора када Ñе мења увлачење" + +msgid "enable lisp mode" +msgstr "укључивање lisp режима" + +msgid "words that change how lisp indenting works" +msgstr "речи које мењају начин рада lisp режима" + +msgid "folding" +msgstr "подвијање" + +msgid "unset to display all folds open" +msgstr "иÑкључите да би Ñе Ñви Ñвијуци приказали отворени" + +msgid "folds with a level higher than this number will be closed" +msgstr "биће затворени Ñвијуци Ñа нивоом подвијања већим од овог броја" + +msgid "value for 'foldlevel' when starting to edit a file" +msgstr "вредноÑÑ‚ за 'foldlevel' када Ñе започне уређивање фајла" + +msgid "width of the column used to indicate folds" +msgstr "ширина колоне која Ñе кориÑти за означавање Ñвијутака" + +msgid "expression used to display the text of a closed fold" +msgstr "израз који Ñе кориÑти за приказивање текÑта затвореног Ñвијутка" + +msgid "set to \"all\" to close a fold when the cursor leaves it" +msgstr "поÑтавите на „all†да Ñе Ñвијутак затвори када га курÑор напуÑти" + +msgid "specifies for which commands a fold will be opened" +msgstr "наводи команде за које ће Ñвијутак бити отворен" + +msgid "minimum number of screen lines for a fold to be closed" +msgstr "минимални број екранÑких линија да би Ñвијутак био затворен" + +msgid "template for comments; used to put the marker in" +msgstr "шаблон за коментаре; кориÑти Ñе да Ñе у њега поÑтави маркер" + +msgid "" +"folding type: \"manual\", \"indent\", \"expr\", \"marker\",\n" +"\"syntax\" or \"diff\"" +msgstr "" +"тип подвијања: „manualâ€, „indentâ€, „exprâ€, „markerâ€,\n" +"„syntax†или „diffâ€" + +msgid "expression used when 'foldmethod' is \"expr\"" +msgstr "израз који Ñе кориÑти када је 'foldmethod' „exprâ€" + +msgid "used to ignore lines when 'foldmethod' is \"indent\"" +msgstr "кориÑти Ñе за игнориÑање линија када је 'foldmethod' „indentâ€" + +msgid "markers used when 'foldmethod' is \"marker\"" +msgstr "маркери који Ñе кориÑте када је 'foldmethod' „markerâ€" + +msgid "maximum fold depth for when 'foldmethod' is \"indent\" or \"syntax\"" +msgstr "" +"макÑимална дубина подвијања када је 'foldmethod' „indent†или\n" +"„syntaxâ€" + +msgid "diff mode" +msgstr "diff режим" + +msgid "use diff mode for the current window" +msgstr "кориÑти Ñе diff режим за текући прозор" + +msgid "options for using diff mode" +msgstr "опције за коришћење diff режима" + +msgid "expression used to obtain a diff file" +msgstr "израз који Ñе кориÑти за добијање diff фајла" + +msgid "expression used to patch a file" +msgstr "израз који Ñе кориÑти за крпљење фајла" + +msgid "mapping" +msgstr "мапирање" + +msgid "maximum depth of mapping" +msgstr "макÑимална дубина мапирања" + +msgid "recognize mappings in mapped keys" +msgstr "мапирања Ñе препознају у мапираним таÑтерима" + +msgid "allow timing out halfway into a mapping" +msgstr "дозвољава Ñе иÑтицање времена на пола мапирања" + +msgid "allow timing out halfway into a key code" +msgstr "дозвољава Ñе иÑтицање времена на пола кода таÑтера" + +msgid "time in msec for 'timeout'" +msgstr "време у милиÑекундама за 'timeout'" + +msgid "time in msec for 'ttimeout'" +msgstr "време у милиÑекундама за 'ttimeout'" + +msgid "reading and writing files" +msgstr "читање и упиÑивање фајлова" + +msgid "enable using settings from modelines when reading a file" +msgstr "" +"омогућавање употребе подешавања из режимÑке линије када Ñе чита\n" +"фајл" + +msgid "allow setting expression options from a modeline" +msgstr "омогућавање поÑтављања опција израза из режимÑке линије" + +msgid "number of lines to check for modelines" +msgstr "број линија које Ñе проверавају на поÑтојање режимÑке линије" + +msgid "binary file editing" +msgstr "уређивање бинарног фајла" + +msgid "last line in the file has an end-of-line" +msgstr "поÑледња линија у фајлу има крај-линије" + +msgid "fixes missing end-of-line at end of text file" +msgstr "поправља недоÑтајуће крај-линије на крају текÑÑ‚ фајла" + +msgid "prepend a Byte Order Mark to the file" +msgstr "поÑтавља Маркер редоÑледа бајтова (BOM) на почетак фајла" + +msgid "end-of-line format: \"dos\", \"unix\" or \"mac\"" +msgstr "формат краја-линије: „dosâ€, „unix†или „macâ€" -msgid "failed to change directory" -msgstr "не може да Ñе промени директоријум" +msgid "list of file formats to look for when editing a file" +msgstr "лиÑта формата фајла који Ñе претражују када Ñе уређује фајл" -#, c-format -msgid "expected 3-tuple as imp.find_module() result, but got %s" -msgstr "Као резултат imp.find_module() очекује Ñе триплет, али је добијено %s" +msgid "obsolete, use 'fileformat'" +msgstr "заÑтарело, кориÑтите 'fileformat'" -#, c-format -msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d" +msgid "obsolete, use 'fileformats'" +msgstr "заÑтарело, кориÑтите 'fileformats'" + +msgid "writing files is allowed" +msgstr "дозвољено је упиÑивање фајлова" + +msgid "write a backup file before overwriting a file" +msgstr "резервни фајл Ñе упиÑује пре препиÑивања фајла" + +msgid "keep a backup after overwriting a file" +msgstr "резервни фајл Ñе након препиÑивања фајла задржава" + +msgid "patterns that specify for which files a backup is not made" +msgstr "шаблони који наводе за које фајлове Ñе не прави резервна копија" + +msgid "whether to make the backup as a copy or rename the existing file" msgstr "" -"Као резултат imp.find_module() очекује Ñе триплет, али је добијена н-торка " -"величине %d" +"да ли Ñе резервни фајл прави као копија или Ñе преименује\n" +"поÑтојећи фајл" -msgid "internal error: imp.find_module returned tuple with NULL" -msgstr "интерна грешка: imp.find_module је вратио н-торку Ñа NULL" +msgid "list of directories to put backup files in" +msgstr "лиÑта директоријума у које Ñе Ñтављају резервни фајлови" -msgid "cannot delete vim.Dictionary attributes" -msgstr "vim.Dictionary атрибути не могу да Ñе обришу" +msgid "file name extension for the backup file" +msgstr "екÑтензија фајла за резервни фајл" -msgid "cannot modify fixed dictionary" -msgstr "фикÑни речник не може да Ñе измени" +msgid "automatically write a file when leaving a modified buffer" +msgstr "фајл Ñе аутоматÑки упиÑује када Ñе напушта измењени бафер" -#, c-format -msgid "cannot set attribute %s" -msgstr "атрибут %s не може да Ñе поÑтави" +msgid "as 'autowrite', but works with more commands" +msgstr "као 'autowrite', али ради Ñа више команди" -msgid "hashtab changed during iteration" -msgstr "hashtab је промењен током итерације" +msgid "always write without asking for confirmation" +msgstr "увек Ñе упиÑује без тражења потврде" -#, c-format -msgid "expected sequence element of size 2, but got sequence of size %d" +msgid "automatically read a file when it was modified outside of Vim" +msgstr "аутоматÑки Ñе чита фајл када је измењен ван програма Vim" + +msgid "keep oldest version of a file; specifies file name extension" msgstr "" -"очекивао Ñе елемент Ñеквенце величине 2, али је добијена Ñеквенца величине %d" +"задржава Ñе најÑтарија верзија фајла; наводи екÑтензију имена\n" +"фајла" -msgid "list constructor does not accept keyword arguments" -msgstr "конÑтруктор лиÑте не прихвата кључне речи за аргументе" +msgid "forcibly sync the file to disk after writing it" +msgstr "након упиÑа, фајл Ñе форÑирано Ñинхронизује на диÑк" -msgid "list index out of range" -msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ð»Ð¸Ñте је ван опÑега" +msgid "use 8.3 file names" +msgstr "кориÑте Ñе 8.3 имена фајлова" -#, c-format -msgid "internal error: failed to get Vim list item %d" -msgstr "интерна грешка: Ñтавка %d vim лиÑте није могла да Ñе добије" +msgid "encryption method for file writing: zip, blowfish or blowfish2" +msgstr "метода шифрирања код упиÑа фајла: zip, blowfish или blowfish2" -msgid "slice step cannot be zero" -msgstr "slice корак не може да буде нула" +msgid "the swap file" +msgstr "swap фајл" -#, c-format -msgid "attempt to assign sequence of size greater than %d to extended slice" -msgstr "покушај доделе Ñеквенце величине веће од %d како би Ñе продужио slice" +msgid "list of directories for the swap file" +msgstr "лиÑта директоријума за swap фајл" -#, c-format -msgid "internal error: no Vim list item %d" -msgstr "интерна грешка: нема Ñтавке %d у vim лиÑти" +msgid "use a swap file for this buffer" +msgstr "swap фајл Ñе кориÑти за овај бафер" -msgid "internal error: not enough list items" -msgstr "интерна грешка: нема довољно Ñтавки лиÑте" +msgid "\"sync\", \"fsync\" or empty; how to flush a swap file to disk" +msgstr "„syncâ€, „fsync†или празно; како Ñе swap празни на диÑк" -msgid "internal error: failed to add item to list" -msgstr "интерна грешка: Ñтавка није могла да Ñе дода лиÑти" +msgid "number of characters typed to cause a swap file update" +msgstr "број откуцаних карактера који покреће ажурирање swap фајла" -#, c-format -msgid "attempt to assign sequence of size %d to extended slice of size %d" +msgid "time in msec after which the swap file will be updated" +msgstr "време у милиÑекундама након кога Ñе ажурира swap фајл" + +msgid "maximum amount of memory in Kbyte used for one buffer" msgstr "" -"покушај доделе Ñеквенце величине %d како би Ñе продужио slice величине %d" +"макÑимална количина меморије у Кбајтима која Ñе кориÑти за један\n" +"бафер" -msgid "failed to add item to list" -msgstr "Ñтавка није могла да Ñе дода лиÑти" +msgid "maximum amount of memory in Kbyte used for all buffers" +msgstr "" +"макÑимална количина меморије у Кбајтима која Ñе кориÑти за Ñве\n" +"бафере" -msgid "cannot delete vim.List attributes" -msgstr "vim.List атрибути не могу да Ñе обришу" +msgid "command line editing" +msgstr "уређивање командне линије" -msgid "cannot modify fixed list" -msgstr "фикÑна лиÑта не може да Ñе измени" +msgid "how many command lines are remembered" +msgstr "колико командних линија Ñе памти" -#, c-format -msgid "unnamed function %s does not exist" -msgstr "неименована функција %s не поÑтоји" +msgid "key that triggers command-line expansion" +msgstr "таÑтери који окидају развијање командне-линије" -#, c-format -msgid "function %s does not exist" -msgstr "функција %s не поÑтоји" +msgid "like 'wildchar' but can also be used in a mapping" +msgstr "као 'wildchar' али може такође да Ñе кориÑти у мапирању" -#, c-format -msgid "failed to run function %s" -msgstr "функција %s није могла да Ñе покрене" +msgid "specifies how command line completion works" +msgstr "наводи како ради довршавање командне линије" -msgid "unable to get option value" -msgstr "вредноÑÑ‚ опције није могла да Ñе добије" +msgid "empty or \"tagfile\" to list file name of matching tags" +msgstr "празно или „tagfile†за иÑÐ¿Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð° фајла ознака које Ñе подударају" -msgid "internal error: unknown option type" -msgstr "интерна грешка: непознат тип опције" +msgid "list of file name extensions that have a lower priority" +msgstr "лиÑта екÑтензија имена фајла које имају нижи приоритет" -msgid "problem while switching windows" -msgstr "проблем код пребацивања прозора" +msgid "list of file name extensions added when searching for a file" +msgstr "лиÑта екÑтензија имена фајла које Ñе додају када Ñе тражи фајл" -#, c-format -msgid "unable to unset global option %s" -msgstr "глобална опција %s није могла да Ñе иÑкључи" +msgid "list of patterns to ignore files for file name completion" +msgstr "лиÑта шаблона за игнориÑање фајлова код довршавања имена фајла" -#, c-format -msgid "unable to unset option %s which does not have global value" -msgstr "опција %s која нема глобалну вредноÑÑ‚ није могла да Ñе иÑкључи" +msgid "ignore case when using file names" +msgstr "не разликује Ñе величина Ñлова када Ñе кориÑте имена фајлова" -msgid "attempt to refer to deleted tab page" -msgstr "покушај рефериÑања на обриÑану картицу" +msgid "ignore case when completing file names" +msgstr "не разликује Ñе величина Ñлова када Ñе довршавају имена фајлова" -msgid "no such tab page" -msgstr "не поÑтоји таква картица" +msgid "command-line completion shows a list of matches" +msgstr "довршавање командне-линије приказује лиÑту подударања" -msgid "attempt to refer to deleted window" -msgstr "покушај рефериÑања на обриÑан прозор" +msgid "key used to open the command-line window" +msgstr "таÑтер који Ñе кориÑти за отварање прозора командне-линије" -msgid "readonly attribute: buffer" -msgstr "атрибут Ñамо за читање: бафер" +msgid "height of the command-line window" +msgstr "виÑина командне-линије" -msgid "cursor position outside buffer" -msgstr "позиција курÑора је ван бафера" +msgid "executing external commands" +msgstr "извршавање Ñпољних команди" -msgid "no such window" -msgstr "нема таквог прозора" +msgid "name of the shell program used for external commands" +msgstr "име програма командног окружења који Ñе кориÑти за Ñпољне команде" -msgid "attempt to refer to deleted buffer" -msgstr "покушај рефериÑања на обриÑан бафер" +msgid "when to use the shell or directly execute a command" +msgstr "када Ñе кориÑти командно окружење а када директно извршава команда" -msgid "failed to rename buffer" -msgstr "име бафера није могло да Ñе промени" +msgid "character(s) to enclose a shell command in" +msgstr "карактер(и) којима Ñе уоквирује команда командног окружења" -msgid "mark name must be a single character" -msgstr "име маркера мора бити Ñамо један карактер" +msgid "like 'shellquote' but include the redirection" +msgstr "као 'shellquote' али укључује редирекцију" -#, c-format -msgid "expected vim.Buffer object, but got %s" -msgstr "очекивао Ñе vim.Buffer објекат, али је добијен %s" +msgid "characters to escape when 'shellxquote' is (" +msgstr "карактери који Ñе означавају када је 'shellxquote' (" -#, c-format -msgid "failed to switch to buffer %d" -msgstr "прелазак на бафер %d није био могућ" +msgid "argument for 'shell' to execute a command" +msgstr "аргумент за 'shell' којим Ñе извршава команда" -#, c-format -msgid "expected vim.Window object, but got %s" -msgstr "очекивао Ñе vim.Window објекат, али је добијен %s" +msgid "used to redirect command output to a file" +msgstr "кориÑти Ñе за редирекцију излаза команде у фајл" -msgid "failed to find window in the current tab page" -msgstr "прозор није пронађен у текућој картици" +msgid "use a temp file for shell commands instead of using a pipe" +msgstr "" +"умеÑто пајпа, за команде командног окружења Ñе кориÑти привремени\n" +"фајл" -msgid "did not switch to the specified window" -msgstr "није Ñе прешло у наведени прозор" +msgid "program used for \"=\" command" +msgstr "програм који Ñе кориÑти за команду „=â€" -#, c-format -msgid "expected vim.TabPage object, but got %s" -msgstr "очекивао Ñе vim.TabPage објекат, али је добијен %s" +msgid "program used to format lines with \"gq\" command" +msgstr "програм који Ñе кориÑти за форматирање линија командом „gqâ€" -msgid "did not switch to the specified tab page" -msgstr "није Ñе прешло у наведену картицу" +msgid "program used for the \"K\" command" +msgstr "програм који Ñе кориÑти за команду „Kâ€" -msgid "failed to run the code" -msgstr "кôд није могао да Ñе покрене" +msgid "warn when using a shell command and a buffer has changes" +msgstr "" +"упозорава Ñе када Ñе кориÑти команда командног окружења, а бафер\n" +"је претрпео измене" -msgid "E858: Eval did not return a valid python object" -msgstr "E858: Eval није вратио важећи python објекат" +msgid "running make and jumping to errors (quickfix)" +msgstr "покретање make и Ñкакање на грешке (quickfix)" -msgid "E859: Failed to convert returned python object to a Vim value" -msgstr "E859: Конверзија враћеног python објекта у vim вредноÑÑ‚ није уÑпела" +msgid "name of the file that contains error messages" +msgstr "име фајла који Ñадржи поруке о грешкама" -#, c-format -msgid "unable to convert %s to a Vim dictionary" -msgstr "%s не може да Ñе конвертује у vim речник" +msgid "list of formats for error messages" +msgstr "лиÑта формата порука о грешкама" -#, c-format -msgid "unable to convert %s to a Vim list" -msgstr "%s не може да Ñе конвертује у vim лиÑту" +msgid "program used for the \":make\" command" +msgstr "програм који Ñе кориÑти за команду „:make†command" -#, c-format -msgid "unable to convert %s to a Vim structure" -msgstr "%s не може да Ñе конвертује у vim Ñтруктуру" +msgid "string used to put the output of \":make\" in the error file" +msgstr "" +"Ñтринг који Ñе кориÑти за Ñтављање излаза команде „:make†у фајл\n" +"грешака" -msgid "internal error: NULL reference passed" -msgstr "интерна грешка: проÑлеђена је NULL референца" +msgid "name of the errorfile for the 'makeprg' command" +msgstr "име фајла грешака за команду 'makeprg'" -msgid "internal error: invalid value type" -msgstr "интерна грешка: вредноÑÑ‚ неважећег типа" +msgid "program used for the \":grep\" command" +msgstr "програм који Ñе кориÑти за команду „:grepâ€" -msgid "" -"Failed to set path hook: sys.path_hooks is not a list\n" -"You should now do the following:\n" -"- append vim.path_hook to sys.path_hooks\n" -"- append vim.VIM_SPECIAL_PATH to sys.path\n" +msgid "list of formats for output of 'grepprg'" +msgstr "лиÑта формата за излаз команде 'grepprg'" + +msgid "encoding of the \":make\" and \":grep\" output" +msgstr "кодирање излаза команди „:make†и „:grepâ€" + +msgid "function to display text in the quickfix window" +msgstr "функција за приказивање текÑта у quickfix прозору" + +msgid "system specific" +msgstr "опције Ñпецифичне за ÑиÑтем" + +msgid "use forward slashes in file names; for Unix-like shells" +msgstr "у именима фајлова Ñе кориÑте коÑе црте; за окружења Ñлична Unix" + +msgid "specifies slash/backslash used for completion" +msgstr "наводи коÑу/обрнуту коÑу црту која Ñе кориÑти за довршавање" + +msgid "language specific" +msgstr "опције Ñпецифичне за језик" + +msgid "specifies the characters in a file name" +msgstr "наводи карактере у имену фајла" + +msgid "specifies the characters in an identifier" +msgstr "наводи карактере у идентификатору" + +msgid "specifies the characters in a keyword" +msgstr "наводи карактере у кључној речи" + +msgid "specifies printable characters" +msgstr "наводи карактере који могу да Ñе одштампају" + +msgid "specifies escape characters in a string" +msgstr "наводи карактере за обележавање у Ñтрингу" + +msgid "display the buffer right-to-left" +msgstr "приказује бафер Ñ Ð´ÐµÑна-у-лево" + +msgid "when to edit the command-line right-to-left" +msgstr "када Ñе командна-линија уређује Ñ Ð´ÐµÑна-у-лево" + +msgid "insert characters backwards" +msgstr "умерање карактера уназад" + +msgid "allow CTRL-_ in Insert and Command-line mode to toggle 'revins'" msgstr "" -"Кука за путању није могла да Ñе поÑтави: sys.path_hooks није у лиÑти\n" -"Сада би требало да урадите Ñледеће:\n" -"- додајте vim.path_hook на крај sys.path_hooks\n" -"- додајте vim.VIM_SPECIAL_PATH на крај sys.path\n" +"дозвољава да CTRL-_ у режиму Уметање и Командна линија мења Ñтање\n" +"опције 'revins'" -msgid "" -"Failed to set path: sys.path is not a list\n" -"You should now append vim.VIM_SPECIAL_PATH to sys.path" +msgid "the ASCII code for the first letter of the Hebrew alphabet" +msgstr "ASCII кôд за прво Ñлово хебрејÑког алфабета" + +msgid "use Hebrew keyboard mapping" +msgstr "кориÑти Ñе хебрејÑко мапирање таÑтатуре" + +msgid "use phonetic Hebrew keyboard mapping" +msgstr "кориÑти Ñе фонетÑко хебрејÑко мапирање таÑтатуре" + +msgid "prepare for editing Arabic text" +msgstr "припрема за уређивање арапÑког текÑта" + +msgid "perform shaping of Arabic characters" +msgstr "обављање уобличавања арапÑких карактера" + +msgid "terminal will perform bidi handling" +msgstr "терминал врши биди обраду" + +msgid "name of a keyboard mapping" +msgstr "име мапирања таÑтатуре" + +msgid "list of characters that are translated in Normal mode" +msgstr "лиÑта карактера који Ñу преведени у Ðормалном режиму" + +msgid "apply 'langmap' to mapped characters" +msgstr "'langmap' Ñе примењује на мапиране карактере" + +msgid "when set never use IM; overrules following IM options" msgstr "" -"Путања није могла да Ñе поÑтави: sys.path није у лиÑти\n" -"Сада би требало да додате vim.VIM_SPECIAL_PATH на крај sys.path" +"када је поÑтављена, IM Ñе никада не кориÑти; преиначује\n" +"наредне IM опције" -msgid "" -"Vim macro files (*.vim)\t*.vim\n" -"All Files (*.*)\t*.*\n" +msgid "in Insert mode: 1: use :lmap; 2: use IM; 0: neither" msgstr "" -"Vim макро фајлови (*.vim)\t*.vim\n" -"Сви фајлови (*.*)\t*.*\n" +"у режиму Уметање: 1: кориÑти Ñе :lmap; 2: кориÑти Ñе IM;\n" +"0: ниједно" -msgid "All Files (*.*)\t*.*\n" -msgstr "Сви фајлови (*.*)\t*.*\n" +msgid "input method style, 0: on-the-spot, 1: over-the-spot" +msgstr "Ñтил методе уноÑа, 0: on-the-spot, 1: over-the-spot" -msgid "" -"All Files (*.*)\t*.*\n" -"C source (*.c, *.h)\t*.c;*.h\n" -"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n" -"VB code (*.bas, *.frm)\t*.bas;*.frm\n" -"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +msgid "entering a search pattern: 1: use :lmap; 2: use IM; 0: neither" msgstr "" -"Сви фајлови (*.*)\t*.*\n" -"C изворни код (*.c, *.h)\t*.c;*.h\n" -"C++ изворни код (*.cpp, *.hpp)\t*.cpp;*.hpp\n" -"VB код (*.bas, *.frm)\t*.bas;*.frm\n" -"Vim фајлови (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +"ÑƒÐ½Ð¾Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° претраге: 1: кориÑти Ñе :lmap; 2: кориÑти Ñе IM;\n" +"0: ниједно" + +msgid "when set always use IM when starting to edit a command line" +msgstr "" +"када је поÑтављена, IM Ñе увек кориÑти када Ñе започиње\n" +"уређивање командне линије" + +msgid "function to obtain IME status" +msgstr "функција за добијање ÑтатуÑа IME" + +msgid "function to enable/disable IME" +msgstr "функција за укључивање/иÑкључивање IME" + +msgid "multi-byte characters" +msgstr "вишебајтни карактери" msgid "" -"Vim macro files (*.vim)\t*.vim\n" -"All Files (*)\t*\n" +"character encoding used in Vim: \"latin1\", \"utf-8\",\n" +"\"euc-jp\", \"big5\", etc." msgstr "" -"Vim макро фајлови (*.vim)\t*.vim\n" -"Сви фајлови (*)\t*\n" +"кодирање карактера које Ñе кориÑти у програму Vim: „latin1â€,\n" +"„utf-8â€, „euc-jpâ€, „big5â€, итд." -msgid "All Files (*)\t*\n" -msgstr "Сви фајлови (*)\t*\n" +msgid "character encoding for the current file" +msgstr "кодирање карактера за текући фајл" + +msgid "automatically detected character encodings" +msgstr "кодирања карактера која Ñе аутоматÑки детектују" + +msgid "character encoding used by the terminal" +msgstr "кодирање карактера које кориÑти терминал" + +msgid "expression used for character encoding conversion" +msgstr "израз који Ñе корÑти за конверзију кодирања карактера" + +msgid "delete combining (composing) characters on their own" +msgstr "бриÑање Ñамих комбинујућих (компонујућих) карактера" + +msgid "maximum number of combining (composing) characters displayed" +msgstr "" +"макÑимални број комбинујућих (компонујућих) карактера који Ñе\n" +"приказују" + +msgid "key that activates the X input method" +msgstr "таÑтер који активира X метод уноÑа" + +msgid "width of ambiguous width characters" +msgstr "ширина карактера двоÑмиÑлене ширине" + +msgid "emoji characters are full width" +msgstr "имоџи карактери Ñу пуне ширине" + +msgid "various" +msgstr "разно" msgid "" -"All Files (*)\t*\n" -"C source (*.c, *.h)\t*.c;*.h\n" -"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n" -"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +"when to use virtual editing: \"block\", \"insert\", \"all\"\n" +"and/or \"onemore\"" msgstr "" -"Сви фајлови (*)\t*\n" -"C изворни код (*.c, *.h)\t*.c;*.h\n" -"C++ изворни код (*.cpp, *.hpp)\t*.cpp;*.hpp\n" -"Vim фајлови (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +"када Ñе кориÑти виртуелно уређивање: „blockâ€, „insertâ€, „allâ€\n" +"и/или „onemoreâ€" -msgid "GVim" -msgstr "GVim" +msgid "list of autocommand events which are to be ignored" +msgstr "лиÑта догађаја аутокоманди који треба да Ñе игноришу" -msgid "Text Editor" -msgstr "ТекÑÑ‚ Едитор" +msgid "load plugin scripts when starting up" +msgstr "Ñкрипте додатака Ñе учитавају током покретања" -msgid "Edit text files" -msgstr "Уређивање текÑÑ‚ фајлова" +msgid "enable reading .vimrc/.exrc/.gvimrc in the current directory" +msgstr "омогућава Ñе читање .vimrc/.exrc/.gvimrc у текућем директоријуму" -msgid "Text;editor;" -msgstr "ТекÑÑ‚;едитор;" +msgid "safer working with script files in the current directory" +msgstr "безбеднији рад Ñа Ñкрипт фајловима у текућем директоријуму" -msgid "gvim" -msgstr "gvim" +msgid "use the 'g' flag for \":substitute\"" +msgstr "кориÑти Ñе заÑтавица ’g’ за „:substituteâ€" + +msgid "'g' and 'c' flags of \":substitute\" toggle" +msgstr "’g’ и ’c’ заÑтавице команде \":substitute\" мењају Ñтање" + +msgid "allow reading/writing devices" +msgstr "дозвољава Ñе читање/ÑƒÐ¿Ð¸Ñ Ð½Ð° уређаје" + +msgid "maximum depth of function calls" +msgstr "макÑимална дубина позива функција" + +msgid "list of words that specifies what to put in a session file" +msgstr "лиÑта речи које наводе шта да Ñе Ñтави у фајл ÑеÑије" + +msgid "list of words that specifies what to save for :mkview" +msgstr "лиÑта речи које наводе шта чува команда :mkview" + +msgid "directory where to store files with :mkview" +msgstr "директоријум у који :mkview чува фајлове" + +msgid "list that specifies what to write in the viminfo file" +msgstr "лиÑта која наводи шта Ñе упиÑује у viminfo фајл" + +msgid "file name used for the viminfo file" +msgstr "име фајла које Ñе кориÑти за viminfo фајл" + +msgid "what happens with a buffer when it's no longer in a window" +msgstr "шта Ñе дешава Ñа бафером када више није у прозору" + +msgid "empty, \"nofile\", \"nowrite\", \"quickfix\", etc.: type of buffer" +msgstr "празно, „nofileâ€, „nowriteâ€, „quickfixâ€, итд.: тип бафера" + +msgid "whether the buffer shows up in the buffer list" +msgstr "да ли Ñе бафер појављује у лиÑти бафера" + +msgid "set to \"msg\" to see all error messages" +msgstr "поÑтавите на „msg†да видите Ñве поруке о грешкама" + +msgid "whether to show the signcolumn" +msgstr "да ли Ñе приказује колона за знаке" + +msgid "interval in milliseconds between polls for MzScheme threads" +msgstr "интервал у милиÑекундама између прозивања за MzScheme нити" + +msgid "name of the Lua dynamic library" +msgstr "име Lua динамичке библиотеке" + +msgid "name of the Perl dynamic library" +msgstr "име Perl динамичке библиотеке" + +msgid "whether to use Python 2 or 3" +msgstr "да ли Ñе кориÑти Python 2 или 3" + +msgid "name of the Python 2 dynamic library" +msgstr "име Python 2 динамичке библиотеке" + +msgid "name of the Python 2 home directory" +msgstr "име Python 2 почетног директоријума" + +msgid "name of the Python 3 dynamic library" +msgstr "име Python 3 динамичке библиотеке" + +msgid "name of the Python 3 home directory" +msgstr "име Python 3 почетног директоријума" + +msgid "name of the Ruby dynamic library" +msgstr "име Ruby динамичке библиотеке" + +msgid "name of the Tcl dynamic library" +msgstr "име Tcl динамичке библиотеке" + +msgid "name of the MzScheme dynamic library" +msgstr "име MzScheme динамичке библиотеке" + +msgid "name of the MzScheme GC dynamic library" +msgstr "име MzScheme GC динамичке библиотеке" -msgid "Vim" -msgstr "Vim" diff -Nru vim-8.2.1913/src/po/tr.po vim-8.2.2434/src/po/tr.po --- vim-8.2.1913/src/po/tr.po 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/po/tr.po 2021-01-30 22:05:11.000000000 +0000 @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: Vim Turkish Localization Project\n" "Report-Msgid-Bugs-To: Emir SARI \n" -"POT-Creation-Date: 2020-09-04 18:43+0300\n" -"PO-Revision-Date: 2020-09-04 21:30+0300\n" +"POT-Creation-Date: 2020-11-29 00:20+0300\n" +"PO-Revision-Date: 2020-11-29 20:00+0300\n" "Last-Translator: Emir SARI \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -45,7 +45,7 @@ msgstr "E367: Böyle bir grup yok: \"%s\"" msgid "E936: Cannot delete the current group" -msgstr "E936: Mevcut grup silinemiyor" +msgstr "E936: Geçerli grup silinemiyor" msgid "W19: Deleting augroup that is still in use" msgstr "W19: Kullanımda olan otokomut grubu siliniyor" @@ -132,7 +132,7 @@ msgstr "E937: Kullanımda olan bir arabellek silinmeye çalışılıyor: %s" msgid "E515: No buffers were unloaded" -msgstr "E515: Hiçbir arabellek kaldırılmadı" +msgstr "E515: Hiçbir arabellek bellekten kaldırılmadı" msgid "E516: No buffers were deleted" msgstr "E516: Hiçbir arabellek silinmedi" @@ -143,8 +143,8 @@ #, c-format msgid "%d buffer unloaded" msgid_plural "%d buffers unloaded" -msgstr[0] "%d arabellek kaldırıldı" -msgstr[1] "%d arabellek kaldırıldı" +msgstr[0] "%d arabellek bellekten kaldırıldı" +msgstr[1] "%d arabellek bellekten kaldırıldı" #, c-format msgid "%d buffer deleted" @@ -159,7 +159,7 @@ msgstr[1] "%d arabellek yok edildi" msgid "E90: Cannot unload last buffer" -msgstr "E90: Son arabellek kaldırılamıyor" +msgstr "E90: Son arabellek bellekten kaldırılamıyor" msgid "E84: No modified buffer found" msgstr "E84: DeÄŸiÅŸtirilmiÅŸ bir arabellek bulunamadı" @@ -454,19 +454,6 @@ msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel" msgstr "E912: ch_evalexpr()/ch_sendexpr() raw/nl kanalları ile kullanılamaz" -msgid "E920: _io file requires _name to be set" -msgstr "E920: _io dosyası _name ayarlı olmasını gerektirir" - -msgid "E915: in_io buffer requires in_buf or in_name to be set" -msgstr "E915: in_io arabelleÄŸi in_buf veya in_name ayarlı olmasını gerektirir" - -#, c-format -msgid "E918: buffer must be loaded: %s" -msgstr "E918: Arabellek yüklenmiÅŸ olmalıdır: %s" - -msgid "E916: not a valid job" -msgstr "E916: Geçerli bir iÅŸ deÄŸil" - msgid "No display" msgstr "Görüntü yok" @@ -747,12 +734,6 @@ msgid "E996: Cannot lock a range" msgstr "E996: Erim kilitlenemiyor" -msgid "E710: List value has more items than target" -msgstr "E710: Liste deÄŸeri hedeften daha fazla ögeye sahip" - -msgid "E711: List value has not enough items" -msgstr "E711: Liste deÄŸeri yeterli ögeye sahip deÄŸil" - msgid "E996: Cannot lock a list or dict" msgstr "E996: Bir liste veya sözlük kilitlenemiyor" @@ -1177,7 +1158,7 @@ #, c-format msgid "Tab page %d" -msgstr "Sekme %d" +msgstr "Sekme sayfası %d" msgid "No swap file" msgstr "Takas dosyası yok" @@ -1338,6 +1319,9 @@ msgid "E733: Using :endwhile with :for" msgstr "E733: :endwhile, :for ile kullanılıyor" +msgid "E579: block nesting too deep" +msgstr "E579: İç içe geçmeler çok derin" + msgid "E601: :try nesting too deep" msgstr "E601: :try çok iç içe geçmiÅŸ" @@ -1680,15 +1664,15 @@ msgid "E232: Cannot create BalloonEval with both message and callback" msgstr "E232: Hem ileti hem de geri çağırma ile BallonEval oluÅŸturulamıyor" -msgid "_Cancel" -msgstr "Ä°_ptal" - msgid "_Save" msgstr "_Kaydet" msgid "_Open" msgstr "_Aç" +msgid "_Cancel" +msgstr "Ä°_ptal" + msgid "_OK" msgstr "_Tamam" @@ -2587,6 +2571,19 @@ msgid "match %d" msgstr "eÅŸleÅŸme %d" +msgid "E920: _io file requires _name to be set" +msgstr "E920: _io dosyası _name ayarlı olmasını gerektirir" + +msgid "E915: in_io buffer requires in_buf or in_name to be set" +msgstr "E915: in_io arabelleÄŸi in_buf veya in_name ayarlı olmasını gerektirir" + +#, c-format +msgid "E918: buffer must be loaded: %s" +msgstr "E918: Arabellek yüklenmiÅŸ olmalıdır: %s" + +msgid "E916: not a valid job" +msgstr "E916: Geçerli bir iÅŸ deÄŸil" + #, c-format msgid "E491: json decode error at '%s'" msgstr "E491: '%s' konumunda json çözümü hatası" @@ -2624,6 +2621,9 @@ msgid "map() argument" msgstr "map() deÄŸiÅŸkeni" +msgid "mapnew() argument" +msgstr "mapnew() deÄŸiÅŸkeni" + msgid "filter() argument" msgstr "filter() deÄŸiÅŸkeni" @@ -3326,7 +3326,7 @@ msgstr "Ek bilgi için \":help E312\" yazın." msgid "Recovery completed. You should check if everything is OK." -msgstr "Kurtarma tamamlandı. Her ÅŸey tamam mı diye bir bakın." +msgstr "Kurtarma tamamlandı. Her ÅŸey yolunda mı diye lütfen bir bakın." msgid "" "\n" @@ -3343,12 +3343,17 @@ msgid "" "\n" -"You may want to delete the .swp file now.\n" -"\n" +"You may want to delete the .swp file now." msgstr "" "\n" -"Bu .swp dosyasını silmeniz iyi olur.\n" +"Bu .swp dosyasını silmeniz iyi olur." + +msgid "" +"\n" +"Note: process STILL RUNNING: " +msgstr "" "\n" +"Not: Ä°ÅŸlem HÂL ÇALIÅžIYOR: " msgid "Using crypt key from swap file for the text file.\n" msgstr "" @@ -3653,6 +3658,10 @@ msgstr "E337: Menü bulunamadı - menü adlarını denetle" #, c-format +msgid "Error detected while compiling %s:" +msgstr "%s derlenirken hata tespit edildi:" + +#, c-format msgid "Error detected while processing %s:" msgstr "%s iÅŸlenirken hata tespit edildi:" @@ -3990,7 +3999,6 @@ msgid "E540: Unclosed expression sequence" msgstr "E540: Kapatılmamış ifade sıralaması" - msgid "E542: unbalanced groups" msgstr "E542: DengelenmemiÅŸ gruplar" @@ -4315,8 +4323,11 @@ msgid "E553: No more items" msgstr "E553: Öge yok" +msgid "E925: Current quickfix list was changed" +msgstr "E925: Geçerli hızlı düzelt listesi deÄŸiÅŸtirildi" + msgid "E926: Current location list was changed" -msgstr "E926: Mevcut konum listesi deÄŸiÅŸtirildi" +msgstr "E926: Geçerli konum listesi deÄŸiÅŸtirildi" #, c-format msgid "E372: Too many %%%c in format string" @@ -4348,10 +4359,7 @@ msgstr "E379: Eksik veya boÅŸ dizin adı" msgid "E924: Current window was closed" -msgstr "E924: Mevcut pencere kapatıldı" - -msgid "E925: Current quickfix was changed" -msgstr "E925: Mevcut hızlı düzelt deÄŸiÅŸtirildi" +msgstr "E924: Geçerli pencere kapatıldı" #, c-format msgid "(%d of %d)%s%s: " @@ -5261,13 +5269,13 @@ msgstr "sözdizim kıvırma düzeyi an az" msgid "syntax spell toplevel" -msgstr "sözdizim yazım denetimi üst düzeyde" +msgstr "bir sözdizim içinde olmayan metinde yazım denetimi yap" msgid "syntax spell notoplevel" -msgstr "sözdizim yazım denetimi üst düzeyde deÄŸil" +msgstr "bir sözdizim içinde olmayan metinde yazım denetimi yapma" msgid "syntax spell default" -msgstr "sözdizim yazım denetimi varsayılan" +msgstr "@Spell kümesi varsa yazım denetimi yapma (öntanımlı)" msgid "syntax iskeyword " msgstr "sözdizim anahtar sözcük" @@ -5285,6 +5293,9 @@ msgid "no syncing" msgstr "eÅŸitleme yok" +msgid "syncing starts at the first line" +msgstr "eÅŸitleme ilk satırda baÅŸlar" + msgid "syncing starts " msgstr "eÅŸitleme baÅŸlangıcı " @@ -5316,6 +5327,9 @@ msgid "E392: No such syntax cluster: %s" msgstr "E392: Böyle bir sözdizim kümesi yok: %s" +msgid "from the first line" +msgstr "ilk satırdan" + msgid "minimal " msgstr "en az biçimde " @@ -5506,7 +5520,7 @@ msgstr "Yinelenen alan adı: %s" msgid "' not known. Available builtin terminals are:" -msgstr "' bilinmiyor. Mevcut uçbirimler ÅŸunlar:" +msgstr "' bilinmiyor. Kullanılabilir uçbirimler ÅŸunlar:" msgid "defaulting to '" msgstr "öntanımlı olarak '" @@ -5576,13 +5590,6 @@ msgid "E982: ConPTY is not available" msgstr "E982: ConPTY mevcut deÄŸil" -msgid "" -"E856: assert_fails() second argument must be a string or a list with one or " -"two strings" -msgstr "" -"E856: assert_fails() ikinci deÄŸiÅŸkeni bir dizi veya bir veya iki dizili bir " -"liste olmalıdır" - #, c-format msgid "E971: Property type %s does not exist" msgstr "E971: Özellik türü %s mevcut deÄŸil" @@ -5599,7 +5606,7 @@ msgstr "E965: Özellik tür adı eksik" msgid "E275: Cannot add text property to unloaded buffer" -msgstr "E275: YüklenmemiÅŸ arabelleÄŸe metin özelliÄŸi eklenemiyor" +msgstr "E275: Bellekten kaldırılmış arabelleÄŸe metin özelliÄŸi eklenemiyor" msgid "E967: text property info corrupted" msgstr "E967: Metin özellik bilgisi hasarlı" @@ -6613,18 +6620,31 @@ msgid "E476: Invalid command: %s" msgstr "E476: Geçersiz komut: %s" -msgid "E719: cannot slice a Dictionary" +msgid "E710: List value has more items than targets" +msgstr "E710: Liste deÄŸeri hedeften daha fazla ögeye sahip" + +msgid "E711: List value does not have enough items" +msgstr "E711: Liste deÄŸeri yeterli ögeye sahip deÄŸil" + +msgid "E719: Cannot slice a Dictionary" msgstr "E719: Bir Sözlük dilimlenemiyor" +msgid "" +"E856: \"assert_fails()\" second argument must be a string or a list with one " +"or two strings" +msgstr "" +"E856: \"assert_fails()\" ikinci deÄŸiÅŸkeni bir dizi veya bir veya iki dizili " +"bir liste olmalıdır" + msgid "E909: Cannot index a special variable" msgstr "E909: Özel bir deÄŸiÅŸken dizinlenemiyor" #, c-format -msgid "E1100: Missing :let: %s" -msgstr "E1100: :let eksik: %s" +msgid "E1100: Missing :var: %s" +msgstr "E1100: :var eksik: %s" #, c-format -msgid "E1001: variable not found: %s" +msgid "E1001: Variable not found: %s" msgstr "E1001: DeÄŸiÅŸken bulunamadı: %s" #, c-format @@ -6635,7 +6655,7 @@ msgstr "E1003: Dönüş deÄŸeri eksik" #, c-format -msgid "E1004: white space required before and after '%s'" +msgid "E1004: White space required before and after '%s'" msgstr "E1004: '%s' öncesinde ve sonrasında boÅŸluk gerekiyor" msgid "E1005: Too many argument types" @@ -6645,7 +6665,7 @@ msgid "E1006: %s is used as an argument" msgstr "E1006: %s bir deÄŸiÅŸken olarak kullanılıyor" -msgid "E1007: mandatory argument after optional argument" +msgid "E1007: Mandatory argument after optional argument" msgstr "E1007: Ä°steÄŸe baÄŸlı deÄŸiÅŸken sonrasında zorunlu deÄŸiÅŸken" msgid "E1008: Missing " @@ -6659,15 +6679,15 @@ msgstr "E1010: Tür tanımlanamadı: %s" #, c-format -msgid "E1011: name too long: %s" +msgid "E1011: Name too long: %s" msgstr "E1011: Ad çok uzun: %s" #, c-format -msgid "E1012: type mismatch, expected %s but got %s" +msgid "E1012: Type mismatch; expected %s but got %s" msgstr "E1012: Tür uyumsuzluÄŸu, %s bekleniyordu, ancak %s alındı" #, c-format -msgid "E1013: argument %d: type mismatch, expected %s but got %s" +msgid "E1013: Argument %d: type mismatch, expected %s but got %s" msgstr "E1013: %d deÄŸiÅŸkeni: Tür uyumsuzluÄŸu, %s bekleniyordu, ancak %s alındı" #, c-format @@ -6698,13 +6718,13 @@ msgstr "E1019: Yalnızca bir diziye birleÅŸtirilebilir" #, c-format -msgid "E1020: cannot use an operator on a new variable: %s" +msgid "E1020: Cannot use an operator on a new variable: %s" msgstr "E1020: Yeni bir deÄŸiÅŸken üzerinde bir iÅŸleç kullanılamaz: %s" -msgid "E1021: const requires a value" -msgstr "E1021: Sabit, bir deÄŸer gerektiriyor" +msgid "E1021: Const requires a value" +msgstr "E1021: Sabit, bir deÄŸer gerektirir" -msgid "E1022: type or initialization required" +msgid "E1022: Type or initialization required" msgstr "E1022: Tür veya ilklendirme gerekiyor" #, c-format @@ -6714,7 +6734,7 @@ msgid "E1024: Using a Number as a String" msgstr "E1024: Bir Sayı, bir Dizi yerine kullanılıyor" -msgid "E1025: using } outside of a block scope" +msgid "E1025: Using } outside of a block scope" msgstr "E1025: } bir blok kapsamı dışında kullanılıyor" msgid "E1026: Missing }" @@ -6723,23 +6743,24 @@ msgid "E1027: Missing return statement" msgstr "E1027: Dönüş ifadesi eksik" -msgid "E1028: compile_def_function failed" -msgstr "E1028: compile_def_function baÅŸarısız" +msgid "E1028: Compiling :def function failed" +msgstr "E1028: :def iÅŸlevi derleme baÅŸarısız" #, c-format msgid "E1029: Expected %s but got %s" msgstr "E1029: %s bekleniyordu ancak %s alındı" -msgid "E1030: Using a String as a Number" -msgstr "E1030: Bir Dizi, bir Sayı yerine kullanılıyor" +#, c-format +msgid "E1030: Using a String as a Number: \"%s\"" +msgstr "E1030: Bir Dizi, bir Sayı yerine kullanılıyor: \"%s\"" msgid "E1031: Cannot use void value" msgstr "E1031: BoÅŸ deÄŸer kullanılamaz" -msgid "E1032: missing :catch or :finally" +msgid "E1032: Missing :catch or :finally" msgstr "E1032: :catch veya :finally eksik" -msgid "E1033: catch unreachable after catch-all" +msgid "E1033: Catch unreachable after catch-all" msgstr "E1033: catch-all sonrası catch ulaşılamıyor" #, c-format @@ -6747,21 +6768,21 @@ msgstr "E1034: Ayrılmış ad %s kullanılamaz" msgid "E1035: % requires number arguments" -msgstr "E1035: %, sayı deÄŸiÅŸkenler gerektiriyor" +msgstr "E1035: %, sayı deÄŸiÅŸkenler gerektirir" #, c-format msgid "E1036: %c requires number or float arguments" -msgstr "E1036: %c, sayı veya kayan noktalı deÄŸer deÄŸiÅŸkenler gerektiriyor" +msgstr "E1036: %c, sayı veya kayan noktalı deÄŸer deÄŸiÅŸkenler gerektirir" #, c-format msgid "E1037: Cannot use \"%s\" with %s" msgstr "E1037: \"%s\", %s ile birlikte kullanılamaz" -msgid "E1038: vim9script can only be used in a script" -msgstr "E1038: vim9script yalnızca bir betikte kullanılabilir" +msgid "E1038: \"vim9script\" can only be used in a script" +msgstr "E1038: \"vim9script\" yalnızca bir betikte kullanılabilir" -msgid "E1039: vim9script must be the first command in a script" -msgstr "E1039: vim9script bir betikteki ilk komut olmalıdır" +msgid "E1039: \"vim9script\" must be the first command in a script" +msgstr "E1039: \"vim9script\" bir betikteki ilk komut olmalıdır" msgid "E1040: Cannot use :scriptversion after :vim9script" msgstr "E1040: :vim9script sonrası :scriptversion kullanılamaz" @@ -6770,13 +6791,13 @@ msgid "E1041: Redefining script item %s" msgstr "E1041: Betik ögesi %s yeniden tanımlanıyor" -msgid "E1042: export can only be used in vim9script" -msgstr "E1042: Dışa aktarma yalnızca vim9script içinde kullanılabilir" +msgid "E1042: Export can only be used in vim9script" +msgstr "E1042: Dışa aktarım yalnızca vim9script içinde kullanılabilir" msgid "E1043: Invalid command after :export" msgstr "E1043: :export sonrası geçersiz komut" -msgid "E1044: export with invalid argument" +msgid "E1044: Export with invalid argument" msgstr "E1044: Geçersiz deÄŸiÅŸkenle dışa aktarım" msgid "E1045: Missing \"as\" after *" @@ -6785,7 +6806,7 @@ msgid "E1046: Missing comma in import" msgstr "E1046: İçe aktarımda virgül eksik" -msgid "E1047: syntax error in import" +msgid "E1047: Syntax error in import" msgstr "E1047: İçe aktarımda sözdizim hatası" #, c-format @@ -6799,7 +6820,7 @@ msgid "E1050: Colon required before a range" msgstr "E1050: Bir erim öncesi iki nokta gerekiyor" -msgid "E1051: wrong argument type for +" +msgid "E1051: Wrong argument type for +" msgstr "E1051: + için hatalı deÄŸiÅŸken türü" #, c-format @@ -6818,13 +6839,13 @@ msgstr "E1055: ... sonraki ad eksik" #, c-format -msgid "E1056: expected a type: %s" +msgid "E1056: Expected a type: %s" msgstr "E1056: Bir tür bekleniyordu: %s" msgid "E1057: Missing :enddef" msgstr "E1057: :enddef eksik" -msgid "E1058: function nesting too deep" +msgid "E1058: Function nesting too deep" msgstr "E1058: Ä°ÅŸlev çok iç içe geçmiÅŸ" #, c-format @@ -6832,7 +6853,7 @@ msgstr "E1059: Ä°ki nokta öncesinde boÅŸluÄŸa izin verilmiyor: %s" #, c-format -msgid "E1060: expected dot after name: %s" +msgid "E1060: Expected dot after name: %s" msgstr "E1060: Ad sonrası nokta bekleniyordu: %s" #, c-format @@ -6842,7 +6863,7 @@ msgid "E1062: Cannot index a Number" msgstr "E1062: Bir Sayı dizinlenemiyor" -msgid "E1063: type mismatch for v: variable" +msgid "E1063: Type mismatch for v: variable" msgstr "E1063: v: deÄŸiÅŸkeni için tür uyumsuzluÄŸu" #, c-format @@ -6858,8 +6879,8 @@ msgstr "E1068: '%s' önce boÅŸluÄŸa izin verilmiyor" #, c-format -msgid "E1069: white space required after '%s'" -msgstr "E1069: '%s' sonrası boÅŸluÄŸa izin verilmiyor" +msgid "E1069: White space required after '%s'" +msgstr "E1069: '%s' sonrası boÅŸluk gerekiyor" msgid "E1070: Missing \"from\"" msgstr "E1070: \"from\" eksik" @@ -6872,10 +6893,10 @@ msgstr "E1072: %s, %s ile karşılaÅŸtırılamıyor" #, c-format -msgid "E1073: name already defined: %s" +msgid "E1073: Name already defined: %s" msgstr "E1073: Ad halihazırda tanımlanmış: %s" -msgid "E1074: no white space allowed after dot" +msgid "E1074: No white space allowed after dot" msgstr "E1074: Nokta sonrası boÅŸluÄŸa izin verilmiyor" #, c-format @@ -6897,7 +6918,7 @@ msgid "E1082: Cannot use a namespaced variable: %s" msgstr "E1082: Ad alanına alınmış bir deÄŸiÅŸken kullanılamaz: %s" -msgid "E1083: missing backtick" +msgid "E1083: Missing backtick" msgstr "E1083: Ters eÄŸik kesme imi eksik" #, c-format @@ -6911,11 +6932,11 @@ msgid "E1086: Cannot use :function inside :def" msgstr "E1086: :def içinde :function kullanılamaz" -msgid "E1087: cannot use an index when declaring a variable" -msgstr "E1087: Bir deÄŸiÅŸken tanımlarken bir indeks kullanılamaz" +msgid "E1087: Cannot use an index when declaring a variable" +msgstr "E1087: Bir deÄŸiÅŸken tanımlarken indeks kullanılamaz" #, c-format -msgid "E1089: unknown variable: %s" +msgid "E1089: Unknown variable: %s" msgstr "E1089: Bilinmeyen deÄŸiÅŸken: %s" #, c-format @@ -6933,7 +6954,7 @@ msgid "E1093: Expected %d items but got %d" msgstr "E1093: %d öge bekleniyordu, ancak %d alındı" -msgid "E1094: import can only be used in a script" +msgid "E1094: Import can only be used in a script" msgstr "E1094: İçe aktarım yalnızca bir betikte kullanılabilir" msgid "E1095: Unreachable code after :return" @@ -6942,7 +6963,7 @@ msgid "E1096: Returning a value in a function without a return type" msgstr "E1096: Dönüş türü olmayan bir iÅŸlevde bir deÄŸer döndürülüyor" -msgid "E1097: line incomplete" +msgid "E1097: Line incomplete" msgstr "E1097: Satır tamamlanmamış" #, c-format @@ -6954,7 +6975,7 @@ msgstr "E1101: Bir iÅŸlevde bir betik deÄŸiÅŸkeni tanımlanamıyor: %s" #, c-format -msgid "E1102: lambda function not found: %s" +msgid "E1102: Lambda function not found: %s" msgstr "E1102: Lambda iÅŸlevi bulunamadı: %s" msgid "E1103: Dictionary not set" @@ -6967,7 +6988,7 @@ msgid "E1105: Cannot convert %s to string" msgstr "E1105: %s bir diziye dönüştürülemiyor" -msgid "E1106: one argument too many" +msgid "E1106: One argument too many" msgstr "E1106: Bir deÄŸiÅŸken fazladan" #, c-format @@ -7004,6 +7025,95 @@ msgid "E1114: Only values of 0x100 and higher supported" msgstr "E1114: Yalnızca 0x100 ve daha yüksek deÄŸerler destekleniyor" +msgid "E1115: \"assert_fails()\" fourth argument must be a number" +msgstr "E1115: \"assert_fails()\" dördüncü deÄŸiÅŸkeni bir sayı olmalıdır" + +msgid "E1116: \"assert_fails()\" fifth argument must be a string" +msgstr "E1116: \"assert_fails()\" beÅŸinci deÄŸiÅŸkeni bir dizi olmalıdır" + +msgid "E1117: Cannot use ! with nested :def" +msgstr "E1117: !, iç içe geçmiÅŸ :def ile kullanılamaz" + +msgid "E1118: Cannot change list" +msgstr "E1118: Liste deÄŸiÅŸtirilemez" + +msgid "E1119: Cannot change list item" +msgstr "E1119: Liste ögesi deÄŸiÅŸtirilemez" + +msgid "E1120: Cannot change dict" +msgstr "E1120: Sözlük deÄŸiÅŸtirilemez" + +msgid "E1121: Cannot change dict item" +msgstr "E1121: Sözlük ögesi deÄŸiÅŸtirilemez" + +#, c-format +msgid "E1122: Variable is locked: %s" +msgstr "E1122: DeÄŸiÅŸken kilitli: %s" + +#, c-format +msgid "E1123: Missing comma before argument: %s" +msgstr "E1123: DeÄŸiÅŸken öncesi virgül eksik: %s" + +#, c-format +msgid "E1124: \"%s\" cannot be used in legacy Vim script" +msgstr "E1124: \"%s\" yalnızca eski Vim betiklerinde kullanılabilir" + +msgid "E1125: Final requires a value" +msgstr "E1125: Final, bir deÄŸer gerektirir" + +msgid "E1126: Cannot use :let in Vim9 script" +msgstr "E1126: :let, Vim9 betiÄŸinde kullanılamaz" + +msgid "E1127: Missing name after dot" +msgstr "E1127: Nokta sonrası ad eksik" + +msgid "E1128: } without {" +msgstr "E1128: { olmadan }" + +msgid "E1129: Throw with empty string" +msgstr "E1129: BoÅŸ dizi ile \"Throw\"" + +msgid "E1130: Cannot add to null list" +msgstr "E1130: Null listesine bir öge eklenemez" + +msgid "E1131: Cannot add to null blob" +msgstr "E1131: Null ikili geniÅŸ nesnesine ekleme yapılamaz" + +msgid "E1132: Missing function argument" +msgstr "E1132: Ä°ÅŸlev deÄŸiÅŸkeni eksik" + +msgid "E1133: Cannot extend a null dict" +msgstr "E1133: Bir null sözlük geniÅŸletilemez" + +msgid "E1134: Cannot extend a null list" +msgstr "E1134: Bir null listesi geniÅŸletilemez" + +#, c-format +msgid "E1135: Using a String as a Bool: \"%s\"" +msgstr "E1135: Bir Dizi, bir Boole yerine kullanılıyor: \"%s\"" + +msgid "E1135: mapping must end with " +msgstr "E1135: eÅŸlemlemesi ile bitmelidir" + +msgid "E1136: mapping must end with before second " +msgstr "E1136: eÅŸlemlemesi ikinci 'den önce ile bitmelidir" + +#, c-format +msgid "E1137: mapping must not include %s key" +msgstr "E1137: eÅŸlemlemesi %s anahtarını içermemelidir" + +msgid "E1138: Using a Bool as a Number" +msgstr "E1138: Bir Boole, Sayı yerine kullanılıyor" + +msgid "E1139: Missing matching bracket after dict key" +msgstr "E1139: Sözlük anahtarı sonrası eÅŸleÅŸen ayraç eksik" + +msgid "E1140: For argument must be a sequence of lists" +msgstr "E1140: For deÄŸiÅŸkeni listelerin bir sıralaması olmalıdır" + +msgid "E1141: Indexable type required" +msgstr "E1141: Ä°ndekslenebilir tür gerekiyor" + msgid "--No lines in buffer--" msgstr "--Arabellek içinde satır yok--" @@ -7021,7 +7131,7 @@ msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search" msgstr "" -"E12: Mevcut dizin veya etiket aramasında exrc veya vimrc'den komutlara izin " +"E12: Geçerli dizin veya etiket aramasında exrc veya vimrc'den komutlara izin " "verilmiyor" msgid "E171: Missing :endif" @@ -7312,8 +7422,8 @@ msgstr "E933: Ä°ÅŸlev silinmiÅŸ: %s" #, c-format -msgid "E716: Key not present in Dictionary: %s" -msgstr "E716: Anahtar sözlükte mevcut deÄŸil: %s" +msgid "E716: Key not present in Dictionary: \"%s\"" +msgstr "E716: Anahtar sözlükte mevcut deÄŸil: \"%s\"" msgid "E714: List required" msgstr "E714: Liste gerekiyor" @@ -7876,10 +7986,18 @@ msgid "Vim" msgstr "Vim" +msgid "(local to window)" +msgstr "(pencereye yerel)" + +msgid "(local to buffer)" +msgstr "(arabelleÄŸe yerel)" + +msgid "(global or local to buffer)" +msgstr "(arabelleÄŸe global veya yerel)" + msgid "" "\" Each \"set\" line shows the current value of an option (on the left)." -msgstr "" -"\" Her \"set\" satırı bir seçeneÄŸin geçerli deÄŸerini gösterir (solda)." +msgstr "\" Her \"set\" satırı bir seçeneÄŸin geçerli deÄŸerini gösterir (solda)." msgid "\" Hit on a \"set\" line to execute it." msgstr "\" DeÄŸiÅŸtirmek için bir \"set\" satırında 'a basın." @@ -7891,15 +8009,1362 @@ "\" For other options you can edit the value before hitting " "." msgstr "" -"\" DiÄŸer seçenekler için 'a basmadan önce deÄŸeri düzenleyebilirsiniz." +"\" DiÄŸer seçenekler için 'a basmadan önce deÄŸeri " +"düzenleyebilirsiniz." msgid "\" Hit on a help line to open a help window on this option." -msgstr "\" Bir seçeneÄŸin yardım penceresini açmak için bir yardım satırının " -"üzerinde 'a basın." +msgstr "" +"\" Yardım penceresini açmak için seçenek adı üzerinde 'a basın." msgid "\" Hit on an index line to jump there." -msgstr "\" Bir seçeneÄŸe atlamak için indeks satırının üzerinde 'a basın." +msgstr "" +"\" Bir seçeneÄŸe atlamak için indeks satırının üzerinde 'a basın." msgid "\" Hit on a \"set\" line to refresh it." msgstr "" -"\" Bir seçeneÄŸi yenilemek için bir \"set\" satırının üzerinde 'a basın." +"\" Bir seçeneÄŸi yenilemek için bir \"set\" satırının üzerinde 'a " +"basın." + +msgid "important" +msgstr "önemli" + +msgid "behave very Vi compatible (not advisable)" +msgstr "olabildiÄŸince Vi uyumlu biçimde davran (önerilmez)" + +msgid "list of flags to specify Vi compatibility" +msgstr "Vi uyumluluÄŸu bayrakları listesi" + +msgid "use Insert mode as the default mode" +msgstr "Ekleme kipini öntanımlı kip olarak kullan" + +msgid "paste mode, insert typed text literally" +msgstr "yapıştır kipi, girilen metni doÄŸrudan ekle" + +msgid "key sequence to toggle paste mode" +msgstr "yapıştır kipini açıp/kapatmak için düğme sıralaması" + +msgid "list of directories used for runtime files and plugins" +msgstr "çalışma zamanı dosyaları ve eklentileri için kullanılan dizinler" + +msgid "list of directories used for plugin packages" +msgstr "eklenti paketleri için kullanılan dizinlerin listesi" + +msgid "name of the main help file" +msgstr "ana yardım dosyasının adı" + +msgid "moving around, searching and patterns" +msgstr "dolaÅŸma, arama ve dizgeler" + +msgid "list of flags specifying which commands wrap to another line" +msgstr "hangi komutların diÄŸer satıra kaydırıldığını belirleyen bayraklar\n" +"listesi" + +msgid "" +"many jump commands move the cursor to the first non-blank\n" +"character of a line" +msgstr "" +"çoÄŸu atlama komutu, imleci satırın boÅŸ olmayan ilk\n" +"karakterine taşır" + +msgid "nroff macro names that separate paragraphs" +msgstr "paragrafları ayıran nroff makro adları" + +msgid "nroff macro names that separate sections" +msgstr "bölümleri ayıran nroff makro adları" + +msgid "list of directory names used for file searching" +msgstr "dosya arama için kullanılan dizin adları listesi" + +msgid "list of directory names used for :cd" +msgstr ":cd için kullanılan dizin adları listesi" + +msgid "change to directory of file in buffer" +msgstr "arabellekteki dosyanın olduÄŸu dizine deÄŸiÅŸtir" + +msgid "search commands wrap around the end of the buffer" +msgstr "arama komutları, arabelleÄŸin sonunda kaydırılır" + +msgid "show match for partly typed search command" +msgstr "bir kısmı yazılmış arama komutu ile eÅŸleÅŸeni göster" + +msgid "change the way backslashes are used in search patterns" +msgstr "arama dizgilerinde ters eÄŸik çizginin kullanımını deÄŸiÅŸtir" + +msgid "select the default regexp engine used" +msgstr "öntanımlı kullanılan düzenli ifade motorunu seç" + +msgid "ignore case when using a search pattern" +msgstr "bir arama dizgisinde BÃœYÃœK/küçük harf ayrımını yok say" + +msgid "override 'ignorecase' when pattern has upper case characters" +msgstr "dizgide BÃœYÃœK harf varsa 'ignorecase'i geçersiz kıl" + +msgid "what method to use for changing case of letters" +msgstr "BÃœYÃœK/küçük harf deÄŸiÅŸtirirken hangi yöntemin kullanılacağı" + +msgid "maximum amount of memory in Kbyte used for pattern matching" +msgstr "dizgi eÅŸleÅŸme için kullanılabilecek en çok bellek miktarı (KiB)" + +msgid "pattern for a macro definition line" +msgstr "bir makro tanım satırı için dizgi" + +msgid "pattern for an include-file line" +msgstr "bir 'include-file' satırı için dizgi" + +msgid "expression used to transform an include line to a file name" +msgstr "bir 'include' satırını dosya adına dönüştürmede kullanılan ifade" + +msgid "tags" +msgstr "etiketler" + +msgid "use binary searching in tags files" +msgstr "etiketler dosyasında ikili arama kullan" + +msgid "number of significant characters in a tag name or zero" +msgstr "bir etiket adındaki belirgin karakterlerin sayısı veya sıfır" + +msgid "list of file names to search for tags" +msgstr "etiketlerin aranacağı dosyaların listesi" + +msgid "" +"how to handle case when searching in tags files:\n" +"\"followic\" to follow 'ignorecase', \"ignore\" or \"match\"" +msgstr "" +"etiket dosyalarında arama yaparken BÃœYÃœK/küçük harf kullanımı:\n" +"'ignorecase', \"ignore\" veya \"match\"den sonra \"followic\" gelir" + +msgid "file names in a tags file are relative to the tags file" +msgstr "bir etiket dosyasındaki dosya adları etiket dosyasına görelidir" + +msgid "a :tag command will use the tagstack" +msgstr "bir :tag komutu etiket yığınını kullanır" + +msgid "when completing tags in Insert mode show more info" +msgstr "Ekleme kipinde etiketleri tamamlarken daha çok bilgi göster" + +msgid "a function to be used to perform tag searches" +msgstr "etiket aramaları gerçekleÅŸtirmek için bir iÅŸlev kullanılır" + +msgid "command for executing cscope" +msgstr "cscope çalıştırmak için kullanılacak komut" + +msgid "use cscope for tag commands" +msgstr "etiket komutları için cscope kullan" + +msgid "0 or 1; the order in which \":cstag\" performs a search" +msgstr "0 veya 1; \":cstag\"in arama yaparken kullanacağı sıra" + +msgid "give messages when adding a cscope database" +msgstr "bir cscope veritabanı eklerken iletiler göster" + +msgid "how many components of the path to show" +msgstr "yolun kaç tane bileÅŸeninin gösterileceÄŸi" + +msgid "when to open a quickfix window for cscope" +msgstr "cscope için ne zaman bir hızlı düzelt penceresinin açılacağı" + +msgid "file names in a cscope file are relative to that file" +msgstr "bir cscope dosyasındaki o dosyaya göreli olan dosya adları" + +msgid "displaying text" +msgstr "metin görüntüleme" + +msgid "number of lines to scroll for CTRL-U and CTRL-D" +msgstr "CTRL-U ve CTRL-D için kaydırılacak satır sayısı" + +msgid "number of screen lines to show around the cursor" +msgstr "imleç etrafında gösterilecek ekran satırları sayısı" + +msgid "long lines wrap" +msgstr "uzun satırları kaydır" + +msgid "wrap long lines at a character in 'breakat'" +msgstr "'breakat' içindeki bir karakterde uzun satırları kaydır" + +msgid "preserve indentation in wrapped text" +msgstr "kaydırılmış metindeki girintilemeyi koru" + +msgid "adjust breakindent behaviour" +msgstr "'breakindent' davranışını ayarla" + +msgid "which characters might cause a line break" +msgstr "hangi karakterler bir satır sonuna neden olabilir" + +msgid "string to put before wrapped screen lines" +msgstr "kaydırılmış ekran satırlarından önce konumlanacak dizi" + +msgid "minimal number of columns to scroll horizontally" +msgstr "en az yatay kaydırma sütunu sayısı" + +msgid "minimal number of columns to keep left and right of the cursor" +msgstr "imlecin sağında ve solunda bırakılacak en az sütun sayısı" + +msgid "" +"include \"lastline\" to show the last line even if it doesn't fit\n" +"include \"uhex\" to show unprintable characters as a hex number" +msgstr "" +"eÄŸer sığmasa bile son satırı göstermek için \"lastline\"ı içer\n" +"yazdırılamayan karakterleri onaltılık olarak göstermek için\n" +"\"uhex\" içer" + +msgid "characters to use for the status line, folds and filler lines" +msgstr "durum satırı, kıvırma ve doldurucular için kullanılan karakterler" + +msgid "number of lines used for the command-line" +msgstr "komut satırı için kullanılan satırların sayısı" + +msgid "width of the display" +msgstr "ekranın geniÅŸliÄŸi" + +msgid "number of lines in the display" +msgstr "ekrandaki satırların sayısı" + +msgid "number of lines to scroll for CTRL-F and CTRL-B" +msgstr "CTRL-F ve CTRL-B için kaydırılacak satır sayısı" + +msgid "don't redraw while executing macros" +msgstr "makroları çalıştırırken yenileme yapma" + +msgid "timeout for 'hlsearch' and :match highlighting in msec" +msgstr "'hlsearch' ve : match vurgulaması için zaman aşımı (milisaniye)" + +msgid "" +"delay in msec for each char written to the display\n" +"(for debugging)" +msgstr "" +"ekrana yazılan her karakter için gecikme süresi (milisaniye)\n" +"(hata ayıklama için)" + +msgid "show as ^I and end-of-line as $" +msgstr "'ı ^I ve satır sonunu $ olarak göster" + +msgid "list of strings used for list mode" +msgstr "liste kipi için kullanılan diziler listesi" + +msgid "show the line number for each line" +msgstr "her satır için satır numarasını göster" + +msgid "show the relative line number for each line" +msgstr "her satır için göreli satır numarasını göster" + +msgid "number of columns to use for the line number" +msgstr "satır numarası için kullanılacak sütün sayısı" + +msgid "controls whether concealable text is hidden" +msgstr "gizlenebilir metnin saklı olup olmadığını denetler" + +msgid "modes in which text in the cursor line can be concealed" +msgstr "imleç satırındaki metnin gizlenebileceÄŸi kipler" + +msgid "syntax, highlighting and spelling" +msgstr "sözdizim, vurgulama ve yazım denetimi" + +msgid "\"dark\" or \"light\"; the background color brightness" +msgstr "\"dark\" veya \"light\"; arka plan renk parlaklığı" + +msgid "type of file; triggers the FileType event when set" +msgstr "dosya türü; ayarlandığında FileType olayını tetikler" + +msgid "name of syntax highlighting used" +msgstr "kullanılan sözdizim vurgulamanın adı" + +msgid "maximum column to look for syntax items" +msgstr "sözdizim ögeleri için bakılacak en çok sütun sayısı" + +msgid "which highlighting to use for various occasions" +msgstr "çeÅŸitli durumlarda hangi vurgulamanın kullanılacağı" + +msgid "highlight all matches for the last used search pattern" +msgstr "son kullanılan arama dizgisi için tüm eÅŸleÅŸmeleri vurgula" + +msgid "highlight group to use for the window" +msgstr "pencere için kullanılacak vurgulama grubu" + +msgid "use GUI colors for the terminal" +msgstr "uçbirim için grafik arabirim renklerini kullan" + +msgid "highlight the screen column of the cursor" +msgstr "imlecin ekrandaki sütununu vurgula" + +msgid "highlight the screen line of the cursor" +msgstr "imlecin ekrandaki satırını vurgula" + +msgid "specifies which area 'cursorline' highlights" +msgstr "'cursorline'ın hangi alanı vurgulayacağı" + +msgid "columns to highlight" +msgstr "vurgulanacak sütunlar" + +msgid "highlight spelling mistakes" +msgstr "yazım yanlışlarını vurgula" + +msgid "list of accepted languages" +msgstr "kabul edilen dillerin listesi" + +msgid "file that \"zg\" adds good words to" +msgstr "\"zg\" komutunun düzgün sözcükleri ekleyeceÄŸi dosya" + +msgid "pattern to locate the end of a sentence" +msgstr "bir tümcenin sonunu bulmak için kullanılan dizgi" + +msgid "flags to change how spell checking works" +msgstr "yazım denetiminin nice çalıştığını deÄŸiÅŸtirmek için bayraklar" + +msgid "methods used to suggest corrections" +msgstr "düzeltmeleri önermek için yöntemler" + +msgid "amount of memory used by :mkspell before compressing" +msgstr "sıkıştırma öncesi :mkspell tarafından kullanılan bellek" + +msgid "multiple windows" +msgstr "çoklu pencereler" + +msgid "0, 1 or 2; when to use a status line for the last window" +msgstr "0, 1 veya 2; son pencere için ne zaman bir durum satırı\n" +"kullanılacağı" + +msgid "alternate format to be used for a status line" +msgstr "durum satırı için kullanılabilecek alternatif biçim" + +msgid "make all windows the same size when adding/removing windows" +msgstr "pencere eklerken/kaldırırken tüm pencereleri aynı boyuta getir" + +msgid "in which direction 'equalalways' works: \"ver\", \"hor\" or \"both\"" +msgstr "'equalalways'in hangi yönde çalıştığı: \"ver\", \"hor\" veya \"both\"" + +msgid "minimal number of lines used for the current window" +msgstr "geçerli pencere için kullanılan en az satır sayısı" + +msgid "minimal number of lines used for any window" +msgstr "herhangi bir pencere için kullanılan en az satır sayısı" + +msgid "keep the height of the window" +msgstr "pencerenin yüksekliÄŸini tut" + +msgid "keep the width of the window" +msgstr "pencerenin geniÅŸliÄŸini tut" + +msgid "minimal number of columns used for the current window" +msgstr "geçerli pencere için kullanılan en az sütun sayısı" + +msgid "minimal number of columns used for any window" +msgstr "herhangi bir pencere için kullanılan en az sütun sayısı" + +msgid "initial height of the help window" +msgstr "yardım penceresinin baÅŸlangıç yüksekliÄŸi" + +msgid "use a popup window for preview" +msgstr "önizleme için bir açılır pencere kullan" + +msgid "default height for the preview window" +msgstr "önizleme penceresi için öntanımlı yükseklik" + +msgid "identifies the preview window" +msgstr "önizleme penceresini tanımlar" + +msgid "don't unload a buffer when no longer shown in a window" +msgstr "arabellek artık pencerede görüntülenmiyorsa bellekten kaldırma" + +msgid "" +"\"useopen\" and/or \"split\"; which window to use when jumping\n" +"to a buffer" +msgstr "" +"\"useopen\" ve/veya \"split\"; bir belleÄŸe atlarken hangi\n" +"pencerenin kullanılacağı" + +msgid "a new window is put below the current one" +msgstr "geçerli pencerenin altına yeni bir pencere koyulur" + +msgid "a new window is put right of the current one" +msgstr "yeni bir pencere geçerli pencerenin sağına koyulur" + +msgid "this window scrolls together with other bound windows" +msgstr "bu pencere, baÄŸlı diÄŸer pencerelerle birlikte kayar" + +msgid "\"ver\", \"hor\" and/or \"jump\"; list of options for 'scrollbind'" +msgstr "\"ver\", \"hor\" ve/veya \"jump\"; 'scrollbind' için seçenekler listesi" + +msgid "this window's cursor moves together with other bound windows" +msgstr "bu pencerenin imleci baÄŸlı diÄŸer pencerelerle birlikte kayar" + +msgid "size of a terminal window" +msgstr "bir uçbirim penceresinin boyutu" + +msgid "key that precedes Vim commands in a terminal window" +msgstr "bir uçbirim penceresinde Vim komutlarından önce gelen düğme" + +msgid "max number of lines to keep for scrollback in a terminal window" +msgstr "bir uçbirim penceresinde geri kaydırma için kullanılacak\n" +"en çok satır sayısı" + +msgid "type of pty to use for a terminal window" +msgstr "bir uçbirim penceresi için kullanılacak pty türü" + +msgid "name of the winpty dynamic library" +msgstr "winpty devingen kitaplığının adı" + +msgid "multiple tab pages" +msgstr "çoklu sekme sayfaları" + +msgid "0, 1 or 2; when to use a tab pages line" +msgstr "0, 1 veya 2; ne zaman bir sekme sayfası satırının kullanılacağı" + +msgid "maximum number of tab pages to open for -p and \"tab all\"" +msgstr "-p ve \"tab all\"un açacağı en çok sekme sayfası sayısı" + +msgid "custom tab pages line" +msgstr "özelleÅŸtirilmiÅŸ sekme sayfası satırı" + +msgid "custom tab page label for the GUI" +msgstr "grafik arabirim için özelleÅŸtirilmiÅŸ sekme sayfası etiketi" + +msgid "custom tab page tooltip for the GUI" +msgstr "grafik arabirim için özelleÅŸtirilmiÅŸ sekme sayfası bilgi kutusu" + +msgid "terminal" +msgstr "uçbirim" + +msgid "name of the used terminal" +msgstr "kullanılan uçbirimin adı" + +msgid "alias for 'term'" +msgstr "'term' için arma" + +msgid "check built-in termcaps first" +msgstr "önce iç termcaps'i denetle" + +msgid "terminal connection is fast" +msgstr "uçbirim baÄŸlantısı hızlı" + +msgid "terminal that requires extra redrawing" +msgstr "ek yenileme gerektiren uçbirim" + +msgid "recognize keys that start with in Insert mode" +msgstr "Ekleme kipinde ile baÅŸlayan düğmeleri tanı" + +msgid "minimal number of lines to scroll at a time" +msgstr "herhangi bir zamanda kaydırılacak en az satır sayısı" + +msgid "maximum number of lines to use scrolling instead of redrawing" +msgstr "yenileme yerine kaydırma kullanacak en çok satır sayısı" + +msgid "specifies what the cursor looks like in different modes" +msgstr "imlecin farklı kiplerde nice göründüğünü belirler" + +msgid "show info in the window title" +msgstr "pencere baÅŸlığında bilgi görüntüle" + +msgid "percentage of 'columns' used for the window title" +msgstr "pencere baÅŸlığı için kullanılacak 'columns' yüzdesi" + +msgid "when not empty, string to be used for the window title" +msgstr "boÅŸ deÄŸilken, pencere baÅŸlığı yerine kullanılacak dizi" + +msgid "string to restore the title to when exiting Vim" +msgstr "Vim'den çıkarken baÅŸlığın döndürüleceÄŸi dizi" + +msgid "set the text of the icon for this window" +msgstr "bu pencere için simgenin metnini ayarla" + +msgid "when not empty, text for the icon of this window" +msgstr "boÅŸ deÄŸilken, bu pencerenin simgesi için metin" + +msgid "restore the screen contents when exiting Vim" +msgstr "Vim'den çıkarken ekran içeriÄŸini eski haline getir" + +msgid "using the mouse" +msgstr "fare kullanımı" + +msgid "list of flags for using the mouse" +msgstr "fare kullanımı için bayraklar listesi" + +msgid "the window with the mouse pointer becomes the current one" +msgstr "fare imlecinin olduÄŸu pencere geçerli pencere olur" + +msgid "the window with the mouse pointer scrolls with the mouse wheel" +msgstr "fare imlecinin olduÄŸu pencere fare tekerleÄŸi ile kaydırılabilir" + +msgid "hide the mouse pointer while typing" +msgstr "yazı yazarken fare imlecini gizle" + +msgid "" +"\"extend\", \"popup\" or \"popup_setpos\"; what the right\n" +"mouse button is used for" +msgstr "" +"\"extend\", \"popup\" veya \"popup_setpos\"; saÄŸ fare düğmesinin\"\n" +"ne için kullanıldığı" + +msgid "maximum time in msec to recognize a double-click" +msgstr "bir çif tıklamayı tanımak için en çok süre (milisaniye)" + +msgid "\"xterm\", \"xterm2\", \"sgr\", etc.; type of mouse" +msgstr "\"xterm\", \"xterm2\", \"sgr\" vb.; fare türü" + +msgid "what the mouse pointer looks like in different modes" +msgstr "farklı kiplerde fare imlecinin nice göründüğü" + +msgid "GUI" +msgstr "grafik arabirim" + +msgid "list of font names to be used in the GUI" +msgstr "grafik arabirimde kullanılacak yazıtiplerinin listesi" + +msgid "pair of fonts to be used, for multibyte editing" +msgstr "çoklu bayt düzenlemede kullanılacak yazıtipi eÅŸleÅŸmeleri" + +msgid "list of font names to be used for double-wide characters" +msgstr "çift geniÅŸlikli karakterler için kullanılacak yazıtiplerinin listesi" + +msgid "use smooth, antialiased fonts" +msgstr "düzletilmiÅŸ yazıtipleri kullan" + +msgid "list of flags that specify how the GUI works" +msgstr "grafik arabirimin nice çalıştığını belirleyen bayraklar listesi" + +msgid "\"icons\", \"text\" and/or \"tooltips\"; how to show the toolbar" +msgstr "" +"\"icons\", \"text\" ve/veya \"tooltips\"; araç çubuÄŸu kipleri " + +msgid "size of toolbar icons" +msgstr "araç çubuÄŸu simgelerinin boyutu" + +msgid "room (in pixels) left above/below the window" +msgstr "pencerenin altında/üstünde bırakılan alan (piksel)" + +msgid "options for text rendering" +msgstr "metin dokuması için seçenekler" + +msgid "use a pseudo-tty for I/O to external commands" +msgstr "dış komutlara, girdi çıktı için yalancı-tty kullan" + +msgid "" +"\"last\", \"buffer\" or \"current\": which directory used for the file " +"browser" +msgstr "" +"\"last\", \"buffer\" veya \"current\"; dosya tarayıcısı için hangi dizinin " +"kullanıldığı" + +msgid "language to be used for the menus" +msgstr "menüler için kullanılan dil" + +msgid "maximum number of items in one menu" +msgstr "bir menüdeki en çok öge sayısı" + +msgid "\"no\", \"yes\" or \"menu\"; how to use the ALT key" +msgstr "\"no\", \"yes\" veya \"menu\"; ALT düğmesinin nice kullanılacağı" + +msgid "number of pixel lines to use between characters" +msgstr "karakterler arasında kullanılacak piksel satırları sayısı" + +msgid "delay in milliseconds before a balloon may pop up" +msgstr "bir balonun patlamadan önceki gecikme (milisaniye)" + +msgid "use balloon evaluation in the GUI" +msgstr "grafik arabirimde balon deÄŸerlendirme kullan" + +msgid "use balloon evaluation in the terminal" +msgstr "uçbirimde balon deÄŸerlendirme kullan" + +msgid "expression to show in balloon eval" +msgstr "balon deÄŸerlendirmesinde gösterilecek ifade" + +msgid "printing" +msgstr "yazdırma" + +msgid "list of items that control the format of :hardcopy output" +msgstr ":hardcopy çıktısının biçimini denetleyen ögelerin listesi" + +msgid "name of the printer to be used for :hardcopy" +msgstr ":hardcopy için kullanılan yazıcının adı" + +msgid "expression used to print the PostScript file for :hardcopy" +msgstr ":hardcopy için PostScript dosyasını yazdırmada kullanılan ifade" + +msgid "name of the font to be used for :hardcopy" +msgstr ":hardcopy için kullanılan yazıtipinin adı" + +msgid "format of the header used for :hardcopy" +msgstr ":hardcopy için kullanılan üstbilginin biçimi" + +msgid "encoding used to print the PostScript file for :hardcopy" +msgstr ":hardcopy için Postscript dosyasını yazdırmada kullanılan kodlama" + +msgid "the CJK character set to be used for CJK output from :hardcopy" +msgstr ":hardcopy'deki ÇJK çıktısında kullanılan ÇJK karakter seti" + +msgid "list of font names to be used for CJK output from :hardcopy" +msgstr ":hardcopy'deki ÇJK çıktısında kullanılan ÇJK yazıtipi" + +msgid "messages and info" +msgstr "iletiler ve bilgi" + +msgid "add 's' flag in 'shortmess' (don't show search message)" +msgstr "'shortness'daki 's' bayrağını ekle (arama iletisini gösterme)" + +msgid "list of flags to make messages shorter" +msgstr "iletileri kısalaÅŸtırmak için kullanılan bayraklar listesi" + +msgid "show (partial) command keys in the status line" +msgstr "durum satırında (kısmi) komut düğmelerini göster" + +msgid "display the current mode in the status line" +msgstr "durum satırında geçerli kipi görüntüle" + +msgid "show cursor position below each window" +msgstr "her pencerenin altında imleç konumunu göster" + +msgid "alternate format to be used for the ruler" +msgstr "cetvel için kullanılan alternatif biçim" + +msgid "threshold for reporting number of changed lines" +msgstr "deÄŸiÅŸtirilmiÅŸ satırların sayısını raporlama eÅŸiÄŸi" + +msgid "the higher the more messages are given" +msgstr "ne kadar yüksek olursa o kadar çok ileti olur" + +msgid "file to write messages in" +msgstr "iletilerin içine yazılacağı dosya" + +msgid "pause listings when the screen is full" +msgstr "ekran doluyken listelemeleri duraklat" + +msgid "start a dialog when a command fails" +msgstr "bir komut baÅŸarısız olursa iletiÅŸim kutusu göster" + +msgid "ring the bell for error messages" +msgstr "hata iletilerinde zili çal" + +msgid "use a visual bell instead of beeping" +msgstr "bipleme yerine görsel zil kullan" + +msgid "do not ring the bell for these reasons" +msgstr "bu nedenlerle zili çalma" + +msgid "list of preferred languages for finding help" +msgstr "yardım için yeÄŸlenen diller listesi" + +msgid "selecting text" +msgstr "metin seçme" + +msgid "\"old\", \"inclusive\" or \"exclusive\"; how selecting text behaves" +msgstr "\"old\", \"inclusive\" veya \"exclusive\"; metin seçim davranışı" + +msgid "" +"\"mouse\", \"key\" and/or \"cmd\"; when to start Select mode\n" +"instead of Visual mode" +msgstr "" +"\"mouse\", \"key\", ve/veya \"cmd\"; Görsel kip yerine Seçim\n" +"kipinin baÅŸlatılacağı zaman" + +msgid "" +"\"unnamed\" to use the * register like unnamed register\n" +"\"autoselect\" to always put selected text on the clipboard" +msgstr "" +"\"unnamed\": * yazmacını adsız yazmaç gibi kullan\n" +"\"autoselect\": seçili metni her zaman panoya koy" + +msgid "\"startsel\" and/or \"stopsel\"; what special keys can do" +msgstr "\"startsel\" ve/veya \"stopsel\"; özel düğmelerin iÅŸlevleri" + +msgid "editing text" +msgstr "metin düzenleme" + +msgid "maximum number of changes that can be undone" +msgstr "geri alınabilecek en çok deÄŸiÅŸiklik sayısı" + +msgid "automatically save and restore undo history" +msgstr "geri al geçmiÅŸini kendiliÄŸinden kaydet ve eski haline getir" + +msgid "list of directories for undo files" +msgstr "geri al dosyaları için dizinler listesi" + +msgid "maximum number lines to save for undo on a buffer reload" +msgstr "arabellek yeniden yüklemesinde geri al için kaydedilecek\n" +"en çok satır sayısı" + +msgid "changes have been made and not written to a file" +msgstr "yapılan; ancak bir dosyaya yazılmayan deÄŸiÅŸiklikler" + +msgid "buffer is not to be written" +msgstr "arabellek, yazım için deÄŸil" + +msgid "changes to the text are possible" +msgstr "metne deÄŸiÅŸiklik yapımı olanaklı" + +msgid "line length above which to break a line" +msgstr "sonrasında yeni satır yapılacak satır uzunluÄŸu" + +msgid "margin from the right in which to break a line" +msgstr "sonrasında yeni satır yapılacak saÄŸ kenar boÅŸluÄŸu" + +msgid "specifies what , CTRL-W, etc. can do in Insert mode" +msgstr ", CTRL-W, vb. Ekleme kipinde ne yapabileceÄŸini belirtir" + +msgid "definition of what comment lines look like" +msgstr "yorum satırlarının nice görüneceÄŸinin tanımı" + +msgid "list of flags that tell how automatic formatting works" +msgstr "kendiliÄŸinden biçimlendirmenin nice çalıştığını anlatan\n" +"bayraklar listesi" + +msgid "pattern to recognize a numbered list" +msgstr "numaralandırılmış bir listeyi tanımak için dizgi" + +msgid "expression used for \"gq\" to format lines" +msgstr "satırları biçimlendirmek için \"gq\" için kullanılan ifade" + +msgid "specifies how Insert mode completion works for CTRL-N and CTRL-P" +msgstr "Ekleme kipi tamamlamasının CTRL-N ve CTRL-P için nice çalıştığını\n" +"belirler" + +msgid "whether to use a popup menu for Insert mode completion" +msgstr "Ekleme kipi tamamlaması için açılır menü kullanımı" + +msgid "options for the Insert mode completion info popup" +msgstr "Ekleme kipi tamamlama açılır penceresi için seçenekler" + +msgid "maximum height of the popup menu" +msgstr "açılır menünün en çok yüksekliÄŸi" + +msgid "minimum width of the popup menu" +msgstr "açılır menünün en çok geniÅŸliÄŸi" + +msgid "user defined function for Insert mode completion" +msgstr "Ekleme kipi tamamlaması için kullanıcı tanımlı iÅŸlev" + +msgid "function for filetype-specific Insert mode completion" +msgstr "dosya türüne özel Ekleme kipi tamamlaması için iÅŸlev" + +msgid "list of dictionary files for keyword completion" +msgstr "anahtar sözcük tamamlaması için sözlük dosyaları listesi" + +msgid "list of thesaurus files for keyword completion" +msgstr "anahtar sözcük tamamlaması için eÅŸanlamlılar sözlüğü dosyaları\n" +"listesi" + +msgid "adjust case of a keyword completion match" +msgstr "anahtar sözcük tamamlama eÅŸleÅŸmesinin BÃœYÃœK/küçük harfini ayarla" + +msgid "enable entering digraphs with c1 c2" +msgstr "c1 c2 ile ikili harflerin girilmesini etkinleÅŸtir" + +msgid "the \"~\" command behaves like an operator" +msgstr "\"~\" komutu bir iÅŸleç gibi davranır" + +msgid "function called for the \"g@\" operator" +msgstr "\"g@\" iÅŸleci için çaÄŸrılan iÅŸlev" + +msgid "when inserting a bracket, briefly jump to its match" +msgstr "bir ayraç eklendiÄŸinde hemen eÅŸine atla" + +msgid "tenth of a second to show a match for 'showmatch'" +msgstr "bir 'showmatch' eÅŸleÅŸmesini göstermek için saniyenin onda biri" + +msgid "list of pairs that match for the \"%\" command" +msgstr "\"%\" komutu için eÅŸleÅŸen eÅŸleÅŸmelerin listesi" + +msgid "use two spaces after '.' when joining a line" +msgstr "bir satırı birleÅŸtirirken '.' sonrası iki boÅŸluk kullan" + +msgid "" +"\"alpha\", \"octal\", \"hex\", \"bin\" and/or \"unsigned\"; number formats\n" +"recognized for CTRL-A and CTRL-X commands" +msgstr "" +"\"alpha\", \"octal\", \"hex\", \"bin\" ve/veya \"unsigned\"; CTRL-A ve\n" +"CTRL-X komutları için tanınan sayı biçimleri" + +msgid "tabs and indenting" +msgstr "sekmeler ve girintileme" + +msgid "number of spaces a in the text stands for" +msgstr "metinde bir 'ın denk olduÄŸu boÅŸluk sayısı" + +msgid "number of spaces used for each step of (auto)indent" +msgstr "her bir kendiliÄŸinden girintileme için kullanılan boÅŸluk sayısı" + +msgid "list of number of spaces a tab counts for" +msgstr "bir sekmenin denk olduÄŸu boÅŸlukların sayısının listesi" + +msgid "list of number of spaces a soft tabsstop counts for" +msgstr "bir yumuÅŸak sekmedurağının denk olduÄŸu boÅŸlukların sayısı listesi" + +msgid "a in an indent inserts 'shiftwidth' spaces" +msgstr "bir girintideki , 'shiftwidth' kadar boÅŸluk ekler" + +msgid "if non-zero, number of spaces to insert for a " +msgstr "eÄŸer sıfırdan farklıysa, bir için eklenecek boÅŸluk sayısı" + +msgid "round to 'shiftwidth' for \"<<\" and \">>\"" +msgstr "\"<<\" ve \">>\" için 'shiftwidth'e yuvarla" + +msgid "expand to spaces in Insert mode" +msgstr "Ekleme kipinde 'ı boÅŸluklara geniÅŸlet" + +msgid "automatically set the indent of a new line" +msgstr "yeni bir satırın girintisini kendiliÄŸinden ayarla" + +msgid "do clever autoindenting" +msgstr "akıllı kendiliÄŸinden girintileme yap" + +msgid "enable specific indenting for C code" +msgstr "C kodu için özel girintilemeyi etkinleÅŸtir" + +msgid "options for C-indenting" +msgstr "C girintilemesi için seçenekler" + +msgid "keys that trigger C-indenting in Insert mode" +msgstr "Ekleme kipinde C girintilemesini tetikleyen düğmeler" + +msgid "list of words that cause more C-indent" +msgstr "daha çok C girintilemesine neden olan sözcüklerin listesi" + +msgid "expression used to obtain the indent of a line" +msgstr "bir satırın girintisini elde etmek için kullanılan ifade" + +msgid "keys that trigger indenting with 'indentexpr' in Insert mode" +msgstr "Ekleme kipinde 'indentexpr' ile girintilemeyi tetikleyen düğmeler" + +msgid "copy whitespace for indenting from previous line" +msgstr "bir önceki satırdan girintileme için boÅŸlukları kopyala" + +msgid "preserve kind of whitespace when changing indent" +msgstr "girintilemeyi deÄŸiÅŸtirirken boÅŸluk türünü koru" + +msgid "enable lisp mode" +msgstr "lisp kipini etkinleÅŸtir" + +msgid "words that change how lisp indenting works" +msgstr "lisp girintilemesinin nice çalıştığını deÄŸiÅŸtiren sözcükler" + +msgid "folding" +msgstr "kıvırma" + +msgid "unset to display all folds open" +msgstr "tüm kıvırmaları açık görüntülemek için ayarı kaldır" + +msgid "folds with a level higher than this number will be closed" +msgstr "bu sayıdan daha yüksek düzeyli kıvırmalar kapatılacak" + +msgid "value for 'foldlevel' when starting to edit a file" +msgstr "bir dosyayı düzenlemeye baÅŸlarkenki 'foldlevel' deÄŸeri" + +msgid "width of the column used to indicate folds" +msgstr "kıvırmaları belirtmek için kullanılan sütunun geniÅŸliÄŸi" + +msgid "expression used to display the text of a closed fold" +msgstr "kapalı bir kıvırmanın metnini görüntülemek için kullanılan ifade" + +msgid "set to \"all\" to close a fold when the cursor leaves it" +msgstr "imleç ayrıldığında kıvırmayı kapatmak için \"all\" olarak ayarlayın" + +msgid "specifies for which commands a fold will be opened" +msgstr "hangi komutlarda bir kıvırmanın açılacağını belirler" + +msgid "minimum number of screen lines for a fold to be closed" +msgstr "bir kıvırmanın kapatılması için en az ekran satırı sayısı" + +msgid "template for comments; used to put the marker in" +msgstr "yorumlar için ÅŸablon; imleyiciyi içine koymak için kullanılır" + +msgid "" +"folding type: \"manual\", \"indent\", \"expr\", \"marker\",\n" +"\"syntax\" or \"diff\"" +msgstr "" +"kıvırma türü: \"manual\", \"indent\", \"expr\", \"marker\",\n" +"\"syntax\" veya \"diff\"" + +msgid "expression used when 'foldmethod' is \"expr\"" +msgstr "'foldmethod' \"expr\" olduÄŸundan kullanılacak ifade" + +msgid "used to ignore lines when 'foldmethod' is \"indent\"" +msgstr "'foldmethod' \"indent\" olduÄŸunda satırları yok saymada kullanılır" + +msgid "markers used when 'foldmethod' is \"marker\"" +msgstr "'foldmethod' \"marker\" olduÄŸunda kullanılan imleyiciler" + +msgid "maximum fold depth for when 'foldmethod' is \"indent\" or \"syntax\"" +msgstr "'foldmethod' \"indent\" veya \"syntax\" olduÄŸunda kullanılan en çok\n" +"kıvırma derinliÄŸi" + +msgid "diff mode" +msgstr "diff kipi" + +msgid "use diff mode for the current window" +msgstr "geçerli pencere için diff kipi kullan" + +msgid "options for using diff mode" +msgstr "diff kipi kullanımı için seçenekler" + +msgid "expression used to obtain a diff file" +msgstr "bir diff dosyası elde etmek için kullanılan ifade" + +msgid "expression used to patch a file" +msgstr "bir dosyayı yamalamak için kullanılan ifade" + +msgid "mapping" +msgstr "eÅŸlemleme" + +msgid "maximum depth of mapping" +msgstr "en çok eÅŸlemleme derinliÄŸi" + +msgid "recognize mappings in mapped keys" +msgstr "eÅŸlemlenmiÅŸ düğmelerdeki eÅŸlemlemeleri tanımla" + +msgid "allow timing out halfway into a mapping" +msgstr "bir eÅŸlemlemenin yarısında zaman aşımına izin ver" + +msgid "allow timing out halfway into a key code" +msgstr "bir düğme kodunun yarısında zaman aşımına izin ver" + +msgid "time in msec for 'timeout'" +msgstr "'timeout' için süre (milisaniye)" + +msgid "time in msec for 'ttimeout'" +msgstr "'ttimeout' için süre (milisaniye)" + +msgid "reading and writing files" +msgstr "dosyaları okuma ve yazma" + +msgid "enable using settings from modelines when reading a file" +msgstr "dosya okurken ayarları kip satırından kullanımı etkinleÅŸtir" + +msgid "allow setting expression options from a modeline" +msgstr "ifade seçeneklerini bir kip satırından ayarlamaya izin ver" + +msgid "number of lines to check for modelines" +msgstr "kip satırlarını denetlemede kullanılacak satırların sayısı" + +msgid "binary file editing" +msgstr "ikili dosya düzenleme" + +msgid "last line in the file has an end-of-line" +msgstr "dosyanın son satırında bir satırsonu var" + +msgid "fixes missing end-of-line at end of text file" +msgstr "bir metin dosyasının sonundaki eksik satırsonlarını onarır" + +msgid "prepend a Byte Order Mark to the file" +msgstr "dosyanın önüne bir Bayt Sıralama Ä°mi ekle" + +msgid "end-of-line format: \"dos\", \"unix\" or \"mac\"" +msgstr "satırsonu biçimi: \"dos\", \"unix\" veya \"mac\"" + +msgid "list of file formats to look for when editing a file" +msgstr "bir dosyayı düzenlerken bakılacak dosya biçimler listesi" + +msgid "obsolete, use 'fileformat'" +msgstr "eskimiÅŸ, yerine 'fileformat' kullanın" + +msgid "obsolete, use 'fileformats'" +msgstr "eskimiÅŸ, yerine 'fileformats' kullanın" + +msgid "writing files is allowed" +msgstr "dosya yazımına izin verilir" + +msgid "write a backup file before overwriting a file" +msgstr "bir dosyanın üzerine yazmadan önce bir yedek dosyası yaz" + +msgid "keep a backup after overwriting a file" +msgstr "bir dosyanın üzerine yazdıktan sonra bir yedek tut" + +msgid "patterns that specify for which files a backup is not made" +msgstr "bir yedeÄŸi yapılmayan dosyaları belirleyen dizgi" + +msgid "whether to make the backup as a copy or rename the existing file" +msgstr "yedeÄŸin kopya olarak mı yoksa ad deÄŸiÅŸikliÄŸi ile mi yapılacağı" + +msgid "list of directories to put backup files in" +msgstr "yedek dosyalarının koyulacağı dizinlerin listesi" + +msgid "file name extension for the backup file" +msgstr "yedek dosyası için dosya adı uzantısı" + +msgid "automatically write a file when leaving a modified buffer" +msgstr "deÄŸiÅŸtirilmiÅŸ arabellekten çıkarken dosyayı kendiliÄŸinden yaz" + +msgid "as 'autowrite', but works with more commands" +msgstr "'autowrite' gibi, ancak daha çok komutla çalışır" + +msgid "always write without asking for confirmation" +msgstr "onay beklemeden her zaman yaz" + +msgid "automatically read a file when it was modified outside of Vim" +msgstr "Vim dışında deÄŸiÅŸtirildiÄŸinde dosyayı kendiliÄŸinden oku" + +msgid "keep oldest version of a file; specifies file name extension" +msgstr "bir dosyanın en eski sürümünü tut; dosya adı uzantısı belirler" + +msgid "forcibly sync the file to disk after writing it" +msgstr "yazımdan sonra dosyayı zorla diske eÅŸitle" + +msgid "use 8.3 file names" +msgstr "8.3 dosya adlarını kullan" + +msgid "encryption method for file writing: zip, blowfish or blowfish2" +msgstr "dosya yazımı için ÅŸifreleme yöntemi: zip, blowfish veya blowfish2" + +msgid "the swap file" +msgstr "takas dosyası" + +msgid "list of directories for the swap file" +msgstr "takas dosyası için dizinler listesi" + +msgid "use a swap file for this buffer" +msgstr "bu arabellek için bir takas dosyası kullan" + +msgid "\"sync\", \"fsync\" or empty; how to flush a swap file to disk" +msgstr "\"sync\", \"fsync\", veya boÅŸ; bir takas dosyasının diske\n" +"nice floÅŸlanacağı" + +msgid "number of characters typed to cause a swap file update" +msgstr "takas dosyası güncellemesi için yazılması gereken karakter sayısı" + +msgid "time in msec after which the swap file will be updated" +msgstr "takas dosyasının güncelleneceÄŸi süre dilimi (milisaniye)" + +msgid "maximum amount of memory in Kbyte used for one buffer" +msgstr "bir arabellek için kullanılacak en çok bellek miktarı (KiB)" + +msgid "maximum amount of memory in Kbyte used for all buffers" +msgstr "tüm arabellekler için kullanılacak en çok bellek miktarı (KiB)" + +msgid "command line editing" +msgstr "komut satırı düzenleme" + +msgid "how many command lines are remembered" +msgstr "kaç tane komut satırının hatırlandığı" + +msgid "key that triggers command-line expansion" +msgstr "komut satırı ifadesi tetikleyen düğme" + +msgid "like 'wildchar' but can also be used in a mapping" +msgstr "'wildchar' gibi; ancak bir eÅŸlemleme içinde kullanılabilir" + +msgid "specifies how command line completion works" +msgstr "komut satırı tamamlamasının nasıl çalıştığını belirtir" + +msgid "empty or \"tagfile\" to list file name of matching tags" +msgstr "eÅŸleÅŸen etiketlerin dosya adını listelemek için boÅŸ veya \"tagfile\"" + +msgid "list of file name extensions that have a lower priority" +msgstr "düşük öncelikli dosya adı uzantılarının listesi" + +msgid "list of file name extensions added when searching for a file" +msgstr "bir dosya ararken eklenen dosya adı uzantılarının listesi" + +msgid "list of patterns to ignore files for file name completion" +msgstr "dosya adı tamamlaması için yok sayılacak dizgelerin listesi" + +msgid "ignore case when using file names" +msgstr "dosya adları kullanırken BÃœYÃœK/küçük harf yok say" + +msgid "ignore case when completing file names" +msgstr "dosya adları tamamlarken BÃœYÃœK/küçük harf yok say" + +msgid "command-line completion shows a list of matches" +msgstr "komut satırı tamamlaması, eÅŸleÅŸmelerin bir listesini gösterir" + +msgid "key used to open the command-line window" +msgstr "komut satırı penceresini açmak için kullanılan düğme" + +msgid "height of the command-line window" +msgstr "komut satırı penceresinin yüksekliÄŸi" + +msgid "executing external commands" +msgstr "dış komutları çalıştırma" + +msgid "name of the shell program used for external commands" +msgstr "dış komutlar için kullanılan kabuk programının adı" + +msgid "when to use the shell or directly execute a command" +msgstr "ne zaman kabuÄŸu kullanmalı veya doÄŸrudan bir komut çalıştırmalı" + +msgid "character(s) to enclose a shell command in" +msgstr "bir kabuk komutunu çevreleyen karakter(ler)" + +msgid "like 'shellquote' but include the redirection" +msgstr "'shellquote' gibi; ancak yeniden yönlendirmeyi içer" + +msgid "characters to escape when 'shellxquote' is (" +msgstr "'shellxquote' ( iken kaçırılacak karakterler" + +msgid "argument for 'shell' to execute a command" +msgstr "bir komut çalıştırmak için 'shell' için deÄŸiÅŸken" + +msgid "used to redirect command output to a file" +msgstr "komut çıktısını bir dosyaya yeniden yönlendirmek için kullanılır" + +msgid "use a temp file for shell commands instead of using a pipe" +msgstr "bir veri yolu kullanımı yerine kabuk komutları için geçici\n" +"bir dosya kullan" + +msgid "program used for \"=\" command" +msgstr "\"=\" komutu için kullanılan program" + +msgid "program used to format lines with \"gq\" command" +msgstr "\"gq\" komutu ile satır biçimlemek için kullanılan program" + +msgid "program used for the \"K\" command" +msgstr "\"K\" komutu için kullanılan program" + +msgid "warn when using a shell command and a buffer has changes" +msgstr "bir kabuk komutu kullanılıyorsa ve arabellekte deÄŸiÅŸiklikler\n" +"varsa uyar" + +msgid "running make and jumping to errors (quickfix)" +msgstr "make çalıştırma ve hatalara atlama (hızlı düzelt)" + +msgid "name of the file that contains error messages" +msgstr "hata iletileri içeren dosyanın adı" + +msgid "list of formats for error messages" +msgstr "hata iletileri için biçim listesi" + +msgid "program used for the \":make\" command" +msgstr "\":make\" komutu için kullanılan program" + +msgid "string used to put the output of \":make\" in the error file" +msgstr "\":make\" komutunun çıktısını hata dosyasına koymak için\n" +"kullanılan dizi" + +msgid "name of the errorfile for the 'makeprg' command" +msgstr "'makeprg' komutu için hata dosyası adı" + +msgid "program used for the \":grep\" command" +msgstr "\":grep\" komutu için kullanılan program" + +msgid "list of formats for output of 'grepprg'" +msgstr "'grepprg' çıktısı için kullanılan biçimlerin listesi" + +msgid "encoding of the \":make\" and \":grep\" output" +msgstr "\":make\" ve \":grep\" çıktılarının kodlaması" + +msgid "function to display text in the quickfix window" +msgstr "hızlı düzelt içinde metin düzenlemek için iÅŸlev" + +msgid "system specific" +msgstr "sisteme özel" + +msgid "use forward slashes in file names; for Unix-like shells" +msgstr "dosya adlarında eÄŸik çizgi kullan; Unix tarzı kabuklar için" + +msgid "specifies slash/backslash used for completion" +msgstr "tamamlama için kullanılan eÄŸik/ters eÄŸik çizgiyi belirler" + +msgid "language specific" +msgstr "dile özel ayarlar" + +msgid "specifies the characters in a file name" +msgstr "bir dosya adındaki karakterleri belirtir" + +msgid "specifies the characters in an identifier" +msgstr "bir tanımlayıcıdaki karakterleri belirler" + +msgid "specifies the characters in a keyword" +msgstr "bir anahtar sözcükteki karakterleri belirler" + +msgid "specifies printable characters" +msgstr "yazdırılabilir karakterleri belirler" + +msgid "specifies escape characters in a string" +msgstr "bir dizideki kaçış karakterlerini belirler" + +msgid "display the buffer right-to-left" +msgstr "arabelleÄŸi saÄŸdan sola görüntüle" + +msgid "when to edit the command-line right-to-left" +msgstr "komut satırının ne zaman saÄŸdan sola düzenleneceÄŸi" + +msgid "insert characters backwards" +msgstr "karakterleri geriye doÄŸru ekle" + +msgid "allow CTRL-_ in Insert and Command-line mode to toggle 'revins'" +msgstr "'revins' açıp kapatmak için Ekleme ve Komut Satırı kipinde\n" +"CTRL-_ izin ver" + +msgid "the ASCII code for the first letter of the Hebrew alphabet" +msgstr "Ä°bran abecesinin ilk harfinin ASCII kodu" + +msgid "use Hebrew keyboard mapping" +msgstr "Ä°branca klavye eÅŸlemlemesini kullan" + +msgid "use phonetic Hebrew keyboard mapping" +msgstr "fonetik Ä°branca klavye eÅŸlemlemesini kullan" + +msgid "prepare for editing Arabic text" +msgstr "Arapça metni düzenleme için hazırlan" + +msgid "perform shaping of Arabic characters" +msgstr "Arapça karakterlerin ÅŸekillendirmesini gerçekleÅŸtir" + +msgid "terminal will perform bidi handling" +msgstr "saÄŸdan sola yazımı uçbirim gerçekleÅŸtirecek" + +msgid "name of a keyboard mapping" +msgstr "bir klavye eÅŸlemlemesinin adı" + +msgid "list of characters that are translated in Normal mode" +msgstr "Normal kipte çevrilen karakterlerin listesi" + +msgid "apply 'langmap' to mapped characters" +msgstr "eÅŸlemlenen karakterlere 'langmap' uygula" + +msgid "when set never use IM; overrules following IM options" +msgstr "ayarlandığında hiçbir zaman IM kullanma; aÅŸağıdaki IM seçeneklerini " +"geçersiz kılar" + +msgid "in Insert mode: 1: use :lmap; 2: use IM; 0: neither" +msgstr "Ekleme kipinde: 1: :lmap kullan; 2; IM kullan; 0: hiçbiri" + +msgid "input method style, 0: on-the-spot, 1: over-the-spot" +msgstr "girdi yöntemi stili, 0: on-the-spot, 1: over-the-spot" + +msgid "entering a search pattern: 1: use :lmap; 2: use IM; 0: neither" +msgstr "bir arama dizgisi gir: 1: :lmap kullan; 2: IM kullan; 0: hiçbiri" + +msgid "when set always use IM when starting to edit a command line" +msgstr "" +"ayarlandığında, bir komut satırı düzenlemeye baÅŸlarken her zaman IM kullan" + +msgid "function to obtain IME status" +msgstr "IME durumunu elde etmek için iÅŸlev" + +msgid "function to enable/disable IME" +msgstr "IME'yi etkinleÅŸtirmek/devre dışı bırakmak için iÅŸlev" + +msgid "multi-byte characters" +msgstr "çoklu bayt karakterler" + +msgid "" +"character encoding used in Vim: \"latin1\", \"utf-8\",\n" +"\"euc-jp\", \"big5\", etc." +msgstr "" +"Vim'de kullanılan karakter kodlamaları: \"latin1\", \"utf-8\",\n" +"\"euc-jp\", \"big5\" gibi" + +msgid "character encoding for the current file" +msgstr "geçerli dosya için karakter kodlaması" + +msgid "automatically detected character encodings" +msgstr "karakter kodlamasını kendiliÄŸinden algıla" + +msgid "character encoding used by the terminal" +msgstr "uçbirim tarafından kullanılan karakter kodlaması" + +msgid "expression used for character encoding conversion" +msgstr "karakter kodlaması dönüşümü için kullanılan ifade" + +msgid "delete combining (composing) characters on their own" +msgstr "birleÅŸtiren (oluÅŸturucu) karakterleri kendi başına kullan" + +msgid "maximum number of combining (composing) characters displayed" +msgstr "en çok görüntülenen birleÅŸtiren (oluÅŸturucu) karakterlerin sayısı" + +msgid "key that activates the X input method" +msgstr "X girdi yöntemini etkinleÅŸtiren düğme" + +msgid "width of ambiguous width characters" +msgstr "belirsiz geniÅŸlikli karakterlerin geniÅŸliÄŸi" + +msgid "emoji characters are full width" +msgstr "emoji karakterleri tam geniÅŸliklidir" + +msgid "various" +msgstr "çeÅŸitli" + +msgid "" +"when to use virtual editing: \"block\", \"insert\", \"all\"\n" +"and/or \"onemore\"" +msgstr "" +"ne zaman sanal düzenleme kullanmalı: \"block\", \"insert\",\n" +"\"all\" ve/veya \"onemore\"" + +msgid "list of autocommand events which are to be ignored" +msgstr "yok sayılacak otokomut olayları" + +msgid "load plugin scripts when starting up" +msgstr "baÅŸlarken eklenti betiklerini yükle" + +msgid "enable reading .vimrc/.exrc/.gvimrc in the current directory" +msgstr "geçerli dizinde .vimrc/.exrc/.gvimrc okumayı etkinleÅŸtir" + +msgid "safer working with script files in the current directory" +msgstr "geçerli dizinde betik dosyalarıyla daha güvenli çalışma" + +msgid "use the 'g' flag for \":substitute\"" +msgstr "\":substitute\" için 'g' bayrağını kullan" + +msgid "'g' and 'c' flags of \":substitute\" toggle" +msgstr "\":substitute\" açma/kapama düğmesinin 'g' ve 'c' bayrakları" + +msgid "allow reading/writing devices" +msgstr "aygıtları okumaya/yazmaya izin ver" + +msgid "maximum depth of function calls" +msgstr "iÅŸlev çaÄŸrılarının en çok derinliÄŸi" + +msgid "list of words that specifies what to put in a session file" +msgstr "bir oturum dosyasına ne koyulacağını belirleyen sözcükler listesi" + +msgid "list of words that specifies what to save for :mkview" +msgstr ":mkview için neyin kaydedileceÄŸini belirleyen sözcükler listesi" + +msgid "directory where to store files with :mkview" +msgstr ":mkview ile dosyaların depolanacağı dizin" + +msgid "list that specifies what to write in the viminfo file" +msgstr "viminfo dosyasına nelerin yazılacağını belirleyen liste" + +msgid "file name used for the viminfo file" +msgstr "viminfo dosyası için kullanılan dosya adı" + +msgid "what happens with a buffer when it's no longer in a window" +msgstr "bir arabellek artık bir pencerede deÄŸilken ne olacağı" + +msgid "empty, \"nofile\", \"nowrite\", \"quickfix\", etc.: type of buffer" +msgstr "boÅŸ, \"nofile\", \"nowrite\", \"quickfix\" vb.: arabellek türü" + +msgid "whether the buffer shows up in the buffer list" +msgstr "arabelleÄŸin, arabellek listesinde görünüp görünmeyeceÄŸi" + +msgid "set to \"msg\" to see all error messages" +msgstr "tüm hata iletilerini görmek için \"msg\" olarak ayarlayın" + +msgid "whether to show the signcolumn" +msgstr "iÅŸaret sütununun görünüp görünmeyeceÄŸi" + +msgid "interval in milliseconds between polls for MzScheme threads" +msgstr "MzScheme iÅŸ parçacıkları için anketler arasındaki süre (milisaniye)" + +msgid "name of the Lua dynamic library" +msgstr "Lua devingen kitaplığının adı" + +msgid "name of the Perl dynamic library" +msgstr "Perl devingen kitaplığının adı" + +msgid "whether to use Python 2 or 3" +msgstr "Python 2 veya 3 mü kullanılacağı" + +msgid "name of the Python 2 dynamic library" +msgstr "Python 2 devingen kitaplığının adı" + +msgid "name of the Python 2 home directory" +msgstr "Python 2 ev dizininin adı" + +msgid "name of the Python 3 dynamic library" +msgstr "Python 3 devingen kitaplığının adı" + +msgid "name of the Python 3 home directory" +msgstr "Python 3 ev dizininin adı" + +msgid "name of the Ruby dynamic library" +msgstr "Ruby devingen kitaplığının adı" + +msgid "name of the Tcl dynamic library" +msgstr "Tcl devingen kitaplığının adı" + +msgid "name of the MzScheme dynamic library" +msgstr "MzScheme devingen kitaplığının adı" + +msgid "name of the MzScheme GC dynamic library" +msgstr "MzScheme GC devingen kitaplığının adı" diff -Nru vim-8.2.1913/src/popupmenu.c vim-8.2.2434/src/popupmenu.c --- vim-8.2.1913/src/popupmenu.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/popupmenu.c 2021-01-30 22:05:11.000000000 +0000 @@ -361,6 +361,8 @@ // redo the positioning. Limit this to two times, when there is not // much room the window size will keep changing. } while (pum_set_selected(selected, redo_count) && ++redo_count <= 2); + + pum_redraw(); } /* @@ -541,8 +543,23 @@ { if (st != NULL) { - screen_puts_len(st, (int)STRLEN(st), row, col, - attr); + int size = (int)STRLEN(st); + int cells = (*mb_string2cells)(st, size); + + // only draw the text that fits + while (size > 0 + && col + cells > pum_width + pum_col) + { + --size; + if (has_mbyte) + { + size -= (*mb_head_off)(st, st + size); + cells -= (*mb_ptr2cells)(st + size); + } + else + --cells; + } + screen_puts_len(st, size, row, col, attr); vim_free(st); } col += width; @@ -795,6 +812,10 @@ use_popup = USEPOPUP_NORMAL; else use_popup = USEPOPUP_NONE; + if (use_popup != USEPOPUP_NONE) + // don't use WinEnter or WinLeave autocommands for the info + // popup + block_autocmds(); # endif // Open a preview window and set "curwin" to it. // 3 lines by default, prefer 'previewheight' if set and smaller. @@ -837,6 +858,7 @@ // Edit a new, empty buffer. Set options for a "wipeout" // buffer. set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL); + set_option_value((char_u *)"bl", 0L, NULL, OPT_LOCAL); set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL); set_option_value((char_u *)"bh", 0L, @@ -973,6 +995,10 @@ // can't keep focus in a popup window win_enter(firstwin, TRUE); # endif +# ifdef FEAT_PROP_POPUP + if (use_popup != USEPOPUP_NONE) + unblock_autocmds(); +# endif } #endif } @@ -982,9 +1008,6 @@ popup_hide_info(); #endif - if (!resized) - pum_redraw(); - return resized; } @@ -1435,10 +1458,21 @@ return; FOR_ALL_CHILD_MENUS(menu, mp) + { + char_u *s = NULL; + + // Make a copy of the text, the menu may be redefined in a callback. if (menu_is_separator(mp->dname)) - array[idx++].pum_text = (char_u *)""; + s = (char_u *)""; else if (mp->modes & mp->enabled & mode) - array[idx++].pum_text = mp->dname; + s = mp->dname; + if (s != NULL) + { + s = vim_strsave(s); + if (s != NULL) + array[idx++].pum_text = s; + } + } pum_array = array; pum_compute_size(); @@ -1519,6 +1553,8 @@ } } + for (idx = 0; idx < pum_size; ++idx) + vim_free(array[idx].pum_text); vim_free(array); pum_undisplay(); # ifdef FEAT_BEVAL_TERM diff -Nru vim-8.2.1913/src/popupwin.c vim-8.2.2434/src/popupwin.c --- vim-8.2.1913/src/popupwin.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/popupwin.c 2021-01-30 22:05:11.000000000 +0000 @@ -384,7 +384,7 @@ vim_snprintf((char *)cbbuf, sizeof(cbbuf), "{_ -> popup_close(%d)}", wp->w_id); - if (get_lambda_tv(&ptr, &tv, &EVALARG_EVALUATE) == OK) + if (get_lambda_tv(&ptr, &tv, FALSE, &EVALARG_EVALUATE) == OK) { wp->w_popup_timer = create_timer(time, 0); wp->w_popup_timer->tr_callback = get_callback(&tv); @@ -2380,9 +2380,10 @@ res.v_type = VAR_NUMBER; old_lnum = wp->w_cursor.lnum; - if ((c == 'k' || c == 'K' || c == K_UP) && wp->w_cursor.lnum > 1) + if ((c == 'k' || c == 'K' || c == K_UP || c == Ctrl_P) + && wp->w_cursor.lnum > 1) --wp->w_cursor.lnum; - if ((c == 'j' || c == 'J' || c == K_DOWN) + if ((c == 'j' || c == 'J' || c == K_DOWN || c == Ctrl_N) && wp->w_cursor.lnum < wp->w_buffer->b_ml.ml_line_count) ++wp->w_cursor.lnum; if (old_lnum != wp->w_cursor.lnum) @@ -3346,21 +3347,29 @@ cols = tv_get_number(&li->li_tv); if (cols < 0) cols = width + cols + 1; + if (cols <= 0) + cols = 1; li = li->li_next; cole = tv_get_number(&li->li_tv); if (cole < 0) cole = width + cole + 1; + if (cole > width) + cole = width; li = li->li_next; lines = tv_get_number(&li->li_tv); if (lines < 0) lines = height + lines + 1; + if (lines <= 0) + lines = 1; li = li->li_next; linee = tv_get_number(&li->li_tv); if (linee < 0) linee = height + linee + 1; + if (linee > height) + linee = height; - for (row = lines - 1; row < linee && row < height; ++row) - for (col = cols - 1; col < cole && col < width; ++col) + for (row = lines - 1; row < linee; ++row) + for (col = cols - 1; col < cole; ++col) cells[row * width + col] = 1; } } @@ -3692,19 +3701,25 @@ int row; int wincol; int padcol = 0; - int padwidth = 0; + int padendcol = 0; int i; int sb_thumb_top = 0; int sb_thumb_height = 0; int attr_scroll = 0; int attr_thumb = 0; + // hide the cursor until redrawing is done. + cursor_off(); + // Find the window with the lowest zindex that hasn't been updated yet, // so that the window with a higher zindex is drawn later, thus goes on // top. popup_reset_handled(POPUP_HANDLED_5); while ((wp = find_next_popup(TRUE, POPUP_HANDLED_5)) != NULL) { + int title_len = 0; + int title_wincol; + // This drawing uses the zindex of the popup window, so that it's on // top of the text but doesn't draw when another popup with higher // zindex is on top of the character. @@ -3743,13 +3758,17 @@ wp->w_winrow -= top_off; wp->w_wincol -= left_extra; - // cursor position matters in terminal in job mode -#ifdef FEAT_TERMINAL - if (wp != curwin || !term_in_normal_mode()) -#endif + + // Add offset for border and padding if not done already. + if ((wp->w_flags & WFLAG_WCOL_OFF_ADDED) == 0) { - wp->w_wrow += top_off; wp->w_wcol += left_extra; + wp->w_flags |= WFLAG_WCOL_OFF_ADDED; + } + if ((wp->w_flags & WFLAG_WROW_OFF_ADDED) == 0) + { + wp->w_wrow += top_off; + wp->w_flags |= WFLAG_WROW_OFF_ADDED; } total_width = popup_width(wp); @@ -3794,16 +3813,47 @@ border_attr[i] = syn_name2attr(wp->w_border_highlight[i]); } + // Title goes on top of border or padding. + title_wincol = wp->w_wincol + 1; + if (wp->w_popup_title != NULL) + { + char_u *title_text; + + title_len = (int)STRLEN(wp->w_popup_title); + title_text = alloc(title_len + 1); + trunc_string(wp->w_popup_title, title_text, + total_width - 2, title_len + 1); + screen_puts(title_text, wp->w_winrow, title_wincol, + wp->w_popup_border[0] > 0 ? border_attr[0] : popup_attr); + vim_free(title_text); + if (title_len > total_width - 2) + title_len = total_width - 2; + } + wincol = wp->w_wincol - wp->w_popup_leftoff; top_padding = wp->w_popup_padding[0]; if (wp->w_popup_border[0] > 0) { - // top border - screen_fill(wp->w_winrow, wp->w_winrow + 1, - wincol < 0 ? 0 : wincol, wincol + total_width, - wp->w_popup_border[3] != 0 && wp->w_popup_leftoff == 0 + // top border; do not draw over the title + if (title_len > 0) + { + screen_fill(wp->w_winrow, wp->w_winrow + 1, + wincol < 0 ? 0 : wincol, title_wincol, + wp->w_popup_border[3] != 0 && wp->w_popup_leftoff == 0 + ? border_char[4] : border_char[0], + border_char[0], border_attr[0]); + screen_fill(wp->w_winrow, wp->w_winrow + 1, + title_wincol + title_len, wincol + total_width, + border_char[0], border_char[0], border_attr[0]); + } + else + { + screen_fill(wp->w_winrow, wp->w_winrow + 1, + wincol < 0 ? 0 : wincol, wincol + total_width, + wp->w_popup_border[3] != 0 && wp->w_popup_leftoff == 0 ? border_char[4] : border_char[0], - border_char[0], border_attr[0]); + border_char[0], border_attr[0]); + } if (wp->w_popup_border[1] > 0 && wp->w_popup_rightoff == 0) { buf[mb_char2bytes(border_char[5], buf)] = NUL; @@ -3817,32 +3867,29 @@ if (top_padding > 0 || wp->w_popup_padding[2] > 0) { padcol = wincol + wp->w_popup_border[3]; - padwidth = wp->w_wincol + total_width - wp->w_popup_border[1] + padendcol = wp->w_wincol + total_width - wp->w_popup_border[1] - wp->w_has_scrollbar; if (padcol < 0) { - padwidth += padcol; + padendcol += padcol; padcol = 0; } } if (top_padding > 0) { - // top padding row = wp->w_winrow + wp->w_popup_border[0]; - screen_fill(row, row + top_padding, padcol, padwidth, + if (title_len > 0 && row == wp->w_winrow) + { + // top padding and no border; do not draw over the title + screen_fill(row, row + 1, padcol, title_wincol, + ' ', ' ', popup_attr); + screen_fill(row, row + 1, title_wincol + title_len, + padendcol, ' ', ' ', popup_attr); + row += 1; + top_padding -= 1; + } + screen_fill(row, row + top_padding, padcol, padendcol, ' ', ' ', popup_attr); - } - - // Title goes on top of border or padding. - if (wp->w_popup_title != NULL) - { - int len = (int)STRLEN(wp->w_popup_title) + 1; - char_u *title = alloc(len); - - trunc_string(wp->w_popup_title, title, total_width - 2, len); - screen_puts(title, wp->w_winrow, wp->w_wincol + 1, - wp->w_popup_border[0] > 0 ? border_attr[0] : popup_attr); - vim_free(title); } // Compute scrollbar thumb position and size. @@ -3944,7 +3991,7 @@ row = wp->w_winrow + wp->w_popup_border[0] + wp->w_popup_padding[0] + wp->w_height; screen_fill(row, row + wp->w_popup_padding[2], - padcol, padwidth, ' ', ' ', popup_attr); + padcol, padendcol, ' ', ' ', popup_attr); } if (wp->w_popup_border[2] > 0) diff -Nru vim-8.2.1913/src/profiler.c vim-8.2.2434/src/profiler.c --- vim-8.2.1913/src/profiler.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/profiler.c 2021-01-30 22:05:11.000000000 +0000 @@ -555,6 +555,51 @@ } /* + * When calling a function: may initialize for profiling. + */ + void +profile_may_start_func(profinfo_T *info, ufunc_T *fp, funccall_T *fc) +{ + if (do_profiling == PROF_YES) + { + if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL)) + { + info->pi_started_profiling = TRUE; + func_do_profile(fp); + } + if (fp->uf_profiling + || (fc->caller != NULL && fc->caller->func->uf_profiling)) + { + ++fp->uf_tm_count; + profile_start(&info->pi_call_start); + profile_zero(&fp->uf_tm_children); + } + script_prof_save(&info->pi_wait_start); + } +} + +/* + * After calling a function: may handle profiling. profile_may_start_func() + * must have been called previously. + */ + void +profile_may_end_func(profinfo_T *info, ufunc_T *fp, funccall_T *fc) +{ + profile_end(&info->pi_call_start); + profile_sub_wait(&info->pi_wait_start, &info->pi_call_start); + profile_add(&fp->uf_tm_total, &info->pi_call_start); + profile_self(&fp->uf_tm_self, &info->pi_call_start, &fp->uf_tm_children); + if (fc->caller != NULL && fc->caller->func->uf_profiling) + { + profile_add(&fc->caller->func->uf_tm_children, &info->pi_call_start); + profile_add(&fc->caller->func->uf_tml_children, &info->pi_call_start); + } + if (info->pi_started_profiling) + // make a ":profdel func" stop profiling the function + fp->uf_profiling = FALSE; +} + +/* * Prepare profiling for entering a child or something else that is not * counted for the script/function itself. * Should always be called in pair with prof_child_exit(). @@ -597,15 +642,14 @@ * until later and we need to store the time now. */ void -func_line_start(void *cookie) +func_line_start(void *cookie, long lnum) { funccall_T *fcp = (funccall_T *)cookie; ufunc_T *fp = fcp->func; - if (fp->uf_profiling && SOURCING_LNUM >= 1 - && SOURCING_LNUM <= fp->uf_lines.ga_len) + if (fp->uf_profiling && lnum >= 1 && lnum <= fp->uf_lines.ga_len) { - fp->uf_tml_idx = SOURCING_LNUM - 1; + fp->uf_tml_idx = lnum - 1; // Skip continuation lines. while (fp->uf_tml_idx > 0 && FUNCLINE(fp, fp->uf_tml_idx) == NULL) --fp->uf_tml_idx; diff -Nru vim-8.2.1913/src/proto/buffer.pro vim-8.2.2434/src/proto/buffer.pro --- vim-8.2.1913/src/proto/buffer.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/buffer.pro 2021-01-30 22:05:11.000000000 +0000 @@ -5,7 +5,7 @@ void set_bufref(bufref_T *bufref, buf_T *buf); int bufref_valid(bufref_T *bufref); int buf_valid(buf_T *buf); -void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last, int ignore_abort); +int close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last, int ignore_abort); void buf_clear_file(buf_T *buf); void buf_freeall(buf_T *buf, int flags); void free_wininfo(wininfo_T *wip); @@ -66,6 +66,7 @@ int bt_dontwrite_msg(buf_T *buf); int buf_hide(buf_T *buf); char_u *buf_spname(buf_T *buf); +char_u *buf_get_fname(buf_T *buf); void set_buflisted(int on); int buf_contents_changed(buf_T *buf); void wipe_buffer(buf_T *buf, int aucmd); diff -Nru vim-8.2.1913/src/proto/dict.pro vim-8.2.2434/src/proto/dict.pro --- vim-8.2.1913/src/proto/dict.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/dict.pro 2021-01-30 22:05:11.000000000 +0000 @@ -33,6 +33,8 @@ varnumber_T dict_get_number_check(dict_T *d, char_u *key); varnumber_T dict_get_bool(dict_T *d, char_u *key, int def); char_u *dict2string(typval_T *tv, int copyID, int restore_copyID); +char_u *skip_literal_key(char_u *key); +char_u *get_literal_key(char_u **arg); int eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal); void dict_extend(dict_T *d1, dict_T *d2, char_u *action); dictitem_T *dict_lookup(hashitem_T *hi); diff -Nru vim-8.2.1913/src/proto/edit.pro vim-8.2.2434/src/proto/edit.pro --- vim-8.2.1913/src/proto/edit.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/edit.pro 2021-01-30 22:05:11.000000000 +0000 @@ -10,7 +10,7 @@ void undisplay_dollar(void); void truncate_spaces(char_u *line); void backspace_until_column(int col); -int get_literal(void); +int get_literal(int noReduceKeys); void insertchar(int c, int flags, int second_indent); void start_arrow(pos_T *end_insert_pos); int stop_arrow(void); diff -Nru vim-8.2.1913/src/proto/evalfunc.pro vim-8.2.2434/src/proto/evalfunc.pro --- vim-8.2.1913/src/proto/evalfunc.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/evalfunc.pro 2021-01-30 22:05:11.000000000 +0000 @@ -4,8 +4,9 @@ int find_internal_func(char_u *name); int has_internal_func(char_u *name); char *internal_func_name(int idx); -int internal_func_check_arg_types(type_T **types, int idx, int argcount); +int internal_func_check_arg_types(type_T **types, int idx, int argcount, cctx_T *cctx); type_T *internal_func_ret_type(int idx, int argcount, type_T **argtypes); +int internal_func_is_map(int idx); int check_internal_func(int idx, int argcount); int call_internal_func(char_u *name, int argcount, typval_T *argvars, typval_T *rettv); void call_internal_func_by_idx(int idx, typval_T *argvars, typval_T *rettv); @@ -16,6 +17,7 @@ void execute_redir_str(char_u *value, int value_len); void execute_common(typval_T *argvars, typval_T *rettv, int arg_off); void f_has(typval_T *argvars, typval_T *rettv); +int dynamic_feature(char_u *feature); void mzscheme_call_vim(char_u *name, typval_T *args, typval_T *rettv); void range_list_materialize(list_T *list); float_T vim_round(float_T f); diff -Nru vim-8.2.1913/src/proto/eval.pro vim-8.2.2434/src/proto/eval.pro --- vim-8.2.1913/src/proto/eval.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/eval.pro 2021-01-30 22:05:11.000000000 +0000 @@ -1,6 +1,6 @@ /* eval.c */ -varnumber_T num_divide(varnumber_T n1, varnumber_T n2); -varnumber_T num_modulus(varnumber_T n1, varnumber_T n2); +varnumber_T num_divide(varnumber_T n1, varnumber_T n2, int *failed); +varnumber_T num_modulus(varnumber_T n1, varnumber_T n2, int *failed); void eval_init(void); void eval_clear(void); void fill_evalarg_from_eap(evalarg_T *evalarg, exarg_T *eap, int skip); @@ -11,12 +11,15 @@ char_u *eval_to_string_skip(char_u *arg, exarg_T *eap, int skip); int skip_expr(char_u **pp, evalarg_T *evalarg); int skip_expr_concatenate(char_u **arg, char_u **start, char_u **end, evalarg_T *evalarg); +char_u *typval2string(typval_T *tv, int convert); +char_u *eval_to_string_eap(char_u *arg, int convert, exarg_T *eap); char_u *eval_to_string(char_u *arg, int convert); char_u *eval_to_string_safe(char_u *arg, int use_sandbox); varnumber_T eval_to_number(char_u *expr); typval_T *eval_expr(char_u *arg, exarg_T *eap); int call_vim_function(char_u *func, int argc, typval_T *argv, typval_T *rettv); varnumber_T call_func_retnr(char_u *func, int argc, typval_T *argv); +int call_func_noret(char_u *func, int argc, typval_T *argv); void *call_func_retstr(char_u *func, int argc, typval_T *argv); void *call_func_retlist(char_u *func, int argc, typval_T *argv); int eval_foldexpr(char_u *arg, int *cp); @@ -37,8 +40,10 @@ int eval1(char_u **arg, typval_T *rettv, evalarg_T *evalarg); void eval_addblob(typval_T *tv1, typval_T *tv2); int eval_addlist(typval_T *tv1, typval_T *tv2); +int eval_leader(char_u **arg, int vim9); int check_can_index(typval_T *rettv, int evaluate, int verbose); -int eval_index_inner(typval_T *rettv, int is_range, typval_T *var1, typval_T *var2, char_u *key, int keylen, int verbose); +void f_slice(typval_T *argvars, typval_T *rettv); +int eval_index_inner(typval_T *rettv, int is_range, typval_T *var1, typval_T *var2, int exclusive, char_u *key, int keylen, int verbose); char_u *partial_name(partial_T *pt); void partial_unref(partial_T *pt); int get_copyID(void); @@ -52,8 +57,10 @@ char_u *echo_string(typval_T *tv, char_u **tofree, char_u *numbuf, int copyID); char_u *string_quote(char_u *str, int function); int string2float(char_u *text, float_T *value); -pos_T *var2fpos(typval_T *varp, int dollar_lnum, int *fnum); -int list2fpos(typval_T *arg, pos_T *posp, int *fnump, colnr_T *curswantp); +int buf_byteidx_to_charidx(buf_T *buf, int lnum, int byteidx); +int buf_charidx_to_byteidx(buf_T *buf, int lnum, int charidx); +pos_T *var2fpos(typval_T *varp, int dollar_lnum, int *fnum, int charcol); +int list2fpos(typval_T *arg, pos_T *posp, int *fnump, colnr_T *curswantp, int charcol); int get_env_len(char_u **arg); int get_id_len(char_u **arg); int get_name_len(char_u **arg, char_u **alias, int evaluate, int verbose); @@ -61,8 +68,6 @@ int eval_isnamec(int c); int eval_isnamec1(int c); int eval_isdictc(int c); -char_u *char_from_string(char_u *str, varnumber_T index); -char_u *string_slice(char_u *str, varnumber_T first, varnumber_T last); int handle_subscript(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int verbose); int item_copy(typval_T *from, typval_T *to, int deep, int copyID); void echo_one(typval_T *rettv, int with_space, int *atstart, int *needclr); diff -Nru vim-8.2.1913/src/proto/evalvars.pro vim-8.2.2434/src/proto/evalvars.pro --- vim-8.2.1913/src/proto/evalvars.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/evalvars.pro 2021-01-30 22:05:11.000000000 +0000 @@ -26,6 +26,7 @@ int do_unlet(char_u *name, int forceit); void item_lock(typval_T *tv, int deep, int lock, int check_refcount); void del_menutrans_vars(void); +char_u *cat_prefix_varname(int prefix, char_u *name); char_u *get_user_var_name(expand_T *xp, int idx); char *get_var_special_name(int nr); dict_T *get_globvar_dict(void); @@ -59,7 +60,7 @@ dictitem_T *find_var(char_u *name, hashtab_T **htp, int no_autoload); dictitem_T *find_var_in_ht(hashtab_T *ht, int htname, char_u *varname, int no_autoload); hashtab_T *get_script_local_ht(void); -void *lookup_scriptvar(char_u *name, size_t len, cctx_T *dummy); +int lookup_scriptvar(char_u *name, size_t len, void *lvar, cctx_T *dummy); hashtab_T *find_var_ht(char_u *name, char_u **varname); char_u *get_var_value(char_u *name); void new_script_vars(scid_T id); @@ -70,12 +71,13 @@ void delete_var(hashtab_T *ht, hashitem_T *hi); void set_var(char_u *name, typval_T *tv, int copy); void set_var_const(char_u *name, type_T *type, typval_T *tv_arg, int copy, int flags); +int var_check_permission(dictitem_T *di, char_u *name); int var_check_ro(int flags, char_u *name, int use_gettext); int var_check_lock(int flags, char_u *name, int use_gettext); int var_check_fixed(int flags, char_u *name, int use_gettext); int var_wrong_func_name(char_u *name, int new_var); int value_check_lock(int lock, char_u *name, int use_gettext); -int valid_varname(char_u *varname); +int valid_varname(char_u *varname, int autoload); void reset_v_option_vars(void); void assert_error(garray_T *gap); int var_exists(char_u *var); diff -Nru vim-8.2.1913/src/proto/ex_docmd.pro vim-8.2.2434/src/proto/ex_docmd.pro --- vim-8.2.1913/src/proto/ex_docmd.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/ex_docmd.pro 2021-01-30 22:05:11.000000000 +0000 @@ -1,6 +1,7 @@ /* ex_docmd.c */ void do_exmode(int improved); int do_cmdline_cmd(char_u *cmd); +int do_cmd_argument(char_u *cmd); int do_cmdline(char_u *cmdline, char_u *(*fgetline)(int, void *, int, getline_opt_T), void *cookie, int flags); int getline_equal(char_u *(*fgetline)(int, void *, int, getline_opt_T), void *cookie, char_u *(*func)(int, void *, int, getline_opt_T)); void *getline_cookie(char_u *(*fgetline)(int, void *, int, getline_opt_T), void *cookie); @@ -12,7 +13,7 @@ int parse_cmd_address(exarg_T *eap, char **errormsg, int silent); int checkforcmd(char_u **pp, char *cmd, int len); char_u *skip_option_env_lead(char_u *start); -char_u *find_ex_command(exarg_T *eap, int *full, void *(*lookup)(char_u *, size_t, cctx_T *), cctx_T *cctx); +char_u *find_ex_command(exarg_T *eap, int *full, int (*lookup)(char_u *, size_t, void *, cctx_T *), cctx_T *cctx); int modifier_len(char_u *cmd); int cmd_exists(char_u *name); cmdidx_T excmd_get_cmdidx(char_u *cmd, int len); @@ -41,7 +42,7 @@ void post_chdir(cdscope_T scope); int changedir_func(char_u *new_dir, int forceit, cdscope_T scope); void ex_cd(exarg_T *eap); -void do_sleep(long msec); +void do_sleep(long msec, int hide_cursor); void ex_may_print(exarg_T *eap); void ex_redraw(exarg_T *eap); int vim_mkdir_emsg(char_u *name, int prot); diff -Nru vim-8.2.1913/src/proto/filepath.pro vim-8.2.2434/src/proto/filepath.pro --- vim-8.2.1913/src/proto/filepath.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/filepath.pro 2021-01-30 22:05:11.000000000 +0000 @@ -1,5 +1,6 @@ /* filepath.c */ int modify_fname(char_u *src, int tilde_file, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen); +void shorten_dir(char_u *str); void f_chdir(typval_T *argvars, typval_T *rettv); void f_delete(typval_T *argvars, typval_T *rettv); void f_executable(typval_T *argvars, typval_T *rettv); @@ -21,10 +22,10 @@ void f_globpath(typval_T *argvars, typval_T *rettv); void f_isdirectory(typval_T *argvars, typval_T *rettv); void f_mkdir(typval_T *argvars, typval_T *rettv); -void shorten_dir(char_u *str); void f_pathshorten(typval_T *argvars, typval_T *rettv); void f_readdir(typval_T *argvars, typval_T *rettv); void f_readdirex(typval_T *argvars, typval_T *rettv); +void f_readblob(typval_T *argvars, typval_T *rettv); void f_readfile(typval_T *argvars, typval_T *rettv); void f_resolve(typval_T *argvars, typval_T *rettv); void f_tempname(typval_T *argvars, typval_T *rettv); diff -Nru vim-8.2.1913/src/proto/getchar.pro vim-8.2.2434/src/proto/getchar.pro --- vim-8.2.1913/src/proto/getchar.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/getchar.pro 2021-01-30 22:05:11.000000000 +0000 @@ -51,4 +51,5 @@ void vungetc(int c); int fix_input_buffer(char_u *buf, int len); int input_available(void); +char_u *getcmdkeycmd(int promptc, void *cookie, int indent, getline_opt_T do_concat); /* vim: set ft=c : */ diff -Nru vim-8.2.1913/src/proto/list.pro vim-8.2.2434/src/proto/list.pro --- vim-8.2.1913/src/proto/list.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/list.pro 2021-01-30 22:05:11.000000000 +0000 @@ -34,7 +34,7 @@ int list_extend(list_T *l1, list_T *l2, listitem_T *bef); int list_concat(list_T *l1, list_T *l2, typval_T *tv); list_T *list_slice(list_T *ol, long n1, long n2); -int list_slice_or_index(list_T *list, int range, long n1_arg, long n2_arg, typval_T *rettv, int verbose); +int list_slice_or_index(list_T *list, int range, varnumber_T n1_arg, varnumber_T n2_arg, int exclusive, typval_T *rettv, int verbose); list_T *list_copy(list_T *orig, int deep, int copyID); void vimlist_remove(list_T *l, listitem_T *item, listitem_T *item2); char_u *list2string(typval_T *tv, int copyID, int restore_copyID); @@ -48,9 +48,11 @@ void f_uniq(typval_T *argvars, typval_T *rettv); void f_filter(typval_T *argvars, typval_T *rettv); void f_map(typval_T *argvars, typval_T *rettv); +void f_mapnew(typval_T *argvars, typval_T *rettv); void f_add(typval_T *argvars, typval_T *rettv); void f_count(typval_T *argvars, typval_T *rettv); void f_extend(typval_T *argvars, typval_T *rettv); +void f_extendnew(typval_T *argvars, typval_T *rettv); void f_insert(typval_T *argvars, typval_T *rettv); void f_remove(typval_T *argvars, typval_T *rettv); void f_reverse(typval_T *argvars, typval_T *rettv); diff -Nru vim-8.2.1913/src/proto/move.pro vim-8.2.2434/src/proto/move.pro --- vim-8.2.1913/src/proto/move.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/move.pro 2021-01-30 22:05:11.000000000 +0000 @@ -13,6 +13,7 @@ void changed_line_abv_curs(void); void changed_line_abv_curs_win(win_T *wp); void validate_botline(void); +void validate_botline_win(win_T *wp); void invalidate_botline(void); void invalidate_botline_win(win_T *wp); void approximate_botline_win(win_T *wp); diff -Nru vim-8.2.1913/src/proto/option.pro vim-8.2.2434/src/proto/option.pro --- vim-8.2.1913/src/proto/option.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/option.pro 2021-01-30 22:05:11.000000000 +0000 @@ -24,7 +24,7 @@ void set_term_option_sctx_idx(char *name, int opt_idx); void check_redraw(long_u flags); int findoption(char_u *arg); -int get_option_value(char_u *name, long *numval, char_u **stringval, int opt_flags); +getoption_T get_option_value(char_u *name, long *numval, char_u **stringval, int opt_flags); int get_option_value_strict(char_u *name, long *numval, char_u **stringval, int opt_type, void *from); char_u *option_iter_next(void **option, int opt_type); long_u get_option_flags(int opt_idx); @@ -75,4 +75,5 @@ char_u *get_showbreak_value(win_T *win); dict_T *get_winbuf_options(int bufopt); int fill_culopt_flags(char_u *val, win_T *wp); +int magic_isset(void); /* vim: set ft=c : */ diff -Nru vim-8.2.1913/src/proto/profiler.pro vim-8.2.2434/src/proto/profiler.pro --- vim-8.2.1913/src/proto/profiler.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/profiler.pro 2021-01-30 22:05:11.000000000 +0000 @@ -19,9 +19,11 @@ void prof_inchar_exit(void); int prof_def_func(void); void func_do_profile(ufunc_T *fp); +void profile_may_start_func(profinfo_T *info, ufunc_T *fp, funccall_T *fc); +void profile_may_end_func(profinfo_T *info, ufunc_T *fp, funccall_T *fc); void prof_child_enter(proftime_T *tm); void prof_child_exit(proftime_T *tm); -void func_line_start(void *cookie); +void func_line_start(void *cookie, long lnum); void func_line_exec(void *cookie); void func_line_end(void *cookie); void script_do_profile(scriptitem_T *si); diff -Nru vim-8.2.1913/src/proto/regexp.pro vim-8.2.2434/src/proto/regexp.pro --- vim-8.2.1913/src/proto/regexp.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/regexp.pro 2021-01-30 22:05:11.000000000 +0000 @@ -2,7 +2,7 @@ int re_multiline(regprog_T *prog); char_u *skip_regexp(char_u *startp, int delim, int magic); char_u *skip_regexp_err(char_u *startp, int delim, int magic); -char_u *skip_regexp_ex(char_u *startp, int dirc, int magic, char_u **newp, int *dropped); +char_u *skip_regexp_ex(char_u *startp, int dirc, int magic, char_u **newp, int *dropped, magic_T *magic_val); reg_extmatch_T *ref_extmatch(reg_extmatch_T *em); void unref_extmatch(reg_extmatch_T *em); char_u *regtilde(char_u *source, int magic); diff -Nru vim-8.2.1913/src/proto/register.pro vim-8.2.2434/src/proto/register.pro --- vim-8.2.1913/src/proto/register.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/register.pro 2021-01-30 22:05:11.000000000 +0000 @@ -6,7 +6,7 @@ void set_y_current(yankreg_T *yreg); void set_y_previous(yankreg_T *yreg); int get_expr_register(void); -void set_expr_line(char_u *new_line); +void set_expr_line(char_u *new_line, exarg_T *eap); char_u *get_expr_line(void); int valid_yank_reg(int regname, int writing); int get_yank_register(int regname, int writing); diff -Nru vim-8.2.1913/src/proto/typval.pro vim-8.2.2434/src/proto/typval.pro --- vim-8.2.1913/src/proto/typval.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/typval.pro 2021-01-30 22:05:11.000000000 +0000 @@ -9,14 +9,18 @@ varnumber_T tv_get_bool(typval_T *varp); varnumber_T tv_get_bool_chk(typval_T *varp, int *denote); float_T tv_get_float(typval_T *varp); +int check_for_string(typval_T *tv); +int check_for_nonempty_string(typval_T *tv); char_u *tv_get_string(typval_T *varp); +char_u *tv_get_string_strict(typval_T *varp); char_u *tv_get_string_buf(typval_T *varp, char_u *buf); char_u *tv_get_string_chk(typval_T *varp); char_u *tv_get_string_buf_chk(typval_T *varp, char_u *buf); +char_u *tv_get_string_buf_chk_strict(typval_T *varp, char_u *buf, int strict); char_u *tv_stringify(typval_T *varp, char_u *buf); int tv_check_lock(typval_T *tv, char_u *name, int use_gettext); void copy_tv(typval_T *from, typval_T *to); -int typval_compare(typval_T *typ1, typval_T *typ2, exptype_T type, int ic); +int typval_compare(typval_T *typ1, typval_T *typ2, exprtype_T type, int ic); char_u *typval_tostring(typval_T *arg); int tv_islocked(typval_T *tv); int tv_equal(typval_T *tv1, typval_T *tv2, int ic, int recursive); diff -Nru vim-8.2.1913/src/proto/userfunc.pro vim-8.2.2434/src/proto/userfunc.pro --- vim-8.2.1913/src/proto/userfunc.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/userfunc.pro 2021-01-30 22:05:11.000000000 +0000 @@ -1,11 +1,10 @@ /* userfunc.c */ void func_init(void); hashtab_T *func_tbl_get(void); -int get_function_args(char_u **argp, char_u endchar, garray_T *newargs, garray_T *argtypes, int *varargs, garray_T *default_args, int skip, exarg_T *eap, char_u **line_to_free); char_u *get_lambda_name(void); char_u *register_cfunc(cfunc_T cb, cfunc_free_T cb_free, void *state); -int get_lambda_tv(char_u **arg, typval_T *rettv, evalarg_T *evalarg); -char_u *deref_func_name(char_u *name, int *lenp, partial_T **partialp, int no_autoload); +int get_lambda_tv(char_u **arg, typval_T *rettv, int types_optional, evalarg_T *evalarg); +char_u *deref_func_name(char_u *name, int *lenp, partial_T **partialp, type_T **type, int no_autoload); void emsg_funcname(char *ermsg, char_u *name); int get_func_tv(char_u *name, int len, typval_T *rettv, char_u **arg, evalarg_T *evalarg, funcexe_T *funcexe); char_u *fname_trans_sid(char_u *name, char_u *fname_buf, char_u **tofree, int *error); @@ -13,7 +12,12 @@ ufunc_T *find_func(char_u *name, int is_global, cctx_T *cctx); int func_is_global(ufunc_T *ufunc); int func_name_refcount(char_u *name); -void copy_func(char_u *lambda, char_u *global); +int copy_func(char_u *lambda, char_u *global, ectx_T *ectx); +int funcdepth_increment(void); +void funcdepth_decrement(void); +int funcdepth_get(void); +void funcdepth_restore(int depth); +int check_user_func_argcount(ufunc_T *fp, int argcount); int call_user_func_check(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, funcexe_T *funcexe, dict_T *selfdict); void save_funccal(funccal_entry_T *entry); void restore_funccal(void); @@ -27,8 +31,9 @@ void user_func_error(int error, char_u *name); int call_func(char_u *funcname, int len, typval_T *rettv, int argcount_in, typval_T *argvars_in, funcexe_T *funcexe); char_u *printable_func_name(ufunc_T *fp); -char_u *trans_function_name(char_u **pp, int *is_global, int skip, int flags, funcdict_T *fdp, partial_T **partial); +char_u *trans_function_name(char_u **pp, int *is_global, int skip, int flags, funcdict_T *fdp, partial_T **partial, type_T **type); char_u *untrans_function_name(char_u *name); +void list_functions(regmatch_T *regmatch); ufunc_T *define_function(exarg_T *eap, char_u *name_arg); void ex_function(exarg_T *eap); void ex_defcompile(exarg_T *eap); diff -Nru vim-8.2.1913/src/proto/vim9compile.pro vim-8.2.2434/src/proto/vim9compile.pro --- vim-8.2.1913/src/proto/vim9compile.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/vim9compile.pro 2021-01-30 22:05:11.000000000 +0000 @@ -1,22 +1,25 @@ /* vim9compile.c */ int check_defined(char_u *p, size_t len, cctx_T *cctx); -int check_compare_types(exptype_T type, typval_T *tv1, typval_T *tv2); +int check_compare_types(exprtype_T type, typval_T *tv1, typval_T *tv2); +int use_typecheck(type_T *actual, type_T *expected); +int need_type(type_T *actual, type_T *expected, int offset, int arg_idx, cctx_T *cctx, int silent, int actual_is_const); +int func_needs_compiling(ufunc_T *ufunc, int profile); int get_script_item_idx(int sid, char_u *name, int check_writable, cctx_T *cctx); imported_T *find_imported(char_u *name, size_t len, cctx_T *cctx); imported_T *find_imported_in_script(char_u *name, size_t len, int sid); -int vim9_comment_start(char_u *p); char_u *peek_next_line_from_context(cctx_T *cctx); char_u *next_line_from_context(cctx_T *cctx, int skip_comment); +char_u *to_name_end(char_u *arg, int use_namespace); char_u *to_name_const_end(char_u *arg); -exptype_T get_compare_type(char_u *p, int *len, int *type_is); +exprtype_T get_compare_type(char_u *p, int *len, int *type_is); void error_white_both(char_u *op, int len); int assignment_len(char_u *p, int *heredoc); void vim9_declare_error(char_u *name); int check_vim9_unlet(char_u *name); -int compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx); +int compile_def_function(ufunc_T *ufunc, int check_return_type, int profiling, cctx_T *outer_cctx); void set_function_type(ufunc_T *ufunc); void delete_instr(isn_T *isn); -void clear_def_function(ufunc_T *ufunc); void unlink_def_function(ufunc_T *ufunc); +void link_def_function(ufunc_T *ufunc); void free_def_functions(void); /* vim: set ft=c : */ diff -Nru vim-8.2.1913/src/proto/vim9execute.pro vim-8.2.2434/src/proto/vim9execute.pro --- vim-8.2.1913/src/proto/vim9execute.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/vim9execute.pro 2021-01-30 22:05:11.000000000 +0000 @@ -1,8 +1,12 @@ /* vim9execute.c */ void to_string_error(vartype_T vartype); void funcstack_check_refcount(funcstack_T *funcstack); +char_u *char_from_string(char_u *str, varnumber_T index); +char_u *string_slice(char_u *str, varnumber_T first, varnumber_T last, int exclusive); +int fill_partial_and_closure(partial_T *pt, ufunc_T *ufunc, ectx_T *ectx); int call_def_function(ufunc_T *ufunc, int argc_arg, typval_T *argv, partial_T *partial, typval_T *rettv); void ex_disassemble(exarg_T *eap); int tv2bool(typval_T *tv); +void emsg_using_string_as(typval_T *tv, int as_number); int check_not_string(typval_T *tv); /* vim: set ft=c : */ diff -Nru vim-8.2.1913/src/proto/vim9script.pro vim-8.2.2434/src/proto/vim9script.pro --- vim-8.2.1913/src/proto/vim9script.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/vim9script.pro 2021-01-30 22:05:11.000000000 +0000 @@ -2,13 +2,15 @@ int in_vim9script(void); void ex_vim9script(exarg_T *eap); int not_in_vim9(exarg_T *eap); +int vim9_comment_start(char_u *p); void ex_export(exarg_T *eap); void free_imports_and_script_vars(int sid); +void mark_imports_for_reload(int sid); void ex_import(exarg_T *eap); int find_exported(int sid, char_u *name, ufunc_T **ufunc, type_T **type, cctx_T *cctx); char_u *handle_import(char_u *arg_start, garray_T *gap, int import_sid, evalarg_T *evalarg, void *cctx); char_u *vim9_declare_scriptvar(exarg_T *eap, char_u *arg); -void add_vim9_script_var(dictitem_T *di, typval_T *tv, type_T *type); +void update_vim9_script_var(int create, dictitem_T *di, int flags, typval_T *tv, type_T **type); void hide_script_var(scriptitem_T *si, int idx, int func_defined); void free_all_script_vars(scriptitem_T *si); svar_T *find_typval_in_script(typval_T *dest); diff -Nru vim-8.2.1913/src/proto/vim9type.pro vim-8.2.2434/src/proto/vim9type.pro --- vim-8.2.1913/src/proto/vim9type.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/vim9type.pro 2021-01-30 22:05:11.000000000 +0000 @@ -15,10 +15,13 @@ void type_mismatch(type_T *expected, type_T *actual); void arg_type_mismatch(type_T *expected, type_T *actual, int argidx); int check_type(type_T *expected, type_T *actual, int give_msg, int argidx); +int check_argument_types(type_T *type, typval_T *argvars, int argcount, char_u *name); char_u *skip_type(char_u *start, int optional); -type_T *parse_type(char_u **arg, garray_T *type_gap); +type_T *parse_type(char_u **arg, garray_T *type_gap, int give_error); +int equal_type(type_T *type1, type_T *type2); void common_type(type_T *type1, type_T *type2, type_T **dest, garray_T *type_gap); type_T *get_member_type_from_stack(type_T **stack_top, int count, int skip, garray_T *type_gap); char *vartype_name(vartype_T type); char *type_name(type_T *type, char **tofree); +void f_typename(typval_T *argvars, typval_T *rettv); /* vim: set ft=c : */ diff -Nru vim-8.2.1913/src/proto/window.pro vim-8.2.2434/src/proto/window.pro --- vim-8.2.1913/src/proto/window.pro 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto/window.pro 2021-01-30 22:05:11.000000000 +0000 @@ -5,6 +5,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir); int win_valid_popup(win_T *win); int win_valid(win_T *win); +win_T *win_find_by_id(int id); int win_valid_any_tab(win_T *win); int win_count(void); int make_windows(int count, int vertical); diff -Nru vim-8.2.1913/src/proto.h vim-8.2.2434/src/proto.h --- vim-8.2.1913/src/proto.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/proto.h 2021-01-30 22:05:11.000000000 +0000 @@ -233,10 +233,10 @@ # include "usercmd.pro" # include "userfunc.pro" # include "version.pro" +# include "vim9script.pro" # ifdef FEAT_EVAL # include "vim9compile.pro" # include "vim9execute.pro" -# include "vim9script.pro" # include "vim9type.pro" # endif # include "window.pro" diff -Nru vim-8.2.1913/src/quickfix.c vim-8.2.2434/src/quickfix.c --- vim-8.2.1913/src/quickfix.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/quickfix.c 2021-01-30 22:05:11.000000000 +0000 @@ -4151,13 +4151,15 @@ if (qf_buf != NULL) { // Use the existing quickfix buffer - (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE, - ECMD_HIDE + ECMD_OLDBUF, oldwin); + if (do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE, + ECMD_HIDE + ECMD_OLDBUF, oldwin) == FAIL) + return FAIL; } else { // Create a new quickfix buffer - (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin); + if (do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin) == FAIL) + return FAIL; // save the number of the new buffer qi->qf_bufnr = curbuf->b_fnum; @@ -4429,21 +4431,26 @@ } /* - * Update the w:quickfix_title variable in the quickfix/location list window + * Update the w:quickfix_title variable in the quickfix/location list window in + * all the tab pages. */ static void qf_update_win_titlevar(qf_info_T *qi) { + qf_list_T *qfl = qf_get_curlist(qi); + tabpage_T *tp; win_T *win; - win_T *curwin_save; + win_T *save_curwin = curwin; - if ((win = qf_find_win(qi)) != NULL) + FOR_ALL_TAB_WINDOWS(tp, win) { - curwin_save = curwin; - curwin = win; - qf_set_title_var(qf_get_curlist(qi)); - curwin = curwin_save; + if (is_qf_win(win, qi)) + { + curwin = win; + qf_set_title_var(qfl); + } } + curwin = save_curwin; } /* @@ -4674,14 +4681,17 @@ *dirname = NUL; // Add one line for each error - if (old_last == NULL || old_last->qf_next == NULL) + if (old_last == NULL) { qfp = qfl->qf_start; lnum = 0; } else { - qfp = old_last->qf_next; + if (old_last->qf_next != NULL) + qfp = old_last->qf_next; + else + qfp = old_last; lnum = buf->b_ml.ml_line_count; } @@ -6043,7 +6053,7 @@ return FAIL; } - // parse the list of arguments + // Parse the list of arguments, wildcards have already been expanded. if (get_arglist_exp(p, &args->fcount, &args->fnames, TRUE) == FAIL) return FAIL; if (args->fcount == 0) @@ -6503,7 +6513,7 @@ enter_cleanup(&cs); #endif - wipe_buffer(buf, FALSE); + wipe_buffer(buf, TRUE); #if defined(FEAT_EVAL) // Restore the error/interrupt/exception state if not discarded by a @@ -7344,7 +7354,7 @@ if (action == 'r') qf_free_items(&qi->qf_lists[qf_idx]); if (qf_init_ext(qi, qf_idx, NULL, NULL, &di->di_tv, errorformat, - FALSE, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0) + FALSE, (linenr_T)0, (linenr_T)0, NULL, NULL) >= 0) retval = OK; return retval; @@ -7469,8 +7479,10 @@ if ((di = dict_find(what, (char_u *)"quickfixtextfunc", -1)) != NULL) retval = qf_setprop_qftf(qi, qfl, di); - if (retval == OK) + if (newlist || retval == OK) qf_list_changed(qfl); + if (newlist) + qf_update_buffer(qi, NULL); return retval; } @@ -8087,6 +8099,7 @@ int new_qi = FALSE; char_u *au_name = NULL; char_u *lang = NULL; + int updated = FALSE; switch (eap->cmdidx) { @@ -8138,14 +8151,24 @@ qfl->qf_ptr = qfl->qf_start; qfl->qf_index = 1; qf_list_changed(qfl); - qf_update_buffer(qi, NULL); + updated = TRUE; } if (p_cpo == empty_option) p_cpo = save_cpo; else - // Darn, some plugin changed the value. + { + // Darn, some plugin changed the value. If it's still empty it was + // changed and restored, need to restore in the complicated way. + if (*p_cpo == NUL) + set_option_value((char_u *)"cpo", 0L, save_cpo, 0); free_string_option(save_cpo); + } + + if (updated) + // This may open a window and source scripts, do this after 'cpo' was + // restored. + qf_update_buffer(qi, NULL); if (au_name != NULL) { diff -Nru vim-8.2.1913/src/regexp_bt.c vim-8.2.2434/src/regexp_bt.c --- vim-8.2.1913/src/regexp_bt.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/regexp_bt.c 2021-01-30 22:05:11.000000000 +0000 @@ -4805,6 +4805,26 @@ if (backpos.ga_maxlen > BACKPOS_INITIAL) ga_clear(&backpos); + if (retval > 0) + { + // Make sure the end is never before the start. Can happen when \zs + // and \ze are used. + if (REG_MULTI) + { + lpos_T *start = &rex.reg_mmatch->startpos[0]; + lpos_T *end = &rex.reg_mmatch->endpos[0]; + + if (end->lnum < start->lnum + || (end->lnum == start->lnum && end->col < start->col)) + rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; + } + else + { + if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) + rex.reg_match->endp[0] = rex.reg_match->startp[0]; + } + } + return retval; } diff -Nru vim-8.2.1913/src/regexp.c vim-8.2.2434/src/regexp.c --- vim-8.2.1913/src/regexp.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/regexp.c 2021-01-30 22:05:11.000000000 +0000 @@ -294,6 +294,7 @@ static char_u *regparse; // Input-scan pointer. static int regnpar; // () count. +static int wants_nfa; // regex should use NFA engine #ifdef FEAT_SYN_HL static int regnzpar; // \z() count. static int re_has_z; // \z item detected @@ -303,11 +304,7 @@ static int had_eol; // TRUE when EOL found by vim_regcomp() #endif -static int reg_magic; // magicness of the pattern: -#define MAGIC_NONE 1 // "\V" very unmagic -#define MAGIC_OFF 2 // "\M" or 'magic' off -#define MAGIC_ON 3 // "\m" or 'magic' -#define MAGIC_ALL 4 // "\v" very magic +static magic_T reg_magic; // magicness of the pattern static int reg_string; // matching with a string instead of a buffer // line @@ -381,6 +378,9 @@ static char_u *cstrchr(char_u *, int); static int re_mult_next(char *what); static int reg_iswordc(int); +#ifdef FEAT_EVAL +static void report_re_switch(char_u *pat); +#endif static regengine_T bt_regengine; static regengine_T nfa_regengine; @@ -544,7 +544,7 @@ int delim, int magic) { - return skip_regexp_ex(startp, delim, magic, NULL, NULL); + return skip_regexp_ex(startp, delim, magic, NULL, NULL, NULL); } /* @@ -573,6 +573,7 @@ * expression and change "\?" to "?". If "*newp" is not NULL the expression * is changed in-place. * If a "\?" is changed to "?" then "dropped" is incremented, unless NULL. + * If "magic_val" is not NULL, returns the effective magicness of the pattern */ char_u * skip_regexp_ex( @@ -580,9 +581,10 @@ int dirc, int magic, char_u **newp, - int *dropped) + int *dropped, + magic_T *magic_val) { - int mymagic; + magic_T mymagic; char_u *p = startp; if (magic) @@ -628,6 +630,8 @@ mymagic = MAGIC_NONE; } } + if (magic_val != NULL) + *magic_val = mymagic; return p; } @@ -2662,7 +2666,7 @@ if (prog == NULL) { #ifdef BT_REGEXP_DEBUG_LOG - if (regexp_engine != BACKTRACKING_ENGINE) // debugging log for NFA + if (regexp_engine == BACKTRACKING_ENGINE) // debugging log for BT engine { FILE *f; f = fopen(BT_REGEXP_DEBUG_LOG_NAME, "a"); @@ -2686,6 +2690,9 @@ && called_emsg == called_emsg_before) { regexp_engine = BACKTRACKING_ENGINE; +#ifdef FEAT_EVAL + report_re_switch(expr); +#endif prog = bt_regengine.regcomp(expr, re_flags); } } diff -Nru vim-8.2.1913/src/regexp_nfa.c vim-8.2.2434/src/regexp_nfa.c --- vim-8.2.1913/src/regexp_nfa.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/regexp_nfa.c 2021-01-30 22:05:11.000000000 +0000 @@ -253,6 +253,12 @@ static int *post_start; // holds the postfix form of r.e. static int *post_end; static int *post_ptr; + +// Set when the pattern should use the NFA engine. +// E.g. [[:upper:]] only allows 8bit characters for BT engine, +// while NFA engine handles multibyte characters correctly. +static int wants_nfa; + static int nstate; // Number of states in the NFA. static int istate; // Index in the state vector, used in alloc_state() @@ -306,6 +312,7 @@ return FAIL; post_ptr = post_start; post_end = post_start + nstate_max; + wants_nfa = FALSE; rex.nfa_has_zend = FALSE; rex.nfa_has_backref = FALSE; @@ -1707,6 +1714,7 @@ EMIT(NFA_CLASS_GRAPH); break; case CLASS_LOWER: + wants_nfa = TRUE; EMIT(NFA_CLASS_LOWER); break; case CLASS_PRINT: @@ -1719,6 +1727,7 @@ EMIT(NFA_CLASS_SPACE); break; case CLASS_UPPER: + wants_nfa = TRUE; EMIT(NFA_CLASS_UPPER); break; case CLASS_XDIGIT: @@ -2137,9 +2146,15 @@ // The engine is very inefficient (uses too many states) when the // maximum is much larger than the minimum and when the maximum is - // large. Bail out if we can use the other engine. + // large. However, when maxval is MAX_LIMIT, it is okay, as this + // will emit NFA_STAR. + // Bail out if we can use the other engine, but only, when the + // pattern does not need the NFA engine like (e.g. [[:upper:]]\{2,\} + // does not work with with characters > 8 bit with the BT engine) if ((nfa_re_flags & RE_AUTO) - && (maxval > 500 || maxval > minval + 200)) + && (maxval > 500 || maxval > minval + 200) + && (maxval != MAX_LIMIT && minval < 200) + && !wants_nfa) return FAIL; // Ignore previous call to nfa_regatom() @@ -5754,9 +5769,11 @@ { case NFA_MATCH: { - // If the match ends before a composing characters and - // rex.reg_icombine is not set, that is not really a match. - if (enc_utf8 && !rex.reg_icombine && utf_iscomposing(curc)) + // If the match is not at the start of the line, ends before a + // composing characters and rex.reg_icombine is not set, that + // is not really a match. + if (enc_utf8 && !rex.reg_icombine + && rex.input != rex.line && utf_iscomposing(curc)) break; nfa_match = TRUE; @@ -7225,6 +7242,26 @@ #endif theend: + if (retval > 0) + { + // Make sure the end is never before the start. Can happen when \zs and + // \ze are used. + if (REG_MULTI) + { + lpos_T *start = &rex.reg_mmatch->startpos[0]; + lpos_T *end = &rex.reg_mmatch->endpos[0]; + + if (end->lnum < start->lnum + || (end->lnum == start->lnum && end->col < start->col)) + rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; + } + else + { + if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) + rex.reg_match->endp[0] = rex.reg_match->startp[0]; + } + } + return retval; } diff -Nru vim-8.2.1913/src/register.c vim-8.2.2434/src/register.c --- vim-8.2.1913/src/register.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/register.c 2021-01-30 22:05:11.000000000 +0000 @@ -79,6 +79,7 @@ * Keep the last expression line here, for repeating. */ static char_u *expr_line = NULL; +static exarg_T *expr_eap = NULL; /* * Get an expression for the "\"=expr1" or "CTRL-R =expr1" @@ -95,19 +96,22 @@ if (*new_line == NUL) // use previous line vim_free(new_line); else - set_expr_line(new_line); + set_expr_line(new_line, NULL); return '='; } /* * Set the expression for the '=' register. * Argument must be an allocated string. + * "eap" may be used if the next line needs to be checked when evaluating the + * expression. */ void -set_expr_line(char_u *new_line) +set_expr_line(char_u *new_line, exarg_T *eap) { vim_free(expr_line); expr_line = new_line; + expr_eap = eap; } /* @@ -136,7 +140,7 @@ return expr_copy; ++nested; - rv = eval_to_string(expr_copy, TRUE); + rv = eval_to_string_eap(expr_copy, TRUE, expr_eap); --nested; vim_free(expr_copy); return rv; @@ -318,8 +322,7 @@ #endif } -#if (defined(FEAT_CLIPBOARD) && defined(FEAT_X11) && defined(USE_SYSTEM)) \ - || defined(PROTO) +#if defined(FEAT_CLIPBOARD) || defined(PROTO) void free_register(void *reg) { @@ -806,7 +809,14 @@ { for (i = 0; i < y_current->y_size; ++i) { - stuffescaped(y_current->y_array[i], literally); + if (regname == '-') + { + AppendCharToRedobuff(Ctrl_R); + AppendCharToRedobuff(regname); + do_put(regname, NULL, BACKWARD, 1L, PUT_CURSEND); + } + else + stuffescaped(y_current->y_array[i], literally); // Insert a newline between lines and after last line if // y_type is MLINE. if (y_current->y_type == MLINE || i < y_current->y_size - 1) @@ -2774,7 +2784,7 @@ vim_free(p); p = s; } - set_expr_line(p); + set_expr_line(p, NULL); return; } diff -Nru vim-8.2.1913/src/screen.c vim-8.2.2434/src/screen.c --- vim-8.2.1913/src/screen.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/screen.c 2021-01-30 22:05:11.000000000 +0000 @@ -464,7 +464,8 @@ // First char of a popup window may go on top of the right half of a // double-wide character. Clear the left half to avoid it getting the popup // window background color. - if (coloff > 0 && ScreenLines[off_to] == 0 + if (coloff > 0 && enc_utf8 + && ScreenLines[off_to] == 0 && ScreenLinesUC[off_to - 1] != 0 && (*mb_char2cells)(ScreenLinesUC[off_to - 1]) > 1) { @@ -2490,7 +2491,8 @@ { if ((emsg_on_display || (check_msg_scroll && msg_scroll)) && !did_wait_return - && emsg_silent == 0) + && emsg_silent == 0 + && !in_assert_fails) { out_flush(); ui_delay(1006L, TRUE); @@ -3085,7 +3087,6 @@ // Can't use ScreenLines unless initialized if (ScreenLines == NULL) return; - if (col != screen_cur_col || row != screen_cur_row) { // Check for valid position. @@ -4190,7 +4191,8 @@ #endif msg_puts_attr(_(" INSERT"), attr); } - else if (restart_edit == 'I' || restart_edit == 'A') + else if (restart_edit == 'I' || restart_edit == 'i' || + restart_edit == 'a' || restart_edit == 'A') msg_puts_attr(_(" (insert)"), attr); else if (restart_edit == 'R') msg_puts_attr(_(" (replace)"), attr); diff -Nru vim-8.2.1913/src/scriptfile.c vim-8.2.2434/src/scriptfile.c --- vim-8.2.1913/src/scriptfile.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/scriptfile.c 2021-01-30 22:05:11.000000000 +0000 @@ -1019,30 +1019,6 @@ /* * ":source" and associated commands. */ -/* - * Structure used to store info for each sourced file. - * It is shared between do_source() and getsourceline(). - * This is required, because it needs to be handed to do_cmdline() and - * sourcing can be done recursively. - */ -struct source_cookie -{ - FILE *fp; // opened file for sourcing - char_u *nextline; // if not NULL: line that was read ahead - linenr_T sourcing_lnum; // line number of the source file - int finished; // ":finish" used -#ifdef USE_CRNL - int fileformat; // EOL_UNKNOWN, EOL_UNIX or EOL_DOS - int error; // TRUE if LF found after CR-LF -#endif -#ifdef FEAT_EVAL - linenr_T breakpoint; // next line with breakpoint or zero - char_u *fname; // name of sourced file - int dbg_tick; // debug_tick when breakpoint was set - int level; // top nesting level of sourced file -#endif - vimconv_T conv; // type of conversion -}; #ifdef FEAT_EVAL /* @@ -1051,7 +1027,7 @@ linenr_T * source_breakpoint(void *cookie) { - return &((struct source_cookie *)cookie)->breakpoint; + return &((source_cookie_T *)cookie)->breakpoint; } /* @@ -1060,7 +1036,7 @@ int * source_dbg_tick(void *cookie) { - return &((struct source_cookie *)cookie)->dbg_tick; + return &((source_cookie_T *)cookie)->dbg_tick; } /* @@ -1069,7 +1045,7 @@ int source_level(void *cookie) { - return ((struct source_cookie *)cookie)->level; + return ((source_cookie_T *)cookie)->level; } /* @@ -1079,7 +1055,7 @@ char_u * source_nextline(void *cookie) { - return ((struct source_cookie *)cookie)->nextline; + return ((source_cookie_T *)cookie)->nextline; } #endif @@ -1130,13 +1106,13 @@ int is_vimrc, // DOSO_ value int *ret_sid UNUSED) { - struct source_cookie cookie; + source_cookie_T cookie; char_u *p; char_u *fname_exp; char_u *firstline = NULL; int retval = FAIL; -#ifdef FEAT_EVAL sctx_T save_current_sctx; +#ifdef FEAT_EVAL static scid_T last_current_SID = 0; static int last_current_SID_seq = 0; funccal_entry_T funccalp_entry; @@ -1300,6 +1276,9 @@ time_push(&tv_rel, &tv_start); #endif + save_current_sctx = current_sctx; + current_sctx.sc_version = 1; // default script version + #ifdef FEAT_EVAL # ifdef FEAT_PROFILE if (do_profiling == PROF_YES) @@ -1310,9 +1289,7 @@ // Also starts profiling timer for nested script. save_funccal(&funccalp_entry); - save_current_sctx = current_sctx; current_sctx.sc_lnum = 0; - current_sctx.sc_version = 1; // default script version // Check if this script was sourced before to finds its SID. // Always use a new sequence number. @@ -1320,40 +1297,28 @@ if (sid > 0) { hashtab_T *ht; - int is_vim9 = si->sn_version == SCRIPT_VERSION_VIM9; + int todo; + hashitem_T *hi; + dictitem_T *di; // loading the same script again - si->sn_had_command = FALSE; - si->sn_version = 1; + si->sn_state = SN_STATE_RELOAD; current_sctx.sc_sid = sid; - // In Vim9 script all script-local variables are removed when reloading - // the same script. In legacy script they remain but "const" can be - // set again. + // Script-local variables remain but "const" can be set again. + // In Vim9 script variables will be cleared when "vim9script" is + // encountered without the "noclear" argument. ht = &SCRIPT_VARS(sid); - if (is_vim9) - hashtab_free_contents(ht); - else - { - int todo = (int)ht->ht_used; - hashitem_T *hi; - dictitem_T *di; - - for (hi = ht->ht_array; todo > 0; ++hi) - if (!HASHITEM_EMPTY(hi)) - { - --todo; - di = HI2DI(hi); - di->di_flags |= DI_FLAGS_RELOAD; - } - } - - // old imports and script variables are no longer valid - free_imports_and_script_vars(sid); - - // in Vim9 script functions are marked deleted - if (is_vim9) - delete_script_functions(sid); + todo = (int)ht->ht_used; + for (hi = ht->ht_array; todo > 0; ++hi) + if (!HASHITEM_EMPTY(hi)) + { + --todo; + di = HI2DI(hi); + di->di_flags |= DI_FLAGS_RELOAD; + } + // imports can be redefined once + mark_imports_for_reload(sid); } else { @@ -1387,6 +1352,9 @@ fname_exp = vim_strsave(si->sn_name); // used for autocmd if (ret_sid != NULL) *ret_sid = current_sctx.sc_sid; + + // Used to check script variable index is still valid. + si->sn_script_seq = current_sctx.sc_seq; } # ifdef FEAT_PROFILE @@ -1488,18 +1456,18 @@ si = SCRIPT_ITEM(current_sctx.sc_sid); if (si->sn_save_cpo != NULL) { - free_string_option(p_cpo); - p_cpo = si->sn_save_cpo; - si->sn_save_cpo = NULL; + set_option_value((char_u *)"cpo", 0L, si->sn_save_cpo, 0); + CLEAR_POINTER(si->sn_save_cpo); } - current_sctx = save_current_sctx; restore_funccal(); # ifdef FEAT_PROFILE if (do_profiling == PROF_YES) prof_child_exit(&wait_start); // leaving a child now # endif #endif + current_sctx = save_current_sctx; + fclose(cookie.fp); vim_free(cookie.nextline); vim_free(firstline); @@ -1562,6 +1530,7 @@ /* * Get a pointer to a script name. Used for ":verbose set". + * Message appended to "Last set from " */ char_u * get_scriptname(scid_T id) @@ -1576,6 +1545,8 @@ return (char_u *)_("environment variable"); if (id == SID_ERROR) return (char_u *)_("error handler"); + if (id == SID_WINLAYOUT) + return (char_u *)_("changed window size"); return SCRIPT_ITEM(id)->sn_name; } @@ -1618,12 +1589,12 @@ void *cookie) { return fgetline == getsourceline - ? ((struct source_cookie *)cookie)->sourcing_lnum + ? ((source_cookie_T *)cookie)->sourcing_lnum : SOURCING_LNUM; } static char_u * -get_one_sourceline(struct source_cookie *sp) +get_one_sourceline(source_cookie_T *sp) { garray_T ga; int len; @@ -1741,9 +1712,13 @@ int indent UNUSED, getline_opt_T options) { - struct source_cookie *sp = (struct source_cookie *)cookie; + source_cookie_T *sp = (source_cookie_T *)cookie; char_u *line; char_u *p; + int do_vim9_all = in_vim9script() + && options == GETLINE_CONCAT_ALL; + int do_bar_cont = do_vim9_all + || options == GETLINE_CONCAT_CONTBAR; #ifdef FEAT_EVAL // If breakpoints have been added/deleted need to check for it. @@ -1762,8 +1737,8 @@ SOURCING_LNUM = sp->sourcing_lnum + 1; // Get current line. If there is a read-ahead line, use it, otherwise get - // one now. - if (sp->finished) + // one now. "fp" is NULL if actually using a string. + if (sp->finished || sp->fp == NULL) line = NULL; else if (sp->nextline == NULL) line = get_one_sourceline(sp); @@ -1790,17 +1765,15 @@ // backslash. We always need to read the next line, keep it in // sp->nextline. /* Also check for a comment in between continuation lines: "\ */ - // Also check for a Vim9 comment and empty line. + // Also check for a Vim9 comment, empty line, line starting with '|', + // but not "||". sp->nextline = get_one_sourceline(sp); if (sp->nextline != NULL && (*(p = skipwhite(sp->nextline)) == '\\' || (p[0] == '"' && p[1] == '\\' && p[2] == ' ') -#ifdef FEAT_EVAL - || (in_vim9script() - && options == GETLINE_CONCAT_ALL - && (*p == NUL || vim9_comment_start(p))) -#endif - )) + || (do_vim9_all && (*p == NUL + || vim9_comment_start(p))) + || (do_bar_cont && p[0] == '|' && p[1] != '|'))) { garray_T ga; @@ -1808,6 +1781,11 @@ ga_concat(&ga, line); if (*p == '\\') ga_concat(&ga, p + 1); + else if (*p == '|') + { + ga_concat(&ga, (char_u *)" "); + ga_concat(&ga, p); + } for (;;) { vim_free(sp->nextline); @@ -1815,7 +1793,7 @@ if (sp->nextline == NULL) break; p = skipwhite(sp->nextline); - if (*p == '\\') + if (*p == '\\' || (do_bar_cont && p[0] == '|' && p[1] != '|')) { // Adjust the growsize to the current length to speed up // concatenating many lines. @@ -1826,15 +1804,16 @@ else ga.ga_growsize = ga.ga_len; } - ga_concat(&ga, p + 1); + if (*p == '\\') + ga_concat(&ga, p + 1); + else + { + ga_concat(&ga, (char_u *)" "); + ga_concat(&ga, p); + } } else if (!(p[0] == '"' && p[1] == '\\' && p[2] == ' ') -#ifdef FEAT_EVAL - && !(in_vim9script() - && options == GETLINE_CONCAT_ALL - && (*p == NUL || vim9_comment_start(p))) -#endif - ) + && !(do_vim9_all && (*p == NUL || vim9_comment_start(p)))) break; /* drop a # comment or "\ comment line */ } @@ -1877,8 +1856,8 @@ void ex_scriptencoding(exarg_T *eap) { - struct source_cookie *sp; - char_u *name; + source_cookie_T *sp; + char_u *name; if (!getline_equal(eap->getline, eap->cookie, getsourceline)) { @@ -1896,7 +1875,7 @@ name = eap->arg; // Setup for conversion from the specified encoding to 'encoding'. - sp = (struct source_cookie *)getline_cookie(eap->getline, eap->cookie); + sp = (source_cookie_T *)getline_cookie(eap->getline, eap->cookie); convert_setup(&sp->conv, name, p_enc); if (name != eap->arg) @@ -1909,7 +1888,6 @@ void ex_scriptversion(exarg_T *eap UNUSED) { -#ifdef FEAT_EVAL int nr; if (!getline_equal(eap->getline, eap->cookie, getsourceline)) @@ -1931,9 +1909,10 @@ else { current_sctx.sc_version = nr; +#ifdef FEAT_EVAL SCRIPT_ITEM(current_sctx.sc_sid)->sn_version = nr; - } #endif + } } #if defined(FEAT_EVAL) || defined(PROTO) @@ -1960,7 +1939,7 @@ int idx; if (reanimate) - ((struct source_cookie *)getline_cookie(eap->getline, + ((source_cookie_T *)getline_cookie(eap->getline, eap->cookie))->finished = FALSE; // Cleanup (and inactivate) conditionals, but stop when a try conditional @@ -1974,7 +1953,7 @@ report_make_pending(CSTP_FINISH, NULL); } else - ((struct source_cookie *)getline_cookie(eap->getline, + ((source_cookie_T *)getline_cookie(eap->getline, eap->cookie))->finished = TRUE; } @@ -1990,7 +1969,7 @@ void *cookie) { return (getline_equal(fgetline, cookie, getsourceline) - && ((struct source_cookie *)getline_cookie( + && ((source_cookie_T *)getline_cookie( fgetline, cookie))->finished); } diff -Nru vim-8.2.1913/src/search.c vim-8.2.2434/src/search.c --- vim-8.2.1913/src/search.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/search.c 2021-01-30 22:05:11.000000000 +0000 @@ -134,7 +134,7 @@ int i; rc_did_emsg = FALSE; - magic = p_magic; + magic = magic_isset(); /* * If no pattern given, use a previously defined pattern. @@ -1341,7 +1341,8 @@ * If there is a matching '/' or '?', toss it. */ ps = strcopy; - p = skip_regexp_ex(pat, search_delim, (int)p_magic, &strcopy, NULL); + p = skip_regexp_ex(pat, search_delim, magic_isset(), + &strcopy, NULL, NULL); if (strcopy != ps) { // made a copy of "pat" to change "\?" to "?" @@ -3385,7 +3386,7 @@ sprintf((char *)pat, whole ? "\\<%.*s\\>" : "%.*s", len, ptr); // ignore case according to p_ic, p_scs and pat regmatch.rm_ic = ignorecase(pat); - regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp(pat, magic_isset() ? RE_MAGIC : 0); vim_free(pat); if (regmatch.regprog == NULL) goto fpip_end; @@ -3393,7 +3394,8 @@ inc_opt = (*curbuf->b_p_inc == NUL) ? p_inc : curbuf->b_p_inc; if (*inc_opt != NUL) { - incl_regmatch.regprog = vim_regcomp(inc_opt, p_magic ? RE_MAGIC : 0); + incl_regmatch.regprog = vim_regcomp(inc_opt, + magic_isset() ? RE_MAGIC : 0); if (incl_regmatch.regprog == NULL) goto fpip_end; incl_regmatch.rm_ic = FALSE; // don't ignore case in incl. pat. @@ -3401,7 +3403,8 @@ if (type == FIND_DEFINE && (*curbuf->b_p_def != NUL || *p_def != NUL)) { def_regmatch.regprog = vim_regcomp(*curbuf->b_p_def == NUL - ? p_def : curbuf->b_p_def, p_magic ? RE_MAGIC : 0); + ? p_def : curbuf->b_p_def, + magic_isset() ? RE_MAGIC : 0); if (def_regmatch.regprog == NULL) goto fpip_end; def_regmatch.rm_ic = FALSE; // don't ignore case in define pat. @@ -3753,7 +3756,7 @@ // we read a line, set "already" to check this "line" later // if depth >= 0 we'll increase files[depth].lnum far - // bellow -- Acevedo + // below -- Acevedo already = aux = p = skipwhite(line); p = find_word_start(p); p = find_word_end(p); @@ -4258,8 +4261,10 @@ // bonus for adjacent matches; this is higher than SEPARATOR_BONUS so that // matching a whole word is preferred. #define SEQUENTIAL_BONUS 40 -// bonus if match occurs after a separator -#define SEPARATOR_BONUS 30 +// bonus if match occurs after a path separator +#define PATH_SEPARATOR_BONUS 30 +// bonus if match occurs after a word separator +#define WORD_SEPARATOR_BONUS 25 // bonus if match is uppercase and prev is lower #define CAMEL_BONUS 30 // bonus if the first letter is matched @@ -4334,7 +4339,6 @@ // Camel case int neighbor = ' '; int curr; - int neighborSeparator; if (has_mbyte) { @@ -4355,10 +4359,11 @@ if (vim_islower(neighbor) && vim_isupper(curr)) score += CAMEL_BONUS; - // Separator - neighborSeparator = neighbor == '_' || neighbor == ' '; - if (neighborSeparator) - score += SEPARATOR_BONUS; + // Bonus if the match follows a separator character + if (neighbor == '/' || neighbor == '\\') + score += PATH_SEPARATOR_BONUS; + else if (neighbor == ' ' || neighbor == '_') + score += WORD_SEPARATOR_BONUS; } else { @@ -4718,10 +4723,10 @@ // For matchfuzzy(), return a list of matched strings. // ['str1', 'str2', 'str3'] - // For matchfuzzypos(), return a list with two items. + // For matchfuzzypos(), return a list with three items. // The first item is a list of matched strings. The second item // is a list of lists where each list item is a list of matched - // character positions. + // character positions. The third item is a list of matching scores. // [['str1', 'str2', 'str3'], [[1, 3], [1, 3], [1, 3]]] if (retmatchpos) { @@ -4744,7 +4749,7 @@ // next copy the list of matching positions if (retmatchpos) { - li = list_find(fmatchlist, -1); + li = list_find(fmatchlist, -2); if (li == NULL || li->li_tv.vval.v_list == NULL) goto done; l = li->li_tv.vval.v_list; @@ -4757,6 +4762,19 @@ list_append_list(l, ptrs[i].lmatchpos) == FAIL) goto done; } + + // copy the matching scores + li = list_find(fmatchlist, -1); + if (li == NULL || li->li_tv.vval.v_list == NULL) + goto done; + l = li->li_tv.vval.v_list; + for (i = 0; i < len; i++) + { + if (ptrs[i].score == SCORE_NONE) + break; + if (list_append_number(l, ptrs[i].score) == FAIL) + goto done; + } } } @@ -4837,9 +4855,15 @@ { list_T *l; - // For matchfuzzypos(), a list with two items are returned. First item - // is a list of matching strings and the second item is a list of - // lists with matching positions within each string. + // For matchfuzzypos(), a list with three items are returned. First + // item is a list of matching strings, the second item is a list of + // lists with matching positions within each string and the third item + // is the list of scores of the matches. + l = list_alloc(); + if (l == NULL) + goto done; + if (list_append_list(rettv->vval.v_list, l) == FAIL) + goto done; l = list_alloc(); if (l == NULL) goto done; diff -Nru vim-8.2.1913/src/session.c vim-8.2.2434/src/session.c --- vim-8.2.1913/src/session.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/session.c 2021-01-30 22:05:11.000000000 +0000 @@ -397,6 +397,19 @@ } } + if (wp->w_alt_fnum) + { + buf_T *alt = buflist_findnr(wp->w_alt_fnum); + + // Set the alternate file. + if (alt != NULL + && alt->b_fname != NULL + && *alt->b_fname != NUL + && (fputs("balt ", fd) < 0 + || ses_fname(fd, alt, flagp, TRUE) == FAIL)) + return FAIL; + } + // Local mappings and abbreviations. if ((*flagp & (SSOP_OPTIONS | SSOP_LOCALOPTIONS)) && makemap(fd, wp->w_buffer) == FAIL) @@ -447,9 +460,9 @@ (long)wp->w_height / 2, (long)wp->w_height) < 0 || put_eol(fd) == FAIL || put_line(fd, "if s:l < 1 | let s:l = 1 | endif") == FAIL - || put_line(fd, "exe s:l") == FAIL + || put_line(fd, "keepjumps exe s:l") == FAIL || put_line(fd, "normal! zt") == FAIL - || fprintf(fd, "%ld", (long)wp->w_cursor.lnum) < 0 + || fprintf(fd, "keepjumps %ld", (long)wp->w_cursor.lnum) < 0 || put_eol(fd) == FAIL) return FAIL; // Restore the cursor column and left offset when not wrapping. @@ -1216,7 +1229,7 @@ #ifdef FEAT_SESSION if (!failed && view_session) { - if (put_line(fd, "let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0") == FAIL) + if (put_line(fd, "let s:so_save = &g:so | let s:siso_save = &g:siso | setg so=0 siso=0 | setl so=-1 siso=-1") == FAIL) failed = TRUE; if (eap->cmdidx == CMD_mksession) { @@ -1261,7 +1274,7 @@ failed |= (put_view(fd, curwin, !using_vdir, flagp, -1, NULL) == FAIL); } - if (put_line(fd, "let &so = s:so_save | let &siso = s:siso_save") + if (put_line(fd, "let &g:so = s:so_save | let &g:siso = s:siso_save") == FAIL) failed = TRUE; #ifdef FEAT_SEARCH_EXTRA diff -Nru vim-8.2.1913/src/spell.c vim-8.2.2434/src/spell.c --- vim-8.2.1913/src/spell.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/spell.c 2021-01-30 22:05:11.000000000 +0000 @@ -3813,7 +3813,7 @@ if (no_spell_checking(curwin)) return; - get_option_value((char_u*)"spl", &dummy, &spl, OPT_LOCAL); + (void)get_option_value((char_u*)"spl", &dummy, &spl, OPT_LOCAL); // Create a new empty buffer in a new window. do_cmdline_cmd((char_u *)"new"); @@ -4340,7 +4340,7 @@ char_u *s; for (s = val; *s != NUL; ++s) - if (!vim_isfilec(*s) && *s != ',') + if (!vim_isfilec(*s) && *s != ',' && *s != ' ') return FALSE; return TRUE; } diff -Nru vim-8.2.1913/src/spellsuggest.c vim-8.2.2434/src/spellsuggest.c --- vim-8.2.1913/src/spellsuggest.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/spellsuggest.c 2021-01-30 22:05:11.000000000 +0000 @@ -770,6 +770,7 @@ int c; int i; langp_T *lp; + int did_intern = FALSE; // Set the info in "*su". CLEAR_POINTER(su); @@ -863,12 +864,13 @@ else if (STRNCMP(buf, "file:", 5) == 0) // Use list of suggestions in a file. spell_suggest_file(su, buf + 5); - else + else if (!did_intern) { - // Use internal method. + // Use internal method once. spell_suggest_intern(su, interactive); if (sps_flags & SPS_DOUBLE) do_combine = TRUE; + did_intern = TRUE; } } diff -Nru vim-8.2.1913/src/structs.h vim-8.2.2434/src/structs.h --- vim-8.2.1913/src/structs.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/structs.h 2021-01-30 22:05:11.000000000 +0000 @@ -83,9 +83,11 @@ * sc_version is also here, for convenience. */ typedef struct { +#ifdef FEAT_EVAL scid_T sc_sid; // script ID int sc_seq; // sourcing sequence number linenr_T sc_lnum; // line number +#endif int sc_version; // :scriptversion } sctx_T; @@ -1224,8 +1226,8 @@ char m_silent; // used, don't echo commands char m_nowait; // used #ifdef FEAT_EVAL - char m_expr; // used, m_str is an expression sctx_T m_script_ctx; // SCTX where map was defined + char m_expr; // used, m_str is an expression #endif }; @@ -1363,6 +1365,7 @@ typedef struct cbq_S cbq_T; typedef struct channel_S channel_T; typedef struct cctx_S cctx_T; +typedef struct ectx_S ectx_T; typedef enum { @@ -1478,6 +1481,7 @@ int lv_idx; // cached index of an item } mat; } lv_u; + type_T *lv_type; // allocated by alloc_type() list_T *lv_copylist; // copied list used by deepcopy() list_T *lv_used_next; // next list in used lists list list_T *lv_used_prev; // previous list in used lists list @@ -1541,6 +1545,7 @@ int dv_refcount; // reference count int dv_copyID; // ID used by deepcopy() hashtab_T dv_hashtab; // hashtab that refers to the items + type_T *dv_type; // allocated by alloc_type() dict_T *dv_copydict; // copied dict used by deepcopy() dict_T *dv_used_next; // next dict in used dicts list dict_T *dv_used_prev; // previous dict in used dicts list @@ -1562,14 +1567,17 @@ // type of getline() last argument typedef enum { GETLINE_NONE, // do not concatenate any lines - GETLINE_CONCAT_CONT, // concatenate continuation lines + GETLINE_CONCAT_CONT, // concatenate continuation lines with backslash + GETLINE_CONCAT_CONTBAR, // concatenate continuation lines with \ and | GETLINE_CONCAT_ALL // concatenate continuation and Vim9 # comment lines } getline_opt_T; +typedef struct svar_S svar_T; + #if defined(FEAT_EVAL) || defined(PROTO) typedef struct funccall_S funccall_T; -// values used for "uf_dfunc_idx" +// values used for "uf_def_status" typedef enum { UF_NOT_COMPILED, UF_TO_BE_COMPILED, @@ -1598,6 +1606,9 @@ garray_T uf_type_list; // types used in arg and return types int *uf_def_arg_idx; // instruction indexes for evaluating // uf_def_args; length: uf_def_args.ga_len + 1 + partial_T *uf_partial; // for closure created inside :def function: + // information about the context + char_u *uf_va_name; // name from "...name" or NULL type_T *uf_va_type; // type from "...name: type" or NULL type_T *uf_func_type; // type of the function, &t_func_any if unknown @@ -1688,7 +1699,8 @@ #ifdef FEAT_PROFILE proftime_T prof_child; // time spent in a child #endif - funccall_T *caller; // calling function or NULL + funccall_T *caller; // calling function or NULL; or next funccal in + // list pointed to by previous_funccal. // for closure int fc_refcount; // number of user functions that reference this @@ -1761,37 +1773,38 @@ /* * Entry for "sn_var_vals". Used for script-local variables. */ -typedef struct { +struct svar_S { char_u *sv_name; // points into "sn_all_vars" di_key typval_T *sv_tv; // points into "sn_vars" or "sn_all_vars" di_tv type_T *sv_type; - int sv_const; + int sv_const; // 0, ASSIGN_CONST or ASSIGN_FINAL int sv_export; // "export let var = val" -} svar_T; +}; typedef struct { char_u *imp_name; // name imported as (allocated) int imp_sid; // script ID of "from" - // for "import * as Name", "imp_name" is "Name" - int imp_all; + int imp_flags; // IMP_FLAGS_ values - // for variable + // for a variable type_T *imp_type; int imp_var_vals_idx; // index in sn_var_vals of "from" - // for function + // for a function char_u *imp_funcname; // user func name (NOT allocated) } imported_T; +#define IMP_FLAGS_STAR 1 // using "import * as Name" +#define IMP_FLAGS_RELOAD 2 // script reloaded, OK to redefine + /* - * Growarray to store info about already sourced scripts. - * For Unix also store the dev/ino, so that we don't have to stat() each - * script when going through the list. + * Info about an already sourced scripts. */ typedef struct { char_u *sn_name; + int sn_script_seq; // latest sctx_T sc_seq value // "sn_vars" stores the s: variables currently valid. When leaving a block // variables local to that block are removed. @@ -1817,7 +1830,7 @@ int sn_last_block_id; // Unique ID for each script block int sn_version; // :scriptversion - int sn_had_command; // TRUE if any command was executed + int sn_state; // SN_STATE_ values char_u *sn_save_cpo; // 'cpo' value when :vim9script found # ifdef FEAT_PROFILE @@ -1841,6 +1854,10 @@ # endif } scriptitem_T; +#define SN_STATE_NEW 0 // newly loaded script, nothing done +#define SN_STATE_RELOAD 1 // script loaded before, nothing done +#define SN_STATE_HAD_COMMAND 9 // a command was executed + // Struct passed through eval() functions. // See EVALARG_EVALUATE for a fixed value with eval_flags set to EVAL_EVALUATE. typedef struct { @@ -1882,6 +1899,18 @@ } sn_prl_T; # define PRL_ITEM(si, idx) (((sn_prl_T *)(si)->sn_prl_ga.ga_data)[(idx)]) + +typedef struct { + int pi_started_profiling; + proftime_T pi_wait_start; + proftime_T pi_call_start; +} profinfo_T; + +# else +typedef struct +{ + int dummy; +} profinfo_T; # endif #else // dummy typedefs for use in function prototypes @@ -1927,6 +1956,7 @@ partial_T *partial; // for extra arguments dict_T *selfdict; // Dictionary for "self" typval_T *basetv; // base for base->method() + type_T *check_type; // type from funcref or NULL } funcexe_T; /* @@ -1947,6 +1977,14 @@ int fs_copyID; // for garray_T collection } funcstack_T; +typedef struct outer_S outer_T; +struct outer_S { + garray_T *out_stack; // stack from outer scope + int out_frame_idx; // index of stack frame in out_stack + outer_T *out_up; // outer scope of outer scope or NULL + int out_up_is_copy; // don't free out_up +}; + struct partial_S { int pt_refcount; // reference count @@ -1957,11 +1995,11 @@ int pt_auto; // when TRUE the partial was created for using // dict.member in handle_subscript() - // For a compiled closure: the arguments and local variables. - garray_T *pt_ectx_stack; // where to find local vars - int pt_ectx_frame; // index of function frame in uf_ectx_stack - funcstack_T *pt_funcstack; // copy of stack, used after context - // function returns + // For a compiled closure: the arguments and local variables scope + outer_T pt_outer; + + funcstack_T *pt_funcstack; // copy of stack, used after context + // function returns int pt_argc; // number of arguments typval_T *pt_argv; // arguments in allocated array @@ -3347,6 +3385,10 @@ // top of the window char w_topline_was_set; // flag set to TRUE when topline is set, // e.g. by winrestview() + + linenr_T w_botline; // number of the line below the bottom of + // the window + #ifdef FEAT_DIFF int w_topfill; // number of filler lines above w_topline int w_old_topfill; // w_topfill at last redraw @@ -3360,6 +3402,12 @@ colnr_T w_skipcol; // starting column when a single line // doesn't fit in the window + int w_empty_rows; // number of ~ rows in window +#ifdef FEAT_DIFF + int w_filler_rows; // number of filler rows at the end of the + // window +#endif + /* * Layout of the window in the screen. * May need to add "msg_scrolled" to "w_winrow" in rare situations. @@ -3367,11 +3415,14 @@ int w_winrow; // first row of window in screen int w_height; // number of rows in window, excluding // status/command/winbar line(s) + int w_status_height; // number of status lines (0 or 1) int w_wincol; // Leftmost column of window in screen. int w_width; // Width of window, excluding separation. int w_vsep_width; // Number of separator columns (0 or 1). + pos_save_T w_save_cursor; // backup of cursor pos and topline + #ifdef FEAT_PROP_POPUP int w_popup_flags; // POPF_ values int w_popup_handled; // POPUP_HANDLE[0-9] flags @@ -3432,8 +3483,14 @@ # if defined(FEAT_TIMERS) timer_T *w_popup_timer; // timer for closing popup window # endif -#endif + int w_flags; // WFLAG_ flags + +# define WFLAG_WCOL_OFF_ADDED 1 // popup border and padding were added to + // w_wcol +# define WFLAG_WROW_OFF_ADDED 2 // popup border and padding were added to + // w_wrow +#endif /* * === start of cached values ==== @@ -3474,14 +3531,6 @@ */ int w_wrow, w_wcol; // cursor position in window - linenr_T w_botline; // number of the line below the bottom of - // the window - int w_empty_rows; // number of ~ rows in window -#ifdef FEAT_DIFF - int w_filler_rows; // number of filler rows at the end of the - // window -#endif - /* * Info about the lines currently in the window is remembered to avoid * recomputing it every time. The allocated size of w_lines[] is Rows. @@ -3888,13 +3937,13 @@ */ typedef struct { - buf_T *save_curbuf; // saved curbuf - int use_aucmd_win; // using aucmd_win - win_T *save_curwin; // saved curwin - win_T *new_curwin; // new curwin - win_T *save_prevwin; // saved prevwin - bufref_T new_curbuf; // new curbuf - char_u *globaldir; // saved value of globaldir + buf_T *save_curbuf; // saved curbuf + int use_aucmd_win; // using aucmd_win + int save_curwin_id; // ID of saved curwin + int new_curwin_id; // ID of new curwin + int save_prevwin_id; // ID of saved prevwin + bufref_T new_curbuf; // new curbuf + char_u *globaldir; // saved value of globaldir } aco_save_T; /* @@ -4000,7 +4049,7 @@ EXPR_MULT, // * EXPR_DIV, // / EXPR_REM, // % -} exptype_T; +} exprtype_T; /* * Structure used for reading in json_decode(). @@ -4143,6 +4192,7 @@ int save_finish_op; int save_opcount; int save_reg_executing; + int save_script_version; tasave_T tabuf; } save_state_T; @@ -4262,6 +4312,32 @@ int sa_wrapped; // search wrapped around } searchit_arg_T; +/* + * Cookie used by getsourceline(). + */ +/* + * Cookie used to store info for each sourced file. + * It is shared between do_source() and getsourceline(). + * This is passed to do_cmdline(). + */ +typedef struct { + FILE *fp; // opened file for sourcing + char_u *nextline; // if not NULL: line that was read ahead + linenr_T sourcing_lnum; // line number of the source file + int finished; // ":finish" used +#ifdef USE_CRNL + int fileformat; // EOL_UNKNOWN, EOL_UNIX or EOL_DOS + int error; // TRUE if LF found after CR-LF +#endif +#ifdef FEAT_EVAL + linenr_T breakpoint; // next line with breakpoint or zero + char_u *fname; // name of sourced file + int dbg_tick; // debug_tick when breakpoint was set + int level; // top nesting level of sourced file +#endif + vimconv_T conv; // type of conversion +} source_cookie_T; + #define WRITEBUFSIZE 8192 // size of normal write buffer @@ -4291,3 +4367,21 @@ // We have to guess how much a sequence of bytes may expand when converting // with iconv() to be able to allocate a buffer. #define ICONV_MULT 8 + +// Used for "magic_overruled". +typedef enum { + OPTION_MAGIC_NOT_SET, // p_magic not overruled + OPTION_MAGIC_ON, // magic on inside regexp + OPTION_MAGIC_OFF // magic off inside regexp +} optmagic_T; + +// Magicness of a pattern, used by regexp code. +// The order and values matter: +// magic <= MAGIC_OFF includes MAGIC_NONE +// magic >= MAGIC_ON includes MAGIC_ALL +typedef enum { + MAGIC_NONE = 1, // "\V" very unmagic + MAGIC_OFF = 2, // "\M" or 'magic' off + MAGIC_ON = 3, // "\m" or 'magic' + MAGIC_ALL = 4 // "\v" very magic +} magic_T; diff -Nru vim-8.2.1913/src/syntax.c vim-8.2.2434/src/syntax.c --- vim-8.2.1913/src/syntax.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/syntax.c 2021-01-30 22:05:11.000000000 +0000 @@ -2606,8 +2606,6 @@ { sip->si_attr = CUR_STATE(idx - 1).si_attr; sip->si_trans_id = CUR_STATE(idx - 1).si_trans_id; - sip->si_h_startpos = CUR_STATE(idx - 1).si_h_startpos; - sip->si_h_endpos = CUR_STATE(idx - 1).si_h_endpos; if (sip->si_cont_list == NULL) { sip->si_flags |= HL_TRANS_CONT; @@ -3869,9 +3867,14 @@ msg_puts(_("no syncing")); else { - msg_puts(_("syncing starts ")); - msg_outnum(curwin->w_s->b_syn_sync_minlines); - msg_puts(_(" lines before top line")); + if (curwin->w_s->b_syn_sync_minlines == MAXLNUM) + msg_puts(_("syncing starts at the first line")); + else + { + msg_puts(_("syncing starts ")); + msg_outnum(curwin->w_s->b_syn_sync_minlines); + msg_puts(_(" lines before top line")); + } syn_match_msg(); } return; @@ -3935,19 +3938,24 @@ || curwin->w_s->b_syn_sync_minlines > 0) { msg_puts("; "); - if (curwin->w_s->b_syn_sync_minlines > 0) - { - msg_puts(_("minimal ")); - msg_outnum(curwin->w_s->b_syn_sync_minlines); - if (curwin->w_s->b_syn_sync_maxlines) - msg_puts(", "); - } - if (curwin->w_s->b_syn_sync_maxlines > 0) + if (curwin->w_s->b_syn_sync_minlines == MAXLNUM) + msg_puts(_("from the first line")); + else { - msg_puts(_("maximal ")); - msg_outnum(curwin->w_s->b_syn_sync_maxlines); + if (curwin->w_s->b_syn_sync_minlines > 0) + { + msg_puts(_("minimal ")); + msg_outnum(curwin->w_s->b_syn_sync_minlines); + if (curwin->w_s->b_syn_sync_maxlines) + msg_puts(", "); + } + if (curwin->w_s->b_syn_sync_maxlines > 0) + { + msg_puts(_("maximal ")); + msg_outnum(curwin->w_s->b_syn_sync_maxlines); + } + msg_puts(_(" lines before top line")); } - msg_puts(_(" lines before top line")); } } @@ -5662,7 +5670,7 @@ // Make 'cpoptions' empty, to avoid the 'l' flag cpo_save = p_cpo; - p_cpo = (char_u *)""; + p_cpo = empty_option; ci->sp_prog = vim_regcomp(ci->sp_pattern, RE_MAGIC); p_cpo = cpo_save; @@ -5850,7 +5858,7 @@ // Make 'cpoptions' empty, to avoid the 'l' flag cpo_save = p_cpo; - p_cpo = (char_u *)""; + p_cpo = empty_option; curwin->w_s->b_syn_linecont_prog = vim_regcomp(curwin->w_s->b_syn_linecont_pat, RE_MAGIC); p_cpo = cpo_save; @@ -6697,7 +6705,7 @@ { int idx; synpat_T *spp; -# ifdef FEAT_FLOAT +# if defined(FEAT_RELTIME) && defined(FEAT_FLOAT) proftime_T tm; # endif int len; @@ -6727,7 +6735,7 @@ p->match = spp->sp_time.match; total_count += spp->sp_time.count; p->slowest = spp->sp_time.slowest; -# ifdef FEAT_FLOAT +# if defined(FEAT_RELTIME) && defined(FEAT_FLOAT) profile_divide(&spp->sp_time.total, spp->sp_time.count, &tm); p->average = tm; # endif diff -Nru vim-8.2.1913/src/tag.c vim-8.2.2434/src/tag.c --- vim-8.2.1913/src/tag.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/tag.c 2021-01-30 22:05:11.000000000 +0000 @@ -1271,7 +1271,7 @@ else for (pats->headlen = 0; pats->head[pats->headlen] != NUL; ++pats->headlen) - if (vim_strchr((char_u *)(p_magic ? ".[~*\\$" : "\\$"), + if (vim_strchr((char_u *)(magic_isset() ? ".[~*\\$" : "\\$"), pats->head[pats->headlen]) != NULL) break; if (p_tl != 0 && pats->headlen > p_tl) // adjust for 'taglength' @@ -1279,7 +1279,8 @@ } if (has_re) - pats->regmatch.regprog = vim_regcomp(pats->pat, p_magic ? RE_MAGIC : 0); + pats->regmatch.regprog = vim_regcomp(pats->pat, + magic_isset() ? RE_MAGIC : 0); else pats->regmatch.regprog = NULL; } @@ -3311,7 +3312,7 @@ int keep_help) // keep help flag (FALSE for cscope) { int save_secure; - int save_magic; + optmagic_T save_magic_overruled; int save_p_ws, save_p_scs, save_p_ic; linenr_T save_lnum; char_u *str; @@ -3503,8 +3504,8 @@ #ifdef HAVE_SANDBOX ++sandbox; #endif - save_magic = p_magic; - p_magic = FALSE; // always execute with 'nomagic' + save_magic_overruled = magic_overruled; + magic_overruled = OPTION_MAGIC_OFF; // always execute with 'nomagic' #ifdef FEAT_SEARCH_EXTRA // Save value of no_hlsearch, jumping to a tag is not a real search save_no_hlsearch = no_hlsearch; @@ -3626,7 +3627,7 @@ if (secure == 2) wait_return(TRUE); secure = save_secure; - p_magic = save_magic; + magic_overruled = save_magic_overruled; #ifdef HAVE_SANDBOX --sandbox; #endif @@ -4200,7 +4201,7 @@ // parse 'from' for the cursor position before the tag jump if ((di = dict_find(itemdict, (char_u *)"from", -1)) == NULL) continue; - if (list2fpos(&di->di_tv, &mark, &fnum, NULL) != OK) + if (list2fpos(&di->di_tv, &mark, &fnum, NULL, FALSE) != OK) continue; if ((tagname = dict_get_string(itemdict, (char_u *)"tagname", TRUE)) == NULL) diff -Nru vim-8.2.1913/src/term.c vim-8.2.2434/src/term.c --- vim-8.2.1913/src/term.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/term.c 2021-01-30 22:05:11.000000000 +0000 @@ -38,7 +38,7 @@ * argument for tputs(). */ # ifdef VMS -# define TPUTSFUNCAST +# define TPUTSFUNCAST (void (*)(unsigned int)) # else # ifdef HAVE_OUTFUNTYPE # define TPUTSFUNCAST (outfuntype) @@ -196,6 +196,11 @@ static int detected_8bit = FALSE; // detected 8-bit terminal +#if (defined(UNIX) || defined(VMS)) +static int focus_mode = FALSE; // xterm's "focus reporting" availability +static int focus_state = FALSE; // TRUE if the terminal window gains focus +#endif + #ifdef FEAT_TERMRESPONSE // When the cursor shape was detected these values are used: // 1: block, 2: underline, 3: vertical bar @@ -297,7 +302,7 @@ {(int)KS_UE, "\033[0m"}, {(int)KS_CZH, "\033[3m"}, {(int)KS_CZR, "\033[0m"}, -#if defined(__MORPHOS__) || defined(__AROS__) +#if defined(__amigaos4__) || defined(__MORPHOS__) || defined(__AROS__) {(int)KS_CCO, "8"}, // allow 8 colors # ifdef TERMINFO {(int)KS_CAB, "\033[4%p1%dm"},// set background color @@ -908,16 +913,20 @@ {(int)KS_CRT, IF_EB("\033[23;2t", ESC_STR "[23;2t")}, {(int)KS_SSI, IF_EB("\033[22;1t", ESC_STR "[22;1t")}, {(int)KS_SRI, IF_EB("\033[23;1t", ESC_STR "[23;1t")}, +# if (defined(UNIX) || defined(VMS)) + {(int)KS_FD, IF_EB("\033[?1004l", ESC_STR "[?1004l")}, + {(int)KS_FE, IF_EB("\033[?1004h", ESC_STR "[?1004h")}, +# endif {K_UP, IF_EB("\033O*A", ESC_STR "O*A")}, {K_DOWN, IF_EB("\033O*B", ESC_STR "O*B")}, {K_RIGHT, IF_EB("\033O*C", ESC_STR "O*C")}, {K_LEFT, IF_EB("\033O*D", ESC_STR "O*D")}, // An extra set of cursor keys for vt100 mode - {K_XUP, IF_EB("\033[1;*A", ESC_STR "[1;*A")}, - {K_XDOWN, IF_EB("\033[1;*B", ESC_STR "[1;*B")}, - {K_XRIGHT, IF_EB("\033[1;*C", ESC_STR "[1;*C")}, - {K_XLEFT, IF_EB("\033[1;*D", ESC_STR "[1;*D")}, + {K_XUP, IF_EB("\033[@;*A", ESC_STR "[@;*A")}, + {K_XDOWN, IF_EB("\033[@;*B", ESC_STR "[@;*B")}, + {K_XRIGHT, IF_EB("\033[@;*C", ESC_STR "[@;*C")}, + {K_XLEFT, IF_EB("\033[@;*D", ESC_STR "[@;*D")}, // An extra set of function keys for vt100 mode {K_XF1, IF_EB("\033O*P", ESC_STR "O*P")}, {K_XF2, IF_EB("\033O*Q", ESC_STR "O*Q")}, @@ -1800,7 +1809,7 @@ mch_errmsg(_("defaulting to '")); mch_errmsg((char *)term); mch_errmsg("'\r\n"); - if (emsg_silent == 0) + if (emsg_silent == 0 && !in_assert_fails) { screen_start(); // don't know where cursor is now out_flush(); @@ -2044,6 +2053,27 @@ set_mouse_termcode(KS_MOUSE, (char_u *)"\233M"); #endif +#ifdef FEAT_MOUSE_XTERM + // focus reporting is supported by xterm compatible terminals and tmux. + if (use_xterm_like_mouse(term)) + { + char_u name[3]; + + // handle focus in event + name[0] = KS_EXTRA; + name[1] = KE_FOCUSGAINED; + name[2] = NUL; + add_termcode(name, (char_u *)"\033[I", FALSE); + + // handle focus out event + name[1] = KE_FOCUSLOST; + add_termcode(name, (char_u *)"\033[O", FALSE); + + focus_mode = TRUE; + focus_state = TRUE; + } +#endif + #ifdef USE_TERM_CONSOLE // DEFAULT_TERM indicates that it is the machine console. if (STRCMP(term, DEFAULT_TERM) != 0) @@ -2519,7 +2549,12 @@ if (ch_log_output) { out_buf[len] = NUL; - ch_log(NULL, "raw terminal output: \"%s\"", out_buf); + ch_log(NULL, "raw %s output: \"%s\"", +# ifdef FEAT_GUI + (gui.in_use && !gui.dying && !gui.starting) ? "GUI" : +# endif + "terminal", + out_buf); ch_log_output = FALSE; } #endif @@ -2678,7 +2713,7 @@ else { ++p; - do_sleep(duration); + do_sleep(duration, FALSE); } # else // Rely on the terminal library to sleep. @@ -3411,9 +3446,10 @@ return; // curwin->w_buffer can be NULL when we are closing a window and the - // buffer has already been closed and removing a scrollbar causes a resize - // event. Don't resize then, it will happen after entering another buffer. - if (curwin->w_buffer == NULL) + // buffer (or window) has already been closed and removing a scrollbar + // causes a resize event. Don't resize then, it will happen after entering + // another buffer. + if (curwin->w_buffer == NULL || curwin->w_lines == NULL) return; ++busy; @@ -3581,6 +3617,13 @@ out_str(T_CTI); // start "raw" mode out_str(T_KS); // start "keypad transmit" mode out_str(T_BE); // enable bracketed paste mode + +#if (defined(UNIX) || defined(VMS)) + // enable xterm's focus reporting mode + if (focus_mode && *T_FE != NUL) + out_str(T_FE); +#endif + out_flush(); termcap_active = TRUE; screen_start(); // don't know where cursor is now @@ -3632,6 +3675,13 @@ #ifdef FEAT_JOB_CHANNEL ch_log_output = TRUE; #endif + +#if (defined(UNIX) || defined(VMS)) + // disable xterm's focus reporting mode + if (focus_mode && *T_FD != NUL) + out_str(T_FD); +#endif + out_str(T_BD); // disable bracketed paste mode out_str(T_KE); // stop "keypad transmit" mode out_flush(); @@ -3744,7 +3794,7 @@ #endif LOG_TR(("Sending xterm compatibility test sequence.")); // Do this in the third row. Second row is used by ambiguous - // chararacter width check. + // character width check. term_windgoto(2, 0); // send the test DCS string. out_str((char_u *)"\033Pzz\033\\"); @@ -4230,7 +4280,12 @@ termcodes[i].modlen = 0; j = termcode_star(s, len); if (j > 0) + { termcodes[i].modlen = len - 1 - j; + // For "CSI[@;X" the "@" is not included in "modlen". + if (termcodes[i].code[termcodes[i].modlen - 1] == '@') + --termcodes[i].modlen; + } ++tc_len; } @@ -4242,7 +4297,7 @@ static int termcode_star(char_u *code, int len) { - // Shortest is *X. With ; shortest is 1;*X + // Shortest is *X. With ; shortest is @;*X if (len >= 3 && code[len - 2] == '*') { if (len >= 5 && code[len - 3] == ';') @@ -4462,7 +4517,8 @@ if (modifiers != 0) { // Some keys have the modifier included. Need to handle that here to - // make mappings work. + // make mappings work. This may result in a special key, such as + // K_S_TAB. *key = simplify_key(*key, &modifiers); if (modifiers != 0) { @@ -4530,7 +4586,7 @@ /* * Handle a response to T_CRV: {lead}{first}{x};{vers};{y}c - * Xterm and alikes use '>' for {first}. + * Xterm and alike use '>' for {first}. * Rxvt sends "{lead}?1;2c". */ static void @@ -4793,7 +4849,13 @@ // insert modifiers with KS_MODIFIER new_slen = modifiers2keycode(modifiers, &key, string); - if (has_mbyte) + if (IS_SPECIAL(key)) + { + string[new_slen++] = K_SPECIAL; + string[new_slen++] = KEY2TERMCAP0(key); + string[new_slen++] = KEY2TERMCAP1(key); + } + else if (has_mbyte) new_slen += (*mb_char2bytes)(key, string + new_slen); else string[new_slen++] = key; @@ -5277,6 +5339,8 @@ else #endif // FEAT_GUI { + int mouse_index_found = -1; + for (idx = 0; idx < tc_len; ++idx) { /* @@ -5314,23 +5378,42 @@ } } - key_name[0] = termcodes[idx].name[0]; - key_name[1] = termcodes[idx].name[1]; - break; + // The mouse termcode "ESC [" is also the prefix of + // "ESC [ I" (focus gained). Only use it when there is + // no other match. Do use it when a digit is following to + // avoid waiting for more bytes. + if (slen == 2 && len > 2 + && termcodes[idx].code[0] == ESC + && termcodes[idx].code[1] == '[' + && !isdigit(tp[2])) + { + if (mouse_index_found < 0) + mouse_index_found = idx; + } + else + { + key_name[0] = termcodes[idx].name[0]; + key_name[1] = termcodes[idx].name[1]; + break; + } } /* * Check for code with modifier, like xterm uses: * [123;*X (modslen == slen - 3) + * [@;*X (matches [X and [1;9X ) * Also O*X and *X (modslen == slen - 2). * When there is a modifier the * matches a number. * When there is no modifier the ;* or * is omitted. */ - if (termcodes[idx].modlen > 0) + if (termcodes[idx].modlen > 0 && mouse_index_found < 0) { + int at_code; + modslen = termcodes[idx].modlen; if (cpo_koffset && offset && len < modslen) continue; + at_code = termcodes[idx].code[modslen] == '@'; if (STRNCMP(termcodes[idx].code, tp, (size_t)(modslen > len ? len : modslen)) == 0) { @@ -5340,9 +5423,14 @@ return -1; // need to get more chars if (tp[modslen] == termcodes[idx].code[slen - 1]) - slen = modslen + 1; // no modifiers + // no modifiers + slen = modslen + 1; else if (tp[modslen] != ';' && modslen == slen - 3) - continue; // no match + // no match for "code;*X" with "code;" + continue; + else if (at_code && tp[modslen] != '1') + // no match for "[@" with "[1" + continue; else { // Skip over the digits, the final char must @@ -5371,6 +5459,11 @@ } } } + if (idx == tc_len && mouse_index_found >= 0) + { + key_name[0] = termcodes[mouse_index_found].name[0]; + key_name[1] = termcodes[mouse_index_found].name[1]; + } } #ifdef FEAT_TERMRESPONSE @@ -5625,6 +5718,41 @@ # endif // !USE_ON_FLY_SCROLL #endif // FEAT_GUI +#if (defined(UNIX) || defined(VMS)) + /* + * Handle FocusIn/FocusOut event sequences reported by XTerm. + * (CSI I/CSI O) + */ + if (focus_mode +# ifdef FEAT_GUI + && !gui.in_use +# endif + && key_name[0] == KS_EXTRA + ) + { + if (key_name[1] == KE_FOCUSGAINED) + { + if (!focus_state) + { + ui_focus_change(TRUE); + did_cursorhold = TRUE; + focus_state = TRUE; + } + key_name[1] = (int)KE_IGNORE; + } + else if (key_name[1] == KE_FOCUSLOST) + { + if (focus_state) + { + ui_focus_change(FALSE); + did_cursorhold = TRUE; + focus_state = FALSE; + } + key_name[1] = (int)KE_IGNORE; + } + } +#endif + /* * Change to , to , etc. */ diff -Nru vim-8.2.1913/src/term.h vim-8.2.2434/src/term.h --- vim-8.2.1913/src/term.h 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/term.h 2021-01-30 22:05:11.000000000 +0000 @@ -109,10 +109,12 @@ KS_CST, // save window title KS_CRT, // restore window title KS_SSI, // save icon text - KS_SRI // restore icon text + KS_SRI, // restore icon text + KS_FD, // disable focus event tracking + KS_FE // enable focus event tracking }; -#define KS_LAST KS_SRI +#define KS_LAST KS_FE /* * the terminal capabilities are stored in this array @@ -212,6 +214,8 @@ #define T_CRT (TERM_STR(KS_CRT)) // restore window title #define T_SSI (TERM_STR(KS_SSI)) // save icon text #define T_SRI (TERM_STR(KS_SRI)) // restore icon text +#define T_FD (TERM_STR(KS_FD)) // disable focus event tracking +#define T_FE (TERM_STR(KS_FE)) // enable focus event tracking typedef enum { TMODE_COOK, // terminal mode for external cmds and Ex mode diff -Nru vim-8.2.1913/src/terminal.c vim-8.2.2434/src/terminal.c --- vim-8.2.1913/src/terminal.c 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/terminal.c 2021-01-30 22:05:11.000000000 +0000 @@ -1202,6 +1202,7 @@ return; } ch_log(channel, "writing %d bytes to terminal", (int)len); + cursor_off(); term_write_job_output(term, msg, len); #ifdef FEAT_GUI @@ -1598,7 +1599,7 @@ char_u buff[DIALOG_MSG_SIZE]; int ret; - dialog_msg(buff, _("Kill job in \"%s\"?"), buf->b_fname); + dialog_msg(buff, _("Kill job in \"%s\"?"), buf_get_fname(buf)); ret = vim_dialog_yesnocancel(VIM_QUESTION, NULL, buff, 1); if (ret == VIM_YES) how = "kill"; @@ -1830,6 +1831,10 @@ width = cell.width; cell2cellattr(&cell, &p[pos.col]); + if (width == 2) + // second cell of double-width character has the + // same attributes. + p[pos.col + 1] = p[pos.col]; // Each character can be up to 6 bytes. if (ga_grow(&ga, VTERM_MAX_CHARS_PER_CELL * 6) == OK) @@ -2176,6 +2181,10 @@ return FAIL; } } + break; + + case K_COMMAND: + return do_cmdline(NULL, getcmdkeycmd, NULL, 0); } if (typed) mouse_was_outside = FALSE; @@ -2191,16 +2200,19 @@ } static void -position_cursor(win_T *wp, VTermPos *pos, int add_off UNUSED) +position_cursor(win_T *wp, VTermPos *pos) { wp->w_wrow = MIN(pos->row, MAX(0, wp->w_height - 1)); wp->w_wcol = MIN(pos->col, MAX(0, wp->w_width - 1)); #ifdef FEAT_PROP_POPUP - if (add_off && popup_is_popup(curwin)) + if (popup_is_popup(wp)) { - wp->w_wrow += popup_top_extra(curwin); - wp->w_wcol += popup_left_extra(curwin); + wp->w_wrow += popup_top_extra(wp); + wp->w_wcol += popup_left_extra(wp); + wp->w_flags |= WFLAG_WCOL_OFF_ADDED | WFLAG_WROW_OFF_ADDED; } + else + wp->w_flags &= ~(WFLAG_WCOL_OFF_ADDED | WFLAG_WROW_OFF_ADDED); #endif wp->w_valid |= (VALID_WCOL|VALID_WROW); } @@ -2513,13 +2525,13 @@ if (termwinkey == Ctrl_W) termwinkey = 0; } - position_cursor(curwin, &curbuf->b_term->tl_cursor_pos, TRUE); + position_cursor(curwin, &curbuf->b_term->tl_cursor_pos); may_set_cursor_props(curbuf->b_term); while (blocking || vpeekc_nomap() != NUL) { #ifdef FEAT_GUI - if (!curbuf->b_term->tl_system) + if (curbuf->b_term != NULL && !curbuf->b_term->tl_system) #endif // TODO: skip screen update when handling a sequence of keys. // Repeat redrawing in case a message is received while redrawing. @@ -2534,8 +2546,6 @@ restore_cursor = TRUE; raw_c = term_vgetc(); -if (raw_c > 0) - ch_log(NULL, "terminal_loop() got %d", raw_c); if (!term_use_loop_check(TRUE) || in_terminal_loop != curbuf->b_term) { // Job finished while waiting for a character. Push back the @@ -3050,13 +3060,10 @@ while (for_all_windows_and_curwin(&wp, &did_curwin)) { if (wp->w_buffer == term->tl_buffer) - position_cursor(wp, &pos, FALSE); + position_cursor(wp, &pos); } if (term->tl_buffer == curbuf && !term->tl_normal_mode) - { - may_toggle_cursor(term); update_cursor(term, term->tl_cursor_visible); - } return 1; } @@ -3442,15 +3449,19 @@ if (term->tl_finish == TL_FINISH_OPEN && term->tl_buffer->b_nwindows == 0) { - char buf[50]; - - // TODO: use term_opencmd - ch_log(NULL, "terminal job finished, opening window"); - vim_snprintf(buf, sizeof(buf), - term->tl_opencmd == NULL - ? "botright sbuf %d" - : (char *)term->tl_opencmd, fnum); - do_cmdline_cmd((char_u *)buf); + char *cmd = term->tl_opencmd == NULL + ? "botright sbuf %d" + : (char *)term->tl_opencmd; + size_t len = strlen(cmd) + 50; + char *buf = alloc(len); + + if (buf != NULL) + { + ch_log(NULL, "terminal job finished, opening window"); + vim_snprintf(buf, len, cmd, fnum); + do_cmdline_cmd((char_u *)buf); + vim_free(buf); + } } else ch_log(NULL, "terminal job finished"); @@ -3639,6 +3650,7 @@ } #endif else + // This will only store the lower byte of "c". ScreenLines[off] = c; } ScreenAttrs[off] = cell2attr(term, wp, cell.attrs, cell.fg, cell.bg); @@ -3647,13 +3659,20 @@ ++off; if (cell.width == 2) { - if (enc_utf8) - ScreenLinesUC[off] = NUL; - // don't set the second byte to NUL for a DBCS encoding, it // has been set above - if (enc_utf8 || !has_mbyte) + if (enc_utf8) + { + ScreenLinesUC[off] = NUL; ScreenLines[off] = NUL; + } + else if (!has_mbyte) + { + // Can't show a double-width character with a single-byte + // 'encoding', just use a space. + ScreenLines[off] = ' '; + ScreenAttrs[off] = ScreenAttrs[off - 1]; + } ++pos->col; ++off; @@ -3797,7 +3816,7 @@ // The cursor may have been moved when resizing. vterm_state_get_cursorpos(state, &pos); - position_cursor(wp, &pos, FALSE); + position_cursor(wp, &pos); for (pos.row = term->tl_dirty_row_start; pos.row < term->tl_dirty_row_end && pos.row < wp->w_height; ++pos.row) @@ -4517,6 +4536,7 @@ { char_u *txt; size_t len; + char_u *fname; if (term->tl_normal_mode) { @@ -4533,11 +4553,12 @@ txt = (char_u *)_("running"); else txt = (char_u *)_("finished"); - len = 9 + STRLEN(term->tl_buffer->b_fname) + STRLEN(txt); + fname = buf_get_fname(term->tl_buffer); + len = 9 + STRLEN(fname) + STRLEN(txt); term->tl_status_text = alloc(len); if (term->tl_status_text != NULL) vim_snprintf((char *)term->tl_status_text, len, "%s [%s]", - term->tl_buffer->b_fname, txt); + fname, txt); } return term->tl_status_text; } @@ -4572,12 +4593,12 @@ { buf_T *buf; - (void)tv_get_number(&argvars[0]); // issue errmsg if type error ++emsg_off; buf = tv_get_buf(&argvars[0], FALSE); --emsg_off; if (buf == NULL || buf->b_term == NULL) { + (void)tv_get_number(&argvars[0]); // issue errmsg if type error ch_log(NULL, "%s: invalid buffer argument", where); return NULL; } diff -Nru vim-8.2.1913/src/testdir/check.vim vim-8.2.2434/src/testdir/check.vim --- vim-8.2.1913/src/testdir/check.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/check.vim 2021-01-30 22:05:11.000000000 +0000 @@ -183,4 +183,12 @@ return v:false endfunc +" Command to check for not running under ASAN +command CheckNotAsan call CheckNotAsan() +func CheckNotAsan() + if execute('version') =~# '-fsanitize=[a-z,]*\' + throw 'Skipped: does not work with ASAN' + endif +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff -Nru vim-8.2.1913/src/testdir/dumps/Test_diff_cuc_01.dump vim-8.2.2434/src/testdir/dumps/Test_diff_cuc_01.dump --- vim-8.2.1913/src/testdir/dumps/Test_diff_cuc_01.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_diff_cuc_01.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,20 @@ +>a+0&#ffffff0@1| @34||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0@1| @32 +|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255@1| @32 +|c+0&#e0e0e08|c+0&#ffffff0| @34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 +|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|A|l@1| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|A|l@1 +| +0&&@74 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_diff_cuc_02.dump vim-8.2.2434/src/testdir/dumps/Test_diff_cuc_02.dump --- vim-8.2.1913/src/testdir/dumps/Test_diff_cuc_02.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_diff_cuc_02.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,20 @@ +|a+0&#ffffff0>a| @34||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0@1| @32 +|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255@1| @32 +|c+0&#ffffff0|c+0&#e0e0e08| +0&#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 +|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|2| @11|A|l@1| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|2| @11|A|l@1 +| +0&&@74 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_diff_cuc_03.dump vim-8.2.2434/src/testdir/dumps/Test_diff_cuc_03.dump --- vim-8.2.1913/src/testdir/dumps/Test_diff_cuc_03.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_diff_cuc_03.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,20 @@ +|a+0&#e0e0e08|a+0&#ffffff0| @34||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0@1| @32 +|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255@1| @32 +>c+0&#ffffff0@1| @34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 +|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @5|2|,|1| @11|A|l@1| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @5|3|,|1| @11|A|l@1 +| +0&&@74 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_diff_cuc_04.dump vim-8.2.2434/src/testdir/dumps/Test_diff_cuc_04.dump --- vim-8.2.1913/src/testdir/dumps/Test_diff_cuc_04.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_diff_cuc_04.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,20 @@ +|a+0&#ffffff0|a+0&#e0e0e08| +0&#ffffff0@34||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0@1| @32 +|-+0#4040ff13#afffff255@36||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|b+0#0000000#5fd7ff255@1| @32 +|c+0&#ffffff0>c| @34||+1&&| +0#0000e05#a8a8a8255@1|c+0#0000000#ffffff0@1| @32 +|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|~| @35||+1#0000000&|~+0#4040ff13&| @35 +|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @5|2|,|2| @11|A|l@1| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @5|3|,|2| @11|A|l@1 +| +0&&@74 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_incsearch_newline1.dump vim-8.2.2434/src/testdir/dumps/Test_incsearch_newline1.dump --- vim-8.2.1913/src/testdir/dumps/Test_incsearch_newline1.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_incsearch_newline1.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,5 @@ +|t+1&#ffffff0|e|s|t| +0&&@5 +|x@2| @6 +|~+0#4040ff13&| @8 +|~| @8 +|/+0#0000000&|t|e|s|t> @4 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_incsearch_newline2.dump vim-8.2.2434/src/testdir/dumps/Test_incsearch_newline2.dump --- vim-8.2.1913/src/testdir/dumps/Test_incsearch_newline2.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_incsearch_newline2.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,5 @@ +|t+1&#ffffff0|e|s|t| | +0&&@4 +|x@2| @6 +|~+0#4040ff13&| @8 +|~| @8 +|/+0#0000000&|t|e|s|t|\|n> @2 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_incsearch_newline3.dump vim-8.2.2434/src/testdir/dumps/Test_incsearch_newline3.dump --- vim-8.2.1913/src/testdir/dumps/Test_incsearch_newline3.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_incsearch_newline3.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,5 @@ +|t+1&#ffffff0|e|s|t| | +0&&@4 +|x+1&&|x+0&&@1| @6 +|~+0#4040ff13&| @8 +|~| @8 +|/+0#0000000&|t|e|s|t|\|n|x> @1 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_incsearch_newline4.dump vim-8.2.2434/src/testdir/dumps/Test_incsearch_newline4.dump --- vim-8.2.1913/src/testdir/dumps/Test_incsearch_newline4.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_incsearch_newline4.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,5 @@ +|t+1&#ffffff0|e|s|t| | +0&&@4 +|x+1&&@1|x+0&&| @6 +|~+0#4040ff13&| @8 +|~| @8 +|/+0#0000000&|t|e|s|t|\|n|x@1> diff -Nru vim-8.2.1913/src/testdir/dumps/Test_incsearch_newline5.dump vim-8.2.2434/src/testdir/dumps/Test_incsearch_newline5.dump --- vim-8.2.1913/src/testdir/dumps/Test_incsearch_newline5.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_incsearch_newline5.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,5 @@ +|o+0#00e0003#ffffff0|r| |t|y|p|e| |c|o +|m| @7|m +|a|n|d| |t|o| |c|o|n +|t| @7|i +|n|u|e> +0#0000000&@6 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_incsearch_sub_01.dump vim-8.2.2434/src/testdir/dumps/Test_incsearch_sub_01.dump --- vim-8.2.1913/src/testdir/dumps/Test_incsearch_sub_01.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_incsearch_sub_01.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,9 @@ +|f+0&#ffffff0|o@1| |1| @64 +|f|o@1| |2| @64 +|f|o@1| |3| @64 +|f|o@1| |4| @64 +|a|b|c|||d|e|f| @62 +|~+0#4040ff13&| @68 +|~| @68 +|~| @68 +|:+0#0000000&|%|s|/|\|v|a|b|c||> @59 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_incsearch_sub_02.dump vim-8.2.2434/src/testdir/dumps/Test_incsearch_sub_02.dump --- vim-8.2.1913/src/testdir/dumps/Test_incsearch_sub_02.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_incsearch_sub_02.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,9 @@ +|f+0&#ffffff0|o@1| |1| @64 +|f|o@1| |2| @64 +|f|o@1| |3| @64 +|f|o@1| |4| @64 +|a|b|c|||d|e|f| @62 +|~+0#4040ff13&| @68 +|~| @68 +|~| @68 +|:+0#0000000&|1|,|5|s|/|\|v||> @60 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_popup_command_04.dump vim-8.2.2434/src/testdir/dumps/Test_popup_command_04.dump --- vim-8.2.1913/src/testdir/dumps/Test_popup_command_04.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_popup_command_04.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,20 @@ +|o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| @51 +|a|n|d| |o|n|e| |t|w|o| |X|t|h|r|e@1| |f|o|u|r| |f|i|v|e| @46 +|o|n|e| |m|o|r|e| |t|w| +0#0000001#ffd7ff255|U|n|d|o| @12| +0#0000000#ffffff0@45 +|~+0#4040ff13&| @9| +0#0000001#ffd7ff255@17| +0#4040ff13#ffffff0@45 +|~| @9| +0#0000001#ffd7ff255|P|a|s|t|e| @11| +0#4040ff13#ffffff0@45 +|~| @9| +0#0000001#ffd7ff255@17| +0#4040ff13#ffffff0@45 +|~| @9| +0#0000001#ffd7ff255|S|e|l|e|c|t| |W|o|r|d| @5| +0#4040ff13#ffffff0@45 +|~| @9| +0#0000001#ffd7ff255|S|e|l|e|c|t| |S|e|n|t|e|n|c|e| @1| +0#4040ff13#ffffff0@45 +|~| @9| +0#0000001#ffd7ff255|S|e|l|e|c|t| |P|a|r|a|g|r|a|p|h| | +0#4040ff13#ffffff0@45 +|~| @9| +0#0000001#ffd7ff255|S|e|l|e|c|t| |L|i|n|e| @5| +0#4040ff13#ffffff0@45 +|~| @9| +0#0000001#ffd7ff255|S|e|l|e|c|t| |B|l|o|c|k| @4| +0#4040ff13#ffffff0@45 +|~| @9| +0#0000001#ffd7ff255|S|e|l|e|c|t| |A|l@1| @6| +0#4040ff13#ffffff0@45 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|c+0#0000000&|h|a|n|g|e|d> @67 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_popup_command_05.dump vim-8.2.2434/src/testdir/dumps/Test_popup_command_05.dump --- vim-8.2.1913/src/testdir/dumps/Test_popup_command_05.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_popup_command_05.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,20 @@ +|o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| @51 +|a|n|d| |o|n|e| |t|w|o| >X|t|h|r|e@1| |f|o|u|r| |f|i|v|e| @46 +|o|n|e| |m|o|r|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| @46 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|p+0#0000000&|a|s|t|e|d| @50|2|,|1|3| @9|A|l@1| diff -Nru vim-8.2.1913/src/testdir/dumps/Test_popupwin_longtitle_3.dump vim-8.2.2434/src/testdir/dumps/Test_popupwin_longtitle_3.dump --- vim-8.2.1913/src/testdir/dumps/Test_popupwin_longtitle_3.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_popupwin_longtitle_3.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,10 @@ +>1+0&#ffffff0| @73 +|2| @73 +|3| @27| +0#0000001#ffd7ff255|T|i|t|l|e| @9| +0#0000000#ffffff0@29 +|4| @27| +0#0000001#ffd7ff255@15| +0#0000000#ffffff0@29 +|5| @27| +0#0000001#ffd7ff255@1|a@2| @10| +0#0000000#ffffff0@29 +|6| @27| +0#0000001#ffd7ff255@1|b@2| @10| +0#0000000#ffffff0@29 +|7| @27| +0#0000001#ffd7ff255@15| +0#0000000#ffffff0@29 +|8| @27| +0#0000001#ffd7ff255@15| +0#0000000#ffffff0@29 +|9| @73 +|:| @55|1|,|1| @10|T|o|p| diff -Nru vim-8.2.1913/src/testdir/dumps/Test_popupwin_longtitle_4.dump vim-8.2.2434/src/testdir/dumps/Test_popupwin_longtitle_4.dump --- vim-8.2.1913/src/testdir/dumps/Test_popupwin_longtitle_4.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_popupwin_longtitle_4.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,10 @@ +>1+0&#ffffff0| @73 +|2| @26|â•”+0#0000001#ffd7ff255|T|i|t|l|e|â•@10|â•—| +0#0000000#ffffff0@28 +|3| @26|â•‘+0#0000001#ffd7ff255| @15|â•‘| +0#0000000#ffffff0@28 +|4| @26|â•‘+0#0000001#ffd7ff255| @15|â•‘| +0#0000000#ffffff0@28 +|5| @26|â•‘+0#0000001#ffd7ff255| @1|a@2| @10|â•‘| +0#0000000#ffffff0@28 +|6| @26|â•‘+0#0000001#ffd7ff255| @1|b@2| @10|â•‘| +0#0000000#ffffff0@28 +|7| @26|â•‘+0#0000001#ffd7ff255| @15|â•‘| +0#0000000#ffffff0@28 +|8| @26|â•‘+0#0000001#ffd7ff255| @15|â•‘| +0#0000000#ffffff0@28 +|9| @26|â•š+0#0000001#ffd7ff255|â•@15|â•| +0#0000000#ffffff0@28 +|:| @55|1|,|1| @10|T|o|p| diff -Nru vim-8.2.1913/src/testdir/dumps/Test_quickfix_window_fails.dump vim-8.2.2434/src/testdir/dumps/Test_quickfix_window_fails.dump --- vim-8.2.1913/src/testdir/dumps/Test_quickfix_window_fails.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_quickfix_window_fails.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,13 @@ +|a+0&#ffffff0|n|y|t|h|i|n|g| @66 +> @74 +|t|r|y| @71 +|X+3&&|q|u|i|c|k|f|i|x|F|a|i|l|s| |[|+|]| @38|2|,|0|-|1| @9|T|o|p +| +0&&@74 +|t|r|y| @71 +@2|a|n|y|t|h|i|n|g| @64 +|X+1&&|q|u|i|c|k|f|i|x|F|a|i|l|s| |[|+|]| @38|2|,|0|-|1| @9|5|0|% +| +0&&@74 +|~+0#4040ff13&| @73 +|~| @73 +|[+1#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 +| +0&&@74 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_terminal_from_cmd.dump vim-8.2.2434/src/testdir/dumps/Test_terminal_from_cmd.dump --- vim-8.2.1913/src/testdir/dumps/Test_terminal_from_cmd.dump 1970-01-01 00:00:00.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_terminal_from_cmd.dump 2021-01-30 22:05:11.000000000 +0000 @@ -0,0 +1,20 @@ +| +0&#ffffff0@74 +@75 +@75 +@75 +@75 +@75 +@75 +@75 +@75 +|!+2#ffffff16#00e0003|/|b|i|n|/|s|h| |[|f|i|n|i|s|h|e|d|]| @37|0|,|0|-|1| @9|A|l@1 +|a+0#0000000#ffffff0| @73 +|b| @73 +|c| @73 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|[+1#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|3|,|1| @11|A|l@1 +|/+0&&> @73 diff -Nru vim-8.2.1913/src/testdir/dumps/Test_terminal_popup_m1.dump vim-8.2.2434/src/testdir/dumps/Test_terminal_popup_m1.dump --- vim-8.2.1913/src/testdir/dumps/Test_terminal_popup_m1.dump 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/dumps/Test_terminal_popup_m1.dump 2021-01-30 22:05:11.000000000 +0000 @@ -5,8 +5,8 @@ |4| @24|â•”+0#0000001#ffd7ff255|â•@19|â•—| +0#0000000#ffffff0@26 |5| @24|â•‘+0#0000001#ffd7ff255|a|n|o|t|h|e|r| |t|e|x|t| @7|â•‘| +0#0000000#ffffff0@26 |6| @24|â•‘+0#0000001#ffd7ff255|t|o| |s|h|o|w| @12|â•‘| +0#0000000#ffffff0@26 -|7| @24|â•‘+0#0000001#ffd7ff255|i|n| |a| |p|o|p|u|p| |w|i|n|d|o|w| @2|â•‘| +0#0000000#ffffff0@26 -|8| @24|â•‘+0#0000001#ffd7ff255| +0#4040ff13&> @18|â•‘+0#0000001&| +0#0000000#ffffff0@26 +|7| @24|â•‘+0#0000001#ffd7ff255>i|n| |a| |p|o|p|u|p| |w|i|n|d|o|w| @2|â•‘| +0#0000000#ffffff0@26 +|8| @24|â•‘+0#0000001#ffd7ff255| +0#4040ff13&@19|â•‘+0#0000001&| +0#0000000#ffffff0@26 |9| @24|â•‘+0#0000001#ffd7ff255| +0#4040ff13&@19|â•‘+0#0000001&| +0#0000000#ffffff0@26 |1|0| @23|â•š+0#0000001#ffd7ff255|â•@19|â•| +0#0000000#ffffff0@26 |1@1| @72 diff -Nru vim-8.2.1913/src/testdir/gen_opt_test.vim vim-8.2.2434/src/testdir/gen_opt_test.vim --- vim-8.2.1913/src/testdir/gen_opt_test.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/gen_opt_test.vim 2021-01-30 22:05:11.000000000 +0000 @@ -130,7 +130,7 @@ \ 'selectmode': [['', 'mouse', 'key,cmd'], ['xxx']], \ 'sessionoptions': [['', 'blank', 'help,options,slash'], ['xxx']], \ 'signcolumn': [['', 'auto', 'no'], ['xxx', 'no,yes']], - \ 'spellfile': [['', 'file.en.add'], ['xxx', '/tmp/file']], + \ 'spellfile': [['', 'file.en.add', '/tmp/dir\ with\ space/en.utf-8.add'], ['xxx', '/tmp/file']], \ 'spelllang': [['', 'xxx', 'sr@latin'], ['not&lang', "that\\\rthere"]], \ 'spelloptions': [['', 'camel'], ['xxx']], \ 'spellsuggest': [['', 'best', 'double,33'], ['xxx']], @@ -200,8 +200,8 @@ " setting an option can only fail when it's implemented. call add(script, "if exists('+" . name . "')") for val in a[1] - call add(script, "call assert_fails('set " . name . "=" . val . "')") - call add(script, "call assert_fails('set " . shortname . "=" . val . "')") + call add(script, "silent! call assert_fails('set " . name . "=" . val . "')") + call add(script, "silent! call assert_fails('set " . shortname . "=" . val . "')") endfor call add(script, "endif") endif diff -Nru vim-8.2.1913/src/testdir/Make_all.mak vim-8.2.2434/src/testdir/Make_all.mak --- vim-8.2.1913/src/testdir/Make_all.mak 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/Make_all.mak 2021-01-30 22:05:11.000000000 +0000 @@ -246,6 +246,7 @@ test_shortpathname \ test_signals \ test_signs \ + test_sleep \ test_smartindent \ test_sort \ test_sound \ @@ -416,6 +417,7 @@ test_listdict.res \ test_listener.res \ test_listlbr.res \ + test_listlbr_utf8.res \ test_lua.res \ test_makeencoding.res \ test_man.res \ @@ -471,6 +473,7 @@ test_shortpathname.res \ test_signals.res \ test_signs.res \ + test_sleep.res \ test_smartindent.res \ test_sort.res \ test_sound.res \ diff -Nru vim-8.2.1913/src/testdir/Make_vms.mms vim-8.2.2434/src/testdir/Make_vms.mms --- vim-8.2.1913/src/testdir/Make_vms.mms 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/Make_vms.mms 2021-01-30 22:05:11.000000000 +0000 @@ -4,7 +4,7 @@ # Authors: Zoltan Arpadffy, # Sandor Kopanyi, # -# Last change: 2020 Aug 13 +# Last change: 2020 Aug 14 # # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. # Edit the lines in the Configuration section below to select. diff -Nru vim-8.2.1913/src/testdir/runtest.vim vim-8.2.2434/src/testdir/runtest.vim --- vim-8.2.1913/src/testdir/runtest.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/runtest.vim 2021-01-30 22:05:11.000000000 +0000 @@ -136,6 +136,13 @@ let s:t_normal = &t_me endif +if has('mac') + " In MacOS, when starting a shell in a terminal, a bash deprecation warning + " message is displayed. This breaks the terminal test. Disable the warning + " message. + let $BASH_SILENCE_DEPRECATION_WARNING = 1 +endif + " Prepare for calling test_garbagecollect_now(). let v:testing = 1 diff -Nru vim-8.2.1913/src/testdir/shared.vim vim-8.2.2434/src/testdir/shared.vim --- vim-8.2.1913/src/testdir/shared.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/shared.vim 2021-01-30 22:05:11.000000000 +0000 @@ -223,7 +223,7 @@ call feedkeys('x', 'nt') endfunc -" Get $VIMPROG to run Vim executable. +" Get $VIMPROG to run the Vim executable. " The Makefile writes it as the first line in the "vimcmd" file. func GetVimProg() if !filereadable('vimcmd') diff -Nru vim-8.2.1913/src/testdir/term_util.vim vim-8.2.2434/src/testdir/term_util.vim --- vim-8.2.1913/src/testdir/term_util.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/term_util.vim 2021-01-30 22:05:11.000000000 +0000 @@ -134,7 +134,7 @@ endfunc " Stop a Vim running in terminal buffer "buf". -func StopVimInTerminal(buf) +func StopVimInTerminal(buf, kill = 1) " Using a terminal to run Vim is always considered flaky. let g:test_is_flaky = 1 @@ -147,8 +147,13 @@ " Wait for all the pending updates to terminal to complete call TermWait(a:buf) + " Wait for the terminal to end. call WaitForAssert({-> assert_equal("finished", term_getstatus(a:buf))}) - only! + + " If the buffer still exists forcefully wipe it. + if a:kill && bufexists(a:buf) + exe a:buf .. 'bwipe!' + endif endfunc " Open a terminal with a shell, assign the job to g:job and return the buffer diff -Nru vim-8.2.1913/src/testdir/test_alot_utf8.vim vim-8.2.2434/src/testdir/test_alot_utf8.vim --- vim-8.2.1913/src/testdir/test_alot_utf8.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/test_alot_utf8.vim 2021-01-30 22:05:11.000000000 +0000 @@ -6,7 +6,6 @@ source test_charsearch_utf8.vim source test_expr_utf8.vim -source test_listlbr_utf8.vim source test_mksession_utf8.vim source test_regexp_utf8.vim source test_source_utf8.vim diff -Nru vim-8.2.1913/src/testdir/test_arglist.vim vim-8.2.2434/src/testdir/test_arglist.vim --- vim-8.2.1913/src/testdir/test_arglist.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/test_arglist.vim 2021-01-30 22:05:11.000000000 +0000 @@ -524,9 +524,10 @@ bwipe Xa.c Xb.c Xc.c endfunc -" Test for quiting Vim with unedited files in the argument list +" Test for quitting Vim with unedited files in the argument list func Test_quit_with_arglist() CheckRunVimInTerminal + let buf = RunVimInTerminal('', {'rows': 6}) call term_sendkeys(buf, ":set nomore\n") call term_sendkeys(buf, ":args a b c\n") @@ -559,4 +560,22 @@ call delete('.c.swp') endfunc +" Test for ":all" not working when in the cmdline window +func Test_all_not_allowed_from_cmdwin() + CheckFeature cmdwin + + au BufEnter * all + next x + " Use try/catch here, somehow assert_fails() doesn't work on MS-Windows + " console. + let caught = 'no' + try + exe ":norm! 7q?apat\" + catch /E11:/ + let caught = 'yes' + endtry + call assert_equal('yes', caught) + au! BufEnter +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff -Nru vim-8.2.1913/src/testdir/test_assert.vim vim-8.2.2434/src/testdir/test_assert.vim --- vim-8.2.1913/src/testdir/test_assert.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/test_assert.vim 2021-01-30 22:05:11.000000000 +0000 @@ -6,11 +6,11 @@ call assert_equal(0, v:false->assert_false()) call assert_equal(1, assert_false(123)) - call assert_match("Expected False but got 123", v:errors[0]) + call assert_match("Expected 'False' but got 123", v:errors[0]) call remove(v:errors, 0) call assert_equal(1, 123->assert_false()) - call assert_match("Expected False but got 123", v:errors[0]) + call assert_match("Expected 'False' but got 123", v:errors[0]) call remove(v:errors, 0) endfunc @@ -21,11 +21,11 @@ call assert_equal(0, v:true->assert_true()) call assert_equal(1, assert_true(0)) - call assert_match("Expected True but got 0", v:errors[0]) + call assert_match("Expected 'True' but got 0", v:errors[0]) call remove(v:errors, 0) call assert_equal(1, 0->assert_true()) - call assert_match("Expected True but got 0", v:errors[0]) + call assert_match("Expected 'True' but got 0", v:errors[0]) call remove(v:errors, 0) endfunc @@ -234,11 +234,11 @@ call remove(v:errors, 0) call assert_equal(1, assert_fails('xxx', ['E9876'])) - call assert_match("Expected \\['E9876'\\] but got 'E492:", v:errors[0]) + call assert_match("Expected 'E9876' but got 'E492:", v:errors[0]) call remove(v:errors, 0) call assert_equal(1, assert_fails('xxx', ['E492:', 'E9876'])) - call assert_match("Expected \\['E492:', 'E9876'\\] but got 'E492:", v:errors[0]) + call assert_match("Expected 'E9876' but got 'E492:", v:errors[0]) call remove(v:errors, 0) call assert_equal(1, assert_fails('echo', '', 'echo command')) diff -Nru vim-8.2.1913/src/testdir/test_autocmd.vim vim-8.2.2434/src/testdir/test_autocmd.vim --- vim-8.2.1913/src/testdir/test_autocmd.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/test_autocmd.vim 2021-01-30 22:05:11.000000000 +0000 @@ -132,19 +132,19 @@ autocmd BufWipeout * call add(s:li, "bufwipeout") augroup END - let s:li=[] + let s:li = [] new setlocal bufhidden= bunload call assert_equal(["bufunload", "bufdelete"], s:li) - let s:li=[] + let s:li = [] new setlocal bufhidden=delete bunload call assert_equal(["bufunload", "bufdelete"], s:li) - let s:li=[] + let s:li = [] new setlocal bufhidden=unload bwipeout @@ -173,6 +173,12 @@ quit endfunc +func Test_argdelete_in_next() + au BufNew,BufEnter,BufLeave,BufWinEnter * argdel + call assert_fails('next a b', 'E1156:') + au! BufNew,BufEnter,BufLeave,BufWinEnter * +endfunc + func Test_autocmd_bufwinleave_with_tabfirst() tabedit augroup sample @@ -194,7 +200,7 @@ exe 'autocmd BufUnload ' . (lastbuf + 1) . 'bwipeout!' augroup END - call assert_fails('edit bb.txt', ['E937:', 'E517:']) + call assert_fails('edit bb.txt', 'E937:') autocmd! test_autocmd_bufunload augroup! test_autocmd_bufunload @@ -214,13 +220,35 @@ normal! i1 call assert_fails('edit a.txt', 'E517:') - call feedkeys("\") autocmd! test_autocmd_bufunload augroup! test_autocmd_bufunload bwipe! a.txt endfunc +func Test_autocmd_dummy_wipeout() + " prepare files + call writefile([''], 'Xdummywipetest1.txt') + call writefile([''], 'Xdummywipetest2.txt') + augroup test_bufunload_group + autocmd! + autocmd BufUnload * call add(s:li, "bufunload") + autocmd BufDelete * call add(s:li, "bufdelete") + autocmd BufWipeout * call add(s:li, "bufwipeout") + augroup END + + let s:li = [] + split Xdummywipetest1.txt + silent! vimgrep /notmatched/ Xdummywipetest* + call assert_equal(["bufunload", "bufwipeout"], s:li) + + bwipeout + call delete('Xdummywipetest1.txt') + call delete('Xdummywipetest2.txt') + au! test_bufunload_group + augroup! test_bufunload_group +endfunc + func Test_win_tab_autocmd() let g:record = [] @@ -300,28 +328,28 @@ augroup TheWarning au VimEnter * echo 'entering' augroup END - call assert_true(match(execute('au VimEnter'), "TheWarning.*VimEnter") >= 0) + call assert_match("TheWarning.*VimEnter", execute('au VimEnter')) redir => res augroup! TheWarning redir END - call assert_true(match(res, "W19:") >= 0) - call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0) + call assert_match("W19:", res) + call assert_match("-Deleted-.*VimEnter", execute('au VimEnter')) " check "Another" does not take the pace of the deleted entry augroup Another augroup END - call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0) + call assert_match("-Deleted-.*VimEnter", execute('au VimEnter')) augroup! Another " no warning for postpone aucmd delete augroup StartOK au VimEnter * call RemoveGroup() augroup END - call assert_true(match(execute('au VimEnter'), "StartOK.*VimEnter") >= 0) + call assert_match("StartOK.*VimEnter", execute('au VimEnter')) redir => res doautocmd VimEnter redir END - call assert_true(match(res, "W19:") < 0) + call assert_notmatch("W19:", res) au! VimEnter call assert_fails('augroup!', 'E471:') @@ -351,7 +379,7 @@ au VimEnter * echo augroup end augroup! x - call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0) + call assert_match("-Deleted-.*VimEnter", execute('au VimEnter')) au! VimEnter endfunc @@ -454,7 +482,7 @@ let content =<< trim [CODE] call test_override('ui_delay', 10) set nocp noswapfile - let v:swapchoice="e" + let v:swapchoice = "e" augroup test_autocmd_sessionload autocmd! autocmd SessionLoadPost * exe bufnr("Xsomething") . "bw!" @@ -477,6 +505,26 @@ endfor endfunc +" Using :blast and :ball for many events caused a crash, because b_nwindows was +" not incremented correctly. +func Test_autocmd_blast_badd() + let content =<< trim [CODE] + au BufNew,BufAdd,BufWinEnter,BufEnter,BufLeave,BufWinLeave,BufUnload,VimEnter foo* blast + edit foo1 + au BufNew,BufAdd,BufWinEnter,BufEnter,BufLeave,BufWinLeave,BufUnload,VimEnter foo* ball + edit foo2 + call writefile(['OK'], 'Xerrors') + qall + [CODE] + + call writefile(content, 'XblastBall') + call system(GetVimCommand() .. ' --clean -S XblastBall') + call assert_match('OK', readfile('Xerrors')->join()) + + call delete('XblastBall') + call delete('Xerrors') +endfunc + " SEGV occurs in older versions. func Test_autocmd_bufwipe_in_SessLoadPost2() tabnew @@ -542,43 +590,43 @@ au OptionSet * :call s:AutoCommandOptionSet(expand("")) " 1: Setting number option" - let g:options=[['number', 0, 0, 0, 1, 'global', 'set']] + let g:options = [['number', 0, 0, 0, 1, 'global', 'set']] set nu call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 2: Setting local number option" - let g:options=[['number', 1, 1, '', 0, 'local', 'setlocal']] + let g:options = [['number', 1, 1, '', 0, 'local', 'setlocal']] setlocal nonu call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 3: Setting global number option" - let g:options=[['number', 1, '', 1, 0, 'global', 'setglobal']] + let g:options = [['number', 1, '', 1, 0, 'global', 'setglobal']] setglobal nonu call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 4: Setting local autoindent option" - let g:options=[['autoindent', 0, 0, '', 1, 'local', 'setlocal']] + let g:options = [['autoindent', 0, 0, '', 1, 'local', 'setlocal']] setlocal ai call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 5: Setting global autoindent option" - let g:options=[['autoindent', 0, '', 0, 1, 'global', 'setglobal']] + let g:options = [['autoindent', 0, '', 0, 1, 'global', 'setglobal']] setglobal ai call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 6: Setting global autoindent option" - let g:options=[['autoindent', 1, 1, 1, 0, 'global', 'set']] + let g:options = [['autoindent', 1, 1, 1, 0, 'global', 'set']] set ai! call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 6a: Setting global autoindent option" - let g:options=[['autoindent', 1, 1, 0, 0, 'global', 'set']] + let g:options = [['autoindent', 1, 1, 0, 0, 'global', 'set']] noa setlocal ai noa setglobal noai set ai! @@ -587,55 +635,55 @@ " Should not print anything, use :noa " 7: don't trigger OptionSet" - let g:options=[['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']] + let g:options = [['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']] noa set nonu call assert_equal([['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']], g:options) call assert_equal(g:opt[0], g:opt[1]) " 8: Setting several global list and number option" - let g:options=[['list', 0, 0, 0, 1, 'global', 'set'], ['number', 0, 0, 0, 1, 'global', 'set']] + let g:options = [['list', 0, 0, 0, 1, 'global', 'set'], ['number', 0, 0, 0, 1, 'global', 'set']] set list nu call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 9: don't trigger OptionSet" - let g:options=[['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid'], ['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']] + let g:options = [['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid'], ['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']] noa set nolist nonu call assert_equal([['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid'], ['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']], g:options) call assert_equal(g:opt[0], g:opt[1]) " 10: Setting global acd" - let g:options=[['autochdir', 0, 0, '', 1, 'local', 'setlocal']] + let g:options = [['autochdir', 0, 0, '', 1, 'local', 'setlocal']] setlocal acd call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 11: Setting global autoread (also sets local value)" - let g:options=[['autoread', 0, 0, 0, 1, 'global', 'set']] + let g:options = [['autoread', 0, 0, 0, 1, 'global', 'set']] set ar call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 12: Setting local autoread" - let g:options=[['autoread', 1, 1, '', 1, 'local', 'setlocal']] + let g:options = [['autoread', 1, 1, '', 1, 'local', 'setlocal']] setlocal ar call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 13: Setting global autoread" - let g:options=[['autoread', 1, '', 1, 0, 'global', 'setglobal']] + let g:options = [['autoread', 1, '', 1, 0, 'global', 'setglobal']] setglobal invar call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 14: Setting option backspace through :let" - let g:options=[['backspace', '', '', '', 'eol,indent,start', 'global', 'set']] - let &bs="eol,indent,start" + let g:options = [['backspace', '', '', '', 'eol,indent,start', 'global', 'set']] + let &bs = "eol,indent,start" call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 15: Setting option backspace through setbufvar()" - let g:options=[['backup', 0, 0, '', 1, 'local', 'setlocal']] + let g:options = [['backup', 0, 0, '', 1, 'local', 'setlocal']] " try twice, first time, shouldn't trigger because option name is invalid, " second time, it should trigger let bnum = bufnr('%') @@ -646,13 +694,13 @@ call assert_equal(g:opt[0], g:opt[1]) " 16: Setting number option using setwinvar" - let g:options=[['number', 0, 0, '', 1, 'local', 'setlocal']] + let g:options = [['number', 0, 0, '', 1, 'local', 'setlocal']] call setwinvar(0, '&number', 1) call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 17: Setting key option, shouldn't trigger" - let g:options=[['key', 'invalid', 'invalid1', 'invalid2', 'invalid3', 'invalid4', 'invalid5']] + let g:options = [['key', 'invalid', 'invalid1', 'invalid2', 'invalid3', 'invalid4', 'invalid5']] setlocal key=blah setlocal key= call assert_equal([['key', 'invalid', 'invalid1', 'invalid2', 'invalid3', 'invalid4', 'invalid5']], g:options) @@ -661,19 +709,19 @@ " 18a: Setting string global option" let oldval = &backupext - let g:options=[['backupext', oldval, oldval, oldval, 'foo', 'global', 'set']] + let g:options = [['backupext', oldval, oldval, oldval, 'foo', 'global', 'set']] set backupext=foo call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 18b: Resetting string global option" - let g:options=[['backupext', 'foo', 'foo', 'foo', oldval, 'global', 'set']] + let g:options = [['backupext', 'foo', 'foo', 'foo', oldval, 'global', 'set']] set backupext& call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 18c: Setting global string global option" - let g:options=[['backupext', oldval, '', oldval, 'bar', 'global', 'setglobal']] + let g:options = [['backupext', oldval, '', oldval, 'bar', 'global', 'setglobal']] setglobal backupext=bar call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -682,7 +730,7 @@ " As this is a global option this sets the global value even though " :setlocal is used! noa set backupext& " Reset global and local value (without triggering autocmd) - let g:options=[['backupext', oldval, oldval, '', 'baz', 'local', 'setlocal']] + let g:options = [['backupext', oldval, oldval, '', 'baz', 'local', 'setlocal']] setlocal backupext=baz call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -690,7 +738,7 @@ " 18e: Setting again string global option" noa setglobal backupext=ext_global " Reset global and local value (without triggering autocmd) noa setlocal backupext=ext_local " Sets the global(!) value! - let g:options=[['backupext', 'ext_local', 'ext_local', 'ext_local', 'fuu', 'global', 'set']] + let g:options = [['backupext', 'ext_local', 'ext_local', 'ext_local', 'fuu', 'global', 'set']] set backupext=fuu call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -698,25 +746,25 @@ " 19a: Setting string local-global (to buffer) option" let oldval = &tags - let g:options=[['tags', oldval, oldval, oldval, 'tagpath', 'global', 'set']] + let g:options = [['tags', oldval, oldval, oldval, 'tagpath', 'global', 'set']] set tags=tagpath call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 19b: Resetting string local-global (to buffer) option" - let g:options=[['tags', 'tagpath', 'tagpath', 'tagpath', oldval, 'global', 'set']] + let g:options = [['tags', 'tagpath', 'tagpath', 'tagpath', oldval, 'global', 'set']] set tags& call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 19c: Setting global string local-global (to buffer) option " - let g:options=[['tags', oldval, '', oldval, 'tagpath1', 'global', 'setglobal']] + let g:options = [['tags', oldval, '', oldval, 'tagpath1', 'global', 'setglobal']] setglobal tags=tagpath1 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 19d: Setting local string local-global (to buffer) option" - let g:options=[['tags', 'tagpath1', 'tagpath1', '', 'tagpath2', 'local', 'setlocal']] + let g:options = [['tags', 'tagpath1', 'tagpath1', '', 'tagpath2', 'local', 'setlocal']] setlocal tags=tagpath2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -726,7 +774,7 @@ " but the old local value for all other kinds of options. noa setglobal tags=tag_global " Reset global and local value (without triggering autocmd) noa setlocal tags=tag_local - let g:options=[['tags', 'tag_global', 'tag_local', 'tag_global', 'tagpath', 'global', 'set']] + let g:options = [['tags', 'tag_global', 'tag_local', 'tag_global', 'tagpath', 'global', 'set']] set tags=tagpath call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -736,7 +784,7 @@ " but the old local value for all other kinds of options. noa set tags=tag_global " Reset global and local value (without triggering autocmd) noa setlocal tags= " empty string - let g:options=[['tags', 'tag_global', '', 'tag_global', 'tagpath', 'global', 'set']] + let g:options = [['tags', 'tag_global', '', 'tag_global', 'tagpath', 'global', 'set']] set tags=tagpath call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -744,26 +792,26 @@ " 20a: Setting string local (to buffer) option" let oldval = &spelllang - let g:options=[['spelllang', oldval, oldval, oldval, 'elvish,klingon', 'global', 'set']] + let g:options = [['spelllang', oldval, oldval, oldval, 'elvish,klingon', 'global', 'set']] set spelllang=elvish,klingon call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 20b: Resetting string local (to buffer) option" - let g:options=[['spelllang', 'elvish,klingon', 'elvish,klingon', 'elvish,klingon', oldval, 'global', 'set']] + let g:options = [['spelllang', 'elvish,klingon', 'elvish,klingon', 'elvish,klingon', oldval, 'global', 'set']] set spelllang& call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 20c: Setting global string local (to buffer) option" - let g:options=[['spelllang', oldval, '', oldval, 'elvish', 'global', 'setglobal']] + let g:options = [['spelllang', oldval, '', oldval, 'elvish', 'global', 'setglobal']] setglobal spelllang=elvish call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 20d: Setting local string local (to buffer) option" noa set spelllang& " Reset global and local value (without triggering autocmd) - let g:options=[['spelllang', oldval, oldval, '', 'klingon', 'local', 'setlocal']] + let g:options = [['spelllang', oldval, oldval, '', 'klingon', 'local', 'setlocal']] setlocal spelllang=klingon call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -773,7 +821,7 @@ " but the old local value for all other kinds of options. noa setglobal spelllang=spellglobal " Reset global and local value (without triggering autocmd) noa setlocal spelllang=spelllocal - let g:options=[['spelllang', 'spelllocal', 'spelllocal', 'spellglobal', 'foo', 'global', 'set']] + let g:options = [['spelllang', 'spelllocal', 'spelllocal', 'spellglobal', 'foo', 'global', 'set']] set spelllang=foo call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -781,7 +829,7 @@ " 21a: Setting string local-global (to window) option" let oldval = &statusline - let g:options=[['statusline', oldval, oldval, oldval, 'foo', 'global', 'set']] + let g:options = [['statusline', oldval, oldval, oldval, 'foo', 'global', 'set']] set statusline=foo call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -789,20 +837,20 @@ " 21b: Resetting string local-global (to window) option" " Note: v:option_old is the old global value for local-global string options " but the old local value for all other kinds of options. - let g:options=[['statusline', 'foo', 'foo', 'foo', oldval, 'global', 'set']] + let g:options = [['statusline', 'foo', 'foo', 'foo', oldval, 'global', 'set']] set statusline& call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 21c: Setting global string local-global (to window) option" - let g:options=[['statusline', oldval, '', oldval, 'bar', 'global', 'setglobal']] + let g:options = [['statusline', oldval, '', oldval, 'bar', 'global', 'setglobal']] setglobal statusline=bar call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 21d: Setting local string local-global (to window) option" noa set statusline& " Reset global and local value (without triggering autocmd) - let g:options=[['statusline', oldval, oldval, '', 'baz', 'local', 'setlocal']] + let g:options = [['statusline', oldval, oldval, '', 'baz', 'local', 'setlocal']] setlocal statusline=baz call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -812,7 +860,7 @@ " but the old local value for all other kinds of options. noa setglobal statusline=bar " Reset global and local value (without triggering autocmd) noa setlocal statusline=baz - let g:options=[['statusline', 'bar', 'baz', 'bar', 'foo', 'global', 'set']] + let g:options = [['statusline', 'bar', 'baz', 'bar', 'foo', 'global', 'set']] set statusline=foo call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -820,26 +868,26 @@ " 22a: Setting string local (to window) option" let oldval = &foldignore - let g:options=[['foldignore', oldval, oldval, oldval, 'fo', 'global', 'set']] + let g:options = [['foldignore', oldval, oldval, oldval, 'fo', 'global', 'set']] set foldignore=fo call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 22b: Resetting string local (to window) option" - let g:options=[['foldignore', 'fo', 'fo', 'fo', oldval, 'global', 'set']] + let g:options = [['foldignore', 'fo', 'fo', 'fo', oldval, 'global', 'set']] set foldignore& call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 22c: Setting global string local (to window) option" - let g:options=[['foldignore', oldval, '', oldval, 'bar', 'global', 'setglobal']] + let g:options = [['foldignore', oldval, '', oldval, 'bar', 'global', 'setglobal']] setglobal foldignore=bar call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 22d: Setting local string local (to window) option" noa set foldignore& " Reset global and local value (without triggering autocmd) - let g:options=[['foldignore', oldval, oldval, '', 'baz', 'local', 'setlocal']] + let g:options = [['foldignore', oldval, oldval, '', 'baz', 'local', 'setlocal']] setlocal foldignore=baz call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -847,7 +895,7 @@ " 22e: Setting again string local (to window) option" noa setglobal foldignore=glob " Reset global and local value (without triggering autocmd) noa setlocal foldignore=loc - let g:options=[['foldignore', 'loc', 'loc', 'glob', 'fo', 'global', 'set']] + let g:options = [['foldignore', 'loc', 'loc', 'glob', 'fo', 'global', 'set']] set foldignore=fo call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -856,7 +904,7 @@ " 23a: Setting global number local option" noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd) noa setlocal cmdheight=1 " Sets the global(!) value! - let g:options=[['cmdheight', '1', '', '1', '2', 'global', 'setglobal']] + let g:options = [['cmdheight', '1', '', '1', '2', 'global', 'setglobal']] setglobal cmdheight=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -864,7 +912,7 @@ " 23b: Setting local number global option" noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd) noa setlocal cmdheight=1 " Sets the global(!) value! - let g:options=[['cmdheight', '1', '1', '', '2', 'local', 'setlocal']] + let g:options = [['cmdheight', '1', '1', '', '2', 'local', 'setlocal']] setlocal cmdheight=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -872,14 +920,14 @@ " 23c: Setting again number global option" noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd) noa setlocal cmdheight=1 " Sets the global(!) value! - let g:options=[['cmdheight', '1', '1', '1', '2', 'global', 'set']] + let g:options = [['cmdheight', '1', '1', '1', '2', 'global', 'set']] set cmdheight=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 23d: Setting again number global option" noa set cmdheight=8 " Reset global and local value (without triggering autocmd) - let g:options=[['cmdheight', '8', '8', '8', '2', 'global', 'set']] + let g:options = [['cmdheight', '8', '8', '8', '2', 'global', 'set']] set cmdheight=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -888,7 +936,7 @@ " 24a: Setting global number global-local (to buffer) option" noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd) noa setlocal undolevels=1 - let g:options=[['undolevels', '8', '', '8', '2', 'global', 'setglobal']] + let g:options = [['undolevels', '8', '', '8', '2', 'global', 'setglobal']] setglobal undolevels=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -896,7 +944,7 @@ " 24b: Setting local number global-local (to buffer) option" noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd) noa setlocal undolevels=1 - let g:options=[['undolevels', '1', '1', '', '2', 'local', 'setlocal']] + let g:options = [['undolevels', '1', '1', '', '2', 'local', 'setlocal']] setlocal undolevels=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -904,14 +952,14 @@ " 24c: Setting again number global-local (to buffer) option" noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd) noa setlocal undolevels=1 - let g:options=[['undolevels', '1', '1', '8', '2', 'global', 'set']] + let g:options = [['undolevels', '1', '1', '8', '2', 'global', 'set']] set undolevels=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 24d: Setting again global number global-local (to buffer) option" noa set undolevels=8 " Reset global and local value (without triggering autocmd) - let g:options=[['undolevels', '8', '8', '8', '2', 'global', 'set']] + let g:options = [['undolevels', '8', '8', '8', '2', 'global', 'set']] set undolevels=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -920,7 +968,7 @@ " 25a: Setting global number local (to buffer) option" noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd) noa setlocal wrapmargin=1 - let g:options=[['wrapmargin', '8', '', '8', '2', 'global', 'setglobal']] + let g:options = [['wrapmargin', '8', '', '8', '2', 'global', 'setglobal']] setglobal wrapmargin=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -928,7 +976,7 @@ " 25b: Setting local number local (to buffer) option" noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd) noa setlocal wrapmargin=1 - let g:options=[['wrapmargin', '1', '1', '', '2', 'local', 'setlocal']] + let g:options = [['wrapmargin', '1', '1', '', '2', 'local', 'setlocal']] setlocal wrapmargin=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -936,14 +984,14 @@ " 25c: Setting again number local (to buffer) option" noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd) noa setlocal wrapmargin=1 - let g:options=[['wrapmargin', '1', '1', '8', '2', 'global', 'set']] + let g:options = [['wrapmargin', '1', '1', '8', '2', 'global', 'set']] set wrapmargin=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 25d: Setting again global number local (to buffer) option" noa set wrapmargin=8 " Reset global and local value (without triggering autocmd) - let g:options=[['wrapmargin', '8', '8', '8', '2', 'global', 'set']] + let g:options = [['wrapmargin', '8', '8', '8', '2', 'global', 'set']] set wrapmargin=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -956,7 +1004,7 @@ " 27a: Setting global number local (to window) option" noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd) noa setlocal foldcolumn=1 - let g:options=[['foldcolumn', '8', '', '8', '2', 'global', 'setglobal']] + let g:options = [['foldcolumn', '8', '', '8', '2', 'global', 'setglobal']] setglobal foldcolumn=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -964,7 +1012,7 @@ " 27b: Setting local number local (to window) option" noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd) noa setlocal foldcolumn=1 - let g:options=[['foldcolumn', '1', '1', '', '2', 'local', 'setlocal']] + let g:options = [['foldcolumn', '1', '1', '', '2', 'local', 'setlocal']] setlocal foldcolumn=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -972,14 +1020,14 @@ " 27c: Setting again number local (to window) option" noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd) noa setlocal foldcolumn=1 - let g:options=[['foldcolumn', '1', '1', '8', '2', 'global', 'set']] + let g:options = [['foldcolumn', '1', '1', '8', '2', 'global', 'set']] set foldcolumn=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 27d: Ssettin again global number local (to window) option" noa set foldcolumn=8 " Reset global and local value (without triggering autocmd) - let g:options=[['foldcolumn', '8', '8', '8', '2', 'global', 'set']] + let g:options = [['foldcolumn', '8', '8', '8', '2', 'global', 'set']] set foldcolumn=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -988,7 +1036,7 @@ " 28a: Setting global boolean global option" noa setglobal nowrapscan " Reset global and local value (without triggering autocmd) noa setlocal wrapscan " Sets the global(!) value! - let g:options=[['wrapscan', '1', '', '1', '0', 'global', 'setglobal']] + let g:options = [['wrapscan', '1', '', '1', '0', 'global', 'setglobal']] setglobal nowrapscan call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -996,7 +1044,7 @@ " 28b: Setting local boolean global option" noa setglobal nowrapscan " Reset global and local value (without triggering autocmd) noa setlocal wrapscan " Sets the global(!) value! - let g:options=[['wrapscan', '1', '1', '', '0', 'local', 'setlocal']] + let g:options = [['wrapscan', '1', '1', '', '0', 'local', 'setlocal']] setlocal nowrapscan call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1004,14 +1052,14 @@ " 28c: Setting again boolean global option" noa setglobal nowrapscan " Reset global and local value (without triggering autocmd) noa setlocal wrapscan " Sets the global(!) value! - let g:options=[['wrapscan', '1', '1', '1', '0', 'global', 'set']] + let g:options = [['wrapscan', '1', '1', '1', '0', 'global', 'set']] set nowrapscan call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 28d: Setting again global boolean global option" noa set nowrapscan " Reset global and local value (without triggering autocmd) - let g:options=[['wrapscan', '0', '0', '0', '1', 'global', 'set']] + let g:options = [['wrapscan', '0', '0', '0', '1', 'global', 'set']] set wrapscan call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1020,7 +1068,7 @@ " 29a: Setting global boolean global-local (to buffer) option" noa setglobal noautoread " Reset global and local value (without triggering autocmd) noa setlocal autoread - let g:options=[['autoread', '0', '', '0', '1', 'global', 'setglobal']] + let g:options = [['autoread', '0', '', '0', '1', 'global', 'setglobal']] setglobal autoread call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1028,7 +1076,7 @@ " 29b: Setting local boolean global-local (to buffer) option" noa setglobal noautoread " Reset global and local value (without triggering autocmd) noa setlocal autoread - let g:options=[['autoread', '1', '1', '', '0', 'local', 'setlocal']] + let g:options = [['autoread', '1', '1', '', '0', 'local', 'setlocal']] setlocal noautoread call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1036,14 +1084,14 @@ " 29c: Setting again boolean global-local (to buffer) option" noa setglobal noautoread " Reset global and local value (without triggering autocmd) noa setlocal autoread - let g:options=[['autoread', '1', '1', '0', '1', 'global', 'set']] + let g:options = [['autoread', '1', '1', '0', '1', 'global', 'set']] set autoread call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 29d: Setting again global boolean global-local (to buffer) option" noa set noautoread " Reset global and local value (without triggering autocmd) - let g:options=[['autoread', '0', '0', '0', '1', 'global', 'set']] + let g:options = [['autoread', '0', '0', '0', '1', 'global', 'set']] set autoread call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1052,7 +1100,7 @@ " 30a: Setting global boolean local (to buffer) option" noa setglobal nocindent " Reset global and local value (without triggering autocmd) noa setlocal cindent - let g:options=[['cindent', '0', '', '0', '1', 'global', 'setglobal']] + let g:options = [['cindent', '0', '', '0', '1', 'global', 'setglobal']] setglobal cindent call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1060,7 +1108,7 @@ " 30b: Setting local boolean local (to buffer) option" noa setglobal nocindent " Reset global and local value (without triggering autocmd) noa setlocal cindent - let g:options=[['cindent', '1', '1', '', '0', 'local', 'setlocal']] + let g:options = [['cindent', '1', '1', '', '0', 'local', 'setlocal']] setlocal nocindent call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1068,14 +1116,14 @@ " 30c: Setting again boolean local (to buffer) option" noa setglobal nocindent " Reset global and local value (without triggering autocmd) noa setlocal cindent - let g:options=[['cindent', '1', '1', '0', '1', 'global', 'set']] + let g:options = [['cindent', '1', '1', '0', '1', 'global', 'set']] set cindent call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 30d: Setting again global boolean local (to buffer) option" noa set nocindent " Reset global and local value (without triggering autocmd) - let g:options=[['cindent', '0', '0', '0', '1', 'global', 'set']] + let g:options = [['cindent', '0', '0', '0', '1', 'global', 'set']] set cindent call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1088,7 +1136,7 @@ " 32a: Setting global boolean local (to window) option" noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd) noa setlocal cursorcolumn - let g:options=[['cursorcolumn', '0', '', '0', '1', 'global', 'setglobal']] + let g:options = [['cursorcolumn', '0', '', '0', '1', 'global', 'setglobal']] setglobal cursorcolumn call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1096,7 +1144,7 @@ " 32b: Setting local boolean local (to window) option" noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd) noa setlocal cursorcolumn - let g:options=[['cursorcolumn', '1', '1', '', '0', 'local', 'setlocal']] + let g:options = [['cursorcolumn', '1', '1', '', '0', 'local', 'setlocal']] setlocal nocursorcolumn call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1104,14 +1152,14 @@ " 32c: Setting again boolean local (to window) option" noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd) noa setlocal cursorcolumn - let g:options=[['cursorcolumn', '1', '1', '0', '1', 'global', 'set']] + let g:options = [['cursorcolumn', '1', '1', '0', '1', 'global', 'set']] set cursorcolumn call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) " 32d: Setting again global boolean local (to window) option" noa set nocursorcolumn " Reset global and local value (without triggering autocmd) - let g:options=[['cursorcolumn', '0', '0', '0', '1', 'global', 'set']] + let g:options = [['cursorcolumn', '0', '0', '0', '1', 'global', 'set']] set cursorcolumn call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1119,7 +1167,7 @@ " 33: Test autocommands when an option value is converted internally. noa set backspace=1 " Reset global and local value (without triggering autocmd) - let g:options=[['backspace', 'indent,eol', 'indent,eol', 'indent,eol', '2', 'global', 'set']] + let g:options = [['backspace', 'indent,eol', 'indent,eol', 'indent,eol', '2', 'global', 'set']] set backspace=2 call assert_equal([], g:options) call assert_equal(g:opt[0], g:opt[1]) @@ -1139,7 +1187,7 @@ call test_override('starting', 1) " 18: Changing an option when entering diff mode new - au OptionSet diff :let &l:cul=v:option_new + au OptionSet diff :let &l:cul = v:option_new call setline(1, ['buffer 1', 'line2', 'line3', 'line4']) call assert_equal(0, &l:cul) @@ -1596,14 +1644,14 @@ endfunc func SetChangeMarks(start, end) - exe a:start. 'mark [' - exe a:end. 'mark ]' + exe a:start .. 'mark [' + exe a:end .. 'mark ]' endfunc " Verify the effects of autocmds on '[ and '] func Test_change_mark_in_autocmds() edit! Xtest - call feedkeys("ia\b\c\d\u", 'xtn') + call feedkeys("ia\b\c\d\u\", 'xtn') call SetChangeMarks(2, 3) write @@ -1689,9 +1737,7 @@ endfunc func Test_Filter_noshelltemp() - if !executable('cat') - return - endif + CheckExecutable cat enew! call setline(1, ['a', 'b', 'c', 'd']) @@ -1760,25 +1806,36 @@ call assert_equal({}, v:event) + if has('clipboard_working') && !has('gui_running') + " Test that when the visual selection is automatically copied to clipboard + " register a TextYankPost is emitted + call setline(1, ['foobar']) + + let @* = '' + set clipboard=autoselect + exe "norm! ggviw\" + call assert_equal( + \{'regcontents': ['foobar'], 'regname': '*', 'operator': 'y', 'regtype': 'v', 'visual': v:true}, + \g:event) + + let @+ = '' + set clipboard=autoselectplus + exe "norm! ggviw\" + call assert_equal( + \{'regcontents': ['foobar'], 'regname': '+', 'operator': 'y', 'regtype': 'v', 'visual': v:true}, + \g:event) + + set clipboard&vim + endif + au! TextYankPost unlet g:event bwipe! endfunc -func Test_nocatch_wipe_all_buffers() - " Real nasty autocommand: wipe all buffers on any event. - au * * bwipe * - call assert_fails('next x', ['E94:', 'E517:']) - bwipe - au! -endfunc - -func Test_nocatch_wipe_dummy_buffer() - CheckFeature quickfix - " Nasty autocommand: wipe buffer on any event. - au * x bwipe - call assert_fails('lv½ /x', 'E937:') - au! +func Test_autocommand_all_events() + call assert_fails('au * * bwipe', 'E1155:') + call assert_fails('au * x bwipe', 'E1155:') endfunc function s:Before_test_dirchanged() @@ -2304,7 +2361,7 @@ call writefile(lines, 'XSafeState') let buf = RunVimInTerminal('-S XSafeState', #{rows: 6}) - " Sometimes we loop to handle a K_IGNORE, SafeState may be trigered once or + " Sometimes we loop to handle a K_IGNORE, SafeState may be triggered once or " more often. call term_sendkeys(buf, ":echo g:safe\") call WaitForAssert({-> assert_match('^\d ', term_getline(buf, 6))}, 1000) @@ -2326,16 +2383,14 @@ func Test_autocmd_CmdWinEnter() CheckRunVimInTerminal - " There is not cmdwin switch, so - " test for cmdline_hist - " (both are available with small builds) - CheckFeature cmdline_hist + CheckFeature cmdwin + let lines =<< trim END let b:dummy_var = 'This is a dummy' autocmd CmdWinEnter * quit let winnr = winnr('$') END - let filename='XCmdWinEnter' + let filename = 'XCmdWinEnter' call writefile(lines, filename) let buf = RunVimInTerminal('-S '.filename, #{rows: 6}) diff -Nru vim-8.2.1913/src/testdir/test_backspace_opt.vim vim-8.2.2434/src/testdir/test_backspace_opt.vim --- vim-8.2.1913/src/testdir/test_backspace_opt.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/test_backspace_opt.vim 2021-01-30 22:05:11.000000000 +0000 @@ -1,15 +1,5 @@ " Tests for 'backspace' settings -func Exec(expr) - let str='' - try - exec a:expr - catch /.*/ - let str=v:exception - endtry - return str -endfunc - func Test_backspace_option() set backspace= call assert_equal('', &backspace) @@ -41,10 +31,10 @@ set backspace-=eol call assert_equal('', &backspace) " Check the error - call assert_equal(0, match(Exec('set backspace=ABC'), '.*E474:')) - call assert_equal(0, match(Exec('set backspace+=def'), '.*E474:')) + call assert_fails('set backspace=ABC', 'E474:') + call assert_fails('set backspace+=def', 'E474:') " NOTE: Vim doesn't check following error... - "call assert_equal(0, match(Exec('set backspace-=ghi'), '.*E474:')) + "call assert_fails('set backspace-=ghi', 'E474:') " Check backwards compatibility with version 5.4 and earlier set backspace=0 @@ -55,8 +45,8 @@ call assert_equal('2', &backspace) set backspace=3 call assert_equal('3', &backspace) - call assert_false(match(Exec('set backspace=4'), '.*E474:')) - call assert_false(match(Exec('set backspace=10'), '.*E474:')) + call assert_fails('set backspace=4', 'E474:') + call assert_fails('set backspace=10', 'E474:') " Cleared when 'compatible' is set set compatible diff -Nru vim-8.2.1913/src/testdir/test_buffer.vim vim-8.2.2434/src/testdir/test_buffer.vim --- vim-8.2.1913/src/testdir/test_buffer.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/test_buffer.vim 2021-01-30 22:05:11.000000000 +0000 @@ -374,4 +374,11 @@ bwipe! SomeNewBuffer endfunc +func Test_balt() + new SomeNewBuffer + balt +3 OtherBuffer + e # + call assert_equal('OtherBuffer', bufname()) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff -Nru vim-8.2.1913/src/testdir/test_channel.vim vim-8.2.2434/src/testdir/test_channel.vim --- vim-8.2.1913/src/testdir/test_channel.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/test_channel.vim 2021-01-30 22:05:11.000000000 +0000 @@ -2181,18 +2181,21 @@ else let cmd = 'grep foo' endif + let g:job = job_start(cmd, {}) + sleep 50m " give the job time to start call job_stop(g:job) - sleep 50m - call assert_equal(-1, job_info(g:job).exitval) + call WaitForAssert({-> assert_equal(-1, job_info(g:job).exitval)}) + let g:job = job_start(cmd, {}) - call job_stop(g:job, 'term') sleep 50m - call assert_equal(-1, job_info(g:job).exitval) + call job_stop(g:job, 'term') + call WaitForAssert({-> assert_equal(-1, job_info(g:job).exitval)}) + let g:job = job_start(cmd, {}) - call job_stop(g:job, 'kill') sleep 50m - call assert_equal(-1, job_info(g:job).exitval) + call job_stop(g:job, 'kill') + call WaitForAssert({-> assert_equal(-1, job_info(g:job).exitval)}) endfunc func Test_issue_5485() @@ -2301,8 +2304,14 @@ func Test_cb_with_input() let g:wait_exit_cb = 1 - call job_start('echo "Vim''s test"', - \ {'out_cb': 'ExitCb_cb_with_input'}) + if has('win32') + let cmd = 'cmd /c echo "Vim''s test"' + else + let cmd = 'echo "Vim''s test"' + endif + + let job = job_start(cmd, {'out_cb': 'ExitCb_cb_with_input'}) + call WaitFor({-> job_status(job) == "dead"}) call WaitForAssert({-> assert_equal(0, g:wait_exit_cb)}) unlet g:wait_exit_cb diff -Nru vim-8.2.1913/src/testdir/test_clientserver.vim vim-8.2.2434/src/testdir/test_clientserver.vim --- vim-8.2.1913/src/testdir/test_clientserver.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/test_clientserver.vim 2021-01-30 22:05:11.000000000 +0000 @@ -63,8 +63,9 @@ call remote_send(name, ":gui -f\") endif " Wait for the server to be up and answering requests. - sleep 100m - call WaitForAssert({-> assert_true(name->remote_expr("v:version", "", 1) != "")}) + " When using valgrind this can be very, very slow. + sleep 1 + call WaitForAssert({-> assert_match('\d', name->remote_expr("v:version", "", 1))}, 10000) call remote_send(name, ":let testvar = 'maybe'\") call WaitForAssert({-> assert_equal('maybe', remote_expr(name, "testvar", "", 2))}) @@ -72,6 +73,16 @@ call assert_fails('call remote_send("XXX", ":let testvar = ''yes''\")', 'E241:') + call writefile(['one'], 'Xclientfile') + let cmd = GetVimProg() .. ' --servername ' .. name .. ' --remote Xclientfile' + call system(cmd) + call WaitForAssert({-> assert_equal('Xclientfile', remote_expr(name, "bufname()", "", 2))}) + call WaitForAssert({-> assert_equal('one', remote_expr(name, "getline(1)", "", 2))}) + call writefile(['one', 'two'], 'Xclientfile') + call system(cmd) + call WaitForAssert({-> assert_equal('two', remote_expr(name, "getline(2)", "", 2))}) + call delete('Xclientfile') + " Expression evaluated locally. if v:servername == '' eval 'MYSELF'->remote_startserver() @@ -124,19 +135,19 @@ " Edit multiple files using --remote call system(cmd .. ' --remote Xfile1 Xfile2 Xfile3') - call assert_equal("Xfile1\nXfile2\nXfile3\n", remote_expr(name, 'argv()')) + call assert_match(".*Xfile1\n.*Xfile2\n.*Xfile3\n", remote_expr(name, 'argv()')) eval name->remote_send(":%bw!\") " Edit files in separate tab pages call system(cmd .. ' --remote-tab Xfile1 Xfile2 Xfile3') call WaitForAssert({-> assert_equal('3', remote_expr(name, 'tabpagenr("$")'))}) - call assert_equal('Xfile2', remote_expr(name, 'bufname(tabpagebuflist(2)[0])')) + call assert_match('.*\remote_send(":%bw!\") " Edit a file using --remote-wait eval name->remote_send(":source $VIMRUNTIME/plugin/rrhelper.vim\") call system(cmd .. ' --remote-wait +enew Xfile1') - call assert_equal("Xfile1", remote_expr(name, 'bufname("#")')) + call assert_match('.*\remote_send(":%bw!\") " Edit files using --remote-tab-wait diff -Nru vim-8.2.1913/src/testdir/test_cmdline.vim vim-8.2.2434/src/testdir/test_cmdline.vim --- vim-8.2.1913/src/testdir/test_cmdline.vim 2020-10-27 19:43:26.000000000 +0000 +++ vim-8.2.2434/src/testdir/test_cmdline.vim 2021-01-30 22:05:11.000000000 +0000 @@ -58,6 +58,22 @@ call feedkeys(":e Xdir1/\\\\\", 'tx') call assert_equal('testfile1', getline(1)) + " this fails in some Unix GUIs, not sure why + if !has('unix') || !has('gui_running') + " / mappings to go up/down directories when 'wildcharm' is + " different than 'wildchar'. + set wildcharm= + cnoremap + cnoremap + call feedkeys(":e Xdir1/\\\", 'tx') + call assert_equal('testfile3', getline(1)) + call feedkeys(":e Xdir1/\\\\", 'tx') + call assert_equal('testfile1', getline(1)) + set wildcharm=0 + cunmap + cunmap + endif + " Test for canceling the wild menu by adding a character redrawstatus call feedkeys(":e Xdir1/\x\\"\", 'xt') @@ -84,7 +100,7 @@ call delete('Xdir1', 'd') set nowildmenu endfunc -f + func Test_wildmenu_screendump() CheckScreendump @@ -112,9 +128,7 @@ call delete('XTest_wildmenu') endfunc - func Test_map_completion() - CheckFeature cmdline_compl call feedkeys(":map \\"\", 'xt') call assert_equal('"map ', getreg(':')) call feedkeys(":map