diff options
293 files changed, 22485 insertions, 12630 deletions
diff --git a/.builds/freebsd.yml b/.builds/freebsd.yml index 2d06b1e685..4be49fd153 100644 --- a/.builds/freebsd.yml +++ b/.builds/freebsd.yml @@ -23,6 +23,11 @@ environment: CMAKE_EXTRA_FLAGS: -DCI_BUILD=ON -DMIN_LOG_LEVEL=3 tasks: +- should-run: | + if ! git -C neovim diff --name-only HEAD^! | grep -E -v "^(.github|runtime/doc/.*)" >/dev/null; then + echo "Skipping build because only ignored files were changed" + complete-build + fi - build-deps: | cd neovim gmake deps diff --git a/.builds/openbsd.yml b/.builds/openbsd.yml index 0aaa003820..6263c436ae 100644 --- a/.builds/openbsd.yml +++ b/.builds/openbsd.yml @@ -23,6 +23,11 @@ environment: CMAKE_EXTRA_FLAGS: -DCI_BUILD=ON -DMIN_LOG_LEVEL=3 tasks: +- should-run: | + if ! git -C neovim diff --name-only HEAD^! | grep -E -v "^(.github|runtime/doc/.*)" >/dev/null; then + echo "Skipping build because only ignored files were changed" + complete-build + fi - build-deps: | export AUTOCONF_VERSION=2.71 export AUTOMAKE_VERSION=1.16 diff --git a/.editorconfig b/.editorconfig index 5a5fba37ac..2aa956b1fc 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,14 +6,10 @@ indent_size = 2 tab_width = 8 end_of_line = lf insert_final_newline = true -charset = utf-8 [*.{c,h,in,lua}] max_line_length = 100 -[*.{vim,po}] -charset = unset - [{Makefile,**/Makefile,runtime/doc/*.txt}] indent_style = tab indent_size = 8 diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index fce35b54ee..c3078cfd35 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -47,6 +47,7 @@ a68faed02dc8e37b8f10da14dc02e33e6ed93947 ee031eb5256bb83e0d6add2bae6fd943a4186ffe 69e11b58b4db0952f11a5ff85aa7150b5f5b8db8 271bb32855853b011fceaf0ad2f829bce66b2a19 +aefdc6783cb77f09786542c90901a9e7120bea42 # typos d238b8f6003d34cae7f65ff7585b48a2cd9449fb diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1aa0906ffc..9a98c6097c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,7 +5,6 @@ on: - 'master' - 'release-[0-9]+.[0-9]+' pull_request: - types: [opened, synchronize, reopened, ready_for_review] branches: - 'master' - 'release-[0-9]+.[0-9]+' @@ -24,7 +23,7 @@ jobs: # we are able to build neovim without pigeonholing ourselves into specifics # of the bundled dependencies. - if: (github.event_name == 'pull_request' && github.base_ref == 'master' && !github.event.pull_request.draft) || (github.event_name == 'push' && github.ref == 'refs/heads/master') + if: (github.event_name == 'pull_request' && github.base_ref == 'master') || (github.event_name == 'push' && github.ref == 'refs/heads/master') runs-on: ubuntu-20.04 timeout-minutes: 10 env: @@ -47,7 +46,6 @@ jobs: cmake \ flake8 \ gettext \ - gperf \ libluajit-5.1-dev \ libmsgpack-dev \ libtermkey-dev \ @@ -87,6 +85,13 @@ jobs: run: ./ci/run_lint.sh clint-full - if: "!cancelled()" + name: stylua + uses: JohnnyMorganz/stylua-action@1.0.0 + with: + token: ${{ secrets.GITHUB_TOKEN }} + args: --check runtime/ + + - if: "!cancelled()" name: lualint run: ./ci/run_lint.sh lualint @@ -142,7 +147,6 @@ jobs: cmake: minimum_required runs-on: ${{ matrix.runner }} timeout-minutes: 45 - if: github.event.pull_request.draft == false env: CC: ${{ matrix.cc }} CI_OS_NAME: ${{ matrix.os }} @@ -156,7 +160,7 @@ jobs: if: matrix.os == 'linux' run: | sudo apt-get update - sudo apt-get install -y autoconf automake build-essential ccache cmake cpanminus cscope gcc-multilib gdb gettext gperf language-pack-tr libtool-bin locales ninja-build pkg-config python3 python3-pip python3-setuptools unzip valgrind xclip + sudo apt-get install -y autoconf automake build-essential ccache cmake cpanminus cscope gcc-multilib gdb gettext language-pack-tr libtool-bin locales ninja-build pkg-config python3 python3-pip python3-setuptools unzip valgrind xclip - name: Install minimum required version of cmake if: matrix.cmake == 'minimum_required' @@ -229,25 +233,19 @@ jobs: windows: runs-on: windows-2019 timeout-minutes: 45 - if: github.event.pull_request.draft == false env: DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }} DEPS_PREFIX: ${{ format('{0}/nvim-deps/usr', github.workspace) }} - - strategy: - fail-fast: false - matrix: - config: [ MINGW_64-gcov, MSVC_64 ] - name: windows (${{ matrix.config }}) + name: windows (MSVC_64) steps: - uses: actions/checkout@v2 - uses: actions/cache@v2 with: path: ${{ env.DEPS_BUILD_DIR }} - key: ${{ matrix.config }}-${{ hashFiles('third-party\**') }} + key: ${{ hashFiles('third-party\**') }} - name: Run CI run: powershell ci\build.ps1 env: - CONFIGURATION: ${{ matrix.config }} + CONFIGURATION: MSVC_64 diff --git a/.github/workflows/coverity-scan.yml b/.github/workflows/coverity-scan.yml index 7c885f8b88..a6eef47645 100644 --- a/.github/workflows/coverity-scan.yml +++ b/.github/workflows/coverity-scan.yml @@ -1,7 +1,7 @@ name: Coverity on: schedule: - - cron: '0 10 * * 1' # Run every Monday at 00:10 + - cron: '10 0 * * 1' # Run every Monday at 00:10 workflow_dispatch: jobs: @@ -13,7 +13,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y autoconf automake build-essential cmake gettext gperf libtool-bin locales ninja-build pkg-config unzip + sudo apt-get install -y autoconf automake build-essential cmake gettext libtool-bin locales ninja-build pkg-config unzip - name: Download Coverity run: | diff --git a/.github/workflows/env.sh b/.github/workflows/env.sh index ca1194efa9..fe7543510e 100755 --- a/.github/workflows/env.sh +++ b/.github/workflows/env.sh @@ -25,7 +25,7 @@ CCACHE_SLOPPINESS=time_macros,file_macro CCACHE_DIR=$HOME/.ccache EOF -DEPS_CMAKE_FLAGS=-DUSE_BUNDLED_GPERF=OFF +DEPS_CMAKE_FLAGS= FUNCTIONALTEST=functionaltest BUILD_FLAGS="CMAKE_FLAGS=-DCI_BUILD=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX:PATH=$HOME/nvim-install -DBUSTED_OUTPUT_TYPE=nvim -DDEPS_PREFIX=$HOME/nvim-deps/usr -DMIN_LOG_LEVEL=3" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index be93cd0245..a95b57a657 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,7 +27,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y autoconf automake build-essential cmake gcc-11 gettext gperf libtool-bin locales ninja-build pkg-config unzip + sudo apt-get install -y autoconf automake build-essential cmake gcc-11 gettext libtool-bin locales ninja-build pkg-config unzip - if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly') run: printf 'NVIM_BUILD_TYPE=Release\n' >> $GITHUB_ENV - if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly') @@ -61,7 +61,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y autoconf automake build-essential cmake gcc-11 gettext gperf libtool-bin locales ninja-build pkg-config unzip + sudo apt-get install -y autoconf automake build-essential cmake gcc-11 gettext libtool-bin locales ninja-build pkg-config unzip - if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly') run: CC=gcc-11 make appimage-latest - if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly') diff --git a/.stylua.toml b/.stylua.toml new file mode 100644 index 0000000000..255bfd939d --- /dev/null +++ b/.stylua.toml @@ -0,0 +1,6 @@ +column_width = 120 +line_endings = "Unix" +indent_type = "Spaces" +indent_width = 2 +quote_style = "AutoPreferSingle" +call_parentheses = "Always" diff --git a/.styluaignore b/.styluaignore new file mode 100644 index 0000000000..c1871de90a --- /dev/null +++ b/.styluaignore @@ -0,0 +1,3 @@ +/scripts +/src +/test diff --git a/.travis.yml b/.travis.yml index ec7e19b2f9..e52b53bf90 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,6 @@ env: -DBUSTED_OUTPUT_TYPE=nvim -DDEPS_PREFIX=$DEPS_BUILD_DIR/usr -DMIN_LOG_LEVEL=3" - - DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_GPERF=OFF" # Environment variables for Clang sanitizers. - ASAN_OPTIONS="detect_leaks=1:check_initialization_order=1:log_path=$LOG_DIR/asan" - TSAN_OPTIONS="log_path=$LOG_DIR/tsan" @@ -75,7 +74,6 @@ addons: - cscope - gcc-multilib - gdb - - gperf - language-pack-tr - libtool-bin - locales diff --git a/CMakeLists.txt b/CMakeLists.txt index 01df172ed4..19c81ffcbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,14 +108,7 @@ endif() option(ENABLE_LIBINTL "enable libintl" ON) option(ENABLE_LIBICONV "enable libiconv" ON) -if (MINGW) - # Disable LTO by default as it may not compile - # See https://github.com/Alexpux/MINGW-packages/issues/3516 - # and https://github.com/neovim/neovim/pull/8654#issuecomment-402316672 - option(ENABLE_LTO "enable link time optimization" OFF) -else() - option(ENABLE_LTO "enable link time optimization" ON) -endif() +option(ENABLE_LTO "enable link time optimization" ON) message(STATUS "CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}") @@ -322,10 +315,6 @@ else() endif() endif() -if(MINGW) - # Use POSIX compatible stdio in Mingw - add_definitions(-D__USE_MINGW_ANSI_STDIO) -endif() if(WIN32) # Windows Vista is the minimum supported version add_definitions(-D_WIN32_WINNT=0x0600) @@ -614,7 +603,6 @@ endif() find_program(LUACHECK_PRG luacheck) find_program(FLAKE8_PRG flake8) -find_program(GPERF_PRG gperf) include(InstallHelpers) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 078377dcc2..e26d0d63c5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -92,7 +92,7 @@ the VCS/git logs more valuable. The general structure of a commit message is: ``` - Prefix the commit subject with one of these [_types_](https://github.com/commitizen/conventional-commit-types/blob/master/index.json): - - `build`, `ci`, `docs`, `feat`, `fix`, `perf`, `refactor`, `revert`, `test`, `vim-patch`, `chore` + - `build`, `ci`, `docs`, `feat`, `fix`, `perf`, `refactor`, `revert`, `test`, `vim-patch`, `dist` - You can **ignore this for "fixup" commits** or any commits you expect to be squashed. - Append optional scope to _type_ such as `(lsp)`, `(treesitter)`, `(float)`, … - _Description_ shouldn't start with a capital letter or end in a period. @@ -146,9 +146,16 @@ functionaltest: | nvim functionaltest-lua: | nvim +$(BUILD_TOOL) -C build functionaltest-lua +stylua: + stylua --check runtime/ + lualint: | build/.ran-cmake deps $(BUILD_TOOL) -C build lualint +_opt_stylua: + @command -v stylua && { $(MAKE) stylua; exit $$?; } \ + || echo "SKIP: stylua (stylua not found)" + shlint: @shellcheck --version | head -n 2 shellcheck scripts/vim-patch.sh @@ -214,7 +221,7 @@ appimage: appimage-%: bash scripts/genappimage.sh $* -lint: check-single-includes clint lualint _opt_pylint _opt_shlint _opt_commitlint +lint: check-single-includes clint _opt_stylua lualint _opt_pylint _opt_shlint _opt_commitlint # Generic pattern rules, allowing for `make build/bin/nvim` etc. # Does not work with "Unix Makefiles". @@ -226,4 +233,4 @@ $(DEPS_BUILD_DIR)/%: phony_force $(BUILD_TOOL) -C $(DEPS_BUILD_DIR) $(patsubst $(DEPS_BUILD_DIR)/%,%,$@) endif -.PHONY: test lualint pylint shlint functionaltest unittest lint clint clean distclean nvim libnvim cmake deps install appimage checkprefix commitlint +.PHONY: test stylua lualint pylint shlint functionaltest unittest lint clint clean distclean nvim libnvim cmake deps install appimage checkprefix commitlint diff --git a/ci/build.ps1 b/ci/build.ps1 index 533e5804c9..99f66f7de2 100644 --- a/ci/build.ps1 +++ b/ci/build.ps1 @@ -40,55 +40,14 @@ if (-Not (Test-Path -PathType container $env:DEPS_BUILD_DIR)) { write-host "cache dir $($env:DEPS_BUILD_DIR) size: $(Get-ChildItem $env:DEPS_BUILD_DIR -recurse | Measure-Object -property length -sum | Select -expand sum)" } -if ($compiler -eq 'MINGW') { - if ($bits -eq 32) { - $arch = 'i686' - } - elseif ($bits -eq 64) { - $arch = 'x86_64' - } - if ($compileOption -eq 'gcov') { - $nvimCmakeVars['USE_GCOV'] = 'ON' - $uploadToCodecov = $true - $env:GCOV = "C:\msys64\mingw$bits\bin\gcov" - - # Setup/build Lua coverage. - $env:USE_LUACOV = 1 - $env:BUSTED_ARGS = "--coverage" - } - # These are native MinGW builds, but they use the toolchain inside - # MSYS2, this allows using all the dependencies and tools available - # in MSYS2, but we cannot build inside the MSYS2 shell. - $cmakeGenerator = 'Ninja' - $cmakeGeneratorArgs = '-v' - $mingwPackages = @('ninja', 'cmake', 'diffutils').ForEach({ - "mingw-w64-$arch-$_" - }) - - # Add MinGW to the PATH - $env:PATH = "C:\msys64\mingw$bits\bin;$env:PATH" - - # Avoid pacman "warning" which causes non-zero return code. https://github.com/open62541/open62541/issues/2068 - & C:\msys64\usr\bin\mkdir -p /var/cache/pacman/pkg - - # Build third-party dependencies - C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm -Syu" ; exitIfFailed - # Update again in case updating pacman changes pacman.conf - C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm -Syu" ; exitIfFailed - C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm --needed -S $mingwPackages" ; exitIfFailed -} -elseif ($compiler -eq 'MSVC') { - $cmakeGeneratorArgs = '/verbosity:normal' - $cmakeGenerator = 'Visual Studio 16 2019' -} - -if ($compiler -eq 'MSVC') { - $installationPath = vswhere.exe -latest -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath - if ($installationPath -and (test-path "$installationPath\Common7\Tools\vsdevcmd.bat")) { - & "${env:COMSPEC}" /s /c "`"$installationPath\Common7\Tools\vsdevcmd.bat`" -arch=x${bits} -no_logo && set" | foreach-object { - $name, $value = $_ -split '=', 2 - set-content env:\"$name" $value - } +$cmakeGeneratorArgs = '/verbosity:normal' +$cmakeGenerator = 'Visual Studio 16 2019' + +$installationPath = vswhere.exe -latest -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath +if ($installationPath -and (test-path "$installationPath\Common7\Tools\vsdevcmd.bat")) { + & "${env:COMSPEC}" /s /c "`"$installationPath\Common7\Tools\vsdevcmd.bat`" -arch=x${bits} -no_logo && set" | foreach-object { + $name, $value = $_ -split '=', 2 + set-content env:\"$name" $value } } @@ -111,14 +70,10 @@ function convertToCmakeArgs($vars) { } cd $env:DEPS_BUILD_DIR -if ($compiler -eq 'MSVC') { - if ($bits -eq 32) { - cmake -G $cmakeGenerator -A Win32 $(convertToCmakeArgs($depsCmakeVars)) "$buildDir/third-party/" ; exitIfFailed - } else { - cmake -G $cmakeGenerator -A x64 $(convertToCmakeArgs($depsCmakeVars)) "$buildDir/third-party/" ; exitIfFailed - } +if ($bits -eq 32) { + cmake -G $cmakeGenerator -A Win32 $(convertToCmakeArgs($depsCmakeVars)) "$buildDir/third-party/" ; exitIfFailed } else { - cmake -G $cmakeGenerator $(convertToCmakeArgs($depsCmakeVars)) "$buildDir/third-party/" ; exitIfFailed + cmake -G $cmakeGenerator -A x64 $(convertToCmakeArgs($depsCmakeVars)) "$buildDir/third-party/" ; exitIfFailed } cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed cd $buildDir @@ -126,14 +81,10 @@ cd $buildDir # Build Neovim mkdir build cd build -if ($compiler -eq 'MSVC') { - if ($bits -eq 32) { - cmake -G $cmakeGenerator -A Win32 $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed - } else { - cmake -G $cmakeGenerator -A x64 $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed - } +if ($bits -eq 32) { + cmake -G $cmakeGenerator -A Win32 $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed } else { - cmake -G $cmakeGenerator $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed + cmake -G $cmakeGenerator -A x64 $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed } cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed .\bin\nvim --version ; exitIfFailed diff --git a/cmake/FindLuaJit.cmake b/cmake/FindLuaJit.cmake index 72795afefd..c904347f6a 100644 --- a/cmake/FindLuaJit.cmake +++ b/cmake/FindLuaJit.cmake @@ -17,8 +17,6 @@ find_path(LUAJIT_INCLUDE_DIR luajit.h if(MSVC) list(APPEND LUAJIT_NAMES lua51) -elseif(MINGW) - list(APPEND LUAJIT_NAMES libluajit libluajit-5.1) else() list(APPEND LUAJIT_NAMES luajit-5.1) endif() diff --git a/man/nvim.1 b/man/nvim.1 index 43dfc21dc7..9f35014ee8 100644 --- a/man/nvim.1 +++ b/man/nvim.1 @@ -188,7 +188,7 @@ loading plugins is also skipped. Use .Ar shada instead of the default -.Pa ~/.local/share/nvim/shada/main.shada . +.Pa ~/.local/state/nvim/shada/main.shada . If .Ar shada is @@ -326,7 +326,7 @@ Print version information and exit. .Sh ENVIRONMENT .Bl -tag -width Fl .It Ev NVIM_LOG_FILE -Low-level log file, usually found at ~/.cache/nvim/log. +Low-level log file, usually found at ~/.local/state/nvim/log. :help $NVIM_LOG_FILE .It Ev VIM Used to locate user files, such as init.vim. @@ -340,12 +340,20 @@ Path to the user-local configuration directory, see Defaults to .Pa ~/.config . :help xdg -.It Ev XDG_DATA_HOME +.It Ev XDG_STATE_HOME Like .Ev XDG_CONFIG_HOME , but used to store data not generally edited by the user, namely swap, backup, and ShaDa files. Defaults to +.Pa ~/.local/state . +:help xdg +.It Ev XDG_DATA_HOME +Like +.Ev XDG_CONFIG_HOME , +but used to store data not generally edited by the user, +things like runtime files. +Defaults to .Pa ~/.local/share . :help xdg .It Ev VIMINIT diff --git a/runtime/autoload/health/nvim.vim b/runtime/autoload/health/nvim.vim index f3732e012f..9b387095ee 100644 --- a/runtime/autoload/health/nvim.vim +++ b/runtime/autoload/health/nvim.vim @@ -45,7 +45,7 @@ function! s:check_config() abort let shadafile = empty(&shada) ? &shada : substitute(matchstr( \ split(&shada, ',')[-1], '^n.\+'), '^n', '', '') let shadafile = empty(&shadafile) ? empty(shadafile) ? - \ stdpath('data').'/shada/main.shada' : expand(shadafile) + \ stdpath('state').'/shada/main.shada' : expand(shadafile) \ : &shadafile ==# 'NONE' ? '' : &shadafile if !empty(shadafile) && empty(glob(shadafile)) " Since this may be the first time neovim has been run, we will try to diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim index 4d6a1f78dc..b8a73a64c9 100644 --- a/runtime/autoload/man.vim +++ b/runtime/autoload/man.vim @@ -125,9 +125,7 @@ endfunction function! s:set_options(pager) abort setlocal noswapfile buftype=nofile bufhidden=hide setlocal nomodified readonly nomodifiable - if a:pager - nnoremap <silent> <buffer> <nowait> q :lclose<CR>:q<CR> - endif + let b:pager = a:pager setlocal filetype=man endfunction @@ -173,6 +171,12 @@ function! man#show_toc() abort while lnum && lnum < last_line let text = getline(lnum) if text =~# '^\%( \{3\}\)\=\S.*$' + " if text is a section title + call add(toc, {'bufnr': bufnr('%'), 'lnum': lnum, 'text': text}) + elseif text =~# '^\s\+\%(+\|-\)\S\+' + " if text is a flag title. we strip whitespaces and prepend two + " spaces to have a consistent format in the loclist. + let text = ' ' .. substitute(text, '^\s*\(.\{-}\)\s*$', '\1', '') call add(toc, {'bufnr': bufnr('%'), 'lnum': lnum, 'text': text}) endif let lnum = nextnonblank(lnum + 1) diff --git a/runtime/colors/README.txt b/runtime/colors/README.txt index 70aacb5384..bda0300678 100644 --- a/runtime/colors/README.txt +++ b/runtime/colors/README.txt @@ -1,7 +1,7 @@ README.txt for color scheme files These files are used for the ":colorscheme" command. They appear in the -Edit/Color Scheme menu in the GUI. +"Edit/Color Scheme" menu in the GUI. Hints for writing a color scheme file: @@ -9,6 +9,7 @@ Hints for writing a color scheme file: There are two basic ways to define a color scheme: 1. Define a new Normal color and set the 'background' option accordingly. + set background={light or dark} highlight clear highlight Normal ... @@ -16,6 +17,7 @@ There are two basic ways to define a color scheme: 2. Use the default Normal color and automatically adjust to the value of 'background'. + highlight clear Normal set background& highlight clear @@ -28,7 +30,7 @@ There are two basic ways to define a color scheme: endif You can use ":highlight clear" to reset everything to the defaults, and then -change the groups that you want differently. This also will work for groups +change the groups that you want differently. This will also work for groups that are added in later versions of Vim. Note that ":highlight clear" uses the value of 'background', thus set it before this command. @@ -38,7 +40,9 @@ attributes. In case you want to set 'background' depending on the colorscheme selected, this autocmd might be useful: + autocmd SourcePre */colors/blue_sky.vim set background=dark + Replace "blue_sky" with the name of the colorscheme. In case you want to tweak a colorscheme after it was loaded, check out the @@ -46,6 +50,7 @@ ColorScheme autocommand event. To clean up just before loading another colorscheme, use the ColorSchemePre autocommand event. For example: + let g:term_ansi_colors = ... augroup MyColorscheme au! @@ -54,36 +59,80 @@ autocommand event. For example: augroup END To customize a colorscheme use another name, e.g. "~/.vim/colors/mine.vim", -and use `:runtime` to load the original colorscheme: +and use ":runtime" to load the original colorscheme: + " load the "evening" colorscheme runtime colors/evening.vim " change the color of statements hi Statement ctermfg=Blue guifg=Blue -To see which highlight group is used where, find the help for -"highlight-groups" and "group-name". +To see which highlight group is used where, see ":help highlight-groups" and +":help group-name". You can use ":highlight" to find out the current colors. Exception: the ctermfg and ctermbg values are numbers, which are only valid for the current -terminal. Use the color names instead. See ":help cterm-colors". +terminal. Use the color names instead for better portability. See +":help cterm-colors". -The default color settings can be found in the source file src/highlight.c. -Search for "highlight_init". +The default color settings can be found in the source file +"src/nvim/highlight_group.c". Search for "highlight_init". If you think you have a color scheme that is good enough to be used by others, please check the following items: -- Source the $VIMRUNTIME/tools/check_colors.vim script to check for common mistakes. -- Does it work in a color terminal as well as in the GUI? +- Source the $VIMRUNTIME/colors/tools/check_colors.vim script to check for + common mistakes. + +- Does it work in a color terminal as well as in the GUI? Is it consistent? + - Is "g:colors_name" set to a meaningful value? In case of doubt you can do it this way: + let g:colors_name = expand('<sfile>:t:r') + - Is 'background' either used or appropriately set to "light" or "dark"? + - Try setting 'hlsearch' and searching for a pattern, is the match easy to spot? + - Split a window with ":split" and ":vsplit". Are the status lines and vertical separators clearly visible? + - In the GUI, is it easy to find the cursor, also in a file with lots of syntax highlighting? + +- In general, test your color scheme against as many filetypes, Vim features, + environments, etc. as possible. + - Do not use hard coded escape sequences, these will not work in other - terminals. Always use color names or #RRGGBB for the GUI. + terminals. Always use #RRGGBB for the GUI. + +- When targetting 8-16 colors terminals, don't count on "darkblue" to be blue + and dark, or on "2" to be even vaguely reddish. Names are more portable + than numbers, though. + +- When targetting 256 colors terminals, prefer colors 16-255 to colors 0-15 + for the same reason. + +- Typographic attributes (bold, italic, underline, reverse, etc.) are not + universally supported. Don't count on any of them. + +- Is "g:terminal_ansi_colors" set to a list of 16 #RRGGBB values? + +- Try to keep your color scheme simple by avoiding unnecessary logic and + refraining from adding options. The best color scheme is one that only + requires: + + colorscheme foobar + +The color schemes distributed with Vim are built with lifepillar/colortemplate +(https://github.com/lifepillar/vim-colortemplate). It is therefore highly +recommended. + +If you would like your color scheme to be distributed with Vim, make sure +that: + +- it satisfies the guidelines above, +- it was made with colortemplate, + +and join us at vim/colorschemes: (https://github.com/vim/colorschemes). diff --git a/runtime/colors/blue.vim b/runtime/colors/blue.vim index 86de8a4dc4..abb2445712 100644 --- a/runtime/colors/blue.vim +++ b/runtime/colors/blue.vim @@ -1,55 +1,447 @@ -" local syntax file - set colors on a per-machine basis: -" vim: tw=0 ts=4 sw=4 -" Vim color file -" Maintainer: Steven Vertigan <steven@vertigan.wattle.id.au> -" Last Change: 2006 Sep 23 -" Revision #5: Switch main text from white to yellow for easier contrast, -" fixed some problems with terminal backgrounds. +" Name: blue +" Description: Colorscheme with a blue background +" Author: Original author Steven Vertigan <steven@vertigan.wattle.id.au> +" Maintainer: Original maintainer Steven Vertigan <steven@vertigan.wattle.id.au> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:33 2022 + +" Generated by Colortemplate v2.2.0 set background=dark + hi clear -if exists("syntax_on") - syntax reset +let g:colors_name = 'blue' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#000000', '#870000', '#006400', '#878700', '#000087', '#870087', '#008787', '#bcbcbc', '#878787', '#d70000', '#00ff00', '#ffdf00', '#5fafff', '#d787d7', '#5fffff', '#ffffff'] +endif +hi Normal guifg=#ffdf00 guibg=#000087 gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#005faf gui=NONE cterm=NONE +hi Pmenu guifg=#ffffff guibg=#008787 gui=NONE cterm=NONE +hi PmenuSel guifg=#008787 guibg=#ffffff gui=NONE cterm=NONE +hi QuickFixLine guifg=#000000 guibg=#d787d7 gui=NONE cterm=NONE +hi ColorColumn guifg=NONE guibg=#870087 gui=NONE cterm=NONE +hi Conceal guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Cursor guifg=#000000 guibg=#00ff00 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#005faf gui=NONE cterm=NONE +hi CursorIM guifg=NONE guibg=fg gui=NONE cterm=NONE +hi CursorLineNr guifg=#ffdf00 guibg=#005faf gui=bold cterm=NONE +hi EndOfBuffer guifg=#ffdf00 guibg=#000087 gui=NONE cterm=NONE +hi Error guifg=#ff7f50 guibg=#000087 gui=reverse cterm=reverse +hi ErrorMsg guifg=#ffffff guibg=#d70000 gui=NONE cterm=NONE +hi FoldColumn guifg=#008787 guibg=NONE gui=NONE cterm=NONE +hi Folded guifg=#000087 guibg=#878700 gui=NONE cterm=NONE +hi IncSearch guifg=#d787d7 guibg=#000000 gui=standout cterm=reverse +hi LineNr guifg=#5fffff guibg=NONE gui=NONE cterm=NONE +hi MatchParen guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse +hi ModeMsg guifg=#000087 guibg=#00ff00 gui=NONE cterm=NONE +hi MoreMsg guifg=#5fffff guibg=NONE gui=NONE cterm=NONE +hi NonText guifg=#d787d7 guibg=NONE gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE +hi Question guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE +hi Search guifg=#ffdf00 guibg=#000000 gui=reverse cterm=reverse +hi SignColumn guifg=#008787 guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#5fffff guibg=NONE gui=NONE cterm=NONE +hi SpellBad guifg=#d70000 guibg=NONE guisp=#d70000 gui=undercurl cterm=underline +hi SpellCap guifg=#00ff00 guibg=NONE guisp=#00ff00 gui=undercurl cterm=underline +hi SpellLocal guifg=#ffffff guibg=NONE guisp=#ffffff gui=undercurl cterm=underline +hi SpellRare guifg=#d787d7 guibg=NONE guisp=#d787d7 gui=undercurl cterm=underline +hi StatusLine guifg=#000087 guibg=#5fffff gui=NONE cterm=NONE +hi StatusLineNC guifg=#000087 guibg=#008787 gui=NONE cterm=NONE +hi! link StatusLineTerm StatusLine +hi! link StatusLineTermNC StatusLineNC +hi! link TabLine StatusLineNC +hi! link TabLineFill StatusLineNC +hi! link TabLineSel StatusLine +hi ToolbarButton guifg=#ffffff guibg=#005faf gui=NONE cterm=NONE +hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi VertSplit guifg=#008787 guibg=NONE gui=NONE cterm=NONE +hi Visual guifg=#ffffff guibg=#008787 gui=NONE cterm=NONE +hi VisualNOS guifg=#008787 guibg=#ffffff gui=NONE cterm=NONE +hi WarningMsg guifg=#d70000 guibg=NONE gui=NONE cterm=NONE +hi WildMenu guifg=#000087 guibg=#ffdf00 gui=NONE cterm=NONE +hi debugBreakpoint guifg=#00ff00 guibg=#000087 gui=reverse cterm=reverse +hi debugPC guifg=#5fffff guibg=#000087 gui=reverse cterm=reverse +hi! link Terminal Normal +hi! link Debug Special +hi! link diffAdded String +hi! link diffRemoved WarningMsg +hi! link diffOnly WarningMsg +hi! link diffNoEOL WarningMsg +hi! link diffIsA WarningMsg +hi! link diffIdentical WarningMsg +hi! link diffDiffer WarningMsg +hi! link diffCommon WarningMsg +hi! link diffBDiffer WarningMsg +hi! link lCursor Cursor +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi Directory guifg=#5fffff guibg=NONE gui=NONE cterm=NONE +hi Title guifg=#d787d7 guibg=NONE gui=NONE cterm=NONE +hi Comment guifg=#878787 guibg=NONE gui=bold cterm=NONE +hi Constant guifg=#5fffff guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=#878787 guibg=NONE gui=NONE cterm=NONE +hi PreProc guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#d787d7 guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#ffffff guibg=NONE gui=NONE cterm=NONE +hi Todo guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse +hi Type guifg=#ffa500 guibg=NONE gui=bold cterm=NONE +hi Underlined guifg=NONE guibg=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline +hi Label guifg=#ffdf00 guibg=NONE gui=NONE cterm=NONE +hi! link Boolean Constant +hi! link Character Constant +hi! link Conditional Statement +hi! link Define PreProc +hi! link Delimiter Special +hi! link Exception Statement +hi! link Float Constant +hi! link Function Identifier +hi! link Include PreProc +hi! link Keyword Statement +hi! link Macro PreProc +hi! link Number Constant +hi! link Operator Type +hi! link PreCondit PreProc +hi! link Repeat Statement +hi! link SpecialChar Special +hi! link SpecialComment Special +hi! link StorageClass Type +hi! link String Constant +hi! link Structure Type +hi! link Tag Special +hi! link Typedef Type +hi! link Terminal Normal +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi Normal ctermfg=220 ctermbg=18 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=25 cterm=NONE + hi Pmenu ctermfg=231 ctermbg=30 cterm=NONE + hi PmenuSel ctermfg=30 ctermbg=231 cterm=NONE + hi QuickFixLine ctermfg=16 ctermbg=176 cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=90 cterm=NONE + hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE + hi Cursor ctermfg=16 ctermbg=46 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=25 cterm=NONE + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi CursorLineNr ctermfg=220 ctermbg=25 cterm=NONE + hi EndOfBuffer ctermfg=220 ctermbg=18 cterm=NONE + hi Error ctermfg=209 ctermbg=18 cterm=reverse + hi ErrorMsg ctermfg=231 ctermbg=160 cterm=NONE + hi FoldColumn ctermfg=30 ctermbg=NONE cterm=NONE + hi Folded ctermfg=18 ctermbg=100 cterm=NONE + hi IncSearch ctermfg=176 ctermbg=16 cterm=reverse + hi LineNr ctermfg=87 ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=NONE ctermbg=NONE cterm=reverse + hi ModeMsg ctermfg=18 ctermbg=46 cterm=NONE + hi MoreMsg ctermfg=87 ctermbg=NONE cterm=NONE + hi NonText ctermfg=176 ctermbg=NONE cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE + hi Question ctermfg=46 ctermbg=NONE cterm=NONE + hi Search ctermfg=220 ctermbg=16 cterm=reverse + hi SignColumn ctermfg=30 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=87 ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=160 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=46 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=231 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=176 ctermbg=NONE cterm=underline + hi StatusLine ctermfg=18 ctermbg=87 cterm=NONE + hi StatusLineNC ctermfg=18 ctermbg=30 cterm=NONE + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi! link TabLine StatusLineNC + hi! link TabLineFill StatusLineNC + hi! link TabLineSel StatusLine + hi ToolbarButton ctermfg=231 ctermbg=25 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=30 ctermbg=NONE cterm=NONE + hi Visual ctermfg=231 ctermbg=30 cterm=NONE + hi VisualNOS ctermfg=30 ctermbg=231 cterm=NONE + hi WarningMsg ctermfg=160 ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=18 ctermbg=220 cterm=NONE + hi debugBreakpoint ctermfg=46 ctermbg=18 cterm=reverse + hi debugPC ctermfg=87 ctermbg=18 cterm=reverse + hi! link Terminal Normal + hi! link Debug Special + hi! link diffAdded String + hi! link diffRemoved WarningMsg + hi! link diffOnly WarningMsg + hi! link diffNoEOL WarningMsg + hi! link diffIsA WarningMsg + hi! link diffIdentical WarningMsg + hi! link diffDiffer WarningMsg + hi! link diffCommon WarningMsg + hi! link diffBDiffer WarningMsg + hi! link lCursor Cursor + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi Directory ctermfg=87 ctermbg=NONE cterm=NONE + hi Title ctermfg=176 ctermbg=NONE cterm=NONE + hi Comment ctermfg=102 ctermbg=NONE cterm=NONE + hi Constant ctermfg=87 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=250 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=102 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=46 ctermbg=NONE cterm=NONE + hi Special ctermfg=176 ctermbg=NONE cterm=NONE + hi Statement ctermfg=231 ctermbg=NONE cterm=NONE + hi Todo ctermfg=NONE ctermbg=NONE cterm=reverse + hi Type ctermfg=214 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline + hi Label ctermfg=220 ctermbg=NONE cterm=NONE + hi! link Boolean Constant + hi! link Character Constant + hi! link Conditional Statement + hi! link Define PreProc + hi! link Delimiter Special + hi! link Exception Statement + hi! link Float Constant + hi! link Function Identifier + hi! link Include PreProc + hi! link Keyword Statement + hi! link Macro PreProc + hi! link Number Constant + hi! link Operator Type + hi! link PreCondit PreProc + hi! link Repeat Statement + hi! link SpecialChar Special + hi! link SpecialComment Special + hi! link StorageClass Type + hi! link String Constant + hi! link Structure Type + hi! link Tag Special + hi! link Typedef Type + hi! link Terminal Normal + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi Normal ctermfg=yellow ctermbg=darkblue cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE + hi PmenuSel ctermfg=black ctermbg=white cterm=NONE + hi QuickFixLine ctermfg=black ctermbg=magenta cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=darkmagenta cterm=NONE + hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE + hi Cursor ctermfg=black ctermbg=green cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=blue cterm=NONE + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi CursorLineNr ctermfg=yellow ctermbg=blue cterm=NONE + hi EndOfBuffer ctermfg=yellow ctermbg=darkblue cterm=NONE + hi Error ctermfg=red ctermbg=darkblue cterm=reverse + hi ErrorMsg ctermfg=white ctermbg=red cterm=NONE + hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Folded ctermfg=darkblue ctermbg=darkyellow cterm=NONE + hi IncSearch ctermfg=magenta ctermbg=black cterm=reverse + hi LineNr ctermfg=cyan ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=NONE ctermbg=NONE cterm=reverse + hi ModeMsg ctermfg=darkblue ctermbg=green cterm=NONE + hi MoreMsg ctermfg=cyan ctermbg=NONE cterm=NONE + hi NonText ctermfg=magenta ctermbg=NONE cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE + hi Question ctermfg=green ctermbg=NONE cterm=NONE + hi Search ctermfg=yellow ctermbg=black cterm=reverse + hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=green ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=white ctermbg=NONE cterm=underline + hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline + hi StatusLine ctermfg=darkblue ctermbg=cyan cterm=NONE + hi StatusLineNC ctermfg=darkblue ctermbg=darkcyan cterm=NONE + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi! link TabLine StatusLineNC + hi! link TabLineFill StatusLineNC + hi! link TabLineSel StatusLine + hi ToolbarButton ctermfg=white ctermbg=blue cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Visual ctermfg=white ctermbg=darkcyan cterm=NONE + hi VisualNOS ctermfg=darkcyan ctermbg=white cterm=NONE + hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=darkblue ctermbg=yellow cterm=NONE + hi debugBreakpoint ctermfg=green ctermbg=darkblue cterm=reverse + hi debugPC ctermfg=cyan ctermbg=darkblue cterm=reverse + hi! link Terminal Normal + hi! link Debug Special + hi! link diffAdded String + hi! link diffRemoved WarningMsg + hi! link diffOnly WarningMsg + hi! link diffNoEOL WarningMsg + hi! link diffIsA WarningMsg + hi! link diffIdentical WarningMsg + hi! link diffDiffer WarningMsg + hi! link diffCommon WarningMsg + hi! link diffBDiffer WarningMsg + hi! link lCursor Cursor + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE + hi Title ctermfg=magenta ctermbg=NONE cterm=NONE + hi Comment ctermfg=darkgray ctermbg=NONE cterm=NONE + hi Constant ctermfg=cyan ctermbg=NONE cterm=NONE + hi Identifier ctermfg=gray ctermbg=NONE cterm=NONE + hi Ignore ctermfg=darkgray ctermbg=NONE cterm=NONE + hi PreProc ctermfg=green ctermbg=NONE cterm=NONE + hi Special ctermfg=magenta ctermbg=NONE cterm=NONE + hi Statement ctermfg=white ctermbg=NONE cterm=NONE + hi Todo ctermfg=NONE ctermbg=NONE cterm=reverse + hi Type ctermfg=darkyellow ctermbg=NONE cterm=NONE + hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline + hi Label ctermfg=yellow ctermbg=NONE cterm=NONE + hi! link Boolean Constant + hi! link Character Constant + hi! link Conditional Statement + hi! link Define PreProc + hi! link Delimiter Special + hi! link Exception Statement + hi! link Float Constant + hi! link Function Identifier + hi! link Include PreProc + hi! link Keyword Statement + hi! link Macro PreProc + hi! link Number Constant + hi! link Operator Type + hi! link PreCondit PreProc + hi! link Repeat Statement + hi! link SpecialChar Special + hi! link SpecialComment Special + hi! link StorageClass Type + hi! link String Constant + hi! link Structure Type + hi! link Tag Special + hi! link Typedef Type + hi! link Terminal Normal + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish endif -let g:colors_name = "blue" -hi Normal guifg=yellow guibg=darkBlue ctermfg=yellow ctermbg=darkBlue -hi NonText guifg=magenta ctermfg=lightMagenta -hi comment guifg=gray ctermfg=gray ctermbg=darkBlue gui=bold -hi constant guifg=cyan ctermfg=cyan -hi identifier guifg=gray ctermfg=red -hi statement guifg=white ctermfg=white ctermbg=darkBlue gui=none -hi preproc guifg=green ctermfg=green -hi type guifg=orange ctermfg=lightRed ctermbg=darkBlue -hi special guifg=magenta ctermfg=lightMagenta ctermbg=darkBlue -hi Underlined guifg=cyan ctermfg=cyan gui=underline cterm=underline -hi label guifg=yellow ctermfg=yellow -hi operator guifg=orange gui=bold ctermfg=lightRed ctermbg=darkBlue - -hi ErrorMsg guifg=orange guibg=darkBlue ctermfg=lightRed -hi WarningMsg guifg=cyan guibg=darkBlue ctermfg=cyan gui=bold -hi ModeMsg guifg=yellow gui=NONE ctermfg=yellow -hi MoreMsg guifg=yellow gui=NONE ctermfg=yellow -hi Error guifg=red guibg=darkBlue gui=underline ctermfg=red - -hi Todo guifg=black guibg=orange ctermfg=black ctermbg=darkYellow -hi Cursor guifg=black guibg=white ctermfg=black ctermbg=white -hi Search guifg=black guibg=orange ctermfg=black ctermbg=darkYellow -hi IncSearch guifg=black guibg=yellow ctermfg=black ctermbg=darkYellow -hi LineNr guifg=cyan ctermfg=cyan -hi title guifg=white gui=bold cterm=bold - -hi StatusLineNC gui=NONE guifg=black guibg=blue ctermfg=black ctermbg=blue -hi StatusLine gui=bold guifg=cyan guibg=blue ctermfg=cyan ctermbg=blue -hi VertSplit gui=none guifg=blue guibg=blue ctermfg=blue ctermbg=blue - -hi Visual term=reverse ctermfg=black ctermbg=darkCyan guifg=black guibg=darkCyan - -hi DiffChange guibg=darkGreen guifg=black ctermbg=darkGreen ctermfg=black -hi DiffText guibg=olivedrab guifg=black ctermbg=lightGreen ctermfg=black -hi DiffAdd guibg=slateblue guifg=black ctermbg=blue ctermfg=black -hi DiffDelete guibg=coral guifg=black ctermbg=cyan ctermfg=black - -hi Folded guibg=orange guifg=black ctermbg=yellow ctermfg=black -hi FoldColumn guibg=gray30 guifg=black ctermbg=gray ctermfg=black -hi cIf0 guifg=gray ctermfg=gray +" Background: dark +" Color: black #000000 16 black +" Color: darkred #870000 88 darkred +" Color: darkyellow #878700 100 darkyellow +" Color: darkblue #000087 18 darkblue +" Color: darkmagenta #870087 90 darkmagenta +" Color: darkcyan #008787 30 darkcyan +" Color: gray #bcbcbc 250 gray +" Color: comment #878787 102 darkgray +" Color: darkgray #878787 102 darkgray +" Color: red #d70000 160 red +" Color: green #00ff00 46 green +" Color: yellow #ffdf00 220 yellow +" Color: blue #005faf 25 blue +" Color: magenta #d787d7 176 magenta +" Color: cyan #5fffff 87 cyan +" Color: white #ffffff 231 white +" Color: xtermblue #5fafff 75 blue +" Color: xtermdarkblue #0087af 31 darkblue +" Color: orange #ffa500 214 darkyellow +" Color: darkgreen #006400 22 darkgreen +" Color: coral #ff7f50 209 red +" Color: olivedrab #6b8e23 64 green +" Color: slateblue #6a5acd 62 darkmagenta +" Term colors: black darkred darkgreen darkyellow darkblue darkmagenta darkcyan gray +" Term colors: darkgray red green yellow xtermblue magenta cyan white +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/darkblue.vim b/runtime/colors/darkblue.vim index 88f0bd73b9..63f517ed90 100644 --- a/runtime/colors/darkblue.vim +++ b/runtime/colors/darkblue.vim @@ -1,65 +1,469 @@ -" Vim color file -" Maintainer: Bohdan Vlasyuk <bohdan@vstu.edu.ua> -" Last Change: 2008 Jul 18 +" Name: darkblue +" Description: For those who prefer dark background +" Author: Original author Bohdan Vlasyuk <bohdan@vstu.edu.ua> +" Maintainer: Original author Bohdan Vlasyuk <bohdan@vstu.edu.ua> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:33 2022 -" darkblue -- for those who prefer dark background -" [note: looks bit uglier with come terminal palettes, -" but is fine on default linux console palette.] +" Generated by Colortemplate v2.2.0 -set bg=dark -hi clear -if exists("syntax_on") - syntax reset -endif - -let colors_name = "darkblue" - -hi Normal guifg=#c0c0c0 guibg=#000040 ctermfg=gray ctermbg=black -hi ErrorMsg guifg=#ffffff guibg=#287eff ctermfg=white ctermbg=lightblue -hi Visual guifg=#8080ff guibg=fg gui=reverse ctermfg=lightblue ctermbg=fg cterm=reverse -hi Todo guifg=#d14a14 guibg=#1248d1 ctermfg=red ctermbg=darkblue -hi Search guifg=#90fff0 guibg=#2050d0 ctermfg=white ctermbg=darkblue cterm=underline term=underline -hi IncSearch guifg=#b0ffff guibg=#2050d0 ctermfg=darkblue ctermbg=gray - -hi SpecialKey guifg=cyan ctermfg=darkcyan -hi Directory guifg=cyan ctermfg=cyan -hi Title guifg=magenta gui=none ctermfg=magenta cterm=bold -hi WarningMsg guifg=red ctermfg=red -hi WildMenu guifg=yellow guibg=black ctermfg=yellow ctermbg=black cterm=none term=none -hi ModeMsg guifg=#22cce2 ctermfg=lightblue -hi MoreMsg ctermfg=darkgreen ctermfg=darkgreen -hi Question guifg=green gui=none ctermfg=green cterm=none -hi NonText guifg=#0030ff ctermfg=darkblue +set background=dark -hi StatusLine guifg=blue guibg=darkgray gui=none ctermfg=blue ctermbg=gray term=none cterm=none -hi StatusLineNC guifg=black guibg=darkgray gui=none ctermfg=black ctermbg=gray term=none cterm=none -hi VertSplit guifg=black guibg=darkgray gui=none ctermfg=black ctermbg=gray term=none cterm=none +hi clear +let g:colors_name = 'darkblue' -hi Folded guifg=#808080 guibg=#000040 ctermfg=darkgrey ctermbg=black cterm=bold term=bold -hi FoldColumn guifg=#808080 guibg=#000040 ctermfg=darkgrey ctermbg=black cterm=bold term=bold -hi LineNr guifg=#90f020 ctermfg=green cterm=none +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 -hi DiffAdd guibg=darkblue ctermbg=darkblue term=none cterm=none -hi DiffChange guibg=darkmagenta ctermbg=magenta cterm=none -hi DiffDelete ctermfg=blue ctermbg=cyan gui=bold guifg=Blue guibg=DarkCyan -hi DiffText cterm=bold ctermbg=red gui=bold guibg=Red +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#000000', '#8b0000', '#90f020', '#ffa500', '#00008b', '#8b008b', '#008b8b', '#c0c0c0', '#808080', '#ffa0a0', '#90f020', '#ffff60', '#0030ff', '#ff00ff', '#90fff0', '#ffffff'] +endif +hi Normal guifg=#c0c0c0 guibg=#000040 gui=NONE cterm=NONE +hi! link Terminal Normal +hi Conceal guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi ColorColumn guifg=#c0c0c0 guibg=#8b0000 gui=NONE cterm=NONE +hi Cursor guifg=#000000 guibg=#ffff60 gui=NONE cterm=NONE +hi! link CursorColumn CursorLine +hi! link CursorIM Cursor +hi CursorLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE +hi CursorLineNr guifg=#ffff60 guibg=#666666 gui=NONE cterm=NONE +hi QuickFixLine guifg=#000000 guibg=#ff80ff gui=NONE cterm=NONE +hi DiffAdd guifg=NONE guibg=#0030ff gui=NONE cterm=NONE +hi DiffChange guifg=NONE guibg=#404080 gui=NONE cterm=NONE +hi DiffDelete guifg=#000040 guibg=#008b8b gui=NONE cterm=NONE +hi DiffText guifg=NONE guibg=#008b8b gui=NONE cterm=NONE +hi! link EndOfBuffer NonText +hi Error guifg=#ffa0a0 guibg=NONE gui=reverse cterm=reverse +hi! link ErrorMsg Error +hi FoldColumn guifg=#808080 guibg=NONE gui=bold cterm=NONE +hi Folded guifg=#808080 guibg=NONE gui=bold cterm=NONE +hi IncSearch guifg=#ffffff guibg=#0030ff gui=reverse cterm=reverse +hi LineNr guifg=#90f020 guibg=NONE gui=NONE cterm=NONE +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi MatchParen guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse +hi ModeMsg guifg=#90fff0 guibg=NONE gui=NONE cterm=NONE +hi MoreMsg guifg=#006400 guibg=NONE gui=NONE cterm=NONE +hi NonText guifg=#0030ff guibg=NONE gui=NONE cterm=NONE +hi Pmenu guifg=#ffffff guibg=#0030ff gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi PmenuSel guifg=#0030ff guibg=#ffffff gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE +hi Question guifg=#90f020 guibg=NONE gui=NONE cterm=NONE +hi Search guifg=#90fff0 guibg=#0030ff gui=NONE cterm=NONE +hi SignColumn guifg=#808080 guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#008b8b guibg=NONE gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#90f020 guibg=NONE guisp=#90f020 gui=undercurl cterm=underline +hi SpellLocal guifg=#90fff0 guibg=NONE guisp=#90fff0 gui=undercurl cterm=underline +hi SpellRare guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline +hi StatusLine guifg=#000040 guibg=#c0c0c0 gui=NONE cterm=NONE +hi StatusLineNC guifg=#000000 guibg=#808080 gui=NONE cterm=NONE +hi! link StatusLineTerm StatusLine +hi! link StatusLineTermNC StatusLineNC +hi TabLine guifg=#000000 guibg=#808080 gui=NONE cterm=NONE +hi! link TabLineFill TabLine +hi TabLineSel guifg=#000040 guibg=#c0c0c0 gui=NONE cterm=NONE +hi ToolbarButton guifg=#ffffff guibg=#0030ff gui=NONE cterm=NONE +hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi VertSplit guifg=#000000 guibg=#808080 gui=NONE cterm=NONE +hi Visual guifg=#8080ff guibg=#ffffff gui=reverse cterm=reverse +hi VisualNOS guifg=#8080ff guibg=#c0c0c0 gui=reverse,underline cterm=reverse,underline +hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE +hi WildMenu guifg=#ffff60 guibg=#000000 gui=NONE cterm=NONE +hi debugBreakpoint guifg=#90f020 guibg=#00008b gui=reverse cterm=reverse +hi debugPC guifg=#90fff0 guibg=#00008b gui=reverse cterm=reverse +hi! link Terminal Normal +hi! link Debug Special +hi! link diffAdded String +hi! link diffRemoved WarningMsg +hi! link diffOnly WarningMsg +hi! link diffNoEOL WarningMsg +hi! link diffIsA WarningMsg +hi! link diffIdentical WarningMsg +hi! link diffDiffer WarningMsg +hi! link diffCommon WarningMsg +hi! link diffBDiffer WarningMsg +hi! link lCursor Cursor +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi Directory guifg=#008b8b guibg=NONE gui=NONE cterm=NONE +hi Title guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE +hi Comment guifg=#80a0ff guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#ffa0a0 guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#90fff0 guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=#000040 guibg=#c0c0c0 gui=NONE cterm=NONE +hi PreProc guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#ffa500 guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#ffff60 guibg=NONE gui=NONE cterm=NONE +hi Todo guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse +hi Type guifg=#90f020 guibg=NONE gui=NONE cterm=NONE +hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline +hi! link Boolean Constant +hi! link Character Constant +hi! link Conditional Statement +hi! link Define PreProc +hi! link Delimiter Special +hi! link Exception Statement +hi! link Float Constant +hi! link Function Identifier +hi! link Include PreProc +hi! link Keyword Statement +hi! link Label Statement +hi! link Macro PreProc +hi! link Number Constant +hi! link Operator Statement +hi! link PreCondit PreProc +hi! link Repeat Statement +hi! link SpecialChar Special +hi! link SpecialComment Special +hi! link StorageClass Type +hi! link String Constant +hi! link Structure Type +hi! link Tag Special +hi! link Typedef Type +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE -hi Cursor guifg=black guibg=yellow ctermfg=black ctermbg=yellow -hi lCursor guifg=black guibg=white ctermfg=black ctermbg=white +if s:t_Co >= 256 + hi Normal ctermfg=252 ctermbg=17 cterm=NONE + hi! link Terminal Normal + hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE + hi ColorColumn ctermfg=252 ctermbg=88 cterm=NONE + hi Cursor ctermfg=16 ctermbg=227 cterm=NONE + hi! link CursorColumn CursorLine + hi! link CursorIM Cursor + hi CursorLine ctermfg=NONE ctermbg=59 cterm=NONE + hi CursorLineNr ctermfg=227 ctermbg=59 cterm=NONE + hi QuickFixLine ctermfg=16 ctermbg=213 cterm=NONE + hi DiffAdd ctermfg=NONE ctermbg=27 cterm=NONE + hi DiffChange ctermfg=NONE ctermbg=61 cterm=NONE + hi DiffDelete ctermfg=17 ctermbg=30 cterm=NONE + hi DiffText ctermfg=NONE ctermbg=30 cterm=NONE + hi! link EndOfBuffer NonText + hi Error ctermfg=217 ctermbg=NONE cterm=reverse + hi! link ErrorMsg Error + hi FoldColumn ctermfg=102 ctermbg=NONE cterm=NONE + hi Folded ctermfg=102 ctermbg=NONE cterm=NONE + hi IncSearch ctermfg=231 ctermbg=27 cterm=reverse + hi LineNr ctermfg=118 ctermbg=NONE cterm=NONE + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi MatchParen ctermfg=NONE ctermbg=NONE cterm=reverse + hi ModeMsg ctermfg=123 ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=22 ctermbg=NONE cterm=NONE + hi NonText ctermfg=27 ctermbg=NONE cterm=NONE + hi Pmenu ctermfg=231 ctermbg=27 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel ctermfg=27 ctermbg=231 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE + hi Question ctermfg=118 ctermbg=NONE cterm=NONE + hi Search ctermfg=123 ctermbg=27 cterm=NONE + hi SignColumn ctermfg=102 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=30 ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=118 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=123 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=201 ctermbg=NONE cterm=underline + hi StatusLine ctermfg=17 ctermbg=252 cterm=NONE + hi StatusLineNC ctermfg=16 ctermbg=102 cterm=NONE + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi TabLine ctermfg=16 ctermbg=102 cterm=NONE + hi! link TabLineFill TabLine + hi TabLineSel ctermfg=17 ctermbg=252 cterm=NONE + hi ToolbarButton ctermfg=231 ctermbg=27 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=16 ctermbg=102 cterm=NONE + hi Visual ctermfg=105 ctermbg=231 cterm=reverse + hi VisualNOS ctermfg=105 ctermbg=252 cterm=reverse,underline + hi WarningMsg ctermfg=196 ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=227 ctermbg=16 cterm=NONE + hi debugBreakpoint ctermfg=118 ctermbg=18 cterm=reverse + hi debugPC ctermfg=123 ctermbg=18 cterm=reverse + hi! link Terminal Normal + hi! link Debug Special + hi! link diffAdded String + hi! link diffRemoved WarningMsg + hi! link diffOnly WarningMsg + hi! link diffNoEOL WarningMsg + hi! link diffIsA WarningMsg + hi! link diffIdentical WarningMsg + hi! link diffDiffer WarningMsg + hi! link diffCommon WarningMsg + hi! link diffBDiffer WarningMsg + hi! link lCursor Cursor + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi Directory ctermfg=30 ctermbg=NONE cterm=NONE + hi Title ctermfg=201 ctermbg=NONE cterm=NONE + hi Comment ctermfg=111 ctermbg=NONE cterm=NONE + hi Constant ctermfg=217 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=123 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=17 ctermbg=252 cterm=NONE + hi PreProc ctermfg=213 ctermbg=NONE cterm=NONE + hi Special ctermfg=214 ctermbg=NONE cterm=NONE + hi Statement ctermfg=227 ctermbg=NONE cterm=NONE + hi Todo ctermfg=NONE ctermbg=NONE cterm=reverse + hi Type ctermfg=118 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=111 ctermbg=NONE cterm=underline + hi! link Boolean Constant + hi! link Character Constant + hi! link Conditional Statement + hi! link Define PreProc + hi! link Delimiter Special + hi! link Exception Statement + hi! link Float Constant + hi! link Function Identifier + hi! link Include PreProc + hi! link Keyword Statement + hi! link Label Statement + hi! link Macro PreProc + hi! link Number Constant + hi! link Operator Statement + hi! link PreCondit PreProc + hi! link Repeat Statement + hi! link SpecialChar Special + hi! link SpecialComment Special + hi! link StorageClass Type + hi! link String Constant + hi! link Structure Type + hi! link Tag Special + hi! link Typedef Type + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif +if s:t_Co >= 16 + hi Normal ctermfg=grey ctermbg=black cterm=NONE + hi! link Terminal Normal + hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE + hi ColorColumn ctermfg=grey ctermbg=darkred cterm=NONE + hi Cursor ctermfg=black ctermbg=yellow cterm=NONE + hi! link CursorColumn CursorLine + hi! link CursorIM Cursor + hi CursorLine ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi CursorLineNr ctermfg=yellow ctermbg=darkgrey cterm=NONE + hi QuickFixLine ctermfg=black ctermbg=magenta cterm=NONE + hi DiffAdd ctermfg=NONE ctermbg=blue cterm=NONE + hi DiffChange ctermfg=NONE ctermbg=darkblue cterm=NONE + hi DiffDelete ctermfg=black ctermbg=darkcyan cterm=NONE + hi DiffText ctermfg=NONE ctermbg=darkcyan cterm=NONE + hi! link EndOfBuffer NonText + hi Error ctermfg=red ctermbg=NONE cterm=reverse + hi! link ErrorMsg Error + hi FoldColumn ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi Folded ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi IncSearch ctermfg=white ctermbg=blue cterm=reverse + hi LineNr ctermfg=green ctermbg=NONE cterm=NONE + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi MatchParen ctermfg=NONE ctermbg=NONE cterm=reverse + hi ModeMsg ctermfg=cyan ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi NonText ctermfg=blue ctermbg=NONE cterm=NONE + hi Pmenu ctermfg=white ctermbg=blue cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel ctermfg=blue ctermbg=white cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE + hi Question ctermfg=green ctermbg=NONE cterm=NONE + hi Search ctermfg=cyan ctermbg=blue cterm=NONE + hi SignColumn ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=green ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=cyan ctermbg=NONE cterm=underline + hi SpellRare ctermfg=darkmagenta ctermbg=NONE cterm=underline + hi StatusLine ctermfg=black ctermbg=grey cterm=NONE + hi StatusLineNC ctermfg=black ctermbg=darkgrey cterm=NONE + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi TabLine ctermfg=black ctermbg=darkgrey cterm=NONE + hi! link TabLineFill TabLine + hi TabLineSel ctermfg=black ctermbg=grey cterm=NONE + hi ToolbarButton ctermfg=white ctermbg=blue cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=black ctermbg=darkgrey cterm=NONE + hi Visual ctermfg=blue ctermbg=white cterm=reverse + hi VisualNOS ctermfg=blue ctermbg=grey cterm=reverse,underline + hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=yellow ctermbg=black cterm=NONE + hi debugBreakpoint ctermfg=green ctermbg=darkblue cterm=reverse + hi debugPC ctermfg=cyan ctermbg=darkblue cterm=reverse + hi! link Terminal Normal + hi! link Debug Special + hi! link diffAdded String + hi! link diffRemoved WarningMsg + hi! link diffOnly WarningMsg + hi! link diffNoEOL WarningMsg + hi! link diffIsA WarningMsg + hi! link diffIdentical WarningMsg + hi! link diffDiffer WarningMsg + hi! link diffCommon WarningMsg + hi! link diffBDiffer WarningMsg + hi! link lCursor Cursor + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi Directory ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Title ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Comment ctermfg=blue ctermbg=NONE cterm=NONE + hi Constant ctermfg=red ctermbg=NONE cterm=NONE + hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE + hi Ignore ctermfg=black ctermbg=grey cterm=NONE + hi PreProc ctermfg=magenta ctermbg=NONE cterm=NONE + hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE + hi Statement ctermfg=yellow ctermbg=NONE cterm=NONE + hi Todo ctermfg=NONE ctermbg=NONE cterm=reverse + hi Type ctermfg=green ctermbg=NONE cterm=NONE + hi Underlined ctermfg=blue ctermbg=NONE cterm=underline + hi! link Boolean Constant + hi! link Character Constant + hi! link Conditional Statement + hi! link Define PreProc + hi! link Delimiter Special + hi! link Exception Statement + hi! link Float Constant + hi! link Function Identifier + hi! link Include PreProc + hi! link Keyword Statement + hi! link Label Statement + hi! link Macro PreProc + hi! link Number Constant + hi! link Operator Statement + hi! link PreCondit PreProc + hi! link Repeat Statement + hi! link SpecialChar Special + hi! link SpecialComment Special + hi! link StorageClass Type + hi! link String Constant + hi! link Structure Type + hi! link Tag Special + hi! link Typedef Type + hi TabLineSel ctermfg=white ctermbg=black cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline + hi Search ctermfg=white ctermbg=blue cterm=NONE + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish +endif -hi Comment guifg=#80a0ff ctermfg=darkred -hi Constant ctermfg=magenta guifg=#ffa0a0 cterm=none -hi Special ctermfg=brown guifg=Orange cterm=none gui=none -hi Identifier ctermfg=cyan guifg=#40ffff cterm=none -hi Statement ctermfg=yellow cterm=none guifg=#ffff60 gui=none -hi PreProc ctermfg=magenta guifg=#ff80ff gui=none cterm=none -hi type ctermfg=green guifg=#60ff60 gui=none cterm=none -hi Underlined cterm=underline term=underline -hi Ignore guifg=bg ctermfg=bg +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif -" suggested by tigmoid, 2008 Jul 18 -hi Pmenu guifg=#c0c0c0 guibg=#404080 -hi PmenuSel guifg=#c0c0c0 guibg=#2050d0 -hi PmenuSbar guifg=blue guibg=darkgray -hi PmenuThumb guifg=#c0c0c0 +" Background: dark +" Color: white #FFFFFF 231 white +" Color: black #000000 16 black +" Color: diffc #0087af 31 darkcyan +" Color: difft #005f87 24 cyan +" Color: cursorl #666666 59 darkgrey +" Color: ogDeepBlue #000040 17 black +" Color: ogDarkBlue #00008b 18 darkblue +" Color: ogBlue #0030ff 27 blue +" Color: ogLightBlue #287eff 33 blue +" Color: ogDarkGrey #a9a9a9 248 grey +" Color: ogGrey #808080 102 darkgrey +" Color: ogLightGrey #c0c0c0 252 grey +" Color: ogDarkViolet #404080 61 darkblue +" Color: ogViolet #8080ff 105 blue +" Color: ogLightViolet #80a0ff 111 blue +" Color: ogDarkGreen #006400 22 darkgreen +" Color: ogGreen #90f020 118 green +" Color: ogDarkCyan #008b8b 30 darkcyan +" Color: ogCyan #90fff0 123 cyan +" Color: ogLightCyan #b0ffff 159 cyan +" Color: ogDarkerRed #8b0000 88 darkred +" Color: ogDarkRed #d14a14 166 darkred +" Color: ogRed #ff0000 196 red +" Color: ogLightRed #ffa0a0 217 red +" Color: ogDarkMag #8b008b 90 darkmagenta +" Color: ogMagenta #ff00ff 201 darkmagenta +" Color: ogLightMag #ff80ff 213 magenta +" Color: ogOrange #ffa500 214 darkyellow +" Color: ogYellow #ffff60 227 yellow +" Term colors: black ogDarkerRed ogGreen ogOrange ogDarkBlue ogDarkMag ogDarkCyan ogLightGrey +" Term colors: ogGrey ogLightRed ogGreen ogYellow ogBlue ogMagenta ogCyan white +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/delek.vim b/runtime/colors/delek.vim index dd3a33a9e8..55b35b525c 100644 --- a/runtime/colors/delek.vim +++ b/runtime/colors/delek.vim @@ -1,54 +1,339 @@ -" Vim color file -" Maintainer: David Schweikert <david@schweikert.ch> -" Last Change: 2014 Mar 19 +" Name: delek +" Description: Light background colorscheme. +" Author: Original author David Schweikert <david@schweikert.ch> +" Maintainer: Original maintainer David Schweikert <david@schweikert.ch> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:34 2022 + +" Generated by Colortemplate v2.2.0 + +set background=light hi clear +let g:colors_name = 'delek' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#ffffff', '#0000ff', '#00cd00', '#cd00cd', '#008b8b', '#0000ff', '#ff1493', '#bcbcbc', '#ee0000', '#0000ff', '#00cd00', '#cd00cd', '#008b8b', '#0000ff', '#ff1493', '#000000'] +endif +hi Normal guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE +hi EndOfBuffer guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE +hi StatusLine guifg=#ffff00 guibg=#00008b gui=bold cterm=NONE +hi StatusLineNC guifg=#ffd700 guibg=#00008b gui=NONE cterm=NONE +hi StatusLineTerm guifg=#ffff00 guibg=#0000ff gui=bold cterm=NONE +hi StatusLineTermNC guifg=#e4e4e4 guibg=#0000ff gui=NONE cterm=NONE +hi VertSplit guifg=#e4e4e4 guibg=#00008b gui=NONE cterm=NONE +hi Pmenu guifg=#000000 guibg=#add8e6 gui=NONE cterm=NONE +hi PmenuSel guifg=#ffffff guibg=#00008b gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=#ffffff gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#008b8b gui=NONE cterm=NONE +hi TabLine guifg=#000000 guibg=#e4e4e4 gui=NONE cterm=NONE +hi TabLineFill guifg=NONE guibg=#bcbcbc gui=NONE cterm=NONE +hi TabLineSel guifg=#000000 guibg=#ffffff gui=bold cterm=NONE +hi ToolbarLine guifg=NONE guibg=#e4e4e4 gui=NONE cterm=NONE +hi ToolbarButton guifg=#ffffff guibg=#bcbcbc gui=bold cterm=NONE +hi NonText guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE +hi Folded guifg=#00008b guibg=#e4e4e4 gui=NONE cterm=NONE +hi Visual guifg=#000000 guibg=#d0d0d0 gui=NONE cterm=NONE +hi VisualNOS guifg=NONE guibg=#ee0000 gui=NONE cterm=NONE +hi LineNr guifg=#a52a2a guibg=NONE gui=NONE cterm=NONE +hi FoldColumn guifg=#00008b guibg=NONE gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#e4e4e4 gui=NONE cterm=NONE +hi CursorLineNr guifg=#a52a2a guibg=NONE gui=bold cterm=NONE +hi QuickFixLine guifg=#ffffff guibg=#008b8b gui=NONE cterm=NONE +hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Underlined guifg=#6a5acd guibg=NONE gui=underline cterm=underline +hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse +hi! link ErrorMsg Error +hi WarningMsg guifg=#cd00cd guibg=#ffffff gui=NONE cterm=NONE +hi MoreMsg guifg=#000000 guibg=#ffffff gui=bold cterm=NONE +hi ModeMsg guifg=#000000 guibg=#ffffff gui=bold cterm=NONE +hi Question guifg=#00cd00 guibg=NONE gui=bold cterm=NONE +hi Todo guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi MatchParen guifg=#ffffff guibg=#ff1493 gui=NONE cterm=NONE +hi Search guifg=#ffffff guibg=#cd00cd gui=NONE cterm=NONE +hi IncSearch guifg=#00cd00 guibg=NONE gui=reverse cterm=reverse +hi WildMenu guifg=#00008b guibg=#ffd700 gui=bold cterm=NONE +hi ColorColumn guifg=#000000 guibg=#e4e4e4 gui=NONE cterm=NONE +hi Cursor guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE +hi lCursor guifg=#000000 guibg=#00cd00 gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#008b8b guibg=NONE guisp=#008b8b gui=undercurl cterm=underline +hi SpellLocal guifg=#0000ff guibg=NONE guisp=#0000ff gui=undercurl cterm=underline +hi SpellRare guifg=#cd00cd guibg=NONE guisp=#cd00cd gui=undercurl cterm=underline +hi debugBreakpoint guifg=#ffff00 guibg=#0000ff gui=NONE cterm=NONE +hi debugPC guifg=#ff1493 guibg=#0000ff gui=NONE cterm=NONE +hi Comment guifg=#ee0000 guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#00cd00 guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#008b8b guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#0000ff guibg=NONE gui=bold cterm=NONE +hi PreProc guifg=#cd00cd guibg=NONE gui=NONE cterm=NONE +hi Type guifg=#0000ff guibg=NONE gui=bold cterm=NONE +hi Special guifg=#ff1493 guibg=NONE gui=NONE cterm=NONE +hi Directory guifg=#008b8b guibg=NONE gui=bold cterm=NONE +hi Conceal guifg=#ee0000 guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Title guifg=#cd00cd guibg=NONE gui=bold cterm=NONE +hi! link Terminal Normal +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi CursorLine guifg=NONE guibg=#e4e4e4 gui=NONE cterm=NONE +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE -let g:colors_name = "delek" - -" Normal should come first -hi Normal guifg=Black guibg=White -hi Cursor guifg=bg guibg=fg -hi lCursor guifg=NONE guibg=Cyan - -" Note: we never set 'term' because the defaults for B&W terminals are OK -hi DiffAdd ctermbg=LightBlue guibg=LightBlue -hi DiffChange ctermbg=LightMagenta guibg=LightMagenta -hi DiffDelete ctermfg=Blue ctermbg=LightCyan gui=bold guifg=Blue guibg=LightCyan -hi DiffText ctermbg=Red cterm=bold gui=bold guibg=Red -hi Directory ctermfg=DarkBlue guifg=Blue -hi ErrorMsg ctermfg=White ctermbg=DarkRed guibg=Red guifg=White -hi FoldColumn ctermfg=DarkBlue ctermbg=Grey guibg=Grey guifg=DarkBlue -hi Folded ctermbg=Grey ctermfg=DarkBlue guibg=LightGrey guifg=DarkBlue -hi IncSearch cterm=reverse gui=reverse -hi LineNr ctermfg=Brown guifg=Brown -hi ModeMsg cterm=bold gui=bold -hi MoreMsg ctermfg=DarkGreen gui=bold guifg=SeaGreen -hi NonText ctermfg=Blue gui=bold guifg=gray guibg=white -hi Pmenu guibg=LightBlue -hi PmenuSel ctermfg=White ctermbg=DarkBlue guifg=White guibg=DarkBlue -hi Question ctermfg=DarkGreen gui=bold guifg=SeaGreen -if &background == "light" - hi Search ctermfg=NONE ctermbg=Yellow guibg=Yellow guifg=NONE -else - hi Search ctermfg=Black ctermbg=Yellow guibg=Yellow guifg=Black +if s:t_Co >= 256 + hi Normal ctermfg=16 ctermbg=231 cterm=NONE + hi EndOfBuffer ctermfg=250 ctermbg=NONE cterm=NONE + hi StatusLine ctermfg=226 ctermbg=18 cterm=NONE + hi StatusLineNC ctermfg=220 ctermbg=18 cterm=NONE + hi StatusLineTerm ctermfg=226 ctermbg=21 cterm=NONE + hi StatusLineTermNC ctermfg=254 ctermbg=21 cterm=NONE + hi VertSplit ctermfg=254 ctermbg=18 cterm=NONE + hi Pmenu ctermfg=16 ctermbg=152 cterm=NONE + hi PmenuSel ctermfg=231 ctermbg=18 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=231 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=30 cterm=NONE + hi TabLine ctermfg=16 ctermbg=254 cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=250 cterm=NONE + hi TabLineSel ctermfg=16 ctermbg=231 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=254 cterm=NONE + hi ToolbarButton ctermfg=231 ctermbg=250 cterm=NONE + hi NonText ctermfg=250 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=250 ctermbg=NONE cterm=NONE + hi Folded ctermfg=18 ctermbg=254 cterm=NONE + hi Visual ctermfg=16 ctermbg=252 cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=196 cterm=NONE + hi LineNr ctermfg=124 ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=18 ctermbg=NONE cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=254 cterm=NONE + hi CursorLineNr ctermfg=124 ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=231 ctermbg=30 cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE + hi Underlined ctermfg=62 ctermbg=NONE cterm=underline + hi Error ctermfg=196 ctermbg=231 cterm=reverse + hi! link ErrorMsg Error + hi WarningMsg ctermfg=164 ctermbg=231 cterm=NONE + hi MoreMsg ctermfg=16 ctermbg=231 cterm=NONE + hi ModeMsg ctermfg=16 ctermbg=231 cterm=NONE + hi Question ctermfg=40 ctermbg=NONE cterm=NONE + hi Todo ctermfg=16 ctermbg=226 cterm=NONE + hi MatchParen ctermfg=231 ctermbg=198 cterm=NONE + hi Search ctermfg=231 ctermbg=164 cterm=NONE + hi IncSearch ctermfg=40 ctermbg=NONE cterm=reverse + hi WildMenu ctermfg=18 ctermbg=220 cterm=NONE + hi ColorColumn ctermfg=16 ctermbg=254 cterm=NONE + hi Cursor ctermfg=231 ctermbg=16 cterm=NONE + hi lCursor ctermfg=16 ctermbg=40 cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=30 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=21 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=164 ctermbg=NONE cterm=underline + hi debugBreakpoint ctermfg=226 ctermbg=21 cterm=NONE + hi debugPC ctermfg=198 ctermbg=21 cterm=NONE + hi Comment ctermfg=196 ctermbg=NONE cterm=NONE + hi Constant ctermfg=40 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=30 ctermbg=NONE cterm=NONE + hi Statement ctermfg=21 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=164 ctermbg=NONE cterm=NONE + hi Type ctermfg=21 ctermbg=NONE cterm=NONE + hi Special ctermfg=198 ctermbg=NONE cterm=NONE + hi Directory ctermfg=30 ctermbg=NONE cterm=NONE + hi Conceal ctermfg=196 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=164 ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi CursorLine ctermfg=NONE ctermbg=254 cterm=NONE + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish endif -hi SpecialKey ctermfg=DarkBlue guifg=Blue -hi StatusLine cterm=bold ctermbg=blue ctermfg=yellow guibg=gold guifg=blue -hi StatusLineNC cterm=bold ctermbg=blue ctermfg=black guibg=gold guifg=blue -hi Title ctermfg=DarkMagenta gui=bold guifg=Magenta -hi VertSplit cterm=reverse gui=reverse -hi Visual ctermbg=NONE cterm=reverse gui=reverse guifg=Grey guibg=fg -hi WarningMsg ctermfg=DarkRed guifg=Red -hi WildMenu ctermfg=Black ctermbg=Yellow guibg=Yellow guifg=Black - -" syntax highlighting -hi Comment cterm=NONE ctermfg=DarkRed gui=NONE guifg=red2 -hi Constant cterm=NONE ctermfg=DarkGreen gui=NONE guifg=green3 -hi Identifier cterm=NONE ctermfg=DarkCyan gui=NONE guifg=cyan4 -hi PreProc cterm=NONE ctermfg=DarkMagenta gui=NONE guifg=magenta3 -hi Special cterm=NONE ctermfg=LightRed gui=NONE guifg=deeppink -hi Statement cterm=bold ctermfg=Blue gui=bold guifg=blue -hi Type cterm=NONE ctermfg=Blue gui=bold guifg=blue - -" vim: sw=2 + +if s:t_Co >= 16 + hi Normal ctermfg=black ctermbg=white cterm=NONE + hi EndOfBuffer ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi StatusLine ctermfg=yellow ctermbg=darkblue cterm=NONE + hi StatusLineNC ctermfg=darkyellow ctermbg=darkblue cterm=NONE + hi StatusLineTerm ctermfg=yellow ctermbg=blue cterm=NONE + hi StatusLineTermNC ctermfg=grey ctermbg=blue cterm=NONE + hi VertSplit ctermfg=grey ctermbg=darkblue cterm=NONE + hi Pmenu ctermfg=black ctermbg=grey cterm=NONE + hi PmenuSel ctermfg=white ctermbg=darkblue cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=white cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=darkcyan cterm=NONE + hi TabLine ctermfg=black ctermbg=grey cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi TabLineSel ctermfg=black ctermbg=white cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=grey cterm=NONE + hi ToolbarButton ctermfg=white ctermbg=darkgrey cterm=NONE + hi NonText ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi Folded ctermfg=darkblue ctermbg=grey cterm=NONE + hi Visual ctermfg=black ctermbg=darkgrey cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=darkred cterm=NONE + hi LineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=darkblue ctermbg=NONE cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=grey cterm=NONE + hi CursorLineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=white ctermbg=darkcyan cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE + hi Underlined ctermfg=blue ctermbg=NONE cterm=underline + hi Error ctermfg=red ctermbg=white cterm=reverse + hi! link ErrorMsg Error + hi WarningMsg ctermfg=darkmagenta ctermbg=white cterm=NONE + hi MoreMsg ctermfg=black ctermbg=white cterm=NONE + hi ModeMsg ctermfg=black ctermbg=white cterm=NONE + hi Question ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Todo ctermfg=black ctermbg=yellow cterm=NONE + hi MatchParen ctermfg=white ctermbg=magenta cterm=NONE + hi Search ctermfg=white ctermbg=darkmagenta cterm=NONE + hi IncSearch ctermfg=darkgreen ctermbg=NONE cterm=reverse + hi WildMenu ctermfg=darkblue ctermbg=darkyellow cterm=NONE + hi ColorColumn ctermfg=black ctermbg=grey cterm=NONE + hi Cursor ctermfg=white ctermbg=black cterm=NONE + hi lCursor ctermfg=black ctermbg=darkgreen cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=darkblue ctermbg=NONE cterm=underline + hi SpellRare ctermfg=darkmagenta ctermbg=NONE cterm=underline + hi debugBreakpoint ctermfg=yellow ctermbg=darkblue cterm=NONE + hi debugPC ctermfg=magenta ctermbg=darkblue cterm=NONE + hi Comment ctermfg=darkred ctermbg=NONE cterm=NONE + hi Constant ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Statement ctermfg=darkblue ctermbg=NONE cterm=NONE + hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Type ctermfg=blue ctermbg=NONE cterm=NONE + hi Special ctermfg=magenta ctermbg=NONE cterm=NONE + hi Directory ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Conceal ctermfg=darkred ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi Visual ctermfg=white ctermbg=darkgrey cterm=NONE + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif + +" Background: light +" Color: comment #ee0000 196 darkred +" Color: constant #00cd00 40 darkgreen +" Color: identifier #008b8b 30 darkcyan +" Color: statement #0000ff 21 darkblue +" Color: preproc #cd00cd 164 darkmagenta +" Color: type #0000ff 21 blue +" Color: special #ff1493 198 magenta +" Color: fg0 #000000 16 black +" Color: bg0 #ffffff 231 white +" Color: bg1 #bcbcbc 250 darkgrey +" Color: visual #d0d0d0 252 darkgrey +" Color: folded #e4e4e4 254 grey +" Color: pmenu #add8e6 152 grey +" Color: wildmenu #00008b 18 darkblue +" Color: error #ff0000 196 red +" Color: status_fg #ffd700 220 darkyellow +" Color: linenr #a52a2a 124 darkgrey +" Color: Yellow #ffff00 226 yellow +" Color: SlateBlue #6a5acd 62 blue +" Term colors: bg0 statement constant preproc identifier type special bg1 +" Term colors: comment statement constant preproc identifier type special fg0 +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/desert.vim b/runtime/colors/desert.vim index 542e5ae015..23267b3066 100644 --- a/runtime/colors/desert.vim +++ b/runtime/colors/desert.vim @@ -1,106 +1,335 @@ -" Vim color file -" Maintainer: Hans Fugal <hans@fugal.net> -" Last Change: $Date: 2004/06/13 19:30:30 $ -" Last Change: $Date: 2004/06/13 19:30:30 $ -" URL: http://hans.fugal.net/vim/colors/desert.vim -" Version: $Id: desert.vim,v 1.1 2004/06/13 19:30:30 vimboss Exp $ +" Name: desert +" Description: Light background colorscheme. +" Author: Original author Hans Fugal <hans@fugal.net> +" Maintainer: Original maintainer Hans Fugal <hans@fugal.net> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:35 2022 -" cool help screens -" :he group-name -" :he highlight-groups -" :he cterm-colors +" Generated by Colortemplate v2.2.0 set background=dark -if version > 580 - " no guarantees for version 5.8 and below, but this makes it stop - " complaining - hi clear - if exists("syntax_on") - syntax reset - endif -endif -let g:colors_name="desert" -hi Normal guifg=White guibg=grey20 +hi clear +let g:colors_name = 'desert' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 -" highlight groups -hi Cursor guibg=khaki guifg=slategrey -"hi CursorIM -"hi Directory -"hi DiffAdd -"hi DiffChange -"hi DiffDelete -"hi DiffText -"hi ErrorMsg -hi VertSplit guibg=#c2bfa5 guifg=grey50 gui=none -hi Folded guibg=grey30 guifg=gold -hi FoldColumn guibg=grey30 guifg=tan -hi IncSearch guifg=slategrey guibg=khaki -"hi LineNr -hi ModeMsg guifg=goldenrod -hi MoreMsg guifg=SeaGreen -hi NonText guifg=LightBlue guibg=grey30 -hi Question guifg=springgreen -hi Search guibg=peru guifg=wheat -hi SpecialKey guifg=yellowgreen -hi StatusLine guibg=#c2bfa5 guifg=black gui=none -hi StatusLineNC guibg=#c2bfa5 guifg=grey50 gui=none -hi Title guifg=indianred -hi Visual gui=none guifg=khaki guibg=olivedrab -hi WarningMsg guifg=salmon -"hi WildMenu -"hi Menu -"hi Scrollbar -"hi Tooltip +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#7f7f8c', '#cd5c5c', '#9acd32', '#bdb76b', '#75a0ff', '#eeee00', '#cd853f', '#666666', '#8a7f7f', '#ff0000', '#89fb98', '#f0e68c', '#6dceeb', '#ffde9b', '#ffa0a0', '#c2bfa5'] +endif +hi Normal guifg=#ffffff guibg=#333333 gui=NONE cterm=NONE +hi! link EndOfBuffer NonText +hi StatusLine guifg=#333333 guibg=#c2bfa5 gui=NONE cterm=NONE +hi StatusLineNC guifg=#7f7f8c guibg=#c2bfa5 gui=NONE cterm=NONE +hi StatusLineTerm guifg=#333333 guibg=#c2bfa5 gui=NONE cterm=NONE +hi StatusLineTermNC guifg=#ffffff guibg=#c2bfa5 gui=NONE cterm=NONE +hi VertSplit guifg=#7f7f8c guibg=#c2bfa5 gui=NONE cterm=NONE +hi Pmenu guifg=#ffffff guibg=#666666 gui=NONE cterm=NONE +hi PmenuSel guifg=#333333 guibg=#f0e68c gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=#333333 gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#c2bfa5 gui=NONE cterm=NONE +hi TabLine guifg=#333333 guibg=#c2bfa5 gui=NONE cterm=NONE +hi TabLineFill guifg=NONE guibg=#c2bfa5 gui=NONE cterm=NONE +hi TabLineSel guifg=#333333 guibg=#f0e68c gui=NONE cterm=NONE +hi ToolbarLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE +hi ToolbarButton guifg=#333333 guibg=#ffde9b gui=bold cterm=NONE +hi NonText guifg=#6dceeb guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#9acd32 guibg=NONE gui=NONE cterm=NONE +hi Folded guifg=#eeee00 guibg=#4d4d4d gui=NONE cterm=NONE +hi Visual guifg=#f0e68c guibg=#6b8e24 gui=NONE cterm=NONE +hi VisualNOS guifg=#f0e68c guibg=#6dceeb gui=NONE cterm=NONE +hi LineNr guifg=#eeee00 guibg=NONE gui=NONE cterm=NONE +hi FoldColumn guifg=#eeee00 guibg=#4d4d4d gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#666666 gui=NONE cterm=NONE +hi CursorLineNr guifg=#eeee00 guibg=NONE gui=bold cterm=NONE +hi QuickFixLine guifg=#333333 guibg=#f0e68c gui=NONE cterm=NONE +hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Underlined guifg=#75a0ff guibg=NONE gui=underline cterm=underline +hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse +hi ErrorMsg guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse +hi ModeMsg guifg=#ffde9b guibg=NONE gui=bold cterm=NONE +hi WarningMsg guifg=#cd5c5c guibg=NONE gui=bold cterm=NONE +hi MoreMsg guifg=#9acd32 guibg=NONE gui=bold cterm=NONE +hi Question guifg=#89fb98 guibg=NONE gui=bold cterm=NONE +hi Todo guifg=#ff0000 guibg=#eeee00 gui=NONE cterm=NONE +hi MatchParen guifg=#7f7f8c guibg=#bdb76b gui=NONE cterm=NONE +hi Search guifg=#f0e68c guibg=#7f7f8c gui=NONE cterm=NONE +hi IncSearch guifg=#f0e68c guibg=#cd853f gui=NONE cterm=NONE +hi WildMenu guifg=#333333 guibg=#eeee00 gui=NONE cterm=NONE +hi ColorColumn guifg=#ffffff guibg=#cd5c5c gui=NONE cterm=NONE +hi Cursor guifg=#333333 guibg=#f0e68c gui=NONE cterm=NONE +hi lCursor guifg=#333333 guibg=#ff0000 gui=NONE cterm=NONE +hi debugPC guifg=#666666 guibg=NONE gui=reverse cterm=reverse +hi debugBreakpoint guifg=#ffa0a0 guibg=NONE gui=reverse cterm=reverse +hi SpellBad guifg=#cd5c5c guibg=NONE guisp=#cd5c5c gui=undercurl cterm=underline +hi SpellCap guifg=#75a0ff guibg=NONE guisp=#75a0ff gui=undercurl cterm=underline +hi SpellLocal guifg=#ffde9b guibg=NONE guisp=#ffde9b gui=undercurl cterm=underline +hi SpellRare guifg=#9acd32 guibg=NONE guisp=#9acd32 gui=undercurl cterm=underline +hi Comment guifg=#6dceeb guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#89fb98 guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#f0e68c guibg=NONE gui=bold cterm=NONE +hi Constant guifg=#ffa0a0 guibg=NONE gui=NONE cterm=NONE +hi PreProc guifg=#cd5c5c guibg=NONE gui=NONE cterm=NONE +hi Type guifg=#bdb76b guibg=NONE gui=bold cterm=NONE +hi Special guifg=#ffde9b guibg=NONE gui=NONE cterm=NONE +hi Directory guifg=#6dceeb guibg=NONE gui=NONE cterm=NONE +hi Conceal guifg=#666666 guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Title guifg=#cd5c5c guibg=NONE gui=NONE cterm=NONE +hi! link Terminal Normal +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE -" syntax highlighting groups -hi Comment guifg=SkyBlue -hi Constant guifg=#ffa0a0 -hi Identifier guifg=palegreen -hi Statement guifg=khaki -hi PreProc guifg=indianred -hi Type guifg=darkkhaki -hi Special guifg=navajowhite -"hi Underlined -hi Ignore guifg=grey40 -"hi Error -hi Todo guifg=orangered guibg=yellow2 +if s:t_Co >= 256 + hi Normal ctermfg=231 ctermbg=236 cterm=NONE + hi! link EndOfBuffer NonText + hi StatusLine ctermfg=236 ctermbg=144 cterm=NONE + hi StatusLineNC ctermfg=242 ctermbg=144 cterm=NONE + hi StatusLineTerm ctermfg=236 ctermbg=144 cterm=NONE + hi StatusLineTermNC ctermfg=231 ctermbg=144 cterm=NONE + hi VertSplit ctermfg=242 ctermbg=144 cterm=NONE + hi Pmenu ctermfg=231 ctermbg=241 cterm=NONE + hi PmenuSel ctermfg=236 ctermbg=186 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=236 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=144 cterm=NONE + hi TabLine ctermfg=236 ctermbg=144 cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=144 cterm=NONE + hi TabLineSel ctermfg=236 ctermbg=186 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=241 cterm=NONE + hi ToolbarButton ctermfg=236 ctermbg=222 cterm=NONE + hi NonText ctermfg=81 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=112 ctermbg=NONE cterm=NONE + hi Folded ctermfg=226 ctermbg=239 cterm=NONE + hi Visual ctermfg=186 ctermbg=64 cterm=NONE + hi VisualNOS ctermfg=186 ctermbg=81 cterm=NONE + hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=226 ctermbg=239 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=241 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=241 cterm=NONE + hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=236 ctermbg=186 cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE + hi Underlined ctermfg=111 ctermbg=NONE cterm=underline + hi Error ctermfg=196 ctermbg=231 cterm=reverse + hi ErrorMsg ctermfg=196 ctermbg=231 cterm=reverse + hi ModeMsg ctermfg=222 ctermbg=NONE cterm=NONE + hi WarningMsg ctermfg=167 ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=112 ctermbg=NONE cterm=NONE + hi Question ctermfg=120 ctermbg=NONE cterm=NONE + hi Todo ctermfg=196 ctermbg=226 cterm=NONE + hi MatchParen ctermfg=242 ctermbg=143 cterm=NONE + hi Search ctermfg=186 ctermbg=242 cterm=NONE + hi IncSearch ctermfg=186 ctermbg=172 cterm=NONE + hi WildMenu ctermfg=236 ctermbg=226 cterm=NONE + hi ColorColumn ctermfg=231 ctermbg=167 cterm=NONE + hi debugPC ctermfg=241 ctermbg=NONE cterm=reverse + hi debugBreakpoint ctermfg=217 ctermbg=NONE cterm=reverse + hi SpellBad ctermfg=167 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=111 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=222 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=112 ctermbg=NONE cterm=underline + hi Comment ctermfg=81 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=120 ctermbg=NONE cterm=NONE + hi Statement ctermfg=186 ctermbg=NONE cterm=NONE + hi Constant ctermfg=217 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=167 ctermbg=NONE cterm=NONE + hi Type ctermfg=143 ctermbg=NONE cterm=NONE + hi Special ctermfg=222 ctermbg=NONE cterm=NONE + hi Directory ctermfg=81 ctermbg=NONE cterm=NONE + hi Conceal ctermfg=241 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=167 ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif -" color terminal definitions -hi SpecialKey ctermfg=darkgreen -hi NonText cterm=bold ctermfg=darkblue -hi Directory ctermfg=darkcyan -hi ErrorMsg cterm=bold ctermfg=7 ctermbg=1 -hi IncSearch cterm=NONE ctermfg=yellow ctermbg=green -hi Search cterm=NONE ctermfg=grey ctermbg=blue -hi MoreMsg ctermfg=darkgreen -hi ModeMsg cterm=NONE ctermfg=brown -hi LineNr ctermfg=3 -hi Question ctermfg=green -hi StatusLine cterm=bold,reverse -hi StatusLineNC cterm=reverse -hi VertSplit cterm=reverse -hi Title ctermfg=5 -hi Visual cterm=reverse -hi WarningMsg ctermfg=1 -hi WildMenu ctermfg=0 ctermbg=3 -hi Folded ctermfg=darkgrey ctermbg=NONE -hi FoldColumn ctermfg=darkgrey ctermbg=NONE -hi DiffAdd ctermbg=4 -hi DiffChange ctermbg=5 -hi DiffDelete cterm=bold ctermfg=4 ctermbg=6 -hi DiffText cterm=bold ctermbg=1 -hi Comment ctermfg=darkcyan -hi Constant ctermfg=brown -hi Special ctermfg=5 -hi Identifier ctermfg=6 -hi Statement ctermfg=3 -hi PreProc ctermfg=5 -hi Type ctermfg=2 -hi Underlined cterm=underline ctermfg=5 -hi Ignore cterm=bold ctermfg=7 -hi Ignore ctermfg=darkgrey -hi Error cterm=bold ctermfg=7 ctermbg=1 +if s:t_Co >= 16 + hi Normal ctermfg=white ctermbg=black cterm=NONE + hi! link EndOfBuffer NonText + hi StatusLine ctermfg=black ctermbg=grey cterm=NONE + hi StatusLineNC ctermfg=darkgrey ctermbg=grey cterm=NONE + hi StatusLineTerm ctermfg=black ctermbg=grey cterm=NONE + hi StatusLineTermNC ctermfg=darkgrey ctermbg=grey cterm=NONE + hi VertSplit ctermfg=darkgrey ctermbg=grey cterm=NONE + hi Pmenu ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE + hi TabLine ctermfg=black ctermbg=grey cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=white cterm=NONE + hi TabLineSel ctermfg=white ctermbg=black cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=black ctermbg=darkyellow cterm=NONE + hi NonText ctermfg=blue ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE + hi Visual ctermfg=white ctermbg=darkgreen cterm=NONE + hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=darkyellow ctermbg=darkgrey cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorColumn ctermfg=NONE ctermbg=darkblue cterm=NONE + hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=underline + hi QuickFixLine ctermfg=black ctermbg=yellow cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE + hi Underlined ctermfg=darkblue ctermbg=NONE cterm=underline + hi Error ctermfg=red ctermbg=white cterm=reverse + hi ErrorMsg ctermfg=red ctermbg=white cterm=reverse + hi ModeMsg ctermfg=magenta ctermbg=NONE cterm=NONE + hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Question ctermfg=green ctermbg=NONE cterm=NONE + hi Todo ctermfg=red ctermbg=darkmagenta cterm=NONE + hi MatchParen ctermfg=black ctermbg=darkyellow cterm=NONE + hi Search ctermfg=black ctermbg=darkgreen cterm=NONE + hi IncSearch ctermfg=black ctermbg=yellow cterm=NONE + hi WildMenu ctermfg=black ctermbg=darkmagenta cterm=NONE + hi ColorColumn ctermfg=white ctermbg=darkred cterm=NONE + hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE + hi debugPC ctermfg=grey ctermbg=NONE cterm=reverse + hi debugBreakpoint ctermfg=cyan ctermbg=NONE cterm=reverse + hi SpellBad ctermfg=darkred ctermbg=NONE cterm=underline + hi SpellCap ctermfg=blue ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=darkyellow ctermbg=NONE cterm=underline + hi SpellRare ctermfg=darkgreen ctermbg=NONE cterm=underline + hi Comment ctermfg=cyan ctermbg=NONE cterm=NONE + hi Identifier ctermfg=green ctermbg=NONE cterm=NONE + hi Statement ctermfg=yellow ctermbg=NONE cterm=NONE + hi Constant ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi PreProc ctermfg=darkred ctermbg=NONE cterm=NONE + hi Type ctermfg=darkyellow ctermbg=NONE cterm=NONE + hi Special ctermfg=magenta ctermbg=NONE cterm=NONE + hi Directory ctermfg=blue ctermbg=NONE cterm=NONE + hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=darkred ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish +endif +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif -"vim: sw=4 +" Background: dark +" Color: foreground #ffffff 231 white +" Color: background #333333 236 black +" Color: color00 #7f7f8c 242 black +" Color: color08 #8a7f7f 244 darkgrey +" Color: color01 #cd5c5c 167 darkred +" Color: color09 #ff0000 196 red +" Color: color02 #9acd32 112 darkgreen +" Color: color10 #89fb98 120 green +" Color: color03 #bdb76b 143 darkyellow +" Color: color11 #f0e68c 186 yellow +" Color: color04 #75a0ff 111 darkblue +" Color: color12 #6dceeb 81 blue +" Color: color05 #eeee00 226 darkmagenta +" Color: color13 #ffde9b 222 magenta +" Color: color06 #cd853f 172 darkcyan +" Color: color14 #ffa0a0 217 cyan +" Color: color07 #666666 241 grey +" Color: color15 #c2bfa5 144 white +" Color: color16 #6b8e24 64 darkgreen +" Color: color17 #4d4d4d 239 grey +" Term colors: color00 color01 color02 color03 color04 color05 color06 color07 +" Term colors: color08 color09 color10 color11 color12 color13 color14 color15 +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/elflord.vim b/runtime/colors/elflord.vim index f74a828947..c69dfd43fe 100644 --- a/runtime/colors/elflord.vim +++ b/runtime/colors/elflord.vim @@ -1,50 +1,375 @@ -" local syntax file - set colors on a per-machine basis: -" vim: tw=0 ts=4 sw=4 -" Vim color file -" Maintainer: Ron Aaron <ron@ronware.org> -" Last Change: 2003 May 02 +" Name: elflord +" Author: original author Ron Aaron <ron@ronware.org> +" Maintainer: original maintainer Ron Aaron <ron@ronware.org> +" Website: https://www.github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:36 2022 + +" Generated by Colortemplate v2.2.0 set background=dark + hi clear -if exists("syntax_on") - syntax reset +let g:colors_name = 'elflord' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +hi! link Terminal Normal +hi! link Boolean Constant +hi! link Character Constant +hi! link Conditional Repeat +hi! link Debug Special +hi! link Define PreProc +hi! link Delimiter Special +hi! link Exception Statement +hi! link Float Number +hi! link Include PreProc +hi! link Keyword Statement +hi! link Label Statement +hi! link Macro PreProc +hi! link Number Constant +hi! link PopupSelected PmenuSel +hi! link PreCondit PreProc +hi! link SpecialChar Special +hi! link SpecialComment Special +hi! link StatusLineTerm StatusLine +hi! link StatusLineTermNC StatusLineNC +hi! link StorageClass Type +hi! link String Constant +hi! link Structure Type +hi! link Tag Special +hi! link Typedef Type +hi! link lCursor Cursor +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff'] +endif +hi Normal guifg=#00ffff guibg=#000000 gui=NONE cterm=NONE +hi QuickFixLine guifg=#ffffff guibg=#2e8b57 gui=NONE cterm=NONE +hi ColorColumn guifg=NONE guibg=#cd0000 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#3a3a3a gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#3a3a3a gui=NONE cterm=NONE +hi CursorLineNr guifg=#ffff00 guibg=NONE gui=bold cterm=underline +hi Folded guifg=#00ffff guibg=#666666 gui=NONE cterm=NONE +hi Conceal guifg=#666666 guibg=NONE gui=NONE cterm=NONE +hi Cursor guifg=#000000 guibg=#00ffff gui=NONE cterm=NONE +hi Directory guifg=#00ffff guibg=#000000 gui=NONE cterm=NONE +hi EndOfBuffer guifg=#0000ff guibg=#000000 gui=bold cterm=NONE +hi ErrorMsg guifg=#ffffff guibg=#cd0000 gui=NONE cterm=NONE +hi FoldColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi IncSearch guifg=NONE guibg=#000000 gui=reverse cterm=reverse +hi LineNr guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE +hi MatchParen guifg=NONE guibg=#008b8b gui=NONE cterm=NONE +hi ModeMsg guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=NONE +hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold cterm=NONE +hi NonText guifg=#0000ff guibg=NONE gui=bold cterm=NONE +hi Pmenu guifg=#ffffff guibg=#444444 gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=#bebebe gui=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE +hi Question guifg=#00ff00 guibg=NONE gui=bold cterm=NONE +hi Search guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi SignColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#0000ff guibg=NONE guisp=#0000ff gui=undercurl cterm=underline +hi SpellLocal guifg=#ffff00 guibg=NONE guisp=#ffff00 gui=undercurl cterm=underline +hi SpellRare guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline +hi StatusLine guifg=#000000 guibg=#00ffff gui=bold cterm=NONE +hi StatusLineNC guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE +hi TabLine guifg=#000000 guibg=#008b8b gui=NONE cterm=NONE +hi TabLineFill guifg=NONE guibg=#000000 gui=reverse cterm=reverse +hi TabLineSel guifg=#00ffff guibg=#000000 gui=bold cterm=NONE +hi Terminal guifg=#00ffff guibg=#000000 gui=NONE cterm=NONE +hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=NONE +hi VertSplit guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE +hi Visual guifg=#000000 guibg=#a9a9a9 gui=NONE cterm=NONE +hi VisualNOS guifg=NONE guibg=#000000 gui=bold,underline cterm=underline +hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE +hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi Comment guifg=#80a0ff guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE +hi Error guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE +hi Function guifg=#ffffff guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#40ffff guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=#000000 guibg=#000000 gui=NONE cterm=NONE +hi Operator guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE +hi PreProc guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE +hi Repeat guifg=#ffffff guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#aa4444 guibg=NONE gui=bold cterm=NONE +hi Todo guifg=#0000ff guibg=#ffff00 gui=NONE cterm=NONE +hi Type guifg=#60ff60 guibg=NONE gui=bold cterm=NONE +hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline +hi CursorIM guifg=NONE guibg=fg gui=NONE cterm=NONE +hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi ToolbarButton guifg=#000000 guibg=#e5e5e5 gui=bold cterm=NONE +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi Normal ctermfg=51 ctermbg=16 cterm=NONE + hi QuickFixLine ctermfg=231 ctermbg=29 cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=160 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=237 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=237 cterm=NONE + hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=underline + hi Folded ctermfg=51 ctermbg=59 cterm=NONE + hi Conceal ctermfg=59 ctermbg=NONE cterm=NONE + hi Cursor ctermfg=16 ctermbg=51 cterm=NONE + hi Directory ctermfg=51 ctermbg=16 cterm=NONE + hi EndOfBuffer ctermfg=21 ctermbg=16 cterm=NONE + hi ErrorMsg ctermfg=231 ctermbg=160 cterm=NONE + hi FoldColumn ctermfg=51 ctermbg=NONE cterm=NONE + hi IncSearch ctermfg=NONE ctermbg=16 cterm=reverse + hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=NONE ctermbg=30 cterm=NONE + hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=29 ctermbg=NONE cterm=NONE + hi NonText ctermfg=21 ctermbg=NONE cterm=NONE + hi Pmenu ctermfg=231 ctermbg=238 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=250 cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=44 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE + hi Question ctermfg=46 ctermbg=NONE cterm=NONE + hi Search ctermfg=16 ctermbg=226 cterm=NONE + hi SignColumn ctermfg=51 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=51 ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=21 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=226 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=201 ctermbg=NONE cterm=underline + hi StatusLine ctermfg=16 ctermbg=51 cterm=NONE + hi StatusLineNC ctermfg=16 ctermbg=44 cterm=NONE + hi TabLine ctermfg=16 ctermbg=30 cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=16 cterm=reverse + hi TabLineSel ctermfg=51 ctermbg=16 cterm=NONE + hi Terminal ctermfg=51 ctermbg=16 cterm=NONE + hi Title ctermfg=201 ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=16 ctermbg=44 cterm=NONE + hi Visual ctermfg=16 ctermbg=145 cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=16 cterm=underline + hi WarningMsg ctermfg=196 ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi Comment ctermfg=111 ctermbg=NONE cterm=NONE + hi Constant ctermfg=201 ctermbg=NONE cterm=NONE + hi Error ctermfg=231 ctermbg=196 cterm=NONE + hi Function ctermfg=231 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=87 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=16 ctermbg=16 cterm=NONE + hi Operator ctermfg=196 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=213 ctermbg=NONE cterm=NONE + hi Repeat ctermfg=231 ctermbg=NONE cterm=NONE + hi Special ctermfg=196 ctermbg=NONE cterm=NONE + hi Statement ctermfg=131 ctermbg=NONE cterm=NONE + hi Todo ctermfg=21 ctermbg=226 cterm=NONE + hi Type ctermfg=83 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=111 ctermbg=NONE cterm=underline + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=16 ctermbg=254 cterm=NONE + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi Normal ctermfg=cyan ctermbg=black cterm=NONE + hi QuickFixLine ctermfg=white ctermbg=darkgreen cterm=NONE + hi ColorColumn ctermfg=cyan ctermbg=darkred cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline + hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Conceal ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi Cursor ctermfg=black ctermbg=cyan cterm=NONE + hi Directory ctermfg=cyan ctermbg=black cterm=NONE + hi EndOfBuffer ctermfg=darkblue ctermbg=black cterm=NONE + hi ErrorMsg ctermfg=white ctermbg=darkred cterm=NONE + hi FoldColumn ctermfg=cyan ctermbg=NONE cterm=NONE + hi IncSearch ctermfg=NONE ctermbg=black cterm=reverse + hi LineNr ctermfg=yellow ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=NONE + hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi NonText ctermfg=darkblue ctermbg=NONE cterm=NONE + hi Pmenu ctermfg=white ctermbg=darkgrey cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=grey cterm=NONE + hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE + hi Question ctermfg=green ctermbg=NONE cterm=NONE + hi Search ctermfg=black ctermbg=yellow cterm=NONE + hi SignColumn ctermfg=cyan ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=darkblue ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=yellow ctermbg=NONE cterm=underline + hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline + hi StatusLine ctermfg=black ctermbg=cyan cterm=NONE + hi StatusLineNC ctermfg=black ctermbg=darkcyan cterm=NONE + hi TabLine ctermfg=black ctermbg=darkcyan cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=black cterm=reverse + hi TabLineSel ctermfg=cyan ctermbg=black cterm=NONE + hi Terminal ctermfg=cyan ctermbg=black cterm=NONE + hi Title ctermfg=magenta ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=black ctermbg=darkcyan cterm=NONE + hi Visual ctermfg=black ctermbg=darkgrey cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline + hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE + hi Comment ctermfg=blue ctermbg=NONE cterm=NONE + hi Constant ctermfg=magenta ctermbg=NONE cterm=NONE + hi Error ctermfg=white ctermbg=red cterm=NONE + hi Function ctermfg=white ctermbg=NONE cterm=NONE + hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE + hi Ignore ctermfg=black ctermbg=black cterm=NONE + hi Operator ctermfg=red ctermbg=NONE cterm=NONE + hi PreProc ctermfg=magenta ctermbg=NONE cterm=NONE + hi Repeat ctermfg=white ctermbg=NONE cterm=NONE + hi Special ctermfg=red ctermbg=NONE cterm=NONE + hi Statement ctermfg=darkred ctermbg=NONE cterm=NONE + hi Todo ctermfg=blue ctermbg=yellow cterm=NONE + hi Type ctermfg=green ctermbg=NONE cterm=NONE + hi Underlined ctermfg=blue ctermbg=NONE cterm=underline + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=black ctermbg=grey cterm=NONE + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish endif -let g:colors_name = "elflord" -hi Normal guifg=cyan guibg=black -hi Comment term=bold ctermfg=DarkCyan guifg=#80a0ff -hi Constant term=underline ctermfg=Magenta guifg=Magenta -hi Special term=bold ctermfg=DarkMagenta guifg=Red -hi Identifier term=underline cterm=bold ctermfg=Cyan guifg=#40ffff -hi Statement term=bold ctermfg=Yellow gui=bold guifg=#aa4444 -hi PreProc term=underline ctermfg=LightBlue guifg=#ff80ff -hi Type term=underline ctermfg=LightGreen guifg=#60ff60 gui=bold -hi Function term=bold ctermfg=White guifg=White -hi Repeat term=underline ctermfg=White guifg=white -hi Operator ctermfg=Red guifg=Red -hi Ignore ctermfg=black guifg=bg -hi Error term=reverse ctermbg=Red ctermfg=White guibg=Red guifg=White -hi Todo term=standout ctermbg=Yellow ctermfg=Black guifg=Blue guibg=Yellow - -" Common groups that link to default highlighting. -" You can specify other highlighting easily. -hi link String Constant -hi link Character Constant -hi link Number Constant -hi link Boolean Constant -hi link Float Number -hi link Conditional Repeat -hi link Label Statement -hi link Keyword Statement -hi link Exception Statement -hi link Include PreProc -hi link Define PreProc -hi link Macro PreProc -hi link PreCondit PreProc -hi link StorageClass Type -hi link Structure Type -hi link Typedef Type -hi link Tag Special -hi link SpecialChar Special -hi link Delimiter Special -hi link SpecialComment Special -hi link Debug Special + +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif + +" Background: dark +" Color: xterm0 #000000 16 black +" Color: xterm1 #cd0000 160 darkred +" Color: xterm2 #00cd00 40 darkgreen +" Color: xterm3 #cdcd00 184 darkyellow +" Color: xterm4 #0000ee 20 darkblue +" Color: xterm5 #cd00cd 164 darkmagenta +" Color: xterm6 #00cdcd 44 darkcyan +" Color: xterm7 #e5e5e5 254 grey +" Color: xterm8 #7f7f7f 102 darkgrey +" Color: xterm9 #ff0000 196 red +" Color: xterm10 #00ff00 46 green +" Color: xterm11 #ffff00 226 yellow +" Color: xterm12 #5c5cff 63 blue +" Color: xterm13 #ff00ff 201 magenta +" Color: xterm14 #00ffff 51 cyan +" Color: xterm15 #ffffff 231 white +" Color: Pmenu #444444 238 darkgrey +" Color: CursorLine #3a3a3a 237 darkgrey +" Color: rgbGrey40 #666666 59 darkgrey +" Color: rgbDarkGrey #a9a9a9 145 darkgrey +" Color: rgbBlue #0000ff 21 darkblue +" Color: rgbDarkCyan #008b8b 30 darkcyan +" Color: Directory #00ffff 51 cyan +" Color: rgbSeaGreen #2e8b57 29 darkgreen +" Color: rgbGrey #bebebe 250 grey +" Color: Question #00ff00 46 green +" Color: SignColumn #a9a9a9 248 grey +" Color: SpecialKey #00ffff 51 cyan +" Color: Title #ff00ff 201 magenta +" Color: WarningMsg #ff0000 196 red +" Color: ToolbarLine #7f7f7f 244 darkgrey +" Color: Underlined #80a0ff 111 blue +" Color: elfComment #80a0ff 111 blue +" Color: elfIdentifier #40ffff 87 cyan +" Color: elfStatement #aa4444 131 darkred +" Color: elfPreProc #ff80ff 213 magenta +" Color: elfType #60ff60 83 green +" Color: elfBlue #0000ff 21 blue +" Term colors: xterm0 xterm1 xterm2 xterm3 xterm4 xterm5 xterm6 xterm7 +" Term colors: xterm8 xterm9 xterm10 xterm11 xterm12 xterm13 +" Term colors: xterm14 xterm15 +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/evening.vim b/runtime/colors/evening.vim index 5257307593..264a22abc5 100644 --- a/runtime/colors/evening.vim +++ b/runtime/colors/evening.vim @@ -1,55 +1,448 @@ -" Vim color file -" Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2016 Oct 10 +" Name: evening +" Description: This color scheme uses a dark grey background. +" Author: Original author Bram Moolenaar <Bram@vim.org> +" Maintainer: Original maintainer Steven Vertigan <steven@vertigan.wattle.id.au> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:37 2022 -" This color scheme uses a dark grey background. +" Generated by Colortemplate v2.2.0 -" First remove all existing highlighting. set background=dark + hi clear -if exists("syntax_on") - syntax reset +let g:colors_name = 'evening' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#000000', '#ffa500', '#2e8b57', '#ffff00', '#006faf', '#8b008b', '#008b8b', '#bebebe', '#4d4d4d', '#ff5f5f', '#00ff00', '#ffff60', '#0087ff', '#ff80ff', '#00ffff', '#ffffff'] +endif +hi Normal guifg=#ffffff guibg=#333333 gui=NONE cterm=NONE +hi ColorColumn guifg=NONE guibg=#8b0000 gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE +hi CursorLineNr guifg=#ffff00 guibg=#666666 gui=NONE cterm=NONE +hi EndOfBuffer guifg=#add8e6 guibg=#4d4d4d gui=NONE cterm=NONE +hi StatusLine guifg=#333333 guibg=#ffffff gui=bold cterm=NONE +hi StatusLineNC guifg=#333333 guibg=#d3d3d3 gui=NONE cterm=NONE +hi TabLineSel guifg=#333333 guibg=#ffffff gui=bold cterm=NONE +hi TabLine guifg=#333333 guibg=#d3d3d3 gui=NONE cterm=NONE +hi QuickFixLine guifg=#ffffff guibg=#8b008b gui=NONE cterm=NONE +hi Pmenu guifg=#ffffff guibg=#4d4d4d gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#bebebe gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE +hi LineNr guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE +hi Conceal guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Cursor guifg=#000000 guibg=#00ff00 gui=NONE cterm=NONE +hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse +hi ErrorMsg guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE +hi FoldColumn guifg=#add8e6 guibg=NONE gui=NONE cterm=NONE +hi Folded guifg=#00008b guibg=#d3d3d3 gui=bold cterm=NONE +hi IncSearch guifg=#00ff00 guibg=NONE gui=reverse cterm=reverse +hi MatchParen guifg=NONE guibg=#008b8b gui=NONE cterm=NONE +hi ModeMsg guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=NONE +hi MoreMsg guifg=#2e8b57 guibg=NONE gui=NONE cterm=NONE +hi NonText guifg=#add8e6 guibg=#4d4d4d gui=NONE cterm=NONE +hi Question guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE +hi Search guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi SignColumn guifg=#008b8b guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#00ff00 guibg=NONE guisp=#00ff00 gui=undercurl cterm=underline +hi SpellLocal guifg=#00ffff guibg=NONE guisp=#00ffff gui=undercurl cterm=underline +hi SpellRare guifg=#ff80ff guibg=NONE guisp=#ff80ff gui=undercurl cterm=underline +hi! link StatusLineTerm StatusLine +hi! link StatusLineTermNC StatusLineNC +hi! link TabLineFill TabLine +hi ToolbarButton guifg=NONE guibg=#999999 gui=bold cterm=NONE +hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi VertSplit guifg=#ffffff guibg=#ffffff gui=NONE cterm=NONE +hi Visual guifg=#ffffff guibg=#999999 gui=NONE cterm=NONE +hi VisualNOS guifg=NONE guibg=NONE gui=bold,underline ctermfg=NONE ctermbg=NONE cterm=underline +hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE +hi WildMenu guifg=#000000 guibg=#ffff00 gui=bold cterm=NONE +hi debugBreakpoint guifg=#00008b guibg=#ff0000 gui=NONE cterm=NONE +hi debugPC guifg=#00008b guibg=#0000ff gui=NONE cterm=NONE +hi! link Terminal Normal +hi! link CursorColumn CursorLine +hi! link CursorIM Cursor +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link Debug Special +hi! link diffAdded String +hi! link diffRemoved WarningMsg +hi! link diffOnly WarningMsg +hi! link diffNoEOL WarningMsg +hi! link diffIsA WarningMsg +hi! link diffIdentical WarningMsg +hi! link diffDiffer WarningMsg +hi! link diffCommon WarningMsg +hi! link diffBDiffer WarningMsg +hi! link lCursor Cursor +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi Directory guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi Title guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE +hi Comment guifg=#80a0ff guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#ffa0a0 guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=#333333 guibg=NONE gui=NONE cterm=NONE +hi PreProc guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#ffa500 guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#ffff60 guibg=NONE gui=bold cterm=NONE +hi Todo guifg=#ffff00 guibg=#0000ff gui=reverse cterm=reverse +hi Type guifg=#00ff00 guibg=NONE gui=bold cterm=NONE +hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline +hi! link Boolean Constant +hi! link Character Constant +hi! link Conditional Statement +hi! link Define PreProc +hi! link Delimiter Special +hi! link Exception Statement +hi! link Float Constant +hi! link Function Identifier +hi! link Include PreProc +hi! link Keyword Statement +hi! link Label Statement +hi! link Macro PreProc +hi! link Number Constant +hi! link Operator Statement +hi! link PreCondit PreProc +hi! link Repeat Statement +hi! link SpecialChar Special +hi! link SpecialComment Special +hi! link StorageClass Type +hi! link String Constant +hi! link Structure Type +hi! link Tag Special +hi! link Typedef Type +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi Normal ctermfg=231 ctermbg=236 cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=88 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=241 cterm=NONE + hi CursorLineNr ctermfg=226 ctermbg=241 cterm=NONE + hi EndOfBuffer ctermfg=153 ctermbg=239 cterm=NONE + hi StatusLine ctermfg=236 ctermbg=231 cterm=NONE + hi StatusLineNC ctermfg=236 ctermbg=252 cterm=NONE + hi TabLineSel ctermfg=236 ctermbg=231 cterm=NONE + hi TabLine ctermfg=236 ctermbg=252 cterm=NONE + hi QuickFixLine ctermfg=231 ctermbg=90 cterm=NONE + hi Pmenu ctermfg=231 ctermbg=239 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=250 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE + hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE + hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE + hi Cursor ctermfg=16 ctermbg=46 cterm=NONE + hi Error ctermfg=196 ctermbg=231 cterm=reverse + hi ErrorMsg ctermfg=231 ctermbg=196 cterm=NONE + hi FoldColumn ctermfg=153 ctermbg=NONE cterm=NONE + hi Folded ctermfg=18 ctermbg=252 cterm=NONE + hi IncSearch ctermfg=46 ctermbg=NONE cterm=reverse + hi MatchParen ctermfg=NONE ctermbg=30 cterm=NONE + hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=29 ctermbg=NONE cterm=NONE + hi NonText ctermfg=153 ctermbg=239 cterm=NONE + hi Question ctermfg=46 ctermbg=NONE cterm=NONE + hi Search ctermfg=16 ctermbg=226 cterm=NONE + hi SignColumn ctermfg=30 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=51 ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=46 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=51 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=201 ctermbg=NONE cterm=underline + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi! link TabLineFill TabLine + hi ToolbarButton ctermfg=NONE ctermbg=246 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=231 ctermbg=231 cterm=NONE + hi Visual ctermfg=231 ctermbg=246 cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline + hi WarningMsg ctermfg=196 ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi debugBreakpoint ctermfg=18 ctermbg=196 cterm=NONE + hi debugPC ctermfg=18 ctermbg=21 cterm=NONE + hi! link Terminal Normal + hi! link CursorColumn CursorLine + hi! link CursorIM Cursor + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link Debug Special + hi! link diffAdded String + hi! link diffRemoved WarningMsg + hi! link diffOnly WarningMsg + hi! link diffNoEOL WarningMsg + hi! link diffIsA WarningMsg + hi! link diffIdentical WarningMsg + hi! link diffDiffer WarningMsg + hi! link diffCommon WarningMsg + hi! link diffBDiffer WarningMsg + hi! link lCursor Cursor + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi Directory ctermfg=51 ctermbg=NONE cterm=NONE + hi Title ctermfg=201 ctermbg=NONE cterm=NONE + hi Comment ctermfg=111 ctermbg=NONE cterm=NONE + hi Constant ctermfg=217 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=51 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=236 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=201 ctermbg=NONE cterm=NONE + hi Special ctermfg=214 ctermbg=NONE cterm=NONE + hi Statement ctermfg=227 ctermbg=NONE cterm=NONE + hi Todo ctermfg=226 ctermbg=21 cterm=reverse + hi Type ctermfg=46 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=111 ctermbg=NONE cterm=underline + hi! link Boolean Constant + hi! link Character Constant + hi! link Conditional Statement + hi! link Define PreProc + hi! link Delimiter Special + hi! link Exception Statement + hi! link Float Constant + hi! link Function Identifier + hi! link Include PreProc + hi! link Keyword Statement + hi! link Label Statement + hi! link Macro PreProc + hi! link Number Constant + hi! link Operator Statement + hi! link PreCondit PreProc + hi! link Repeat Statement + hi! link SpecialChar Special + hi! link SpecialComment Special + hi! link StorageClass Type + hi! link String Constant + hi! link Structure Type + hi! link Tag Special + hi! link Typedef Type + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi Normal ctermfg=white ctermbg=black cterm=NONE + hi ColorColumn ctermfg=white ctermbg=darkred cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=underline + hi EndOfBuffer ctermfg=lightblue ctermbg=NONE cterm=NONE + hi StatusLine ctermfg=black ctermbg=white cterm=NONE + hi StatusLineNC ctermfg=black ctermbg=gray cterm=NONE + hi TabLineSel ctermfg=black ctermbg=white cterm=NONE + hi TabLine ctermfg=black ctermbg=gray cterm=NONE + hi QuickFixLine ctermfg=white ctermbg=darkmagenta cterm=NONE + hi Pmenu ctermfg=white ctermbg=darkgray cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel ctermfg=black ctermbg=gray cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE + hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE + hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE + hi Cursor ctermfg=black ctermbg=green cterm=NONE + hi Error ctermfg=red ctermbg=white cterm=reverse + hi ErrorMsg ctermfg=white ctermbg=red cterm=NONE + hi FoldColumn ctermfg=lightblue ctermbg=NONE cterm=NONE + hi Folded ctermfg=darkblue ctermbg=gray cterm=NONE + hi IncSearch ctermfg=green ctermbg=NONE cterm=reverse + hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=NONE + hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi NonText ctermfg=lightblue ctermbg=darkgray cterm=NONE + hi Question ctermfg=green ctermbg=NONE cterm=NONE + hi Search ctermfg=black ctermbg=darkyellow cterm=NONE + hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=green ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=cyan ctermbg=NONE cterm=underline + hi SpellRare ctermfg=darkmagenta ctermbg=NONE cterm=underline + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi! link TabLineFill TabLine + hi ToolbarButton ctermfg=NONE ctermbg=darkgray cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=white ctermbg=white cterm=NONE + hi Visual ctermfg=white ctermbg=darkgray cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline + hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE + hi debugBreakpoint ctermfg=darkblue ctermbg=red cterm=NONE + hi debugPC ctermfg=darkblue ctermbg=blue cterm=NONE + hi! link Terminal Normal + hi! link CursorColumn CursorLine + hi! link CursorIM Cursor + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link Debug Special + hi! link diffAdded String + hi! link diffRemoved WarningMsg + hi! link diffOnly WarningMsg + hi! link diffNoEOL WarningMsg + hi! link diffIsA WarningMsg + hi! link diffIdentical WarningMsg + hi! link diffDiffer WarningMsg + hi! link diffCommon WarningMsg + hi! link diffBDiffer WarningMsg + hi! link lCursor Cursor + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE + hi Title ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Comment ctermfg=lightblue ctermbg=NONE cterm=NONE + hi Constant ctermfg=magenta ctermbg=NONE cterm=NONE + hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE + hi Ignore ctermfg=gray ctermbg=NONE cterm=NONE + hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Special ctermfg=darkred ctermbg=NONE cterm=NONE + hi Statement ctermfg=yellow ctermbg=NONE cterm=NONE + hi Todo ctermfg=darkyellow ctermbg=blue cterm=reverse + hi Type ctermfg=green ctermbg=NONE cterm=NONE + hi Underlined ctermfg=lightblue ctermbg=NONE cterm=underline + hi! link Boolean Constant + hi! link Character Constant + hi! link Conditional Statement + hi! link Define PreProc + hi! link Delimiter Special + hi! link Exception Statement + hi! link Float Constant + hi! link Function Identifier + hi! link Include PreProc + hi! link Keyword Statement + hi! link Label Statement + hi! link Macro PreProc + hi! link Number Constant + hi! link Operator Statement + hi! link PreCondit PreProc + hi! link Repeat Statement + hi! link SpecialChar Special + hi! link SpecialComment Special + hi! link StorageClass Type + hi! link String Constant + hi! link Structure Type + hi! link Tag Special + hi! link Typedef Type + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish endif -let colors_name = "evening" - -hi Normal ctermbg=DarkGrey ctermfg=White guifg=White guibg=grey20 - -" Groups used in the 'highlight' and 'guicursor' options default value. -hi ErrorMsg term=standout ctermbg=DarkRed ctermfg=White guibg=Red guifg=White -hi IncSearch term=reverse cterm=reverse gui=reverse -hi ModeMsg term=bold cterm=bold gui=bold -hi StatusLine term=reverse,bold cterm=reverse,bold gui=reverse,bold -hi StatusLineNC term=reverse cterm=reverse gui=reverse -hi VertSplit term=reverse cterm=reverse gui=reverse -hi Visual term=reverse ctermbg=black guibg=grey60 -hi DiffText term=reverse cterm=bold ctermbg=Red gui=bold guibg=Red -hi Cursor guibg=Green guifg=Black -hi lCursor guibg=Cyan guifg=Black -hi Directory term=bold ctermfg=LightCyan guifg=Cyan -hi LineNr term=underline ctermfg=Yellow guifg=Yellow -hi MoreMsg term=bold ctermfg=LightGreen gui=bold guifg=SeaGreen -hi NonText term=bold ctermfg=LightBlue gui=bold guifg=LightBlue guibg=grey30 -hi Question term=standout ctermfg=LightGreen gui=bold guifg=Green -hi Search term=reverse ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black -hi SpecialKey term=bold ctermfg=LightBlue guifg=Cyan -hi Title term=bold ctermfg=LightMagenta gui=bold guifg=Magenta -hi WarningMsg term=standout ctermfg=LightRed guifg=Red -hi WildMenu term=standout ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black -hi Folded term=standout ctermbg=LightGrey ctermfg=DarkBlue guibg=LightGrey guifg=DarkBlue -hi FoldColumn term=standout ctermbg=LightGrey ctermfg=DarkBlue guibg=Grey guifg=DarkBlue -hi DiffAdd term=bold ctermbg=DarkBlue guibg=DarkBlue -hi DiffChange term=bold ctermbg=DarkMagenta guibg=DarkMagenta -hi DiffDelete term=bold ctermfg=Blue ctermbg=DarkCyan gui=bold guifg=Blue guibg=DarkCyan -hi CursorColumn term=reverse ctermbg=Black guibg=grey40 -hi CursorLine term=underline cterm=underline guibg=grey40 - -" Groups for syntax highlighting -hi Constant term=underline ctermfg=Magenta guifg=#ffa0a0 -hi Special term=bold ctermfg=LightRed guifg=Orange -if &t_Co > 8 - hi Statement term=bold cterm=bold ctermfg=Yellow guifg=#ffff60 gui=bold +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish endif -hi Ignore ctermfg=DarkGrey guifg=grey20 -" vim: sw=2 +" Background: dark +" Color: lightmagenta #ffa0a0 217 magenta +" Color: blue #0000ff 21 blue +" Color: cyan #00ffff 51 cyan +" Color: yellow #ffff00 226 darkyellow +" Color: white #ffffff 231 white +" Color: black #000000 16 black +" Color: green #00ff00 46 green +" Color: magenta #ff80ff 201 darkmagenta +" Color: red #ff0000 196 red +" Color: lightyellow #ffff60 227 yellow +" Color: darkblue #00008b 18 darkblue +" Color: darkcyan #008b8b 30 darkcyan +" Color: darkmagenta #8b008b 90 darkmagenta +" Color: lightblue #add8e6 153 lightblue +" Color: orange #ffa500 214 darkred +" Color: seagreen #2e8b57 29 darkgreen +" Color: lightgrey #d3d3d3 252 gray +" Color: grey #bebebe 250 gray +" Color: grey20 #333333 236 gray +" Color: grey30 #4d4d4d 239 darkgray +" Color: grey40 #666666 241 darkgray +" Color: grey60 #999999 246 darkgray +" Color: xtermblue #0087ff 33 blue +" Color: xtermdarkblue #006faf 25 darkblue +" Color: xtermred #ff5f5f 203 red +" Color: comment #80a0ff 111 lightblue +" Color: darkred #8b0000 88 darkred +" Term colors: black orange seagreen yellow xtermdarkblue darkmagenta darkcyan grey +" Term colors: grey30 xtermred green lightyellow xtermblue magenta cyan white +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/industry.vim b/runtime/colors/industry.vim index ac9103b5c5..ac59fae62f 100644 --- a/runtime/colors/industry.vim +++ b/runtime/colors/industry.vim @@ -1,40 +1,337 @@ -" Vim color file -" Maintainer: Shian Lee -" Last Change: 2014 Mar 6 (for vim 7.4) -" Remark: "industry" stands for 'industrial' color scheme. In industrial -" HMI (Human-Machine-Interface) programming, using a standard color -" scheme is mandatory in many cases (in traffic-lights for example): -" LIGHT_RED is 'Warning' -" LIGHT_YELLOW is 'Attention' -" LIGHT_GREEN is 'Normal' -" LIGHT_MAGENTA is 'Warning-Attention' (light RED-YELLOW) -" LIGHT_CYAN is 'Attention-Normal' (light YELLOW-GREEN). -" BLACK is Dark-High-Contrast Background for maximum safety. -" BLUE is Shade of BLACK (not supposed to get attention). -" -" Industrial color scheme is by nature clear, safe and productive. -" Yet, depends on the file type's syntax, it might appear incorrect. - -" Reset to dark background, then reset everything to defaults: +" Name: industry +" Description: "industry" stands for 'industrial' color scheme. +" Author: Original author Shian Lee. +" Maintainer: Original maintainer Shian Lee. +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:38 2022 + +" Generated by Colortemplate v2.2.0 + set background=dark -highlight clear -if exists("syntax_on") - syntax reset + +hi clear +let g:colors_name = 'industry' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#303030', '#870000', '#5fd75f', '#afaf00', '#87afff', '#af00af', '#00afaf', '#6c6c6c', '#444444', '#ff0000', '#00ff00', '#ffff00', '#005fff', '#ff00ff', '#00ffff', '#ffffff'] endif +hi Normal guifg=#dadada guibg=#000000 gui=NONE cterm=NONE +hi EndOfBuffer guifg=#444444 guibg=#000000 gui=NONE cterm=NONE +hi StatusLine guifg=#000000 guibg=#dadada gui=bold cterm=NONE +hi StatusLineNC guifg=#000000 guibg=#6c6c6c gui=NONE cterm=NONE +hi StatusLineTerm guifg=#000000 guibg=#00ff00 gui=bold cterm=NONE +hi StatusLineTermNC guifg=#000000 guibg=#5fd75f gui=NONE cterm=NONE +hi VertSplit guifg=#000000 guibg=#6c6c6c gui=NONE cterm=NONE +hi Pmenu guifg=#dadada guibg=#444444 gui=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=#000000 gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#6c6c6c gui=NONE cterm=NONE +hi TabLine guifg=#dadada guibg=#444444 gui=NONE cterm=NONE +hi TabLineFill guifg=NONE guibg=#6c6c6c gui=NONE cterm=NONE +hi TabLineSel guifg=#ffffff guibg=#000000 gui=bold cterm=NONE +hi ToolbarButton guifg=#dadada guibg=#6c6c6c gui=bold cterm=NONE +hi ToolbarLine guifg=NONE guibg=#303030 gui=NONE cterm=NONE +hi NonText guifg=#00afaf guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#00afaf guibg=NONE gui=NONE cterm=NONE +hi Folded guifg=#00afaf guibg=#303030 gui=NONE cterm=NONE +hi Visual guifg=#dadada guibg=#6c6c6c gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#6c6c6c gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#6c6c6c gui=NONE cterm=NONE +hi CursorLineNr guifg=#ffff00 guibg=NONE gui=bold cterm=NONE +hi ColorColumn guifg=NONE guibg=#444444 gui=NONE cterm=NONE +hi QuickFixLine guifg=#000000 guibg=#ff00ff gui=NONE cterm=NONE +hi VisualNOS guifg=#dadada guibg=#6c6c6c gui=NONE cterm=NONE +hi LineNr guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE +hi FoldColumn guifg=#00afaf guibg=NONE gui=NONE cterm=NONE +hi SignColumn guifg=#00afaf guibg=NONE gui=NONE cterm=NONE +hi Underlined guifg=#87afff guibg=NONE gui=underline cterm=underline +hi Error guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE +hi ErrorMsg guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE +hi ModeMsg guifg=#ffffff guibg=NONE gui=bold cterm=NONE +hi WarningMsg guifg=#870000 guibg=NONE gui=bold cterm=NONE +hi MoreMsg guifg=#5fd75f guibg=NONE gui=bold cterm=NONE +hi Question guifg=#00ff00 guibg=NONE gui=bold cterm=NONE +hi Todo guifg=#005fff guibg=#ffff00 gui=NONE cterm=NONE +hi MatchParen guifg=#303030 guibg=#afaf00 gui=NONE cterm=NONE +hi Search guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi IncSearch guifg=#000000 guibg=#00ff00 gui=NONE cterm=NONE +hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi Cursor guifg=#000000 guibg=#dadada gui=NONE cterm=NONE +hi lCursor guifg=#000000 guibg=#ff0000 gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#005fff guibg=NONE guisp=#005fff gui=undercurl cterm=underline +hi SpellLocal guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline +hi SpellRare guifg=#00ff00 guibg=NONE guisp=#00ff00 gui=undercurl cterm=underline +hi Comment guifg=#00afaf guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE +hi Function guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#ffffff guibg=NONE gui=bold cterm=NONE +hi Constant guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi PreProc guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE +hi Type guifg=#00ff00 guibg=NONE gui=bold cterm=NONE +hi Special guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE +hi Delimiter guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE +hi Directory guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi Conceal guifg=#6c6c6c guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=NONE +hi! link Terminal Normal +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE -let colors_name = "industry" +if s:t_Co >= 256 + hi Normal ctermfg=253 ctermbg=16 cterm=NONE + hi EndOfBuffer ctermfg=238 ctermbg=16 cterm=NONE + hi StatusLine ctermfg=16 ctermbg=253 cterm=NONE + hi StatusLineNC ctermfg=16 ctermbg=242 cterm=NONE + hi StatusLineTerm ctermfg=16 ctermbg=46 cterm=NONE + hi StatusLineTermNC ctermfg=16 ctermbg=77 cterm=NONE + hi VertSplit ctermfg=16 ctermbg=242 cterm=NONE + hi Pmenu ctermfg=253 ctermbg=238 cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=226 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=16 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=242 cterm=NONE + hi TabLine ctermfg=253 ctermbg=238 cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=242 cterm=NONE + hi TabLineSel ctermfg=231 ctermbg=16 cterm=NONE + hi ToolbarButton ctermfg=253 ctermbg=242 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=236 cterm=NONE + hi NonText ctermfg=37 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=37 ctermbg=NONE cterm=NONE + hi Folded ctermfg=37 ctermbg=236 cterm=NONE + hi Visual ctermfg=253 ctermbg=242 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=242 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=242 cterm=NONE + hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=238 cterm=NONE + hi QuickFixLine ctermfg=16 ctermbg=201 cterm=NONE + hi VisualNOS ctermfg=253 ctermbg=242 cterm=NONE + hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=37 ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=37 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=111 ctermbg=NONE cterm=underline + hi Error ctermfg=231 ctermbg=196 cterm=NONE + hi ErrorMsg ctermfg=231 ctermbg=196 cterm=NONE + hi ModeMsg ctermfg=231 ctermbg=NONE cterm=NONE + hi WarningMsg ctermfg=88 ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=77 ctermbg=NONE cterm=NONE + hi Question ctermfg=46 ctermbg=NONE cterm=NONE + hi Todo ctermfg=27 ctermbg=226 cterm=NONE + hi MatchParen ctermfg=236 ctermbg=142 cterm=NONE + hi Search ctermfg=16 ctermbg=226 cterm=NONE + hi IncSearch ctermfg=16 ctermbg=46 cterm=NONE + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi Cursor ctermfg=16 ctermbg=253 cterm=NONE + hi lCursor ctermfg=16 ctermbg=196 cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=27 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=201 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=46 ctermbg=NONE cterm=underline + hi Comment ctermfg=37 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=201 ctermbg=NONE cterm=NONE + hi Function ctermfg=46 ctermbg=NONE cterm=NONE + hi Statement ctermfg=231 ctermbg=NONE cterm=NONE + hi Constant ctermfg=51 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=226 ctermbg=NONE cterm=NONE + hi Type ctermfg=46 ctermbg=NONE cterm=NONE + hi Special ctermfg=196 ctermbg=NONE cterm=NONE + hi Delimiter ctermfg=226 ctermbg=NONE cterm=NONE + hi Directory ctermfg=51 ctermbg=NONE cterm=NONE + hi Conceal ctermfg=242 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=201 ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif -" First set Normal to regular white on black text colors: -hi Normal ctermfg=LightGray ctermbg=Black guifg=#dddddd guibg=Black +if s:t_Co >= 16 + hi Normal ctermfg=white ctermbg=black cterm=NONE + hi EndOfBuffer ctermfg=darkgrey ctermbg=black cterm=NONE + hi StatusLine ctermfg=black ctermbg=white cterm=NONE + hi StatusLineNC ctermfg=black ctermbg=grey cterm=NONE + hi StatusLineTerm ctermfg=black ctermbg=green cterm=NONE + hi StatusLineTermNC ctermfg=black ctermbg=darkgreen cterm=NONE + hi VertSplit ctermfg=black ctermbg=grey cterm=NONE + hi Pmenu ctermfg=white ctermbg=darkgrey cterm=NONE + hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE + hi TabLine ctermfg=white ctermbg=darkgrey cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=grey cterm=NONE + hi TabLineSel ctermfg=white ctermbg=black cterm=NONE + hi ToolbarButton ctermfg=white ctermbg=darkgrey cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE + hi NonText ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Visual ctermfg=black ctermbg=grey cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline + hi ColorColumn ctermfg=white ctermbg=darkgrey cterm=NONE + hi QuickFixLine ctermfg=black ctermbg=magenta cterm=NONE + hi VisualNOS ctermfg=white ctermbg=grey cterm=NONE + hi LineNr ctermfg=yellow ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Underlined ctermfg=darkblue ctermbg=NONE cterm=underline + hi Error ctermfg=white ctermbg=red cterm=NONE + hi ErrorMsg ctermfg=white ctermbg=red cterm=NONE + hi ModeMsg ctermfg=white ctermbg=NONE cterm=NONE + hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Question ctermfg=green ctermbg=NONE cterm=NONE + hi Todo ctermfg=blue ctermbg=yellow cterm=NONE + hi MatchParen ctermfg=black ctermbg=darkyellow cterm=NONE + hi Search ctermfg=black ctermbg=yellow cterm=NONE + hi IncSearch ctermfg=black ctermbg=green cterm=NONE + hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE + hi Cursor ctermfg=black ctermbg=white cterm=NONE + hi lCursor ctermfg=black ctermbg=red cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=blue ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=magenta ctermbg=NONE cterm=underline + hi SpellRare ctermfg=green ctermbg=NONE cterm=underline + hi Comment ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Identifier ctermfg=magenta ctermbg=NONE cterm=NONE + hi Function ctermfg=green ctermbg=NONE cterm=NONE + hi Statement ctermfg=white ctermbg=NONE cterm=NONE + hi Constant ctermfg=cyan ctermbg=NONE cterm=NONE + hi PreProc ctermfg=yellow ctermbg=NONE cterm=NONE + hi Type ctermfg=green ctermbg=NONE cterm=NONE + hi Special ctermfg=red ctermbg=NONE cterm=NONE + hi Delimiter ctermfg=yellow ctermbg=NONE cterm=NONE + hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE + hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=magenta ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish +endif -" Syntax highlighting (other color-groups using default, see :help group-name): -hi Comment cterm=NONE ctermfg=DarkCyan gui=NONE guifg=#00aaaa -hi Constant cterm=NONE ctermfg=LightCyan gui=NONE guifg=#00ffff -hi Identifier cterm=NONE ctermfg=LightMagenta gui=NONE guifg=#ff00ff -hi Function cterm=NONE ctermfg=LightGreen gui=NONE guifg=#00ff00 -hi Statement cterm=NONE ctermfg=White gui=bold guifg=#ffffff -hi PreProc cterm=NONE ctermfg=Yellow gui=NONE guifg=#ffff00 -hi Type cterm=NONE ctermfg=LightGreen gui=bold guifg=#00ff00 -hi Special cterm=NONE ctermfg=LightRed gui=NONE guifg=#ff0000 -hi Delimiter cterm=NONE ctermfg=Yellow gui=NONE guifg=#ffff00 +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif +" Background: dark +" Color: foreground #dadada 253 white +" Color: background #000000 16 black +" Color: color00 #303030 236 black +" Color: color08 #444444 238 darkgrey +" Color: color01 #870000 88 darkred +" Color: color09 #FF0000 196 red +" Color: color02 #5FD75F 77 darkgreen +" Color: color10 #00FF00 46 green +" Color: color03 #AFAF00 142 darkyellow +" Color: color11 #FFFF00 226 yellow +" Color: color04 #87AFFF 111 darkblue +" Color: color12 #005FFF 27 blue +" Color: color05 #AF00AF 127 darkmagenta +" Color: color13 #FF00FF 201 magenta +" Color: color06 #00AFAF 37 darkcyan +" Color: color14 #00FFFF 51 cyan +" Color: color07 #6C6C6C 242 grey +" Color: color15 #FFFFFF 231 white +" Term colors: color00 color01 color02 color03 color04 color05 color06 color07 +" Term colors: color08 color09 color10 color11 color12 color13 color14 color15 +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/koehler.vim b/runtime/colors/koehler.vim index 250472a162..efb2498e40 100644 --- a/runtime/colors/koehler.vim +++ b/runtime/colors/koehler.vim @@ -1,73 +1,360 @@ -" local syntax file - set colors on a per-machine basis: -" vim: tw=0 ts=4 sw=4 -" Vim color file -" Maintainer: Ron Aaron <ron@ronware.org> -" Last Change: 2016 Sep 04 +" Name: koehler +" Author: original author Ron Aaron <ron@ronware.org> +" Maintainer: original maintainer Ron Aaron <ron@ronware.org> +" Website: https://www.github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Thu May 12 18:53:29 2022 + +" Generated by Colortemplate v2.2.0 -hi clear set background=dark -if exists("syntax_on") - syntax reset + +hi clear +let g:colors_name = 'koehler' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +hi! link Terminal Normal +hi! link Boolean Constant +hi! link Character Constant +hi! link Conditional Statement +hi! link Debug Special +hi! link Define PreProc +hi! link Delimiter Special +hi! link Exception Statement +hi! link Float Number +hi! link Function Identifier +hi! link Include PreProc +hi! link IncSearch Visual +hi! link Keyword Statement +hi! link Label Statement +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link Macro PreProc +hi! link Number Constant +hi! link Operator Statement +hi! link PopupSelected PmenuSel +hi! link PreCondit PreProc +hi! link Repeat Statement +hi! link SpecialChar Special +hi! link SpecialComment Special +hi! link StatusLineTerm StatusLine +hi! link StatusLineTermNC StatusLineNC +hi! link StorageClass Type +hi! link String Constant +hi! link Structure Type +hi! link Tag Special +hi! link Typedef Type +hi! link lCursor Cursor +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff'] endif -let g:colors_name = "koehler" -hi Normal guifg=white guibg=black -hi Scrollbar guifg=darkcyan guibg=cyan -hi Menu guifg=black guibg=cyan -hi SpecialKey term=bold cterm=bold ctermfg=darkred guifg=#cc0000 -hi NonText term=bold cterm=bold ctermfg=darkred gui=bold guifg=#cc0000 -hi Directory term=bold cterm=bold ctermfg=brown guifg=#cc8000 -hi ErrorMsg term=standout cterm=bold ctermfg=grey ctermbg=red guifg=White guibg=Red -hi Search term=reverse ctermfg=white ctermbg=red guifg=white guibg=Red -hi MoreMsg term=bold cterm=bold ctermfg=darkgreen gui=bold guifg=SeaGreen -hi ModeMsg term=bold cterm=bold gui=bold guifg=White guibg=Blue -hi LineNr term=underline cterm=bold ctermfg=darkcyan guifg=Yellow -hi Question term=standout cterm=bold ctermfg=darkgreen gui=bold guifg=Green -hi StatusLine term=bold,reverse cterm=bold ctermfg=lightblue ctermbg=white gui=bold guifg=blue guibg=white -hi StatusLineNC term=reverse ctermfg=white ctermbg=lightblue guifg=white guibg=blue -hi Title term=bold cterm=bold ctermfg=darkmagenta gui=bold guifg=Magenta -hi Visual term=reverse cterm=reverse gui=reverse -hi WarningMsg term=standout cterm=bold ctermfg=darkred guifg=Red -hi Cursor guifg=bg guibg=Green -hi Comment term=bold cterm=bold ctermfg=cyan guifg=#80a0ff -hi Constant term=underline cterm=bold ctermfg=magenta guifg=#ffa0a0 -hi Special term=bold cterm=bold ctermfg=red guifg=Orange -hi Identifier term=underline ctermfg=brown guifg=#40ffff -hi Statement term=bold cterm=bold ctermfg=yellow gui=bold guifg=#ffff60 -hi PreProc term=underline ctermfg=darkmagenta guifg=#ff80ff -hi Type term=underline cterm=bold ctermfg=lightgreen gui=bold guifg=#60ff60 -hi Error term=reverse ctermfg=darkcyan ctermbg=black guifg=Red guibg=Black -hi Todo term=standout ctermfg=black ctermbg=darkcyan guifg=Blue guibg=Yellow -hi CursorLine term=underline guibg=#555555 cterm=underline -hi CursorColumn term=underline guibg=#555555 cterm=underline -hi MatchParen term=reverse ctermfg=blue guibg=Blue -hi TabLine term=bold,reverse cterm=bold ctermfg=lightblue ctermbg=white gui=bold guifg=blue guibg=white -hi TabLineFill term=bold,reverse cterm=bold ctermfg=lightblue ctermbg=white gui=bold guifg=blue guibg=white -hi TabLineSel term=reverse ctermfg=white ctermbg=lightblue guifg=white guibg=blue -hi Underlined term=underline cterm=bold,underline ctermfg=lightblue guifg=lightblue gui=bold,underline -hi Ignore ctermfg=black ctermbg=black guifg=black guibg=black -hi EndOfBuffer term=bold cterm=bold ctermfg=darkred guifg=#cc0000 gui=bold -hi link IncSearch Visual -hi link String Constant -hi link Character Constant -hi link Number Constant -hi link Boolean Constant -hi link Float Number -hi link Function Identifier -hi link Conditional Statement -hi link Repeat Statement -hi link Label Statement -hi link Operator Statement -hi link Keyword Statement -hi link Exception Statement -hi link Include PreProc -hi link Define PreProc -hi link Macro PreProc -hi link PreCondit PreProc -hi link StorageClass Type -hi link Structure Type -hi link Typedef Type -hi link Tag Special -hi link SpecialChar Special -hi link Delimiter Special -hi link SpecialComment Special -hi link Debug Special +hi Normal guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE +hi ColorColumn guifg=NONE guibg=#8b0000 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#555555 gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#555555 gui=NONE cterm=NONE +hi CursorLineNr guifg=#ffff00 guibg=NONE gui=bold cterm=NONE +hi Folded guifg=#00cdcd guibg=#666666 gui=NONE cterm=NONE +hi QuickFixLine guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi Conceal guifg=#e5e5e5 guibg=#a9a9a9 gui=NONE cterm=NONE +hi Cursor guifg=#000000 guibg=#00ff00 gui=NONE cterm=NONE +hi Directory guifg=#cc8000 guibg=NONE gui=NONE cterm=NONE +hi EndOfBuffer guifg=#cd0000 guibg=NONE gui=bold cterm=NONE +hi ErrorMsg guifg=#cd0000 guibg=#ffffff gui=reverse cterm=reverse +hi FoldColumn guifg=#00cdcd guibg=NONE gui=NONE cterm=NONE +hi LineNr guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE +hi MatchParen guifg=NONE guibg=#0000ff gui=NONE cterm=NONE +hi ModeMsg guifg=#ffffff guibg=#0000ff gui=bold cterm=NONE +hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold cterm=NONE +hi NonText guifg=#cd0000 guibg=NONE gui=bold cterm=NONE +hi Pmenu guifg=#ffffff guibg=#444444 gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE +hi Question guifg=#5c5cff guibg=NONE gui=bold cterm=NONE +hi Search guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE +hi SignColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#cd0000 guibg=NONE gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#60ff60 guibg=NONE guisp=#60ff60 gui=undercurl cterm=underline +hi SpellLocal guifg=#00ffff guibg=NONE guisp=#00ffff gui=undercurl cterm=underline +hi SpellRare guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline +hi StatusLine guifg=#0000ff guibg=#ffffff gui=bold cterm=NONE +hi StatusLineNC guifg=#0000ff guibg=#e5e5e5 gui=NONE cterm=NONE +hi TabLine guifg=#0000ff guibg=#ffffff gui=bold cterm=NONE +hi TabLineFill guifg=#0000ff guibg=#ffffff gui=bold cterm=NONE +hi TabLineSel guifg=#ffffff guibg=#0000ff gui=bold cterm=NONE +hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=NONE +hi VertSplit guifg=#0000ff guibg=#e5e5e5 gui=NONE cterm=NONE +hi Visual guifg=NONE guibg=#666666 gui=reverse cterm=reverse +hi VisualNOS guifg=NONE guibg=#000000 gui=bold,underline cterm=underline +hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE +hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi Comment guifg=#80a0ff guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#ffa0a0 guibg=NONE gui=NONE cterm=NONE +hi Error guifg=#cd0000 guibg=#ffffff gui=reverse cterm=reverse +hi Identifier guifg=#40ffff guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=#000000 guibg=#000000 gui=NONE cterm=NONE +hi PreProc guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#ffa500 guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#ffff60 guibg=NONE gui=bold cterm=NONE +hi Todo guifg=#0000ff guibg=#ffff00 gui=NONE cterm=NONE +hi Type guifg=#60ff60 guibg=NONE gui=bold cterm=NONE +hi Underlined guifg=#add8e6 guibg=NONE gui=bold,underline cterm=underline +hi CursorIM guifg=NONE guibg=fg gui=NONE cterm=NONE +hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi ToolbarButton guifg=#000000 guibg=#e5e5e5 gui=bold cterm=NONE +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi Normal ctermfg=231 ctermbg=16 cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=88 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=240 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=240 cterm=NONE + hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=NONE + hi Folded ctermfg=44 ctermbg=59 cterm=NONE + hi QuickFixLine ctermfg=16 ctermbg=226 cterm=NONE + hi Conceal ctermfg=254 ctermbg=145 cterm=NONE + hi Cursor ctermfg=16 ctermbg=46 cterm=NONE + hi Directory ctermfg=172 ctermbg=NONE cterm=NONE + hi EndOfBuffer ctermfg=160 ctermbg=NONE cterm=NONE + hi ErrorMsg ctermfg=160 ctermbg=231 cterm=reverse + hi FoldColumn ctermfg=44 ctermbg=NONE cterm=NONE + hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=NONE ctermbg=21 cterm=NONE + hi ModeMsg ctermfg=231 ctermbg=21 cterm=NONE + hi MoreMsg ctermfg=29 ctermbg=NONE cterm=NONE + hi NonText ctermfg=160 ctermbg=NONE cterm=NONE + hi Pmenu ctermfg=231 ctermbg=238 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=44 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE + hi Question ctermfg=63 ctermbg=NONE cterm=NONE + hi Search ctermfg=231 ctermbg=196 cterm=NONE + hi SignColumn ctermfg=51 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=160 ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=83 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=51 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=201 ctermbg=NONE cterm=underline + hi StatusLine ctermfg=21 ctermbg=231 cterm=NONE + hi StatusLineNC ctermfg=21 ctermbg=254 cterm=NONE + hi TabLine ctermfg=21 ctermbg=231 cterm=NONE + hi TabLineFill ctermfg=21 ctermbg=231 cterm=NONE + hi TabLineSel ctermfg=231 ctermbg=21 cterm=NONE + hi Title ctermfg=201 ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=21 ctermbg=254 cterm=NONE + hi Visual ctermfg=NONE ctermbg=59 cterm=reverse + hi VisualNOS ctermfg=NONE ctermbg=16 cterm=underline + hi WarningMsg ctermfg=196 ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi Comment ctermfg=111 ctermbg=NONE cterm=NONE + hi Constant ctermfg=217 ctermbg=NONE cterm=NONE + hi Error ctermfg=160 ctermbg=231 cterm=reverse + hi Identifier ctermfg=87 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=16 ctermbg=16 cterm=NONE + hi PreProc ctermfg=213 ctermbg=NONE cterm=NONE + hi Special ctermfg=214 ctermbg=NONE cterm=NONE + hi Statement ctermfg=227 ctermbg=NONE cterm=NONE + hi Todo ctermfg=21 ctermbg=226 cterm=NONE + hi Type ctermfg=83 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=153 ctermbg=NONE cterm=underline + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=16 ctermbg=254 cterm=NONE + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi Normal ctermfg=white ctermbg=black cterm=NONE + hi ColorColumn ctermfg=white ctermbg=darkred cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline + hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=black ctermbg=yellow cterm=NONE + hi Conceal ctermfg=grey ctermbg=grey cterm=NONE + hi Cursor ctermfg=black ctermbg=green cterm=NONE + hi Directory ctermfg=darkyellow ctermbg=NONE cterm=NONE + hi EndOfBuffer ctermfg=darkred ctermbg=NONE cterm=NONE + hi ErrorMsg ctermfg=darkred ctermbg=white cterm=reverse + hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi LineNr ctermfg=yellow ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=NONE ctermbg=darkblue cterm=NONE + hi ModeMsg ctermfg=white ctermbg=darkblue cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi NonText ctermfg=darkred ctermbg=NONE cterm=NONE + hi Pmenu ctermfg=white ctermbg=darkgrey cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE + hi Question ctermfg=blue ctermbg=NONE cterm=NONE + hi Search ctermfg=white ctermbg=red cterm=NONE + hi SignColumn ctermfg=cyan ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=darkred ctermbg=NONE cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=green ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=cyan ctermbg=NONE cterm=underline + hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline + hi StatusLine ctermfg=darkblue ctermbg=white cterm=NONE + hi StatusLineNC ctermfg=darkblue ctermbg=grey cterm=NONE + hi TabLine ctermfg=darkblue ctermbg=white cterm=NONE + hi TabLineFill ctermfg=darkblue ctermbg=white cterm=NONE + hi TabLineSel ctermfg=white ctermbg=darkblue cterm=NONE + hi Title ctermfg=magenta ctermbg=NONE cterm=NONE + hi VertSplit ctermfg=darkblue ctermbg=grey cterm=NONE + hi Visual ctermfg=NONE ctermbg=darkgrey cterm=reverse + hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline + hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE + hi Comment ctermfg=blue ctermbg=NONE cterm=NONE + hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE + hi Error ctermfg=darkred ctermbg=white cterm=reverse + hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE + hi Ignore ctermfg=black ctermbg=black cterm=NONE + hi PreProc ctermfg=magenta ctermbg=NONE cterm=NONE + hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE + hi Statement ctermfg=yellow ctermbg=NONE cterm=NONE + hi Todo ctermfg=darkblue ctermbg=yellow cterm=NONE + hi Type ctermfg=green ctermbg=NONE cterm=NONE + hi Underlined ctermfg=blue ctermbg=NONE cterm=underline + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=black ctermbg=grey cterm=NONE + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif + +" Background: dark +" Color: xterm0 #000000 16 black +" Color: xterm1 #cd0000 160 darkred +" Color: xterm2 #00cd00 40 darkgreen +" Color: xterm3 #cdcd00 184 darkyellow +" Color: xterm4 #0000ee 20 darkblue +" Color: xterm5 #cd00cd 164 darkmagenta +" Color: xterm6 #00cdcd 44 darkcyan +" Color: xterm7 #e5e5e5 254 grey +" Color: xterm8 #7f7f7f 102 darkgrey +" Color: xterm9 #ff0000 196 red +" Color: xterm10 #00ff00 46 green +" Color: xterm11 #ffff00 226 yellow +" Color: xterm12 #5c5cff 63 blue +" Color: xterm13 #ff00ff 201 magenta +" Color: xterm14 #00ffff 51 cyan +" Color: xterm15 #ffffff 231 white +" Color: Pmenu #444444 238 darkgrey +" Color: rgbGrey40 #666666 59 darkgrey +" Color: rgbDarkGrey #a9a9a9 145 grey +" Color: rgbDarkBlue #00008b 20 darkblue +" Color: rgbDarkMagenta #8b008b 90 darkmagenta +" Color: rgbBlue #0000ff 21 darkblue +" Color: rgbDarkCyan #008b8b 44 darkcyan +" Color: rgbSeaGreen #2e8b57 29 darkgreen +" Color: rgbGrey #bebebe 250 grey +" Color: StatusLineTerm #90ee90 120 darkgreen +" Color: ToolbarLine #7f7f7f 244 darkgrey +" Color: Comment #80a0ff 111 blue +" Color: Constant #ffa0a0 217 darkred +" Color: Special #ffa500 214 darkyellow +" Color: Identifier #40ffff 87 cyan +" Color: Statement #ffff60 227 yellow +" Color: PreProc #ff80ff 213 magenta +" Color: Type #60ff60 83 green +" Color: koeDirectory #cc8000 172 darkyellow +" Color: koeCursorLine #555555 240 black +" Color: koeLightBlue #ADD8E6 153 blue +" Color: koeDarkRed #8b0000 88 darkred +" Term colors: xterm0 xterm1 xterm2 xterm3 xterm4 xterm5 xterm6 xterm7 +" Term colors: xterm8 xterm9 xterm10 xterm11 xterm12 xterm13 +" Term colors: xterm14 xterm15 +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/morning.vim b/runtime/colors/morning.vim index fca9c2a742..5a00508e6b 100644 --- a/runtime/colors/morning.vim +++ b/runtime/colors/morning.vim @@ -1,55 +1,334 @@ -" Vim color file -" Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2006 Apr 15 +" Name: morning +" Description: Colorscheme with light grey background. +" Author: Original author Bram Moolenaar <Bram@vim.org> +" Maintainer: Original maintainer Bram Moolenaar <Bram@vim.org> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Sat May 14 11:15:43 2022 -" This color scheme uses a light grey background. +" Generated by Colortemplate v2.2.0 -" First remove all existing highlighting. set background=light + hi clear -if exists("syntax_on") - syntax reset +let g:colors_name = 'morning' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#e4e4e4', '#a52a2a', '#ff00ff', '#6a0dad', '#008787', '#2e8b57', '#6a5acd', '#bcbcbc', '#0000ff', '#a52a2a', '#ff00ff', '#6a0dad', '#008787', '#2e8b57', '#6a5acd', '#000000'] +endif +hi! link StatuslineTerm Statusline +hi! link StatuslineTermNC StatuslineNC +hi Normal guifg=#000000 guibg=#e4e4e4 gui=NONE cterm=NONE +hi EndOfBuffer guifg=#0000ff guibg=#cccccc gui=bold cterm=NONE +hi Folded guifg=#00008b guibg=#d3d3d3 gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#d3d3d3 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#d3d3d3 gui=NONE cterm=NONE +hi CursorLineNr guifg=#a52a2a guibg=NONE gui=bold cterm=NONE +hi QuickFixLine guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi StatusLine guifg=#eeeeee guibg=#000000 gui=bold cterm=NONE +hi StatusLineNC guifg=#bcbcbc guibg=#000000 gui=NONE cterm=NONE +hi VertSplit guifg=#bcbcbc guibg=#000000 gui=NONE cterm=NONE +hi Pmenu guifg=#000000 guibg=#b2b2b2 gui=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=#e4e4e4 gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#000000 gui=NONE cterm=NONE +hi TabLine guifg=#000000 guibg=#bcbcbc gui=underline cterm=underline +hi TabLineFill guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse +hi TabLineSel guifg=#000000 guibg=#e4e4e4 gui=bold cterm=NONE +hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi ToolbarButton guifg=NONE guibg=#bcbcbc gui=bold cterm=NONE +hi NonText guifg=#0000ff guibg=#bcbcbc gui=bold cterm=NONE +hi SpecialKey guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE +hi Visual guifg=NONE guibg=#d0d0d0 gui=NONE cterm=NONE +hi VisualNOS guifg=NONE guibg=#0000ff gui=NONE cterm=NONE +hi LineNr guifg=#a52a2a guibg=NONE gui=NONE cterm=NONE +hi FoldColumn guifg=#00008b guibg=NONE gui=NONE cterm=NONE +hi SignColumn guifg=#00008b guibg=NONE gui=NONE cterm=NONE +hi Underlined guifg=#6a5acd guibg=NONE gui=underline cterm=underline +hi Error guifg=#ff0000 guibg=#e4e4e4 gui=reverse cterm=reverse +hi ErrorMsg guifg=#ff0000 guibg=#e4e4e4 gui=reverse cterm=reverse +hi WarningMsg guifg=#6a0dad guibg=NONE gui=bold cterm=NONE +hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold cterm=NONE +hi ModeMsg guifg=#000000 guibg=NONE gui=bold cterm=NONE +hi Question guifg=#008787 guibg=NONE gui=bold cterm=NONE +hi Todo guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi MatchParen guifg=#e4e4e4 guibg=#6a5acd gui=NONE cterm=NONE +hi Search guifg=#e4e4e4 guibg=#6a0dad gui=NONE cterm=NONE +hi IncSearch guifg=#2e8b57 guibg=NONE gui=reverse cterm=reverse +hi WildMenu guifg=#000000 guibg=#ffff00 gui=bold cterm=NONE +hi ColorColumn guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE +hi Cursor guifg=#e4e4e4 guibg=#2e8b57 gui=NONE cterm=NONE +hi lCursor guifg=#e4e4e4 guibg=#a52a2a gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#00d700 guibg=NONE guisp=#00d700 gui=undercurl cterm=underline +hi SpellLocal guifg=#a52a2a guibg=NONE guisp=#a52a2a gui=undercurl cterm=underline +hi SpellRare guifg=#2e8b57 guibg=NONE guisp=#2e8b57 gui=undercurl cterm=underline +hi Comment guifg=#0000ff guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#ff00ff guibg=#eeeeee gui=NONE cterm=NONE +hi Identifier guifg=#008787 guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#a52a2a guibg=NONE gui=bold cterm=NONE +hi PreProc guifg=#6a0dad guibg=NONE gui=NONE cterm=NONE +hi Type guifg=#2e8b57 guibg=NONE gui=bold cterm=NONE +hi Special guifg=#6a5acd guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Directory guifg=#008787 guibg=NONE gui=bold cterm=NONE +hi Conceal guifg=#0000ff guibg=NONE gui=NONE cterm=NONE +hi Title guifg=#a52a2a guibg=NONE gui=bold cterm=NONE +hi! link Terminal Normal +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi! link StatuslineTerm Statusline + hi! link StatuslineTermNC StatuslineNC + hi Normal ctermfg=16 ctermbg=254 cterm=NONE + hi EndOfBuffer ctermfg=21 ctermbg=252 cterm=NONE + hi Folded ctermfg=18 ctermbg=252 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=252 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=252 cterm=NONE + hi CursorLineNr ctermfg=124 ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=16 ctermbg=226 cterm=NONE + hi StatusLine ctermfg=255 ctermbg=16 cterm=NONE + hi StatusLineNC ctermfg=250 ctermbg=16 cterm=NONE + hi VertSplit ctermfg=250 ctermbg=16 cterm=NONE + hi Pmenu ctermfg=16 ctermbg=249 cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=226 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=254 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=16 cterm=NONE + hi TabLine ctermfg=16 ctermbg=250 cterm=underline + hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse + hi TabLineSel ctermfg=16 ctermbg=254 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=NONE ctermbg=250 cterm=NONE + hi NonText ctermfg=21 ctermbg=250 cterm=NONE + hi SpecialKey ctermfg=250 ctermbg=NONE cterm=NONE + hi Visual ctermfg=NONE ctermbg=252 cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=21 cterm=NONE + hi LineNr ctermfg=124 ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=18 ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=18 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=62 ctermbg=NONE cterm=underline + hi Error ctermfg=196 ctermbg=254 cterm=reverse + hi ErrorMsg ctermfg=196 ctermbg=254 cterm=reverse + hi WarningMsg ctermfg=55 ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=29 ctermbg=NONE cterm=NONE + hi ModeMsg ctermfg=16 ctermbg=NONE cterm=NONE + hi Question ctermfg=30 ctermbg=NONE cterm=NONE + hi Todo ctermfg=16 ctermbg=226 cterm=NONE + hi MatchParen ctermfg=254 ctermbg=62 cterm=NONE + hi Search ctermfg=254 ctermbg=55 cterm=NONE + hi IncSearch ctermfg=29 ctermbg=NONE cterm=reverse + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi ColorColumn ctermfg=16 ctermbg=231 cterm=NONE + hi Cursor ctermfg=254 ctermbg=29 cterm=NONE + hi lCursor ctermfg=254 ctermbg=124 cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=40 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=124 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=29 ctermbg=NONE cterm=underline + hi Comment ctermfg=21 ctermbg=NONE cterm=NONE + hi Constant ctermfg=201 ctermbg=255 cterm=NONE + hi Identifier ctermfg=30 ctermbg=NONE cterm=NONE + hi Statement ctermfg=124 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=55 ctermbg=NONE cterm=NONE + hi Type ctermfg=29 ctermbg=NONE cterm=NONE + hi Special ctermfg=62 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Directory ctermfg=30 ctermbg=NONE cterm=NONE + hi Conceal ctermfg=21 ctermbg=NONE cterm=NONE + hi Title ctermfg=124 ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi! link StatuslineTerm Statusline + hi! link StatuslineTermNC StatuslineNC + hi Normal ctermfg=black ctermbg=grey cterm=NONE + hi EndOfBuffer ctermfg=blue ctermbg=NONE cterm=NONE + hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=darkred ctermbg=NONE cterm=underline + hi QuickFixLine ctermfg=black ctermbg=yellow cterm=NONE + hi StatusLine ctermfg=white ctermbg=black cterm=NONE + hi StatusLineNC ctermfg=darkgrey ctermbg=black cterm=NONE + hi VertSplit ctermfg=darkgrey ctermbg=black cterm=NONE + hi Pmenu ctermfg=black ctermbg=white cterm=NONE + hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=grey cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=black cterm=NONE + hi TabLine ctermfg=black ctermbg=white cterm=underline + hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse + hi TabLineSel ctermfg=black ctermbg=grey cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=NONE ctermbg=white cterm=NONE + hi NonText ctermfg=blue ctermbg=white cterm=NONE + hi SpecialKey ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi Visual ctermfg=NONE ctermbg=white cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=blue cterm=NONE + hi LineNr ctermfg=darkred ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=darkblue ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=darkblue ctermbg=NONE cterm=NONE + hi Underlined ctermfg=darkblue ctermbg=NONE cterm=underline + hi Error ctermfg=red ctermbg=grey cterm=reverse + hi ErrorMsg ctermfg=red ctermbg=grey cterm=reverse + hi WarningMsg ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi ModeMsg ctermfg=black ctermbg=NONE cterm=NONE + hi Question ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Todo ctermfg=black ctermbg=yellow cterm=NONE + hi MatchParen ctermfg=grey ctermbg=darkblue cterm=NONE + hi Search ctermfg=grey ctermbg=darkmagenta cterm=NONE + hi IncSearch ctermfg=darkgreen ctermbg=NONE cterm=reverse + hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE + hi ColorColumn ctermfg=black ctermbg=white cterm=NONE + hi Cursor ctermfg=grey ctermbg=darkgreen cterm=NONE + hi lCursor ctermfg=grey ctermbg=darkred cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=darkred ctermbg=NONE cterm=underline + hi SpellRare ctermfg=darkgreen ctermbg=NONE cterm=underline + hi Comment ctermfg=blue ctermbg=NONE cterm=NONE + hi Constant ctermfg=magenta ctermbg=white cterm=NONE + hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Statement ctermfg=darkred ctermbg=NONE cterm=NONE + hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Special ctermfg=darkblue ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Directory ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Conceal ctermfg=blue ctermbg=NONE cterm=NONE + hi Title ctermfg=darkred ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish endif -let colors_name = "morning" - -hi Normal ctermfg=Black ctermbg=LightGrey guifg=Black guibg=grey90 - -" Groups used in the 'highlight' and 'guicursor' options default value. -hi ErrorMsg term=standout ctermbg=DarkRed ctermfg=White guibg=Red guifg=White -hi IncSearch term=reverse cterm=reverse gui=reverse -hi ModeMsg term=bold cterm=bold gui=bold -hi StatusLine term=reverse,bold cterm=reverse,bold gui=reverse,bold -hi StatusLineNC term=reverse cterm=reverse gui=reverse -hi VertSplit term=reverse cterm=reverse gui=reverse -hi Visual term=reverse ctermbg=grey guibg=grey80 -hi DiffText term=reverse cterm=bold ctermbg=Red gui=bold guibg=Red -hi Cursor guibg=Green guifg=NONE -hi lCursor guibg=Cyan guifg=NONE -hi Directory term=bold ctermfg=DarkBlue guifg=Blue -hi LineNr term=underline ctermfg=Brown guifg=Brown -hi MoreMsg term=bold ctermfg=DarkGreen gui=bold guifg=SeaGreen -hi NonText term=bold ctermfg=Blue gui=bold guifg=Blue guibg=grey80 -hi Question term=standout ctermfg=DarkGreen gui=bold guifg=SeaGreen -hi Search term=reverse ctermbg=Yellow ctermfg=NONE guibg=Yellow guifg=NONE -hi SpecialKey term=bold ctermfg=DarkBlue guifg=Blue -hi Title term=bold ctermfg=DarkMagenta gui=bold guifg=Magenta -hi WarningMsg term=standout ctermfg=DarkRed guifg=Red -hi WildMenu term=standout ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black -hi Folded term=standout ctermbg=Grey ctermfg=DarkBlue guibg=LightGrey guifg=DarkBlue -hi FoldColumn term=standout ctermbg=Grey ctermfg=DarkBlue guibg=Grey guifg=DarkBlue -hi DiffAdd term=bold ctermbg=LightBlue guibg=LightBlue -hi DiffChange term=bold ctermbg=LightMagenta guibg=LightMagenta -hi DiffDelete term=bold ctermfg=Blue ctermbg=LightCyan gui=bold guifg=Blue guibg=LightCyan -hi CursorLine term=underline cterm=underline guibg=grey80 -hi CursorColumn term=reverse ctermbg=grey guibg=grey80 - -" Colors for syntax highlighting -hi Constant term=underline ctermfg=DarkRed guifg=Magenta guibg=grey95 -hi Special term=bold ctermfg=DarkMagenta guifg=SlateBlue guibg=grey95 -if &t_Co > 8 - hi Statement term=bold cterm=bold ctermfg=Brown gui=bold guifg=Brown +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish endif -hi Ignore ctermfg=LightGrey guifg=grey90 -" vim: sw=2 +" Background: light +" Color: comment #0000ff 21 blue +" Color: constant #ff00ff 201 magenta +" Color: identifier #008787 30 darkcyan +" Color: statement #a52a2a 124 darkred +" Color: preproc #6a0dad 55 darkmagenta +" Color: type #2e8b57 29 darkgreen +" Color: special #6a5acd 62 darkblue +" Color: fg0 #000000 16 black +" Color: bg0 #e4e4e4 254 grey +" Color: bg1 #bcbcbc 250 white +" Color: status #bcbcbc 250 darkgrey +" Color: bg2 #eeeeee 255 white +" Color: endofbuffer #cccccc 252 darkgrey +" Color: visual #d0d0d0 252 white +" Color: folded #d3d3d3 252 darkgrey +" Color: folded_fg #00008b 18 darkblue +" Color: pmenu #b2b2b2 249 white +" Color: wildmenu #ffff00 226 yellow +" Color: error #ff0000 196 red +" Color: colorcolumn #ffffff 231 white +" Color: spellcap #00d700 40 green +" Term colors: bg0 statement constant preproc identifier type special bg1 +" Term colors: comment statement constant preproc identifier type special fg0 +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/murphy.vim b/runtime/colors/murphy.vim index 1f439964ef..18ce180615 100644 --- a/runtime/colors/murphy.vim +++ b/runtime/colors/murphy.vim @@ -1,41 +1,335 @@ -" local syntax file - set colors on a per-machine basis: -" vim: tw=0 ts=4 sw=4 -" Vim color file -" Maintainer: Ron Aaron <ron@ronware.org> -" Last Change: 2003 May 02 +" Name: murphy +" Description: Green foreground black background. +" Author: Original author Ron Aaron <ron@ronware.org>. +" Maintainer: Original maintainer Ron Aaron <ron@ronware.org>. +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:41 2022 + +" Generated by Colortemplate v2.2.0 -hi clear set background=dark -if exists("syntax_on") - syntax reset + +hi clear +let g:colors_name = 'murphy' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#303030', '#ffa700', '#005f00', '#ffd7af', '#87afff', '#ffafaf', '#00afaf', '#bcbcbc', '#444444', '#ff0000', '#00875f', '#ffff00', '#005fff', '#ff00ff', '#00ffff', '#ffffff'] endif -let g:colors_name = "murphy" - -hi Normal ctermbg=Black ctermfg=lightgreen guibg=Black guifg=lightgreen -hi Comment term=bold ctermfg=LightRed guifg=Orange -hi Constant term=underline ctermfg=LightGreen guifg=White gui=NONE -hi Identifier term=underline ctermfg=LightCyan guifg=#00ffff -hi Ignore ctermfg=black guifg=bg -hi PreProc term=underline ctermfg=LightBlue guifg=Wheat -hi Search term=reverse guifg=white guibg=Blue -hi Special term=bold ctermfg=LightRed guifg=magenta -hi Statement term=bold ctermfg=Yellow guifg=#ffff00 gui=NONE -hi Type ctermfg=LightGreen guifg=grey gui=none -hi Error term=reverse ctermbg=Red ctermfg=White guibg=Red guifg=White -hi Todo term=standout ctermbg=Yellow ctermfg=Black guifg=Blue guibg=Yellow -" From the source: -hi Cursor guifg=Orchid guibg=fg -hi Directory term=bold ctermfg=LightCyan guifg=Cyan -hi ErrorMsg term=standout ctermbg=DarkRed ctermfg=White guibg=Red guifg=White -hi IncSearch term=reverse cterm=reverse gui=reverse -hi LineNr term=underline ctermfg=Yellow guifg=Yellow -hi ModeMsg term=bold cterm=bold gui=bold -hi MoreMsg term=bold ctermfg=LightGreen gui=bold guifg=SeaGreen -hi NonText term=bold ctermfg=Blue gui=bold guifg=Blue -hi Question term=standout ctermfg=LightGreen gui=bold guifg=Cyan -hi SpecialKey term=bold ctermfg=LightBlue guifg=Cyan -hi StatusLine term=reverse,bold cterm=reverse gui=NONE guifg=White guibg=darkblue -hi StatusLineNC term=reverse cterm=reverse gui=NONE guifg=white guibg=#333333 -hi Title term=bold ctermfg=LightMagenta gui=bold guifg=Pink -hi WarningMsg term=standout ctermfg=LightRed guifg=Red -hi Visual term=reverse cterm=reverse gui=NONE guifg=white guibg=darkgreen +hi! link StatusLineTerm StatusLine +hi! link StatusLineTermNC StatusLineNC +hi Normal guifg=#87ff87 guibg=#000000 gui=NONE cterm=NONE +hi EndOfBuffer guifg=#0000ff guibg=#000000 gui=NONE cterm=NONE +hi StatusLine guifg=#ffffff guibg=#00008b gui=NONE cterm=NONE +hi StatusLineNC guifg=#ffffff guibg=#3a3a3a gui=NONE cterm=NONE +hi VertSplit guifg=#ffffff guibg=#3a3a3a gui=NONE cterm=NONE +hi Pmenu guifg=#ffffff guibg=#444444 gui=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=#303030 gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#bcbcbc gui=NONE cterm=NONE +hi TabLineFill guifg=NONE guibg=#303030 gui=NONE cterm=NONE +hi TabLine guifg=#87ff87 guibg=#444444 gui=NONE cterm=NONE +hi TabLineSel guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE +hi ToolbarLine guifg=NONE guibg=#303030 gui=NONE cterm=NONE +hi ToolbarButton guifg=#ffffff guibg=#444444 gui=bold cterm=NONE +hi NonText guifg=#00afaf guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#00afaf guibg=NONE gui=NONE cterm=NONE +hi QuickFixLine guifg=#303030 guibg=#00afaf gui=NONE cterm=NONE +hi Folded guifg=#00afaf guibg=#303030 gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#444444 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#444444 gui=NONE cterm=NONE +hi CursorLineNr guifg=#ffff00 guibg=NONE gui=bold cterm=NONE +hi ColorColumn guifg=NONE guibg=#262626 gui=NONE cterm=NONE +hi Visual guifg=#ffffff guibg=#005f00 gui=NONE cterm=NONE +hi VisualNOS guifg=#ffffff guibg=#005f00 gui=NONE cterm=NONE +hi LineNr guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE +hi FoldColumn guifg=#00afaf guibg=NONE gui=NONE cterm=NONE +hi SignColumn guifg=#00afaf guibg=NONE gui=NONE cterm=NONE +hi Underlined guifg=#00afaf guibg=NONE gui=underline cterm=underline +hi Error guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE +hi ErrorMsg guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE +hi ModeMsg guifg=#87ff87 guibg=NONE gui=bold cterm=NONE +hi WarningMsg guifg=#ffa700 guibg=NONE gui=bold cterm=NONE +hi MoreMsg guifg=#005f00 guibg=NONE gui=bold cterm=NONE +hi Question guifg=#00ffff guibg=NONE gui=bold cterm=NONE +hi Todo guifg=#0000ff guibg=#ffff00 gui=NONE cterm=NONE +hi MatchParen guifg=#303030 guibg=#ffd7af gui=NONE cterm=NONE +hi Search guifg=#ffffff guibg=#0000ff gui=NONE cterm=NONE +hi IncSearch guifg=#ffa700 guibg=NONE gui=reverse cterm=reverse +hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi Cursor guifg=#000000 guibg=#87ff87 gui=NONE cterm=NONE +hi lCursor guifg=#000000 guibg=#ff0000 gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#00ffff guibg=NONE guisp=#00ffff gui=undercurl cterm=underline +hi SpellLocal guifg=#ffd7af guibg=NONE guisp=#ffd7af gui=undercurl cterm=underline +hi SpellRare guifg=#ffff00 guibg=NONE guisp=#ffff00 gui=undercurl cterm=underline +hi Comment guifg=#ffa700 guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#ffffff guibg=NONE gui=NONE cterm=NONE +hi PreProc guifg=#ffd7af guibg=NONE gui=NONE cterm=NONE +hi Type guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE +hi Directory guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi Conceal guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=NONE +hi! link Terminal Normal +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi Normal ctermfg=120 ctermbg=16 cterm=NONE + hi EndOfBuffer ctermfg=21 ctermbg=16 cterm=NONE + hi StatusLine ctermfg=231 ctermbg=18 cterm=NONE + hi StatusLineNC ctermfg=231 ctermbg=237 cterm=NONE + hi VertSplit ctermfg=231 ctermbg=237 cterm=NONE + hi Pmenu ctermfg=231 ctermbg=238 cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=226 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=236 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=250 cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=236 cterm=NONE + hi TabLine ctermfg=120 ctermbg=238 cterm=NONE + hi TabLineSel ctermfg=231 ctermbg=16 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=236 cterm=NONE + hi ToolbarButton ctermfg=231 ctermbg=238 cterm=NONE + hi NonText ctermfg=37 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=37 ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=236 ctermbg=37 cterm=NONE + hi Folded ctermfg=37 ctermbg=236 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=238 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=238 cterm=NONE + hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=235 cterm=NONE + hi Visual ctermfg=231 ctermbg=22 cterm=NONE + hi VisualNOS ctermfg=231 ctermbg=22 cterm=NONE + hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=37 ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=37 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=37 ctermbg=NONE cterm=underline + hi Error ctermfg=231 ctermbg=196 cterm=NONE + hi ErrorMsg ctermfg=231 ctermbg=196 cterm=NONE + hi ModeMsg ctermfg=120 ctermbg=NONE cterm=NONE + hi WarningMsg ctermfg=214 ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=22 ctermbg=NONE cterm=NONE + hi Question ctermfg=51 ctermbg=NONE cterm=NONE + hi Todo ctermfg=21 ctermbg=226 cterm=NONE + hi MatchParen ctermfg=236 ctermbg=223 cterm=NONE + hi Search ctermfg=231 ctermbg=21 cterm=NONE + hi IncSearch ctermfg=214 ctermbg=NONE cterm=reverse + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi Cursor ctermfg=16 ctermbg=120 cterm=NONE + hi lCursor ctermfg=16 ctermbg=196 cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=51 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=223 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=226 ctermbg=NONE cterm=underline + hi Comment ctermfg=214 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=51 ctermbg=NONE cterm=NONE + hi Statement ctermfg=226 ctermbg=NONE cterm=NONE + hi Constant ctermfg=231 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=223 ctermbg=NONE cterm=NONE + hi Type ctermfg=250 ctermbg=NONE cterm=NONE + hi Special ctermfg=201 ctermbg=NONE cterm=NONE + hi Directory ctermfg=51 ctermbg=NONE cterm=NONE + hi Conceal ctermfg=250 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=201 ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi Normal ctermfg=green ctermbg=black cterm=NONE + hi EndOfBuffer ctermfg=blue ctermbg=black cterm=NONE + hi StatusLine ctermfg=white ctermbg=darkblue cterm=NONE + hi StatusLineNC ctermfg=white ctermbg=darkgrey cterm=NONE + hi VertSplit ctermfg=white ctermbg=darkgrey cterm=NONE + hi Pmenu ctermfg=white ctermbg=darkgrey cterm=NONE + hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=grey cterm=NONE + hi TabLine ctermfg=green ctermbg=darkgrey cterm=NONE + hi TabLineSel ctermfg=white ctermbg=black cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE + hi ToolbarButton ctermfg=white ctermbg=darkgrey cterm=NONE + hi NonText ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=black ctermbg=darkcyan cterm=NONE + hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline + hi ColorColumn ctermfg=green ctermbg=darkgrey cterm=NONE + hi Visual ctermfg=white ctermbg=darkgreen cterm=NONE + hi VisualNOS ctermfg=white ctermbg=darkgreen cterm=NONE + hi LineNr ctermfg=yellow ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Underlined ctermfg=darkcyan ctermbg=NONE cterm=underline + hi Error ctermfg=white ctermbg=red cterm=NONE + hi ErrorMsg ctermfg=white ctermbg=red cterm=NONE + hi ModeMsg ctermfg=green ctermbg=NONE cterm=NONE + hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Question ctermfg=cyan ctermbg=NONE cterm=NONE + hi Todo ctermfg=blue ctermbg=yellow cterm=NONE + hi MatchParen ctermfg=black ctermbg=darkyellow cterm=NONE + hi Search ctermfg=white ctermbg=blue cterm=NONE + hi IncSearch ctermfg=darkred ctermbg=NONE cterm=reverse + hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE + hi Cursor ctermfg=black ctermbg=green cterm=NONE + hi lCursor ctermfg=black ctermbg=red cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=cyan ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=darkyellow ctermbg=NONE cterm=underline + hi SpellRare ctermfg=yellow ctermbg=NONE cterm=underline + hi Comment ctermfg=darkred ctermbg=NONE cterm=NONE + hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE + hi Statement ctermfg=yellow ctermbg=NONE cterm=NONE + hi Constant ctermfg=white ctermbg=NONE cterm=NONE + hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Type ctermfg=grey ctermbg=NONE cterm=NONE + hi Special ctermfg=magenta ctermbg=NONE cterm=NONE + hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE + hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=magenta ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif + +" Background: dark +" Color: foreground #87FF87 120 green +" Color: background #000000 16 black +" Color: color00 #303030 236 black +" Color: color08 #444444 238 darkgrey +" Color: color01 #FFA700 214 darkred +" Color: color09 #FF0000 196 red +" Color: color02 #005F00 22 darkgreen +" Color: color10 #00875F 29 green +" Color: color03 #FFD7AF 223 darkyellow +" Color: color11 #FFFF00 226 yellow +" Color: color04 #00008B 18 darkblue +" Color: color12 #0000FF 21 blue +" Color: color05 #FFAFAF 217 darkmagenta +" Color: color13 #FF00FF 201 magenta +" Color: color06 #00AFAF 37 darkcyan +" Color: color14 #00FFFF 51 cyan +" Color: color07 #BCBCBC 250 grey +" Color: color15 #FFFFFF 231 white +" Color: color16 #262626 235 black +" Color: color17 #3A3A3A 237 darkgrey +" Color: color04t #87AFFF 111 darkblue +" Color: color12t #005FFF 27 blue +" Term colors: color00 color01 color02 color03 color04t color05 color06 color07 +" Term colors: color08 color09 color10 color11 color12t color13 color14 color15 +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/pablo.vim b/runtime/colors/pablo.vim index e6bf737046..c7c8009551 100644 --- a/runtime/colors/pablo.vim +++ b/runtime/colors/pablo.vim @@ -1,26 +1,362 @@ -" local syntax file - set colors on a per-machine basis: -" vim: tw=0 ts=4 sw=4 -" Vim color file -" Maintainer: Ron Aaron <ron@ronware.org> -" Last Change: 2003 May 02 +" Name: pablo +" Author: Ron Aaron <ron@ronware.org> +" Maintainer: Original maintainerRon Aaron <ron@ronware.org> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:41 2022 + +" Generated by Colortemplate v2.2.0 -hi clear set background=dark -if exists("syntax_on") - syntax reset + +hi clear +let g:colors_name = 'pablo' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff'] endif -let g:colors_name = "pablo" - -highlight Comment ctermfg=8 guifg=#808080 -highlight Constant ctermfg=14 cterm=none guifg=#00ffff gui=none -highlight Identifier ctermfg=6 guifg=#00c0c0 -highlight Statement ctermfg=3 cterm=bold guifg=#c0c000 gui=bold -highlight PreProc ctermfg=10 guifg=#00ff00 -highlight Type ctermfg=2 guifg=#00c000 -highlight Special ctermfg=12 guifg=#0000ff -highlight Error ctermbg=9 guibg=#ff0000 -highlight Todo ctermfg=4 ctermbg=3 guifg=#000080 guibg=#c0c000 -highlight Directory ctermfg=2 guifg=#00c000 -highlight StatusLine ctermfg=11 ctermbg=12 cterm=none guifg=#ffff00 guibg=#0000ff gui=none -highlight Normal guifg=#ffffff guibg=#000000 -highlight Search ctermbg=3 guibg=#c0c000 +hi Normal guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE +hi! link Terminal Normal +hi! link StatusLineTerm StatusLine +hi! link StatusLineTermNC StatusLineNC +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi Comment guifg=#808080 guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#00c0c0 guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#c0c000 guibg=NONE gui=bold cterm=NONE +hi PreProc guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE +hi Type guifg=#00c000 guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#0000ff guibg=NONE gui=NONE cterm=NONE +hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline +hi Ignore guifg=#000000 guibg=#000000 gui=NONE cterm=NONE +hi Error guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE +hi Todo guifg=#000000 guibg=#c0c000 gui=NONE cterm=NONE +hi Conceal guifg=#e5e5e5 guibg=#a9a9a9 gui=NONE cterm=NONE +hi Cursor guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE +hi lCursor guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE +hi CursorIM guifg=NONE guibg=fg gui=NONE cterm=NONE +hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=NONE +hi Directory guifg=#00c000 guibg=NONE gui=NONE cterm=NONE +hi Search guifg=#000000 guibg=#c0c000 gui=NONE cterm=NONE +hi IncSearch guifg=#ffffff guibg=NONE gui=reverse cterm=reverse +hi NonText guifg=#0000ff guibg=NONE gui=bold cterm=NONE +hi EndOfBuffer guifg=#0000ff guibg=NONE gui=bold cterm=NONE +hi ErrorMsg guifg=#ffffff guibg=#cd0000 gui=NONE cterm=NONE +hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE +hi SignColumn guifg=#00ffff guibg=#a9a9a9 gui=NONE cterm=NONE +hi ColorColumn guifg=NONE guibg=#4d4d4d gui=NONE cterm=NONE +hi FoldColumn guifg=#7f7f7f guibg=#303030 gui=NONE cterm=NONE +hi Folded guifg=#7f7f7f guibg=#303030 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#3a3a3a gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#3a3a3a gui=NONE cterm=NONE +hi CursorLineNr guifg=#ffff00 guibg=#3a3a3a gui=bold cterm=NONE +hi Visual guifg=#00008b guibg=#a9a9a9 gui=NONE cterm=NONE +hi VisualNOS guifg=NONE guibg=#000000 gui=bold,underline cterm=underline +hi LineNr guifg=#7f7f7f guibg=NONE gui=NONE cterm=NONE +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi MatchParen guifg=NONE guibg=#008b8b gui=NONE cterm=NONE +hi ModeMsg guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=NONE +hi MoreMsg guifg=#5c5cff guibg=NONE gui=bold cterm=NONE +hi Question guifg=#00ff00 guibg=NONE gui=bold cterm=NONE +hi SpecialKey guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi QuickFixLine guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#5c5cff guibg=NONE guisp=#5c5cff gui=undercurl cterm=underline +hi SpellLocal guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline +hi SpellRare guifg=#ffff00 guibg=NONE guisp=#ffff00 gui=undercurl cterm=underline +hi StatusLine guifg=#ffff00 guibg=#0000ee gui=NONE cterm=NONE +hi StatusLineNC guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE +hi VertSplit guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE +hi TabLine guifg=#ffffff guibg=#7f7f7f gui=NONE cterm=NONE +hi TabLineFill guifg=NONE guibg=#000000 gui=reverse cterm=reverse +hi TabLineSel guifg=#ffffff guibg=#000000 gui=bold cterm=NONE +hi ToolbarLine guifg=NONE guibg=#000000 gui=NONE cterm=NONE +hi ToolbarButton guifg=#000000 guibg=#e5e5e5 gui=bold cterm=NONE +hi Pmenu guifg=fg guibg=#303030 gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#e5e5e5 gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi Normal ctermfg=231 ctermbg=16 cterm=NONE + hi! link Terminal Normal + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi Comment ctermfg=244 ctermbg=NONE cterm=NONE + hi Constant ctermfg=51 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=37 ctermbg=NONE cterm=NONE + hi Statement ctermfg=142 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=46 ctermbg=NONE cterm=NONE + hi Type ctermfg=34 ctermbg=NONE cterm=NONE + hi Special ctermfg=21 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=111 ctermbg=NONE cterm=underline + hi Ignore ctermfg=16 ctermbg=16 cterm=NONE + hi Error ctermfg=231 ctermbg=196 cterm=NONE + hi Todo ctermfg=16 ctermbg=142 cterm=NONE + hi Conceal ctermfg=254 ctermbg=248 cterm=NONE + hi Cursor ctermfg=16 ctermbg=231 cterm=NONE + hi lCursor ctermfg=16 ctermbg=231 cterm=NONE + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi Title ctermfg=225 ctermbg=NONE cterm=NONE + hi Directory ctermfg=34 ctermbg=NONE cterm=NONE + hi Search ctermfg=16 ctermbg=142 cterm=NONE + hi IncSearch ctermfg=231 ctermbg=NONE cterm=reverse + hi NonText ctermfg=63 ctermbg=NONE cterm=NONE + hi EndOfBuffer ctermfg=63 ctermbg=NONE cterm=NONE + hi ErrorMsg ctermfg=231 ctermbg=160 cterm=NONE + hi WarningMsg ctermfg=224 ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=51 ctermbg=248 cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=239 cterm=NONE + hi FoldColumn ctermfg=102 ctermbg=236 cterm=NONE + hi Folded ctermfg=102 ctermbg=236 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=237 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=237 cterm=NONE + hi CursorLineNr ctermfg=226 ctermbg=237 cterm=NONE + hi Visual ctermfg=20 ctermbg=248 cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=16 cterm=underline + hi LineNr ctermfg=102 ctermbg=NONE cterm=NONE + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi MatchParen ctermfg=NONE ctermbg=44 cterm=NONE + hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=63 ctermbg=NONE cterm=NONE + hi Question ctermfg=121 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=81 ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi QuickFixLine ctermfg=16 ctermbg=44 cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=63 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=201 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=226 ctermbg=NONE cterm=underline + hi StatusLine ctermfg=226 ctermbg=20 cterm=NONE + hi StatusLineNC ctermfg=16 ctermbg=231 cterm=NONE + hi VertSplit ctermfg=16 ctermbg=231 cterm=NONE + hi TabLine ctermfg=231 ctermbg=102 cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=16 cterm=reverse + hi TabLineSel ctermfg=231 ctermbg=16 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=16 cterm=NONE + hi ToolbarButton ctermfg=16 ctermbg=254 cterm=NONE + hi Pmenu ctermfg=fg ctermbg=236 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=254 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi Normal ctermfg=white ctermbg=black cterm=NONE + hi! link Terminal Normal + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi Comment ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi Constant ctermfg=cyan ctermbg=NONE cterm=NONE + hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Statement ctermfg=darkyellow ctermbg=NONE cterm=NONE + hi PreProc ctermfg=green ctermbg=NONE cterm=NONE + hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Special ctermfg=blue ctermbg=NONE cterm=NONE + hi Underlined ctermfg=darkgreen ctermbg=NONE cterm=underline + hi Ignore ctermfg=black ctermbg=black cterm=NONE + hi Error ctermfg=white ctermbg=red cterm=NONE + hi Todo ctermfg=black ctermbg=darkyellow cterm=NONE + hi Conceal ctermfg=grey ctermbg=grey cterm=NONE + hi Cursor ctermfg=black ctermbg=white cterm=NONE + hi lCursor ctermfg=black ctermbg=white cterm=NONE + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi Title ctermfg=magenta ctermbg=NONE cterm=NONE + hi Directory ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Search ctermfg=black ctermbg=darkyellow cterm=NONE + hi IncSearch ctermfg=white ctermbg=NONE cterm=reverse + hi NonText ctermfg=blue ctermbg=NONE cterm=NONE + hi EndOfBuffer ctermfg=blue ctermbg=NONE cterm=NONE + hi ErrorMsg ctermfg=white ctermbg=darkred cterm=NONE + hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=cyan ctermbg=black cterm=NONE + hi ColorColumn ctermfg=white ctermbg=darkgrey cterm=NONE + hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE + hi Folded ctermfg=blue ctermbg=NONE cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline + hi Visual ctermfg=darkblue ctermbg=grey cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline + hi LineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=NONE + hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=blue ctermbg=NONE cterm=NONE + hi Question ctermfg=green ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE + hi QuickFixLine ctermfg=black ctermbg=darkcyan cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=blue ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=magenta ctermbg=NONE cterm=underline + hi SpellRare ctermfg=yellow ctermbg=NONE cterm=underline + hi StatusLine ctermfg=yellow ctermbg=darkblue cterm=NONE + hi StatusLineNC ctermfg=black ctermbg=white cterm=NONE + hi VertSplit ctermfg=black ctermbg=white cterm=NONE + hi TabLine ctermfg=white ctermbg=darkgrey cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=black cterm=reverse + hi TabLineSel ctermfg=white ctermbg=black cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE + hi ToolbarButton ctermfg=black ctermbg=grey cterm=NONE + hi Pmenu ctermfg=fg ctermbg=darkgrey cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel ctermfg=black ctermbg=grey cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif + +" Background: dark +" Color: color00 #000000 16 black +" Color: color08 #7f7f7f 102 darkgrey +" Color: color01 #cd0000 160 darkred +" Color: color09 #ff0000 196 red +" Color: color02 #00cd00 40 darkgreen +" Color: color10 #00ff00 46 green +" Color: color03 #cdcd00 184 darkyellow +" Color: color11 #ffff00 226 yellow +" Color: color04 #0000ee 20 darkblue +" Color: color12 #5c5cff 63 blue +" Color: color05 #cd00cd 164 darkmagenta +" Color: color13 #ff00ff 201 magenta +" Color: color06 #00cdcd 44 darkcyan +" Color: color14 #00ffff 51 cyan +" Color: color07 #e5e5e5 254 grey +" Color: color15 #ffffff 231 white +" Term colors: color00 color01 color02 color03 color04 color05 color06 color07 +" Term colors: color08 color09 color10 color11 color12 color13 color14 color15 +" Color: rgbGrey30 #4d4d4d 239 darkgrey +" Color: rgbGrey40 #666666 241 darkgrey +" Color: rgbDarkGrey #a9a9a9 248 grey +" Color: rgbDarkBlue #00008b 20 darkblue +" Color: rgbDarkMagenta #8b008b 164 darkmagenta +" Color: rgbBlue #0000ff 63 blue +" Color: rgbDarkCyan #008b8b 44 darkcyan +" Color: rgbSeaGreen #2e8b57 121 darkgreen +" Color: rgbGrey #bebebe 248 grey +" Color: Question #00ff00 121 green +" Color: SignColumn #a9a9a9 248 black +" Color: SpecialKey #00ffff 81 cyan +" Color: StatusLineTerm #90ee90 121 darkgreen +" Color: Title #ff00ff 225 magenta +" Color: WarningMsg #ff0000 224 darkred +" Color: ToolbarLine #7f7f7f 242 darkgrey +" Color: ToolbarButton #d3d3d3 254 grey +" Color: Underlined #80a0ff 111 darkgreen +" Color: Comment #808080 244 darkgrey +" Color: Constant #00ffff 51 cyan +" Color: Special #0000ff 21 blue +" Color: Identifier #00c0c0 37 darkcyan +" Color: Search #c0c000 142 darkyellow +" Color: Statement #c0c000 142 darkyellow +" Color: Todo #c0c000 142 darkyellow +" Color: PreProc #00ff00 46 green +" Color: Type #00c000 34 darkgreen +" Color: Directory #00c000 34 darkgreen +" Color: Pmenu #303030 236 darkgrey +" Color: Folded #303030 236 darkgrey +" Color: Cursorline #3a3a3a 237 darkgrey +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/peachpuff.vim b/runtime/colors/peachpuff.vim index 1c0c2390f8..bf2a65dcaa 100644 --- a/runtime/colors/peachpuff.vim +++ b/runtime/colors/peachpuff.vim @@ -1,59 +1,335 @@ -" Vim color file -" Maintainer: David Ne\v{c}as (Yeti) <yeti@physics.muni.cz> -" Last Change: 2003-04-23 -" URL: http://trific.ath.cx/Ftp/vim/colors/peachpuff.vim +" Name: peachpuff +" Description: This color scheme uses a peachpuff background (what you've expected when it's " called peachpuff?). +" Author: Original author David Ne\v{c}as (Yeti) <yeti@physics.muni.cz> +" Maintainer: Original maintainer David Ne\v{c}as (Yeti) <yeti@physics.muni.cz> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:43 2022 -" This color scheme uses a peachpuff background (what you've expected when it's -" called peachpuff?). -" -" Note: Only GUI colors differ from default, on terminal it's just `light'. +" Generated by Colortemplate v2.2.0 -" First remove all existing highlighting. set background=light + hi clear -if exists("syntax_on") - syntax reset +let g:colors_name = 'peachpuff' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#ffdab9', '#a52a2a', '#c00058', '#cd00cd', '#008b8b', '#2e8b57', '#6a5acd', '#737373', '#406090', '#a52a2a', '#c00058', '#cd00cd', '#008b8b', '#2e8b57', '#6a5acd', '#000000'] +endif +hi Normal guifg=#000000 guibg=#ffdab9 gui=NONE cterm=NONE +hi Folded guifg=#000000 guibg=#e3c1a5 gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#f5c195 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#f5c195 gui=NONE cterm=NONE +hi CursorLineNr guifg=#cd0000 guibg=NONE gui=bold cterm=NONE +hi QuickFixLine guifg=#000000 guibg=#ffaf87 gui=NONE cterm=NONE +hi EndOfBuffer guifg=#737373 guibg=NONE gui=NONE cterm=NONE +hi StatusLine guifg=#ffffff guibg=#000000 gui=bold cterm=NONE +hi StatusLineNC guifg=#ffdab9 guibg=#737373 gui=bold cterm=NONE +hi StatusLineTerm guifg=#ffffff guibg=#2e8b57 gui=bold cterm=NONE +hi StatusLineTermNC guifg=#ffdab9 guibg=#008b8b gui=bold cterm=NONE +hi VertSplit guifg=#ffdab9 guibg=#737373 gui=NONE cterm=NONE +hi Pmenu guifg=#000000 guibg=#ffaf87 gui=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#f5c195 gui=bold cterm=NONE +hi PmenuSbar guifg=NONE guibg=#ffdab9 gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#737373 gui=NONE cterm=NONE +hi TabLine guifg=#ffdab9 guibg=#737373 gui=underline cterm=underline +hi TabLineFill guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse +hi TabLineSel guifg=#000000 guibg=#ffdab9 gui=bold cterm=NONE +hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi ToolbarButton guifg=#ffdab9 guibg=#737373 gui=bold cterm=NONE +hi NonText guifg=#737373 guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#737373 guibg=NONE gui=NONE cterm=NONE +hi Visual guifg=#000000 guibg=#cccccc gui=NONE cterm=NONE +hi VisualNOS guifg=NONE guibg=#406090 gui=NONE cterm=NONE +hi LineNr guifg=#cd0000 guibg=NONE gui=NONE cterm=NONE +hi FoldColumn guifg=#406090 guibg=NONE gui=NONE cterm=NONE +hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Underlined guifg=#6a5acd guibg=NONE gui=underline cterm=underline +hi Error guifg=#ff0000 guibg=#ffffff gui=bold,reverse cterm=reverse +hi ErrorMsg guifg=#ff0000 guibg=#ffffff gui=bold,reverse cterm=reverse +hi WarningMsg guifg=#cd00cd guibg=#ffdab9 gui=bold cterm=NONE +hi MoreMsg guifg=#2e8b57 guibg=#ffdab9 gui=bold cterm=NONE +hi ModeMsg guifg=#000000 guibg=#ffdab9 gui=bold cterm=NONE +hi Question guifg=#c00058 guibg=NONE gui=bold cterm=NONE +hi Todo guifg=#6a5acd guibg=#ffff00 gui=NONE cterm=NONE +hi MatchParen guifg=#ffdab9 guibg=#6a5acd gui=NONE cterm=NONE +hi Search guifg=#ffdab9 guibg=#cd00cd gui=NONE cterm=NONE +hi IncSearch guifg=#2e8b57 guibg=NONE gui=reverse cterm=reverse +hi WildMenu guifg=#000000 guibg=#ffff00 gui=bold cterm=NONE +hi ColorColumn guifg=NONE guibg=#eeeeee gui=NONE cterm=NONE +hi Cursor guifg=#ffdab9 guibg=#000000 gui=NONE cterm=NONE +hi lCursor guifg=#000000 guibg=#c00058 gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#008b8b guibg=NONE guisp=#008b8b gui=undercurl cterm=underline +hi SpellLocal guifg=#cd00cd guibg=NONE guisp=#cd00cd gui=undercurl cterm=underline +hi SpellRare guifg=#6a5acd guibg=NONE guisp=#6a5acd gui=undercurl cterm=underline +hi Comment guifg=#406090 guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#c00058 guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#008b8b guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#a52a2a guibg=NONE gui=bold cterm=NONE +hi PreProc guifg=#cd00cd guibg=NONE gui=NONE cterm=NONE +hi Type guifg=#2e8b57 guibg=NONE gui=bold cterm=NONE +hi Special guifg=#6a5acd guibg=NONE gui=NONE cterm=NONE +hi Directory guifg=#008b8b guibg=NONE gui=bold cterm=NONE +hi Conceal guifg=#406090 guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Title guifg=#cd00cd guibg=NONE gui=bold cterm=NONE +hi! link Terminal Normal +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi Normal ctermfg=16 ctermbg=223 cterm=NONE + hi Folded ctermfg=16 ctermbg=252 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=180 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=180 cterm=NONE + hi CursorLineNr ctermfg=160 ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=16 ctermbg=216 cterm=NONE + hi EndOfBuffer ctermfg=243 ctermbg=NONE cterm=NONE + hi StatusLine ctermfg=231 ctermbg=16 cterm=NONE + hi StatusLineNC ctermfg=223 ctermbg=243 cterm=NONE + hi StatusLineTerm ctermfg=231 ctermbg=29 cterm=NONE + hi StatusLineTermNC ctermfg=223 ctermbg=30 cterm=NONE + hi VertSplit ctermfg=223 ctermbg=243 cterm=NONE + hi Pmenu ctermfg=16 ctermbg=216 cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=180 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=223 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=243 cterm=NONE + hi TabLine ctermfg=223 ctermbg=243 cterm=underline + hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse + hi TabLineSel ctermfg=16 ctermbg=223 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=223 ctermbg=243 cterm=NONE + hi NonText ctermfg=243 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=243 ctermbg=NONE cterm=NONE + hi Visual ctermfg=16 ctermbg=252 cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=25 cterm=NONE + hi LineNr ctermfg=160 ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=25 ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE + hi Underlined ctermfg=62 ctermbg=NONE cterm=underline + hi Error ctermfg=196 ctermbg=231 cterm=reverse + hi ErrorMsg ctermfg=196 ctermbg=231 cterm=reverse + hi WarningMsg ctermfg=164 ctermbg=223 cterm=NONE + hi MoreMsg ctermfg=29 ctermbg=223 cterm=NONE + hi ModeMsg ctermfg=16 ctermbg=223 cterm=NONE + hi Question ctermfg=161 ctermbg=NONE cterm=NONE + hi Todo ctermfg=62 ctermbg=226 cterm=NONE + hi MatchParen ctermfg=223 ctermbg=62 cterm=NONE + hi Search ctermfg=223 ctermbg=164 cterm=NONE + hi IncSearch ctermfg=29 ctermbg=NONE cterm=reverse + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=255 cterm=NONE + hi Cursor ctermfg=223 ctermbg=16 cterm=NONE + hi lCursor ctermfg=16 ctermbg=161 cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=30 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=164 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=62 ctermbg=NONE cterm=underline + hi Comment ctermfg=25 ctermbg=NONE cterm=NONE + hi Constant ctermfg=161 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=30 ctermbg=NONE cterm=NONE + hi Statement ctermfg=124 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=164 ctermbg=NONE cterm=NONE + hi Type ctermfg=29 ctermbg=NONE cterm=NONE + hi Special ctermfg=62 ctermbg=NONE cterm=NONE + hi Directory ctermfg=30 ctermbg=NONE cterm=NONE + hi Conceal ctermfg=25 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=164 ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi Normal ctermfg=black ctermbg=white cterm=NONE + hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=underline + hi QuickFixLine ctermfg=black ctermbg=grey cterm=NONE + hi EndOfBuffer ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi StatusLine ctermfg=white ctermbg=black cterm=NONE + hi StatusLineNC ctermfg=white ctermbg=darkgrey cterm=NONE + hi StatusLineTerm ctermfg=white ctermbg=darkgreen cterm=NONE + hi StatusLineTermNC ctermfg=white ctermbg=darkcyan cterm=NONE + hi VertSplit ctermfg=white ctermbg=darkgrey cterm=NONE + hi Pmenu ctermfg=black ctermbg=grey cterm=NONE + hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=white cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi TabLine ctermfg=white ctermbg=darkgrey cterm=underline + hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse + hi TabLineSel ctermfg=black ctermbg=white cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=white ctermbg=darkgrey cterm=NONE + hi NonText ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi Visual ctermfg=black ctermbg=grey cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi LineNr ctermfg=red ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE + hi Underlined ctermfg=darkblue ctermbg=NONE cterm=underline + hi Error ctermfg=darkred ctermbg=white cterm=reverse + hi ErrorMsg ctermfg=darkred ctermbg=white cterm=reverse + hi WarningMsg ctermfg=darkmagenta ctermbg=white cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=white cterm=NONE + hi ModeMsg ctermfg=black ctermbg=white cterm=NONE + hi Question ctermfg=darkred ctermbg=NONE cterm=NONE + hi Todo ctermfg=darkblue ctermbg=yellow cterm=NONE + hi MatchParen ctermfg=white ctermbg=darkblue cterm=NONE + hi Search ctermfg=white ctermbg=darkmagenta cterm=NONE + hi IncSearch ctermfg=darkgreen ctermbg=NONE cterm=reverse + hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=grey cterm=NONE + hi Cursor ctermfg=white ctermbg=black cterm=NONE + hi lCursor ctermfg=black ctermbg=darkred cterm=NONE + hi SpellBad ctermfg=darkred ctermbg=NONE cterm=underline + hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=darkmagenta ctermbg=NONE cterm=underline + hi SpellRare ctermfg=darkblue ctermbg=NONE cterm=underline + hi Comment ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE + hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Statement ctermfg=darkred ctermbg=NONE cterm=NONE + hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Special ctermfg=darkblue ctermbg=NONE cterm=NONE + hi Directory ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Conceal ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish endif -let colors_name = "peachpuff" - -hi Normal guibg=PeachPuff guifg=Black - -hi SpecialKey term=bold ctermfg=4 guifg=Blue -hi NonText term=bold cterm=bold ctermfg=4 gui=bold guifg=Blue -hi Directory term=bold ctermfg=4 guifg=Blue -hi ErrorMsg term=standout cterm=bold ctermfg=7 ctermbg=1 gui=bold guifg=White guibg=Red -hi IncSearch term=reverse cterm=reverse gui=reverse -hi Search term=reverse ctermbg=3 guibg=Gold2 -hi MoreMsg term=bold ctermfg=2 gui=bold guifg=SeaGreen -hi ModeMsg term=bold cterm=bold gui=bold -hi LineNr term=underline ctermfg=3 guifg=Red3 -hi Question term=standout ctermfg=2 gui=bold guifg=SeaGreen -hi StatusLine term=bold,reverse cterm=bold,reverse gui=bold guifg=White guibg=Black -hi StatusLineNC term=reverse cterm=reverse gui=bold guifg=PeachPuff guibg=Gray45 -hi VertSplit term=reverse cterm=reverse gui=bold guifg=White guibg=Gray45 -hi Title term=bold ctermfg=5 gui=bold guifg=DeepPink3 -hi Visual term=reverse cterm=reverse gui=reverse guifg=Grey80 guibg=fg -hi WarningMsg term=standout ctermfg=1 gui=bold guifg=Red -hi WildMenu term=standout ctermfg=0 ctermbg=3 guifg=Black guibg=Yellow -hi Folded term=standout ctermfg=4 ctermbg=7 guifg=Black guibg=#e3c1a5 -hi FoldColumn term=standout ctermfg=4 ctermbg=7 guifg=DarkBlue guibg=Gray80 -hi DiffAdd term=bold ctermbg=4 guibg=White -hi DiffChange term=bold ctermbg=5 guibg=#edb5cd -hi DiffDelete term=bold cterm=bold ctermfg=4 ctermbg=6 gui=bold guifg=LightBlue guibg=#f6e8d0 -hi DiffText term=reverse cterm=bold ctermbg=1 gui=bold guibg=#ff8060 -hi Cursor guifg=bg guibg=fg -hi lCursor guifg=bg guibg=fg - -" Colors for syntax highlighting -hi Comment term=bold ctermfg=4 guifg=#406090 -hi Constant term=underline ctermfg=1 guifg=#c00058 -hi Special term=bold ctermfg=5 guifg=SlateBlue -hi Identifier term=underline ctermfg=6 guifg=DarkCyan -hi Statement term=bold ctermfg=3 gui=bold guifg=Brown -hi PreProc term=underline ctermfg=5 guifg=Magenta3 -hi Type term=underline ctermfg=2 gui=bold guifg=SeaGreen -hi Ignore cterm=bold ctermfg=7 guifg=bg -hi Error term=reverse cterm=bold ctermfg=7 ctermbg=1 gui=bold guifg=White guibg=Red -hi Todo term=standout ctermfg=0 ctermbg=3 guifg=Blue guibg=Yellow +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif +" Background: light +" Color: comment #406090 25 darkgrey +" Color: constant #c00058 161 darkred +" Color: identifier #008b8b 30 darkcyan +" Color: statement #a52a2a 124 darkred +" Color: preproc #cd00cd 164 darkmagenta +" Color: type #2e8b57 29 darkgreen +" Color: special #6a5acd 62 darkblue +" Color: fg0 #000000 16 black +" Color: bg0 #ffdab9 223 white +" Color: fg1 #ffffff 231 white +" Color: bg1 #737373 243 darkgrey +" Color: visual #cccccc 252 grey +" Color: folded #e3c1a5 252 cyan +" Color: folded_fg #000000 16 black +" Color: cursorline #f5c195 180 yellow +" Color: pmenu #ffaf87 216 grey +" Color: wildmenu #ffff00 226 yellow +" Color: error #ff0000 196 darkred +" Color: linenr #cd0000 160 red +" Color: blue #0000ff 21 darkblue +" Color: red #ff0000 196 darkred +" Color: colorcolumn #eeeeee 255 grey +" Term colors: bg0 statement constant preproc identifier type special bg1 +" Term colors: comment statement constant preproc identifier type special fg0 +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/ron.vim b/runtime/colors/ron.vim index 1e9caa3150..46f83e159e 100644 --- a/runtime/colors/ron.vim +++ b/runtime/colors/ron.vim @@ -1,45 +1,378 @@ -" local syntax file - set colors on a per-machine basis: -" vim: tw=0 ts=4 sw=4 -" Vim color file -" Maintainer: Ron Aaron <ron@ronware.org> -" Last Change: 2013 May 24 +" Name: ron +" Author: original author Ron Aaron <ron@ronware.org> +" Maintainer: original maintainer Ron Aaron <ron@ronware.org> +" Website: https://www.github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:43 2022 + +" Generated by Colortemplate v2.2.0 set background=dark + hi clear -if exists("syntax_on") - syntax reset +let g:colors_name = 'ron' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +hi! link Terminal Normal +hi! link Boolean Constant +hi! link Character Constant +hi! link Conditional Statement +hi! link Debug Special +hi! link Define PreProc +hi! link Delimiter Special +hi! link Exception Statement +hi! link Float Constant +hi! link Function Identifier +hi! link Include PreProc +hi! link Keyword Statement +hi! link Macro PreProc +hi! link Number Constant +hi! link PopupSelected PmenuSel +hi! link PreCondit PreProc +hi! link Repeat Statement +hi! link SpecialChar Special +hi! link SpecialComment Special +hi! link StatusLineTerm StatusLine +hi! link StatusLineTermNC StatusLineNC +hi! link StorageClass Type +hi! link String Constant +hi! link Structure Type +hi! link Tag Special +hi! link Typedef Type +hi! link lCursor Cursor +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff'] +endif +hi Normal guifg=#00ffff guibg=#000000 gui=NONE cterm=NONE +hi ColorColumn guifg=NONE guibg=#cd0000 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#666666 gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE +hi CursorLineNr guifg=#ffff00 guibg=NONE gui=bold cterm=NONE +hi QuickFixLine guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE +hi Conceal guifg=#e5e5e5 guibg=#a9a9a9 gui=NONE cterm=NONE +hi Cursor guifg=#ffffff guibg=#60a060 gui=NONE cterm=NONE +hi Directory guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi EndOfBuffer guifg=#ffff00 guibg=#303030 gui=NONE cterm=NONE +hi ErrorMsg guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse +hi FoldColumn guifg=#ffffff guibg=NONE gui=NONE cterm=NONE +hi Folded guifg=NONE guibg=#4d4d4d gui=NONE cterm=NONE +hi IncSearch guifg=NONE guibg=#4682b4 gui=NONE cterm=NONE +hi LineNr guifg=#a9a9a9 guibg=NONE gui=NONE cterm=NONE +hi MatchParen guifg=NONE guibg=#008b8b gui=NONE cterm=NONE +hi ModeMsg guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=NONE +hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold cterm=NONE +hi NonText guifg=#ffff00 guibg=#303030 gui=NONE cterm=NONE +hi Pmenu guifg=#ffffff guibg=#444444 gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=#000000 gui=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#e5e5e5 gui=NONE cterm=NONE +hi Question guifg=#00ff00 guibg=#000000 gui=bold cterm=NONE +hi Search guifg=#000000 guibg=#a9a9a9 gui=bold cterm=NONE +hi SignColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi StatusLine guifg=#00ffff guibg=#0000ff gui=bold cterm=NONE +hi StatusLineNC guifg=#add8e6 guibg=#00008b gui=NONE cterm=NONE +hi VertSplit guifg=#add8e6 guibg=#00008b gui=NONE cterm=NONE +hi TabLine guifg=#000000 guibg=#008b8b gui=NONE cterm=NONE +hi TabLineFill guifg=#a9a9a9 guibg=#7f7f7f gui=NONE cterm=NONE +hi TabLineSel guifg=#00ffff guibg=#000000 gui=bold cterm=NONE +hi Terminal guifg=#00ffff guibg=#000000 gui=NONE cterm=NONE +hi Title guifg=#a9a9a9 guibg=NONE gui=NONE cterm=NONE +hi Visual guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse +hi VisualNOS guifg=NONE guibg=#000000 gui=bold,underline cterm=underline +hi WarningMsg guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE +hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#ffffff guibg=NONE guisp=#ffffff gui=undercurl cterm=underline +hi SpellLocal guifg=#ffff00 guibg=NONE guisp=#ffff00 gui=undercurl cterm=underline +hi SpellRare guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline +hi Comment guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#00ffff guibg=NONE gui=bold cterm=NONE +hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse +hi Identifier guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=#000000 guibg=#000000 gui=NONE cterm=NONE +hi Label guifg=#eec900 guibg=NONE gui=NONE cterm=NONE +hi Operator guifg=#ffa500 guibg=NONE gui=NONE cterm=NONE +hi PreProc guifg=#eea9b8 guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#add8e6 guibg=NONE gui=NONE cterm=NONE +hi Todo guifg=#000000 guibg=#ffa500 gui=NONE cterm=NONE +hi Type guifg=#2e8b57 guibg=NONE gui=bold cterm=NONE +hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline +hi CursorIM guifg=NONE guibg=fg gui=NONE cterm=NONE +hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi ToolbarButton guifg=#000000 guibg=#e5e5e5 gui=bold cterm=NONE +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi Normal ctermfg=51 ctermbg=16 cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=160 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=59 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=59 cterm=NONE + hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=16 ctermbg=44 cterm=NONE + hi Conceal ctermfg=254 ctermbg=145 cterm=NONE + hi Cursor ctermfg=231 ctermbg=71 cterm=NONE + hi Directory ctermfg=51 ctermbg=NONE cterm=NONE + hi EndOfBuffer ctermfg=226 ctermbg=236 cterm=NONE + hi ErrorMsg ctermfg=196 ctermbg=231 cterm=reverse + hi FoldColumn ctermfg=231 ctermbg=NONE cterm=NONE + hi Folded ctermfg=NONE ctermbg=239 cterm=NONE + hi IncSearch ctermfg=NONE ctermbg=67 cterm=NONE + hi LineNr ctermfg=145 ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=NONE ctermbg=44 cterm=NONE + hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=29 ctermbg=NONE cterm=NONE + hi NonText ctermfg=226 ctermbg=236 cterm=NONE + hi Pmenu ctermfg=231 ctermbg=238 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=16 cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=44 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=254 cterm=NONE + hi Question ctermfg=46 ctermbg=16 cterm=NONE + hi Search ctermfg=16 ctermbg=145 cterm=NONE + hi SignColumn ctermfg=51 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=51 ctermbg=NONE cterm=NONE + hi StatusLine ctermfg=51 ctermbg=21 cterm=NONE + hi StatusLineNC ctermfg=152 ctermbg=20 cterm=NONE + hi VertSplit ctermfg=152 ctermbg=20 cterm=NONE + hi TabLine ctermfg=16 ctermbg=44 cterm=NONE + hi TabLineFill ctermfg=145 ctermbg=102 cterm=NONE + hi TabLineSel ctermfg=51 ctermbg=16 cterm=NONE + hi Terminal ctermfg=51 ctermbg=16 cterm=NONE + hi Title ctermfg=145 ctermbg=NONE cterm=NONE + hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse + hi VisualNOS ctermfg=NONE ctermbg=16 cterm=underline + hi WarningMsg ctermfg=226 ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=231 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=226 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=201 ctermbg=NONE cterm=underline + hi Comment ctermfg=46 ctermbg=NONE cterm=NONE + hi Constant ctermfg=51 ctermbg=NONE cterm=NONE + hi Error ctermfg=196 ctermbg=231 cterm=reverse + hi Identifier ctermfg=51 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=16 ctermbg=16 cterm=NONE + hi Label ctermfg=220 ctermbg=NONE cterm=NONE + hi Operator ctermfg=214 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=217 ctermbg=NONE cterm=NONE + hi Special ctermfg=226 ctermbg=NONE cterm=NONE + hi Statement ctermfg=152 ctermbg=NONE cterm=NONE + hi Todo ctermfg=16 ctermbg=214 cterm=NONE + hi Type ctermfg=29 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=111 ctermbg=NONE cterm=underline + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=16 ctermbg=254 cterm=NONE + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi Normal ctermfg=cyan ctermbg=black cterm=NONE + hi ColorColumn ctermfg=cyan ctermbg=darkred cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline + hi QuickFixLine ctermfg=black ctermbg=darkcyan cterm=NONE + hi Conceal ctermfg=grey ctermbg=grey cterm=NONE + hi Cursor ctermfg=white ctermbg=green cterm=NONE + hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE + hi EndOfBuffer ctermfg=yellow ctermbg=darkgrey cterm=NONE + hi ErrorMsg ctermfg=red ctermbg=white cterm=reverse + hi FoldColumn ctermfg=white ctermbg=NONE cterm=NONE + hi Folded ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi IncSearch ctermfg=NONE ctermbg=blue cterm=NONE + hi LineNr ctermfg=grey ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=NONE + hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi NonText ctermfg=yellow ctermbg=darkgrey cterm=NONE + hi Pmenu ctermfg=white ctermbg=darkgrey cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE + hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE + hi Question ctermfg=green ctermbg=black cterm=NONE + hi Search ctermfg=black ctermbg=grey cterm=NONE + hi SignColumn ctermfg=cyan ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE + hi StatusLine ctermfg=cyan ctermbg=darkblue cterm=NONE + hi StatusLineNC ctermfg=darkcyan ctermbg=darkblue cterm=NONE + hi VertSplit ctermfg=darkcyan ctermbg=darkblue cterm=NONE + hi TabLine ctermfg=black ctermbg=darkcyan cterm=NONE + hi TabLineFill ctermfg=grey ctermbg=darkgrey cterm=NONE + hi TabLineSel ctermfg=cyan ctermbg=black cterm=NONE + hi Terminal ctermfg=cyan ctermbg=black cterm=NONE + hi Title ctermfg=grey ctermbg=NONE cterm=NONE + hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse + hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline + hi WarningMsg ctermfg=yellow ctermbg=NONE cterm=NONE + hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=white ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=yellow ctermbg=NONE cterm=underline + hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline + hi Comment ctermfg=green ctermbg=NONE cterm=NONE + hi Constant ctermfg=cyan ctermbg=NONE cterm=NONE + hi Error ctermfg=red ctermbg=white cterm=reverse + hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE + hi Ignore ctermfg=black ctermbg=black cterm=NONE + hi Label ctermfg=yellow ctermbg=NONE cterm=NONE + hi Operator ctermfg=darkyellow ctermbg=NONE cterm=NONE + hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Special ctermfg=yellow ctermbg=NONE cterm=NONE + hi Statement ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Todo ctermfg=black ctermbg=darkyellow cterm=NONE + hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Underlined ctermfg=blue ctermbg=NONE cterm=underline + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=black ctermbg=grey cterm=NONE + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish endif -let g:colors_name = "ron" -hi Normal guifg=cyan guibg=black -hi NonText guifg=yellow guibg=#303030 -hi comment guifg=green -hi constant guifg=cyan gui=bold -hi identifier guifg=cyan gui=NONE -hi statement guifg=lightblue gui=NONE -hi preproc guifg=Pink2 -hi type guifg=seagreen gui=bold -hi special guifg=yellow -hi ErrorMsg guifg=Black guibg=Red -hi WarningMsg guifg=Black guibg=Green -hi Error guibg=Red -hi Todo guifg=Black guibg=orange -hi Cursor guibg=#60a060 guifg=#00ff00 -hi Search guibg=darkgray guifg=black gui=bold -hi IncSearch gui=NONE guibg=steelblue -hi LineNr guifg=darkgrey -hi title guifg=darkgrey -hi ShowMarksHL ctermfg=cyan ctermbg=lightblue cterm=bold guifg=yellow guibg=black gui=bold -hi StatusLineNC gui=NONE guifg=lightblue guibg=darkblue -hi StatusLine gui=bold guifg=cyan guibg=blue -hi label guifg=gold2 -hi operator guifg=orange -hi clear Visual -hi Visual term=reverse cterm=reverse gui=reverse -hi DiffChange guibg=darkgreen -hi DiffText guibg=olivedrab -hi DiffAdd guibg=slateblue -hi DiffDelete guibg=coral -hi Folded guibg=gray30 -hi FoldColumn guibg=gray30 guifg=white -hi cIf0 guifg=gray -hi diffOnly guifg=red gui=bold + +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif + +" Background: dark +" Color: xterm0 #000000 16 black +" Color: xterm1 #cd0000 160 darkred +" Color: xterm2 #00cd00 40 darkgreen +" Color: xterm3 #cdcd00 184 darkyellow +" Color: xterm4 #0000ee 20 darkblue +" Color: xterm5 #cd00cd 164 darkmagenta +" Color: xterm6 #00cdcd 44 darkcyan +" Color: xterm7 #e5e5e5 254 grey +" Color: xterm8 #7f7f7f 102 darkgrey +" Color: xterm9 #ff0000 196 red +" Color: xterm10 #00ff00 46 green +" Color: xterm11 #ffff00 226 yellow +" Color: xterm12 #5c5cff 63 blue +" Color: xterm13 #ff00ff 201 magenta +" Color: xterm14 #00ffff 51 cyan +" Color: xterm15 #ffffff 231 white +" Color: rgbGrey40 #666666 59 darkgrey +" Color: rgbDarkGrey #a9a9a9 145 grey +" Color: rgbDarkBlue #00008b 20 darkblue +" Color: rgbBlue #0000ff 21 darkblue +" Color: rgbDarkCyan #008b8b 44 darkcyan +" Color: Directory #00ffff 51 cyan +" Color: rgbSeaGreen #2e8b57 29 darkgreen +" Color: rgbGrey #bebebe 250 grey +" Color: Question #00ff00 46 green +" Color: SignColumn #a9a9a9 248 grey +" Color: SpecialKey #00ffff 51 cyan +" Color: StatusLineTerm #90ee90 120 darkgreen +" Color: ToolbarLine #7f7f7f 244 darkgrey +" Color: Underlined #80a0ff 111 blue +" Color: Pmenu #444444 238 darkgrey +" Color: ron303030 #303030 236 darkgrey +" Color: ronLightBlue #add8e6 152 darkcyan +" Color: ronPink2 #eea9b8 217 darkmagenta +" Color: ronOrange #ffa500 214 darkyellow +" Color: ronCursor #60a060 71 green +" Color: ronSteelBlue #4682b4 67 blue +" Color: ronGold2 #eec900 220 yellow +" Color: ronDarkGreen #006400 22 darkgreen +" Color: ronSlateBlue #6a5acd 62 blue +" Color: ronOliveDrab #6b8e23 64 green +" Color: ronCoral #ff7f50 209 red +" Color: ronGray30 #4d4d4d 239 darkgrey +" Term colors: xterm0 xterm1 xterm2 xterm3 xterm4 xterm5 xterm6 xterm7 +" Term colors: xterm8 xterm9 xterm10 xterm11 xterm12 xterm13 +" Term colors: xterm14 xterm15 +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/shine.vim b/runtime/colors/shine.vim index eedb9c9b25..a545b8c396 100644 --- a/runtime/colors/shine.vim +++ b/runtime/colors/shine.vim @@ -1,59 +1,353 @@ -" Vim color file -" Maintainer: Yasuhiro Matsumoto <mattn@mail.goo.ne.jp> -" Last Change: 2001 May 25 +" Name: shine +" Description: Light colorscheme inspired by normal text editors. +" Author: Original author is Yasuhiro Matsumoto <mattn@mail.goo.ne.jp> +" Maintainer: Original maintainer is Yasuhiro Matsumoto <mattn@mail.goo.ne.jp> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:44 2022 -" This look like normal text editor. -" This color scheme uses a light background. +" Generated by Colortemplate v2.2.0 -" First remove all existing highlighting. set background=light + hi clear -if exists("syntax_on") - syntax reset +let g:colors_name = 'shine' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#000000', '#8b0000', '#006400', '#ffff00', '#00008b', '#6a0dad', '#008b8b', '#dadada', '#767676', '#ffafaf', '#90ee90', '#ffff60', '#add8e6', '#ff00ff', '#00ffff', '#ffffff'] +endif +hi Normal guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE +hi Folded guifg=#00008b guibg=#dadada gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#dadada gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#dadada gui=NONE cterm=NONE +hi CursorLineNr guifg=NONE guibg=#dadada gui=NONE cterm=NONE +hi QuickFixLine guifg=#000000 guibg=#ff8c00 gui=NONE cterm=NONE +hi! link EndOfBuffer NonText +hi StatusLine guifg=#ffffff guibg=#000000 gui=bold cterm=NONE +hi StatusLineNC guifg=#ffffff guibg=#a8a8a8 gui=NONE cterm=NONE +hi StatusLineTerm guifg=#000000 guibg=#90ee90 gui=bold cterm=NONE +hi StatusLineTermNC guifg=#dadada guibg=#006400 gui=NONE cterm=NONE +hi VertSplit guifg=#a8a8a8 guibg=#a8a8a8 gui=NONE cterm=NONE +hi Pmenu guifg=#000000 guibg=#a8a8a8 gui=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#ffff60 gui=NONE cterm=NONE +hi PmenuSbar guifg=#ffffff guibg=#ffffff gui=NONE cterm=NONE +hi PmenuThumb guifg=#767676 guibg=#767676 gui=NONE cterm=NONE +hi TabLine guifg=#000000 guibg=#dadada gui=underline cterm=underline +hi TabLineFill guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse +hi TabLineSel guifg=#000000 guibg=#ffffff gui=bold cterm=NONE +hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi ToolbarButton guifg=NONE guibg=#a8a8a8 gui=bold cterm=NONE +hi NonText guifg=#add8e6 guibg=#ffffff gui=NONE cterm=NONE +hi SpecialKey guifg=#add8e6 guibg=NONE gui=NONE cterm=NONE +hi Visual guifg=#000000 guibg=#a8a8a8 gui=NONE cterm=NONE +hi VisualNOS guifg=NONE guibg=NONE gui=bold,underline ctermfg=NONE ctermbg=NONE cterm=underline +hi LineNr guifg=#767676 guibg=NONE gui=NONE cterm=NONE +hi FoldColumn guifg=#767676 guibg=NONE gui=NONE cterm=NONE +hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Underlined guifg=#6a0dad guibg=NONE gui=underline cterm=underline +hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse +hi! link ErrorMsg Error +hi WarningMsg guifg=#6a0dad guibg=#ffffff gui=NONE cterm=NONE +hi MoreMsg guifg=#006400 guibg=#ffffff gui=NONE cterm=NONE +hi ModeMsg guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE +hi Question guifg=#a07070 guibg=NONE gui=NONE cterm=NONE +hi Todo guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi MatchParen guifg=#ffffff guibg=#ffafaf gui=NONE cterm=NONE +hi Search guifg=#ffffff guibg=#6a0dad gui=NONE cterm=NONE +hi IncSearch guifg=#008b8b guibg=#ffff00 gui=reverse cterm=reverse +hi WildMenu guifg=#000000 guibg=#ffff00 gui=bold cterm=NONE +hi ColorColumn guifg=#000000 guibg=#ffafaf gui=NONE cterm=NONE +hi Cursor guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE +hi lCursor guifg=#000000 guibg=#a07070 gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#2e8b57 guibg=NONE guisp=#2e8b57 gui=undercurl cterm=underline +hi SpellLocal guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline +hi SpellRare guifg=#00008b guibg=NONE guisp=#00008b gui=undercurl cterm=underline +hi Identifier guifg=#008b8b guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#006400 guibg=NONE gui=bold cterm=NONE +hi Constant guifg=#a07070 guibg=NONE gui=NONE cterm=NONE +hi Number guifg=#a07070 guibg=NONE gui=bold cterm=NONE +hi Float guifg=#a07070 guibg=NONE gui=bold cterm=NONE +hi PreProc guifg=#6a0dad guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#ff8c00 guibg=NONE gui=NONE cterm=NONE +hi SpecialChar guifg=#00008b guibg=NONE gui=NONE cterm=NONE +hi! link Tag Special +hi Type guifg=#2e8b57 guibg=NONE gui=bold cterm=NONE +hi! link Operator Statement +hi Directory guifg=#008b8b guibg=NONE gui=bold cterm=NONE +hi Comment guifg=#a8a8a8 guibg=NONE gui=bold cterm=NONE +hi StorageClass guifg=#ff0000 guibg=NONE gui=bold cterm=NONE +hi Conceal guifg=#dadada guibg=#767676 gui=NONE cterm=NONE +hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Title guifg=#006400 guibg=NONE gui=bold cterm=NONE +hi! link Terminal Normal +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi Normal ctermfg=16 ctermbg=231 cterm=NONE + hi Folded ctermfg=18 ctermbg=253 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=253 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=253 cterm=NONE + hi CursorLineNr ctermfg=NONE ctermbg=253 cterm=NONE + hi QuickFixLine ctermfg=16 ctermbg=208 cterm=NONE + hi! link EndOfBuffer NonText + hi StatusLine ctermfg=231 ctermbg=16 cterm=NONE + hi StatusLineNC ctermfg=231 ctermbg=248 cterm=NONE + hi StatusLineTerm ctermfg=16 ctermbg=120 cterm=NONE + hi StatusLineTermNC ctermfg=253 ctermbg=22 cterm=NONE + hi VertSplit ctermfg=248 ctermbg=248 cterm=NONE + hi Pmenu ctermfg=16 ctermbg=248 cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=228 cterm=NONE + hi PmenuSbar ctermfg=231 ctermbg=231 cterm=NONE + hi PmenuThumb ctermfg=243 ctermbg=243 cterm=NONE + hi TabLine ctermfg=16 ctermbg=253 cterm=underline + hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse + hi TabLineSel ctermfg=16 ctermbg=231 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=NONE ctermbg=248 cterm=NONE + hi NonText ctermfg=153 ctermbg=231 cterm=NONE + hi SpecialKey ctermfg=153 ctermbg=NONE cterm=NONE + hi Visual ctermfg=16 ctermbg=248 cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline + hi LineNr ctermfg=243 ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=243 ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE + hi Underlined ctermfg=55 ctermbg=NONE cterm=underline + hi Error ctermfg=196 ctermbg=231 cterm=reverse + hi! link ErrorMsg Error + hi WarningMsg ctermfg=55 ctermbg=231 cterm=NONE + hi MoreMsg ctermfg=22 ctermbg=231 cterm=NONE + hi ModeMsg ctermfg=16 ctermbg=231 cterm=NONE + hi Question ctermfg=95 ctermbg=NONE cterm=NONE + hi Todo ctermfg=16 ctermbg=226 cterm=NONE + hi MatchParen ctermfg=231 ctermbg=217 cterm=NONE + hi Search ctermfg=231 ctermbg=55 cterm=NONE + hi IncSearch ctermfg=30 ctermbg=226 cterm=reverse + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi ColorColumn ctermfg=16 ctermbg=217 cterm=NONE + hi Cursor ctermfg=231 ctermbg=16 cterm=NONE + hi lCursor ctermfg=16 ctermbg=95 cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=29 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=201 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=18 ctermbg=NONE cterm=underline + hi Identifier ctermfg=30 ctermbg=NONE cterm=NONE + hi Statement ctermfg=22 ctermbg=NONE cterm=NONE + hi Constant ctermfg=95 ctermbg=NONE cterm=NONE + hi Number ctermfg=95 ctermbg=NONE cterm=NONE + hi Float ctermfg=95 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=55 ctermbg=NONE cterm=NONE + hi Special ctermfg=208 ctermbg=NONE cterm=NONE + hi SpecialChar ctermfg=18 ctermbg=NONE cterm=NONE + hi! link Tag Special + hi Type ctermfg=29 ctermbg=NONE cterm=NONE + hi! link Operator Statement + hi Directory ctermfg=30 ctermbg=NONE cterm=NONE + hi Comment ctermfg=248 ctermbg=NONE cterm=NONE + hi StorageClass ctermfg=196 ctermbg=NONE cterm=NONE + hi Conceal ctermfg=253 ctermbg=243 cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=22 ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi Normal ctermfg=black ctermbg=white cterm=NONE + hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=underline + hi QuickFixLine ctermfg=black ctermbg=darkyellow cterm=NONE + hi! link EndOfBuffer NonText + hi StatusLine ctermfg=white ctermbg=black cterm=NONE + hi StatusLineNC ctermfg=white ctermbg=darkgrey cterm=NONE + hi StatusLineTerm ctermfg=black ctermbg=green cterm=NONE + hi StatusLineTermNC ctermfg=grey ctermbg=darkgreen cterm=NONE + hi VertSplit ctermfg=darkgrey ctermbg=darkgrey cterm=NONE + hi Pmenu ctermfg=black ctermbg=darkgrey cterm=NONE + hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE + hi PmenuSbar ctermfg=white ctermbg=white cterm=NONE + hi PmenuThumb ctermfg=darkgrey ctermbg=darkgrey cterm=NONE + hi TabLine ctermfg=black ctermbg=grey cterm=underline + hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse + hi TabLineSel ctermfg=black ctermbg=white cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi NonText ctermfg=blue ctermbg=white cterm=NONE + hi SpecialKey ctermfg=blue ctermbg=NONE cterm=NONE + hi Visual ctermfg=black ctermbg=darkgrey cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline + hi LineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE + hi Underlined ctermfg=darkmagenta ctermbg=NONE cterm=underline + hi Error ctermfg=red ctermbg=white cterm=reverse + hi! link ErrorMsg Error + hi WarningMsg ctermfg=darkmagenta ctermbg=white cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=white cterm=NONE + hi ModeMsg ctermfg=black ctermbg=white cterm=NONE + hi Question ctermfg=darkred ctermbg=NONE cterm=NONE + hi Todo ctermfg=black ctermbg=yellow cterm=NONE + hi MatchParen ctermfg=white ctermbg=red cterm=NONE + hi Search ctermfg=white ctermbg=darkmagenta cterm=NONE + hi IncSearch ctermfg=darkcyan ctermbg=yellow cterm=reverse + hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE + hi ColorColumn ctermfg=black ctermbg=red cterm=NONE + hi Cursor ctermfg=white ctermbg=black cterm=NONE + hi lCursor ctermfg=black ctermbg=darkred cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=darkgreen ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=magenta ctermbg=NONE cterm=underline + hi SpellRare ctermfg=darkblue ctermbg=NONE cterm=underline + hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Statement ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE + hi Number ctermfg=darkred ctermbg=NONE cterm=NONE + hi Float ctermfg=darkred ctermbg=NONE cterm=NONE + hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE + hi SpecialChar ctermfg=darkblue ctermbg=NONE cterm=NONE + hi! link Tag Special + hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi! link Operator Statement + hi Directory ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Comment ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi StorageClass ctermfg=red ctermbg=NONE cterm=NONE + hi Conceal ctermfg=grey ctermbg=darkgrey cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish endif -let colors_name = "shine" - -hi Normal ctermbg=White ctermfg=Black guifg=Black guibg=White - -" Groups used in the 'highlight' and 'guicursor' options default value. -hi ErrorMsg term=standout ctermbg=DarkRed ctermfg=White guibg=Red guifg=White -hi IncSearch term=reverse cterm=reverse gui=reverse -hi ModeMsg term=bold cterm=bold gui=bold -hi StatusLine term=reverse,bold cterm=reverse,bold gui=reverse,bold -hi StatusLineNC term=reverse cterm=reverse gui=reverse -hi VertSplit term=reverse cterm=reverse gui=reverse -hi Visual term=reverse cterm=reverse gui=reverse guifg=Grey guibg=fg -hi DiffText term=reverse cterm=bold ctermbg=Red gui=bold guibg=Red -hi Cursor ctermbg=Green guibg=Green guifg=Black -hi lCursor guibg=Cyan guifg=Black -hi Directory term=bold ctermfg=LightRed guifg=Red -hi LineNr term=underline ctermfg=Yellow guifg=Yellow -hi MoreMsg term=bold ctermfg=LightGreen gui=bold guifg=SeaGreen -hi NonText term=bold ctermfg=LightBlue gui=bold guifg=LightBlue guibg=grey90 -hi Question term=standout ctermfg=LightGreen gui=bold guifg=Green -hi Search term=reverse ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black -hi SpecialKey term=bold ctermfg=LightBlue guifg=Blue -hi Title term=bold ctermfg=LightMagenta gui=bold guifg=Magenta -hi WarningMsg term=standout ctermfg=LightRed guifg=Red -hi WildMenu term=standout ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black -hi Folded term=standout ctermbg=LightGrey ctermfg=DarkBlue guibg=LightGrey guifg=DarkBlue -hi FoldColumn term=standout ctermbg=LightGrey ctermfg=DarkBlue guibg=Grey guifg=DarkBlue -hi DiffAdd term=bold ctermbg=DarkBlue guibg=DarkBlue -hi DiffChange term=bold ctermbg=DarkMagenta guibg=DarkMagenta -hi DiffDelete term=bold ctermfg=Blue ctermbg=DarkCyan gui=bold guifg=Blue guibg=DarkCyan - -hi Comment ctermfg=DarkGrey ctermbg=White guifg=DarkGrey gui=bold -hi SpecialChar ctermfg=DarkGrey ctermbg=White guifg=DarkGrey gui=bold -hi StorageClass ctermfg=Red ctermbg=White guifg=Red gui=bold -hi Number ctermfg=LightRed ctermbg=White guifg=LightRed gui=bold - -" Groups for syntax highlighting -hi Constant term=underline ctermfg=Magenta guifg=#a07070 guibg=grey80 -hi Special term=bold ctermfg=LightRed guifg=DarkOrange guibg=grey80 -if &t_Co > 8 - hi Statement term=bold cterm=bold ctermfg=DarkGreen ctermbg=White guifg=#ffff60 gui=bold +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish endif -hi Ignore ctermfg=LightGrey guifg=grey90 -" vim: sw=2 +" Background: light +" Color: Black #000000 16 black +" Color: DarkGrey #767676 243 darkgrey +" Color: MediumGrey #A8A8A8 248 darkgrey +" Color: LightGrey #DADADA 253 grey +" Color: White #ffffff 231 white +" Color: Cyan #00ffff 51 cyan +" Color: Magenta #ff00ff 201 magenta +" Color: Red #ff0000 196 red +" Color: Yellow #ffff00 226 yellow +" Color: SeaGreen #2e8b57 29 darkgreen +" Color: DarkBlue #00008b 18 darkblue +" Color: DarkCyan #008b8b 30 darkcyan +" Color: DarkGreen #006400 22 darkgreen +" Color: DarkOrange #ff8c00 208 darkyellow +" Color: DarkRed #8b0000 88 darkred +" Color: LightBlue #add8e6 153 blue +" Color: LightGreen #90ee90 120 green +" Color: LightMagenta#ff83fa 213 magenta +" Color: LightRed #ffafaf 217 red +" Color: MutedRed #a07070 95 darkred +" Color: MutedYellow #ffff60 228 yellow +" Color: Purple #6a0dad 55 darkmagenta +" Term colors: Black DarkRed DarkGreen Yellow DarkBlue Purple DarkCyan LightGrey +" Term colors: DarkGrey LightRed LightGreen MutedYellow LightBlue Magenta Cyan White +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/slate.vim b/runtime/colors/slate.vim index ffc13b822a..9741d92a3a 100644 --- a/runtime/colors/slate.vim +++ b/runtime/colors/slate.vim @@ -1,55 +1,350 @@ -"%% SiSU Vim color file -" Slate Maintainer: Ralph Amissah <ralph@amissah.com> -" (originally looked at desert Hans Fugal <hans@fugal.net> http://hans.fugal.net/vim/colors/desert.vim (2003/05/06) -:set background=dark -:highlight clear -if version > 580 - hi clear - if exists("syntax_on") - syntax reset - endif +" Name: slate +" Description: Remake of slate +" Author: Original maintainer Ralph Amissah <ralph@amissah.com> +" Maintainer: Original maintainer Ralph Amissah <ralph@amissah.com> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:45 2022 + +" Generated by Colortemplate v2.2.0 + +set background=dark + +hi clear +let g:colors_name = 'slate' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#000000', '#ff0000', '#5f8700', '#ffff00', '#87d7ff', '#d7d787', '#ffd7af', '#666666', '#333333', '#ffafaf', '#00875f', '#ffd700', '#5f87d7', '#afaf87', '#ff8787', '#ffffff'] endif -let colors_name = "slate" -:hi Normal guifg=White guibg=grey15 -:hi Cursor guibg=khaki guifg=slategrey -:hi VertSplit guibg=#c2bfa5 guifg=grey40 gui=none cterm=reverse -:hi Folded guibg=black guifg=grey40 ctermfg=grey ctermbg=darkgrey -:hi FoldColumn guibg=black guifg=grey20 ctermfg=4 ctermbg=7 -:hi IncSearch guifg=green guibg=black cterm=none ctermfg=yellow ctermbg=green -:hi ModeMsg guifg=goldenrod cterm=none ctermfg=brown -:hi MoreMsg guifg=SeaGreen ctermfg=darkgreen -:hi NonText guifg=RoyalBlue guibg=grey15 cterm=bold ctermfg=blue -:hi Question guifg=springgreen ctermfg=green -:hi Search guibg=peru guifg=wheat cterm=none ctermfg=grey ctermbg=blue -:hi SpecialKey guifg=yellowgreen ctermfg=darkgreen -:hi StatusLine guibg=#c2bfa5 guifg=black gui=none cterm=bold,reverse -:hi StatusLineNC guibg=#c2bfa5 guifg=grey40 gui=none cterm=reverse -:hi Title guifg=gold gui=bold cterm=bold ctermfg=yellow -:hi Statement guifg=CornflowerBlue ctermfg=lightblue -:hi Visual gui=none guifg=khaki guibg=olivedrab cterm=reverse -:hi WarningMsg guifg=salmon ctermfg=1 -:hi String guifg=SkyBlue ctermfg=darkcyan -:hi Comment term=bold ctermfg=11 guifg=grey40 -:hi Constant guifg=#ffa0a0 ctermfg=brown -:hi Special guifg=darkkhaki ctermfg=brown -:hi Identifier guifg=salmon ctermfg=red -:hi Include guifg=red ctermfg=red -:hi PreProc guifg=red guibg=white ctermfg=red -:hi Operator guifg=Red ctermfg=Red -:hi Define guifg=gold gui=bold ctermfg=yellow -:hi Type guifg=CornflowerBlue ctermfg=2 -:hi Function guifg=navajowhite ctermfg=brown -:hi Structure guifg=green ctermfg=green -:hi LineNr guifg=grey50 ctermfg=3 -:hi Ignore guifg=grey40 cterm=bold ctermfg=7 -:hi Todo guifg=orangered guibg=yellow2 -:hi Directory ctermfg=darkcyan -:hi ErrorMsg cterm=bold guifg=White guibg=Red cterm=bold ctermfg=7 ctermbg=1 -:hi WildMenu ctermfg=0 ctermbg=3 -:hi DiffAdd ctermbg=4 -:hi DiffChange ctermbg=5 -:hi DiffDelete cterm=bold ctermfg=4 ctermbg=6 -:hi DiffText cterm=bold ctermbg=1 -:hi Underlined cterm=underline ctermfg=5 -:hi Error guifg=White guibg=Red cterm=bold ctermfg=7 ctermbg=1 -:hi SpellErrors guifg=White guibg=Red cterm=bold ctermfg=7 ctermbg=1 +hi Normal guifg=#ffffff guibg=#262626 gui=NONE cterm=NONE +hi EndOfBuffer guifg=#5f87d7 guibg=NONE gui=NONE cterm=NONE +hi StatusLine guifg=#000000 guibg=#afaf87 gui=NONE cterm=NONE +hi StatusLineNC guifg=#666666 guibg=#afaf87 gui=NONE cterm=NONE +hi StatusLineTerm guifg=#000000 guibg=#afaf87 gui=NONE cterm=NONE +hi StatusLineTermNC guifg=#666666 guibg=#afaf87 gui=NONE cterm=NONE +hi VertSplit guifg=#666666 guibg=#afaf87 gui=NONE cterm=NONE +hi PmenuSel guifg=#262626 guibg=#d7d787 gui=NONE cterm=NONE +hi Pmenu guifg=NONE guibg=#4a4a4a gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=#262626 gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#ffd700 gui=NONE cterm=NONE +hi TabLineSel guifg=#000000 guibg=#afaf87 gui=NONE cterm=NONE +hi TabLine guifg=#666666 guibg=#333333 gui=NONE cterm=NONE +hi TabLineFill guifg=#ff8787 guibg=#333333 gui=NONE cterm=NONE +hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi ToolbarButton guifg=#262626 guibg=#d7d787 gui=NONE cterm=NONE +hi NonText guifg=#5f87d7 guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#00875f guibg=NONE gui=NONE cterm=NONE +hi QuickFixLine guifg=#000000 guibg=#5f87d7 gui=NONE cterm=NONE +hi Folded guifg=#666666 guibg=#000000 gui=NONE cterm=NONE +hi FoldColumn guifg=#5f87d7 guibg=#000000 gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#333333 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#333333 gui=NONE cterm=NONE +hi CursorLineNr guifg=NONE guibg=#333333 gui=NONE cterm=NONE +hi Visual guifg=#d7d787 guibg=#5f8700 gui=NONE cterm=NONE +hi SignColumn guifg=NONE guibg=#262626 gui=NONE cterm=NONE +hi VisualNOS guifg=#d7d787 guibg=#5f8700 gui=NONE cterm=NONE +hi LineNr guifg=#666666 guibg=NONE gui=NONE cterm=NONE +hi Underlined guifg=#5f87d7 guibg=NONE gui=underline cterm=underline +hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse +hi ErrorMsg guifg=#ff0000 guibg=#000000 gui=reverse cterm=reverse +hi ModeMsg guifg=#262626 guibg=#ffd700 gui=NONE cterm=NONE +hi WarningMsg guifg=#ff8787 guibg=NONE gui=NONE cterm=NONE +hi MoreMsg guifg=#00875f guibg=NONE gui=NONE cterm=NONE +hi Question guifg=#ffd700 guibg=NONE gui=NONE cterm=NONE +hi Todo guifg=#ff0000 guibg=#ffff00 gui=NONE cterm=NONE +hi MatchParen guifg=#000000 guibg=#ffd700 gui=NONE cterm=NONE +hi Search guifg=#000000 guibg=#d7875f gui=NONE cterm=NONE +hi IncSearch guifg=#000000 guibg=#00ff00 gui=NONE cterm=NONE +hi WildMenu guifg=#262626 guibg=#d7d787 gui=NONE cterm=NONE +hi ColorColumn guifg=NONE guibg=#000000 gui=NONE cterm=NONE +hi Cursor guifg=#333333 guibg=#d7d787 gui=NONE cterm=NONE +hi lCursor guifg=#262626 guibg=#ffafaf gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#ffff00 guibg=NONE guisp=#ffff00 gui=undercurl cterm=underline +hi SpellLocal guifg=#ffafaf guibg=NONE guisp=#ffafaf gui=undercurl cterm=underline +hi SpellRare guifg=#ffd7af guibg=NONE guisp=#ffd7af gui=undercurl cterm=underline +hi Comment guifg=#666666 guibg=NONE gui=NONE cterm=NONE +hi String guifg=#87d7ff guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#ff8787 guibg=NONE gui=NONE cterm=NONE +hi Function guifg=#ffd7af guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#d7d787 guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#5f87d7 guibg=NONE gui=bold cterm=NONE +hi Constant guifg=#ffafaf guibg=NONE gui=NONE cterm=NONE +hi PreProc guifg=#d7875f guibg=NONE gui=NONE cterm=NONE +hi Type guifg=#5f87d7 guibg=NONE gui=bold cterm=NONE +hi Operator guifg=#d7875f guibg=NONE gui=NONE cterm=NONE +hi Define guifg=#ffd700 guibg=NONE gui=bold cterm=NONE +hi Structure guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE +hi Directory guifg=#00875f guibg=NONE gui=bold cterm=NONE +hi Conceal guifg=#666666 guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Title guifg=#ffd700 guibg=NONE gui=bold cterm=NONE +hi! link Terminal Normal +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi Normal ctermfg=231 ctermbg=235 cterm=NONE + hi EndOfBuffer ctermfg=68 ctermbg=NONE cterm=NONE + hi StatusLine ctermfg=16 ctermbg=144 cterm=NONE + hi StatusLineNC ctermfg=241 ctermbg=144 cterm=NONE + hi StatusLineTerm ctermfg=16 ctermbg=144 cterm=NONE + hi StatusLineTermNC ctermfg=241 ctermbg=144 cterm=NONE + hi VertSplit ctermfg=241 ctermbg=144 cterm=NONE + hi PmenuSel ctermfg=235 ctermbg=186 cterm=NONE + hi Pmenu ctermfg=NONE ctermbg=239 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=235 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=220 cterm=NONE + hi TabLineSel ctermfg=16 ctermbg=144 cterm=NONE + hi TabLine ctermfg=241 ctermbg=236 cterm=NONE + hi TabLineFill ctermfg=210 ctermbg=236 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=235 ctermbg=186 cterm=NONE + hi NonText ctermfg=68 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=29 ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=16 ctermbg=68 cterm=NONE + hi Folded ctermfg=241 ctermbg=16 cterm=NONE + hi FoldColumn ctermfg=68 ctermbg=16 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=236 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=236 cterm=NONE + hi CursorLineNr ctermfg=NONE ctermbg=236 cterm=NONE + hi Visual ctermfg=186 ctermbg=64 cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=235 cterm=NONE + hi VisualNOS ctermfg=186 ctermbg=64 cterm=NONE + hi LineNr ctermfg=241 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=68 ctermbg=NONE cterm=underline + hi Error ctermfg=196 ctermbg=231 cterm=reverse + hi ErrorMsg ctermfg=196 ctermbg=16 cterm=reverse + hi ModeMsg ctermfg=235 ctermbg=220 cterm=NONE + hi WarningMsg ctermfg=210 ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=29 ctermbg=NONE cterm=NONE + hi Question ctermfg=220 ctermbg=NONE cterm=NONE + hi Todo ctermfg=196 ctermbg=226 cterm=NONE + hi MatchParen ctermfg=16 ctermbg=220 cterm=NONE + hi Search ctermfg=16 ctermbg=173 cterm=NONE + hi IncSearch ctermfg=16 ctermbg=46 cterm=NONE + hi WildMenu ctermfg=235 ctermbg=186 cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=16 cterm=NONE + hi Cursor ctermfg=236 ctermbg=186 cterm=NONE + hi lCursor ctermfg=235 ctermbg=217 cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=226 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=217 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=223 ctermbg=NONE cterm=underline + hi Comment ctermfg=241 ctermbg=NONE cterm=NONE + hi String ctermfg=117 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=210 ctermbg=NONE cterm=NONE + hi Function ctermfg=223 ctermbg=NONE cterm=NONE + hi Special ctermfg=186 ctermbg=NONE cterm=NONE + hi Statement ctermfg=68 ctermbg=NONE cterm=NONE + hi Constant ctermfg=217 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=173 ctermbg=NONE cterm=NONE + hi Type ctermfg=68 ctermbg=NONE cterm=NONE + hi Operator ctermfg=173 ctermbg=NONE cterm=NONE + hi Define ctermfg=220 ctermbg=NONE cterm=NONE + hi Structure ctermfg=46 ctermbg=NONE cterm=NONE + hi Directory ctermfg=29 ctermbg=NONE cterm=NONE + hi Conceal ctermfg=241 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=220 ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi Normal ctermfg=white ctermbg=black cterm=NONE + hi EndOfBuffer ctermfg=blue ctermbg=NONE cterm=NONE + hi StatusLine ctermfg=black ctermbg=grey cterm=NONE + hi StatusLineNC ctermfg=darkgrey ctermbg=grey cterm=NONE + hi StatusLineTerm ctermfg=black ctermbg=grey cterm=NONE + hi StatusLineTermNC ctermfg=darkgrey ctermbg=grey cterm=NONE + hi VertSplit ctermfg=darkgrey ctermbg=grey cterm=NONE + hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE + hi Pmenu ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=yellow cterm=NONE + hi TabLineSel ctermfg=black ctermbg=darkyellow cterm=NONE + hi TabLine ctermfg=grey ctermbg=darkgrey cterm=NONE + hi TabLineFill ctermfg=cyan ctermbg=darkgrey cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE + hi ToolbarButton ctermfg=black ctermbg=darkyellow cterm=NONE + hi NonText ctermfg=blue ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=green ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=black ctermbg=blue cterm=NONE + hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline + hi ColorColumn ctermfg=white ctermbg=darkgrey cterm=NONE + hi Visual ctermfg=yellow ctermbg=darkgreen cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=black cterm=NONE + hi VisualNOS ctermfg=darkmagenta ctermbg=darkgreen cterm=NONE + hi LineNr ctermfg=grey ctermbg=NONE cterm=NONE + hi Underlined ctermfg=blue ctermbg=NONE cterm=underline + hi Error ctermfg=darkred ctermbg=white cterm=reverse + hi ErrorMsg ctermfg=darkred ctermbg=black cterm=reverse + hi ModeMsg ctermfg=black ctermbg=yellow cterm=NONE + hi WarningMsg ctermfg=cyan ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=green ctermbg=NONE cterm=NONE + hi Question ctermfg=yellow ctermbg=NONE cterm=NONE + hi Todo ctermfg=darkred ctermbg=darkyellow cterm=NONE + hi MatchParen ctermfg=black ctermbg=yellow cterm=NONE + hi Search ctermfg=black ctermbg=darkmagenta cterm=NONE + hi IncSearch ctermfg=black ctermbg=darkgreen cterm=NONE + hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE + hi ColorColumn ctermfg=white ctermbg=darkgrey cterm=NONE + hi Cursor ctermfg=darkgrey ctermbg=darkmagenta cterm=NONE + hi lCursor ctermfg=black ctermbg=red cterm=NONE + hi SpellBad ctermfg=darkred ctermbg=NONE cterm=underline + hi SpellCap ctermfg=darkyellow ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=red ctermbg=NONE cterm=underline + hi SpellRare ctermfg=darkcyan ctermbg=NONE cterm=underline + hi Comment ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi String ctermfg=cyan ctermbg=NONE cterm=NONE + hi Identifier ctermfg=darkred ctermbg=NONE cterm=NONE + hi Function ctermfg=yellow ctermbg=NONE cterm=NONE + hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE + hi Statement ctermfg=blue ctermbg=NONE cterm=NONE + hi Constant ctermfg=red ctermbg=NONE cterm=NONE + hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Type ctermfg=blue ctermbg=NONE cterm=NONE + hi Operator ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Define ctermfg=yellow ctermbg=NONE cterm=NONE + hi Structure ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Directory ctermfg=green ctermbg=NONE cterm=NONE + hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=yellow ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif + +" Background: dark +" Color: foreground #FFFFFF 231 white +" Color: background #262626 235 black +" Color: color00 #000000 16 black +" Color: color08 #333333 236 darkgrey +" Color: color01 #FF0000 196 darkred +" Color: color09 #FFAFAF 217 red +" Color: color02 #5F8700 64 darkgreen +" Color: color10 #00875F 29 green +" Color: color03 #ffff00 226 darkyellow +" Color: color11 #FFD700 220 yellow +" Color: color04 #87d7FF 117 darkblue +" Color: color12 #5F87D7 68 blue +" Color: color05 #d7d787 186 darkmagenta +" Color: color13 #AFAF87 144 magenta +" Color: color06 #FFD7AF 223 darkcyan +" Color: color14 #FF8787 210 cyan +" Color: color07 #666666 241 grey +" Color: color15 #FFFFFF 231 white +" Color: color16 #D7875F 173 darkmagenta +" Color: color17 #00FF00 46 darkgreen +" Color: Pmenu #4A4A4A 239 darkgrey +" Term colors: color00 color01 color02 color03 color04 color05 color06 color07 +" Term colors: color08 color09 color10 color11 color12 color13 color14 color15 +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/torte.vim b/runtime/colors/torte.vim index 0e7a916a1c..fc9605b477 100644 --- a/runtime/colors/torte.vim +++ b/runtime/colors/torte.vim @@ -1,50 +1,362 @@ -" Vim color file -" Maintainer: Thorsten Maerz <info@netztorte.de> -" Last Change: 2006 Dec 07 -" grey on black -" optimized for TFT panels +" Name: torte +" Description: Remake of torte (grey on black) +" Author: Original maintainer Thorsten Maerz <info@netztorte.de> +" Maintainer: Original maintainer Thorsten Maerz <info@netztorte.de> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:46 2022 + +" Generated by Colortemplate v2.2.0 set background=dark + hi clear -if exists("syntax_on") - syntax reset +let g:colors_name = 'torte' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff'] endif -"colorscheme default -let g:colors_name = "torte" - -" hardcoded colors : -" GUI Comment : #80a0ff = Light blue - -" GUI -highlight Normal guifg=Grey80 guibg=Black -highlight Search guifg=Black guibg=Red gui=bold -highlight Visual guifg=#404040 gui=bold -highlight Cursor guifg=Black guibg=Green gui=bold -highlight Special guifg=Orange -highlight Comment guifg=#80a0ff -highlight StatusLine guifg=blue guibg=white -highlight Statement guifg=Yellow gui=NONE -highlight Type gui=NONE - -" Console -highlight Normal ctermfg=LightGrey ctermbg=Black -highlight Search ctermfg=Black ctermbg=Red cterm=NONE -highlight Visual cterm=reverse -highlight Cursor ctermfg=Black ctermbg=Green cterm=bold -highlight Special ctermfg=Brown -highlight Comment ctermfg=Blue -highlight StatusLine ctermfg=blue ctermbg=white -highlight Statement ctermfg=Yellow cterm=NONE -highlight Type cterm=NONE - -" only for vim 5 -if has("unix") - if v:version<600 - highlight Normal ctermfg=Grey ctermbg=Black cterm=NONE guifg=Grey80 guibg=Black gui=NONE - highlight Search ctermfg=Black ctermbg=Red cterm=bold guifg=Black guibg=Red gui=bold - highlight Visual ctermfg=Black ctermbg=yellow cterm=bold guifg=#404040 gui=bold - highlight Special ctermfg=LightBlue cterm=NONE guifg=LightBlue gui=NONE - highlight Comment ctermfg=Cyan cterm=NONE guifg=LightBlue gui=NONE - endif +hi Normal guifg=#cccccc guibg=#000000 gui=NONE cterm=NONE +hi! link StatusLineTerm StatusLine +hi! link StatusLineTermNC StatusLineNC +hi Comment guifg=#80a0ff guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#ffa0a0 guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#40ffff guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#ffff60 guibg=NONE gui=NONE cterm=NONE +hi PreProc guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE +hi Type guifg=#60ff60 guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#ffa500 guibg=NONE gui=NONE cterm=NONE +hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline +hi Ignore guifg=#000000 guibg=#000000 gui=NONE cterm=NONE +hi Error guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE +hi Todo guifg=#ffff00 guibg=#000000 gui=reverse cterm=reverse +hi Folded guifg=#00cdcd guibg=#3a3a3a gui=NONE cterm=NONE +hi Visual guifg=#000000 guibg=#a9a9a9 gui=bold cterm=NONE +hi CursorColumn guifg=NONE guibg=#666666 gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE +hi CursorLineNr guifg=#ffff00 guibg=#666666 gui=NONE cterm=NONE +hi SignColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi FoldColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi ColorColumn guifg=#cccccc guibg=#8b0000 gui=NONE cterm=NONE +hi Conceal guifg=#e5e5e5 guibg=#a9a9a9 gui=NONE cterm=NONE +hi Cursor guifg=#000000 guibg=#00ff00 gui=bold cterm=NONE +hi lCursor guifg=#000000 guibg=#e5e5e5 gui=NONE cterm=NONE +hi CursorIM guifg=NONE guibg=fg gui=NONE cterm=NONE +hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=NONE +hi Directory guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi Search guifg=#ff0000 guibg=#000000 gui=reverse cterm=reverse +hi IncSearch guifg=#00cd00 guibg=#000000 gui=reverse cterm=reverse +hi NonText guifg=#0000ff guibg=NONE gui=bold cterm=NONE +hi EndOfBuffer guifg=#0000ff guibg=NONE gui=bold cterm=NONE +hi ErrorMsg guifg=#ffffff guibg=#cd0000 gui=NONE cterm=NONE +hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE +hi LineNr guifg=#7f7f7f guibg=NONE gui=NONE cterm=NONE +hi MatchParen guifg=NONE guibg=#008b8b gui=NONE cterm=NONE +hi ModeMsg guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=NONE +hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold cterm=NONE +hi Question guifg=#00ff00 guibg=NONE gui=bold cterm=NONE +hi SpecialKey guifg=#00ffff guibg=NONE gui=NONE cterm=NONE +hi VisualNOS guifg=NONE guibg=#000000 gui=bold,underline cterm=underline +hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi QuickFixLine guifg=#000000 guibg=#cdcd00 gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#5c5cff guibg=NONE guisp=#5c5cff gui=undercurl cterm=underline +hi SpellLocal guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline +hi SpellRare guifg=#00ffff guibg=NONE guisp=#00ffff gui=undercurl cterm=underline +hi StatusLine guifg=#ffffff guibg=#0000ee gui=bold cterm=NONE +hi StatusLineNC guifg=#000000 guibg=#e5e5e5 gui=NONE cterm=NONE +hi VertSplit guifg=#000000 guibg=#e5e5e5 gui=NONE cterm=NONE +hi TabLine guifg=#ffffff guibg=#7f7f7f gui=NONE cterm=NONE +hi TabLineFill guifg=NONE guibg=#000000 gui=reverse cterm=reverse +hi TabLineSel guifg=#cccccc guibg=#000000 gui=bold cterm=NONE +hi ToolbarLine guifg=NONE guibg=#000000 gui=NONE cterm=NONE +hi ToolbarButton guifg=#000000 guibg=#e5e5e5 gui=bold cterm=NONE +hi Pmenu guifg=fg guibg=#303030 gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#bebebe gui=NONE cterm=NONE +hi! link Terminal Normal +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi Normal ctermfg=251 ctermbg=16 cterm=NONE + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi Comment ctermfg=111 ctermbg=NONE cterm=NONE + hi Constant ctermfg=217 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=87 ctermbg=NONE cterm=NONE + hi Statement ctermfg=227 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=213 ctermbg=NONE cterm=NONE + hi Type ctermfg=83 ctermbg=NONE cterm=NONE + hi Special ctermfg=214 ctermbg=NONE cterm=NONE + hi Underlined ctermfg=111 ctermbg=NONE cterm=underline + hi Ignore ctermfg=16 ctermbg=16 cterm=NONE + hi Error ctermfg=231 ctermbg=196 cterm=NONE + hi Todo ctermfg=226 ctermbg=16 cterm=reverse + hi Folded ctermfg=44 ctermbg=237 cterm=NONE + hi Visual ctermfg=16 ctermbg=248 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=242 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=242 cterm=NONE + hi CursorLineNr ctermfg=226 ctermbg=242 cterm=NONE + hi SignColumn ctermfg=51 ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=51 ctermbg=NONE cterm=NONE + hi ColorColumn ctermfg=251 ctermbg=88 cterm=NONE + hi Conceal ctermfg=254 ctermbg=248 cterm=NONE + hi Cursor ctermfg=16 ctermbg=46 cterm=NONE + hi lCursor ctermfg=16 ctermbg=254 cterm=NONE + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi Title ctermfg=201 ctermbg=NONE cterm=NONE + hi Directory ctermfg=51 ctermbg=NONE cterm=NONE + hi Search ctermfg=196 ctermbg=16 cterm=reverse + hi IncSearch ctermfg=40 ctermbg=16 cterm=reverse + hi NonText ctermfg=21 ctermbg=NONE cterm=NONE + hi EndOfBuffer ctermfg=21 ctermbg=NONE cterm=NONE + hi ErrorMsg ctermfg=231 ctermbg=160 cterm=NONE + hi WarningMsg ctermfg=196 ctermbg=NONE cterm=NONE + hi LineNr ctermfg=102 ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=NONE ctermbg=30 cterm=NONE + hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=29 ctermbg=NONE cterm=NONE + hi Question ctermfg=46 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=51 ctermbg=NONE cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=16 cterm=underline + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi QuickFixLine ctermfg=16 ctermbg=184 cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=63 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=201 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=51 ctermbg=NONE cterm=underline + hi StatusLine ctermfg=231 ctermbg=20 cterm=NONE + hi StatusLineNC ctermfg=16 ctermbg=254 cterm=NONE + hi VertSplit ctermfg=16 ctermbg=254 cterm=NONE + hi TabLine ctermfg=231 ctermbg=102 cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=16 cterm=reverse + hi TabLineSel ctermfg=251 ctermbg=16 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=16 cterm=NONE + hi ToolbarButton ctermfg=16 ctermbg=254 cterm=NONE + hi Pmenu ctermfg=fg ctermbg=236 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=226 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=250 cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 16 + hi Normal ctermfg=white ctermbg=black cterm=NONE + hi! link StatusLineTerm StatusLine + hi! link StatusLineTermNC StatusLineNC + hi Comment ctermfg=blue ctermbg=NONE cterm=NONE + hi Constant ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE + hi Statement ctermfg=yellow ctermbg=NONE cterm=NONE + hi PreProc ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Type ctermfg=green ctermbg=NONE cterm=NONE + hi Special ctermfg=darkred ctermbg=NONE cterm=NONE + hi Underlined ctermfg=blue ctermbg=NONE cterm=underline + hi Ignore ctermfg=black ctermbg=black cterm=NONE + hi Error ctermfg=white ctermbg=red cterm=NONE + hi Todo ctermfg=yellow ctermbg=black cterm=reverse + hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE + hi Visual ctermfg=black ctermbg=grey cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline + hi SignColumn ctermfg=cyan ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=cyan ctermbg=NONE cterm=NONE + hi ColorColumn ctermfg=white ctermbg=darkred cterm=NONE + hi Conceal ctermfg=grey ctermbg=grey cterm=NONE + hi Cursor ctermfg=black ctermbg=green cterm=NONE + hi lCursor ctermfg=black ctermbg=grey cterm=NONE + hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE + hi Title ctermfg=magenta ctermbg=NONE cterm=NONE + hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE + hi Search ctermfg=red ctermbg=black cterm=reverse + hi IncSearch ctermfg=darkgreen ctermbg=black cterm=reverse + hi NonText ctermfg=blue ctermbg=NONE cterm=NONE + hi EndOfBuffer ctermfg=blue ctermbg=NONE cterm=NONE + hi ErrorMsg ctermfg=white ctermbg=darkred cterm=NONE + hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE + hi LineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=NONE + hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE + hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Question ctermfg=green ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline + hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE + hi QuickFixLine ctermfg=black ctermbg=darkyellow cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=blue ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=magenta ctermbg=NONE cterm=underline + hi SpellRare ctermfg=cyan ctermbg=NONE cterm=underline + hi StatusLine ctermfg=white ctermbg=darkblue cterm=NONE + hi StatusLineNC ctermfg=black ctermbg=grey cterm=NONE + hi VertSplit ctermfg=black ctermbg=grey cterm=NONE + hi TabLine ctermfg=white ctermbg=darkgrey cterm=NONE + hi TabLineFill ctermfg=NONE ctermbg=black cterm=reverse + hi TabLineSel ctermfg=white ctermbg=black cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE + hi ToolbarButton ctermfg=black ctermbg=grey cterm=NONE + hi Pmenu ctermfg=fg ctermbg=darkgrey cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish endif +" Background: dark +" Color: foreground #CCCCCC 251 white +" Color: background #000000 16 black +" Color: color00 #000000 16 black +" Color: color08 #7f7f7f 102 darkgrey +" Color: color01 #cd0000 160 darkred +" Color: color09 #ff0000 196 red +" Color: color02 #00cd00 40 darkgreen +" Color: color10 #00ff00 46 green +" Color: color03 #cdcd00 184 darkyellow +" Color: color11 #ffff00 226 yellow +" Color: color04 #0000ee 20 darkblue +" Color: color12 #5c5cff 63 blue +" Color: color05 #cd00cd 164 darkmagenta +" Color: color13 #ff00ff 201 magenta +" Color: color06 #00cdcd 44 darkcyan +" Color: color14 #00ffff 51 cyan +" Color: color07 #e5e5e5 254 grey +" Color: color15 #ffffff 231 white +" Term colors: color00 color01 color02 color03 color04 color05 color06 color07 +" Term colors: color08 color09 color10 color11 color12 color13 color14 color15 +" Color: rgbGrey40 #666666 242 grey +" Color: rgbDarkGrey #a9a9a9 248 grey +" Color: rgbDarkBlue #00008b 18 darkblue +" Color: rgbDarkMagenta #8b008b 90 darkmagenta +" Color: rgbBlue #0000ff 21 blue +" Color: rgbDarkCyan #008b8b 30 darkcyan +" Color: Directory #00ffff 51 cyan +" Color: rgbSeaGreen #2e8b57 29 darkgreen +" Color: rgbGrey #bebebe 250 grey +" Color: Question #00ff00 46 green +" Color: SignColumn #a9a9a9 248 black +" Color: SpecialKey #00ffff 51 cyan +" Color: StatusLineTerm #90ee90 120 darkgreen +" Color: Title #ff00ff 201 magenta +" Color: WarningMsg #ff0000 196 red +" Color: ToolbarLine #7f7f7f 243 black +" Color: ToolbarButton #d3d3d3 252 darkgrey +" Color: Comment #80a0ff 111 blue +" Color: Constant #ffa0a0 217 darkmagenta +" Color: Special #ffa500 214 darkred +" Color: Identifier #40ffff 87 cyan +" Color: Statement #ffff60 227 yellow +" Color: PreProc #ff80ff 213 darkcyan +" Color: Type #60ff60 83 green +" Color: Underlined #80a0ff 111 blue +" Color: FoldedBG #3a3a3a 237 darkgrey +" Color: Pmenu #303030 236 darkgrey +" Color: rgbDarkRed #8b0000 88 darkred +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/colors/zellner.vim b/runtime/colors/zellner.vim index ab875825c9..0fbf53c891 100644 --- a/runtime/colors/zellner.vim +++ b/runtime/colors/zellner.vim @@ -1,54 +1,341 @@ -" local syntax file - set colors on a per-machine basis: -" vim: tw=0 ts=4 sw=4 -" Vim color file -" Maintainer: Ron Aaron <ron@ronware.org> -" Last Change: 2003 May 02 +" Name: zellner +" Description: Light background colorscheme. +" Author: Original author Ron Aaron <ron@ronware.org> +" Maintainer: Original maintainer Ron Aaron <ron@ronware.org> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Updated: Wed May 11 22:56:47 2022 + +" Generated by Colortemplate v2.2.0 set background=light + hi clear -if exists("syntax_on") - syntax reset +let g:colors_name = 'zellner' + +let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 1 + +if (has('termguicolors') && &termguicolors) || has('gui_running') + let g:terminal_ansi_colors = ['#ffffff', '#a52a2a', '#ff00ff', '#a020f0', '#0000ff', '#0000ff', '#ff00ff', '#a9a9a9', '#ff0000', '#a52a2a', '#ff00ff', '#a020f0', '#0000ff', '#0000ff', '#ff00ff', '#000000'] +endif +hi Normal guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE +hi Folded guifg=#00008b guibg=#d3d3d3 gui=NONE cterm=NONE +hi CursorLine guifg=NONE guibg=#e5e5e5 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE guibg=#e5e5e5 gui=NONE cterm=NONE +hi CursorLineNr guifg=#a52a2a guibg=NONE gui=bold cterm=NONE +hi QuickFixLine guifg=#ffffff guibg=#6a5acd gui=NONE cterm=NONE +hi EndOfBuffer guifg=#a9a9a9 guibg=NONE gui=NONE cterm=NONE +hi StatusLine guifg=#ffff00 guibg=#a9a9a9 gui=NONE cterm=NONE +hi StatusLineNC guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE +hi StatusLineTerm guifg=#ffffff guibg=#006400 gui=NONE cterm=NONE +hi StatusLineTermNC guifg=#ffffff guibg=#0000ff gui=NONE cterm=NONE +hi VertSplit guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE +hi Pmenu guifg=#000000 guibg=#dadada gui=NONE cterm=NONE +hi PmenuSel guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi PmenuSbar guifg=NONE guibg=#ffffff gui=NONE cterm=NONE +hi PmenuThumb guifg=NONE guibg=#a9a9a9 gui=NONE cterm=NONE +hi TabLine guifg=#000000 guibg=#a9a9a9 gui=underline cterm=underline +hi TabLineFill guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse +hi TabLineSel guifg=#000000 guibg=#ffffff gui=bold cterm=NONE +hi ToolbarLine guifg=NONE guibg=#d3d3d3 gui=NONE cterm=NONE +hi ToolbarButton guifg=NONE guibg=#a9a9a9 gui=bold cterm=NONE +hi NonText guifg=#a9a9a9 guibg=NONE gui=NONE cterm=NONE +hi SpecialKey guifg=#a9a9a9 guibg=NONE gui=NONE cterm=NONE +hi Visual guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi VisualNOS guifg=NONE guibg=#ff0000 gui=NONE cterm=NONE +hi LineNr guifg=#a52a2a guibg=NONE gui=NONE cterm=NONE +hi FoldColumn guifg=#00008b guibg=NONE gui=NONE cterm=NONE +hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Underlined guifg=#6a5acd guibg=NONE gui=underline cterm=underline +hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse +hi ErrorMsg guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse +hi WarningMsg guifg=#a020f0 guibg=#ffffff gui=NONE cterm=NONE +hi MoreMsg guifg=#000000 guibg=#ffffff gui=bold cterm=NONE +hi ModeMsg guifg=#000000 guibg=#ffffff gui=bold cterm=NONE +hi Question guifg=#ff00ff guibg=NONE gui=bold cterm=NONE +hi Todo guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi MatchParen guifg=#ffffff guibg=#ff00ff gui=NONE cterm=NONE +hi Search guifg=#ffffff guibg=#a020f0 gui=NONE cterm=NONE +hi IncSearch guifg=#000000 guibg=NONE gui=reverse cterm=reverse +hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE +hi ColorColumn guifg=NONE guibg=#eeeeee gui=NONE cterm=NONE +hi Cursor guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE +hi lCursor guifg=#000000 guibg=#ff00ff gui=NONE cterm=NONE +hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline +hi SpellCap guifg=#0000ff guibg=NONE guisp=#0000ff gui=undercurl cterm=underline +hi SpellLocal guifg=#878700 guibg=NONE guisp=#878700 gui=undercurl cterm=underline +hi SpellRare guifg=#008787 guibg=NONE guisp=#008787 gui=undercurl cterm=underline +hi Comment guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE +hi Constant guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE +hi Identifier guifg=#0000ff guibg=NONE gui=NONE cterm=NONE +hi Statement guifg=#a52a2a guibg=NONE gui=NONE cterm=NONE +hi PreProc guifg=#a020f0 guibg=NONE gui=NONE cterm=NONE +hi Type guifg=#0000ff guibg=NONE gui=NONE cterm=NONE +hi Special guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE +hi Tag guifg=#006400 guibg=NONE gui=NONE cterm=NONE +hi Directory guifg=#0000ff guibg=NONE gui=bold cterm=NONE +hi Conceal guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE +hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Title guifg=#a020f0 guibg=NONE gui=bold cterm=NONE +hi! link Terminal Normal +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi! link CurSearch Search +hi! link CursorLineFold CursorLine +hi! link CursorLineSign CursorLine +hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE +hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE +hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE +hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE + +if s:t_Co >= 256 + hi Normal ctermfg=16 ctermbg=231 cterm=NONE + hi Folded ctermfg=18 ctermbg=252 cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=254 cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=254 cterm=NONE + hi CursorLineNr ctermfg=124 ctermbg=NONE cterm=NONE + hi QuickFixLine ctermfg=231 ctermbg=62 cterm=NONE + hi EndOfBuffer ctermfg=248 ctermbg=NONE cterm=NONE + hi StatusLine ctermfg=226 ctermbg=248 cterm=NONE + hi StatusLineNC ctermfg=231 ctermbg=16 cterm=NONE + hi StatusLineTerm ctermfg=231 ctermbg=22 cterm=NONE + hi StatusLineTermNC ctermfg=231 ctermbg=21 cterm=NONE + hi VertSplit ctermfg=231 ctermbg=16 cterm=NONE + hi Pmenu ctermfg=16 ctermbg=253 cterm=NONE + hi PmenuSel ctermfg=16 ctermbg=226 cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=231 cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=248 cterm=NONE + hi TabLine ctermfg=16 ctermbg=248 cterm=underline + hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse + hi TabLineSel ctermfg=16 ctermbg=231 cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=252 cterm=NONE + hi ToolbarButton ctermfg=NONE ctermbg=248 cterm=NONE + hi NonText ctermfg=248 ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=248 ctermbg=NONE cterm=NONE + hi Visual ctermfg=16 ctermbg=226 cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=196 cterm=NONE + hi LineNr ctermfg=124 ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=18 ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE + hi Underlined ctermfg=62 ctermbg=NONE cterm=underline + hi Error ctermfg=196 ctermbg=231 cterm=reverse + hi ErrorMsg ctermfg=196 ctermbg=231 cterm=reverse + hi WarningMsg ctermfg=129 ctermbg=231 cterm=NONE + hi MoreMsg ctermfg=16 ctermbg=231 cterm=NONE + hi ModeMsg ctermfg=16 ctermbg=231 cterm=NONE + hi Question ctermfg=201 ctermbg=NONE cterm=NONE + hi Todo ctermfg=16 ctermbg=226 cterm=NONE + hi MatchParen ctermfg=231 ctermbg=201 cterm=NONE + hi Search ctermfg=231 ctermbg=129 cterm=NONE + hi IncSearch ctermfg=16 ctermbg=NONE cterm=reverse + hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=255 cterm=NONE + hi Cursor ctermfg=231 ctermbg=16 cterm=NONE + hi lCursor ctermfg=16 ctermbg=201 cterm=NONE + hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline + hi SpellCap ctermfg=21 ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=100 ctermbg=NONE cterm=underline + hi SpellRare ctermfg=30 ctermbg=NONE cterm=underline + hi Comment ctermfg=196 ctermbg=NONE cterm=NONE + hi Constant ctermfg=201 ctermbg=NONE cterm=NONE + hi Identifier ctermfg=21 ctermbg=NONE cterm=NONE + hi Statement ctermfg=124 ctermbg=NONE cterm=NONE + hi PreProc ctermfg=129 ctermbg=NONE cterm=NONE + hi Type ctermfg=21 ctermbg=NONE cterm=NONE + hi Special ctermfg=201 ctermbg=NONE cterm=NONE + hi Tag ctermfg=22 ctermbg=NONE cterm=NONE + hi Directory ctermfg=21 ctermbg=NONE cterm=NONE + hi Conceal ctermfg=196 ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=129 ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE + hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE + hi DiffText ctermfg=16 ctermbg=251 cterm=NONE + hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE + unlet s:t_Co + finish endif -let g:colors_name = "zellner" - -hi Comment term=bold ctermfg=Red guifg=Red -hi Normal guifg=black guibg=white -hi Constant term=underline ctermfg=Magenta guifg=Magenta -hi Special term=bold ctermfg=Magenta guifg=Magenta -hi Identifier term=underline ctermfg=Blue guifg=Blue -hi Statement term=bold ctermfg=DarkRed gui=NONE guifg=Brown -hi PreProc term=underline ctermfg=Magenta guifg=Purple -hi Type term=underline ctermfg=Blue gui=NONE guifg=Blue -hi Visual term=reverse ctermfg=Yellow ctermbg=Red gui=NONE guifg=Black guibg=Yellow -hi Search term=reverse ctermfg=Black ctermbg=Cyan gui=NONE guifg=Black guibg=Cyan -hi Tag term=bold ctermfg=DarkGreen guifg=DarkGreen -hi Error term=reverse ctermfg=15 ctermbg=9 guibg=Red guifg=White -hi Todo term=standout ctermbg=Yellow ctermfg=Black guifg=Blue guibg=Yellow -hi StatusLine term=bold,reverse cterm=NONE ctermfg=Yellow ctermbg=DarkGray gui=NONE guifg=Yellow guibg=DarkGray -hi! link MoreMsg Comment -hi! link ErrorMsg Visual -hi! link WarningMsg ErrorMsg -hi! link Question Comment -hi link String Constant -hi link Character Constant -hi link Number Constant -hi link Boolean Constant -hi link Float Number -hi link Function Identifier -hi link Conditional Statement -hi link Repeat Statement -hi link Label Statement -hi link Operator Statement -hi link Keyword Statement -hi link Exception Statement -hi link Include PreProc -hi link Define PreProc -hi link Macro PreProc -hi link PreCondit PreProc -hi link StorageClass Type -hi link Structure Type -hi link Typedef Type -hi link SpecialChar Special -hi link Delimiter Special -hi link SpecialComment Special -hi link Debug Special + +if s:t_Co >= 16 + hi Normal ctermfg=black ctermbg=white cterm=NONE + hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE + hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline + hi CursorLineNr ctermfg=darkred ctermbg=NONE cterm=underline + hi QuickFixLine ctermfg=white ctermbg=blue cterm=NONE + hi EndOfBuffer ctermfg=darkgrey ctermbg=NONE cterm=NONE + hi StatusLine ctermfg=yellow ctermbg=darkgrey cterm=NONE + hi StatusLineNC ctermfg=white ctermbg=black cterm=NONE + hi StatusLineTerm ctermfg=white ctermbg=darkgreen cterm=NONE + hi StatusLineTermNC ctermfg=white ctermbg=blue cterm=NONE + hi VertSplit ctermfg=white ctermbg=black cterm=NONE + hi Pmenu ctermfg=black ctermbg=grey cterm=NONE + hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE + hi PmenuSbar ctermfg=NONE ctermbg=white cterm=NONE + hi PmenuThumb ctermfg=NONE ctermbg=darkgrey cterm=NONE + hi TabLine ctermfg=black ctermbg=grey cterm=underline + hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse + hi TabLineSel ctermfg=black ctermbg=white cterm=NONE + hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE + hi ToolbarButton ctermfg=NONE ctermbg=grey cterm=NONE + hi NonText ctermfg=grey ctermbg=NONE cterm=NONE + hi SpecialKey ctermfg=grey ctermbg=NONE cterm=NONE + hi Visual ctermfg=black ctermbg=yellow cterm=NONE + hi VisualNOS ctermfg=NONE ctermbg=red cterm=NONE + hi LineNr ctermfg=darkred ctermbg=NONE cterm=NONE + hi FoldColumn ctermfg=darkblue ctermbg=NONE cterm=NONE + hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE + hi Underlined ctermfg=blue ctermbg=NONE cterm=underline + hi Error ctermfg=red ctermbg=white cterm=reverse + hi ErrorMsg ctermfg=red ctermbg=white cterm=reverse + hi WarningMsg ctermfg=darkmagenta ctermbg=white cterm=NONE + hi MoreMsg ctermfg=black ctermbg=white cterm=NONE + hi ModeMsg ctermfg=black ctermbg=white cterm=NONE + hi Question ctermfg=magenta ctermbg=NONE cterm=NONE + hi Todo ctermfg=black ctermbg=yellow cterm=NONE + hi MatchParen ctermfg=white ctermbg=magenta cterm=NONE + hi Search ctermfg=white ctermbg=darkmagenta cterm=NONE + hi IncSearch ctermfg=black ctermbg=NONE cterm=reverse + hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE + hi ColorColumn ctermfg=NONE ctermbg=grey cterm=NONE + hi Cursor ctermfg=white ctermbg=black cterm=NONE + hi lCursor ctermfg=black ctermbg=magenta cterm=NONE + hi SpellBad ctermfg=red ctermbg=NONE cterm=underline + hi SpellCap ctermfg=blue ctermbg=NONE cterm=underline + hi SpellLocal ctermfg=darkyellow ctermbg=NONE cterm=underline + hi SpellRare ctermfg=darkcyan ctermbg=NONE cterm=underline + hi Comment ctermfg=red ctermbg=NONE cterm=NONE + hi Constant ctermfg=magenta ctermbg=NONE cterm=NONE + hi Identifier ctermfg=blue ctermbg=NONE cterm=NONE + hi Statement ctermfg=darkred ctermbg=NONE cterm=NONE + hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi Type ctermfg=blue ctermbg=NONE cterm=NONE + hi Special ctermfg=magenta ctermbg=NONE cterm=NONE + hi Tag ctermfg=darkgreen ctermbg=NONE cterm=NONE + hi Directory ctermfg=blue ctermbg=NONE cterm=NONE + hi Conceal ctermfg=red ctermbg=NONE cterm=NONE + hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE + hi Title ctermfg=darkmagenta ctermbg=NONE cterm=NONE + hi! link Terminal Normal + hi! link LineNrAbove LineNr + hi! link LineNrBelow LineNr + hi! link CurSearch Search + hi! link CursorLineFold CursorLine + hi! link CursorLineSign CursorLine + hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE + hi DiffChange ctermfg=white ctermbg=blue cterm=NONE + hi DiffText ctermfg=black ctermbg=grey cterm=NONE + hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE + unlet s:t_Co + finish +endif + +if s:t_Co >= 0 + hi Normal term=NONE + hi ColorColumn term=reverse + hi Conceal term=NONE + hi Cursor term=reverse + hi CursorColumn term=NONE + hi CursorLine term=underline + hi CursorLineNr term=bold + hi DiffAdd term=reverse + hi DiffChange term=NONE + hi DiffDelete term=reverse + hi DiffText term=reverse + hi Directory term=NONE + hi EndOfBuffer term=NONE + hi ErrorMsg term=bold,reverse + hi FoldColumn term=NONE + hi Folded term=NONE + hi IncSearch term=bold,reverse,underline + hi LineNr term=NONE + hi MatchParen term=bold,underline + hi ModeMsg term=bold + hi MoreMsg term=NONE + hi NonText term=NONE + hi Pmenu term=reverse + hi PmenuSbar term=reverse + hi PmenuSel term=bold + hi PmenuThumb term=NONE + hi Question term=standout + hi Search term=reverse + hi SignColumn term=reverse + hi SpecialKey term=bold + hi SpellBad term=underline + hi SpellCap term=underline + hi SpellLocal term=underline + hi SpellRare term=underline + hi StatusLine term=bold,reverse + hi StatusLineNC term=bold,underline + hi TabLine term=bold,underline + hi TabLineFill term=NONE + hi Terminal term=NONE + hi TabLineSel term=bold,reverse + hi Title term=NONE + hi VertSplit term=NONE + hi Visual term=reverse + hi VisualNOS term=NONE + hi WarningMsg term=standout + hi WildMenu term=bold + hi CursorIM term=NONE + hi ToolbarLine term=reverse + hi ToolbarButton term=bold,reverse + hi CurSearch term=reverse + hi CursorLineFold term=underline + hi CursorLineSign term=underline + hi Comment term=bold + hi Constant term=NONE + hi Error term=bold,reverse + hi Identifier term=NONE + hi Ignore term=NONE + hi PreProc term=NONE + hi Special term=NONE + hi Statement term=NONE + hi Todo term=bold,reverse + hi Type term=NONE + hi Underlined term=underline + unlet s:t_Co + finish +endif + +" Background: light +" Color: comment #ff0000 196 red +" Color: constant #ff00ff 201 magenta +" Color: identifier #0000ff 21 blue +" Color: statement #a52a2a 124 darkred +" Color: preproc #a020f0 129 darkmagenta +" Color: type #0000ff 21 blue +" Color: special #ff00ff 201 magenta +" Color: tag #006400 22 darkgreen +" Color: fg0 #000000 16 black +" Color: bg0 #ffffff 231 white +" Color: bg1 #a9a9a9 248 grey +" Color: status #a9a9a9 248 darkgrey +" Color: visual #ffff00 226 yellow +" Color: folded #d3d3d3 252 black +" Color: folded_fg #00008b 18 darkblue +" Color: cursorline #e5e5e5 254 black +" Color: pmenu #dadada 253 grey +" Color: wildmenu #ffff00 226 yellow +" Color: error #ff0000 196 red +" Color: linenr #a52a2a 124 darkred +" Color: colorcolumn #eeeeee 255 grey +" Color: slateblue #6a5acd 62 blue +" Color: darkcyan #008787 30 darkcyan +" Color: darkgreen #008700 28 darkgreen +" Color: darkyellow #878700 100 darkyellow +" Term colors: bg0 statement constant preproc identifier type special bg1 +" Term colors: comment statement constant preproc identifier type special fg0 +" Color: bgDiffA #5F875F 65 darkgreen +" Color: bgDiffC #5F87AF 67 blue +" Color: bgDiffD #AF5FAF 133 magenta +" Color: bgDiffT #C6C6C6 251 grey +" Color: fgDiffW #FFFFFF 231 white +" Color: fgDiffB #000000 16 black +" vim: et ts=2 sw=2 diff --git a/runtime/compiler/scdoc.vim b/runtime/compiler/scdoc.vim index 2f6edc6322..c37969f89c 100644 --- a/runtime/compiler/scdoc.vim +++ b/runtime/compiler/scdoc.vim @@ -1,7 +1,8 @@ " scdoc compiler for Vim " Compiler: scdoc -" Maintainer: Greg Anders <greg@gpanders.com> +" Maintainer: Gregory Anders <contact@gpanders.com> " Last Updated: 2019-10-24 +" Upstream: https://github.com/gpanders/vim-scdoc if exists('current_compiler') finish diff --git a/runtime/doc/api.txt b/runtime/doc/api.txt index 50fe60a0fc..7c669e3c9d 100644 --- a/runtime/doc/api.txt +++ b/runtime/doc/api.txt @@ -426,6 +426,14 @@ Two ways to create a floating window: To close it use |nvim_win_close()| or a command such as |:close|. +To check whether a window is floating, check whether the `relative` option in +its config is non-empty: > + + if vim.api.nvim_win_get_config(window_id).relative ~= '' then + -- window with this window_id is floating + end +> + Buffer text can be highlighted by typical mechanisms (syntax highlighting, |api-highlights|). The |hl-NormalFloat| group highlights normal text; 'winhighlight' can be used as usual to override groups locally. Floats inherit @@ -836,8 +844,11 @@ nvim_eval_statusline({str}, {*opts}) *nvim_eval_statusline()* Treated as single-width even if it isn't. • highlights: (boolean) Return highlight information. + • use_winbar: (boolean) Evaluate winbar instead of + statusline. • use_tabline: (boolean) Evaluate tabline instead of statusline. When |TRUE|, {winid} is ignored. + Mutually exclusive with {use_winbar}. Return: ~ Dictionary containing statusline information, with these @@ -1562,18 +1573,46 @@ nvim_set_current_win({window}) *nvim_set_current_win()* nvim_set_hl({ns_id}, {name}, {*val}) *nvim_set_hl()* Sets a highlight group. - Note: Unlike the `:highlight` command which can update a - highlight group, this function completely replaces the - definition. For example: `nvim_set_hl(0, 'Visual', {})` will - clear the highlight group 'Visual'. + Note: + Unlike the `:highlight` command which can update a + highlight group, this function completely replaces the + definition. For example: `nvim_set_hl(0, 'Visual', {})` + will clear the highlight group 'Visual'. + + Note: + The fg and bg keys also accept the string values `"fg"` or + `"bg"` which act as aliases to the corresponding + foreground and background values of the Normal group. If + the Normal group has not been defined, using these values + results in an error. Parameters: ~ {ns_id} Namespace id for this highlight |nvim_create_namespace()|. Use 0 to set a highlight group globally |:highlight|. {name} Highlight group name, e.g. "ErrorMsg" - {val} Highlight definition map, like |synIDattr()|. In - addition, the following keys are recognized: + {val} Highlight definition map, accepts the following + keys: + • fg (or foreground): color name or "#RRGGBB", + see note. + • bg (or background): color name or "#RRGGBB", + see note. + • sp (or special): color name or "#RRGGBB" + • blend: integer between 0 and 100 + • bold: boolean + • standout: boolean + • underline: boolean + • underlineline: boolean + • undercurl: boolean + • underdot: boolean + • underdash: boolean + • strikethrough: boolean + • italic: boolean + • reverse: boolean + • nocombine: boolean + • link: name of another highlight group to link + to, see |:hi-link|. Additionally, the following + keys are recognized: • default: Don't override existing definition |:hi-default| • ctermfg: Sets foreground of cterm color @@ -1581,8 +1620,9 @@ nvim_set_hl({ns_id}, {name}, {*val}) *nvim_set_hl()* • ctermbg: Sets background of cterm color |highlight-ctermbg| • cterm: cterm attribute map, like - |highlight-args|. Note: Attributes default to - those set for `gui` if not set. + |highlight-args|. If not set, cterm attributes + will match those from the attribute map + documented above. nvim_set_keymap({mode}, {lhs}, {rhs}, {*opts}) *nvim_set_keymap()* Sets a global |mapping| for the given mode. @@ -1607,13 +1647,15 @@ nvim_set_keymap({mode}, {lhs}, {rhs}, {*opts}) *nvim_set_keymap()* for |:map|. {lhs} Left-hand-side |{lhs}| of the mapping. {rhs} Right-hand-side |{rhs}| of the mapping. - {opts} Optional parameters map. Accepts all - |:map-arguments| as keys excluding |<buffer>| but - including |noremap| and "desc". "desc" can be used - to give a description to keymap. When called from - Lua, also accepts a "callback" key that takes a - Lua function to call when the mapping is executed. - Values are Booleans. Unknown key is an error. + {opts} Optional parameters map: keys are + |:map-arguments|, values are booleans (default + false). Accepts all |:map-arguments| as keys + excluding |<buffer>| but including |noremap| and + "desc". Unknown key is an error. "desc" can be + used to give a description to the mapping. When + called from Lua, also accepts a "callback" key + that takes a Lua function to call when the mapping + is executed. nvim_set_option({name}, {value}) *nvim_set_option()* Sets the global value of an option. @@ -1686,8 +1728,7 @@ Vimscript Functions *api-vimscript* nvim_call_dict_function({dict}, {fn}, {args}) Calls a VimL |Dictionary-function| with the given arguments. - On execution error: fails with VimL error, does not update - v:errmsg. + On execution error: fails with VimL error, updates v:errmsg. Parameters: ~ {dict} Dictionary, or String evaluating to a VimL |self| @@ -1701,8 +1742,7 @@ nvim_call_dict_function({dict}, {fn}, {args}) nvim_call_function({fn}, {args}) *nvim_call_function()* Calls a VimL function with the given arguments. - On execution error: fails with VimL error, does not update - v:errmsg. + On execution error: fails with VimL error, updates v:errmsg. Parameters: ~ {fn} Function to call @@ -1711,24 +1751,56 @@ nvim_call_function({fn}, {args}) *nvim_call_function()* Return: ~ Result of the function call -nvim_command({command}) *nvim_command()* - Executes an ex-command. +nvim_cmd({*cmd}, {*opts}) *nvim_cmd()* + Executes an Ex command. - On execution error: fails with VimL error, does not update - v:errmsg. + Unlike |nvim_command()| this command takes a structured + Dictionary instead of a String. This allows for easier + construction and manipulation of an Ex command. This also + allows for things such as having spaces inside a command + argument, expanding filenames in a command that otherwise + doesn't expand filenames, etc. + + On execution error: fails with VimL error, updates v:errmsg. Parameters: ~ - {command} Ex-command string + {cmd} Command to execute. Must be a Dictionary that can + contain the same values as the return value of + |nvim_parse_cmd()| except "addr", "nargs" and + "nextcmd" which are ignored if provided. All + values except for "cmd" are optional. + {opts} Optional parameters. + • output: (boolean, default false) Whether to + return command output. + + Return: ~ + Command output (non-error, non-shell |:!|) if `output` is + true, else empty string. See also: ~ |nvim_exec()| + |nvim_command()| + +nvim_command({command}) *nvim_command()* + Executes an Ex command. + + On execution error: fails with VimL error, updates v:errmsg. + + Prefer using |nvim_cmd()| or |nvim_exec()| over this. To + evaluate multiple lines of Vim script or an Ex command + directly, use |nvim_exec()|. To construct an Ex command using + a structured format and then execute it, use |nvim_cmd()|. To + modify an Ex command before evaluating it, use + |nvim_parse_cmd()| in conjunction with |nvim_cmd()|. + + Parameters: ~ + {command} Ex command string nvim_eval({expr}) *nvim_eval()* Evaluates a VimL |expression|. Dictionaries and Lists are recursively expanded. - On execution error: fails with VimL error, does not update - v:errmsg. + On execution error: fails with VimL error, updates v:errmsg. Parameters: ~ {expr} VimL expression string @@ -1737,14 +1809,13 @@ nvim_eval({expr}) *nvim_eval()* Evaluation result or expanded object nvim_exec({src}, {output}) *nvim_exec()* - Executes Vimscript (multiline block of Ex-commands), like + Executes Vimscript (multiline block of Ex commands), like anonymous |:source|. Unlike |nvim_command()| this function supports heredocs, script-scope (s:), etc. - On execution error: fails with VimL error, does not update - v:errmsg. + On execution error: fails with VimL error, updates v:errmsg. Parameters: ~ {src} Vimscript code @@ -1758,6 +1829,7 @@ nvim_exec({src}, {output}) *nvim_exec()* See also: ~ |execute()| |nvim_command()| + |nvim_cmd()| nvim_parse_cmd({str}, {opts}) *nvim_parse_cmd()* Parse command line. @@ -2197,7 +2269,7 @@ nvim_buf_get_lines({buffer}, {start}, {end}, {strict_indexing}) Parameters: ~ {buffer} Buffer handle, or 0 for current buffer {start} First line index - {end} Last line index (exclusive) + {end} Last line index, exclusive {strict_indexing} Whether out-of-bounds should be an error. @@ -2268,16 +2340,18 @@ nvim_buf_get_text({buffer}, {start_row}, {start_col}, {end_row}, {end_col}, This differs from |nvim_buf_get_lines()| in that it allows retrieving only portions of a line. - Indexing is zero-based. Column indices are end-exclusive. + Indexing is zero-based. Row indices are end-inclusive, and + column indices are end-exclusive. Prefer |nvim_buf_get_lines()| when retrieving entire lines. Parameters: ~ {buffer} Buffer handle, or 0 for current buffer {start_row} First line index - {start_col} Starting byte offset of first line - {end_row} Last line index - {end_col} Ending byte offset of last line (exclusive) + {start_col} Starting column (byte offset) on first line + {end_row} Last line index, inclusive + {end_col} Ending column (byte offset) on last line, + exclusive {opts} Optional parameters. Currently unused. Return: ~ @@ -2357,7 +2431,7 @@ nvim_buf_set_lines({buffer}, {start}, {end}, {strict_indexing}, {replacement}) Parameters: ~ {buffer} Buffer handle, or 0 for current buffer {start} First line index - {end} Last line index (exclusive) + {end} Last line index, exclusive {strict_indexing} Whether out-of-bounds should be an error. {replacement} Array of lines to use as replacement @@ -2407,25 +2481,27 @@ nvim_buf_set_text({buffer}, {start_row}, {start_col}, {end_row}, {end_col}, {replacement}) Sets (replaces) a range in the buffer - This is recommended over nvim_buf_set_lines when only + This is recommended over |nvim_buf_set_lines()| when only modifying parts of a line, as extmarks will be preserved on non-modified parts of the touched lines. - Indexing is zero-based and end-exclusive. + Indexing is zero-based. Row indices are end-inclusive, and + column indices are end-exclusive. - To insert text at a given index, set `start` and `end` ranges - to the same index. To delete a range, set `replacement` to an - array containing an empty string, or simply an empty array. + To insert text at a given `(row, column)` location, use + `start_row = end_row = row` and `start_col = end_col = col`. + To delete the text in a range, use `replacement = {}`. - Prefer nvim_buf_set_lines when adding or deleting entire lines - only. + Prefer |nvim_buf_set_lines()| if you are only adding or + deleting entire lines. Parameters: ~ {buffer} Buffer handle, or 0 for current buffer {start_row} First line index - {start_col} First column - {end_row} Last line index - {end_col} Last column + {start_col} Starting column (byte offset) on first line + {end_row} Last line index, inclusive + {end_col} Ending column (byte offset) on last line, + exclusive {replacement} Array of lines to use as replacement nvim_buf_set_var({buffer}, {name}, {value}) *nvim_buf_set_var()* @@ -3393,6 +3469,8 @@ nvim_create_autocmd({event}, {*opts}) *nvim_create_autocmd()* • buf: (number) the expanded value of |<abuf>| • file: (string) the expanded value of |<afile>| + • data: (any) arbitrary data passed to + |nvim_exec_autocmds()| • command (string) optional: Vim command to execute on event. Cannot be used with @@ -3468,6 +3546,9 @@ nvim_exec_autocmds({event}, {*opts}) *nvim_exec_autocmds()* • modeline (bool) optional: defaults to true. Process the modeline after the autocommands |<nomodeline>|. + • data (any): arbitrary data to send to the + autocommand callback. See + |nvim_create_autocmd()| for details. See also: ~ |:doautocmd| diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index b9954dc99c..d197a2c62c 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -2800,7 +2800,7 @@ getcmdcompltype() *getcmdcompltype()* Return the type of the current command-line completion. Only works when the command line is being edited, thus requires use of |c_CTRL-\_e| or |c_CTRL-R_=|. - See |command-completion| for the return string. + See |:command-completion| for the return string. Also see |getcmdtype()|, |setcmdpos()| and |getcmdline()|. Returns an empty string when completion is not defined. @@ -4976,10 +4976,9 @@ matchfuzzy({list}, {str} [, {dict}]) *matchfuzzy()* The optional {dict} argument always supports the following items: - matchseq When this item is present and {str} contains - multiple words separated by white space, then - returns only matches that contain the words in - the given sequence. + matchseq When this item is present return only matches + that contain the characters in {str} in the + given sequence. If {list} is a list of dictionaries, then the optional {dict} argument supports the following additional items: @@ -7466,14 +7465,17 @@ stdpath({what}) *stdpath()* *E6100* directories. {what} Type Description ~ - cache String Cache directory. Arbitrary temporary + cache String Cache directory: arbitrary temporary storage for plugins, etc. - config String User configuration directory. The - |init.vim| is stored here. - config_dirs List Additional configuration directories. + config String User configuration directory. |init.vim| + is stored here. + config_dirs List Other configuration directories. data String User data directory. The |shada-file| is stored here. - data_dirs List Additional data directories. + data_dirs List Other data directories. + log String Logs directory (for use by plugins too). + state String Session state directory: storage for file + drafts, undo history, shada, etc. Example: > :echo stdpath("config") diff --git a/runtime/doc/deprecated.txt b/runtime/doc/deprecated.txt index 13644cf208..e328bd28b5 100644 --- a/runtime/doc/deprecated.txt +++ b/runtime/doc/deprecated.txt @@ -106,11 +106,13 @@ internally and are no longer exposed as part of the API. Instead, use *vim.lsp.diagnostic.set_underline()* *vim.lsp.diagnostic.set_virtual_text()* -LSP Utility Functions ~ +LSP Functions ~ *vim.lsp.util.diagnostics_to_items()* Use |vim.diagnostic.toqflist()| instead. *vim.lsp.util.set_qflist()* Use |setqflist()| instead. *vim.lsp.util.set_loclist()* Use |setloclist()| instead. +*vim.lsp.buf_get_clients()* Use |vim.lsp.get_active_clients()| with + {buffer = bufnr} instead. Lua ~ *vim.register_keystroke_callback()* Use |vim.on_key()| instead. diff --git a/runtime/doc/dev_style.txt b/runtime/doc/dev_style.txt index 82f279e781..6f0b862d3f 100644 --- a/runtime/doc/dev_style.txt +++ b/runtime/doc/dev_style.txt @@ -48,22 +48,6 @@ The format of the symbol name should be `NVIM_<DIRECTORY>_<FILE>_H`. < -Names and Order of Includes ~ - -Use standard order for readability and to avoid hidden dependencies: C -library, other libraries' `.h`, your project's `.h`. - - In foo.c order your includes as follows: - - 1. C system files. - 2. Other libraries' `.h` files. - 3. Your project's `.h` files. - - Exception: sometimes, system-specific code needs conditional includes. - Such code can put conditional includes after other includes. Of course, - keep your system-specific code small and localized. - - Constants ~ Do not use macros to define constants in headers. @@ -787,15 +771,6 @@ getting used to, but it is important that all project contributors follow the style rules so that they can all read and understand everyone's code easily. -Line Length ~ - -Each line of text in your code should be at most 100 characters long. - -Exception: if a comment line contains an example command or a literal URL -longer than 100 characters, that line may be longer than 100 characters for ease -of cut and paste. - - Non-ASCII Characters ~ Non-ASCII characters should be rare, and must use UTF-8 formatting. diff --git a/runtime/doc/diagnostic.txt b/runtime/doc/diagnostic.txt index 32936a7ee6..2446506dec 100644 --- a/runtime/doc/diagnostic.txt +++ b/runtime/doc/diagnostic.txt @@ -336,8 +336,8 @@ config({opts}, {namespace}) *vim.diagnostic.config()* that returns any of the above. Parameters: ~ - {opts} table|nil When omitted or "nil", retrieve the - current configuration. Otherwise, a + {opts} (table|nil) When omitted or "nil", retrieve + the current configuration. Otherwise, a configuration table with the following keys: • underline: (default true) Use underline for diagnostics. Options: @@ -401,7 +401,7 @@ config({opts}, {namespace}) *vim.diagnostic.config()* displayed before lower severities (e.g. ERROR is displayed before WARN). Options: • reverse: (boolean) Reverse sort order - {namespace} number|nil Update the options for the given + {namespace} (number|nil) Update the options for the given namespace. When omitted, update the global diagnostic options. @@ -409,28 +409,28 @@ disable({bufnr}, {namespace}) *vim.diagnostic.disable()* Disable diagnostics in the given buffer. Parameters: ~ - {bufnr} number|nil Buffer number, or 0 for current + {bufnr} (number|nil) Buffer number, or 0 for current buffer. When omitted, disable diagnostics in all buffers. - {namespace} number|nil Only disable diagnostics for the + {namespace} (number|nil) Only disable diagnostics for the given namespace. enable({bufnr}, {namespace}) *vim.diagnostic.enable()* Enable diagnostics in the given buffer. Parameters: ~ - {bufnr} number|nil Buffer number, or 0 for current + {bufnr} (number|nil) Buffer number, or 0 for current buffer. When omitted, enable diagnostics in all buffers. - {namespace} number|nil Only enable diagnostics for the + {namespace} (number|nil) Only enable diagnostics for the given namespace. fromqflist({list}) *vim.diagnostic.fromqflist()* Convert a list of quickfix items to a list of diagnostics. Parameters: ~ - {list} table A list of quickfix items from |getqflist()| - or |getloclist()|. + {list} (table) A list of quickfix items from + |getqflist()| or |getloclist()|. Return: ~ array of diagnostics |diagnostic-structure| @@ -439,9 +439,10 @@ get({bufnr}, {opts}) *vim.diagnostic.get()* Get current diagnostics. Parameters: ~ - {bufnr} number|nil Buffer number to get diagnostics from. - Use 0 for current buffer or nil for all buffers. - {opts} table|nil A table with the following keys: + {bufnr} (number|nil) Buffer number to get diagnostics + from. Use 0 for current buffer or nil for all + buffers. + {opts} (table|nil) A table with the following keys: • namespace: (number) Limit diagnostics to the given namespace. • lnum: (number) Limit diagnostics to the given @@ -449,67 +450,68 @@ get({bufnr}, {opts}) *vim.diagnostic.get()* • severity: See |diagnostic-severity|. Return: ~ - table A list of diagnostic items |diagnostic-structure|. + (table) A list of diagnostic items |diagnostic-structure|. get_namespace({namespace}) *vim.diagnostic.get_namespace()* Get namespace metadata. Parameters: ~ - {namespace} number Diagnostic namespace + {namespace} (number) Diagnostic namespace Return: ~ - table Namespace metadata + (table) Namespace metadata get_namespaces() *vim.diagnostic.get_namespaces()* Get current diagnostic namespaces. Return: ~ - table A list of active diagnostic namespaces + (table) A list of active diagnostic namespaces |vim.diagnostic|. get_next({opts}) *vim.diagnostic.get_next()* Get the next diagnostic closest to the cursor position. Parameters: ~ - {opts} table See |vim.diagnostic.goto_next()| + {opts} (table) See |vim.diagnostic.goto_next()| Return: ~ - table Next diagnostic + (table) Next diagnostic get_next_pos({opts}) *vim.diagnostic.get_next_pos()* Return the position of the next diagnostic in the current buffer. Parameters: ~ - {opts} table See |vim.diagnostic.goto_next()| + {opts} (table) See |vim.diagnostic.goto_next()| Return: ~ - table Next diagnostic position as a (row, col) tuple. + (table) Next diagnostic position as a (row, col) tuple. get_prev({opts}) *vim.diagnostic.get_prev()* Get the previous diagnostic closest to the cursor position. Parameters: ~ - {opts} table See |vim.diagnostic.goto_next()| + {opts} (table) See |vim.diagnostic.goto_next()| Return: ~ - table Previous diagnostic + (table) Previous diagnostic get_prev_pos({opts}) *vim.diagnostic.get_prev_pos()* Return the position of the previous diagnostic in the current buffer. Parameters: ~ - {opts} table See |vim.diagnostic.goto_next()| + {opts} (table) See |vim.diagnostic.goto_next()| Return: ~ - table Previous diagnostic position as a (row, col) tuple. + (table) Previous diagnostic position as a (row, col) + tuple. goto_next({opts}) *vim.diagnostic.goto_next()* Move to the next diagnostic. Parameters: ~ - {opts} table|nil Configuration table with the following + {opts} (table|nil) Configuration table with the following keys: • namespace: (number) Only consider diagnostics from the given namespace. @@ -533,7 +535,7 @@ goto_prev({opts}) *vim.diagnostic.goto_prev()* Move to the previous diagnostic in the current buffer. Parameters: ~ - {opts} table See |vim.diagnostic.goto_next()| + {opts} (table) See |vim.diagnostic.goto_next()| hide({namespace}, {bufnr}) *vim.diagnostic.hide()* Hide currently displayed diagnostics. @@ -547,10 +549,10 @@ hide({namespace}, {bufnr}) *vim.diagnostic.hide()* |vim.diagnostic.disable()|. Parameters: ~ - {namespace} number|nil Diagnostic namespace. When + {namespace} (number|nil) Diagnostic namespace. When omitted, hide diagnostics from all namespaces. - {bufnr} number|nil Buffer number, or 0 for current + {bufnr} (number|nil) Buffer number, or 0 for current buffer. When omitted, hide diagnostics in all buffers. @@ -573,16 +575,16 @@ match({str}, {pat}, {groups}, {severity_map}, {defaults}) < Parameters: ~ - {str} string String to parse diagnostics from. - {pat} string Lua pattern with capture groups. - {groups} table List of fields in a + {str} (string) String to parse diagnostics from. + {pat} (string) Lua pattern with capture groups. + {groups} (table) List of fields in a |diagnostic-structure| to associate with captures from {pat}. - {severity_map} table A table mapping the severity field + {severity_map} (table) A table mapping the severity field from {groups} with an item from |vim.diagnostic.severity|. - {defaults} table|nil Table of default values for any - fields not listed in {groups}. When + {defaults} (table|nil) Table of default values for + any fields not listed in {groups}. When omitted, numeric values default to 0 and "severity" defaults to ERROR. @@ -594,7 +596,7 @@ open_float({opts}, {...}) *vim.diagnostic.open_float()* Show diagnostics in a floating window. Parameters: ~ - {opts} table|nil Configuration table with the same keys + {opts} (table|nil) Configuration table with the same keys as |vim.lsp.util.open_floating_preview()| in addition to the following: • bufnr: (number) Buffer number to show @@ -665,10 +667,10 @@ reset({namespace}, {bufnr}) *vim.diagnostic.reset()* |vim.diagnostic.hide()|. Parameters: ~ - {namespace} number|nil Diagnostic namespace. When + {namespace} (number|nil) Diagnostic namespace. When omitted, remove diagnostics from all namespaces. - {bufnr} number|nil Remove diagnostics for the given + {bufnr} (number|nil) Remove diagnostics for the given buffer. When omitted, diagnostics are removed for all buffers. @@ -676,18 +678,18 @@ set({namespace}, {bufnr}, {diagnostics}, {opts}) *vim.diagnostic.set()* Set diagnostics for the given namespace and buffer. Parameters: ~ - {namespace} number The diagnostic namespace - {bufnr} number Buffer number - {diagnostics} table A list of diagnostic items + {namespace} (number) The diagnostic namespace + {bufnr} (number) Buffer number + {diagnostics} (table) A list of diagnostic items |diagnostic-structure| - {opts} table|nil Display options to pass to + {opts} (table|nil) Display options to pass to |vim.diagnostic.show()| setloclist({opts}) *vim.diagnostic.setloclist()* Add buffer diagnostics to the location list. Parameters: ~ - {opts} table|nil Configuration table with the following + {opts} (table|nil) Configuration table with the following keys: • namespace: (number) Only add diagnostics from the given namespace. @@ -703,7 +705,7 @@ setqflist({opts}) *vim.diagnostic.setqflist()* Add all diagnostics to the quickfix list. Parameters: ~ - {opts} table|nil Configuration table with the following + {opts} (table|nil) Configuration table with the following keys: • namespace: (number) Only add diagnostics from the given namespace. @@ -718,20 +720,20 @@ show({namespace}, {bufnr}, {diagnostics}, {opts}) Display diagnostics for the given namespace and buffer. Parameters: ~ - {namespace} number|nil Diagnostic namespace. When + {namespace} (number|nil) Diagnostic namespace. When omitted, show diagnostics from all namespaces. - {bufnr} number|nil Buffer number, or 0 for current - buffer. When omitted, show diagnostics in - all buffers. - {diagnostics} table|nil The diagnostics to display. When - omitted, use the saved diagnostics for the - given namespace and buffer. This can be + {bufnr} (number|nil) Buffer number, or 0 for + current buffer. When omitted, show + diagnostics in all buffers. + {diagnostics} (table|nil) The diagnostics to display. + When omitted, use the saved diagnostics for + the given namespace and buffer. This can be used to display a list of diagnostics without saving them or to display only a subset of diagnostics. May not be used when {namespace} or {bufnr} is nil. - {opts} table|nil Display options. See + {opts} (table|nil) Display options. See |vim.diagnostic.config()|. toqflist({diagnostics}) *vim.diagnostic.toqflist()* @@ -739,7 +741,7 @@ toqflist({diagnostics}) *vim.diagnostic.toqflist()* can be passed to |setqflist()| or |setloclist()|. Parameters: ~ - {diagnostics} table List of diagnostics + {diagnostics} (table) List of diagnostics |diagnostic-structure|. Return: ~ diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 63a5b69070..d1686741b4 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -3137,10 +3137,13 @@ text... :for {var} in {object} *:for* *E690* *E732* :endfo[r] *:endfo* *:endfor* Repeat the commands between `:for` and `:endfor` for - each item in {object}. {object} can be a |List| or - a |Blob|. Variable {var} is set to the value of each - item. When an error is detected for a command inside - the loop, execution continues after the `endfor`. + each item in {object}. {object} can be a |List|, + a |Blob| or a |String|. + + Variable {var} is set to the value of each item. + + When an error is detected for a command inside the + loop, execution continues after the `endfor`. Changing {object} inside the loop affects what items are used. Make a copy if this is unwanted: > :for item in copy(mylist) diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt index 5c36eaf8e5..58d49b5843 100644 --- a/runtime/doc/index.txt +++ b/runtime/doc/index.txt @@ -1501,8 +1501,9 @@ tag command action ~ |:recover| :rec[over] recover a file from a swap file |:redo| :red[o] redo one undone change |:redir| :redi[r] redirect messages to a file or register -|:redraw| :redr[aw] force a redraw of the display -|:redrawstatus| :redraws[tatus] force a redraw of the status line(s) +|:redraw| :redr[aw] force a redraw of the display +|:redrawstatus| :redraws[tatus] force a redraw of the status line(s) and + window bar(s) |:redrawtabline| :redrawt[abline] force a redraw of the tabline |:registers| :reg[isters] display the contents of registers |:resize| :res[ize] change current window height diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt index c1726bcb23..af3189a393 100644 --- a/runtime/doc/lsp.txt +++ b/runtime/doc/lsp.txt @@ -461,6 +461,39 @@ LspSignatureActiveParameter ============================================================================== EVENTS *lsp-events* + *LspAttach* +After an LSP client attaches to a buffer. The |autocmd-pattern| is the +name of the buffer. When used from Lua, the client ID is passed to the +callback in the "data" table. Example: > + + vim.api.nvim_create_autocmd("LspAttach", { + callback = function(args) + local bufnr = args.buf + local client = vim.lsp.get_client_by_id(args.data.client_id) + if client.server_capabilities.completionProvider then + vim.bo[bufnr].omnifunc = "v:lua.vim.lsp.omnifunc" + end + if client.server_capabilities.definitionProvider then + vim.bo[bufnr].tagfunc = "v:lua.vim.lsp.tagfunc" + end + end, + }) +< + *LspDetach* +Just before an LSP client detaches from a buffer. The |autocmd-pattern| is the +name of the buffer. When used from Lua, the client ID is passed to the +callback in the "data" table. Example: > + + vim.api.nvim_create_autocmd("LspDetach", { + callback = function(args) + local client = vim.lsp.get_client_by_id(args.data.client_id) + -- Do something with the client + vim.cmd("setlocal tagfunc< omnifunc<") + end, + }) +< +In addition, the following |User| |autocommands| are provided: + LspProgressUpdate *LspProgressUpdate* Upon receipt of a progress notification from the server. See |vim.lsp.util.get_progress_messages()|. @@ -495,16 +528,8 @@ buf_detach_client({bufnr}, {client_id}) *vim.lsp.buf_detach_client()* notification. Parameters: ~ - {bufnr} number Buffer handle, or 0 for current - {client_id} number Client id - -buf_get_clients({bufnr}) *vim.lsp.buf_get_clients()* - Gets a map of client_id:client pairs for the given buffer, - where each value is a |vim.lsp.client| object. - - Parameters: ~ - {bufnr} (optional, number): Buffer handle, or 0 for - current + {bufnr} (number) Buffer handle, or 0 for current + {client_id} (number) Client id buf_is_attached({bufnr}, {client_id}) *vim.lsp.buf_is_attached()* Checks if a buffer is attached for a particular client. @@ -668,11 +693,11 @@ for_each_buffer_client({bufnr}, {fn}) Invokes a function for each LSP client attached to a buffer. Parameters: ~ - {bufnr} number Buffer number - {fn} function Function to run on each client attached - to buffer {bufnr}. The function takes the client, - client ID, and buffer number as arguments. - Example: > + {bufnr} (number) Buffer number + {fn} (function) Function to run on each client + attached to buffer {bufnr}. The function takes + the client, client ID, and buffer number as + arguments. Example: > vim.lsp.for_each_buffer_client(0, function(client, client_id, bufnr) print(vim.inspect(client)) @@ -690,24 +715,35 @@ formatexpr({opts}) *vim.lsp.formatexpr()* 'v:lua.vim.lsp.formatexpr(#{timeout_ms:250})')`. Parameters: ~ - {opts} table options for customizing the formatting + {opts} (table) options for customizing the formatting expression which takes the following optional keys: • timeout_ms (default 500ms). The timeout period for the formatting request. -get_active_clients() *vim.lsp.get_active_clients()* - Gets all active clients. +get_active_clients({filter}) *vim.lsp.get_active_clients()* + Get active clients. + + Parameters: ~ + {filter} (table|nil) A table with key-value pairs used to + filter the returned clients. The available keys + are: + • id (number): Only return clients with the + given id + • bufnr (number): Only return clients attached + to this buffer + • name (string): Only return clients with the + given name Return: ~ - Table of |vim.lsp.client| objects + (table) List of |vim.lsp.client| objects *vim.lsp.get_buffers_by_client_id()* get_buffers_by_client_id({client_id}) Returns list of buffers attached to client_id. Parameters: ~ - {client_id} number client id + {client_id} (number) client id Return: ~ list of buffer ids @@ -717,7 +753,7 @@ get_client_by_id({client_id}) *vim.lsp.get_client_by_id()* client may not yet be fully initialized. Parameters: ~ - {client_id} number client id + {client_id} (number) client id Return: ~ |vim.lsp.client| object, or nil @@ -820,7 +856,7 @@ start_client({config}) *vim.lsp.start_client()* language server if requested via `workspace/configuration`. Keys are case-sensitive. - {commands} table Table that maps string of + {commands} (table) Table that maps string of clientside commands to user-defined functions. Commands passed to start_client take precedence over the @@ -908,10 +944,10 @@ start_client({config}) *vim.lsp.start_client()* kill -15. If set to false, nvim exits immediately after sending the 'shutdown' request to the server. - {root_dir} string Directory where the LSP server - will base its workspaceFolders, - rootUri, and rootPath on - initialization. + {root_dir} (string) Directory where the LSP + server will base its + workspaceFolders, rootUri, and + rootPath on initialization. Return: ~ Client id. |vim.lsp.get_client_by_id()| Note: client may @@ -935,7 +971,7 @@ stop_client({client_id}, {force}) *vim.lsp.stop_client()* Parameters: ~ {client_id} client id or |vim.lsp.client| object, or list thereof - {force} boolean (optional) shutdown forcefully + {force} (boolean) (optional) shutdown forcefully tagfunc({...}) *vim.lsp.tagfunc()* Provides an interface between the built-in client and @@ -980,15 +1016,15 @@ code_action({options}) *vim.lsp.buf.code_action()* position. Parameters: ~ - {options} table|nil Optional table which holds the + {options} (table|nil) Optional table which holds the following optional fields: • context (table|nil): Corresponds to `CodeActionContext` of the LSP specification: • diagnostics (table|nil): LSP`Diagnostic[]` . Inferred from the current position if not provided. - • only (string|nil): LSP `CodeActionKind` - used to filter the code actions. Most - language servers support values like - `refactor` or `quickfix`. + • only (table|nil): List of LSP + `CodeActionKind`s used to filter the code + actions. Most language servers support + values like `refactor` or `quickfix`. • filter (function|nil): Predicate function taking an `CodeAction` and returning a @@ -1015,15 +1051,25 @@ completion({context}) *vim.lsp.buf.completion()* See also: ~ |vim.lsp.protocol.constants.CompletionTriggerKind| -declaration() *vim.lsp.buf.declaration()* +declaration({options}) *vim.lsp.buf.declaration()* Jumps to the declaration of the symbol under the cursor. Note: Many servers do not implement this method. Generally, see |vim.lsp.buf.definition()| instead. -definition() *vim.lsp.buf.definition()* + Parameters: ~ + {options} (table|nil) additional options + • reuse_win: (boolean) Jump to existing window + if buffer is already open. + +definition({options}) *vim.lsp.buf.definition()* Jumps to the definition of the symbol under the cursor. + Parameters: ~ + {options} (table|nil) additional options + • reuse_win: (boolean) Jump to existing window + if buffer is already open. + document_highlight() *vim.lsp.buf.document_highlight()* Send request to the server to resolve document highlights for the current text document position. This request can be @@ -1048,7 +1094,7 @@ execute_command({command_params}) *vim.lsp.buf.execute_command()* Executes an LSP server command. Parameters: ~ - {command_params} table A valid `ExecuteCommandParams` + {command_params} (table) A valid `ExecuteCommandParams` object See also: ~ @@ -1146,7 +1192,7 @@ formatting_sync({options}, {timeout_ms}) < Parameters: ~ - {options} table|nil with valid `FormattingOptions` + {options} (table|nil) with valid `FormattingOptions` entries {timeout_ms} (number) Request timeout @@ -1180,13 +1226,13 @@ range_code_action({context}, {start_pos}, {end_pos}) Performs |vim.lsp.buf.code_action()| for a given range. Parameters: ~ - {context} table|nil `CodeActionContext` of the LSP specification: + {context} (table|nil) `CodeActionContext` of the LSP specification: • diagnostics: (table|nil) LSP`Diagnostic[]` . Inferred from the current position if not provided. - • only: (string|nil) LSP `CodeActionKind` - used to filter the code actions. Most - language servers support values like - `refactor` or `quickfix`. + • only: (table|nil) List of LSP + `CodeActionKind`s used to filter the code + actions. Most language servers support + values like `refactor` or `quickfix`. {start_pos} ({number, number}, optional) mark-indexed position. Defaults to the start of the last visual selection. @@ -1227,10 +1273,10 @@ rename({new_name}, {options}) *vim.lsp.buf.rename()* Renames all references to the symbol under the cursor. Parameters: ~ - {new_name} string|nil If not provided, the user will be + {new_name} (string|nil) If not provided, the user will be prompted for a new name using |vim.ui.input()|. - {options} table|nil additional options + {options} (table|nil) additional options • filter (function|nil): Predicate to filter clients used for rename. Receives the attached clients as argument and must return @@ -1250,10 +1296,15 @@ signature_help() *vim.lsp.buf.signature_help()* Displays signature information about the symbol under the cursor in a floating window. -type_definition() *vim.lsp.buf.type_definition()* +type_definition({options}) *vim.lsp.buf.type_definition()* Jumps to the definition of the type of the symbol under the cursor. + Parameters: ~ + {options} (table|nil) additional options + • reuse_win: (boolean) Jump to existing window + if buffer is already open. + workspace_symbol({query}) *vim.lsp.buf.workspace_symbol()* Lists all symbols in the current workspace in the quickfix window. @@ -1275,7 +1326,7 @@ get_namespace({client_id}) *vim.lsp.diagnostic.get_namespace()* |vim.diagnostic|. Parameters: ~ - {client_id} number The id of the LSP client + {client_id} (number) The id of the LSP client *vim.lsp.diagnostic.on_publish_diagnostics()* on_publish_diagnostics({_}, {result}, {ctx}, {config}) @@ -1305,7 +1356,7 @@ on_publish_diagnostics({_}, {result}, {ctx}, {config}) < Parameters: ~ - {config} table Configuration table (see + {config} (table) Configuration table (see |vim.diagnostic.config()|). @@ -1316,20 +1367,20 @@ display({lenses}, {bufnr}, {client_id}) *vim.lsp.codelens.display()* Display the lenses using virtual text Parameters: ~ - {lenses} table of lenses to display (`CodeLens[] | + {lenses} (table) of lenses to display (`CodeLens[] | null`) - {bufnr} number - {client_id} number + {bufnr} (number) + {client_id} (number) get({bufnr}) *vim.lsp.codelens.get()* Return all lenses for the given buffer Parameters: ~ - {bufnr} number Buffer number. 0 can be used for the + {bufnr} (number) Buffer number. 0 can be used for the current buffer. Return: ~ - table (`CodeLens[]`) + (table) (`CodeLens[]`) *vim.lsp.codelens.on_codelens()* on_codelens({err}, {result}, {ctx}, {_}) @@ -1351,10 +1402,10 @@ save({lenses}, {bufnr}, {client_id}) *vim.lsp.codelens.save()* Store lenses for a specific buffer and client Parameters: ~ - {lenses} table of lenses to store (`CodeLens[] | + {lenses} (table) of lenses to store (`CodeLens[] | null`) - {bufnr} number - {client_id} number + {bufnr} (number) + {client_id} (number) ============================================================================== @@ -1372,7 +1423,7 @@ hover({_}, {result}, {ctx}, {config}) *vim.lsp.handlers.hover()* < Parameters: ~ - {config} table Configuration table. + {config} (table) Configuration table. • border: (default=nil) • Add borders to the floating window • See |nvim_open_win()| @@ -1392,7 +1443,7 @@ signature_help({_}, {result}, {ctx}, {config}) < Parameters: ~ - {config} table Configuration table. + {config} (table) Configuration table. • border: (default=nil) • Add borders to the floating window • See |vim.api.nvim_open_win()| @@ -1420,9 +1471,9 @@ apply_text_edits({text_edits}, {bufnr}, {offset_encoding}) Applies a list of text edits to a buffer. Parameters: ~ - {text_edits} table list of `TextEdit` objects - {bufnr} number Buffer id - {offset_encoding} string utf-8|utf-16|utf-32 + {text_edits} (table) list of `TextEdit` objects + {bufnr} (number) Buffer id + {offset_encoding} (string) utf-8|utf-16|utf-32 See also: ~ https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textEdit @@ -1432,24 +1483,24 @@ apply_workspace_edit({workspace_edit}, {offset_encoding}) Applies a `WorkspaceEdit`. Parameters: ~ - {workspace_edit} table `WorkspaceEdit` - {offset_encoding} string utf-8|utf-16|utf-32 (required) + {workspace_edit} (table) `WorkspaceEdit` + {offset_encoding} (string) utf-8|utf-16|utf-32 (required) buf_clear_references({bufnr}) *vim.lsp.util.buf_clear_references()* Removes document highlights from a buffer. Parameters: ~ - {bufnr} number Buffer id + {bufnr} (number) Buffer id *vim.lsp.util.buf_highlight_references()* buf_highlight_references({bufnr}, {references}, {offset_encoding}) Shows a list of document highlights for a certain buffer. Parameters: ~ - {bufnr} number Buffer id - {references} table List of `DocumentHighlight` + {bufnr} (number) Buffer id + {references} (table) List of `DocumentHighlight` objects to highlight - {offset_encoding} string One of "utf-8", "utf-16", + {offset_encoding} (string) One of "utf-8", "utf-16", "utf-32". See also: ~ @@ -1464,9 +1515,9 @@ character_offset({buf}, {row}, {col}, {offset_encoding}) {buf} buffer id (0 for current) {row} 0-indexed line {col} 0-indexed byte offset in line - {offset_encoding} string utf-8|utf-16|utf-32|nil defaults - to `offset_encoding` of first client of - `buf` + {offset_encoding} (string) utf-8|utf-16|utf-32|nil + defaults to `offset_encoding` of first + client of `buf` Return: ~ (number, number) `offset_encoding` index of the character @@ -1539,12 +1590,14 @@ get_effective_tabstop({bufnr}) *vim.lsp.util.get_effective_tabstop()* |shiftwidth| *vim.lsp.util.jump_to_location()* -jump_to_location({location}, {offset_encoding}) +jump_to_location({location}, {offset_encoding}, {reuse_win}) Jumps to a location. Parameters: ~ - {location} table (`Location`|`LocationLink`) - {offset_encoding} string utf-8|utf-16|utf-32 (required) + {location} (table) (`Location`|`LocationLink`) + {offset_encoding} (string) utf-8|utf-16|utf-32 (required) + {reuse_win} (boolean) Jump to existing window if + buffer is already opened. Return: ~ `true` if the jump succeeded @@ -1559,9 +1612,9 @@ locations_to_items({locations}, {offset_encoding}) |setqflist()| or |setloclist()|. Parameters: ~ - {locations} table list of `Location`s or + {locations} (table) list of `Location`s or `LocationLink`s - {offset_encoding} string offset_encoding for locations + {offset_encoding} (string) offset_encoding for locations utf-8|utf-16|utf-32 Return: ~ @@ -1606,7 +1659,7 @@ make_formatting_params({options}) buffer and cursor position. Parameters: ~ - {options} table|nil with valid `FormattingOptions` + {options} (table|nil) with valid `FormattingOptions` entries Return: ~ @@ -1629,9 +1682,9 @@ make_given_range_params({start_pos}, {end_pos}, {bufnr}, {offset_encoding}) end of the last visual selection. {bufnr} (optional, number): buffer handle or 0 for current, defaults to current - {offset_encoding} string utf-8|utf-16|utf-32|nil defaults - to `offset_encoding` of first client of - `bufnr` + {offset_encoding} (string) utf-8|utf-16|utf-32|nil + defaults to `offset_encoding` of first + client of `bufnr` Return: ~ { textDocument = { uri = `current_file_uri` }, range = { @@ -1645,9 +1698,9 @@ make_position_params({window}, {offset_encoding}) Parameters: ~ {window} (optional, number): window handle or 0 for current, defaults to current - {offset_encoding} string utf-8|utf-16|utf-32|nil defaults - to `offset_encoding` of first client of - buffer of `window` + {offset_encoding} (string) utf-8|utf-16|utf-32|nil + defaults to `offset_encoding` of first + client of buffer of `window` Return: ~ `TextDocumentPositionParams` object @@ -1666,9 +1719,9 @@ make_range_params({window}, {offset_encoding}) Parameters: ~ {window} (optional, number): window handle or 0 for current, defaults to current - {offset_encoding} string utf-8|utf-16|utf-32|nil defaults - to `offset_encoding` of first client of - buffer of `window` + {offset_encoding} (string) utf-8|utf-16|utf-32|nil + defaults to `offset_encoding` of first + client of buffer of `window` Return: ~ { textDocument = { uri = `current_file_uri` }, range = { @@ -1702,9 +1755,9 @@ open_floating_preview({contents}, {syntax}, {opts}) Shows contents in a floating window. Parameters: ~ - {contents} table of lines to show in window - {syntax} string of syntax to set for opened buffer - {opts} table with optional fields (additional keys + {contents} (table) of lines to show in window + {syntax} (string) of syntax to set for opened buffer + {opts} (table) with optional fields (additional keys are passed on to |vim.api.nvim_open_win()|) • height: (number) height of floating window • width: (number) width of floating window @@ -1739,10 +1792,10 @@ parse_snippet({input}) *vim.lsp.util.parse_snippet()* Parses snippets in a completion entry. Parameters: ~ - {input} string unparsed snippet + {input} (string) unparsed snippet Return: ~ - string parsed snippet + (string) parsed snippet preview_location({location}, {opts}) *vim.lsp.util.preview_location()* Previews a location in a floating window @@ -1795,7 +1848,7 @@ stylize_markdown({bufnr}, {contents}, {opts}) `open_floating_preview` instead Parameters: ~ - {contents} table of lines to show in window + {contents} (table) of lines to show in window {opts} dictionary with optional fields • height of floating window • width of floating window @@ -1873,14 +1926,15 @@ get_level() *vim.lsp.log.get_level()* Gets the current log level. Return: ~ - string current log level + (string) current log level set_format_func({handle}) *vim.lsp.log.set_format_func()* Sets formatting function used to format logs Parameters: ~ - {handle} function function to apply to logging arguments, - pass vim.inspect for multi-line formatting + {handle} (function) function to apply to logging + arguments, pass vim.inspect for multi-line + formatting set_level({level}) *vim.lsp.log.set_level()* Sets the current log level. @@ -1892,7 +1946,7 @@ should_log({level}) *vim.lsp.log.should_log()* Checks whether the level is sufficient for logging. Parameters: ~ - {level} number log level + {level} (number) log level Return: ~ (bool) true if would log, false if not @@ -1998,19 +2052,19 @@ compute_diff({prev_lines}, {curr_lines}, {firstline}, {lastline}, curr lines Parameters: ~ - {prev_lines} table list of lines - {curr_lines} table list of lines - {firstline} number line to begin search for first + {prev_lines} (table) list of lines + {curr_lines} (table) list of lines + {firstline} (number) line to begin search for first difference - {lastline} number line to begin search in + {lastline} (number) line to begin search in old_lines for last difference - {new_lastline} number line to begin search in + {new_lastline} (number) line to begin search in new_lines for last difference - {offset_encoding} string encoding requested by language + {offset_encoding} (string) encoding requested by language server Return: ~ - table TextDocumentContentChangeEvent see https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocumentContentChangeEvent + (table) TextDocumentContentChangeEvent see https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocumentContentChangeEvent ============================================================================== @@ -2027,10 +2081,10 @@ resolve_capabilities({server_capabilities}) capabilities. Parameters: ~ - {server_capabilities} table Table of capabilities + {server_capabilities} (table) Table of capabilities supported by the server Return: ~ - table Normalized table of capabilities + (table) Normalized table of capabilities vim:tw=78:ts=8:ft=help:norl: diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt index 534a40ff4f..b551552c03 100644 --- a/runtime/doc/lua.txt +++ b/runtime/doc/lua.txt @@ -4,52 +4,52 @@ NVIM REFERENCE MANUAL -Lua engine *lua* *Lua* +Lua engine *lua* *Lua* - Type |gO| to see the table of contents. + Type |gO| to see the table of contents. ============================================================================== -INTRODUCTION *lua-intro* +INTRODUCTION *lua-intro* -The Lua 5.1 language is builtin and always available. Try this command to get +The Lua 5.1 language is builtin and always available. Try this command to get an idea of what lurks beneath: > :lua print(vim.inspect(package.loaded)) - -Nvim includes a "standard library" |lua-stdlib| for Lua. It complements the +< +Nvim includes a "standard library" |lua-stdlib| for Lua. It complements the "editor stdlib" (|builtin-functions| and Ex commands) and the |API|, all of which can be used from Lua code. A good overview of using Lua in neovim is given by https://github.com/nanotee/nvim-lua-guide. The |:source| and |:runtime| commands can run Lua scripts as well as Vim -scripts. Lua modules can be loaded with `require('name')`, which +scripts. Lua modules can be loaded with `require('name')`, which conventionally returns a table but can return any value. See |lua-require| for details on how Nvim finds and loads Lua modules. See |lua-require-example| for an example of how to write and use a module. ============================================================================== -IMPORTING LUA MODULES *lua-require* +IMPORTING LUA MODULES *lua-require* Modules are searched for under the directories specified in 'runtimepath', in -the order they appear. Any `.` in the module name is treated as a directory -separator when searching. For a module `foo.bar`, each directory is searched -for `lua/foo/bar.lua`, then `lua/foo/bar/init.lua`. If no files are found, +the order they appear. Any `.` in the module name is treated as a directory +separator when searching. For a module `foo.bar`, each directory is searched +for `lua/foo/bar.lua`, then `lua/foo/bar/init.lua`. If no files are found, the directories are searched again for a shared library with a name matching -`lua/foo/bar.?`, where `?` is a list of suffixes (such as `so` or `dll`) -derived from the initial value of `package.cpath`. If still no files are -found, Nvim falls back to Lua's default search mechanism. The first script -found is run and `require()` returns the value returned by the script if any, -else `true`. - -The return value is cached after the first call to `require()` for each -module, with subsequent calls returning the cached value without searching for -or executing any script. For further details on `require()`, see the Lua +`lua/foo/bar.?`, where `?` is a list of suffixes (such as `so` or `dll`) derived from +the initial value of `package.cpath`. If still no files are found, Nvim falls +back to Lua's default search mechanism. The first script found is run and +`require()` returns the value returned by the script if any, else `true`. + +The return value is cached after the first call to `require()` for each module, +with subsequent calls returning the cached value without searching for, or +executing any script. For further details on `require()`, see the Lua documentation at https://www.lua.org/manual/5.1/manual.html#pdf-require. For example, if 'runtimepath' is `foo,bar` and `package.cpath` was `./?.so;./?.dll` at startup, `require('mod')` searches these paths in order and loads the first module found: + foo/lua/mod.lua foo/lua/mod/init.lua bar/lua/mod.lua @@ -59,35 +59,34 @@ and loads the first module found: bar/lua/mod.so bar/lua/mod.dll - *lua-package-path* -Nvim automatically adjusts `package.path` and `package.cpath` according to -effective 'runtimepath' value. Adjustment happens whenever 'runtimepath' is -changed. `package.path` is adjusted by simply appending `/lua/?.lua` and +Nvim automatically adjusts `package.path` and `package.cpath` according to the +effective 'runtimepath' value. Adjustment happens whenever 'runtimepath' is +changed. `package.path` is adjusted by simply appending `/lua/?.lua` and `/lua/?/init.lua` to each directory from 'runtimepath' (`/` is actually the first character of `package.config`). Similarly to `package.path`, modified directories from 'runtimepath' are also -added to `package.cpath`. In this case, instead of appending `/lua/?.lua` and +added to `package.cpath`. In this case, instead of appending `/lua/?.lua` and `/lua/?/init.lua` to each runtimepath, all unique `?`-containing suffixes of -the existing `package.cpath` are used. Example: +the existing `package.cpath` are used. Example: 1. Given that - 'runtimepath' contains `/foo/bar,/xxx;yyy/baz,/abc`; - - initial (defined at compile-time or derived from - `$LUA_CPATH`/`$LUA_INIT`) `package.cpath` contains + - initial (defined at compile-time or derived from + `$LUA_CPATH`/`$LUA_INIT`) `package.cpath` contains `./?.so;/def/ghi/a?d/j/g.elf;/def/?.so`. -2. It finds `?`-containing suffixes `/?.so`, `/a?d/j/g.elf` and `/?.so`, in - order: parts of the path starting from the first path component containing +2. It finds `?`-containing suffixes `/?.so`, `/a?d/j/g.elf` and `/?.so`, in + order: parts of the path starting from the first path component containing question mark and preceding path separator. -3. The suffix of `/def/?.so`, namely `/?.so` is not unique, as it’s the same - as the suffix of the first path from `package.path` (i.e. `./?.so`). Which +3. The suffix of `/def/?.so`, namely `/?.so` is not unique, as it’s the same + as the suffix of the first path from `package.path` (i.e. `./?.so`). Which leaves `/?.so` and `/a?d/j/g.elf`, in this order. -4. 'runtimepath' has three paths: `/foo/bar`, `/xxx;yyy/baz` and `/abc`. The - second one contains semicolon which is a paths separator so it is out, +4. 'runtimepath' has three paths: `/foo/bar`, `/xxx;yyy/baz` and `/abc`. The + second one contains a semicolon which is a paths separator so it is out, leaving only `/foo/bar` and `/abc`, in order. -5. The cartesian product of paths from 4. and suffixes from 3. is taken, - giving four variants. In each variant `/lua` path segment is inserted - between path and suffix, leaving +5. The cartesian product of paths from 4. and suffixes from 3. is taken, + giving four variants. In each variant, a `/lua` path segment is inserted + between path and suffix, leaving: - `/foo/bar/lua/?.so` - `/foo/bar/lua/a?d/j/g.elf` @@ -107,28 +106,28 @@ Note: - To track 'runtimepath' updates, paths added at previous update are remembered and removed at the next update, while all paths derived from the - new 'runtimepath' are prepended as described above. This allows removing + new 'runtimepath' are prepended as described above. This allows removing paths when path is removed from 'runtimepath', adding paths when they are added and reordering `package.path`/`package.cpath` content if 'runtimepath' was reordered. - Although adjustments happen automatically, Nvim does not track current - values of `package.path` or `package.cpath`. If you happen to delete some + values of `package.path` or `package.cpath`. If you happen to delete some paths from there you can set 'runtimepath' to trigger an update: > let &runtimepath = &runtimepath - Skipping paths from 'runtimepath' which contain semicolons applies both to - `package.path` and `package.cpath`. Given that there are some badly written - plugins using shell which will not work with paths containing semicolons it - is better to not have them in 'runtimepath' at all. + `package.path` and `package.cpath`. Given that there are some badly written + plugins using shell, which will not work with paths containing semicolons, + it is better to not have them in 'runtimepath' at all. ============================================================================== -Lua Syntax Information *lua-syntax-help* +Lua Syntax Information *lua-syntax-help* While Lua has a simple syntax, there are a few things to understand, particularly when looking at the documentation above. - *lua-syntax-call-function* + *lua-syntax-call-function* Lua functions can be called in multiple ways. Consider the function: > @@ -136,8 +135,7 @@ Lua functions can be called in multiple ways. Consider the function: > print("A is: ", a) print("B is: ", b) end - - +< The first way to call this function is: > example_func(1, 2) @@ -154,7 +152,6 @@ not supplied are automatically set to `nil`. For example: > -- A is: 1 -- B is: nil < - Additionally, if any extra parameters are passed, they are discarded completely. @@ -172,18 +169,16 @@ single dictionary, for example: > func_with_opts { foo = true, filename = "hello.world" } < - In this style, each "parameter" is passed via keyword. It is still valid to call the function in the standard style: > func_with_opts({ foo = true, filename = "hello.world" }) < - But often in the documentation, you will see the former rather than the latter style due to its brevity. ============================================================================== -Lua Patterns *lua-patterns* +Lua Patterns *lua-patterns* For performance reasons, Lua does not support regular expressions natively. Instead, the Lua `string` standard library allows manipulations using a @@ -207,13 +202,13 @@ For more complex matching, Vim regular expressions can be used from Lua through |vim.regex()|. ------------------------------------------------------------------------------ -LUA PLUGIN EXAMPLE *lua-require-example* +LUA PLUGIN EXAMPLE *lua-require-example* -The following example plugin adds a command `:MakeCharBlob` which transforms -current buffer into a long `unsigned char` array. Lua contains transformation -function in a module `lua/charblob.lua` which is imported in -`autoload/charblob.vim` (`require("charblob")`). Example plugin is supposed -to be put into any directory from 'runtimepath', e.g. `~/.config/nvim` (in +The following example plugin adds a command `:MakeCharBlob` which transforms +current buffer into a long `unsigned char` array. Lua contains transformation +function in a module `lua/charblob.lua` which is imported in +`autoload/charblob.vim` (`require("charblob")`). Example plugin is supposed +to be put into any directory from 'runtimepath', e.g. `~/.config/nvim` (in this case `lua/charblob.lua` means `~/.config/nvim/lua/charblob.lua`). autoload/charblob.vim: > @@ -223,7 +218,7 @@ autoload/charblob.vim: > \ 'require("charblob").encode(unpack(_A))', \ [getline(1, '$'), &textwidth, ' '])) endfunction - +< plugin/charblob.vim: > if exists('g:charblob_loaded') @@ -232,7 +227,7 @@ plugin/charblob.vim: > let g:charblob_loaded = 1 command MakeCharBlob :call charblob#encode_buffer() - +< lua/charblob.lua: > local function charblob_bytes_iter(lines) @@ -282,9 +277,9 @@ lua/charblob.lua: > bytes_iter = charblob_bytes_iter, encode = charblob_encode, } - +< ============================================================================== -COMMANDS *lua-commands* +COMMANDS *lua-commands* These commands execute a Lua chunk from either the command line (:lua, :luado) or a file (:luafile) on the given line [range]. As always in Lua, each chunk @@ -295,10 +290,10 @@ command calls. The |lua-stdlib| modules, user modules, and anything else on The Lua print() function redirects its output to the Nvim message area, with arguments separated by " " (space) instead of "\t" (tab). - *:lua* + *:lua* :[range]lua {chunk} Executes Lua chunk {chunk}. - if {chunk} starts with "=" the rest of the chunk is + If {chunk} starts with "=" the rest of the chunk is evaluated as an expression and printed. `:lua =expr` is equivalent to `:lua print(vim.inspect(expr))` Examples: > @@ -308,7 +303,7 @@ arguments separated by " " (space) instead of "\t" (tab). < To see the LuaJIT version: > :lua =jit.version < - *:lua-heredoc* + *:lua-heredoc* :[range]lua << [endmarker] {script} {endmarker} @@ -328,11 +323,11 @@ arguments separated by " " (space) instead of "\t" (tab). linenr, #curline)) EOF endfunction - -< Note that the `local` variables will disappear when +< + Note that the `local` variables will disappear when the block finishes. But not globals. - *:luado* + *:luado* :[range]luado {body} Executes Lua chunk "function(line, linenr) {body} end" for each buffer line in [range], where `line` is the current line text (without <EOL>), and `linenr` is the @@ -349,8 +344,7 @@ arguments separated by " " (space) instead of "\t" (tab). :lua bp = lpeg.P{ "(" * ((1 - lpeg.S"()") + lpeg.V(1))^0 * ")" } :luado if bp:match(line) then return "-->\t" .. line end < - - *:luafile* + *:luafile* :[range]luafile {file} Execute Lua script in {file}. The whole argument is used as the filename (like @@ -363,19 +357,19 @@ arguments separated by " " (space) instead of "\t" (tab). < ============================================================================== -luaeval() *lua-eval* *luaeval()* +luaeval() *lua-eval* *luaeval()* The (dual) equivalent of "vim.eval" for passing Lua values to Nvim is -"luaeval". "luaeval" takes an expression string and an optional argument used -for _A inside expression and returns the result of the expression. It is -semantically equivalent in Lua to: -> +"luaeval". "luaeval" takes an expression string and an optional argument used +for _A inside expression and returns the result of the expression. It is +semantically equivalent in Lua to: > + local chunkheader = "local _A = select(1, ...) return " function luaeval (expstr, arg) local chunk = assert(loadstring(chunkheader .. expstr, "luaeval")) return chunk(arg) -- return typval end - +< Lua nils, numbers, strings, tables and booleans are converted to their respective Vimscript types. If a Lua string contains a NUL byte, it will be converted to a |Blob|. Conversion of other Lua types is an error. @@ -387,22 +381,22 @@ Example: > 42 :echo luaeval('string.match(_A, "[a-z]+")', 'XYXfoo123') foo - +< Lua tables are used as both dictionaries and lists, so it is impossible to determine whether empty table is meant to be empty list or empty dictionary. Additionally Lua does not have integer numbers. To distinguish between these cases there is the following agreement: 0. Empty table is empty list. -1. Table with N incrementally growing integral numbers, starting from 1 and +1. Table with N incrementally growing integral numbers, starting from 1 and ending with N is considered to be a list. -2. Table with string keys, none of which contains NUL byte, is considered to +2. Table with string keys, none of which contains NUL byte, is considered to be a dictionary. -3. Table with string keys, at least one of which contains NUL byte, is also - considered to be a dictionary, but this time it is converted to +3. Table with string keys, at least one of which contains NUL byte, is also + considered to be a dictionary, but this time it is converted to a |msgpack-special-map|. - *lua-special-tbl* -4. Table with `vim.type_idx` key may be a dictionary, a list or floating-point + *lua-special-tbl* +4. Table with `vim.type_idx` key may be a dictionary, a list or floating-point value: - `{[vim.type_idx]=vim.types.float, [vim.val_idx]=1}` is converted to a floating-point 1.0. Note that by default integral Lua numbers are @@ -425,14 +419,14 @@ Examples: > : return luaeval('(_A.y-_A.x)*math.random()+_A.x', {'x':a:x,'y':a:y}) : endfunction :echo Rand(1,10) - -Note: second argument to `luaeval` is converted ("marshalled") from Vimscript +< +Note: Second argument to `luaeval` is converted ("marshalled") from Vimscript to Lua, so changes to Lua containers do not affect values in Vimscript. Return value is also always converted. When converting, |msgpack-special-dict|s are treated specially. ============================================================================== -Vimscript v:lua interface *v:lua-call* +Vimscript v:lua interface *v:lua-call* From Vimscript the special `v:lua` prefix can be used to call Lua functions which are global or accessible from global tables. The expression > @@ -447,7 +441,7 @@ is equivalent to the Lua chunk > In addition, functions of packages can be accessed like > v:lua.require'mypack'.func(arg1, arg2) v:lua.require'mypack.submod'.func(arg1, arg2) -Note: only single quote form without parens is allowed. Using +Note: Only single quote form without parens is allowed. Using `require"mypack"` or `require('mypack')` as prefixes do NOT work (the latter is still valid as a function call of itself, in case require returns a useful value). @@ -455,7 +449,7 @@ value). The `v:lua` prefix may be used to call Lua functions as |method|s. For example: > arg1->v:lua.somemod.func(arg2) - +< You can use `v:lua` in "func" options like 'tagfunc', 'omnifunc', etc. For example consider the following Lua omnifunc handler: > @@ -468,7 +462,7 @@ For example consider the following Lua omnifunc handler: > end vim.api.nvim_buf_set_option(0, 'omnifunc', 'v:lua.mymod.omnifunc') -Note: the module ("mymod" in the above example) must either be a Lua global, +Note: The module ("mymod" in the above example) must either be a Lua global, or use the require syntax as specified above to access it from a package. Note: `v:lua` without a call is not allowed in a Vimscript expression: @@ -478,13 +472,12 @@ Note: `v:lua` without a call is not allowed in a Vimscript expression: call SomeFunc(v:lua.mycallback) " Error let g:foo = v:lua " Error let g:foo = v:['lua'] " Error - - +< ============================================================================== -Lua standard modules *lua-stdlib* +Lua standard modules *lua-stdlib* The Nvim Lua "standard library" (stdlib) is the `vim` module, which exposes -various functions and sub-modules. It is always loaded, thus require("vim") +various functions and sub-modules. It is always loaded, thus `require("vim")` is unnecessary. You can peek at the module properties: > @@ -515,34 +508,35 @@ Note that underscore-prefixed functions (e.g. "_os_proc_children") are internal/private and must not be used by plugins. ------------------------------------------------------------------------------ -VIM.LOOP *lua-loop* *vim.loop* +VIM.LOOP *lua-loop* *vim.loop* -`vim.loop` exposes all features of the Nvim event-loop. This is a low-level +`vim.loop` exposes all features of the Nvim event-loop. This is a low-level API that provides functionality for networking, filesystem, and process -management. Try this command to see available functions: > +management. Try this command to see available functions: > :lua print(vim.inspect(vim.loop)) - +< Reference: https://github.com/luvit/luv/blob/master/docs.md Examples: https://github.com/luvit/luv/tree/master/examples - *E5560* *lua-loop-callbacks* + *E5560* *lua-loop-callbacks* It is an error to directly invoke `vim.api` functions (except |api-fast|) in -`vim.loop` callbacks. For example, this is an error: > +`vim.loop` callbacks. For example, this is an error: > local timer = vim.loop.new_timer() timer:start(1000, 0, function() vim.api.nvim_command('echomsg "test"') end) - +< To avoid the error use |vim.schedule_wrap()| to defer the callback: > local timer = vim.loop.new_timer() timer:start(1000, 0, vim.schedule_wrap(function() vim.api.nvim_command('echomsg "test"') end)) - -(For one-shot timers, see |vim.defer_fn()|, which automatically adds the wrapping.) +< +(For one-shot timers, see |vim.defer_fn()|, which automatically adds the +wrapping.) Example: repeating timer 1. Save this code to a file. @@ -560,9 +554,8 @@ Example: repeating timer i = i + 1 end) print('sleeping'); - - -Example: File-change detection *watch-file* +< +Example: File-change detection *watch-file* 1. Save this code to a file. 2. Execute it with ":luafile %". 3. Use ":Watch %" to watch any file. @@ -586,9 +579,8 @@ Example: File-change detection *watch-file* end vim.api.nvim_command( "command! -nargs=1 Watch call luaeval('watch_file(_A)', expand('<args>'))") - - -Example: TCP echo-server *tcp-server* +< +Example: TCP echo-server *tcp-server* 1. Save this code to a file. 2. Execute it with ":luafile %". 3. Note the port number. @@ -616,9 +608,8 @@ Example: TCP echo-server *tcp-server* end) end) print('TCP echo-server listening on port: '..server:getsockname().port) - - -Multithreading *lua-loop-threading* +< +Multithreading *lua-loop-threading* Plugins can perform work in separate (os-level) threads using the threading APIs in luv, for instance `vim.loop.new_thread`. Note that every thread @@ -638,7 +629,7 @@ A subset of the `vim.*` API is available in threads. This includes: - `vim.is_thread()` returns true from a non-main thread. ------------------------------------------------------------------------------ -VIM.HIGHLIGHT *lua-highlight* +VIM.HIGHLIGHT *lua-highlight* Nvim includes a function for highlighting a selection on yank (see for example https://github.com/machakann/vim-highlightedyank). To enable it, add @@ -654,8 +645,7 @@ If you want to exclude visual selections from highlighting on yank, use > au TextYankPost * silent! lua vim.highlight.on_yank {on_visual=false} < - -vim.highlight.on_yank({opts}) *vim.highlight.on_yank()* +vim.highlight.on_yank({opts}) *vim.highlight.on_yank()* Highlights the yanked text. The fields of the optional dict {opts} control the highlight: - {higroup} highlight group for yanked region (default |hl-IncSearch|) @@ -678,12 +668,12 @@ vim.highlight.range({bufnr}, {ns}, {hlgroup}, {start}, {finish}, {opts}) {opts} optional parameters: • `regtype`: type of range (characterwise, linewise, or blockwise, see |setreg|), default `'v'` - • `inclusive`: range includes end position, default - `false` + • `inclusive`: range includes end position, + default `false` • `priority`: priority of highlight, default `vim.highlight.user` (see below) -vim.highlight.priorities *vim.highlight.priorities* +vim.highlight.priorities *vim.highlight.priorities* Table with default priorities used for highlighting: • `syntax`: `50`, used for standard syntax highlighting @@ -693,19 +683,20 @@ vim.highlight.priorities *vim.highlight.priorities* document symbols or `on_yank` autocommands ------------------------------------------------------------------------------ -VIM.REGEX *lua-regex* +VIM.REGEX *lua-regex* Vim regexes can be used directly from lua. Currently they only allow matching within a single line. -vim.regex({re}) *vim.regex()* +vim.regex({re}) *vim.regex()* Parse the Vim regex {re} and return a regex object. Regexes are - "magic" and case-insensitive by default, regardless of 'magic' and - 'ignorecase'. The can be controlled with flags, see |/magic|. + "magic" and case-sensitive by default, regardless of 'magic' and + 'ignorecase'. They can be controlled with flags, see |/magic| and + |/ignorecase|. Methods on the regex object: -regex:match_str({str}) *regex:match_str()* +regex:match_str({str}) *regex:match_str()* Match the string against the regex. If the string should match the regex precisely, surround the regex with `^` and `$`. If the was a match, the byte indices for the beginning and end of @@ -713,7 +704,7 @@ regex:match_str({str}) *regex:match_str()* As any integer is truth-y, `regex:match()` can be directly used as a condition in an if-statement. -regex:match_line({bufnr}, {line_idx}[, {start}, {end}]) *regex:match_line()* +regex:match_line({bufnr}, {line_idx}[, {start}, {end}]) *regex:match_line()* Match line {line_idx} (zero-based) in buffer {bufnr}. If {start} and {end} are supplied, match only this byte index range. Otherwise see |regex:match_str()|. If {start} is used, then the returned byte @@ -728,18 +719,19 @@ vim.diff({a}, {b}, {opts}) *vim.diff()* 1-based. Examples: > - vim.diff('a\n', 'b\nc\n') - --> - @@ -1 +1,2 @@ - -a - +b - +c - - vim.diff('a\n', 'b\nc\n', {result_type = 'indices'}) - --> - { - {1, 1, 1, 2} - } + + vim.diff('a\n', 'b\nc\n') + --> + @@ -1 +1,2 @@ + -a + +b + +c + + vim.diff('a\n', 'b\nc\n', {result_type = 'indices'}) + --> + { + {1, 1, 1, 2} + } < Parameters: ~ {a} First string to compare @@ -757,7 +749,7 @@ vim.diff({a}, {b}, {opts}) *vim.diff()* • `result_type` (string): Form of the returned diff: • "unified": (default) String in unified format. • "indices": Array of hunk locations. - Note this option is ignored if `on_hunk` is + Note: This option is ignored if `on_hunk` is used. • `algorithm` (string): Diff algorithm to use. Values: @@ -792,31 +784,31 @@ VIM.MPACK *lua-mpack* The *vim.mpack* module provides encoding and decoding of Lua objects to and from msgpack-encoded strings. Supports |vim.NIL| and |vim.empty_dict()|. -vim.mpack.encode({obj}) *vim.mpack.encode* +vim.mpack.encode({obj}) *vim.mpack.encode* Encodes (or "packs") Lua object {obj} as msgpack in a Lua string. -vim.mpack.decode({str}) *vim.mpack.decode* +vim.mpack.decode({str}) *vim.mpack.decode* Decodes (or "unpacks") the msgpack-encoded {str} to a Lua object. ------------------------------------------------------------------------------ -VIM.SPELL *lua-spell* +VIM.SPELL *lua-spell* -vim.spell.check({str}) *vim.spell.check()* +vim.spell.check({str}) *vim.spell.check()* Check {str} for spelling errors. Similar to the Vimscript function |spellbadword()|. Note: The behaviour of this function is dependent on: 'spelllang', - 'spellfile', 'spellcapcheck' and 'spelloptions' which can all be local - to the buffer. Consider calling this with |nvim_buf_call()|. + 'spellfile', 'spellcapcheck' and 'spelloptions' which can all be + local to the buffer. Consider calling this with |nvim_buf_call()|. Example: > + vim.spell.check("the quik brown fox") --> { {'quik', 'bad', 4} } < - Parameters: ~ {str} String to spell check. @@ -831,24 +823,24 @@ vim.spell.check({str}) *vim.spell.check()* - The position in {str} where the word begins. ------------------------------------------------------------------------------ -VIM *lua-builtin* +VIM *lua-builtin* -vim.api.{func}({...}) *vim.api* +vim.api.{func}({...}) *vim.api* Invokes Nvim |API| function {func} with arguments {...}. Example: call the "nvim_get_current_line()" API function: > print(tostring(vim.api.nvim_get_current_line())) -vim.version() *vim.version* +vim.version() *vim.version* Gets the version of the current Nvim build. -vim.in_fast_event() *vim.in_fast_event()* +vim.in_fast_event() *vim.in_fast_event()* Returns true if the code is executing as part of a "fast" event handler, where most of the API is disabled. These are low-level events (e.g. |lua-loop-callbacks|) which can be invoked whenever Nvim polls - for input. When this is `false` most API functions are callable (but + for input. When this is `false` most API functions are callable (but may be subject to other restrictions such as |textlock|). -vim.NIL *vim.NIL* +vim.NIL *vim.NIL* Special value representing NIL in |RPC| and |v:null| in Vimscript conversion, and similar cases. Lua `nil` cannot be used as part of a Lua table representing a Dictionary or Array, because it is @@ -860,10 +852,10 @@ vim.empty_dict() *vim.empty_dict()* Vimscript or API types. Nvim by default converts an empty table `{}` without this metatable to an list/array. - Note: if numeric keys are present in the table, Nvim ignores the + Note: If numeric keys are present in the table, Nvim ignores the metatable marker and converts the dict to a list/array anyway. -vim.rpcnotify({channel}, {method}[, {args}...]) *vim.rpcnotify()* +vim.rpcnotify({channel}, {method}[, {args}...]) *vim.rpcnotify()* Sends {event} to {channel} via |RPC| and returns immediately. If {channel} is 0, the event is broadcast to all channels. @@ -876,12 +868,12 @@ vim.rpcrequest({channel}, {method}[, {args}...]) *vim.rpcrequest()* Note: NIL values as part of the return value is represented as |vim.NIL| special value -vim.stricmp({a}, {b}) *vim.stricmp()* - Compares strings case-insensitively. Returns 0, 1 or -1 if strings +vim.stricmp({a}, {b}) *vim.stricmp()* + Compares strings case-insensitively. Returns 0, 1 or -1 if strings are equal, {a} is greater than {b} or {a} is lesser than {b}, respectively. -vim.str_utfindex({str}[, {index}]) *vim.str_utfindex()* +vim.str_utfindex({str}[, {index}]) *vim.str_utfindex()* Convert byte index to UTF-32 and UTF-16 indices. If {index} is not supplied, the length of the string is used. All indices are zero-based. Returns two values: the UTF-32 and UTF-16 indices respectively. @@ -891,21 +883,21 @@ vim.str_utfindex({str}[, {index}]) *vim.str_utfindex()* point each. An {index} in the middle of a UTF-8 sequence is rounded upwards to the end of that sequence. -vim.str_byteindex({str}, {index}[, {use_utf16}]) *vim.str_byteindex()* +vim.str_byteindex({str}, {index}[, {use_utf16}]) *vim.str_byteindex()* Convert UTF-32 or UTF-16 {index} to byte index. If {use_utf16} is not supplied, it defaults to false (use UTF-32). Returns the byte index. - Invalid UTF-8 and NUL is treated like by |vim.str_byteindex()|. An {index} - in the middle of a UTF-16 sequence is rounded upwards to the end of that - sequence. + Invalid UTF-8 and NUL is treated like by |vim.str_byteindex()|. + An {index} in the middle of a UTF-16 sequence is rounded upwards to + the end of that sequence. -vim.schedule({callback}) *vim.schedule()* +vim.schedule({callback}) *vim.schedule()* Schedules {callback} to be invoked soon by the main event-loop. Useful to avoid |textlock| or other temporary restrictions. -vim.defer_fn({fn}, {timeout}) *vim.defer_fn* - Defers calling {fn} until {timeout} ms passes. Use to do a one-shot timer +vim.defer_fn({fn}, {timeout}) *vim.defer_fn* + Defers calling {fn} until {timeout} ms passes. Use to do a one-shot timer that calls {fn}. Note: The {fn} is |schedule_wrap|ped automatically, so API functions are @@ -969,15 +961,15 @@ vim.wait({time} [, {callback}, {interval}, {fast_only}]) *vim.wait()* end < -vim.type_idx *vim.type_idx* - Type index for use in |lua-special-tbl|. Specifying one of the values +vim.type_idx *vim.type_idx* + Type index for use in |lua-special-tbl|. Specifying one of the values from |vim.types| allows typing the empty table (it is unclear whether empty Lua table represents empty list or empty array) and forcing - integral numbers to be |Float|. See |lua-special-tbl| for more + integral numbers to be |Float|. See |lua-special-tbl| for more details. -vim.val_idx *vim.val_idx* - Value index for tables representing |Float|s. A table representing +vim.val_idx *vim.val_idx* + Value index for tables representing |Float|s. A table representing floating-point value 1.0 looks like this: > { [vim.type_idx] = vim.types.float, @@ -985,17 +977,17 @@ vim.val_idx *vim.val_idx* } < See also |vim.type_idx| and |lua-special-tbl|. -vim.types *vim.types* - Table with possible values for |vim.type_idx|. Contains two sets of +vim.types *vim.types* + Table with possible values for |vim.type_idx|. Contains two sets of key-value pairs: first maps possible values for |vim.type_idx| to human-readable strings, second maps human-readable type names to - values for |vim.type_idx|. Currently contains pairs for `float`, + values for |vim.type_idx|. Currently contains pairs for `float`, `array` and `dictionary` types. - Note: one must expect that values corresponding to `vim.types.float`, + Note: One must expect that values corresponding to `vim.types.float`, `vim.types.array` and `vim.types.dictionary` fall under only two following assumptions: - 1. Value may serve both as a key and as a value in a table. Given the + 1. Value may serve both as a key and as a value in a table. Given the properties of Lua tables this basically means “value is not `nil`”. 2. For each value in `vim.types` table `vim.types[vim.types[value]]` is the same as `value`. @@ -1015,33 +1007,22 @@ Log levels are one of the values defined in `vim.log.levels`: vim.log.levels.OFF ------------------------------------------------------------------------------ -LUA-VIMSCRIPT BRIDGE *lua-vimscript* +LUA-VIMSCRIPT BRIDGE *lua-vimscript* Nvim Lua provides an interface to Vimscript variables and functions, and editor commands and options. See also https://github.com/nanotee/nvim-lua-guide. -vim.call({func}, {...}) *vim.call()* +vim.call({func}, {...}) *vim.call()* Invokes |vim-function| or |user-function| {func} with arguments {...}. See also |vim.fn|. Equivalent to: > vim.fn[func]({...}) -vim.cmd({cmd}) *vim.cmd()* - Executes multiple lines of Vimscript at once. It is an alias to - |nvim_exec()|, where `output` is set to false. Thus it works identical - to |:source|. - See also |ex-cmd-index|. - Example: > - vim.cmd('echo 42') - vim.cmd([[ - augroup My_group - autocmd! - autocmd FileType c setlocal cindent - augroup END - ]]) - -vim.fn.{func}({...}) *vim.fn* +vim.cmd({command}) + See |vim.cmd()|. + +vim.fn.{func}({...}) *vim.fn* Invokes |vim-function| or |user-function| {func} with arguments {...}. To call autoload functions, use the syntax: > vim.fn['some#function']({...}) @@ -1058,7 +1039,7 @@ vim.fn.{func}({...}) *vim.fn* enumerates functions that were called at least once. - *lua-vim-variables* + *lua-vim-variables* The Vim editor global dictionaries |g:| |w:| |b:| |t:| |v:| can be accessed from Lua conveniently and idiomatically by referencing the `vim.*` Lua tables described below. In this way you can easily read and modify global Vimscript @@ -1070,31 +1051,31 @@ Example: > print(vim.g.foo) -- Get and print the g:foo Vimscript variable. vim.g.foo = nil -- Delete (:unlet) the Vimscript variable. vim.b[2].foo = 6 -- Set b:foo for buffer 2 - -vim.g *vim.g* +< +vim.g *vim.g* Global (|g:|) editor variables. Key with no value returns `nil`. -vim.b *vim.b* +vim.b *vim.b* Buffer-scoped (|b:|) variables for the current buffer. Invalid or unset key returns `nil`. Can be indexed with an integer to access variables for a specific buffer. -vim.w *vim.w* +vim.w *vim.w* Window-scoped (|w:|) variables for the current window. Invalid or unset key returns `nil`. Can be indexed with an integer to access variables for a specific window. -vim.t *vim.t* +vim.t *vim.t* Tabpage-scoped (|t:|) variables for the current tabpage. Invalid or unset key returns `nil`. Can be indexed with an integer to access variables for a specific tabpage. -vim.v *vim.v* +vim.v *vim.v* |v:| variables. Invalid or unset key returns `nil`. -vim.env *vim.env* +vim.env *vim.env* Environment variables defined in the editor session. See |expand-env| and |:let-environment| for the Vimscript behavior. Invalid or unset key returns `nil`. @@ -1144,7 +1125,6 @@ from within Lua. -- or using the `:append(...)` method vim.opt.wildignore:append { "*.pyc", "node_modules" } < - To replicate the behavior of |:set^=|, use: > -- vim.opt supports prepending options via the "^" operator @@ -1265,14 +1245,13 @@ vim.o :set set set vim.bo/vim.wo :setlocal - set vim.go :setglobal set - -vim.o *vim.o* +vim.o *vim.o* Get or set editor options, like |:set|. Invalid key is an error. Example: > vim.o.cmdheight = 4 print(vim.o.columns) - - -vim.go *vim.go* +< +vim.go *vim.go* Get or set an |option|. Invalid key is an error. This is a wrapper around |nvim_set_option()| and |nvim_get_option()|. @@ -1284,8 +1263,7 @@ vim.go *vim.go* Example: > vim.go.cmdheight = 4 < - -vim.bo *vim.bo* +vim.bo *vim.bo* Get or set buffer-scoped |local-options|. Invalid key is an error. This is a wrapper around |nvim_buf_set_option()| and @@ -1294,8 +1272,8 @@ vim.bo *vim.bo* Example: > vim.bo.buflisted = true print(vim.bo.comments) - -vim.wo *vim.wo* +< +vim.wo *vim.wo* Get or set window-scoped |local-options|. Invalid key is an error. This is a wrapper around |nvim_win_set_option()| and @@ -1304,11 +1282,38 @@ vim.wo *vim.wo* Example: > vim.wo.cursorcolumn = true print(vim.wo.foldmarker) - - +< ============================================================================== Lua module: vim *lua-vim* +cmd({command}) *vim.cmd()* + Execute Vim script commands. + + Example: > + + vim.cmd('echo 42') + vim.cmd([[ + augroup My_group + autocmd! + autocmd FileType c setlocal cindent + augroup END + ]]) + vim.cmd({ cmd = 'echo', args = { '"foo"' } }) +< + + Parameters: ~ + {command} string|table Command(s) to execute. If a + string, executes multiple lines of Vim script + at once. In this case, it is an alias to + |nvim_exec()|, where `output` is set to false. + Thus it works identical to |:source|. If a + table, executes a single command. In this case, + it is an alias to |nvim_cmd()| where `opts` is + empty. + + See also: ~ + |ex-cmd-index| + *vim.connection_failure_errmsg()* connection_failure_errmsg({consequence}) TODO: Documentation @@ -1327,16 +1332,20 @@ defer_fn({fn}, {timeout}) *vim.defer_fn()* Return: ~ timer luv timer object -deprecate({name}, {alternative}, {version}, {plugin}) *vim.deprecate()* + *vim.deprecate()* +deprecate({name}, {alternative}, {version}, {plugin}, {backtrace}) Display a deprecation notification to the user. Parameters: ~ {name} string Deprecated function. - {alternative} string|nil Preferred alternative function. + {alternative} (string|nil) Preferred alternative + function. {version} string Version in which the deprecated function will be removed. {plugin} string|nil Plugin name that the function will be removed from. Defaults to "Nvim". + {backtrace} boolean|nil Prints backtrace. Defaults to + true. inspect({object}, {options}) *vim.inspect()* Return a human-readable representation of the given object. @@ -1353,11 +1362,12 @@ notify({msg}, {level}, {opts}) *vim.notify()* notification provider). By default, writes to |:messages|. Parameters: ~ - {msg} string Content of the notification to show to the - user. - {level} number|nil One of the values from + {msg} (string) Content of the notification to show to + the user. + {level} (number|nil) One of the values from |vim.log.levels|. - {opts} table|nil Optional parameters. Unused by default. + {opts} (table|nil) Optional parameters. Unused by + default. notify_once({msg}, {level}, {opts}) *vim.notify_once()* Display a notification only one time. @@ -1366,11 +1376,15 @@ notify_once({msg}, {level}, {opts}) *vim.notify_once()* message will not display a notification. Parameters: ~ - {msg} string Content of the notification to show to the - user. - {level} number|nil One of the values from + {msg} (string) Content of the notification to show to + the user. + {level} (number|nil) One of the values from |vim.log.levels|. - {opts} table|nil Optional parameters. Unused by default. + {opts} (table|nil) Optional parameters. Unused by + default. + + Return: ~ + (boolean) true if message was displayed, else false on_key({fn}, {ns_id}) *vim.on_key()* Adds Lua function {fn} with namespace id {ns_id} as a listener @@ -1396,8 +1410,8 @@ on_key({fn}, {ns_id}) *vim.on_key()* returns a new |nvim_create_namespace()| id. Return: ~ - number Namespace id associated with {fn}. Or count of all - callbacks if on_key() is called without arguments. + (number) Namespace id associated with {fn}. Or count of + all callbacks if on_key() is called without arguments. Note: {fn} will be removed if an error occurs while calling. @@ -1451,12 +1465,12 @@ region({bufnr}, {pos1}, {pos2}, {regtype}, {inclusive}) *vim.region()* marked by two points Parameters: ~ - {bufnr} number of buffer + {bufnr} (number) of buffer {pos1} (line, column) tuple marking beginning of region {pos2} (line, column) tuple marking end of region {regtype} type of selection (:help setreg) - {inclusive} boolean indicating whether the selection is + {inclusive} (boolean) indicating whether the selection is end-inclusive Return: ~ @@ -1476,14 +1490,14 @@ schedule_wrap({cb}) *vim.schedule_wrap()* deep_equal({a}, {b}) *vim.deep_equal()* Deep compare values for equality - Tables are compared recursively unless they both provide the `eq` methamethod. All other types are compared using the equality `==` operator. + Tables are compared recursively unless they both provide the `eq` metamethod. All other types are compared using the equality `==` operator. Parameters: ~ - {a} first value - {b} second value + {a} any First value + {b} any Second value Return: ~ - `true` if values are equals, else `false`. + (boolean) `true` if values are equals, else `false` deepcopy({orig}) *vim.deepcopy()* Returns a deep copy of the given object. Non-table objects are @@ -1494,32 +1508,32 @@ deepcopy({orig}) *vim.deepcopy()* and will throw an error. Parameters: ~ - {orig} table Table to copy + {orig} (table) Table to copy Return: ~ - New table of copied keys and (nested) values. + (table) Table of copied keys and (nested) values. endswith({s}, {suffix}) *vim.endswith()* Tests if `s` ends with `suffix`. Parameters: ~ - {s} (string) a string - {suffix} (string) a suffix + {s} (string) String + {suffix} (string) Suffix to match Return: ~ - (boolean) true if `suffix` is a suffix of s + (boolean) `true` if `suffix` is a suffix of `s` gsplit({s}, {sep}, {plain}) *vim.gsplit()* Splits a string at each instance of a separator. Parameters: ~ - {s} String to split - {sep} Separator string or pattern - {plain} If `true` use `sep` literally (passed to - String.find) + {s} (string) String to split + {sep} (string) Separator or pattern + {plain} (boolean) If `true` use `sep` literally (passed + to string.find) Return: ~ - Iterator over the split components + (function) Iterator over the split components See also: ~ |vim.split()| @@ -1530,10 +1544,10 @@ is_callable({f}) *vim.is_callable()* Returns true if object `f` can be called as a function. Parameters: ~ - {f} Any object + {f} any Any object Return: ~ - true if `f` is callable, else false + (boolean) `true` if `f` is callable, else `false` list_extend({dst}, {src}, {start}, {finish}) *vim.list_extend()* Extends a list-like table with the values of another list-like @@ -1542,13 +1556,14 @@ list_extend({dst}, {src}, {start}, {finish}) *vim.list_extend()* NOTE: This mutates dst! Parameters: ~ - {dst} list which will be modified and appended to. - {src} list from which values will be inserted. - {start} Start index on src. defaults to 1 - {finish} Final index on src. defaults to #src + {dst} (table) List which will be modified and appended + to + {src} (table) List from which values will be inserted + {start} (number) Start index on src. Defaults to 1 + {finish} (number) Final index on src. Defaults to `#src` Return: ~ - dst + (table) dst See also: ~ |vim.tbl_extend()| @@ -1558,21 +1573,22 @@ list_slice({list}, {start}, {finish}) *vim.list_slice()* to end (inclusive) Parameters: ~ - {list} table table - {start} integer Start range of slice - {finish} integer End range of slice + {list} (table) Table + {start} (number) Start range of slice + {finish} (number) End range of slice Return: ~ - Copy of table sliced from start to finish (inclusive) + (table) Copy of table sliced from start to finish + (inclusive) pesc({s}) *vim.pesc()* Escapes magic chars in a Lua pattern. Parameters: ~ - {s} String to escape + {s} (string) String to escape Return: ~ - %-escaped pattern string + (string) %-escaped pattern string See also: ~ https://github.com/rxi/lume @@ -1589,16 +1605,16 @@ split({s}, {sep}, {kwargs}) *vim.split()* < Parameters: ~ - {s} String to split - {sep} Separator string or pattern - {kwargs} Keyword arguments: + {s} (string) String to split + {sep} (string) Separator or pattern + {kwargs} (table) Keyword arguments: • plain: (boolean) If `true` use `sep` literally (passed to string.find) • trimempty: (boolean) If `true` remove empty items from the front and back of the list Return: ~ - List-like table of the split components. + (table) List of split components See also: ~ |vim.gsplit()| @@ -1607,28 +1623,34 @@ startswith({s}, {prefix}) *vim.startswith()* Tests if `s` starts with `prefix`. Parameters: ~ - {s} (string) a string - {prefix} (string) a prefix + {s} (string) String + {prefix} (string) Prefix to match Return: ~ - (boolean) true if `prefix` is a prefix of s + (boolean) `true` if `prefix` is a prefix of `s` tbl_add_reverse_lookup({o}) *vim.tbl_add_reverse_lookup()* Add the reverse lookup values to an existing table. For - example: `tbl_add_reverse_lookup { A = 1 } == { [1] = 'A', A = 1 }` + example: `tbl_add_reverse_lookup { A = 1 } == { [1] = 'A', A = + 1 }` + + Note that this modifies the input. Parameters: ~ - {o} table The table to add the reverse to. + {o} (table) Table to add the reverse to + + Return: ~ + (table) o tbl_contains({t}, {value}) *vim.tbl_contains()* Checks if a list-like (vector) table contains `value`. Parameters: ~ - {t} Table to check - {value} Value to compare + {t} (table) Table to check + {value} any Value to compare Return: ~ - true if `t` contains `value` + (boolean) `true` if `t` contains `value` tbl_count({t}) *vim.tbl_count()* Counts the number of non-nil values in table `t`. @@ -1639,10 +1661,10 @@ tbl_count({t}) *vim.tbl_count()* < Parameters: ~ - {t} Table + {t} (table) Table Return: ~ - Number that is the number of the value in table + (number) Number of non-nil values in table See also: ~ https://github.com/Tieske/Penlight/blob/master/lua/pl/tablex.lua @@ -1651,12 +1673,15 @@ tbl_deep_extend({behavior}, {...}) *vim.tbl_deep_extend()* Merges recursively two or more map-like tables. Parameters: ~ - {behavior} Decides what to do if a key is found in more - than one map: + {behavior} (string) Decides what to do if a key is found + in more than one map: • "error": raise an error • "keep": use value from the leftmost map • "force": use value from the rightmost map - {...} Two or more map-like tables. + {...} (table) Two or more map-like tables + + Return: ~ + (table) Merged table See also: ~ |tbl_extend()| @@ -1665,12 +1690,15 @@ tbl_extend({behavior}, {...}) *vim.tbl_extend()* Merges two or more map-like tables. Parameters: ~ - {behavior} Decides what to do if a key is found in more - than one map: + {behavior} (string) Decides what to do if a key is found + in more than one map: • "error": raise an error • "keep": use value from the leftmost map • "force": use value from the rightmost map - {...} Two or more map-like tables. + {...} (table) Two or more map-like tables + + Return: ~ + (table) Merged table See also: ~ |extend()| @@ -1679,43 +1707,51 @@ tbl_filter({func}, {t}) *vim.tbl_filter()* Filter a table using a predicate function Parameters: ~ - {func} function or callable table - {t} table + {func} function|table Function or callable table + {t} (table) Table + + Return: ~ + (table) Table of filtered values tbl_flatten({t}) *vim.tbl_flatten()* Creates a copy of a list-like table such that any nested tables are "unrolled" and appended to the result. Parameters: ~ - {t} List-like table + {t} (table) List-like table Return: ~ - Flattened copy of the given list-like table. + (table) Flattened copy of the given list-like table See also: ~ From https://github.com/premake/premake-core/blob/master/src/base/table.lua tbl_get({o}, {...}) *vim.tbl_get()* Index into a table (first argument) via string keys passed as - subsequent arguments. Return `nil` if the key does not exist. Examples: > + subsequent arguments. Return `nil` if the key does not exist. + + Examples: > vim.tbl_get({ key = { nested_key = true }}, 'key', 'nested_key') == true vim.tbl_get({ key = {}}, 'key', 'nested_key') == nil < Parameters: ~ - {o} Table to index - {...} Optional strings (0 or more, variadic) via which to - index the table + {o} (table) Table to index + {...} (string) Optional strings (0 or more, variadic) via + which to index the table Return: ~ - nested value indexed by key if it exists, else nil + any Nested value indexed by key (if it exists), else nil tbl_isempty({t}) *vim.tbl_isempty()* Checks if a table is empty. Parameters: ~ - {t} Table to check + {t} (table) Table to check + + Return: ~ + (boolean) `true` if `t` is empty See also: ~ https://github.com/premake/premake-core/blob/master/src/base/table.lua @@ -1729,20 +1765,20 @@ tbl_islist({t}) *vim.tbl_islist()* |vim.fn|. Parameters: ~ - {t} Table + {t} (table) Table Return: ~ - `true` if array-like table, else `false`. + (boolean) `true` if array-like table, else `false` tbl_keys({t}) *vim.tbl_keys()* Return a list of all keys used in a table. However, the order of the return table of keys is not guaranteed. Parameters: ~ - {t} Table + {t} (table) Table Return: ~ - list of keys + (table) List of keys See also: ~ From https://github.com/premake/premake-core/blob/master/src/base/table.lua @@ -1751,28 +1787,32 @@ tbl_map({func}, {t}) *vim.tbl_map()* Apply a function to all values of a table. Parameters: ~ - {func} function or callable table - {t} table + {func} function|table Function or callable table + {t} (table) Table + + Return: ~ + (table) Table of transformed values tbl_values({t}) *vim.tbl_values()* Return a list of all values used in a table. However, the order of the return table of values is not guaranteed. Parameters: ~ - {t} Table + {t} (table) Table Return: ~ - list of values + (table) List of values trim({s}) *vim.trim()* Trim whitespace (Lua pattern "%s") from both sides of a string. Parameters: ~ - {s} String to trim + {s} (string) String to trim Return: ~ - String with whitespace removed from its beginning and end + (string) String with whitespace removed from its beginning + and end See also: ~ https://www.lua.org/pil/20.2.html @@ -1814,7 +1854,7 @@ validate({opt}) *vim.validate()* < Parameters: ~ - {opt} table of parameter names to validations. Each key + {opt} (table) Names of parameters to validate. Each key is a parameter name; each value is a tuple in one of these forms: 1. (arg_value, type_name, optional) @@ -1844,38 +1884,38 @@ uri_from_bufnr({bufnr}) *vim.uri_from_bufnr()* Get a URI from a bufnr Parameters: ~ - {bufnr} number + {bufnr} (number) Return: ~ - string URI + (string) URI uri_from_fname({path}) *vim.uri_from_fname()* Get a URI from a file path. Parameters: ~ - {path} string Path to file + {path} (string) Path to file Return: ~ - string URI + (string) URI uri_to_bufnr({uri}) *vim.uri_to_bufnr()* Get the buffer for a uri. Creates a new unloaded buffer if no buffer for the uri already exists. Parameters: ~ - {uri} string + {uri} (string) Return: ~ - number bufnr + (number) bufnr uri_to_fname({uri}) *vim.uri_to_fname()* Get a filename from a URI Parameters: ~ - {uri} string + {uri} (string) Return: ~ - string filename or unchanged URI for non-file URIs + (string) filename or unchanged URI for non-file URIs ============================================================================== @@ -1892,7 +1932,7 @@ input({opts}, {on_confirm}) *vim.ui.input()* < Parameters: ~ - {opts} table Additional options. See |input()| + {opts} (table) Additional options. See |input()| • prompt (string|nil) Text of the prompt. Defaults to `Input:`. • default (string|nil) Default reply to the @@ -1905,10 +1945,10 @@ input({opts}, {on_confirm}) *vim.ui.input()* |:command-completion| • highlight (function) Function that will be used for highlighting user inputs. - {on_confirm} function ((input|nil) -> ()) Called once the - user confirms or abort the input. `input` is - what the user typed. `nil` if the user - aborted the dialog. + {on_confirm} (function) ((input|nil) -> ()) Called once + the user confirms or abort the input. + `input` is what the user typed. `nil` if the + user aborted the dialog. select({items}, {opts}, {on_choice}) *vim.ui.select()* Prompts the user to pick a single item from a collection of @@ -1931,8 +1971,8 @@ select({items}, {opts}, {on_choice}) *vim.ui.select()* < Parameters: ~ - {items} table Arbitrary items - {opts} table Additional options + {items} (table) Arbitrary items + {opts} (table) Additional options • prompt (string|nil) Text of the prompt. Defaults to `Select one of:` • format_item (function item -> text) @@ -1944,7 +1984,7 @@ select({items}, {opts}, {on_choice}) *vim.ui.select()* use this to infer the structure or semantics of `items`, or the context in which select() was called. - {on_choice} function ((item|nil, idx|nil) -> ()) Called + {on_choice} (function) ((item|nil, idx|nil) -> ()) Called once the user made a choice. `idx` is the 1-based index of `item` within `items`. `nil` if the user aborted the dialog. @@ -2013,16 +2053,16 @@ add({filetypes}) *vim.filetype.add()* < Parameters: ~ - {filetypes} table A table containing new filetype maps + {filetypes} (table) A table containing new filetype maps (see example). match({name}, {bufnr}) *vim.filetype.match()* Set the filetype for the given buffer from a file name. Parameters: ~ - {name} string File name (can be an absolute or relative - path) - {bufnr} number|nil The buffer to set the filetype for. + {name} (string) File name (can be an absolute or + relative path) + {bufnr} (number|nil) The buffer to set the filetype for. Defaults to the current buffer. @@ -2038,7 +2078,7 @@ del({modes}, {lhs}, {opts}) *vim.keymap.del()* < Parameters: ~ - {opts} table A table of optional arguments: + {opts} (table) A table of optional arguments: • buffer: (number or boolean) Remove a mapping from the given buffer. When "true" or 0, use the current buffer. @@ -2082,12 +2122,12 @@ set({mode}, {lhs}, {rhs}, {opts}) *vim.keymap.set()* {mode} string|table Same mode short names as |nvim_set_keymap()|. Can also be list of modes to create mapping on multiple modes. - {lhs} string Left-hand side |{lhs}| of the mapping. + {lhs} (string) Left-hand side |{lhs}| of the mapping. {rhs} string|function Right-hand side |{rhs}| of the mapping. Can also be a Lua function. If a Lua function and `opts.expr == true`, returning `nil` is equivalent to an empty string. - {opts} table A table of |:map-arguments| such as + {opts} (table) A table of |:map-arguments| such as "silent". In addition to the options listed in |nvim_set_keymap()|, this table also accepts the following keys: diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt index 6e100e5854..98da68b76a 100644 --- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -105,7 +105,7 @@ modes. command applies. Use the <buffer> argument to remove buffer-local mappings |:map-<buffer>| - Warning: This also removes the default mappings. + Warning: This also removes the |default-mappings|. :map |mapmode-nvo| :nm[ap] |mapmode-n| @@ -796,9 +796,8 @@ command. For example: > :noremap j k This will exchange the cursor up and down commands. -With the normal :map command, when the 'remap' option is on, mapping takes -place until the text is found not to be a part of a {lhs}. For example, if -you use: > +With the normal :map command mapping takes place until the text is found not +to be a part of a {lhs}. For example, if you use: > :map x y :map y x Vim will replace x with y, and then y with x, etc. When this has happened diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 1109056d47..b49512e1e6 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -841,7 +841,7 @@ A jump table for the options with a short description can be found at |Q_op|. again not rename the file. *'backupdir'* *'bdir'* -'backupdir' 'bdir' string (default ".,$XDG_DATA_HOME/nvim/backup//") +'backupdir' 'bdir' string (default ".,$XDG_STATE_HOME/nvim/backup//") global List of directories for the backup file, separated with commas. - The backup file will be created in the first directory in the list @@ -2063,7 +2063,7 @@ A jump table for the options with a short description can be found at |Q_op|. {char2}. See |digraphs|. *'directory'* *'dir'* -'directory' 'dir' string (default "$XDG_DATA_HOME/nvim/swap//") +'directory' 'dir' string (default "$XDG_STATE_HOME/nvim/swap//") global List of directory names for the swap file, separated with commas. @@ -2452,6 +2452,7 @@ A jump table for the options with a short description can be found at |Q_op|. item default Used for ~ stl:c ' ' or '^' statusline of the current window stlnc:c ' ' or '=' statusline of the non-current windows + wbr:c ' ' window bar horiz:c '─' or '-' horizontal separators |:split| horizup:c '┴' or '-' upwards facing horizontal separator horizdown:c '┬' or '-' downwards facing horizontal separator @@ -2492,6 +2493,7 @@ A jump table for the options with a short description can be found at |Q_op|. item highlight group ~ stl:c StatusLine |hl-StatusLine| stlnc:c StatusLineNC |hl-StatusLineNC| + wbr:c WinBar |hl-WinBar| or |hl-WinBarNC| horiz:c WinSeparator |hl-WinSeparator| horizup:c WinSeparator |hl-WinSeparator| horizdown:c WinSeparator |hl-WinSeparator| @@ -3502,7 +3504,7 @@ A jump table for the options with a short description can be found at |Q_op|. option. For '@' only characters up to 255 are used. Careful: If you change this option, it might break expanding environment variables. E.g., when '/' is included and Vim tries to - expand "$HOME/.local/share/nvim/shada/main.shada". Maybe you should + expand "$HOME/.local/state/nvim/shada/main.shada". Maybe you should change 'iskeyword' instead. *'iskeyword'* *'isk'* @@ -4798,15 +4800,6 @@ A jump table for the options with a short description can be found at |Q_op|. 'number', see |number_relativenumber| for all combinations of the two options. - *'remap'* *'noremap'* -'remap' boolean (default on) - global - Allows for mappings to work recursively. If you do not want this for - a single entry, use the :noremap[!] command. - NOTE: To avoid portability problems with Vim scripts, always keep - this option at the default "on". Only switch it off when working with - old Vi scripts. - *'report'* 'report' number (default 2) global @@ -4942,9 +4935,12 @@ A jump table for the options with a short description can be found at |Q_op|. but are not part of the Nvim distribution. XDG_DATA_DIRS defaults to /usr/local/share/:/usr/share/, so system administrators are expected to install site plugins to /usr/share/nvim/site. - 5. $VIMRUNTIME, for files distributed with Neovim. + 5. Applications state home directory, for files that contain your + session state (eg. backupdir, viewdir, undodir, etc). + Given by `stdpath("state")`. |$XDG_STATE_HOME| + 6. $VIMRUNTIME, for files distributed with Neovim. *after-directory* - 6, 7, 8, 9. In after/ subdirectories of 1, 2, 3 and 4, with reverse + 7, 8, 9, 10. In after/ subdirectories of 1, 2, 3 and 4, with reverse ordering. This is for preferences to overrule or add to the distributed defaults or system-wide settings (rarely needed). @@ -6475,13 +6471,6 @@ A jump table for the options with a short description can be found at |Q_op|. C1 Control characters 0x80...0x9F - *'terse'* *'noterse'* -'terse' boolean (default off) - global - When set: Add 's' flag to 'shortmess' option (this makes the message - for a search that hits the start or end of the file not being - displayed). When reset: Remove 's' flag from 'shortmess' option. - *'textwidth'* *'tw'* 'textwidth' 'tw' number (default 0) local to buffer @@ -6623,7 +6612,7 @@ A jump table for the options with a short description can be found at |Q_op|. 'ttyfast' 'tf' Removed. |vim-differences| *'undodir'* *'udir'* *E5003* -'undodir' 'udir' string (default "$XDG_DATA_HOME/nvim/undo//") +'undodir' 'udir' string (default "$XDG_STATE_HOME/nvim/undo//") global List of directory names for undo files, separated with commas. See 'backupdir' for details of the format. @@ -6786,7 +6775,7 @@ A jump table for the options with a short description can be found at |Q_op|. displayed when 'verbosefile' is set. *'viewdir'* *'vdir'* -'viewdir' 'vdir' string (default: "$XDG_DATA_HOME/nvim/view//") +'viewdir' 'vdir' string (default: "$XDG_STATE_HOME/nvim/view//") global Name of the directory where to store files for |:mkview|. This option cannot be set from a |modeline| or in the |sandbox|, for @@ -7042,6 +7031,19 @@ A jump table for the options with a short description can be found at |Q_op|. key is never used for the menu. This option is not used for <F10>; on Win32. + *'winbar'* *'wbr'* +'winbar' 'wbr' string (default empty) + global or local to window |global-local| + When non-empty, this option enables the window bar and determines its + contents. The window bar is a bar that's shown at the top of every + window with it enabled. The value of 'winbar' is evaluated like with + 'statusline'. + + When changing something that is used in 'winbar' that does not trigger + it to be updated, use |:redrawstatus|. + + This option cannot be set in a modeline when 'modelineexpr' is off. + *'winblend'* *'winbl'* 'winblend' 'winbl' number (default 0) local to window diff --git a/runtime/doc/pattern.txt b/runtime/doc/pattern.txt index 35f5b311ff..371a210847 100644 --- a/runtime/doc/pattern.txt +++ b/runtime/doc/pattern.txt @@ -71,12 +71,18 @@ N Repeat the latest "/" or "?" [count] times in Only whole keywords are searched for, like with the command "/\<keyword\>". |exclusive| 'ignorecase' is used, 'smartcase' is not. + *v_star-default* + In Visual mode, search forward for the current selection. + |default-mappings| *#* # Same as "*", but search backward. The pound sign (character 163) also works. If the "#" key works as backspace, try using "stty erase <BS>" before starting Vim (<BS> is CTRL-H or a real backspace). + *v_#-default* + In Visual mode, search backward for the current selection. + |default-mappings| *gstar* g* Like "*", but don't put "\<" and "\>" around the word. diff --git a/runtime/doc/quickref.txt b/runtime/doc/quickref.txt index 961d734bfe..ff7e2ab400 100644 --- a/runtime/doc/quickref.txt +++ b/runtime/doc/quickref.txt @@ -824,7 +824,6 @@ Short explanation of each option: *option-list* 'redrawtime' 'rdt' timeout for 'hlsearch' and |:match| highlighting 'regexpengine' 're' default regexp engine to use 'relativenumber' 'rnu' show relative line number in front of each line -'remap' allow mappings to work recursively 'report' threshold for reporting nr. of lines changed 'revins' 'ri' inserting characters will work backwards 'rightleft' 'rl' window is right-to-left oriented @@ -896,7 +895,6 @@ Short explanation of each option: *option-list* 'tagstack' 'tgst' push tags onto the tag stack 'term' name of the terminal 'termbidi' 'tbidi' terminal takes care of bi-directionality -'terse' shorten some messages 'textwidth' 'tw' maximum width of text that is being inserted 'thesaurus' 'tsr' list of thesaurus files for keyword completion 'thesaurusfunc' 'tsrfu' function to be used for thesaurus completion diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt index 1d3fa6c2ca..f542f33451 100644 --- a/runtime/doc/starting.txt +++ b/runtime/doc/starting.txt @@ -367,7 +367,7 @@ argument. *--headless* --headless Start without UI, and do not wait for `nvim_ui_attach`. The builtin TUI is not used, so stdio works as an arbitrary - communication channel. |channel-stdio| + communication channel. |channel-stdio| Also useful for scripting (tests) to see messages that would not be printed by |-es|. @@ -584,7 +584,7 @@ setting can affect the entire editor in ways that are not initially obvious. To find the cause of a problem in your config, you must "bisect" it: 1. Remove or disable half of your |config|. 2. Restart Nvim. -3. If the problem still occurs, goto 1. +3. If the problem still occurs, goto 1. 4. If the problem is gone, restore half of the removed lines. 5. Continue narrowing your config in this way, until you find the setting or plugin causing the issue. @@ -701,7 +701,7 @@ vimrc file. These commands will write ":map" and ":set" commands to a file, in such a way that when these commands are executed, the current key mappings and options will be set to the same values. The options 'columns', 'endofline', -'fileformat', 'lines', 'modified', and 'scroll' are not included, because +'fileformat', 'lines', 'modified', and 'scroll' are not included, because these are terminal or file dependent. Note that the options 'binary', 'paste' and 'readonly' are included, this might not always be what you want. @@ -718,7 +718,7 @@ with ":map" and ":set" commands and write the modified file. First read the default vimrc in with a command like ":source ~piet/.vimrc.Cprogs", change the settings and then save them in the current directory with ":mkvimrc!". If you want to make this file your default |config|, move it to -$XDG_CONFIG_HOME/nvim. You could also use autocommands |autocommand| and/or +$XDG_CONFIG_HOME/nvim. You could also use autocommands |autocommand| and/or modelines |modeline|. *vimrc-option-example* @@ -886,7 +886,7 @@ Shada ("shared data") file *shada* *shada-file* If you exit Vim and later start it again, you would normally lose a lot of information. The ShaDa file can be used to remember that information, which -enables you to continue where you left off. Its name is the abbreviation of +enables you to continue where you left off. Its name is the abbreviation of SHAred DAta because it is used for sharing data between Neovim sessions. This is introduced in section |21.3| of the user manual. @@ -917,9 +917,9 @@ The |v:oldfiles| variable is filled. The marks are not read in at startup option upon startup. *shada-write* -When Vim exits and 'shada' is non-empty, the info is stored in the ShaDa file -(it's actually merged with the existing one, if one exists |shada-merging|). -The 'shada' option is a string containing information about what info should +When Vim exits and 'shada' is non-empty, the info is stored in the ShaDa file +(it's actually merged with the existing one, if one exists |shada-merging|). +The 'shada' option is a string containing information about what info should be stored, and contains limits on how much should be stored (see 'shada'). Notes for Unix: @@ -977,75 +977,75 @@ remembered. MERGING *shada-merging* -When writing ShaDa files with |:wshada| without bang or at regular exit -information in the existing ShaDa file is merged with information from current -Neovim instance. For this purpose ShaDa files store timestamps associated +When writing ShaDa files with |:wshada| without bang or at regular exit +information in the existing ShaDa file is merged with information from current +Neovim instance. For this purpose ShaDa files store timestamps associated with ShaDa entries. Specifically the following is being done: -1. History lines are merged, ordered by timestamp. Maximum amount of items in - ShaDa file is defined by 'shada' option (|shada-/|, |shada-:|, |shada-@|, - etc: one suboption for each character that represents history name +1. History lines are merged, ordered by timestamp. Maximum amount of items in + ShaDa file is defined by 'shada' option (|shada-/|, |shada-:|, |shada-@|, + etc: one suboption for each character that represents history name (|:history|)). -2. Local marks and changes for files that were not opened by Neovim are copied - to new ShaDa file. Marks for files that were opened by Neovim are merged, +2. Local marks and changes for files that were not opened by Neovim are copied + to new ShaDa file. Marks for files that were opened by Neovim are merged, changes to files opened by Neovim are ignored. |shada-'| -3. Jump list is merged: jumps are ordered by timestamp, identical jumps +3. Jump list is merged: jumps are ordered by timestamp, identical jumps (identical position AND timestamp) are squashed. -4. Search patterns and substitute strings are not merged: search pattern or - substitute string which has greatest timestamp will be the only one copied +4. Search patterns and substitute strings are not merged: search pattern or + substitute string which has greatest timestamp will be the only one copied to ShaDa file. -5. For each register entity with greatest timestamp is the only saved. +5. For each register entity with greatest timestamp is the only saved. |shada-<| -6. All saved variables are saved from current Neovim instance. Additionally - existing variable values are copied, meaning that the only way to remove - variable from a ShaDa file is either removing it by hand or disabling +6. All saved variables are saved from current Neovim instance. Additionally + existing variable values are copied, meaning that the only way to remove + variable from a ShaDa file is either removing it by hand or disabling writing variables completely. |shada-!| 7. For each global mark entity with greatest timestamp is the only saved. -8. Buffer list and header are the only entries which are not merged in any - fashion: the only header and buffer list present are the ones from the +8. Buffer list and header are the only entries which are not merged in any + fashion: the only header and buffer list present are the ones from the Neovim instance which was last writing the file. |shada-%| COMPATIBILITY *shada-compatibility* ShaDa files are forward and backward compatible. This means that -1. Entries which have unknown type (i.e. that hold unidentified data) are +1. Entries which have unknown type (i.e. that hold unidentified data) are ignored when reading and blindly copied when writing. -2. Register entries with unknown register name are ignored when reading and - blindly copied when writing. Limitation: only registers that use name with +2. Register entries with unknown register name are ignored when reading and + blindly copied when writing. Limitation: only registers that use name with code in interval [1, 255] are supported. |registers| -3. Register entries with unknown register type are ignored when reading and +3. Register entries with unknown register type are ignored when reading and merged as usual when writing. |getregtype()| -4. Local and global mark entries with unknown mark names are ignored when - reading. When writing global mark entries are blindly copied and local mark - entries are also blindly copied, but only if file they are attached to fits - in the |shada-'| limit. Unknown local mark entry's timestamp is also taken - into account when calculating which files exactly should fit into this - limit. Limitation: only marks that use name with code in interval [1, 255] +4. Local and global mark entries with unknown mark names are ignored when + reading. When writing global mark entries are blindly copied and local mark + entries are also blindly copied, but only if file they are attached to fits + in the |shada-'| limit. Unknown local mark entry's timestamp is also taken + into account when calculating which files exactly should fit into this + limit. Limitation: only marks that use name with code in interval [1, 255] are supported. |mark-motions| -5. History entries with unknown history type are ignored when reading and - blindly copied when writing. Limitation: there can be only up to 256 +5. History entries with unknown history type are ignored when reading and + blindly copied when writing. Limitation: there can be only up to 256 history types. |history| -6. Unknown keys found in register, local mark, global mark, change, jump and - search pattern entries are saved internally and dumped when writing. +6. Unknown keys found in register, local mark, global mark, change, jump and + search pattern entries are saved internally and dumped when writing. Entries created during Neovim session never have such additions. -7. Additional elements found in replacement string and history entries are - saved internally and dumped. Entries created during Neovim session never +7. Additional elements found in replacement string and history entries are + saved internally and dumped. Entries created during Neovim session never have such additions. -8. Additional elements found in variable entries are simply ignored when - reading. When writing new variables they will be preserved during merging, - but that's all. Variable values dumped from current Neovim session never - have additional elements, even if variables themselves were obtained by +8. Additional elements found in variable entries are simply ignored when + reading. When writing new variables they will be preserved during merging, + but that's all. Variable values dumped from current Neovim session never + have additional elements, even if variables themselves were obtained by reading ShaDa files. -"Blindly" here means that there will be no attempts to somehow merge them, +"Blindly" here means that there will be no attempts to somehow merge them, even if other entries (with known name/type/etc) are merged. |shada-merging| SHADA FILE NAME *shada-file-name* - Default name of the |shada| file is: - Unix: "$XDG_DATA_HOME/nvim/shada/main.shada" - Windows: "$XDG_DATA_HOME/nvim-data/shada/main.shada" + Unix: "$XDG_STATE_HOME/nvim/shada/main.shada" + Windows: "$XDG_STATE_HOME/nvim-data/shada/main.shada" See also |base-directories|. - To choose a different file name you can use: - The "n" flag in the 'shada' option. @@ -1067,55 +1067,55 @@ however that this means everything will be overwritten with information from the first Vim, including the command line history, etc. The ShaDa file itself can be edited by hand too, although we suggest you -start with an existing one to get the format right. You need to understand -MessagePack (or, more likely, find software that is able to use it) format to -do this. This can be useful in order to create a second file, say -"~/.my.shada" which could contain certain settings that you always want when -you first start Neovim. For example, you can preload registers with -particular data, or put certain commands in the command line history. A line +start with an existing one to get the format right. You need to understand +MessagePack (or, more likely, find software that is able to use it) format to +do this. This can be useful in order to create a second file, say +"~/.my.shada" which could contain certain settings that you always want when +you first start Neovim. For example, you can preload registers with +particular data, or put certain commands in the command line history. A line in your |config| file like > :rshada! ~/.my.shada -can be used to load this information. You could even have different ShaDa -files for different types of files (e.g., C code) and load them based on the -file name, using the ":autocmd" command (see |:autocmd|). More information on +can be used to load this information. You could even have different ShaDa +files for different types of files (e.g., C code) and load them based on the +file name, using the ":autocmd" command (see |:autocmd|). More information on ShaDa file format is contained in |shada-format| section. *E136* *E929* *shada-error-handling* -Some errors make Neovim leave temporary file named `{basename}.tmp.X` (X is -any free letter from `a` to `z`) while normally it will create this file, -write to it and then rename `{basename}.tmp.X` to `{basename}`. Such errors +Some errors make Neovim leave temporary file named `{basename}.tmp.X` (X is +any free letter from `a` to `z`) while normally it will create this file, +write to it and then rename `{basename}.tmp.X` to `{basename}`. Such errors include: -- Errors which make Neovim think that read file is not a ShaDa file at all: - non-ShaDa files are not overwritten for safety reasons to avoid accidentally - destroying an unrelated file. This could happen e.g. when typing "nvim -i - file" in place of "nvim -R file" (yes, somebody did that at least with Vim). +- Errors which make Neovim think that read file is not a ShaDa file at all: + non-ShaDa files are not overwritten for safety reasons to avoid accidentally + destroying an unrelated file. This could happen e.g. when typing "nvim -i + file" in place of "nvim -R file" (yes, somebody did that at least with Vim). Such errors are listed at |shada-critical-contents-errors|. -- If writing to the temporary file failed: e.g. because of the insufficient +- If writing to the temporary file failed: e.g. because of the insufficient space left. - If renaming file failed: e.g. because of insufficient permissions. -- If target ShaDa file has different from the Neovim instance's owners (user - and group) and changing them failed. Unix-specific, applies only when +- If target ShaDa file has different from the Neovim instance's owners (user + and group) and changing them failed. Unix-specific, applies only when Neovim was launched from root. -Do not forget to remove the temporary file or replace the target file with -temporary one after getting one of the above errors or all attempts to create -a ShaDa file may fail with |E929|. If you got one of them when using -|:wshada| (and not when exiting Neovim: i.e. when you have Neovim session +Do not forget to remove the temporary file or replace the target file with +temporary one after getting one of the above errors or all attempts to create +a ShaDa file may fail with |E929|. If you got one of them when using +|:wshada| (and not when exiting Neovim: i.e. when you have Neovim session running) you have additional options: -- First thing which you should consider if you got any error, except failure - to write to the temporary file: remove existing file and replace it with the +- First thing which you should consider if you got any error, except failure + to write to the temporary file: remove existing file and replace it with the temporary file. Do it even if you have running Neovim instance. -- Fix the permissions and/or file ownership, free some space and attempt to +- Fix the permissions and/or file ownership, free some space and attempt to write again. Do not remove the existing file. -- Use |:wshada| with bang. Does not help in case of permission error. If - target file was actually the ShaDa file some information may be lost in this - case. To make the matters slightly better use |:rshada| prior to writing, - but this still will loose buffer-local marks and change list entries for any +- Use |:wshada| with bang. Does not help in case of permission error. If + target file was actually the ShaDa file some information may be lost in this + case. To make the matters slightly better use |:rshada| prior to writing, + but this still will loose buffer-local marks and change list entries for any file which is not opened in the current Neovim instance. -- Remove the target file from shell and use |:wshada|. Consequences are not - different from using |:wshada| with bang, but "rm -f" works in some cases +- Remove the target file from shell and use |:wshada|. Consequences are not + different from using |:wshada| with bang, but "rm -f" works in some cases when you don't have write permissions. *:rsh* *:rshada* *E886* @@ -1129,13 +1129,13 @@ running) you have additional options: The information in the file is first read in to make a merge between old and new info. When [!] is used, the old information is not read first, only the - internal info is written (also disables safety checks - described in |shada-error-handling|). If 'shada' is + internal info is written (also disables safety checks + described in |shada-error-handling|). If 'shada' is empty, marks for up to 100 files will be written. - When you get error "E929: All .tmp.X files exist, - cannot write ShaDa file!" check that no old temp files - were left behind (e.g. - ~/.local/share/nvim/shada/main.shada.tmp*). + When you get error "E929: All .tmp.X files exist, + cannot write ShaDa file!" check that no old temp files + were left behind (e.g. + ~/.local/state/nvim/shada/main.shada.tmp*). Note: Executing :wshada will reset all |'quote| marks. @@ -1158,82 +1158,82 @@ running) you have additional options: SHADA FILE FORMAT *shada-format* -ShaDa files are concats of MessagePack entries. Each entry is a concat of +ShaDa files are concats of MessagePack entries. Each entry is a concat of exactly four MessagePack objects: -1. First goes type of the entry. Object type must be an unsigned integer. +1. First goes type of the entry. Object type must be an unsigned integer. Object type must not be equal to zero. 2. Second goes entry timestamp. It must also be an unsigned integer. -3. Third goes the length of the fourth entry. Unsigned integer as well, used +3. Third goes the length of the fourth entry. Unsigned integer as well, used for fast skipping without parsing. -4. Fourth is actual entry data. All currently used ShaDa entries use - containers to hold data: either map or array. All string values in those - containers are either binary (applies to filenames) or UTF-8, yet parser +4. Fourth is actual entry data. All currently used ShaDa entries use + containers to hold data: either map or array. All string values in those + containers are either binary (applies to filenames) or UTF-8, yet parser needs to expect that invalid bytes may be present in a UTF-8 string. Exact format depends on the entry type: Entry type (name) Entry data ~ - 1 (Header) Map containing data that describes the generator - instance that wrote this ShaDa file. It is ignored + 1 (Header) Map containing data that describes the generator + instance that wrote this ShaDa file. It is ignored when reading ShaDa files. Contains the following data: Key Data ~ - generator Binary, software used to generate ShaDa - file. Is equal to "nvim" when ShaDa file was + generator Binary, software used to generate ShaDa + file. Is equal to "nvim" when ShaDa file was written by Neovim. version Binary, generator version. encoding Binary, effective 'encoding' value. max_kbyte Integer, effective |shada-s| limit value. pid Integer, instance process ID. - * It is allowed to have any number of + * It is allowed to have any number of additional keys with any data. - 2 (SearchPattern) Map containing data describing last used search or - substitute pattern. Normally ShaDa file contains two - such entries: one with "ss" key set to true (describes - substitute pattern, see |:substitute|), and one set to - false (describes search pattern, see - |search-commands|). "su" key should be true on one of - the entries. If key value is equal to default then it + 2 (SearchPattern) Map containing data describing last used search or + substitute pattern. Normally ShaDa file contains two + such entries: one with "ss" key set to true (describes + substitute pattern, see |:substitute|), and one set to + false (describes search pattern, see + |search-commands|). "su" key should be true on one of + the entries. If key value is equal to default then it is normally not present. Keys: Key Type Default Description ~ sm Boolean true Effective 'magic' value. sc Boolean false Effective 'smartcase' value. - sl Boolean true True if search pattern comes - with a line offset. See + sl Boolean true True if search pattern comes + with a line offset. See |search-offset|. - se Boolean false True if |search-offset| - requested to place cursor at - (relative to) the end of the + se Boolean false True if |search-offset| + requested to place cursor at + (relative to) the end of the pattern. so Integer 0 Offset value. |search-offset| - su Boolean false True if current entry was the + su Boolean false True if current entry was the last used search pattern. - ss Boolean false True if current entry describes + ss Boolean false True if current entry describes |:substitute| pattern. sh Boolean false True if |v:hlsearch| is on. - With |shada-h| or 'nohlsearch' + With |shada-h| or 'nohlsearch' this key is always false. sp Binary N/A Actual pattern. Required. - sb Boolean false True if search direction is + sb Boolean false True if search direction is backward. - * any none Other keys are allowed for - compatibility reasons, see + * any none Other keys are allowed for + compatibility reasons, see |shada-compatibility|. - 3 (SubString) Array containing last |:substitute| replacement string. - Contains single entry: binary, replacement string used. - More entries are allowed for compatibility reasons, see + 3 (SubString) Array containing last |:substitute| replacement string. + Contains single entry: binary, replacement string used. + More entries are allowed for compatibility reasons, see |shada-compatibility|. - 4 (HistoryEntry) Array containing one entry from history. Should have - two or three entries. First one is history type - (unsigned integer), second is history line (binary), - third is the separator character (unsigned integer, - must be in interval [0, 255]). Third item is only - valid for search history. Possible history types are - listed in |hist-names|, here are the corresponding - numbers: 0 - cmd, 1 - search, 2 - expr, 3 - input, + 4 (HistoryEntry) Array containing one entry from history. Should have + two or three entries. First one is history type + (unsigned integer), second is history line (binary), + third is the separator character (unsigned integer, + must be in interval [0, 255]). Third item is only + valid for search history. Possible history types are + listed in |hist-names|, here are the corresponding + numbers: 0 - cmd, 1 - search, 2 - expr, 3 - input, 4 - debug. - 5 (Register) Map describing one register (|registers|). If key - value is equal to default then it is normally not + 5 (Register) Map describing one register (|registers|). If key + value is equal to default then it is normally not present. Keys: Key Type Def Description ~ rt UInteger 0 Register type: @@ -1261,12 +1261,12 @@ exactly four MessagePack objects: * any none Other keys are allowed for compatibility reasons, see |shada-compatibility|. - 6 (Variable) Array containing two items: variable name (binary) and - variable value (any object). Values are converted - using the same code |msgpackparse()| uses when reading, - |msgpackdump()| when writing, so there may appear - |msgpack-special-dict|s. If there are more then two - entries then the rest are ignored + 6 (Variable) Array containing two items: variable name (binary) and + variable value (any object). Values are converted + using the same code |msgpackparse()| uses when reading, + |msgpackdump()| when writing, so there may appear + |msgpack-special-dict|s. If there are more then two + entries then the rest are ignored (|shada-compatibility|). 7 (GlobalMark) 8 (Jump) @@ -1280,57 +1280,57 @@ exactly four MessagePack objects: Data contained in the map: Key Type Default Description ~ - l UInteger 1 Position line number. Must be + l UInteger 1 Position line number. Must be greater then zero. c UInteger 0 Position column number. - n UInteger 34 ('"') Mark name. Only valid for - GlobalMark and LocalMark + n UInteger 34 ('"') Mark name. Only valid for + GlobalMark and LocalMark entries. f Binary N/A File name. Required. - * any none Other keys are allowed for - compatibility reasons, see + * any none Other keys are allowed for + compatibility reasons, see |shada-compatibility|. - 9 (BufferList) Array containing maps. Each map in the array + 9 (BufferList) Array containing maps. Each map in the array represents one buffer. Possible keys: Key Type Default Description ~ - l UInteger 1 Position line number. Must be + l UInteger 1 Position line number. Must be greater then zero. c UInteger 0 Position column number. f Binary N/A File name. Required. - * any none Other keys are allowed for - compatibility reasons, see + * any none Other keys are allowed for + compatibility reasons, see |shada-compatibility|. - * (Unknown) Any other entry type is allowed for compatibility + * (Unknown) Any other entry type is allowed for compatibility reasons, see |shada-compatibility|. *E575* *E576* -Errors in ShaDa file may have two types: E575 used for all “logical” errors -and E576 used for all “critical” errors. Critical errors trigger behaviour -described in |shada-error-handling| when writing and skipping the rest of the +Errors in ShaDa file may have two types: E575 used for all “logical” errors +and E576 used for all “critical” errors. Critical errors trigger behaviour +described in |shada-error-handling| when writing and skipping the rest of the file when reading and include: *shada-critical-contents-errors* - Any of first three MessagePack objects being not an unsigned integer. -- Third object requesting amount of bytes greater then bytes left in the ShaDa +- Third object requesting amount of bytes greater then bytes left in the ShaDa file. - Entry with zero type. I.e. first object being equal to zero. - MessagePack parser failing to parse the entry data. -- MessagePack parser consuming less or requesting greater bytes then described - in the third object for parsing fourth object. I.e. when fourth object - either contains more then one MessagePack object or it does not contain +- MessagePack parser consuming less or requesting greater bytes then described + in the third object for parsing fourth object. I.e. when fourth object + either contains more then one MessagePack object or it does not contain complete MessagePack object. ============================================================================== Standard Paths *standard-path* -Nvim stores configuration, data, and logs in standard locations. Plugins are -strongly encouraged to follow this pattern also. Use |stdpath()| to get the +Nvim stores configuration, data, and logs in standard locations. Plugins are +strongly encouraged to follow this pattern also. Use |stdpath()| to get the paths. *base-directories* *xdg* The "base" (root) directories conform to the XDG Base Directory Specification. https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html -The $XDG_CONFIG_HOME and $XDG_DATA_HOME environment variables are used if they -exist, otherwise default values (listed below) are used. +The $XDG_CONFIG_HOME, $XDG_DATA_HOME and $XDG_STATE_HOME environment variables +are used if they exist, otherwise default values (listed below) are used. CONFIG DIRECTORY (DEFAULT) ~ *$XDG_CONFIG_HOME* Nvim: stdpath("config") @@ -1342,6 +1342,11 @@ DATA DIRECTORY (DEFAULT) ~ Unix: ~/.local/share ~/.local/share/nvim Windows: ~/AppData/Local ~/AppData/Local/nvim-data +STATE DIRECTORY (DEFAULT) ~ + *$XDG_STATE_HOME* Nvim: stdpath("state") + Unix: ~/.local/state ~/.local/state/nvim + Windows: ~/AppData/Local ~/AppData/Local/nvim-data + Note: Throughout the user manual these defaults are used as placeholders, e.g. "~/.config" is understood to mean "$XDG_CONFIG_HOME or ~/.config". @@ -1349,7 +1354,7 @@ LOG FILE *$NVIM_LOG_FILE* Besides 'debug' and 'verbose', Nvim keeps a general log file for internal debugging, plugins and RPC clients. > :echo $NVIM_LOG_FILE -By default, the file is located at stdpath('cache')/log unless that path +By default, the file is located at stdpath('log')/log unless that path is inaccessible or if $NVIM_LOG_FILE was set before |startup|. diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index 2a78d975ee..c3ad704bb7 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -453,7 +453,7 @@ your own highlight colors for the progress bar. Example: > hi TOhtmlProgress guifg=#c0ffee ctermbg=7 < *g:html_number_lines* -Default: current 'number' setting. +Default: Current 'number' setting. When 0, buffer text is displayed in the generated HTML without line numbering. When 1, a column of line numbers is added to the generated HTML with the same highlighting as the line number column in Vim (|hl-LineNr|). @@ -542,7 +542,7 @@ folded text will open the fold as if |g:html_hover_unfold| were set. :let g:html_no_foldcolumn = 1 < *TOhtml-uncopyable-text* *g:html_prevent_copy* -Default: empty string. +Default: Empty string. This option prevents certain regions of the generated HTML from being copied, when you select all text in document rendered in a browser and copy it. Useful for allowing users to copy-paste only the source text even if a fold column or @@ -568,7 +568,7 @@ uncopyable regions. In some browsers, especially older browsers, after selecting an entire page and copying the selection, the <input> tags are not pasted with the page text. If |g:html_no_invalid| is 0, the <input> tags have invalid type; this works in more browsers, but the page will not validate. -Note: this method does NOT work in recent versions of Chrome and equivalent +Note: This method does NOT work in recent versions of Chrome and equivalent browsers; the <input> tags get pasted with the text. When "fallback" (default value), the same <input> elements are generated for @@ -624,12 +624,12 @@ To append a string "_mystring" to the end of each ID: > :let g:html_id_expr = '"_mystring"' < -Note, when converting a diff view to HTML, the expression will only be +Note: When converting a diff view to HTML, the expression will only be evaluated for the first window in the diff, and the result used for all the windows. *TOhtml-wrap-text* *g:html_pre_wrap* -Default: current 'wrap' setting. +Default: Current 'wrap' setting. When 0, if |g:html_no_pre| is 0 or unset, the text in the generated HTML does not wrap at the edge of the browser window. When 1, if |g:html_use_css| is 1, the CSS 2.0 "white-space:pre-wrap" value is @@ -689,7 +689,7 @@ wide browser support. However, you can override this to support specific encodings that may not be automatically detected by default (see options below). See http://www.iana.org/assignments/character-sets for the IANA names. -Note, by default all Unicode encodings are converted to UTF-8 with no BOM in +Note: By default all Unicode encodings are converted to UTF-8 with no BOM in the generated HTML, as recommended by W3C: http://www.w3.org/International/questions/qa-choosing-encodings @@ -1293,8 +1293,8 @@ the global or buffer-local variable load_doxygen_syntax. This is done by adding the following to your vimrc. > :let g:load_doxygen_syntax=1 -There are a couple of variables that have an effect on syntax highlighting, and -are to do with non-standard highlighting options. +There are a couple of variables that have an effect on syntax highlighting, +and are to do with non-standard highlighting options. Variable Default Effect ~ g:doxygen_enhanced_color @@ -1436,8 +1436,8 @@ To enable highlighting some special atoms, put this in your vimrc: > ELIXIR *elixir.vim* *ft-elixir-syntax* -Elixir is a dynamic, functional language for building scalable and maintainable -applications. +Elixir is a dynamic, functional language for building scalable and +maintainable applications. The following file extensions are auto-detected as Elixir file types: @@ -1453,7 +1453,7 @@ Elixir. FLEXWIKI *flexwiki.vim* *ft-flexwiki-syntax* FlexWiki is an ASP.NET-based wiki package available at http://www.flexwiki.com -NOTE: this site currently doesn't work, on Wikipedia is mentioned that +NOTE: This site currently doesn't work, on Wikipedia is mentioned that development stopped in 2009. Syntax highlighting is available for the most common elements of FlexWiki @@ -1533,8 +1533,8 @@ syntax highlighting will not be correct if the form is incorrectly set. When you create a new fortran file, the syntax script assumes fixed source form. If you always use free source form, then > :let fortran_free_source=1 -in your vimrc prior to the :syntax on command. If you always use fixed source -form, then > +in your vimrc prior to the :syntax on command. If you always use fixed +source form, then > :let fortran_fixed_source=1 in your vimrc prior to the :syntax on command. @@ -1807,8 +1807,8 @@ ends with -->) you can define > JavaScript and Visual Basic embedded inside HTML documents are highlighted as 'Special' with statements, comments, strings and so on colored as in standard -programming languages. Note that only JavaScript and Visual Basic are currently -supported, no other scripting language has been added yet. +programming languages. Note that only JavaScript and Visual Basic are +currently supported, no other scripting language has been added yet. Embedded and inlined cascading style sheets (CSS) are highlighted too. @@ -1912,8 +1912,8 @@ The java.vim syntax highlighting file offers several options: In Java 1.0.2 it was never possible to have braces inside parens, so this was flagged as an error. Since Java 1.1 this is possible (with anonymous -classes), and therefore is no longer marked as an error. If you prefer the old -way, put the following line into your vim startup file: > +classes), and therefore is no longer marked as an error. If you prefer the +old way, put the following line into your vim startup file: > :let java_mark_braces_in_parens_as_errors=1 All identifiers in java.lang.* are always visible in all classes. To @@ -2031,10 +2031,10 @@ LISP *lisp.vim* *ft-lisp-syntax* The lisp syntax highlighting provides two options: > - g:lisp_instring : if it exists, then "(...)" strings are highlighted + g:lisp_instring : If it exists, then "(...)" strings are highlighted as if the contents of the string were lisp. Useful for AutoLisp. - g:lisp_rainbow : if it exists and is nonzero, then differing levels + g:lisp_rainbow : If it exists and is nonzero, then differing levels of parenthesization will receive different highlighting. < @@ -2440,8 +2440,8 @@ If you do not want complex things like '@{${"foo"}}' to be parsed: > (In Vim 6.x it was the other way around: "perl_extended_vars" enabled it.) -The coloring strings can be changed. By default strings and qq friends will be -highlighted like the first line. If you set the variable +The coloring strings can be changed. By default strings and qq friends will +be highlighted like the first line. If you set the variable perl_string_as_statement, it will be highlighted as in the second line. "hello world!"; qq|hello world|; @@ -2453,8 +2453,8 @@ perl_string_as_statement, it will be highlighted as in the second line. The syncing has 3 options. The first two switch off some triggering of synchronization and should only be needed in case it fails to work properly. If while scrolling all of a sudden the whole screen changes color completely -then you should try and switch off one of those. Let me know if you can figure -out the line that causes the mistake. +then you should try and switch off one of those. Let me know if you can +figure out the line that causes the mistake. One triggers on "^\s*sub\s*" and the other on "^[$@%]" more or less. > @@ -2491,7 +2491,7 @@ behavior, set 'perl_nofold_packages': > PHP3 and PHP4 *php.vim* *php3.vim* *ft-php-syntax* *ft-php3-syntax* -[note: previously this was called "php3", but since it now also supports php4 +[Note: Previously this was called "php3", but since it now also supports php4 it has been renamed to "php"] There are the following options for the php syntax highlighting. @@ -2561,15 +2561,15 @@ PPWizard is a preprocessor for HTML and OS/2 INF files This syntax file has the options: -- ppwiz_highlight_defs : determines highlighting mode for PPWizard's +- ppwiz_highlight_defs : Determines highlighting mode for PPWizard's definitions. Possible values are ppwiz_highlight_defs = 1 : PPWizard #define statements retain the - colors of their contents (e.g. PPWizard macros and variables) + colors of their contents (e.g. PPWizard macros and variables). - ppwiz_highlight_defs = 2 : preprocessor #define and #evaluate + ppwiz_highlight_defs = 2 : Preprocessor #define and #evaluate statements are shown in a single color with the exception of line - continuation symbols + continuation symbols. The default setting for ppwiz_highlight_defs is 1. @@ -2608,7 +2608,7 @@ highlighted by defining the postscr_level variable as follows: > If this variable is not defined it defaults to 2 (level 2) since this is the most prevalent version currently. -Note, not all PS interpreters will support all language features for a +Note: Not all PS interpreters will support all language features for a particular language level. In particular the %!PS-Adobe-3.0 at the start of PS files does NOT mean the PostScript present is level 3 PostScript! @@ -2710,7 +2710,7 @@ If you want all possible Python highlighting (the same as setting the preceding last option and unsetting all other ones): > :let python_highlight_all = 1 -Note: only existence of these options matter, not their value. You can replace +Note: Only existence of these options matter, not their value. You can replace 1 above with anything. QUAKE *quake.vim* *ft-quake-syntax* @@ -3150,16 +3150,16 @@ The Speedup syntax file has some options: the DECLARE section; if you defined own types, you have to include them in the syntax file. -- oneline_comments : this value ranges from 1 to 3 and determines the +- oneline_comments : This value ranges from 1 to 3 and determines the highlighting of # style comments. - oneline_comments = 1 : allow normal Speedup code after an even + oneline_comments = 1 : Allow normal Speedup code after an even number of #s. - oneline_comments = 2 : show code starting with the second # as + oneline_comments = 2 : Show code starting with the second # as error. This is the default setting. - oneline_comments = 3 : show the whole line as error if it contains + oneline_comments = 3 : Show the whole line as error if it contains more than one #. Since especially OPERATION sections tend to become very large due to @@ -3198,8 +3198,8 @@ This covers the shell named "tcsh". It is a superset of csh. See |csh.vim| for how the filetype is detected. Tcsh does not allow \" in strings unless the "backslash_quote" shell variable -is set. If you want VIM to assume that no backslash quote constructs exist add -this line to your vimrc: > +is set. If you want VIM to assume that no backslash quote constructs exist +add this line to your vimrc: > :let tcsh_backslash_quote = 0 @@ -3552,7 +3552,7 @@ start and end tags. This can be turned on by > :let g:xml_syntax_folding = 1 :set foldmethod=syntax -Note: syntax folding might slow down syntax highlighting significantly, +Note: Syntax folding might slow down syntax highlighting significantly, especially for large files. @@ -4982,8 +4982,8 @@ ctermbg={color-nr} *highlight-ctermbg* a number instead of a color name. Note that for 16 color ansi style terminals (including xterms), the - numbers in the NR-8 column is used. Here '*' means 'add 8' so that Blue - is 12, DarkGray is 8 etc. + numbers in the NR-8 column is used. Here '*' means 'add 8' so that + Blue is 12, DarkGray is 8 etc. Note that for some color terminals these names may result in the wrong colors! @@ -5096,56 +5096,56 @@ These are the builtin highlighting groups. Note that the highlighting depends on the value of 'background'. You can see the current settings with the ":highlight" command. *hl-ColorColumn* -ColorColumn used for the columns set with 'colorcolumn' +ColorColumn Used for the columns set with 'colorcolumn'. *hl-Conceal* -Conceal placeholder characters substituted for concealed - text (see 'conceallevel') +Conceal Placeholder characters substituted for concealed + text (see 'conceallevel'). *hl-CurSearch* -CurSearch used for highlighting a search pattern under the cursor - (see 'hlsearch') +CurSearch Used for highlighting a search pattern under the cursor + (see 'hlsearch'). *hl-Cursor* -Cursor character under the cursor -lCursor the character under the cursor when |language-mapping| - is used (see 'guicursor') +Cursor Character under the cursor. +lCursor Character under the cursor when |language-mapping| + is used (see 'guicursor'). *hl-CursorIM* -CursorIM like Cursor, but used when in IME mode |CursorIM| +CursorIM Like Cursor, but used when in IME mode. |CursorIM| *hl-CursorColumn* CursorColumn Screen-column at the cursor, when 'cursorcolumn' is set. *hl-CursorLine* CursorLine Screen-line at the cursor, when 'cursorline' is set. Low-priority if foreground (ctermfg OR guifg) is not set. *hl-Directory* -Directory directory names (and other special names in listings) +Directory Directory names (and other special names in listings). *hl-DiffAdd* -DiffAdd diff mode: Added line |diff.txt| +DiffAdd Diff mode: Added line. |diff.txt| *hl-DiffChange* -DiffChange diff mode: Changed line |diff.txt| +DiffChange Diff mode: Changed line. |diff.txt| *hl-DiffDelete* -DiffDelete diff mode: Deleted line |diff.txt| +DiffDelete Diff mode: Deleted line. |diff.txt| *hl-DiffText* -DiffText diff mode: Changed text within a changed line |diff.txt| +DiffText Diff mode: Changed text within a changed line. |diff.txt| *hl-EndOfBuffer* -EndOfBuffer filler lines (~) after the end of the buffer. +EndOfBuffer Filler lines (~) after the end of the buffer. By default, this is highlighted like |hl-NonText|. *hl-TermCursor* -TermCursor cursor in a focused terminal +TermCursor Cursor in a focused terminal. *hl-TermCursorNC* -TermCursorNC cursor in an unfocused terminal +TermCursorNC Cursor in an unfocused terminal. *hl-ErrorMsg* -ErrorMsg error messages on the command line +ErrorMsg Error messages on the command line. *hl-WinSeparator* -WinSeparator separators between window splits +WinSeparator Separators between window splits. *hl-Folded* -Folded line used for closed folds +Folded Line used for closed folds. *hl-FoldColumn* FoldColumn 'foldcolumn' *hl-SignColumn* -SignColumn column where |signs| are displayed +SignColumn Column where |signs| are displayed. *hl-IncSearch* IncSearch 'incsearch' highlighting; also used for the text replaced with - ":s///c" + ":s///c". *hl-Substitute* -Substitute |:substitute| replacement text highlighting +Substitute |:substitute| replacement text highlighting. *hl-LineNr* LineNr Line number for ":number" and ":#" commands, and when 'number' @@ -5164,15 +5164,15 @@ CursorLineSign Like SignColumn when 'cursorline' is set for the cursor line. *hl-CursorLineFold* CursorLineFold Like FoldColumn when 'cursorline' is set for the cursor line. *hl-MatchParen* -MatchParen The character under the cursor or just before it, if it +MatchParen Character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| *hl-ModeMsg* -ModeMsg 'showmode' message (e.g., "-- INSERT --") +ModeMsg 'showmode' message (e.g., "-- INSERT --"). *hl-MsgArea* -MsgArea Area for messages and cmdline +MsgArea Area for messages and cmdline. *hl-MsgSeparator* -MsgSeparator Separator for scrolled messages, `msgsep` flag of 'display' +MsgSeparator Separator for scrolled messages, `msgsep` flag of 'display'. *hl-MoreMsg* MoreMsg |more-prompt| *hl-NonText* @@ -5181,21 +5181,21 @@ NonText '@' at the end of the window, characters from 'showbreak' (e.g., ">" displayed when a double-wide character doesn't fit at the end of the line). See also |hl-EndOfBuffer|. *hl-Normal* -Normal normal text +Normal Normal text. *hl-NormalFloat* NormalFloat Normal text in floating windows. *hl-NormalNC* -NormalNC normal text in non-current windows +NormalNC Normal text in non-current windows. *hl-Pmenu* -Pmenu Popup menu: normal item. +Pmenu Popup menu: Normal item. *hl-PmenuSel* -PmenuSel Popup menu: selected item. +PmenuSel Popup menu: Selected item. *hl-PmenuSbar* -PmenuSbar Popup menu: scrollbar. +PmenuSbar Popup menu: Scrollbar. *hl-PmenuThumb* PmenuThumb Popup menu: Thumb of the scrollbar. *hl-Question* -Question |hit-enter| prompt and yes/no questions +Question |hit-enter| prompt and yes/no questions. *hl-QuickFixLine* QuickFixLine Current |quickfix| item in the quickfix window. Combined with |hl-CursorLine| when the cursor is there. @@ -5203,7 +5203,7 @@ QuickFixLine Current |quickfix| item in the quickfix window. Combined with Search Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. *hl-SpecialKey* -SpecialKey Unprintable characters: text displayed differently from what +SpecialKey Unprintable characters: Text displayed differently from what it really is. But not 'listchars' whitespace. |hl-Whitespace| *hl-SpellBad* SpellBad Word that is not recognized by the spellchecker. |spell| @@ -5220,30 +5220,34 @@ SpellRare Word that is recognized by the spellchecker as one that is hardly ever used. |spell| Combined with the highlighting used otherwise. *hl-StatusLine* -StatusLine status line of current window +StatusLine Status line of current window. *hl-StatusLineNC* -StatusLineNC status lines of not-current windows - Note: if this is equal to "StatusLine" Vim will use "^^^" in +StatusLineNC Status lines of not-current windows. + Note: If this is equal to "StatusLine", Vim will use "^^^" in the status line of the current window. *hl-TabLine* -TabLine tab pages line, not active tab page label +TabLine Tab pages line, not active tab page label. *hl-TabLineFill* -TabLineFill tab pages line, where there are no labels +TabLineFill Tab pages line, where there are no labels. *hl-TabLineSel* -TabLineSel tab pages line, active tab page label +TabLineSel Tab pages line, active tab page label. *hl-Title* -Title titles for output from ":set all", ":autocmd" etc. +Title Titles for output from ":set all", ":autocmd" etc. *hl-Visual* -Visual Visual mode selection +Visual Visual mode selection. *hl-VisualNOS* VisualNOS Visual mode selection when vim is "Not Owning the Selection". *hl-WarningMsg* -WarningMsg warning messages +WarningMsg Warning messages. *hl-Whitespace* Whitespace "nbsp", "space", "tab", "multispace", "lead" and "trail" - in 'listchars' + in 'listchars'. *hl-WildMenu* -WildMenu current match in 'wildmenu' completion +WildMenu Current match in 'wildmenu' completion. + *hl-WinBar* +WinBar Window bar of current window. + *hl-WinBarNC* +WinBarNC Window bar of not-current windows. *hl-User1* *hl-User1..9* *hl-User9* The 'statusline' syntax allows the use of 9 different highlights in the diff --git a/runtime/doc/treesitter.txt b/runtime/doc/treesitter.txt index c3aa83465c..339ae0c2ed 100644 --- a/runtime/doc/treesitter.txt +++ b/runtime/doc/treesitter.txt @@ -472,8 +472,8 @@ parse_query({lang}, {query}) *parse_query()* • `info.patterns` contains information about predicates. Parameters: ~ - {lang} string The language - {query} string A string containing the query (s-expr + {lang} (string) The language + {query} (string) A string containing the query (s-expr syntax) Return: ~ @@ -702,7 +702,7 @@ LanguageTree:register_cbs({self}, {cbs}) *LanguageTree:register_cbs()* Registers callbacks for the parser. Parameters: ~ - {cbs} table An |nvim_buf_attach()|-like table argument + {cbs} (table) An |nvim_buf_attach()|-like table argument with the following keys : • `on_bytes` : see |nvim_buf_attach()|, but this will be called after the parsers callback. diff --git a/runtime/doc/usr_21.txt b/runtime/doc/usr_21.txt index 44d653a1a7..add5d48073 100644 --- a/runtime/doc/usr_21.txt +++ b/runtime/doc/usr_21.txt @@ -352,12 +352,12 @@ another session. this yourself then. Example: > :mksession! ~/.config/nvim/secret.vim - :wshada! ~/.local/share/nvim/shada/secret.shada + :wshada! ~/.local/state/nvim/shada/secret.shada And to restore this again: > :source ~/.config/nvim/secret.vim - :rshada! ~/.local/share/nvim/shada/secret.shada + :rshada! ~/.local/state/nvim/shada/secret.shada ============================================================================== *21.5* Views diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt index 75ee0fdfdf..0a25904104 100644 --- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -30,10 +30,10 @@ CTRL-L Clears and redraws the screen. The redraw may happen function (or a mapping if 'lazyredraw' set). *:redraws* *:redrawstatus* -:redraws[tatus][!] Redraws the status line of the current window, or all - status lines if "!" is included. - Useful if 'statusline' includes an item that doesn't - cause automatic updating. +:redraws[tatus][!] Redraws the status line and window bar of the current + window, or all status lines and window bars if "!" is + included. Useful if 'statusline' or 'winbar' includes + an item that doesn't cause automatic updating. *:redrawt* *:redrawtabline* :redrawt[abline] Redraw the tabline. Useful to update the tabline when diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt index e24dd46f49..c926337b47 100644 --- a/runtime/doc/vim_diff.txt +++ b/runtime/doc/vim_diff.txt @@ -17,7 +17,7 @@ centralized reference of the differences. - Use `$XDG_CONFIG_HOME/nvim/init.vim` instead of `.vimrc` for your |config|. - Use `$XDG_CONFIG_HOME/nvim` instead of `.vim` to store configuration files. -- Use `$XDG_DATA_HOME/nvim/shada/main.shada` instead of `.viminfo` for persistent +- Use `$XDG_STATE_HOME/nvim/shada/main.shada` instead of `.viminfo` for persistent session information. |shada| ============================================================================== @@ -32,12 +32,12 @@ centralized reference of the differences. - 'autoread' is enabled - 'background' defaults to "dark" (unless set automatically by the terminal/UI) - 'backspace' defaults to "indent,eol,start" -- 'backupdir' defaults to .,~/.local/share/nvim/backup// (|xdg|), auto-created +- 'backupdir' defaults to .,~/.local/state/nvim/backup// (|xdg|), auto-created - 'belloff' defaults to "all" - 'compatible' is always disabled - 'complete' excludes "i" - 'cscopeverbose' is enabled -- 'directory' defaults to ~/.local/share/nvim/swap// (|xdg|), auto-created +- 'directory' defaults to ~/.local/state/nvim/swap// (|xdg|), auto-created - 'display' defaults to "lastline,msgsep" - 'encoding' is UTF-8 (cf. 'fileencoding' for file-content encoding) - 'fillchars' defaults (in effect) to "vert:│,fold:·,sep:│" @@ -65,7 +65,7 @@ centralized reference of the differences. - 'tags' defaults to "./tags;,tags" - 'ttimeoutlen' defaults to 50 - 'ttyfast' is always set -- 'undodir' defaults to ~/.local/share/nvim/undo// (|xdg|), auto-created +- 'undodir' defaults to ~/.local/state/nvim/undo// (|xdg|), auto-created - 'viewoptions' includes "unix,slash", excludes "options" - 'viminfo' includes "!" - 'wildmenu' is enabled @@ -87,6 +87,8 @@ of these in your config by simply removing the mapping, e.g. ":unmap Y". nnoremap <C-L> <Cmd>nohlsearch<Bar>diffupdate<Bar>normal! <C-L><CR> inoremap <C-U> <C-G>u<C-U> inoremap <C-W> <C-G>u<C-W> + xnoremap * y/\V<C-R>"<CR> + xnoremap # y?\V<C-R>"<CR> < Default Autocommands ~ *default-autocmds* @@ -366,9 +368,8 @@ Macro/|recording| behavior the results of keys from 'keymap'. Mappings: -- Creating a mapping for a simplifiable key (e.g. <C-I>) doesn't replace an + Creating a mapping for a simplifiable key (e.g. <C-I>) doesn't replace an existing mapping for its simplified form (e.g. <Tab>). -- The rhs of a mapping is not simplified when it is defined. Motion: The |jumplist| avoids useless/phantom jumps. @@ -547,11 +548,13 @@ Options: 'maxmemtot' Nvim delegates memory-management to the OS. 'maxcombine' (6 is always used) *'prompt'* *'noprompt'* + *'remap'* *'noremap'* *'restorescreen'* *'rs'* *'norestorescreen'* *'nors'* 'shelltype' *'shortname'* *'sn'* *'noshortname'* *'nosn'* *'swapsync'* *'sws'* *'termencoding'* *'tenc'* (Vim 7.4.852 also removed this for Windows) + *'terse'* *'noterse'* (Add "s" to 'shortmess' instead) 'textauto' 'textmode' *'toolbar'* *'tb'* diff --git a/runtime/doc/windows.txt b/runtime/doc/windows.txt index cd5425336f..8062b9e28f 100644 --- a/runtime/doc/windows.txt +++ b/runtime/doc/windows.txt @@ -983,7 +983,7 @@ modified, but is forced (with '!') to be removed from a window, and 'autowrite' is off or the buffer can't be written. You can make a hidden buffer not hidden by starting to edit it with any -command. Or by deleting it with the ":bdelete" command. +command, or by deleting it with the ":bdelete" command. The 'hidden' is global, it is used for all buffers. The 'bufhidden' option can be used to make an exception for a specific buffer. It can take these diff --git a/runtime/filetype.lua b/runtime/filetype.lua index 47d55d8465..d2510c5494 100644 --- a/runtime/filetype.lua +++ b/runtime/filetype.lua @@ -7,23 +7,23 @@ if vim.g.do_filetype_lua ~= 1 then return end -vim.api.nvim_create_augroup("filetypedetect", {clear = false}) +vim.api.nvim_create_augroup('filetypedetect', { clear = false }) -vim.api.nvim_create_autocmd({"BufRead", "BufNewFile"}, { - group = "filetypedetect", +vim.api.nvim_create_autocmd({ 'BufRead', 'BufNewFile' }, { + group = 'filetypedetect', callback = function() - vim.filetype.match(vim.fn.expand("<afile>")) + vim.filetype.match(vim.fn.expand('<afile>')) end, }) -- These *must* be sourced after the autocommand above is created if not vim.g.did_load_ftdetect then - vim.cmd [[ + vim.cmd([[ augroup filetypedetect runtime! ftdetect/*.vim runtime! ftdetect/*.lua augroup END - ]] + ]]) end -- Set a marker so that the ftdetect scripts are not sourced a second time by filetype.vim @@ -31,17 +31,17 @@ vim.g.did_load_ftdetect = 1 -- If filetype.vim is disabled, set up the autocmd to use scripts.vim if vim.g.did_load_filetypes then - vim.api.nvim_create_autocmd({"BufRead", "BufNewFile"}, { - group = "filetypedetect", + vim.api.nvim_create_autocmd({ 'BufRead', 'BufNewFile' }, { + group = 'filetypedetect', command = "if !did_filetype() && expand('<amatch>') !~ g:ft_ignore_pat | runtime! scripts.vim | endif", }) - vim.api.nvim_create_autocmd("StdinReadPost", { - group = "filetypedetect", - command = "if !did_filetype() | runtime! scripts.vim | endif", + vim.api.nvim_create_autocmd('StdinReadPost', { + group = 'filetypedetect', + command = 'if !did_filetype() | runtime! scripts.vim | endif', }) end if not vim.g.ft_ignore_pat then - vim.g.ft_ignore_pat = "\\.\\(Z\\|gz\\|bz2\\|zip\\|tgz\\)$" + vim.g.ft_ignore_pat = '\\.\\(Z\\|gz\\|bz2\\|zip\\|tgz\\)$' end diff --git a/runtime/ftplugin/abaqus.vim b/runtime/ftplugin/abaqus.vim index b263d0c318..5ce565ef3f 100644 --- a/runtime/ftplugin/abaqus.vim +++ b/runtime/ftplugin/abaqus.vim @@ -1,7 +1,7 @@ " Vim filetype plugin file " Language: Abaqus finite element input file (www.abaqus.com) " Maintainer: Carl Osterwisch <osterwischc@asme.org> -" Last Change: 2012 Apr 30 +" Last Change: 2022 May 09 " Only do this when not done yet for this buffer if exists("b:did_ftplugin") | finish | endif @@ -86,11 +86,11 @@ let b:undo_ftplugin .= "|unmap <buffer> [[|unmap <buffer> ]]" \ . "|unmap <buffer> <LocalLeader><LocalLeader>" " Undo must be done in nocompatible mode for <LocalLeader>. -let b:undo_ftplugin = "let s:cpo_save = &cpoptions|" +let b:undo_ftplugin = "let b:cpo_save = &cpoptions|" \ . "set cpoptions&vim|" \ . b:undo_ftplugin - \ . "|let &cpoptions = s:cpo_save" - \ . "|unlet s:cpo_save" + \ . "|let &cpoptions = b:cpo_save" + \ . "|unlet b:cpo_save" " Restore saved compatibility options let &cpoptions = s:cpo_save diff --git a/runtime/ftplugin/man.vim b/runtime/ftplugin/man.vim index fce12012b5..d7a08a9941 100644 --- a/runtime/ftplugin/man.vim +++ b/runtime/ftplugin/man.vim @@ -24,7 +24,11 @@ if !exists('g:no_plugin_maps') && !exists('g:no_man_maps') nnoremap <silent> <buffer> k gk nnoremap <silent> <buffer> gO :call man#show_toc()<CR> nnoremap <silent> <buffer> <2-LeftMouse> :Man<CR> - nnoremap <silent> <buffer> <nowait> q :lclose<CR><C-W>c + if get(b:, 'pager') + nnoremap <silent> <buffer> <nowait> q :lclose<CR><C-W>q + else + nnoremap <silent> <buffer> <nowait> q :lclose<CR><C-W>c + endif endif if get(g:, 'ft_man_folding_enable', 0) diff --git a/runtime/ftplugin/query.lua b/runtime/ftplugin/query.lua index c1694961af..3b99d67247 100644 --- a/runtime/ftplugin/query.lua +++ b/runtime/ftplugin/query.lua @@ -3,4 +3,4 @@ -- Last Change: 2022 Mar 29 -- it's a lisp! -vim.cmd [[ runtime! ftplugin/lisp.vim ]] +vim.cmd([[ runtime! ftplugin/lisp.vim ]]) diff --git a/runtime/ftplugin/scdoc.vim b/runtime/ftplugin/scdoc.vim index 2e98e647f4..552c865baa 100644 --- a/runtime/ftplugin/scdoc.vim +++ b/runtime/ftplugin/scdoc.vim @@ -1,6 +1,7 @@ " scdoc filetype plugin -" Maintainer: Gregory Anders <greg@gpanders.com> -" Last Updated: 2021-08-04 +" Maintainer: Gregory Anders <contact@gpanders.com> +" Last Updated: 2022-05-09 +" Upstream: https://github.com/gpanders/vim-scdoc " Only do this when not done yet for this buffer if exists('b:did_ftplugin') @@ -19,8 +20,3 @@ setlocal softtabstop=0 setlocal textwidth=80 let b:undo_ftplugin = 'setl com< cms< fo< et< sw< sts< tw<' - -if has('conceal') - setlocal conceallevel=2 - let b:undo_ftplugin .= ' cole<' -endif diff --git a/runtime/indent/query.lua b/runtime/indent/query.lua index 55cb73e62b..c86948e95e 100644 --- a/runtime/indent/query.lua +++ b/runtime/indent/query.lua @@ -3,4 +3,4 @@ -- Last Change: 2022 Mar 29 -- it's a lisp! -vim.cmd [[ runtime! indent/lisp.vim ]] +vim.cmd([[ runtime! indent/lisp.vim ]]) diff --git a/runtime/lua/man.lua b/runtime/lua/man.lua index ba6b9d09c9..5da3d2a92f 100644 --- a/runtime/lua/man.lua +++ b/runtime/lua/man.lua @@ -8,7 +8,7 @@ local function highlight_line(line, linenr) local overstrike, escape = false, false local hls = {} -- Store highlight groups as { attr, start, final } local NONE, BOLD, UNDERLINE, ITALIC = 0, 1, 2, 3 - local hl_groups = {[BOLD]="manBold", [UNDERLINE]="manUnderline", [ITALIC]="manItalic"} + local hl_groups = { [BOLD] = 'manBold', [UNDERLINE] = 'manUnderline', [ITALIC] = 'manItalic' } local attr = NONE local byte = 0 -- byte offset @@ -47,7 +47,7 @@ local function highlight_line(line, linenr) end if continue_hl then - hls[#hls + 1] = {attr=attr, start=byte, final=-1} + hls[#hls + 1] = { attr = attr, start = byte, final = -1 } else if attr == NONE then for a, _ in pairs(hl_groups) do @@ -63,7 +63,7 @@ local function highlight_line(line, linenr) -- can be represented in one byte. Any code point above that is represented by -- a leading byte (0xc0 and above) and continuation bytes (0x80 to 0xbf, or -- decimal 128 to 191). - for char in line:gmatch("[^\128-\191][\128-\191]*") do + for char in line:gmatch('[^\128-\191][\128-\191]*') do if overstrike then local last_hl = hls[#hls] if char == prev_char then @@ -93,7 +93,7 @@ local function highlight_line(line, linenr) if last_hl and last_hl.attr == attr and last_hl.final == byte then last_hl.final = byte + #char else - hls[#hls + 1] = {attr=attr, start=byte, final=byte + #char} + hls[#hls + 1] = { attr = attr, start = byte, final = byte + #char } end overstrike = false @@ -106,25 +106,25 @@ local function highlight_line(line, linenr) -- We only want to match against SGR sequences, which consist of ESC -- followed by '[', then a series of parameter and intermediate bytes in -- the range 0x20 - 0x3f, then 'm'. (See ECMA-48, sections 5.4 & 8.3.117) - local sgr = prev_char:match("^%[([\032-\063]*)m$") + local sgr = prev_char:match('^%[([\032-\063]*)m$') -- Ignore escape sequences with : characters, as specified by ITU's T.416 -- Open Document Architecture and interchange format. - if sgr and not string.find(sgr, ":") then + if sgr and not string.find(sgr, ':') then local match while sgr and #sgr > 0 do -- Match against SGR parameters, which may be separated by ';' - match, sgr = sgr:match("^(%d*);?(.*)") + match, sgr = sgr:match('^(%d*);?(.*)') add_attr_hl(match + 0) -- coerce to number end escape = false - elseif not prev_char:match("^%[[\032-\063]*$") then + elseif not prev_char:match('^%[[\032-\063]*$') then -- Stop looking if this isn't a partial CSI sequence escape = false end - elseif char == "\027" then + elseif char == '\027' then escape = true prev_char = '' - elseif char == "\b" then + elseif char == '\b' then overstrike = true prev_char = chars[#chars] byte = byte - #prev_char @@ -143,7 +143,7 @@ local function highlight_line(line, linenr) hl_groups[hl.attr], linenr - 1, hl.start, - hl.final + hl.final, } end end @@ -152,8 +152,8 @@ local function highlight_line(line, linenr) end local function highlight_man_page() - local mod = vim.api.nvim_buf_get_option(0, "modifiable") - vim.api.nvim_buf_set_option(0, "modifiable", true) + local mod = vim.api.nvim_buf_get_option(0, 'modifiable') + vim.api.nvim_buf_set_option(0, 'modifiable', true) local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false) for i, line in ipairs(lines) do @@ -166,7 +166,7 @@ local function highlight_man_page() end buf_hls = {} - vim.api.nvim_buf_set_option(0, "modifiable", mod) + vim.api.nvim_buf_set_option(0, 'modifiable', mod) end return { highlight_man_page = highlight_man_page } diff --git a/runtime/lua/vim/F.lua b/runtime/lua/vim/F.lua index 9327c652db..bca5ddf68b 100644 --- a/runtime/lua/vim/F.lua +++ b/runtime/lua/vim/F.lua @@ -5,13 +5,17 @@ local F = {} ---@param a ---@param b function F.if_nil(a, b) - if a == nil then return b end + if a == nil then + return b + end return a end -- Use in combination with pcall function F.ok_or_nil(status, ...) - if not status then return end + if not status then + return + end return ... end @@ -29,7 +33,7 @@ end --- like {...} except preserve the length explicitly function F.pack_len(...) - return {n=select('#', ...), ...} + return { n = select('#', ...), ... } end --- like unpack() but use the length set by F.pack_len if present diff --git a/runtime/lua/vim/_editor.lua b/runtime/lua/vim/_editor.lua index 119467de16..e6ab48f30d 100644 --- a/runtime/lua/vim/_editor.lua +++ b/runtime/lua/vim/_editor.lua @@ -40,26 +40,28 @@ local vim = assert(vim) -- These are for loading runtime modules lazily since they aren't available in -- the nvim binary as specified in executor.c -for k,v in pairs { - treesitter=true; - filetype = true; - F=true; - lsp=true; - highlight=true; - diagnostic=true; - keymap=true; - ui=true; -} do vim._submodules[k] = v end +for k, v in pairs({ + treesitter = true, + filetype = true, + F = true, + lsp = true, + highlight = true, + diagnostic = true, + keymap = true, + ui = true, +}) do + vim._submodules[k] = v +end vim.log = { levels = { - TRACE = 0; - DEBUG = 1; - INFO = 2; - WARN = 3; - ERROR = 4; - OFF = 5; - } + TRACE = 0, + DEBUG = 1, + INFO = 2, + WARN = 3, + ERROR = 4, + OFF = 5, + }, } -- Internal-only until comments in #8107 are addressed. @@ -77,14 +79,14 @@ function vim._os_proc_info(pid) if pid == nil or pid <= 0 or type(pid) ~= 'number' then error('invalid pid') end - local cmd = { 'ps', '-p', pid, '-o', 'comm=', } + local cmd = { 'ps', '-p', pid, '-o', 'comm=' } local err, name = vim._system(cmd) if 1 == err and vim.trim(name) == '' then - return {} -- Process not found. + return {} -- Process not found. elseif 0 ~= err then - error('command failed: '..vim.fn.string(cmd)) + error('command failed: ' .. vim.fn.string(cmd)) end - local _, ppid = vim._system({ 'ps', '-p', pid, '-o', 'ppid=', }) + local _, ppid = vim._system({ 'ps', '-p', pid, '-o', 'ppid=' }) -- Remove trailing whitespace. name = vim.trim(name):gsub('^.*/', '') ppid = tonumber(ppid) or -1 @@ -101,12 +103,12 @@ function vim._os_proc_children(ppid) if ppid == nil or ppid <= 0 or type(ppid) ~= 'number' then error('invalid ppid') end - local cmd = { 'pgrep', '-P', ppid, } + local cmd = { 'pgrep', '-P', ppid } local err, rv = vim._system(cmd) if 1 == err and vim.trim(rv) == '' then - return {} -- Process not found. + return {} -- Process not found. elseif 0 ~= err then - error('command failed: '..vim.fn.string(cmd)) + error('command failed: ' .. vim.fn.string(cmd)) end local children = {} for s in rv:gmatch('%S+') do @@ -124,8 +126,8 @@ end --- ---@see https://github.com/kikito/inspect.lua ---@see https://github.com/mpeterv/vinspect -local function inspect(object, options) -- luacheck: no unused - error(object, options) -- Stub for gen_vimdoc.py +local function inspect(object, options) -- luacheck: no unused + error(object, options) -- Stub for gen_vimdoc.py end do @@ -160,11 +162,11 @@ do local now = vim.loop.now() local is_first_chunk = phase < 2 local is_last_chunk = phase == -1 or phase == 3 - if is_first_chunk then -- Reset flags. + if is_first_chunk then -- Reset flags. tdots, tick, got_line1, undo_started, trailing_nl = now, 0, false, false, false end if #lines == 0 then - lines = {''} + lines = { '' } end if #lines == 1 and lines[1] == '' and not is_last_chunk then -- An empty chunk can cause some edge cases in streamed pasting, @@ -172,7 +174,7 @@ do return true end -- Note: mode doesn't always start with "c" in cmdline mode, so use getcmdtype() instead. - if vim.fn.getcmdtype() ~= '' then -- cmdline-mode: paste only 1 line. + if vim.fn.getcmdtype() ~= '' then -- cmdline-mode: paste only 1 line. if not got_line1 then got_line1 = (#lines > 1) -- Escape control characters @@ -187,9 +189,9 @@ do if undo_started then vim.api.nvim_command('undojoin') end - if mode:find('^i') or mode:find('^n?t') then -- Insert mode or Terminal buffer + if mode:find('^i') or mode:find('^n?t') then -- Insert mode or Terminal buffer vim.api.nvim_put(lines, 'c', false, true) - elseif phase < 2 and mode:find('^R') and not mode:find('^Rv') then -- Replace mode + elseif phase < 2 and mode:find('^R') and not mode:find('^Rv') then -- Replace mode -- TODO: implement Replace mode streamed pasting -- TODO: support Virtual Replace mode local nchars = 0 @@ -197,26 +199,26 @@ do nchars = nchars + line:len() end local row, col = unpack(vim.api.nvim_win_get_cursor(0)) - local bufline = vim.api.nvim_buf_get_lines(0, row-1, row, true)[1] + local bufline = vim.api.nvim_buf_get_lines(0, row - 1, row, true)[1] local firstline = lines[1] - firstline = bufline:sub(1, col)..firstline + firstline = bufline:sub(1, col) .. firstline lines[1] = firstline - lines[#lines] = lines[#lines]..bufline:sub(col + nchars + 1, bufline:len()) - vim.api.nvim_buf_set_lines(0, row-1, row, false, lines) - elseif mode:find('^[nvV\22sS\19]') then -- Normal or Visual or Select mode - if mode:find('^n') then -- Normal mode + lines[#lines] = lines[#lines] .. bufline:sub(col + nchars + 1, bufline:len()) + vim.api.nvim_buf_set_lines(0, row - 1, row, false, lines) + elseif mode:find('^[nvV\22sS\19]') then -- Normal or Visual or Select mode + if mode:find('^n') then -- Normal mode -- When there was a trailing new line in the previous chunk, -- the cursor is on the first character of the next line, -- so paste before the cursor instead of after it. vim.api.nvim_put(lines, 'c', not trailing_nl, false) - else -- Visual or Select mode + else -- Visual or Select mode vim.api.nvim_command([[exe "silent normal! \<Del>"]]) local del_start = vim.fn.getpos("'[") local cursor_pos = vim.fn.getpos('.') - if mode:find('^[VS]') then -- linewise - if cursor_pos[2] < del_start[2] then -- replacing lines at eof + if mode:find('^[VS]') then -- linewise + if cursor_pos[2] < del_start[2] then -- replacing lines at eof -- create a new line - vim.api.nvim_put({''}, 'l', true, true) + vim.api.nvim_put({ '' }, 'l', true, true) end vim.api.nvim_put(lines, 'c', false, false) else @@ -227,7 +229,7 @@ do -- put cursor at the end of the text instead of one character after it vim.fn.setpos('.', vim.fn.getpos("']")) trailing_nl = lines[#lines] == '' - else -- Don't know what to do in other modes + else -- Don't know what to do in other modes return false end undo_started = true @@ -240,9 +242,9 @@ do vim.api.nvim_command(('echo "%s"'):format(dots)) end if is_last_chunk then - vim.api.nvim_command('redraw'..(tick > 1 and '|echo ""' or '')) + vim.api.nvim_command('redraw' .. (tick > 1 and '|echo ""' or '')) end - return true -- Paste will not continue if not returning `true`. + return true -- Paste will not continue if not returning `true`. end end @@ -252,10 +254,12 @@ end ---@see |vim.schedule()| ---@see |vim.in_fast_event()| function vim.schedule_wrap(cb) - return (function (...) + return function(...) local args = vim.F.pack_len(...) - vim.schedule(function() cb(vim.F.unpack_len(args)) end) - end) + vim.schedule(function() + cb(vim.F.unpack_len(args)) + end) + end end -- vim.fn.{func}(...) @@ -264,7 +268,7 @@ vim.fn = setmetatable({}, { local _fn if vim.api[key] ~= nil then _fn = function() - error(string.format("Tried to call API function with vim.fn: use vim.api.%s instead", key)) + error(string.format('Tried to call API function with vim.fn: use vim.api.%s instead', key)) end else _fn = function(...) @@ -273,16 +277,40 @@ vim.fn = setmetatable({}, { end t[key] = _fn return _fn - end + end, }) vim.funcref = function(viml_func_name) return vim.fn[viml_func_name] end --- An easier alias for commands. -vim.cmd = function(command) - return vim.api.nvim_exec(command, false) +--- Execute Vim script commands. +--- +--- Example: +--- <pre> +--- vim.cmd('echo 42') +--- vim.cmd([[ +--- augroup My_group +--- autocmd! +--- autocmd FileType c setlocal cindent +--- augroup END +--- ]]) +--- vim.cmd({ cmd = 'echo', args = { '"foo"' } }) +--- </pre> +--- +---@param command string|table Command(s) to execute. +--- If a string, executes multiple lines of Vim script at once. In this +--- case, it is an alias to |nvim_exec()|, where `output` is set to +--- false. Thus it works identical to |:source|. +--- If a table, executes a single command. In this case, it is an alias +--- to |nvim_cmd()| where `opts` is empty. +---@see |ex-cmd-index| +function vim.cmd(command) + if type(command) == 'table' then + return vim.api.nvim_cmd(command, {}) + else + return vim.api.nvim_exec(command, false) + end end -- These are the vim.env/v/g/o/bo/wo variable magic accessors. @@ -291,9 +319,9 @@ do --@private local function make_dict_accessor(scope, handle) - validate { - scope = {scope, 's'}; - } + validate({ + scope = { scope, 's' }, + }) local mt = {} function mt:__newindex(k, v) return vim._setvar(scope, handle or 0, k, v) @@ -343,7 +371,7 @@ function vim.region(bufnr, pos1, pos2, regtype, inclusive) local region = {} for l = pos1[1], pos2[1] do local c1, c2 - if regtype:byte() == 22 then -- block selection: take width from regtype + if regtype:byte() == 22 then -- block selection: take width from regtype c1 = pos1[2] c2 = c1 + regtype:sub(2) -- and adjust for non-ASCII characters @@ -355,10 +383,10 @@ function vim.region(bufnr, pos1, pos2, regtype, inclusive) c2 = vim.str_byteindex(bufline, c2) end else - c1 = (l == pos1[1]) and (pos1[2]) or 0 + c1 = (l == pos1[1]) and pos1[2] or 0 c2 = (l == pos2[1]) and (pos2[2] + (inclusive and 1 or 0)) or -1 end - table.insert(region, l, {c1, c2}) + table.insert(region, l, { c1, c2 }) end return region end @@ -372,19 +400,21 @@ end ---@param timeout Number of milliseconds to wait before calling `fn` ---@return timer luv timer object function vim.defer_fn(fn, timeout) - vim.validate { fn = { fn, 'c', true}; } + vim.validate({ fn = { fn, 'c', true } }) local timer = vim.loop.new_timer() - timer:start(timeout, 0, vim.schedule_wrap(function() - timer:stop() - timer:close() + timer:start( + timeout, + 0, + vim.schedule_wrap(function() + timer:close() - fn() - end)) + fn() + end) + ) return timer end - --- Display a notification to the user. --- --- This function can be overridden by plugins to display notifications using a @@ -398,9 +428,9 @@ function vim.notify(msg, level, opts) -- luacheck: no unused args if level == vim.log.levels.ERROR then vim.api.nvim_err_writeln(msg) elseif level == vim.log.levels.WARN then - vim.api.nvim_echo({{msg, 'WarningMsg'}}, true, {}) + vim.api.nvim_echo({ { msg, 'WarningMsg' } }, true, {}) else - vim.api.nvim_echo({{msg}}, true, {}) + vim.api.nvim_echo({ { msg } }, true, {}) end end @@ -415,11 +445,14 @@ do ---@param msg string Content of the notification to show to the user. ---@param level number|nil One of the values from |vim.log.levels|. ---@param opts table|nil Optional parameters. Unused by default. - function vim.notify_once(msg, level, opts) -- luacheck: no unused args + ---@return boolean true if message was displayed, else false + function vim.notify_once(msg, level, opts) if not notified[msg] then vim.notify(msg, level, opts) notified[msg] = true + return true end + return false end end @@ -453,10 +486,10 @@ function vim.on_key(fn, ns_id) return #on_key_cbs end - vim.validate { - fn = { fn, 'c', true}, - ns_id = { ns_id, 'n', true } - } + vim.validate({ + fn = { fn, 'c', true }, + ns_id = { ns_id, 'n', true }, + }) if ns_id == nil or ns_id == 0 then ns_id = vim.api.nvim_create_namespace('') @@ -481,10 +514,13 @@ function vim._on_key(char) end if failed_ns_ids[1] then - error(string.format( - "Error executing 'on_key' with ns_ids '%s'\n Messages: %s", - table.concat(failed_ns_ids, ", "), - table.concat(failed_messages, "\n"))) + error( + string.format( + "Error executing 'on_key' with ns_ids '%s'\n Messages: %s", + table.concat(failed_ns_ids, ', '), + table.concat(failed_messages, '\n') + ) + ) end end @@ -511,8 +547,10 @@ function vim._expand_pat(pat, env) -- Probably just need to do a smarter match than just `:match` -- Get the last part of the pattern - local last_part = pat:match("[%w.:_%[%]'\"]+$") - if not last_part then return {}, 0 end + local last_part = pat:match('[%w.:_%[%]\'"]+$') + if not last_part then + return {}, 0 + end local parts, search_index = vim._expand_pat_get_parts(last_part) @@ -529,7 +567,7 @@ function vim._expand_pat(pat, env) -- Normally, we just have a string -- Just attempt to get the string directly from the environment - if type(part) == "string" then + if type(part) == 'string' then key = part else -- However, sometimes you want to use a variable, and complete on it @@ -554,7 +592,7 @@ function vim._expand_pat(pat, env) local field = rawget(final_env, key) if field == nil then local mt = getmetatable(final_env) - if mt and type(mt.__index) == "table" then + if mt and type(mt.__index) == 'table' then field = rawget(mt.__index, key) elseif final_env == vim and vim._submodules[key] then field = vim[key] @@ -570,18 +608,18 @@ function vim._expand_pat(pat, env) local keys = {} ---@private local function insert_keys(obj) - for k,_ in pairs(obj) do - if type(k) == "string" and string.sub(k,1,string.len(match_part)) == match_part then - table.insert(keys,k) + for k, _ in pairs(obj) do + if type(k) == 'string' and string.sub(k, 1, string.len(match_part)) == match_part then + table.insert(keys, k) end end end - if type(final_env) == "table" then + if type(final_env) == 'table' then insert_keys(final_env) end local mt = getmetatable(final_env) - if mt and type(mt.__index) == "table" then + if mt and type(mt.__index) == 'table' then insert_keys(mt.__index) end if final_env == vim then @@ -602,12 +640,12 @@ vim._expand_pat_get_parts = function(lua_string) for idx = 1, #lua_string do local s = lua_string:sub(idx, idx) - if not in_brackets and (s == "." or s == ":") then + if not in_brackets and (s == '.' or s == ':') then table.insert(parts, accumulator) accumulator = '' search_index = idx + 1 - elseif s == "[" then + elseif s == '[' then in_brackets = true table.insert(parts, accumulator) @@ -619,7 +657,7 @@ vim._expand_pat_get_parts = function(lua_string) in_brackets = false search_index = idx + 1 - if string_char == "VAR" then + if string_char == 'VAR' then table.insert(parts, { accumulator }) accumulator = '' @@ -631,7 +669,7 @@ vim._expand_pat_get_parts = function(lua_string) if s == '"' or s == "'" then string_char = s elseif s ~= ' ' then - string_char = "VAR" + string_char = 'VAR' accumulator = s end elseif string_char then @@ -649,7 +687,9 @@ vim._expand_pat_get_parts = function(lua_string) end end - parts = vim.tbl_filter(function(val) return #val > 0 end, parts) + parts = vim.tbl_filter(function(val) + return #val > 0 + end, parts) return parts, search_index end @@ -677,20 +717,20 @@ function vim._cs_remote(rcid, server_addr, connect_error, args) local function connection_failure_errmsg(consequence) local explanation if server_addr == '' then - explanation = "No server specified with --server" + explanation = 'No server specified with --server' else explanation = "Failed to connect to '" .. server_addr .. "'" - if connect_error ~= "" then - explanation = explanation .. ": " .. connect_error + if connect_error ~= '' then + explanation = explanation .. ': ' .. connect_error end end - return "E247: " .. explanation .. ". " .. consequence + return 'E247: ' .. explanation .. '. ' .. consequence end local f_silent = false local f_tab = false - local subcmd = string.sub(args[1],10) + local subcmd = string.sub(args[1], 10) if subcmd == 'tab' then f_tab = true elseif subcmd == 'silent' then @@ -713,16 +753,18 @@ function vim._cs_remote(rcid, server_addr, connect_error, args) print(vim.fn.rpcrequest(rcid, 'nvim_eval', args[2])) return { should_exit = true, tabbed = false } elseif subcmd ~= '' then - return { errmsg='Unknown option argument: ' .. args[1] } + return { errmsg = 'Unknown option argument: ' .. args[1] } end if rcid == 0 then if not f_silent then - vim.notify(connection_failure_errmsg("Editing locally"), vim.log.levels.WARN) + vim.notify(connection_failure_errmsg('Editing locally'), vim.log.levels.WARN) end else local command = {} - if f_tab then table.insert(command, 'tab') end + if f_tab then + table.insert(command, 'tab') + end table.insert(command, 'drop') for i = 2, #args do table.insert(command, vim.fn.fnameescape(args[i])) @@ -744,12 +786,15 @@ end --- be removed. ---@param plugin string|nil Plugin name that the function will be removed --- from. Defaults to "Nvim". -function vim.deprecate(name, alternative, version, plugin) - local message = name .. ' is deprecated' - plugin = plugin or "Nvim" - message = alternative and (message .. ', use ' .. alternative .. ' instead.') or message - message = message .. ' See :h deprecated\nThis function will be removed in ' .. plugin .. ' version ' .. version - vim.notify_once(message, vim.log.levels.WARN) +---@param backtrace boolean|nil Prints backtrace. Defaults to true. +function vim.deprecate(name, alternative, version, plugin, backtrace) + local message = name .. ' is deprecated' + plugin = plugin or 'Nvim' + message = alternative and (message .. ', use ' .. alternative .. ' instead.') or message + message = message .. ' See :h deprecated\nThis function will be removed in ' .. plugin .. ' version ' .. version + if vim.notify_once(message, vim.log.levels.WARN) and backtrace ~= false then + vim.notify(debug.traceback('', 2):sub(2), vim.log.levels.WARN) + end end require('vim._meta') diff --git a/runtime/lua/vim/_init_packages.lua b/runtime/lua/vim/_init_packages.lua index 7d27741f1b..7e3c73667e 100644 --- a/runtime/lua/vim/_init_packages.lua +++ b/runtime/lua/vim/_init_packages.lua @@ -3,8 +3,8 @@ local vim = assert(vim) local pathtrails = {} vim._so_trails = {} -for s in (package.cpath..';'):gmatch('[^;]*;') do - s = s:sub(1, -2) -- Strip trailing semicolon +for s in (package.cpath .. ';'):gmatch('[^;]*;') do + s = s:sub(1, -2) -- Strip trailing semicolon -- Find out path patterns. pathtrail should contain something like -- /?.so, \?.dll. This allows not to bother determining what correct -- suffixes are. @@ -17,29 +17,29 @@ end function vim._load_package(name) local basename = name:gsub('%.', '/') - local paths = {"lua/"..basename..".lua", "lua/"..basename.."/init.lua"} - local found = vim.api.nvim__get_runtime(paths, false, {is_lua=true}) + local paths = { 'lua/' .. basename .. '.lua', 'lua/' .. basename .. '/init.lua' } + local found = vim.api.nvim__get_runtime(paths, false, { is_lua = true }) if #found > 0 then local f, err = loadfile(found[1]) return f or error(err) end local so_paths = {} - for _,trail in ipairs(vim._so_trails) do - local path = "lua"..trail:gsub('?', basename) -- so_trails contains a leading slash + for _, trail in ipairs(vim._so_trails) do + local path = 'lua' .. trail:gsub('?', basename) -- so_trails contains a leading slash table.insert(so_paths, path) end - found = vim.api.nvim__get_runtime(so_paths, false, {is_lua=true}) + found = vim.api.nvim__get_runtime(so_paths, false, { is_lua = true }) if #found > 0 then -- Making function name in Lua 5.1 (see src/loadlib.c:mkfuncname) is -- a) strip prefix up to and including the first dash, if any -- b) replace all dots by underscores -- c) prepend "luaopen_" -- So "foo-bar.baz" should result in "luaopen_bar_baz" - local dash = name:find("-", 1, true) + local dash = name:find('-', 1, true) local modname = dash and name:sub(dash + 1) or name - local f, err = package.loadlib(found[1], "luaopen_"..modname:gsub("%.", "_")) + local f, err = package.loadlib(found[1], 'luaopen_' .. modname:gsub('%.', '_')) return f or error(err) end return nil @@ -49,15 +49,15 @@ end table.insert(package.loaders, 2, vim._load_package) -- builtin functions which always should be available -require'vim.shared' +require('vim.shared') -vim._submodules = {inspect=true} +vim._submodules = { inspect = true } -- These are for loading runtime modules in the vim namespace lazily. setmetatable(vim, { __index = function(t, key) if vim._submodules[key] then - t[key] = require('vim.'..key) + t[key] = require('vim.' .. key) return t[key] elseif vim.startswith(key, 'uri_') then local val = require('vim.uri')[key] @@ -67,7 +67,7 @@ setmetatable(vim, { return t[key] end end - end + end, }) --- <Docs described in |vim.empty_dict()| > @@ -79,5 +79,5 @@ end -- only on main thread: functions for interacting with editor state if not vim.is_thread() then - require'vim._editor' + require('vim._editor') end diff --git a/runtime/lua/vim/_meta.lua b/runtime/lua/vim/_meta.lua index 522e26caa7..1706956bca 100644 --- a/runtime/lua/vim/_meta.lua +++ b/runtime/lua/vim/_meta.lua @@ -5,15 +5,17 @@ local a = vim.api local validate = vim.validate local SET_TYPES = setmetatable({ - SET = 0, - LOCAL = 1, + SET = 0, + LOCAL = 1, GLOBAL = 2, }, { __index = error }) local options_info = {} for _, v in pairs(a.nvim_get_all_options_info()) do options_info[v.name] = v - if v.shortname ~= "" then options_info[v.shortname] = v end + if v.shortname ~= '' then + options_info[v.shortname] = v + end end local get_scoped_options = function(scope) @@ -27,19 +29,21 @@ local get_scoped_options = function(scope) return result end -local buf_options = get_scoped_options("buf") -local glb_options = get_scoped_options("global") -local win_options = get_scoped_options("win") +local buf_options = get_scoped_options('buf') +local glb_options = get_scoped_options('global') +local win_options = get_scoped_options('win') local function make_meta_accessor(get, set, del, validator) - validator = validator or function() return true end + validator = validator or function() + return true + end - validate { - get = {get, 'f'}; - set = {set, 'f'}; - del = {del, 'f', true}; - validator = {validator, 'f'}; - } + validate({ + get = { get, 'f' }, + set = { set, 'f' }, + del = { del, 'f', true }, + validator = { validator, 'f' }, + }) local mt = {} function mt:__newindex(k, v) @@ -73,7 +77,7 @@ end, vim.fn.setenv) do -- buffer option accessor local function new_buf_opt_accessor(bufnr) local function get(k) - if bufnr == nil and type(k) == "number" then + if bufnr == nil and type(k) == 'number' then return new_buf_opt_accessor(k) end @@ -103,7 +107,7 @@ end do -- window option accessor local function new_win_opt_accessor(winnr) local function get(k) - if winnr == nil and type(k) == "number" then + if winnr == nil and type(k) == 'number' then return new_win_opt_accessor(k) end return a.nvim_win_get_option(winnr or 0, k) @@ -131,17 +135,19 @@ end -- vim global option -- this ONLY sets the global option. like `setglobal` -vim.go = make_meta_accessor( - function(k) return a.nvim_get_option_value(k, {scope = "global"}) end, - function(k, v) return a.nvim_set_option_value(k, v, {scope = "global"}) end -) +vim.go = make_meta_accessor(function(k) + return a.nvim_get_option_value(k, { scope = 'global' }) +end, function(k, v) + return a.nvim_set_option_value(k, v, { scope = 'global' }) +end) -- vim `set` style options. -- it has no additional metamethod magic. -vim.o = make_meta_accessor( - function(k) return a.nvim_get_option_value(k, {}) end, - function(k, v) return a.nvim_set_option_value(k, v, {}) end -) +vim.o = make_meta_accessor(function(k) + return a.nvim_get_option_value(k, {}) +end, function(k, v) + return a.nvim_set_option_value(k, v, {}) +end) ---@brief [[ --- vim.opt, vim.opt_local and vim.opt_global implementation @@ -154,7 +160,9 @@ vim.o = make_meta_accessor( --- Preserves the order and does not mutate the original list local remove_duplicate_values = function(t) local result, seen = {}, {} - if type(t) == "function" then error(debug.traceback("asdf")) end + if type(t) == 'function' then + error(debug.traceback('asdf')) + end for _, v in ipairs(t) do if not seen[v] then table.insert(result, v) @@ -171,37 +179,41 @@ end local key_value_options = { fillchars = true, listchars = true, - winhl = true, + winhl = true, } ---@class OptionTypes --- Option Type Enum local OptionTypes = setmetatable({ BOOLEAN = 0, - NUMBER = 1, - STRING = 2, - ARRAY = 3, - MAP = 4, - SET = 5, + NUMBER = 1, + STRING = 2, + ARRAY = 3, + MAP = 4, + SET = 5, }, { - __index = function(_, k) error("Not a valid OptionType: " .. k) end, - __newindex = function(_, k) error("Cannot set a new OptionType: " .. k) end, + __index = function(_, k) + error('Not a valid OptionType: ' .. k) + end, + __newindex = function(_, k) + error('Cannot set a new OptionType: ' .. k) + end, }) --- Convert a vimoption_T style dictionary to the correct OptionType associated with it. ---@return OptionType local get_option_type = function(name, info) - if info.type == "boolean" then + if info.type == 'boolean' then return OptionTypes.BOOLEAN - elseif info.type == "number" then + elseif info.type == 'number' then return OptionTypes.NUMBER - elseif info.type == "string" then + elseif info.type == 'string' then if not info.commalist and not info.flaglist then return OptionTypes.STRING end if key_value_options[name] then - assert(info.commalist, "Must be a comma list to use key:value style") + assert(info.commalist, 'Must be a comma list to use key:value style') return OptionTypes.MAP end @@ -211,13 +223,12 @@ local get_option_type = function(name, info) return OptionTypes.ARRAY end - error("Fallthrough in OptionTypes") + error('Fallthrough in OptionTypes') else - error("Not a known info.type:" .. info.type) + error('Not a known info.type:' .. info.type) end end - -- Check whether the OptionTypes is allowed for vim.opt -- If it does not match, throw an error which indicates which option causes the error. local function assert_valid_value(name, value, types) @@ -228,16 +239,18 @@ local function assert_valid_value(name, value, types) end end - error(string.format("Invalid option type '%s' for '%s', should be %s", type_of_value, name, table.concat(types, " or "))) + error( + string.format("Invalid option type '%s' for '%s', should be %s", type_of_value, name, table.concat(types, ' or ')) + ) end local valid_types = { - [OptionTypes.BOOLEAN] = { "boolean" }, - [OptionTypes.NUMBER] = { "number" }, - [OptionTypes.STRING] = { "string" }, - [OptionTypes.SET] = { "string", "table" }, - [OptionTypes.ARRAY] = { "string", "table" }, - [OptionTypes.MAP] = { "string", "table" }, + [OptionTypes.BOOLEAN] = { 'boolean' }, + [OptionTypes.NUMBER] = { 'number' }, + [OptionTypes.STRING] = { 'string' }, + [OptionTypes.SET] = { 'string', 'table' }, + [OptionTypes.ARRAY] = { 'string', 'table' }, + [OptionTypes.MAP] = { 'string', 'table' }, } --- Convert a lua value to a vimoption_T value @@ -245,12 +258,20 @@ local convert_value_to_vim = (function() -- Map of functions to take a Lua style value and convert to vimoption_T style value. -- Each function takes (info, lua_value) -> vim_value local to_vim_value = { - [OptionTypes.BOOLEAN] = function(_, value) return value end, - [OptionTypes.NUMBER] = function(_, value) return value end, - [OptionTypes.STRING] = function(_, value) return value end, + [OptionTypes.BOOLEAN] = function(_, value) + return value + end, + [OptionTypes.NUMBER] = function(_, value) + return value + end, + [OptionTypes.STRING] = function(_, value) + return value + end, [OptionTypes.SET] = function(info, value) - if type(value) == "string" then return value end + if type(value) == 'string' then + return value + end if info.flaglist and info.commalist then local keys = {} @@ -261,7 +282,7 @@ local convert_value_to_vim = (function() end table.sort(keys) - return table.concat(keys, ",") + return table.concat(keys, ',') else local result = '' for k, v in pairs(value) do @@ -275,23 +296,27 @@ local convert_value_to_vim = (function() end, [OptionTypes.ARRAY] = function(info, value) - if type(value) == "string" then return value end + if type(value) == 'string' then + return value + end if not info.allows_duplicates then value = remove_duplicate_values(value) end - return table.concat(value, ",") + return table.concat(value, ',') end, [OptionTypes.MAP] = function(_, value) - if type(value) == "string" then return value end + if type(value) == 'string' then + return value + end local result = {} for opt_key, opt_value in pairs(value) do - table.insert(result, string.format("%s:%s", opt_key, opt_value)) + table.insert(result, string.format('%s:%s', opt_key, opt_value)) end table.sort(result) - return table.concat(result, ",") + return table.concat(result, ',') end, } @@ -312,12 +337,18 @@ local convert_value_to_lua = (function() -- Map of OptionType to functions that take vimoption_T values and convert to lua values. -- Each function takes (info, vim_value) -> lua_value local to_lua_value = { - [OptionTypes.BOOLEAN] = function(_, value) return value end, - [OptionTypes.NUMBER] = function(_, value) return value end, - [OptionTypes.STRING] = function(_, value) return value end, + [OptionTypes.BOOLEAN] = function(_, value) + return value + end, + [OptionTypes.NUMBER] = function(_, value) + return value + end, + [OptionTypes.STRING] = function(_, value) + return value + end, [OptionTypes.ARRAY] = function(info, value) - if type(value) == "table" then + if type(value) == 'table' then if not info.allows_duplicates then value = remove_duplicate_values(value) end @@ -332,41 +363,43 @@ local convert_value_to_lua = (function() end -- Handles unescaped commas in a list. - if string.find(value, ",,,") then - local comma_split = vim.split(value, ",,,") + if string.find(value, ',,,') then + local comma_split = vim.split(value, ',,,') local left = comma_split[1] local right = comma_split[2] local result = {} - vim.list_extend(result, vim.split(left, ",")) - table.insert(result, ",") - vim.list_extend(result, vim.split(right, ",")) + vim.list_extend(result, vim.split(left, ',')) + table.insert(result, ',') + vim.list_extend(result, vim.split(right, ',')) table.sort(result) return result end - if string.find(value, ",^,,", 1, true) then - local comma_split = vim.split(value, ",^,,", true) + if string.find(value, ',^,,', 1, true) then + local comma_split = vim.split(value, ',^,,', true) local left = comma_split[1] local right = comma_split[2] local result = {} - vim.list_extend(result, vim.split(left, ",")) - table.insert(result, "^,") - vim.list_extend(result, vim.split(right, ",")) + vim.list_extend(result, vim.split(left, ',')) + table.insert(result, '^,') + vim.list_extend(result, vim.split(right, ',')) table.sort(result) return result end - return vim.split(value, ",") + return vim.split(value, ',') end, [OptionTypes.SET] = function(info, value) - if type(value) == "table" then return value end + if type(value) == 'table' then + return value + end -- Empty strings mean that there is nothing there, -- so empty table should be returned. @@ -374,10 +407,10 @@ local convert_value_to_lua = (function() return {} end - assert(info.flaglist, "That is the only one I know how to handle") + assert(info.flaglist, 'That is the only one I know how to handle') if info.flaglist and info.commalist then - local split_value = vim.split(value, ",") + local split_value = vim.split(value, ',') local result = {} for _, v in ipairs(split_value) do result[v] = true @@ -395,15 +428,17 @@ local convert_value_to_lua = (function() end, [OptionTypes.MAP] = function(info, raw_value) - if type(raw_value) == "table" then return raw_value end + if type(raw_value) == 'table' then + return raw_value + end - assert(info.commalist, "Only commas are supported currently") + assert(info.commalist, 'Only commas are supported currently') local result = {} - local comma_split = vim.split(raw_value, ",") + local comma_split = vim.split(raw_value, ',') for _, key_value_str in ipairs(comma_split) do - local key, value = unpack(vim.split(key_value_str, ":")) + local key, value = unpack(vim.split(key_value_str, ':')) key = vim.trim(key) result[key] = value @@ -443,17 +478,21 @@ local prepend_value = (function() end, [OptionTypes.MAP] = function(left, right) - return vim.tbl_extend("force", left, right) + return vim.tbl_extend('force', left, right) end, [OptionTypes.SET] = function(left, right) - return vim.tbl_extend("force", left, right) + return vim.tbl_extend('force', left, right) end, } return function(name, info, current, new) return value_mutator( - name, info, convert_value_to_lua(name, info, current), convert_value_to_lua(name, info, new), methods + name, + info, + convert_value_to_lua(name, info, current), + convert_value_to_lua(name, info, new), + methods ) end end)() @@ -478,17 +517,21 @@ local add_value = (function() end, [OptionTypes.MAP] = function(left, right) - return vim.tbl_extend("force", left, right) + return vim.tbl_extend('force', left, right) end, [OptionTypes.SET] = function(left, right) - return vim.tbl_extend("force", left, right) + return vim.tbl_extend('force', left, right) end, } return function(name, info, current, new) return value_mutator( - name, info, convert_value_to_lua(name, info, current), convert_value_to_lua(name, info, new), methods + name, + info, + convert_value_to_lua(name, info, current), + convert_value_to_lua(name, info, new), + methods ) end end)() @@ -518,11 +561,11 @@ local remove_value = (function() end, [OptionTypes.STRING] = function() - error("Subtraction not supported for strings.") + error('Subtraction not supported for strings.') end, [OptionTypes.ARRAY] = function(left, right) - if type(right) == "string" then + if type(right) == 'string' then remove_one_item(left, right) else for _, v in ipairs(right) do @@ -534,7 +577,7 @@ local remove_value = (function() end, [OptionTypes.MAP] = function(left, right) - if type(right) == "string" then + if type(right) == 'string' then left[right] = nil else for _, v in ipairs(right) do @@ -546,7 +589,7 @@ local remove_value = (function() end, [OptionTypes.SET] = function(left, right) - if type(right) == "string" then + if type(right) == 'string' then left[right] = nil else for _, v in ipairs(right) do @@ -567,9 +610,9 @@ local create_option_metatable = function(set_type) local set_mt, option_mt local make_option = function(name, value) - local info = assert(options_info[name], "Not a valid option name: " .. name) + local info = assert(options_info[name], 'Not a valid option name: ' .. name) - if type(value) == "table" and getmetatable(value) == option_mt then + if type(value) == 'table' and getmetatable(value) == option_mt then assert(name == value._name, "must be the same value, otherwise that's weird.") value = value._value @@ -584,9 +627,9 @@ local create_option_metatable = function(set_type) local scope if set_type == SET_TYPES.GLOBAL then - scope = "global" + scope = 'global' elseif set_type == SET_TYPES.LOCAL then - scope = "local" + scope = 'local' end option_mt = { @@ -594,7 +637,7 @@ local create_option_metatable = function(set_type) -- opt[my_option] = value _set = function(self) local value = convert_value_to_vim(self._name, self._info, self._value) - a.nvim_set_option_value(self._name, value, {scope = scope}) + a.nvim_set_option_value(self._name, value, { scope = scope }) return self end, @@ -625,13 +668,13 @@ local create_option_metatable = function(set_type) __sub = function(self, right) return make_option(self._name, remove_value(self._name, self._info, self._value, right)) - end + end, } option_mt.__index = option_mt set_mt = { __index = function(_, k) - return make_option(k, a.nvim_get_option_value(k, {scope = scope})) + return make_option(k, a.nvim_get_option_value(k, { scope = scope })) end, __newindex = function(_, k, v) diff --git a/runtime/lua/vim/compat.lua b/runtime/lua/vim/compat.lua index 168979bb95..2c9786d491 100644 --- a/runtime/lua/vim/compat.lua +++ b/runtime/lua/vim/compat.lua @@ -7,6 +7,6 @@ local lua_version = _VERSION:sub(-3) -if lua_version >= "5.2" then - unpack = table.unpack -- luacheck: ignore 121 143 +if lua_version >= '5.2' then + unpack = table.unpack -- luacheck: ignore 121 143 end diff --git a/runtime/lua/vim/diagnostic.lua b/runtime/lua/vim/diagnostic.lua index 80ce1f331d..bb12362234 100644 --- a/runtime/lua/vim/diagnostic.lua +++ b/runtime/lua/vim/diagnostic.lua @@ -28,7 +28,7 @@ local global_diagnostic_options = { M.handlers = setmetatable({}, { __newindex = function(t, name, handler) - vim.validate { handler = {handler, "t" } } + vim.validate({ handler = { handler, 't' } }) rawset(t, name, handler) if global_diagnostic_options[name] == nil then global_diagnostic_options[name] = true @@ -39,7 +39,7 @@ M.handlers = setmetatable({}, { -- Metatable that automatically creates an empty table when assigning to a missing key local bufnr_and_namespace_cacher_mt = { __index = function(t, bufnr) - assert(bufnr > 0, "Invalid buffer number") + assert(bufnr > 0, 'Invalid buffer number') t[bufnr] = {} return t[bufnr] end, @@ -47,11 +47,11 @@ local bufnr_and_namespace_cacher_mt = { local diagnostic_cache = setmetatable({}, { __index = function(t, bufnr) - assert(bufnr > 0, "Invalid buffer number") + assert(bufnr > 0, 'Invalid buffer number') vim.api.nvim_buf_attach(bufnr, false, { on_detach = function() rawset(t, bufnr, nil) -- clear cache - end + end, }) t[bufnr] = {} return t[bufnr] @@ -68,7 +68,7 @@ local all_namespaces = {} ---@private local function to_severity(severity) if type(severity) == 'string' then - return assert(M.severity[string.upper(severity)], string.format("Invalid severity: %s", severity)) + return assert(M.severity[string.upper(severity)], string.format('Invalid severity: %s', severity)) end return severity end @@ -79,15 +79,19 @@ local function filter_by_severity(severity, diagnostics) return diagnostics end - if type(severity) ~= "table" then + if type(severity) ~= 'table' then severity = to_severity(severity) - return vim.tbl_filter(function(t) return t.severity == severity end, diagnostics) + return vim.tbl_filter(function(t) + return t.severity == severity + end, diagnostics) end local min_severity = to_severity(severity.min) or M.severity.HINT local max_severity = to_severity(severity.max) or M.severity.ERROR - return vim.tbl_filter(function(t) return t.severity <= min_severity and t.severity >= max_severity end, diagnostics) + return vim.tbl_filter(function(t) + return t.severity <= min_severity and t.severity >= max_severity + end, diagnostics) end ---@private @@ -113,17 +117,17 @@ local function prefix_source(diagnostics) end local t = vim.deepcopy(d) - t.message = string.format("%s: %s", d.source, d.message) + t.message = string.format('%s: %s', d.source, d.message) return t end, diagnostics) end ---@private local function reformat_diagnostics(format, diagnostics) - vim.validate { - format = {format, 'f'}, - diagnostics = {diagnostics, 't'}, - } + vim.validate({ + format = { format, 'f' }, + diagnostics = { diagnostics, 't' }, + }) local formatted = vim.deepcopy(diagnostics) for _, diagnostic in ipairs(formatted) do @@ -135,11 +139,11 @@ end ---@private local function enabled_value(option, namespace) local ns = namespace and M.get_namespace(namespace) or {} - if ns.opts and type(ns.opts[option]) == "table" then + if ns.opts and type(ns.opts[option]) == 'table' then return ns.opts[option] end - if type(global_diagnostic_options[option]) == "table" then + if type(global_diagnostic_options[option]) == 'table' then return global_diagnostic_options[option] end @@ -162,7 +166,7 @@ local function resolve_optional_value(option, value, namespace, bufnr) elseif type(value) == 'table' then return value else - error("Unexpected option type: " .. vim.inspect(value)) + error('Unexpected option type: ' .. vim.inspect(value)) end end @@ -181,10 +185,10 @@ end -- Default diagnostic highlights local diagnostic_severities = { - [M.severity.ERROR] = { ctermfg = 1, guifg = "Red" }; - [M.severity.WARN] = { ctermfg = 3, guifg = "Orange" }; - [M.severity.INFO] = { ctermfg = 4, guifg = "LightBlue" }; - [M.severity.HINT] = { ctermfg = 7, guifg = "LightGrey" }; + [M.severity.ERROR] = { ctermfg = 1, guifg = 'Red' }, + [M.severity.WARN] = { ctermfg = 3, guifg = 'Orange' }, + [M.severity.INFO] = { ctermfg = 4, guifg = 'LightBlue' }, + [M.severity.HINT] = { ctermfg = 7, guifg = 'LightGrey' }, } -- Make a map from DiagnosticSeverity -> Highlight Name @@ -194,16 +198,16 @@ local function make_highlight_map(base_name) for k in pairs(diagnostic_severities) do local name = M.severity[k] name = name:sub(1, 1) .. name:sub(2):lower() - result[k] = "Diagnostic" .. base_name .. name + result[k] = 'Diagnostic' .. base_name .. name end return result end -local virtual_text_highlight_map = make_highlight_map("VirtualText") -local underline_highlight_map = make_highlight_map("Underline") -local floating_highlight_map = make_highlight_map("Floating") -local sign_highlight_map = make_highlight_map("Sign") +local virtual_text_highlight_map = make_highlight_map('VirtualText') +local underline_highlight_map = make_highlight_map('Underline') +local floating_highlight_map = make_highlight_map('Floating') +local sign_highlight_map = make_highlight_map('Sign') ---@private local define_default_signs = (function() @@ -244,7 +248,7 @@ local function is_disabled(namespace, bufnr) return true end - if type(diagnostic_disabled[bufnr]) == "table" then + if type(diagnostic_disabled[bufnr]) == 'table' then return diagnostic_disabled[bufnr][namespace] end return diagnostic_disabled[bufnr] @@ -271,8 +275,8 @@ end ---@private local function set_diagnostic_cache(namespace, bufnr, diagnostics) for _, diagnostic in ipairs(diagnostics) do - assert(diagnostic.lnum, "Diagnostic line number is required") - assert(diagnostic.col, "Diagnostic column is required") + assert(diagnostic.lnum, 'Diagnostic line number is required') + assert(diagnostic.col, 'Diagnostic column is required') diagnostic.severity = diagnostic.severity and to_severity(diagnostic.severity) or M.severity.ERROR diagnostic.end_lnum = diagnostic.end_lnum or diagnostic.lnum diagnostic.end_col = diagnostic.end_col or diagnostic.col @@ -285,7 +289,7 @@ end ---@private local function restore_extmarks(bufnr, last) for ns, extmarks in pairs(diagnostic_cache_extmarks[bufnr]) do - local extmarks_current = vim.api.nvim_buf_get_extmarks(bufnr, ns, 0, -1, {details = true}) + local extmarks_current = vim.api.nvim_buf_get_extmarks(bufnr, ns, 0, -1, { details = true }) local found = {} for _, extmark in ipairs(extmarks_current) do -- nvim_buf_set_lines will move any extmark to the line after the last @@ -314,10 +318,17 @@ local function save_extmarks(namespace, bufnr) end, on_detach = function() diagnostic_cache_extmarks[bufnr] = nil - end}) + end, + }) diagnostic_attached_buffers[bufnr] = true end - diagnostic_cache_extmarks[bufnr][namespace] = vim.api.nvim_buf_get_extmarks(bufnr, namespace, 0, -1, {details = true}) + diagnostic_cache_extmarks[bufnr][namespace] = vim.api.nvim_buf_get_extmarks( + bufnr, + namespace, + 0, + -1, + { details = true } + ) end local registered_autocmds = {} @@ -325,11 +336,11 @@ local registered_autocmds = {} ---@private local function make_augroup_key(namespace, bufnr) local ns = M.get_namespace(namespace) - return string.format("DiagnosticInsertLeave:%s:%s", bufnr, ns.name) + return string.format('DiagnosticInsertLeave:%s:%s', bufnr, ns.name) end --- Table of autocmd events to fire the update for displaying new diagnostic information -local insert_leave_auto_cmds = { "InsertLeave", "CursorHoldI" } +local insert_leave_auto_cmds = { 'InsertLeave', 'CursorHoldI' } ---@private local function schedule_display(namespace, bufnr, args) @@ -337,15 +348,17 @@ local function schedule_display(namespace, bufnr, args) local key = make_augroup_key(namespace, bufnr) if not registered_autocmds[key] then - vim.cmd(string.format([[augroup %s + vim.cmd(string.format( + [[augroup %s au! autocmd %s <buffer=%s> lua vim.diagnostic._execute_scheduled_display(%s, %s) augroup END]], key, - table.concat(insert_leave_auto_cmds, ","), + table.concat(insert_leave_auto_cmds, ','), bufnr, namespace, - bufnr)) + bufnr + )) registered_autocmds[key] = true end end @@ -355,9 +368,12 @@ local function clear_scheduled_display(namespace, bufnr) local key = make_augroup_key(namespace, bufnr) if registered_autocmds[key] then - vim.cmd(string.format([[augroup %s + vim.cmd(string.format( + [[augroup %s au! - augroup END]], key)) + augroup END]], + key + )) registered_autocmds[key] = nil end end @@ -382,7 +398,7 @@ local function get_diagnostics(bufnr, opts, clamp) if not opts.lnum or d.lnum == opts.lnum then if clamp and vim.api.nvim_buf_is_loaded(b) then local line_count = buf_line_count[b] - 1 - if (d.lnum > line_count or d.end_lnum > line_count or d.lnum < 0 or d.end_lnum < 0) then + if d.lnum > line_count or d.end_lnum > line_count or d.lnum < 0 or d.end_lnum < 0 then d = vim.deepcopy(d) d.lnum = math.max(math.min(d.lnum, line_count), 0) d.end_lnum = math.max(math.min(d.end_lnum, line_count), 0) @@ -431,7 +447,7 @@ end local function set_list(loclist, opts) opts = opts or {} local open = vim.F.if_nil(opts.open, true) - local title = opts.title or "Diagnostics" + local title = opts.title or 'Diagnostics' local winnr = opts.winnr or 0 local bufnr if loclist then @@ -447,7 +463,7 @@ local function set_list(loclist, opts) vim.fn.setqflist({}, ' ', { title = title, items = items }) end if open then - vim.api.nvim_command(loclist and "lopen" or "botright copen") + vim.api.nvim_command(loclist and 'lopen' or 'botright copen') end end @@ -457,7 +473,7 @@ local function next_diagnostic(position, search_forward, bufnr, opts, namespace) bufnr = get_bufnr(bufnr) local wrap = vim.F.if_nil(opts.wrap, true) local line_count = vim.api.nvim_buf_line_count(bufnr) - local diagnostics = get_diagnostics(bufnr, vim.tbl_extend("keep", opts, {namespace = namespace}), true) + local diagnostics = get_diagnostics(bufnr, vim.tbl_extend('keep', opts, { namespace = namespace }), true) local line_diagnostics = diagnostic_lines(diagnostics) for i = 0, line_count do local offset = i * (search_forward and 1 or -1) @@ -469,14 +485,22 @@ local function next_diagnostic(position, search_forward, bufnr, opts, namespace) lnum = (lnum + line_count) % line_count end if line_diagnostics[lnum] and not vim.tbl_isempty(line_diagnostics[lnum]) then - local line_length = #vim.api.nvim_buf_get_lines(bufnr, lnum, lnum + 1, true)[1] + local line_length = #vim.api.nvim_buf_get_lines(bufnr, lnum, lnum + 1, true)[1] local sort_diagnostics, is_next if search_forward then - sort_diagnostics = function(a, b) return a.col < b.col end - is_next = function(d) return math.min(d.col, line_length - 1) > position[2] end + sort_diagnostics = function(a, b) + return a.col < b.col + end + is_next = function(d) + return math.min(d.col, line_length - 1) > position[2] + end else - sort_diagnostics = function(a, b) return a.col > b.col end - is_next = function(d) return math.min(d.col, line_length - 1) < position[2] end + sort_diagnostics = function(a, b) + return a.col > b.col + end + is_next = function(d) + return math.min(d.col, line_length - 1) < position[2] + end end table.sort(line_diagnostics[lnum], sort_diagnostics) if i == 0 then @@ -500,28 +524,26 @@ local function diagnostic_move_pos(opts, pos) local win_id = opts.win_id or vim.api.nvim_get_current_win() if not pos then - vim.api.nvim_echo({{"No more valid diagnostics to move to", "WarningMsg"}}, true, {}) + vim.api.nvim_echo({ { 'No more valid diagnostics to move to', 'WarningMsg' } }, true, {}) return end vim.api.nvim_win_call(win_id, function() -- Save position in the window's jumplist vim.cmd("normal! m'") - vim.api.nvim_win_set_cursor(win_id, {pos[1] + 1, pos[2]}) + vim.api.nvim_win_set_cursor(win_id, { pos[1] + 1, pos[2] }) -- Open folds under the cursor - vim.cmd("normal! zv") + vim.cmd('normal! zv') end) if float then - local float_opts = type(float) == "table" and float or {} + local float_opts = type(float) == 'table' and float or {} vim.schedule(function() - M.open_float( - vim.tbl_extend("keep", float_opts, { - bufnr = vim.api.nvim_win_get_buf(win_id), - scope = "cursor", - focus = false, - }) - ) + M.open_float(vim.tbl_extend('keep', float_opts, { + bufnr = vim.api.nvim_win_get_buf(win_id), + scope = 'cursor', + focus = false, + })) end) end end @@ -599,10 +621,10 @@ end ---@param namespace number|nil Update the options for the given namespace. When omitted, update the --- global diagnostic options. function M.config(opts, namespace) - vim.validate { + vim.validate({ opts = { opts, 't', true }, namespace = { namespace, 'n', true }, - } + }) local t if namespace then @@ -645,16 +667,16 @@ end ---@param diagnostics table A list of diagnostic items |diagnostic-structure| ---@param opts table|nil Display options to pass to |vim.diagnostic.show()| function M.set(namespace, bufnr, diagnostics, opts) - vim.validate { - namespace = {namespace, 'n'}, - bufnr = {bufnr, 'n'}, + vim.validate({ + namespace = { namespace, 'n' }, + bufnr = { bufnr, 'n' }, diagnostics = { diagnostics, vim.tbl_islist, - "a list of diagnostics", + 'a list of diagnostics', }, - opts = {opts, 't', true}, - } + opts = { opts, 't', true }, + }) bufnr = get_bufnr(bufnr) @@ -668,7 +690,7 @@ function M.set(namespace, bufnr, diagnostics, opts) M.show(namespace, bufnr, nil, opts) end - vim.api.nvim_exec_autocmds("DiagnosticChanged", { + vim.api.nvim_exec_autocmds('DiagnosticChanged', { modeline = false, buffer = bufnr, }) @@ -679,7 +701,7 @@ end ---@param namespace number Diagnostic namespace ---@return table Namespace metadata function M.get_namespace(namespace) - vim.validate { namespace = { namespace, 'n' } } + vim.validate({ namespace = { namespace, 'n' } }) if not all_namespaces[namespace] then local name for k, v in pairs(vim.api.nvim_get_namespaces()) do @@ -689,7 +711,7 @@ function M.get_namespace(namespace) end end - assert(name, "namespace does not exist or is anonymous") + assert(name, 'namespace does not exist or is anonymous') all_namespaces[namespace] = { name = name, @@ -717,10 +739,10 @@ end --- - severity: See |diagnostic-severity|. ---@return table A list of diagnostic items |diagnostic-structure|. function M.get(bufnr, opts) - vim.validate { + vim.validate({ bufnr = { bufnr, 'n', true }, opts = { opts, 't', true }, - } + }) return get_diagnostics(bufnr, opts, false) end @@ -749,16 +771,13 @@ function M.get_prev_pos(opts) return false end - return {prev.lnum, prev.col} + return { prev.lnum, prev.col } end --- Move to the previous diagnostic in the current buffer. ---@param opts table See |vim.diagnostic.goto_next()| function M.goto_prev(opts) - return diagnostic_move_pos( - opts, - M.get_prev_pos(opts) - ) + return diagnostic_move_pos(opts, M.get_prev_pos(opts)) end --- Get the next diagnostic closest to the cursor position. @@ -785,7 +804,7 @@ function M.get_next_pos(opts) return false end - return {next.lnum, next.col} + return { next.lnum, next.col } end --- Move to the next diagnostic. @@ -803,24 +822,21 @@ end --- the "scope" option). --- - win_id: (number, default 0) Window ID function M.goto_next(opts) - return diagnostic_move_pos( - opts, - M.get_next_pos(opts) - ) + return diagnostic_move_pos(opts, M.get_next_pos(opts)) end M.handlers.signs = { show = function(namespace, bufnr, diagnostics, opts) - vim.validate { - namespace = {namespace, 'n'}, - bufnr = {bufnr, 'n'}, + vim.validate({ + namespace = { namespace, 'n' }, + bufnr = { bufnr, 'n' }, diagnostics = { diagnostics, vim.tbl_islist, - "a list of diagnostics", + 'a list of diagnostics', }, - opts = {opts, 't', true}, - } + opts = { opts, 't', true }, + }) bufnr = get_bufnr(bufnr) opts = opts or {} @@ -835,7 +851,7 @@ M.handlers.signs = { local priority = opts.signs and opts.signs.priority or 10 local get_priority if opts.severity_sort then - if type(opts.severity_sort) == "table" and opts.severity_sort.reverse then + if type(opts.severity_sort) == 'table' and opts.severity_sort.reverse then get_priority = function(severity) return priority + (severity - vim.diagnostic.severity.ERROR) end @@ -852,43 +868,37 @@ M.handlers.signs = { local ns = M.get_namespace(namespace) if not ns.user_data.sign_group then - ns.user_data.sign_group = string.format("vim.diagnostic.%s", ns.name) + ns.user_data.sign_group = string.format('vim.diagnostic.%s', ns.name) end local sign_group = ns.user_data.sign_group for _, diagnostic in ipairs(diagnostics) do - vim.fn.sign_place( - 0, - sign_group, - sign_highlight_map[diagnostic.severity], - bufnr, - { - priority = get_priority(diagnostic.severity), - lnum = diagnostic.lnum + 1 - } - ) + vim.fn.sign_place(0, sign_group, sign_highlight_map[diagnostic.severity], bufnr, { + priority = get_priority(diagnostic.severity), + lnum = diagnostic.lnum + 1, + }) end end, hide = function(namespace, bufnr) local ns = M.get_namespace(namespace) if ns.user_data.sign_group then - vim.fn.sign_unplace(ns.user_data.sign_group, {buffer=bufnr}) + vim.fn.sign_unplace(ns.user_data.sign_group, { buffer = bufnr }) end end, } M.handlers.underline = { show = function(namespace, bufnr, diagnostics, opts) - vim.validate { - namespace = {namespace, 'n'}, - bufnr = {bufnr, 'n'}, + vim.validate({ + namespace = { namespace, 'n' }, + bufnr = { bufnr, 'n' }, diagnostics = { diagnostics, vim.tbl_islist, - "a list of diagnostics", + 'a list of diagnostics', }, - opts = {opts, 't', true}, - } + opts = { opts, 't', true }, + }) bufnr = get_bufnr(bufnr) opts = opts or {} @@ -899,7 +909,7 @@ M.handlers.underline = { local ns = M.get_namespace(namespace) if not ns.user_data.underline_ns then - ns.user_data.underline_ns = vim.api.nvim_create_namespace("") + ns.user_data.underline_ns = vim.api.nvim_create_namespace('') end local underline_ns = ns.user_data.underline_ns @@ -928,21 +938,21 @@ M.handlers.underline = { diagnostic_cache_extmarks[bufnr][ns.user_data.underline_ns] = {} vim.api.nvim_buf_clear_namespace(bufnr, ns.user_data.underline_ns, 0, -1) end - end + end, } M.handlers.virtual_text = { show = function(namespace, bufnr, diagnostics, opts) - vim.validate { - namespace = {namespace, 'n'}, - bufnr = {bufnr, 'n'}, + vim.validate({ + namespace = { namespace, 'n' }, + bufnr = { bufnr, 'n' }, diagnostics = { diagnostics, vim.tbl_islist, - "a list of diagnostics", + 'a list of diagnostics', }, - opts = {opts, 't', true}, - } + opts = { opts, 't', true }, + }) bufnr = get_bufnr(bufnr) opts = opts or {} @@ -952,10 +962,7 @@ M.handlers.virtual_text = { if opts.virtual_text.format then diagnostics = reformat_diagnostics(opts.virtual_text.format, diagnostics) end - if - opts.virtual_text.source - and (opts.virtual_text.source ~= "if_many" or count_sources(bufnr) > 1) - then + if opts.virtual_text.source and (opts.virtual_text.source ~= 'if_many' or count_sources(bufnr) > 1) then diagnostics = prefix_source(diagnostics) end if opts.virtual_text.severity then @@ -965,7 +972,7 @@ M.handlers.virtual_text = { local ns = M.get_namespace(namespace) if not ns.user_data.virt_text_ns then - ns.user_data.virt_text_ns = vim.api.nvim_create_namespace("") + ns.user_data.virt_text_ns = vim.api.nvim_create_namespace('') end local virt_text_ns = ns.user_data.virt_text_ns @@ -978,7 +985,7 @@ M.handlers.virtual_text = { if virt_texts then vim.api.nvim_buf_set_extmark(bufnr, virt_text_ns, line, 0, { - hl_mode = "combine", + hl_mode = 'combine', virt_text = virt_texts, }) end @@ -1006,27 +1013,24 @@ function M._get_virt_text_chunks(line_diags, opts) end opts = opts or {} - local prefix = opts.prefix or "■" + local prefix = opts.prefix or '■' local spacing = opts.spacing or 4 -- Create a little more space between virtual text and contents - local virt_texts = {{string.rep(" ", spacing)}} + local virt_texts = { { string.rep(' ', spacing) } } for i = 1, #line_diags - 1 do - table.insert(virt_texts, {prefix, virtual_text_highlight_map[line_diags[i].severity]}) + table.insert(virt_texts, { prefix, virtual_text_highlight_map[line_diags[i].severity] }) end local last = line_diags[#line_diags] -- TODO(tjdevries): Allow different servers to be shown first somehow? -- TODO(tjdevries): Display server name associated with these? if last.message then - table.insert( - virt_texts, - { - string.format("%s %s", prefix, last.message:gsub("\r", ""):gsub("\n", " ")), - virtual_text_highlight_map[last.severity] - } - ) + table.insert(virt_texts, { + string.format('%s %s', prefix, last.message:gsub('\r', ''):gsub('\n', ' ')), + virtual_text_highlight_map[last.severity], + }) return virt_texts end @@ -1066,14 +1070,14 @@ end ---@param bufnr number|nil Buffer number, or 0 for current buffer. When --- omitted, hide diagnostics in all buffers. function M.hide(namespace, bufnr) - vim.validate { + vim.validate({ namespace = { namespace, 'n', true }, bufnr = { bufnr, 'n', true }, - } + }) - local buffers = bufnr and {get_bufnr(bufnr)} or vim.tbl_keys(diagnostic_cache) + local buffers = bufnr and { get_bufnr(bufnr) } or vim.tbl_keys(diagnostic_cache) for _, iter_bufnr in ipairs(buffers) do - local namespaces = namespace and {namespace} or vim.tbl_keys(diagnostic_cache[iter_bufnr]) + local namespaces = namespace and { namespace } or vim.tbl_keys(diagnostic_cache[iter_bufnr]) for _, iter_namespace in ipairs(namespaces) do for _, handler in pairs(M.handlers) do if handler.hide then @@ -1098,19 +1102,21 @@ end --- or {bufnr} is nil. ---@param opts table|nil Display options. See |vim.diagnostic.config()|. function M.show(namespace, bufnr, diagnostics, opts) - vim.validate { + vim.validate({ namespace = { namespace, 'n', true }, bufnr = { bufnr, 'n', true }, diagnostics = { diagnostics, - function(v) return v == nil or vim.tbl_islist(v) end, - "a list of diagnostics", + function(v) + return v == nil or vim.tbl_islist(v) + end, + 'a list of diagnostics', }, opts = { opts, 't', true }, - } + }) if not bufnr or not namespace then - assert(not diagnostics, "Cannot show diagnostics without a buffer and namespace") + assert(not diagnostics, 'Cannot show diagnostics without a buffer and namespace') if not bufnr then for iter_bufnr in pairs(diagnostic_cache) do M.show(namespace, iter_bufnr, nil, opts) @@ -1131,7 +1137,7 @@ function M.show(namespace, bufnr, diagnostics, opts) M.hide(namespace, bufnr) - diagnostics = diagnostics or get_diagnostics(bufnr, {namespace=namespace}, true) + diagnostics = diagnostics or get_diagnostics(bufnr, { namespace = namespace }, true) if not diagnostics or vim.tbl_isempty(diagnostics) then return @@ -1150,10 +1156,14 @@ function M.show(namespace, bufnr, diagnostics, opts) end if vim.F.if_nil(opts.severity_sort, false) then - if type(opts.severity_sort) == "table" and opts.severity_sort.reverse then - table.sort(diagnostics, function(a, b) return a.severity < b.severity end) + if type(opts.severity_sort) == 'table' and opts.severity_sort.reverse then + table.sort(diagnostics, function(a, b) + return a.severity < b.severity + end) else - table.sort(diagnostics, function(a, b) return a.severity > b.severity end) + table.sort(diagnostics, function(a, b) + return a.severity > b.severity + end) end end @@ -1209,13 +1219,13 @@ end function M.open_float(opts, ...) -- Support old (bufnr, opts) signature local bufnr - if opts == nil or type(opts) == "number" then + if opts == nil or type(opts) == 'number' then bufnr = opts opts = ... else - vim.validate { + vim.validate({ opts = { opts, 't', true }, - } + }) end opts = opts or {} @@ -1228,41 +1238,39 @@ function M.open_float(opts, ...) -- with its `opts` table which also includes "keyword" parameters. So we create a dedicated -- options table that inherits missing keys from the global configuration before resolving. local t = global_diagnostic_options.float - local float_opts = vim.tbl_extend("keep", opts, type(t) == "table" and t or {}) + local float_opts = vim.tbl_extend('keep', opts, type(t) == 'table' and t or {}) opts = get_resolved_options({ float = float_opts }, nil, bufnr).float end - local scope = ({l = "line", c = "cursor", b = "buffer"})[opts.scope] or opts.scope or "line" + local scope = ({ l = 'line', c = 'cursor', b = 'buffer' })[opts.scope] or opts.scope or 'line' local lnum, col - if scope == "line" or scope == "cursor" then + if scope == 'line' or scope == 'cursor' then if not opts.pos then local pos = vim.api.nvim_win_get_cursor(0) lnum = pos[1] - 1 col = pos[2] - elseif type(opts.pos) == "number" then + elseif type(opts.pos) == 'number' then lnum = opts.pos - elseif type(opts.pos) == "table" then + elseif type(opts.pos) == 'table' then lnum, col = unpack(opts.pos) else error("Invalid value for option 'pos'") end - elseif scope ~= "buffer" then + elseif scope ~= 'buffer' then error("Invalid value for option 'scope'") end local diagnostics = get_diagnostics(bufnr, opts, true) - if scope == "line" then + if scope == 'line' then diagnostics = vim.tbl_filter(function(d) return d.lnum == lnum end, diagnostics) - elseif scope == "cursor" then + elseif scope == 'cursor' then -- LSP servers can send diagnostics with `end_col` past the length of the line local line_length = #vim.api.nvim_buf_get_lines(bufnr, lnum, lnum + 1, true)[1] diagnostics = vim.tbl_filter(function(d) - return d.lnum == lnum - and math.min(d.col, line_length - 1) <= col - and (d.end_col >= col or d.end_lnum > lnum) + return d.lnum == lnum and math.min(d.col, line_length - 1) <= col and (d.end_col >= col or d.end_lnum > lnum) end, diagnostics) end @@ -1272,29 +1280,39 @@ function M.open_float(opts, ...) local severity_sort = vim.F.if_nil(opts.severity_sort, global_diagnostic_options.severity_sort) if severity_sort then - if type(severity_sort) == "table" and severity_sort.reverse then - table.sort(diagnostics, function(a, b) return a.severity > b.severity end) + if type(severity_sort) == 'table' and severity_sort.reverse then + table.sort(diagnostics, function(a, b) + return a.severity > b.severity + end) else - table.sort(diagnostics, function(a, b) return a.severity < b.severity end) + table.sort(diagnostics, function(a, b) + return a.severity < b.severity + end) end end local lines = {} local highlights = {} - local header = if_nil(opts.header, "Diagnostics:") + local header = if_nil(opts.header, 'Diagnostics:') if header then - vim.validate { header = { header, function(v) - return type(v) == "string" or type(v) == "table" - end, "'string' or 'table'" } } - if type(header) == "table" then + vim.validate({ + header = { + header, + function(v) + return type(v) == 'string' or type(v) == 'table' + end, + "'string' or 'table'", + }, + }) + if type(header) == 'table' then -- Don't insert any lines for an empty string - if string.len(if_nil(header[1], "")) > 0 then + if string.len(if_nil(header[1], '')) > 0 then table.insert(lines, header[1]) - table.insert(highlights, {0, header[2] or "Bold"}) + table.insert(highlights, { 0, header[2] or 'Bold' }) end elseif #header > 0 then table.insert(lines, header) - table.insert(highlights, {0, "Bold"}) + table.insert(highlights, { 0, 'Bold' }) end end @@ -1302,38 +1320,44 @@ function M.open_float(opts, ...) diagnostics = reformat_diagnostics(opts.format, diagnostics) end - if opts.source and (opts.source ~= "if_many" or count_sources(bufnr) > 1) then + if opts.source and (opts.source ~= 'if_many' or count_sources(bufnr) > 1) then diagnostics = prefix_source(diagnostics) end - local prefix_opt = if_nil(opts.prefix, (scope == "cursor" and #diagnostics <= 1) and "" or function(_, i) - return string.format("%d. ", i) + local prefix_opt = if_nil(opts.prefix, (scope == 'cursor' and #diagnostics <= 1) and '' or function(_, i) + return string.format('%d. ', i) end) local prefix, prefix_hl_group if prefix_opt then - vim.validate { prefix = { prefix_opt, function(v) - return type(v) == "string" or type(v) == "table" or type(v) == "function" - end, "'string' or 'table' or 'function'" } } - if type(prefix_opt) == "string" then - prefix, prefix_hl_group = prefix_opt, "NormalFloat" - elseif type(prefix_opt) == "table" then - prefix, prefix_hl_group = prefix_opt[1] or "", prefix_opt[2] or "NormalFloat" + vim.validate({ + prefix = { + prefix_opt, + function(v) + return type(v) == 'string' or type(v) == 'table' or type(v) == 'function' + end, + "'string' or 'table' or 'function'", + }, + }) + if type(prefix_opt) == 'string' then + prefix, prefix_hl_group = prefix_opt, 'NormalFloat' + elseif type(prefix_opt) == 'table' then + prefix, prefix_hl_group = prefix_opt[1] or '', prefix_opt[2] or 'NormalFloat' end end for i, diagnostic in ipairs(diagnostics) do - if prefix_opt and type(prefix_opt) == "function" then + if prefix_opt and type(prefix_opt) == 'function' then prefix, prefix_hl_group = prefix_opt(diagnostic, i, #diagnostics) - prefix, prefix_hl_group = prefix or "", prefix_hl_group or "NormalFloat" + prefix, prefix_hl_group = prefix or '', prefix_hl_group or 'NormalFloat' end local hiname = floating_highlight_map[diagnostic.severity] local message_lines = vim.split(diagnostic.message, '\n') - table.insert(lines, prefix..message_lines[1]) - table.insert(highlights, {#prefix, hiname, prefix_hl_group}) + table.insert(lines, prefix .. message_lines[1]) + table.insert(highlights, { #prefix, hiname, prefix_hl_group }) for j = 2, #message_lines do table.insert(lines, string.rep(' ', #prefix) .. message_lines[j]) - table.insert(highlights, {0, hiname}) + table.insert(highlights, { 0, hiname }) end end @@ -1345,9 +1369,9 @@ function M.open_float(opts, ...) for i, hi in ipairs(highlights) do local prefixlen, hiname, prefix_hiname = unpack(hi) if prefix_hiname then - vim.api.nvim_buf_add_highlight(float_bufnr, -1, prefix_hiname, i-1, 0, prefixlen) + vim.api.nvim_buf_add_highlight(float_bufnr, -1, prefix_hiname, i - 1, 0, prefixlen) end - vim.api.nvim_buf_add_highlight(float_bufnr, -1, hiname, i-1, prefixlen, -1) + vim.api.nvim_buf_add_highlight(float_bufnr, -1, hiname, i - 1, prefixlen, -1) end return float_bufnr, winnr @@ -1365,20 +1389,20 @@ end ---@param bufnr number|nil Remove diagnostics for the given buffer. When omitted, --- diagnostics are removed for all buffers. function M.reset(namespace, bufnr) - vim.validate { - namespace = {namespace, 'n', true}, - bufnr = {bufnr, 'n', true}, - } + vim.validate({ + namespace = { namespace, 'n', true }, + bufnr = { bufnr, 'n', true }, + }) - local buffers = bufnr and {get_bufnr(bufnr)} or vim.tbl_keys(diagnostic_cache) + local buffers = bufnr and { get_bufnr(bufnr) } or vim.tbl_keys(diagnostic_cache) for _, iter_bufnr in ipairs(buffers) do - local namespaces = namespace and {namespace} or vim.tbl_keys(diagnostic_cache[iter_bufnr]) + local namespaces = namespace and { namespace } or vim.tbl_keys(diagnostic_cache[iter_bufnr]) for _, iter_namespace in ipairs(namespaces) do diagnostic_cache[iter_bufnr][iter_namespace] = nil M.hide(iter_namespace, iter_bufnr) end - vim.api.nvim_exec_autocmds("DiagnosticChanged", { + vim.api.nvim_exec_autocmds('DiagnosticChanged', { modeline = false, buffer = iter_bufnr, }) @@ -1414,7 +1438,7 @@ end --- omitted, disable diagnostics in all buffers. ---@param namespace number|nil Only disable diagnostics for the given namespace. function M.disable(bufnr, namespace) - vim.validate { bufnr = {bufnr, 'n', true}, namespace = {namespace, 'n', true} } + vim.validate({ bufnr = { bufnr, 'n', true }, namespace = { namespace, 'n', true } }) if bufnr == nil then if namespace == nil then -- Disable everything (including as yet non-existing buffers and @@ -1422,7 +1446,9 @@ function M.disable(bufnr, namespace) -- its metatable to always return true. This metatable is removed -- in enable() diagnostic_disabled = setmetatable({}, { - __index = function() return true end, + __index = function() + return true + end, }) else local ns = M.get_namespace(namespace) @@ -1433,7 +1459,7 @@ function M.disable(bufnr, namespace) if namespace == nil then diagnostic_disabled[bufnr] = true else - if type(diagnostic_disabled[bufnr]) ~= "table" then + if type(diagnostic_disabled[bufnr]) ~= 'table' then diagnostic_disabled[bufnr] = {} end diagnostic_disabled[bufnr][namespace] = true @@ -1449,7 +1475,7 @@ end --- omitted, enable diagnostics in all buffers. ---@param namespace number|nil Only enable diagnostics for the given namespace. function M.enable(bufnr, namespace) - vim.validate { bufnr = {bufnr, 'n', true}, namespace = {namespace, 'n', true} } + vim.validate({ bufnr = { bufnr, 'n', true }, namespace = { namespace, 'n', true } }) if bufnr == nil then if namespace == nil then -- Enable everything by setting diagnostic_disabled to an empty table @@ -1463,7 +1489,7 @@ function M.enable(bufnr, namespace) if namespace == nil then diagnostic_disabled[bufnr] = nil else - if type(diagnostic_disabled[bufnr]) ~= "table" then + if type(diagnostic_disabled[bufnr]) ~= 'table' then return end diagnostic_disabled[bufnr][namespace] = nil @@ -1500,33 +1526,33 @@ end --- ERROR. ---@return diagnostic |diagnostic-structure| or `nil` if {pat} fails to match {str}. function M.match(str, pat, groups, severity_map, defaults) - vim.validate { + vim.validate({ str = { str, 's' }, pat = { pat, 's' }, groups = { groups, 't' }, severity_map = { severity_map, 't', true }, defaults = { defaults, 't', true }, - } + }) severity_map = severity_map or M.severity local diagnostic = {} - local matches = {string.match(str, pat)} + local matches = { string.match(str, pat) } if vim.tbl_isempty(matches) then return end for i, match in ipairs(matches) do local field = groups[i] - if field == "severity" then + if field == 'severity' then match = severity_map[match] - elseif field == "lnum" or field == "end_lnum" or field == "col" or field == "end_col" then + elseif field == 'lnum' or field == 'end_lnum' or field == 'col' or field == 'end_col' then match = assert(tonumber(match)) - 1 end diagnostic[field] = match end - diagnostic = vim.tbl_extend("keep", diagnostic, defaults or {}) + diagnostic = vim.tbl_extend('keep', diagnostic, defaults or {}) diagnostic.severity = diagnostic.severity or M.severity.ERROR diagnostic.col = diagnostic.col or 0 diagnostic.end_lnum = diagnostic.end_lnum or diagnostic.lnum @@ -1547,13 +1573,13 @@ local errlist_type_map = { ---@param diagnostics table List of diagnostics |diagnostic-structure|. ---@return array of quickfix list items |setqflist-what| function M.toqflist(diagnostics) - vim.validate { + vim.validate({ diagnostics = { diagnostics, vim.tbl_islist, - "a list of diagnostics", + 'a list of diagnostics', }, - } + }) local list = {} for _, v in ipairs(diagnostics) do @@ -1584,13 +1610,13 @@ end --- |getloclist()|. ---@return array of diagnostics |diagnostic-structure| function M.fromqflist(list) - vim.validate { + vim.validate({ list = { list, vim.tbl_islist, - "a list of quickfix items", + 'a list of quickfix items', }, - } + }) local diagnostics = {} for _, item in ipairs(list) do @@ -1599,7 +1625,7 @@ function M.fromqflist(list) local col = math.max(0, item.col - 1) local end_lnum = item.end_lnum > 0 and (item.end_lnum - 1) or lnum local end_col = item.end_col > 0 and (item.end_col - 1) or col - local severity = item.type ~= "" and M.severity[item.type] or M.severity.ERROR + local severity = item.type ~= '' and M.severity[item.type] or M.severity.ERROR table.insert(diagnostics, { bufnr = item.bufnr, lnum = lnum, diff --git a/runtime/lua/vim/filetype.lua b/runtime/lua/vim/filetype.lua index 32f4f825c1..8321e0b11e 100644 --- a/runtime/lua/vim/filetype.lua +++ b/runtime/lua/vim/filetype.lua @@ -4,866 +4,1007 @@ local M = {} ---@private local function starsetf(ft) - return {function(path) - if not vim.g.fg_ignore_pat then - return ft - end + return { + function(path) + if not vim.g.fg_ignore_pat then + return ft + end - local re = vim.regex(vim.g.fg_ignore_pat) - if re:match_str(path) then - return ft - end - end, { - -- Starset matches should always have lowest priority - priority = -math.huge, - }} + local re = vim.regex(vim.g.fg_ignore_pat) + if re:match_str(path) then + return ft + end + end, + { + -- Starset matches should always have lowest priority + priority = -math.huge, + }, + } end ---@private local function getline(bufnr, lnum) - return api.nvim_buf_get_lines(bufnr, lnum-1, lnum, false)[1] or "" + return api.nvim_buf_get_lines(bufnr, lnum - 1, lnum, false)[1] or '' end -- Filetypes based on file extension -- luacheck: push no unused args local extension = { -- BEGIN EXTENSION - ["8th"] = "8th", - ["a65"] = "a65", - aap = "aap", - abap = "abap", - abc = "abc", - abl = "abel", - wrm = "acedb", - ads = "ada", - ada = "ada", - gpr = "ada", - adb = "ada", - tdf = "ahdl", - aidl = "aidl", - aml = "aml", - run = "ampl", - scpt = "applescript", - ino = "arduino", - pde = "arduino", - art = "art", - asciidoc = "asciidoc", - adoc = "asciidoc", - ["asn1"] = "asn", - asn = "asn", - atl = "atlas", - as = "atlas", - ahk = "autohotkey", - ["au3"] = "autoit", - ave = "ave", - gawk = "awk", - awk = "awk", - ref = "b", - imp = "b", - mch = "b", - bc = "bc", - bdf = "bdf", - beancount = "beancount", - bib = "bib", - bicep = "bicep", - bl = "blank", - bsdl = "bsdl", - bst = "bst", - bzl = "bzl", - bazel = "bzl", - BUILD = "bzl", - qc = "c", - cabal = "cabal", - cdl = "cdl", - toc = "cdrtoc", - cfc = "cf", - cfm = "cf", - cfi = "cf", - hgrc = "cfg", - chf = "ch", - chai = "chaiscript", - chs = "chaskell", - chopro = "chordpro", - crd = "chordpro", - crdpro = "chordpro", - cho = "chordpro", - chordpro = "chordpro", - eni = "cl", - dcl = "clean", - icl = "clean", - cljx = "clojure", - clj = "clojure", - cljc = "clojure", - cljs = "clojure", - cook = "cook", - cmake = "cmake", - cmod = "cmod", - lib = "cobol", - cob = "cobol", - cbl = "cobol", - atg = "coco", - recipe = "conaryrecipe", + ['8th'] = '8th', + ['a65'] = 'a65', + aap = 'aap', + abap = 'abap', + abc = 'abc', + abl = 'abel', + wrm = 'acedb', + ads = 'ada', + ada = 'ada', + gpr = 'ada', + adb = 'ada', + tdf = 'ahdl', + aidl = 'aidl', + aml = 'aml', + run = 'ampl', + scpt = 'applescript', + ino = 'arduino', + pde = 'arduino', + art = 'art', + asciidoc = 'asciidoc', + adoc = 'asciidoc', + ['asn1'] = 'asn', + asn = 'asn', + atl = 'atlas', + as = 'atlas', + ahk = 'autohotkey', + ['au3'] = 'autoit', + ave = 'ave', + gawk = 'awk', + awk = 'awk', + ref = 'b', + imp = 'b', + mch = 'b', + bc = 'bc', + bdf = 'bdf', + beancount = 'beancount', + bib = 'bib', + bicep = 'bicep', + bl = 'blank', + bsdl = 'bsdl', + bst = 'bst', + bzl = 'bzl', + bazel = 'bzl', + BUILD = 'bzl', + qc = 'c', + cabal = 'cabal', + cdl = 'cdl', + toc = 'cdrtoc', + cfc = 'cf', + cfm = 'cf', + cfi = 'cf', + hgrc = 'cfg', + chf = 'ch', + chai = 'chaiscript', + chs = 'chaskell', + chopro = 'chordpro', + crd = 'chordpro', + crdpro = 'chordpro', + cho = 'chordpro', + chordpro = 'chordpro', + eni = 'cl', + dcl = 'clean', + icl = 'clean', + cljx = 'clojure', + clj = 'clojure', + cljc = 'clojure', + cljs = 'clojure', + cook = 'cook', + cmake = 'cmake', + cmod = 'cmod', + lib = 'cobol', + cob = 'cobol', + cbl = 'cobol', + atg = 'coco', + recipe = 'conaryrecipe', hook = function(path, bufnr) if getline(bufnr, 1) == '[Trigger]' then - return "conf" + return 'conf' end end, - mklx = "context", - mkiv = "context", - mkii = "context", - mkxl = "context", - mkvi = "context", - moc = "cpp", - hh = "cpp", - tlh = "cpp", - inl = "cpp", - ipp = "cpp", - ["c++"] = "cpp", - C = "cpp", - cxx = "cpp", - H = "cpp", - tcc = "cpp", - hxx = "cpp", - hpp = "cpp", + mklx = 'context', + mkiv = 'context', + mkii = 'context', + mkxl = 'context', + mkvi = 'context', + moc = 'cpp', + hh = 'cpp', + tlh = 'cpp', + inl = 'cpp', + ipp = 'cpp', + ['c++'] = 'cpp', + C = 'cpp', + cxx = 'cpp', + H = 'cpp', + tcc = 'cpp', + hxx = 'cpp', + hpp = 'cpp', cpp = function(path, bufnr) if vim.g.cynlib_syntax_for_cc then - return "cynlib" + return 'cynlib' end - return "cpp" + return 'cpp' end, cc = function(path, bufnr) if vim.g.cynlib_syntax_for_cc then - return "cynlib" + return 'cynlib' end - return "cpp" - end, - crm = "crm", - csx = "cs", - cs = "cs", - csc = "csc", - csdl = "csdl", - cshtml = "html", - fdr = "csp", - csp = "csp", - css = "css", - con = "cterm", - feature = "cucumber", - cuh = "cuda", - cu = "cuda", - pld = "cupl", - si = "cuplsim", - cyn = "cynpp", - dart = "dart", - drt = "dart", - ds = "datascript", - dcd = "dcd", - def = "def", - desc = "desc", - directory = "desktop", - desktop = "desktop", - diff = "diff", - rej = "diff", - Dockerfile = "dockerfile", - bat = "dosbatch", - wrap = "dosini", - ini = "dosini", - dot = "dot", - gv = "dot", - drac = "dracula", - drc = "dracula", - dtd = "dtd", - dts = "dts", - dtsi = "dts", - dylan = "dylan", - intr = "dylanintr", - lid = "dylanlid", - ecd = "ecd", - eex = "eelixir", - leex = "eelixir", - exs = "elixir", - elm = "elm", - elv = "elvish", - epp = "epuppet", - erl = "erlang", - hrl = "erlang", - yaws = "erlang", - erb = "eruby", - rhtml = "eruby", - ec = "esqlc", - EC = "esqlc", - strl = "esterel", - exp = "expect", - factor = "factor", - fal = "falcon", - fan = "fan", - fwt = "fan", - fnl = "fennel", - ["m4gl"] = "fgl", - ["4gl"] = "fgl", - ["4gh"] = "fgl", - fish = "fish", - focexec = "focexec", - fex = "focexec", - fth = "forth", - ft = "forth", - FOR = "fortran", - ["f77"] = "fortran", - ["f03"] = "fortran", - fortran = "fortran", - ["F95"] = "fortran", - ["f90"] = "fortran", - ["F03"] = "fortran", - fpp = "fortran", - FTN = "fortran", - ftn = "fortran", - ["for"] = "fortran", - ["F90"] = "fortran", - ["F77"] = "fortran", - ["f95"] = "fortran", - FPP = "fortran", - f = "fortran", - F = "fortran", - ["F08"] = "fortran", - ["f08"] = "fortran", - fpc = "fpcmake", - fsl = "framescript", - fb = "freebasic", - fsi = "fsharp", - fsx = "fsharp", - fusion = "fusion", - gdb = "gdb", - gdmo = "gdmo", - mo = "gdmo", - tres = "gdresource", - tscn = "gdresource", - gd = "gdscript", - ged = "gedcom", - gmi = "gemtext", - gemini = "gemtext", - gift = "gift", - gleam = "gleam", - glsl = "glsl", - gpi = "gnuplot", - gnuplot = "gnuplot", - go = "go", - gp = "gp", - gs = "grads", - gql = "graphql", - graphql = "graphql", - graphqls = "graphql", - gretl = "gretl", - gradle = "groovy", - groovy = "groovy", - gsp = "gsp", - gjs = "javascript.glimmer", - gts = "typescript.glimmer", - hack = "hack", - hackpartial = "hack", - haml = "haml", - hsm = "hamster", - hbs = "handlebars", - ["hs-boot"] = "haskell", - hsig = "haskell", - hsc = "haskell", - hs = "haskell", - ht = "haste", - htpp = "hastepreproc", - hb = "hb", - sum = "hercules", - errsum = "hercules", - ev = "hercules", - vc = "hercules", - hcl = "hcl", - heex = "heex", - hex = "hex", - ["h32"] = "hex", - hjson = "hjson", - hog = "hog", - hws = "hollywood", - htt = "httest", - htb = "httest", - iba = "ibasic", - ibi = "ibasic", - icn = "icon", - inf = "inform", - INF = "inform", - ii = "initng", - iss = "iss", - mst = "ist", - ist = "ist", - ijs = "j", - JAL = "jal", - jal = "jal", - jpr = "jam", - jpl = "jam", - jav = "java", - java = "java", - jj = "javacc", - jjt = "javacc", - es = "javascript", - mjs = "javascript", - javascript = "javascript", - js = "javascript", - cjs = "javascript", - jsx = "javascriptreact", - clp = "jess", - jgr = "jgraph", - ["j73"] = "jovial", - jov = "jovial", - jovial = "jovial", - properties = "jproperties", - slnf = "json", - json = "json", - jsonp = "json", - webmanifest = "json", - ipynb = "json", - ["json-patch"] = "json", - json5 = "json5", - jsonc = "jsonc", - jsp = "jsp", - jl = "julia", - kv = "kivy", - kix = "kix", - kts = "kotlin", - kt = "kotlin", - ktm = "kotlin", - ks = "kscript", - k = "kwt", - ACE = "lace", - ace = "lace", - latte = "latte", - lte = "latte", - ld = "ld", - ldif = "ldif", - journal = "ledger", - ldg = "ledger", - ledger = "ledger", - less = "less", - lex = "lex", - lxx = "lex", - ["l++"] = "lex", - l = "lex", - lhs = "lhaskell", - ll = "lifelines", - ly = "lilypond", - ily = "lilypond", - liquid = "liquid", - cl = "lisp", - L = "lisp", - lisp = "lisp", - el = "lisp", - lsp = "lisp", - asd = "lisp", - lt = "lite", - lite = "lite", - lgt = "logtalk", - lotos = "lotos", - lot = "lotos", - lout = "lout", - lou = "lout", - ulpc = "lpc", - lpc = "lpc", - sig = "lprolog", - lsl = "lsl", - lss = "lss", - nse = "lua", - rockspec = "lua", - lua = "lua", - quake = "m3quake", - at = "m4", - eml = "mail", - mk = "make", - mak = "make", - dsp = "make", - page = "mallard", - map = "map", - mws = "maple", - mpl = "maple", - mv = "maple", - mkdn = "markdown", - md = "markdown", - mdwn = "markdown", - mkd = "markdown", - markdown = "markdown", - mdown = "markdown", - mhtml = "mason", - comp = "mason", - mason = "mason", - master = "master", - mas = "master", - demo = "maxima", - dm1 = "maxima", - dm2 = "maxima", - dm3 = "maxima", - dmt = "maxima", - wxm = "maxima", - mel = "mel", - mf = "mf", - mgl = "mgl", - mgp = "mgp", - my = "mib", - mib = "mib", - mix = "mix", - mixal = "mix", - nb = "mma", - mmp = "mmp", - DEF = "modula2", - ["m2"] = "modula2", - mi = "modula2", - ssc = "monk", - monk = "monk", - tsc = "monk", - isc = "monk", - moo = "moo", - mp = "mp", - mof = "msidl", - odl = "msidl", - msql = "msql", - mu = "mupad", - mush = "mush", - mysql = "mysql", - ["n1ql"] = "n1ql", - nql = "n1ql", - nanorc = "nanorc", - ncf = "ncf", - nginx = "nginx", - ninja = "ninja", - nix = "nix", - nqc = "nqc", - roff = "nroff", - tmac = "nroff", - man = "nroff", - mom = "nroff", - nr = "nroff", - tr = "nroff", - nsi = "nsis", - nsh = "nsis", - obj = "obj", - mlt = "ocaml", - mly = "ocaml", - mll = "ocaml", - mlp = "ocaml", - mlip = "ocaml", - mli = "ocaml", - ml = "ocaml", - occ = "occam", - xom = "omnimark", - xin = "omnimark", - opam = "opam", - ["or"] = "openroad", - scad = "openscad", - ora = "ora", - org = "org", - org_archive = "org", - pxsl = "papp", - papp = "papp", - pxml = "papp", - pas = "pascal", - lpr = "pascal", - dpr = "pascal", - pbtxt = "pbtxt", - g = "pccts", - pcmk = "pcmk", - pdf = "pdf", - plx = "perl", - prisma = "prisma", - psgi = "perl", - al = "perl", - ctp = "php", - php = "php", - phpt = "php", - phtml = "php", - pike = "pike", - pmod = "pike", - rcp = "pilrc", - pli = "pli", - ["pl1"] = "pli", - ["p36"] = "plm", - plm = "plm", - pac = "plm", - plp = "plp", - pls = "plsql", - plsql = "plsql", - po = "po", - pot = "po", - pod = "pod", - pk = "poke", - ps = "postscr", - epsi = "postscr", - afm = "postscr", - epsf = "postscr", - eps = "postscr", - pfa = "postscr", - ai = "postscr", - pov = "pov", - ppd = "ppd", - it = "ppwiz", - ih = "ppwiz", - action = "privoxy", - pc = "proc", - pdb = "prolog", - pml = "promela", - proto = "proto", - ["psd1"] = "ps1", - ["psm1"] = "ps1", - ["ps1"] = "ps1", - pssc = "ps1", - ["ps1xml"] = "ps1xml", - psf = "psf", - psl = "psl", - pug = "pug", - arr = "pyret", - pxd = "pyrex", - pyx = "pyrex", - pyw = "python", - py = "python", - pyi = "python", - ptl = "python", - ql = "ql", - qll = "ql", - rad = "radiance", - mat = "radiance", - ["pod6"] = "raku", - rakudoc = "raku", - rakutest = "raku", - rakumod = "raku", - ["pm6"] = "raku", - raku = "raku", - ["t6"] = "raku", - ["p6"] = "raku", - raml = "raml", - rbs = "rbs", - rego = "rego", - rem = "remind", - remind = "remind", - res = "rescript", - resi = "rescript", - frt = "reva", - testUnit = "rexx", - rex = "rexx", - orx = "rexx", - rexx = "rexx", - jrexx = "rexx", - rxj = "rexx", - rexxj = "rexx", - testGroup = "rexx", - rxo = "rexx", - Rd = "rhelp", - rd = "rhelp", - rib = "rib", - Rmd = "rmd", - rmd = "rmd", - smd = "rmd", - Smd = "rmd", - rnc = "rnc", - rng = "rng", - rnw = "rnoweb", - snw = "rnoweb", - Rnw = "rnoweb", - Snw = "rnoweb", - robot = "robot", - resource = "robot", - rsc = "routeros", - x = "rpcgen", - rpl = "rpl", - Srst = "rrst", - srst = "rrst", - Rrst = "rrst", - rrst = "rrst", - rst = "rst", - rtf = "rtf", - rjs = "ruby", - rxml = "ruby", - rb = "ruby", - rant = "ruby", - ru = "ruby", - rbw = "ruby", - gemspec = "ruby", - builder = "ruby", - rake = "ruby", - rs = "rust", - sas = "sas", - sass = "sass", - sa = "sather", - sbt = "sbt", - scala = "scala", - ss = "scheme", - scm = "scheme", - sld = "scheme", - rkt = "scheme", - rktd = "scheme", - rktl = "scheme", - sce = "scilab", - sci = "scilab", - scss = "scss", - sd = "sd", - sdc = "sdc", - pr = "sdl", - sdl = "sdl", - sed = "sed", - sexp = "sexplib", - sieve = "sieve", - siv = "sieve", - sil = "sil", - sim = "simula", - ["s85"] = "sinda", - sin = "sinda", - ssm = "sisu", - sst = "sisu", - ssi = "sisu", - ["_sst"] = "sisu", - ["-sst"] = "sisu", - il = "skill", - ils = "skill", - cdf = "skill", - sl = "slang", - ice = "slice", - score = "slrnsc", - sol = "solidity", - tpl = "smarty", - ihlp = "smcl", - smcl = "smcl", - hlp = "smcl", - smith = "smith", - smt = "smith", - sml = "sml", - spt = "snobol4", - sno = "snobol4", - sln = "solution", - sparql = "sparql", - rq = "sparql", - spec = "spec", - spice = "spice", - sp = "spice", - spd = "spup", - spdata = "spup", - speedup = "spup", - spi = "spyce", - spy = "spyce", - tyc = "sql", - typ = "sql", - pkb = "sql", - tyb = "sql", - pks = "sql", - sqlj = "sqlj", - sqi = "sqr", - sqr = "sqr", - nut = "squirrel", - ["s28"] = "srec", - ["s37"] = "srec", - srec = "srec", - mot = "srec", - ["s19"] = "srec", - st = "st", - imata = "stata", - ["do"] = "stata", - mata = "stata", - ado = "stata", - stp = "stp", - quark = "supercollider", - sface = "surface", - svelte = "svelte", - svg = "svg", - swift = "swift", - svh = "systemverilog", - sv = "systemverilog", - tak = "tak", - task = "taskedit", - tm = "tcl", - tcl = "tcl", - itk = "tcl", - itcl = "tcl", - tk = "tcl", - jacl = "tcl", - tl = "teal", - tmpl = "template", - ti = "terminfo", - dtx = "tex", - ltx = "tex", - bbl = "tex", - latex = "tex", - sty = "tex", - texi = "texinfo", - txi = "texinfo", - texinfo = "texinfo", - text = "text", - tfvars = "terraform", - tla = "tla", - tli = "tli", - toml = "toml", - tpp = "tpp", - treetop = "treetop", - slt = "tsalt", - tsscl = "tsscl", - tssgm = "tssgm", - tssop = "tssop", - tutor = "tutor", - twig = "twig", + return 'cpp' + end, + crm = 'crm', + csx = 'cs', + cs = 'cs', + csc = 'csc', + csdl = 'csdl', + cshtml = 'html', + fdr = 'csp', + csp = 'csp', + css = 'css', + con = 'cterm', + feature = 'cucumber', + cuh = 'cuda', + cu = 'cuda', + pld = 'cupl', + si = 'cuplsim', + cyn = 'cynpp', + dart = 'dart', + drt = 'dart', + ds = 'datascript', + dcd = 'dcd', + def = 'def', + desc = 'desc', + directory = 'desktop', + desktop = 'desktop', + diff = 'diff', + rej = 'diff', + Dockerfile = 'dockerfile', + bat = 'dosbatch', + wrap = 'dosini', + ini = 'dosini', + dot = 'dot', + gv = 'dot', + drac = 'dracula', + drc = 'dracula', + dtd = 'dtd', + dts = 'dts', + dtsi = 'dts', + dylan = 'dylan', + intr = 'dylanintr', + lid = 'dylanlid', + ecd = 'ecd', + eex = 'eelixir', + leex = 'eelixir', + exs = 'elixir', + elm = 'elm', + elv = 'elvish', + epp = 'epuppet', + erl = 'erlang', + hrl = 'erlang', + yaws = 'erlang', + erb = 'eruby', + rhtml = 'eruby', + ec = 'esqlc', + EC = 'esqlc', + strl = 'esterel', + exp = 'expect', + factor = 'factor', + fal = 'falcon', + fan = 'fan', + fwt = 'fan', + fnl = 'fennel', + ['m4gl'] = 'fgl', + ['4gl'] = 'fgl', + ['4gh'] = 'fgl', + fish = 'fish', + focexec = 'focexec', + fex = 'focexec', + fth = 'forth', + ft = 'forth', + FOR = 'fortran', + ['f77'] = 'fortran', + ['f03'] = 'fortran', + fortran = 'fortran', + ['F95'] = 'fortran', + ['f90'] = 'fortran', + ['F03'] = 'fortran', + fpp = 'fortran', + FTN = 'fortran', + ftn = 'fortran', + ['for'] = 'fortran', + ['F90'] = 'fortran', + ['F77'] = 'fortran', + ['f95'] = 'fortran', + FPP = 'fortran', + f = 'fortran', + F = 'fortran', + ['F08'] = 'fortran', + ['f08'] = 'fortran', + fpc = 'fpcmake', + fsl = 'framescript', + fb = 'freebasic', + fsi = 'fsharp', + fsx = 'fsharp', + fusion = 'fusion', + gdb = 'gdb', + gdmo = 'gdmo', + mo = 'gdmo', + tres = 'gdresource', + tscn = 'gdresource', + gd = 'gdscript', + ged = 'gedcom', + gmi = 'gemtext', + gemini = 'gemtext', + gift = 'gift', + gleam = 'gleam', + glsl = 'glsl', + gpi = 'gnuplot', + gnuplot = 'gnuplot', + go = 'go', + gp = 'gp', + gs = 'grads', + gql = 'graphql', + graphql = 'graphql', + graphqls = 'graphql', + gretl = 'gretl', + gradle = 'groovy', + groovy = 'groovy', + gsp = 'gsp', + gjs = 'javascript.glimmer', + gts = 'typescript.glimmer', + hack = 'hack', + hackpartial = 'hack', + haml = 'haml', + hsm = 'hamster', + hbs = 'handlebars', + ['hs-boot'] = 'haskell', + hsig = 'haskell', + hsc = 'haskell', + hs = 'haskell', + ht = 'haste', + htpp = 'hastepreproc', + hb = 'hb', + sum = 'hercules', + errsum = 'hercules', + ev = 'hercules', + vc = 'hercules', + hcl = 'hcl', + heex = 'heex', + hex = 'hex', + ['h32'] = 'hex', + hjson = 'hjson', + hog = 'hog', + hws = 'hollywood', + htt = 'httest', + htb = 'httest', + iba = 'ibasic', + ibi = 'ibasic', + icn = 'icon', + inf = 'inform', + INF = 'inform', + ii = 'initng', + iss = 'iss', + mst = 'ist', + ist = 'ist', + ijs = 'j', + JAL = 'jal', + jal = 'jal', + jpr = 'jam', + jpl = 'jam', + jav = 'java', + java = 'java', + jj = 'javacc', + jjt = 'javacc', + es = 'javascript', + mjs = 'javascript', + javascript = 'javascript', + js = 'javascript', + cjs = 'javascript', + jsx = 'javascriptreact', + clp = 'jess', + jgr = 'jgraph', + ['j73'] = 'jovial', + jov = 'jovial', + jovial = 'jovial', + properties = 'jproperties', + slnf = 'json', + json = 'json', + jsonp = 'json', + webmanifest = 'json', + ipynb = 'json', + ['json-patch'] = 'json', + json5 = 'json5', + jsonc = 'jsonc', + jsp = 'jsp', + jl = 'julia', + kv = 'kivy', + kix = 'kix', + kts = 'kotlin', + kt = 'kotlin', + ktm = 'kotlin', + ks = 'kscript', + k = 'kwt', + ACE = 'lace', + ace = 'lace', + latte = 'latte', + lte = 'latte', + ld = 'ld', + ldif = 'ldif', + journal = 'ledger', + ldg = 'ledger', + ledger = 'ledger', + less = 'less', + lex = 'lex', + lxx = 'lex', + ['l++'] = 'lex', + l = 'lex', + lhs = 'lhaskell', + ll = 'lifelines', + ly = 'lilypond', + ily = 'lilypond', + liquid = 'liquid', + cl = 'lisp', + L = 'lisp', + lisp = 'lisp', + el = 'lisp', + lsp = 'lisp', + asd = 'lisp', + lt = 'lite', + lite = 'lite', + lgt = 'logtalk', + lotos = 'lotos', + lot = 'lotos', + lout = 'lout', + lou = 'lout', + ulpc = 'lpc', + lpc = 'lpc', + sig = 'lprolog', + lsl = 'lsl', + lss = 'lss', + nse = 'lua', + rockspec = 'lua', + lua = 'lua', + quake = 'm3quake', + at = 'm4', + eml = 'mail', + mk = 'make', + mak = 'make', + dsp = 'make', + page = 'mallard', + map = 'map', + mws = 'maple', + mpl = 'maple', + mv = 'maple', + mkdn = 'markdown', + md = 'markdown', + mdwn = 'markdown', + mkd = 'markdown', + markdown = 'markdown', + mdown = 'markdown', + mhtml = 'mason', + comp = 'mason', + mason = 'mason', + master = 'master', + mas = 'master', + demo = 'maxima', + dm1 = 'maxima', + dm2 = 'maxima', + dm3 = 'maxima', + dmt = 'maxima', + wxm = 'maxima', + mel = 'mel', + mf = 'mf', + mgl = 'mgl', + mgp = 'mgp', + my = 'mib', + mib = 'mib', + mix = 'mix', + mixal = 'mix', + nb = 'mma', + mmp = 'mmp', + DEF = 'modula2', + ['m2'] = 'modula2', + mi = 'modula2', + ssc = 'monk', + monk = 'monk', + tsc = 'monk', + isc = 'monk', + moo = 'moo', + mp = 'mp', + mof = 'msidl', + odl = 'msidl', + msql = 'msql', + mu = 'mupad', + mush = 'mush', + mysql = 'mysql', + ['n1ql'] = 'n1ql', + nql = 'n1ql', + nanorc = 'nanorc', + ncf = 'ncf', + nginx = 'nginx', + ninja = 'ninja', + nix = 'nix', + nqc = 'nqc', + roff = 'nroff', + tmac = 'nroff', + man = 'nroff', + mom = 'nroff', + nr = 'nroff', + tr = 'nroff', + nsi = 'nsis', + nsh = 'nsis', + obj = 'obj', + mlt = 'ocaml', + mly = 'ocaml', + mll = 'ocaml', + mlp = 'ocaml', + mlip = 'ocaml', + mli = 'ocaml', + ml = 'ocaml', + occ = 'occam', + xom = 'omnimark', + xin = 'omnimark', + opam = 'opam', + ['or'] = 'openroad', + scad = 'openscad', + ora = 'ora', + org = 'org', + org_archive = 'org', + pxsl = 'papp', + papp = 'papp', + pxml = 'papp', + pas = 'pascal', + lpr = 'pascal', + dpr = 'pascal', + pbtxt = 'pbtxt', + g = 'pccts', + pcmk = 'pcmk', + pdf = 'pdf', + plx = 'perl', + prisma = 'prisma', + psgi = 'perl', + al = 'perl', + ctp = 'php', + php = 'php', + phpt = 'php', + phtml = 'php', + pike = 'pike', + pmod = 'pike', + rcp = 'pilrc', + pli = 'pli', + ['pl1'] = 'pli', + ['p36'] = 'plm', + plm = 'plm', + pac = 'plm', + plp = 'plp', + pls = 'plsql', + plsql = 'plsql', + po = 'po', + pot = 'po', + pod = 'pod', + pk = 'poke', + ps = 'postscr', + epsi = 'postscr', + afm = 'postscr', + epsf = 'postscr', + eps = 'postscr', + pfa = 'postscr', + ai = 'postscr', + pov = 'pov', + ppd = 'ppd', + it = 'ppwiz', + ih = 'ppwiz', + action = 'privoxy', + pc = 'proc', + pdb = 'prolog', + pml = 'promela', + proto = 'proto', + ['psd1'] = 'ps1', + ['psm1'] = 'ps1', + ['ps1'] = 'ps1', + pssc = 'ps1', + ['ps1xml'] = 'ps1xml', + psf = 'psf', + psl = 'psl', + pug = 'pug', + arr = 'pyret', + pxd = 'pyrex', + pyx = 'pyrex', + pyw = 'python', + py = 'python', + pyi = 'python', + ptl = 'python', + ql = 'ql', + qll = 'ql', + rad = 'radiance', + mat = 'radiance', + ['pod6'] = 'raku', + rakudoc = 'raku', + rakutest = 'raku', + rakumod = 'raku', + ['pm6'] = 'raku', + raku = 'raku', + ['t6'] = 'raku', + ['p6'] = 'raku', + raml = 'raml', + rbs = 'rbs', + rego = 'rego', + rem = 'remind', + remind = 'remind', + res = 'rescript', + resi = 'rescript', + frt = 'reva', + testUnit = 'rexx', + rex = 'rexx', + orx = 'rexx', + rexx = 'rexx', + jrexx = 'rexx', + rxj = 'rexx', + rexxj = 'rexx', + testGroup = 'rexx', + rxo = 'rexx', + Rd = 'rhelp', + rd = 'rhelp', + rib = 'rib', + Rmd = 'rmd', + rmd = 'rmd', + smd = 'rmd', + Smd = 'rmd', + rnc = 'rnc', + rng = 'rng', + rnw = 'rnoweb', + snw = 'rnoweb', + Rnw = 'rnoweb', + Snw = 'rnoweb', + robot = 'robot', + resource = 'robot', + rsc = 'routeros', + x = 'rpcgen', + rpl = 'rpl', + Srst = 'rrst', + srst = 'rrst', + Rrst = 'rrst', + rrst = 'rrst', + rst = 'rst', + rtf = 'rtf', + rjs = 'ruby', + rxml = 'ruby', + rb = 'ruby', + rant = 'ruby', + ru = 'ruby', + rbw = 'ruby', + gemspec = 'ruby', + builder = 'ruby', + rake = 'ruby', + rs = 'rust', + sas = 'sas', + sass = 'sass', + sa = 'sather', + sbt = 'sbt', + scala = 'scala', + ss = 'scheme', + scm = 'scheme', + sld = 'scheme', + rkt = 'scheme', + rktd = 'scheme', + rktl = 'scheme', + sce = 'scilab', + sci = 'scilab', + scss = 'scss', + sd = 'sd', + sdc = 'sdc', + pr = 'sdl', + sdl = 'sdl', + sed = 'sed', + sexp = 'sexplib', + sieve = 'sieve', + siv = 'sieve', + sil = 'sil', + sim = 'simula', + ['s85'] = 'sinda', + sin = 'sinda', + ssm = 'sisu', + sst = 'sisu', + ssi = 'sisu', + ['_sst'] = 'sisu', + ['-sst'] = 'sisu', + il = 'skill', + ils = 'skill', + cdf = 'skill', + sl = 'slang', + ice = 'slice', + score = 'slrnsc', + sol = 'solidity', + tpl = 'smarty', + ihlp = 'smcl', + smcl = 'smcl', + hlp = 'smcl', + smith = 'smith', + smt = 'smith', + sml = 'sml', + spt = 'snobol4', + sno = 'snobol4', + sln = 'solution', + sparql = 'sparql', + rq = 'sparql', + spec = 'spec', + spice = 'spice', + sp = 'spice', + spd = 'spup', + spdata = 'spup', + speedup = 'spup', + spi = 'spyce', + spy = 'spyce', + tyc = 'sql', + typ = 'sql', + pkb = 'sql', + tyb = 'sql', + pks = 'sql', + sqlj = 'sqlj', + sqi = 'sqr', + sqr = 'sqr', + nut = 'squirrel', + ['s28'] = 'srec', + ['s37'] = 'srec', + srec = 'srec', + mot = 'srec', + ['s19'] = 'srec', + st = 'st', + imata = 'stata', + ['do'] = 'stata', + mata = 'stata', + ado = 'stata', + stp = 'stp', + quark = 'supercollider', + sface = 'surface', + svelte = 'svelte', + svg = 'svg', + swift = 'swift', + svh = 'systemverilog', + sv = 'systemverilog', + tak = 'tak', + task = 'taskedit', + tm = 'tcl', + tcl = 'tcl', + itk = 'tcl', + itcl = 'tcl', + tk = 'tcl', + jacl = 'tcl', + tl = 'teal', + tmpl = 'template', + ti = 'terminfo', + dtx = 'tex', + ltx = 'tex', + bbl = 'tex', + latex = 'tex', + sty = 'tex', + texi = 'texinfo', + txi = 'texinfo', + texinfo = 'texinfo', + text = 'text', + tfvars = 'terraform', + tla = 'tla', + tli = 'tli', + toml = 'toml', + tpp = 'tpp', + treetop = 'treetop', + slt = 'tsalt', + tsscl = 'tsscl', + tssgm = 'tssgm', + tssop = 'tssop', + tutor = 'tutor', + twig = 'twig', ts = function(path, bufnr) - if getline(bufnr, 1):find("<%?xml") then - return "xml" + if getline(bufnr, 1):find('<%?xml') then + return 'xml' else - return "typescript" + return 'typescript' end end, - tsx = "typescriptreact", - uc = "uc", - uit = "uil", - uil = "uil", - sba = "vb", - vb = "vb", - dsm = "vb", - ctl = "vb", - vbs = "vb", - vr = "vera", - vri = "vera", - vrh = "vera", - v = "verilog", - va = "verilogams", - vams = "verilogams", - vhdl = "vhdl", - vst = "vhdl", - vhd = "vhdl", - hdl = "vhdl", - vho = "vhdl", - vbe = "vhdl", - vim = "vim", - vba = "vim", - mar = "vmasm", - cm = "voscm", - wrl = "vrml", - vroom = "vroom", - vue = "vue", - wat = "wast", - wast = "wast", - wm = "webmacro", - wbt = "winbatch", - wml = "wml", - wsml = "wsml", - ad = "xdefaults", - xhtml = "xhtml", - xht = "xhtml", - msc = "xmath", - msf = "xmath", - ["psc1"] = "xml", - tpm = "xml", - xliff = "xml", - atom = "xml", - xul = "xml", - cdxml = "xml", - mpd = "xml", - rss = "xml", - fsproj = "xml", - ui = "xml", - vbproj = "xml", - xlf = "xml", - wsdl = "xml", - csproj = "xml", - wpl = "xml", - xmi = "xml", - ["xpm2"] = "xpm2", - xqy = "xquery", - xqm = "xquery", - xquery = "xquery", - xq = "xquery", - xql = "xquery", - xs = "xs", - xsd = "xsd", - xsl = "xslt", - xslt = "xslt", - yy = "yacc", - ["y++"] = "yacc", - yxx = "yacc", - yml = "yaml", - yaml = "yaml", - yang = "yang", - ["z8a"] = "z8a", - zig = "zig", - zu = "zimbu", - zut = "zimbutempl", - zsh = "zsh", - vala = "vala", - E = function() vim.fn["dist#ft#FTe"]() end, - EU = function(path, bufnr) return require("vim.filetype.detect").euphoria(bufnr) end, - EW = function(path, bufnr) return require("vim.filetype.detect").euphoria(bufnr) end, - EX = function(path, bufnr) return require("vim.filetype.detect").euphoria(bufnr) end, - EXU = function(path, bufnr) return require("vim.filetype.detect").euphoria(bufnr) end, - EXW = function(path, bufnr) return require("vim.filetype.detect").euphoria(bufnr) end, - PL = function() vim.fn["dist#ft#FTpl"]() end, - R = function(path, bufnr) require("vim.filetype.detect").r(bufnr) end, - asm = function() vim.fn["dist#ft#FTasm"]() end, - bas = function() vim.fn["dist#ft#FTbas"]() end, - bi = function() vim.fn["dist#ft#FTbas"]() end, - bm = function() vim.fn["dist#ft#FTbas"]() end, - bash = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, - btm = function(path, bufnr) return require("vim.filetype.detect").btm(bufnr) end, - c = function() vim.fn["dist#ft#FTlpc"]() end, - ch = function() vim.fn["dist#ft#FTchange"]() end, - com = function() vim.fn["dist#ft#BindzoneCheck"]('dcl') end, - cpt = function() vim.fn["dist#ft#FThtml"]() end, - csh = function() vim.fn["dist#ft#CSH"]() end, - d = function() vim.fn["dist#ft#DtraceCheck"]() end, - db = function() vim.fn["dist#ft#BindzoneCheck"]('') end, - dtml = function() vim.fn["dist#ft#FThtml"]() end, - e = function() vim.fn["dist#ft#FTe"]() end, - ebuild = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, - eclass = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, - ent = function(path, bufnr) return require("vim.filetype.detect").ent(bufnr) end, - env = function() vim.fn["dist#ft#SetFileTypeSH"](vim.fn.getline(1)) end, - eu = function(path, bufnr) return require("vim.filetype.detect").euphoria(bufnr) end, - ew = function(path, bufnr) return require("vim.filetype.detect").euphoria(bufnr) end, - ex = function(path, bufnr) return require("vim.filetype.detect").ex(bufnr) end, - exu = function(path, bufnr) return require("vim.filetype.detect").euphoria(bufnr) end, - exw = function(path, bufnr) return require("vim.filetype.detect").euphoria(bufnr) end, - frm = function(path, bufnr) require("vim.filetype.detect").frm(bufnr) end, - fs = function() vim.fn["dist#ft#FTfs"]() end, - h = function(path, bufnr) require("vim.filetype.detect").header(bufnr) end, - htm = function() vim.fn["dist#ft#FThtml"]() end, - html = function() vim.fn["dist#ft#FThtml"]() end, - i = function() vim.fn["dist#ft#FTprogress_asm"]() end, - idl = function(path, bufnr) require("vim.filetype.detect").idl(bufnr) end, - inc = function() vim.fn["dist#ft#FTinc"]() end, - inp = function(path, bufnr) require("vim.filetype.detect").inp(bufnr) end, - ksh = function() vim.fn["dist#ft#SetFileTypeSH"]("ksh") end, - lst = function() vim.fn["dist#ft#FTasm"]() end, - m = function() vim.fn["dist#ft#FTm"]() end, - mac = function() vim.fn["dist#ft#FTasm"]() end, - mc = function(path, bufnr) require("vim.filetype.detect").mc(bufnr) end, - mm = function() vim.fn["dist#ft#FTmm"]() end, - mms = function(path, bufnr) require("vim.filetype.detect").mms(bufnr) end, - p = function() vim.fn["dist#ft#FTprogress_pascal"]() end, + tsx = 'typescriptreact', + uc = 'uc', + uit = 'uil', + uil = 'uil', + sba = 'vb', + vb = 'vb', + dsm = 'vb', + ctl = 'vb', + vbs = 'vb', + vr = 'vera', + vri = 'vera', + vrh = 'vera', + v = 'verilog', + va = 'verilogams', + vams = 'verilogams', + vhdl = 'vhdl', + vst = 'vhdl', + vhd = 'vhdl', + hdl = 'vhdl', + vho = 'vhdl', + vbe = 'vhdl', + vim = 'vim', + vba = 'vim', + mar = 'vmasm', + cm = 'voscm', + wrl = 'vrml', + vroom = 'vroom', + vue = 'vue', + wat = 'wast', + wast = 'wast', + wm = 'webmacro', + wbt = 'winbatch', + wml = 'wml', + wsml = 'wsml', + ad = 'xdefaults', + xhtml = 'xhtml', + xht = 'xhtml', + msc = 'xmath', + msf = 'xmath', + ['psc1'] = 'xml', + tpm = 'xml', + xliff = 'xml', + atom = 'xml', + xul = 'xml', + cdxml = 'xml', + mpd = 'xml', + rss = 'xml', + fsproj = 'xml', + ui = 'xml', + vbproj = 'xml', + xlf = 'xml', + wsdl = 'xml', + csproj = 'xml', + wpl = 'xml', + xmi = 'xml', + ['xpm2'] = 'xpm2', + xqy = 'xquery', + xqm = 'xquery', + xquery = 'xquery', + xq = 'xquery', + xql = 'xquery', + xs = 'xs', + xsd = 'xsd', + xsl = 'xslt', + xslt = 'xslt', + yy = 'yacc', + ['y++'] = 'yacc', + yxx = 'yacc', + yml = 'yaml', + yaml = 'yaml', + yang = 'yang', + ['z8a'] = 'z8a', + zig = 'zig', + zu = 'zimbu', + zut = 'zimbutempl', + zsh = 'zsh', + vala = 'vala', + E = function() + vim.fn['dist#ft#FTe']() + end, + EU = function(path, bufnr) + return require('vim.filetype.detect').euphoria(bufnr) + end, + EW = function(path, bufnr) + return require('vim.filetype.detect').euphoria(bufnr) + end, + EX = function(path, bufnr) + return require('vim.filetype.detect').euphoria(bufnr) + end, + EXU = function(path, bufnr) + return require('vim.filetype.detect').euphoria(bufnr) + end, + EXW = function(path, bufnr) + return require('vim.filetype.detect').euphoria(bufnr) + end, + PL = function() + vim.fn['dist#ft#FTpl']() + end, + R = function(path, bufnr) + require('vim.filetype.detect').r(bufnr) + end, + asm = function(path, bufnr) + require('vim.filetype.detect').asm(bufnr) + end, + bas = function(path, bufnr) + require('vim.filetype.detect').bas(bufnr) + end, + bi = function() + vim.fn['dist#ft#FTbas']() + end, + bm = function() + vim.fn['dist#ft#FTbas']() + end, + bash = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, + btm = function(path, bufnr) + return require('vim.filetype.detect').btm(bufnr) + end, + c = function(path, bufnr) + return require('vim.filetype.detect').lpc(bufnr) + end, + ch = function(path, bufnr) + return require('vim.filetype.detect').change(bufnr) + end, + com = function() + vim.fn['dist#ft#BindzoneCheck']('dcl') + end, + cpt = function() + vim.fn['dist#ft#FThtml']() + end, + csh = function() + vim.fn['dist#ft#CSH']() + end, + d = function(path, bufnr) + return require('vim.filetype.detect').dtrace(bufnr) + end, + db = function() + vim.fn['dist#ft#BindzoneCheck']('') + end, + dtml = function() + vim.fn['dist#ft#FThtml']() + end, + e = function() + vim.fn['dist#ft#FTe']() + end, + ebuild = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, + eclass = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, + ent = function(path, bufnr) + require('vim.filetype.detect').ent(bufnr) + end, + env = function() + vim.fn['dist#ft#SetFileTypeSH'](vim.fn.getline(1)) + end, + eu = function(path, bufnr) + require('vim.filetype.detect').euphoria(bufnr) + end, + ew = function(path, bufnr) + require('vim.filetype.detect').euphoria(bufnr) + end, + ex = function(path, bufnr) + require('vim.filetype.detect').ex(bufnr) + end, + exu = function(path, bufnr) + require('vim.filetype.detect').euphoria(bufnr) + end, + exw = function(path, bufnr) + require('vim.filetype.detect').euphoria(bufnr) + end, + frm = function(path, bufnr) + require('vim.filetype.detect').frm(bufnr) + end, + fs = function(path, bufnr) + vim.fn['dist#ft#FTfs']() + end, + h = function(path, bufnr) + require('vim.filetype.detect').header(bufnr) + end, + htm = function() + vim.fn['dist#ft#FThtml']() + end, + html = function() + vim.fn['dist#ft#FThtml']() + end, + i = function(path, bufnr) + require('vim.filetype.detect').progress_asm(bufnr) + end, + idl = function(path, bufnr) + require('vim.filetype.detect').idl(bufnr) + end, + inc = function() + vim.fn['dist#ft#FTinc']() + end, + inp = function(path, bufnr) + require('vim.filetype.detect').inp(bufnr) + end, + ksh = function() + vim.fn['dist#ft#SetFileTypeSH']('ksh') + end, + lst = function(path, bufnr) + require('vim.filetype.detect').asm(bufnr) + end, + m = function(path, bufnr) + require('vim.filetype.detect').m(bufnr) + end, + mac = function(path, bufnr) + require('vim.filetype.detect').asm(bufnr) + end, + mc = function(path, bufnr) + require('vim.filetype.detect').mc(bufnr) + end, + mm = function(path, bufnr) + require('vim.filetype.detect').mm(bufnr) + end, + mms = function(path, bufnr) + require('vim.filetype.detect').mms(bufnr) + end, + p = function(path, bufnr) + require('vim.filetype.detect').progress_pascal(bufnr) + end, patch = function(path, bufnr) local firstline = getline(bufnr, 1) - if string.find(firstline, "^From " .. string.rep("%x", 40) .. "+ Mon Sep 17 00:00:00 2001$") then - return "gitsendemail" + if string.find(firstline, '^From ' .. string.rep('%x', 40) .. '+ Mon Sep 17 00:00:00 2001$') then + return 'gitsendemail' else - return "diff" + return 'diff' end end, - pl = function() vim.fn["dist#ft#FTpl"]() end, - pp = function() vim.fn["dist#ft#FTpp"]() end, - pro = function() vim.fn["dist#ft#ProtoCheck"]('idlang') end, - pt = function() vim.fn["dist#ft#FThtml"]() end, - r = function(path, bufnr) require("vim.filetype.detect").r(bufnr) end, - rdf = function(path, bufnr) require("vim.filetype.detect").redif(bufnr) end, - rules = function() vim.fn["dist#ft#FTRules"]() end, - sc = function(path, bufnr) require("vim.filetype.detect").sc(bufnr) end, - scd = function(path, bufnr) require("vim.filetype.detect").scd(bufnr) end, - sh = function() vim.fn["dist#ft#SetFileTypeSH"](vim.fn.getline(1)) end, - shtml = function() vim.fn["dist#ft#FThtml"]() end, - sql = function(path, bufnr) require("vim.filetype.detect").sql(bufnr) end, - stm = function() vim.fn["dist#ft#FThtml"]() end, - tcsh = function() vim.fn["dist#ft#SetFileTypeShell"]("tcsh") end, - tex = function() vim.fn["dist#ft#FTtex"]() end, - tf = function(path, bufnr) require("vim.filetype.detect").tf(bufnr) end, - w = function(path, bufnr) require("vim.filetype.detect").progress_cweb(bufnr) end, - xml = function(path, bufnr) require("vim.filetype.detect").xml(bufnr) end, - y = function(path, bufnr) require("vim.filetype.detect").y(bufnr) end, - zsql = function(path, bufnr) require("vim.filetype.detect").sql(bufnr) end, + pl = function() + vim.fn['dist#ft#FTpl']() + end, + pp = function() + vim.fn['dist#ft#FTpp']() + end, + pro = function() + vim.fn['dist#ft#ProtoCheck']('idlang') + end, + pt = function() + vim.fn['dist#ft#FThtml']() + end, + r = function(path, bufnr) + require('vim.filetype.detect').r(bufnr) + end, + rdf = function(path, bufnr) + require('vim.filetype.detect').redif(bufnr) + end, + rules = function(path, bufnr) + require('vim.filetype.detect').rules(path, bufnr) + end, + sc = function(path, bufnr) + require('vim.filetype.detect').sc(bufnr) + end, + scd = function(path, bufnr) + require('vim.filetype.detect').scd(bufnr) + end, + sh = function() + vim.fn['dist#ft#SetFileTypeSH'](vim.fn.getline(1)) + end, + shtml = function() + vim.fn['dist#ft#FThtml']() + end, + sql = function(path, bufnr) + require('vim.filetype.detect').sql(bufnr) + end, + stm = function() + vim.fn['dist#ft#FThtml']() + end, + tcsh = function() + vim.fn['dist#ft#SetFileTypeShell']('tcsh') + end, + tex = function() + vim.fn['dist#ft#FTtex']() + end, + tf = function(path, bufnr) + require('vim.filetype.detect').tf(bufnr) + end, + w = function(path, bufnr) + require('vim.filetype.detect').progress_cweb(bufnr) + end, + xml = function(path, bufnr) + require('vim.filetype.detect').xml(bufnr) + end, + y = function(path, bufnr) + require('vim.filetype.detect').y(bufnr) + end, + zsql = function(path, bufnr) + require('vim.filetype.detect').sql(bufnr) + end, txt = function(path, bufnr) --helpfiles match *.txt, but should have a modeline as last line - if not getline(bufnr, -1):match("vim:.*ft=help") then - return "text" + if not getline(bufnr, -1):match('vim:.*ft=help') then + return 'text' end end, -- END EXTENSION @@ -871,593 +1012,695 @@ local extension = { local filename = { -- BEGIN FILENAME - ["a2psrc"] = "a2ps", - ["/etc/a2ps.cfg"] = "a2ps", - [".a2psrc"] = "a2ps", - [".asoundrc"] = "alsaconf", - ["/usr/share/alsa/alsa.conf"] = "alsaconf", - ["/etc/asound.conf"] = "alsaconf", - ["build.xml"] = "ant", - [".htaccess"] = "apache", - ["apt.conf"] = "aptconf", - ["/.aptitude/config"] = "aptconf", - ["=tagging-method"] = "arch", - [".arch-inventory"] = "arch", - ["GNUmakefile.am"] = "automake", - ["named.root"] = "bindzone", - WORKSPACE = "bzl", - BUILD = "bzl", - ["cabal.config"] = "cabalconfig", - ["cabal.project"] = "cabalproject", - calendar = "calendar", - catalog = "catalog", - ["/etc/cdrdao.conf"] = "cdrdaoconf", - [".cdrdao"] = "cdrdaoconf", - ["/etc/default/cdrdao"] = "cdrdaoconf", - ["/etc/defaults/cdrdao"] = "cdrdaoconf", - ["cfengine.conf"] = "cfengine", - ["CMakeLists.txt"] = "cmake", - ["auto.master"] = "conf", - ["configure.in"] = "config", - ["configure.ac"] = "config", - [".cvsrc"] = "cvsrc", - ["/debian/changelog"] = "debchangelog", - ["changelog.dch"] = "debchangelog", - ["changelog.Debian"] = "debchangelog", - ["NEWS.dch"] = "debchangelog", - ["NEWS.Debian"] = "debchangelog", - ["/debian/control"] = "debcontrol", - ["/debian/copyright"] = "debcopyright", - ["/etc/apt/sources.list"] = "debsources", - ["denyhosts.conf"] = "denyhosts", - ["dict.conf"] = "dictconf", - [".dictrc"] = "dictconf", - ["/etc/DIR_COLORS"] = "dircolors", - [".dir_colors"] = "dircolors", - [".dircolors"] = "dircolors", - ["/etc/dnsmasq.conf"] = "dnsmasq", - Containerfile = "dockerfile", - Dockerfile = "dockerfile", - npmrc = "dosini", - ["/etc/yum.conf"] = "dosini", - ["/etc/pacman.conf"] = "conf", - [".npmrc"] = "dosini", - [".editorconfig"] = "dosini", - dune = "dune", - jbuild = "dune", - ["dune-workspace"] = "dune", - ["dune-project"] = "dune", - ["elinks.conf"] = "elinks", - ["mix.lock"] = "elixir", - ["filter-rules"] = "elmfilt", - ["exim.conf"] = "exim", - exports = "exports", - [".fetchmailrc"] = "fetchmail", - fvSchemes = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - fvSolution = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - fvConstraints = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - fvModels = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - fstab = "fstab", - mtab = "fstab", - [".gdbinit"] = "gdb", - gdbinit = "gdb", - [".gdbearlyinit"] = "gdb", - gdbearlyinit = "gdb", - ["lltxxxxx.txt"] = "gedcom", - ["TAG_EDITMSG"] = "gitcommit", - ["MERGE_MSG"] = "gitcommit", - ["COMMIT_EDITMSG"] = "gitcommit", - ["NOTES_EDITMSG"] = "gitcommit", - ["EDIT_DESCRIPTION"] = "gitcommit", - [".gitconfig"] = "gitconfig", - [".gitmodules"] = "gitconfig", - ["gitolite.conf"] = "gitolite", - ["git-rebase-todo"] = "gitrebase", - gkrellmrc = "gkrellmrc", - [".gnashrc"] = "gnash", - [".gnashpluginrc"] = "gnash", - gnashpluginrc = "gnash", - gnashrc = "gnash", - ["go.work"] = "gowork", - [".gprc"] = "gp", - ["/.gnupg/gpg.conf"] = "gpg", - ["/.gnupg/options"] = "gpg", - ["/var/backups/gshadow.bak"] = "group", - ["/etc/gshadow"] = "group", - ["/etc/group-"] = "group", - ["/etc/gshadow.edit"] = "group", - ["/etc/gshadow-"] = "group", - ["/etc/group"] = "group", - ["/var/backups/group.bak"] = "group", - ["/etc/group.edit"] = "group", - ["/boot/grub/menu.lst"] = "grub", - ["/etc/grub.conf"] = "grub", - ["/boot/grub/grub.conf"] = "grub", - [".gtkrc"] = "gtkrc", - gtkrc = "gtkrc", - ["snort.conf"] = "hog", - ["vision.conf"] = "hog", - ["/etc/host.conf"] = "hostconf", - ["/etc/hosts.allow"] = "hostsaccess", - ["/etc/hosts.deny"] = "hostsaccess", - ["/i3/config"] = "i3config", - ["/sway/config"] = "i3config", - ["/.sway/config"] = "i3config", - ["/.i3/config"] = "i3config", - ["/.icewm/menu"] = "icemenu", - [".indent.pro"] = "indent", - indentrc = "indent", - inittab = "inittab", - ["ipf.conf"] = "ipfilter", - ["ipf6.conf"] = "ipfilter", - ["ipf.rules"] = "ipfilter", - [".eslintrc"] = "json", - [".babelrc"] = "json", - ["Pipfile.lock"] = "json", - [".firebaserc"] = "json", - [".prettierrc"] = "json", - Kconfig = "kconfig", - ["Kconfig.debug"] = "kconfig", - ["lftp.conf"] = "lftp", - [".lftprc"] = "lftp", - ["/.libao"] = "libao", - ["/etc/libao.conf"] = "libao", - ["lilo.conf"] = "lilo", - ["/etc/limits"] = "limits", - [".emacs"] = "lisp", - sbclrc = "lisp", - [".sbclrc"] = "lisp", - [".sawfishrc"] = "lisp", - ["/etc/login.access"] = "loginaccess", - ["/etc/login.defs"] = "logindefs", - ["lynx.cfg"] = "lynx", - ["m3overrides"] = "m3build", - ["m3makefile"] = "m3build", - ["cm3.cfg"] = "m3quake", - [".followup"] = "mail", - [".article"] = "mail", - [".letter"] = "mail", - ["/etc/aliases"] = "mailaliases", - ["/etc/mail/aliases"] = "mailaliases", - mailcap = "mailcap", - [".mailcap"] = "mailcap", - ["/etc/man.conf"] = "manconf", - ["man.config"] = "manconf", - ["maxima-init.mac"] = "maxima", - ["meson.build"] = "meson", - ["meson_options.txt"] = "meson", - ["/etc/conf.modules"] = "modconf", - ["/etc/modules"] = "modconf", - ["/etc/modules.conf"] = "modconf", - ["/.mplayer/config"] = "mplayerconf", - ["mplayer.conf"] = "mplayerconf", - mrxvtrc = "mrxvtrc", - [".mrxvtrc"] = "mrxvtrc", - ["/etc/nanorc"] = "nanorc", - Neomuttrc = "neomuttrc", - [".netrc"] = "netrc", - [".ocamlinit"] = "ocaml", - [".octaverc"] = "octave", - octaverc = "octave", - ["octave.conf"] = "octave", - opam = "opam", - ["/etc/pam.conf"] = "pamconf", - ["pam_env.conf"] = "pamenv", - [".pam_environment"] = "pamenv", - ["/var/backups/passwd.bak"] = "passwd", - ["/var/backups/shadow.bak"] = "passwd", - ["/etc/passwd"] = "passwd", - ["/etc/passwd-"] = "passwd", - ["/etc/shadow.edit"] = "passwd", - ["/etc/shadow-"] = "passwd", - ["/etc/shadow"] = "passwd", - ["/etc/passwd.edit"] = "passwd", - ["pf.conf"] = "pf", - ["main.cf"] = "pfmain", - pinerc = "pine", - [".pinercex"] = "pine", - [".pinerc"] = "pine", - pinercex = "pine", - ["/etc/pinforc"] = "pinfo", - ["/.pinforc"] = "pinfo", - [".povrayrc"] = "povini", - [".procmailrc"] = "procmail", - [".procmail"] = "procmail", - ["/etc/protocols"] = "protocols", - [".pythonstartup"] = "python", - [".pythonrc"] = "python", - SConstruct = "python", - ratpoisonrc = "ratpoison", - [".ratpoisonrc"] = "ratpoison", - v = "rcs", - inputrc = "readline", - [".inputrc"] = "readline", - [".reminders"] = "remind", - ["resolv.conf"] = "resolv", - ["robots.txt"] = "robots", - Gemfile = "ruby", - Puppetfile = "ruby", - [".irbrc"] = "ruby", - irbrc = "ruby", - Vagrantfile = "ruby", - ["smb.conf"] = "samba", - screenrc = "screen", - [".screenrc"] = "screen", - ["/etc/sensors3.conf"] = "sensors", - ["/etc/sensors.conf"] = "sensors", - ["/etc/services"] = "services", - ["/etc/serial.conf"] = "setserial", - ["/etc/udev/cdsymlinks.conf"] = "sh", - ["/etc/slp.conf"] = "slpconf", - ["/etc/slp.reg"] = "slpreg", - ["/etc/slp.spi"] = "slpspi", - [".slrnrc"] = "slrnrc", - ["sendmail.cf"] = "sm", - ["squid.conf"] = "squid", - ["/.ssh/config"] = "sshconfig", - ["ssh_config"] = "sshconfig", - ["sshd_config"] = "sshdconfig", - ["/etc/sudoers"] = "sudoers", - ["sudoers.tmp"] = "sudoers", - ["/etc/sysctl.conf"] = "sysctl", - tags = "tags", - [".tclshrc"] = "tcl", - [".wishrc"] = "tcl", - ["tclsh.rc"] = "tcl", - ["texmf.cnf"] = "texmf", - COPYING = "text", - README = "text", - LICENSE = "text", - AUTHORS = "text", - tfrc = "tf", - [".tfrc"] = "tf", - ["tidy.conf"] = "tidy", - tidyrc = "tidy", - [".tidyrc"] = "tidy", - [".tmux.conf"] = "tmux", - ["/.cargo/config"] = "toml", - Pipfile = "toml", - ["Gopkg.lock"] = "toml", - ["/.cargo/credentials"] = "toml", - ["Cargo.lock"] = "toml", - ["trustees.conf"] = "trustees", - ["/etc/udev/udev.conf"] = "udevconf", - ["/etc/updatedb.conf"] = "updatedb", - ["fdrupstream.log"] = "upstreamlog", - vgrindefs = "vgrindefs", - [".exrc"] = "vim", - ["_exrc"] = "vim", - ["_viminfo"] = "viminfo", - [".viminfo"] = "viminfo", - [".wgetrc"] = "wget", - [".wget2rc"] = "wget2", - wgetrc = "wget", - wget2rc = "wget2", - [".wvdialrc"] = "wvdial", - ["wvdial.conf"] = "wvdial", - [".Xresources"] = "xdefaults", - [".Xpdefaults"] = "xdefaults", - ["xdm-config"] = "xdefaults", - [".Xdefaults"] = "xdefaults", - ["/etc/xinetd.conf"] = "xinetd", - fglrxrc = "xml", - ["/etc/blkid.tab"] = "xml", - ["/etc/blkid.tab.old"] = "xml", - ["/etc/zprofile"] = "zsh", - [".zlogin"] = "zsh", - [".zlogout"] = "zsh", - [".zshrc"] = "zsh", - [".zprofile"] = "zsh", - [".zcompdump"] = "zsh", - [".zshenv"] = "zsh", - [".zfbfmarks"] = "zsh", - [".alias"] = function() vim.fn["dist#ft#CSH"]() end, - [".bashrc"] = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, - [".cshrc"] = function() vim.fn["dist#ft#CSH"]() end, - [".env"] = function() vim.fn["dist#ft#SetFileTypeSH"](vim.fn.getline(1)) end, - [".kshrc"] = function() vim.fn["dist#ft#SetFileTypeSH"]("ksh") end, - [".login"] = function() vim.fn["dist#ft#CSH"]() end, - [".profile"] = function() vim.fn["dist#ft#SetFileTypeSH"](vim.fn.getline(1)) end, - [".tcshrc"] = function() vim.fn["dist#ft#SetFileTypeShell"]("tcsh") end, - ["/etc/profile"] = function() vim.fn["dist#ft#SetFileTypeSH"](vim.fn.getline(1)) end, - APKBUILD = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, - PKGBUILD = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, - ["bash.bashrc"] = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, - bashrc = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, + ['a2psrc'] = 'a2ps', + ['/etc/a2ps.cfg'] = 'a2ps', + ['.a2psrc'] = 'a2ps', + ['.asoundrc'] = 'alsaconf', + ['/usr/share/alsa/alsa.conf'] = 'alsaconf', + ['/etc/asound.conf'] = 'alsaconf', + ['build.xml'] = 'ant', + ['.htaccess'] = 'apache', + ['apt.conf'] = 'aptconf', + ['/.aptitude/config'] = 'aptconf', + ['=tagging-method'] = 'arch', + ['.arch-inventory'] = 'arch', + ['GNUmakefile.am'] = 'automake', + ['named.root'] = 'bindzone', + WORKSPACE = 'bzl', + BUILD = 'bzl', + ['cabal.config'] = 'cabalconfig', + ['cabal.project'] = 'cabalproject', + calendar = 'calendar', + catalog = 'catalog', + ['/etc/cdrdao.conf'] = 'cdrdaoconf', + ['.cdrdao'] = 'cdrdaoconf', + ['/etc/default/cdrdao'] = 'cdrdaoconf', + ['/etc/defaults/cdrdao'] = 'cdrdaoconf', + ['cfengine.conf'] = 'cfengine', + ['CMakeLists.txt'] = 'cmake', + ['auto.master'] = 'conf', + ['configure.in'] = 'config', + ['configure.ac'] = 'config', + ['.cvsrc'] = 'cvsrc', + ['/debian/changelog'] = 'debchangelog', + ['changelog.dch'] = 'debchangelog', + ['changelog.Debian'] = 'debchangelog', + ['NEWS.dch'] = 'debchangelog', + ['NEWS.Debian'] = 'debchangelog', + ['/debian/control'] = 'debcontrol', + ['/debian/copyright'] = 'debcopyright', + ['/etc/apt/sources.list'] = 'debsources', + ['denyhosts.conf'] = 'denyhosts', + ['dict.conf'] = 'dictconf', + ['.dictrc'] = 'dictconf', + ['/etc/DIR_COLORS'] = 'dircolors', + ['.dir_colors'] = 'dircolors', + ['.dircolors'] = 'dircolors', + ['/etc/dnsmasq.conf'] = 'dnsmasq', + Containerfile = 'dockerfile', + Dockerfile = 'dockerfile', + npmrc = 'dosini', + ['/etc/yum.conf'] = 'dosini', + ['/etc/pacman.conf'] = 'conf', + ['.npmrc'] = 'dosini', + ['.editorconfig'] = 'dosini', + dune = 'dune', + jbuild = 'dune', + ['dune-workspace'] = 'dune', + ['dune-project'] = 'dune', + ['elinks.conf'] = 'elinks', + ['mix.lock'] = 'elixir', + ['filter-rules'] = 'elmfilt', + ['exim.conf'] = 'exim', + exports = 'exports', + ['.fetchmailrc'] = 'fetchmail', + fvSchemes = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + fvSolution = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + fvConstraints = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + fvModels = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + fstab = 'fstab', + mtab = 'fstab', + ['.gdbinit'] = 'gdb', + gdbinit = 'gdb', + ['.gdbearlyinit'] = 'gdb', + gdbearlyinit = 'gdb', + ['lltxxxxx.txt'] = 'gedcom', + ['TAG_EDITMSG'] = 'gitcommit', + ['MERGE_MSG'] = 'gitcommit', + ['COMMIT_EDITMSG'] = 'gitcommit', + ['NOTES_EDITMSG'] = 'gitcommit', + ['EDIT_DESCRIPTION'] = 'gitcommit', + ['.gitconfig'] = 'gitconfig', + ['.gitmodules'] = 'gitconfig', + ['gitolite.conf'] = 'gitolite', + ['git-rebase-todo'] = 'gitrebase', + gkrellmrc = 'gkrellmrc', + ['.gnashrc'] = 'gnash', + ['.gnashpluginrc'] = 'gnash', + gnashpluginrc = 'gnash', + gnashrc = 'gnash', + ['go.work'] = 'gowork', + ['.gprc'] = 'gp', + ['/.gnupg/gpg.conf'] = 'gpg', + ['/.gnupg/options'] = 'gpg', + ['/var/backups/gshadow.bak'] = 'group', + ['/etc/gshadow'] = 'group', + ['/etc/group-'] = 'group', + ['/etc/gshadow.edit'] = 'group', + ['/etc/gshadow-'] = 'group', + ['/etc/group'] = 'group', + ['/var/backups/group.bak'] = 'group', + ['/etc/group.edit'] = 'group', + ['/boot/grub/menu.lst'] = 'grub', + ['/etc/grub.conf'] = 'grub', + ['/boot/grub/grub.conf'] = 'grub', + ['.gtkrc'] = 'gtkrc', + gtkrc = 'gtkrc', + ['snort.conf'] = 'hog', + ['vision.conf'] = 'hog', + ['/etc/host.conf'] = 'hostconf', + ['/etc/hosts.allow'] = 'hostsaccess', + ['/etc/hosts.deny'] = 'hostsaccess', + ['/i3/config'] = 'i3config', + ['/sway/config'] = 'i3config', + ['/.sway/config'] = 'i3config', + ['/.i3/config'] = 'i3config', + ['/.icewm/menu'] = 'icemenu', + ['.indent.pro'] = 'indent', + indentrc = 'indent', + inittab = 'inittab', + ['ipf.conf'] = 'ipfilter', + ['ipf6.conf'] = 'ipfilter', + ['ipf.rules'] = 'ipfilter', + ['.eslintrc'] = 'json', + ['.babelrc'] = 'json', + ['Pipfile.lock'] = 'json', + ['.firebaserc'] = 'json', + ['.prettierrc'] = 'json', + Kconfig = 'kconfig', + ['Kconfig.debug'] = 'kconfig', + ['lftp.conf'] = 'lftp', + ['.lftprc'] = 'lftp', + ['/.libao'] = 'libao', + ['/etc/libao.conf'] = 'libao', + ['lilo.conf'] = 'lilo', + ['/etc/limits'] = 'limits', + ['.emacs'] = 'lisp', + sbclrc = 'lisp', + ['.sbclrc'] = 'lisp', + ['.sawfishrc'] = 'lisp', + ['/etc/login.access'] = 'loginaccess', + ['/etc/login.defs'] = 'logindefs', + ['lynx.cfg'] = 'lynx', + ['m3overrides'] = 'm3build', + ['m3makefile'] = 'm3build', + ['cm3.cfg'] = 'm3quake', + ['.followup'] = 'mail', + ['.article'] = 'mail', + ['.letter'] = 'mail', + ['/etc/aliases'] = 'mailaliases', + ['/etc/mail/aliases'] = 'mailaliases', + mailcap = 'mailcap', + ['.mailcap'] = 'mailcap', + ['/etc/man.conf'] = 'manconf', + ['man.config'] = 'manconf', + ['maxima-init.mac'] = 'maxima', + ['meson.build'] = 'meson', + ['meson_options.txt'] = 'meson', + ['/etc/conf.modules'] = 'modconf', + ['/etc/modules'] = 'modconf', + ['/etc/modules.conf'] = 'modconf', + ['/.mplayer/config'] = 'mplayerconf', + ['mplayer.conf'] = 'mplayerconf', + mrxvtrc = 'mrxvtrc', + ['.mrxvtrc'] = 'mrxvtrc', + ['/etc/nanorc'] = 'nanorc', + Neomuttrc = 'neomuttrc', + ['.netrc'] = 'netrc', + ['.ocamlinit'] = 'ocaml', + ['.octaverc'] = 'octave', + octaverc = 'octave', + ['octave.conf'] = 'octave', + opam = 'opam', + ['/etc/pam.conf'] = 'pamconf', + ['pam_env.conf'] = 'pamenv', + ['.pam_environment'] = 'pamenv', + ['/var/backups/passwd.bak'] = 'passwd', + ['/var/backups/shadow.bak'] = 'passwd', + ['/etc/passwd'] = 'passwd', + ['/etc/passwd-'] = 'passwd', + ['/etc/shadow.edit'] = 'passwd', + ['/etc/shadow-'] = 'passwd', + ['/etc/shadow'] = 'passwd', + ['/etc/passwd.edit'] = 'passwd', + ['pf.conf'] = 'pf', + ['main.cf'] = 'pfmain', + pinerc = 'pine', + ['.pinercex'] = 'pine', + ['.pinerc'] = 'pine', + pinercex = 'pine', + ['/etc/pinforc'] = 'pinfo', + ['/.pinforc'] = 'pinfo', + ['.povrayrc'] = 'povini', + ['.procmailrc'] = 'procmail', + ['.procmail'] = 'procmail', + ['/etc/protocols'] = 'protocols', + ['.pythonstartup'] = 'python', + ['.pythonrc'] = 'python', + SConstruct = 'python', + ratpoisonrc = 'ratpoison', + ['.ratpoisonrc'] = 'ratpoison', + v = 'rcs', + inputrc = 'readline', + ['.inputrc'] = 'readline', + ['.reminders'] = 'remind', + ['resolv.conf'] = 'resolv', + ['robots.txt'] = 'robots', + Gemfile = 'ruby', + Puppetfile = 'ruby', + ['.irbrc'] = 'ruby', + irbrc = 'ruby', + Vagrantfile = 'ruby', + ['smb.conf'] = 'samba', + screenrc = 'screen', + ['.screenrc'] = 'screen', + ['/etc/sensors3.conf'] = 'sensors', + ['/etc/sensors.conf'] = 'sensors', + ['/etc/services'] = 'services', + ['/etc/serial.conf'] = 'setserial', + ['/etc/udev/cdsymlinks.conf'] = 'sh', + ['/etc/slp.conf'] = 'slpconf', + ['/etc/slp.reg'] = 'slpreg', + ['/etc/slp.spi'] = 'slpspi', + ['.slrnrc'] = 'slrnrc', + ['sendmail.cf'] = 'sm', + ['squid.conf'] = 'squid', + ['/.ssh/config'] = 'sshconfig', + ['ssh_config'] = 'sshconfig', + ['sshd_config'] = 'sshdconfig', + ['/etc/sudoers'] = 'sudoers', + ['sudoers.tmp'] = 'sudoers', + ['/etc/sysctl.conf'] = 'sysctl', + tags = 'tags', + ['.tclshrc'] = 'tcl', + ['.wishrc'] = 'tcl', + ['tclsh.rc'] = 'tcl', + ['texmf.cnf'] = 'texmf', + COPYING = 'text', + README = 'text', + LICENSE = 'text', + AUTHORS = 'text', + tfrc = 'tf', + ['.tfrc'] = 'tf', + ['tidy.conf'] = 'tidy', + tidyrc = 'tidy', + ['.tidyrc'] = 'tidy', + ['.tmux.conf'] = 'tmux', + ['/.cargo/config'] = 'toml', + Pipfile = 'toml', + ['Gopkg.lock'] = 'toml', + ['/.cargo/credentials'] = 'toml', + ['Cargo.lock'] = 'toml', + ['trustees.conf'] = 'trustees', + ['/etc/udev/udev.conf'] = 'udevconf', + ['/etc/updatedb.conf'] = 'updatedb', + ['fdrupstream.log'] = 'upstreamlog', + vgrindefs = 'vgrindefs', + ['.exrc'] = 'vim', + ['_exrc'] = 'vim', + ['_viminfo'] = 'viminfo', + ['.viminfo'] = 'viminfo', + ['.wgetrc'] = 'wget', + ['.wget2rc'] = 'wget2', + wgetrc = 'wget', + wget2rc = 'wget2', + ['.wvdialrc'] = 'wvdial', + ['wvdial.conf'] = 'wvdial', + ['.Xresources'] = 'xdefaults', + ['.Xpdefaults'] = 'xdefaults', + ['xdm-config'] = 'xdefaults', + ['.Xdefaults'] = 'xdefaults', + ['/etc/xinetd.conf'] = 'xinetd', + fglrxrc = 'xml', + ['/etc/blkid.tab'] = 'xml', + ['/etc/blkid.tab.old'] = 'xml', + ['/etc/zprofile'] = 'zsh', + ['.zlogin'] = 'zsh', + ['.zlogout'] = 'zsh', + ['.zshrc'] = 'zsh', + ['.zprofile'] = 'zsh', + ['.zcompdump'] = 'zsh', + ['.zshenv'] = 'zsh', + ['.zfbfmarks'] = 'zsh', + ['.alias'] = function() + vim.fn['dist#ft#CSH']() + end, + ['.bashrc'] = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, + ['.cshrc'] = function() + vim.fn['dist#ft#CSH']() + end, + ['.env'] = function() + vim.fn['dist#ft#SetFileTypeSH'](vim.fn.getline(1)) + end, + ['.kshrc'] = function() + vim.fn['dist#ft#SetFileTypeSH']('ksh') + end, + ['.login'] = function() + vim.fn['dist#ft#CSH']() + end, + ['.profile'] = function() + vim.fn['dist#ft#SetFileTypeSH'](vim.fn.getline(1)) + end, + ['.tcshrc'] = function() + vim.fn['dist#ft#SetFileTypeShell']('tcsh') + end, + ['/etc/profile'] = function() + vim.fn['dist#ft#SetFileTypeSH'](vim.fn.getline(1)) + end, + APKBUILD = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, + PKGBUILD = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, + ['bash.bashrc'] = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, + bashrc = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, crontab = starsetf('crontab'), - ["csh.cshrc"] = function() vim.fn["dist#ft#CSH"]() end, - ["csh.login"] = function() vim.fn["dist#ft#CSH"]() end, - ["csh.logout"] = function() vim.fn["dist#ft#CSH"]() end, - ["indent.pro"] = function() vim.fn["dist#ft#ProtoCheck"]('indent') end, - ["tcsh.login"] = function() vim.fn["dist#ft#SetFileTypeShell"]("tcsh") end, - ["tcsh.tcshrc"] = function() vim.fn["dist#ft#SetFileTypeShell"]("tcsh") end, + ['csh.cshrc'] = function() + vim.fn['dist#ft#CSH']() + end, + ['csh.login'] = function() + vim.fn['dist#ft#CSH']() + end, + ['csh.logout'] = function() + vim.fn['dist#ft#CSH']() + end, + ['indent.pro'] = function() + vim.fn['dist#ft#ProtoCheck']('indent') + end, + ['tcsh.login'] = function() + vim.fn['dist#ft#SetFileTypeShell']('tcsh') + end, + ['tcsh.tcshrc'] = function() + vim.fn['dist#ft#SetFileTypeShell']('tcsh') + end, -- END FILENAME } local pattern = { -- BEGIN PATTERN - [".*/etc/a2ps/.*%.cfg"] = "a2ps", - [".*/etc/a2ps%.cfg"] = "a2ps", - [".*/usr/share/alsa/alsa%.conf"] = "alsaconf", - [".*/etc/asound%.conf"] = "alsaconf", - [".*/etc/apache2/sites%-.*/.*%.com"] = "apache", - [".*/etc/httpd/.*%.conf"] = "apache", - [".*/%.aptitude/config"] = "aptconf", - ["[mM]akefile%.am"] = "automake", - [".*bsd"] = "bsdl", - ["bzr_log%..*"] = "bzr", - [".*enlightenment/.*%.cfg"] = "c", - [".*/etc/defaults/cdrdao"] = "cdrdaoconf", - [".*/etc/cdrdao%.conf"] = "cdrdaoconf", - [".*/etc/default/cdrdao"] = "cdrdaoconf", - [".*hgrc"] = "cfg", - [".*%.%.ch"] = "chill", - [".*%.cmake%.in"] = "cmake", - [".*/debian/changelog"] = "debchangelog", - [".*/debian/control"] = "debcontrol", - [".*/debian/copyright"] = "debcopyright", - [".*/etc/apt/sources%.list%.d/.*%.list"] = "debsources", - [".*/etc/apt/sources%.list"] = "debsources", - ["dictd.*%.conf"] = "dictdconf", - [".*/etc/DIR_COLORS"] = "dircolors", - [".*/etc/dnsmasq%.conf"] = "dnsmasq", - ["php%.ini%-.*"] = "dosini", - [".*/etc/pacman%.conf"] = "conf", - [".*/etc/yum%.conf"] = "dosini", - [".*lvs"] = "dracula", - [".*lpe"] = "dracula", - [".*/dtrace/.*%.d"] = "dtrace", - [".*esmtprc"] = "esmtprc", - [".*Eterm/.*%.cfg"] = "eterm", - [".*%.git/modules/.*/config"] = "gitconfig", - [".*%.git/config"] = "gitconfig", - [".*/etc/gitconfig"] = "gitconfig", - [".*/%.config/git/config"] = "gitconfig", - [".*%.git/config%.worktree"] = "gitconfig", - [".*%.git/worktrees/.*/config%.worktree"] = "gitconfig", - ["%.gitsendemail%.msg%......."] = "gitsendemail", - ["gkrellmrc_."] = "gkrellmrc", - [".*/usr/.*/gnupg/options%.skel"] = "gpg", - [".*/%.gnupg/options"] = "gpg", - [".*/%.gnupg/gpg%.conf"] = "gpg", - [".*/etc/group"] = "group", - [".*/etc/gshadow"] = "group", - [".*/etc/group%.edit"] = "group", - [".*/var/backups/gshadow%.bak"] = "group", - [".*/etc/group-"] = "group", - [".*/etc/gshadow-"] = "group", - [".*/var/backups/group%.bak"] = "group", - [".*/etc/gshadow%.edit"] = "group", - [".*/boot/grub/grub%.conf"] = "grub", - [".*/boot/grub/menu%.lst"] = "grub", - [".*/etc/grub%.conf"] = "grub", - ["hg%-editor%-.*%.txt"] = "hgcommit", - [".*/etc/host%.conf"] = "hostconf", - [".*/etc/hosts%.deny"] = "hostsaccess", - [".*/etc/hosts%.allow"] = "hostsaccess", - [".*%.html%.m4"] = "htmlm4", - [".*/%.i3/config"] = "i3config", - [".*/sway/config"] = "i3config", - [".*/i3/config"] = "i3config", - [".*/%.sway/config"] = "i3config", - [".*/%.icewm/menu"] = "icemenu", - [".*/etc/initng/.*/.*%.i"] = "initng", - [".*%.properties_.."] = "jproperties", - [".*%.properties_.._.."] = "jproperties", - [".*lftp/rc"] = "lftp", - [".*/%.libao"] = "libao", - [".*/etc/libao%.conf"] = "libao", - [".*/etc/.*limits%.conf"] = "limits", - [".*/etc/limits"] = "limits", - [".*/etc/.*limits%.d/.*%.conf"] = "limits", - [".*/LiteStep/.*/.*%.rc"] = "litestep", - [".*/etc/login%.access"] = "loginaccess", - [".*/etc/login%.defs"] = "logindefs", - [".*/etc/mail/aliases"] = "mailaliases", - [".*/etc/aliases"] = "mailaliases", - [".*[mM]akefile"] = "make", - [".*/etc/man%.conf"] = "manconf", - [".*/etc/modules%.conf"] = "modconf", - [".*/etc/conf%.modules"] = "modconf", - [".*/etc/modules"] = "modconf", - [".*%.[mi][3g]"] = "modula3", - [".*/%.mplayer/config"] = "mplayerconf", - ["rndc.*%.conf"] = "named", - ["rndc.*%.key"] = "named", - ["named.*%.conf"] = "named", - [".*/etc/nanorc"] = "nanorc", - [".*%.NS[ACGLMNPS]"] = "natural", - ["nginx.*%.conf"] = "nginx", - [".*/etc/nginx/.*"] = "nginx", - [".*nginx%.conf"] = "nginx", - [".*/nginx/.*%.conf"] = "nginx", - [".*/usr/local/nginx/conf/.*"] = "nginx", - [".*%.ml%.cppo"] = "ocaml", - [".*%.mli%.cppo"] = "ocaml", - [".*%.opam%.template"] = "opam", - [".*%.[Oo][Pp][Ll]"] = "opl", - [".*/etc/pam%.conf"] = "pamconf", - [".*/etc/passwd-"] = "passwd", - [".*/etc/shadow"] = "passwd", - [".*/etc/shadow%.edit"] = "passwd", - [".*/var/backups/shadow%.bak"] = "passwd", - [".*/var/backups/passwd%.bak"] = "passwd", - [".*/etc/passwd"] = "passwd", - [".*/etc/passwd%.edit"] = "passwd", - [".*/etc/shadow-"] = "passwd", - [".*/%.pinforc"] = "pinfo", - [".*/etc/pinforc"] = "pinfo", - [".*/etc/protocols"] = "protocols", - [".*baseq[2-3]/.*%.cfg"] = "quake", - [".*quake[1-3]/.*%.cfg"] = "quake", - [".*id1/.*%.cfg"] = "quake", - ["[rR]antfile"] = "ruby", - ["[rR]akefile"] = "ruby", - [".*/etc/sensors%.conf"] = "sensors", - [".*/etc/sensors3%.conf"] = "sensors", - [".*/etc/services"] = "services", - [".*/etc/serial%.conf"] = "setserial", - [".*/etc/udev/cdsymlinks%.conf"] = "sh", - [".*%._sst%.meta"] = "sisu", - [".*%.%-sst%.meta"] = "sisu", - [".*%.sst%.meta"] = "sisu", - [".*/etc/slp%.conf"] = "slpconf", - [".*/etc/slp%.reg"] = "slpreg", - [".*/etc/slp%.spi"] = "slpspi", - [".*/etc/ssh/ssh_config%.d/.*%.conf"] = "sshconfig", - [".*/%.ssh/config"] = "sshconfig", - [".*/etc/ssh/sshd_config%.d/.*%.conf"] = "sshdconfig", - [".*/etc/sudoers"] = "sudoers", - ["svn%-commit.*%.tmp"] = "svn", - [".*%.swift%.gyb"] = "swiftgyb", - [".*/etc/sysctl%.conf"] = "sysctl", - [".*/etc/sysctl%.d/.*%.conf"] = "sysctl", - [".*/etc/systemd/.*%.conf%.d/.*%.conf"] = "systemd", - [".*/%.config/systemd/user/.*%.d/.*%.conf"] = "systemd", - [".*/etc/systemd/system/.*%.d/.*%.conf"] = "systemd", - [".*%.t%.html"] = "tilde", - ["%.?tmux.*%.conf"] = "tmux", - ["%.?tmux.*%.conf.*"] = { "tmux", { priority = -1 } }, - [".*/%.cargo/config"] = "toml", - [".*/%.cargo/credentials"] = "toml", - [".*/etc/udev/udev%.conf"] = "udevconf", - [".*/etc/udev/permissions%.d/.*%.permissions"] = "udevperm", - [".*/etc/updatedb%.conf"] = "updatedb", - [".*/%.init/.*%.override"] = "upstart", - [".*/usr/share/upstart/.*%.conf"] = "upstart", - [".*/%.config/upstart/.*%.override"] = "upstart", - [".*/etc/init/.*%.conf"] = "upstart", - [".*/etc/init/.*%.override"] = "upstart", - [".*/%.config/upstart/.*%.conf"] = "upstart", - [".*/%.init/.*%.conf"] = "upstart", - [".*/usr/share/upstart/.*%.override"] = "upstart", - [".*%.ws[fc]"] = "wsh", - [".*/etc/xinetd%.conf"] = "xinetd", - [".*/etc/blkid%.tab"] = "xml", - [".*/etc/blkid%.tab%.old"] = "xml", - [".*%.vbproj%.user"] = "xml", - [".*%.fsproj%.user"] = "xml", - [".*%.csproj%.user"] = "xml", - [".*/etc/xdg/menus/.*%.menu"] = "xml", - [".*Xmodmap"] = "xmodmap", - [".*/etc/zprofile"] = "zsh", - ["%.bash[_-]aliases"] = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, - ["%.bash[_-]logout"] = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, - ["%.bash[_-]profile"] = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, - ["%.cshrc.*"] = function() vim.fn["dist#ft#CSH"]() end, - ["%.gtkrc.*"] = starsetf('gtkrc'), - ["%.kshrc.*"] = function() vim.fn["dist#ft#SetFileTypeSH"]("ksh") end, - ["%.login.*"] = function() vim.fn["dist#ft#CSH"]() end, - ["%.neomuttrc.*"] = starsetf('neomuttrc'), - ["%.profile.*"] = function() vim.fn["dist#ft#SetFileTypeSH"](vim.fn.getline(1)) end, - ["%.reminders.*"] = starsetf('remind'), - ["%.tcshrc.*"] = function() vim.fn["dist#ft#SetFileTypeShell"]("tcsh") end, - ["%.zcompdump.*"] = starsetf('zsh'), - ["%.zlog.*"] = starsetf('zsh'), - ["%.zsh.*"] = starsetf('zsh'), - [".*%.[1-9]"] = function(path, bufnr) return require("vim.filetype.detect").nroff(bufnr) end, - [".*%.[aA]"] = function() vim.fn["dist#ft#FTasm"]() end, - [".*%.[sS]"] = function() vim.fn["dist#ft#FTasm"]() end, - [".*%.properties_.._.._.*"] = starsetf('jproperties'), - [".*%.vhdl_[0-9].*"] = starsetf('vhdl'), - [".*/%.fvwm/.*"] = starsetf('fvwm'), - [".*/%.gitconfig%.d/.*"] = starsetf('gitconfig'), - [".*/%.neomutt/neomuttrc.*"] = starsetf('neomuttrc'), - [".*/Xresources/.*"] = starsetf('xdefaults'), - [".*/app%-defaults/.*"] = starsetf('xdefaults'), - [".*/bind/db%..*"] = starsetf('bindzone'), - [".*/debian/patches/.*"] = function() vim.fn["dist#ft#Dep3patch"]() end, - [".*/etc/Muttrc%.d/.*"] = starsetf('muttrc'), - [".*/etc/apache2/.*%.conf.*"] = starsetf('apache'), - [".*/etc/apache2/conf%..*/.*"] = starsetf('apache'), - [".*/etc/apache2/mods%-.*/.*"] = starsetf('apache'), - [".*/etc/apache2/sites%-.*/.*"] = starsetf('apache'), - [".*/etc/cron%.d/.*"] = starsetf('crontab'), - [".*/etc/dnsmasq%.d/.*"] = starsetf('dnsmasq'), - [".*/etc/httpd/conf%..*/.*"] = starsetf('apache'), - [".*/etc/httpd/conf%.d/.*%.conf.*"] = starsetf('apache'), - [".*/etc/httpd/mods%-.*/.*"] = starsetf('apache'), - [".*/etc/httpd/sites%-.*/.*"] = starsetf('apache'), - [".*/etc/logcheck/.*%.d.*/.*"] = starsetf('logcheck'), - [".*/etc/modprobe%..*"] = starsetf('modconf'), - [".*/etc/pam%.d/.*"] = starsetf('pamconf'), - [".*/etc/profile"] = function() vim.fn["dist#ft#SetFileTypeSH"](vim.fn.getline(1)) end, - [".*/etc/proftpd/.*%.conf.*"] = starsetf('apachestyle'), - [".*/etc/proftpd/conf%..*/.*"] = starsetf('apachestyle'), - [".*/etc/sudoers%.d/.*"] = starsetf('sudoers'), - [".*/etc/xinetd%.d/.*"] = starsetf('xinetd'), - [".*/etc/yum%.repos%.d/.*"] = starsetf('dosini'), - [".*/gitolite%-admin/conf/.*"] = starsetf('gitolite'), - [".*/named/db%..*"] = starsetf('bindzone'), - [".*/tmp/lltmp.*"] = starsetf('gedcom'), - [".*asterisk.*/.*voicemail%.conf.*"] = starsetf('asteriskvm'), - [".*asterisk/.*%.conf.*"] = starsetf('asterisk'), - [".*vimrc.*"] = starsetf('vim'), - [".*xmodmap.*"] = starsetf('xmodmap'), - ["/etc/gitconfig%.d/.*"] = starsetf('gitconfig'), - ["/etc/hostname%..*"] = starsetf('config'), - ["Containerfile%..*"] = starsetf('dockerfile'), - ["Dockerfile%..*"] = starsetf('dockerfile'), - ["JAM.*%..*"] = starsetf('jam'), - ["Kconfig%..*"] = starsetf('kconfig'), - ["Neomuttrc.*"] = starsetf('neomuttrc'), - ["Prl.*%..*"] = starsetf('jam'), - ["Xresources.*"] = starsetf('xdefaults'), - ["[mM]akefile.*"] = starsetf('make'), - ["[rR]akefile.*"] = starsetf('ruby'), - ["access%.conf.*"] = starsetf('apache'), - ["apache%.conf.*"] = starsetf('apache'), - ["apache2%.conf.*"] = starsetf('apache'), - ["bash%-fc[-%.]"] = function() vim.fn["dist#ft#SetFileTypeSH"]("bash") end, - ["cabal%.project%..*"] = starsetf('cabalproject'), - ["crontab%..*"] = starsetf('crontab'), - ["drac%..*"] = starsetf('dracula'), - ["gtkrc.*"] = starsetf('gtkrc'), - ["httpd%.conf.*"] = starsetf('apache'), - ["lilo%.conf.*"] = starsetf('lilo'), - ["neomuttrc.*"] = starsetf('neomuttrc'), - ["proftpd%.conf.*"] = starsetf('apachestyle'), - ["reportbug%-.*"] = starsetf('mail'), - ["sgml%.catalog.*"] = starsetf('catalog'), - ["srm%.conf.*"] = starsetf('apache'), - ["tmac%..*"] = starsetf('nroff'), - ["zlog.*"] = starsetf('zsh'), - ["zsh.*"] = starsetf('zsh'), - ["ae%d+%.txt"] = 'mail', - ["snd%.%d+"] = "mail", - ["%.letter%.%d+"] = "mail", - ["%.article%.%d+"] = "mail", - ["pico%.%d+"] = "mail", - ["mutt%-.*%-%w+"] = "mail", - ["neomutt%-.*%-%w+"] = "mail", - ["muttng%-.*%-%w+"] = "mail", - ["mutt" .. string.rep("[%w_-]", 6)] = "mail", - ["neomutt" .. string.rep("[%w_-]", 6)] = "mail", - ["/tmp/SLRN[0-9A-Z.]+"] = "mail", - ["[a-zA-Z0-9].*Dict"] = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - ["[a-zA-Z0-9].*Dict%..*"] = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - ["[a-zA-Z].*Properties"] = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - ["[a-zA-Z].*Properties%..*"] = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - [".*Transport%..*"] = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - [".*/constant/g"] = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - [".*/0/.*"] = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - [".*/0%.orig/.*"] = function(path, bufnr) require("vim.filetype.detect").foam(bufnr) end, - [".*/etc/sensors%.d/[^.].*"] = starsetf('sensors'), - [".*%.git/.*"] = function(path, bufnr) + ['.*/etc/a2ps/.*%.cfg'] = 'a2ps', + ['.*/etc/a2ps%.cfg'] = 'a2ps', + ['.*/usr/share/alsa/alsa%.conf'] = 'alsaconf', + ['.*/etc/asound%.conf'] = 'alsaconf', + ['.*/etc/apache2/sites%-.*/.*%.com'] = 'apache', + ['.*/etc/httpd/.*%.conf'] = 'apache', + ['.*/%.aptitude/config'] = 'aptconf', + ['[mM]akefile%.am'] = 'automake', + ['.*bsd'] = 'bsdl', + ['bzr_log%..*'] = 'bzr', + ['.*enlightenment/.*%.cfg'] = 'c', + ['.*/etc/defaults/cdrdao'] = 'cdrdaoconf', + ['.*/etc/cdrdao%.conf'] = 'cdrdaoconf', + ['.*/etc/default/cdrdao'] = 'cdrdaoconf', + ['.*hgrc'] = 'cfg', + ['.*%.%.ch'] = 'chill', + ['.*%.cmake%.in'] = 'cmake', + ['.*/debian/changelog'] = 'debchangelog', + ['.*/debian/control'] = 'debcontrol', + ['.*/debian/copyright'] = 'debcopyright', + ['.*/etc/apt/sources%.list%.d/.*%.list'] = 'debsources', + ['.*/etc/apt/sources%.list'] = 'debsources', + ['dictd.*%.conf'] = 'dictdconf', + ['.*/etc/DIR_COLORS'] = 'dircolors', + ['.*/etc/dnsmasq%.conf'] = 'dnsmasq', + ['php%.ini%-.*'] = 'dosini', + ['.*/etc/pacman%.conf'] = 'conf', + ['.*/etc/yum%.conf'] = 'dosini', + ['.*lvs'] = 'dracula', + ['.*lpe'] = 'dracula', + ['.*/dtrace/.*%.d'] = 'dtrace', + ['.*esmtprc'] = 'esmtprc', + ['.*Eterm/.*%.cfg'] = 'eterm', + ['.*%.git/modules/.*/config'] = 'gitconfig', + ['.*%.git/config'] = 'gitconfig', + ['.*/etc/gitconfig'] = 'gitconfig', + ['.*/%.config/git/config'] = 'gitconfig', + ['.*%.git/config%.worktree'] = 'gitconfig', + ['.*%.git/worktrees/.*/config%.worktree'] = 'gitconfig', + ['%.gitsendemail%.msg%.......'] = 'gitsendemail', + ['gkrellmrc_.'] = 'gkrellmrc', + ['.*/usr/.*/gnupg/options%.skel'] = 'gpg', + ['.*/%.gnupg/options'] = 'gpg', + ['.*/%.gnupg/gpg%.conf'] = 'gpg', + ['.*/etc/group'] = 'group', + ['.*/etc/gshadow'] = 'group', + ['.*/etc/group%.edit'] = 'group', + ['.*/var/backups/gshadow%.bak'] = 'group', + ['.*/etc/group-'] = 'group', + ['.*/etc/gshadow-'] = 'group', + ['.*/var/backups/group%.bak'] = 'group', + ['.*/etc/gshadow%.edit'] = 'group', + ['.*/boot/grub/grub%.conf'] = 'grub', + ['.*/boot/grub/menu%.lst'] = 'grub', + ['.*/etc/grub%.conf'] = 'grub', + ['hg%-editor%-.*%.txt'] = 'hgcommit', + ['.*/etc/host%.conf'] = 'hostconf', + ['.*/etc/hosts%.deny'] = 'hostsaccess', + ['.*/etc/hosts%.allow'] = 'hostsaccess', + ['.*%.html%.m4'] = 'htmlm4', + ['.*/%.i3/config'] = 'i3config', + ['.*/sway/config'] = 'i3config', + ['.*/i3/config'] = 'i3config', + ['.*/%.sway/config'] = 'i3config', + ['.*/%.icewm/menu'] = 'icemenu', + ['.*/etc/initng/.*/.*%.i'] = 'initng', + ['.*%.properties_..'] = 'jproperties', + ['.*%.properties_.._..'] = 'jproperties', + ['.*lftp/rc'] = 'lftp', + ['.*/%.libao'] = 'libao', + ['.*/etc/libao%.conf'] = 'libao', + ['.*/etc/.*limits%.conf'] = 'limits', + ['.*/etc/limits'] = 'limits', + ['.*/etc/.*limits%.d/.*%.conf'] = 'limits', + ['.*/LiteStep/.*/.*%.rc'] = 'litestep', + ['.*/etc/login%.access'] = 'loginaccess', + ['.*/etc/login%.defs'] = 'logindefs', + ['.*/etc/mail/aliases'] = 'mailaliases', + ['.*/etc/aliases'] = 'mailaliases', + ['.*[mM]akefile'] = 'make', + ['.*/etc/man%.conf'] = 'manconf', + ['.*/etc/modules%.conf'] = 'modconf', + ['.*/etc/conf%.modules'] = 'modconf', + ['.*/etc/modules'] = 'modconf', + ['.*%.[mi][3g]'] = 'modula3', + ['.*/%.mplayer/config'] = 'mplayerconf', + ['rndc.*%.conf'] = 'named', + ['rndc.*%.key'] = 'named', + ['named.*%.conf'] = 'named', + ['.*/etc/nanorc'] = 'nanorc', + ['.*%.NS[ACGLMNPS]'] = 'natural', + ['nginx.*%.conf'] = 'nginx', + ['.*/etc/nginx/.*'] = 'nginx', + ['.*nginx%.conf'] = 'nginx', + ['.*/nginx/.*%.conf'] = 'nginx', + ['.*/usr/local/nginx/conf/.*'] = 'nginx', + ['.*%.ml%.cppo'] = 'ocaml', + ['.*%.mli%.cppo'] = 'ocaml', + ['.*%.opam%.template'] = 'opam', + ['.*%.[Oo][Pp][Ll]'] = 'opl', + ['.*/etc/pam%.conf'] = 'pamconf', + ['.*/etc/passwd-'] = 'passwd', + ['.*/etc/shadow'] = 'passwd', + ['.*/etc/shadow%.edit'] = 'passwd', + ['.*/var/backups/shadow%.bak'] = 'passwd', + ['.*/var/backups/passwd%.bak'] = 'passwd', + ['.*/etc/passwd'] = 'passwd', + ['.*/etc/passwd%.edit'] = 'passwd', + ['.*/etc/shadow-'] = 'passwd', + ['.*/%.pinforc'] = 'pinfo', + ['.*/etc/pinforc'] = 'pinfo', + ['.*/etc/protocols'] = 'protocols', + ['.*baseq[2-3]/.*%.cfg'] = 'quake', + ['.*quake[1-3]/.*%.cfg'] = 'quake', + ['.*id1/.*%.cfg'] = 'quake', + ['[rR]antfile'] = 'ruby', + ['[rR]akefile'] = 'ruby', + ['.*/etc/sensors%.conf'] = 'sensors', + ['.*/etc/sensors3%.conf'] = 'sensors', + ['.*/etc/services'] = 'services', + ['.*/etc/serial%.conf'] = 'setserial', + ['.*/etc/udev/cdsymlinks%.conf'] = 'sh', + ['.*%._sst%.meta'] = 'sisu', + ['.*%.%-sst%.meta'] = 'sisu', + ['.*%.sst%.meta'] = 'sisu', + ['.*/etc/slp%.conf'] = 'slpconf', + ['.*/etc/slp%.reg'] = 'slpreg', + ['.*/etc/slp%.spi'] = 'slpspi', + ['.*/etc/ssh/ssh_config%.d/.*%.conf'] = 'sshconfig', + ['.*/%.ssh/config'] = 'sshconfig', + ['.*/etc/ssh/sshd_config%.d/.*%.conf'] = 'sshdconfig', + ['.*/etc/sudoers'] = 'sudoers', + ['svn%-commit.*%.tmp'] = 'svn', + ['.*%.swift%.gyb'] = 'swiftgyb', + ['.*/etc/sysctl%.conf'] = 'sysctl', + ['.*/etc/sysctl%.d/.*%.conf'] = 'sysctl', + ['.*/etc/systemd/.*%.conf%.d/.*%.conf'] = 'systemd', + ['.*/%.config/systemd/user/.*%.d/.*%.conf'] = 'systemd', + ['.*/etc/systemd/system/.*%.d/.*%.conf'] = 'systemd', + ['.*%.t%.html'] = 'tilde', + ['%.?tmux.*%.conf'] = 'tmux', + ['%.?tmux.*%.conf.*'] = { 'tmux', { priority = -1 } }, + ['.*/%.cargo/config'] = 'toml', + ['.*/%.cargo/credentials'] = 'toml', + ['.*/etc/udev/udev%.conf'] = 'udevconf', + ['.*/etc/udev/permissions%.d/.*%.permissions'] = 'udevperm', + ['.*/etc/updatedb%.conf'] = 'updatedb', + ['.*/%.init/.*%.override'] = 'upstart', + ['.*/usr/share/upstart/.*%.conf'] = 'upstart', + ['.*/%.config/upstart/.*%.override'] = 'upstart', + ['.*/etc/init/.*%.conf'] = 'upstart', + ['.*/etc/init/.*%.override'] = 'upstart', + ['.*/%.config/upstart/.*%.conf'] = 'upstart', + ['.*/%.init/.*%.conf'] = 'upstart', + ['.*/usr/share/upstart/.*%.override'] = 'upstart', + ['.*%.ws[fc]'] = 'wsh', + ['.*/etc/xinetd%.conf'] = 'xinetd', + ['.*/etc/blkid%.tab'] = 'xml', + ['.*/etc/blkid%.tab%.old'] = 'xml', + ['.*%.vbproj%.user'] = 'xml', + ['.*%.fsproj%.user'] = 'xml', + ['.*%.csproj%.user'] = 'xml', + ['.*/etc/xdg/menus/.*%.menu'] = 'xml', + ['.*Xmodmap'] = 'xmodmap', + ['.*/etc/zprofile'] = 'zsh', + ['%.bash[_-]aliases'] = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, + ['%.bash[_-]logout'] = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, + ['%.bash[_-]profile'] = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, + ['%.cshrc.*'] = function() + vim.fn['dist#ft#CSH']() + end, + ['%.gtkrc.*'] = starsetf('gtkrc'), + ['%.kshrc.*'] = function() + vim.fn['dist#ft#SetFileTypeSH']('ksh') + end, + ['%.login.*'] = function() + vim.fn['dist#ft#CSH']() + end, + ['%.neomuttrc.*'] = starsetf('neomuttrc'), + ['%.profile.*'] = function() + vim.fn['dist#ft#SetFileTypeSH'](vim.fn.getline(1)) + end, + ['%.reminders.*'] = starsetf('remind'), + ['%.tcshrc.*'] = function() + vim.fn['dist#ft#SetFileTypeShell']('tcsh') + end, + ['%.zcompdump.*'] = starsetf('zsh'), + ['%.zlog.*'] = starsetf('zsh'), + ['%.zsh.*'] = starsetf('zsh'), + ['.*%.[1-9]'] = function(path, bufnr) + require('vim.filetype.detect').nroff(bufnr) + end, + ['.*%.[aA]'] = function(path, bufnr) + require('vim.filetype.detect').asm(bufnr) + end, + ['.*%.[sS]'] = function(path, bufnr) + require('vim.filetype.detect').asm(bufnr) + end, + ['.*%.properties_.._.._.*'] = starsetf('jproperties'), + ['.*%.vhdl_[0-9].*'] = starsetf('vhdl'), + ['.*/%.fvwm/.*'] = starsetf('fvwm'), + ['.*/%.gitconfig%.d/.*'] = starsetf('gitconfig'), + ['.*/%.neomutt/neomuttrc.*'] = starsetf('neomuttrc'), + ['.*/Xresources/.*'] = starsetf('xdefaults'), + ['.*/app%-defaults/.*'] = starsetf('xdefaults'), + ['.*/bind/db%..*'] = starsetf('bindzone'), + ['.*/debian/patches/.*'] = function(path, bufnr) + require('vim.filetype.detect').dep3patch(path, bufnr) + end, + ['.*/etc/Muttrc%.d/.*'] = starsetf('muttrc'), + ['.*/etc/apache2/.*%.conf.*'] = starsetf('apache'), + ['.*/etc/apache2/conf%..*/.*'] = starsetf('apache'), + ['.*/etc/apache2/mods%-.*/.*'] = starsetf('apache'), + ['.*/etc/apache2/sites%-.*/.*'] = starsetf('apache'), + ['.*/etc/cron%.d/.*'] = starsetf('crontab'), + ['.*/etc/dnsmasq%.d/.*'] = starsetf('dnsmasq'), + ['.*/etc/httpd/conf%..*/.*'] = starsetf('apache'), + ['.*/etc/httpd/conf%.d/.*%.conf.*'] = starsetf('apache'), + ['.*/etc/httpd/mods%-.*/.*'] = starsetf('apache'), + ['.*/etc/httpd/sites%-.*/.*'] = starsetf('apache'), + ['.*/etc/logcheck/.*%.d.*/.*'] = starsetf('logcheck'), + ['.*/etc/modprobe%..*'] = starsetf('modconf'), + ['.*/etc/pam%.d/.*'] = starsetf('pamconf'), + ['.*/etc/profile'] = function() + vim.fn['dist#ft#SetFileTypeSH'](vim.fn.getline(1)) + end, + ['.*/etc/proftpd/.*%.conf.*'] = starsetf('apachestyle'), + ['.*/etc/proftpd/conf%..*/.*'] = starsetf('apachestyle'), + ['.*/etc/sudoers%.d/.*'] = starsetf('sudoers'), + ['.*/etc/xinetd%.d/.*'] = starsetf('xinetd'), + ['.*/etc/yum%.repos%.d/.*'] = starsetf('dosini'), + ['.*/gitolite%-admin/conf/.*'] = starsetf('gitolite'), + ['.*/named/db%..*'] = starsetf('bindzone'), + ['.*/tmp/lltmp.*'] = starsetf('gedcom'), + ['.*asterisk.*/.*voicemail%.conf.*'] = starsetf('asteriskvm'), + ['.*asterisk/.*%.conf.*'] = starsetf('asterisk'), + ['.*vimrc.*'] = starsetf('vim'), + ['.*xmodmap.*'] = starsetf('xmodmap'), + ['/etc/gitconfig%.d/.*'] = starsetf('gitconfig'), + ['/etc/hostname%..*'] = starsetf('config'), + ['Containerfile%..*'] = starsetf('dockerfile'), + ['Dockerfile%..*'] = starsetf('dockerfile'), + ['JAM.*%..*'] = starsetf('jam'), + ['Kconfig%..*'] = starsetf('kconfig'), + ['Neomuttrc.*'] = starsetf('neomuttrc'), + ['Prl.*%..*'] = starsetf('jam'), + ['Xresources.*'] = starsetf('xdefaults'), + ['[mM]akefile.*'] = starsetf('make'), + ['[rR]akefile.*'] = starsetf('ruby'), + ['access%.conf.*'] = starsetf('apache'), + ['apache%.conf.*'] = starsetf('apache'), + ['apache2%.conf.*'] = starsetf('apache'), + ['bash%-fc[-%.]'] = function() + vim.fn['dist#ft#SetFileTypeSH']('bash') + end, + ['cabal%.project%..*'] = starsetf('cabalproject'), + ['crontab%..*'] = starsetf('crontab'), + ['drac%..*'] = starsetf('dracula'), + ['gtkrc.*'] = starsetf('gtkrc'), + ['httpd%.conf.*'] = starsetf('apache'), + ['lilo%.conf.*'] = starsetf('lilo'), + ['neomuttrc.*'] = starsetf('neomuttrc'), + ['proftpd%.conf.*'] = starsetf('apachestyle'), + ['reportbug%-.*'] = starsetf('mail'), + ['sgml%.catalog.*'] = starsetf('catalog'), + ['srm%.conf.*'] = starsetf('apache'), + ['tmac%..*'] = starsetf('nroff'), + ['zlog.*'] = starsetf('zsh'), + ['zsh.*'] = starsetf('zsh'), + ['ae%d+%.txt'] = 'mail', + ['snd%.%d+'] = 'mail', + ['%.letter%.%d+'] = 'mail', + ['%.article%.%d+'] = 'mail', + ['pico%.%d+'] = 'mail', + ['mutt%-.*%-%w+'] = 'mail', + ['neomutt%-.*%-%w+'] = 'mail', + ['muttng%-.*%-%w+'] = 'mail', + ['mutt' .. string.rep('[%w_-]', 6)] = 'mail', + ['neomutt' .. string.rep('[%w_-]', 6)] = 'mail', + ['/tmp/SLRN[0-9A-Z.]+'] = 'mail', + ['[a-zA-Z0-9].*Dict'] = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + ['[a-zA-Z0-9].*Dict%..*'] = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + ['[a-zA-Z].*Properties'] = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + ['[a-zA-Z].*Properties%..*'] = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + ['.*Transport%..*'] = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + ['.*/constant/g'] = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + ['.*/0/.*'] = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + ['.*/0%.orig/.*'] = function(path, bufnr) + require('vim.filetype.detect').foam(bufnr) + end, + ['.*/etc/sensors%.d/[^.].*'] = starsetf('sensors'), + ['.*%.git/.*'] = function(path, bufnr) local firstline = getline(bufnr, 1) - if firstline:find("^" .. string.rep("%x", 40) .. "+ ") or firstline:sub(1, 5) == "ref: " then - return "git" + if firstline:find('^' .. string.rep('%x', 40) .. '+ ') or firstline:sub(1, 5) == 'ref: ' then + return 'git' end end, - [".*%.[Cc][Ff][Gg]"] = function() vim.fn["dist#ft#FTcfg"]() end, - [".*%.[Dd][Aa][Tt]"] = function() vim.fn["dist#ft#FTdat"]() end, - [".*%.[Mm][Oo][Dd]"] = function() vim.fn["dist#ft#FTmod"]() end, - [".*%.[Ss][Rr][Cc]"] = function() vim.fn["dist#ft#FTsrc"]() end, - [".*%.[Ss][Uu][Bb]"] = "krl", - [".*%.[Pp][Rr][Gg]"] = function() vim.fn["dist#ft#FTprg"]() end, - [".*%.[Ss][Yy][Ss]"] = function() vim.fn["dist#ft#FTsys"]() end, + ['.*%.[Cc][Ff][Gg]'] = function(path, bufnr) + require('vim.filetype.detect').cfg(bufnr) + end, + ['.*%.[Dd][Aa][Tt]'] = function(path, bufnr) + require('vim.filetype.detect').dat(bufnr) + end, + ['.*%.[Mm][Oo][Dd]'] = function(path, bufnr) + require('vim.filetype.detect').mod(path, bufnr) + end, + ['.*%.[Ss][Rr][Cc]'] = function(path, bufnr) + require('vim.filetype.detect').src(bufnr) + end, + ['.*%.[Ss][Uu][Bb]'] = 'krl', + ['.*%.[Pp][Rr][Gg]'] = function(path, bufnr) + require('vim.filetype.detect').prg(bufnr) + end, + ['.*%.[Ss][Yy][Ss]'] = function(path, bufnr) + require('vim.filetype.detect').sys(bufnr) + end, -- Neovim only - [".*/queries/.*%.scm"] = "query", -- tree-sitter queries + ['.*/queries/.*%.scm'] = 'query', -- tree-sitter queries -- END PATTERN } -- luacheck: pop @@ -1466,10 +1709,10 @@ local pattern = { local function sort_by_priority(t) local sorted = {} for k, v in pairs(t) do - local ft = type(v) == "table" and v[1] or v - assert(type(ft) == "string" or type(ft) == "function", "Expected string or function for filetype") + local ft = type(v) == 'table' and v[1] or v + assert(type(ft) == 'string' or type(ft) == 'function', 'Expected string or function for filetype') - local opts = (type(v) == "table" and type(v[2]) == "table") and v[2] or {} + local opts = (type(v) == 'table' and type(v[2]) == 'table') and v[2] or {} if not opts.priority then opts.priority = 0 end @@ -1485,7 +1728,7 @@ local pattern_sorted = sort_by_priority(pattern) ---@private local function normalize_path(path, as_pattern) - local normal = path:gsub("\\", '/') + local normal = path:gsub('\\', '/') if normal:find('^~') then if as_pattern then -- Escape Lua's metacharacters when $HOME is used in a pattern. @@ -1574,12 +1817,12 @@ end ---@private local function dispatch(ft, path, bufnr, ...) - if type(ft) == "function" then + if type(ft) == 'function' then ft = ft(path, bufnr, ...) end - if type(ft) == "string" then - api.nvim_buf_set_option(bufnr, "filetype", ft) + if type(ft) == 'string' then + api.nvim_buf_set_option(bufnr, 'filetype', ft) return true end @@ -1592,9 +1835,9 @@ end ---@private local function match_pattern(name, path, tail, pat) -- If the pattern contains a / match against the full path, otherwise just the tail - local fullpat = "^" .. pat .. "$" + local fullpat = '^' .. pat .. '$' local matches - if pat:find("/") then + if pat:find('/') then -- Similar to |autocmd-pattern|, if the pattern contains a '/' then check for a match against -- both the short file name (as typed) and the full file name (after expanding to full path -- and resolving symlinks) @@ -1618,13 +1861,13 @@ function M.match(name, bufnr) name = normalize_path(name) -- First check for the simple case where the full path exists as a key - local path = vim.fn.resolve(vim.fn.fnamemodify(name, ":p")) + local path = vim.fn.resolve(vim.fn.fnamemodify(name, ':p')) if dispatch(filename[path], path, bufnr) then return end -- Next check against just the file name - local tail = vim.fn.fnamemodify(name, ":t") + local tail = vim.fn.fnamemodify(name, ':t') if dispatch(filename[tail], path, bufnr) then return end @@ -1649,7 +1892,7 @@ function M.match(name, bufnr) end -- Next, check file extension - local ext = vim.fn.fnamemodify(name, ":e") + local ext = vim.fn.fnamemodify(name, ':e') if dispatch(extension[ext], path, bufnr) then return end diff --git a/runtime/lua/vim/filetype/detect.lua b/runtime/lua/vim/filetype/detect.lua index 787b335251..da59625353 100644 --- a/runtime/lua/vim/filetype/detect.lua +++ b/runtime/lua/vim/filetype/detect.lua @@ -1,15 +1,28 @@ +-- Contains filetype detection functions converted to Lua from Vim's autoload/runtime/dist/ft.vim file. + +-- Here are a few guidelines to follow when porting a new function: +-- * Sort the function alphabetically and omit 'ft' or 'check' from the new function name. +-- * Use ':find' instead of ':match' / ':sub' if possible. +-- * When '=~' is used to match a pattern, there are two possibilities: +-- - If the pattern only contains lowercase characters, treat the comparison as case-insensitive. +-- - Otherwise, treat it as case-sensitive. +-- (Basically, we apply 'smartcase': if upper case characters are used in the original pattern, then +-- it's likely that case does matter). +-- * When '\k', '\<' or '\>' is used in a pattern, use the 'matchregex' function. +-- Note that vim.regex is case-sensitive by default, so add the '\c' flag if only lowercase letters +-- are present in the pattern: +-- Example: +-- `if line =~ '^\s*unwind_protect\>'` => `if matchregex(line, [[\c^\s*unwind_protect\>]])` + local M = {} ---@private -local function getlines(bufnr, start_lnum, end_lnum, opts) +local function getlines(bufnr, start_lnum, end_lnum) if not end_lnum then -- Return a single line as a string return vim.api.nvim_buf_get_lines(bufnr, start_lnum - 1, start_lnum, false)[1] end - - local lines = vim.api.nvim_buf_get_lines(bufnr, start_lnum - 1, end_lnum, false) - opts = opts or {} - return opts.concat and (table.concat(lines) or "") or lines + return vim.api.nvim_buf_get_lines(bufnr, start_lnum - 1, end_lnum, false) end ---@private @@ -22,86 +35,263 @@ local function findany(s, patterns) return false end +---@private +local function nextnonblank(bufnr, start_lnum) + for _, line in ipairs(getlines(bufnr, start_lnum, -1)) do + if not line:find('^%s*$') then + return line + end + end + return nil +end + +---@private +local matchregex = (function() + local cache = {} + return function(line, pattern) + if line == nil then + return nil + end + if not cache[pattern] then + cache[pattern] = vim.regex(pattern) + end + return cache[pattern]:match_str(line) + end +end)() + -- luacheck: push no unused args -- luacheck: push ignore 122 -function M.asm(path, bufnr) end +-- This function checks for the kind of assembly that is wanted by the user, or +-- can be detected from the first five lines of the file. +function M.asm(bufnr) + -- Make sure b:asmsyntax exists + if not vim.b[bufnr].asmsyntax then + vim.b[bufnr].asmsyntax = '' + end + + if vim.b[bufnr].asmsyntax == '' then + M.asm_syntax(bufnr) + end + + -- If b:asmsyntax still isn't set, default to asmsyntax or GNU + if vim.b[bufnr].asmsyntax == '' then + if vim.g.asmsyntax and vim.g.asmsyntax ~= 0 then + vim.b[bufnr].asmsyntax = vim.g.asmsyntax + else + vim.b[bufnr].asmsyntax = 'asm' + end + end + vim.bo[bufnr].filetype = vim.fn.fnameescape(vim.b[bufnr].asmsyntax) +end + +-- Checks the first 5 lines for a asmsyntax=foo override. +-- Only whitespace characters can be present immediately before or after this statement. +function M.asm_syntax(bufnr) + local lines = table.concat(getlines(bufnr, 1, 5), ' '):lower() + local match = lines:match('%sasmsyntax=([a-zA-Z0-9]+)%s') + if match then + vim.b['asmsyntax'] = match + elseif findany(lines, { '%.title', '%.ident', '%.macro', '%.subtitle', '%.library' }) then + vim.b['asmsyntax'] = 'vmasm' + end +end + +local visual_basic_content = { 'vb_name', 'begin vb%.form', 'begin vb%.mdiform', 'begin vb%.usercontrol' } + +-- See frm() for Visual Basic form file detection +function M.bas(bufnr) + if vim.g.filetype_bas then + vim.bo[bufnr].filetype = vim.g.filetype_bas + return + end + + -- Most frequent FreeBASIC-specific keywords in distro files + local fb_keywords = + [[\c^\s*\%(extern\|var\|enum\|private\|scope\|union\|byref\|operator\|constructor\|delete\|namespace\|public\|property\|with\|destructor\|using\)\>\%(\s*[:=(]\)\@!]] + local fb_preproc = + [[\c^\s*\%(#\a\+\|option\s\+\%(byval\|dynamic\|escape\|\%(no\)\=gosub\|nokeyword\|private\|static\)\>\)]] -function M.asm_syntax(path, bufnr) end + local fb_comment = "^%s*/'" + -- OPTION EXPLICIT, without the leading underscore, is common to many dialects + local qb64_preproc = [[\c^\s*\%($\a\+\|option\s\+\%(_explicit\|_\=explicitarray\)\>\)]] -function M.bas(path, bufnr) end + for _, line in ipairs(getlines(bufnr, 1, 100)) do + if line:find(fb_comment) or matchregex(line, fb_preproc) or matchregex(line, fb_keywords) then + vim.bo[bufnr].filetype = 'freebasic' + return + elseif matchregex(line, qb64_preproc) then + vim.bo[bufnr].filetype = 'qb64' + return + elseif findany(line:lower(), visual_basic_content) then + vim.bo[bufnr].filetype = 'vb' + return + end + end + vim.bo[bufnr].filetype = 'basic' +end -function M.bindzone(path, bufnr) end +function M.bindzone(bufnr, default_ft) end function M.btm(bufnr) if vim.g.dosbatch_syntax_for_btm and vim.g.dosbatch_syntax_for_btm ~= 0 then - vim.bo[bufnr].filetype = "dosbatch" + vim.bo[bufnr].filetype = 'dosbatch' else - vim.bo[bufnr].filetype = "btm" + vim.bo[bufnr].filetype = 'btm' end end -- Returns true if file content looks like RAPID local function is_rapid(bufnr, extension) - if extension == "cfg" then + if extension == 'cfg' then local line = getlines(bufnr, 1):lower() - return findany(line, { "eio:cfg", "mmc:cfg", "moc:cfg", "proc:cfg", "sio:cfg", "sys:cfg" }) + return findany(line, { 'eio:cfg', 'mmc:cfg', 'moc:cfg', 'proc:cfg', 'sio:cfg', 'sys:cfg' }) end - local first = "^%s*module%s+%S+%s*" - -- Called from mod, prg or sys functions - for _, line in ipairs(getlines(bufnr, 1, -1)) do - if not line:find("^%s*$") then - return findany(line:lower(), { "^%s*%%%%%%", first .. "(", first .. "$" }) - end + local line = nextnonblank(bufnr, 1) + if line then + -- Called from mod, prg or sys functions + return matchregex(line:lower(), [[\c\v^\s*%(\%{3}|module\s+\k+\s*%(\(|$))]]) end - -- Only found blank lines return false end function M.cfg(bufnr) if vim.g.filetype_cfg then vim.bo[bufnr].filetype = vim.g.filetype_cfg - elseif is_rapid(bufnr, "cfg") then - vim.bo[bufnr].filetype = "rapid" + elseif is_rapid(bufnr, 'cfg') then + vim.bo[bufnr].filetype = 'rapid' else - vim.bo[bufnr].filetype = "cfg" + vim.bo[bufnr].filetype = 'cfg' end end -function M.change(path, bufnr) end +-- This function checks if one of the first ten lines start with a '@'. In +-- that case it is probably a change file. +-- If the first line starts with # or ! it's probably a ch file. +-- If a line has "main", "include", "//" or "/*" it's probably ch. +-- Otherwise CHILL is assumed. +function M.change(bufnr) + local first_line = getlines(bufnr, 1) + if findany(first_line, { '^#', '^!' }) then + vim.bo[bufnr].filetype = 'ch' + return + end + for _, line in ipairs(getlines(bufnr, 1, 10)) do + if line:find('^@') then + vim.bo[bufnr].filetype = 'change' + return + end + if line:find('MODULE') then + vim.bo[bufnr].filetype = 'chill' + return + elseif findany(line:lower(), { 'main%s*%(', '#%s*include', '//' }) then + vim.bo[bufnr].filetype = 'ch' + return + end + end + vim.bo[bufnr].filetype = 'chill' +end function M.csh(path, bufnr) end -function M.dat(path, bufnr) end +-- Determine if a *.dat file is Kuka Robot Language +-- TODO: this one fails for some reason, so I omitted it. #18219 should be merged first. +function M.dat(bufnr) + -- if vim.g.filetype_dat then + -- vim.bo[bufnr].filetype = vim.g.filetype_dat + -- return + -- end + -- local line = nextnonblank(bufnr, 1):lower() + -- if findany(line, { "^%s*&%w+", "^%s*defdat" }) then + -- vim.bo[bufnr].filetype = "krl" + -- end +end + +-- This function is called for all files under */debian/patches/*, make sure not +-- to non-dep3patch files, such as README and other text files. +function M.dep3patch(path, bufnr) + local file_name = vim.fn.fnamemodify(path, ':t') + if file_name == 'series' then + return + end -function M.dep3patch(path, bufnr) end + for _, line in ipairs(getlines(bufnr, 1, 100)) do + if + findany(line, { + '^Description:', + '^Subject:', + '^Origin:', + '^Bug:', + '^Forwarded:', + '^Author:', + '^From:', + '^Reviewed%-by:', + '^Acked%-by:', + '^Last%-Updated:', + '^Applied%-Upstream:', + }) + then + vim.bo[bufnr].filetype = 'dep3patch' + return + elseif line:find('^%-%-%-') then + -- End of headers found. stop processing + return + end + end +end -function M.dtrace(path, bufnr) end +function M.dtrace(bufnr) + local did_filetype = vim.fn.did_filetype() + if did_filetype and did_filetype ~= 0 then + -- Filetype was already detected + return + end + for _, line in ipairs(getlines(bufnr, 1, 100)) do + if matchregex(line, [[\c^module\>\|^import\>]]) then + -- D files often start with a module and/or import statement. + vim.bo[bufnr].filetype = 'd' + return + elseif findany(line, { '^#!%S+dtrace', '#pragma%s+D%s+option', ':%S-:%S-:' }) then + vim.bo[bufnr].filetype = 'dtrace' + return + end + end + vim.bo[bufnr].filetype = 'd' +end -function M.e(path, bufnr) end +function M.e(path, bufnr) + if vim.g.filetype_euphoria then + vim.bo[bufnr].filetype = vim.g.filetype_euphoria + return + end + -- TODO: WIP + -- for _, line in ipairs(getlines(bufnr, 1, 100)) do + -- if line:find("^$") + -- end +end -- This function checks for valid cl syntax in the first five lines. -- Look for either an opening comment, '#', or a block start, '{'. -- If not found, assume SGML. function M.ent(bufnr) for _, line in ipairs(getlines(bufnr, 1, 5)) do - if line:find("^%s*[#{]") then - vim.bo[bufnr].filetype = "cl" + if line:find('^%s*[#{]') then + vim.bo[bufnr].filetype = 'cl' return - elseif not line:find("^%s*$") then + elseif not line:find('^%s*$') then -- Not a blank line, not a comment, and not a block start, -- so doesn't look like valid cl code. break end end - vim.bo[bufnr].filetype = "dtd" + vim.bo[bufnr].filetype = 'dtd' end function M.euphoria(bufnr) if vim.g.filetype_euphoria then vim.bo[bufnr].filetype = vim.g.filetype_euphoria else - vim.bo[bufnr].filetype = "euphoria3" + vim.bo[bufnr].filetype = 'euphoria3' end end @@ -110,13 +300,12 @@ function M.ex(bufnr) vim.bo[bufnr].filetype = vim.g.filetype_euphoria else for _, line in ipairs(getlines(bufnr, 1, 100)) do - -- TODO: in the Vim regex, \> is used to match the end of the word, can this be omitted? - if findany(line, { "^%-%-", "^ifdef", "^include" }) then - vim.bo[bufnr].filetype = "euphoria3" + if matchregex(line, [[\c^--\|^ifdef\>\|^include\>]]) then + vim.bo[bufnr].filetype = 'euphoria3' return end end - vim.bo[bufnr].filetype = "elixir" + vim.bo[bufnr].filetype = 'elixir' end end @@ -126,10 +315,10 @@ end function M.foam(bufnr) local foam_file = false for _, line in ipairs(getlines(bufnr, 1, 15)) do - if line:find("^FoamFile") then + if line:find('^FoamFile') then foam_file = true - elseif foam_file and line:find("^%s*object") then - vim.bo[bufnr].filetype = "foam" + elseif foam_file and line:find('^%s*object') then + vim.bo[bufnr].filetype = 'foam' return end end @@ -138,162 +327,377 @@ end function M.frm(bufnr) if vim.g.filetype_frm then vim.bo[bufnr].filetype = vim.g.filetype_frm + return + end + local lines = table.concat(getlines(bufnr, 1, 5)):lower() + if findany(lines, visual_basic_content) then + vim.bo[bufnr].filetype = 'vb' else - -- Always ignore case - local lines = getlines(bufnr, 1, 5, { concat = true }):lower() - if findany(lines, { "vb_name", "begin vb%.form", "begin vb%.mdiform" }) then - vim.bo[bufnr].filetype = "vb" - else - vim.bo[bufnr].filetype = "form" - end + vim.bo[bufnr].filetype = 'form' end end -function M.fs(path, bufnr) end +-- Distinguish between Forth and F#. +function M.fs(bufnr) + -- TODO: WIP + -- if vim.g.filetype_fs then + -- vim.bo[bufnr].filetype = vim.g.filetype_fs + -- return + -- end + -- local line = nextnonblank(bufnr, 1) + -- if findany(line, { '^%s*.?%( ', '^%s*\\G? ', '^\\$', '^%s*: %S' }) then + -- vim.bo[bufnr].filetype = 'forth' + -- else + -- vim.bo[bufnr].filetype = 'fsharp' + -- end +end function M.header(bufnr) for _, line in ipairs(getlines(bufnr, 1, 200)) do - if findany(line, { "^@interface", "^@end", "^@class" }) then + if findany(line:lower(), { '^@interface', '^@end', '^@class' }) then if vim.g.c_syntax_for_h then - vim.bo[bufnr].filetype = "objc" + vim.bo[bufnr].filetype = 'objc' else - vim.bo[bufnr].filetype = "objcpp" + vim.bo[bufnr].filetype = 'objcpp' end return end end if vim.g.c_syntax_for_h then - vim.bo[bufnr].filetype = "c" + vim.bo[bufnr].filetype = 'c' elseif vim.g.ch_syntax_for_h then - vim.bo[bufnr].filetype = "ch" + vim.bo[bufnr].filetype = 'ch' else - vim.bo[bufnr].filetype = "cpp" + vim.bo[bufnr].filetype = 'cpp' + end +end + +function M.html(bufnr) + for _, line in ipairs(getlines(bufnr, 1, 10)) do + if matchregex(line, [[\<DTD\s\+XHTML\s]]) then + vim.bo[bufnr].filetype = 'xhtml' + return + elseif matchregex(line, [[\c{%\s*\(extends\|block\|load\)\>\|{#\s\+]]) then + vim.bo[bufnr].filetype = 'htmldjango' + return + end end + vim.bo[bufnr].filetype = 'html' end function M.idl(bufnr) for _, line in ipairs(getlines(bufnr, 1, 50)) do - -- Always ignore case - line = line:lower() - if findany(line, { '^%s*import%s+"unknwn"%.idl', '^%s*import%s+"objidl"%.idl' }) then - vim.bo[bufnr].filetype = "msidl" + if findany(line:lower(), { '^%s*import%s+"unknwn"%.idl', '^%s*import%s+"objidl"%.idl' }) then + vim.bo[bufnr].filetype = 'msidl' return end end - vim.bo[bufnr].filetype = "idl" + vim.bo[bufnr].filetype = 'idl' end function M.inc(path, bufnr) end function M.inp(bufnr) - if getlines(bufnr, 1):find("^%*") then - vim.bo[bufnr].filetype = "abaqus" + if getlines(bufnr, 1):find('^%*') then + vim.bo[bufnr].filetype = 'abaqus' else for _, line in ipairs(getlines(bufnr, 1, 500)) do - if line:lower():find("^header surface data") then - vim.bo[bufnr].filetype = "trasys" + if line:lower():find('^header surface data') then + vim.bo[bufnr].filetype = 'trasys' + return + end + end + end +end + +function M.lpc(bufnr) + if vim.g.lpc_syntax_for_c then + for _, line in ipairs(getlines(bufnr, 1, 12)) do + if + findany(line, { + '^//', + '^inherit', + '^private', + '^protected', + '^nosave', + '^string', + '^object', + '^mapping', + '^mixed', + }) + then + vim.bo[bufnr].filetype = 'lpc' return end end end + vim.bo[bufnr].filetype = 'c' end -function M.lpc(path, bufnr) end +function M.m(bufnr) + if vim.g.filetype_m then + vim.bo[bufnr].filetype = vim.g.filetype_m + return + end + + -- Excluding end(for|function|if|switch|while) common to Murphi + local octave_block_terminators = + [[\<end\%(_try_catch\|classdef\|enumeration\|events\|methods\|parfor\|properties\)\>]] + local objc_preprocessor = [[\c^\s*#\s*\%(import\|include\|define\|if\|ifn\=def\|undef\|line\|error\|pragma\)\>]] -function M.lprolog(path, bufnr) end + -- Whether we've seen a multiline comment leader + local saw_comment = false + for _, line in ipairs(getlines(bufnr, 1, 100)) do + if line:find('^%s*/%*') then + -- /* ... */ is a comment in Objective C and Murphi, so we can't conclude + -- it's either of them yet, but track this as a hint in case we don't see + -- anything more definitive. + saw_comment = true + end + if line:find('^%s*//') or matchregex(line, [[\c^\s*@import\>]]) or matchregex(line, objc_preprocessor) then + vim.bo[bufnr].filetype = 'objc' + return + end + if + findany(line, { '^%s*#', '^%s*%%!' }) + or matchregex(line, [[\c^\s*unwind_protect\>]]) + or matchregex(line, [[\c\%(^\|;\)\s*]] .. octave_block_terminators) + then + vim.bo[bufnr].filetype = 'octave' + return + elseif line:find('^%s*%%') then + vim.bo[bufnr].filetype = 'matlab' + return + elseif line:find('^%s*%(%*') then + vim.bo[bufnr].filetype = 'mma' + return + elseif matchregex(line, [[\c^\s*\(\(type\|var\)\>\|--\)]]) then + vim.bo[bufnr].filetype = 'murphi' + return + end + end -function M.m(path, bufnr) end + if saw_comment then + -- We didn't see anything definitive, but this looks like either Objective C + -- or Murphi based on the comment leader. Assume the former as it is more + -- common. + vim.bo[bufnr].filetype = 'objc' + else + -- Default is Matlab + vim.bo[bufnr].filetype = 'matlab' + end +end -- Rely on the file to start with a comment. -- MS message text files use ';', Sendmail files use '#' or 'dnl' function M.mc(bufnr) for _, line in ipairs(getlines(bufnr, 1, 20)) do - if findany(line:lower(), { "^%s*#", "^%s*dnl" }) then + if findany(line:lower(), { '^%s*#', '^%s*dnl' }) then -- Sendmail .mc file - vim.bo[bufnr].filetype = "m4" + vim.bo[bufnr].filetype = 'm4' return - elseif line:find("^%s*;") then - vim.bo[bufnr].filetype = "msmessages" + elseif line:find('^%s*;') then + vim.bo[bufnr].filetype = 'msmessages' return end end -- Default: Sendmail .mc file - vim.bo[bufnr].filetype = "m4" + vim.bo[bufnr].filetype = 'm4' end -function M.mm(path, bufnr) end +function M.mm(bufnr) + for _, line in ipairs(getlines(bufnr, 1, 20)) do + if matchregex(line, [[\c^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)]]) then + vim.bo[bufnr].filetype = 'objcpp' + return + end + end + vim.bo[bufnr].filetype = 'nroff' +end function M.mms(bufnr) for _, line in ipairs(getlines(bufnr, 1, 20)) do - if findany(line, { "^%s*%%", "^%s*//", "^%*" }) then - vim.bo[bufnr].filetype = "mmix" + if findany(line, { '^%s*%%', '^%s*//', '^%*' }) then + vim.bo[bufnr].filetype = 'mmix' return - elseif line:find("^%s*#") then - vim.bo[bufnr].filetype = "make" + elseif line:find('^%s*#') then + vim.bo[bufnr].filetype = 'make' return end end - vim.bo[bufnr].filetype = "mmix" + vim.bo[bufnr].filetype = 'mmix' +end + +-- Returns true if file content looks like LambdaProlog +local function is_lprolog(bufnr) + -- Skip apparent comments and blank lines, what looks like + -- LambdaProlog comment may be RAPID header + for _, line in ipairs(getlines(bufnr, 1, -1)) do + -- The second pattern matches a LambdaProlog comment + if not findany(line, { '^%s*$', '^%s*%%' }) then + -- The pattern must not catch a go.mod file + return matchregex(line, [[\c\<module\s\+\w\+\s*\.\s*\(%\|$\)]]) ~= nil + end + end end -function M.mod(path, bufnr) end +-- Determine if *.mod is ABB RAPID, LambdaProlog, Modula-2, Modsim III or go.mod +function M.mod(path, bufnr) + if vim.g.filetype_mod then + vim.bo[bufnr].filetype = vim.g.filetype_mod + elseif is_lprolog(bufnr) then + vim.bo[bufnr].filetype = 'lprolog' + elseif matchregex(nextnonblank(bufnr, 1), [[\%(\<MODULE\s\+\w\+\s*;\|^\s*(\*\)]]) then + vim.bo[bufnr].filetype = 'modula2' + elseif is_rapid(bufnr) then + vim.bo[bufnr].filetype = 'rapid' + elseif matchregex(path, [[\c\<go\.mod$]]) then + vim.bo[bufnr].filetype = 'gomod' + else + -- Nothing recognized, assume modsim3 + vim.bo[bufnr].filetype = 'modsim3' + end +end -- This function checks if one of the first five lines start with a dot. In --- that case it is probably an nroff file: 'filetype' is set and 1 is returned. +-- that case it is probably an nroff file: 'filetype' is set and true is returned. function M.nroff(bufnr) for _, line in ipairs(getlines(bufnr, 1, 5)) do - if line:find("^%.") then - vim.bo[bufnr].filetype = "nroff" - return 1 + if line:find('^%.') then + vim.bo[bufnr].filetype = 'nroff' + return true end end - return 0 + return false end -function M.perl(path, bufnr) end +-- If the file has an extension of 't' and is in a directory 't' or 'xt' then +-- it is almost certainly a Perl test file. +-- If the first line starts with '#' and contains 'perl' it's probably a Perl file. +-- (Slow test) If a file contains a 'use' statement then it is almost certainly a Perl file. +function M.perl(path, bufnr) + local dirname = vim.fn.expand(path, '%:p:h:t') + if vim.fn.expand(dirname, '%:e') == 't' and (dirname == 't' or dirname == 'xt') then + vim.bo[bufnr].filetype = 'perl' + return true + end + local first_line = getlines(bufnr, 1) + if first_line:find('^#') and first_line:lower():find('perl') then + vim.bo[bufnr].filetype = 'perl' + return true + end + for _, line in ipairs(getlines(bufnr, 1, 30)) do + if matchregex(line, [[\c^use\s\s*\k]]) then + vim.bo[bufnr].filetype = 'perl' + return true + end + end + return false +end function M.pl(path, bufnr) end -function M.pp(path, bufnr) end +local pascal_comments = { '^%s*{', '^%s*%(*', '^%s*//' } +local pascal_keywords = [[\c^\s*\%(program\|unit\|library\|uses\|begin\|procedure\|function\|const\|type\|var\)\>]] + +function M.pp(bufnr) + -- TODO: WIP + + -- if vim.g.filetype_pp then + -- vim.bo[bufnr].filetype = vim.g.filetype_pp + -- return + -- end + -- local first_line = nextnonblank(bufnr, 1):lower() + -- if findany(first_line, { pascal_comments, pascal_keywords }) then + -- vim.bo[bufnr].filetype = "pascal" + -- else + -- vim.bo[bufnr].filetype = "puppet" + -- end +end + +function M.prg(bufnr) + if vim.g.filetype_prg then + vim.bo[bufnr].filetype = vim.g.filetype_prg + elseif is_rapid(bufnr) then + vim.bo[bufnr].filetype = 'rapid' + else + -- Nothing recognized, assume Clipper + vim.bo[bufnr].filetype = 'clipper' + end +end -function M.prg(path, bufnr) end +-- This function checks for an assembly comment in the first ten lines. +-- If not found, assume Progress. +function M.progress_asm(bufnr) + if vim.g.filetype_i then + vim.bo[bufnr].filetype = vim.g.filetype_i + return + end -function M.progress_asm(path, bufnr) end + for _, line in ipairs(getlines(bufnr, 1, 10)) do + if line:find('^%s*;') or line:find('^/%*') then + return M.asm(bufnr) + elseif not line:find('^%s*$') or line:find('^/%*') then + -- Not an empty line: doesn't look like valid assembly code + -- or it looks like a Progress /* comment. + break + end + end + vim.bo[bufnr].filetype = 'progress' +end function M.progress_cweb(bufnr) if vim.g.filetype_w then vim.bo[bufnr].filetype = vim.g.filetype_w else - if getlines(bufnr, 1):find("^&ANALYZE") or getlines(bufnr, 3):find("^&GLOBAL%-DEFINE") then - vim.bo[bufnr].filetype = "progress" + if getlines(bufnr, 1):lower():find('^&analyze') or getlines(bufnr, 3):lower():find('^&global%-define') then + vim.bo[bufnr].filetype = 'progress' else - vim.bo[bufnr].filetype = "cweb" + vim.bo[bufnr].filetype = 'cweb' end end end -function M.progress_pascal(path, bufnr) end +-- This function checks for valid Pascal syntax in the first 10 lines. +-- Look for either an opening comment or a program start. +-- If not found, assume Progress. +function M.progress_pascal(bufnr) + if vim.g.filetype_p then + vim.bo[bufnr].filetype = vim.g.filetype_p + return + end + for _, line in ipairs(getlines(bufnr, 1, 10)) do + if findany(line, pascal_comments) or matchregex(line, pascal_keywords) then + vim.bo[bufnr].filetype = 'pascal' + return + elseif not line:find('^%s*$') or line:find('^/%*') then + -- Not an empty line: Doesn't look like valid Pascal code. + -- Or it looks like a Progress /* comment + break + end + end + vim.bo[bufnr].filetype = 'progress' +end function M.proto(path, bufnr) end function M.r(bufnr) local lines = getlines(bufnr, 1, 50) - -- TODO: \< / \> which match the beginning / end of a word -- Rebol is easy to recognize, check for that first - if table.concat(lines):lower():find("rebol") then - vim.bo[bufnr].filetype = "rebol" + if matchregex(table.concat(lines), [[\c\<rebol\>]]) then + vim.bo[bufnr].filetype = 'rebol' return end for _, line in ipairs(lines) do -- R has # comments - if line:find("^%s*#") then - vim.bo[bufnr].filetype = "r" + if line:find('^%s*#') then + vim.bo[bufnr].filetype = 'r' return end -- Rexx has /* comments */ - if line:find("^%s*/%*") then - vim.bo[bufnr].filetype = "rexx" + if line:find('^%s*/%*') then + vim.bo[bufnr].filetype = 'rexx' return end end @@ -303,42 +707,83 @@ function M.r(bufnr) vim.bo[bufnr].filetype = vim.g.filetype_r else -- Rexx used to be the default, but R appears to be much more popular. - vim.bo[bufnr].filetype = "r" + vim.bo[bufnr].filetype = 'r' end end function M.redif(bufnr) for _, line in ipairs(getlines(bufnr, 1, 5)) do - if line:lower():find("^template%-type:") then - vim.bo[bufnr].filetype = "redif" + if line:lower():find('^template%-type:') then + vim.bo[bufnr].filetype = 'redif' end end end -function M.rules(path, bufnr) end +local udev_rules_pattern = '^%s*udev_rules%s*=%s*"([%^"]+)/*".*' +function M.rules(path, bufnr) + path = path:lower() + if + findany(path, { + '/etc/udev/.*%.rules$', + '/etc/udev/rules%.d/.*$.rules$', + '/usr/lib/udev/.*%.rules$', + '/usr/lib/udev/rules%.d/.*%.rules$', + '/lib/udev/.*%.rules$', + '/lib/udev/rules%.d/.*%.rules$', + }) + then + vim.bo[bufnr].filetype = 'udevrules' + elseif path:find('^/etc/ufw/') then + -- Better than hog + vim.bo[bufnr].filetype = 'conf' + elseif findany(path, { '^/etc/polkit%-1/rules%.d', '/usr/share/polkit%-1/rules%.d' }) then + vim.bo[bufnr].filetype = 'javascript' + else + local ok, config_lines = pcall(vim.fn.readfile, '/etc/udev/udev.conf') + if not ok then + vim.bo[bufnr].filetype = 'hog' + return + end + local dir = vim.fn.expand(path, ':h') + for _, line in ipairs(config_lines) do + local match = line:match(udev_rules_pattern) + local udev_rules = line:gsub(udev_rules_pattern, match, 1) + if dir == udev_rules then + vim.bo[bufnr].filetype = 'udevrules' + return + end + end + vim.bo[bufnr].filetype = 'hog' + end +end -- This function checks the first 25 lines of file extension "sc" to resolve -- detection between scala and SuperCollider function M.sc(bufnr) for _, line in ipairs(getlines(bufnr, 1, 25)) do - if findany(line, { "[A-Za-z0-9]*%s:%s[A-Za-z0-9]", "var%s<", "classvar%s<", "%^this.*", "|%w*|", "%+%s%w*%s{", "%*ar%s" }) then - vim.bo[bufnr].filetype = "supercollider" + if + findany( + line, + { '[A-Za-z0-9]*%s:%s[A-Za-z0-9]', 'var%s<', 'classvar%s<', '%^this.*', '|%w*|', '%+%s%w*%s{', '%*ar%s' } + ) + then + vim.bo[bufnr].filetype = 'supercollider' return end end - vim.bo[bufnr].filetype = "scala" + vim.bo[bufnr].filetype = 'scala' end -- This function checks the first line of file extension "scd" to resolve -- detection between scdoc and SuperCollider function M.scd(bufnr) - local first = "^%S+%(%d[0-9A-Za-z]*%)" + local first = '^%S+%(%d[0-9A-Za-z]*%)' local opt = [[%s+"[^"]*"]] local line = getlines(bufnr, 1) - if findany(line, { first .. "$", first .. opt .. "$", first .. opt .. opt .. "$" }) then - vim.bo[bufnr].filetype = "scdoc" + if findany(line, { first .. '$', first .. opt .. '$', first .. opt .. opt .. '$' }) then + vim.bo[bufnr].filetype = 'scdoc' else - vim.bo[bufnr].filetype = "supercollider" + vim.bo[bufnr].filetype = 'supercollider' end end @@ -350,13 +795,31 @@ function M.sql(bufnr) if vim.g.filetype_sql then vim.bo[bufnr].filetype = vim.g.filetype_sql else - vim.bo[bufnr].filetype = "sql" + vim.bo[bufnr].filetype = 'sql' end end -function M.src(path, bufnr) end +-- Determine if a *.src file is Kuka Robot Language +function M.src(bufnr) + if vim.g.filetype_src then + vim.bo[bufnr].filetype = vim.g.filetype_src + return + end + local line = nextnonblank(bufnr, 1) + if matchregex(line, [[\c\v^\s*%(\&\w+|%(global\s+)?def%(fct)?>)]]) then + vim.bo[bufnr].filetype = 'krl' + end +end -function M.sys(path, bufnr) end +function M.sys(bufnr) + if vim.g.filetype_sys then + vim.bo[bufnr].filetype = vim.g.filetype_sys + elseif is_rapid(bufnr) then + vim.bo[bufnr].filetype = 'rapid' + else + vim.bo[bufnr].filetype = 'bat' + end +end function M.tex(path, bufnr) end @@ -365,46 +828,45 @@ function M.tf(bufnr) for _, line in ipairs(getlines(bufnr, 1, -1)) do -- Assume terraform file on a non-empty line (not whitespace-only) -- and when the first non-whitespace character is not a ; or / - if not line:find("^%s*$") and not line:find("^%s*[;/]") then - vim.bo[bufnr].filetype = "terraform" + if not line:find('^%s*$') and not line:find('^%s*[;/]') then + vim.bo[bufnr].filetype = 'terraform' return end end - vim.bo[bufnr].filetype = "tf" + vim.bo[bufnr].filetype = 'tf' end function M.xml(bufnr) for _, line in ipairs(getlines(bufnr, 1, 100)) do + local is_docbook4 = line:find('<!DOCTYPE.*DocBook') line = line:lower() - local is_docbook4 = line:find("<!doctype.*docbook") local is_docbook5 = line:find([[ xmlns="http://docbook.org/ns/docbook"]]) if is_docbook4 or is_docbook5 then - vim.b[bufnr].docbk_type = "xml" + vim.b[bufnr].docbk_type = 'xml' vim.b[bufnr].docbk_ver = is_docbook4 and 4 or 5 - vim.bo[bufnr].filetype = "docbk" + vim.bo[bufnr].filetype = 'docbk' return end if line:find([[xmlns:xbl="http://www.mozilla.org/xbl"]]) then - vim.bo[bufnr].filetype = "xbl" + vim.bo[bufnr].filetype = 'xbl' return end end - vim.bo[bufnr].filetype = "xml" + vim.bo[bufnr].filetype = 'xml' end function M.y(bufnr) for _, line in ipairs(getlines(bufnr, 1, 100)) do - if line:find("^%s*%%") then - vim.bo[bufnr].filetype = "yacc" + if line:find('^%s*%%') then + vim.bo[bufnr].filetype = 'yacc' return end - -- TODO: in the Vim regex, \> is used to match the end of the word after "class", - -- can this be omitted? - if findany(line, { "^%s*#", "^%class", "^%s*#%s*include" }) then - vim.bo[bufnr].filetype = "racc" + if matchregex(line, [[\c^\s*\(#\|class\>\)]]) and not line:lower():find('^%s*#%s*include') then + vim.bo[bufnr].filetype = 'racc' + return end end - vim.bo[bufnr].filetype = "yacc" + vim.bo[bufnr].filetype = 'yacc' end -- luacheck: pop diff --git a/runtime/lua/vim/highlight.lua b/runtime/lua/vim/highlight.lua index 4105ef0675..22b67aee88 100644 --- a/runtime/lua/vim/highlight.lua +++ b/runtime/lua/vim/highlight.lua @@ -14,14 +14,14 @@ function M.create(higroup, hi_info, default) local options = {} -- TODO: Add validation for k, v in pairs(hi_info) do - table.insert(options, string.format("%s=%s", k, v)) + table.insert(options, string.format('%s=%s', k, v)) end - vim.cmd(string.format([[highlight %s %s %s]], default and "default" or "", higroup, table.concat(options, " "))) + vim.cmd(string.format([[highlight %s %s %s]], default and 'default' or '', higroup, table.concat(options, ' '))) end ---@private function M.link(higroup, link_to, force) - vim.cmd(string.format([[highlight%s link %s %s]], force and "!" or " default", higroup, link_to)) + vim.cmd(string.format([[highlight%s link %s %s]], force and '!' or ' default', higroup, link_to)) end --- Highlight range between two positions @@ -37,7 +37,7 @@ end -- - priority number indicating priority of highlight (default priorities.user) function M.range(bufnr, ns, higroup, start, finish, opts) opts = opts or {} - local regtype = opts.regtype or "v" + local regtype = opts.regtype or 'v' local inclusive = opts.inclusive or false local priority = opts.priority or M.priorities.user @@ -63,7 +63,7 @@ function M.range(bufnr, ns, higroup, start, finish, opts) end end -local yank_ns = api.nvim_create_namespace("hlyank") +local yank_ns = api.nvim_create_namespace('hlyank') --- Highlight the yanked region --- --- use from init.vim via @@ -87,10 +87,10 @@ function M.on_yank(opts) if t == nil then return true else - return type(t) == "table" + return type(t) == 'table' end end, - "a table or nil to configure options (see `:h highlight.on_yank`)", + 'a table or nil to configure options (see `:h highlight.on_yank`)', }, }) opts = opts or {} @@ -98,17 +98,17 @@ function M.on_yank(opts) local on_macro = opts.on_macro or false local on_visual = (opts.on_visual ~= false) - if not on_macro and vim.fn.reg_executing() ~= "" then + if not on_macro and vim.fn.reg_executing() ~= '' then return end - if event.operator ~= "y" or event.regtype == "" then + if event.operator ~= 'y' or event.regtype == '' then return end if not on_visual and event.visual then return end - local higroup = opts.higroup or "IncSearch" + local higroup = opts.higroup or 'IncSearch' local timeout = opts.timeout or 150 local bufnr = api.nvim_get_current_buf() diff --git a/runtime/lua/vim/inspect.lua b/runtime/lua/vim/inspect.lua index b19c215dbb..c19e55fb37 100644 --- a/runtime/lua/vim/inspect.lua +++ b/runtime/lua/vim/inspect.lua @@ -1,7 +1,7 @@ local inspect = { - _VERSION = "inspect.lua 3.1.0", - _URL = "http://github.com/kikito/inspect.lua", - _DESCRIPTION = "human-readable representations of tables", + _VERSION = 'inspect.lua 3.1.0', + _URL = 'http://github.com/kikito/inspect.lua', + _DESCRIPTION = 'human-readable representations of tables', _LICENSE = [[ MIT LICENSE @@ -30,12 +30,12 @@ local inspect = { inspect.KEY = setmetatable({}, { __tostring = function() - return "inspect.KEY" + return 'inspect.KEY' end, }) inspect.METATABLE = setmetatable({}, { __tostring = function() - return "inspect.METATABLE" + return 'inspect.METATABLE' end, }) @@ -61,52 +61,52 @@ end -- \a => '\\a', \0 => '\\0', 31 => '\31' local shortControlCharEscapes = { - ["\a"] = "\\a", - ["\b"] = "\\b", - ["\f"] = "\\f", - ["\n"] = "\\n", - ["\r"] = "\\r", - ["\t"] = "\\t", - ["\v"] = "\\v", - ["\127"] = "\\127", + ['\a'] = '\\a', + ['\b'] = '\\b', + ['\f'] = '\\f', + ['\n'] = '\\n', + ['\r'] = '\\r', + ['\t'] = '\\t', + ['\v'] = '\\v', + ['\127'] = '\\127', } -local longControlCharEscapes = { ["\127"] = "\127" } +local longControlCharEscapes = { ['\127'] = '\127' } for i = 0, 31 do local ch = char(i) if not shortControlCharEscapes[ch] then - shortControlCharEscapes[ch] = "\\" .. i - longControlCharEscapes[ch] = fmt("\\%03d", i) + shortControlCharEscapes[ch] = '\\' .. i + longControlCharEscapes[ch] = fmt('\\%03d', i) end end local function escape(str) - return (gsub(gsub(gsub(str, "\\", "\\\\"), "(%c)%f[0-9]", longControlCharEscapes), "%c", shortControlCharEscapes)) + return (gsub(gsub(gsub(str, '\\', '\\\\'), '(%c)%f[0-9]', longControlCharEscapes), '%c', shortControlCharEscapes)) end local function isIdentifier(str) - return type(str) == "string" and not not str:match("^[_%a][_%a%d]*$") + return type(str) == 'string' and not not str:match('^[_%a][_%a%d]*$') end local flr = math.floor local function isSequenceKey(k, sequenceLength) - return type(k) == "number" and flr(k) == k and 1 <= k and k <= sequenceLength + return type(k) == 'number' and flr(k) == k and 1 <= k and k <= sequenceLength end local defaultTypeOrders = { - ["number"] = 1, - ["boolean"] = 2, - ["string"] = 3, - ["table"] = 4, - ["function"] = 5, - ["userdata"] = 6, - ["thread"] = 7, + ['number'] = 1, + ['boolean'] = 2, + ['string'] = 3, + ['table'] = 4, + ['function'] = 5, + ['userdata'] = 6, + ['thread'] = 7, } local function sortKeys(a, b) local ta, tb = type(a), type(b) -- strings and numbers are sorted numerically/alphabetically - if ta == tb and (ta == "string" or ta == "number") then + if ta == tb and (ta == 'string' or ta == 'number') then return a < b end @@ -137,7 +137,7 @@ local function getKeys(t) end local function countCycles(x, cycles) - if type(x) == "table" then + if type(x) == 'table' then if cycles[x] then cycles[x] = cycles[x] + 1 else @@ -173,7 +173,7 @@ local function processRecursive(process, item, path, visited) end local processed = process(item, path) - if type(processed) == "table" then + if type(processed) == 'table' then local processedCopy = {} visited[item] = processedCopy local processedKey @@ -186,7 +186,7 @@ local function processRecursive(process, item, path, visited) end local mt = processRecursive(process, getmetatable(processed), makePath(path, inspect.METATABLE), visited) - if type(mt) ~= "table" then + if type(mt) ~= 'table' then mt = nil end setmetatable(processedCopy, mt) @@ -222,27 +222,27 @@ end function Inspector:putValue(v) local buf = self.buf local tv = type(v) - if tv == "string" then + if tv == 'string' then puts(buf, smartQuote(escape(v))) elseif - tv == "number" - or tv == "boolean" - or tv == "nil" - or tv == "cdata" - or tv == "ctype" + tv == 'number' + or tv == 'boolean' + or tv == 'nil' + or tv == 'cdata' + or tv == 'ctype' or (vim and v == vim.NIL) then puts(buf, tostring(v)) - elseif tv == "table" and not self.ids[v] then + elseif tv == 'table' and not self.ids[v] then local t = v if t == inspect.KEY or t == inspect.METATABLE then puts(buf, tostring(t)) elseif self.level >= self.depth then - puts(buf, "{...}") + puts(buf, '{...}') else if self.cycles[t] > 1 then - puts(buf, fmt("<%d>", self:getId(t))) + puts(buf, fmt('<%d>', self:getId(t))) end local keys, keysLen, seqLen = getKeys(t) @@ -253,15 +253,15 @@ function Inspector:putValue(v) return end - puts(buf, "{") + puts(buf, '{') self.level = self.level + 1 for i = 1, seqLen + keysLen do if i > 1 then - puts(buf, ",") + puts(buf, ',') end if i <= seqLen then - puts(buf, " ") + puts(buf, ' ') self:putValue(t[i]) else local k = keys[i - seqLen] @@ -269,36 +269,36 @@ function Inspector:putValue(v) if isIdentifier(k) then puts(buf, k) else - puts(buf, "[") + puts(buf, '[') self:putValue(k) - puts(buf, "]") + puts(buf, ']') end - puts(buf, " = ") + puts(buf, ' = ') self:putValue(t[k]) end end - if type(mt) == "table" then + if type(mt) == 'table' then if seqLen + keysLen > 0 then - puts(buf, ",") + puts(buf, ',') end tabify(self) - puts(buf, "<metatable> = ") + puts(buf, '<metatable> = ') self:putValue(mt) end self.level = self.level - 1 - if keysLen > 0 or type(mt) == "table" then + if keysLen > 0 or type(mt) == 'table' then tabify(self) elseif seqLen > 0 then - puts(buf, " ") + puts(buf, ' ') end - puts(buf, "}") + puts(buf, '}') end else - puts(buf, fmt("<%s %d>", tv, self:getId(v))) + puts(buf, fmt('<%s %d>', tv, self:getId(v))) end end @@ -306,8 +306,8 @@ function inspect.inspect(root, options) options = options or {} local depth = options.depth or math.huge - local newline = options.newline or "\n" - local indent = options.indent or " " + local newline = options.newline or '\n' + local indent = options.indent or ' ' local process = options.process if process then diff --git a/runtime/lua/vim/keymap.lua b/runtime/lua/vim/keymap.lua index d07232f52f..f4c2b507a9 100644 --- a/runtime/lua/vim/keymap.lua +++ b/runtime/lua/vim/keymap.lua @@ -49,20 +49,20 @@ local keymap = {} --- Default `false`. ---@see |nvim_set_keymap()| function keymap.set(mode, lhs, rhs, opts) - vim.validate { - mode = {mode, {'s', 't'}}, - lhs = {lhs, 's'}, - rhs = {rhs, {'s', 'f'}}, - opts = {opts, 't', true} - } + vim.validate({ + mode = { mode, { 's', 't' } }, + lhs = { lhs, 's' }, + rhs = { rhs, { 's', 'f' } }, + opts = { opts, 't', true }, + }) opts = vim.deepcopy(opts) or {} - local is_rhs_luaref = type(rhs) == "function" - mode = type(mode) == 'string' and {mode} or mode + local is_rhs_luaref = type(rhs) == 'function' + mode = type(mode) == 'string' and { mode } or mode if is_rhs_luaref and opts.expr then local user_rhs = rhs - rhs = function () + rhs = function() local res = user_rhs() if res == nil then -- TODO(lewis6991): Handle this in C? @@ -118,14 +118,14 @@ end ---@see |vim.keymap.set()| --- function keymap.del(modes, lhs, opts) - vim.validate { - mode = {modes, {'s', 't'}}, - lhs = {lhs, 's'}, - opts = {opts, 't', true} - } + vim.validate({ + mode = { modes, { 's', 't' } }, + lhs = { lhs, 's' }, + opts = { opts, 't', true }, + }) opts = opts or {} - modes = type(modes) == 'string' and {modes} or modes + modes = type(modes) == 'string' and { modes } or modes local buffer = false if opts.buffer ~= nil then diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua index a541b63ee9..07987ee003 100644 --- a/runtime/lua/vim/lsp.lua +++ b/runtime/lua/vim/lsp.lua @@ -1,58 +1,61 @@ -local if_nil = vim.F.if_nil - -local default_handlers = require 'vim.lsp.handlers' -local log = require 'vim.lsp.log' -local lsp_rpc = require 'vim.lsp.rpc' -local protocol = require 'vim.lsp.protocol' -local util = require 'vim.lsp.util' -local sync = require 'vim.lsp.sync' +local default_handlers = require('vim.lsp.handlers') +local log = require('vim.lsp.log') +local lsp_rpc = require('vim.lsp.rpc') +local protocol = require('vim.lsp.protocol') +local util = require('vim.lsp.util') +local sync = require('vim.lsp.sync') local vim = vim -local nvim_err_writeln, nvim_buf_get_lines, nvim_command, nvim_buf_get_option - = vim.api.nvim_err_writeln, vim.api.nvim_buf_get_lines, vim.api.nvim_command, vim.api.nvim_buf_get_option +local nvim_err_writeln, nvim_buf_get_lines, nvim_command, nvim_buf_get_option, nvim_exec_autocmds = + vim.api.nvim_err_writeln, + vim.api.nvim_buf_get_lines, + vim.api.nvim_command, + vim.api.nvim_buf_get_option, + vim.api.nvim_exec_autocmds local uv = vim.loop local tbl_isempty, tbl_extend = vim.tbl_isempty, vim.tbl_extend local validate = vim.validate +local if_nil = vim.F.if_nil local lsp = { - protocol = protocol; + protocol = protocol, - handlers = default_handlers; + handlers = default_handlers, - buf = require'vim.lsp.buf'; - diagnostic = require'vim.lsp.diagnostic'; - codelens = require'vim.lsp.codelens'; - util = util; + buf = require('vim.lsp.buf'), + diagnostic = require('vim.lsp.diagnostic'), + codelens = require('vim.lsp.codelens'), + util = util, -- Allow raw RPC access. - rpc = lsp_rpc; + rpc = lsp_rpc, -- Export these directly from rpc. - rpc_response_error = lsp_rpc.rpc_response_error; + rpc_response_error = lsp_rpc.rpc_response_error, } -- maps request name to the required server_capability in the client. lsp._request_name_to_capability = { - ['textDocument/hover'] = { 'hoverProvider' }; - ['textDocument/signatureHelp'] = { 'signatureHelpProvider' }; - ['textDocument/definition'] = { 'definitionProvider' }; - ['textDocument/implementation'] = { 'implementationProvider' }; - ['textDocument/declaration'] = { 'declarationProvider' }; - ['textDocument/typeDefinition'] = { 'typeDefinitionProvider' }; - ['textDocument/documentSymbol'] = { 'documentSymbolProvider' }; - ['textDocument/prepareCallHierarchy'] = { 'callHierarchyProvider' }; - ['textDocument/rename'] = { 'renameProvider' }; - ['textDocument/prepareRename'] = { 'renameProvider', 'prepareProvider'} ; - ['textDocument/codeAction'] = { 'codeActionProvider' }; - ['textDocument/codeLens'] = { 'codeLensProvider' }; - ['codeLens/resolve'] = { 'codeLensProvider', 'resolveProvider' }; - ['workspace/executeCommand'] = { 'executeCommandProvider' }; - ['workspace/symbol'] = { 'workspaceSymbolProvider' }; - ['textDocument/references'] = { 'referencesProvider' }; - ['textDocument/rangeFormatting'] = { 'documentRangeFormattingProvider' }; - ['textDocument/formatting'] = { 'documentFormattingProvider' }; - ['textDocument/completion'] = { 'completionProvider' }; - ['textDocument/documentHighlight'] = { 'documentHighlightProvider' }; + ['textDocument/hover'] = { 'hoverProvider' }, + ['textDocument/signatureHelp'] = { 'signatureHelpProvider' }, + ['textDocument/definition'] = { 'definitionProvider' }, + ['textDocument/implementation'] = { 'implementationProvider' }, + ['textDocument/declaration'] = { 'declarationProvider' }, + ['textDocument/typeDefinition'] = { 'typeDefinitionProvider' }, + ['textDocument/documentSymbol'] = { 'documentSymbolProvider' }, + ['textDocument/prepareCallHierarchy'] = { 'callHierarchyProvider' }, + ['textDocument/rename'] = { 'renameProvider' }, + ['textDocument/prepareRename'] = { 'renameProvider', 'prepareProvider' }, + ['textDocument/codeAction'] = { 'codeActionProvider' }, + ['textDocument/codeLens'] = { 'codeLensProvider' }, + ['codeLens/resolve'] = { 'codeLensProvider', 'resolveProvider' }, + ['workspace/executeCommand'] = { 'executeCommandProvider' }, + ['workspace/symbol'] = { 'workspaceSymbolProvider' }, + ['textDocument/references'] = { 'referencesProvider' }, + ['textDocument/rangeFormatting'] = { 'documentRangeFormattingProvider' }, + ['textDocument/formatting'] = { 'documentFormattingProvider' }, + ['textDocument/completion'] = { 'completionProvider' }, + ['textDocument/documentHighlight'] = { 'documentHighlightProvider' }, } -- TODO improve handling of scratch buffers with LSP attached. @@ -62,8 +65,8 @@ lsp._request_name_to_capability = { --- ---@param {...} (List of strings) List to write to the buffer local function err_message(...) - nvim_err_writeln(table.concat(vim.tbl_flatten{...})) - nvim_command("redraw") + nvim_err_writeln(table.concat(vim.tbl_flatten({ ... }))) + nvim_command('redraw') end ---@private @@ -73,7 +76,7 @@ end ---buffer if not given. ---@returns bufnr (number) Number of requested buffer local function resolve_bufnr(bufnr) - validate { bufnr = { bufnr, 'n', true } } + validate({ bufnr = { bufnr, 'n', true } }) if bufnr == nil or bufnr == 0 then return vim.api.nvim_get_current_buf() end @@ -85,7 +88,10 @@ end --- supported in any of the servers registered for the current buffer. ---@param method (string) name of the method function lsp._unsupported_method(method) - local msg = string.format("method %s is not supported by any of the servers registered for the current buffer", method) + local msg = string.format( + 'method %s is not supported by any of the servers registered for the current buffer', + method + ) log.warn(msg) return msg end @@ -96,23 +102,29 @@ end ---@param filename (string) path to check ---@returns true if {filename} exists and is a directory, false otherwise local function is_dir(filename) - validate{filename={filename,'s'}} + validate({ filename = { filename, 's' } }) local stat = uv.fs_stat(filename) return stat and stat.type == 'directory' or false end -local wait_result_reason = { [-1] = "timeout"; [-2] = "interrupted"; [-3] = "error" } +local wait_result_reason = { [-1] = 'timeout', [-2] = 'interrupted', [-3] = 'error' } local valid_encodings = { - ["utf-8"] = 'utf-8'; ["utf-16"] = 'utf-16'; ["utf-32"] = 'utf-32'; - ["utf8"] = 'utf-8'; ["utf16"] = 'utf-16'; ["utf32"] = 'utf-32'; - UTF8 = 'utf-8'; UTF16 = 'utf-16'; UTF32 = 'utf-32'; + ['utf-8'] = 'utf-8', + ['utf-16'] = 'utf-16', + ['utf-32'] = 'utf-32', + ['utf8'] = 'utf-8', + ['utf16'] = 'utf-16', + ['utf32'] = 'utf-32', + UTF8 = 'utf-8', + UTF16 = 'utf-16', + UTF32 = 'utf-32', } local format_line_ending = { - ["unix"] = '\n', - ["dos"] = '\r\n', - ["mac"] = '\r', + ['unix'] = '\n', + ['dos'] = '\r\n', + ['mac'] = '\r', } ---@private @@ -138,10 +150,10 @@ local uninitialized_clients = {} ---@private local function for_each_buffer_client(bufnr, fn, restrict_client_ids) - validate { - fn = { fn, 'f' }; - restrict_client_ids = { restrict_client_ids, 't' , true}; - } + validate({ + fn = { fn, 'f' }, + restrict_client_ids = { restrict_client_ids, 't', true }, + }) bufnr = resolve_bufnr(bufnr) local client_ids = all_buffer_active_clients[bufnr] if not client_ids or tbl_isempty(client_ids) then @@ -169,9 +181,13 @@ end -- Error codes to be used with `on_error` from |vim.lsp.start_client|. -- Can be used to look up the string from a the number or the number -- from the string. -lsp.client_errors = tbl_extend("error", lsp_rpc.client_errors, vim.tbl_add_reverse_lookup { - ON_INIT_CALLBACK_ERROR = table.maxn(lsp_rpc.client_errors) + 1; -}) +lsp.client_errors = tbl_extend( + 'error', + lsp_rpc.client_errors, + vim.tbl_add_reverse_lookup({ + ON_INIT_CALLBACK_ERROR = table.maxn(lsp_rpc.client_errors) + 1, + }) +) ---@private --- Normalizes {encoding} to valid LSP encoding names. @@ -179,11 +195,11 @@ lsp.client_errors = tbl_extend("error", lsp_rpc.client_errors, vim.tbl_add_rever ---@param encoding (string) Encoding to normalize ---@returns (string) normalized encoding name local function validate_encoding(encoding) - validate { - encoding = { encoding, 's' }; - } + validate({ + encoding = { encoding, 's' }, + }) return valid_encodings[encoding:lower()] - or error(string.format("Invalid offset encoding %q. Must be one of: 'utf-8', 'utf-16', 'utf-32'", encoding)) + or error(string.format("Invalid offset encoding %q. Must be one of: 'utf-8', 'utf-16', 'utf-32'", encoding)) end ---@internal @@ -194,16 +210,19 @@ end ---@returns (string) the command ---@returns (list of strings) its arguments function lsp._cmd_parts(input) - vim.validate{cmd={ + vim.validate({ cmd = { input, - function() return vim.tbl_islist(input) end, - "list"}} + function() + return vim.tbl_islist(input) + end, + 'list', + } }) local cmd = input[1] local cmd_args = {} -- Don't mutate our input. for i, v in ipairs(input) do - vim.validate{["cmd argument"]={v, "s"}} + vim.validate({ ['cmd argument'] = { v, 's' } }) if i > 1 then table.insert(cmd_args, v) end @@ -233,31 +252,29 @@ end --- ---@see |vim.lsp.start_client()| local function validate_client_config(config) - validate { - config = { config, 't' }; - } - validate { - handlers = { config.handlers, "t", true }; - capabilities = { config.capabilities, "t", true }; - cmd_cwd = { config.cmd_cwd, optional_validator(is_dir), "directory" }; - cmd_env = { config.cmd_env, "t", true }; - detached = { config.detached, "b", true }; - name = { config.name, 's', true }; - on_error = { config.on_error, "f", true }; - on_exit = { config.on_exit, "f", true }; - on_init = { config.on_init, "f", true }; - settings = { config.settings, "t", true }; - commands = { config.commands, 't', true }; - before_init = { config.before_init, "f", true }; - offset_encoding = { config.offset_encoding, "s", true }; - flags = { config.flags, "t", true }; - get_language_id = { config.get_language_id, "f", true }; - } + validate({ + config = { config, 't' }, + }) + validate({ + handlers = { config.handlers, 't', true }, + capabilities = { config.capabilities, 't', true }, + cmd_cwd = { config.cmd_cwd, optional_validator(is_dir), 'directory' }, + cmd_env = { config.cmd_env, 't', true }, + detached = { config.detached, 'b', true }, + name = { config.name, 's', true }, + on_error = { config.on_error, 'f', true }, + on_exit = { config.on_exit, 'f', true }, + on_init = { config.on_init, 'f', true }, + settings = { config.settings, 't', true }, + commands = { config.commands, 't', true }, + before_init = { config.before_init, 'f', true }, + offset_encoding = { config.offset_encoding, 's', true }, + flags = { config.flags, 't', true }, + get_language_id = { config.get_language_id, 'f', true }, + }) assert( - (not config.flags - or not config.flags.debounce_text_changes - or type(config.flags.debounce_text_changes) == 'number'), - "flags.debounce_text_changes must be a number with the debounce time in milliseconds" + (not config.flags or not config.flags.debounce_text_changes or type(config.flags.debounce_text_changes) == 'number'), + 'flags.debounce_text_changes must be a number with the debounce time in milliseconds' ) local cmd, cmd_args = lsp._cmd_parts(config.cmd) @@ -267,9 +284,9 @@ local function validate_client_config(config) end return { - cmd = cmd; - cmd_args = cmd_args; - offset_encoding = offset_encoding; + cmd = cmd, + cmd_args = cmd_args, + offset_encoding = offset_encoding, } end @@ -329,14 +346,15 @@ do function changetracking.init(client, bufnr) local use_incremental_sync = ( if_nil(client.config.flags.allow_incremental_sync, true) - and vim.tbl_get(client.server_capabilities, "textDocumentSync", "change") == protocol.TextDocumentSyncKind.Incremental + and vim.tbl_get(client.server_capabilities, 'textDocumentSync', 'change') + == protocol.TextDocumentSyncKind.Incremental ) local state = state_by_client[client.id] if not state then state = { - buffers = {}; + buffers = {}, debounce = client.config.flags.debounce_text_changes or 150, - use_incremental_sync = use_incremental_sync; + use_incremental_sync = use_incremental_sync, } state_by_client[client.id] = state end @@ -405,7 +423,6 @@ do ---@private function changetracking.prepare(bufnr, firstline, lastline, new_lastline) local incremental_changes = function(client, buf_state) - local prev_lines = buf_state.lines local curr_lines = buf_state.lines_tmp @@ -426,7 +443,14 @@ do local line_ending = buf_get_line_ending(bufnr) local incremental_change = sync.compute_diff( - buf_state.lines, curr_lines, firstline, lastline, new_lastline, client.offset_encoding or 'utf-16', line_ending) + buf_state.lines, + curr_lines, + firstline, + lastline, + new_lastline, + client.offset_encoding or 'utf-16', + line_ending + ) -- Double-buffering of lines tables is used to reduce the load on the garbage collector. -- At this point the prev_lines table is useless, but its internal storage has already been allocated, @@ -443,12 +467,14 @@ do end local full_changes = once(function() return { - text = buf_get_full_text(bufnr); - }; + text = buf_get_full_text(bufnr), + } end) local uri = vim.uri_from_bufnr(bufnr) return function(client) - if vim.tbl_get(client.server_capabilities, "textDocumentSync", "change") == protocol.TextDocumentSyncKind.None then + if + vim.tbl_get(client.server_capabilities, 'textDocumentSync', 'change') == protocol.TextDocumentSyncKind.None + then return end local state = state_by_client[client.id] @@ -467,7 +493,7 @@ do return end local changes = state.use_incremental_sync and buf_state.pending_changes or { full_changes() } - client.notify("textDocument/didChange", { + client.notify('textDocument/didChange', { textDocument = { uri = uri, version = util.buf_versions[bufnr], @@ -519,7 +545,6 @@ do end end - ---@private --- Default handler for the 'textDocument/didOpen' LSP notification. --- @@ -527,7 +552,7 @@ end ---@param client Client object local function text_document_did_open_handler(bufnr, client) changetracking.init(client, bufnr) - if not vim.tbl_get(client.server_capabilities, "textDocumentSync", "openClose") then + if not vim.tbl_get(client.server_capabilities, 'textDocumentSync', 'openClose') then return end if not vim.api.nvim_buf_is_loaded(bufnr) then @@ -537,11 +562,11 @@ local function text_document_did_open_handler(bufnr, client) local params = { textDocument = { - version = 0; - uri = vim.uri_from_bufnr(bufnr); - languageId = client.config.get_language_id(bufnr, filetype); - text = buf_get_full_text(bufnr); - } + version = 0, + uri = vim.uri_from_bufnr(bufnr), + languageId = client.config.get_language_id(bufnr, filetype), + text = buf_get_full_text(bufnr), + }, } client.notify('textDocument/didOpen', params) util.buf_versions[bufnr] = params.textDocument.version @@ -763,13 +788,15 @@ function lsp.start_client(config) -- By default, get_language_id just returns the exact filetype it is passed. -- It is possible to pass in something that will calculate a different filetype, -- to be sent by the client. - config.get_language_id = config.get_language_id or function(_, filetype) return filetype end + config.get_language_id = config.get_language_id or function(_, filetype) + return filetype + end local client_id = next_client_id() local handlers = config.handlers or {} local name = config.name or tostring(client_id) - local log_prefix = string.format("LSP[%s]", name) + local log_prefix = string.format('LSP[%s]', name) local dispatch = {} @@ -794,7 +821,7 @@ function lsp.start_client(config) local handler = resolve_handler(method) if handler then -- Method name is provided here for convenience. - handler(nil, params, {method=method, client_id=client_id}) + handler(nil, params, { method = method, client_id = client_id }) end end @@ -807,10 +834,10 @@ function lsp.start_client(config) local _ = log.trace() and log.trace('server_request', method, params) local handler = resolve_handler(method) if handler then - local _ = log.trace() and log.trace("server_request: found handler for", method) - return handler(nil, params, {method=method, client_id=client_id}) + local _ = log.trace() and log.trace('server_request: found handler for', method) + return handler(nil, params, { method = method, client_id = client_id }) end - local _ = log.warn() and log.warn("server_request: no handler found for", method) + local _ = log.warn() and log.warn('server_request: no handler found for', method) return nil, lsp.rpc_response_error(protocol.ErrorCodes.MethodNotFound) end @@ -822,12 +849,12 @@ function lsp.start_client(config) ---@see |vim.lsp.rpc.client_errors| for possible errors. Use ---`vim.lsp.rpc.client_errors[code]` to get a human-friendly name. function dispatch.on_error(code, err) - local _ = log.error() and log.error(log_prefix, "on_error", { code = lsp.client_errors[code], err = err }) + local _ = log.error() and log.error(log_prefix, 'on_error', { code = lsp.client_errors[code], err = err }) err_message(log_prefix, ': Error ', lsp.client_errors[code], ': ', vim.inspect(err)) if config.on_error then local status, usererr = pcall(config.on_error, code, err) if not status then - local _ = log.error() and log.error(log_prefix, "user on_error failed", { err = usererr }) + local _ = log.error() and log.error(log_prefix, 'user on_error failed', { err = usererr }) err_message(log_prefix, ' user on_error failed: ', tostring(usererr)) end end @@ -843,17 +870,29 @@ function lsp.start_client(config) pcall(config.on_exit, code, signal, client_id) end + for bufnr, client_ids in pairs(all_buffer_active_clients) do + if client_ids[client_id] then + vim.schedule(function() + nvim_exec_autocmds('LspDetach', { + buffer = bufnr, + modeline = false, + data = { client_id = client_id }, + }) + + local namespace = vim.lsp.diagnostic.get_namespace(client_id) + vim.diagnostic.reset(namespace, bufnr) + end) + + client_ids[client_id] = nil + end + end + active_clients[client_id] = nil uninitialized_clients[client_id] = nil - lsp.diagnostic.reset(client_id, all_buffer_active_clients) changetracking.reset(client_id) - for _, client_ids in pairs(all_buffer_active_clients) do - client_ids[client_id] = nil - end - if code ~= 0 or (signal ~= 0 and signal ~= 15) then - local msg = string.format("Client %s quit with exit code %s and signal %s", client_id, code, signal) + local msg = string.format('Client %s quit with exit code %s and signal %s', client_id, code, signal) vim.schedule(function() vim.notify(msg, vim.log.levels.WARN) end) @@ -862,38 +901,41 @@ function lsp.start_client(config) -- Start the RPC client. local rpc = lsp_rpc.start(cmd, cmd_args, dispatch, { - cwd = config.cmd_cwd; - env = config.cmd_env; - detached = config.detached; + cwd = config.cmd_cwd, + env = config.cmd_env, + detached = config.detached, }) -- Return nil if client fails to start - if not rpc then return end + if not rpc then + return + end local client = { - id = client_id; - name = name; - rpc = rpc; - offset_encoding = offset_encoding; - config = config; - attached_buffers = {}; + id = client_id, + name = name, + rpc = rpc, + offset_encoding = offset_encoding, + config = config, + attached_buffers = {}, - handlers = handlers; - commands = config.commands or {}; + handlers = handlers, + commands = config.commands or {}, - requests = {}; + requests = {}, -- for $/progress report - messages = { name = name, messages = {}, progress = {}, status = {} }; + messages = { name = name, messages = {}, progress = {}, status = {} }, } - -- Store the uninitialized_clients for cleanup in case we exit before initialize finishes. - uninitialized_clients[client_id] = client; + uninitialized_clients[client_id] = client ---@private local function initialize() local valid_traces = { - off = 'off'; messages = 'messages'; verbose = 'verbose'; + off = 'off', + messages = 'messages', + verbose = 'verbose', } local version = vim.version() @@ -902,10 +944,12 @@ function lsp.start_client(config) local root_path if config.workspace_folders or config.root_dir then if config.root_dir and not config.workspace_folders then - workspace_folders = {{ - uri = vim.uri_from_fname(config.root_dir); - name = string.format("%s", config.root_dir); - }}; + workspace_folders = { + { + uri = vim.uri_from_fname(config.root_dir), + name = string.format('%s', config.root_dir), + }, + } else workspace_folders = config.workspace_folders end @@ -922,41 +966,41 @@ function lsp.start_client(config) -- the process has not been started by another process. If the parent -- process is not alive then the server should exit (see exit notification) -- its process. - processId = uv.getpid(); + processId = uv.getpid(), -- Information about the client -- since 3.15.0 clientInfo = { - name = "Neovim", - version = string.format("%s.%s.%s", version.major, version.minor, version.patch) - }; + name = 'Neovim', + version = string.format('%s.%s.%s', version.major, version.minor, version.patch), + }, -- The rootPath of the workspace. Is null if no folder is open. -- -- @deprecated in favour of rootUri. - rootPath = root_path or vim.NIL; + rootPath = root_path or vim.NIL, -- The rootUri of the workspace. Is null if no folder is open. If both -- `rootPath` and `rootUri` are set `rootUri` wins. - rootUri = root_uri or vim.NIL; + rootUri = root_uri or vim.NIL, -- The workspace folders configured in the client when the server starts. -- This property is only available if the client supports workspace folders. -- It can be `null` if the client supports workspace folders but none are -- configured. - workspaceFolders = workspace_folders or vim.NIL; + workspaceFolders = workspace_folders or vim.NIL, -- User provided initialization options. - initializationOptions = config.init_options; + initializationOptions = config.init_options, -- The capabilities provided by the client (editor or tool) - capabilities = config.capabilities or protocol.make_client_capabilities(); + capabilities = config.capabilities or protocol.make_client_capabilities(), -- The initial trace setting. If omitted trace is disabled ("off"). -- trace = "off" | "messages" | "verbose"; - trace = valid_traces[config.trace] or 'off'; + trace = valid_traces[config.trace] or 'off', } if config.before_init then -- TODO(ashkan) handle errors here. pcall(config.before_init, initialize_params, config) end - local _ = log.trace() and log.trace(log_prefix, "initialize_params", initialize_params) + local _ = log.trace() and log.trace(log_prefix, 'initialize_params', initialize_params) rpc.request('initialize', initialize_params, function(init_err, result) assert(not init_err, tostring(init_err)) - assert(result, "server sent empty result") + assert(result, 'server sent empty result') rpc.notify('initialized', vim.empty_dict()) client.initialized = true uninitialized_clients[client_id] = nil @@ -973,10 +1017,13 @@ function lsp.start_client(config) local mt = {} mt.__index = function(table, key) if key == 'resolved_capabilities' then - vim.notify_once("[LSP] Accessing client.resolved_capabilities is deprecated, " .. - "update your plugins or configuration to access client.server_capabilities instead." .. - "The new key/value pairs in server_capabilities directly match those " .. - "defined in the language server protocol", vim.log.levels.WARN) + vim.notify_once( + '[LSP] Accessing client.resolved_capabilities is deprecated, ' + .. 'update your plugins or configuration to access client.server_capabilities instead.' + .. 'The new key/value pairs in server_capabilities directly match those ' + .. 'defined in the language server protocol', + vim.log.levels.WARN + ) rawset(table, key, protocol._resolve_capabilities_compat(client.server_capabilities)) return rawget(table, key) else @@ -1004,7 +1051,8 @@ function lsp.start_client(config) pcall(handlers.on_error, lsp.client_errors.ON_INIT_CALLBACK_ERROR, err) end end - local _ = log.info() and log.info(log_prefix, "server_capabilities", { server_capabilities = client.server_capabilities }) + local _ = log.info() + and log.info(log_prefix, 'server_capabilities', { server_capabilities = client.server_capabilities }) -- Only assign after initialized. active_clients[client_id] = client @@ -1039,22 +1087,22 @@ function lsp.start_client(config) function client.request(method, params, handler, bufnr) if not handler then handler = resolve_handler(method) - or error(string.format("not found: %q request handler for client %q.", method, client.name)) + or error(string.format('not found: %q request handler for client %q.', method, client.name)) end -- Ensure pending didChange notifications are sent so that the server doesn't operate on a stale state changetracking.flush(client, bufnr) bufnr = resolve_bufnr(bufnr) - local _ = log.debug() and log.debug(log_prefix, "client.request", client_id, method, params, handler, bufnr) + local _ = log.debug() and log.debug(log_prefix, 'client.request', client_id, method, params, handler, bufnr) local success, request_id = rpc.request(method, params, function(err, result) - handler(err, result, {method=method, client_id=client_id, bufnr=bufnr, params=params}) + handler(err, result, { method = method, client_id = client_id, bufnr = bufnr, params = params }) end, function(request_id) client.requests[request_id] = nil - nvim_command("doautocmd <nomodeline> User LspRequest") + nvim_command('doautocmd <nomodeline> User LspRequest') end) if success then - client.requests[request_id] = { type='pending', bufnr=bufnr, method=method } - nvim_command("doautocmd <nomodeline> User LspRequest") + client.requests[request_id] = { type = 'pending', bufnr = bufnr, method = method } + nvim_command('doautocmd <nomodeline> User LspRequest') end return success, request_id @@ -1081,9 +1129,10 @@ function lsp.start_client(config) request_result = { err = err, result = result } end - local success, request_id = client.request(method, params, _sync_handler, - bufnr) - if not success then return nil end + local success, request_id = client.request(method, params, _sync_handler, bufnr) + if not success then + return nil + end local wait_result, reason = vim.wait(timeout_ms or 1000, function() return request_result ~= nil @@ -1118,13 +1167,13 @@ function lsp.start_client(config) ---@returns true if any client returns true; false otherwise ---@see |vim.lsp.client.notify()| function client.cancel_request(id) - validate{id = {id, 'n'}} + validate({ id = { id, 'n' } }) local request = client.requests[id] if request and request.type == 'pending' then request.type = 'cancel' - nvim_command("doautocmd <nomodeline> User LspRequest") + nvim_command('doautocmd <nomodeline> User LspRequest') end - return rpc.notify("$/cancelRequest", { id = id }) + return rpc.notify('$/cancelRequest', { id = id }) end -- Track this so that we can escalate automatically if we've already tried a @@ -1139,7 +1188,6 @@ function lsp.start_client(config) --- ---@param force (bool, optional) function client.stop(force) - lsp.diagnostic.reset(client_id, all_buffer_active_clients) changetracking.reset(client_id) for _, client_ids in pairs(all_buffer_active_clients) do @@ -1150,7 +1198,7 @@ function lsp.start_client(config) if handle:is_closing() then return end - if force or (not client.initialized) or graceful_shutdown_failed then + if force or not client.initialized or graceful_shutdown_failed then handle:kill(15) return end @@ -1180,6 +1228,13 @@ function lsp.start_client(config) ---@param bufnr (number) Buffer number function client._on_attach(bufnr) text_document_did_open_handler(bufnr, client) + + nvim_exec_autocmds('LspAttach', { + buffer = bufnr, + modeline = false, + data = { client_id = client.id }, + }) + if config.on_attach then -- TODO(ashkan) handle errors. pcall(config.on_attach, client, bufnr) @@ -1198,7 +1253,6 @@ end local text_document_did_change_handler do text_document_did_change_handler = function(_, bufnr, changedtick, firstline, lastline, new_lastline) - -- Detach (nvim_buf_attach) via returning True to on_lines if no clients are attached if tbl_isempty(all_buffer_active_clients[bufnr] or {}) then return true @@ -1215,17 +1269,17 @@ function lsp._text_document_did_save_handler(bufnr) local uri = vim.uri_from_bufnr(bufnr) local text = once(buf_get_full_text) for_each_buffer_client(bufnr, function(client) - local save_capability = vim.tbl_get(client.server_capabilities, "textDocumentSync", "save") + local save_capability = vim.tbl_get(client.server_capabilities, 'textDocumentSync', 'save') if save_capability then local included_text - if type(save_capability) == "table" and save_capability.includeText then + if type(save_capability) == 'table' and save_capability.includeText then included_text = text(bufnr) end client.notify('textDocument/didSave', { textDocument = { - uri = uri; - }; - text = included_text; + uri = uri, + }, + text = included_text, }) end end) @@ -1239,15 +1293,13 @@ end ---@param bufnr (number) Buffer handle, or 0 for current ---@param client_id (number) Client id function lsp.buf_attach_client(bufnr, client_id) - validate { - bufnr = {bufnr, 'n', true}; - client_id = {client_id, 'n'}; - } + validate({ + bufnr = { bufnr, 'n', true }, + client_id = { client_id, 'n' }, + }) bufnr = resolve_bufnr(bufnr) if not vim.api.nvim_buf_is_loaded(bufnr) then - local _ = log.warn() and log.warn( - string.format("buf_attach_client called on unloaded buffer (id: %d): ", bufnr) - ) + local _ = log.warn() and log.warn(string.format('buf_attach_client called on unloaded buffer (id: %d): ', bufnr)) return false end local buffer_client_ids = all_buffer_active_clients[bufnr] @@ -1266,36 +1318,38 @@ function lsp.buf_attach_client(bufnr, client_id) vim.api.nvim_exec(string.format(buf_did_save_autocommand, client_id, bufnr, bufnr), false) -- First time, so attach and set up stuff. vim.api.nvim_buf_attach(bufnr, false, { - on_lines = text_document_did_change_handler; + on_lines = text_document_did_change_handler, on_reload = function() - local params = { textDocument = { uri = uri; } } + local params = { textDocument = { uri = uri } } for_each_buffer_client(bufnr, function(client, _) changetracking.reset_buf(client, bufnr) - if vim.tbl_get(client.server_capabilities, "textDocumentSync", "openClose") then + if vim.tbl_get(client.server_capabilities, 'textDocumentSync', 'openClose') then client.notify('textDocument/didClose', params) end text_document_did_open_handler(bufnr, client) end) - end; + end, on_detach = function() - local params = { textDocument = { uri = uri; } } + local params = { textDocument = { uri = uri } } for_each_buffer_client(bufnr, function(client, _) changetracking.reset_buf(client, bufnr) - if vim.tbl_get(client.server_capabilities, "textDocumentSync", "openClose") then + if vim.tbl_get(client.server_capabilities, 'textDocumentSync', 'openClose') then client.notify('textDocument/didClose', params) end end) util.buf_versions[bufnr] = nil all_buffer_active_clients[bufnr] = nil - end; + end, -- TODO if we know all of the potential clients ahead of time, then we -- could conditionally set this. -- utf_sizes = size_index > 1; - utf_sizes = true; + utf_sizes = true, }) end - if buffer_client_ids[client_id] then return end + if buffer_client_ids[client_id] then + return + end -- This is our first time attaching this client to this buffer. buffer_client_ids[client_id] = true @@ -1315,25 +1369,29 @@ end ---@param bufnr number Buffer handle, or 0 for current ---@param client_id number Client id function lsp.buf_detach_client(bufnr, client_id) - validate { - bufnr = {bufnr, 'n', true}; - client_id = {client_id, 'n'}; - } + validate({ + bufnr = { bufnr, 'n', true }, + client_id = { client_id, 'n' }, + }) bufnr = resolve_bufnr(bufnr) local client = lsp.get_client_by_id(client_id) if not client or not client.attached_buffers[bufnr] then - vim.notify( - string.format('Buffer (id: %d) is not attached to client (id: %d). Cannot detach.', client_id, bufnr) - ) + vim.notify(string.format('Buffer (id: %d) is not attached to client (id: %d). Cannot detach.', client_id, bufnr)) return end + nvim_exec_autocmds('LspDetach', { + buffer = bufnr, + modeline = false, + data = { client_id = client_id }, + }) + changetracking.reset_buf(client, bufnr) - if vim.tbl_get(client.server_capabilities, "textDocumentSync", "openClose") then + if vim.tbl_get(client.server_capabilities, 'textDocumentSync', 'openClose') then local uri = vim.uri_from_bufnr(bufnr) - local params = { textDocument = { uri = uri; } } + local params = { textDocument = { uri = uri } } client.notify('textDocument/didClose', params) end @@ -1349,7 +1407,6 @@ function lsp.buf_detach_client(bufnr, client_id) vim.diagnostic.reset(namespace, bufnr) vim.notify(string.format('Detached buffer (id: %d) from client (id: %d)', bufnr, client_id)) - end --- Checks if a buffer is attached for a particular client. @@ -1394,7 +1451,7 @@ end ---@param client_id client id or |vim.lsp.client| object, or list thereof ---@param force boolean (optional) shutdown forcefully function lsp.stop_client(client_id, force) - local ids = type(client_id) == 'table' and client_id or {client_id} + local ids = type(client_id) == 'table' and client_id or { client_id } for _, id in ipairs(ids) do if type(id) == 'table' and id.stop ~= nil then id.stop(force) @@ -1406,15 +1463,33 @@ function lsp.stop_client(client_id, force) end end ---- Gets all active clients. +--- Get active clients. --- ----@returns Table of |vim.lsp.client| objects -function lsp.get_active_clients() - return vim.tbl_values(active_clients) +---@param filter (table|nil) A table with key-value pairs used to filter the +--- returned clients. The available keys are: +--- - id (number): Only return clients with the given id +--- - bufnr (number): Only return clients attached to this buffer +--- - name (string): Only return clients with the given name +---@returns (table) List of |vim.lsp.client| objects +function lsp.get_active_clients(filter) + validate({ filter = { filter, 't', true } }) + + filter = filter or {} + + local clients = {} + + local t = filter.bufnr and (all_buffer_active_clients[resolve_bufnr(filter.bufnr)] or {}) or active_clients + for client_id in pairs(t) do + local client = active_clients[client_id] + if (filter.id == nil or client.id == filter.id) and (filter.name == nil or client.name == filter.name) then + clients[#clients + 1] = client + end + end + return clients end function lsp._vim_exit_handler() - log.info("exit_handler", active_clients) + log.info('exit_handler', active_clients) for _, client in pairs(uninitialized_clients) do client.stop(true) end @@ -1466,8 +1541,7 @@ function lsp._vim_exit_handler() end end -nvim_command("autocmd VimLeavePre * lua vim.lsp._vim_exit_handler()") - +nvim_command('autocmd VimLeavePre * lua vim.lsp._vim_exit_handler()') --- Sends an async request for all active clients attached to the --- buffer. @@ -1483,11 +1557,11 @@ nvim_command("autocmd VimLeavePre * lua vim.lsp._vim_exit_handler()") --- - Function which can be used to cancel all the requests. You could instead --- iterate all clients and call their `cancel_request()` methods. function lsp.buf_request(bufnr, method, params, handler) - validate { - bufnr = { bufnr, 'n', true }; - method = { method, 's' }; - handler = { handler, 'f', true }; - } + validate({ + bufnr = { bufnr, 'n', true }, + method = { method, 's' }, + handler = { handler, 'f', true }, + }) local supported_clients = {} local method_supported = false @@ -1501,18 +1575,18 @@ function lsp.buf_request(bufnr, method, params, handler) -- if has client but no clients support the given method, notify the user if not tbl_isempty(all_buffer_active_clients[resolve_bufnr(bufnr)] or {}) and not method_supported then vim.notify(lsp._unsupported_method(method), vim.log.levels.ERROR) - vim.api.nvim_command("redraw") + vim.api.nvim_command('redraw') return {}, function() end end local client_request_ids = {} for_each_buffer_client(bufnr, function(client, client_id, resolved_bufnr) - local request_success, request_id = client.request(method, params, handler, resolved_bufnr) - -- This could only fail if the client shut down in the time since we looked - -- it up and we did the request, which should be rare. - if request_success then - client_request_ids[client_id] = request_id - end + local request_success, request_id = client.request(method, params, handler, resolved_bufnr) + -- This could only fail if the client shut down in the time since we looked + -- it up and we did the request, which should be rare. + if request_success then + client_request_ids[client_id] = request_id + end end, supported_clients) local function _cancel_all_requests() @@ -1543,7 +1617,7 @@ function lsp.buf_request_all(bufnr, method, params, callback) local result_count = 0 local expected_result_count = 0 - local set_expected_result_count = once(function () + local set_expected_result_count = once(function() for_each_buffer_client(bufnr, function(client) if client.supports_method(method) then expected_result_count = expected_result_count + 1 @@ -1607,18 +1681,19 @@ end --- ---@returns true if any client returns true; false otherwise function lsp.buf_notify(bufnr, method, params) - validate { - bufnr = { bufnr, 'n', true }; - method = { method, 's' }; - } + validate({ + bufnr = { bufnr, 'n', true }, + method = { method, 's' }, + }) local resp = false for_each_buffer_client(bufnr, function(client, _client_id, _resolved_bufnr) - if client.rpc.notify(method, params) then resp = true end + if client.rpc.notify(method, params) then + resp = true + end end) return resp end - ---@private local function adjust_start_col(lnum, line, items, encoding) local min_start_char = nil @@ -1650,7 +1725,7 @@ end --- - findstart=0: column where the completion starts, or -2 or -3 --- - findstart=1: list of matches (actually just calls |complete()|) function lsp.omnifunc(findstart, base) - local _ = log.debug() and log.debug("omnifunc.findstart", { findstart = findstart, base = base }) + local _ = log.debug() and log.debug('omnifunc.findstart', { findstart = findstart, base = base }) local bufnr = resolve_bufnr() local has_buffer_clients = not tbl_isempty(all_buffer_active_clients[bufnr] or {}) @@ -1663,12 +1738,12 @@ function lsp.omnifunc(findstart, base) end -- Then, perform standard completion request - local _ = log.info() and log.info("base ", base) + local _ = log.info() and log.info('base ', base) local pos = vim.api.nvim_win_get_cursor(0) local line = vim.api.nvim_get_current_line() local line_to_cursor = line:sub(1, pos[2]) - local _ = log.trace() and log.trace("omnifunc.line", pos, line) + local _ = log.trace() and log.trace('omnifunc.line', pos, line) -- Get the start position of the current keyword local textMatch = vim.fn.match(line_to_cursor, '\\k*$') @@ -1677,7 +1752,9 @@ function lsp.omnifunc(findstart, base) local items = {} lsp.buf_request(bufnr, 'textDocument/completion', params, function(err, result, ctx) - if err or not result or vim.fn.mode() ~= "i" then return end + if err or not result or vim.fn.mode() ~= 'i' then + return + end -- Completion response items may be relative to a position different than `textMatch`. -- Concrete example, with sumneko/lua-language-server: @@ -1723,7 +1800,7 @@ function lsp.formatexpr(opts) opts = opts or {} local timeout_ms = opts.timeout_ms or 500 - if vim.tbl_contains({'i', 'R', 'ic', 'ix'}, vim.fn.mode()) then + if vim.tbl_contains({ 'i', 'R', 'ic', 'ix' }, vim.fn.mode()) then -- `formatexpr` is also called when exceeding `textwidth` in insert mode -- fall back to internal formatting return 1 @@ -1734,14 +1811,14 @@ function lsp.formatexpr(opts) if start_line > 0 and end_line > 0 then local params = { - textDocument = util.make_text_document_params(); + textDocument = util.make_text_document_params(), range = { - start = { line = start_line - 1; character = 0; }; - ["end"] = { line = end_line - 1; character = 0; }; - }; - }; + start = { line = start_line - 1, character = 0 }, + ['end'] = { line = end_line - 1, character = 0 }, + }, + } params.options = util.make_formatting_params().options - local client_results = vim.lsp.buf_request_sync(0, "textDocument/rangeFormatting", params, timeout_ms) + local client_results = vim.lsp.buf_request_sync(0, 'textDocument/rangeFormatting', params, timeout_ms) -- Apply the text edits from one and only one of the clients. for client_id, response in pairs(client_results) do @@ -1783,13 +1860,14 @@ end --- is a |vim.lsp.client| object. --- ---@param bufnr (optional, number): Buffer handle, or 0 for current +---@returns (table) Table of (client_id, client) pairs +---@deprecated Use |vim.lsp.get_active_clients()| instead. function lsp.buf_get_clients(bufnr) - bufnr = resolve_bufnr(bufnr) - local result = {} - for_each_buffer_client(bufnr, function(client, client_id) - result[client_id] = client - end) - return result + local result = {} + for _, client in ipairs(lsp.get_active_clients({ bufnr = resolve_bufnr(bufnr) })) do + result[client.id] = client + end + return result end -- Log level dictionary with reverse lookup as well. @@ -1815,7 +1893,7 @@ function lsp.set_log_level(level) if type(level) == 'string' or type(level) == 'number' then log.set_level(level) else - error(string.format("Invalid log level: %q", level)) + error(string.format('Invalid log level: %q', level)) end end @@ -1845,7 +1923,7 @@ end ---@param override_config (table) Table containing the keys to override behavior of the {handler} function lsp.with(handler, override_config) return function(err, result, ctx, config) - return handler(err, result, ctx, vim.tbl_deep_extend("force", config or {}, override_config)) + return handler(err, result, ctx, vim.tbl_deep_extend('force', config or {}, override_config)) end end @@ -1860,12 +1938,16 @@ function lsp._with_extend(name, options, user_config) local resulting_config = {} for k, v in pairs(user_config) do if options[k] == nil then - error(debug.traceback(string.format( - "Invalid option for `%s`: %s. Valid options are:\n%s", - name, - k, - vim.inspect(vim.tbl_keys(options)) - ))) + error( + debug.traceback( + string.format( + 'Invalid option for `%s`: %s. Valid options are:\n%s', + name, + k, + vim.inspect(vim.tbl_keys(options)) + ) + ) + ) end resulting_config[k] = v @@ -1880,7 +1962,6 @@ function lsp._with_extend(name, options, user_config) return resulting_config end - --- Registry for client side commands. --- This is an extension point for plugins to handle custom commands which are --- not part of the core language server protocol specification. @@ -1902,12 +1983,11 @@ end --- The second argument is the `ctx` of |lsp-handler| lsp.commands = setmetatable({}, { __newindex = function(tbl, key, value) - assert(type(key) == 'string', "The key for commands in `vim.lsp.commands` must be a string") - assert(type(value) == 'function', "Command added to `vim.lsp.commands` must be a function") + assert(type(key) == 'string', 'The key for commands in `vim.lsp.commands` must be a string') + assert(type(value) == 'function', 'Command added to `vim.lsp.commands` must be a function') rawset(tbl, key, value) - end; + end, }) - return lsp -- vim:sw=2 ts=2 et diff --git a/runtime/lua/vim/lsp/_snippet.lua b/runtime/lua/vim/lsp/_snippet.lua index 0140b0aee3..28064f36e9 100644 --- a/runtime/lua/vim/lsp/_snippet.lua +++ b/runtime/lua/vim/lsp/_snippet.lua @@ -41,7 +41,7 @@ P.take_until = function(targets, specials) parsed = true, value = { raw = table.concat(raw, ''), - esc = table.concat(esc, '') + esc = table.concat(esc, ''), }, pos = new_pos, } @@ -248,49 +248,67 @@ S.format = P.any( capture_index = values[3], }, Node) end), - P.map(P.seq(S.dollar, S.open, S.int, S.colon, S.slash, P.any( - P.token('upcase'), - P.token('downcase'), - P.token('capitalize'), - P.token('camelcase'), - P.token('pascalcase') - ), S.close), function(values) - return setmetatable({ - type = Node.Type.FORMAT, - capture_index = values[3], - modifier = values[6], - }, Node) - end), - P.map(P.seq(S.dollar, S.open, S.int, S.colon, P.any( - P.seq(S.question, P.take_until({ ':' }, { '\\' }), S.colon, P.take_until({ '}' }, { '\\' })), - P.seq(S.plus, P.take_until({ '}' }, { '\\' })), - P.seq(S.minus, P.take_until({ '}' }, { '\\' })) - ), S.close), function(values) + P.map( + P.seq( + S.dollar, + S.open, + S.int, + S.colon, + S.slash, + P.any(P.token('upcase'), P.token('downcase'), P.token('capitalize'), P.token('camelcase'), P.token('pascalcase')), + S.close + ), + function(values) + return setmetatable({ + type = Node.Type.FORMAT, + capture_index = values[3], + modifier = values[6], + }, Node) + end + ), + P.map( + P.seq( + S.dollar, + S.open, + S.int, + S.colon, + P.any( + P.seq(S.question, P.take_until({ ':' }, { '\\' }), S.colon, P.take_until({ '}' }, { '\\' })), + P.seq(S.plus, P.take_until({ '}' }, { '\\' })), + P.seq(S.minus, P.take_until({ '}' }, { '\\' })) + ), + S.close + ), + function(values) + return setmetatable({ + type = Node.Type.FORMAT, + capture_index = values[3], + if_text = values[5][2].esc, + else_text = (values[5][4] or {}).esc, + }, Node) + end + ) +) + +S.transform = P.map( + P.seq( + S.slash, + P.take_until({ '/' }, { '\\' }), + S.slash, + P.many(P.any(S.format, S.text({ '$', '/' }, { '\\' }))), + S.slash, + P.opt(P.pattern('[ig]+')) + ), + function(values) return setmetatable({ - type = Node.Type.FORMAT, - capture_index = values[3], - if_text = values[5][2].esc, - else_text = (values[5][4] or {}).esc, + type = Node.Type.TRANSFORM, + pattern = values[2].raw, + format = values[4], + option = values[6], }, Node) - end) + end ) -S.transform = P.map(P.seq( - S.slash, - P.take_until({ '/' }, { '\\' }), - S.slash, - P.many(P.any(S.format, S.text({ '$', '/' }, { '\\' }))), - S.slash, - P.opt(P.pattern('[ig]+')) -), function(values) - return setmetatable({ - type = Node.Type.TRANSFORM, - pattern = values[2].raw, - format = values[4], - option = values[6], - }, Node) -end) - S.tabstop = P.any( P.map(P.seq(S.dollar, S.int), function(values) return setmetatable({ @@ -314,34 +332,38 @@ S.tabstop = P.any( ) S.placeholder = P.any( - P.map(P.seq(S.dollar, S.open, S.int, S.colon, P.many(P.any(S.toplevel, S.text({ '$', '}' }, { '\\' }))), S.close), function(values) - return setmetatable({ - type = Node.Type.PLACEHOLDER, - tabstop = values[3], - children = values[5], - }, Node) - end) + P.map( + P.seq(S.dollar, S.open, S.int, S.colon, P.many(P.any(S.toplevel, S.text({ '$', '}' }, { '\\' }))), S.close), + function(values) + return setmetatable({ + type = Node.Type.PLACEHOLDER, + tabstop = values[3], + children = values[5], + }, Node) + end + ) ) -S.choice = P.map(P.seq( - S.dollar, - S.open, - S.int, - S.pipe, - P.many( - P.map(P.seq(S.text({ ',', '|' }), P.opt(S.comma)), function(values) +S.choice = P.map( + P.seq( + S.dollar, + S.open, + S.int, + S.pipe, + P.many(P.map(P.seq(S.text({ ',', '|' }), P.opt(S.comma)), function(values) return values[1].esc - end) + end)), + S.pipe, + S.close ), - S.pipe, - S.close -), function(values) - return setmetatable({ - type = Node.Type.CHOICE, - tabstop = values[3], - items = values[5], - }, Node) -end) + function(values) + return setmetatable({ + type = Node.Type.CHOICE, + tabstop = values[3], + items = values[5], + }, Node) + end +) S.variable = P.any( P.map(P.seq(S.dollar, S.var), function(values) @@ -363,13 +385,16 @@ S.variable = P.any( transform = values[4], }, Node) end), - P.map(P.seq(S.dollar, S.open, S.var, S.colon, P.many(P.any(S.toplevel, S.text({ '$', '}' }, { '\\' }))), S.close), function(values) - return setmetatable({ - type = Node.Type.VARIABLE, - name = values[3], - children = values[5], - }, Node) - end) + P.map( + P.seq(S.dollar, S.open, S.var, S.colon, P.many(P.any(S.toplevel, S.text({ '$', '}' }, { '\\' }))), S.close), + function(values) + return setmetatable({ + type = Node.Type.VARIABLE, + name = values[3], + children = values[5], + }, Node) + end + ) ) S.snippet = P.map(P.many(P.any(S.toplevel, S.text({ '$' }, { '}', '\\' }))), function(values) diff --git a/runtime/lua/vim/lsp/buf.lua b/runtime/lua/vim/lsp/buf.lua index 6666b3c044..80350bcb71 100644 --- a/runtime/lua/vim/lsp/buf.lua +++ b/runtime/lua/vim/lsp/buf.lua @@ -1,7 +1,7 @@ local vim = vim local validate = vim.validate local vfn = vim.fn -local util = require 'vim.lsp.util' +local util = require('vim.lsp.util') local M = {} @@ -9,7 +9,9 @@ local M = {} --- Returns nil if {status} is false or nil, otherwise returns the rest of the --- arguments. local function ok_or_nil(status, ...) - if not status then return end + if not status then + return + end return ... end @@ -39,10 +41,10 @@ end --- ---@see |vim.lsp.buf_request()| local function request(method, params, handler) - validate { - method = {method, 's'}; - handler = {handler, 'f', true}; - } + validate({ + method = { method, 's' }, + handler = { handler, 'f', true }, + }) return vim.lsp.buf_request(0, method, params, handler) end @@ -51,7 +53,7 @@ end --- ---@returns `true` if server responds. function M.server_ready() - return not not vim.lsp.buf_notify(0, "window/progress", {}) + return not not vim.lsp.buf_notify(0, 'window/progress', {}) end --- Displays hover information about the symbol under the cursor in a floating @@ -61,26 +63,45 @@ function M.hover() request('textDocument/hover', params) end +---@private +local function request_with_options(name, params, options) + local req_handler + if options then + req_handler = function(err, result, ctx, config) + local client = vim.lsp.get_client_by_id(ctx.client_id) + local handler = client.handlers[name] or vim.lsp.handlers[name] + handler(err, result, ctx, vim.tbl_extend('force', config or {}, options)) + end + end + request(name, params, req_handler) +end + --- Jumps to the declaration of the symbol under the cursor. ---@note Many servers do not implement this method. Generally, see |vim.lsp.buf.definition()| instead. --- -function M.declaration() +---@param options table|nil additional options +--- - reuse_win: (boolean) Jump to existing window if buffer is already open. +function M.declaration(options) local params = util.make_position_params() - request('textDocument/declaration', params) + request_with_options('textDocument/declaration', params, options) end --- Jumps to the definition of the symbol under the cursor. --- -function M.definition() +---@param options table|nil additional options +--- - reuse_win: (boolean) Jump to existing window if buffer is already open. +function M.definition(options) local params = util.make_position_params() - request('textDocument/definition', params) + request_with_options('textDocument/definition', params, options) end --- Jumps to the definition of the type of the symbol under the cursor. --- -function M.type_definition() +---@param options table|nil additional options +--- - reuse_win: (boolean) Jump to existing window if buffer is already open. +function M.type_definition(options) local params = util.make_position_params() - request('textDocument/typeDefinition', params) + request_with_options('textDocument/typeDefinition', params, options) end --- Lists all the implementations for the symbol under the cursor in the @@ -117,9 +138,9 @@ end -- ---@returns The client that the user selected or nil local function select_client(method, on_choice) - validate { + validate({ on_choice = { on_choice, 'function', false }, - } + }) local clients = vim.tbl_values(vim.lsp.buf_get_clients()) clients = vim.tbl_filter(function(client) return client.supports_method(method) @@ -191,24 +212,21 @@ function M.format(options) if options.filter then clients = options.filter(clients) elseif options.id then - clients = vim.tbl_filter( - function(client) return client.id == options.id end, - clients - ) + clients = vim.tbl_filter(function(client) + return client.id == options.id + end, clients) elseif options.name then - clients = vim.tbl_filter( - function(client) return client.name == options.name end, - clients - ) + clients = vim.tbl_filter(function(client) + return client.name == options.name + end, clients) end - clients = vim.tbl_filter( - function(client) return client.supports_method("textDocument/formatting") end, - clients - ) + clients = vim.tbl_filter(function(client) + return client.supports_method('textDocument/formatting') + end, clients) if #clients == 0 then - vim.notify("[LSP] Format request failed, no matching language servers.") + vim.notify('[LSP] Format request failed, no matching language servers.') end if options.async then @@ -218,7 +236,7 @@ function M.format(options) return end local params = util.make_formatting_params(options.formatting_options) - client.request("textDocument/formatting", params, function(...) + client.request('textDocument/formatting', params, function(...) local handler = client.handlers['textDocument/formatting'] or vim.lsp.handlers['textDocument/formatting'] handler(...) do_format(next(clients, idx)) @@ -229,11 +247,11 @@ function M.format(options) local timeout_ms = options.timeout_ms or 1000 for _, client in pairs(clients) do local params = util.make_formatting_params(options.formatting_options) - local result, err = client.request_sync("textDocument/formatting", params, timeout_ms, bufnr) + local result, err = client.request_sync('textDocument/formatting', params, timeout_ms, bufnr) if result and result.result then util.apply_text_edits(result.result, bufnr, client.offset_encoding) elseif err then - vim.notify(string.format("[LSP][%s] %s", client.name, err), vim.log.levels.WARN) + vim.notify(string.format('[LSP][%s] %s', client.name, err), vim.log.levels.WARN) end end end @@ -310,7 +328,7 @@ end ---the remaining clients in the order as they occur in the `order` list. function M.formatting_seq_sync(options, timeout_ms, order) vim.notify_once('vim.lsp.buf.formatting_seq_sync is deprecated. Use vim.lsp.buf.format instead', vim.log.levels.WARN) - local clients = vim.tbl_values(vim.lsp.buf_get_clients()); + local clients = vim.tbl_values(vim.lsp.buf_get_clients()) local bufnr = vim.api.nvim_get_current_buf() -- sort the clients according to `order` @@ -326,13 +344,18 @@ function M.formatting_seq_sync(options, timeout_ms, order) -- loop through the clients and make synchronous formatting requests for _, client in pairs(clients) do - if vim.tbl_get(client.server_capabilities, "documentFormattingProvider") then + if vim.tbl_get(client.server_capabilities, 'documentFormattingProvider') then local params = util.make_formatting_params(options) - local result, err = client.request_sync("textDocument/formatting", params, timeout_ms, vim.api.nvim_get_current_buf()) + local result, err = client.request_sync( + 'textDocument/formatting', + params, + timeout_ms, + vim.api.nvim_get_current_buf() + ) if result and result.result then util.apply_text_edits(result.result, bufnr, client.offset_encoding) elseif err then - vim.notify(string.format("vim.lsp.buf.formatting_seq_sync: (%s) %s", client.name, err), vim.log.levels.WARN) + vim.notify(string.format('vim.lsp.buf.formatting_seq_sync: (%s) %s', client.name, err), vim.log.levels.WARN) end end end @@ -377,20 +400,18 @@ function M.rename(new_name, options) if options.filter then clients = options.filter(clients) elseif options.name then - clients = vim.tbl_filter( - function(client) return client.name == options.name end, - clients - ) + clients = vim.tbl_filter(function(client) + return client.name == options.name + end, clients) end -- Clients must at least support rename, prepareRename is optional - clients = vim.tbl_filter( - function(client) return client.supports_method("textDocument/rename") end, - clients - ) + clients = vim.tbl_filter(function(client) + return client.supports_method('textDocument/rename') + end, clients) if #clients == 0 then - vim.notify("[LSP] Rename, no matching language servers with rename capability.") + vim.notify('[LSP] Rename, no matching language servers with rename capability.') end local win = vim.api.nvim_get_current_win() @@ -427,7 +448,7 @@ function M.rename(new_name, options) end, bufnr) end - if client.supports_method("textDocument/prepareRename") then + if client.supports_method('textDocument/prepareRename') then local params = util.make_position_params(win, client.offset_encoding) client.request('textDocument/prepareRename', params, function(err, result) if err or result == nil then @@ -446,7 +467,7 @@ function M.rename(new_name, options) end local prompt_opts = { - prompt = "New Name: " + prompt = 'New Name: ', } -- result: Range | { range: Range, placeholder: string } if result.placeholder then @@ -466,15 +487,15 @@ function M.rename(new_name, options) end) end, bufnr) else - assert(client.supports_method("textDocument/rename"), 'Client must support textDocument/rename') + assert(client.supports_method('textDocument/rename'), 'Client must support textDocument/rename') if new_name then rename(new_name) return end local prompt_opts = { - prompt = "New Name: ", - default = cword + prompt = 'New Name: ', + default = cword, } vim.ui.input(prompt_opts, function(input) if not input or #input == 0 then @@ -493,10 +514,10 @@ end ---@param context (table) Context for the request ---@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_references function M.references(context) - validate { context = { context, 't', true } } + validate({ context = { context, 't', true } }) local params = util.make_position_params() params.context = context or { - includeDeclaration = true; + includeDeclaration = true, } request('textDocument/references', params) end @@ -510,14 +531,16 @@ end ---@private local function pick_call_hierarchy_item(call_hierarchy_items) - if not call_hierarchy_items then return end + if not call_hierarchy_items then + return + end if #call_hierarchy_items == 1 then return call_hierarchy_items[1] end local items = {} for i, item in pairs(call_hierarchy_items) do local entry = item.detail or item.name - table.insert(items, string.format("%d. %s", i, entry)) + table.insert(items, string.format('%d. %s', i, entry)) end local choice = vim.fn.inputlist(items) if choice < 1 or choice > #items then @@ -539,8 +562,8 @@ local function call_hierarchy(method) if client then client.request(method, { item = call_hierarchy_item }, nil, ctx.bufnr) else - vim.notify(string.format( - 'Client with id=%d disappeared during call hierarchy request', ctx.client_id), + vim.notify( + string.format('Client with id=%d disappeared during call hierarchy request', ctx.client_id), vim.log.levels.WARN ) end @@ -576,20 +599,25 @@ end --- Add the folder at path to the workspace folders. If {path} is --- not provided, the user will be prompted for a path using |input()|. function M.add_workspace_folder(workspace_folder) - workspace_folder = workspace_folder or npcall(vfn.input, "Workspace Folder: ", vfn.expand('%:p:h'), 'dir') - vim.api.nvim_command("redraw") - if not (workspace_folder and #workspace_folder > 0) then return end + workspace_folder = workspace_folder or npcall(vfn.input, 'Workspace Folder: ', vfn.expand('%:p:h'), 'dir') + vim.api.nvim_command('redraw') + if not (workspace_folder and #workspace_folder > 0) then + return + end if vim.fn.isdirectory(workspace_folder) == 0 then - print(workspace_folder, " is not a valid directory") + print(workspace_folder, ' is not a valid directory') return end - local params = util.make_workspace_params({{uri = vim.uri_from_fname(workspace_folder); name = workspace_folder}}, {{}}) + local params = util.make_workspace_params( + { { uri = vim.uri_from_fname(workspace_folder), name = workspace_folder } }, + { {} } + ) for _, client in pairs(vim.lsp.buf_get_clients()) do local found = false for _, folder in pairs(client.workspace_folders or {}) do if folder.name == workspace_folder then found = true - print(workspace_folder, "is already part of this workspace") + print(workspace_folder, 'is already part of this workspace') break end end @@ -607,10 +635,15 @@ end --- {path} is not provided, the user will be prompted for --- a path using |input()|. function M.remove_workspace_folder(workspace_folder) - workspace_folder = workspace_folder or npcall(vfn.input, "Workspace Folder: ", vfn.expand('%:p:h')) - vim.api.nvim_command("redraw") - if not (workspace_folder and #workspace_folder > 0) then return end - local params = util.make_workspace_params({{}}, {{uri = vim.uri_from_fname(workspace_folder); name = workspace_folder}}) + workspace_folder = workspace_folder or npcall(vfn.input, 'Workspace Folder: ', vfn.expand('%:p:h')) + vim.api.nvim_command('redraw') + if not (workspace_folder and #workspace_folder > 0) then + return + end + local params = util.make_workspace_params( + { {} }, + { { uri = vim.uri_from_fname(workspace_folder), name = workspace_folder } } + ) for _, client in pairs(vim.lsp.buf_get_clients()) do for idx, folder in pairs(client.workspace_folders) do if folder.name == workspace_folder then @@ -620,7 +653,7 @@ function M.remove_workspace_folder(workspace_folder) end end end - print(workspace_folder, "is not currently part of the workspace") + print(workspace_folder, 'is not currently part of the workspace') end --- Lists all symbols in the current workspace in the quickfix window. @@ -631,11 +664,11 @@ end --- ---@param query (string, optional) function M.workspace_symbol(query) - query = query or npcall(vfn.input, "Query: ") + query = query or npcall(vfn.input, 'Query: ') if query == nil then return end - local params = {query = query} + local params = { query = query } request('workspace/symbol', params) end @@ -665,7 +698,6 @@ function M.clear_references() util.buf_clear_references() end - ---@private -- --- This is not public because the main extension point is @@ -678,10 +710,38 @@ end --- `codeAction/resolve` local function on_code_action_results(results, ctx, options) local action_tuples = {} - local filter = options and options.filter + + ---@private + local function action_filter(a) + -- filter by specified action kind + if options and options.context and options.context.only then + if not a.kind then + return false + end + local found = false + for _, o in ipairs(options.context.only) do + -- action kinds are hierachical with . as a separator: when requesting only + -- 'quickfix' this filter allows both 'quickfix' and 'quickfix.foo', for example + if a.kind:find('^' .. o .. '$') or a.kind:find('^' .. o .. '%.') then + found = true + break + end + end + if not found then + return false + end + end + -- filter by user function + if options and options.filter and not options.filter(a) then + return false + end + -- no filter removed this action + return true + end + for client_id, result in pairs(results) do for _, action in pairs(result.result or {}) do - if not filter or filter(action) then + if action_filter(action) then table.insert(action_tuples, { client_id, action }) end end @@ -728,10 +788,11 @@ local function on_code_action_results(results, ctx, options) -- local client = vim.lsp.get_client_by_id(action_tuple[1]) local action = action_tuple[2] - if not action.edit - and client - and vim.tbl_get(client.server_capabilities, "codeActionProvider", "resolveProvider") then - + if + not action.edit + and client + and vim.tbl_get(client.server_capabilities, 'codeActionProvider', 'resolveProvider') + then client.request('codeAction/resolve', action, function(err, resolved_action) if err then vim.notify(err.code .. ': ' .. err.message, vim.log.levels.ERROR) @@ -761,7 +822,6 @@ local function on_code_action_results(results, ctx, options) }, on_user_choice) end - --- Requests code actions from all clients and calls the handler exactly once --- with all aggregated results ---@private @@ -769,7 +829,7 @@ local function code_action_request(params, options) local bufnr = vim.api.nvim_get_current_buf() local method = 'textDocument/codeAction' vim.lsp.buf_request_all(bufnr, method, params, function(results) - local ctx = { bufnr = bufnr, method = method, params = params} + local ctx = { bufnr = bufnr, method = method, params = params } on_code_action_results(results, ctx, options) end) end @@ -783,8 +843,8 @@ end --- - diagnostics (table|nil): --- LSP `Diagnostic[]`. Inferred from the current --- position if not provided. ---- - only (string|nil): ---- LSP `CodeActionKind` used to filter the code actions. +--- - only (table|nil): +--- List of LSP `CodeActionKind`s used to filter the code actions. --- Most language servers support values like `refactor` --- or `quickfix`. --- - filter (function|nil): @@ -794,7 +854,7 @@ end --- (after filtering), the action is applied without user query. ---@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_codeAction function M.code_action(options) - validate { options = { options, 't', true } } + validate({ options = { options, 't', true } }) options = options or {} -- Detect old API call code_action(context) which should now be -- code_action({ context = context} ) @@ -817,8 +877,8 @@ end --- - diagnostics: (table|nil) --- LSP `Diagnostic[]`. Inferred from the current --- position if not provided. ---- - only: (string|nil) ---- LSP `CodeActionKind` used to filter the code actions. +--- - only: (table|nil) +--- List of LSP `CodeActionKind`s used to filter the code actions. --- Most language servers support values like `refactor` --- or `quickfix`. ---@param start_pos ({number, number}, optional) mark-indexed position. @@ -826,7 +886,7 @@ end ---@param end_pos ({number, number}, optional) mark-indexed position. ---Defaults to the end of the last visual selection. function M.range_code_action(context, start_pos, end_pos) - validate { context = { context, 't', true } } + validate({ context = { context, 't', true } }) context = context or {} if not context.diagnostics then context.diagnostics = vim.lsp.diagnostic.get_line_diagnostics() @@ -841,16 +901,16 @@ end ---@param command_params table A valid `ExecuteCommandParams` object ---@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_executeCommand function M.execute_command(command_params) - validate { + validate({ command = { command_params.command, 's' }, - arguments = { command_params.arguments, 't', true } - } + arguments = { command_params.arguments, 't', true }, + }) command_params = { - command=command_params.command, - arguments=command_params.arguments, - workDoneToken=command_params.workDoneToken, + command = command_params.command, + arguments = command_params.arguments, + workDoneToken = command_params.workDoneToken, } - request('workspace/executeCommand', command_params ) + request('workspace/executeCommand', command_params) end return M diff --git a/runtime/lua/vim/lsp/codelens.lua b/runtime/lua/vim/lsp/codelens.lua index 99695d2ed1..ec0aede2d3 100644 --- a/runtime/lua/vim/lsp/codelens.lua +++ b/runtime/lua/vim/lsp/codelens.lua @@ -12,7 +12,7 @@ local lens_cache_by_buf = setmetatable({}, { __index = function(t, b) local key = b > 0 and b or api.nvim_get_current_buf() return rawget(t, key) - end + end, }) local namespaces = setmetatable({}, { @@ -20,13 +20,12 @@ local namespaces = setmetatable({}, { local value = api.nvim_create_namespace('vim_lsp_codelens:' .. key) rawset(t, key, value) return value - end; + end, }) ---@private M.__namespaces = namespaces - ---@private local function execute_lens(lens, bufnr, client_id) local line = lens.range.start.line @@ -44,10 +43,14 @@ local function execute_lens(lens, bufnr, client_id) local command_provider = client.server_capabilities.executeCommandProvider local commands = type(command_provider) == 'table' and command_provider.commands or {} if not vim.tbl_contains(commands, command.command) then - vim.notify(string.format( - "Language server does not support command `%s`. This command may require a client extension.", command.command), - vim.log.levels.WARN) - return + vim.notify( + string.format( + 'Language server does not support command `%s`. This command may require a client extension.', + command.command + ), + vim.log.levels.WARN + ) + return end client.request('workspace/executeCommand', command, function(...) local result = vim.lsp.handlers['workspace/executeCommand'](...) @@ -56,14 +59,15 @@ local function execute_lens(lens, bufnr, client_id) end, bufnr) end - --- Return all lenses for the given buffer --- ---@param bufnr number Buffer number. 0 can be used for the current buffer. ---@return table (`CodeLens[]`) function M.get(bufnr) local lenses_by_client = lens_cache_by_buf[bufnr or 0] - if not lenses_by_client then return {} end + if not lenses_by_client then + return {} + end local lenses = {} for _, client_lenses in pairs(lenses_by_client) do vim.list_extend(lenses, client_lenses) @@ -71,7 +75,6 @@ function M.get(bufnr) return lenses end - --- Run the code lens in the current line --- function M.run() @@ -82,7 +85,7 @@ function M.run() for client, lenses in pairs(lenses_by_client) do for _, lens in pairs(lenses) do if lens.range.start.line == (line - 1) then - table.insert(options, {client=client, lens=lens}) + table.insert(options, { client = client, lens = lens }) end end end @@ -105,7 +108,6 @@ function M.run() end end - --- Display the lenses using virtual text --- ---@param lenses table of lenses to display (`CodeLens[] | null`) @@ -133,19 +135,20 @@ function M.display(lenses, bufnr, client_id) local num_line_lenses = #line_lenses for j, lens in ipairs(line_lenses) do local text = lens.command and lens.command.title or 'Unresolved lens ...' - table.insert(chunks, {text, 'LspCodeLens' }) + table.insert(chunks, { text, 'LspCodeLens' }) if j < num_line_lenses then - table.insert(chunks, {' | ', 'LspCodeLensSeparator' }) + table.insert(chunks, { ' | ', 'LspCodeLensSeparator' }) end end if #chunks > 0 then - api.nvim_buf_set_extmark(bufnr, ns, i, 0, { virt_text = chunks, - hl_mode="combine" }) + api.nvim_buf_set_extmark(bufnr, ns, i, 0, { + virt_text = chunks, + hl_mode = 'combine', + }) end end end - --- Store lenses for a specific buffer and client --- ---@param lenses table of lenses to store (`CodeLens[] | null`) @@ -158,16 +161,17 @@ function M.save(lenses, bufnr, client_id) lens_cache_by_buf[bufnr] = lenses_by_client local ns = namespaces[client_id] api.nvim_buf_attach(bufnr, false, { - on_detach = function(b) lens_cache_by_buf[b] = nil end, + on_detach = function(b) + lens_cache_by_buf[b] = nil + end, on_lines = function(_, b, _, first_lnum, last_lnum) api.nvim_buf_clear_namespace(b, ns, first_lnum, last_lnum) - end + end, }) end lenses_by_client[client_id] = lenses end - ---@private local function resolve_lenses(lenses, bufnr, client_id, callback) lenses = lenses or {} @@ -201,8 +205,7 @@ local function resolve_lenses(lenses, bufnr, client_id, callback) ns, lens.range.start.line, 0, - { virt_text = {{ lens.command.title, 'LspCodeLens' }}, - hl_mode="combine" } + { virt_text = { { lens.command.title, 'LspCodeLens' } }, hl_mode = 'combine' } ) end countdown() @@ -211,13 +214,12 @@ local function resolve_lenses(lenses, bufnr, client_id, callback) end end - --- |lsp-handler| for the method `textDocument/codeLens` --- function M.on_codelens(err, result, ctx, _) if err then active_refreshes[ctx.bufnr] = nil - local _ = log.error() and log.error("codelens", err) + local _ = log.error() and log.error('codelens', err) return end @@ -232,7 +234,6 @@ function M.on_codelens(err, result, ctx, _) end) end - --- Refresh the codelens for the current buffer --- --- It is recommended to trigger this using an autocmd or via keymap. @@ -243,7 +244,7 @@ end --- function M.refresh() local params = { - textDocument = util.make_text_document_params() + textDocument = util.make_text_document_params(), } local bufnr = api.nvim_get_current_buf() if active_refreshes[bufnr] then @@ -253,5 +254,4 @@ function M.refresh() vim.lsp.buf_request(0, 'textDocument/codeLens', params, M.on_codelens) end - return M diff --git a/runtime/lua/vim/lsp/diagnostic.lua b/runtime/lua/vim/lsp/diagnostic.lua index 28a236cc7e..126be2a0ad 100644 --- a/runtime/lua/vim/lsp/diagnostic.lua +++ b/runtime/lua/vim/lsp/diagnostic.lua @@ -50,12 +50,12 @@ end ---@private local function line_byte_from_position(lines, lnum, col, offset_encoding) - if not lines or offset_encoding == "utf-8" then + if not lines or offset_encoding == 'utf-8' then return col end local line = lines[lnum + 1] - local ok, result = pcall(vim.str_byteindex, line, col, offset_encoding == "utf-16") + local ok, result = pcall(vim.str_byteindex, line, col, offset_encoding == 'utf-16') if ok then return result end @@ -75,7 +75,7 @@ local function get_buf_lines(bufnr) return end - local content = f:read("*a") + local content = f:read('*a') if not content then -- Some LSP servers report diagnostics at a directory level, in which case -- io.read() returns nil @@ -83,7 +83,7 @@ local function get_buf_lines(bufnr) return end - local lines = vim.split(content, "\n") + local lines = vim.split(content, '\n') f:close() return lines end @@ -92,10 +92,10 @@ end local function diagnostic_lsp_to_vim(diagnostics, bufnr, client_id) local buf_lines = get_buf_lines(bufnr) local client = vim.lsp.get_client_by_id(client_id) - local offset_encoding = client and client.offset_encoding or "utf-16" + local offset_encoding = client and client.offset_encoding or 'utf-16' return vim.tbl_map(function(diagnostic) local start = diagnostic.range.start - local _end = diagnostic.range["end"] + local _end = diagnostic.range['end'] return { lnum = start.line, col = line_byte_from_position(buf_lines, start.line, start.character, offset_encoding), @@ -122,14 +122,14 @@ end ---@private local function diagnostic_vim_to_lsp(diagnostics) return vim.tbl_map(function(diagnostic) - return vim.tbl_extend("keep", { + return vim.tbl_extend('keep', { -- "keep" the below fields over any duplicate fields in diagnostic.user_data.lsp range = { start = { line = diagnostic.lnum, character = diagnostic.col, }, - ["end"] = { + ['end'] = { line = diagnostic.end_lnum, character = diagnostic.end_col, }, @@ -148,10 +148,10 @@ local _client_namespaces = {} --- ---@param client_id number The id of the LSP client function M.get_namespace(client_id) - vim.validate { client_id = { client_id, 'n' } } + vim.validate({ client_id = { client_id, 'n' } }) if not _client_namespaces[client_id] then local client = vim.lsp.get_client_by_id(client_id) - local name = string.format("vim.lsp.%s.%d", client and client.name or "unknown", client_id) + local name = string.format('vim.lsp.%s.%d', client and client.name or 'unknown', client_id) _client_namespaces[client_id] = vim.api.nvim_create_namespace(name) end return _client_namespaces[client_id] @@ -203,7 +203,7 @@ function M.on_publish_diagnostics(_, result, ctx, config) for _, opt in pairs(config) do if type(opt) == 'table' then if not opt.severity and opt.severity_limit then - opt.severity = {min=severity_lsp_to_vim(opt.severity_limit)} + opt.severity = { min = severity_lsp_to_vim(opt.severity_limit) } end end end @@ -240,7 +240,6 @@ end -- Deprecated Functions {{{ - --- Save diagnostics to the current buffer. --- ---@deprecated Prefer |vim.diagnostic.set()| @@ -251,7 +250,7 @@ end ---@param client_id number ---@private function M.save(diagnostics, bufnr, client_id) - vim.deprecate('vim.lsp.diagnostic.save', 'vim.diagnostic.set', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.save', 'vim.diagnostic.set', '0.8') local namespace = M.get_namespace(client_id) vim.diagnostic.set(namespace, bufnr, diagnostic_lsp_to_vim(diagnostics, bufnr, client_id)) end @@ -265,14 +264,14 @@ end --- If nil, diagnostics of all clients are included. ---@return table with diagnostics grouped by bufnr (bufnr: Diagnostic[]) function M.get_all(client_id) - vim.deprecate('vim.lsp.diagnostic.get_all', 'vim.diagnostic.get', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.get_all', 'vim.diagnostic.get', '0.8') local result = {} local namespace if client_id then namespace = M.get_namespace(client_id) end for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do - local diagnostics = diagnostic_vim_to_lsp(vim.diagnostic.get(bufnr, {namespace = namespace})) + local diagnostics = diagnostic_vim_to_lsp(vim.diagnostic.get(bufnr, { namespace = namespace })) result[bufnr] = diagnostics end return result @@ -287,8 +286,10 @@ end --- Else, return just the diagnostics associated with the client_id. ---@param predicate function|nil Optional function for filtering diagnostics function M.get(bufnr, client_id, predicate) - vim.deprecate('vim.lsp.diagnostic.get', 'vim.diagnostic.get', '0.8' ) - predicate = predicate or function() return true end + vim.deprecate('vim.lsp.diagnostic.get', 'vim.diagnostic.get', '0.8') + predicate = predicate or function() + return true + end if client_id == nil then local all_diagnostics = {} vim.lsp.for_each_buffer_client(bufnr, function(_, iter_client_id, _) @@ -301,7 +302,7 @@ function M.get(bufnr, client_id, predicate) end local namespace = M.get_namespace(client_id) - return diagnostic_vim_to_lsp(vim.tbl_filter(predicate, vim.diagnostic.get(bufnr, {namespace=namespace}))) + return diagnostic_vim_to_lsp(vim.tbl_filter(predicate, vim.diagnostic.get(bufnr, { namespace = namespace }))) end --- Get the diagnostics by line @@ -325,7 +326,7 @@ function M.get_line_diagnostics(bufnr, line_nr, opts, client_id) if opts.severity then opts.severity = severity_lsp_to_vim(opts.severity) elseif opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end if client_id then @@ -349,7 +350,7 @@ end ---@param severity DiagnosticSeverity ---@param client_id number the client id function M.get_count(bufnr, severity, client_id) - vim.deprecate('vim.lsp.diagnostic.get_count', 'vim.diagnostic.get', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.get_count', 'vim.diagnostic.get', '0.8') severity = severity_lsp_to_vim(severity) local opts = { severity = severity } if client_id ~= nil then @@ -366,15 +367,15 @@ end ---@param opts table See |vim.lsp.diagnostic.goto_next()| ---@return table Previous diagnostic function M.get_prev(opts) - vim.deprecate('vim.lsp.diagnostic.get_prev', 'vim.diagnostic.get_prev', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.get_prev', 'vim.diagnostic.get_prev', '0.8') if opts then if opts.severity then opts.severity = severity_lsp_to_vim(opts.severity) elseif opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end end - return diagnostic_vim_to_lsp({vim.diagnostic.get_prev(opts)})[1] + return diagnostic_vim_to_lsp({ vim.diagnostic.get_prev(opts) })[1] end --- Return the pos, {row, col}, for the prev diagnostic in the current buffer. @@ -384,12 +385,12 @@ end ---@param opts table See |vim.lsp.diagnostic.goto_next()| ---@return table Previous diagnostic position function M.get_prev_pos(opts) - vim.deprecate('vim.lsp.diagnostic.get_prev_pos', 'vim.diagnostic.get_prev_pos', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.get_prev_pos', 'vim.diagnostic.get_prev_pos', '0.8') if opts then if opts.severity then opts.severity = severity_lsp_to_vim(opts.severity) elseif opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end end return vim.diagnostic.get_prev_pos(opts) @@ -401,12 +402,12 @@ end --- ---@param opts table See |vim.lsp.diagnostic.goto_next()| function M.goto_prev(opts) - vim.deprecate('vim.lsp.diagnostic.goto_prev', 'vim.diagnostic.goto_prev', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.goto_prev', 'vim.diagnostic.goto_prev', '0.8') if opts then if opts.severity then opts.severity = severity_lsp_to_vim(opts.severity) elseif opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end end return vim.diagnostic.goto_prev(opts) @@ -419,15 +420,15 @@ end ---@param opts table See |vim.lsp.diagnostic.goto_next()| ---@return table Next diagnostic function M.get_next(opts) - vim.deprecate('vim.lsp.diagnostic.get_next', 'vim.diagnostic.get_next', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.get_next', 'vim.diagnostic.get_next', '0.8') if opts then if opts.severity then opts.severity = severity_lsp_to_vim(opts.severity) elseif opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end end - return diagnostic_vim_to_lsp({vim.diagnostic.get_next(opts)})[1] + return diagnostic_vim_to_lsp({ vim.diagnostic.get_next(opts) })[1] end --- Return the pos, {row, col}, for the next diagnostic in the current buffer. @@ -437,12 +438,12 @@ end ---@param opts table See |vim.lsp.diagnostic.goto_next()| ---@return table Next diagnostic position function M.get_next_pos(opts) - vim.deprecate('vim.lsp.diagnostic.get_next_pos', 'vim.diagnostic.get_next_pos', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.get_next_pos', 'vim.diagnostic.get_next_pos', '0.8') if opts then if opts.severity then opts.severity = severity_lsp_to_vim(opts.severity) elseif opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end end return vim.diagnostic.get_next_pos(opts) @@ -452,12 +453,12 @@ end --- ---@deprecated Prefer |vim.diagnostic.goto_next()| function M.goto_next(opts) - vim.deprecate('vim.lsp.diagnostic.goto_next', 'vim.diagnostic.goto_next', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.goto_next', 'vim.diagnostic.goto_next', '0.8') if opts then if opts.severity then opts.severity = severity_lsp_to_vim(opts.severity) elseif opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end end return vim.diagnostic.goto_next(opts) @@ -476,10 +477,10 @@ end --- - severity_limit (DiagnosticSeverity): --- - Limit severity of diagnostics found. E.g. "Warning" means { "Error", "Warning" } will be valid. function M.set_signs(diagnostics, bufnr, client_id, _, opts) - vim.deprecate('vim.lsp.diagnostic.set_signs', nil , '0.8' ) + vim.deprecate('vim.lsp.diagnostic.set_signs', nil, '0.8') local namespace = M.get_namespace(client_id) if opts and not opts.severity and opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end vim.diagnostic._set_signs(namespace, bufnr, diagnostic_lsp_to_vim(diagnostics, bufnr, client_id), opts) @@ -497,10 +498,10 @@ end --- - severity_limit (DiagnosticSeverity): --- - Limit severity of diagnostics found. E.g. "Warning" means { "Error", "Warning" } will be valid. function M.set_underline(diagnostics, bufnr, client_id, _, opts) - vim.deprecate('vim.lsp.diagnostic.set_underline', nil , '0.8' ) + vim.deprecate('vim.lsp.diagnostic.set_underline', nil, '0.8') local namespace = M.get_namespace(client_id) if opts and not opts.severity and opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end return vim.diagnostic._set_underline(namespace, bufnr, diagnostic_lsp_to_vim(diagnostics, bufnr, client_id), opts) end @@ -519,10 +520,10 @@ end --- - severity_limit (DiagnosticSeverity): --- - Limit severity of diagnostics found. E.g. "Warning" means { "Error", "Warning" } will be valid. function M.set_virtual_text(diagnostics, bufnr, client_id, _, opts) - vim.deprecate('vim.lsp.diagnostic.set_virtual_text', nil , '0.8' ) + vim.deprecate('vim.lsp.diagnostic.set_virtual_text', nil, '0.8') local namespace = M.get_namespace(client_id) if opts and not opts.severity and opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end return vim.diagnostic._set_virtual_text(namespace, bufnr, diagnostic_lsp_to_vim(diagnostics, bufnr, client_id), opts) end @@ -538,7 +539,7 @@ end ---@return an array of [text, hl_group] arrays. This can be passed directly to --- the {virt_text} option of |nvim_buf_set_extmark()|. function M.get_virtual_text_chunks_for_line(bufnr, _, line_diags, opts) - vim.deprecate('vim.lsp.diagnostic.get_virtual_text_chunks_for_line', nil, '0.8' ) + vim.deprecate('vim.lsp.diagnostic.get_virtual_text_chunks_for_line', nil, '0.8') return vim.diagnostic._get_virt_text_chunks(diagnostic_lsp_to_vim(line_diags, bufnr), opts) end @@ -556,14 +557,14 @@ end ---@param position table|nil The (0,0)-indexed position ---@return table {popup_bufnr, win_id} function M.show_position_diagnostics(opts, buf_nr, position) - vim.deprecate('vim.lsp.diagnostic.show_position_diagnostics', 'vim.diagnostic.open_float', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.show_position_diagnostics', 'vim.diagnostic.open_float', '0.8') opts = opts or {} - opts.scope = "cursor" + opts.scope = 'cursor' opts.pos = position if opts.severity then opts.severity = severity_lsp_to_vim(opts.severity) elseif opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end return vim.diagnostic.open_float(buf_nr, opts) end @@ -580,9 +581,9 @@ end ---@param client_id number|nil the client id ---@return table {popup_bufnr, win_id} function M.show_line_diagnostics(opts, buf_nr, line_nr, client_id) - vim.deprecate('vim.lsp.diagnostic.show_line_diagnostics', 'vim.diagnostic.open_float', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.show_line_diagnostics', 'vim.diagnostic.open_float', '0.8') opts = opts or {} - opts.scope = "line" + opts.scope = 'line' opts.pos = line_nr if client_id then opts.namespace = M.get_namespace(client_id) @@ -604,7 +605,7 @@ end --- client. The default is to redraw diagnostics for all attached --- clients. function M.redraw(bufnr, client_id) - vim.deprecate('vim.lsp.diagnostic.redraw', 'vim.diagnostic.show', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.redraw', 'vim.diagnostic.show', '0.8') bufnr = get_bufnr(bufnr) if not client_id then return vim.lsp.for_each_buffer_client(bufnr, function(client) @@ -632,12 +633,12 @@ end --- - {workspace}: (boolean, default true) --- - Set the list with workspace diagnostics function M.set_qflist(opts) - vim.deprecate('vim.lsp.diagnostic.set_qflist', 'vim.diagnostic.setqflist', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.set_qflist', 'vim.diagnostic.setqflist', '0.8') opts = opts or {} if opts.severity then opts.severity = severity_lsp_to_vim(opts.severity) elseif opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end if opts.client_id then opts.client_id = nil @@ -664,12 +665,12 @@ end --- - {workspace}: (boolean, default false) --- - Set the list with workspace diagnostics function M.set_loclist(opts) - vim.deprecate('vim.lsp.diagnostic.set_loclist', 'vim.diagnostic.setloclist', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.set_loclist', 'vim.diagnostic.setloclist', '0.8') opts = opts or {} if opts.severity then opts.severity = severity_lsp_to_vim(opts.severity) elseif opts.severity_limit then - opts.severity = {min=severity_lsp_to_vim(opts.severity_limit)} + opts.severity = { min = severity_lsp_to_vim(opts.severity_limit) } end if opts.client_id then opts.client_id = nil @@ -692,7 +693,7 @@ end -- send diagnostic information and the client will still process it. The -- diagnostics are simply not displayed to the user. function M.disable(bufnr, client_id) - vim.deprecate('vim.lsp.diagnostic.disable', 'vim.diagnostic.disable', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.disable', 'vim.diagnostic.disable', '0.8') if not client_id then return vim.lsp.for_each_buffer_client(bufnr, function(client) M.disable(bufnr, client.id) @@ -713,7 +714,7 @@ end --- client. The default is to enable diagnostics for all attached --- clients. function M.enable(bufnr, client_id) - vim.deprecate('vim.lsp.diagnostic.enable', 'vim.diagnostic.enable', '0.8' ) + vim.deprecate('vim.lsp.diagnostic.enable', 'vim.diagnostic.enable', '0.8') if not client_id then return vim.lsp.for_each_buffer_client(bufnr, function(client) M.enable(bufnr, client.id) diff --git a/runtime/lua/vim/lsp/handlers.lua b/runtime/lua/vim/lsp/handlers.lua index 5c80ed0d10..61cc89dcac 100644 --- a/runtime/lua/vim/lsp/handlers.lua +++ b/runtime/lua/vim/lsp/handlers.lua @@ -1,6 +1,6 @@ -local log = require 'vim.lsp.log' -local protocol = require 'vim.lsp.protocol' -local util = require 'vim.lsp.util' +local log = require('vim.lsp.log') +local protocol = require('vim.lsp.protocol') +local util = require('vim.lsp.util') local vim = vim local api = vim.api @@ -12,8 +12,8 @@ local M = {} --- Writes to error buffer. ---@param ... (table of strings) Will be concatenated before being written local function err_message(...) - vim.notify(table.concat(vim.tbl_flatten{...}), vim.log.levels.ERROR) - api.nvim_command("redraw") + vim.notify(table.concat(vim.tbl_flatten({ ... })), vim.log.levels.ERROR) + api.nvim_command('redraw') end --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_executeCommand @@ -25,15 +25,17 @@ end local function progress_handler(_, result, ctx, _) local client_id = ctx.client_id local client = vim.lsp.get_client_by_id(client_id) - local client_name = client and client.name or string.format("id=%d", client_id) + local client_name = client and client.name or string.format('id=%d', client_id) if not client then - err_message("LSP[", client_name, "] client has shut down during progress update") + err_message('LSP[', client_name, '] client has shut down during progress update') return vim.NIL end - local val = result.value -- unspecified yet - local token = result.token -- string or number + local val = result.value -- unspecified yet + local token = result.token -- string or number - if type(val) ~= 'table' then val = { content=val } end + if type(val) ~= 'table' then + val = { content = val } + end if val.kind then if val.kind == 'begin' then client.messages.progress[token] = { @@ -42,11 +44,11 @@ local function progress_handler(_, result, ctx, _) percentage = val.percentage, } elseif val.kind == 'report' then - client.messages.progress[token].message = val.message; - client.messages.progress[token].percentage = val.percentage; + client.messages.progress[token].message = val.message + client.messages.progress[token].percentage = val.percentage elseif val.kind == 'end' then if client.messages.progress[token] == nil then - err_message("LSP[", client_name, "] received `end` message with no corresponding `begin`") + err_message('LSP[', client_name, '] received `end` message with no corresponding `begin`') else client.messages.progress[token].message = val.message client.messages.progress[token].done = true @@ -57,20 +59,20 @@ local function progress_handler(_, result, ctx, _) client.messages.progress[token].done = true end - vim.api.nvim_command("doautocmd <nomodeline> User LspProgressUpdate") + vim.api.nvim_command('doautocmd <nomodeline> User LspProgressUpdate') end --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#progress M['$/progress'] = progress_handler --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window_workDoneProgress_create -M['window/workDoneProgress/create'] = function(_, result, ctx) +M['window/workDoneProgress/create'] = function(_, result, ctx) local client_id = ctx.client_id local client = vim.lsp.get_client_by_id(client_id) - local token = result.token -- string or number - local client_name = client and client.name or string.format("id=%d", client_id) + local token = result.token -- string or number + local client_name = client and client.name or string.format('id=%d', client_id) if not client then - err_message("LSP[", client_name, "] client has shut down while creating progress report") + err_message('LSP[', client_name, '] client has shut down while creating progress report') return vim.NIL end client.messages.progress[token] = {} @@ -79,20 +81,19 @@ end --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#window_showMessageRequest M['window/showMessageRequest'] = function(_, result) - local actions = result.actions print(result.message) - local option_strings = {result.message, "\nRequest Actions:"} + local option_strings = { result.message, '\nRequest Actions:' } for i, action in ipairs(actions) do local title = action.title:gsub('\r\n', '\\r\\n') title = title:gsub('\n', '\\n') - table.insert(option_strings, string.format("%d. %s", i, title)) + table.insert(option_strings, string.format('%d. %s', i, title)) end -- window/showMessageRequest can return either MessageActionItem[] or null. local choice = vim.fn.inputlist(option_strings) if choice < 1 or choice > #actions then - return vim.NIL + return vim.NIL else return actions[choice] end @@ -101,11 +102,11 @@ end --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#client_registerCapability M['client/registerCapability'] = function(_, _, ctx) local client_id = ctx.client_id - local warning_tpl = "The language server %s triggers a registerCapability ".. - "handler despite dynamicRegistration set to false. ".. - "Report upstream, this warning is harmless" + local warning_tpl = 'The language server %s triggers a registerCapability ' + .. 'handler despite dynamicRegistration set to false. ' + .. 'Report upstream, this warning is harmless' local client = vim.lsp.get_client_by_id(client_id) - local client_name = client and client.name or string.format("id=%d", client_id) + local client_name = client and client.name or string.format('id=%d', client_id) local warning = string.format(warning_tpl, client_name) log.warn(warning) return vim.NIL @@ -113,17 +114,19 @@ end --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_applyEdit M['workspace/applyEdit'] = function(_, workspace_edit, ctx) - if not workspace_edit then return end + if not workspace_edit then + return + end -- TODO(ashkan) Do something more with label? local client_id = ctx.client_id local client = vim.lsp.get_client_by_id(client_id) if workspace_edit.label then - print("Workspace edit", workspace_edit.label) + print('Workspace edit', workspace_edit.label) end local status, result = pcall(util.apply_workspace_edit, workspace_edit.edit, client.offset_encoding) return { - applied = status; - failureReason = result; + applied = status, + failureReason = result, } end @@ -132,7 +135,7 @@ M['workspace/configuration'] = function(_, result, ctx) local client_id = ctx.client_id local client = vim.lsp.get_client_by_id(client_id) if not client then - err_message("LSP[", client_id, "] client has shut down after sending a workspace/configuration request") + err_message('LSP[', client_id, '] client has shut down after sending a workspace/configuration request') return end if not result.items then @@ -158,7 +161,7 @@ M['workspace/workspaceFolders'] = function(_, _, ctx) local client_id = ctx.client_id local client = vim.lsp.get_client_by_id(client_id) if not client then - err_message("LSP[id=", client_id, "] client has shut down after sending the message") + err_message('LSP[id=', client_id, '] client has shut down after sending the message') return end return client.workspace_folders or vim.NIL @@ -172,7 +175,6 @@ M['textDocument/codeLens'] = function(...) return require('vim.lsp.codelens').on_codelens(...) end - --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_references M['textDocument/references'] = function(_, result, ctx, config) if not result or vim.tbl_isempty(result) then @@ -182,23 +184,22 @@ M['textDocument/references'] = function(_, result, ctx, config) config = config or {} if config.loclist then vim.fn.setloclist(0, {}, ' ', { - title = 'References'; - items = util.locations_to_items(result, client.offset_encoding); - context = ctx; + title = 'References', + items = util.locations_to_items(result, client.offset_encoding), + context = ctx, }) - api.nvim_command("lopen") + api.nvim_command('lopen') else vim.fn.setqflist({}, ' ', { - title = 'References'; - items = util.locations_to_items(result, client.offset_encoding); - context = ctx; + title = 'References', + items = util.locations_to_items(result, client.offset_encoding), + context = ctx, }) - api.nvim_command("botright copen") + api.nvim_command('botright copen') end end end - ---@private --- Return a function that converts LSP responses to list items and opens the list --- @@ -218,27 +219,26 @@ local function response_to_list(map_result, entity, title_fn) config = config or {} if config.loclist then vim.fn.setloclist(0, {}, ' ', { - title = title_fn(ctx); - items = map_result(result, ctx.bufnr); - context = ctx; + title = title_fn(ctx), + items = map_result(result, ctx.bufnr), + context = ctx, }) - api.nvim_command("lopen") + api.nvim_command('lopen') else vim.fn.setqflist({}, ' ', { - title = title_fn(ctx); - items = map_result(result, ctx.bufnr); - context = ctx; + title = title_fn(ctx), + items = map_result(result, ctx.bufnr), + context = ctx, }) - api.nvim_command("botright copen") + api.nvim_command('botright copen') end end end end - --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_documentSymbol M['textDocument/documentSymbol'] = response_to_list(util.symbols_to_items, 'document symbols', function(ctx) - local fname = vim.fn.fnamemodify(vim.uri_to_fname(ctx.params.textDocument.uri), ":.") + local fname = vim.fn.fnamemodify(vim.uri_to_fname(ctx.params.textDocument.uri), ':.') return string.format('Symbols in %s', fname) end) @@ -249,36 +249,44 @@ end) --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rename M['textDocument/rename'] = function(_, result, ctx, _) - if not result then return end + if not result then + return + end local client = vim.lsp.get_client_by_id(ctx.client_id) util.apply_workspace_edit(result, client.offset_encoding) end --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rangeFormatting M['textDocument/rangeFormatting'] = function(_, result, ctx, _) - if not result then return end + if not result then + return + end local client = vim.lsp.get_client_by_id(ctx.client_id) util.apply_text_edits(result, ctx.bufnr, client.offset_encoding) end --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_formatting M['textDocument/formatting'] = function(_, result, ctx, _) - if not result then return end + if not result then + return + end local client = vim.lsp.get_client_by_id(ctx.client_id) util.apply_text_edits(result, ctx.bufnr, client.offset_encoding) end --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_completion M['textDocument/completion'] = function(_, result, _, _) - if vim.tbl_isempty(result or {}) then return end + if vim.tbl_isempty(result or {}) then + return + end local row, col = unpack(api.nvim_win_get_cursor(0)) - local line = assert(api.nvim_buf_get_lines(0, row-1, row, false)[1]) - local line_to_cursor = line:sub(col+1) + local line = assert(api.nvim_buf_get_lines(0, row - 1, row, false)[1]) + local line_to_cursor = line:sub(col + 1) local textMatch = vim.fn.match(line_to_cursor, '\\k*$') - local prefix = line_to_cursor:sub(textMatch+1) + local prefix = line_to_cursor:sub(textMatch + 1) local matches = util.text_document_completion_list_to_complete_items(result, prefix) - vim.fn.complete(textMatch+1, matches) + vim.fn.complete(textMatch + 1, matches) end --- |lsp-handler| for the method "textDocument/hover" @@ -307,7 +315,7 @@ function M.hover(_, result, ctx, config) vim.notify('No information available') return end - return util.open_floating_preview(markdown_lines, "markdown", config) + return util.open_floating_preview(markdown_lines, 'markdown', config) end --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_hover @@ -319,28 +327,30 @@ M['textDocument/hover'] = M.hover ---@param result (table) result of LSP method; a location or a list of locations. ---@param ctx (table) table containing the context of the request, including the method ---(`textDocument/definition` can return `Location` or `Location[]` -local function location_handler(_, result, ctx, _) +local function location_handler(_, result, ctx, config) if result == nil or vim.tbl_isempty(result) then local _ = log.info() and log.info(ctx.method, 'No location found') return nil end local client = vim.lsp.get_client_by_id(ctx.client_id) + config = config or {} + -- textDocument/definition can return Location or Location[] -- https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_definition if vim.tbl_islist(result) then - util.jump_to_location(result[1], client.offset_encoding) + util.jump_to_location(result[1], client.offset_encoding, config.reuse_win) if #result > 1 then vim.fn.setqflist({}, ' ', { title = 'LSP locations', - items = util.locations_to_items(result, client.offset_encoding) + items = util.locations_to_items(result, client.offset_encoding), }) - api.nvim_command("botright copen") + api.nvim_command('botright copen') end else - util.jump_to_location(result, client.offset_encoding) + util.jump_to_location(result, client.offset_encoding, config.reuse_win) end end @@ -379,7 +389,7 @@ function M.signature_help(_, result, ctx, config) return end local client = vim.lsp.get_client_by_id(ctx.client_id) - local triggers = vim.tbl_get(client.server_capabilities, "signatureHelpProvider", "triggerCharacters") + local triggers = vim.tbl_get(client.server_capabilities, 'signatureHelpProvider', 'triggerCharacters') local ft = api.nvim_buf_get_option(ctx.bufnr, 'filetype') local lines, hl = util.convert_signature_help_to_markdown_lines(result, ft, triggers) lines = util.trim_empty_lines(lines) @@ -389,9 +399,9 @@ function M.signature_help(_, result, ctx, config) end return end - local fbuf, fwin = util.open_floating_preview(lines, "markdown", config) + local fbuf, fwin = util.open_floating_preview(lines, 'markdown', config) if hl then - api.nvim_buf_add_highlight(fbuf, -1, "LspSignatureActiveParameter", 0, unpack(hl)) + api.nvim_buf_add_highlight(fbuf, -1, 'LspSignatureActiveParameter', 0, unpack(hl)) end return fbuf, fwin end @@ -401,10 +411,14 @@ M['textDocument/signatureHelp'] = M.signature_help --see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_documentHighlight M['textDocument/documentHighlight'] = function(_, result, ctx, _) - if not result then return end + if not result then + return + end local client_id = ctx.client_id local client = vim.lsp.get_client_by_id(client_id) - if not client then return end + if not client then + return + end util.buf_highlight_references(ctx.bufnr, result, client.offset_encoding) end @@ -417,7 +431,9 @@ end ---@returns `CallHierarchyOutgoingCall[]` if {direction} is `"to"`, local make_call_hierarchy_handler = function(direction) return function(_, result) - if not result then return end + if not result then + return + end local items = {} for _, call_hierarchy_call in pairs(result) do local call_hierarchy_item = call_hierarchy_call[direction] @@ -430,8 +446,8 @@ local make_call_hierarchy_handler = function(direction) }) end end - vim.fn.setqflist({}, ' ', {title = 'LSP call hierarchy', items = items}) - api.nvim_command("botright copen") + vim.fn.setqflist({}, ' ', { title = 'LSP call hierarchy', items = items }) + api.nvim_command('botright copen') end end @@ -447,15 +463,15 @@ M['window/logMessage'] = function(_, result, ctx, _) local message = result.message local client_id = ctx.client_id local client = vim.lsp.get_client_by_id(client_id) - local client_name = client and client.name or string.format("id=%d", client_id) + local client_name = client and client.name or string.format('id=%d', client_id) if not client then - err_message("LSP[", client_name, "] client has shut down after sending ", message) + err_message('LSP[', client_name, '] client has shut down after sending ', message) end if message_type == protocol.MessageType.Error then log.error(message) elseif message_type == protocol.MessageType.Warning then log.warn(message) - elseif message_type == protocol.MessageType.Info or message_type == protocol.MessageType.Log then + elseif message_type == protocol.MessageType.Info or message_type == protocol.MessageType.Log then log.info(message) else log.debug(message) @@ -469,15 +485,15 @@ M['window/showMessage'] = function(_, result, ctx, _) local message = result.message local client_id = ctx.client_id local client = vim.lsp.get_client_by_id(client_id) - local client_name = client and client.name or string.format("id=%d", client_id) + local client_name = client and client.name or string.format('id=%d', client_id) if not client then - err_message("LSP[", client_name, "] client has shut down after sending ", message) + err_message('LSP[', client_name, '] client has shut down after sending ', message) end if message_type == protocol.MessageType.Error then - err_message("LSP[", client_name, "] ", message) + err_message('LSP[', client_name, '] ', message) else local message_type_name = protocol.MessageType[message_type] - api.nvim_out_write(string.format("LSP[%s][%s] %s\n", client_name, message_type_name, message)) + api.nvim_out_write(string.format('LSP[%s][%s] %s\n', client_name, message_type_name, message)) end return result end @@ -485,9 +501,13 @@ end -- Add boilerplate error validation and logging for all of these. for k, fn in pairs(M) do M[k] = function(err, result, ctx, config) - local _ = log.trace() and log.trace('default_handler', ctx.method, { - err = err, result = result, ctx=vim.inspect(ctx), config = config - }) + local _ = log.trace() + and log.trace('default_handler', ctx.method, { + err = err, + result = result, + ctx = vim.inspect(ctx), + config = config, + }) if err then -- LSP spec: @@ -499,7 +519,7 @@ for k, fn in pairs(M) do -- Per LSP, don't show ContentModified error to the user. if err.code ~= protocol.ErrorCodes.ContentModified then local client = vim.lsp.get_client_by_id(ctx.client_id) - local client_name = client and client.name or string.format("client_id=%d", ctx.client_id) + local client_name = client and client.name or string.format('client_id=%d', ctx.client_id) err_message(client_name .. ': ' .. tostring(err.code) .. ': ' .. err.message) end diff --git a/runtime/lua/vim/lsp/health.lua b/runtime/lua/vim/lsp/health.lua index ed3eea59df..bf8fe0932e 100644 --- a/runtime/lua/vim/lsp/health.lua +++ b/runtime/lua/vim/lsp/health.lua @@ -8,20 +8,20 @@ function M.check() local log = require('vim.lsp.log') local current_log_level = log.get_level() local log_level_string = log.levels[current_log_level] - report_info(string.format("LSP log level : %s", log_level_string)) + report_info(string.format('LSP log level : %s', log_level_string)) if current_log_level < log.levels.WARN then - report_warn(string.format("Log level %s will cause degraded performance and high disk usage", log_level_string)) + report_warn(string.format('Log level %s will cause degraded performance and high disk usage', log_level_string)) end local log_path = vim.lsp.get_log_path() - report_info(string.format("Log path: %s", log_path)) + report_info(string.format('Log path: %s', log_path)) - local log_size = vim.loop.fs_stat(log_path).size + local log_file = vim.loop.fs_stat(log_path) + local log_size = log_file and log_file.size or 0 local report_fn = (log_size / 1000000 > 100 and report_warn or report_info) - report_fn(string.format("Log size: %d KB", log_size / 1000 )) + report_fn(string.format('Log size: %d KB', log_size / 1000)) end return M - diff --git a/runtime/lua/vim/lsp/log.lua b/runtime/lua/vim/lsp/log.lua index fff42fd011..29cb27d373 100644 --- a/runtime/lua/vim/lsp/log.lua +++ b/runtime/lua/vim/lsp/log.lua @@ -14,21 +14,23 @@ log.levels = vim.deepcopy(vim.log.levels) -- Default log level is warn. local current_log_level = log.levels.WARN -local log_date_format = "%F %H:%M:%S" -local format_func = function(arg) return vim.inspect(arg, {newline=''}) end +local log_date_format = '%F %H:%M:%S' +local format_func = function(arg) + return vim.inspect(arg, { newline = '' }) +end do - local path_sep = vim.loop.os_uname().version:match("Windows") and "\\" or "/" + local path_sep = vim.loop.os_uname().version:match('Windows') and '\\' or '/' ---@private local function path_join(...) - return table.concat(vim.tbl_flatten{...}, path_sep) + return table.concat(vim.tbl_flatten({ ... }), path_sep) end - local logfilename = path_join(vim.fn.stdpath('cache'), 'lsp.log') + local logfilename = path_join(vim.fn.stdpath('log'), 'lsp.log') -- TODO: Ideally the directory should be created in open_logfile(), right -- before opening the log file, but open_logfile() can be called from libuv -- callbacks, where using fn.mkdir() is not allowed. - vim.fn.mkdir(vim.fn.stdpath('cache'), "p") + vim.fn.mkdir(vim.fn.stdpath('log'), 'p') --- Returns the log filename. ---@returns (string) log filename @@ -41,28 +43,28 @@ do --- Opens log file. Returns true if file is open, false on error local function open_logfile() -- Try to open file only once - if logfile then return true end - if openerr then return false end + if logfile then + return true + end + if openerr then + return false + end - logfile, openerr = io.open(logfilename, "a+") + logfile, openerr = io.open(logfilename, 'a+') if not logfile then - local err_msg = string.format("Failed to open LSP client log file: %s", openerr) + local err_msg = string.format('Failed to open LSP client log file: %s', openerr) vim.notify(err_msg, vim.log.levels.ERROR) return false end local log_info = vim.loop.fs_stat(logfilename) if log_info and log_info.size > 1e9 then - local warn_msg = string.format( - "LSP client log is large (%d MB): %s", - log_info.size / (1000 * 1000), - logfilename - ) + local warn_msg = string.format('LSP client log is large (%d MB): %s', log_info.size / (1000 * 1000), logfilename) vim.notify(warn_msg) end -- Start message for logging - logfile:write(string.format("[START][%s] LSP logging initiated\n", os.date(log_date_format))) + logfile:write(string.format('[START][%s] LSP logging initiated\n', os.date(log_date_format))) return true end @@ -83,24 +85,36 @@ do -- ``` -- -- This way you can avoid string allocations if the log level isn't high enough. - if level ~= "OFF" then + if level ~= 'OFF' then log[level:lower()] = function(...) - local argc = select("#", ...) - if levelnr < current_log_level then return false end - if argc == 0 then return true end - if not open_logfile() then return false end - local info = debug.getinfo(2, "Sl") - local header = string.format("[%s][%s] ...%s:%s", level, os.date(log_date_format), string.sub(info.short_src, #info.short_src - 15), info.currentline) + local argc = select('#', ...) + if levelnr < current_log_level then + return false + end + if argc == 0 then + return true + end + if not open_logfile() then + return false + end + local info = debug.getinfo(2, 'Sl') + local header = string.format( + '[%s][%s] ...%s:%s', + level, + os.date(log_date_format), + string.sub(info.short_src, #info.short_src - 15), + info.currentline + ) local parts = { header } for i = 1, argc do local arg = select(i, ...) if arg == nil then - table.insert(parts, "nil") + table.insert(parts, 'nil') else table.insert(parts, format_func(arg)) end end - logfile:write(table.concat(parts, '\t'), "\n") + logfile:write(table.concat(parts, '\t'), '\n') logfile:flush() end end @@ -115,10 +129,10 @@ vim.tbl_add_reverse_lookup(log.levels) ---@param level (string or number) One of `vim.lsp.log.levels` function log.set_level(level) if type(level) == 'string' then - current_log_level = assert(log.levels[level:upper()], string.format("Invalid log level: %q", level)) + current_log_level = assert(log.levels[level:upper()], string.format('Invalid log level: %q', level)) else - assert(type(level) == 'number', "level must be a number or string") - assert(log.levels[level], string.format("Invalid log level: %d", level)) + assert(type(level) == 'number', 'level must be a number or string') + assert(log.levels[level], string.format('Invalid log level: %d', level)) current_log_level = level end end @@ -132,7 +146,7 @@ end --- Sets formatting function used to format logs ---@param handle function function to apply to logging arguments, pass vim.inspect for multi-line formatting function log.set_format_func(handle) - assert(handle == vim.inspect or type(handle) == 'function', "handle must be a function") + assert(handle == vim.inspect or type(handle) == 'function', 'handle must be a function') format_func = handle end diff --git a/runtime/lua/vim/lsp/protocol.lua b/runtime/lua/vim/lsp/protocol.lua index 8f50863360..6ecf7891c7 100644 --- a/runtime/lua/vim/lsp/protocol.lua +++ b/runtime/lua/vim/lsp/protocol.lua @@ -23,150 +23,150 @@ end local constants = { DiagnosticSeverity = { -- Reports an error. - Error = 1; + Error = 1, -- Reports a warning. - Warning = 2; + Warning = 2, -- Reports an information. - Information = 3; + Information = 3, -- Reports a hint. - Hint = 4; - }; + Hint = 4, + }, DiagnosticTag = { -- Unused or unnecessary code - Unnecessary = 1; + Unnecessary = 1, -- Deprecated or obsolete code - Deprecated = 2; - }; + Deprecated = 2, + }, MessageType = { -- An error message. - Error = 1; + Error = 1, -- A warning message. - Warning = 2; + Warning = 2, -- An information message. - Info = 3; + Info = 3, -- A log message. - Log = 4; - }; + Log = 4, + }, -- The file event type. FileChangeType = { -- The file got created. - Created = 1; + Created = 1, -- The file got changed. - Changed = 2; + Changed = 2, -- The file got deleted. - Deleted = 3; - }; + Deleted = 3, + }, -- The kind of a completion entry. CompletionItemKind = { - Text = 1; - Method = 2; - Function = 3; - Constructor = 4; - Field = 5; - Variable = 6; - Class = 7; - Interface = 8; - Module = 9; - Property = 10; - Unit = 11; - Value = 12; - Enum = 13; - Keyword = 14; - Snippet = 15; - Color = 16; - File = 17; - Reference = 18; - Folder = 19; - EnumMember = 20; - Constant = 21; - Struct = 22; - Event = 23; - Operator = 24; - TypeParameter = 25; - }; + Text = 1, + Method = 2, + Function = 3, + Constructor = 4, + Field = 5, + Variable = 6, + Class = 7, + Interface = 8, + Module = 9, + Property = 10, + Unit = 11, + Value = 12, + Enum = 13, + Keyword = 14, + Snippet = 15, + Color = 16, + File = 17, + Reference = 18, + Folder = 19, + EnumMember = 20, + Constant = 21, + Struct = 22, + Event = 23, + Operator = 24, + TypeParameter = 25, + }, -- How a completion was triggered CompletionTriggerKind = { -- Completion was triggered by typing an identifier (24x7 code -- complete), manual invocation (e.g Ctrl+Space) or via API. - Invoked = 1; + Invoked = 1, -- Completion was triggered by a trigger character specified by -- the `triggerCharacters` properties of the `CompletionRegistrationOptions`. - TriggerCharacter = 2; + TriggerCharacter = 2, -- Completion was re-triggered as the current completion list is incomplete. - TriggerForIncompleteCompletions = 3; - }; + TriggerForIncompleteCompletions = 3, + }, -- A document highlight kind. DocumentHighlightKind = { -- A textual occurrence. - Text = 1; + Text = 1, -- Read-access of a symbol, like reading a variable. - Read = 2; + Read = 2, -- Write-access of a symbol, like writing to a variable. - Write = 3; - }; + Write = 3, + }, -- A symbol kind. SymbolKind = { - File = 1; - Module = 2; - Namespace = 3; - Package = 4; - Class = 5; - Method = 6; - Property = 7; - Field = 8; - Constructor = 9; - Enum = 10; - Interface = 11; - Function = 12; - Variable = 13; - Constant = 14; - String = 15; - Number = 16; - Boolean = 17; - Array = 18; - Object = 19; - Key = 20; - Null = 21; - EnumMember = 22; - Struct = 23; - Event = 24; - Operator = 25; - TypeParameter = 26; - }; + File = 1, + Module = 2, + Namespace = 3, + Package = 4, + Class = 5, + Method = 6, + Property = 7, + Field = 8, + Constructor = 9, + Enum = 10, + Interface = 11, + Function = 12, + Variable = 13, + Constant = 14, + String = 15, + Number = 16, + Boolean = 17, + Array = 18, + Object = 19, + Key = 20, + Null = 21, + EnumMember = 22, + Struct = 23, + Event = 24, + Operator = 25, + TypeParameter = 26, + }, -- Represents reasons why a text document is saved. TextDocumentSaveReason = { -- Manually triggered, e.g. by the user pressing save, by starting debugging, -- or by an API call. - Manual = 1; + Manual = 1, -- Automatic after a delay. - AfterDelay = 2; + AfterDelay = 2, -- When the editor lost focus. - FocusOut = 3; - }; + FocusOut = 3, + }, ErrorCodes = { -- Defined by JSON RPC - ParseError = -32700; - InvalidRequest = -32600; - MethodNotFound = -32601; - InvalidParams = -32602; - InternalError = -32603; - serverErrorStart = -32099; - serverErrorEnd = -32000; - ServerNotInitialized = -32002; - UnknownErrorCode = -32001; + ParseError = -32700, + InvalidRequest = -32600, + MethodNotFound = -32601, + InvalidParams = -32602, + InternalError = -32603, + serverErrorStart = -32099, + serverErrorEnd = -32000, + ServerNotInitialized = -32002, + UnknownErrorCode = -32001, -- Defined by the protocol. - RequestCancelled = -32800; - ContentModified = -32801; - }; + RequestCancelled = -32800, + ContentModified = -32801, + }, -- Describes the content type that a client supports in various -- result literals like `Hover`, `ParameterInfo` or `CompletionItem`. @@ -175,88 +175,88 @@ local constants = { -- are reserved for internal usage. MarkupKind = { -- Plain text is supported as a content format - PlainText = 'plaintext'; + PlainText = 'plaintext', -- Markdown is supported as a content format - Markdown = 'markdown'; - }; + Markdown = 'markdown', + }, ResourceOperationKind = { -- Supports creating new files and folders. - Create = 'create'; + Create = 'create', -- Supports renaming existing files and folders. - Rename = 'rename'; + Rename = 'rename', -- Supports deleting existing files and folders. - Delete = 'delete'; - }; + Delete = 'delete', + }, FailureHandlingKind = { -- Applying the workspace change is simply aborted if one of the changes provided -- fails. All operations executed before the failing operation stay executed. - Abort = 'abort'; + Abort = 'abort', -- All operations are executed transactionally. That means they either all -- succeed or no changes at all are applied to the workspace. - Transactional = 'transactional'; + Transactional = 'transactional', -- If the workspace edit contains only textual file changes they are executed transactionally. -- If resource changes (create, rename or delete file) are part of the change the failure -- handling strategy is abort. - TextOnlyTransactional = 'textOnlyTransactional'; + TextOnlyTransactional = 'textOnlyTransactional', -- The client tries to undo the operations already executed. But there is no -- guarantee that this succeeds. - Undo = 'undo'; - }; + Undo = 'undo', + }, -- Known error codes for an `InitializeError`; InitializeError = { -- If the protocol version provided by the client can't be handled by the server. -- @deprecated This initialize error got replaced by client capabilities. There is -- no version handshake in version 3.0x - unknownProtocolVersion = 1; - }; + unknownProtocolVersion = 1, + }, -- Defines how the host (editor) should sync document changes to the language server. TextDocumentSyncKind = { -- Documents should not be synced at all. - None = 0; + None = 0, -- Documents are synced by always sending the full content -- of the document. - Full = 1; + Full = 1, -- Documents are synced by sending the full content on open. -- After that only incremental updates to the document are -- send. - Incremental = 2; - }; + Incremental = 2, + }, WatchKind = { -- Interested in create events. - Create = 1; + Create = 1, -- Interested in change events - Change = 2; + Change = 2, -- Interested in delete events - Delete = 4; - }; + Delete = 4, + }, -- Defines whether the insert text in a completion item should be interpreted as -- plain text or a snippet. InsertTextFormat = { -- The primary text to be inserted is treated as a plain string. - PlainText = 1; + PlainText = 1, -- The primary text to be inserted is treated as a snippet. -- -- A snippet can define tab stops and placeholders with `$1`, `$2` -- and `${3:foo};`. `$0` defines the final tab stop, it defaults to -- the end of the snippet. Placeholders with equal identifiers are linked, -- that is typing in one will update others too. - Snippet = 2; - }; + Snippet = 2, + }, -- A set of predefined code action kinds CodeActionKind = { -- Empty kind. - Empty = ''; + Empty = '', -- Base kind for quickfix actions - QuickFix = 'quickfix'; + QuickFix = 'quickfix', -- Base kind for refactoring actions - Refactor = 'refactor'; + Refactor = 'refactor', -- Base kind for refactoring extraction actions -- -- Example extract actions: @@ -266,7 +266,7 @@ local constants = { -- - Extract variable -- - Extract interface from class -- - ... - RefactorExtract = 'refactor.extract'; + RefactorExtract = 'refactor.extract', -- Base kind for refactoring inline actions -- -- Example inline actions: @@ -275,7 +275,7 @@ local constants = { -- - Inline variable -- - Inline constant -- - ... - RefactorInline = 'refactor.inline'; + RefactorInline = 'refactor.inline', -- Base kind for refactoring rewrite actions -- -- Example rewrite actions: @@ -286,14 +286,14 @@ local constants = { -- - Make method static -- - Move method to base class -- - ... - RefactorRewrite = 'refactor.rewrite'; + RefactorRewrite = 'refactor.rewrite', -- Base kind for source actions -- -- Source code actions apply to the entire file. - Source = 'source'; + Source = 'source', -- Base kind for an organize imports source action - SourceOrganizeImports = 'source.organizeImports'; - }; + SourceOrganizeImports = 'source.organizeImports', + }, } for k, v in pairs(constants) do @@ -620,19 +620,19 @@ function protocol.make_client_capabilities() return { textDocument = { synchronization = { - dynamicRegistration = false; + dynamicRegistration = false, -- TODO(ashkan) Send textDocument/willSave before saving (BufWritePre) - willSave = false; + willSave = false, -- TODO(ashkan) Implement textDocument/willSaveWaitUntil - willSaveWaitUntil = false; + willSaveWaitUntil = false, -- Send textDocument/didSave after saving (BufWritePost) - didSave = true; - }; + didSave = true, + }, codeAction = { - dynamicRegistration = false; + dynamicRegistration = false, codeActionLiteralSupport = { codeActionKind = { @@ -640,138 +640,146 @@ function protocol.make_client_capabilities() local res = vim.tbl_values(protocol.CodeActionKind) table.sort(res) return res - end)(); - }; - }; - isPreferredSupport = true; - dataSupport = true; + end)(), + }, + }, + isPreferredSupport = true, + dataSupport = true, resolveSupport = { - properties = { 'edit', } - }; - }; + properties = { 'edit' }, + }, + }, completion = { - dynamicRegistration = false; + dynamicRegistration = false, completionItem = { -- Until we can actually expand snippet, move cursor and allow for true snippet experience, -- this should be disabled out of the box. -- However, users can turn this back on if they have a snippet plugin. - snippetSupport = false; + snippetSupport = false, - commitCharactersSupport = false; - preselectSupport = false; - deprecatedSupport = false; - documentationFormat = { protocol.MarkupKind.Markdown; protocol.MarkupKind.PlainText }; - }; + commitCharactersSupport = false, + preselectSupport = false, + deprecatedSupport = false, + documentationFormat = { protocol.MarkupKind.Markdown, protocol.MarkupKind.PlainText }, + }, completionItemKind = { valueSet = (function() local res = {} for k in ipairs(protocol.CompletionItemKind) do - if type(k) == 'number' then table.insert(res, k) end + if type(k) == 'number' then + table.insert(res, k) + end end return res - end)(); - }; + end)(), + }, -- TODO(tjdevries): Implement this - contextSupport = false; - }; + contextSupport = false, + }, declaration = { - linkSupport = true; - }; + linkSupport = true, + }, definition = { - linkSupport = true; - }; + linkSupport = true, + }, implementation = { - linkSupport = true; - }; + linkSupport = true, + }, typeDefinition = { - linkSupport = true; - }; + linkSupport = true, + }, hover = { - dynamicRegistration = false; - contentFormat = { protocol.MarkupKind.Markdown; protocol.MarkupKind.PlainText }; - }; + dynamicRegistration = false, + contentFormat = { protocol.MarkupKind.Markdown, protocol.MarkupKind.PlainText }, + }, signatureHelp = { - dynamicRegistration = false; + dynamicRegistration = false, signatureInformation = { - activeParameterSupport = true; - documentationFormat = { protocol.MarkupKind.Markdown; protocol.MarkupKind.PlainText }; + activeParameterSupport = true, + documentationFormat = { protocol.MarkupKind.Markdown, protocol.MarkupKind.PlainText }, parameterInformation = { - labelOffsetSupport = true; - }; - }; - }; + labelOffsetSupport = true, + }, + }, + }, references = { - dynamicRegistration = false; - }; + dynamicRegistration = false, + }, documentHighlight = { - dynamicRegistration = false - }; + dynamicRegistration = false, + }, documentSymbol = { - dynamicRegistration = false; + dynamicRegistration = false, symbolKind = { valueSet = (function() local res = {} for k in ipairs(protocol.SymbolKind) do - if type(k) == 'number' then table.insert(res, k) end + if type(k) == 'number' then + table.insert(res, k) + end end return res - end)(); - }; - hierarchicalDocumentSymbolSupport = true; - }; + end)(), + }, + hierarchicalDocumentSymbolSupport = true, + }, rename = { - dynamicRegistration = false; - prepareSupport = true; - }; + dynamicRegistration = false, + prepareSupport = true, + }, publishDiagnostics = { - relatedInformation = true; + relatedInformation = true, tagSupport = { valueSet = (function() local res = {} for k in ipairs(protocol.DiagnosticTag) do - if type(k) == 'number' then table.insert(res, k) end + if type(k) == 'number' then + table.insert(res, k) + end end return res - end)(); - }; - }; - }; + end)(), + }, + }, + }, workspace = { symbol = { - dynamicRegistration = false; + dynamicRegistration = false, symbolKind = { valueSet = (function() local res = {} for k in ipairs(protocol.SymbolKind) do - if type(k) == 'number' then table.insert(res, k) end + if type(k) == 'number' then + table.insert(res, k) + end end return res - end)(); - }; - hierarchicalWorkspaceSymbolSupport = true; - }; - workspaceFolders = true; - applyEdit = true; + end)(), + }, + hierarchicalWorkspaceSymbolSupport = true, + }, + workspaceFolders = true, + applyEdit = true, workspaceEdit = { - resourceOperations = {'rename', 'create', 'delete',}, - }; - }; + resourceOperations = { 'rename', 'create', 'delete' }, + }, + }, callHierarchy = { - dynamicRegistration = false; - }; - experimental = nil; + dynamicRegistration = false, + }, + experimental = nil, window = { - workDoneProgress = true; + workDoneProgress = true, showMessage = { messageActionItem = { - additionalPropertiesSupport = false; - }; - }; + additionalPropertiesSupport = false, + }, + }, showDocument = { - support = false; - }; - }; + support = false, + }, + }, } end @@ -791,12 +799,12 @@ function protocol.resolve_capabilities(server_capabilities) willSaveWaitUntil = false, save = { includeText = false, - } + }, } elseif type(textDocumentSync) == 'number' then -- Backwards compatibility if not TextDocumentSyncKind[textDocumentSync] then - return nil, "Invalid server TextDocumentSyncKind for textDocumentSync" + return nil, 'Invalid server TextDocumentSyncKind for textDocumentSync' end server_capabilities.textDocumentSync = { openClose = true, @@ -805,10 +813,10 @@ function protocol.resolve_capabilities(server_capabilities) willSaveWaitUntil = false, save = { includeText = false, - } + }, } elseif type(textDocumentSync) ~= 'table' then - return nil, string.format("Invalid type for textDocumentSync: %q", type(textDocumentSync)) + return nil, string.format('Invalid type for textDocumentSync: %q', type(textDocumentSync)) end return server_capabilities end @@ -827,39 +835,41 @@ function protocol._resolve_capabilities_compat(server_capabilities) if textDocumentSync == nil then -- Defaults if omitted. text_document_sync_properties = { - text_document_open_close = false; - text_document_did_change = TextDocumentSyncKind.None; --- text_document_did_change = false; - text_document_will_save = false; - text_document_will_save_wait_until = false; - text_document_save = false; - text_document_save_include_text = false; + text_document_open_close = false, + text_document_did_change = TextDocumentSyncKind.None, + -- text_document_did_change = false; + text_document_will_save = false, + text_document_will_save_wait_until = false, + text_document_save = false, + text_document_save_include_text = false, } elseif type(textDocumentSync) == 'number' then -- Backwards compatibility if not TextDocumentSyncKind[textDocumentSync] then - return nil, "Invalid server TextDocumentSyncKind for textDocumentSync" + return nil, 'Invalid server TextDocumentSyncKind for textDocumentSync' end text_document_sync_properties = { - text_document_open_close = true; - text_document_did_change = textDocumentSync; - text_document_will_save = false; - text_document_will_save_wait_until = false; - text_document_save = true; - text_document_save_include_text = false; + text_document_open_close = true, + text_document_did_change = textDocumentSync, + text_document_will_save = false, + text_document_will_save_wait_until = false, + text_document_save = true, + text_document_save_include_text = false, } elseif type(textDocumentSync) == 'table' then text_document_sync_properties = { - text_document_open_close = if_nil(textDocumentSync.openClose, false); - text_document_did_change = if_nil(textDocumentSync.change, TextDocumentSyncKind.None); - text_document_will_save = if_nil(textDocumentSync.willSave, false); - text_document_will_save_wait_until = if_nil(textDocumentSync.willSaveWaitUntil, false); - text_document_save = if_nil(textDocumentSync.save, false); - text_document_save_include_text = if_nil(type(textDocumentSync.save) == 'table' - and textDocumentSync.save.includeText, false); + text_document_open_close = if_nil(textDocumentSync.openClose, false), + text_document_did_change = if_nil(textDocumentSync.change, TextDocumentSyncKind.None), + text_document_will_save = if_nil(textDocumentSync.willSave, false), + text_document_will_save_wait_until = if_nil(textDocumentSync.willSaveWaitUntil, false), + text_document_save = if_nil(textDocumentSync.save, false), + text_document_save_include_text = if_nil( + type(textDocumentSync.save) == 'table' and textDocumentSync.save.includeText, + false + ), } else - return nil, string.format("Invalid type for textDocumentSync: %q", type(textDocumentSync)) + return nil, string.format('Invalid type for textDocumentSync: %q', type(textDocumentSync)) end end general_properties.completion = server_capabilities.completionProvider ~= nil @@ -889,16 +899,18 @@ function protocol._resolve_capabilities_compat(server_capabilities) general_properties.code_lens = true general_properties.code_lens_resolve = server_capabilities.codeLensProvider.resolveProvider or false else - error("The server sent invalid codeLensProvider") + error('The server sent invalid codeLensProvider') end if server_capabilities.codeActionProvider == nil then general_properties.code_action = false - elseif type(server_capabilities.codeActionProvider) == 'boolean' - or type(server_capabilities.codeActionProvider) == 'table' then + elseif + type(server_capabilities.codeActionProvider) == 'boolean' + or type(server_capabilities.codeActionProvider) == 'table' + then general_properties.code_action = server_capabilities.codeActionProvider else - error("The server sent invalid codeActionProvider") + error('The server sent invalid codeActionProvider') end if server_capabilities.declarationProvider == nil then @@ -908,7 +920,7 @@ function protocol._resolve_capabilities_compat(server_capabilities) elseif type(server_capabilities.declarationProvider) == 'table' then general_properties.declaration = server_capabilities.declarationProvider else - error("The server sent invalid declarationProvider") + error('The server sent invalid declarationProvider') end if server_capabilities.typeDefinitionProvider == nil then @@ -918,7 +930,7 @@ function protocol._resolve_capabilities_compat(server_capabilities) elseif type(server_capabilities.typeDefinitionProvider) == 'table' then general_properties.type_definition = server_capabilities.typeDefinitionProvider else - error("The server sent invalid typeDefinitionProvider") + error('The server sent invalid typeDefinitionProvider') end if server_capabilities.implementationProvider == nil then @@ -928,7 +940,7 @@ function protocol._resolve_capabilities_compat(server_capabilities) elseif type(server_capabilities.implementationProvider) == 'table' then general_properties.implementation = server_capabilities.implementationProvider else - error("The server sent invalid implementationProvider") + error('The server sent invalid implementationProvider') end local workspace = server_capabilities.workspace @@ -936,45 +948,45 @@ function protocol._resolve_capabilities_compat(server_capabilities) if workspace == nil or workspace.workspaceFolders == nil then -- Defaults if omitted. workspace_properties = { - workspace_folder_properties = { - supported = false; - changeNotifications=false; - } + workspace_folder_properties = { + supported = false, + changeNotifications = false, + }, } elseif type(workspace.workspaceFolders) == 'table' then workspace_properties = { workspace_folder_properties = { - supported = if_nil(workspace.workspaceFolders.supported, false); - changeNotifications = if_nil(workspace.workspaceFolders.changeNotifications, false); - - } + supported = if_nil(workspace.workspaceFolders.supported, false), + changeNotifications = if_nil(workspace.workspaceFolders.changeNotifications, false), + }, } else - error("The server sent invalid workspace") + error('The server sent invalid workspace') end local signature_help_properties if server_capabilities.signatureHelpProvider == nil then signature_help_properties = { - signature_help = false; - signature_help_trigger_characters = {}; + signature_help = false, + signature_help_trigger_characters = {}, } elseif type(server_capabilities.signatureHelpProvider) == 'table' then signature_help_properties = { - signature_help = true; + signature_help = true, -- The characters that trigger signature help automatically. - signature_help_trigger_characters = server_capabilities.signatureHelpProvider.triggerCharacters or {}; + signature_help_trigger_characters = server_capabilities.signatureHelpProvider.triggerCharacters or {}, } else - error("The server sent invalid signatureHelpProvider") + error('The server sent invalid signatureHelpProvider') end - local capabilities = vim.tbl_extend("error" - , text_document_sync_properties - , signature_help_properties - , workspace_properties - , general_properties - ) + local capabilities = vim.tbl_extend( + 'error', + text_document_sync_properties, + signature_help_properties, + workspace_properties, + general_properties + ) return capabilities end diff --git a/runtime/lua/vim/lsp/rpc.lua b/runtime/lua/vim/lsp/rpc.lua index be2cc58f07..2dcafc92bc 100644 --- a/runtime/lua/vim/lsp/rpc.lua +++ b/runtime/lua/vim/lsp/rpc.lua @@ -32,9 +32,9 @@ local function env_merge(env) -- Merge. env = vim.tbl_extend('force', vim.fn.environ(), env) local final_env = {} - for k,v in pairs(env) do + for k, v in pairs(env) do assert(type(k) == 'string', 'env must be a dict') - table.insert(final_env, k..'='..tostring(v)) + table.insert(final_env, k .. '=' .. tostring(v)) end return final_env end @@ -45,10 +45,12 @@ end ---@param encoded_message (string) ---@returns (table) table containing encoded message and `Content-Length` attribute local function format_message_with_content_length(encoded_message) - return table.concat { - 'Content-Length: '; tostring(#encoded_message); '\r\n\r\n'; - encoded_message; - } + return table.concat({ + 'Content-Length: ', + tostring(#encoded_message), + '\r\n\r\n', + encoded_message, + }) end ---@private @@ -65,23 +67,25 @@ local function parse_headers(header) if line == '' then break end - local key, value = line:match("^%s*(%S+)%s*:%s*(.+)%s*$") + local key, value = line:match('^%s*(%S+)%s*:%s*(.+)%s*$') if key then key = key:lower():gsub('%-', '_') headers[key] = value else - local _ = log.error() and log.error("invalid header line %q", line) - error(string.format("invalid header line %q", line)) + local _ = log.error() and log.error('invalid header line %q', line) + error(string.format('invalid header line %q', line)) end end headers.content_length = tonumber(headers.content_length) - or error(string.format("Content-Length not found in headers. %q", header)) + or error(string.format('Content-Length not found in headers. %q', header)) return headers end -- This is the start of any possible header patterns. The gsub converts it to a -- case insensitive pattern. -local header_start_pattern = ("content"):gsub("%w", function(c) return "["..c..c:upper().."]" end) +local header_start_pattern = ('content'):gsub('%w', function(c) + return '[' .. c .. c:upper() .. ']' +end) ---@private --- The actual workhorse. @@ -100,17 +104,16 @@ local function request_parser_loop() -- be searching for. -- TODO(ashkan) I'd like to remove this, but it seems permanent :( local buffer_start = buffer:find(header_start_pattern) - local headers = parse_headers(buffer:sub(buffer_start, start-1)) + local headers = parse_headers(buffer:sub(buffer_start, start - 1)) local content_length = headers.content_length -- Use table instead of just string to buffer the message. It prevents -- a ton of strings allocating. -- ref. http://www.lua.org/pil/11.6.html - local body_chunks = {buffer:sub(finish+1)} + local body_chunks = { buffer:sub(finish + 1) } local body_length = #body_chunks[1] -- Keep waiting for data until we have enough. while body_length < content_length do - local chunk = coroutine.yield() - or error("Expected more data for the body. The server may have died.") -- TODO hmm. + local chunk = coroutine.yield() or error('Expected more data for the body. The server may have died.') -- TODO hmm. table.insert(body_chunks, chunk) body_length = body_length + #chunk end @@ -123,25 +126,24 @@ local function request_parser_loop() end local body = table.concat(body_chunks) -- Yield our data. - buffer = rest..(coroutine.yield(headers, body) - or error("Expected more data for the body. The server may have died.")) -- TODO hmm. + buffer = rest + .. (coroutine.yield(headers, body) or error('Expected more data for the body. The server may have died.')) -- TODO hmm. else -- Get more data since we don't have enough. - buffer = buffer..(coroutine.yield() - or error("Expected more data for the header. The server may have died.")) -- TODO hmm. + buffer = buffer .. (coroutine.yield() or error('Expected more data for the header. The server may have died.')) -- TODO hmm. end end end --- Mapping of error codes used by the client local client_errors = { - INVALID_SERVER_MESSAGE = 1; - INVALID_SERVER_JSON = 2; - NO_RESULT_CALLBACK_FOUND = 3; - READ_ERROR = 4; - NOTIFICATION_HANDLER_ERROR = 5; - SERVER_REQUEST_HANDLER_ERROR = 6; - SERVER_RESULT_CALLBACK_ERROR = 7; + INVALID_SERVER_MESSAGE = 1, + INVALID_SERVER_JSON = 2, + NO_RESULT_CALLBACK_FOUND = 3, + READ_ERROR = 4, + NOTIFICATION_HANDLER_ERROR = 5, + SERVER_REQUEST_HANDLER_ERROR = 6, + SERVER_RESULT_CALLBACK_ERROR = 7, } client_errors = vim.tbl_add_reverse_lookup(client_errors) @@ -151,26 +153,26 @@ client_errors = vim.tbl_add_reverse_lookup(client_errors) ---@param err (table) The error object ---@returns (string) The formatted error message local function format_rpc_error(err) - validate { - err = { err, 't' }; - } + validate({ + err = { err, 't' }, + }) -- There is ErrorCodes in the LSP specification, -- but in ResponseError.code it is not used and the actual type is number. local code if protocol.ErrorCodes[err.code] then - code = string.format("code_name = %s,", protocol.ErrorCodes[err.code]) + code = string.format('code_name = %s,', protocol.ErrorCodes[err.code]) else - code = string.format("code_name = unknown, code = %s,", err.code) + code = string.format('code_name = unknown, code = %s,', err.code) end - local message_parts = {"RPC[Error]", code} + local message_parts = { 'RPC[Error]', code } if err.message then - table.insert(message_parts, "message =") - table.insert(message_parts, string.format("%q", err.message)) + table.insert(message_parts, 'message =') + table.insert(message_parts, string.format('%q', err.message)) end if err.data then - table.insert(message_parts, "data =") + table.insert(message_parts, 'data =') table.insert(message_parts, vim.inspect(err.data)) end return table.concat(message_parts, ' ') @@ -185,11 +187,11 @@ local function rpc_response_error(code, message, data) -- TODO should this error or just pick a sane error (like InternalError)? local code_name = assert(protocol.ErrorCodes[code], 'Invalid RPC error code') return setmetatable({ - code = code; - message = message or code_name; - data = data; + code = code, + message = message or code_name, + data = data, }, { - __tostring = format_rpc_error; + __tostring = format_rpc_error, }) end @@ -220,7 +222,7 @@ end ---@param signal (number): Number describing the signal used to terminate (if ---any) function default_dispatchers.on_exit(code, signal) - local _ = log.info() and log.info("client_exit", { code = code, signal = signal }) + local _ = log.info() and log.info('client_exit', { code = code, signal = signal }) end ---@private --- Default dispatcher for client errors. @@ -258,15 +260,15 @@ end --- - {handle} A handle for low-level interaction with the LSP server process --- |vim.loop|. local function start(cmd, cmd_args, dispatchers, extra_spawn_params) - local _ = log.info() and log.info("Starting RPC client", {cmd = cmd, args = cmd_args, extra = extra_spawn_params}) - validate { - cmd = { cmd, 's' }; - cmd_args = { cmd_args, 't' }; - dispatchers = { dispatchers, 't', true }; - } + local _ = log.info() and log.info('Starting RPC client', { cmd = cmd, args = cmd_args, extra = extra_spawn_params }) + validate({ + cmd = { cmd, 's' }, + cmd_args = { cmd_args, 't' }, + dispatchers = { dispatchers, 't', true }, + }) if extra_spawn_params and extra_spawn_params.cwd then - assert(is_dir(extra_spawn_params.cwd), "cwd must be a directory") + assert(is_dir(extra_spawn_params.cwd), 'cwd must be a directory') end if dispatchers then local user_dispatchers = dispatchers @@ -275,11 +277,11 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) local user_dispatcher = user_dispatchers[dispatch_name] if user_dispatcher then if type(user_dispatcher) ~= 'function' then - error(string.format("dispatcher.%s must be a function", dispatch_name)) + error(string.format('dispatcher.%s must be a function', dispatch_name)) end -- server_request is wrapped elsewhere. - if not (dispatch_name == 'server_request' - or dispatch_name == 'on_exit') -- TODO this blocks the loop exiting for some reason. + if + not (dispatch_name == 'server_request' or dispatch_name == 'on_exit') -- TODO this blocks the loop exiting for some reason. then user_dispatcher = schedule_wrap(user_dispatcher) end @@ -317,9 +319,9 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) dispatchers.on_exit(code, signal) end local spawn_params = { - args = cmd_args; - stdio = {stdin, stdout, stderr}; - detached = true; + args = cmd_args, + stdio = { stdin, stdout, stderr }, + detached = true, } if extra_spawn_params then spawn_params.cwd = extra_spawn_params.cwd @@ -330,11 +332,11 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) end handle, pid = uv.spawn(cmd, spawn_params, onexit) if handle == nil then - local msg = string.format("Spawning language server with cmd: `%s` failed", cmd) - if string.match(pid, "ENOENT") then - msg = msg .. ". The language server is either not installed, missing from PATH, or not executable." + local msg = string.format('Spawning language server with cmd: `%s` failed', cmd) + if string.match(pid, 'ENOENT') then + msg = msg .. '. The language server is either not installed, missing from PATH, or not executable.' else - msg = msg .. string.format(" with error message: %s", pid) + msg = msg .. string.format(' with error message: %s', pid) end vim.notify(msg, vim.log.levels.WARN) return @@ -348,8 +350,10 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) ---@param payload table ---@returns true if the payload could be scheduled, false if the main event-loop is in the process of closing. local function encode_and_send(payload) - local _ = log.debug() and log.debug("rpc.send", payload) - if handle == nil or handle:is_closing() then return false end + local _ = log.debug() and log.debug('rpc.send', payload) + if handle == nil or handle:is_closing() then + return false + end local encoded = vim.json.encode(payload) stdin:write(format_message_with_content_length(encoded)) return true @@ -363,22 +367,22 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) ---@param params (table): Parameters for the invoked LSP method ---@returns (bool) `true` if notification could be sent, `false` if not local function notify(method, params) - return encode_and_send { - jsonrpc = "2.0"; - method = method; - params = params; - } + return encode_and_send({ + jsonrpc = '2.0', + method = method, + params = params, + }) end ---@private --- sends an error object to the remote LSP process. local function send_response(request_id, err, result) - return encode_and_send { - id = request_id; - jsonrpc = "2.0"; - error = err; - result = result; - } + return encode_and_send({ + id = request_id, + jsonrpc = '2.0', + error = err, + result = result, + }) end -- FIXME: DOC: Should be placed on the RPC client object returned by @@ -392,18 +396,18 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) ---@param notify_reply_callback (function|nil) Callback to invoke as soon as a request is no longer pending ---@returns (bool, number) `(true, message_id)` if request could be sent, `false` if not local function request(method, params, callback, notify_reply_callback) - validate { - callback = { callback, 'f' }; - notify_reply_callback = { notify_reply_callback, 'f', true }; - } + validate({ + callback = { callback, 'f' }, + notify_reply_callback = { notify_reply_callback, 'f', true }, + }) message_index = message_index + 1 local message_id = message_index - local result = encode_and_send { - id = message_id; - jsonrpc = "2.0"; - method = method; - params = params; - } + local result = encode_and_send({ + id = message_id, + jsonrpc = '2.0', + method = method, + params = params, + }) if result then if message_callbacks then message_callbacks[message_id] = schedule_wrap(callback) @@ -421,7 +425,7 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) stderr:read_start(function(_err, chunk) if chunk then - local _ = log.error() and log.error("rpc", cmd, "stderr", chunk) + local _ = log.error() and log.error('rpc', cmd, 'stderr', chunk) end end) @@ -455,7 +459,7 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) on_error(client_errors.INVALID_SERVER_JSON, decoded) return end - local _ = log.debug() and log.debug("rpc.receive", decoded) + local _ = log.debug() and log.debug('rpc.receive', decoded) if type(decoded.method) == 'string' and decoded.id then local err @@ -463,17 +467,30 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) -- we can still use the result. schedule(function() local status, result - status, result, err = try_call(client_errors.SERVER_REQUEST_HANDLER_ERROR, - dispatchers.server_request, decoded.method, decoded.params) - local _ = log.debug() and log.debug("server_request: callback result", { status = status, result = result, err = err }) + status, result, err = try_call( + client_errors.SERVER_REQUEST_HANDLER_ERROR, + dispatchers.server_request, + decoded.method, + decoded.params + ) + local _ = log.debug() + and log.debug('server_request: callback result', { status = status, result = result, err = err }) if status then if not (result or err) then -- TODO this can be a problem if `null` is sent for result. needs vim.NIL - error(string.format("method %q: either a result or an error must be sent to the server in response", decoded.method)) + error( + string.format( + 'method %q: either a result or an error must be sent to the server in response', + decoded.method + ) + ) end if err then - assert(type(err) == 'table', "err must be a table. Use rpc_response_error to help format errors.") - local code_name = assert(protocol.ErrorCodes[err.code], "Errors must use protocol.ErrorCodes. Use rpc_response_error to help format errors.") + assert(type(err) == 'table', 'err must be a table. Use rpc_response_error to help format errors.') + local code_name = assert( + protocol.ErrorCodes[err.code], + 'Errors must use protocol.ErrorCodes. Use rpc_response_error to help format errors.' + ) err.message = err.message or code_name end else @@ -483,18 +500,17 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) end send_response(decoded.id, err, result) end) - -- This works because we are expecting vim.NIL here + -- This works because we are expecting vim.NIL here elseif decoded.id and (decoded.result ~= vim.NIL or decoded.error ~= vim.NIL) then - -- We sent a number, so we expect a number. local result_id = tonumber(decoded.id) -- Notify the user that a response was received for the request local notify_reply_callback = notify_reply_callbacks and notify_reply_callbacks[result_id] if notify_reply_callback then - validate { - notify_reply_callback = { notify_reply_callback, 'f' }; - } + validate({ + notify_reply_callback = { notify_reply_callback, 'f' }, + }) notify_reply_callback(result_id) notify_reply_callbacks[result_id] = nil end @@ -503,7 +519,7 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) if decoded.error then local mute_error = false if decoded.error.code == protocol.ErrorCodes.RequestCancelled then - local _ = log.debug() and log.debug("Received cancellation ack", decoded) + local _ = log.debug() and log.debug('Received cancellation ack', decoded) mute_error = true end @@ -523,24 +539,22 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) local callback = message_callbacks and message_callbacks[result_id] if callback then message_callbacks[result_id] = nil - validate { - callback = { callback, 'f' }; - } + validate({ + callback = { callback, 'f' }, + }) if decoded.error then decoded.error = setmetatable(decoded.error, { - __tostring = format_rpc_error; + __tostring = format_rpc_error, }) end - try_call(client_errors.SERVER_RESULT_CALLBACK_ERROR, - callback, decoded.error, decoded.result) + try_call(client_errors.SERVER_RESULT_CALLBACK_ERROR, callback, decoded.error, decoded.result) else on_error(client_errors.NO_RESULT_CALLBACK_FOUND, decoded) - local _ = log.error() and log.error("No callback found for server response id "..result_id) + local _ = log.error() and log.error('No callback found for server response id ' .. result_id) end elseif type(decoded.method) == 'string' then -- Notification - try_call(client_errors.NOTIFICATION_HANDLER_ERROR, - dispatchers.notification, decoded.method, decoded.params) + try_call(client_errors.NOTIFICATION_HANDLER_ERROR, dispatchers.notification, decoded.method, decoded.params) else -- Invalid server message on_error(client_errors.INVALID_SERVER_MESSAGE, decoded) @@ -556,7 +570,9 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) return end -- This should signal that we are done reading from the client. - if not chunk then return end + if not chunk then + return + end -- Flush anything in the parser by looping until we don't get a result -- anymore. while true do @@ -574,17 +590,17 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) end) return { - pid = pid; - handle = handle; - request = request; - notify = notify + pid = pid, + handle = handle, + request = request, + notify = notify, } end return { - start = start; - rpc_response_error = rpc_response_error; - format_rpc_error = format_rpc_error; - client_errors = client_errors; + start = start, + rpc_response_error = rpc_response_error, + format_rpc_error = format_rpc_error, + client_errors = client_errors, } -- vim:sw=2 ts=2 et diff --git a/runtime/lua/vim/lsp/sync.lua b/runtime/lua/vim/lsp/sync.lua index 9955fff3e2..73b4e0025a 100644 --- a/runtime/lua/vim/lsp/sync.lua +++ b/runtime/lua/vim/lsp/sync.lua @@ -79,7 +79,7 @@ local function compute_line_length(line, offset_encoding) local length local _ if offset_encoding == 'utf-16' then - _, length = str_utfindex(line) + _, length = str_utfindex(line) elseif offset_encoding == 'utf-32' then length, _ = str_utfindex(line) else @@ -100,7 +100,7 @@ local function align_end_position(line, byte, offset_encoding) -- If on the first byte, or an empty string: the trivial case if byte == 1 or #line == 0 then char = byte - -- Called in the case of extending an empty line "" -> "a" + -- Called in the case of extending an empty line "" -> "a" elseif byte == #line + 1 then char = compute_line_length(line, offset_encoding) + 1 else @@ -175,12 +175,12 @@ local function compute_start_range(prev_lines, curr_lines, firstline, lastline, end -- Convert byte to codepoint if applicable - if start_byte_idx == 1 or (#prev_line == 0 and start_byte_idx == 1)then + if start_byte_idx == 1 or (#prev_line == 0 and start_byte_idx == 1) then byte_idx = start_byte_idx char_idx = 1 elseif start_byte_idx == #prev_line + 1 then byte_idx = start_byte_idx - char_idx = compute_line_length(prev_line, offset_encoding) + 1 + char_idx = compute_line_length(prev_line, offset_encoding) + 1 else byte_idx = start_byte_idx + str_utf_start(prev_line, start_byte_idx) char_idx = byte_to_utf(prev_line, byte_idx, offset_encoding) @@ -203,14 +203,30 @@ end ---@param new_lastline integer ---@param offset_encoding string ---@returns (int, int) end_line_idx and end_col_idx of range -local function compute_end_range(prev_lines, curr_lines, start_range, firstline, lastline, new_lastline, offset_encoding) +local function compute_end_range( + prev_lines, + curr_lines, + start_range, + firstline, + lastline, + new_lastline, + offset_encoding +) -- If firstline == new_lastline, the first change occurred on a line that was deleted. -- In this case, the last_byte... if firstline == new_lastline then - return { line_idx = (lastline - new_lastline + firstline), byte_idx = 1, char_idx = 1 }, { line_idx = firstline, byte_idx = 1, char_idx = 1 } + return { line_idx = (lastline - new_lastline + firstline), byte_idx = 1, char_idx = 1 }, { + line_idx = firstline, + byte_idx = 1, + char_idx = 1, + } end if firstline == lastline then - return { line_idx = firstline, byte_idx = 1, char_idx = 1 }, { line_idx = new_lastline - lastline + firstline, byte_idx = 1, char_idx = 1 } + return { line_idx = firstline, byte_idx = 1, char_idx = 1 }, { + line_idx = new_lastline - lastline + firstline, + byte_idx = 1, + char_idx = 1, + } end -- Compare on last line, at minimum will be the start range local start_line_idx = start_range.line_idx @@ -239,9 +255,7 @@ local function compute_end_range(prev_lines, curr_lines, start_range, firstline, end for idx = 0, max_length do byte_offset = idx - if - str_byte(prev_line, prev_line_length - byte_offset) ~= str_byte(curr_line, curr_line_length - byte_offset) - then + if str_byte(prev_line, prev_line_length - byte_offset) ~= str_byte(curr_line, curr_line_length - byte_offset) then break end end @@ -281,14 +295,13 @@ end ---@param end_range table new_end_range returned by last_difference ---@returns string text extracted from defined region local function extract_text(lines, start_range, end_range, line_ending) - if not lines[start_range.line_idx] then - return "" - end + if not lines[start_range.line_idx] then + return '' + end -- Trivial case: start and end range are the same line, directly grab changed text if start_range.line_idx == end_range.line_idx then -- string.sub is inclusive, end_range is not return string.sub(lines[start_range.line_idx], start_range.byte_idx, end_range.byte_idx - 1) - else -- Handle deletion case -- Collect the changed portion of the first changed line @@ -303,7 +316,7 @@ local function extract_text(lines, start_range, end_range, line_ending) -- Collect the changed portion of the last changed line. table.insert(result, string.sub(lines[end_range.line_idx], 1, end_range.byte_idx - 1)) else - table.insert(result, "") + table.insert(result, '') end -- Add line ending between all lines diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua index bb87e8372b..0b0d48d15e 100644 --- a/runtime/lua/vim/lsp/util.lua +++ b/runtime/lua/vim/lsp/util.lua @@ -1,10 +1,10 @@ -local protocol = require 'vim.lsp.protocol' -local snippet = require 'vim.lsp._snippet' +local protocol = require('vim.lsp.protocol') +local snippet = require('vim.lsp._snippet') local vim = vim local validate = vim.validate local api = vim.api local list_extend = vim.list_extend -local highlight = require 'vim.highlight' +local highlight = require('vim.highlight') local uv = vim.loop local npcall = vim.F.npcall @@ -13,14 +13,14 @@ local split = vim.split local M = {} local default_border = { - {"", "NormalFloat"}, - {"", "NormalFloat"}, - {"", "NormalFloat"}, - {" ", "NormalFloat"}, - {"", "NormalFloat"}, - {"", "NormalFloat"}, - {"", "NormalFloat"}, - {" ", "NormalFloat"}, + { '', 'NormalFloat' }, + { '', 'NormalFloat' }, + { '', 'NormalFloat' }, + { ' ', 'NormalFloat' }, + { '', 'NormalFloat' }, + { '', 'NormalFloat' }, + { '', 'NormalFloat' }, + { ' ', 'NormalFloat' }, } ---@private @@ -35,43 +35,50 @@ local function get_border_size(opts) local width = 0 if type(border) == 'string' then - local border_size = {none = {0, 0}, single = {2, 2}, double = {2, 2}, rounded = {2, 2}, solid = {2, 2}, shadow = {1, 1}} + local border_size = { + none = { 0, 0 }, + single = { 2, 2 }, + double = { 2, 2 }, + rounded = { 2, 2 }, + solid = { 2, 2 }, + shadow = { 1, 1 }, + } if border_size[border] == nil then - error(string.format("invalid floating preview border: %s. :help vim.api.nvim_open_win()", vim.inspect(border))) + error(string.format('invalid floating preview border: %s. :help vim.api.nvim_open_win()', vim.inspect(border))) end height, width = unpack(border_size[border]) else if 8 % #border ~= 0 then - error(string.format("invalid floating preview border: %s. :help vim.api.nvim_open_win()", vim.inspect(border))) + error(string.format('invalid floating preview border: %s. :help vim.api.nvim_open_win()', vim.inspect(border))) end ---@private local function border_width(id) id = (id - 1) % #border + 1 - if type(border[id]) == "table" then + if type(border[id]) == 'table' then -- border specified as a table of <character, highlight group> return vim.fn.strdisplaywidth(border[id][1]) - elseif type(border[id]) == "string" then + elseif type(border[id]) == 'string' then -- border specified as a list of border characters return vim.fn.strdisplaywidth(border[id]) end - error(string.format("invalid floating preview border: %s. :help vim.api.nvim_open_win()", vim.inspect(border))) + error(string.format('invalid floating preview border: %s. :help vim.api.nvim_open_win()', vim.inspect(border))) end ---@private local function border_height(id) id = (id - 1) % #border + 1 - if type(border[id]) == "table" then + if type(border[id]) == 'table' then -- border specified as a table of <character, highlight group> return #border[id][1] > 0 and 1 or 0 - elseif type(border[id]) == "string" then + elseif type(border[id]) == 'string' then -- border specified as a list of border characters return #border[id] > 0 and 1 or 0 end - error(string.format("invalid floating preview border: %s. :help vim.api.nvim_open_win()", vim.inspect(border))) + error(string.format('invalid floating preview border: %s. :help vim.api.nvim_open_win()', vim.inspect(border))) end - height = height + border_height(2) -- top - height = height + border_height(6) -- bottom - width = width + border_width(4) -- right - width = width + border_width(8) -- left + height = height + border_height(2) -- top + height = height + border_height(6) -- bottom + width = width + border_width(4) -- right + width = width + border_width(8) -- left end return { height = height, width = width } @@ -89,9 +96,15 @@ end ---@param encoding string utf-8|utf-16|utf-32|nil defaults to utf-16 ---@return number `encoding` index of `index` in `line` function M._str_utfindex_enc(line, index, encoding) - if not encoding then encoding = 'utf-16' end + if not encoding then + encoding = 'utf-16' + end if encoding == 'utf-8' then - if index then return index else return #line end + if index then + return index + else + return #line + end elseif encoding == 'utf-16' then local _, col16 = vim.str_utfindex(line, index) return col16 @@ -99,7 +112,7 @@ function M._str_utfindex_enc(line, index, encoding) local col32, _ = vim.str_utfindex(line, index) return col32 else - error("Invalid encoding: " .. vim.inspect(encoding)) + error('Invalid encoding: ' .. vim.inspect(encoding)) end end @@ -111,15 +124,21 @@ end ---@param encoding string utf-8|utf-16|utf-32|nil defaults to utf-16 ---@return number byte (utf-8) index of `encoding` index `index` in `line` function M._str_byteindex_enc(line, index, encoding) - if not encoding then encoding = 'utf-16' end + if not encoding then + encoding = 'utf-16' + end if encoding == 'utf-8' then - if index then return index else return #line end + if index then + return index + else + return #line + end elseif encoding == 'utf-16' then return vim.str_byteindex(line, index, true) elseif encoding == 'utf-32' then return vim.str_byteindex(line, index) else - error("Invalid encoding: " .. vim.inspect(encoding)) + error('Invalid encoding: ' .. vim.inspect(encoding)) end end @@ -142,34 +161,38 @@ function M.set_lines(lines, A, B, new_lines) -- specifying a line number after what we would call the last line. local i_n = math.min(B[1] + 1, #lines) if not (i_0 >= 1 and i_0 <= #lines + 1 and i_n >= 1 and i_n <= #lines) then - error("Invalid range: "..vim.inspect{A = A; B = B; #lines, new_lines}) + error('Invalid range: ' .. vim.inspect({ A = A, B = B, #lines, new_lines })) end - local prefix = "" - local suffix = lines[i_n]:sub(B[2]+1) + local prefix = '' + local suffix = lines[i_n]:sub(B[2] + 1) if A[2] > 0 then prefix = lines[i_0]:sub(1, A[2]) end local n = i_n - i_0 + 1 if n ~= #new_lines then - for _ = 1, n - #new_lines do table.remove(lines, i_0) end - for _ = 1, #new_lines - n do table.insert(lines, i_0, '') end + for _ = 1, n - #new_lines do + table.remove(lines, i_0) + end + for _ = 1, #new_lines - n do + table.insert(lines, i_0, '') + end end for i = 1, #new_lines do lines[i - 1 + i_0] = new_lines[i] end if #suffix > 0 then local i = i_0 + #new_lines - 1 - lines[i] = lines[i]..suffix + lines[i] = lines[i] .. suffix end if #prefix > 0 then - lines[i_0] = prefix..lines[i_0] + lines[i_0] = prefix .. lines[i_0] end return lines end ---@private local function sort_by_key(fn) - return function(a,b) + return function(a, b) local ka, kb = fn(a), fn(b) assert(#ka == #kb) for i = 1, #ka do @@ -191,7 +214,7 @@ end ---@param rows number[] zero-indexed line numbers ---@return table<number string> a table mapping rows to lines local function get_lines(bufnr, rows) - rows = type(rows) == "table" and rows or { rows } + rows = type(rows) == 'table' and rows or { rows } -- This is needed for bufload and bufloaded if bufnr == 0 then @@ -202,7 +225,7 @@ local function get_lines(bufnr, rows) local function buf_lines() local lines = {} for _, row in pairs(rows) do - lines[row] = (vim.api.nvim_buf_get_lines(bufnr, row, row + 1, false) or { "" })[1] + lines[row] = (vim.api.nvim_buf_get_lines(bufnr, row, row + 1, false) or { '' })[1] end return lines end @@ -211,7 +234,7 @@ local function get_lines(bufnr, rows) -- load the buffer if this is not a file uri -- Custom language server protocol extensions can result in servers sending URIs with custom schemes. Plugins are able to load these via `BufReadCmd` autocmds. - if uri:sub(1, 4) ~= "file" then + if uri:sub(1, 4) ~= 'file' then vim.fn.bufload(bufnr) return buf_lines() end @@ -224,8 +247,10 @@ local function get_lines(bufnr, rows) local filename = api.nvim_buf_get_name(bufnr) -- get the data from the file - local fd = uv.fs_open(filename, "r", 438) - if not fd then return "" end + local fd = uv.fs_open(filename, 'r', 438) + if not fd then + return '' + end local stat = uv.fs_fstat(fd) local data = uv.fs_read(fd, stat.size, 0) uv.fs_close(fd) @@ -242,11 +267,13 @@ local function get_lines(bufnr, rows) local found = 0 local lnum = 0 - for line in string.gmatch(data, "([^\n]*)\n?") do + for line in string.gmatch(data, '([^\n]*)\n?') do if lines[lnum] == true then lines[lnum] = line found = found + 1 - if found == need then break end + if found == need then + break + end end lnum = lnum + 1 end @@ -254,13 +281,12 @@ local function get_lines(bufnr, rows) -- change any lines we didn't find to the empty string for i, line in pairs(lines) do if line == true then - lines[i] = "" + lines[i] = '' end end return lines end - ---@private --- Gets the zero-indexed line from the given buffer. --- Works on unloaded buffers by reading the file using libuv to bypass buf reading events. @@ -273,7 +299,6 @@ local function get_line(bufnr, row) return get_lines(bufnr, { row })[row] end - ---@private --- Position is a https://microsoft.github.io/language-server-protocol/specifications/specification-current/#position --- Returns a zero-indexed column, since set_lines() does the conversion to @@ -300,30 +325,27 @@ end --- Process and return progress reports from lsp server ---@private function M.get_progress_messages() - local new_messages = {} local progress_remove = {} for _, client in ipairs(vim.lsp.get_active_clients()) do - local messages = client.messages - local data = messages - for token, ctx in pairs(data.progress) do - - local new_report = { - name = data.name, - title = ctx.title or "empty title", - message = ctx.message, - percentage = ctx.percentage, - done = ctx.done, - progress = true, - } - table.insert(new_messages, new_report) + local messages = client.messages + local data = messages + for token, ctx in pairs(data.progress) do + local new_report = { + name = data.name, + title = ctx.title or 'empty title', + message = ctx.message, + percentage = ctx.percentage, + done = ctx.done, + progress = true, + } + table.insert(new_messages, new_report) - if ctx.done then - table.insert(progress_remove, {client = client, token = token}) - end + if ctx.done then + table.insert(progress_remove, { client = client, token = token }) end - + end end for _, item in ipairs(progress_remove) do @@ -339,12 +361,14 @@ end ---@param offset_encoding string utf-8|utf-16|utf-32 ---@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textEdit function M.apply_text_edits(text_edits, bufnr, offset_encoding) - validate { - text_edits = { text_edits, 't', false }; - bufnr = { bufnr, 'number', false }; - offset_encoding = { offset_encoding, 'string', false }; - } - if not next(text_edits) then return end + validate({ + text_edits = { text_edits, 't', false }, + bufnr = { bufnr, 'number', false }, + offset_encoding = { offset_encoding, 'string', false }, + }) + if not next(text_edits) then + return + end if not api.nvim_buf_is_loaded(bufnr) then vim.fn.bufload(bufnr) end @@ -356,7 +380,11 @@ function M.apply_text_edits(text_edits, bufnr, offset_encoding) index = index + 1 text_edit._index = index - if text_edit.range.start.line > text_edit.range['end'].line or text_edit.range.start.line == text_edit.range['end'].line and text_edit.range.start.character > text_edit.range['end'].character then + if + text_edit.range.start.line > text_edit.range['end'].line + or text_edit.range.start.line == text_edit.range['end'].line + and text_edit.range.start.character > text_edit.range['end'].character + then local start = text_edit.range.start text_edit.range.start = text_edit.range['end'] text_edit.range['end'] = start @@ -406,7 +434,7 @@ function M.apply_text_edits(text_edits, bufnr, offset_encoding) start_row = text_edit.range.start.line, start_col = get_line_byte_from_position(bufnr, text_edit.range.start, offset_encoding), end_row = text_edit.range['end'].line, - end_col = get_line_byte_from_position(bufnr, text_edit.range['end'], offset_encoding), + end_col = get_line_byte_from_position(bufnr, text_edit.range['end'], offset_encoding), text = vim.split(text_edit.newText, '\n', true), } @@ -456,7 +484,11 @@ function M.apply_text_edits(text_edits, bufnr, offset_encoding) -- Remove final line if needed local fix_eol = has_eol_text_edit - fix_eol = fix_eol and (api.nvim_buf_get_option(bufnr, 'eol') or (api.nvim_buf_get_option(bufnr, 'fixeol') and not api.nvim_buf_get_option(bufnr, 'binary'))) + fix_eol = fix_eol + and ( + api.nvim_buf_get_option(bufnr, 'eol') + or (api.nvim_buf_get_option(bufnr, 'fixeol') and not api.nvim_buf_get_option(bufnr, 'binary')) + ) fix_eol = fix_eol and get_line(bufnr, max - 1) == '' if fix_eol then vim.api.nvim_buf_set_lines(bufnr, -2, -1, false, {}) @@ -499,7 +531,7 @@ function M.apply_text_document_edit(text_document_edit, index, offset_encoding) local text_document = text_document_edit.textDocument local bufnr = vim.uri_to_bufnr(text_document.uri) if offset_encoding == nil then - vim.notify_once("apply_text_document_edit must be called with valid offset encoding", vim.log.levels.WARN) + vim.notify_once('apply_text_document_edit must be called with valid offset encoding', vim.log.levels.WARN) end -- For lists of text document edits, @@ -511,11 +543,16 @@ function M.apply_text_document_edit(text_document_edit, index, offset_encoding) -- `VersionedTextDocumentIdentifier`s version may be null -- https://microsoft.github.io/language-server-protocol/specification#versionedTextDocumentIdentifier - if should_check_version and (text_document.version + if + should_check_version + and ( + text_document.version and text_document.version > 0 and M.buf_versions[bufnr] - and M.buf_versions[bufnr] > text_document.version) then - print("Buffer ", text_document.uri, " newer than edits.") + and M.buf_versions[bufnr] > text_document.version + ) + then + print('Buffer ', text_document.uri, ' newer than edits.') return end @@ -551,16 +588,16 @@ end --- precedence is as follows: textEdit.newText > insertText > label --see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_completion local function get_completion_word(item) - if item.textEdit ~= nil and item.textEdit.newText ~= nil and item.textEdit.newText ~= "" then + if item.textEdit ~= nil and item.textEdit.newText ~= nil and item.textEdit.newText ~= '' then local insert_text_format = protocol.InsertTextFormat[item.insertTextFormat] - if insert_text_format == "PlainText" or insert_text_format == nil then + if insert_text_format == 'PlainText' or insert_text_format == nil then return item.textEdit.newText else return M.parse_snippet(item.textEdit.newText) end - elseif item.insertText ~= nil and item.insertText ~= "" then + elseif item.insertText ~= nil and item.insertText ~= '' then local insert_text_format = protocol.InsertTextFormat[item.insertTextFormat] - if insert_text_format == "PlainText" or insert_text_format == nil then + if insert_text_format == 'PlainText' or insert_text_format == nil then return item.insertText else return M.parse_snippet(item.insertText) @@ -588,7 +625,7 @@ end ---@returns (`vim.lsp.protocol.completionItemKind`) ---@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_completion function M._get_completion_item_kind_name(completion_item_kind) - return protocol.CompletionItemKind[completion_item_kind] or "Unknown" + return protocol.CompletionItemKind[completion_item_kind] or 'Unknown' end --- Turns the result of a `textDocument/completion` request into vim-compatible @@ -619,7 +656,7 @@ function M.text_document_completion_list_to_complete_items(result, prefix) info = documentation elseif type(documentation) == 'table' and type(documentation.value) == 'string' then info = documentation.value - -- else + -- else -- TODO(ashkan) Validation handling here? end end @@ -637,9 +674,9 @@ function M.text_document_completion_list_to_complete_items(result, prefix) user_data = { nvim = { lsp = { - completion_item = completion_item - } - } + completion_item = completion_item, + }, + }, }, }) end @@ -647,6 +684,15 @@ function M.text_document_completion_list_to_complete_items(result, prefix) return matches end +---@private +--- Like vim.fn.bufwinid except it works across tabpages. +local function bufwinid(bufnr) + for _, win in ipairs(api.nvim_list_wins()) do + if api.nvim_win_get_buf(win) == bufnr then + return win + end + end +end --- Rename old_fname to new_fname --- @@ -672,10 +718,9 @@ function M.rename(old_fname, new_fname, opts) assert(ok, err) local newbuf = vim.fn.bufadd(new_fname) - for _, win in pairs(api.nvim_list_wins()) do - if api.nvim_win_get_buf(win) == oldbuf then - api.nvim_win_set_buf(win, newbuf) - end + local win = bufwinid(oldbuf) + if win then + api.nvim_win_set_buf(win, newbuf) end api.nvim_buf_delete(oldbuf, { force = true }) end @@ -700,7 +745,7 @@ local function delete_file(change) if opts.ignoreIfNotExists and not stat then return end - assert(stat, "Cannot delete not existing file or folder " .. fname) + assert(stat, 'Cannot delete not existing file or folder ' .. fname) local flags if stat and stat.type == 'directory' then flags = opts.recursive and 'rf' or 'd' @@ -713,7 +758,6 @@ local function delete_file(change) api.nvim_buf_delete(bufnr, { force = true }) end - --- Applies a `WorkspaceEdit`. --- ---@param workspace_edit table `WorkspaceEdit` @@ -721,22 +765,18 @@ end --see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_applyEdit function M.apply_workspace_edit(workspace_edit, offset_encoding) if offset_encoding == nil then - vim.notify_once("apply_workspace_edit must be called with valid offset encoding", vim.log.levels.WARN) + vim.notify_once('apply_workspace_edit must be called with valid offset encoding', vim.log.levels.WARN) end if workspace_edit.documentChanges then for idx, change in ipairs(workspace_edit.documentChanges) do - if change.kind == "rename" then - M.rename( - vim.uri_to_fname(change.oldUri), - vim.uri_to_fname(change.newUri), - change.options - ) + if change.kind == 'rename' then + M.rename(vim.uri_to_fname(change.oldUri), vim.uri_to_fname(change.newUri), change.options) elseif change.kind == 'create' then create_file(change) elseif change.kind == 'delete' then delete_file(change) elseif change.kind then - error(string.format("Unsupported change: %q", vim.inspect(change))) + error(string.format('Unsupported change: %q', vim.inspect(change))) else M.apply_text_document_edit(change, idx, offset_encoding) end @@ -770,7 +810,7 @@ function M.convert_input_to_markdown_lines(input, contents) if type(input) == 'string' then list_extend(contents, split_lines(input)) else - assert(type(input) == 'table', "Expected a table for Hover.contents") + assert(type(input) == 'table', 'Expected a table for Hover.contents') -- MarkupContent if input.kind then -- The kind can be either plaintext or markdown. @@ -779,22 +819,22 @@ function M.convert_input_to_markdown_lines(input, contents) -- Some servers send input.value as empty, so let's ignore this :( local value = input.value or '' - if input.kind == "plaintext" then + if input.kind == 'plaintext' then -- wrap this in a <text></text> block so that stylize_markdown -- can properly process it as plaintext - value = string.format("<text>\n%s\n</text>", value) + value = string.format('<text>\n%s\n</text>', value) end -- assert(type(value) == 'string') list_extend(contents, split_lines(value)) - -- MarkupString variation 2 + -- MarkupString variation 2 elseif input.language then -- Some servers send input.value as empty, so let's ignore this :( -- assert(type(input.value) == 'string') - table.insert(contents, "```"..input.language) + table.insert(contents, '```' .. input.language) list_extend(contents, split_lines(input.value or '')) - table.insert(contents, "```") - -- By deduction, this must be MarkedString[] + table.insert(contents, '```') + -- By deduction, this must be MarkedString[] else -- Use our existing logic to handle MarkedString for _, marked_string in ipairs(input) do @@ -838,7 +878,7 @@ function M.convert_signature_help_to_markdown_lines(signature_help, ft, triggers local label = signature.label if ft then -- wrap inside a code block so stylize_markdown can render it properly - label = ("```%s\n%s\n```"):format(ft, label) + label = ('```%s\n%s\n```'):format(ft, label) end vim.list_extend(contents, vim.split(label, '\n', true)) if signature.documentation then @@ -846,8 +886,8 @@ function M.convert_signature_help_to_markdown_lines(signature_help, ft, triggers end if signature.parameters and #signature.parameters > 0 then local active_parameter = (signature.activeParameter or signature_help.activeParameter or 0) - if active_parameter < 0 - then active_parameter = 0 + if active_parameter < 0 then + active_parameter = 0 end -- If the activeParameter is > #parameters, then set it to the last @@ -877,7 +917,7 @@ function M.convert_signature_help_to_markdown_lines(signature_help, ft, triggers } --]=] if parameter.label then - if type(parameter.label) == "table" then + if type(parameter.label) == 'table' then active_hl = parameter.label else local offset = 1 @@ -890,9 +930,11 @@ function M.convert_signature_help_to_markdown_lines(signature_help, ft, triggers end for p, param in pairs(signature.parameters) do offset = signature.label:find(param.label, offset, true) - if not offset then break end + if not offset then + break + end if p == active_parameter + 1 then - active_hl = {offset - 1, offset + #parameter.label - 1} + active_hl = { offset - 1, offset + #parameter.label - 1 } break end offset = offset + #param.label + 1 @@ -920,14 +962,14 @@ end --- - zindex (string or table) override `zindex`, defaults to 50 ---@returns (table) Options function M.make_floating_popup_options(width, height, opts) - validate { - opts = { opts, 't', true }; - } + validate({ + opts = { opts, 't', true }, + }) opts = opts or {} - validate { - ["opts.offset_x"] = { opts.offset_x, 'n', true }; - ["opts.offset_y"] = { opts.offset_y, 'n', true }; - } + validate({ + ['opts.offset_x'] = { opts.offset_x, 'n', true }, + ['opts.offset_y'] = { opts.offset_y, 'n', true }, + }) local anchor = '' local row, col @@ -936,20 +978,20 @@ function M.make_floating_popup_options(width, height, opts) local lines_below = vim.fn.winheight(0) - lines_above if lines_above < lines_below then - anchor = anchor..'N' + anchor = anchor .. 'N' height = math.min(lines_below, height) row = 1 else - anchor = anchor..'S' + anchor = anchor .. 'S' height = math.min(lines_above, height) row = 0 end if vim.fn.wincol() + width + (opts.offset_x or 0) <= api.nvim_get_option('columns') then - anchor = anchor..'W' + anchor = anchor .. 'W' col = 0 else - anchor = anchor..'E' + anchor = anchor .. 'E' col = 1 end @@ -971,32 +1013,40 @@ end --- ---@param location table (`Location`|`LocationLink`) ---@param offset_encoding string utf-8|utf-16|utf-32 (required) +---@param reuse_win boolean Jump to existing window if buffer is already opened. ---@returns `true` if the jump succeeded -function M.jump_to_location(location, offset_encoding) +function M.jump_to_location(location, offset_encoding, reuse_win) -- location may be Location or LocationLink local uri = location.uri or location.targetUri - if uri == nil then return end + if uri == nil then + return + end if offset_encoding == nil then - vim.notify_once("jump_to_location must be called with valid offset encoding", vim.log.levels.WARN) + vim.notify_once('jump_to_location must be called with valid offset encoding', vim.log.levels.WARN) end local bufnr = vim.uri_to_bufnr(uri) -- Save position in jumplist - vim.cmd "normal! m'" + vim.cmd("normal! m'") -- Push a new item into tagstack - local from = {vim.fn.bufnr('%'), vim.fn.line('.'), vim.fn.col('.'), 0} - local items = {{tagname=vim.fn.expand('<cword>'), from=from}} - vim.fn.settagstack(vim.fn.win_getid(), {items=items}, 't') + local from = { vim.fn.bufnr('%'), vim.fn.line('.'), vim.fn.col('.'), 0 } + local items = { { tagname = vim.fn.expand('<cword>'), from = from } } + vim.fn.settagstack(vim.fn.win_getid(), { items = items }, 't') --- Jump to new location (adjusting for UTF-16 encoding of characters) - api.nvim_set_current_buf(bufnr) - api.nvim_buf_set_option(bufnr, 'buflisted', true) + local win = reuse_win and bufwinid(bufnr) + if win then + api.nvim_set_current_win(win) + else + api.nvim_set_current_buf(bufnr) + api.nvim_buf_set_option(bufnr, 'buflisted', true) + end local range = location.range or location.targetSelectionRange local row = range.start.line local col = get_line_byte_from_position(bufnr, range.start, offset_encoding) - api.nvim_win_set_cursor(0, {row + 1, col}) + api.nvim_win_set_cursor(0, { row + 1, col }) -- Open folds under the cursor - vim.cmd("normal! zv") + vim.cmd('normal! zv') return true end @@ -1011,22 +1061,24 @@ end function M.preview_location(location, opts) -- location may be LocationLink or Location (more useful for the former) local uri = location.targetUri or location.uri - if uri == nil then return end + if uri == nil then + return + end local bufnr = vim.uri_to_bufnr(uri) if not api.nvim_buf_is_loaded(bufnr) then vim.fn.bufload(bufnr) end local range = location.targetRange or location.range - local contents = api.nvim_buf_get_lines(bufnr, range.start.line, range["end"].line+1, false) + local contents = api.nvim_buf_get_lines(bufnr, range.start.line, range['end'].line + 1, false) local syntax = api.nvim_buf_get_option(bufnr, 'syntax') - if syntax == "" then + if syntax == '' then -- When no syntax is set, we use filetype as fallback. This might not result -- in a valid syntax definition. See also ft detection in stylize_markdown. -- An empty syntax is more common now with TreeSitter, since TS disables syntax. syntax = api.nvim_buf_get_option(bufnr, 'filetype') end opts = opts or {} - opts.focus_id = "location" + opts.focus_id = 'location' return M.open_floating_preview(contents, syntax, opts) end @@ -1047,20 +1099,20 @@ end --- - pad_bottom number of lines to pad contents at bottom (default 0) ---@return contents table of trimmed and padded lines function M._trim(contents, opts) - validate { - contents = { contents, 't' }; - opts = { opts, 't', true }; - } + validate({ + contents = { contents, 't' }, + opts = { opts, 't', true }, + }) opts = opts or {} contents = M.trim_empty_lines(contents) if opts.pad_top then for _ = 1, opts.pad_top do - table.insert(contents, 1, "") + table.insert(contents, 1, '') end end if opts.pad_bottom then for _ = 1, opts.pad_bottom do - table.insert(contents, "") + table.insert(contents, '') end end return contents @@ -1073,7 +1125,7 @@ end local function get_markdown_fences() local fences = {} for _, fence in pairs(vim.g.markdown_fenced_languages or {}) do - local lang, syntax = fence:match("^(.*)=(.*)$") + local lang, syntax = fence:match('^(.*)=(.*)$') if lang then fences[lang] = syntax end @@ -1102,28 +1154,28 @@ end --- - separator insert separator after code block ---@returns width,height size of float function M.stylize_markdown(bufnr, contents, opts) - validate { - contents = { contents, 't' }; - opts = { opts, 't', true }; - } + validate({ + contents = { contents, 't' }, + opts = { opts, 't', true }, + }) opts = opts or {} -- table of fence types to {ft, begin, end} -- when ft is nil, we get the ft from the regex match local matchers = { - block = {nil, "```+([a-zA-Z0-9_]*)", "```+"}, - pre = {"", "<pre>", "</pre>"}, - code = {"", "<code>", "</code>"}, - text = {"text", "<text>", "</text>"}, + block = { nil, '```+([a-zA-Z0-9_]*)', '```+' }, + pre = { '', '<pre>', '</pre>' }, + code = { '', '<code>', '</code>' }, + text = { 'text', '<text>', '</text>' }, } local match_begin = function(line) for type, pattern in pairs(matchers) do - local ret = line:match(string.format("^%%s*%s%%s*$", pattern[2])) + local ret = line:match(string.format('^%%s*%s%%s*$', pattern[2])) if ret then return { type = type, - ft = pattern[1] or ret + ft = pattern[1] or ret, } end end @@ -1131,7 +1183,7 @@ function M.stylize_markdown(bufnr, contents, opts) local match_end = function(line, match) local pattern = matchers[match.type] - return line:match(string.format("^%%s*%s%%s*$", pattern[3])) + return line:match(string.format('^%%s*%s%%s*$', pattern[3])) end -- Clean up @@ -1161,25 +1213,27 @@ function M.stylize_markdown(bufnr, contents, opts) i = i + 1 end table.insert(highlights, { - ft = match.ft; - start = start + 1; - finish = #stripped; + ft = match.ft, + start = start + 1, + finish = #stripped, }) -- add a separator, but not on the last line if add_sep and i < #contents then - table.insert(stripped, "---") + table.insert(stripped, '---') markdown_lines[#stripped] = true end else -- strip any empty lines or separators prior to this separator in actual markdown - if line:match("^---+$") then - while markdown_lines[#stripped] and (stripped[#stripped]:match("^%s*$") or stripped[#stripped]:match("^---+$")) do + if line:match('^---+$') then + while + markdown_lines[#stripped] and (stripped[#stripped]:match('^%s*$') or stripped[#stripped]:match('^---+$')) + do markdown_lines[#stripped] = false table.remove(stripped, #stripped) end end -- add the line if its not an empty line following a separator - if not (line:match("^%s*$") and markdown_lines[#stripped] and stripped[#stripped]:match("^---+$")) then + if not (line:match('^%s*$') and markdown_lines[#stripped] and stripped[#stripped]:match('^---+$')) then table.insert(stripped, line) markdown_lines[#stripped] = true end @@ -1189,13 +1243,13 @@ function M.stylize_markdown(bufnr, contents, opts) end -- Compute size of float needed to show (wrapped) lines - opts.wrap_at = opts.wrap_at or (vim.wo["wrap"] and api.nvim_win_get_width(0)) + opts.wrap_at = opts.wrap_at or (vim.wo['wrap'] and api.nvim_win_get_width(0)) local width = M._make_floating_popup_size(stripped, opts) - local sep_line = string.rep("─", math.min(width, opts.wrap_at or width)) + local sep_line = string.rep('─', math.min(width, opts.wrap_at or width)) for l in pairs(markdown_lines) do - if stripped[l]:match("^---+$") then + if stripped[l]:match('^---+$') then stripped[l] = sep_line end end @@ -1209,24 +1263,28 @@ function M.stylize_markdown(bufnr, contents, opts) local langs = {} local fences = get_markdown_fences() local function apply_syntax_to_region(ft, start, finish) - if ft == "" then - vim.cmd(string.format("syntax region markdownCode start=+\\%%%dl+ end=+\\%%%dl+ keepend extend", start, finish + 1)) + if ft == '' then + vim.cmd( + string.format('syntax region markdownCode start=+\\%%%dl+ end=+\\%%%dl+ keepend extend', start, finish + 1) + ) return end ft = fences[ft] or ft - local name = ft..idx + local name = ft .. idx idx = idx + 1 - local lang = "@"..ft:upper() + local lang = '@' .. ft:upper() if not langs[lang] then -- HACK: reset current_syntax, since some syntax files like markdown won't load if it is already set - pcall(vim.api.nvim_buf_del_var, bufnr, "current_syntax") + pcall(vim.api.nvim_buf_del_var, bufnr, 'current_syntax') -- TODO(ashkan): better validation before this. - if not pcall(vim.cmd, string.format("syntax include %s syntax/%s.vim", lang, ft)) then + if not pcall(vim.cmd, string.format('syntax include %s syntax/%s.vim', lang, ft)) then return end langs[lang] = true end - vim.cmd(string.format("syntax region %s start=+\\%%%dl+ end=+\\%%%dl+ contains=%s keepend", name, start, finish + 1, lang)) + vim.cmd( + string.format('syntax region %s start=+\\%%%dl+ end=+\\%%%dl+ contains=%s keepend', name, start, finish + 1, lang) + ) end -- needs to run in the buffer for the regions to work @@ -1237,13 +1295,13 @@ function M.stylize_markdown(bufnr, contents, opts) local last = 1 for _, h in ipairs(highlights) do if last < h.start then - apply_syntax_to_region("lsp_markdown", last, h.start - 1) + apply_syntax_to_region('lsp_markdown', last, h.start - 1) end apply_syntax_to_region(h.ft, h.start, h.finish) last = h.finish + 1 end if last <= #stripped then - apply_syntax_to_region("lsp_markdown", last, #stripped) + apply_syntax_to_region('lsp_markdown', last, #stripped) end end) @@ -1258,23 +1316,33 @@ end ---@param bufnrs table list of buffers where the preview window will remain visible ---@see |autocmd-events| local function close_preview_autocmd(events, winnr, bufnrs) - local augroup = 'preview_window_'..winnr + local augroup = 'preview_window_' .. winnr -- close the preview window when entered a buffer that is not -- the floating window buffer or the buffer that spawned it - vim.cmd(string.format([[ + vim.cmd(string.format( + [[ augroup %s autocmd! autocmd BufEnter * lua vim.lsp.util._close_preview_window(%d, {%s}) augroup end - ]], augroup, winnr, table.concat(bufnrs, ','))) + ]], + augroup, + winnr, + table.concat(bufnrs, ',') + )) if #events > 0 then - vim.cmd(string.format([[ + vim.cmd(string.format( + [[ augroup %s autocmd %s <buffer> lua vim.lsp.util._close_preview_window(%d) augroup end - ]], augroup, table.concat(events, ','), winnr)) + ]], + augroup, + table.concat(events, ','), + winnr + )) end end @@ -1290,13 +1358,17 @@ function M._close_preview_window(winnr, bufnrs) return end - local augroup = 'preview_window_'..winnr - vim.cmd(string.format([[ + local augroup = 'preview_window_' .. winnr + vim.cmd(string.format( + [[ augroup %s autocmd! augroup end augroup! %s - ]], augroup, augroup)) + ]], + augroup, + augroup + )) pcall(vim.api.nvim_win_close, winnr, true) end) end @@ -1313,10 +1385,10 @@ end --- - max_height maximal height of floating window ---@returns width,height size of float function M._make_floating_popup_size(contents, opts) - validate { - contents = { contents, 't' }; - opts = { opts, 't', true }; - } + validate({ + contents = { contents, 't' }, + opts = { opts, 't', true }, + }) opts = opts or {} local width = opts.width @@ -1360,11 +1432,11 @@ function M._make_floating_popup_size(contents, opts) if vim.tbl_isempty(line_widths) then for _, line in ipairs(contents) do local line_width = vim.fn.strdisplaywidth(line) - height = height + math.ceil(line_width/wrap_at) + height = height + math.ceil(line_width / wrap_at) end else for i = 1, #contents do - height = height + math.max(1, math.ceil(line_widths[i]/wrap_at)) + height = height + math.max(1, math.ceil(line_widths[i] / wrap_at)) end end end @@ -1398,16 +1470,16 @@ end ---@returns bufnr,winnr buffer and window number of the newly created floating ---preview window function M.open_floating_preview(contents, syntax, opts) - validate { - contents = { contents, 't' }; - syntax = { syntax, 's', true }; - opts = { opts, 't', true }; - } + validate({ + contents = { contents, 't' }, + syntax = { syntax, 's', true }, + opts = { opts, 't', true }, + }) opts = opts or {} opts.wrap = opts.wrap ~= false -- wrapping by default opts.stylize_markdown = opts.stylize_markdown ~= false opts.focus = opts.focus ~= false - opts.close_events = opts.close_events or {"CursorMoved", "CursorMovedI", "InsertCharPre"} + opts.close_events = opts.close_events or { 'CursorMoved', 'CursorMovedI', 'InsertCharPre' } local bufnr = api.nvim_get_current_buf() @@ -1416,7 +1488,7 @@ function M.open_floating_preview(contents, syntax, opts) -- Go back to previous window if we are in a focusable one local current_winnr = api.nvim_get_current_win() if npcall(api.nvim_win_get_var, current_winnr, opts.focus_id) then - api.nvim_command("wincmd p") + api.nvim_command('wincmd p') return bufnr, current_winnr end do @@ -1424,7 +1496,7 @@ function M.open_floating_preview(contents, syntax, opts) if win and api.nvim_win_is_valid(win) and vim.fn.pumvisible() == 0 then -- focus and return the existing buf, win api.nvim_set_current_win(win) - api.nvim_command("stopinsert") + api.nvim_command('stopinsert') return api.nvim_win_get_buf(win), win end end @@ -1432,14 +1504,13 @@ function M.open_floating_preview(contents, syntax, opts) -- check if another floating preview already exists for this buffer -- and close it if needed - local existing_float = npcall(api.nvim_buf_get_var, bufnr, "lsp_floating_preview") + local existing_float = npcall(api.nvim_buf_get_var, bufnr, 'lsp_floating_preview') if existing_float and api.nvim_win_is_valid(existing_float) then api.nvim_win_close(existing_float, true) end local floating_bufnr = api.nvim_create_buf(false, true) - local do_stylize = syntax == "markdown" and opts.stylize_markdown - + local do_stylize = syntax == 'markdown' and opts.stylize_markdown -- Clean up input: trim empty lines from the end, pad contents = M._trim(contents, opts) @@ -1475,26 +1546,32 @@ function M.open_floating_preview(contents, syntax, opts) api.nvim_buf_set_option(floating_bufnr, 'modifiable', false) api.nvim_buf_set_option(floating_bufnr, 'bufhidden', 'wipe') - api.nvim_buf_set_keymap(floating_bufnr, "n", "q", "<cmd>bdelete<cr>", {silent = true, noremap = true, nowait = true}) - close_preview_autocmd(opts.close_events, floating_winnr, {floating_bufnr, bufnr}) + api.nvim_buf_set_keymap( + floating_bufnr, + 'n', + 'q', + '<cmd>bdelete<cr>', + { silent = true, noremap = true, nowait = true } + ) + close_preview_autocmd(opts.close_events, floating_winnr, { floating_bufnr, bufnr }) -- save focus_id if opts.focus_id then api.nvim_win_set_var(floating_winnr, opts.focus_id, bufnr) end - api.nvim_buf_set_var(bufnr, "lsp_floating_preview", floating_winnr) + api.nvim_buf_set_var(bufnr, 'lsp_floating_preview', floating_winnr) return floating_bufnr, floating_winnr end do --[[ References ]] - local reference_ns = api.nvim_create_namespace("vim_lsp_references") + local reference_ns = api.nvim_create_namespace('vim_lsp_references') --- Removes document highlights from a buffer. --- ---@param bufnr number Buffer id function M.buf_clear_references(bufnr) - validate { bufnr = {bufnr, 'n', true} } + validate({ bufnr = { bufnr, 'n', true } }) api.nvim_buf_clear_namespace(bufnr or 0, reference_ns, 0, -1) end @@ -1505,35 +1582,41 @@ do --[[ References ]] ---@param offset_encoding string One of "utf-8", "utf-16", "utf-32". ---@see https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#documentHighlight function M.buf_highlight_references(bufnr, references, offset_encoding) - validate { - bufnr = {bufnr, 'n', true}, - offset_encoding = { offset_encoding, 'string', false }; - } + validate({ + bufnr = { bufnr, 'n', true }, + offset_encoding = { offset_encoding, 'string', false }, + }) for _, reference in ipairs(references) do - local start_line, start_char = reference["range"]["start"]["line"], reference["range"]["start"]["character"] - local end_line, end_char = reference["range"]["end"]["line"], reference["range"]["end"]["character"] + local start_line, start_char = reference['range']['start']['line'], reference['range']['start']['character'] + local end_line, end_char = reference['range']['end']['line'], reference['range']['end']['character'] - local start_idx = get_line_byte_from_position(bufnr, { line = start_line, character = start_char }, offset_encoding) + local start_idx = get_line_byte_from_position( + bufnr, + { line = start_line, character = start_char }, + offset_encoding + ) local end_idx = get_line_byte_from_position(bufnr, { line = start_line, character = end_char }, offset_encoding) local document_highlight_kind = { - [protocol.DocumentHighlightKind.Text] = "LspReferenceText"; - [protocol.DocumentHighlightKind.Read] = "LspReferenceRead"; - [protocol.DocumentHighlightKind.Write] = "LspReferenceWrite"; + [protocol.DocumentHighlightKind.Text] = 'LspReferenceText', + [protocol.DocumentHighlightKind.Read] = 'LspReferenceRead', + [protocol.DocumentHighlightKind.Write] = 'LspReferenceWrite', } - local kind = reference["kind"] or protocol.DocumentHighlightKind.Text - highlight.range(bufnr, - reference_ns, - document_highlight_kind[kind], - { start_line, start_idx }, - { end_line, end_idx }, - { priority = vim.highlight.priorities.user }) + local kind = reference['kind'] or protocol.DocumentHighlightKind.Text + highlight.range( + bufnr, + reference_ns, + document_highlight_kind[kind], + { start_line, start_idx }, + { end_line, end_idx }, + { priority = vim.highlight.priorities.user } + ) end end end local position_sort = sort_by_key(function(v) - return {v.start.line, v.start.character} + return { v.start.line, v.start.character } end) --- Returns the items with the byte position calculated correctly and in sorted @@ -1547,7 +1630,7 @@ end) ---@returns (table) list of items function M.locations_to_items(locations, offset_encoding) if offset_encoding == nil then - vim.notify_once("locations_to_items must be called with valid offset encoding", vim.log.levels.WARN) + vim.notify_once('locations_to_items must be called with valid offset encoding', vim.log.levels.WARN) end local items = {} @@ -1556,16 +1639,15 @@ function M.locations_to_items(locations, offset_encoding) local v = {} rawset(t, k, v) return v - end; + end, }) for _, d in ipairs(locations) do -- locations may be Location or LocationLink local uri = d.uri or d.targetUri local range = d.range or d.targetSelectionRange - table.insert(grouped[uri], {start = range.start}) + table.insert(grouped[uri], { start = range.start }) end - local keys = vim.tbl_keys(grouped) table.sort(keys) -- TODO(ashkan) I wish we could do this lazily. @@ -1588,13 +1670,13 @@ function M.locations_to_items(locations, offset_encoding) for _, temp in ipairs(rows) do local pos = temp.start local row = pos.line - local line = lines[row] or "" + local line = lines[row] or '' local col = M._str_byteindex_enc(line, pos.character, offset_encoding) table.insert(items, { filename = filename, lnum = row + 1, - col = col + 1; - text = line; + col = col + 1, + text = line, }) end end @@ -1609,10 +1691,10 @@ end --- ---@param items (table) list of items function M.set_loclist(items, win_id) - vim.api.nvim_echo({{'vim.lsp.util.set_loclist is deprecated. See :h deprecated', 'WarningMsg'}}, true, {}) + vim.api.nvim_echo({ { 'vim.lsp.util.set_loclist is deprecated. See :h deprecated', 'WarningMsg' } }, true, {}) vim.fn.setloclist(win_id or 0, {}, ' ', { - title = 'Language Server'; - items = items; + title = 'Language Server', + items = items, }) end @@ -1623,10 +1705,10 @@ end --- ---@param items (table) list of items function M.set_qflist(items) - vim.api.nvim_echo({{'vim.lsp.util.set_qflist is deprecated. See :h deprecated', 'WarningMsg'}}, true, {}) + vim.api.nvim_echo({ { 'vim.lsp.util.set_qflist is deprecated. See :h deprecated', 'WarningMsg' } }, true, {}) vim.fn.setqflist({}, ' ', { - title = 'Language Server'; - items = items; + title = 'Language Server', + items = items, }) end @@ -1634,7 +1716,7 @@ end -- the client must handle it properly even if it receives a value outside the specification. -- https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_documentSymbol function M._get_symbol_kind_name(symbol_kind) - return protocol.SymbolKind[symbol_kind] or "Unknown" + return protocol.SymbolKind[symbol_kind] or 'Unknown' end --- Converts symbols to quickfix list items. @@ -1652,7 +1734,7 @@ function M.symbols_to_items(symbols, bufnr) lnum = range.start.line + 1, col = range.start.character + 1, kind = kind, - text = '['..kind..'] '..symbol.name, + text = '[' .. kind .. '] ' .. symbol.name, }) elseif symbol.selectionRange then -- DocumentSymbole type local kind = M._get_symbol_kind_name(symbol.kind) @@ -1662,7 +1744,7 @@ function M.symbols_to_items(symbols, bufnr) lnum = symbol.selectionRange.start.line + 1, col = symbol.selectionRange.start.character + 1, kind = kind, - text = '['..kind..'] '..symbol.name + text = '[' .. kind .. '] ' .. symbol.name, }) if symbol.children then for _, v in ipairs(_symbols_to_items(symbol.children, _items, _bufnr)) do @@ -1707,12 +1789,12 @@ end ---@param lines (table) list of lines ---@returns (string) filetype or 'markdown' if it was unchanged. function M.try_trim_markdown_code_blocks(lines) - local language_id = lines[1]:match("^```(.*)") + local language_id = lines[1]:match('^```(.*)') if language_id then local has_inner_code_fence = false for i = 2, (#lines - 1) do local line = lines[i] - if line:sub(1,3) == '```' then + if line:sub(1, 3) == '```' then has_inner_code_fence = true break end @@ -1736,14 +1818,14 @@ local function make_position_param(window, offset_encoding) local row, col = unpack(api.nvim_win_get_cursor(window)) offset_encoding = offset_encoding or M._get_offset_encoding(buf) row = row - 1 - local line = api.nvim_buf_get_lines(buf, row, row+1, true)[1] + local line = api.nvim_buf_get_lines(buf, row, row + 1, true)[1] if not line then - return { line = 0; character = 0; } + return { line = 0, character = 0 } end col = _str_utfindex_enc(line, col, offset_encoding) - return { line = row; character = col; } + return { line = row, character = col } end --- Creates a `TextDocumentPositionParams` object for the current buffer and cursor position. @@ -1757,8 +1839,8 @@ function M.make_position_params(window, offset_encoding) local buf = vim.api.nvim_win_get_buf(window) offset_encoding = offset_encoding or M._get_offset_encoding(buf) return { - textDocument = M.make_text_document_params(buf); - position = make_position_param(window, offset_encoding) + textDocument = M.make_text_document_params(buf), + position = make_position_param(window, offset_encoding), } end @@ -1766,16 +1848,16 @@ end ---@param bufnr (number) buffer handle or 0 for current, defaults to current ---@returns (string) encoding first client if there is one, nil otherwise function M._get_offset_encoding(bufnr) - validate { - bufnr = {bufnr, 'n', true}; - } + validate({ + bufnr = { bufnr, 'n', true }, + }) local offset_encoding for _, client in pairs(vim.lsp.buf_get_clients(bufnr)) do if client.offset_encoding == nil then vim.notify_once( - string.format("Client (id: %s) offset_encoding is nil. Do not unset offset_encoding.", client.id), + string.format('Client (id: %s) offset_encoding is nil. Do not unset offset_encoding.', client.id), vim.log.levels.ERROR ) end @@ -1783,7 +1865,10 @@ function M._get_offset_encoding(bufnr) if not offset_encoding then offset_encoding = this_offset_encoding elseif offset_encoding ~= this_offset_encoding then - vim.notify("warning: multiple different client offset_encodings detected for buffer, this is not supported yet", vim.log.levels.WARN) + vim.notify( + 'warning: multiple different client offset_encodings detected for buffer, this is not supported yet', + vim.log.levels.WARN + ) end end @@ -1805,7 +1890,7 @@ function M.make_range_params(window, offset_encoding) local position = make_position_param(window, offset_encoding) return { textDocument = M.make_text_document_params(buf), - range = { start = position; ["end"] = position; } + range = { start = position, ['end'] = position }, } end @@ -1821,11 +1906,11 @@ end ---@returns { textDocument = { uri = `current_file_uri` }, range = { start = ---`start_position`, end = `end_position` } } function M.make_given_range_params(start_pos, end_pos, bufnr, offset_encoding) - validate { - start_pos = {start_pos, 't', true}; - end_pos = {end_pos, 't', true}; - offset_encoding = {offset_encoding, 's', true}; - } + validate({ + start_pos = { start_pos, 't', true }, + end_pos = { end_pos, 't', true }, + offset_encoding = { offset_encoding, 's', true }, + }) bufnr = bufnr or vim.api.nvim_get_current_buf() offset_encoding = offset_encoding or M._get_offset_encoding(bufnr) local A = list_extend({}, start_pos or api.nvim_buf_get_mark(bufnr, '<')) @@ -1835,10 +1920,10 @@ function M.make_given_range_params(start_pos, end_pos, bufnr, offset_encoding) B[1] = B[1] - 1 -- account for offset_encoding. if A[2] > 0 then - A = {A[1], M.character_offset(bufnr, A[1], A[2], offset_encoding)} + A = { A[1], M.character_offset(bufnr, A[1], A[2], offset_encoding) } end if B[2] > 0 then - B = {B[1], M.character_offset(bufnr, B[1], B[2], offset_encoding)} + B = { B[1], M.character_offset(bufnr, B[1], B[2], offset_encoding) } end -- we need to offset the end character position otherwise we loose the last -- character of the selection, as LSP end position is exclusive @@ -1849,9 +1934,9 @@ function M.make_given_range_params(start_pos, end_pos, bufnr, offset_encoding) return { textDocument = M.make_text_document_params(bufnr), range = { - start = {line = A[1], character = A[2]}, - ['end'] = {line = B[1], character = B[2]} - } + start = { line = A[1], character = A[2] }, + ['end'] = { line = B[1], character = B[2] }, + }, } end @@ -1868,7 +1953,7 @@ end ---@param added ---@param removed function M.make_workspace_params(added, removed) - return { event = { added = added; removed = removed; } } + return { event = { added = added, removed = removed } } end --- Returns indentation size. --- @@ -1876,7 +1961,7 @@ end ---@param bufnr (number|nil): Buffer handle, defaults to current ---@returns (number) indentation size function M.get_effective_tabstop(bufnr) - validate { bufnr = {bufnr, 'n', true} } + validate({ bufnr = { bufnr, 'n', true } }) local bo = bufnr and vim.bo[bufnr] or vim.bo local sw = bo.shiftwidth return (sw == 0 and bo.tabstop) or sw @@ -1888,14 +1973,14 @@ end ---@returns `DocumentFormattingParams` object ---@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_formatting function M.make_formatting_params(options) - validate { options = {options, 't', true} } + validate({ options = { options, 't', true } }) options = vim.tbl_extend('keep', options or {}, { - tabSize = M.get_effective_tabstop(); - insertSpaces = vim.bo.expandtab; + tabSize = M.get_effective_tabstop(), + insertSpaces = vim.bo.expandtab, }) return { - textDocument = { uri = vim.uri_from_bufnr(0) }; - options = options; + textDocument = { uri = vim.uri_from_bufnr(0) }, + options = options, } end @@ -1909,7 +1994,7 @@ end function M.character_offset(buf, row, col, offset_encoding) local line = get_line(buf, row) if offset_encoding == nil then - vim.notify_once("character_offset must be called with valid offset encoding", vim.log.levels.WARN) + vim.notify_once('character_offset must be called with valid offset encoding', vim.log.levels.WARN) end -- If the col is past the EOL, use the line length. if col > #line then diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua index 172fac3a88..9bbe356f03 100644 --- a/runtime/lua/vim/shared.lua +++ b/runtime/lua/vim/shared.lua @@ -15,8 +15,8 @@ local vim = vim or {} --- copied and will throw an error. --- ---@param orig table Table to copy ----@returns New table of copied keys and (nested) values. -function vim.deepcopy(orig) end -- luacheck: no unused +---@return table Table of copied keys and (nested) values. +function vim.deepcopy(orig) end -- luacheck: no unused vim.deepcopy = (function() local function _id(v) return v @@ -24,7 +24,9 @@ vim.deepcopy = (function() local deepcopy_funcs = { table = function(orig, cache) - if cache[orig] then return cache[orig] end + if cache[orig] then + return cache[orig] + end local copy = {} cache[orig] = copy @@ -46,7 +48,7 @@ vim.deepcopy = (function() if f then return f(orig, cache or {}) else - error("Cannot deepcopy object of type "..type(orig)) + error('Cannot deepcopy object of type ' .. type(orig)) end end end)() @@ -57,19 +59,19 @@ end)() ---@see https://www.lua.org/pil/20.2.html ---@see http://lua-users.org/wiki/StringLibraryTutorial --- ----@param s String to split ----@param sep Separator string or pattern ----@param plain If `true` use `sep` literally (passed to String.find) ----@returns Iterator over the split components +---@param s string String to split +---@param sep string Separator or pattern +---@param plain boolean If `true` use `sep` literally (passed to string.find) +---@return function Iterator over the split components function vim.gsplit(s, sep, plain) - vim.validate{s={s,'s'},sep={sep,'s'},plain={plain,'b',true}} + vim.validate({ s = { s, 's' }, sep = { sep, 's' }, plain = { plain, 'b', true } }) local start = 1 local done = false local function _pass(i, j, ...) if i then - assert(j+1 > start, "Infinite loop detected") + assert(j + 1 > start, 'Infinite loop detected') local seg = s:sub(start, i - 1) start = j + 1 return seg, ... @@ -87,7 +89,7 @@ function vim.gsplit(s, sep, plain) if start == #s then done = true end - return _pass(start+1, start) + return _pass(start + 1, start) end return _pass(s:find(sep, start, plain)) end @@ -105,13 +107,13 @@ end --- ---@see |vim.gsplit()| --- ----@param s String to split ----@param sep Separator string or pattern ----@param kwargs Keyword arguments: +---@param s string String to split +---@param sep string Separator or pattern +---@param kwargs table Keyword arguments: --- - plain: (boolean) If `true` use `sep` literally (passed to string.find) --- - trimempty: (boolean) If `true` remove empty items from the front --- and back of the list ----@returns List-like table of the split components. +---@return table List of split components function vim.split(s, sep, kwargs) local plain local trimempty = false @@ -119,7 +121,7 @@ function vim.split(s, sep, kwargs) -- Support old signature for backward compatibility plain = kwargs else - vim.validate { kwargs = {kwargs, 't', true} } + vim.validate({ kwargs = { kwargs, 't', true } }) kwargs = kwargs or {} plain = kwargs.plain trimempty = kwargs.trimempty @@ -128,7 +130,7 @@ function vim.split(s, sep, kwargs) local t = {} local skip = trimempty for c in vim.gsplit(s, sep, plain) do - if c ~= "" then + if c ~= '' then skip = false end @@ -139,7 +141,7 @@ function vim.split(s, sep, kwargs) if trimempty then for i = #t, 1, -1 do - if t[i] ~= "" then + if t[i] ~= '' then break end table.remove(t, i) @@ -154,10 +156,10 @@ end --- ---@see From https://github.com/premake/premake-core/blob/master/src/base/table.lua --- ----@param t Table ----@returns list of keys +---@param t table Table +---@return table List of keys function vim.tbl_keys(t) - assert(type(t) == 'table', string.format("Expected table, got %s", type(t))) + assert(type(t) == 'table', string.format('Expected table, got %s', type(t))) local keys = {} for k, _ in pairs(t) do @@ -169,10 +171,10 @@ end --- Return a list of all values used in a table. --- However, the order of the return table of values is not guaranteed. --- ----@param t Table ----@returns list of values +---@param t table Table +---@return table List of values function vim.tbl_values(t) - assert(type(t) == 'table', string.format("Expected table, got %s", type(t))) + assert(type(t) == 'table', string.format('Expected table, got %s', type(t))) local values = {} for _, v in pairs(t) do @@ -183,10 +185,11 @@ end --- Apply a function to all values of a table. --- ----@param func function or callable table ----@param t table +---@param func function|table Function or callable table +---@param t table Table +---@return table Table of transformed values function vim.tbl_map(func, t) - vim.validate{func={func,'c'},t={t,'t'}} + vim.validate({ func = { func, 'c' }, t = { t, 't' } }) local rettab = {} for k, v in pairs(t) do @@ -197,10 +200,11 @@ end --- Filter a table using a predicate function --- ----@param func function or callable table ----@param t table +---@param func function|table Function or callable table +---@param t table Table +---@return table Table of filtered values function vim.tbl_filter(func, t) - vim.validate{func={func,'c'},t={t,'t'}} + vim.validate({ func = { func, 'c' }, t = { t, 't' } }) local rettab = {} for _, entry in pairs(t) do @@ -213,13 +217,13 @@ end --- Checks if a list-like (vector) table contains `value`. --- ----@param t Table to check ----@param value Value to compare ----@returns true if `t` contains `value` +---@param t table Table to check +---@param value any Value to compare +---@return boolean `true` if `t` contains `value` function vim.tbl_contains(t, value) - vim.validate{t={t,'t'}} + vim.validate({ t = { t, 't' } }) - for _,v in ipairs(t) do + for _, v in ipairs(t) do if v == value then return true end @@ -231,25 +235,26 @@ end --- ---@see https://github.com/premake/premake-core/blob/master/src/base/table.lua --- ----@param t Table to check +---@param t table Table to check +---@return boolean `true` if `t` is empty function vim.tbl_isempty(t) - assert(type(t) == 'table', string.format("Expected table, got %s", type(t))) + assert(type(t) == 'table', string.format('Expected table, got %s', type(t))) return next(t) == nil end ---- we only merge empty tables or tables that are not a list +--- We only merge empty tables or tables that are not a list ---@private local function can_merge(v) - return type(v) == "table" and (vim.tbl_isempty(v) or not vim.tbl_islist(v)) + return type(v) == 'table' and (vim.tbl_isempty(v) or not vim.tbl_islist(v)) end local function tbl_extend(behavior, deep_extend, ...) - if (behavior ~= 'error' and behavior ~= 'keep' and behavior ~= 'force') then - error('invalid "behavior": '..tostring(behavior)) + if behavior ~= 'error' and behavior ~= 'keep' and behavior ~= 'force' then + error('invalid "behavior": ' .. tostring(behavior)) end if select('#', ...) < 2 then - error('wrong number of arguments (given '..tostring(1 + select('#', ...))..', expected at least 3)') + error('wrong number of arguments (given ' .. tostring(1 + select('#', ...)) .. ', expected at least 3)') end local ret = {} @@ -259,15 +264,15 @@ local function tbl_extend(behavior, deep_extend, ...) for i = 1, select('#', ...) do local tbl = select(i, ...) - vim.validate{["after the second argument"] = {tbl,'t'}} + vim.validate({ ['after the second argument'] = { tbl, 't' } }) if tbl then for k, v in pairs(tbl) do if deep_extend and can_merge(v) and can_merge(ret[k]) then ret[k] = tbl_extend(behavior, true, ret[k], v) elseif behavior ~= 'force' and ret[k] ~= nil then if behavior == 'error' then - error('key found in more than one map: '..k) - end -- Else behavior is "keep". + error('key found in more than one map: ' .. k) + end -- Else behavior is "keep". else ret[k] = v end @@ -281,11 +286,12 @@ end --- ---@see |extend()| --- ----@param behavior Decides what to do if a key is found in more than one map: +---@param behavior string Decides what to do if a key is found in more than one map: --- - "error": raise an error --- - "keep": use value from the leftmost map --- - "force": use value from the rightmost map ----@param ... Two or more map-like tables. +---@param ... table Two or more map-like tables +---@return table Merged table function vim.tbl_extend(behavior, ...) return tbl_extend(behavior, false, ...) end @@ -294,25 +300,30 @@ end --- ---@see |tbl_extend()| --- ----@param behavior Decides what to do if a key is found in more than one map: +---@param behavior string Decides what to do if a key is found in more than one map: --- - "error": raise an error --- - "keep": use value from the leftmost map --- - "force": use value from the rightmost map ----@param ... Two or more map-like tables. +---@param ... table Two or more map-like tables +---@return table Merged table function vim.tbl_deep_extend(behavior, ...) return tbl_extend(behavior, true, ...) end --- Deep compare values for equality --- ---- Tables are compared recursively unless they both provide the `eq` methamethod. +--- Tables are compared recursively unless they both provide the `eq` metamethod. --- All other types are compared using the equality `==` operator. ----@param a first value ----@param b second value ----@returns `true` if values are equals, else `false`. +---@param a any First value +---@param b any Second value +---@return boolean `true` if values are equals, else `false` function vim.deep_equal(a, b) - if a == b then return true end - if type(a) ~= type(b) then return false end + if a == b then + return true + end + if type(a) ~= type(b) then + return false + end if type(a) == 'table' then for k, v in pairs(a) do if not vim.deep_equal(v, b[k]) then @@ -332,15 +343,22 @@ end --- Add the reverse lookup values to an existing table. --- For example: --- ``tbl_add_reverse_lookup { A = 1 } == { [1] = 'A', A = 1 }`` --- ---Do note that it *modifies* the input. ----@param o table The table to add the reverse to. +--- +--- Note that this *modifies* the input. +---@param o table Table to add the reverse to +---@return table o function vim.tbl_add_reverse_lookup(o) local keys = vim.tbl_keys(o) for _, k in ipairs(keys) do local v = o[k] if o[v] then - error(string.format("The reverse lookup found an existing value for %q while processing key %q", tostring(v), tostring(k))) + error( + string.format( + 'The reverse lookup found an existing value for %q while processing key %q', + tostring(v), + tostring(k) + ) + ) end o[v] = k end @@ -349,19 +367,19 @@ end --- Index into a table (first argument) via string keys passed as subsequent arguments. --- Return `nil` if the key does not exist. ---_ +--- --- Examples: --- <pre> --- vim.tbl_get({ key = { nested_key = true }}, 'key', 'nested_key') == true --- vim.tbl_get({ key = {}}, 'key', 'nested_key') == nil --- </pre> --- ----@param o Table to index ----@param ... Optional strings (0 or more, variadic) via which to index the table +---@param o table Table to index +---@param ... string Optional strings (0 or more, variadic) via which to index the table --- ----@returns nested value indexed by key if it exists, else nil +---@return any Nested value indexed by key (if it exists), else nil function vim.tbl_get(o, ...) - local keys = {...} + local keys = { ... } if #keys == 0 then return end @@ -383,18 +401,18 @@ end --- ---@see |vim.tbl_extend()| --- ----@param dst list which will be modified and appended to. ----@param src list from which values will be inserted. ----@param start Start index on src. defaults to 1 ----@param finish Final index on src. defaults to #src ----@returns dst +---@param dst table List which will be modified and appended to +---@param src table List from which values will be inserted +---@param start number Start index on src. Defaults to 1 +---@param finish number Final index on src. Defaults to `#src` +---@return table dst function vim.list_extend(dst, src, start, finish) - vim.validate { - dst = {dst, 't'}; - src = {src, 't'}; - start = {start, 'n', true}; - finish = {finish, 'n', true}; - } + vim.validate({ + dst = { dst, 't' }, + src = { src, 't' }, + start = { start, 'n', true }, + finish = { finish, 'n', true }, + }) for i = start or 1, finish or #src do table.insert(dst, src[i]) end @@ -406,15 +424,15 @@ end --- ---@see From https://github.com/premake/premake-core/blob/master/src/base/table.lua --- ----@param t List-like table ----@returns Flattened copy of the given list-like table. +---@param t table List-like table +---@return table Flattened copy of the given list-like table function vim.tbl_flatten(t) local result = {} local function _tbl_flatten(_t) local n = #_t for i = 1, n do local v = _t[i] - if type(v) == "table" then + if type(v) == 'table' then _tbl_flatten(v) elseif v then table.insert(result, v) @@ -431,8 +449,8 @@ end --- |vim.empty_dict()| or returned as a dict-like |API| or Vimscript result, --- for example from |rpcrequest()| or |vim.fn|. --- ----@param t Table ----@returns `true` if array-like table, else `false`. +---@param t table Table +---@return boolean `true` if array-like table, else `false` function vim.tbl_islist(t) if type(t) ~= 'table' then return false @@ -441,7 +459,7 @@ function vim.tbl_islist(t) local count = 0 for k, _ in pairs(t) do - if type(k) == "number" then + if type(k) == 'number' then count = count + 1 else return false @@ -468,26 +486,28 @@ end --- </pre> --- ---@see https://github.com/Tieske/Penlight/blob/master/lua/pl/tablex.lua ----@param t Table ----@returns Number that is the number of the value in table +---@param t table Table +---@return number Number of non-nil values in table function vim.tbl_count(t) - vim.validate{t={t,'t'}} + vim.validate({ t = { t, 't' } }) local count = 0 - for _ in pairs(t) do count = count + 1 end + for _ in pairs(t) do + count = count + 1 + end return count end --- Creates a copy of a table containing only elements from start to end (inclusive) --- ----@param list table table ----@param start integer Start range of slice ----@param finish integer End range of slice ----@returns Copy of table sliced from start to finish (inclusive) +---@param list table Table +---@param start number Start range of slice +---@param finish number End range of slice +---@return table Copy of table sliced from start to finish (inclusive) function vim.list_slice(list, start, finish) local new_list = {} for i = start or 1, finish or #list do - new_list[#new_list+1] = list[i] + new_list[#new_list + 1] = list[i] end return new_list end @@ -495,40 +515,40 @@ end --- Trim whitespace (Lua pattern "%s") from both sides of a string. --- ---@see https://www.lua.org/pil/20.2.html ----@param s String to trim ----@returns String with whitespace removed from its beginning and end +---@param s string String to trim +---@return string String with whitespace removed from its beginning and end function vim.trim(s) - vim.validate{s={s,'s'}} + vim.validate({ s = { s, 's' } }) return s:match('^%s*(.*%S)') or '' end --- Escapes magic chars in a Lua pattern. --- ---@see https://github.com/rxi/lume ----@param s String to escape ----@returns %-escaped pattern string +---@param s string String to escape +---@return string %-escaped pattern string function vim.pesc(s) - vim.validate{s={s,'s'}} + vim.validate({ s = { s, 's' } }) return s:gsub('[%(%)%.%%%+%-%*%?%[%]%^%$]', '%%%1') end --- Tests if `s` starts with `prefix`. --- ----@param s (string) a string ----@param prefix (string) a prefix ----@return (boolean) true if `prefix` is a prefix of s +---@param s string String +---@param prefix string Prefix to match +---@return boolean `true` if `prefix` is a prefix of `s` function vim.startswith(s, prefix) - vim.validate { s = {s, 's'}; prefix = {prefix, 's'}; } + vim.validate({ s = { s, 's' }, prefix = { prefix, 's' } }) return s:sub(1, #prefix) == prefix end --- Tests if `s` ends with `suffix`. --- ----@param s (string) a string ----@param suffix (string) a suffix ----@return (boolean) true if `suffix` is a suffix of s +---@param s string String +---@param suffix string Suffix to match +---@return boolean `true` if `suffix` is a suffix of `s` function vim.endswith(s, suffix) - vim.validate { s = {s, 's'}; suffix = {suffix, 's'}; } + vim.validate({ s = { s, 's' }, suffix = { suffix, 's' } }) return #suffix == 0 or s:sub(-#suffix) == suffix end @@ -568,7 +588,7 @@ end --- --- </pre> --- ----@param opt table of parameter names to validations. Each key is a parameter +---@param opt table Names of parameters to validate. Each key is a parameter --- name; each value is a tuple in one of these forms: --- 1. (arg_value, type_name, optional) --- - arg_value: argument value @@ -582,18 +602,24 @@ end --- only if the argument is valid. Can optionally return an additional --- informative error message as the second returned value. --- - msg: (optional) error string if validation fails -function vim.validate(opt) end -- luacheck: no unused +function vim.validate(opt) end -- luacheck: no unused do local type_names = { - ['table'] = 'table', t = 'table', - ['string'] = 'string', s = 'string', - ['number'] = 'number', n = 'number', - ['boolean'] = 'boolean', b = 'boolean', - ['function'] = 'function', f = 'function', - ['callable'] = 'callable', c = 'callable', - ['nil'] = 'nil', - ['thread'] = 'thread', + ['table'] = 'table', + t = 'table', + ['string'] = 'string', + s = 'string', + ['number'] = 'number', + n = 'number', + ['boolean'] = 'boolean', + b = 'boolean', + ['function'] = 'function', + f = 'function', + ['callable'] = 'callable', + c = 'callable', + ['nil'] = 'nil', + ['thread'] = 'thread', ['userdata'] = 'userdata', } @@ -612,21 +638,21 @@ do return false, string.format('opt[%s]: expected table, got %s', param_name, type(spec)) end - local val = spec[1] -- Argument value. - local types = spec[2] -- Type name, or callable. + local val = spec[1] -- Argument value + local types = spec[2] -- Type name, or callable local optional = (true == spec[3]) if type(types) == 'string' then - types = {types} + types = { types } end if vim.is_callable(types) then - -- Check user-provided validation function. + -- Check user-provided validation function local valid, optional_message = types(val) if not valid then - local error_message = string.format("%s: expected %s, got %s", param_name, (spec[3] or '?'), tostring(val)) + local error_message = string.format('%s: expected %s, got %s', param_name, (spec[3] or '?'), tostring(val)) if optional_message ~= nil then - error_message = error_message .. string.format(". Info: %s", optional_message) + error_message = error_message .. string.format('. Info: %s', optional_message) end return false, error_message @@ -646,10 +672,10 @@ do end end if not success then - return false, string.format("%s: expected %s, got %s", param_name, table.concat(types, '|'), type(val)) + return false, string.format('%s: expected %s, got %s', param_name, table.concat(types, '|'), type(val)) end else - return false, string.format("invalid type name: %s", tostring(types)) + return false, string.format('invalid type name: %s', tostring(types)) end end @@ -665,12 +691,16 @@ do end --- Returns true if object `f` can be called as a function. --- ----@param f Any object ----@return true if `f` is callable, else false +---@param f any Any object +---@return boolean `true` if `f` is callable, else `false` function vim.is_callable(f) - if type(f) == 'function' then return true end + if type(f) == 'function' then + return true + end local m = getmetatable(f) - if m == nil then return false end + if m == nil then + return false + end return type(m.__call) == 'function' end diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 55398d8180..70f2c425ed 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -1,32 +1,32 @@ local a = vim.api -local query = require'vim.treesitter.query' -local language = require'vim.treesitter.language' -local LanguageTree = require'vim.treesitter.languagetree' +local query = require('vim.treesitter.query') +local language = require('vim.treesitter.language') +local LanguageTree = require('vim.treesitter.languagetree') -- TODO(bfredl): currently we retain parsers for the lifetime of the buffer. -- Consider use weak references to release parser if all plugins are done with -- it. local parsers = {} -local M = vim.tbl_extend("error", query, language) +local M = vim.tbl_extend('error', query, language) M.language_version = vim._ts_get_language_version() M.minimum_language_version = vim._ts_get_minimum_language_version() setmetatable(M, { - __index = function (t, k) - if k == "highlighter" then - t[k] = require'vim.treesitter.highlighter' - return t[k] - elseif k == "language" then - t[k] = require"vim.treesitter.language" - return t[k] - elseif k == "query" then - t[k] = require"vim.treesitter.query" - return t[k] - end - end - }) + __index = function(t, k) + if k == 'highlighter' then + t[k] = require('vim.treesitter.highlighter') + return t[k] + elseif k == 'language' then + t[k] = require('vim.treesitter.language') + return t[k] + elseif k == 'query' then + t[k] = require('vim.treesitter.query') + return t[k] + end + end, +}) --- Creates a new parser. --- @@ -63,7 +63,11 @@ function M._create_parser(bufnr, lang, opts) self:_on_reload(...) end - a.nvim_buf_attach(self:source(), false, {on_bytes=bytes_cb, on_detach=detach_cb, on_reload=reload_cb, preview=true}) + a.nvim_buf_attach( + self:source(), + false, + { on_bytes = bytes_cb, on_detach = detach_cb, on_reload = reload_cb, preview = true } + ) self:parse() @@ -87,7 +91,7 @@ function M.get_parser(bufnr, lang, opts) bufnr = a.nvim_get_current_buf() end if lang == nil then - lang = a.nvim_buf_get_option(bufnr, "filetype") + lang = a.nvim_buf_get_option(bufnr, 'filetype') end if parsers[bufnr] == nil or parsers[bufnr]:lang() ~= lang then @@ -105,10 +109,10 @@ end ---@param lang The language of this string ---@param opts Options to pass to the created language tree function M.get_string_parser(str, lang, opts) - vim.validate { + vim.validate({ str = { str, 'string' }, - lang = { lang, 'string' } - } + lang = { lang, 'string' }, + }) language.require_language(lang) return LanguageTree.new(str, lang, opts) diff --git a/runtime/lua/vim/treesitter/health.lua b/runtime/lua/vim/treesitter/health.lua index 53ccc6e88d..aa9db6b71b 100644 --- a/runtime/lua/vim/treesitter/health.lua +++ b/runtime/lua/vim/treesitter/health.lua @@ -15,24 +15,22 @@ function M.check() local report_error = vim.fn['health#report_error'] local parsers = M.list_parsers() - report_info(string.format("Runtime ABI version : %d", ts.language_version)) + report_info(string.format('Runtime ABI version : %d', ts.language_version)) for _, parser in pairs(parsers) do - local parsername = vim.fn.fnamemodify(parser, ":t:r") + local parsername = vim.fn.fnamemodify(parser, ':t:r') local is_loadable, ret = pcall(ts.language.require_language, parsername) if not is_loadable then - report_error(string.format("Impossible to load parser for %s: %s", parsername, ret)) + report_error(string.format('Impossible to load parser for %s: %s', parsername, ret)) elseif ret then local lang = ts.language.inspect_language(parsername) - report_ok(string.format("Loaded parser for %s: ABI version %d", - parsername, lang._abi_version)) + report_ok(string.format('Loaded parser for %s: ABI version %d', parsername, lang._abi_version)) else - report_error(string.format("Unable to load parser for %s", parsername)) + report_error(string.format('Unable to load parser for %s', parsername)) end end end return M - diff --git a/runtime/lua/vim/treesitter/highlighter.lua b/runtime/lua/vim/treesitter/highlighter.lua index 0ec4ab37ec..453fed0576 100644 --- a/runtime/lua/vim/treesitter/highlighter.lua +++ b/runtime/lua/vim/treesitter/highlighter.lua @@ -1,5 +1,5 @@ local a = vim.api -local query = require"vim.treesitter.query" +local query = require('vim.treesitter.query') -- support reload for quick experimentation local TSHighlighter = rawget(vim.treesitter, 'TSHighlighter') or {} @@ -10,13 +10,13 @@ TSHighlighter.active = TSHighlighter.active or {} local TSHighlighterQuery = {} TSHighlighterQuery.__index = TSHighlighterQuery -local ns = a.nvim_create_namespace("treesitter/highlighter") +local ns = a.nvim_create_namespace('treesitter/highlighter') local _default_highlights = {} local _link_default_highlight_once = function(from, to) if not _default_highlights[from] then _default_highlights[from] = true - vim.cmd(string.format("highlight default link %s %s", from, to)) + vim.cmd(string.format('highlight default link %s %s', from, to)) end return from @@ -31,65 +31,65 @@ local subcapture_fallback = { shortened = shortened:match('(.*)%.') rtn = shortened and rawget(self, shortened) end - rawset(self, capture, rtn or "__notfound") + rawset(self, capture, rtn or '__notfound') return rtn - end + end, } TSHighlighter.hl_map = setmetatable({ - ["error"] = "Error", - ["text.underline"] = "Underlined", - ["todo"] = "Todo", - ["debug"] = "Debug", - --- Miscs - ["comment"] = "Comment", - ["punctuation.delimiter"] = "Delimiter", - ["punctuation.bracket"] = "Delimiter", - ["punctuation.special"] = "Delimiter", - --- Constants - ["constant"] = "Constant", - ["constant.builtin"] = "Special", - ["constant.macro"] = "Define", - ["define"] = "Define", - ["macro"] = "Macro", - ["string"] = "String", - ["string.regex"] = "String", - ["string.escape"] = "SpecialChar", - ["character"] = "Character", - ["character.special"] = "SpecialChar", - ["number"] = "Number", - ["boolean"] = "Boolean", - ["float"] = "Float", - --- Functions - ["function"] = "Function", - ["function.special"] = "Function", - ["function.builtin"] = "Special", - ["function.macro"] = "Macro", - ["parameter"] = "Identifier", - ["method"] = "Function", - ["field"] = "Identifier", - ["property"] = "Identifier", - ["constructor"] = "Special", - --- Keywords - ["conditional"] = "Conditional", - ["repeat"] = "Repeat", - ["label"] = "Label", - ["operator"] = "Operator", - ["keyword"] = "Keyword", - ["exception"] = "Exception", - - ["type"] = "Type", - ["type.builtin"] = "Type", - ["type.qualifier"] = "Type", - ["type.definition"] = "Typedef", - ["storageclass"] = "StorageClass", - ["structure"] = "Structure", - ["include"] = "Include", - ["preproc"] = "PreProc", + ['error'] = 'Error', + ['text.underline'] = 'Underlined', + ['todo'] = 'Todo', + ['debug'] = 'Debug', + + -- Miscs + ['comment'] = 'Comment', + ['punctuation.delimiter'] = 'Delimiter', + ['punctuation.bracket'] = 'Delimiter', + ['punctuation.special'] = 'Delimiter', + + -- Constants + ['constant'] = 'Constant', + ['constant.builtin'] = 'Special', + ['constant.macro'] = 'Define', + ['define'] = 'Define', + ['macro'] = 'Macro', + ['string'] = 'String', + ['string.regex'] = 'String', + ['string.escape'] = 'SpecialChar', + ['character'] = 'Character', + ['character.special'] = 'SpecialChar', + ['number'] = 'Number', + ['boolean'] = 'Boolean', + ['float'] = 'Float', + + -- Functions + ['function'] = 'Function', + ['function.special'] = 'Function', + ['function.builtin'] = 'Special', + ['function.macro'] = 'Macro', + ['parameter'] = 'Identifier', + ['method'] = 'Function', + ['field'] = 'Identifier', + ['property'] = 'Identifier', + ['constructor'] = 'Special', + + -- Keywords + ['conditional'] = 'Conditional', + ['repeat'] = 'Repeat', + ['label'] = 'Label', + ['operator'] = 'Operator', + ['keyword'] = 'Keyword', + ['exception'] = 'Exception', + + ['type'] = 'Type', + ['type.builtin'] = 'Type', + ['type.qualifier'] = 'Type', + ['type.definition'] = 'Typedef', + ['storageclass'] = 'StorageClass', + ['structure'] = 'Structure', + ['include'] = 'Include', + ['preproc'] = 'PreProc', }, subcapture_fallback) ---@private @@ -113,13 +113,13 @@ function TSHighlighterQuery.new(lang, query_string) rawset(table, capture, id) return id - end + end, }) if query_string then self._query = query.parse_query(lang, query_string) else - self._query = query.get_query(lang, "highlights") + self._query = query.get_query(lang, 'highlights') end return self @@ -152,17 +152,23 @@ end function TSHighlighter.new(tree, opts) local self = setmetatable({}, TSHighlighter) - if type(tree:source()) ~= "number" then - error("TSHighlighter can not be used with a string parser source.") + if type(tree:source()) ~= 'number' then + error('TSHighlighter can not be used with a string parser source.') end opts = opts or {} self.tree = tree - tree:register_cbs { - on_changedtree = function(...) self:on_changedtree(...) end; - on_bytes = function(...) self:on_bytes(...) end; - on_detach = function(...) self:on_detach(...) end; - } + tree:register_cbs({ + on_changedtree = function(...) + self:on_changedtree(...) + end, + on_bytes = function(...) + self:on_bytes(...) + end, + on_detach = function(...) + self:on_detach(...) + end, + }) self.bufnr = tree:source() self.edit_count = 0 @@ -181,7 +187,7 @@ function TSHighlighter.new(tree, opts) end end - a.nvim_buf_set_option(self.bufnr, "syntax", "") + a.nvim_buf_set_option(self.bufnr, 'syntax', '') TSHighlighter.active[self.bufnr] = self @@ -190,7 +196,7 @@ function TSHighlighter.new(tree, opts) -- syntax FileType autocmds. Later on we should integrate with the -- `:syntax` and `set syntax=...` machinery properly. if vim.g.syntax_on ~= 1 then - vim.api.nvim_command("runtime! syntax/synload.vim") + vim.api.nvim_command('runtime! syntax/synload.vim') end self.tree:parse() @@ -210,7 +216,7 @@ function TSHighlighter:get_highlight_state(tstree) if not self._highlight_states[tstree] then self._highlight_states[tstree] = { next_row = 0, - iter = nil + iter = nil, } end @@ -235,7 +241,7 @@ end ---@private function TSHighlighter:on_changedtree(changes) for _, ch in ipairs(changes or {}) do - a.nvim__buf_redraw_range(self.bufnr, ch[1], ch[3]+1) + a.nvim__buf_redraw_range(self.bufnr, ch[1], ch[3] + 1) end end @@ -253,19 +259,25 @@ end ---@private local function on_line_impl(self, buf, line) self.tree:for_each_tree(function(tstree, tree) - if not tstree then return end + if not tstree then + return + end local root_node = tstree:root() local root_start_row, _, root_end_row, _ = root_node:range() -- Only worry about trees within the line range - if root_start_row > line or root_end_row < line then return end + if root_start_row > line or root_end_row < line then + return + end local state = self:get_highlight_state(tstree) local highlighter_query = self:get_query(tree:lang()) -- Some injected languages may not have highlight queries. - if not highlighter_query:query() then return end + if not highlighter_query:query() then + return + end if state.iter == nil then state.iter = highlighter_query:query():iter_captures(root_node, self.bufnr, line, root_end_row + 1) @@ -274,19 +286,22 @@ local function on_line_impl(self, buf, line) while line >= state.next_row do local capture, node, metadata = state.iter() - if capture == nil then break end + if capture == nil then + break + end local start_row, start_col, end_row, end_col = node:range() local hl = highlighter_query.hl_cache[capture] if hl and end_row >= line then - a.nvim_buf_set_extmark(buf, ns, start_row, start_col, - { end_line = end_row, end_col = end_col, - hl_group = hl, - ephemeral = true, - priority = tonumber(metadata.priority) or 100, -- Low but leaves room below - conceal = metadata.conceal, - }) + a.nvim_buf_set_extmark(buf, ns, start_row, start_col, { + end_line = end_row, + end_col = end_col, + hl_group = hl, + ephemeral = true, + priority = tonumber(metadata.priority) or 100, -- Low but leaves room below + conceal = metadata.conceal, + }) end if start_row > line then state.next_row = start_row @@ -298,7 +313,9 @@ end ---@private function TSHighlighter._on_line(_, _win, buf, line, _) local self = TSHighlighter.active[buf] - if not self then return end + if not self then + return + end on_line_impl(self, buf, line) end @@ -324,9 +341,9 @@ function TSHighlighter._on_win(_, _win, buf, _topline) end a.nvim_set_decoration_provider(ns, { - on_buf = TSHighlighter._on_buf; - on_win = TSHighlighter._on_win; - on_line = TSHighlighter._on_line; + on_buf = TSHighlighter._on_buf, + on_win = TSHighlighter._on_win, + on_line = TSHighlighter._on_line, }) return TSHighlighter diff --git a/runtime/lua/vim/treesitter/language.lua b/runtime/lua/vim/treesitter/language.lua index 8b106108df..dfb6f5be84 100644 --- a/runtime/lua/vim/treesitter/language.lua +++ b/runtime/lua/vim/treesitter/language.lua @@ -22,13 +22,15 @@ function M.require_language(lang, path, silent) end -- TODO(bfredl): help tag? - error("no parser for '"..lang.."' language, see :help treesitter-parsers") + error("no parser for '" .. lang .. "' language, see :help treesitter-parsers") end path = paths[1] end if silent then - return pcall(function() vim._ts_add_language(path, lang) end) + return pcall(function() + vim._ts_add_language(path, lang) + end) else vim._ts_add_language(path, lang) end diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua index c23ac4468d..57d8c5fd21 100644 --- a/runtime/lua/vim/treesitter/languagetree.lua +++ b/runtime/lua/vim/treesitter/languagetree.lua @@ -1,6 +1,6 @@ local a = vim.api -local query = require'vim.treesitter.query' -local language = require'vim.treesitter.language' +local query = require('vim.treesitter.query') +local language = require('vim.treesitter.language') local LanguageTree = {} LanguageTree.__index = LanguageTree @@ -32,9 +32,10 @@ function LanguageTree.new(source, lang, opts) _regions = {}, _trees = {}, _opts = opts, - _injection_query = injections[lang] - and query.parse_query(lang, injections[lang]) - or query.get_query(lang, "injections"), + _injection_query = injections[lang] and query.parse_query(lang, injections[lang]) or query.get_query( + lang, + 'injections' + ), _valid = false, _parser = vim._create_ts_parser(lang), _callbacks = { @@ -42,11 +43,10 @@ function LanguageTree.new(source, lang, opts) bytes = {}, detach = {}, child_added = {}, - child_removed = {} + child_removed = {}, }, }, LanguageTree) - return self end @@ -264,11 +264,11 @@ end ---@param regions A list of regions this tree should manage and parse. function LanguageTree:set_included_regions(regions) -- TODO(vigoux): I don't think string parsers are useful for now - if type(self._source) == "number" then + if type(self._source) == 'number' then -- Transform the tables from 4 element long to 6 element long (with byte offset) for _, region in ipairs(regions) do for i, range in ipairs(region) do - if type(range) == "table" and #range == 4 then + if type(range) == 'table' and #range == 4 then local start_row, start_col, end_row, end_col = unpack(range) -- Easy case, this is a buffer parser -- TODO(vigoux): proper byte computation here, and account for EOL ? @@ -303,7 +303,9 @@ end --- instead of using the entire nodes range. ---@private function LanguageTree:_get_injections() - if not self._injection_query then return {} end + if not self._injection_query then + return {} + end local injections = {} @@ -311,7 +313,9 @@ function LanguageTree:_get_injections() local root_node = tree:root() local start_line, _, end_line, _ = root_node:range() - for pattern, match, metadata in self._injection_query:iter_matches(root_node, self._source, start_line, end_line+1) do + for pattern, match, metadata in + self._injection_query:iter_matches(root_node, self._source, start_line, end_line + 1) + do local lang = nil local ranges = {} local combined = metadata.combined @@ -322,8 +326,8 @@ function LanguageTree:_get_injections() local content = metadata.content -- Allow for captured nodes to be used - if type(content) == "number" then - content = {match[content]} + if type(content) == 'number' then + content = { match[content] } end if content then @@ -342,15 +346,15 @@ function LanguageTree:_get_injections() local name = self._injection_query.captures[id] -- Lang should override any other language tag - if name == "language" and not lang then + if name == 'language' and not lang then lang = query.get_node_text(node, self._source) - elseif name == "combined" then + elseif name == 'combined' then combined = true - elseif name == "content" and #ranges == 0 then + elseif name == 'content' and #ranges == 0 then table.insert(ranges, node) - -- Ignore any tags that start with "_" - -- Allows for other tags to be used in matches - elseif string.sub(name, 1, 1) ~= "_" then + -- Ignore any tags that start with "_" + -- Allows for other tags to be used in matches + elseif string.sub(name, 1, 1) ~= '_' then if not lang then lang = name end @@ -414,10 +418,19 @@ function LanguageTree:_do_callback(cb_name, ...) end ---@private -function LanguageTree:_on_bytes(bufnr, changed_tick, - start_row, start_col, start_byte, - old_row, old_col, old_byte, - new_row, new_col, new_byte) +function LanguageTree:_on_bytes( + bufnr, + changed_tick, + start_row, + start_col, + start_byte, + old_row, + old_col, + old_byte, + new_row, + new_col, + new_byte +) self:invalidate() local old_end_col = old_col + ((old_row == 0) and start_col or 0) @@ -426,16 +439,33 @@ function LanguageTree:_on_bytes(bufnr, changed_tick, -- Edit all trees recursively, together BEFORE emitting a bytes callback. -- In most cases this callback should only be called from the root tree. self:for_each_tree(function(tree) - tree:edit(start_byte,start_byte+old_byte,start_byte+new_byte, - start_row, start_col, - start_row+old_row, old_end_col, - start_row+new_row, new_end_col) + tree:edit( + start_byte, + start_byte + old_byte, + start_byte + new_byte, + start_row, + start_col, + start_row + old_row, + old_end_col, + start_row + new_row, + new_end_col + ) end) - self:_do_callback('bytes', bufnr, changed_tick, - start_row, start_col, start_byte, - old_row, old_col, old_byte, - new_row, new_col, new_byte) + self:_do_callback( + 'bytes', + bufnr, + changed_tick, + start_row, + start_col, + start_byte, + old_row, + old_col, + old_byte, + new_row, + new_col, + new_byte + ) end ---@private @@ -443,7 +473,6 @@ function LanguageTree:_on_reload() self:invalidate(true) end - ---@private function LanguageTree:_on_detach(...) self:invalidate(true) @@ -459,7 +488,9 @@ end --- - `on_child_added` : emitted when a child is added to the tree. --- - `on_child_removed` : emitted when a child is removed from the tree. function LanguageTree:register_cbs(cbs) - if not cbs then return end + if not cbs then + return + end if cbs.on_changedtree then table.insert(self._callbacks.changedtree, cbs.on_changedtree) diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua index 8383551b5f..3c4c8fdb96 100644 --- a/runtime/lua/vim/treesitter/query.lua +++ b/runtime/lua/vim/treesitter/query.lua @@ -1,5 +1,5 @@ local a = vim.api -local language = require'vim.treesitter.language' +local language = require('vim.treesitter.language') -- query: pattern matching on trees -- predicate matching is implemented in lua @@ -43,7 +43,9 @@ function M.get_query_files(lang, query_name, is_included) local query_path = string.format('queries/%s/%s.scm', lang, query_name) local lang_files = dedupe_files(a.nvim_get_runtime_file(query_path, true)) - if #lang_files == 0 then return {} end + if #lang_files == 0 then + return {} + end local base_langs = {} @@ -52,7 +54,7 @@ function M.get_query_files(lang, query_name, is_included) -- ;+ inherits: ({language},)*{language} -- -- {language} ::= {lang} | ({lang}) - local MODELINE_FORMAT = "^;+%s*inherits%s*:?%s*([a-z_,()]+)%s*$" + local MODELINE_FORMAT = '^;+%s*inherits%s*:?%s*([a-z_,()]+)%s*$' for _, file in ipairs(lang_files) do local modeline = safe_read(file, '*l') @@ -62,7 +64,7 @@ function M.get_query_files(lang, query_name, is_included) if langlist then for _, incllang in ipairs(vim.split(langlist, ',', true)) do - local is_optional = incllang:match("%(.*%)") + local is_optional = incllang:match('%(.*%)') if is_optional then if not is_included then @@ -90,7 +92,7 @@ end local function read_query_files(filenames) local contents = {} - for _,filename in ipairs(filenames) do + for _, filename in ipairs(filenames) do table.insert(contents, safe_read(filename, '*a')) end @@ -142,7 +144,7 @@ local query_cache = setmetatable({}, { __index = function(tbl, key) rawset(tbl, key, {}) return rawget(tbl, key) - end + end, }) --- Parse {query} as a string. (If the query is in a file, the caller @@ -185,7 +187,7 @@ function M.get_node_text(node, source) local start_row, start_col, start_byte = node:start() local end_row, end_col, end_byte = node:end_() - if type(source) == "number" then + if type(source) == 'number' then local lines local eof_row = a.nvim_buf_line_count(source) if start_row >= eof_row then @@ -201,56 +203,56 @@ function M.get_node_text(node, source) if #lines > 0 then if #lines == 1 then - lines[1] = string.sub(lines[1], start_col+1, end_col) + lines[1] = string.sub(lines[1], start_col + 1, end_col) else - lines[1] = string.sub(lines[1], start_col+1) + lines[1] = string.sub(lines[1], start_col + 1) lines[#lines] = string.sub(lines[#lines], 1, end_col) end end - return table.concat(lines, "\n") - elseif type(source) == "string" then - return source:sub(start_byte+1, end_byte) + return table.concat(lines, '\n') + elseif type(source) == 'string' then + return source:sub(start_byte + 1, end_byte) end end -- Predicate handler receive the following arguments -- (match, pattern, bufnr, predicate) local predicate_handlers = { - ["eq?"] = function(match, _, source, predicate) - local node = match[predicate[2]] - local node_text = M.get_node_text(node, source) - - local str - if type(predicate[3]) == "string" then - -- (#eq? @aa "foo") - str = predicate[3] - else - -- (#eq? @aa @bb) - str = M.get_node_text(match[predicate[3]], source) - end + ['eq?'] = function(match, _, source, predicate) + local node = match[predicate[2]] + local node_text = M.get_node_text(node, source) - if node_text ~= str or str == nil then - return false - end + local str + if type(predicate[3]) == 'string' then + -- (#eq? @aa "foo") + str = predicate[3] + else + -- (#eq? @aa @bb) + str = M.get_node_text(match[predicate[3]], source) + end + + if node_text ~= str or str == nil then + return false + end - return true + return true end, - ["lua-match?"] = function(match, _, source, predicate) - local node = match[predicate[2]] - local regex = predicate[3] - return string.find(M.get_node_text(node, source), regex) + ['lua-match?'] = function(match, _, source, predicate) + local node = match[predicate[2]] + local regex = predicate[3] + return string.find(M.get_node_text(node, source), regex) end, - ["match?"] = (function() - local magic_prefixes = {['\\v']=true, ['\\m']=true, ['\\M']=true, ['\\V']=true} + ['match?'] = (function() + local magic_prefixes = { ['\\v'] = true, ['\\m'] = true, ['\\M'] = true, ['\\V'] = true } ---@private local function check_magic(str) - if string.len(str) < 2 or magic_prefixes[string.sub(str,1,2)] then + if string.len(str) < 2 or magic_prefixes[string.sub(str, 1, 2)] then return str end - return '\\v'..str + return '\\v' .. str end local compiled_vim_regexes = setmetatable({}, { @@ -258,7 +260,7 @@ local predicate_handlers = { local res = vim.regex(check_magic(pattern)) rawset(t, pattern, res) return res - end + end, }) return function(match, _, source, pred) @@ -268,11 +270,11 @@ local predicate_handlers = { end end)(), - ["contains?"] = function(match, _, source, predicate) + ['contains?'] = function(match, _, source, predicate) local node = match[predicate[2]] local node_text = M.get_node_text(node, source) - for i=3,#predicate do + for i = 3, #predicate do if string.find(node_text, predicate[i], 1, true) then return true end @@ -281,19 +283,19 @@ local predicate_handlers = { return false end, - ["any-of?"] = function(match, _, source, predicate) + ['any-of?'] = function(match, _, source, predicate) local node = match[predicate[2]] local node_text = M.get_node_text(node, source) -- Since 'predicate' will not be used by callers of this function, use it -- to store a string set built from the list of words to check against. - local string_set = predicate["string_set"] + local string_set = predicate['string_set'] if not string_set then string_set = {} - for i=3,#predicate do + for i = 3, #predicate do string_set[predicate[i]] = true end - predicate["string_set"] = string_set + predicate['string_set'] = string_set end return string_set[node_text] @@ -301,15 +303,14 @@ local predicate_handlers = { } -- As we provide lua-match? also expose vim-match? -predicate_handlers["vim-match?"] = predicate_handlers["match?"] - +predicate_handlers['vim-match?'] = predicate_handlers['match?'] -- Directives store metadata or perform side effects against a match. -- Directives should always end with a `!`. -- Directive handler receive the following arguments -- (match, pattern, bufnr, predicate, metadata) local directive_handlers = { - ["set!"] = function(_, _, _, pred, metadata) + ['set!'] = function(_, _, _, pred, metadata) if #pred == 4 then -- (#set! @capture "key" "value") local capture = pred[2] @@ -324,9 +325,9 @@ local directive_handlers = { end, -- Shifts the range of a node. -- Example: (#offset! @_node 0 1 0 -1) - ["offset!"] = function(match, _, _, pred, metadata) + ['offset!'] = function(match, _, _, pred, metadata) local offset_node = match[pred[2]] - local range = {offset_node:range()} + local range = { offset_node:range() } local start_row_offset = pred[3] or 0 local start_col_offset = pred[4] or 0 local end_row_offset = pred[5] or 0 @@ -339,9 +340,9 @@ local directive_handlers = { -- If this produces an invalid range, we just skip it. if range[1] < range[3] or (range[1] == range[3] and range[2] <= range[4]) then - metadata.content = {range} + metadata.content = { range } end - end + end, } --- Adds a new predicate to be used in queries @@ -351,7 +352,7 @@ local directive_handlers = { --- signature will be (match, pattern, bufnr, predicate) function M.add_predicate(name, handler, force) if predicate_handlers[name] and not force then - error(string.format("Overriding %s", name)) + error(string.format('Overriding %s', name)) end predicate_handlers[name] = handler @@ -364,7 +365,7 @@ end --- signature will be (match, pattern, bufnr, predicate) function M.add_directive(name, handler, force) if directive_handlers[name] and not force then - error(string.format("Overriding %s", name)) + error(string.format('Overriding %s', name)) end directive_handlers[name] = handler @@ -387,7 +388,7 @@ end ---@private local function is_directive(name) - return string.sub(name, -1) == "!" + return string.sub(name, -1) == '!' end ---@private @@ -404,7 +405,7 @@ function Query:match_preds(match, pattern, source) -- Skip over directives... they will get processed after all the predicates. if not is_directive(pred[1]) then - if string.sub(pred[1], 1, 4) == "not-" then + if string.sub(pred[1], 1, 4) == 'not-' then pred_name = string.sub(pred[1], 5) is_not = true else @@ -415,7 +416,7 @@ function Query:match_preds(match, pattern, source) local handler = predicate_handlers[pred_name] if not handler then - error(string.format("No handler for %s", pred[1])) + error(string.format('No handler for %s', pred[1])) return false end @@ -438,7 +439,7 @@ function Query:apply_directives(match, pattern, source, metadata) local handler = directive_handlers[pred[1]] if not handler then - error(string.format("No handler for %s", pred[1])) + error(string.format('No handler for %s', pred[1])) return end @@ -447,7 +448,6 @@ function Query:apply_directives(match, pattern, source, metadata) end end - --- Returns the start and stop value if set else the node's range. -- When the node's range is used, the stop is incremented by 1 -- to make the search inclusive. @@ -492,7 +492,7 @@ end ---@returns The matching capture id ---@returns The captured node function Query:iter_captures(node, source, start, stop) - if type(source) == "number" and source == 0 then + if type(source) == 'number' and source == 0 then source = vim.api.nvim_get_current_buf() end @@ -549,7 +549,7 @@ end ---@returns The matching pattern id ---@returns The matching match function Query:iter_matches(node, source, start, stop) - if type(source) == "number" and source == 0 then + if type(source) == 'number' and source == 0 then source = vim.api.nvim_get_current_buf() end diff --git a/runtime/lua/vim/ui.lua b/runtime/lua/vim/ui.lua index 165dada1b8..77bca7f6c4 100644 --- a/runtime/lua/vim/ui.lua +++ b/runtime/lua/vim/ui.lua @@ -37,12 +37,12 @@ local M = {} --- </pre> function M.select(items, opts, on_choice) - vim.validate { + vim.validate({ items = { items, 'table', false }, on_choice = { on_choice, 'function', false }, - } + }) opts = opts or {} - local choices = {opts.prompt or 'Select one of:'} + local choices = { opts.prompt or 'Select one of:' } local format_item = opts.format_item or tostring for i, item in pairs(items) do table.insert(choices, string.format('%d: %s', i, format_item(item))) @@ -83,9 +83,9 @@ end --- end) --- </pre> function M.input(opts, on_confirm) - vim.validate { + vim.validate({ on_confirm = { on_confirm, 'function', false }, - } + }) opts = opts or {} local input = vim.fn.input(opts) diff --git a/runtime/lua/vim/uri.lua b/runtime/lua/vim/uri.lua index 11b661cd1a..d6b0b7410e 100644 --- a/runtime/lua/vim/uri.lua +++ b/runtime/lua/vim/uri.lua @@ -3,7 +3,6 @@ -- https://tools.ietf.org/html/rfc2732 -- https://tools.ietf.org/html/rfc2396 - local uri_decode do local schar = string.char @@ -14,7 +13,7 @@ do return schar(tonumber(hex, 16)) end uri_decode = function(str) - return str:gsub("%%([a-fA-F0-9][a-fA-F0-9])", hex_to_char) + return str:gsub('%%([a-fA-F0-9][a-fA-F0-9])', hex_to_char) end end @@ -23,33 +22,36 @@ do local PATTERNS = { --- RFC 2396 -- https://tools.ietf.org/html/rfc2396#section-2.2 - rfc2396 = "^A-Za-z0-9%-_.!~*'()"; + rfc2396 = "^A-Za-z0-9%-_.!~*'()", --- RFC 2732 -- https://tools.ietf.org/html/rfc2732 - rfc2732 = "^A-Za-z0-9%-_.!~*'()[]"; + rfc2732 = "^A-Za-z0-9%-_.!~*'()[]", --- RFC 3986 -- https://tools.ietf.org/html/rfc3986#section-2.2 - rfc3986 = "^A-Za-z0-9%-._~!$&'()*+,;=:@/"; + rfc3986 = "^A-Za-z0-9%-._~!$&'()*+,;=:@/", } local sbyte, tohex = string.byte if jit then - tohex = require'bit'.tohex + tohex = require('bit').tohex else - tohex = function(b) return string.format("%02x", b) end + tohex = function(b) + return string.format('%02x', b) + end end ---@private local function percent_encode_char(char) - return "%"..tohex(sbyte(char), 2) + return '%' .. tohex(sbyte(char), 2) end uri_encode = function(text, rfc) - if not text then return end + if not text then + return + end local pattern = PATTERNS[rfc] or PATTERNS.rfc3986 - return text:gsub("(["..pattern.."])", percent_encode_char) + return text:gsub('([' .. pattern .. '])', percent_encode_char) end end - ---@private local function is_windows_file_uri(uri) return uri:match('^file:/+[a-zA-Z]:') ~= nil @@ -59,16 +61,16 @@ end ---@param path string Path to file ---@return string URI local function uri_from_fname(path) - local volume_path, fname = path:match("^([a-zA-Z]:)(.*)") + local volume_path, fname = path:match('^([a-zA-Z]:)(.*)') local is_windows = volume_path ~= nil if is_windows then - path = volume_path..uri_encode(fname:gsub("\\", "/")) + path = volume_path .. uri_encode(fname:gsub('\\', '/')) else path = uri_encode(path) end - local uri_parts = {"file://"} + local uri_parts = { 'file://' } if is_windows then - table.insert(uri_parts, "/") + table.insert(uri_parts, '/') end table.insert(uri_parts, path) return table.concat(uri_parts) @@ -82,11 +84,11 @@ local WINDOWS_URI_SCHEME_PATTERN = '^([a-zA-Z]+[a-zA-Z0-9.+-]*):[a-zA-Z]:.*' ---@return string URI local function uri_from_bufnr(bufnr) local fname = vim.api.nvim_buf_get_name(bufnr) - local volume_path = fname:match("^([a-zA-Z]:).*") + local volume_path = fname:match('^([a-zA-Z]:).*') local is_windows = volume_path ~= nil local scheme if is_windows then - fname = fname:gsub("\\", "/") + fname = fname:gsub('\\', '/') scheme = fname:match(WINDOWS_URI_SCHEME_PATTERN) else scheme = fname:match(URI_SCHEME_PATTERN) diff --git a/runtime/nvim.desktop b/runtime/nvim.desktop index 052904dd76..224353c6ad 100644 --- a/runtime/nvim.desktop +++ b/runtime/nvim.desktop @@ -1,6 +1,7 @@ [Desktop Entry] Name=Neovim GenericName=Text Editor +GenericName[ckb]=دەستکاریکەری دەق GenericName[de]=Texteditor GenericName[fr]=Éditeur de texte GenericName[ru]=Текстовый редактор @@ -16,6 +17,7 @@ Comment[bg]=Редактиране на текстови файлове Comment[bn]=টেক্স্ট ফাইল এডিট করুন Comment[bs]=Izmijeni tekstualne datoteke Comment[ca]=Edita fitxers de text +Comment[ckb]=دەستکاریی فایلی دەق بکە Comment[cs]=Úprava textových souborů Comment[cy]=Golygu ffeiliau testun Comment[da]=Redigér tekstfiler @@ -79,6 +81,7 @@ Exec=nvim %F Terminal=true Type=Application Keywords=Text;editor; +Keywords[ckb]=دەق;دەستکاریکەر; Keywords[fr]=Texte;éditeur; Keywords[ru]=текст;текстовый редактор; Keywords[sr]=Текст;едитор; diff --git a/runtime/optwin.vim b/runtime/optwin.vim index a13e945098..493f7b57d0 100644 --- a/runtime/optwin.vim +++ b/runtime/optwin.vim @@ -956,7 +956,6 @@ call <SID>Header("mapping") call append("$", "maxmapdepth\tmaximum depth of mapping") call append("$", " \tset mmd=" . &mmd) call append("$", "remap\trecognize mappings in mapped keys") -call <SID>BinOptionG("remap", &remap) call append("$", "timeout\tallow timing out halfway into a mapping") call <SID>BinOptionG("to", &to) call append("$", "ttimeout\tallow timing out halfway into a key code") diff --git a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim index ab1871fe60..4f2f7b942d 100644 --- a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim +++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim @@ -2,7 +2,7 @@ " " Author: Bram Moolenaar " Copyright: Vim license applies, see ":help license" -" Last Change: 2022 May 04 +" Last Change: 2022 May 09 " " WORK IN PROGRESS - The basics works stable, more to come " Note: In general you need at least GDB 7.12 because this provides the @@ -205,8 +205,8 @@ func s:CheckGdbRunning() return 'ok' endfunc +" Open a terminal window without a job, to run the debugged program in. func s:StartDebug_term(dict) - " Open a terminal window without a job, to run the debugged program in. execute s:vertical ? 'vnew' : 'new' let s:pty_job_id = termopen('tail -f /dev/null;#gdb program') if s:pty_job_id == 0 @@ -365,8 +365,8 @@ func s:StartDebug_term(dict) call s:StartDebugCommon(a:dict) endfunc +" Open a window with a prompt buffer to run gdb in. func s:StartDebug_prompt(dict) - " Open a window with a prompt buffer to run gdb in. if s:vertical vertical new else diff --git a/runtime/syntax/debchangelog.vim b/runtime/syntax/debchangelog.vim index 8d09af0886..2efd919772 100644 --- a/runtime/syntax/debchangelog.vim +++ b/runtime/syntax/debchangelog.vim @@ -3,7 +3,7 @@ " Maintainer: Debian Vim Maintainers " Former Maintainers: Gerfried Fuchs <alfie@ist.org> " Wichert Akkerman <wakkerma@debian.org> -" Last Change: 2022 Mar 28 +" Last Change: 2022 May 01 " URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debchangelog.vim " Standard syntax initialization @@ -24,7 +24,7 @@ let s:supported = [ \ 'jessie', 'stretch', 'buster', 'bullseye', 'bookworm', \ 'trixie', 'sid', 'rc-buggy', \ - \ 'trusty', 'xenial', 'bionic', 'focal', 'impish', 'jammy', + \ 'trusty', 'xenial', 'bionic', 'focal', 'impish', 'jammy', 'kinetic', \ 'devel' \ ] let s:unsupported = [ diff --git a/runtime/syntax/debcontrol.vim b/runtime/syntax/debcontrol.vim index 8b65ece4ca..4c7fb5dd63 100644 --- a/runtime/syntax/debcontrol.vim +++ b/runtime/syntax/debcontrol.vim @@ -3,7 +3,7 @@ " Maintainer: Debian Vim Maintainers " Former Maintainers: Gerfried Fuchs <alfie@ist.org> " Wichert Akkerman <wakkerma@debian.org> -" Last Change: 2021 Nov 26 +" Last Change: 2022 May 11 " URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debcontrol.vim " Standard syntax initialization @@ -17,7 +17,7 @@ set cpo&vim " Should match case except for the keys of each field syn case match -syn iskeyword @,48-57,-,/ +syn iskeyword @,48-57,- " Everything that is not explicitly matched by the rules below syn match debcontrolElse "^.*$" diff --git a/runtime/syntax/debsources.vim b/runtime/syntax/debsources.vim index d79ce4b573..e3ec6e6598 100644 --- a/runtime/syntax/debsources.vim +++ b/runtime/syntax/debsources.vim @@ -2,7 +2,7 @@ " Language: Debian sources.list " Maintainer: Debian Vim Maintainers " Former Maintainer: Matthijs Mohlmann <matthijs@cacholong.nl> -" Last Change: 2022 Mar 28 +" Last Change: 2022 May 01 " URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debsources.vim " Standard syntax initialization @@ -26,7 +26,7 @@ let s:supported = [ \ 'jessie', 'stretch', 'buster', 'bullseye', 'bookworm', \ 'trixie', 'sid', 'rc-buggy', \ - \ 'trusty', 'xenial', 'bionic', 'focal', 'impish', 'jammy', + \ 'trusty', 'xenial', 'bionic', 'focal', 'impish', 'jammy', 'kinetic', \ 'devel' \ ] let s:unsupported = [ diff --git a/runtime/syntax/man.vim b/runtime/syntax/man.vim index 55b0e16de9..89162f1e20 100644 --- a/runtime/syntax/man.vim +++ b/runtime/syntax/man.vim @@ -10,7 +10,7 @@ syntax match manReference display '[^()[:space:]]\+(\%([0-9][a-z]*\|[nlpox] syntax match manSectionHeading display '^\S.*$' syntax match manHeader display '^\%1l.*$' syntax match manSubHeading display '^ \{3\}\S.*$' -syntax match manOptionDesc display '^\s\+\%(+\|-\)\S\+' +syntax match manOptionDesc display '^\s\+\(\%(+\|-\)\S\+,\s\+\)*\%(+\|-\)\S\+' highlight default link manHeader Title highlight default link manSectionHeading Statement diff --git a/runtime/syntax/query.lua b/runtime/syntax/query.lua index e24ff65360..8f40b1cb8a 100644 --- a/runtime/syntax/query.lua +++ b/runtime/syntax/query.lua @@ -3,4 +3,4 @@ -- Last Change: 2022 Apr 13 -- it's a lisp! -vim.cmd [[ runtime! syntax/lisp.vim ]] +vim.cmd([[ runtime! syntax/lisp.vim ]]) diff --git a/runtime/syntax/scdoc.vim b/runtime/syntax/scdoc.vim index 25c9c5433b..0180f35027 100644 --- a/runtime/syntax/scdoc.vim +++ b/runtime/syntax/scdoc.vim @@ -1,6 +1,7 @@ " Syntax file for scdoc files -" Maintainer: Gregory Anders <greg@gpanders.com> -" Last Updated: 2021-08-04 +" Maintainer: Gregory Anders <contact@gpanders.com> +" Last Updated: 2022-05-09 +" Upstream: https://github.com/gpanders/vim-scdoc if exists('b:current_syntax') finish @@ -20,33 +21,43 @@ syntax match scdocIndentError "^[ ]\+" syntax match scdocLineBreak "++$" -syntax match scdocOrderedListMarker "^\s*\.\%(\s\+\S\)\@=" -syntax match scdocListMarker "^\s*-\%(\s\+\S\)\@=" +syntax region scdocOrderedListItem matchgroup=scdocOrderedListMarker start="^\z(\s*\)\." skip="^\z1 .*$" end="^" contains=scdocBold,scdocUnderline +syntax region scdocListItem matchgroup=scdocListMarker start="^\z(\s*\)-" skip="^\z1 .*$" end="^" contains=scdocBold,scdocUnderline -syntax match scdocTableStartMarker "^[\[|\]][\[\-\]]" -syntax match scdocTableMarker "^[|:][\[\-\] ]" +" Tables cannot start with a column +syntax match scdocTableError "^:" + +syntax region scdocTable matchgroup=scdocTableEntry start="^[\[|\]][\[\-\]<=>]" end="^$" contains=scdocTableEntry,scdocTableError,scdocTableContinuation,scdocBold,scdocUnderline,scdocPre +syntax match scdocTableError "^.*$" contained +syntax match scdocTableContinuation "^ \+\S\+" contained +syntax match scdocTableEntry "^[|:][\[\-\]<=> ]" contained +syntax match scdocTableError "^[|:][\[\-\]<=> ]\S.*$" contained syntax region scdocBold concealends matchgroup=scdocBoldDelimiter start="\\\@<!\*" end="\\\@<!\*" syntax region scdocUnderline concealends matchgroup=scdocUnderlineDelimiter start="\<\\\@<!_" end="\\\@<!_\>" syntax region scdocPre matchgroup=scdocPreDelimiter start="^\t*```" end="^\t*```" -hi link scdocFirstLineValid Comment -hi link scdocComment Comment -hi link scdocHeader Title -hi link scdocOrderedListMarker Statement -hi link scdocListMarker scdocOrderedListMarker -hi link scdocLineBreak Special -hi link scdocTableMarker Statement -hi link scdocTableStartMarker scdocTableMarker - -hi link scdocFirstLineError Error -hi link scdocCommentError Error -hi link scdocHeaderError Error -hi link scdocIndentError Error - -hi link scdocPreDelimiter Delimiter - -hi scdocBold term=bold cterm=bold gui=bold -hi scdocUnderline term=underline cterm=underline gui=underline -hi link scdocBoldDelimiter scdocBold -hi link scdocUnderlineDelimiter scdocUnderline +syntax sync minlines=50 + +hi default link scdocFirstLineValid Comment +hi default link scdocComment Comment +hi default link scdocHeader Title +hi default link scdocOrderedListMarker Statement +hi default link scdocListMarker scdocOrderedListMarker +hi default link scdocLineBreak Special +hi default link scdocTableSpecifier Statement +hi default link scdocTableEntry Statement + +hi default link scdocFirstLineError Error +hi default link scdocCommentError Error +hi default link scdocHeaderError Error +hi default link scdocIndentError Error +hi default link scdocTableError Error +hi default link scdocTableError Error + +hi default link scdocPreDelimiter Delimiter + +hi default scdocBold term=bold cterm=bold gui=bold +hi default scdocUnderline term=underline cterm=underline gui=underline +hi default link scdocBoldDelimiter scdocBold +hi default link scdocUnderlineDelimiter scdocUnderline diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index 0e6ec19ff8..5a0dd4f2d7 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -120,9 +120,6 @@ else com! -nargs=* VimFoldt <args> endif -" commands not picked up by the generator (due to non-standard format) {{{2 -syn keyword vimCommand contained py3 - " Deprecated variable options {{{2 if exists("g:vim_minlines") let g:vimsyn_minlines= g:vim_minlines diff --git a/scripts/gen_vimdoc.py b/scripts/gen_vimdoc.py index 57b46a381e..755749cef6 100755 --- a/scripts/gen_vimdoc.py +++ b/scripts/gen_vimdoc.py @@ -79,13 +79,11 @@ LOG_LEVELS = { ] } -fmt_vimhelp = False # HACK text_width = 78 script_path = os.path.abspath(__file__) base_dir = os.path.dirname(os.path.dirname(script_path)) out_dir = os.path.join(base_dir, 'tmp-{target}-doc') filter_cmd = '%s %s' % (sys.executable, script_path) -seen_funcs = set() msgs = [] # Messages to show on exit. lua2dox_filter = os.path.join(base_dir, 'scripts', 'lua2dox_filter') @@ -287,11 +285,6 @@ annotation_map = { } -# Tracks `xrefsect` titles. As of this writing, used only for separating -# deprecated functions. -xrefs = set() - - # Raises an error with details about `o`, if `cond` is in object `o`, # or if `cond()` is callable and returns True. def debug_this(o, cond=True): @@ -485,10 +478,8 @@ def update_params_map(parent, ret_map, width=62): return ret_map -def render_node(n, text, prefix='', indent='', width=62): +def render_node(n, text, prefix='', indent='', width=62, fmt_vimhelp=False): """Renders a node as Vim help text, recursively traversing all descendants.""" - global fmt_vimhelp - global has_seen_preformatted def ind(s): return s if fmt_vimhelp else '' @@ -566,7 +557,7 @@ def render_node(n, text, prefix='', indent='', width=62): return text -def para_as_map(parent, indent='', width=62): +def para_as_map(parent, indent='', width=62, fmt_vimhelp=False): """Extracts a Doxygen XML <para> node to a map. Keys: @@ -599,7 +590,8 @@ def para_as_map(parent, indent='', width=62): last = '' if is_inline(parent): # Flatten inline text from a tree of non-block nodes. - text = doc_wrap(render_node(parent, ""), indent=indent, width=width) + text = doc_wrap(render_node(parent, "", fmt_vimhelp=fmt_vimhelp), + indent=indent, width=width) else: prev = None # Previous node for child in parent.childNodes: @@ -615,7 +607,8 @@ def para_as_map(parent, indent='', width=62): elif kind == 'see': groups['seealso'].append(child) elif kind in ('note', 'warning'): - text += render_node(child, text, indent=indent, width=width) + text += render_node(child, text, indent=indent, + width=width, fmt_vimhelp=fmt_vimhelp) else: raise RuntimeError('unhandled simplesect: {}\n{}'.format( child.nodeName, child.toprettyxml(indent=' ', newl='\n'))) @@ -628,7 +621,8 @@ def para_as_map(parent, indent='', width=62): and ' ' != text[-1]): text += ' ' - text += render_node(child, text, indent=indent, width=width) + text += render_node(child, text, indent=indent, width=width, + fmt_vimhelp=fmt_vimhelp) prev = child chunks['text'] += text @@ -639,10 +633,12 @@ def para_as_map(parent, indent='', width=62): update_params_map(child, ret_map=chunks['params'], width=width) for child in groups['return']: chunks['return'].append(render_node( - child, '', indent=indent, width=width)) + child, '', indent=indent, width=width, fmt_vimhelp=fmt_vimhelp)) for child in groups['seealso']: chunks['seealso'].append(render_node( - child, '', indent=indent, width=width)) + child, '', indent=indent, width=width, fmt_vimhelp=fmt_vimhelp)) + + xrefs = set() for child in groups['xrefs']: # XXX: Add a space (or any char) to `title` here, otherwise xrefs # ("Deprecated" section) acts very weird... @@ -652,10 +648,10 @@ def para_as_map(parent, indent='', width=62): chunks['xrefs'].append(doc_wrap(xrefdesc, prefix='{}: '.format(title), width=width) + '\n') - return chunks + return chunks, xrefs -def fmt_node_as_vimhelp(parent, width=62, indent=''): +def fmt_node_as_vimhelp(parent, width=62, indent='', fmt_vimhelp=False): """Renders (nested) Doxygen <para> nodes as Vim :help text. NB: Blank lines in a docstring manifest as <para> tags. @@ -678,7 +674,7 @@ def fmt_node_as_vimhelp(parent, width=62, indent=''): return True for child in parent.childNodes: - para = para_as_map(child, indent, width) + para, _ = para_as_map(child, indent, width, fmt_vimhelp) # Generate text from the gathered items. chunks = [para['text']] @@ -702,19 +698,16 @@ def fmt_node_as_vimhelp(parent, width=62, indent=''): return clean_lines('\n'.join(rendered_blocks).strip()) -def extract_from_xml(filename, target, width): +def extract_from_xml(filename, target, width, fmt_vimhelp): """Extracts Doxygen info as maps without formatting the text. Returns two maps: 1. Functions 2. Deprecated functions - The `fmt_vimhelp` global controls some special cases for use by + The `fmt_vimhelp` variable controls some special cases for use by fmt_doxygen_xml_as_vimhelp(). (TODO: ugly :) """ - global xrefs - global fmt_vimhelp - xrefs.clear() fns = {} # Map of func_name:docstring. deprecated_fns = {} # Map of func_name:docstring. @@ -821,16 +814,22 @@ def extract_from_xml(filename, target, width): signature = prefix + suffix signature += vimtag.rjust(width - len(signature)) + # Tracks `xrefsect` titles. As of this writing, used only for separating + # deprecated functions. + xrefs_all = set() paras = [] brief_desc = find_first(member, 'briefdescription') if brief_desc: for child in brief_desc.childNodes: - paras.append(para_as_map(child)) + para, xrefs = para_as_map(child) + xrefs_all.update(xrefs) desc = find_first(member, 'detaileddescription') if desc: for child in desc.childNodes: - paras.append(para_as_map(child)) + para, xrefs = para_as_map(child) + paras.append(para) + xrefs_all.update(xrefs) log.debug( textwrap.indent( re.sub(r'\n\s*\n+', '\n', @@ -846,7 +845,6 @@ def extract_from_xml(filename, target, width): 'seealso': [], } if fmt_vimhelp: - # HACK :( fn['desc_node'] = desc fn['brief_desc_node'] = brief_desc @@ -865,18 +863,16 @@ def extract_from_xml(filename, target, width): if INCLUDE_C_DECL: fn['c_decl'] = c_decl - if 'Deprecated' in str(xrefs): + if 'Deprecated' in str(xrefs_all): deprecated_fns[name] = fn elif name.startswith(CONFIG[target]['fn_name_prefix']): fns[name] = fn - xrefs.clear() - fns = collections.OrderedDict(sorted( fns.items(), key=lambda key_item_tuple: key_item_tuple[0].lower())) deprecated_fns = collections.OrderedDict(sorted(deprecated_fns.items())) - return (fns, deprecated_fns) + return fns, deprecated_fns def fmt_doxygen_xml_as_vimhelp(filename, target): @@ -886,16 +882,14 @@ def fmt_doxygen_xml_as_vimhelp(filename, target): 1. Vim help text for functions found in `filename`. 2. Vim help text for deprecated functions. """ - global fmt_vimhelp - fmt_vimhelp = True fns_txt = {} # Map of func_name:vim-help-text. deprecated_fns_txt = {} # Map of func_name:vim-help-text. - fns, _ = extract_from_xml(filename, target, width=text_width) + fns, _ = extract_from_xml(filename, target, text_width, True) for name, fn in fns.items(): # Generate Vim :help for parameters. if fn['desc_node']: - doc = fmt_node_as_vimhelp(fn['desc_node']) + doc = fmt_node_as_vimhelp(fn['desc_node'], fmt_vimhelp=True) if not doc and fn['brief_desc_node']: doc = fmt_node_as_vimhelp(fn['brief_desc_node']) if not doc: @@ -948,14 +942,9 @@ def fmt_doxygen_xml_as_vimhelp(filename, target): func_doc = "\n".join(split_lines) - if 'Deprecated' in xrefs: - deprecated_fns_txt[name] = func_doc - elif name.startswith(CONFIG[target]['fn_name_prefix']): + if name.startswith(CONFIG[target]['fn_name_prefix']): fns_txt[name] = func_doc - xrefs.clear() - - fmt_vimhelp = False return ('\n\n'.join(list(fns_txt.values())), '\n\n'.join(list(deprecated_fns_txt.values()))) @@ -1059,7 +1048,7 @@ def main(config, args): xmlfile = os.path.join(base, '{}.xml'.format(compound.getAttribute('refid'))) # Extract unformatted (*.mpack). - fn_map, _ = extract_from_xml(xmlfile, target, width=9999) + fn_map, _ = extract_from_xml(xmlfile, target, 9999, False) # Extract formatted (:help). functions_text, deprecated_text = fmt_doxygen_xml_as_vimhelp( os.path.join(base, '{}.xml'.format( diff --git a/scripts/genvimvim.lua b/scripts/genvimvim.lua index ff60b6cce7..7e9d649cb4 100644 --- a/scripts/genvimvim.lua +++ b/scripts/genvimvim.lua @@ -44,12 +44,13 @@ local function cmd_kw(prev_cmd, cmd) end -- Exclude these from the vimCommand keyword list, they are handled specially --- in syntax/vim.vim (vimAugroupKey, vimAutoCmd). #9327 -local function is_autocmd_cmd(cmd) +-- in syntax/vim.vim (vimAugroupKey, vimAutoCmd, vimSubst). #9327 +local function is_special_cased_cmd(cmd) return (cmd == 'augroup' or cmd == 'autocmd' or cmd == 'doautocmd' - or cmd == 'doautoall') + or cmd == 'doautoall' + or cmd == 'substitute') end local vimcmd_start = 'syn keyword vimCommand contained ' @@ -60,7 +61,7 @@ for _, cmd_desc in ipairs(ex_cmds.cmds) do w('\n' .. vimcmd_start) end local cmd = cmd_desc.command - if cmd:match('%w') and cmd ~= 'z' and not is_autocmd_cmd(cmd) then + if cmd:match('%w') and cmd ~= 'z' and not is_special_cased_cmd(cmd) then w(' ' .. cmd_kw(prev_cmd, cmd)) end prev_cmd = cmd diff --git a/scripts/lintcommit.lua b/scripts/lintcommit.lua index 6871858a0b..16326cfe66 100644 --- a/scripts/lintcommit.lua +++ b/scripts/lintcommit.lua @@ -45,8 +45,13 @@ end -- Returns nil if the given commit message is valid, or returns a string -- message explaining why it is invalid. local function validate_commit(commit_message) - local commit_split = vim.split(commit_message, ":") + -- Return nil if the commit message starts with "fixup" as it signifies it's + -- a work in progress and shouldn't be linted yet. + if vim.startswith(commit_message, "fixup") then + return nil + end + local commit_split = vim.split(commit_message, ":") -- Return nil if the type is vim-patch since most of the normal rules don't -- apply. if commit_split[1] == "vim-patch" then @@ -73,7 +78,7 @@ local function validate_commit(commit_message) -- Check if type is correct local type = vim.split(before_colon, "%(")[1] - local allowed_types = {'build', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'test', 'chore', 'vim-patch'} + local allowed_types = {'build', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'test', 'dist', 'vim-patch'} if not vim.tbl_contains(allowed_types, type) then return string.format( 'Invalid commit type "%s". Allowed types are:\n %s', @@ -176,13 +181,16 @@ function M._test() ['refactor: normal message'] = true, ['revert: normal message'] = true, ['test: normal message'] = true, - ['chore: normal message'] = true, + ['dist: normal message'] = true, ['ci(window): message with scope'] = true, ['ci!: message with breaking change'] = true, ['ci(tui)!: message with scope and breaking change'] = true, ['vim-patch:8.2.3374: Pyret files are not recognized (#15642)'] = true, ['vim-patch:8.1.1195,8.2.{3417,3419}'] = true, ['revert: "ci: use continue-on-error instead of "|| true""'] = true, + ['fixup'] = true, + ['fixup: commit message'] = true, + ['fixup! commit message'] = true, [':no type before colon 1'] = false, [' :no type before colon 2'] = false, [' :no type before colon 3'] = false, @@ -197,10 +205,10 @@ function M._test() ['ci :extra space before colon'] = false, ['refactor(): empty scope'] = false, ['ci( ): whitespace as scope'] = false, - ['chore: period at end of sentence.'] = false, + ['ci: period at end of sentence.'] = false, ['ci: Starting sentence capitalized'] = false, ['unknown: using unknown type'] = false, - ['chore: you\'re saying this commit message just goes on and on and on and on and on and on for way too long?'] = false, + ['ci: you\'re saying this commit message just goes on and on and on and on and on and on for way too long?'] = false, } local failed = 0 diff --git a/scripts/lua2dox.lua b/scripts/lua2dox.lua index c32370517c..6a206066b8 100644 --- a/scripts/lua2dox.lua +++ b/scripts/lua2dox.lua @@ -403,6 +403,29 @@ function TLua2DoX_filter.readfile(this,AppStamp,Filename) if string.sub(line, 3, 3) == '@' or string.sub(line, 1, 4) == '---@' then -- it's a magic comment state = 'in_magic_comment' local magic = string.sub(line, 4 + offset) + + local magic_split = string_split(magic, ' ') + + local type_index = 2 + if magic_split[1] == 'param' then + type_index = type_index + 1 + end + + if magic_split[type_index] == 'number' or + magic_split[type_index] == 'number|nil' or + magic_split[type_index] == 'string' or + magic_split[type_index] == 'string|nil' or + magic_split[type_index] == 'table' or + magic_split[type_index] == 'table|nil' or + magic_split[type_index] == 'boolean' or + magic_split[type_index] == 'boolean|nil' or + magic_split[type_index] == 'function' or + magic_split[type_index] == 'function|nil' + then + magic_split[type_index] = '(' .. magic_split[type_index] .. ')' + end + magic = table.concat(magic_split, ' ') + outStream:writeln('/// @' .. magic) fn_magic = checkComment4fn(fn_magic,magic) elseif string.sub(line,3,3)=='-' then -- it's a nonmagic doc comment diff --git a/scripts/update_terminfo.sh b/scripts/update_terminfo.sh index 0cfc230ca6..8a0937cc8c 100755 --- a/scripts/update_terminfo.sh +++ b/scripts/update_terminfo.sh @@ -64,6 +64,8 @@ cat > "$target" <<EOF // This is an open source non-commercial project. Dear PVS-Studio, please check // it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com +// uncrustify:off + // // Generated by scripts/update_terminfo.sh and $(tic -V) // @@ -84,8 +86,8 @@ for term in $sorted_terms; do infocmp -L -1 -A "$db" "$term" | sed -e '1d' -e 's#^#// #' | tr '\t' ' ' printf 'static const int8_t %s[] = {\n' "${entries[$term]}" printf ' ' - od -v -t d1 < "$path" | cut -c9- | xargs | tr ' ' ',' | tr -d '\n' - printf ' // NOLINT\n};\n' + od -v -t d1 < "$path" | cut -c9- | xargs | tr ' ' ',' + printf '};\n' done >> "$target" cat >> "$target" <<EOF diff --git a/scripts/vim-patch.sh b/scripts/vim-patch.sh index 57f51d9d46..e7e8f0b274 100755 --- a/scripts/vim-patch.sh +++ b/scripts/vim-patch.sh @@ -239,6 +239,10 @@ preprocess_patch() { LC_ALL=C sed -e 's/\( [ab]\/src\/nvim\)\/highlight\(\.[ch]\)/\1\/highlight_group\2/g' \ "$file" > "$file".tmp && mv "$file".tmp "$file" + # Rename keymap.h to keycodes.h + LC_ALL=C sed -e 's/\( [ab]\/src\/nvim\)\/keymap\.h/\1\/keycodes.h/g' \ + "$file" > "$file".tmp && mv "$file".tmp "$file" + # Rename test_urls.vim to check_urls.vim LC_ALL=C sed -e 's@\( [ab]\)/runtime/doc/test\(_urls\.vim\)@\1/scripts/check\2@g' \ "$file" > "$file".tmp && mv "$file".tmp "$file" diff --git a/src/clint.py b/src/clint.py index befb10c9c7..b0992fcd63 100755 --- a/src/clint.py +++ b/src/clint.py @@ -175,7 +175,6 @@ _ERROR_CATEGORIES = [ 'build/header_guard', 'build/include', 'build/include_alpha', - 'build/include_order', 'build/printf_format', 'build/storage_class', 'build/useless_fattr', @@ -200,18 +199,15 @@ _ERROR_CATEGORIES = [ 'whitespace/alignment', 'whitespace/blank_line', 'whitespace/braces', - 'whitespace/comma', 'whitespace/comments', 'whitespace/empty_conditional_body', 'whitespace/empty_loop_body', 'whitespace/end_of_line', 'whitespace/ending_newline', 'whitespace/indent', - 'whitespace/line_length', 'whitespace/newline', 'whitespace/operators', 'whitespace/parens', - 'whitespace/semicolon', 'whitespace/tab', 'whitespace/todo', 'whitespace/line_continuation', @@ -265,7 +261,7 @@ _valid_extensions = {'c', 'h'} _RE_COMMENTLINE = re.compile(r'^\s*//') -def ParseNolintSuppressions(filename, raw_line, linenum, error): +def ParseNolintSuppressions(raw_line, linenum): """Updates the global list of error-suppressions. Parses any NOLINT comments on the current line, updating the global @@ -273,10 +269,8 @@ def ParseNolintSuppressions(filename, raw_line, linenum, error): was malformed. Args: - filename: str, the name of the input file. raw_line: str, the line of input text, with comments. linenum: int, the number of the current line. - error: function, an error handler. """ # FIXME(adonovan): "NOLINT(" is misparsed as NOLINT(*). matched = _RE_SUPPRESSION.search(raw_line) @@ -463,6 +457,7 @@ class _CppLintState: self.filters = _DEFAULT_FILTERS[:] self.counting = 'total' # In what way are we counting errors? self.errors_by_category = {} # string to int dict storing error counts + self.stdin_filename = '' # output format: # "emacs" - format that emacs can parse (default) @@ -658,7 +653,8 @@ class FileInfo: def FullName(self): """Make Windows paths like Unix.""" - return os.path.abspath(self._filename).replace('\\', '/') + abspath = str(os.path.abspath(self._filename)) + return abspath.replace('\\', '/') def RelativePath(self): """FullName with <prefix>/src/nvim/ chopped off.""" @@ -1100,6 +1096,7 @@ def ReverseCloseExpression(clean_lines, linenum, pos): """ line = clean_lines.elided[linenum] endchar = line[pos] + startchar = None if endchar not in ')}]>': return (line, 0, -1) if endchar == ')': @@ -1209,8 +1206,7 @@ def CheckForHeaderGuard(filename, lines, error): if ifndef != cppvar + '_': error_level = 5 - ParseNolintSuppressions(filename, lines[ifndef_linenum], ifndef_linenum, - error) + ParseNolintSuppressions(lines[ifndef_linenum], ifndef_linenum) error(filename, ifndef_linenum, 'build/header_guard', error_level, '#ifndef header guard has wrong style, please use: %s' % cppvar) @@ -1225,8 +1221,7 @@ def CheckForHeaderGuard(filename, lines, error): if endif != ('#endif // %s' % (cppvar + '_')): error_level = 5 - ParseNolintSuppressions(filename, lines[endif_linenum], endif_linenum, - error) + ParseNolintSuppressions(lines[endif_linenum], endif_linenum) error(filename, endif_linenum, 'build/header_guard', error_level, '#endif line should be "#endif // %s"' % cppvar) @@ -1452,12 +1447,6 @@ def CheckOSFunctions(filename, clean_lines, linenum, error): '...) instead of ' + function + '...).') -# Matches invalid increment: *count++, which moves pointer instead of -# incrementing a value. -_RE_PATTERN_INVALID_INCREMENT = re.compile( - r'^\s*\*\w+(\+\+|--);') - - class _BlockInfo: """Stores information about a generic block of code.""" @@ -1564,14 +1553,12 @@ class _NestingState: # TODO(unknown): unexpected #endif, issue warning? pass - def Update(self, filename, clean_lines, linenum, error): + def Update(self, clean_lines, linenum): """Update nesting state with current line. Args: - filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. - error: The function to call with any errors found. """ line = clean_lines.elided[linenum] @@ -1637,8 +1624,7 @@ class _NestingState: line = matched.group(2) -def CheckForNonStandardConstructs(filename, clean_lines, linenum, - nesting_state, error): +def CheckForNonStandardConstructs(filename, clean_lines, linenum, error): r"""Logs an error if we see certain non-ANSI constructs ignored by gcc-2. Complain about several constructs which gcc-2 accepts, but which are @@ -1660,8 +1646,6 @@ def CheckForNonStandardConstructs(filename, clean_lines, linenum, filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. - nesting_state: A _NestingState instance which maintains information about - the current stack of nested blocks being parsed. error: A callable to which errors are reported, which takes 4 arguments: filename, line number, error level, and message """ @@ -2120,7 +2104,7 @@ def CheckExpressionAlignment(filename, clean_lines, linenum, error, startpos=0): del level_starts[depth] -def CheckSpacing(filename, clean_lines, linenum, nesting_state, error): +def CheckSpacing(filename, clean_lines, linenum, error): """Checks for the correctness of various spacing issues in the code. Things we check for: spaces around operators, spaces after @@ -2134,8 +2118,6 @@ def CheckSpacing(filename, clean_lines, linenum, nesting_state, error): filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. - nesting_state: A _NestingState instance which maintains information about - the current stack of nested blocks being parsed. error: The function to call with any errors found. """ @@ -2378,29 +2360,6 @@ def CheckSpacing(filename, clean_lines, linenum, nesting_state, error): 'Should have zero or one spaces inside ( and ) in %s' % match.group(1)) - # You should always have a space after a comma (either as fn arg or - # operator). - # - # This does not apply when the non-space character following the - # comma is another comma, since the only time when that happens is - # for empty macro arguments. - # - # We run this check in two passes: first pass on elided lines to - # verify that lines contain missing whitespaces, second pass on raw - # lines to confirm that those missing whitespaces are not due to - # elided comments. - if Search(r',[^,\s]', line) and Search(r',[^,\s]', raw[linenum]): - error(filename, linenum, 'whitespace/comma', 3, - 'Missing space after ,') - - # You should always have a space after a semicolon - # except for few corner cases - # TODO(unknown): clarify if 'if (1) { return 1;}' is requires one more - # space after ; - if Search(r';[^\s};\\)/]', line): - error(filename, linenum, 'whitespace/semicolon', 3, - 'Missing space after ;') - # Next we will look for issues with function calls. CheckSpacingForFunctionCall(filename, line, linenum, error) @@ -2463,19 +2422,6 @@ def CheckSpacing(filename, clean_lines, linenum, nesting_state, error): error(filename, linenum, 'whitespace/braces', 5, 'Extra space before [') - # You shouldn't have a space before a semicolon at the end of the line. - if Search(r':\s*;\s*$', line): - error(filename, linenum, 'whitespace/semicolon', 5, - 'Semicolon defining empty statement. Use {} instead.') - elif Search(r'^\s*;\s*$', line): - error(filename, linenum, 'whitespace/semicolon', 5, - 'Line contains only semicolon. If this should be an empty' - ' statement, use {} instead.') - elif Search(r'\s+;\s*$', line): - error(filename, linenum, 'whitespace/semicolon', 5, - 'Extra space before last semicolon. If this should be an empty ' - 'statement, use {} instead.') - if Search(r'\{(?!\})\S', line): error(filename, linenum, 'whitespace/braces', 5, 'Missing space after {') @@ -2830,8 +2776,7 @@ def GetLineWidth(line): return len(line) -def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state, - error): +def CheckStyle(filename, clean_lines, linenum, error): """Checks rules from the 'C++ style rules' section of cppguide.html. Most of these rules are hard to test (naming, comment style), but we @@ -2842,9 +2787,6 @@ def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state, filename: The name of the current file. clean_lines: A CleansedLines instance containing the file. linenum: The number of the line to check. - file_extension: The extension (without the dot) of the filename. - nesting_state: A _NestingState instance which maintains information about - the current stack of nested blocks being parsed. error: The function to call with any errors found. """ @@ -2886,35 +2828,6 @@ def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state, 'Weird number of spaces at line-start. ' 'Are you using a 2-space indent?') - # Check if the line is a header guard. - is_header_guard = False - if file_extension == 'h': - cppvar = GetHeaderGuardCPPVariable(filename) - if (line.startswith('#ifndef %s' % cppvar) or - line.startswith('#define %s' % cppvar) or - line.startswith('#endif // %s' % cppvar)): - is_header_guard = True - # #include lines and header guards can be long, since there's no clean way - # to split them. - # - # URLs can be long too. It's possible to split these, but it makes them - # harder to cut&paste. - # - # The "$Id:...$" comment may also get very long without it being the - # developers fault. - if (not line.startswith('#include') and not is_header_guard and - not Match(r'^\s*//.*http(s?)://\S*$', line) and - not Match(r'^// \$Id:.*#[0-9]+ \$$', line)): - line_width = GetLineWidth(line) - extended_length = int(_line_length * 1.25) - if line_width > extended_length: - error(filename, linenum, 'whitespace/line_length', 4, - 'Lines should very rarely be longer than %i characters' % - extended_length) - elif line_width > _line_length: - error(filename, linenum, 'whitespace/line_length', 2, - 'Lines should be <= %i characters long' % _line_length) - if (cleansed_line.count(';') > 1 and # for loops are allowed two ;'s (and may run over two lines). cleansed_line.find('for') == -1 and @@ -2930,33 +2843,10 @@ def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state, # Some more style checks CheckBraces(filename, clean_lines, linenum, error) CheckEmptyBlockBody(filename, clean_lines, linenum, error) - CheckSpacing(filename, clean_lines, linenum, nesting_state, error) + CheckSpacing(filename, clean_lines, linenum, error) -_RE_PATTERN_INCLUDE_NEW_STYLE = re.compile(r'#include +"[^/]+\.h"') _RE_PATTERN_INCLUDE = re.compile(r'^\s*#\s*include\s*([<"])([^>"]*)[>"].*$') -# Matches the first component of a filename delimited by -s and _s. That is: -# _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo' -# _RE_FIRST_COMPONENT.match('foo.cc').group(0) == 'foo' -# _RE_FIRST_COMPONENT.match('foo-bar_baz.cc').group(0) == 'foo' -# _RE_FIRST_COMPONENT.match('foo_bar-baz.cc').group(0) == 'foo' -_RE_FIRST_COMPONENT = re.compile(r'^[^-_.]+') - - -def _ClassifyInclude(fileinfo, include, is_system): - """Figures out what kind of header 'include' is. - - Args: - fileinfo: The current file cpplint is running over. A FileInfo instance. - include: The path to a #included file. - is_system: True if the #include used <> rather than "". - - Returns: - One of the _XXX_HEADER constants. - """ - if is_system: - return _C_SYS_HEADER - return _OTHER_HEADER def CheckIncludeLine(filename, clean_lines, linenum, include_state, error): @@ -2974,16 +2864,9 @@ def CheckIncludeLine(filename, clean_lines, linenum, include_state, error): inserted. error : The function to call with any errors found. """ - fileinfo = FileInfo(filename) line = clean_lines.lines[linenum] - # "include" should use the new style "foo/bar.h" instead of just "bar.h" - # XXX: neovim doesn't currently use this style - # if _RE_PATTERN_INCLUDE_NEW_STYLE.search(line): - # error(filename, linenum, 'build/include', 4, - # 'Include the directory when naming .h files') - # we shouldn't include a file more than once. actually, there are a # handful of instances where doing so is okay, but in general it's # not. @@ -2996,29 +2879,6 @@ def CheckIncludeLine(filename, clean_lines, linenum, include_state, error): error(filename, linenum, 'build/include', 4, '"%s" already included at %s:%s' % (include, filename, include_state[include])) - else: - include_state[include] = linenum - - # We want to ensure that headers appear in the right order: - # 1) for foo.cc, foo.h (preferred location) - # 2) c system files - # 3) cpp system files - # 4) for foo.cc, foo.h (deprecated location) - # 5) other google headers - # - # We classify each include statement as one of those 5 types - # using a number of techniques. The include_state object keeps - # track of the highest type seen, and complains if we see a - # lower type after that. - error_message = include_state.CheckNextIncludeOrder( - _ClassifyInclude(fileinfo, include, is_system)) - if error_message: - error(filename, linenum, 'build/include_order', 4, - '%s. Should be: c system, c++ system, other.' - % error_message) - canonical_include = include_state.CanonicalizeAlphabeticalOrder( - include) - include_state.SetLastHeader(canonical_include) def _GetTextInside(text, start_pattern): @@ -3078,8 +2938,7 @@ def _GetTextInside(text, start_pattern): return text[start_position:position - 1] -def CheckLanguage(filename, clean_lines, linenum, file_extension, - include_state, nesting_state, error): +def CheckLanguage(filename, clean_lines, linenum, include_state, error): """Checks rules from the 'C++ language rules' section of cppguide.html. Some of these rules are hard to test (function overloading, using @@ -3089,11 +2948,8 @@ def CheckLanguage(filename, clean_lines, linenum, file_extension, filename : The name of the current file. clean_lines : A CleansedLines instance containing the file. linenum : The number of the line to check. - file_extension : The extension (without the dot) of the filename. include_state : An _IncludeState instance in which the headers are inserted. - nesting_state : A _NestingState instance which maintains information - about the current stack of nested blocks being parsed. error : The function to call with any errors found. """ # If the line is empty or consists of entirely a comment, no need to @@ -3173,8 +3029,9 @@ def CheckLanguage(filename, clean_lines, linenum, file_extension, if printf_args: match = Match(r'([\w.\->()]+)$', printf_args) if match and match.group(1) != '__VA_ARGS__': - function_name = re.search(r'\b((?:string)?printf)\s*\(', - line, re.I).group(1) + function_name_groups = re.search(r'\b((?:string)?printf)\s*\(', line, re.I) + assert function_name_groups + function_name = function_name_groups.group(1) error(filename, linenum, 'runtime/printf', 4, 'Potential format string bug. Do %s("%%s", %s) instead.' % (function_name, match.group(1))) @@ -3267,14 +3124,13 @@ def CheckLanguage(filename, clean_lines, linenum, file_extension, 'for(;; action)') -def ProcessLine(filename, file_extension, clean_lines, line, +def ProcessLine(filename, clean_lines, line, include_state, function_state, nesting_state, error, extra_check_functions=[]): """Processes a single line in the file. Args: filename : Filename of the file that is being processed. - file_extension : The extension (dot not included) of the file. clean_lines : An array of strings, each representing a line of the file, with comments stripped. line : Number of line being processed. @@ -3294,19 +3150,16 @@ def ProcessLine(filename, file_extension, clean_lines, line, """ raw_lines = clean_lines.raw_lines init_lines = clean_lines.init_lines - ParseNolintSuppressions(filename, raw_lines[line], line, error) - nesting_state.Update(filename, clean_lines, line, error) + ParseNolintSuppressions(raw_lines[line], line) + nesting_state.Update(clean_lines, line) if nesting_state.stack and nesting_state.stack[-1].inline_asm != _NO_ASM: return CheckForFunctionLengths(filename, clean_lines, line, function_state, error) CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error) CheckForOldStyleComments(filename, init_lines[line], line, error) - CheckStyle( - filename, clean_lines, line, file_extension, nesting_state, error) - CheckLanguage(filename, clean_lines, line, file_extension, include_state, - nesting_state, error) - CheckForNonStandardConstructs(filename, clean_lines, line, - nesting_state, error) + CheckStyle(filename, clean_lines, line, error) + CheckLanguage(filename, clean_lines, line, include_state, error) + CheckForNonStandardConstructs(filename, clean_lines, line, error) CheckPosixThreading(filename, clean_lines, line, error) CheckMemoryFunctions(filename, clean_lines, line, error) CheckOSFunctions(filename, clean_lines, line, error) @@ -3349,6 +3202,7 @@ def ProcessFileData(filename, file_extension, lines, error, if not IsErrorSuppressedByNolint(category, linenum): key = init_lines[linenum - 1 if linenum else 0:linenum + 2] err = [filename, key, category] + assert _cpplint_state.record_errors_file json.dump(err, _cpplint_state.record_errors_file) _cpplint_state.record_errors_file.write('\n') Error(filename, linenum, category, confidence, message) @@ -3361,7 +3215,7 @@ def ProcessFileData(filename, file_extension, lines, error, RemoveMultiLineComments(filename, lines, error) clean_lines = CleansedLines(lines, init_lines) for line in range(clean_lines.NumLines()): - ProcessLine(filename, file_extension, clean_lines, line, + ProcessLine(filename, clean_lines, line, include_state, function_state, nesting_state, error, extra_check_functions) @@ -3401,8 +3255,6 @@ def ProcessFile(filename, vlevel, extra_check_functions=[]): if filename == '-': stdin = sys.stdin.read() - if sys.version_info < (3, 0): - stdin = stdin.decode('utf8') lines = stdin.split('\n') if _cpplint_state.stdin_filename is not None: filename = _cpplint_state.stdin_filename @@ -3498,7 +3350,7 @@ def ParseArguments(args): counting_style = '' record_errors_file = None suppress_errors_file = None - stdin_filename = None + stdin_filename = '' for (opt, val) in opts: if opt == '--help': diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index e6f70033d0..38be5bfb1d 100755 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -185,30 +185,24 @@ if(NOT MSVC) set_source_files_properties( ${EXTERNAL_SOURCES} PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-conversion -Wno-missing-noreturn -Wno-missing-format-attribute -Wno-double-promotion") - # gperf generates ANSI-C with incorrect linkage, ignore it. - check_c_compiler_flag(-Wstatic-in-inline HAS_WSTATIC_IN_INLINE) - if(HAS_WSTATIC_IN_INLINE) - set_source_files_properties( - eval/funcs.c PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-static-in-inline -Wno-conversion") - else() - set_source_files_properties( - eval/funcs.c PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-conversion") - endif() + set_source_files_properties( + eval/funcs.c PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-conversion") endif() if(NOT "${MIN_LOG_LEVEL}" MATCHES "^$") add_definitions(-DMIN_LOG_LEVEL=${MIN_LOG_LEVEL}) endif() +if(DEBUG OR CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN) + add_definitions(-DEXITFREE) +endif() + get_directory_property(gen_cdefs COMPILE_DEFINITIONS) foreach(gen_cdef ${gen_cdefs} DO_NOT_DEFINE_EMPTY_ATTRIBUTES) if(NOT ${gen_cdef} MATCHES "INCLUDE_GENERATED_DECLARATIONS") list(APPEND gen_cflags "-D${gen_cdef}") endif() endforeach() -if(CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN) - list(APPEND gen_cflags "-DEXITFREE") -endif() get_directory_property(gen_includes INCLUDE_DIRECTORIES) foreach(gen_include ${gen_includes} ${LUA_PREFERRED_INCLUDE_DIRS}) @@ -408,14 +402,9 @@ add_custom_command(OUTPUT ${GENERATED_EX_CMDS_ENUM} ${GENERATED_EX_CMDS_DEFS} DEPENDS ${EX_CMDS_GENERATOR} ${CMAKE_CURRENT_LIST_DIR}/ex_cmds.lua ) -if(NOT GPERF_PRG) - message(FATAL_ERROR "gperf was not found.") -endif() add_custom_command(OUTPUT ${GENERATED_FUNCS} ${FUNCS_DATA} COMMAND ${LUA_PRG} ${FUNCS_GENERATOR} - ${CMAKE_CURRENT_LIST_DIR} ${GENERATED_DIR} ${API_METADATA} ${FUNCS_DATA} - COMMAND ${GPERF_PRG} - ${GENERATED_DIR}/funcs.generated.h.gperf --output-file=${GENERATED_FUNCS} + ${CMAKE_CURRENT_LIST_DIR} ${LUA_SHARED_MODULE_SOURCE} ${GENERATED_DIR} ${API_METADATA} ${FUNCS_DATA} DEPENDS ${FUNCS_GENERATOR} ${CMAKE_CURRENT_LIST_DIR}/eval.lua ${API_METADATA} ) list(APPEND NVIM_GENERATED_FOR_SOURCES @@ -701,17 +690,14 @@ if(CLANG_ASAN_UBSAN) set(SANITIZE_RECOVER -fno-sanitize-recover) # Clang 3.5- endif() endif() - set_property(TARGET nvim APPEND PROPERTY COMPILE_DEFINITIONS EXITFREE) set_property(TARGET nvim APPEND PROPERTY COMPILE_OPTIONS ${SANITIZE_RECOVER} -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=address -fsanitize=undefined -fsanitize-blacklist=${PROJECT_SOURCE_DIR}/src/.asan-blacklist) set_property(TARGET nvim APPEND_STRING PROPERTY LINK_FLAGS "-fsanitize=address -fsanitize=undefined ") elseif(CLANG_MSAN) message(STATUS "Enabling Clang memory sanitizer for nvim.") - set_property(TARGET nvim APPEND PROPERTY COMPILE_DEFINITIONS EXITFREE) set_property(TARGET nvim APPEND PROPERTY COMPILE_OPTIONS -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -fno-optimize-sibling-calls) set_property(TARGET nvim APPEND_STRING PROPERTY LINK_FLAGS "-fsanitize=memory -fsanitize-memory-track-origins ") elseif(CLANG_TSAN) message(STATUS "Enabling Clang thread sanitizer for nvim.") - set_property(TARGET nvim APPEND PROPERTY COMPILE_DEFINITIONS EXITFREE) set_property(TARGET nvim APPEND PROPERTY COMPILE_OPTIONS -fsanitize=thread) set_property(TARGET nvim APPEND PROPERTY COMPILE_OPTIONS -fPIE) set_property(TARGET nvim APPEND_STRING PROPERTY LINK_FLAGS "-fsanitize=thread ") diff --git a/src/nvim/README.md b/src/nvim/README.md index c7cb233c73..9417629691 100644 --- a/src/nvim/README.md +++ b/src/nvim/README.md @@ -38,7 +38,7 @@ alternate file (e.g. stderr) use `LOG_CALLSTACK_TO_FILE(FILE*)`. Requires Many log messages have a shared prefix, such as "UI" or "RPC". Use the shell to filter the log, e.g. at DEBUG level you might want to exclude UI messages: - tail -F ~/.cache/nvim/log | cat -v | stdbuf -o0 grep -v UI | stdbuf -o0 tee -a log + tail -F ~/.local/state/nvim/log | cat -v | stdbuf -o0 grep -v UI | stdbuf -o0 tee -a log Build with ASAN --------------- diff --git a/src/nvim/api/autocmd.c b/src/nvim/api/autocmd.c index 76e531e7aa..30a5d60c39 100644 --- a/src/nvim/api/autocmd.c +++ b/src/nvim/api/autocmd.c @@ -405,6 +405,7 @@ cleanup: /// - match: (string) the expanded value of |<amatch>| /// - buf: (number) the expanded value of |<abuf>| /// - file: (string) the expanded value of |<afile>| +/// - data: (any) arbitrary data passed to |nvim_exec_autocmds()| /// - command (string) optional: Vim command to execute on event. Cannot be used with /// {callback} /// - once (boolean) optional: defaults to false. Run the autocommand @@ -749,6 +750,8 @@ void nvim_del_augroup_by_name(String name, Error *err) /// {pattern}. /// - modeline (bool) optional: defaults to true. Process the /// modeline after the autocommands |<nomodeline>|. +/// - data (any): arbitrary data to send to the autocommand callback. See +/// |nvim_create_autocmd()| for details. /// @see |:doautocmd| void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) FUNC_API_SINCE(9) @@ -760,6 +763,7 @@ void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) bool set_buf = false; char *pattern = NULL; + Object *data = NULL; bool set_pattern = false; Array event_array = ARRAY_DICT_INIT; @@ -818,6 +822,10 @@ void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) set_pattern = true; } + if (opts->data.type != kObjectTypeNil) { + data = &opts->data; + } + modeline = api_object_to_bool(opts->modeline, "modeline", true, err); if (set_pattern && set_buf) { @@ -829,7 +837,7 @@ void nvim_exec_autocmds(Object event, Dict(exec_autocmds) *opts, Error *err) FOREACH_ITEM(event_array, event_str, { GET_ONE_EVENT(event_nr, event_str, cleanup) - did_aucmd |= apply_autocmds_group(event_nr, pattern, NULL, true, au_group, buf, NULL); + did_aucmd |= apply_autocmds_group(event_nr, pattern, NULL, true, au_group, buf, NULL, data); }) if (did_aucmd && modeline) { diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index 45dadae1dd..9842975d62 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -262,7 +262,7 @@ void nvim__buf_redraw_range(Buffer buffer, Integer first, Integer last, Error *e /// @param channel_id /// @param buffer Buffer handle, or 0 for current buffer /// @param start First line index -/// @param end Last line index (exclusive) +/// @param end Last line index, exclusive /// @param strict_indexing Whether out-of-bounds should be an error. /// @param[out] err Error details, if any /// @return Array of lines, or empty array for unloaded buffer. @@ -358,7 +358,7 @@ static bool check_string_array(Array arr, bool disallow_nl, Error *err) /// @param channel_id /// @param buffer Buffer handle, or 0 for current buffer /// @param start First line index -/// @param end Last line index (exclusive) +/// @param end Last line index, exclusive /// @param strict_indexing Whether out-of-bounds should be an error. /// @param replacement Array of lines to use as replacement /// @param[out] err Error details, if any @@ -514,24 +514,25 @@ end: /// Sets (replaces) a range in the buffer /// -/// This is recommended over nvim_buf_set_lines when only modifying parts of a -/// line, as extmarks will be preserved on non-modified parts of the touched +/// This is recommended over |nvim_buf_set_lines()| when only modifying parts of +/// a line, as extmarks will be preserved on non-modified parts of the touched /// lines. /// -/// Indexing is zero-based and end-exclusive. +/// Indexing is zero-based. Row indices are end-inclusive, and column indices +/// are end-exclusive. /// -/// To insert text at a given index, set `start` and `end` ranges to the same -/// index. To delete a range, set `replacement` to an array containing -/// an empty string, or simply an empty array. +/// To insert text at a given `(row, column)` location, use `start_row = end_row +/// = row` and `start_col = end_col = col`. To delete the text in a range, use +/// `replacement = {}`. /// -/// Prefer nvim_buf_set_lines when adding or deleting entire lines only. +/// Prefer |nvim_buf_set_lines()| if you are only adding or deleting entire lines. /// /// @param channel_id /// @param buffer Buffer handle, or 0 for current buffer /// @param start_row First line index -/// @param start_col First column -/// @param end_row Last line index -/// @param end_col Last column +/// @param start_col Starting column (byte offset) on first line +/// @param end_row Last line index, inclusive +/// @param end_col Ending column (byte offset) on last line, exclusive /// @param replacement Array of lines to use as replacement /// @param[out] err Error details, if any void nvim_buf_set_text(uint64_t channel_id, Buffer buffer, Integer start_row, Integer start_col, @@ -760,16 +761,17 @@ end: /// This differs from |nvim_buf_get_lines()| in that it allows retrieving only /// portions of a line. /// -/// Indexing is zero-based. Column indices are end-exclusive. +/// Indexing is zero-based. Row indices are end-inclusive, and column indices +/// are end-exclusive. /// /// Prefer |nvim_buf_get_lines()| when retrieving entire lines. /// /// @param channel_id /// @param buffer Buffer handle, or 0 for current buffer /// @param start_row First line index -/// @param start_col Starting byte offset of first line -/// @param end_row Last line index -/// @param end_col Ending byte offset of last line (exclusive) +/// @param start_col Starting column (byte offset) on first line +/// @param end_row Last line index, inclusive +/// @param end_col Ending column (byte offset) on last line, exclusive /// @param opts Optional parameters. Currently unused. /// @param[out] err Error details, if any /// @return Array of lines, or empty array for unloaded buffer. diff --git a/src/nvim/api/keysets.lua b/src/nvim/api/keysets.lua index 5baffaf505..6924e2ef8f 100644 --- a/src/nvim/api/keysets.lua +++ b/src/nvim/api/keysets.lua @@ -80,6 +80,7 @@ return { "maxwidth"; "fillchar"; "highlights"; + "use_winbar"; "use_tabline"; }; option = { @@ -145,6 +146,7 @@ return { "group"; "modeline"; "pattern"; + "data"; }; get_autocmds = { "event"; @@ -155,5 +157,44 @@ return { create_augroup = { "clear"; }; + cmd = { + "cmd"; + "range"; + "count"; + "reg"; + "bang"; + "args"; + "magic"; + "mods"; + "nargs"; + "addr"; + "nextcmd"; + }; + cmd_magic = { + "file"; + "bar"; + }; + cmd_mods = { + "silent"; + "emsg_silent"; + "sandbox"; + "noautocmd"; + "browse"; + "confirm"; + "hide"; + "keepalt"; + "keepjumps"; + "keepmarks"; + "keeppatterns"; + "lockmarks"; + "noswapfile"; + "tab"; + "verbose"; + "vertical"; + "split"; + }; + cmd_opts = { + "output"; + }; } diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c index a2ee4f91bc..7bd68f277b 100644 --- a/src/nvim/api/private/helpers.c +++ b/src/nvim/api/private/helpers.c @@ -19,6 +19,7 @@ #include "nvim/decoration.h" #include "nvim/eval.h" #include "nvim/eval/typval.h" +#include "nvim/ex_cmds_defs.h" #include "nvim/extmark.h" #include "nvim/fileio.h" #include "nvim/getchar.h" @@ -657,8 +658,7 @@ void modify_keymap(uint64_t channel_id, Buffer buffer, bool is_unmap, String mod mode_val = get_map_mode(&p, true); // mapmode-ic } else { mode_val = get_map_mode(&p, false); - if ((mode_val == VISUAL + SELECTMODE + NORMAL + OP_PENDING) - && mode.size > 0) { + if (mode_val == (MODE_VISUAL | MODE_SELECT | MODE_NORMAL | MODE_OP_PENDING) && mode.size > 0) { // get_map_mode() treats unrecognized mode shortnames as ":map". // This is an error unless the given shortname was empty string "". api_set_error(err, kErrorTypeValidation, "Invalid mode shortname: \"%s\"", p); @@ -1418,14 +1418,14 @@ bool set_mark(buf_T *buf, String name, Integer line, Integer col, Error *err) } /// Get default statusline highlight for window -const char *get_default_stl_hl(win_T *wp) +const char *get_default_stl_hl(win_T *wp, bool use_winbar) { if (wp == NULL) { return "TabLineFill"; - } else if (wp == curwin) { - return "StatusLine"; + } else if (use_winbar) { + return (wp == curwin) ? "WinBar" : "WinBarNC"; } else { - return "StatusLineNC"; + return (wp == curwin) ? "StatusLine" : "StatusLineNC"; } } @@ -1691,3 +1691,136 @@ int init_sign_text(char **sign_text, char *text) return OK; } + +/// Check if a string contains only whitespace characters. +bool string_iswhite(String str) +{ + for (size_t i = 0; i < str.size; i++) { + if (!ascii_iswhite(str.data[i])) { + // Found a non-whitespace character + return false; + } else if (str.data[i] == NUL) { + // Terminate at first occurence of a NUL character + break; + } + } + return true; +} + +/// Build cmdline string for command, used by `nvim_cmd()`. +/// +/// @return OK or FAIL. +void build_cmdline_str(char **cmdlinep, exarg_T *eap, CmdParseInfo *cmdinfo, char **args, + size_t argc) +{ + StringBuilder cmdline = KV_INITIAL_VALUE; + + // Add command modifiers + if (cmdinfo->cmdmod.tab != 0) { + kv_printf(cmdline, "%dtab ", cmdinfo->cmdmod.tab - 1); + } + if (cmdinfo->verbose != -1) { + kv_printf(cmdline, "%ldverbose ", cmdinfo->verbose); + } + + if (cmdinfo->emsg_silent) { + kv_concat(cmdline, "silent! "); + } else if (cmdinfo->silent) { + kv_concat(cmdline, "silent "); + } + + switch (cmdinfo->cmdmod.split & (WSP_ABOVE | WSP_BELOW | WSP_TOP | WSP_BOT)) { + case WSP_ABOVE: + kv_concat(cmdline, "aboveleft "); + break; + case WSP_BELOW: + kv_concat(cmdline, "belowright "); + break; + case WSP_TOP: + kv_concat(cmdline, "topleft "); + break; + case WSP_BOT: + kv_concat(cmdline, "botright "); + break; + default: + break; + } + +#define CMDLINE_APPEND_IF(cond, str) \ + do { \ + if (cond) { \ + kv_concat(cmdline, str); \ + } \ + } while (0) + + CMDLINE_APPEND_IF(cmdinfo->cmdmod.split & WSP_VERT, "vertical "); + CMDLINE_APPEND_IF(cmdinfo->sandbox, "sandbox "); + CMDLINE_APPEND_IF(cmdinfo->noautocmd, "noautocmd "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.browse, "browse "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.confirm, "confirm "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.hide, "hide "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.keepalt, "keepalt "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.keepjumps, "keepjumps "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.keepmarks, "keepmarks "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.keeppatterns, "keeppatterns "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.lockmarks, "lockmarks "); + CMDLINE_APPEND_IF(cmdinfo->cmdmod.noswapfile, "noswapfile "); +#undef CMDLINE_APPEND_IF + + // Command range / count. + if (eap->argt & EX_RANGE) { + if (eap->addr_count == 1) { + kv_printf(cmdline, "%ld", eap->line2); + } else if (eap->addr_count > 1) { + kv_printf(cmdline, "%ld,%ld", eap->line1, eap->line2); + eap->addr_count = 2; // Make sure address count is not greater than 2 + } + } + + // Keep the index of the position where command name starts, so eap->cmd can point to it. + size_t cmdname_idx = cmdline.size; + kv_printf(cmdline, "%s", eap->cmd); + + // Command bang. + if (eap->argt & EX_BANG && eap->forceit) { + kv_printf(cmdline, "!"); + } + + // Command register. + if (eap->argt & EX_REGSTR && eap->regname) { + kv_printf(cmdline, " %c", eap->regname); + } + + // Iterate through each argument and store the starting index and length of each argument + size_t *argidx = xcalloc(argc, sizeof(size_t)); + eap->argc = argc; + eap->arglens = xcalloc(argc, sizeof(size_t)); + for (size_t i = 0; i < argc; i++) { + argidx[i] = cmdline.size + 1; // add 1 to account for the space. + eap->arglens[i] = STRLEN(args[i]); + kv_printf(cmdline, " %s", args[i]); + } + + // Now that all the arguments are appended, use the command index and argument indices to set the + // values of eap->cmd, eap->arg and eap->args. + eap->cmd = cmdline.items + cmdname_idx; + eap->args = xcalloc(argc, sizeof(char *)); + for (size_t i = 0; i < argc; i++) { + eap->args[i] = cmdline.items + argidx[i]; + } + // If there isn't an argument, make eap->arg point to end of cmdline. + eap->arg = argc > 0 ? eap->args[0] : cmdline.items + cmdline.size; + + // Finally, make cmdlinep point to the cmdline string. + *cmdlinep = cmdline.items; + xfree(argidx); + + // Replace, :make and :grep with 'makeprg' and 'grepprg'. + char *p = replace_makeprg(eap, eap->arg, cmdlinep); + if (p != eap->arg) { + // If replace_makeprg modified the cmdline string, correct the argument pointers. + assert(argc == 1); + eap->arg = p; + eap->args[0] = p; + } +} diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c index b4d20ed975..52f76f4650 100644 --- a/src/nvim/api/ui.c +++ b/src/nvim/api/ui.c @@ -349,7 +349,11 @@ void nvim_ui_try_resize_grid(uint64_t channel_id, Integer grid, Integer width, I return; } - ui_grid_resize((handle_T)grid, (int)width, (int)height, err); + if (grid == DEFAULT_GRID_HANDLE) { + nvim_ui_try_resize(channel_id, width, height, err); + } else { + ui_grid_resize((handle_T)grid, (int)width, (int)height, err); + } } /// Tells Nvim the number of elements displaying in the popumenu, to decide diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index 5e7e51762a..15992a98be 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -126,22 +126,43 @@ Dictionary nvim__get_hl_defs(Integer ns_id, Error *err) /// Sets a highlight group. /// -/// Note: Unlike the `:highlight` command which can update a highlight group, -/// this function completely replaces the definition. For example: -/// ``nvim_set_hl(0, 'Visual', {})`` will clear the highlight group 'Visual'. +/// @note Unlike the `:highlight` command which can update a highlight group, +/// this function completely replaces the definition. For example: +/// ``nvim_set_hl(0, 'Visual', {})`` will clear the highlight group +/// 'Visual'. +/// +/// @note The fg and bg keys also accept the string values `"fg"` or `"bg"` +/// which act as aliases to the corresponding foreground and background +/// values of the Normal group. If the Normal group has not been defined, +/// using these values results in an error. /// /// @param ns_id Namespace id for this highlight |nvim_create_namespace()|. /// Use 0 to set a highlight group globally |:highlight|. /// @param name Highlight group name, e.g. "ErrorMsg" -/// @param val Highlight definition map, like |synIDattr()|. In -/// addition, the following keys are recognized: +/// @param val Highlight definition map, accepts the following keys: +/// - fg (or foreground): color name or "#RRGGBB", see note. +/// - bg (or background): color name or "#RRGGBB", see note. +/// - sp (or special): color name or "#RRGGBB" +/// - blend: integer between 0 and 100 +/// - bold: boolean +/// - standout: boolean +/// - underline: boolean +/// - underlineline: boolean +/// - undercurl: boolean +/// - underdot: boolean +/// - underdash: boolean +/// - strikethrough: boolean +/// - italic: boolean +/// - reverse: boolean +/// - nocombine: boolean +/// - link: name of another highlight group to link to, see |:hi-link|. +/// Additionally, the following keys are recognized: /// - default: Don't override existing definition |:hi-default| /// - ctermfg: Sets foreground of cterm color |highlight-ctermfg| /// - ctermbg: Sets background of cterm color |highlight-ctermbg| -/// - cterm: cterm attribute map, like -/// |highlight-args|. -/// Note: Attributes default to those set for `gui` -/// if not set. +/// - cterm: cterm attribute map, like |highlight-args|. If not set, +/// cterm attributes will match those from the attribute map +/// documented above. /// @param[out] err Error details, if any /// // TODO(bfredl): val should take update vs reset flag @@ -1327,14 +1348,14 @@ Boolean nvim_paste(String data, Boolean crlf, Integer phase, Error *err) draining = true; goto theend; } - if (!(State & (CMDLINE | INSERT)) && (phase == -1 || phase == 1)) { + if (!(State & (MODE_CMDLINE | MODE_INSERT)) && (phase == -1 || phase == 1)) { ResetRedobuff(); AppendCharToRedobuff('a'); // Dot-repeat. } // vim.paste() decides if client should cancel. Errors do NOT cancel: we // want to drain remaining chunks (rather than divert them to main input). cancel = (rv.type == kObjectTypeBoolean && !rv.data.boolean); - if (!cancel && !(State & CMDLINE)) { // Dot-repeat. + if (!cancel && !(State & MODE_CMDLINE)) { // Dot-repeat. for (size_t i = 0; i < lines.size; i++) { String s = lines.items[i].data.string; assert(s.size <= INT_MAX); @@ -1345,7 +1366,7 @@ Boolean nvim_paste(String data, Boolean crlf, Integer phase, Error *err) } } } - if (!(State & (CMDLINE | INSERT)) && (phase == -1 || phase == 3)) { + if (!(State & (MODE_CMDLINE | MODE_INSERT)) && (phase == -1 || phase == 3)) { AppendCharToRedobuff(ESC); // Dot-repeat. } theend: @@ -1601,12 +1622,13 @@ ArrayOf(Dictionary) nvim_get_keymap(uint64_t channel_id, String mode) /// or "!" for |:map!|, or empty string for |:map|. /// @param lhs Left-hand-side |{lhs}| of the mapping. /// @param rhs Right-hand-side |{rhs}| of the mapping. -/// @param opts Optional parameters map. Accepts all |:map-arguments| -/// as keys excluding |<buffer>| but including |noremap| and "desc". -/// "desc" can be used to give a description to keymap. -/// When called from Lua, also accepts a "callback" key that takes -/// a Lua function to call when the mapping is executed. -/// Values are Booleans. Unknown key is an error. +/// @param opts Optional parameters map: keys are |:map-arguments|, values +/// are booleans (default false). Accepts all |:map-arguments| as +/// keys excluding |<buffer>| but including |noremap| and "desc". +/// Unknown key is an error. "desc" can be used to give a +/// description to the mapping. When called from Lua, also accepts a +/// "callback" key that takes a Lua function to call when the +/// mapping is executed. /// @param[out] err Error details, if any. void nvim_set_keymap(uint64_t channel_id, String mode, String lhs, String rhs, Dict(keymap) *opts, Error *err) @@ -2118,8 +2140,8 @@ Array nvim__inspect_cell(Integer grid, Integer row, Integer col, Error *err) } } - if (row < 0 || row >= g->Rows - || col < 0 || col >= g->Columns) { + if (row < 0 || row >= g->rows + || col < 0 || col >= g->cols) { return ret; } size_t off = g->line_offset[(size_t)row] + (size_t)col; @@ -2252,8 +2274,9 @@ Array nvim_get_mark(String name, Dictionary opts, Error *err) /// - fillchar: (string) Character to fill blank spaces in the statusline (see /// 'fillchars'). Treated as single-width even if it isn't. /// - highlights: (boolean) Return highlight information. +/// - use_winbar: (boolean) Evaluate winbar instead of statusline. /// - use_tabline: (boolean) Evaluate tabline instead of statusline. When |TRUE|, {winid} -/// is ignored. +/// is ignored. Mutually exclusive with {use_winbar}. /// /// @param[out] err Error details, if any. /// @return Dictionary containing statusline information, with these keys: @@ -2272,9 +2295,18 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * int maxwidth; int fillchar = 0; Window window = 0; + bool use_winbar = false; bool use_tabline = false; bool highlights = false; + if (str.size < 2 || memcmp(str.data, "%!", 2)) { + const char *const errmsg = check_stl_option((char_u *)str.data); + if (errmsg) { + api_set_error(err, kErrorTypeValidation, "%s", errmsg); + return result; + } + } + if (HAS_KEY(opts->winid)) { if (opts->winid.type != kObjectTypeInteger) { api_set_error(err, kErrorTypeValidation, "winid must be an integer"); @@ -2283,7 +2315,6 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * window = (Window)opts->winid.data.integer; } - if (HAS_KEY(opts->fillchar)) { if (opts->fillchar.type != kObjectTypeString || opts->fillchar.data.string.size == 0 || ((size_t)utf_ptr2len(opts->fillchar.data.string.data) @@ -2293,7 +2324,6 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * } fillchar = utf_ptr2char(opts->fillchar.data.string.data); } - if (HAS_KEY(opts->highlights)) { highlights = api_object_to_bool(opts->highlights, "highlights", false, err); @@ -2301,7 +2331,13 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * return result; } } + if (HAS_KEY(opts->use_winbar)) { + use_winbar = api_object_to_bool(opts->use_winbar, "use_winbar", false, err); + if (ERROR_SET(err)) { + return result; + } + } if (HAS_KEY(opts->use_tabline)) { use_tabline = api_object_to_bool(opts->use_tabline, "use_tabline", false, err); @@ -2309,6 +2345,10 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * return result; } } + if (use_winbar && use_tabline) { + api_set_error(err, kErrorTypeValidation, "use_winbar and use_tabline are mutually exclusive"); + return result; + } win_T *wp, *ewp; @@ -2318,7 +2358,6 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * fillchar = ' '; } else { wp = find_window_by_handle(window, err); - if (wp == NULL) { api_set_error(err, kErrorTypeException, "unknown winid %d", window); return result; @@ -2326,8 +2365,12 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * ewp = wp; if (fillchar == 0) { - int attr; - fillchar = fillchar_status(&attr, wp); + if (use_winbar) { + fillchar = wp->w_p_fcs_chars.wbr; + } else { + int attr; + fillchar = fillchar_status(&attr, wp); + } } } @@ -2339,7 +2382,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * maxwidth = (int)opts->maxwidth.data.integer; } else { - maxwidth = (use_tabline || global_stl_height() > 0) ? Columns : wp->w_width; + maxwidth = (use_tabline || (!use_winbar && global_stl_height() > 0)) ? Columns : wp->w_width; } char buf[MAXPATHL]; @@ -2374,7 +2417,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * // add the default highlight at the beginning of the highlight list if (hltab->start == NULL || ((char *)hltab->start - buf) != 0) { Dictionary hl_info = ARRAY_DICT_INIT; - grpname = get_default_stl_hl(wp); + grpname = get_default_stl_hl(wp, use_winbar); PUT(hl_info, "start", INTEGER_OBJ(0)); PUT(hl_info, "group", CSTR_TO_OBJ(grpname)); @@ -2388,22 +2431,18 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error * PUT(hl_info, "start", INTEGER_OBJ((char *)sp->start - buf)); if (sp->userhl == 0) { - grpname = get_default_stl_hl(wp); + grpname = get_default_stl_hl(wp, use_winbar); } else if (sp->userhl < 0) { grpname = (char *)syn_id2name(-sp->userhl); } else { snprintf(user_group, sizeof(user_group), "User%d", sp->userhl); grpname = user_group; } - PUT(hl_info, "group", CSTR_TO_OBJ(grpname)); - ADD(hl_values, DICTIONARY_OBJ(hl_info)); } - PUT(result, "highlights", ARRAY_OBJ(hl_values)); } - PUT(result, "str", CSTR_TO_OBJ((char *)buf)); return result; diff --git a/src/nvim/api/vimscript.c b/src/nvim/api/vimscript.c index c4a301839f..b8f7b33cd5 100644 --- a/src/nvim/api/vimscript.c +++ b/src/nvim/api/vimscript.c @@ -10,10 +10,14 @@ #include "nvim/api/private/helpers.h" #include "nvim/api/vimscript.h" #include "nvim/ascii.h" +#include "nvim/autocmd.h" #include "nvim/eval.h" #include "nvim/eval/typval.h" #include "nvim/eval/userfunc.h" #include "nvim/ex_cmds2.h" +#include "nvim/ops.h" +#include "nvim/strings.h" +#include "nvim/vim.h" #include "nvim/viml/parser/expressions.h" #include "nvim/viml/parser/parser.h" #include "nvim/window.h" @@ -22,16 +26,19 @@ # include "api/vimscript.c.generated.h" #endif -/// Executes Vimscript (multiline block of Ex-commands), like anonymous +#define IS_USER_CMDIDX(idx) ((int)(idx) < 0) + +/// Executes Vimscript (multiline block of Ex commands), like anonymous /// |:source|. /// /// Unlike |nvim_command()| this function supports heredocs, script-scope (s:), /// etc. /// -/// On execution error: fails with VimL error, does not update v:errmsg. +/// On execution error: fails with VimL error, updates v:errmsg. /// /// @see |execute()| /// @see |nvim_command()| +/// @see |nvim_cmd()| /// /// @param src Vimscript code /// @param output Capture and return all (non-error, non-shell |:!|) output @@ -89,13 +96,16 @@ theend: return (String)STRING_INIT; } -/// Executes an ex-command. +/// Executes an Ex command. /// -/// On execution error: fails with VimL error, does not update v:errmsg. +/// On execution error: fails with VimL error, updates v:errmsg. /// -/// @see |nvim_exec()| +/// Prefer using |nvim_cmd()| or |nvim_exec()| over this. To evaluate multiple lines of Vim script +/// or an Ex command directly, use |nvim_exec()|. To construct an Ex command using a structured +/// format and then execute it, use |nvim_cmd()|. To modify an Ex command before evaluating it, use +/// |nvim_parse_cmd()| in conjunction with |nvim_cmd()|. /// -/// @param command Ex-command string +/// @param command Ex command string /// @param[out] err Error details (Vim error), if any void nvim_command(String command, Error *err) FUNC_API_SINCE(1) @@ -108,7 +118,7 @@ void nvim_command(String command, Error *err) /// Evaluates a VimL |expression|. /// Dictionaries and Lists are recursively expanded. /// -/// On execution error: fails with VimL error, does not update v:errmsg. +/// On execution error: fails with VimL error, updates v:errmsg. /// /// @param expr VimL expression string /// @param[out] err Error details, if any @@ -216,7 +226,7 @@ free_vim_args: /// Calls a VimL function with the given arguments. /// -/// On execution error: fails with VimL error, does not update v:errmsg. +/// On execution error: fails with VimL error, updates v:errmsg. /// /// @param fn Function to call /// @param args Function arguments packed in an Array @@ -230,7 +240,7 @@ Object nvim_call_function(String fn, Array args, Error *err) /// Calls a VimL |Dictionary-function| with the given arguments. /// -/// On execution error: fails with VimL error, does not update v:errmsg. +/// On execution error: fails with VimL error, updates v:errmsg. /// /// @param dict Dictionary, or String evaluating to a VimL |self| dict /// @param fn Name of the function defined on the VimL dict @@ -978,3 +988,370 @@ end: xfree(cmdline); return result; } + +/// Executes an Ex command. +/// +/// Unlike |nvim_command()| this command takes a structured Dictionary instead of a String. This +/// allows for easier construction and manipulation of an Ex command. This also allows for things +/// such as having spaces inside a command argument, expanding filenames in a command that otherwise +/// doesn't expand filenames, etc. +/// +/// On execution error: fails with VimL error, updates v:errmsg. +/// +/// @see |nvim_exec()| +/// @see |nvim_command()| +/// +/// @param cmd Command to execute. Must be a Dictionary that can contain the same values as +/// the return value of |nvim_parse_cmd()| except "addr", "nargs" and "nextcmd" +/// which are ignored if provided. All values except for "cmd" are optional. +/// @param opts Optional parameters. +/// - output: (boolean, default false) Whether to return command output. +/// @param[out] err Error details, if any. +/// @return Command output (non-error, non-shell |:!|) if `output` is true, else empty string. +String nvim_cmd(uint64_t channel_id, Dict(cmd) *cmd, Dict(cmd_opts) *opts, Error *err) + FUNC_API_SINCE(10) +{ + exarg_T ea; + memset(&ea, 0, sizeof(ea)); + ea.verbose_save = -1; + ea.save_msg_silent = -1; + + CmdParseInfo cmdinfo; + memset(&cmdinfo, 0, sizeof(cmdinfo)); + cmdinfo.verbose = -1; + + char *cmdline = NULL; + char *cmdname = NULL; + char **args = NULL; + size_t argc = 0; + + String retv = (String)STRING_INIT; + +#define OBJ_TO_BOOL(var, value, default, varname) \ + do { \ + var = api_object_to_bool(value, varname, default, err); \ + if (ERROR_SET(err)) { \ + goto end; \ + } \ + } while (0) + +#define VALIDATION_ERROR(...) \ + do { \ + api_set_error(err, kErrorTypeValidation, __VA_ARGS__); \ + goto end; \ + } while (0) + + bool output; + OBJ_TO_BOOL(output, opts->output, false, "'output'"); + + // First, parse the command name and check if it exists and is valid. + if (!HAS_KEY(cmd->cmd) || cmd->cmd.type != kObjectTypeString + || cmd->cmd.data.string.data[0] == NUL) { + VALIDATION_ERROR("'cmd' must be a non-empty String"); + } + + cmdname = string_to_cstr(cmd->cmd.data.string); + ea.cmd = cmdname; + + char *p = find_ex_command(&ea, NULL); + + // If this looks like an undefined user command and there are CmdUndefined + // autocommands defined, trigger the matching autocommands. + if (p != NULL && ea.cmdidx == CMD_SIZE && ASCII_ISUPPER(*ea.cmd) + && has_event(EVENT_CMDUNDEFINED)) { + p = xstrdup(cmdname); + int ret = apply_autocmds(EVENT_CMDUNDEFINED, p, p, true, NULL); + xfree(p); + // If the autocommands did something and didn't cause an error, try + // finding the command again. + p = (ret && !aborting()) ? find_ex_command(&ea, NULL) : ea.cmd; + } + + if (p == NULL || ea.cmdidx == CMD_SIZE) { + VALIDATION_ERROR("Command not found: %s", cmdname); + } + if (is_cmd_ni(ea.cmdidx)) { + VALIDATION_ERROR("Command not implemented: %s", cmdname); + } + + // Get the command flags so that we can know what type of arguments the command uses. + // Not required for a user command since `find_ex_command` already deals with it in that case. + if (!IS_USER_CMDIDX(ea.cmdidx)) { + ea.argt = get_cmd_argt(ea.cmdidx); + } + + // Parse command arguments since it's needed to get the command address type. + if (HAS_KEY(cmd->args)) { + if (cmd->args.type != kObjectTypeArray) { + VALIDATION_ERROR("'args' must be an Array"); + } + // Check if every argument is valid + for (size_t i = 0; i < cmd->args.data.array.size; i++) { + Object elem = cmd->args.data.array.items[i]; + if (elem.type != kObjectTypeString) { + VALIDATION_ERROR("Command argument must be a String"); + } else if (string_iswhite(elem.data.string)) { + VALIDATION_ERROR("Command argument must have non-whitespace characters"); + } + } + + argc = cmd->args.data.array.size; + bool argc_valid; + + // Check if correct number of arguments is used. + switch (ea.argt & (EX_EXTRA | EX_NOSPC | EX_NEEDARG)) { + case EX_EXTRA | EX_NOSPC | EX_NEEDARG: + argc_valid = argc == 1; + break; + case EX_EXTRA | EX_NOSPC: + argc_valid = argc <= 1; + break; + case EX_EXTRA | EX_NEEDARG: + argc_valid = argc >= 1; + break; + case EX_EXTRA: + argc_valid = true; + break; + default: + argc_valid = argc == 0; + break; + } + + if (!argc_valid) { + argc = 0; // Ensure that args array isn't erroneously freed at the end. + VALIDATION_ERROR("Incorrect number of arguments supplied"); + } + + if (argc != 0) { + args = xcalloc(argc, sizeof(char *)); + + for (size_t i = 0; i < argc; i++) { + args[i] = string_to_cstr(cmd->args.data.array.items[i].data.string); + } + } + } + + // Simply pass the first argument (if it exists) as the arg pointer to `set_cmd_addr_type()` + // since it only ever checks the first argument. + set_cmd_addr_type(&ea, argc > 0 ? (char_u *)args[0] : NULL); + + if (HAS_KEY(cmd->range)) { + if (!(ea.argt & EX_RANGE)) { + VALIDATION_ERROR("Command cannot accept a range"); + } else if (cmd->range.type != kObjectTypeArray) { + VALIDATION_ERROR("'range' must be an Array"); + } else if (cmd->range.data.array.size > 2) { + VALIDATION_ERROR("'range' cannot contain more than two elements"); + } + + Array range = cmd->range.data.array; + ea.addr_count = (int)range.size; + + for (size_t i = 0; i < range.size; i++) { + Object elem = range.items[i]; + if (elem.type != kObjectTypeInteger || elem.data.integer < 0) { + VALIDATION_ERROR("'range' element must be a non-negative Integer"); + } + } + + if (range.size > 0) { + ea.line1 = range.items[0].data.integer; + ea.line2 = range.items[range.size - 1].data.integer; + } + + if (invalid_range(&ea) != NULL) { + VALIDATION_ERROR("Invalid range provided"); + } + } + if (ea.addr_count == 0) { + if (ea.argt & EX_DFLALL) { + set_cmd_dflall_range(&ea); // Default range for range=% + } else { + ea.line1 = ea.line2 = get_cmd_default_range(&ea); // Default range. + + if (ea.addr_type == ADDR_OTHER) { + // Default is 1, not cursor. + ea.line2 = 1; + } + } + } + + if (HAS_KEY(cmd->count)) { + if (!(ea.argt & EX_COUNT)) { + VALIDATION_ERROR("Command cannot accept a count"); + } else if (cmd->count.type != kObjectTypeInteger || cmd->count.data.integer < 0) { + VALIDATION_ERROR("'count' must be a non-negative Integer"); + } + set_cmd_count(&ea, cmd->count.data.integer, true); + } + + if (HAS_KEY(cmd->reg)) { + if (!(ea.argt & EX_REGSTR)) { + VALIDATION_ERROR("Command cannot accept a register"); + } else if (cmd->reg.type != kObjectTypeString || cmd->reg.data.string.size != 1) { + VALIDATION_ERROR("'reg' must be a single character"); + } + char regname = cmd->reg.data.string.data[0]; + if (regname == '=') { + VALIDATION_ERROR("Cannot use register \"="); + } else if (!valid_yank_reg(regname, ea.cmdidx != CMD_put && !IS_USER_CMDIDX(ea.cmdidx))) { + VALIDATION_ERROR("Invalid register: \"%c", regname); + } + ea.regname = (uint8_t)regname; + } + + OBJ_TO_BOOL(ea.forceit, cmd->bang, false, "'bang'"); + if (ea.forceit && !(ea.argt & EX_BANG)) { + VALIDATION_ERROR("Command cannot accept a bang"); + } + + if (HAS_KEY(cmd->magic)) { + if (cmd->magic.type != kObjectTypeDictionary) { + VALIDATION_ERROR("'magic' must be a Dictionary"); + } + + Dict(cmd_magic) magic = { 0 }; + if (!api_dict_to_keydict(&magic, KeyDict_cmd_magic_get_field, + cmd->magic.data.dictionary, err)) { + goto end; + } + + OBJ_TO_BOOL(cmdinfo.magic.file, magic.file, ea.argt & EX_XFILE, "'magic.file'"); + OBJ_TO_BOOL(cmdinfo.magic.bar, magic.bar, ea.argt & EX_TRLBAR, "'magic.bar'"); + } else { + cmdinfo.magic.file = ea.argt & EX_XFILE; + cmdinfo.magic.bar = ea.argt & EX_TRLBAR; + } + + if (HAS_KEY(cmd->mods)) { + if (cmd->mods.type != kObjectTypeDictionary) { + VALIDATION_ERROR("'mods' must be a Dictionary"); + } + + Dict(cmd_mods) mods = { 0 }; + if (!api_dict_to_keydict(&mods, KeyDict_cmd_mods_get_field, cmd->mods.data.dictionary, err)) { + goto end; + } + + if (HAS_KEY(mods.tab)) { + if (mods.tab.type != kObjectTypeInteger || mods.tab.data.integer < 0) { + VALIDATION_ERROR("'mods.tab' must be a non-negative Integer"); + } + cmdinfo.cmdmod.tab = (int)mods.tab.data.integer + 1; + } + + if (HAS_KEY(mods.verbose)) { + if (mods.verbose.type != kObjectTypeInteger || mods.verbose.data.integer <= 0) { + VALIDATION_ERROR("'mods.verbose' must be a non-negative Integer"); + } + cmdinfo.verbose = mods.verbose.data.integer; + } + + bool vertical; + OBJ_TO_BOOL(vertical, mods.vertical, false, "'mods.vertical'"); + cmdinfo.cmdmod.split |= (vertical ? WSP_VERT : 0); + + if (HAS_KEY(mods.split)) { + if (mods.split.type != kObjectTypeString) { + VALIDATION_ERROR("'mods.split' must be a String"); + } + + if (STRCMP(mods.split.data.string.data, "aboveleft") == 0 + || STRCMP(mods.split.data.string.data, "leftabove") == 0) { + cmdinfo.cmdmod.split |= WSP_ABOVE; + } else if (STRCMP(mods.split.data.string.data, "belowright") == 0 + || STRCMP(mods.split.data.string.data, "rightbelow") == 0) { + cmdinfo.cmdmod.split |= WSP_BELOW; + } else if (STRCMP(mods.split.data.string.data, "topleft") == 0) { + cmdinfo.cmdmod.split |= WSP_TOP; + } else if (STRCMP(mods.split.data.string.data, "botright") == 0) { + cmdinfo.cmdmod.split |= WSP_BOT; + } else { + VALIDATION_ERROR("Invalid value for 'mods.split'"); + } + } + + OBJ_TO_BOOL(cmdinfo.silent, mods.silent, false, "'mods.silent'"); + OBJ_TO_BOOL(cmdinfo.emsg_silent, mods.emsg_silent, false, "'mods.emsg_silent'"); + OBJ_TO_BOOL(cmdinfo.sandbox, mods.sandbox, false, "'mods.sandbox'"); + OBJ_TO_BOOL(cmdinfo.noautocmd, mods.noautocmd, false, "'mods.noautocmd'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.browse, mods.browse, false, "'mods.browse'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.confirm, mods.confirm, false, "'mods.confirm'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.hide, mods.hide, false, "'mods.hide'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.keepalt, mods.keepalt, false, "'mods.keepalt'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.keepjumps, mods.keepjumps, false, "'mods.keepjumps'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.keepmarks, mods.keepmarks, false, "'mods.keepmarks'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.keeppatterns, mods.keeppatterns, false, "'mods.keeppatterns'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.lockmarks, mods.lockmarks, false, "'mods.lockmarks'"); + OBJ_TO_BOOL(cmdinfo.cmdmod.noswapfile, mods.noswapfile, false, "'mods.noswapfile'"); + + if (cmdinfo.sandbox && !(ea.argt & EX_SBOXOK)) { + VALIDATION_ERROR("Command cannot be run in sandbox"); + } + } + + // Finally, build the command line string that will be stored inside ea.cmdlinep. + // This also sets the values of ea.cmd, ea.arg, ea.args and ea.arglens. + build_cmdline_str(&cmdline, &ea, &cmdinfo, args, argc); + ea.cmdlinep = &cmdline; + + garray_T capture_local; + const int save_msg_silent = msg_silent; + garray_T * const save_capture_ga = capture_ga; + + if (output) { + ga_init(&capture_local, 1, 80); + capture_ga = &capture_local; + } + + try_start(); + if (output) { + msg_silent++; + } + + WITH_SCRIPT_CONTEXT(channel_id, { + execute_cmd(&ea, &cmdinfo); + }); + + if (output) { + capture_ga = save_capture_ga; + msg_silent = save_msg_silent; + } + try_end(err); + + if (ERROR_SET(err)) { + goto clear_ga; + } + + if (output && capture_local.ga_len > 1) { + retv = (String){ + .data = capture_local.ga_data, + .size = (size_t)capture_local.ga_len, + }; + // redir usually (except :echon) prepends a newline. + if (retv.data[0] == '\n') { + memmove(retv.data, retv.data + 1, retv.size - 1); + retv.data[retv.size - 1] = '\0'; + retv.size = retv.size - 1; + } + goto end; + } +clear_ga: + if (output) { + ga_clear(&capture_local); + } +end: + xfree(cmdline); + xfree(cmdname); + xfree(ea.args); + xfree(ea.arglens); + for (size_t i = 0; i < argc; i++) { + xfree(args[i]); + } + xfree(args); + + return retv; + +#undef OBJ_TO_BOOL +#undef VALIDATION_ERROR +} diff --git a/src/nvim/auevents.lua b/src/nvim/auevents.lua index 9e3eb06752..93a870fe04 100644 --- a/src/nvim/auevents.lua +++ b/src/nvim/auevents.lua @@ -70,6 +70,8 @@ return { 'InsertEnter', -- when entering Insert mode 'InsertLeave', -- just after leaving Insert mode 'InsertLeavePre', -- just before leaving Insert mode + 'LspAttach', -- after an LSP client attaches to a buffer + 'LspDetach', -- after an LSP client detaches from a buffer 'MenuPopup', -- just before popup menu is displayed 'ModeChanged', -- after changing the mode 'OptionSet', -- after setting any option @@ -133,6 +135,8 @@ return { nvim_specific = { BufModifiedSet=true, DiagnosticChanged=true, + LspAttach=true, + LspDetach=true, RecordingEnter=true, RecordingLeave=true, Signal=true, diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index 1f8d6e6a1f..b87c7886e3 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -796,13 +796,13 @@ void do_autocmd(char *arg_in, int forceit) // Expand environment variables in the pattern. Set 'shellslash', we want // forward slashes here. - if (vim_strchr((char_u *)pat, '$') != NULL || vim_strchr((char_u *)pat, '~') != NULL) { + if (vim_strchr(pat, '$') != NULL || vim_strchr(pat, '~') != NULL) { #ifdef BACKSLASH_IN_FILENAME int p_ssl_save = p_ssl; p_ssl = true; #endif - envpat = (char *)expand_env_save((char_u *)pat); + envpat = expand_env_save(pat); #ifdef BACKSLASH_IN_FILENAME p_ssl = p_ssl_save; #endif @@ -1070,10 +1070,9 @@ int autocmd_register(int64_t id, event_T event, char *pat, int patlen, int group char *reg_pat; ap->buflocal_nr = 0; - reg_pat = (char *)file_pat_to_reg_pat((char_u *)pat, (char_u *)pat + patlen, &ap->allow_dirs, - true); + reg_pat = file_pat_to_reg_pat(pat, pat + patlen, &ap->allow_dirs, true); if (reg_pat != NULL) { - ap->reg_prog = vim_regcomp((char_u *)reg_pat, RE_MAGIC); + ap->reg_prog = vim_regcomp(reg_pat, RE_MAGIC); } xfree(reg_pat); if (reg_pat == NULL || ap->reg_prog == NULL) { @@ -1153,7 +1152,7 @@ size_t aucmd_pattern_length(char *pat) char *endpat; - for (; *pat; pat = (*endpat == ',' ? endpat + 1 : endpat)) { + for (; *pat; pat = endpat + 1) { // Find end of the pattern. // Watch out for a comma in braces, like "*.\{obj,o\}". endpat = pat; @@ -1221,7 +1220,7 @@ int do_doautocmd(char *arg_start, bool do_msg, bool *did_something) // Loop over the events. while (*arg && !ends_excmd(*arg) && !ascii_iswhite(*arg)) { if (apply_autocmds_group(event_name2nr(arg, &arg), fname, NULL, true, group, - curbuf, NULL)) { + curbuf, NULL, NULL)) { nothing_done = false; } } @@ -1241,8 +1240,8 @@ void ex_doautoall(exarg_T *eap) { int retval = OK; aco_save_T aco; - char_u *arg = (char_u *)eap->arg; - int call_do_modelines = check_nomodeline((char **)&arg); + char *arg = eap->arg; + int call_do_modelines = check_nomodeline(&arg); bufref_T bufref; bool did_aucmd; @@ -1261,7 +1260,7 @@ void ex_doautoall(exarg_T *eap) set_bufref(&bufref, buf); // execute the autocommands for this buffer - retval = do_doautocmd((char *)arg, false, &did_aucmd); + retval = do_doautocmd(arg, false, &did_aucmd); if (call_do_modelines && did_aucmd) { // Execute the modeline settings, but don't set window-local @@ -1282,7 +1281,7 @@ void ex_doautoall(exarg_T *eap) // Execute autocommands for the current buffer last. if (retval == OK) { - (void)do_doautocmd((char *)arg, false, &did_aucmd); + (void)do_doautocmd(arg, false, &did_aucmd); if (call_do_modelines && did_aucmd) { do_modelines(0); } @@ -1364,7 +1363,7 @@ void aucmd_prepbuf(aco_save_T *aco, buf_T *buf) // Make sure w_localdir and globaldir are NULL to avoid a chdir() in // win_enter_ext(). XFREE_CLEAR(aucmd_win->w_localdir); - aco->globaldir = (char *)globaldir; + aco->globaldir = globaldir; globaldir = NULL; block_autocmds(); // We don't want BufEnter/WinEnter autocommands. @@ -1451,7 +1450,7 @@ win_found: hash_init(&aucmd_win->w_vars->dv_hashtab); // re-use the hashtab xfree(globaldir); - globaldir = (char_u *)aco->globaldir; + globaldir = aco->globaldir; // the buffer contents may have changed check_cursor(); @@ -1504,10 +1503,9 @@ win_found: /// @param buf Buffer for <abuf> /// /// @return true if some commands were executed. -bool apply_autocmds(event_T event, char_u *fname, char_u *fname_io, bool force, buf_T *buf) +bool apply_autocmds(event_T event, char *fname, char *fname_io, bool force, buf_T *buf) { - return apply_autocmds_group(event, (char *)fname, (char *)fname_io, force, AUGROUP_ALL, buf, - NULL); + return apply_autocmds_group(event, fname, fname_io, force, AUGROUP_ALL, buf, NULL, NULL); } /// Like apply_autocmds(), but with extra "eap" argument. This takes care of @@ -1521,11 +1519,10 @@ bool apply_autocmds(event_T event, char_u *fname, char_u *fname_io, bool force, /// @param exarg Ex command arguments /// /// @return true if some commands were executed. -bool apply_autocmds_exarg(event_T event, char_u *fname, char_u *fname_io, bool force, buf_T *buf, +bool apply_autocmds_exarg(event_T event, char *fname, char *fname_io, bool force, buf_T *buf, exarg_T *eap) { - return apply_autocmds_group(event, (char *)fname, (char *)fname_io, force, AUGROUP_ALL, buf, - eap); + return apply_autocmds_group(event, fname, fname_io, force, AUGROUP_ALL, buf, eap, NULL); } /// Like apply_autocmds(), but handles the caller's retval. If the script @@ -1541,15 +1538,15 @@ bool apply_autocmds_exarg(event_T event, char_u *fname, char_u *fname_io, bool f /// @param[in,out] retval caller's retval /// /// @return true if some autocommands were executed -bool apply_autocmds_retval(event_T event, char_u *fname, char_u *fname_io, bool force, buf_T *buf, +bool apply_autocmds_retval(event_T event, char *fname, char *fname_io, bool force, buf_T *buf, int *retval) { if (should_abort(*retval)) { return false; } - bool did_cmd = apply_autocmds_group(event, (char *)fname, (char *)fname_io, force, - AUGROUP_ALL, buf, NULL); + bool did_cmd = apply_autocmds_group(event, fname, fname_io, force, + AUGROUP_ALL, buf, NULL, NULL); if (did_cmd && aborting()) { *retval = FAIL; } @@ -1568,7 +1565,7 @@ bool has_event(event_T event) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT /// the current mode. bool has_cursorhold(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { - return has_event((get_real_state() == NORMAL_BUSY ? EVENT_CURSORHOLD : EVENT_CURSORHOLDI)); + return has_event((get_real_state() == MODE_NORMAL_BUSY ? EVENT_CURSORHOLD : EVENT_CURSORHOLDI)); // return first_autopat[] != NULL; } @@ -1578,7 +1575,7 @@ bool trigger_cursorhold(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT if (!did_cursorhold && has_cursorhold() && reg_recording == 0 && typebuf.tb_len == 0 && !ins_compl_active()) { int state = get_real_state(); - if (state == NORMAL_BUSY || (state & INSERT) != 0) { + if (state == MODE_NORMAL_BUSY || (state & MODE_INSERT) != 0) { return true; } } @@ -1598,7 +1595,7 @@ bool trigger_cursorhold(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT /// /// @return true if some commands were executed. bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force, int group, - buf_T *buf, exarg_T *eap) + buf_T *buf, exarg_T *eap, Object *data) { char *sfname = NULL; // short file name bool retval = false; @@ -1659,9 +1656,9 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force } // Save the autocmd_* variables and info about the current buffer. - char *save_autocmd_fname = (char *)autocmd_fname; + char *save_autocmd_fname = autocmd_fname; int save_autocmd_bufnr = autocmd_bufnr; - char *save_autocmd_match = (char *)autocmd_match; + char *save_autocmd_match = autocmd_match; int save_autocmd_busy = autocmd_busy; int save_autocmd_nested = autocmd_nested; bool save_changed = curbuf->b_changed; @@ -1675,18 +1672,18 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force || event == EVENT_OPTIONSET || event == EVENT_MODECHANGED) { autocmd_fname = NULL; } else if (fname != NULL && !ends_excmd(*fname)) { - autocmd_fname = (char_u *)fname; + autocmd_fname = fname; } else if (buf != NULL) { - autocmd_fname = buf->b_ffname; + autocmd_fname = (char *)buf->b_ffname; } else { autocmd_fname = NULL; } } else { - autocmd_fname = (char_u *)fname_io; + autocmd_fname = fname_io; } if (autocmd_fname != NULL) { // Allocate MAXPATHL for when eval_vars() resolves the fullpath. - autocmd_fname = vim_strnsave(autocmd_fname, MAXPATHL); + autocmd_fname = xstrnsave(autocmd_fname, MAXPATHL); } // Set the buffer number to be used for <abuf>. @@ -1754,11 +1751,11 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force #endif // Set the name to be used for <amatch>. - autocmd_match = (char_u *)fname; + autocmd_match = fname; // Don't redraw while doing autocommands. RedrawingDisabled++; - char *save_sourcing_name = (char *)sourcing_name; + char *save_sourcing_name = sourcing_name; sourcing_name = NULL; // don't free this one linenr_T save_sourcing_lnum = sourcing_lnum; sourcing_lnum = 0; // no line number here @@ -1793,7 +1790,7 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force did_filetype = true; } - char *tail = (char *)path_tail((char_u *)fname); + char *tail = path_tail(fname); // Find first autocommand that matches AutoPatCmd patcmd; @@ -1814,6 +1811,9 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force patcmd.next = active_apc_list; active_apc_list = &patcmd; + // Attach data to command + patcmd.data = data; + // set v:cmdarg (only when there is a matching pattern) save_cmdbang = (long)get_vim_var_nr(VV_CMDBANG); if (eap != NULL) { @@ -1860,12 +1860,12 @@ bool apply_autocmds_group(event_T event, char *fname, char *fname_io, bool force filechangeshell_busy = false; autocmd_nested = save_autocmd_nested; xfree(sourcing_name); - sourcing_name = (char_u *)save_sourcing_name; + sourcing_name = save_sourcing_name; sourcing_lnum = save_sourcing_lnum; xfree(autocmd_fname); - autocmd_fname = (char_u *)save_autocmd_fname; + autocmd_fname = save_autocmd_fname; autocmd_bufnr = save_autocmd_bufnr; - autocmd_match = (char_u *)save_autocmd_match; + autocmd_match = save_autocmd_match; current_sctx = save_current_sctx; restore_funccal(); if (do_profiling == PROF_YES) { @@ -1933,7 +1933,7 @@ void block_autocmds(void) { // Remember the value of v:termresponse. if (!is_autocmd_blocked()) { - old_termresponse = (char *)get_vim_var_str(VV_TERMRESPONSE); + old_termresponse = get_vim_var_str(VV_TERMRESPONSE); } autocmd_blocked++; } @@ -1946,7 +1946,7 @@ void unblock_autocmds(void) // the autocommands now. Esp. useful when executing a shell command // during startup (nvim -d). if (!is_autocmd_blocked() - && get_vim_var_str(VV_TERMRESPONSE) != (char_u *)old_termresponse) { + && get_vim_var_str(VV_TERMRESPONSE) != old_termresponse) { apply_autocmds(EVENT_TERMRESPONSE, NULL, NULL, false, curbuf); } } @@ -1979,9 +1979,9 @@ void auto_next_pat(AutoPatCmd *apc, int stop_at_last) if (ap->buflocal_nr == 0 ? match_file_pat(NULL, &ap->reg_prog, - (char_u *)apc->fname, - (char_u *)apc->sfname, - (char_u *)apc->tail, + apc->fname, + apc->sfname, + apc->tail, ap->allow_dirs) : ap->buflocal_nr == apc->arg_bufnr) { const char *const name = event_nr2name(apc->event); @@ -1991,7 +1991,7 @@ void auto_next_pat(AutoPatCmd *apc, int stop_at_last) = (STRLEN(s) + strlen(name) + (size_t)ap->patlen + 1); sourcing_name = xmalloc(sourcing_name_len); - snprintf((char *)sourcing_name, sourcing_name_len, s, name, ap->pat); + snprintf(sourcing_name, sourcing_name_len, s, name, ap->pat); if (p_verbose >= 8) { verbose_enter(); smsg(_("Executing %s"), sourcing_name); @@ -2029,6 +2029,10 @@ static bool call_autocmd_callback(const AutoCmd *ac, const AutoPatCmd *apc) PUT(data, "file", CSTR_TO_OBJ((char *)autocmd_fname)); PUT(data, "buf", INTEGER_OBJ(autocmd_bufnr)); + if (apc->data) { + PUT(data, "data", copy_object(*apc->data)); + } + int group = apc->curpat->group; switch (group) { case AUGROUP_ERROR: @@ -2064,7 +2068,7 @@ static bool call_autocmd_callback(const AutoCmd *ac, const AutoPatCmd *apc) /// Get next autocommand command. /// Called by do_cmdline() to get the next line for ":if". /// @return allocated string, or NULL for end of autocommands. -char_u *getnextac(int c, void *cookie, int indent, bool do_concat) +char *getnextac(int c, void *cookie, int indent, bool do_concat) { // These arguments are required for do_cmdline. (void)c; @@ -2155,7 +2159,7 @@ char_u *getnextac(int c, void *cookie, int indent, bool do_concat) acp->nextcmd = ac->next; } - return (char_u *)retval; + return retval; } /// Return true if there is a matching autocommand for "fname". @@ -2165,12 +2169,13 @@ char_u *getnextac(int c, void *cookie, int indent, bool do_concat) /// @param event event that occurred. /// @param sfname filename the event occurred in. /// @param buf buffer the file is open in -bool has_autocmd(event_T event, char_u *sfname, buf_T *buf) FUNC_ATTR_WARN_UNUSED_RESULT +bool has_autocmd(event_T event, char *sfname, buf_T *buf) + FUNC_ATTR_WARN_UNUSED_RESULT { - char *tail = (char *)path_tail(sfname); + char *tail = path_tail(sfname); bool retval = false; - char *fname = FullName_save((char *)sfname, false); + char *fname = FullName_save(sfname, false); if (fname == NULL) { return false; } @@ -2188,9 +2193,9 @@ bool has_autocmd(event_T event, char_u *sfname, buf_T *buf) FUNC_ATTR_WARN_UNUSE && (ap->buflocal_nr == 0 ? match_file_pat(NULL, &ap->reg_prog, - (char_u *)fname, + fname, sfname, - (char_u *)tail, + tail, ap->allow_dirs) : buf != NULL && ap->buflocal_nr == buf->b_fnum)) { retval = true; @@ -2208,12 +2213,12 @@ bool has_autocmd(event_T event, char_u *sfname, buf_T *buf) FUNC_ATTR_WARN_UNUSE // Function given to ExpandGeneric() to obtain the list of autocommand group // names. -char_u *expand_get_augroup_name(expand_T *xp, int idx) +char *expand_get_augroup_name(expand_T *xp, int idx) { // Required for ExpandGeneric (void)xp; - return (char_u *)augroup_name(idx + 1); + return augroup_name(idx + 1); } /// @param doautocmd true for :doauto*, false for :autocmd @@ -2263,7 +2268,7 @@ char *set_context_in_autocmd(expand_T *xp, char *arg, int doautocmd) } // Function given to ExpandGeneric() to obtain the list of event names. -char_u *expand_get_event_name(expand_T *xp, int idx) +char *expand_get_event_name(expand_T *xp, int idx) { // xp is a required parameter to be used with ExpandGeneric (void)xp; @@ -2273,14 +2278,14 @@ char_u *expand_get_event_name(expand_T *xp, int idx) if (name != NULL) { // skip when not including groups or skip deleted entries if (!autocmd_include_groups || name == get_deleted_augroup()) { - return (char_u *)""; + return ""; } - return (char_u *)name; + return name; } // List event names - return (char_u *)event_names[idx - next_augroup_id].name; + return event_names[idx - next_augroup_id].name; } /// Check whether given autocommand is supported @@ -2373,7 +2378,7 @@ bool au_exists(const char *const arg) FUNC_ATTR_WARN_UNUSED_RESULT && (group == AUGROUP_ALL || ap->group == group) && (pattern == NULL || (buflocal_buf == NULL - ? FNAMECMP(ap->pat, (char_u *)pattern) == 0 + ? FNAMECMP(ap->pat, pattern) == 0 : ap->buflocal_nr == buflocal_buf->b_fnum))) { retval = true; break; @@ -2410,7 +2415,7 @@ int aupat_get_buflocal_nr(char *pat, int patlen) } // "<buffer=123>" - if (skipdigits((char_u *)pat + 8) == (char_u *)pat + patlen - 1) { + if (skipdigits(pat + 8) == pat + patlen - 1) { return atoi(pat + 8); } } @@ -2434,10 +2439,10 @@ void aupat_normalize_buflocal_pat(char *dest, char *pat, int patlen, int bufloca buflocal_nr); } -int autocmd_delete_event(int group, event_T event, char_u *pat) +int autocmd_delete_event(int group, event_T event, char *pat) FUNC_ATTR_NONNULL_ALL { - return do_autocmd_event(event, (char *)pat, false, false, "", true, group); + return do_autocmd_event(event, pat, false, false, "", true, group); } /// Deletes an autocmd by ID. @@ -2706,9 +2711,9 @@ static void do_autocmd_focusgained(bool gained) // belongs. need_wait_return = false; - if (State & CMDLINE) { + if (State & MODE_CMDLINE) { redrawcmdline(); - } else if ((State & NORMAL) || (State & INSERT)) { + } else if ((State & MODE_NORMAL) || (State & MODE_INSERT)) { if (must_redraw != 0) { update_screen(0); } diff --git a/src/nvim/autocmd.h b/src/nvim/autocmd.h index d3503672fd..47f583ae13 100644 --- a/src/nvim/autocmd.h +++ b/src/nvim/autocmd.h @@ -57,6 +57,7 @@ typedef struct AutoPatCmd { char *tail; // tail of fname event_T event; // current event int arg_bufnr; // initially equal to <abuf>, set to zero when buf is deleted + Object *data; // arbitrary data struct AutoPatCmd *next; // chain of active apc-s for auto-invalidation } AutoPatCmd; diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 107f61919a..4b1aea5720 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -111,7 +111,7 @@ static int read_buffer(int read_stdin, exarg_T *eap, int flags) // the end. This makes it possible to retry when 'fileformat' or // 'fileencoding' was guessed wrong. line_count = curbuf->b_ml.ml_line_count; - retval = readfile(read_stdin ? NULL : curbuf->b_ffname, + retval = readfile(read_stdin ? NULL : (char *)curbuf->b_ffname, read_stdin ? NULL : curbuf->b_fname, line_count, (linenr_T)0, (linenr_T)MAXLNUM, eap, flags | READ_BUFFER, silent); @@ -229,7 +229,7 @@ int open_buffer(int read_stdin, exarg_T *eap, int flags) } #endif - retval = readfile(curbuf->b_ffname, curbuf->b_fname, + retval = readfile((char *)curbuf->b_ffname, curbuf->b_fname, (linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM, eap, flags | READ_NEW | (read_fifo ? READ_FIFO : 0), silent); #ifdef UNIX @@ -1219,8 +1219,7 @@ int do_buffer(int action, int start, int dir, int count, int forceit) return FAIL; } } else { - semsg(_("E89: %s will be killed (add ! to override)"), - (char *)buf->b_fname); + semsg(_("E89: %s will be killed (add ! to override)"), buf->b_fname); return FAIL; } } @@ -1476,7 +1475,7 @@ void set_curbuf(buf_T *buf, int action) // Do not sync when in Insert mode and the buffer is open in // another window, might be a timer doing something in another // window. - if (prevbuf == curbuf && ((State & INSERT) == 0 || curbuf->b_nwindows <= 1)) { + if (prevbuf == curbuf && ((State & MODE_INSERT) == 0 || curbuf->b_nwindows <= 1)) { u_sync(false); } close_buffer(prevbuf == curwin->w_buffer ? curwin : NULL, @@ -1803,7 +1802,7 @@ buf_T *buflist_new(char_u *ffname_arg, char_u *sfname_arg, linenr_T lnum, int fl hash_init(&buf->b_s.b_keywtab); hash_init(&buf->b_s.b_keywtab_ic); - buf->b_fname = buf->b_sfname; + buf->b_fname = (char *)buf->b_sfname; if (!file_id_valid) { buf->file_id_valid = false; } else { @@ -2113,10 +2112,10 @@ int buflist_findpat(const char_u *pattern, const char_u *pattern_end, bool unlis { int match = -1; int find_listed; - char_u *pat; - char_u *patend; + char *pat; + char *patend; int attempt; - char_u *p; + char *p; int toggledollar; if (pattern_end == pattern + 1 && (*pattern == '%' || *pattern == '#')) { @@ -2138,7 +2137,7 @@ int buflist_findpat(const char_u *pattern, const char_u *pattern_end, bool unlis // Repeat this for finding an unlisted buffer if there was no matching // listed buffer. - pat = file_pat_to_reg_pat(pattern, pattern_end, NULL, false); + pat = file_pat_to_reg_pat((char *)pattern, (char *)pattern_end, NULL, false); if (pat == NULL) { return -1; } @@ -2271,7 +2270,7 @@ int ExpandBufnames(char_u *pat, int *num_file, char_u ***file, int options) } regmatch_T regmatch; - regmatch.regprog = vim_regcomp(patc + attempt * 11, RE_MAGIC); + regmatch.regprog = vim_regcomp((char *)patc + attempt * 11, RE_MAGIC); if (regmatch.regprog == NULL) { if (patc != pat) { xfree(patc); @@ -2366,7 +2365,7 @@ static char_u *buflist_match(regmatch_T *rmp, buf_T *buf, bool ignore_case) { // First try the short file name, then the long file name. char_u *match = fname_match(rmp, buf->b_sfname, ignore_case); - if (match == NULL) { + if (match == NULL && rmp->regprog != NULL) { match = fname_match(rmp, buf->b_ffname, ignore_case); } return match; @@ -2387,7 +2386,7 @@ static char_u *fname_match(regmatch_T *rmp, char_u *name, bool ignore_case) rmp->rm_ic = p_fic || ignore_case; if (vim_regexec(rmp, name, (colnr_T)0)) { match = name; - } else { + } else if (rmp->regprog != NULL) { // Replace $(HOME) with '~' and try matching again. p = home_replace_save(NULL, name); if (vim_regexec(rmp, p, (colnr_T)0)) { @@ -2426,7 +2425,7 @@ char_u *buflist_nr2name(int n, int fullname, int helptail) return NULL; } return home_replace_save(helptail ? buf : NULL, - fullname ? buf->b_ffname : buf->b_fname); + fullname ? buf->b_ffname : (char_u *)buf->b_fname); } /// Set the line and column numbers for the given buffer and window @@ -2622,7 +2621,7 @@ void buflist_list(exarg_T *eap) garray_T buflist; buf_T **buflist_data = NULL; - if (vim_strchr((char_u *)eap->arg, 't')) { + if (vim_strchr(eap->arg, 't')) { ga_init(&buflist, sizeof(buf_T *), 50); for (buf = firstbuf; buf != NULL; buf = buf->b_next) { ga_grow(&buflist, 1); @@ -2645,28 +2644,28 @@ void buflist_list(exarg_T *eap) const bool job_running = buf->terminal && terminal_running(buf->terminal); // skip unspecified buffers - if ((!buf->b_p_bl && !eap->forceit && !vim_strchr((char_u *)eap->arg, 'u')) - || (vim_strchr((char_u *)eap->arg, 'u') && buf->b_p_bl) - || (vim_strchr((char_u *)eap->arg, '+') + if ((!buf->b_p_bl && !eap->forceit && !vim_strchr(eap->arg, 'u')) + || (vim_strchr(eap->arg, 'u') && buf->b_p_bl) + || (vim_strchr(eap->arg, '+') && ((buf->b_flags & BF_READERR) || !bufIsChanged(buf))) - || (vim_strchr((char_u *)eap->arg, 'a') + || (vim_strchr(eap->arg, 'a') && (buf->b_ml.ml_mfp == NULL || buf->b_nwindows == 0)) - || (vim_strchr((char_u *)eap->arg, 'h') + || (vim_strchr(eap->arg, 'h') && (buf->b_ml.ml_mfp == NULL || buf->b_nwindows != 0)) - || (vim_strchr((char_u *)eap->arg, 'R') && (!is_terminal || !job_running)) - || (vim_strchr((char_u *)eap->arg, 'F') && (!is_terminal || job_running)) - || (vim_strchr((char_u *)eap->arg, '-') && buf->b_p_ma) - || (vim_strchr((char_u *)eap->arg, '=') && !buf->b_p_ro) - || (vim_strchr((char_u *)eap->arg, 'x') && !(buf->b_flags & BF_READERR)) - || (vim_strchr((char_u *)eap->arg, '%') && buf != curbuf) - || (vim_strchr((char_u *)eap->arg, '#') + || (vim_strchr(eap->arg, 'R') && (!is_terminal || !job_running)) + || (vim_strchr(eap->arg, 'F') && (!is_terminal || job_running)) + || (vim_strchr(eap->arg, '-') && buf->b_p_ma) + || (vim_strchr(eap->arg, '=') && !buf->b_p_ro) + || (vim_strchr(eap->arg, 'x') && !(buf->b_flags & BF_READERR)) + || (vim_strchr(eap->arg, '%') && buf != curbuf) + || (vim_strchr(eap->arg, '#') && (buf == curbuf || curwin->w_alt_fnum != buf->b_fnum))) { continue; } if (buf_spname(buf) != NULL) { STRLCPY(NameBuff, buf_spname(buf), MAXPATHL); } else { - home_replace(buf, buf->b_fname, NameBuff, MAXPATHL, true); + home_replace(buf, (char_u *)buf->b_fname, NameBuff, MAXPATHL, true); } if (message_filtered(NameBuff)) { @@ -2700,7 +2699,7 @@ void buflist_list(exarg_T *eap) do { IObuff[len++] = ' '; } while (--i > 0 && len < IOSIZE - 18); - if (vim_strchr((char_u *)eap->arg, 't') && buf->b_last_used) { + if (vim_strchr(eap->arg, 't') && buf->b_last_used) { undo_fmt_time(IObuff + len, (size_t)(IOSIZE - len), buf->b_last_used); } else { vim_snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), _("line %" PRId64), @@ -2730,7 +2729,7 @@ int buflist_name_nr(int fnum, char_u **fname, linenr_T *lnum) return FAIL; } - *fname = buf->b_fname; + *fname = (char_u *)buf->b_fname; *lnum = buflist_findlnum(buf); return OK; @@ -2794,7 +2793,7 @@ int setfname(buf_T *buf, char_u *ffname_arg, char_u *sfname_arg, bool message) buf->b_ffname = ffname; buf->b_sfname = sfname; } - buf->b_fname = buf->b_sfname; + buf->b_fname = (char *)buf->b_sfname; if (!file_id_valid) { buf->file_id_valid = false; } else { @@ -2823,7 +2822,7 @@ void buf_set_name(int fnum, char_u *name) // Allocate ffname and expand into full path. Also resolves .lnk // files on Win32. fname_expand(buf, &buf->b_ffname, &buf->b_sfname); - buf->b_fname = buf->b_sfname; + buf->b_fname = (char *)buf->b_sfname; } } @@ -2980,7 +2979,7 @@ void buf_set_file_id(buf_T *buf) { FileID file_id; if (buf->b_fname != NULL - && os_fileid((char *)buf->b_fname, &file_id)) { + && os_fileid(buf->b_fname, &file_id)) { buf->file_id_valid = true; buf->file_id = file_id; } else { @@ -3023,7 +3022,7 @@ void fileinfo(int fullname, int shorthelp, int dont_truncate) STRLCPY(p, buf_spname(curbuf), IOSIZE - (p - buffer)); } else { if (!fullname && curbuf->b_fname != NULL) { - name = curbuf->b_fname; + name = (char_u *)curbuf->b_fname; } else { name = curbuf->b_ffname; } @@ -3285,7 +3284,7 @@ void maketitle(void) if (buf_spname(curbuf) != NULL) { buf_p = buf_spname(curbuf); } else { // use file name only in icon - buf_p = path_tail(curbuf->b_ffname); + buf_p = (char_u *)path_tail((char *)curbuf->b_ffname); } *icon_str = NUL; // Truncate name at 100 bytes. @@ -3635,7 +3634,8 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // correct the start of the items for the truncation for (int idx = stl_groupitems[groupdepth] + 1; idx < curitem; idx++) { // Shift everything back by the number of removed bytes - stl_items[idx].start -= n; + // Minus one for the leading '<' added above. + stl_items[idx].start -= n - 1; // If the item was partially or completely truncated, set its // start to the start of the group @@ -3833,14 +3833,14 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san STRLCPY(NameBuff, buf_spname(wp->w_buffer), MAXPATHL); } else { char_u *t = (opt == STL_FULLPATH) ? wp->w_buffer->b_ffname - : wp->w_buffer->b_fname; + : (char_u *)wp->w_buffer->b_fname; home_replace(wp->w_buffer, t, NameBuff, MAXPATHL, true); } trans_characters(NameBuff, MAXPATHL); if (opt != STL_FILENAME) { str = (char *)NameBuff; } else { - str = (char *)path_tail(NameBuff); + str = path_tail((char *)NameBuff); } break; case STL_VIM_EXPR: // '{' @@ -3908,7 +3908,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // Check if the evaluated result is a number. // If so, convert the number to an int and free the string. if (str != NULL && *str != 0) { - if (*skipdigits((char_u *)str) == NUL) { + if (*skipdigits(str) == NUL) { num = atoi(str); XFREE_CLEAR(str); itemisflag = false; @@ -3961,8 +3961,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san break; case STL_COLUMN: - num = !(State & INSERT) && empty_line - ? 0 : (int)wp->w_cursor.col + 1; + num = (State & MODE_INSERT) == 0 && empty_line ? 0 : (int)wp->w_cursor.col + 1; break; case STL_VIRTCOL: @@ -3970,7 +3969,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san colnr_T virtcol = wp->w_virtcol + 1; // Don't display %V if it's the same as %c. if (opt == STL_VIRTCOL_ALT - && (virtcol == (colnr_T)(!(State & INSERT) && empty_line + && (virtcol == (colnr_T)((State & MODE_INSERT) == 0 && empty_line ? 0 : (int)wp->w_cursor.col + 1))) { break; } @@ -4028,7 +4027,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san long l = ml_find_line_or_offset(wp->w_buffer, wp->w_cursor.lnum, NULL, false); num = (wp->w_buffer->b_ml.ml_flags & ML_EMPTY) || l < 0 ? - 0L : l + 1 + (!(State & INSERT) && empty_line ? + 0L : l + 1 + ((State & MODE_INSERT) == 0 && empty_line ? 0 : (int)wp->w_cursor.col); break; } @@ -4650,7 +4649,7 @@ char_u *alist_name(aentry_T *aep) if (bp == NULL || bp->b_fname == NULL) { return aep->ae_fname; } - return bp->b_fname; + return (char_u *)bp->b_fname; } /// do_arg_all(): Open up to 'count' windows, one for each argument. @@ -5201,9 +5200,9 @@ static int chk_modeline(linenr_T lnum, int flags) s = linecopy = vim_strsave(s); // copy the line, it will change save_sourcing_lnum = sourcing_lnum; - save_sourcing_name = sourcing_name; + save_sourcing_name = (char_u *)sourcing_name; sourcing_lnum = lnum; // prepare for emsg() - sourcing_name = (char_u *)"modelines"; + sourcing_name = "modelines"; end = false; while (end == false) { @@ -5234,7 +5233,7 @@ static int chk_modeline(linenr_T lnum, int flags) break; } end = true; - s = vim_strchr(s, ' ') + 1; + s = (char_u *)vim_strchr((char *)s, ' ') + 1; } *e = NUL; // truncate the set command @@ -5259,7 +5258,7 @@ static int chk_modeline(linenr_T lnum, int flags) } sourcing_lnum = save_sourcing_lnum; - sourcing_name = save_sourcing_name; + sourcing_name = (char *)save_sourcing_name; xfree(linecopy); @@ -5358,7 +5357,7 @@ char_u *buf_spname(buf_T *buf) // contains the name as specified by the user. if (bt_nofile(buf)) { if (buf->b_fname != NULL) { - return buf->b_fname; + return (char_u *)buf->b_fname; } if (bt_prompt(buf)) { return (char_u *)_("[Prompt]"); @@ -5552,7 +5551,7 @@ char_u *buf_get_fname(const buf_T *buf) if (buf->b_fname == NULL) { return (char_u *)_("[No Name]"); } - return buf->b_fname; + return (char_u *)buf->b_fname; } /// Set 'buflisted' for curbuf to "on" and trigger autocommands if it changed. @@ -5594,7 +5593,7 @@ bool buf_contents_changed(buf_T *buf) aucmd_prepbuf(&aco, newbuf); if (ml_open(curbuf) == OK - && readfile(buf->b_ffname, buf->b_fname, + && readfile((char *)buf->b_ffname, buf->b_fname, (linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM, &ea, READ_NEW | READ_DUMMY, false) == OK) { // compare the two files line by line diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index 1d994a9ff0..9efa540210 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -233,6 +233,8 @@ typedef struct { #define w_p_sbr w_onebuf_opt.wo_sbr // 'showbreak' char_u *wo_stl; #define w_p_stl w_onebuf_opt.wo_stl // 'statusline' + char *wo_wbr; +#define w_p_wbr w_onebuf_opt.wo_wbr // 'winbar' int wo_scb; #define w_p_scb w_onebuf_opt.wo_scb // 'scrollbind' int wo_diff_saved; // options were saved for starting diff mode @@ -537,16 +539,14 @@ struct file_buffer { int b_ro_locked; // Non-zero when the buffer can't be changed. // Used for FileChangedRO - // // b_ffname has the full path of the file (NULL for no name). // b_sfname is the name as the user typed it (or NULL). // b_fname is the same as b_sfname, unless ":cd" has been done, // then it is the same as b_ffname (NULL for no name). - // char_u *b_ffname; // full path file name, allocated char_u *b_sfname; // short file name, allocated, may be equal to // b_ffname - char_u *b_fname; // current file name, points to b_ffname or + char *b_fname; // current file name, points to b_ffname or // b_sfname bool file_id_valid; @@ -1237,6 +1237,7 @@ struct window_S { struct { int stl; int stlnc; + int wbr; int horiz; int horizup; int horizdown; @@ -1284,14 +1285,20 @@ struct window_S { // int w_winrow; // first row of window in screen int w_height; // number of rows in window, excluding - // status/command/winbar line(s) + // status/command line(s) int w_status_height; // number of status lines (0 or 1) + int w_winbar_height; // number of window bars (0 or 1) int w_wincol; // Leftmost column of window in screen. int w_width; // Width of window, excluding separation. int w_hsep_height; // Number of horizontal separator rows (0 or 1) int w_vsep_width; // Number of vertical separator columns (0 or 1). pos_save_T w_save_cursor; // backup of cursor pos and topline + int w_winrow_off; ///< offset from winrow to the inner window area + int w_wincol_off; ///< offset from wincol to the inner window area + ///< this includes float border but excludes special columns + ///< implemented in win_line() (i.e. signs, folds, numbers) + // inner size of window, which can be overridden by external UI int w_height_inner; int w_width_inner; @@ -1381,6 +1388,7 @@ struct window_S { linenr_T w_redraw_top; // when != 0: first line needing redraw linenr_T w_redraw_bot; // when != 0: last line needing redraw bool w_redr_status; // if true status line must be redrawn + bool w_redr_winbar; // if true window bar must be redrawn bool w_redr_border; // if true border must be redrawn // remember what is shown in the ruler for this window (if 'ruler' set) @@ -1410,6 +1418,7 @@ struct window_S { // A few options have local flags for P_INSECURE. uint32_t w_p_stl_flags; // flags for 'statusline' + uint32_t w_p_wbr_flags; // flags for 'winbar' uint32_t w_p_fde_flags; // flags for 'foldexpr' uint32_t w_p_fdt_flags; // flags for 'foldtext' int *w_p_cc_cols; // array of columns to highlight or NULL diff --git a/src/nvim/buffer_updates.c b/src/nvim/buffer_updates.c index 3e2d04b3a2..57f052ced0 100644 --- a/src/nvim/buffer_updates.c +++ b/src/nvim/buffer_updates.c @@ -254,7 +254,7 @@ void buf_updates_send_changes(buf_T *buf, linenr_T firstline, int64_t num_added, for (size_t i = 0; i < kv_size(buf->update_callbacks); i++) { BufUpdateCallbacks cb = kv_A(buf->update_callbacks, i); bool keep = true; - if (cb.on_lines != LUA_NOREF && (cb.preview || !(State & CMDPREVIEW))) { + if (cb.on_lines != LUA_NOREF && (cb.preview || !(State & MODE_CMDPREVIEW))) { Array args = ARRAY_DICT_INIT; Object items[8]; args.size = 6; // may be increased to 8 below @@ -313,7 +313,7 @@ void buf_updates_send_splice(buf_T *buf, int start_row, colnr_T start_col, bcoun for (size_t i = 0; i < kv_size(buf->update_callbacks); i++) { BufUpdateCallbacks cb = kv_A(buf->update_callbacks, i); bool keep = true; - if (cb.on_bytes != LUA_NOREF && (cb.preview || !(State & CMDPREVIEW))) { + if (cb.on_bytes != LUA_NOREF && (cb.preview || !(State & MODE_CMDPREVIEW))) { FIXED_TEMP_ARRAY(args, 11); // the first argument is always the buffer handle diff --git a/src/nvim/change.c b/src/nvim/change.c index abc000d236..94e5a19edc 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -209,6 +209,10 @@ static void changed_common(linenr_T lnum, colnr_T col, linenr_T lnume, long xtra curwin->w_changelistidx = curbuf->b_changelistlen; } + if (VIsual_active) { + check_visual_pos(); + } + FOR_ALL_TAB_WINDOWS(tp, wp) { if (wp->w_buffer == curbuf) { // Mark this window to be redrawn later. @@ -543,7 +547,7 @@ void ins_bytes_len(char_u *p, size_t len) } /// Insert or replace a single character at the cursor position. -/// When in REPLACE or VREPLACE mode, replace any existing character. +/// When in MODE_REPLACE or MODE_VREPLACE state, replace any existing character. /// Caller must have prepared for undo. /// For multi-byte characters we get the whole character, the caller must /// convert bytes to a character. @@ -557,7 +561,7 @@ void ins_char(int c) if (buf[0] == 0) { buf[0] = '\n'; } - ins_char_bytes(buf, n); + ins_char_bytes((char_u *)buf, n); } void ins_char_bytes(char_u *buf, size_t charlen) @@ -652,7 +656,7 @@ void ins_char_bytes(char_u *buf, size_t charlen) // If we're in Insert or Replace mode and 'showmatch' is set, then briefly // show the match for right parens and braces. - if (p_sm && (State & INSERT) + if (p_sm && (State & MODE_INSERT) && msg_silent == 0 && !ins_compl_active()) { showmatch(utf_ptr2char((char *)buf)); @@ -923,10 +927,10 @@ int copy_indent(int size, char_u *src) /// open_line: Add a new line below or above the current line. /// -/// For VREPLACE mode, we only add a new line when we get to the end of the -/// file, otherwise we just start replacing the next line. +/// For MODE_VREPLACE state, we only add a new line when we get to the end of +/// the file, otherwise we just start replacing the next line. /// -/// Caller must take care of undo. Since VREPLACE may affect any number of +/// Caller must take care of undo. Since MODE_VREPLACE may affect any number of /// lines however, it may call u_save_cursor() again when starting to change a /// new line. /// "flags": OPENLINE_DELSPACES delete spaces after cursor @@ -963,8 +967,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) char_u *p; char_u saved_char = NUL; // init for GCC pos_T *pos; - bool do_si = (!p_paste && curbuf->b_p_si && !curbuf->b_p_cin - && *curbuf->b_p_inde == NUL); + bool do_si = may_do_si(); bool do_cindent; bool no_si = false; // reset did_si afterwards int first_char = NUL; // init for GCC @@ -979,7 +982,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) char_u *saved_line = vim_strsave(get_cursor_line_ptr()); if (State & VREPLACE_FLAG) { - // With VREPLACE we make a copy of the next line, which we will be + // With MODE_VREPLACE we make a copy of the next line, which we will be // starting to replace. First make the new line empty and let vim play // with the indenting and comment leader to its heart's content. Then // we grab what it ended up putting on the new line, put back the @@ -992,11 +995,11 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) next_line = vim_strsave((char_u *)""); } - // In VREPLACE mode, a NL replaces the rest of the line, and starts - // replacing the next line, so push all of the characters left on the - // line onto the replace stack. We'll push any other characters that - // might be replaced at the start of the next line (due to autoindent - // etc) a bit later. + // In MODE_VREPLACE state, a NL replaces the rest of the line, and + // starts replacing the next line, so push all of the characters left + // on the line onto the replace stack. We'll push any other characters + // that might be replaced at the start of the next line (due to + // autoindent etc) a bit later. replace_push(NUL); // Call twice because BS over NL expects it replace_push(NUL); p = saved_line + curwin->w_cursor.col; @@ -1006,8 +1009,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) saved_line[curwin->w_cursor.col] = NUL; } - if ((State & INSERT) - && !(State & VREPLACE_FLAG)) { + if ((State & MODE_INSERT) && (State & VREPLACE_FLAG) == 0) { p_extra = saved_line + curwin->w_cursor.col; if (do_si) { // need first char after new line break p = (char_u *)skipwhite((char *)p_extra); @@ -1500,7 +1502,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) while (off > 0 && lead_len > 0 && leader[lead_len - 1] == ' ') { // Don't do it when there is a tab before the space - if (vim_strchr((char_u *)skipwhite((char *)leader), '\t') != NULL) { + if (vim_strchr(skipwhite((char *)leader), '\t') != NULL) { break; } lead_len--; @@ -1552,15 +1554,16 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) } } - // (State == INSERT || State == REPLACE), only when dir == FORWARD + // (State == MODE_INSERT || State == MODE_REPLACE), only when dir == FORWARD if (p_extra != NULL) { *p_extra = saved_char; // restore char that NUL replaced // When 'ai' set or "flags" has OPENLINE_DELSPACES, skip to the first // non-blank. // - // When in REPLACE mode, put the deleted blanks on the replace stack, - // preceded by a NUL, so they can be put back when a BS is entered. + // When in MODE_REPLACE state, put the deleted blanks on the replace + // stack, preceded by a NUL, so they can be put back when a BS is + // entered. if (REPLACE_NORMAL(State)) { replace_push(NUL); // end of extra blanks } @@ -1612,7 +1615,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) if (dir == BACKWARD) { curwin->w_cursor.lnum--; } - if (!(State & VREPLACE_FLAG) || old_cursor.lnum >= orig_line_count) { + if ((State & VREPLACE_FLAG) == 0 || old_cursor.lnum >= orig_line_count) { if (ml_append(curwin->w_cursor.lnum, (char *)p_extra, (colnr_T)0, false) == FAIL) { goto theend; } @@ -1627,7 +1630,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) } did_append = true; } else { - // In VREPLACE mode we are starting to replace the next line. + // In MODE_VREPLACE state we are starting to replace the next line. curwin->w_cursor.lnum++; if (curwin->w_cursor.lnum >= Insstart.lnum + vr_lines_changed) { // In case we NL to a new line, BS to the previous one, and NL @@ -1669,8 +1672,8 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) ai_col = curwin->w_cursor.col; - // In REPLACE mode, for each character in the new indent, there must - // be a NUL on the replace stack, for when it is deleted with BS + // In MODE_REPLACE state, for each character in the new indent, there + // must be a NUL on the replace stack, for when it is deleted with BS if (REPLACE_NORMAL(State)) { for (colnr_T n = 0; n < curwin->w_cursor.col; n++) { replace_push(NUL); @@ -1683,8 +1686,8 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) } inhibit_delete_count--; - // In REPLACE mode, for each character in the extra leader, there must be - // a NUL on the replace stack, for when it is deleted with BS. + // In MODE_REPLACE state, for each character in the extra leader, there + // must be a NUL on the replace stack, for when it is deleted with BS. if (REPLACE_NORMAL(State)) { while (lead_len-- > 0) { replace_push(NUL); @@ -1694,7 +1697,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) curwin->w_cursor = old_cursor; if (dir == FORWARD) { - if (trunc_line || (State & INSERT)) { + if (trunc_line || (State & MODE_INSERT)) { // truncate current line at cursor saved_line[curwin->w_cursor.col] = NUL; // Remove trailing white space, unless OPENLINE_KEEPTRAIL used. @@ -1752,12 +1755,12 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) curwin->w_cursor.col = newcol; curwin->w_cursor.coladd = 0; - // In VREPLACE mode, we are handling the replace stack ourselves, so stop - // fixthisline() from doing it (via change_indent()) by telling it we're in - // normal INSERT mode. + // In MODE_VREPLACE state, we are handling the replace stack ourselves, so + // stop fixthisline() from doing it (via change_indent()) by telling it + // we're in normal MODE_INSERT state. if (State & VREPLACE_FLAG) { vreplace_mode = State; // So we know to put things right later - State = INSERT; + State = MODE_INSERT; } else { vreplace_mode = 0; } @@ -1778,9 +1781,9 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) State = vreplace_mode; } - // Finally, VREPLACE gets the stuff on the new line, then puts back the - // original line, and inserts the new stuff char by char, pushing old stuff - // onto the replace stack (via ins_char()). + // Finally, MODE_VREPLACE gets the stuff on the new line, then puts back + // the original line, and inserts the new stuff char by char, pushing old + // stuff onto the replace stack (via ins_char()). if (State & VREPLACE_FLAG) { // Put new line in p_extra p_extra = vim_strsave(get_cursor_line_ptr()); @@ -1879,7 +1882,7 @@ int get_leader_len(char_u *line, char_u **flags, bool backward, bool include_spa { int j; int got_com = false; - char_u part_buf[COM_MAX_LEN]; // buffer for one option part + char part_buf[COM_MAX_LEN]; // buffer for one option part char_u *string; // pointer to comment string char_u *list; int middle_match_len = 0; @@ -1903,8 +1906,8 @@ int get_leader_len(char_u *line, char_u **flags, bool backward, bool include_spa *flags = list; // remember where flags started } prev_list = list; - (void)copy_option_part(&list, part_buf, COM_MAX_LEN, ","); - string = vim_strchr(part_buf, ':'); + (void)copy_option_part(&list, (char_u *)part_buf, COM_MAX_LEN, ","); + string = (char_u *)vim_strchr(part_buf, ':'); if (string == NULL) { // missing ':', ignore this part continue; } @@ -2026,7 +2029,7 @@ int get_last_leader_offset(char_u *line, char_u **flags) char_u *com_leader; char_u *com_flags; char_u *list; - char_u part_buf[COM_MAX_LEN]; // buffer for one option part + char part_buf[COM_MAX_LEN]; // buffer for one option part // Repeat to match several nested comment strings. int i = (int)STRLEN(line); @@ -2038,8 +2041,8 @@ int get_last_leader_offset(char_u *line, char_u **flags) // Get one option part into part_buf[]. Advance list to next one. // put string at start of string. - (void)copy_option_part(&list, part_buf, COM_MAX_LEN, ","); - string = vim_strchr(part_buf, ':'); + (void)copy_option_part(&list, (char_u *)part_buf, COM_MAX_LEN, ","); + string = (char_u *)vim_strchr(part_buf, ':'); if (string == NULL) { // If everything is fine, this cannot actually // happen. continue; @@ -2097,7 +2100,7 @@ int get_last_leader_offset(char_u *line, char_u **flags) } if (found_one) { - char_u part_buf2[COM_MAX_LEN]; // buffer for one option part + char part_buf2[COM_MAX_LEN]; // buffer for one option part int len1, len2, off; result = i; @@ -2121,11 +2124,11 @@ int get_last_leader_offset(char_u *line, char_u **flags) for (list = curbuf->b_p_com; *list;) { char_u *flags_save = list; - (void)copy_option_part(&list, part_buf2, COM_MAX_LEN, ","); + (void)copy_option_part(&list, (char_u *)part_buf2, COM_MAX_LEN, ","); if (flags_save == com_flags) { continue; } - string = vim_strchr(part_buf2, ':'); + string = (char_u *)vim_strchr(part_buf2, ':'); string++; while (ascii_iswhite(*string)) { string++; diff --git a/src/nvim/charset.c b/src/nvim/charset.c index 466d943c3e..082791ffd1 100644 --- a/src/nvim/charset.c +++ b/src/nvim/charset.c @@ -1015,7 +1015,7 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T *en if (cursor != NULL) { if ((*ptr == TAB) - && (State & NORMAL) + && (State & MODE_NORMAL) && !wp->w_p_list && !virtual_active() && !(VIsual_active && ((*p_sel == 'e') || ltoreq(*pos, VIsual)))) { @@ -1187,16 +1187,16 @@ intptr_t getwhitecols(const char_u *p) /// @param[in] q String to skip digits in. /// /// @return Pointer to the character after the skipped digits. -char_u *skipdigits(const char_u *q) +char *skipdigits(const char *q) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET { - const char_u *p = q; + const char *p = q; while (ascii_isdigit(*p)) { // skip to next non-digit p++; } - return (char_u *)p; + return (char *)p; } /// skip over binary digits @@ -1541,6 +1541,7 @@ void vim_str2nr(const char_u *const start, int *const prep, int *const len, cons // Do the conversion manually to avoid sscanf() quirks. abort(); // Should’ve used goto earlier. + // -V:PARSE_NUMBER:560 #define PARSE_NUMBER(base, cond, conv) \ do { \ const char *const after_prefix = ptr; \ diff --git a/src/nvim/context.c b/src/nvim/context.c index 0e0d8fdfde..db26667009 100644 --- a/src/nvim/context.c +++ b/src/nvim/context.c @@ -129,8 +129,8 @@ bool ctx_restore(Context *ctx, const int flags) free_ctx = true; } - char_u *op_shada; - get_option_value("shada", NULL, (char **)&op_shada, OPT_GLOBAL); + char *op_shada; + get_option_value("shada", NULL, &op_shada, OPT_GLOBAL); set_option_value("shada", 0L, "!,'100,%", OPT_GLOBAL); if (flags & kCtxRegs) { @@ -157,7 +157,7 @@ bool ctx_restore(Context *ctx, const int flags) ctx_free(ctx); } - set_option_value("shada", 0L, (char *)op_shada, OPT_GLOBAL); + set_option_value("shada", 0L, op_shada, OPT_GLOBAL); xfree(op_shada); return true; diff --git a/src/nvim/cursor.c b/src/nvim/cursor.c index 6208efc9c8..1446257f7e 100644 --- a/src/nvim/cursor.c +++ b/src/nvim/cursor.c @@ -95,8 +95,8 @@ static int coladvance2(pos_T *pos, bool addspaces, bool finetune, colnr_T wcol_a colnr_T col = 0; int head = 0; - int one_more = (State & INSERT) - || (State & TERM_FOCUS) + int one_more = (State & MODE_INSERT) + || (State & MODE_TERMINAL) || restart_edit != NUL || (VIsual_active && *p_sel != 'o') || ((get_ve_flags() & VE_ONEMORE) && wcol < MAXCOL); @@ -128,7 +128,7 @@ static int coladvance2(pos_T *pos, bool addspaces, bool finetune, colnr_T wcol_a } if (wcol / width > (colnr_T)csize / width - && ((State & INSERT) == 0 || (int)wcol > csize + 1)) { + && ((State & MODE_INSERT) == 0 || (int)wcol > csize + 1)) { // In case of line wrapping don't move the cursor beyond the // right screen edge. In Insert mode allow going just beyond // the last character (like what happens when typing and @@ -350,7 +350,7 @@ void check_cursor_col_win(win_T *win) // - in Insert mode or restarting Insert mode // - in Visual mode and 'selection' isn't "old" // - 'virtualedit' is set */ - if ((State & INSERT) || restart_edit + if ((State & MODE_INSERT) || restart_edit || (VIsual_active && *p_sel != 'o') || (cur_ve_flags & VE_ONEMORE) || virtual_active()) { @@ -399,6 +399,24 @@ void check_cursor(void) check_cursor_col(); } +/// Check if VIsual position is valid, correct it if not. +/// Can be called when in Visual mode and a change has been made. +void check_visual_pos(void) +{ + if (VIsual.lnum > curbuf->b_ml.ml_line_count) { + VIsual.lnum = curbuf->b_ml.ml_line_count; + VIsual.col = 0; + VIsual.coladd = 0; + } else { + int len = (int)STRLEN(ml_get(VIsual.lnum)); + + if (VIsual.col > len) { + VIsual.col = len; + VIsual.coladd = 0; + } + } +} + /// Make sure curwin->w_cursor is not on the NUL at the end of the line. /// Allow it when in Visual mode and 'selection' is not "old". void adjust_cursor_col(void) diff --git a/src/nvim/cursor_shape.c b/src/nvim/cursor_shape.c index b092873a35..b69505d7c9 100644 --- a/src/nvim/cursor_shape.c +++ b/src/nvim/cursor_shape.c @@ -120,8 +120,8 @@ char *parse_shape_opt(int what) // Repeat for all comma separated parts. char *modep = (char *)p_guicursor; while (modep != NULL && *modep != NUL) { - colonp = (char *)vim_strchr((char_u *)modep, ':'); - commap = (char *)vim_strchr((char_u *)modep, ','); + colonp = vim_strchr(modep, ':'); + commap = vim_strchr(modep, ','); if (colonp == NULL || (commap != NULL && commap < colonp)) { return N_("E545: Missing colon"); @@ -215,7 +215,7 @@ char *parse_shape_opt(int what) } p += 5; } else { // must be a highlight group name then - endp = (char *)vim_strchr((char_u *)p, '-'); + endp = vim_strchr(p, '-'); if (commap == NULL) { // last part if (endp == NULL) { endp = p + STRLEN(p); // find end of part @@ -223,7 +223,7 @@ char *parse_shape_opt(int what) } else if (endp > commap || endp == NULL) { endp = commap; } - slashp = (char *)vim_strchr((char_u *)p, '/'); + slashp = vim_strchr(p, '/'); if (slashp != NULL && slashp < endp) { // "group/langmap_group" i = syn_check_group(p, (size_t)(slashp - p)); @@ -320,15 +320,15 @@ bool cursor_mode_uses_syn_id(int syn_id) int cursor_get_mode_idx(void) FUNC_ATTR_PURE { - if (State == SHOWMATCH) { + if (State == MODE_SHOWMATCH) { return SHAPE_IDX_SM; } else if (State & VREPLACE_FLAG) { return SHAPE_IDX_R; } else if (State & REPLACE_FLAG) { return SHAPE_IDX_R; - } else if (State & INSERT) { + } else if (State & MODE_INSERT) { return SHAPE_IDX_I; - } else if (State & CMDLINE) { + } else if (State & MODE_CMDLINE) { if (cmdline_at_end()) { return SHAPE_IDX_C; } else if (cmdline_overstrike()) { diff --git a/src/nvim/debugger.c b/src/nvim/debugger.c index 662b9bfb0a..b2ac28629c 100644 --- a/src/nvim/debugger.c +++ b/src/nvim/debugger.c @@ -60,7 +60,7 @@ void do_debug(char_u *cmd) int save_ignore_script = 0; int n; char_u *cmdline = NULL; - char_u *p; + char *p; char *tail = NULL; static int last_cmd = 0; #define CMD_CONT 1 @@ -83,7 +83,7 @@ void do_debug(char_u *cmd) emsg_silent = false; // display error messages redir_off = true; // don't redirect debug commands - State = NORMAL; + State = MODE_NORMAL; debug_mode = true; if (!debug_did_msg) { @@ -100,7 +100,7 @@ void do_debug(char_u *cmd) debug_newval = NULL; } if (sourcing_name != NULL) { - msg((char *)sourcing_name); + msg(sourcing_name); } if (sourcing_lnum != 0) { smsg(_("line %" PRId64 ": %s"), (int64_t)sourcing_lnum, cmd); @@ -141,7 +141,7 @@ void do_debug(char_u *cmd) // If this is a debug command, set "last_cmd". // If not, reset "last_cmd". // For a blank line use previous command. - p = (char_u *)skipwhite((char *)cmdline); + p = skipwhite((char *)cmdline); if (*p != NUL) { switch (*p) { case 'c': @@ -200,7 +200,7 @@ void do_debug(char_u *cmd) if (last_cmd != 0) { // Check that the tail matches. p++; - while (*p != NUL && *p == (char_u)(*tail)) { + while (*p != NUL && *p == *tail) { p++; tail++; } @@ -242,8 +242,8 @@ void do_debug(char_u *cmd) if (*p == NUL) { do_showbacktrace(cmd); } else { - p = (char_u *)skipwhite((char *)p); - do_setdebugtracelevel(p); + p = skipwhite(p); + do_setdebugtracelevel((char_u *)p); } continue; case CMD_UP: @@ -293,7 +293,7 @@ static int get_maxbacktrace_level(void) int maxbacktrace = 0; if (sourcing_name != NULL) { - char *p = (char *)sourcing_name; + char *p = sourcing_name; char *q; while ((q = strstr(p, "..")) != NULL) { p = q + 2; @@ -334,7 +334,7 @@ static void do_showbacktrace(char_u *cmd) if (sourcing_name != NULL) { int i = 0; int max = get_maxbacktrace_level(); - char *cur = (char *)sourcing_name; + char *cur = sourcing_name; while (!got_int) { char *next = strstr(cur, ".."); if (next != NULL) { @@ -475,8 +475,8 @@ static typval_T *eval_expr_no_emsg(struct debuggy *const bp) /// @param gap either &dbg_breakp or &prof_ga static int dbg_parsearg(char_u *arg, garray_T *gap) { - char_u *p = arg; - char_u *q; + char *p = (char *)arg; + char *q; bool here = false; ga_grow(gap, 1); @@ -501,14 +501,14 @@ static int dbg_parsearg(char_u *arg, garray_T *gap) semsg(_(e_invarg2), p); return FAIL; } - p = (char_u *)skipwhite((char *)p + 4); + p = skipwhite(p + 4); // Find optional line number. if (here) { bp->dbg_lnum = curwin->w_cursor.lnum; } else if (gap != &prof_ga && ascii_isdigit(*p)) { - bp->dbg_lnum = getdigits_long(&p, true, 0); - p = (char_u *)skipwhite((char *)p); + bp->dbg_lnum = getdigits_long((char_u **)&p, true, 0); + p = skipwhite(p); } else { bp->dbg_lnum = 0; } @@ -516,17 +516,17 @@ static int dbg_parsearg(char_u *arg, garray_T *gap) // Find the function or file name. Don't accept a function name with (). if ((!here && *p == NUL) || (here && *p != NUL) - || (bp->dbg_type == DBG_FUNC && strstr((char *)p, "()") != NULL)) { + || (bp->dbg_type == DBG_FUNC && strstr(p, "()") != NULL)) { semsg(_(e_invarg2), arg); return FAIL; } if (bp->dbg_type == DBG_FUNC) { - bp->dbg_name = vim_strsave(p); + bp->dbg_name = vim_strsave((char_u *)p); } else if (here) { bp->dbg_name = vim_strsave(curbuf->b_ffname); } else if (bp->dbg_type == DBG_EXPR) { - bp->dbg_name = vim_strsave(p); + bp->dbg_name = vim_strsave((char_u *)p); bp->dbg_val = eval_expr_no_emsg(bp); } else { // Expand the file name in the same way as do_source(). This means @@ -542,10 +542,10 @@ static int dbg_parsearg(char_u *arg, garray_T *gap) return FAIL; } if (*p != '*') { - bp->dbg_name = (char_u *)fix_fname((char *)p); + bp->dbg_name = (char_u *)fix_fname(p); xfree(p); } else { - bp->dbg_name = p; + bp->dbg_name = (char_u *)p; } } @@ -568,7 +568,7 @@ void ex_breakadd(exarg_T *eap) bp->dbg_forceit = eap->forceit; if (bp->dbg_type != DBG_EXPR) { - char_u *pat = file_pat_to_reg_pat(bp->dbg_name, NULL, NULL, false); + char *pat = file_pat_to_reg_pat((char *)bp->dbg_name, NULL, NULL, false); if (pat != NULL) { bp->dbg_prog = vim_regcomp(pat, RE_MAGIC + RE_STRING); xfree(pat); diff --git a/src/nvim/diff.c b/src/nvim/diff.c index 55992f3fae..e8d54d7030 100644 --- a/src/nvim/diff.c +++ b/src/nvim/diff.c @@ -744,7 +744,7 @@ static int diff_write_buffer(buf_T *buf, diffin_T *din) for (char_u *s = ml_get_buf(buf, lnum, false); *s != NUL;) { if (diff_flags & DIFF_ICASE) { int c; - char_u cbuf[MB_MAXBYTES + 1]; + char cbuf[MB_MAXBYTES + 1]; if (*s == NL) { c = NUL; @@ -794,7 +794,7 @@ static int diff_write(buf_T *buf, diffin_T *din) // Writing the buffer is an implementation detail of performing the diff, // so it shouldn't update the '[ and '] marks. cmdmod.lockmarks = true; - int r = buf_write(buf, din->din_fname, NULL, + int r = buf_write(buf, (char *)din->din_fname, NULL, (linenr_T)1, buf->b_ml.ml_line_count, NULL, false, false, false, true); cmdmod.lockmarks = save_lockmarks; @@ -1160,7 +1160,7 @@ void ex_diffpatch(exarg_T *eap) { char_u *buf = NULL; win_T *old_curwin = curwin; - char_u *newname = NULL; // name of patched file buffer + char *newname = NULL; // name of patched file buffer char_u *esc_name = NULL; #ifdef UNIX @@ -1178,7 +1178,7 @@ void ex_diffpatch(exarg_T *eap) } // Write the current buffer to "tmp_orig". - if (buf_write(curbuf, tmp_orig, NULL, + if (buf_write(curbuf, (char *)tmp_orig, NULL, (linenr_T)1, curbuf->b_ml.ml_line_count, NULL, false, false, false, true) == FAIL) { goto theend; @@ -1258,7 +1258,7 @@ void ex_diffpatch(exarg_T *eap) emsg(_("E816: Cannot read patch output")); } else { if (curbuf->b_fname != NULL) { - newname = vim_strnsave(curbuf->b_fname, STRLEN(curbuf->b_fname) + 4); + newname = xstrnsave(curbuf->b_fname, STRLEN(curbuf->b_fname) + 4); STRCAT(newname, ".new"); } @@ -1279,7 +1279,7 @@ void ex_diffpatch(exarg_T *eap) if (newname != NULL) { // do a ":file filename.new" on the patched buffer - eap->arg = (char *)newname; + eap->arg = newname; ex_file(eap); // Do filetype detection with the new name. @@ -1982,8 +1982,8 @@ static int diff_cmp(char_u *s1, char_u *s2) return mb_stricmp((const char *)s1, (const char *)s2); } - char_u *p1 = s1; - char_u *p2 = s2; + char *p1 = (char *)s1; + char *p2 = (char *)s2; // Ignore white space changes and possibly ignore case. while (*p1 != NUL && *p2 != NUL) { @@ -1991,11 +1991,11 @@ static int diff_cmp(char_u *s1, char_u *s2) && ascii_iswhite(*p1) && ascii_iswhite(*p2)) || ((diff_flags & DIFF_IWHITEALL) && (ascii_iswhite(*p1) || ascii_iswhite(*p2)))) { - p1 = (char_u *)skipwhite((char *)p1); - p2 = (char_u *)skipwhite((char *)p2); + p1 = skipwhite(p1); + p2 = skipwhite(p2); } else { int l; - if (!diff_equal_char(p1, p2, &l)) { + if (!diff_equal_char((char_u *)p1, (char_u *)p2, &l)) { break; } p1 += l; @@ -2004,8 +2004,8 @@ static int diff_cmp(char_u *s1, char_u *s2) } // Ignore trailing white space. - p1 = (char_u *)skipwhite((char *)p1); - p2 = (char_u *)skipwhite((char *)p2); + p1 = skipwhite(p1); + p2 = skipwhite(p2); if ((*p1 != NUL) || (*p2 != NUL)) { return 1; diff --git a/src/nvim/digraph.c b/src/nvim/digraph.c index 84073b352b..1b536bdde6 100644 --- a/src/nvim/digraph.c +++ b/src/nvim/digraph.c @@ -2069,7 +2069,7 @@ void ex_loadkeymap(exarg_T *eap) #define KMAP_LLEN 200 // max length of "to" and "from" together char_u buf[KMAP_LLEN + 11]; - char_u *save_cpo = p_cpo; + char *save_cpo = p_cpo; if (!getline_equal(eap->getline, eap->cookie, getsourceline)) { emsg(_("E105: Using :loadkeymap not in a sourced file")); @@ -2083,17 +2083,17 @@ void ex_loadkeymap(exarg_T *eap) ga_init(&curbuf->b_kmap_ga, (int)sizeof(kmap_T), 20); // Set 'cpoptions' to "C" to avoid line continuation. - p_cpo = (char_u *)"C"; + p_cpo = "C"; // Get each line of the sourced file, break at the end. for (;;) { - char_u *line = eap->getline(0, eap->cookie, 0, true); + char *line = eap->getline(0, eap->cookie, 0, true); if (line == NULL) { break; } - char_u *p = (char_u *)skipwhite((char *)line); + char_u *p = (char_u *)skipwhite(line); if ((*p != '"') && (*p != NUL)) { kmap_T *kp = GA_APPEND_VIA_PTR(kmap_T, &curbuf->b_kmap_ga); @@ -2122,7 +2122,7 @@ void ex_loadkeymap(exarg_T *eap) vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s %s", ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].from, ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].to); - (void)do_map(0, buf, LANGMAP, false); + (void)do_map(0, buf, MODE_LANGMAP, false); } p_cpo = save_cpo; @@ -2144,22 +2144,22 @@ void keymap_ga_clear(garray_T *kmap_ga) /// Stop using 'keymap'. static void keymap_unload(void) { - char_u buf[KMAP_MAXLEN + 10]; - char_u *save_cpo = p_cpo; + char buf[KMAP_MAXLEN + 10]; + char *save_cpo = p_cpo; if (!(curbuf->b_kmap_state & KEYMAP_LOADED)) { return; } // Set 'cpoptions' to "C" to avoid line continuation. - p_cpo = (char_u *)"C"; + p_cpo = "C"; // clear the ":lmap"s kmap_T *kp = (kmap_T *)curbuf->b_kmap_ga.ga_data; for (int i = 0; i < curbuf->b_kmap_ga.ga_len; i++) { - vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s", kp[i].from); - (void)do_map(1, buf, LANGMAP, false); + vim_snprintf(buf, sizeof(buf), "<buffer> %s", kp[i].from); + (void)do_map(1, (char_u *)buf, MODE_LANGMAP, false); } keymap_ga_clear(&curbuf->b_kmap_ga); diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 5002ef2710..d7e82729a9 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -29,7 +29,7 @@ #include "nvim/highlight_group.h" #include "nvim/indent.h" #include "nvim/indent_c.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/main.h" #include "nvim/mark.h" #include "nvim/mbyte.h" @@ -290,7 +290,7 @@ static void insert_enter(InsertState *s) { s->did_backspace = true; s->old_topfill = -1; - s->replaceState = REPLACE; + s->replaceState = MODE_REPLACE; s->cmdchar_todo = s->cmdchar; // Remember whether editing was restarted after CTRL-O did_restart_edit = restart_edit; @@ -335,7 +335,7 @@ static void insert_enter(InsertState *s) int save_state = State; curwin->w_cursor = save_cursor; - State = INSERT; + State = MODE_INSERT; check_cursor_col(); State = save_state; } @@ -377,14 +377,14 @@ static void insert_enter(InsertState *s) } if (s->cmdchar == 'R') { - State = REPLACE; + State = MODE_REPLACE; } else if (s->cmdchar == 'V' || s->cmdchar == 'v') { - State = VREPLACE; - s->replaceState = VREPLACE; + State = MODE_VREPLACE; + s->replaceState = MODE_VREPLACE; orig_line_count = curbuf->b_ml.ml_line_count; vr_lines_changed = 1; } else { - State = INSERT; + State = MODE_INSERT; } may_trigger_modechanged(); @@ -400,13 +400,13 @@ static void insert_enter(InsertState *s) // 'iminsert' value may not reflect what is actually used. It is updated // when hitting <Esc>. if (curbuf->b_p_iminsert == B_IMODE_LMAP) { - State |= LANGMAP; + State |= MODE_LANGMAP; } setmouse(); clear_showcmd(); // there is no reverse replace mode - revins_on = (State == INSERT && p_ri); + revins_on = (State == MODE_INSERT && p_ri); if (revins_on) { undisplay_dollar(); } @@ -1325,21 +1325,21 @@ normalchar: if (!p_paste) { // Trigger InsertCharPre. - char_u *str = do_insert_char_pre(s->c); - char_u *p; + char *str = (char *)do_insert_char_pre(s->c); + char *p; if (str != NULL) { if (*str != NUL && stop_arrow() != FAIL) { // Insert the new value of v:char literally. for (p = str; *p != NUL; MB_PTR_ADV(p)) { - s->c = utf_ptr2char((char *)p); + s->c = utf_ptr2char(p); if (s->c == CAR || s->c == K_KENTER || s->c == NL) { ins_eol(s->c); } else { ins_char(s->c); } } - AppendToRedobuffLit((char *)str, -1); + AppendToRedobuffLit(str, -1); } xfree(str); s->c = NUL; @@ -1396,7 +1396,7 @@ static void insert_do_complete(InsertState *s) compl_cont_status = 0; } compl_busy = false; - can_si = true; // allow smartindenting + can_si = may_do_si(); // allow smartindenting } static void insert_do_cindent(InsertState *s) @@ -1632,7 +1632,7 @@ void edit_putchar(int c, bool highlight) pc_col = 0; pc_status = PC_STATUS_UNSET; if (curwin->w_p_rl) { - pc_col += curwin->w_grid.Columns - 1 - curwin->w_wcol; + pc_col += curwin->w_grid.cols - 1 - curwin->w_wcol; const int fix_col = grid_fix_col(&curwin->w_grid, pc_col, pc_row); if (fix_col != pc_col) { @@ -1759,7 +1759,7 @@ void display_dollar(colnr_T col) char_u *p = get_cursor_line_ptr(); curwin->w_cursor.col -= utf_head_off(p, p + col); curs_columns(curwin, false); // Recompute w_wrow and w_wcol - if (curwin->w_wcol < curwin->w_grid.Columns) { + if (curwin->w_wcol < curwin->w_grid.cols) { edit_putchar('$', false); dollar_vcol = curwin->w_virtcol; } @@ -1800,7 +1800,7 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang colnr_T orig_col = 0; // init for GCC char_u *new_line, *orig_line = NULL; // init for GCC - // VREPLACE mode needs to know what the line was like before changing + // MODE_VREPLACE state needs to know what the line was like before changing if (State & VREPLACE_FLAG) { orig_line = vim_strsave(get_cursor_line_ptr()); // Deal with NULL below orig_col = curwin->w_cursor.col; @@ -1848,7 +1848,7 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang // Avoid being called recursively. if (State & VREPLACE_FLAG) { - State = INSERT; + State = MODE_INSERT; } shift_line(type == INDENT_DEC, round, 1, call_changed_bytes); State = save_State; @@ -1873,7 +1873,7 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang insstart_less = MAXCOL; } new_cursor_col += curwin->w_cursor.col; - } else if (!(State & INSERT)) { + } else if (!(State & MODE_INSERT)) { new_cursor_col = curwin->w_cursor.col; } else { /* @@ -1933,7 +1933,7 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang /* * May have to adjust the start of the insert. */ - if (State & INSERT) { + if (State & MODE_INSERT) { if (curwin->w_cursor.lnum == Insstart.lnum && Insstart.col != 0) { if ((int)Insstart.col <= insstart_less) { Insstart.col = 0; @@ -1948,13 +1948,11 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang } } - /* - * For REPLACE mode, may have to fix the replace stack, if it's possible. - * If the number of characters before the cursor decreased, need to pop a - * few characters from the replace stack. - * If the number of characters before the cursor increased, need to push a - * few NULs onto the replace stack. - */ + // For MODE_REPLACE state, may have to fix the replace stack, if it's + // possible. If the number of characters before the cursor decreased, need + // to pop a few characters from the replace stack. + // If the number of characters before the cursor increased, need to push a + // few NULs onto the replace stack. if (REPLACE_NORMAL(State) && start_col >= 0) { while (start_col > (int)curwin->w_cursor.col) { replace_join(0); // remove a NUL from the replace stack @@ -1970,11 +1968,9 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang } } - /* - * For VREPLACE mode, we also have to fix the replace stack. In this case - * it is always possible because we backspace over the whole line and then - * put it back again the way we wanted it. - */ + // For MODE_VREPLACE state, we also have to fix the replace stack. In this + // case it is always possible because we backspace over the whole line and + // then put it back again the way we wanted it. if (State & VREPLACE_FLAG) { // Save new line new_line = vim_strsave(get_cursor_line_ptr()); @@ -2009,11 +2005,9 @@ void change_indent(int type, int amount, int round, int replaced, int call_chang } } -/* - * Truncate the space at the end of a line. This is to be used only in an - * insert mode. It handles fixing the replace stack for REPLACE and VREPLACE - * modes. - */ +/// Truncate the space at the end of a line. This is to be used only in an +/// insert mode. It handles fixing the replace stack for MODE_REPLACE and +/// MODE_VREPLACE modes. void truncate_spaces(char_u *line) { int i; @@ -2027,12 +2021,10 @@ void truncate_spaces(char_u *line) line[i + 1] = NUL; } -/* - * Backspace the cursor until the given column. Handles REPLACE and VREPLACE - * modes correctly. May also be used when not in insert mode at all. - * Will attempt not to go before "col" even when there is a composing - * character. - */ +/// Backspace the cursor until the given column. Handles MODE_REPLACE and +/// MODE_VREPLACE modes correctly. May also be used when not in insert mode at +/// all. Will attempt not to go before "col" even when there is a composing +/// character. void backspace_until_column(int col) { while ((int)curwin->w_cursor.col > col) { @@ -2743,7 +2735,7 @@ static bool pum_wanted(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { // "completeopt" must contain "menu" or "menuone" - return vim_strchr(p_cot, 'm') != NULL; + return vim_strchr((char *)p_cot, 'm') != NULL; } /// Check that there are two or more matches to be shown in the popup menu. @@ -2991,11 +2983,11 @@ static void ins_compl_dictionaries(char_u *dict_start, char_u *pat, int flags, i size_t len = STRLEN(pat_esc) + 10; ptr = xmalloc(len); vim_snprintf((char *)ptr, len, "^\\s*\\zs\\V%s", pat_esc); - regmatch.regprog = vim_regcomp(ptr, RE_MAGIC); + regmatch.regprog = vim_regcomp((char *)ptr, RE_MAGIC); xfree(pat_esc); xfree(ptr); } else { - regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp((char *)pat, p_magic ? RE_MAGIC : 0); if (regmatch.regprog == NULL) { goto theend; } @@ -3015,7 +3007,7 @@ static void ins_compl_dictionaries(char_u *dict_start, char_u *pat, int flags, i copy_option_part(&dict, buf, LSIZE, ","); if (!thesaurus && STRCMP(buf, "spell") == 0) { count = -1; - } else if (vim_strchr(buf, '`') != NULL + } else if (vim_strchr((char *)buf, '`') != NULL || expand_wildcards(1, &buf, &count, &files, EW_FILE|EW_SILENT) != OK) { count = 0; @@ -3513,11 +3505,11 @@ static void ins_compl_addleader(int c) return; } if ((cc = utf_char2len(c)) > 1) { - char_u buf[MB_MAXBYTES + 1]; + char buf[MB_MAXBYTES + 1]; utf_char2bytes(c, (char *)buf); buf[cc] = NUL; - ins_char_bytes(buf, (size_t)cc); + ins_char_bytes((char_u *)buf, (size_t)cc); } else { ins_char(c); } @@ -4260,9 +4252,8 @@ static int ins_compl_get_exp(pos_T *ini) // Remember the first match so that the loop stops when we // wrap and come back there a second time. set_match_pos = true; - } else if (vim_strchr((char_u *)"buwU", *e_cpt) != NULL - && (ins_buf = - ins_compl_next_buf(ins_buf, *e_cpt)) != curbuf) { + } else if (vim_strchr("buwU", *e_cpt) != NULL + && (ins_buf = ins_compl_next_buf(ins_buf, *e_cpt)) != curbuf) { // Scan a buffer, but not the current one. if (ins_buf->b_ml.ml_mfp != NULL) { // loaded buffer compl_started = true; @@ -4276,7 +4267,7 @@ static int ins_compl_get_exp(pos_T *ini) continue; } type = CTRL_X_DICTIONARY; - dict = ins_buf->b_fname; + dict = (char_u *)ins_buf->b_fname; dict_f = DICT_EXACT; } msg_hist_off = true; // reset in msg_trunc_attr() @@ -4284,7 +4275,7 @@ static int ins_compl_get_exp(pos_T *ini) ins_buf->b_fname == NULL ? buf_spname(ins_buf) : ins_buf->b_sfname == NULL - ? ins_buf->b_fname + ? (char_u *)ins_buf->b_fname : ins_buf->b_sfname); (void)msg_trunc_attr((char *)IObuff, true, HL_ATTR(HLF_R)); } else if (*e_cpt == NUL) { @@ -5641,7 +5632,7 @@ int get_literal(bool no_simplify) // character for i_CTRL-V_digit. break; } - if (!(State & CMDLINE) && MB_BYTE2LEN_CHECK(nc) == 1) { + if ((State & MODE_CMDLINE) == 0 && MB_BYTE2LEN_CHECK(nc) == 1) { add_to_showcmd(nc); } if (nc == 'x' || nc == 'X') { @@ -5784,21 +5775,19 @@ void insertchar(int c, int flags, int second_indent) const int textwidth = comp_textwidth(force_format); const bool fo_ins_blank = has_format_option(FO_INS_BLANK); - /* - * Try to break the line in two or more pieces when: - * - Always do this if we have been called to do formatting only. - * - Always do this when 'formatoptions' has the 'a' flag and the line - * ends in white space. - * - Otherwise: - * - Don't do this if inserting a blank - * - Don't do this if an existing character is being replaced, unless - * we're in VREPLACE mode. - * - Do this if the cursor is not on the line where insert started - * or - 'formatoptions' doesn't have 'l' or the line was not too long - * before the insert. - * - 'formatoptions' doesn't have 'b' or a blank was inserted at or - * before 'textwidth' - */ + // Try to break the line in two or more pieces when: + // - Always do this if we have been called to do formatting only. + // - Always do this when 'formatoptions' has the 'a' flag and the line + // ends in white space. + // - Otherwise: + // - Don't do this if inserting a blank + // - Don't do this if an existing character is being replaced, unless + // we're in MODE_VREPLACE state. + // - Do this if the cursor is not on the line where insert started + // or - 'formatoptions' doesn't have 'l' or the line was not too long + // before the insert. + // - 'formatoptions' doesn't have 'b' or a blank was inserted at or + // before 'textwidth' if (textwidth > 0 && (force_format || (!ascii_iswhite(c) @@ -5843,7 +5832,7 @@ void insertchar(int c, int flags, int second_indent) * comment leader. First, check what comment leader we can find. */ i = get_leader_len(line = get_cursor_line_ptr(), &p, false, true); - if (i > 0 && vim_strchr(p, COM_MIDDLE) != NULL) { // Just checking + if (i > 0 && vim_strchr((char *)p, COM_MIDDLE) != NULL) { // Just checking // Skip middle-comment string while (*p && p[-1] != ':') { // find end of middle flags p++; @@ -5949,11 +5938,11 @@ void insertchar(int c, int flags, int second_indent) int cc; if ((cc = utf_char2len(c)) > 1) { - char_u buf[MB_MAXBYTES + 1]; + char buf[MB_MAXBYTES + 1]; utf_char2bytes(c, (char *)buf); buf[cc] = NUL; - ins_char_bytes(buf, (size_t)cc); + ins_char_bytes((char_u *)buf, (size_t)cc); AppendCharToRedobuff(c); } else { ins_char(c); @@ -6248,11 +6237,9 @@ static void internal_format(int textwidth, int second_indent, int flags, int for // Going to break the line, remove any "$" now. undisplay_dollar(); - /* - * Offset between cursor position and line break is used by replace - * stack functions. VREPLACE does not use this, and backspaces - * over the text instead. - */ + // Offset between cursor position and line break is used by replace + // stack functions. MODE_VREPLACE does not use this, and backspaces + // over the text instead. if (State & VREPLACE_FLAG) { orig_col = startcol; // Will start backspacing from here } else { @@ -6274,10 +6261,8 @@ static void internal_format(int textwidth, int second_indent, int flags, int for } if (State & VREPLACE_FLAG) { - /* - * In VREPLACE mode, we will backspace over the text to be - * wrapped, so save a copy now to put on the next line. - */ + // In MODE_VREPLACE state, we will backspace over the text to be + // wrapped, so save a copy now to put on the next line. saved_text = vim_strsave(get_cursor_pos_ptr()); curwin->w_cursor.col = orig_col; saved_text[startcol] = NUL; @@ -6349,10 +6334,8 @@ static void internal_format(int textwidth, int second_indent, int flags, int for } if (State & VREPLACE_FLAG) { - /* - * In VREPLACE mode we have backspaced over the text to be - * moved, now we re-insert it into the new line. - */ + // In MODE_VREPLACE state we have backspaced over the text to be + // moved, now we re-insert it into the new line. ins_bytes(saved_text); xfree(saved_text); } else { @@ -6787,13 +6770,8 @@ static void stop_insert(pos_T *end_insert_pos, int esc, int nomove) // <C-S-Right> may have started Visual mode, adjust the position for // deleted characters. - if (VIsual_active && VIsual.lnum == curwin->w_cursor.lnum) { - int len = (int)STRLEN(get_cursor_line_ptr()); - - if (VIsual.col > len) { - VIsual.col = len; - VIsual.coladd = 0; - } + if (VIsual_active) { + check_visual_pos(); } } } @@ -6856,7 +6834,7 @@ char_u *add_char2buf(int c, char_u *s) char_u temp[MB_MAXBYTES + 1]; const int len = utf_char2bytes(c, (char *)temp); for (int i = 0; i < len; i++) { - c = temp[i]; + c = (uint8_t)temp[i]; // Need to escape K_SPECIAL like in the typeahead buffer. if (c == K_SPECIAL) { *s++ = K_SPECIAL; @@ -7021,7 +6999,7 @@ int cursor_up(long n, int upd_topline) // If we entered a fold, move to the beginning, unless in // Insert mode or when 'foldopen' contains "all": it will open // in a moment. - if (n > 0 || !((State & INSERT) || (fdo_flags & FDO_ALL))) { + if (n > 0 || !((State & MODE_INSERT) || (fdo_flags & FDO_ALL))) { (void)hasFolding(lnum, &lnum, NULL); } } @@ -7293,16 +7271,14 @@ static void replace_join(int off) } } -/* - * Pop bytes from the replace stack until a NUL is found, and insert them - * before the cursor. Can only be used in REPLACE or VREPLACE mode. - */ +/// Pop bytes from the replace stack until a NUL is found, and insert them +/// before the cursor. Can only be used in MODE_REPLACE or MODE_VREPLACE state. static void replace_pop_ins(void) { int cc; int oldState = State; - State = NORMAL; // don't want REPLACE here + State = MODE_NORMAL; // don't want MODE_REPLACE here while ((cc = replace_pop()) > 0) { mb_replace_pop_ins(cc); dec_cursor(); @@ -7598,7 +7574,7 @@ bool in_cinkeys(int keytyped, int when, bool line_is_empty) // make up some named keys <o>, <O>, <e>, <0>, <>>, <<>, <*>, // <:> and <!> so that people can re-indent on o, O, e, 0, <, // >, *, : and ! keys if they really really want to. - if (vim_strchr((char_u *)"<>!*oOe0:", look[1]) != NULL + if (vim_strchr("<>!*oOe0:", look[1]) != NULL && keytyped == look[1]) { return true; } @@ -7625,7 +7601,7 @@ bool in_cinkeys(int keytyped, int when, bool line_is_empty) } else { icase = false; } - p = vim_strchr(look, ','); + p = (char_u *)vim_strchr((char *)look, ','); if (p == NULL) { p = look + STRLEN(look); } @@ -7950,14 +7926,14 @@ static void ins_ctrl_g(void) */ static void ins_ctrl_hat(void) { - if (map_to_exists_mode("", LANGMAP, false)) { + if (map_to_exists_mode("", MODE_LANGMAP, false)) { // ":lmap" mappings exists, Toggle use of ":lmap" mappings. - if (State & LANGMAP) { + if (State & MODE_LANGMAP) { curbuf->b_p_iminsert = B_IMODE_NONE; - State &= ~LANGMAP; + State &= ~MODE_LANGMAP; } else { curbuf->b_p_iminsert = B_IMODE_LMAP; - State |= LANGMAP; + State |= MODE_LANGMAP; } } set_iminsert_global(); @@ -8064,7 +8040,7 @@ static bool ins_esc(long *count, int cmdchar, bool nomove) } - State = NORMAL; + State = MODE_NORMAL; may_trigger_modechanged(); // need to position cursor again when on a TAB if (gchar_cursor() == TAB) { @@ -8097,7 +8073,7 @@ static void ins_ctrl_(void) } } p_ri = !p_ri; - revins_on = (State == INSERT && p_ri); + revins_on = (State == MODE_INSERT && p_ri); if (revins_on) { revins_scol = curwin->w_cursor.col; revins_legal++; @@ -8161,13 +8137,13 @@ static bool ins_start_select(int c) static void ins_insert(int replaceState) { set_vim_var_string(VV_INSERTMODE, ((State & REPLACE_FLAG) ? "i" : - replaceState == VREPLACE ? "v" : + replaceState == MODE_VREPLACE ? "v" : "r"), 1); ins_apply_autocmds(EVENT_INSERTCHANGE); if (State & REPLACE_FLAG) { - State = INSERT | (State & LANGMAP); + State = MODE_INSERT | (State & MODE_LANGMAP); } else { - State = replaceState | (State & LANGMAP); + State = replaceState | (State & MODE_LANGMAP); } may_trigger_modechanged(); AppendCharToRedobuff(K_INS); @@ -8405,23 +8381,17 @@ static bool ins_bs(int c, int mode, int *inserted_space_p) dec_cursor(); } - /* - * In REPLACE mode we have to put back the text that was replaced - * by the NL. On the replace stack is first a NUL-terminated - * sequence of characters that were deleted and then the - * characters that NL replaced. - */ + // In MODE_REPLACE mode we have to put back the text that was + // replaced by the NL. On the replace stack is first a + // NUL-terminated sequence of characters that were deleted and then + // the characters that NL replaced. if (State & REPLACE_FLAG) { - /* - * Do the next ins_char() in NORMAL state, to - * prevent ins_char() from replacing characters and - * avoiding showmatch(). - */ + // Do the next ins_char() in MODE_NORMAL state, to + // prevent ins_char() from replacing characters and + // avoiding showmatch(). oldState = State; - State = NORMAL; - /* - * restore characters (blanks) deleted after cursor - */ + State = MODE_NORMAL; + // restore characters (blanks) deleted after cursor while (cc > 0) { save_col = curwin->w_cursor.col; mb_replace_pop_ins(cc); @@ -8721,7 +8691,7 @@ static void ins_left(void) revins_legal++; } revins_chars++; - } else if (vim_strchr(p_ww, '[') != NULL && curwin->w_cursor.lnum > 1) { + } else if (vim_strchr((char *)p_ww, '[') != NULL && curwin->w_cursor.lnum > 1) { // if 'whichwrap' set for cursor in insert mode may go to previous line. // always break undo when moving upwards/downwards, else undo may break start_arrow(&tpos); @@ -8814,7 +8784,7 @@ static void ins_right(void) if (revins_chars) { revins_chars--; } - } else if (vim_strchr(p_ww, ']') != NULL + } else if (vim_strchr((char *)p_ww, ']') != NULL && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) { // if 'whichwrap' set for cursor in insert mode, may move the // cursor to the next line @@ -9008,11 +8978,9 @@ static bool ins_tab(void) curbuf->b_p_vts_array); } - /* - * Insert the first space with ins_char(). It will delete one char in - * replace mode. Insert the rest with ins_str(); it will not delete any - * chars. For VREPLACE mode, we use ins_char() for all characters. - */ + // Insert the first space with ins_char(). It will delete one char in + // replace mode. Insert the rest with ins_str(); it will not delete any + // chars. For MODE_VREPLACE state, we use ins_char() for all characters. ins_char(' '); while (--temp > 0) { if (State & VREPLACE_FLAG) { @@ -9040,10 +9008,8 @@ static bool ins_tab(void) int change_col = -1; int save_list = curwin->w_p_list; - /* - * Get the current line. For VREPLACE mode, don't make real changes - * yet, just work on a copy of the line. - */ + // Get the current line. For MODE_VREPLACE state, don't make real + // changes yet, just work on a copy of the line. if (State & VREPLACE_FLAG) { pos = curwin->w_cursor; cursor = &pos; @@ -9136,11 +9102,9 @@ static bool ins_tab(void) } cursor->col -= i; - /* - * In VREPLACE mode, we haven't changed anything yet. Do it now by - * backspacing over the changed spacing and then inserting the new - * spacing. - */ + // In MODE_VREPLACE state, we haven't changed anything yet. Do it + // now by backspacing over the changed spacing and then inserting + // the new spacing. if (State & VREPLACE_FLAG) { // Backspace from real cursor to change_col backspace_until_column(change_col); @@ -9183,12 +9147,10 @@ static bool ins_eol(int c) replace_push(NUL); } - /* - * In VREPLACE mode, a NL replaces the rest of the line, and starts - * replacing the next line, so we push all of the characters left on the - * line onto the replace stack. This is not done here though, it is done - * in open_line(). - */ + // In MODE_VREPLACE state, a NL replaces the rest of the line, and starts + // replacing the next line, so we push all of the characters left on the + // line onto the replace stack. This is not done here though, it is done + // in open_line(). // Put cursor on NUL if on the last char and coladd is 1 (happens after // CTRL-O). @@ -9376,10 +9338,8 @@ static void ins_try_si(int c) /* * do some very smart indenting when entering '{' or '}' */ - if (((did_si || can_si_back) && c == '{') || (can_si && c == '}')) { - /* - * for '}' set indent equal to indent of line containing matching '{' - */ + if (((did_si || can_si_back) && c == '{') || (can_si && c == '}' && inindent(0))) { + // for '}' set indent equal to indent of line containing matching '{' if (c == '}' && (pos = findmatch(NULL, '{')) != NULL) { old_pos = curwin->w_cursor; /* @@ -9435,7 +9395,7 @@ static void ins_try_si(int c) /* * set indent of '#' always to 0 */ - if (curwin->w_cursor.col > 0 && can_si && c == '#') { + if (curwin->w_cursor.col > 0 && can_si && c == '#' && inindent(0)) { // remember current indent for next line old_indent = get_indent(); (void)set_indent(0, SIN_CHANGED); @@ -9492,7 +9452,7 @@ static char_u *do_insert_char_pre(int c) // character. Only use it when changed, otherwise continue with the // original character to avoid breaking autoindent. if (STRCMP(buf, get_vim_var_str(VV_CHAR)) != 0) { - res = vim_strsave(get_vim_var_str(VV_CHAR)); + res = vim_strsave((char_u *)get_vim_var_str(VV_CHAR)); } } diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 01f913dd70..641dcae55e 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -1327,7 +1327,7 @@ static list_T *heredoc_get(exarg_T *eap, char *cmd) int mi = 0; int ti = 0; - char *theline = (char *)eap->getline(NUL, eap->cookie, 0, false); + char *theline = eap->getline(NUL, eap->cookie, 0, false); if (theline == NULL) { semsg(_("E990: Missing end marker '%s'"), marker); break; @@ -1407,7 +1407,7 @@ static void ex_let_const(exarg_T *eap, const bool is_const) argend--; } expr = skipwhite(argend); - if (*expr != '=' && !((vim_strchr((char_u *)"+-*/%.", *expr) != NULL + if (*expr != '=' && !((vim_strchr("+-*/%.", *expr) != NULL && expr[1] == '=') || STRNCMP(expr, "..=", 3) == 0)) { // ":let" without "=": list variables if (*arg == '[') { @@ -1443,7 +1443,7 @@ static void ex_let_const(exarg_T *eap, const bool is_const) op[0] = '='; op[1] = NUL; if (*expr != '=') { - if (vim_strchr((char_u *)"+-*/%.", *expr) != NULL) { + if (vim_strchr("+-*/%.", *expr) != NULL) { op[0] = *expr; // +=, -=, *=, /=, %= or .= if (expr[0] == '.' && expr[1] == '.') { // ..= expr++; @@ -1809,10 +1809,10 @@ static char *ex_let_one(char *arg, typval_T *const tv, const bool copy, const bo if (len == 0) { semsg(_(e_invarg2), name - 1); } else { - if (op != NULL && vim_strchr((char_u *)"+-*/%", *op) != NULL) { + if (op != NULL && vim_strchr("+-*/%", *op) != NULL) { semsg(_(e_letwrong), op); } else if (endchars != NULL - && vim_strchr((char_u *)endchars, *skipwhite(arg)) == NULL) { + && vim_strchr(endchars, *skipwhite(arg)) == NULL) { emsg(_(e_letunexp)); } else if (!check_secure()) { const char c1 = name[len]; @@ -1855,7 +1855,7 @@ static char *ex_let_one(char *arg, typval_T *const tv, const bool copy, const bo char *const p = (char *)find_option_end((const char **)&arg, &opt_flags); if (p == NULL || (endchars != NULL - && vim_strchr((char_u *)endchars, *skipwhite(p)) == NULL)) { + && vim_strchr(endchars, *skipwhite(p)) == NULL)) { emsg(_(e_letunexp)); } else { int opt_type; @@ -1914,10 +1914,10 @@ static char *ex_let_one(char *arg, typval_T *const tv, const bool copy, const bo return NULL; } arg++; - if (op != NULL && vim_strchr((char_u *)"+-*/%", *op) != NULL) { + if (op != NULL && vim_strchr("+-*/%", *op) != NULL) { semsg(_(e_letwrong), op); } else if (endchars != NULL - && vim_strchr((char_u *)endchars, *skipwhite(arg + 1)) == NULL) { + && vim_strchr(endchars, *skipwhite(arg + 1)) == NULL) { emsg(_(e_letunexp)); } else { char *s; @@ -1949,7 +1949,7 @@ static char *ex_let_one(char *arg, typval_T *const tv, const bool copy, const bo char *const p = get_lval(arg, tv, &lv, false, false, 0, FNE_CHECK_START); if (p != NULL && lv.ll_name != NULL) { - if (endchars != NULL && vim_strchr((char_u *)endchars, *skipwhite(p)) == NULL) { + if (endchars != NULL && vim_strchr(endchars, *skipwhite(p)) == NULL) { emsg(_(e_letunexp)); } else { set_var_lval(&lv, p, tv, copy, is_const, op); @@ -2752,7 +2752,7 @@ void set_context_for_expression(expand_T *xp, char *arg, cmdidx_T cmdidx) break; } else if ((c == '<' || c == '#') && xp->xp_context == EXPAND_FUNCTIONS - && vim_strchr((char_u *)xp->xp_pattern, '(') == NULL) { + && vim_strchr(xp->xp_pattern, '(') == NULL) { // Function name can start with "<SNR>" and contain '#'. break; } else if (cmdidx != CMD_let || got_eq) { @@ -3170,7 +3170,7 @@ char *cat_prefix_varname(int prefix, const char *name) /// Function given to ExpandGeneric() to obtain the list of user defined /// (global/buffer/window/built-in) variable names. -char_u *get_user_var_name(expand_T *xp, int idx) +char *get_user_var_name(expand_T *xp, int idx) { static size_t gdone; static size_t bdone; @@ -3195,9 +3195,9 @@ char_u *get_user_var_name(expand_T *xp, int idx) ++hi; } if (STRNCMP("g:", xp->xp_pattern, 2) == 0) { - return (char_u *)cat_prefix_varname('g', (char *)hi->hi_key); + return cat_prefix_varname('g', (char *)hi->hi_key); } - return hi->hi_key; + return (char *)hi->hi_key; } // b: variables @@ -3211,7 +3211,7 @@ char_u *get_user_var_name(expand_T *xp, int idx) while (HASHITEM_EMPTY(hi)) { ++hi; } - return (char_u *)cat_prefix_varname('b', (char *)hi->hi_key); + return cat_prefix_varname('b', (char *)hi->hi_key); } // w: variables @@ -3225,7 +3225,7 @@ char_u *get_user_var_name(expand_T *xp, int idx) while (HASHITEM_EMPTY(hi)) { ++hi; } - return (char_u *)cat_prefix_varname('w', (char *)hi->hi_key); + return cat_prefix_varname('w', (char *)hi->hi_key); } // t: variables @@ -3239,12 +3239,12 @@ char_u *get_user_var_name(expand_T *xp, int idx) while (HASHITEM_EMPTY(hi)) { ++hi; } - return (char_u *)cat_prefix_varname('t', (char *)hi->hi_key); + return cat_prefix_varname('t', (char *)hi->hi_key); } // v: variables if (vidx < ARRAY_SIZE(vimvars)) { - return (char_u *)cat_prefix_varname('v', vimvars[vidx++].vv_name); + return cat_prefix_varname('v', vimvars[vidx++].vv_name); } XFREE_CLEAR(varnamebuf); @@ -3263,15 +3263,15 @@ int pattern_match(char *pat, char *text, bool ic) regmatch_T regmatch; // avoid 'l' flag in 'cpoptions' - char *save_cpo = (char *)p_cpo; - p_cpo = (char_u *)""; - regmatch.regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING); + char *save_cpo = p_cpo; + p_cpo = ""; + regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); if (regmatch.regprog != NULL) { regmatch.rm_ic = ic; matches = vim_regexec_nl(®match, (char_u *)text, (colnr_T)0); vim_regfree(regmatch.regprog); } - p_cpo = (char_u *)save_cpo; + p_cpo = save_cpo; return matches; } @@ -4057,7 +4057,7 @@ static int eval7(char **arg, typval_T *rettv, int evaluate, int want_string) case '7': case '8': case '9': { - char *p = (char *)skipdigits((char_u *)(*arg) + 1); + char *p = skipdigits(*arg + 1); int get_float = false; // We accept a float when the format matches @@ -4067,7 +4067,7 @@ static int eval7(char **arg, typval_T *rettv, int evaluate, int want_string) // ":let vers = 1.2.3" doesn't fail. if (!want_string && p[0] == '.' && ascii_isdigit(p[1])) { get_float = true; - p = (char *)skipdigits((char_u *)p + 2); + p = skipdigits(p + 2); if (*p == 'e' || *p == 'E') { ++p; if (*p == '-' || *p == '+') { @@ -4076,7 +4076,7 @@ static int eval7(char **arg, typval_T *rettv, int evaluate, int want_string) if (!ascii_isdigit(*p)) { get_float = false; } else { - p = (char *)skipdigits((char_u *)p + 1); + p = skipdigits(p + 1); } } if (ASCII_ISALPHA(*p) || *p == '.') { @@ -5872,7 +5872,7 @@ static int get_env_tv(char **arg, typval_T *rettv, int evaluate) xfree(string); // Next try expanding things like $VIM and ${HOME}. - string = (char *)expand_env_save((char_u *)name - 1); + string = expand_env_save(name - 1); if (string != NULL && *string == '$') { XFREE_CLEAR(string); } @@ -6141,7 +6141,7 @@ void common_function(typval_T *argvars, typval_T *rettv, bool is_funcref, FunPtr use_string = true; } - if ((use_string && vim_strchr((char_u *)s, AUTOLOAD_CHAR) == NULL) || is_funcref) { + if ((use_string && vim_strchr(s, AUTOLOAD_CHAR) == NULL) || is_funcref) { name = s; trans_name = (char *)trans_function_name((char_u **)&name, false, TFN_INT | TFN_QUIET | TFN_NO_AUTOLOAD @@ -6405,7 +6405,7 @@ dict_T *get_win_info(win_T *wp, int16_t tpnr, int16_t winnr) tv_dict_add_nr(dict, S_LEN("winrow"), wp->w_winrow + 1); tv_dict_add_nr(dict, S_LEN("topline"), wp->w_topline); tv_dict_add_nr(dict, S_LEN("botline"), wp->w_botline - 1); - tv_dict_add_nr(dict, S_LEN("winbar"), 0); + tv_dict_add_nr(dict, S_LEN("winbar"), wp->w_winbar_height); tv_dict_add_nr(dict, S_LEN("width"), wp->w_width); tv_dict_add_nr(dict, S_LEN("bufnr"), wp->w_buffer->b_fnum); tv_dict_add_nr(dict, S_LEN("wincol"), wp->w_wincol + 1); @@ -6865,8 +6865,8 @@ void screenchar_adjust_grid(ScreenGrid **grid, int *row, int *col) // have its own buffer, this should just read from it instead. msg_scroll_flush(); if (msg_grid.chars && msg_grid.comp_index > 0 && *row >= msg_grid.comp_row - && *row < (msg_grid.Rows + msg_grid.comp_row) - && *col < msg_grid.Columns) { + && *row < (msg_grid.rows + msg_grid.comp_row) + && *col < msg_grid.cols) { *grid = &msg_grid; *row -= msg_grid.comp_row; } @@ -7958,7 +7958,7 @@ int get_id_len(const char **const arg) // slice "[n:]". Also "xx:" is not a namespace. len = (int)(p - *arg); if (len > 1 - || (len == 1 && vim_strchr((char_u *)namespace_char, **arg) == NULL)) { + || (len == 1 && vim_strchr(namespace_char, **arg) == NULL)) { break; } } @@ -8089,7 +8089,7 @@ const char *find_name_end(const char *arg, const char **expr_start, const char * // slice "[n:]". Also "xx:" is not a namespace. But {ns}: is. len = (int)(p - arg); if ((len > 1 && p[-1] != '}') - || (len == 1 && vim_strchr((char_u *)namespace_char, *arg) == NULL)) { + || (len == 1 && vim_strchr(namespace_char, *arg) == NULL)) { break; } } @@ -8206,9 +8206,10 @@ varnumber_T get_vim_var_nr(int idx) FUNC_ATTR_PURE /// Get string v: variable value. Uses a static buffer, can only be used once. /// If the String variable has never been set, return an empty string. /// Never returns NULL; -char_u *get_vim_var_str(int idx) FUNC_ATTR_PURE FUNC_ATTR_NONNULL_RET +char *get_vim_var_str(int idx) + FUNC_ATTR_PURE FUNC_ATTR_NONNULL_RET { - return (char_u *)tv_get_string(&vimvars[idx].vv_tv); + return (char *)tv_get_string(&vimvars[idx].vv_tv); } /// Get List v: variable value. Caller must take care of reference count when @@ -9278,7 +9279,7 @@ bool var_check_func_name(const char *const name, const bool new_var) FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT { // Allow for w: b: s: and t:. - if (!(vim_strchr((char_u *)"wbst", name[0]) != NULL && name[1] == ':') + if (!(vim_strchr("wbst", name[0]) != NULL && name[1] == ':') && !ASCII_ISUPPER((name[0] != NUL && name[1] == ':') ? name[2] : name[0])) { semsg(_("E704: Funcref variable name must start with a capital: %s"), name); @@ -10109,7 +10110,7 @@ repeat: || (*fnamep)[1] == NUL) #endif && !(tilde_file && (*fnamep)[1] == NUL)) { - *fnamep = (char *)expand_env_save((char_u *)(*fnamep)); + *fnamep = expand_env_save(*fnamep); xfree(*bufp); // free any allocated file name *bufp = *fnamep; if (*fnamep == NULL) { @@ -10145,9 +10146,6 @@ repeat: *fnamep = xstrnsave(*fnamep, STRLEN(*fnamep) + 2); xfree(*bufp); // free any allocated file name *bufp = *fnamep; - if (*fnamep == NULL) { - return -1; - } add_pathsep(*fnamep); } } @@ -10165,7 +10163,7 @@ repeat: // Need full path first (use expand_env() to remove a "~/") if (!has_fullname && !has_homerelative) { if (**fnamep == '~') { - p = pbuf = (char *)expand_env_save((char_u *)(*fnamep)); + p = pbuf = expand_env_save(*fnamep); } else { p = pbuf = FullName_save(*fnamep, false); } @@ -10217,7 +10215,7 @@ repeat: } } - tail = (char *)path_tail((char_u *)(*fnamep)); + tail = path_tail(*fnamep); *fnamelen = STRLEN(*fnamep); // ":h" - head, remove "/file_name", can be repeated @@ -10327,12 +10325,12 @@ repeat: sep = (char_u)(*s++); if (sep) { // find end of pattern - p = (char *)vim_strchr((char_u *)s, sep); + p = vim_strchr(s, sep); if (p != NULL) { char *const pat = xstrnsave(s, p - s); s = p + 1; // find end of substitution - p = (char *)vim_strchr((char_u *)s, sep); + p = vim_strchr(s, sep); if (p != NULL) { char *const sub = xstrnsave(s, p - s); char *const str = xstrnsave(*fnamep, *fnamelen); @@ -10391,15 +10389,15 @@ char *do_string_sub(char *str, char *pat, char *sub, typval_T *expr, char *flags char *zero_width = NULL; // Make 'cpoptions' empty, so that the 'l' flag doesn't work here - save_cpo = (char *)p_cpo; - p_cpo = empty_option; + save_cpo = p_cpo; + p_cpo = (char *)empty_option; ga_init(&ga, 1, 200); do_all = (flags[0] == 'g'); regmatch.rm_ic = p_ic; - regmatch.regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING); + regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); if (regmatch.regprog != NULL) { tail = str; end = str + STRLEN(str); @@ -10451,8 +10449,8 @@ char *do_string_sub(char *str, char *pat, char *sub, typval_T *expr, char *flags char *ret = xstrdup(ga.ga_data == NULL ? str : ga.ga_data); ga_clear(&ga); - if (p_cpo == empty_option) { - p_cpo = (char_u *)save_cpo; + if ((char_u *)p_cpo == empty_option) { + p_cpo = save_cpo; } else { // Darn, evaluating {sub} expression or {expr} changed the value. free_string_option((char_u *)save_cpo); diff --git a/src/nvim/eval/executor.c b/src/nvim/eval/executor.c index c08b7b1b2d..3e66150180 100644 --- a/src/nvim/eval/executor.c +++ b/src/nvim/eval/executor.c @@ -63,7 +63,7 @@ int eexe_mod_op(typval_T *const tv1, const typval_T *const tv2, const char *cons if (tv2->v_type == VAR_LIST) { break; } - if (vim_strchr((char_u *)"+-*/%", *op) != NULL) { + if (vim_strchr("+-*/%", *op) != NULL) { // nr += nr or nr -= nr, nr *= nr, nr /= nr, nr %= nr varnumber_T n = tv_get_number(tv1); if (tv2->v_type == VAR_FLOAT) { diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index e2f456e399..62fe2033af 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -80,9 +80,6 @@ typedef enum { kSomeMatchStrPos, ///< Data for matchstrpos(). } SomeMatchType; -KHASH_MAP_INIT_STR(functions, VimLFuncDef) - - #ifdef INCLUDE_GENERATED_DECLARATIONS # include "eval/funcs.c.generated.h" @@ -116,7 +113,7 @@ static va_list dummy_ap; /// Function given to ExpandGeneric() to obtain the list of internal /// or user defined function names. -char_u *get_function_name(expand_T *xp, int idx) +char *get_function_name(expand_T *xp, int idx) { static int intidx = -1; char_u *name; @@ -125,23 +122,20 @@ char_u *get_function_name(expand_T *xp, int idx) intidx = -1; } if (intidx < 0) { - name = get_user_func_name(xp, idx); + name = (char_u *)get_user_func_name(xp, idx); if (name != NULL) { if (*name != NUL && *name != '<' && STRNCMP("g:", xp->xp_pattern, 2) == 0) { - return (char_u *)cat_prefix_varname('g', (char *)name); + return cat_prefix_varname('g', (char *)name); } - return name; + return (char *)name; } } - while ((size_t)++intidx < ARRAY_SIZE(functions) - && functions[intidx].name[0] == '\0') {} - if ((size_t)intidx >= ARRAY_SIZE(functions)) { + const char *const key = functions[++intidx].name; + if (!key) { return NULL; } - - const char *const key = functions[intidx].name; const size_t key_len = strlen(key); memcpy(IObuff, key, key_len); IObuff[key_len] = '('; @@ -151,12 +145,12 @@ char_u *get_function_name(expand_T *xp, int idx) } else { IObuff[key_len + 1] = NUL; } - return IObuff; + return (char *)IObuff; } /// Function given to ExpandGeneric() to obtain the list of internal or /// user defined variable or function names. -char_u *get_expr_name(expand_T *xp, int idx) +char *get_expr_name(expand_T *xp, int idx) { static int intidx = -1; char_u *name; @@ -165,9 +159,9 @@ char_u *get_expr_name(expand_T *xp, int idx) intidx = -1; } if (intidx < 0) { - name = get_function_name(xp, idx); + name = (char_u *)get_function_name(xp, idx); if (name != NULL) { - return name; + return (char *)name; } } return get_user_var_name(xp, ++intidx); @@ -178,18 +172,19 @@ char_u *get_expr_name(expand_T *xp, int idx) /// @param[in] name Name of the function. /// /// @return pointer to the function definition or NULL if not found. -const VimLFuncDef *find_internal_func(const char *const name) +const EvalFuncDef *find_internal_func(const char *const name) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE FUNC_ATTR_NONNULL_ALL { size_t len = strlen(name); - return find_internal_func_gperf(name, len); + int index = find_internal_func_hash(name, len); + return index >= 0 ? &functions[index] : NULL; } int call_internal_func(const char_u *const fname, const int argcount, typval_T *const argvars, typval_T *const rettv) FUNC_ATTR_NONNULL_ALL { - const VimLFuncDef *const fdef = find_internal_func((const char *)fname); + const EvalFuncDef *const fdef = find_internal_func((const char *)fname); if (fdef == NULL) { return ERROR_UNKNOWN; } else if (argcount < fdef->min_argc) { @@ -207,7 +202,7 @@ int call_internal_method(const char_u *const fname, const int argcount, typval_T typval_T *const rettv, typval_T *const basetv) FUNC_ATTR_NONNULL_ALL { - const VimLFuncDef *const fdef = find_internal_func((const char *)fname); + const EvalFuncDef *const fdef = find_internal_func((const char *)fname); if (fdef == NULL) { return ERROR_UNKNOWN; } else if (fdef->base_arg == BASE_NONE) { @@ -490,9 +485,7 @@ static buf_T *find_buffer(typval_T *avar) * buffer, these don't use the full path. */ FOR_ALL_BUFFERS(bp) { if (bp->b_fname != NULL - && (path_with_url((char *)bp->b_fname) - || bt_nofile(bp) - ) + && (path_with_url(bp->b_fname) || bt_nofile(bp)) && STRCMP(bp->b_fname, avar->vval.v_string) == 0) { buf = bp; break; @@ -562,7 +555,7 @@ static void f_bufname(typval_T *argvars, typval_T *rettv, FunPtr fptr) buf = tv_get_buf_from_arg(&argvars[0]); } if (buf != NULL && buf->b_fname != NULL) { - rettv->vval.v_string = xstrdup((char *)buf->b_fname); + rettv->vval.v_string = xstrdup(buf->b_fname); } } @@ -643,7 +636,7 @@ buf_T *tv_get_buf(typval_T *tv, int curtab_only) { char_u *name = (char_u *)tv->vval.v_string; int save_magic; - char_u *save_cpo; + char *save_cpo; buf_T *buf; if (tv->v_type == VAR_NUMBER) { @@ -663,7 +656,7 @@ buf_T *tv_get_buf(typval_T *tv, int curtab_only) save_magic = p_magic; p_magic = TRUE; save_cpo = p_cpo; - p_cpo = (char_u *)""; + p_cpo = ""; buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name), true, false, curtab_only)); @@ -1064,7 +1057,7 @@ static void f_col(typval_T *argvars, typval_T *rettv, FunPtr fptr) /// "complete()" function static void f_complete(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - if ((State & INSERT) == 0) { + if ((State & MODE_INSERT) == 0) { emsg(_("E785: complete() can only be used in Insert mode")); return; } @@ -1931,7 +1924,7 @@ typedef struct { const listitem_T *li; } GetListLineCookie; -static char_u *get_list_line(int c, void *cookie, int indent, bool do_concat) +static char *get_list_line(int c, void *cookie, int indent, bool do_concat) { GetListLineCookie *const p = (GetListLineCookie *)cookie; @@ -1942,7 +1935,7 @@ static char_u *get_list_line(int c, void *cookie, int indent, bool do_concat) char buf[NUMBUFLEN]; const char *const s = tv_get_string_buf_chk(TV_LIST_ITEM_TV(item), buf); p->li = TV_LIST_ITEM_NEXT(p->l, item); - return (char_u *)(s == NULL ? NULL : xstrdup(s)); + return s == NULL ? NULL : xstrdup(s); } static void execute_common(typval_T *argvars, typval_T *rettv, FunPtr fptr, int arg_off) @@ -2071,7 +2064,7 @@ static void f_exists(typval_T *argvars, typval_T *rettv, FunPtr fptr) n = true; } else { // Try expanding things like $VIM and ${HOME}. - char_u *const exp = expand_env_save((char_u *)p); + char *const exp = expand_env_save((char *)p); if (exp != NULL && *exp != '$') { n = true; } @@ -2562,7 +2555,7 @@ static void f_foldtext(typval_T *argvars, typval_T *rettv, FunPtr fptr) foldstart = (linenr_T)get_vim_var_nr(VV_FOLDSTART); foldend = (linenr_T)get_vim_var_nr(VV_FOLDEND); - dashes = get_vim_var_str(VV_FOLDDASHES); + dashes = (char_u *)get_vim_var_str(VV_FOLDDASHES); if (foldstart > 0 && foldend <= curbuf->b_ml.ml_line_count) { // Find first non-empty line in the fold. for (lnum = foldstart; lnum < foldend; lnum++) { @@ -3082,7 +3075,7 @@ static void f_getcharstr(typval_T *argvars, typval_T *rettv, FunPtr fptr) getchar_common(argvars, rettv); if (rettv->v_type == VAR_NUMBER) { - char_u temp[7]; // mbyte-char: 6, NUL: 1 + char temp[7]; // mbyte-char: 6, NUL: 1 const varnumber_T n = rettv->vval.v_number; int i = 0; @@ -3092,7 +3085,7 @@ static void f_getcharstr(typval_T *argvars, typval_T *rettv, FunPtr fptr) assert(i < 7); temp[i++] = NUL; rettv->v_type = VAR_STRING; - rettv->vval.v_string = (char *)vim_strsave(temp); + rettv->vval.v_string = xstrdup(temp); } } @@ -3395,7 +3388,7 @@ static void f_getcwd(typval_T *argvars, typval_T *rettv, FunPtr fptr) FALLTHROUGH; case kCdScopeGlobal: if (globaldir) { // `globaldir` is not always set. - from = globaldir; + from = (char_u *)globaldir; break; } FALLTHROUGH; // In global directory, just need to get OS CWD. @@ -3618,8 +3611,8 @@ static void f_getmousepos(typval_T *argvars, typval_T *rettv, FunPtr fptr) // necessary for a top border since `row` starts at -1 in that case. if (row < height + wp->w_border_adj[2]) { winid = wp->handle; - winrow = row + 1 + wp->w_border_adj[0]; // Adjust by 1 for top border - wincol = col + 1 + wp->w_border_adj[3]; // Adjust by 1 for left border + winrow = row + 1 + wp->w_winrow_off; // Adjust by 1 for top border + wincol = col + 1 + wp->w_wincol_off; // Adjust by 1 for left border if (row >= 0 && row < wp->w_height && col >= 0 && col < wp->w_width) { (void)mouse_comp_pos(wp, &row, &col, &lnum); col = vcol2col(wp, lnum, col); @@ -3677,7 +3670,7 @@ static int getreg_get_regname(typval_T *argvars) } } else { // Default to v:register - strregname = get_vim_var_str(VV_REG); + strregname = (char_u *)get_vim_var_str(VV_REG); } return *strregname == 0 ? '"' : *strregname; @@ -4152,8 +4145,7 @@ static void f_glob2regpat(typval_T *argvars, typval_T *rettv, FunPtr fptr) const char *const pat = tv_get_string_chk(&argvars[0]); // NULL on type error rettv->v_type = VAR_STRING; - rettv->vval.v_string = - (char *)((pat == NULL) ? NULL : file_pat_to_reg_pat((char_u *)pat, NULL, NULL, false)); + rettv->vval.v_string = (pat == NULL) ? NULL : file_pat_to_reg_pat(pat, NULL, NULL, false); } /// "has()" function @@ -5101,7 +5093,7 @@ static dict_T *create_environment(const dictitem_T *job_env, const bool clear_en } // Set $NVIM (in the child process) to v:servername. #3118 - char *nvim_addr = (char *)get_vim_var_str(VV_SEND_SERVER); + char *nvim_addr = get_vim_var_str(VV_SEND_SERVER); if (nvim_addr[0] != '\0') { dictitem_T *dv = tv_dict_find(env, S_LEN("NVIM")); if (dv) { @@ -5646,7 +5638,7 @@ static void f_list2str(typval_T *argvars, typval_T *rettv, FunPtr fptr) } ga_init(&ga, 1, 80); - char_u buf[MB_MAXBYTES + 1]; + char buf[MB_MAXBYTES + 1]; TV_LIST_ITER_CONST(l, li, { buf[utf_char2bytes(tv_get_number(TV_LIST_ITEM_TV(li)), (char *)buf)] = NUL; @@ -5666,7 +5658,7 @@ static void f_localtime(typval_T *argvars, typval_T *rettv, FunPtr fptr) static void get_maparg(typval_T *argvars, typval_T *rettv, int exact) { - char_u *keys_buf = NULL; + char *keys_buf = NULL; char_u *alt_keys_buf = NULL; bool did_simplify = false; char_u *rhs; @@ -5682,7 +5674,7 @@ static void get_maparg(typval_T *argvars, typval_T *rettv, int exact) rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; - char_u *keys = (char_u *)tv_get_string(&argvars[0]); + char *keys = (char *)tv_get_string(&argvars[0]); if (*keys == NUL) { return; } @@ -5707,14 +5699,14 @@ static void get_maparg(typval_T *argvars, typval_T *rettv, int exact) mode = get_map_mode((char **)&which, 0); char_u *keys_simplified - = (char_u *)replace_termcodes((char *)keys, - STRLEN(keys), (char **)&keys_buf, flags, &did_simplify, + = (char_u *)replace_termcodes(keys, + STRLEN(keys), &keys_buf, flags, &did_simplify, CPO_TO_CPO_FLAGS); rhs = check_map(keys_simplified, mode, exact, false, abbr, &mp, &buffer_local, &rhs_lua); if (did_simplify) { // When the lhs is being simplified the not-simplified keys are // preferred for printing, like in do_map(). - (void)replace_termcodes((char *)keys, + (void)replace_termcodes(keys, STRLEN(keys), (char **)&alt_keys_buf, flags | REPTERM_NO_SIMPLIFY, NULL, CPO_TO_CPO_FLAGS); @@ -5785,7 +5777,7 @@ static void find_some_match(typval_T *const argvars, typval_T *const rettv, long len = 0; char_u *expr = NULL; regmatch_T regmatch; - char_u *save_cpo; + char *save_cpo; long start = 0; long nth = 1; colnr_T startcol = 0; @@ -5797,7 +5789,7 @@ static void find_some_match(typval_T *const argvars, typval_T *const rettv, // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; - p_cpo = (char_u *)""; + p_cpo = ""; rettv->vval.v_number = -1; switch (type) { @@ -5878,7 +5870,7 @@ static void find_some_match(typval_T *const argvars, typval_T *const rettv, } } - regmatch.regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING); + regmatch.regprog = vim_regcomp((char *)pat, RE_MAGIC + RE_STRING); if (regmatch.regprog != NULL) { regmatch.rm_ic = p_ic; @@ -6100,7 +6092,7 @@ static void f_mkdir(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } - if (*path_tail((char_u *)dir) == NUL) { + if (*path_tail(dir) == NUL) { // Remove trailing slashes. *path_tail_with_sep((char_u *)dir) = NUL; } @@ -7402,11 +7394,11 @@ static void f_resolve(typval_T *argvars, typval_T *rettv, FunPtr fptr) q[-1] = NUL; } - q = (char *)path_tail((char_u *)p); + q = path_tail(p); if (q > p && *q == NUL) { // Ignore trailing path separator. q[-1] = NUL; - q = (char *)path_tail((char_u *)p); + q = path_tail(p); } if (q > p && !path_is_absolute((const char_u *)buf)) { // Symlink is relative to directory of argument. Replace the @@ -7414,7 +7406,7 @@ static void f_resolve(typval_T *argvars, typval_T *rettv, FunPtr fptr) const size_t p_len = strlen(p); const size_t buf_len = strlen(buf); p = xrealloc(p, p_len + buf_len + 1); - memcpy(path_tail((char_u *)p), buf, buf_len + 1); + memcpy(path_tail(p), buf, buf_len + 1); } else { xfree(p); p = xstrdup(buf); @@ -7524,15 +7516,15 @@ static void f_reduce(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } - const char_u *func_name; + const char *func_name; partial_T *partial = NULL; if (argvars[1].v_type == VAR_FUNC) { - func_name = (char_u *)argvars[1].vval.v_string; + func_name = argvars[1].vval.v_string; } else if (argvars[1].v_type == VAR_PARTIAL) { partial = argvars[1].vval.v_partial; - func_name = (char_u *)partial_name(partial); + func_name = partial_name(partial); } else { - func_name = (const char_u *)tv_get_string(&argvars[1]); + func_name = tv_get_string(&argvars[1]); } if (*func_name == NUL) { return; // type error or empty name @@ -7881,7 +7873,7 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv, FunPtr fptr) } sctx_T save_current_sctx; - uint8_t *save_sourcing_name, *save_autocmd_fname, *save_autocmd_match; + char *save_sourcing_name, *save_autocmd_fname, *save_autocmd_match; linenr_T save_sourcing_lnum; int save_autocmd_bufnr; funccal_entry_T funccal_entry; @@ -8055,8 +8047,8 @@ static void f_screenattr(typval_T *argvars, typval_T *rettv, FunPtr fptr) int row = (int)tv_get_number_chk(&argvars[0], NULL) - 1; int col = (int)tv_get_number_chk(&argvars[1], NULL) - 1; - if (row < 0 || row >= default_grid.Rows - || col < 0 || col >= default_grid.Columns) { + if (row < 0 || row >= default_grid.rows + || col < 0 || col >= default_grid.cols) { c = -1; } else { ScreenGrid *grid = &default_grid; @@ -8073,8 +8065,8 @@ static void f_screenchar(typval_T *argvars, typval_T *rettv, FunPtr fptr) int row = tv_get_number_chk(&argvars[0], NULL) - 1; int col = tv_get_number_chk(&argvars[1], NULL) - 1; - if (row < 0 || row >= default_grid.Rows - || col < 0 || col >= default_grid.Columns) { + if (row < 0 || row >= default_grid.rows + || col < 0 || col >= default_grid.cols) { c = -1; } else { ScreenGrid *grid = &default_grid; @@ -8089,8 +8081,8 @@ static void f_screenchars(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int row = tv_get_number_chk(&argvars[0], NULL) - 1; int col = tv_get_number_chk(&argvars[1], NULL) - 1; - if (row < 0 || row >= default_grid.Rows - || col < 0 || col >= default_grid.Columns) { + if (row < 0 || row >= default_grid.rows + || col < 0 || col >= default_grid.cols) { tv_list_alloc_ret(rettv, 0); return; } @@ -8156,8 +8148,8 @@ static void f_screenstring(typval_T *argvars, typval_T *rettv, FunPtr fptr) rettv->v_type = VAR_STRING; int row = tv_get_number_chk(&argvars[0], NULL) - 1; int col = tv_get_number_chk(&argvars[1], NULL) - 1; - if (row < 0 || row >= default_grid.Rows - || col < 0 || col >= default_grid.Columns) { + if (row < 0 || row >= default_grid.rows + || col < 0 || col >= default_grid.cols) { return; } ScreenGrid *grid = &default_grid; @@ -8311,7 +8303,7 @@ long do_searchpair(const char *spat, const char *mpat, const char *epat, int dir long time_limit) FUNC_ATTR_NONNULL_ARG(1, 2, 3) { - char_u *save_cpo; + char *save_cpo; char_u *pat, *pat2 = NULL, *pat3 = NULL; long retval = 0; pos_T pos; @@ -8327,7 +8319,7 @@ long do_searchpair(const char *spat, const char *mpat, const char *epat, int dir // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; - p_cpo = empty_option; + p_cpo = (char *)empty_option; // Set the time limit, if there is one. tm = profile_setlimit(time_limit); @@ -8451,11 +8443,11 @@ long do_searchpair(const char *spat, const char *mpat, const char *epat, int dir xfree(pat2); xfree(pat3); - if (p_cpo == empty_option) { + if ((char_u *)p_cpo == empty_option) { p_cpo = save_cpo; } else { // Darn, evaluating the {skip} expression changed the value. - free_string_option(save_cpo); + free_string_option((char_u *)save_cpo); } return retval; @@ -9716,26 +9708,24 @@ static void f_spellsuggest(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } - if (*curwin->w_s->b_p_spl != NUL) { - const char *const str = tv_get_string(&argvars[0]); - if (argvars[1].v_type != VAR_UNKNOWN) { - maxcount = tv_get_number_chk(&argvars[1], &typeerr); - if (maxcount <= 0) { + const char *const str = tv_get_string(&argvars[0]); + if (argvars[1].v_type != VAR_UNKNOWN) { + maxcount = tv_get_number_chk(&argvars[1], &typeerr); + if (maxcount <= 0) { + goto f_spellsuggest_return; + } + if (argvars[2].v_type != VAR_UNKNOWN) { + need_capital = tv_get_number_chk(&argvars[2], &typeerr); + if (typeerr) { goto f_spellsuggest_return; } - if (argvars[2].v_type != VAR_UNKNOWN) { - need_capital = tv_get_number_chk(&argvars[2], &typeerr); - if (typeerr) { - goto f_spellsuggest_return; - } - } - } else { - maxcount = 25; } - - spell_suggest_list(&ga, (char_u *)str, maxcount, need_capital, false); + } else { + maxcount = 25; } + spell_suggest_list(&ga, (char_u *)str, maxcount, need_capital, false); + f_spellsuggest_return: tv_list_alloc_ret(rettv, (ptrdiff_t)ga.ga_len); for (int i = 0; i < ga.ga_len; i++) { @@ -9748,7 +9738,7 @@ f_spellsuggest_return: static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - char_u *save_cpo; + char *save_cpo; int match; colnr_T col = 0; bool keepempty = false; @@ -9756,7 +9746,7 @@ static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr) // Make 'cpoptions' empty, the 'l' flag should not be used here. save_cpo = p_cpo; - p_cpo = (char_u *)""; + p_cpo = ""; const char *str = tv_get_string(&argvars[0]); const char *pat = NULL; @@ -9781,7 +9771,7 @@ static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr) } regmatch_T regmatch = { - .regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING), + .regprog = vim_regcomp((char *)pat, RE_MAGIC + RE_STRING), .startp = { NULL }, .endp = { NULL }, .rm_ic = false, @@ -9842,6 +9832,10 @@ static void f_stdpath(typval_T *argvars, typval_T *rettv, FunPtr fptr) rettv->vval.v_string = get_xdg_home(kXDGDataHome); } else if (strequal(p, "cache")) { rettv->vval.v_string = get_xdg_home(kXDGCacheHome); + } else if (strequal(p, "state")) { + rettv->vval.v_string = get_xdg_home(kXDGStateHome); + } else if (strequal(p, "log")) { + rettv->vval.v_string = get_xdg_home(kXDGStateHome); } else if (strequal(p, "config_dirs")) { get_xdg_var_list(kXDGConfigDirs, rettv); } else if (strequal(p, "data_dirs")) { @@ -9854,13 +9848,13 @@ static void f_stdpath(typval_T *argvars, typval_T *rettv, FunPtr fptr) /// "str2float()" function static void f_str2float(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - char_u *p = (char_u *)skipwhite(tv_get_string(&argvars[0])); + char *p = skipwhite(tv_get_string(&argvars[0])); bool isneg = (*p == '-'); if (*p == '+' || *p == '-') { - p = (char_u *)skipwhite((char *)p + 1); + p = skipwhite(p + 1); } - (void)string2float((char *)p, &rettv->vval.v_float); + (void)string2float(p, &rettv->vval.v_float); if (isneg) { rettv->vval.v_float *= -1; } @@ -10796,10 +10790,16 @@ static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr) // "/home/foo/…" => "~/…" size_t len = home_replace(NULL, NameBuff, IObuff, sizeof(IObuff), true); // Trim slash. - if (IObuff[len - 1] == '\\' || IObuff[len - 1] == '/') { + if (len != 1 && (IObuff[len - 1] == '\\' || IObuff[len - 1] == '/')) { IObuff[len - 1] = '\0'; } + if (len == 1 && IObuff[0] == '/') { + // Avoid ambiguity in the URI when CWD is root directory. + IObuff[1] = '.'; + IObuff[2] = '\0'; + } + // Terminal URI: "term://$CWD//$PID:$CMD" snprintf((char *)NameBuff, sizeof(NameBuff), "term://%s//%d:%s", (char *)IObuff, pid, cmd); @@ -11211,7 +11211,7 @@ static void f_visualmode(typval_T *argvars, typval_T *rettv, FunPtr fptr) /// "wildmenumode()" function static void f_wildmenumode(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - if (wild_menu_showing || ((State & CMDLINE) && pum_visible())) { + if (wild_menu_showing || ((State & MODE_CMDLINE) && pum_visible())) { rettv->vval.v_number = 1; } } diff --git a/src/nvim/eval/funcs.h b/src/nvim/eval/funcs.h index c6a0cb959e..4ab4c8f800 100644 --- a/src/nvim/eval/funcs.h +++ b/src/nvim/eval/funcs.h @@ -9,19 +9,19 @@ typedef void (*FunPtr)(void); /// Prototype of C function that implements VimL function typedef void (*VimLFunc)(typval_T *args, typval_T *rvar, FunPtr data); -/// Special flags for base_arg @see VimLFuncDef +/// Special flags for base_arg @see EvalFuncDef #define BASE_NONE 0 ///< Not a method (no base argument). #define BASE_LAST UINT8_MAX ///< Use the last argument as the method base. /// Structure holding VimL function definition -typedef struct fst { +typedef struct { char *name; ///< Name of the function. uint8_t min_argc; ///< Minimal number of arguments. uint8_t max_argc; ///< Maximal number of arguments. uint8_t base_arg; ///< Method base arg # (1-indexed), BASE_NONE or BASE_LAST. VimLFunc func; ///< Function implementation. FunPtr data; ///< Userdata for function implementation. -} VimLFuncDef; +} EvalFuncDef; #ifdef INCLUDE_GENERATED_DECLARATIONS # include "eval/funcs.h.generated.h" diff --git a/src/nvim/eval/typval_encode.c.h b/src/nvim/eval/typval_encode.c.h index bd23fb4154..8c952473a1 100644 --- a/src/nvim/eval/typval_encode.c.h +++ b/src/nvim/eval/typval_encode.c.h @@ -250,6 +250,8 @@ #include "nvim/func_attr.h" #include "nvim/lib/kvec.h" +// -V::1063 + /// Dummy variable used because some macros need lvalue /// /// Must not be written to, if needed one must check that address of the diff --git a/src/nvim/eval/typval_encode.h b/src/nvim/eval/typval_encode.h index d5cf431870..ed70ba87ec 100644 --- a/src/nvim/eval/typval_encode.h +++ b/src/nvim/eval/typval_encode.h @@ -85,9 +85,7 @@ static inline size_t tv_strlen(const typval_T *const tv) static inline size_t tv_strlen(const typval_T *const tv) { assert(tv->v_type == VAR_STRING); - return (tv->vval.v_string == NULL - ? 0 - : strlen((char *)tv->vval.v_string)); + return (tv->vval.v_string == NULL ? 0 : strlen(tv->vval.v_string)); } /// Code for checking whether container references itself diff --git a/src/nvim/eval/userfunc.c b/src/nvim/eval/userfunc.c index d6a63993c6..e5f48501f7 100644 --- a/src/nvim/eval/userfunc.c +++ b/src/nvim/eval/userfunc.c @@ -994,7 +994,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett // Don't redraw while executing the function. RedrawingDisabled++; - save_sourcing_name = sourcing_name; + save_sourcing_name = (char_u *)sourcing_name; save_sourcing_lnum = sourcing_lnum; sourcing_lnum = 1; @@ -1014,7 +1014,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett { if (save_sourcing_name != NULL && STRNCMP(save_sourcing_name, "function ", 9) == 0) { - vim_snprintf((char *)sourcing_name, + vim_snprintf(sourcing_name, len, "%s[%" PRId64 "]..", save_sourcing_name, @@ -1022,7 +1022,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett } else { STRCPY(sourcing_name, "function "); } - cat_func_name(sourcing_name + STRLEN(sourcing_name), fp); + cat_func_name((char_u *)sourcing_name + STRLEN(sourcing_name), fp); if (p_verbose >= 12) { ++no_wait_return; @@ -1175,7 +1175,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett } xfree(sourcing_name); - sourcing_name = save_sourcing_name; + sourcing_name = (char *)save_sourcing_name; sourcing_lnum = save_sourcing_lnum; current_sctx = save_current_sctx; if (do_profiling_yes) { @@ -1536,7 +1536,7 @@ int call_func(const char *funcname, int len, typval_T *rettv, int argcount_in, t // Trigger FuncUndefined event, may load the function. if (fp == NULL - && apply_autocmds(EVENT_FUNCUNDEFINED, rfname, rfname, true, NULL) + && apply_autocmds(EVENT_FUNCUNDEFINED, (char *)rfname, (char *)rfname, true, NULL) && !aborting()) { // executed an autocommand, search for the function again fp = find_func(rfname); @@ -1967,7 +1967,7 @@ void ex_function(exarg_T *eap) c = *p; *p = NUL; - regmatch.regprog = vim_regcomp((char_u *)eap->arg + 1, RE_MAGIC); + regmatch.regprog = vim_regcomp(eap->arg + 1, RE_MAGIC); *p = c; if (regmatch.regprog != NULL) { regmatch.rm_ic = p_ic; @@ -2009,7 +2009,7 @@ void ex_function(exarg_T *eap) // g:func global function name, same as "func" p = (char_u *)eap->arg; name = trans_function_name(&p, eap->skip, TFN_NO_AUTOLOAD, &fudi, NULL); - paren = (vim_strchr(p, '(') != NULL); + paren = (vim_strchr((char *)p, '(') != NULL); if (name == NULL && (fudi.fd_dict == NULL || !paren) && !eap->skip) { /* * Return on an invalid expression in braces, unless the expression @@ -2090,8 +2090,8 @@ void ex_function(exarg_T *eap) goto ret_free; } // attempt to continue by skipping some text - if (vim_strchr(p, '(') != NULL) { - p = vim_strchr(p, '('); + if (vim_strchr((char *)p, '(') != NULL) { + p = (char_u *)vim_strchr((char *)p, '('); } } p = (char_u *)skipwhite((char *)p + 1); @@ -2207,7 +2207,7 @@ void ex_function(exarg_T *eap) if (line_arg != NULL) { // Use eap->arg, split up in parts by line breaks. theline = line_arg; - p = vim_strchr(theline, '\n'); + p = (char_u *)vim_strchr((char *)theline, '\n'); if (p == NULL) { line_arg += STRLEN(line_arg); } else { @@ -2219,7 +2219,7 @@ void ex_function(exarg_T *eap) if (eap->getline == NULL) { theline = getcmdline(':', 0L, indent, do_concat); } else { - theline = eap->getline(':', eap->cookie, indent, do_concat); + theline = (char_u *)eap->getline(':', eap->cookie, indent, do_concat); } line_to_free = theline; } @@ -2369,7 +2369,7 @@ void ex_function(exarg_T *eap) // and ":let [a, b] =<< [trim] EOF" arg = (char_u *)skipwhite((char *)skiptowhite(p)); if (*arg == '[') { - arg = vim_strchr(arg, ']'); + arg = (char_u *)vim_strchr((char *)arg, ']'); } if (arg != NULL) { arg = (char_u *)skipwhite((char *)skiptowhite(arg)); @@ -2490,7 +2490,7 @@ void ex_function(exarg_T *eap) } if (fp == NULL) { - if (fudi.fd_dict == NULL && vim_strchr(name, AUTOLOAD_CHAR) != NULL) { + if (fudi.fd_dict == NULL && vim_strchr((char *)name, AUTOLOAD_CHAR) != NULL) { int slen, plen; char_u *scriptname; @@ -2498,7 +2498,7 @@ void ex_function(exarg_T *eap) int j = FAIL; if (sourcing_name != NULL) { scriptname = (char_u *)autoload_name((const char *)name, STRLEN(name)); - p = vim_strchr(scriptname, '/'); + p = (char_u *)vim_strchr((char *)scriptname, '/'); plen = (int)STRLEN(p); slen = (int)STRLEN(sourcing_name); if (slen > plen && FNAMECMP(p, @@ -2644,7 +2644,7 @@ bool function_exists(const char *const name, bool no_deref) /// Function given to ExpandGeneric() to obtain the list of user defined /// function names. -char_u *get_user_func_name(expand_T *xp, int idx) +char *get_user_func_name(expand_T *xp, int idx) { static size_t done; static hashitem_T *hi; @@ -2666,11 +2666,11 @@ char_u *get_user_func_name(expand_T *xp, int idx) if ((fp->uf_flags & FC_DICT) || STRNCMP(fp->uf_name, "<lambda>", 8) == 0) { - return (char_u *)""; // don't show dict and lambda functions + return ""; // don't show dict and lambda functions } if (STRLEN(fp->uf_name) + 4 >= IOSIZE) { - return fp->uf_name; // Prevent overflow. + return (char *)fp->uf_name; // Prevent overflow. } cat_func_name(IObuff, fp); @@ -2680,7 +2680,7 @@ char_u *get_user_func_name(expand_T *xp, int idx) STRCAT(IObuff, ")"); } } - return IObuff; + return (char *)IObuff; } return NULL; } @@ -3137,7 +3137,7 @@ char_u *get_return_cmd(void *rettv) /// Called by do_cmdline() to get the next line. /// /// @return allocated string, or NULL for end of function. -char_u *get_func_line(int c, void *cookie, int indent, bool do_concat) +char *get_func_line(int c, void *cookie, int indent, bool do_concat) { funccall_T *fcp = (funccall_T *)cookie; ufunc_T *fp = fcp->func; @@ -3184,7 +3184,7 @@ char_u *get_func_line(int c, void *cookie, int indent, bool do_concat) fcp->dbg_tick = debug_tick; } - return retval; + return (char *)retval; } /// @return TRUE if the currently active function should be ended, because a diff --git a/src/nvim/event/loop.c b/src/nvim/event/loop.c index 89fced59c5..d4e20e2f66 100644 --- a/src/nvim/event/loop.c +++ b/src/nvim/event/loop.c @@ -143,7 +143,7 @@ bool loop_close(Loop *loop, bool wait) while (true) { // Run the loop to tickle close-callbacks (which should then free memory). // Use UV_RUN_NOWAIT to avoid a hang. #11820 - uv_run(&loop->uv, didstop ? UV_RUN_DEFAULT : UV_RUN_NOWAIT); + uv_run(&loop->uv, didstop ? UV_RUN_DEFAULT : UV_RUN_NOWAIT); // -V547 if ((uv_loop_close(&loop->uv) != UV_EBUSY) || !wait) { break; } diff --git a/src/nvim/event/socket.c b/src/nvim/event/socket.c index 060b432b18..1722f0ee1f 100644 --- a/src/nvim/event/socket.c +++ b/src/nvim/event/socket.c @@ -124,7 +124,7 @@ int socket_watcher_start(SocketWatcher *watcher, int backlog, socket_cb cb) if (result == UV_EACCES) { // Libuv converts ENOENT to EACCES for Windows compatibility, but if // the parent directory does not exist, ENOENT would be more accurate. - *path_tail((char_u *)watcher->addr) = NUL; + *path_tail(watcher->addr) = NUL; if (!os_path_exists((char_u *)watcher->addr)) { result = UV_ENOENT; } diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 3be8deead1..8369db7de1 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -350,7 +350,7 @@ static int linelen(int *has_tab) len = linetabsize((char_u *)line); // Check for embedded TAB. if (has_tab != NULL) { - *has_tab = vim_strchr((char_u *)first, TAB) != NULL; + *has_tab = vim_strchr(first, TAB) != NULL; } *last = save; @@ -529,9 +529,9 @@ void ex_sort(exarg_T *eap) emsg(_(e_noprevre)); goto sortend; } - regmatch.regprog = vim_regcomp(last_search_pat(), RE_MAGIC); + regmatch.regprog = vim_regcomp((char *)last_search_pat(), RE_MAGIC); } else { - regmatch.regprog = vim_regcomp((char_u *)p + 1, RE_MAGIC); + regmatch.regprog = vim_regcomp(p + 1, RE_MAGIC); } if (regmatch.regprog == NULL) { goto sortend; @@ -1341,7 +1341,7 @@ static void do_filter(linenr_T line1, linenr_T line2, exarg_T *eap, char *cmd, b * Vi also doesn't do this and the messages are not very informative. */ no_wait_return++; // don't call wait_return() while busy - if (itmp != NULL && buf_write(curbuf, (char_u *)itmp, NULL, line1, line2, eap, + if (itmp != NULL && buf_write(curbuf, itmp, NULL, line1, line2, eap, false, false, false, true) == FAIL) { msg_putchar('\n'); // Keep message from buf_write(). no_wait_return--; @@ -1386,7 +1386,7 @@ static void do_filter(linenr_T line1, linenr_T line2, exarg_T *eap, char *cmd, b if (do_out) { if (otmp != NULL) { - if (readfile((char_u *)otmp, NULL, line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, + if (readfile(otmp, NULL, line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, READ_FILTER, false) != OK) { if (!aborting()) { msg_putchar('\n'); @@ -1718,7 +1718,7 @@ int rename_buffer(char *new_fname) */ fname = (char *)curbuf->b_ffname; sfname = (char *)curbuf->b_sfname; - xfname = (char *)curbuf->b_fname; + xfname = curbuf->b_fname; curbuf->b_ffname = NULL; curbuf->b_sfname = NULL; if (setfname(curbuf, (char_u *)new_fname, NULL, true) == FAIL) { @@ -1858,7 +1858,7 @@ int do_write(exarg_T *eap) if (!other) { ffname = (char *)curbuf->b_ffname; - fname = (char *)curbuf->b_fname; + fname = curbuf->b_fname; // Not writing the whole file is only allowed with '!'. if ((eap->line1 != 1 || eap->line2 != curbuf->b_ml.ml_line_count) @@ -1894,9 +1894,9 @@ int do_write(exarg_T *eap) // under the new name. Must be done before buf_write(), because // if there is no file name and 'cpo' contains 'F', it will set // the file name. - fname = (char *)alt_buf->b_fname; + fname = alt_buf->b_fname; alt_buf->b_fname = curbuf->b_fname; - curbuf->b_fname = (char_u *)fname; + curbuf->b_fname = fname; fname = (char *)alt_buf->b_ffname; alt_buf->b_ffname = curbuf->b_ffname; curbuf->b_ffname = (char_u *)fname; @@ -1930,7 +1930,7 @@ int do_write(exarg_T *eap) } name_was_missing = curbuf->b_ffname == NULL; - retval = buf_write(curbuf, (char_u *)ffname, (char_u *)fname, eap->line1, eap->line2, + retval = buf_write(curbuf, ffname, fname, eap->line1, eap->line2, eap, eap->append, eap->forceit, true, false); // After ":saveas fname" reset 'readonly'. @@ -2096,8 +2096,7 @@ void do_wqall(exarg_T *eap) semsg(_("E141: No file name for buffer %" PRId64), (int64_t)buf->b_fnum); error++; } else if (check_readonly(&eap->forceit, buf) - || check_overwrite(eap, buf, (char *)buf->b_fname, (char *)buf->b_ffname, - false) == FAIL) { + || check_overwrite(eap, buf, buf->b_fname, (char *)buf->b_ffname, false) == FAIL) { error++; } else { bufref_T bufref; @@ -2148,12 +2147,12 @@ static int check_readonly(int *forceit, buf_T *buf) if (buf->b_p_ro) { dialog_msg((char *)buff, _("'readonly' option is set for \"%s\".\nDo you wish to write anyway?"), - (char *)buf->b_fname); + buf->b_fname); } else { dialog_msg((char *)buff, _("File permissions of \"%s\" are read-only.\nIt may still be possible to " "write it.\nDo you wish to try?"), - (char *)buf->b_fname); + buf->b_fname); } if (vim_dialog_yesno(VIM_QUESTION, NULL, (char_u *)buff, 2) == VIM_YES) { @@ -2340,7 +2339,7 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum } else { if (*ffname == NUL) { // re-edit with same file name ffname = (char *)curbuf->b_ffname; - sfname = (char *)curbuf->b_fname; + sfname = curbuf->b_fname; } free_fname = fix_fname(ffname); // may expand to full path name if (free_fname != NULL) { @@ -2491,7 +2490,7 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum // - If we ended up in the new buffer already, need to skip a few // things, set auto_buf. if (buf->b_fname != NULL) { - new_name = (char *)vim_strsave(buf->b_fname); + new_name = xstrdup(buf->b_fname); } const bufref_T save_au_new_curbuf = au_new_curbuf; set_bufref(&au_new_curbuf, buf); @@ -2641,7 +2640,7 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum } buf = curbuf; if (buf->b_fname != NULL) { - new_name = (char *)vim_strsave(buf->b_fname); + new_name = (char *)vim_strsave((char_u *)buf->b_fname); } else { new_name = NULL; } @@ -2875,7 +2874,7 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum redraw_curbuf_later(NOT_VALID); // redraw this buffer later } - if (p_im && (State & INSERT) == 0) { + if (p_im && (State & MODE_INSERT) == 0) { need_start_insertmode = true; } @@ -2939,9 +2938,9 @@ void ex_append(exarg_T *eap) lnum = 0; } - State = INSERT; // behave like in Insert mode + State = MODE_INSERT; // behave like in Insert mode if (curbuf->b_p_iminsert == B_IMODE_LMAP) { - State |= LANGMAP; + State |= MODE_LANGMAP; } for (;;) { @@ -2961,7 +2960,7 @@ void ex_append(exarg_T *eap) if (eap->nextcmd == NULL || *eap->nextcmd == NUL) { break; } - p = (char *)vim_strchr((char_u *)eap->nextcmd, NL); + p = vim_strchr(eap->nextcmd, NL); if (p == NULL) { p = eap->nextcmd + STRLEN(eap->nextcmd); } @@ -2971,12 +2970,11 @@ void ex_append(exarg_T *eap) } eap->nextcmd = p; } else { - // Set State to avoid the cursor shape to be set to INSERT mode - // when getline() returns. int save_State = State; - State = CMDLINE; - theline = (char *)eap->getline(eap->cstack->cs_looplevel > 0 ? -1 : - NUL, eap->cookie, indent, true); + // Set State to avoid the cursor shape to be set to MODE_INSERT + // state when getline() returns. + State = MODE_CMDLINE; + theline = eap->getline(eap->cstack->cs_looplevel > 0 ? -1 : NUL, eap->cookie, indent, true); State = save_State; } lines_left = Rows - 1; @@ -3024,7 +3022,7 @@ void ex_append(exarg_T *eap) empty = 0; } } - State = NORMAL; + State = MODE_NORMAL; if (eap->forceit) { curbuf->b_p_ai = !curbuf->b_p_ai; @@ -3477,7 +3475,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle int start_nsubs; int save_ma = 0; int save_b_changed = curbuf->b_changed; - bool preview = (State & CMDPREVIEW); + bool preview = (State & MODE_CMDPREVIEW); bool did_save = false; @@ -3494,7 +3492,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle } // new pattern and substitution if (eap->cmd[0] == 's' && *cmd != NUL && !ascii_iswhite(*cmd) - && vim_strchr((char_u *)"0123456789cegriIp|\"", *cmd) == NULL) { + && vim_strchr("0123456789cegriIp|\"", *cmd) == NULL) { // don't accept alphanumeric for separator if (check_regexp_delim(*cmd) == FAIL) { return NULL; @@ -3504,8 +3502,8 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle // "\/sub/" and "\?sub?" use last used search pattern (almost like // //sub/r). "\&sub&" use last substitute pattern (like //sub/). if (*cmd == '\\') { - ++cmd; - if (vim_strchr((char_u *)"/?&", *cmd) == NULL) { + cmd++; + if (vim_strchr("/?&", *cmd) == NULL) { emsg(_(e_backslash)); return NULL; } @@ -3823,10 +3821,10 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle if (subflags.do_ask && !preview) { int typed = 0; - // change State to CONFIRM, so that the mouse works + // change State to MODE_CONFIRM, so that the mouse works // properly int save_State = State; - State = CONFIRM; + State = MODE_CONFIRM; setmouse(); // disable mouse in xterm curwin->w_cursor.col = regmatch.startpos[0].col; @@ -3837,7 +3835,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle // When 'cpoptions' contains "u" don't sync undo when // asking for confirmation. if (vim_strchr(p_cpo, CPO_UNDO) != NULL) { - ++no_u_sync; + no_u_sync++; } /* @@ -3993,7 +3991,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle State = save_State; setmouse(); if (vim_strchr(p_cpo, CPO_UNDO) != NULL) { - --no_u_sync; + no_u_sync--; } if (typed == 'n') { @@ -4579,8 +4577,8 @@ void ex_global(exarg_T *eap) * "\&": use previous substitute pattern. */ if (*cmd == '\\') { - ++cmd; - if (vim_strchr((char_u *)"/?&", *cmd) == NULL) { + cmd++; + if (vim_strchr("/?&", *cmd) == NULL) { emsg(_(e_backslash)); return; } @@ -5114,7 +5112,7 @@ int find_help_tags(const char *arg, int *num_matches, char ***matches, bool keep // And also "\_$" and "\_^". if (arg[0] == '\\' && ((arg[1] != NUL && arg[2] == NUL) - || (vim_strchr((char_u *)"%_z@", arg[1]) != NULL + || (vim_strchr("%_z@", arg[1]) != NULL && arg[2] != NUL))) { vim_snprintf(d, IOSIZE, "/\\\\%s", arg + 1); // Check for "/\\_$", should be "/\\_\$" @@ -5173,10 +5171,9 @@ int find_help_tags(const char *arg, int *num_matches, char ***matches, bool keep * ":help i_^_CTRL-D" work. * Insert '-' before and after "CTRL-X" when applicable. */ - if (*s < ' ' || (*s == '^' && s[1] && (ASCII_ISALPHA(s[1]) - || vim_strchr((char_u *) - "?@[\\]^", - s[1]) != NULL))) { + if (*s < ' ' + || (*s == '^' && s[1] + && (ASCII_ISALPHA(s[1]) || vim_strchr("?@[\\]^", s[1]) != NULL))) { if ((char_u *)d > IObuff && d[-1] != '_' && d[-1] != '\\') { *d++ = '_'; // prepend a '_' to make x_CTRL-x } @@ -5360,7 +5357,7 @@ void fix_help_buffer(void) * In the "help.txt" and "help.abx" file, add the locally added help * files. This uses the very first line in the help file. */ - char *const fname = (char *)path_tail(curbuf->b_fname); + char *const fname = path_tail(curbuf->b_fname); if (FNAMECMP(fname, "help.txt") == 0 || (FNAMENCMP(fname, "help.", 5) == 0 && ASCII_ISALPHA(fname[5]) @@ -5413,8 +5410,8 @@ void fix_help_buffer(void) } const char *const f1 = fnames[i1]; const char *const f2 = fnames[i2]; - const char *const t1 = (char *)path_tail((char_u *)f1); - const char *const t2 = (char *)path_tail((char_u *)f2); + const char *const t1 = path_tail(f1); + const char *const t2 = path_tail(f2); const char *const e1 = (char *)STRRCHR(t1, '.'); const char *const e2 = (char *)STRRCHR(t2, '.'); if (e1 == NULL || e2 == NULL) { @@ -5448,7 +5445,7 @@ void fix_help_buffer(void) } vim_fgets(IObuff, IOSIZE, fd); if (IObuff[0] == '*' - && (s = (char *)vim_strchr(IObuff + 1, '*')) + && (s = vim_strchr((char *)IObuff + 1, '*')) != NULL) { TriState this_utf = kNone; // Change tag definition to a @@ -5635,7 +5632,7 @@ static void helptags_one(char *dir, const char *ext, const char *tagfname, bool } firstline = false; } - p1 = (char *)vim_strchr(IObuff, '*'); // find first '*' + p1 = vim_strchr((char *)IObuff, '*'); // find first '*' while (p1 != NULL) { p2 = strchr((const char *)p1 + 1, '*'); // Find second '*'. if (p2 != NULL && p2 > p1 + 1) { // Skip "*" and "**". @@ -5650,7 +5647,7 @@ static void helptags_one(char *dir, const char *ext, const char *tagfname, bool // followed by a white character or end-of-line. if (s == p2 && ((char_u *)p1 == IObuff || p1[-1] == ' ' || p1[-1] == '\t') - && (vim_strchr((char_u *)" \t\n\r", s[1]) != NULL + && (vim_strchr(" \t\n\r", s[1]) != NULL || s[1] == '\0')) { *p2 = '\0'; p1++; @@ -5660,7 +5657,7 @@ static void helptags_one(char *dir, const char *ext, const char *tagfname, bool snprintf(s, s_len, "%s\t%s", p1, fname); // find next '*' - p2 = (char *)vim_strchr((char_u *)p2 + 1, '*'); + p2 = vim_strchr(p2 + 1, '*'); } } p1 = p2; @@ -6050,7 +6047,7 @@ void close_preview_windows(void) /// from undo history. void ex_substitute(exarg_T *eap) { - bool preview = (State & CMDPREVIEW); + bool preview = (State & MODE_CMDPREVIEW); if (*p_icm == NUL || !preview) { // 'inccommand' is disabled close_preview_windows(); (void)do_sub(eap, profile_zero(), true, preview_bufnr); @@ -6203,7 +6200,7 @@ void ex_oldfiles(exarg_T *eap) if (p == NULL) { return; } - char *const s = (char *)expand_env_save((char_u *)p); + char *const s = expand_env_save((char *)p); eap->arg = s; eap->cmdidx = CMD_edit; cmdmod.browse = false; diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index d1dcb28dbd..a6cafb2628 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -200,12 +200,12 @@ static char *pexpand_cmds[] = { /// Function given to ExpandGeneric() to obtain the profile command /// specific expansion. -char_u *get_profile_name(expand_T *xp, int idx) +char *get_profile_name(expand_T *xp, int idx) FUNC_ATTR_PURE { switch (pexpand_what) { case PEXP_SUBCMD: - return (char_u *)pexpand_cmds[idx]; + return pexpand_cmds[idx]; // case PEXP_FUNC: TODO default: return NULL; @@ -554,7 +554,7 @@ void dialog_changed(buf_T *buf, bool checkall) .forceit = false, }; - dialog_msg((char *)buff, _("Save changes to \"%s\"?"), (char *)buf->b_fname); + dialog_msg((char *)buff, _("Save changes to \"%s\"?"), buf->b_fname); if (checkall) { ret = vim_dialog_yesnoallcancel(VIM_QUESTION, NULL, (char_u *)buff, 1); } else { @@ -563,11 +563,7 @@ void dialog_changed(buf_T *buf, bool checkall) if (ret == VIM_YES) { if (buf->b_fname != NULL - && check_overwrite(&ea, - buf, - (char *)buf->b_fname, - (char *)buf->b_ffname, - false) == OK) { + && check_overwrite(&ea, buf, buf->b_fname, (char *)buf->b_ffname, false) == OK) { // didn't hit Cancel (void)buf_write_all(buf, false); } @@ -583,7 +579,7 @@ void dialog_changed(buf_T *buf, bool checkall) set_bufref(&bufref, buf2); if (buf2->b_fname != NULL - && check_overwrite(&ea, buf2, (char *)buf2->b_fname, + && check_overwrite(&ea, buf2, buf2->b_fname, (char *)buf2->b_ffname, false) == OK) { // didn't hit Cancel (void)buf_write_all(buf2, false); @@ -611,7 +607,7 @@ bool dialog_close_terminal(buf_T *buf) char buff[DIALOG_MSG_SIZE]; dialog_msg(buff, _("Close \"%s\"?"), - (buf->b_fname != NULL) ? (char *)buf->b_fname : "?"); + (buf->b_fname != NULL) ? buf->b_fname : "?"); int ret = vim_dialog_yesnocancel(VIM_QUESTION, NULL, (char_u *)buff, 1); @@ -738,7 +734,7 @@ bool check_changed_any(bool hidden, bool unload) if ((buf->terminal && channel_job_running((uint64_t)buf->b_p_channel)) ? semsg(_("E947: Job still running in buffer \"%s\""), buf->b_fname) : semsg(_("E162: No write since last change for buffer \"%s\""), - buf_spname(buf) != NULL ? buf_spname(buf) : buf->b_fname)) { + buf_spname(buf) != NULL ? buf_spname(buf) : (char_u *)buf->b_fname)) { save = no_wait_return; no_wait_return = false; wait_return(false); @@ -792,7 +788,7 @@ int buf_write_all(buf_T *buf, int forceit) int retval; buf_T *old_curbuf = curbuf; - retval = (buf_write(buf, buf->b_ffname, buf->b_fname, + retval = (buf_write(buf, (char *)buf->b_ffname, buf->b_fname, (linenr_T)1, buf->b_ml.ml_line_count, NULL, false, forceit, true, false)); if (curbuf != old_curbuf) { @@ -908,7 +904,7 @@ static int do_arglist(char *str, int what, int after, bool will_edit) if (curbuf->b_ffname == NULL) { return FAIL; } - str = (char *)curbuf->b_fname; + str = curbuf->b_fname; arg_escaped = false; } @@ -924,11 +920,11 @@ static int do_arglist(char *str, int what, int after, bool will_edit) regmatch.rm_ic = p_fic; // ignore case when 'fileignorecase' is set for (int i = 0; i < new_ga.ga_len && !got_int; i++) { p = ((char **)new_ga.ga_data)[i]; - p = (char *)file_pat_to_reg_pat((char_u *)p, NULL, NULL, false); + p = file_pat_to_reg_pat(p, NULL, NULL, false); if (p == NULL) { break; } - regmatch.regprog = vim_regcomp((char_u *)p, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp(p, p_magic ? RE_MAGIC : 0); if (regmatch.regprog == NULL) { xfree(p); break; @@ -1518,12 +1514,11 @@ void ex_listdo(exarg_T *eap) // buffer was opened while Syntax autocommands were disabled, // need to trigger them now. if (buf == curbuf) { - apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn, - curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_SYNTAX, (char *)curbuf->b_p_syn, curbuf->b_fname, true, + curbuf); } else { aucmd_prepbuf(&aco, buf); - apply_autocmds(EVENT_SYNTAX, buf->b_p_syn, - buf->b_fname, true, buf); + apply_autocmds(EVENT_SYNTAX, (char *)buf->b_p_syn, buf->b_fname, true, buf); aucmd_restbuf(&aco); } @@ -1571,12 +1566,12 @@ static void alist_add_list(int count, char **files, int after, bool will_edit) // Function given to ExpandGeneric() to obtain the possible arguments of the // argedit and argdelete commands. -char_u *get_arglist_name(expand_T *xp FUNC_ATTR_UNUSED, int idx) +char *get_arglist_name(expand_T *xp FUNC_ATTR_UNUSED, int idx) { if (idx >= ARGCOUNT) { return NULL; } - return alist_name(&ARGLIST[idx]); + return (char *)alist_name(&ARGLIST[idx]); } /// ":compiler[!] {name}" @@ -1766,7 +1761,7 @@ typedef struct { /// /// @return pointer to allocated line, or NULL for end-of-file or /// some error. -static char_u *get_str_line(int c, void *cookie, int indent, bool do_concat) +static char *get_str_line(int c, void *cookie, int indent, bool do_concat) { GetStrLineCookie *p = cookie; if (STRLEN(p->buf) <= p->offset) { @@ -1818,16 +1813,16 @@ scriptitem_T *new_script_item(char *const name, scid_T *const sid_out) static int source_using_linegetter(void *cookie, LineGetter fgetline, const char *traceback_name) { - char *save_sourcing_name = (char *)sourcing_name; + char *save_sourcing_name = sourcing_name; linenr_T save_sourcing_lnum = sourcing_lnum; char sourcing_name_buf[256]; if (save_sourcing_name == NULL) { - sourcing_name = (char_u *)traceback_name; + sourcing_name = (char *)traceback_name; } else { snprintf((char *)sourcing_name_buf, sizeof(sourcing_name_buf), "%s called at %s:%" PRIdLINENR, traceback_name, save_sourcing_name, save_sourcing_lnum); - sourcing_name = (char_u *)sourcing_name_buf; // -V507 reassigned below, before return. + sourcing_name = sourcing_name_buf; // -V507 reassigned below, before return. } sourcing_lnum = 0; @@ -1842,7 +1837,7 @@ static int source_using_linegetter(void *cookie, LineGetter fgetline, const char int retval = do_cmdline(NULL, fgetline, cookie, DOCMD_VERBOSE | DOCMD_NOWAIT | DOCMD_REPEAT); sourcing_lnum = save_sourcing_lnum; - sourcing_name = (char_u *)save_sourcing_name; + sourcing_name = save_sourcing_name; current_sctx = save_current_sctx; restore_funccal(); return retval; @@ -1920,7 +1915,7 @@ int do_source(char *fname, int check_other, int is_vimrc) proftime_T wait_start; bool trigger_source_post = false; - p = (char *)expand_env_save((char_u *)fname); + p = expand_env_save(fname); if (p == NULL) { return retval; } @@ -1935,25 +1930,25 @@ int do_source(char *fname, int check_other, int is_vimrc) } // Apply SourceCmd autocommands, they should get the file and source it. - if (has_autocmd(EVENT_SOURCECMD, (char_u *)fname_exp, NULL) - && apply_autocmds(EVENT_SOURCECMD, (char_u *)fname_exp, (char_u *)fname_exp, + if (has_autocmd(EVENT_SOURCECMD, fname_exp, NULL) + && apply_autocmds(EVENT_SOURCECMD, fname_exp, fname_exp, false, curbuf)) { retval = aborting() ? FAIL : OK; if (retval == OK) { // Apply SourcePost autocommands. - apply_autocmds(EVENT_SOURCEPOST, (char_u *)fname_exp, (char_u *)fname_exp, false, curbuf); + apply_autocmds(EVENT_SOURCEPOST, fname_exp, fname_exp, false, curbuf); } goto theend; } // Apply SourcePre autocommands, they may get the file. - apply_autocmds(EVENT_SOURCEPRE, (char_u *)fname_exp, (char_u *)fname_exp, false, curbuf); + apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, false, curbuf); cookie.fp = fopen_noinh_readbin(fname_exp); if (cookie.fp == NULL && check_other) { // Try again, replacing file name ".vimrc" by "_vimrc" or vice versa, // and ".exrc" by "_exrc" or vice versa. - p = (char *)path_tail((char_u *)fname_exp); + p = path_tail(fname_exp); if ((*p == '.' || *p == '_') && (STRICMP(p + 1, "nvimrc") == 0 || STRICMP(p + 1, "exrc") == 0)) { *p = (*p == '_') ? '.' : '_'; @@ -2014,8 +2009,8 @@ int do_source(char *fname, int check_other, int is_vimrc) cookie.level = ex_nesting_level; // Keep the sourcing name/lnum, for recursive calls. - save_sourcing_name = (char *)sourcing_name; - sourcing_name = (char_u *)fname_exp; + save_sourcing_name = sourcing_name; + sourcing_name = fname_exp; save_sourcing_lnum = sourcing_lnum; sourcing_lnum = 0; @@ -2059,7 +2054,7 @@ int do_source(char *fname, int check_other, int is_vimrc) cookie.conv.vc_type = CONV_NONE; // no conversion // Read the first line so we can check for a UTF-8 BOM. - firstline = getsourceline(0, (void *)&cookie, 0, true); + firstline = (uint8_t *)getsourceline(0, (void *)&cookie, 0, true); if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef && firstline[1] == 0xbb && firstline[2] == 0xbf) { // Found BOM; setup conversion, skip over BOM and recode the line. @@ -2104,7 +2099,7 @@ int do_source(char *fname, int check_other, int is_vimrc) if (got_int) { emsg(_(e_interr)); } - sourcing_name = (char_u *)save_sourcing_name; + sourcing_name = save_sourcing_name; sourcing_lnum = save_sourcing_lnum; if (p_verbose > 1) { verbose_enter(); @@ -2143,7 +2138,7 @@ int do_source(char *fname, int check_other, int is_vimrc) convert_setup(&cookie.conv, NULL, NULL); if (trigger_source_post) { - apply_autocmds(EVENT_SOURCEPOST, (char_u *)fname_exp, (char_u *)fname_exp, false, curbuf); + apply_autocmds(EVENT_SOURCEPOST, fname_exp, fname_exp, false, curbuf); } theend: @@ -2302,7 +2297,7 @@ linenr_T get_sourced_lnum(LineGetter fgetline, void *cookie) /// /// @return pointer to the line in allocated memory, or NULL for end-of-file or /// some error. -char_u *getsourceline(int c, void *cookie, int indent, bool do_concat) +char *getsourceline(int c, void *cookie, int indent, bool do_concat) { struct source_cookie *sp = (struct source_cookie *)cookie; char *line; @@ -2382,7 +2377,7 @@ char_u *getsourceline(int c, void *cookie, int indent, bool do_concat) sp->dbg_tick = debug_tick; } - return (char_u *)line; + return line; } static char *get_one_sourceline(struct source_cookie *sp) @@ -2942,36 +2937,36 @@ void free_locales(void) /// Function given to ExpandGeneric() to obtain the possible arguments of the /// ":language" command. -char_u *get_lang_arg(expand_T *xp, int idx) +char *get_lang_arg(expand_T *xp, int idx) { if (idx == 0) { - return (char_u *)"messages"; + return "messages"; } if (idx == 1) { - return (char_u *)"ctype"; + return "ctype"; } if (idx == 2) { - return (char_u *)"time"; + return "time"; } if (idx == 3) { - return (char_u *)"collate"; + return "collate"; } init_locales(); if (locales == NULL) { return NULL; } - return (char_u *)locales[idx - 4]; + return locales[idx - 4]; } /// Function given to ExpandGeneric() to obtain the available locales. -char_u *get_locales(expand_T *xp, int idx) +char *get_locales(expand_T *xp, int idx) { init_locales(); if (locales == NULL) { return NULL; } - return (char_u *)locales[idx]; + return locales[idx]; } #endif diff --git a/src/nvim/ex_cmds_defs.h b/src/nvim/ex_cmds_defs.h index e4c85fbc9b..d8dd3da9e6 100644 --- a/src/nvim/ex_cmds_defs.h +++ b/src/nvim/ex_cmds_defs.h @@ -121,7 +121,7 @@ struct aucmd_executable_t { #define AUCMD_EXECUTABLE_INIT { .type = CALLABLE_NONE } -typedef char_u *(*LineGetter)(int, void *, int, bool); +typedef char *(*LineGetter)(int, void *, int, bool); /// Structure for command definition. typedef struct cmdname { @@ -175,6 +175,9 @@ enum { /// Arguments used for Ex commands. struct exarg { char *arg; ///< argument of the command + char **args; ///< starting position of command arguments + size_t *arglens; ///< length of command arguments + size_t argc; ///< number of command arguments char *nextcmd; ///< next command (NULL if none) char *cmd; ///< the name of the command (except for :make) char **cmdlinep; ///< pointer to pointer of allocated cmdline diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 316006befd..7506c353dd 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -41,7 +41,7 @@ #include "nvim/highlight_group.h" #include "nvim/if_cscope.h" #include "nvim/input.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/lua/executor.h" #include "nvim/main.h" #include "nvim/mark.h" @@ -111,7 +111,7 @@ struct loop_cookie { int current_line; // last read line from growarray int repeating; // TRUE when looping a second time // When "repeating" is FALSE use "getline" and "cookie" to get lines - char_u *(*getline)(int, void *, int, bool); + char *(*getline)(int, void *, int, bool); void *cookie; }; @@ -187,7 +187,7 @@ void do_exmode(void) varnumber_T changedtick; exmode_active = true; - State = NORMAL; + State = MODE_NORMAL; may_trigger_modechanged(); // When using ":global /pat/ visual" and then "Q" we return to continue @@ -324,7 +324,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) struct msglist *private_msg_list; // "fgetline" and "cookie" passed to do_one_cmd() - char_u *(*cmd_getline)(int, void *, int, bool); + char *(*cmd_getline)(int, void *, int, bool); void *cmd_cookie; struct loop_cookie cmd_loop_cookie; void *real_cookie; @@ -345,7 +345,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) // here. The value of 200 allows nested function calls, ":source", etc. // Allow 200 or 'maxfuncdepth', whatever is larger. if (call_depth >= 200 && call_depth >= p_mfd) { - emsg(_("E169: Command too recursive")); + emsg(_(e_command_too_recursive)); // When converting to an exception, we do not include the command name // since this is not an error of the specific command. do_errthrow((cstack_T *)NULL, NULL); @@ -372,7 +372,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) breakpoint = func_breakpoint(real_cookie); dbg_tick = func_dbg_tick(real_cookie); } else if (getline_equal(fgetline, cookie, getsourceline)) { - fname = (char *)sourcing_name; + fname = sourcing_name; breakpoint = source_breakpoint(real_cookie); dbg_tick = source_dbg_tick(real_cookie); } @@ -518,10 +518,10 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) msg_didout = true; } if (fgetline == NULL - || (next_cmdline = (char *)fgetline(':', cookie, - cstack.cs_idx < - 0 ? 0 : (cstack.cs_idx + 1) * 2, - true)) == NULL) { + || (next_cmdline = fgetline(':', cookie, + cstack.cs_idx < + 0 ? 0 : (cstack.cs_idx + 1) * 2, + true)) == NULL) { // Don't call wait_return for aborted command line. The NULL // returned for the end of a sourced file or executed function // doesn't do this. @@ -595,7 +595,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) recursive--; // Ignore trailing '|'-separated commands in preview-mode ('inccommand'). - if ((State & CMDPREVIEW) && (flags & DOCMD_PREVIEW)) { + if ((State & MODE_CMDPREVIEW) && (flags & DOCMD_PREVIEW)) { next_cmdline = NULL; } @@ -832,9 +832,9 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) break; } - saved_sourcing_name = (char *)sourcing_name; + saved_sourcing_name = sourcing_name; saved_sourcing_lnum = sourcing_lnum; - sourcing_name = (char_u *)current_exception->throw_name; + sourcing_name = current_exception->throw_name; sourcing_lnum = current_exception->throw_lnum; current_exception->throw_name = NULL; @@ -856,7 +856,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) xfree(p); } xfree(sourcing_name); - sourcing_name = (char_u *)saved_sourcing_name; + sourcing_name = saved_sourcing_name; sourcing_lnum = saved_sourcing_lnum; } else if (got_int || (did_emsg && force_abort)) { // On an interrupt or an aborting error not converted to an exception, @@ -949,7 +949,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) } /// Obtain a line when inside a ":while" or ":for" loop. -static char_u *get_loop_line(int c, void *cookie, int indent, bool do_concat) +static char *get_loop_line(int c, void *cookie, int indent, bool do_concat) { struct loop_cookie *cp = (struct loop_cookie *)cookie; wcmd_T *wp; @@ -963,21 +963,21 @@ static char_u *get_loop_line(int c, void *cookie, int indent, bool do_concat) if (cp->getline == NULL) { line = (char *)getcmdline(c, 0L, indent, do_concat); } else { - line = (char *)cp->getline(c, cp->cookie, indent, do_concat); + line = cp->getline(c, cp->cookie, indent, do_concat); } if (line != NULL) { store_loop_line(cp->lines_gap, line); ++cp->current_line; } - return (char_u *)line; + return line; } KeyTyped = false; cp->current_line++; wp = (wcmd_T *)(cp->lines_gap->ga_data) + cp->current_line; sourcing_lnum = wp->lnum; - return vim_strsave((char_u *)wp->line); + return xstrdup(wp->line); } /// Store a line in "gap" so that a ":while" loop can execute it again. @@ -1218,7 +1218,7 @@ static char *skip_colon_white(const char *p, bool skipleadingwhite) /// Set the addr type for command /// /// @param p pointer to character after command name in cmdline -static void set_cmd_addr_type(exarg_T *eap, char_u *p) +void set_cmd_addr_type(exarg_T *eap, char_u *p) { // ea.addr_type for user commands is set by find_ucmd if (IS_USER_CMDIDX(eap->cmdidx)) { @@ -1239,8 +1239,48 @@ static void set_cmd_addr_type(exarg_T *eap, char_u *p) } } +/// Get default range number for command based on its address type +linenr_T get_cmd_default_range(exarg_T *eap) +{ + switch (eap->addr_type) { + case ADDR_LINES: + case ADDR_OTHER: + // Default is the cursor line number. Avoid using an invalid + // line number though. + return MIN(curwin->w_cursor.lnum, curbuf->b_ml.ml_line_count); + break; + case ADDR_WINDOWS: + return CURRENT_WIN_NR; + break; + case ADDR_ARGUMENTS: + return MIN(curwin->w_arg_idx + 1, ARGCOUNT); + break; + case ADDR_LOADED_BUFFERS: + case ADDR_BUFFERS: + return curbuf->b_fnum; + break; + case ADDR_TABS: + return CURRENT_TAB_NR; + break; + case ADDR_TABS_RELATIVE: + case ADDR_UNSIGNED: + return 1; + break; + case ADDR_QUICKFIX: + return (linenr_T)qf_get_cur_idx(eap); + break; + case ADDR_QUICKFIX_VALID: + return qf_get_cur_valid_idx(eap); + break; + default: + return 0; + // Will give an error later if a range is found. + break; + } +} + /// Set default command range for -range=% based on the addr type of the command -static void set_cmd_default_range(exarg_T *eap) +void set_cmd_dflall_range(exarg_T *eap) { buf_T *buf; @@ -1320,6 +1360,25 @@ static void parse_register(exarg_T *eap) } } +// Change line1 and line2 of Ex command to use count +void set_cmd_count(exarg_T *eap, long count, bool validate) +{ + if (eap->addr_type != ADDR_LINES) { // e.g. :buffer 2, :sleep 3 + eap->line2 = count; + if (eap->addr_count == 0) { + eap->addr_count = 1; + } + } else { + eap->line1 = eap->line2; + eap->line2 += count - 1; + eap->addr_count++; + // Be vi compatible: no error message for out of range. + if (validate && eap->line2 > curbuf->b_ml.ml_line_count) { + eap->line2 = curbuf->b_ml.ml_line_count; + } + } +} + static int parse_count(exarg_T *eap, char **errormsg, bool validate) { // Check for a count. When accepting a EX_BUFNAME, don't use "123foo" as a @@ -1328,7 +1387,7 @@ static int parse_count(exarg_T *eap, char **errormsg, bool validate) long n; if ((eap->argt & EX_COUNT) && ascii_isdigit(*eap->arg) - && (!(eap->argt & EX_BUFNAME) || *(p = (char *)skipdigits((char_u *)eap->arg + 1)) == NUL + && (!(eap->argt & EX_BUFNAME) || *(p = skipdigits(eap->arg + 1)) == NUL || ascii_iswhite(*p))) { n = getdigits_long((char_u **)&eap->arg, false, -1); eap->arg = skipwhite(eap->arg); @@ -1338,25 +1397,19 @@ static int parse_count(exarg_T *eap, char **errormsg, bool validate) } return FAIL; } - if (eap->addr_type != ADDR_LINES) { // e.g. :buffer 2, :sleep 3 - eap->line2 = n; - if (eap->addr_count == 0) { - eap->addr_count = 1; - } - } else { - eap->line1 = eap->line2; - eap->line2 += n - 1; - eap->addr_count++; - // Be vi compatible: no error message for out of range. - if (validate && eap->line2 > curbuf->b_ml.ml_line_count) { - eap->line2 = curbuf->b_ml.ml_line_count; - } - } + set_cmd_count(eap, n, validate); } return OK; } +/// Check if command is not implemented +bool is_cmd_ni(cmdidx_T cmdidx) +{ + return !IS_USER_CMDIDX(cmdidx) && (cmdnames[cmdidx].cmd_func == ex_ni + || cmdnames[cmdidx].cmd_func == ex_script_ni); +} + /// Parse command line and return information about the first command. /// /// @param cmdline Command line string @@ -1394,14 +1447,17 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er if (eap->save_msg_silent != -1) { cmdinfo->silent = !!msg_silent; msg_silent = eap->save_msg_silent; + eap->save_msg_silent = -1; } if (eap->did_esilent) { cmdinfo->emsg_silent = true; emsg_silent--; + eap->did_esilent = false; } if (eap->did_sandbox) { cmdinfo->sandbox = true; sandbox--; + eap->did_sandbox = false; } if (cmdmod.save_ei != NULL) { cmdinfo->noautocmd = true; @@ -1411,6 +1467,7 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er if (eap->verbose_save != -1) { cmdinfo->verbose = p_verbose; p_verbose = eap->verbose_save; + eap->verbose_save = -1; } else { cmdinfo->verbose = -1; } @@ -1424,7 +1481,7 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er if (*eap->cmd == '*') { eap->cmd = skipwhite(eap->cmd + 1); } - p = find_command(eap, NULL); + p = find_ex_command(eap, NULL); // Set command address type and parse command range set_cmd_addr_type(eap, (char_u *)p); @@ -1494,7 +1551,7 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er } // Set default range for command if required if ((eap->argt & EX_DFLALL) && eap->addr_count == 0) { - set_cmd_default_range(eap); + set_cmd_dflall_range(eap); } // Parse register and count @@ -1519,6 +1576,147 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er return true; } +/// Execute an Ex command using parsed command line information. +/// Does not do any validation of the Ex command arguments. +/// +/// @param eap Ex-command arguments +/// @param cmdinfo Command parse information +void execute_cmd(exarg_T *eap, CmdParseInfo *cmdinfo) +{ +#define ERROR(msg) \ + do { \ + emsg(msg); \ + goto end; \ + } while (0) + + char *errormsg = NULL; + cmdmod_T save_cmdmod = cmdmod; + cmdmod = cmdinfo->cmdmod; + + // Apply command modifiers + if (cmdinfo->silent) { + eap->save_msg_silent = msg_silent; + msg_silent++; + } + if (cmdinfo->emsg_silent) { + eap->did_esilent = true; + emsg_silent++; + } + if (cmdinfo->sandbox) { + eap->did_sandbox = true; + sandbox++; + } + if (cmdinfo->noautocmd) { + cmdmod.save_ei = (char *)vim_strsave(p_ei); + set_string_option_direct("ei", -1, (char_u *)"all", OPT_FREE, SID_NONE); + } + if (cmdinfo->verbose != -1) { + eap->verbose_save = p_verbose; + p_verbose = cmdinfo->verbose; + } + + if (!MODIFIABLE(curbuf) && (eap->argt & EX_MODIFY) + // allow :put in terminals + && !(curbuf->terminal && eap->cmdidx == CMD_put)) { + ERROR(_(e_modifiable)); + } + if (text_locked() && !(eap->argt & EX_CMDWIN) + && !IS_USER_CMDIDX(eap->cmdidx)) { + ERROR(_(get_text_locked_msg())); + } + // Disallow editing another buffer when "curbuf->b_ro_locked" is set. + // Do allow ":checktime" (it is postponed). + // Do allow ":edit" (check for an argument later). + // Do allow ":file" with no arguments + if (!(eap->argt & EX_CMDWIN) + && eap->cmdidx != CMD_checktime + && eap->cmdidx != CMD_edit + && !(eap->cmdidx == CMD_file && *eap->arg == NUL) + && !IS_USER_CMDIDX(eap->cmdidx) + && curbuf_locked()) { + ERROR(_(e_cannot_edit_other_buf)); + } + + if (((eap->argt & EX_WHOLEFOLD) || eap->addr_count >= 2) && !global_busy + && eap->addr_type == ADDR_LINES) { + // Put the first line at the start of a closed fold, put the last line + // at the end of a closed fold. + (void)hasFolding(eap->line1, &eap->line1, NULL); + (void)hasFolding(eap->line2, NULL, &eap->line2); + } + + // If filename expansion is enabled, expand filenames + if (cmdinfo->magic.file) { + if (expand_filename(eap, (char_u **)eap->cmdlinep, &errormsg) == FAIL) { + ERROR(errormsg); + } + } + + // Accept buffer name. Cannot be used at the same time with a buffer + // number. Don't do this for a user command. + if ((eap->argt & EX_BUFNAME) && *eap->arg != NUL && eap->addr_count == 0 + && !IS_USER_CMDIDX(eap->cmdidx)) { + if (eap->args == NULL) { + // If argument positions are not specified, search the argument for the buffer name. + // :bdelete, :bwipeout and :bunload take several arguments, separated by spaces: + // find next space (skipping over escaped characters). + // The others take one argument: ignore trailing spaces. + char *p; + + if (eap->cmdidx == CMD_bdelete || eap->cmdidx == CMD_bwipeout + || eap->cmdidx == CMD_bunload) { + p = (char *)skiptowhite_esc((char_u *)eap->arg); + } else { + p = eap->arg + STRLEN(eap->arg); + while (p > eap->arg && ascii_iswhite(p[-1])) { + p--; + } + } + eap->line2 = buflist_findpat((char_u *)eap->arg, (char_u *)p, (eap->argt & EX_BUFUNL) != 0, + false, false); + eap->addr_count = 1; + eap->arg = skipwhite(p); + } else { + // If argument positions are specified, just use the first argument + eap->line2 = buflist_findpat((char_u *)eap->args[0], + (char_u *)(eap->args[0] + eap->arglens[0]), + (eap->argt & EX_BUFUNL) != 0, false, false); + eap->addr_count = 1; + // Shift each argument by 1 + for (size_t i = 0; i < eap->argc - 1; i++) { + eap->args[i] = eap->args[i + 1]; + } + // Make the last argument point to the NUL terminator at the end of string + eap->args[eap->argc - 1] = eap->args[eap->argc - 1] + eap->arglens[eap->argc - 1]; + eap->argc -= 1; + + eap->arg = eap->args[0]; + } + if (eap->line2 < 0) { // failed + goto end; + } + } + + // Execute the command + if (IS_USER_CMDIDX(eap->cmdidx)) { + // Execute a user-defined command. + do_ucmd(eap); + } else { + // Call the function to execute the command. + eap->errmsg = NULL; + (cmdnames[eap->cmdidx].cmd_func)(eap); + if (eap->errmsg != NULL) { + ERROR(_(eap->errmsg)); + } + } +end: + // Undo command modifiers + undo_cmdmod(eap, msg_scroll); + cmdmod = save_cmdmod; + +#undef ERROR +} + /// Execute one Ex command. /// /// If 'sourcing' is TRUE, the command will be included in the error message. @@ -1606,7 +1804,7 @@ static char *do_one_cmd(char **cmdlinep, int flags, cstack_T *cstack, LineGetter if (*ea.cmd == '*') { ea.cmd = skipwhite(ea.cmd + 1); } - p = find_command(&ea, NULL); + p = find_ex_command(&ea, NULL); // Count this line for profiling if skip is TRUE. if (do_profiling == PROF_YES @@ -1728,11 +1926,11 @@ static char *do_one_cmd(char **cmdlinep, int flags, cstack_T *cstack, LineGetter ++p; } p = xstrnsave(ea.cmd, (size_t)(p - ea.cmd)); - int ret = apply_autocmds(EVENT_CMDUNDEFINED, (char_u *)p, (char_u *)p, true, NULL); + int ret = apply_autocmds(EVENT_CMDUNDEFINED, p, p, true, NULL); xfree(p); // If the autocommands did something and didn't cause an error, try // finding the command again. - p = (ret && !aborting()) ? find_command(&ea, NULL) : ea.cmd; + p = (ret && !aborting()) ? find_ex_command(&ea, NULL) : ea.cmd; } if (p == NULL) { @@ -1759,10 +1957,7 @@ static char *do_one_cmd(char **cmdlinep, int flags, cstack_T *cstack, LineGetter } // set when Not Implemented - const int ni = !IS_USER_CMDIDX(ea.cmdidx) - && (cmdnames[ea.cmdidx].cmd_func == ex_ni - || cmdnames[ea.cmdidx].cmd_func == ex_script_ni); - + const int ni = is_cmd_ni(ea.cmdidx); // Forced commands. if (*p == '!' && ea.cmdidx != CMD_substitute @@ -1976,7 +2171,7 @@ static char *do_one_cmd(char **cmdlinep, int flags, cstack_T *cstack, LineGetter } if ((ea.argt & EX_DFLALL) && ea.addr_count == 0) { - set_cmd_default_range(&ea); + set_cmd_dflall_range(&ea); } // Parse register and count @@ -2358,7 +2553,7 @@ int parse_command_modifiers(exarg_T *eap, char **errormsg, bool skip_only) break; } if (!skip_only) { - cmdmod.filter_regmatch.regprog = vim_regcomp((char_u *)reg_pat, RE_MAGIC); + cmdmod.filter_regmatch.regprog = vim_regcomp(reg_pat, RE_MAGIC); if (cmdmod.filter_regmatch.regprog == NULL) { break; } @@ -2543,7 +2738,6 @@ static void undo_cmdmod(const exarg_T *eap, int save_msg_scroll) } } - /// Parse the address range, if any, in "eap". /// May set the last search pattern, unless "silent" is true. /// @@ -2557,47 +2751,7 @@ int parse_cmd_address(exarg_T *eap, char **errormsg, bool silent) // Repeat for all ',' or ';' separated addresses. for (;;) { eap->line1 = eap->line2; - switch (eap->addr_type) { - case ADDR_LINES: - case ADDR_OTHER: - // Default is the cursor line number. Avoid using an invalid - // line number though. - if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count) { - eap->line2 = curbuf->b_ml.ml_line_count; - } else { - eap->line2 = curwin->w_cursor.lnum; - } - break; - case ADDR_WINDOWS: - eap->line2 = CURRENT_WIN_NR; - break; - case ADDR_ARGUMENTS: - eap->line2 = curwin->w_arg_idx + 1; - if (eap->line2 > ARGCOUNT) { - eap->line2 = ARGCOUNT; - } - break; - case ADDR_LOADED_BUFFERS: - case ADDR_BUFFERS: - eap->line2 = curbuf->b_fnum; - break; - case ADDR_TABS: - eap->line2 = CURRENT_TAB_NR; - break; - case ADDR_TABS_RELATIVE: - case ADDR_UNSIGNED: - eap->line2 = 1; - break; - case ADDR_QUICKFIX: - eap->line2 = (linenr_T)qf_get_cur_idx(eap); - break; - case ADDR_QUICKFIX_VALID: - eap->line2 = qf_get_cur_valid_idx(eap); - break; - case ADDR_NONE: - // Will give an error later if a range is found. - break; - } + eap->line2 = get_cmd_default_range(eap); eap->cmd = skipwhite(eap->cmd); lnum = get_address(eap, &eap->cmd, eap->addr_type, eap->skip, silent, eap->addr_count == 0, address_count++); @@ -2772,7 +2926,7 @@ static void append_command(char *cmd) /// "full" is set to TRUE if the whole command name matched. /// /// @return NULL for an ambiguous user command. -static char *find_command(exarg_T *eap, int *full) +char *find_ex_command(exarg_T *eap, int *full) FUNC_ATTR_NONNULL_ARG(1) { int len; @@ -2816,7 +2970,7 @@ static char *find_command(exarg_T *eap, int *full) } // check for non-alpha command - if (p == eap->cmd && vim_strchr((char_u *)"@!=><&~#", *p) != NULL) { + if (p == eap->cmd && vim_strchr("@!=><&~#", *p) != NULL) { p++; } len = (int)(p - eap->cmd); @@ -2859,7 +3013,7 @@ static char *find_command(exarg_T *eap, int *full) for (; (int)eap->cmdidx < CMD_SIZE; eap->cmdidx = (cmdidx_T)((int)eap->cmdidx + 1)) { - if (STRNCMP(cmdnames[(int)eap->cmdidx].cmd_name, (char *)eap->cmd, + if (STRNCMP(cmdnames[(int)eap->cmdidx].cmd_name, eap->cmd, (size_t)len) == 0) { if (full != NULL && cmdnames[(int)eap->cmdidx].cmd_name[len] == NUL) { @@ -3032,7 +3186,7 @@ int modifier_len(char *cmd) char *p = cmd; if (ascii_isdigit(*cmd)) { - p = skipwhite((char *)skipdigits((char_u *)cmd + 1)); + p = skipwhite(skipdigits(cmd + 1)); } for (int i = 0; i < (int)ARRAY_SIZE(cmdmods); i++) { int j; @@ -3076,7 +3230,7 @@ int cmd_exists(const char *const name) ea.cmd = (char *)((*name == '2' || *name == '3') ? name + 1 : name); ea.cmdidx = (cmdidx_T)0; int full = false; - p = find_command(&ea, &full); + p = find_ex_command(&ea, &full); if (p == NULL) { return 3; } @@ -3108,7 +3262,7 @@ void f_fullcommand(typval_T *argvars, typval_T *rettv, FunPtr fptr) ea.cmd = (*name == '2' || *name == '3') ? name + 1 : name; ea.cmdidx = (cmdidx_T)0; - char *p = find_command(&ea, NULL); + char *p = find_ex_command(&ea, NULL); if (p == NULL || ea.cmdidx == CMD_SIZE) { return; } @@ -3142,7 +3296,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) // 2. skip comment lines and leading space, colons or bars const char *cmd; - for (cmd = buff; vim_strchr((const char_u *)" \t:|", *cmd) != NULL; cmd++) {} + for (cmd = buff; vim_strchr(" \t:|", *cmd) != NULL; cmd++) {} xp->xp_pattern = (char *)cmd; if (*cmd == NUL) { @@ -3203,7 +3357,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) } } // check for non-alpha command - if (p == cmd && vim_strchr((const char_u *)"@*!=><&~#", *p) != NULL) { + if (p == cmd && vim_strchr("@*!=><&~#", *p) != NULL) { p++; } len = (size_t)(p - cmd); @@ -3235,7 +3389,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) } if (ea.cmdidx == CMD_SIZE) { - if (*cmd == 's' && vim_strchr((const char_u *)"cgriI", cmd[1]) != NULL) { + if (*cmd == 's' && vim_strchr("cgriI", cmd[1]) != NULL) { ea.cmdidx = CMD_substitute; p = cmd + 1; } else if (cmd[0] >= 'A' && cmd[0] <= 'Z') { @@ -3431,7 +3585,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) xp->xp_shell = TRUE; #endif // When still after the command name expand executables. - if ((char_u *)xp->xp_pattern == (char_u *)skipwhite(arg)) { + if (xp->xp_pattern == skipwhite(arg)) { xp->xp_context = EXPAND_SHELLCMD; } } @@ -3660,7 +3814,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) case CMD_isplit: case CMD_dsplit: // Skip count. - arg = (const char *)skipwhite((char *)skipdigits((const char_u *)arg)); + arg = (const char *)skipwhite(skipdigits(arg)); if (*arg == '/') { // Match regexp, not just whole words. for (++arg; *arg && *arg != '/'; arg++) { if (*arg == '\\' && arg[1] != NUL) { @@ -3980,7 +4134,7 @@ const char *set_one_cmd_context(expand_T *xp, const char *buff) break; case CMD_argdelete: - while ((xp->xp_pattern = (char *)vim_strchr((const char_u *)arg, ' ')) != NULL) { + while ((xp->xp_pattern = vim_strchr(arg, ' ')) != NULL) { arg = (const char *)(xp->xp_pattern + 1); } xp->xp_context = EXPAND_ARGLIST; @@ -4011,7 +4165,7 @@ char *skip_range(const char *cmd, int *ctx) { unsigned delim; - while (vim_strchr((char_u *)" \t0123456789.$%'/?-+,;\\", *cmd) != NULL) { + while (vim_strchr(" \t0123456789.$%'/?-+,;\\", *cmd) != NULL) { if (*cmd == '\\') { if (cmd[1] == '?' || cmd[1] == '/' || cmd[1] == '&') { cmd++; @@ -4381,7 +4535,7 @@ error: /// Get flags from an Ex command argument. static void get_flags(exarg_T *eap) { - while (vim_strchr((char_u *)"lp#", *eap->arg) != NULL) { + while (vim_strchr("lp#", *eap->arg) != NULL) { if (*eap->arg == 'l') { eap->flags |= EXFLAG_LIST; } else if (*eap->arg == 'p') { @@ -4416,7 +4570,7 @@ static void ex_script_ni(exarg_T *eap) /// Check range in Ex command for validity. /// /// @return NULL when valid, error message when invalid. -static char *invalid_range(exarg_T *eap) +char *invalid_range(exarg_T *eap) { buf_T *buf; if (eap->line1 < 0 || eap->line2 < 0 || eap->line1 > eap->line2) { @@ -4535,7 +4689,7 @@ static char *skip_grep_pat(exarg_T *eap) /// For the ":make" and ":grep" commands insert the 'makeprg'/'grepprg' option /// in the command line, so that things like % get expanded. -static char *replace_makeprg(exarg_T *eap, char *p, char **cmdlinep) +char *replace_makeprg(exarg_T *eap, char *p, char **cmdlinep) { char *new_cmdline; char *program; @@ -4637,8 +4791,8 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp) * Quick check if this cannot be the start of a special string. * Also removes backslash before '%', '#' and '<'. */ - if (vim_strchr((char_u *)"%#<", *p) == NULL) { - ++p; + if (vim_strchr("%#<", *p) == NULL) { + p++; continue; } @@ -4657,10 +4811,10 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp) // Wildcards won't be expanded below, the replacement is taken // literally. But do expand "~/file", "~user/file" and "$HOME/file". - if (vim_strchr((char_u *)repl, '$') != NULL || vim_strchr((char_u *)repl, '~') != NULL) { + if (vim_strchr(repl, '$') != NULL || vim_strchr(repl, '~') != NULL) { char *l = repl; - repl = (char *)expand_env_save((char_u *)repl); + repl = expand_env_save(repl); xfree(l); } @@ -4690,8 +4844,8 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp) # define ESCAPE_CHARS escape_chars #endif - for (l = repl; *l; ++l) { - if (vim_strchr(ESCAPE_CHARS, *l) != NULL) { + for (l = repl; *l; l++) { + if (vim_strchr((char *)ESCAPE_CHARS, *l) != NULL) { l = (char *)vim_strsave_escaped((char_u *)repl, ESCAPE_CHARS); xfree(repl); repl = l; @@ -4730,8 +4884,8 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp) * After expanding environment variables, check again * if there are still wildcards present. */ - if (vim_strchr((char_u *)eap->arg, '$') != NULL - || vim_strchr((char_u *)eap->arg, '~') != NULL) { + if (vim_strchr(eap->arg, '$') != NULL + || vim_strchr(eap->arg, '~') != NULL) { expand_env_esc((char_u *)eap->arg, NameBuff, MAXPATHL, true, true, NULL); has_wildcards = path_has_wildcard(NameBuff); p = (char *)NameBuff; @@ -4773,7 +4927,7 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp) return OK; } -/// Replace part of the command line, keeping eap->cmd, eap->arg and +/// Replace part of the command line, keeping eap->cmd, eap->arg, eap->args and /// eap->nextcmd correct. /// "src" points to the part that is to be replaced, of length "srclen". /// "repl" is the replacement string. @@ -4792,6 +4946,7 @@ static char *repl_cmdline(exarg_T *eap, char *src, size_t srclen, char *repl, ch i += STRLEN(eap->nextcmd); // add space for next command } char *new_cmdline = xmalloc(i); + size_t offset = (size_t)(src - *cmdlinep); /* * Copy the stuff before the expanded part. @@ -4799,7 +4954,7 @@ static char *repl_cmdline(exarg_T *eap, char *src, size_t srclen, char *repl, ch * Copy what came after the expanded part. * Copy the next commands, if there are any. */ - i = (size_t)(src - *cmdlinep); // length of part before match + i = offset; // length of part before match memmove(new_cmdline, *cmdlinep, i); memmove(new_cmdline + i, repl, len); @@ -4814,6 +4969,19 @@ static char *repl_cmdline(exarg_T *eap, char *src, size_t srclen, char *repl, ch } eap->cmd = new_cmdline + (eap->cmd - *cmdlinep); eap->arg = new_cmdline + (eap->arg - *cmdlinep); + + for (size_t j = 0; j < eap->argc; j++) { + if (offset >= (size_t)(eap->args[j] - *cmdlinep)) { + // If replaced text is after or in the same position as the argument, + // the argument's position relative to the beginning of the cmdline stays the same. + eap->args[j] = new_cmdline + (eap->args[j] - *cmdlinep); + } else { + // Otherwise, argument gets shifted alongside the replaced text. + // The amount of the shift is equal to the difference of the old and new string length. + eap->args[j] = new_cmdline + (eap->args[j] - *cmdlinep) + (len - srclen); + } + } + if (eap->do_ecmd_cmd != NULL && eap->do_ecmd_cmd != dollar_command) { eap->do_ecmd_cmd = new_cmdline + (eap->do_ecmd_cmd - *cmdlinep); } @@ -5077,7 +5245,9 @@ static int get_tabpage_arg(exarg_T *eap) tab_number = 0; } else { tab_number = (int)eap->line2; - if (!unaccept_arg0 && *skipwhite(*eap->cmdlinep) == '-') { + char *cmdp = eap->cmd; + while (--cmdp > *eap->cmdlinep && (*cmdp == ' ' || ascii_isdigit(*cmdp))) {} + if (!unaccept_arg0 && *cmdp == '-') { tab_number--; if (tab_number < unaccept_arg0) { eap->errmsg = e_invarg; @@ -5325,12 +5495,12 @@ static int check_more(int message, bool forceit) } /// Function given to ExpandGeneric() to obtain the list of command names. -char_u *get_command_name(expand_T *xp, int idx) +char *get_command_name(expand_T *xp, int idx) { if (idx >= CMD_SIZE) { - return (char_u *)expand_user_command_name(idx); + return expand_user_command_name(idx); } - return (char_u *)cmdnames[idx].cmd_name; + return cmdnames[idx].cmd_name; } /// Check for a valid user command name @@ -6002,7 +6172,7 @@ bool uc_split_args_iter(const char *arg, size_t arglen, size_t *end, char *buf, } /// split and quote args for <f-args> -static char *uc_split_args(char *arg, size_t *lenp) +static char *uc_split_args(char *arg, char **args, size_t *arglens, size_t argc, size_t *lenp) { char *buf; char *p; @@ -6010,61 +6180,107 @@ static char *uc_split_args(char *arg, size_t *lenp) int len; // Precalculate length - p = arg; len = 2; // Initial and final quotes + if (args == NULL) { + p = arg; - while (*p) { - if (p[0] == '\\' && p[1] == '\\') { - len += 2; - p += 2; - } else if (p[0] == '\\' && ascii_iswhite(p[1])) { - len += 1; - p += 2; - } else if (*p == '\\' || *p == '"') { - len += 2; - p += 1; - } else if (ascii_iswhite(*p)) { - p = skipwhite(p); - if (*p == NUL) { - break; + while (*p) { + if (p[0] == '\\' && p[1] == '\\') { + len += 2; + p += 2; + } else if (p[0] == '\\' && ascii_iswhite(p[1])) { + len += 1; + p += 2; + } else if (*p == '\\' || *p == '"') { + len += 2; + p += 1; + } else if (ascii_iswhite(*p)) { + p = skipwhite(p); + if (*p == NUL) { + break; + } + len += 3; // "," + } else { + const int charlen = utfc_ptr2len(p); + + len += charlen; + p += charlen; } - len += 3; // "," - } else { - const int charlen = utfc_ptr2len(p); + } + } else { + for (size_t i = 0; i < argc; i++) { + p = args[i]; + const char *arg_end = args[i] + arglens[i]; + + while (p < arg_end) { + if (*p == '\\' || *p == '"') { + len += 2; + p += 1; + } else { + const int charlen = utfc_ptr2len(p); - len += charlen; - p += charlen; + len += charlen; + p += charlen; + } + } + + if (i != argc - 1) { + len += 3; // "," + } } } buf = xmalloc((size_t)len + 1); - p = arg; q = buf; *q++ = '"'; - while (*p) { - if (p[0] == '\\' && p[1] == '\\') { - *q++ = '\\'; - *q++ = '\\'; - p += 2; - } else if (p[0] == '\\' && ascii_iswhite(p[1])) { - *q++ = p[1]; - p += 2; - } else if (*p == '\\' || *p == '"') { - *q++ = '\\'; - *q++ = *p++; - } else if (ascii_iswhite(*p)) { - p = skipwhite(p); - if (*p == NUL) { - break; + + if (args == NULL) { + p = arg; + while (*p) { + if (p[0] == '\\' && p[1] == '\\') { + *q++ = '\\'; + *q++ = '\\'; + p += 2; + } else if (p[0] == '\\' && ascii_iswhite(p[1])) { + *q++ = p[1]; + p += 2; + } else if (*p == '\\' || *p == '"') { + *q++ = '\\'; + *q++ = *p++; + } else if (ascii_iswhite(*p)) { + p = skipwhite(p); + if (*p == NUL) { + break; + } + *q++ = '"'; + *q++ = ','; + *q++ = '"'; + } else { + mb_copy_char((const char_u **)&p, (char_u **)&q); + } + } + } else { + for (size_t i = 0; i < argc; i++) { + p = args[i]; + const char *arg_end = args[i] + arglens[i]; + + while (p < arg_end) { + if (*p == '\\' || *p == '"') { + *q++ = '\\'; + *q++ = *p++; + } else { + mb_copy_char((const char_u **)&p, (char_u **)&q); + } + } + if (i != argc - 1) { + *q++ = '"'; + *q++ = ','; + *q++ = '"'; } - *q++ = '"'; - *q++ = ','; - *q++ = '"'; - } else { - mb_copy_char((const char_u **)&p, (char_u **)&q); } } + *q++ = '"'; *q = 0; @@ -6121,7 +6337,7 @@ static size_t uc_check_code(char *code, size_t len, char *buf, ucmd_T *cmd, exar ct_NONE, } type = ct_NONE; - if ((vim_strchr((char_u *)"qQfF", *p) != NULL) && p[1] == '-') { + if ((vim_strchr("qQfF", *p) != NULL) && p[1] == '-') { quote = (*p == 'q' || *p == 'Q') ? 1 : 2; p += 2; l -= 2; @@ -6201,7 +6417,7 @@ static size_t uc_check_code(char *code, size_t len, char *buf, ucmd_T *cmd, exar case 2: // Quote and split (<f-args>) // This is hard, so only do it once, and cache the result if (*split_buf == NULL) { - *split_buf = uc_split_args(eap->arg, split_len); + *split_buf = uc_split_args(eap->arg, eap->args, eap->arglens, eap->argc, split_len); } result = *split_len; @@ -6426,9 +6642,9 @@ static void do_ucmd(exarg_T *eap) totlen = 0; for (;;) { - start = (char *)vim_strchr((char_u *)p, '<'); + start = vim_strchr(p, '<'); if (start != NULL) { - end = (char *)vim_strchr((char_u *)start + 1, '>'); + end = vim_strchr(start + 1, '>'); } if (buf != NULL) { for (ksp = p; *ksp != NUL && (char_u)(*ksp) != K_SPECIAL; ksp++) {} @@ -6510,28 +6726,28 @@ static void do_ucmd(exarg_T *eap) static char *expand_user_command_name(int idx) { - return (char *)get_user_commands(NULL, idx - CMD_SIZE); + return get_user_commands(NULL, idx - CMD_SIZE); } /// Function given to ExpandGeneric() to obtain the list of user address type names. -char_u *get_user_cmd_addr_type(expand_T *xp, int idx) +char *get_user_cmd_addr_type(expand_T *xp, int idx) { - return (char_u *)addr_type_complete[idx].name; + return addr_type_complete[idx].name; } /// Function given to ExpandGeneric() to obtain the list of user command names. -char_u *get_user_commands(expand_T *xp FUNC_ATTR_UNUSED, int idx) +char *get_user_commands(expand_T *xp FUNC_ATTR_UNUSED, int idx) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { // In cmdwin, the alternative buffer should be used. const buf_T *const buf = prevwin_curwin()->w_buffer; if (idx < buf->b_ucmds.ga_len) { - return USER_CMD_GA(&buf->b_ucmds, idx)->uc_name; + return (char *)USER_CMD_GA(&buf->b_ucmds, idx)->uc_name; } idx -= buf->b_ucmds.ga_len; if (idx < ucmds.ga_len) { - return USER_CMD(idx)->uc_name; + return (char *)USER_CMD(idx)->uc_name; } return NULL; } @@ -6558,7 +6774,7 @@ static char *get_user_command_name(int idx, int cmdidx) /// Function given to ExpandGeneric() to obtain the list of user command /// attributes. -char_u *get_user_cmd_flags(expand_T *xp, int idx) +char *get_user_cmd_flags(expand_T *xp, int idx) { static char *user_cmd_flags[] = { "addr", "bang", "bar", "buffer", "complete", "count", @@ -6567,31 +6783,31 @@ char_u *get_user_cmd_flags(expand_T *xp, int idx) if (idx >= (int)ARRAY_SIZE(user_cmd_flags)) { return NULL; } - return (char_u *)user_cmd_flags[idx]; + return user_cmd_flags[idx]; } /// Function given to ExpandGeneric() to obtain the list of values for -nargs. -char_u *get_user_cmd_nargs(expand_T *xp, int idx) +char *get_user_cmd_nargs(expand_T *xp, int idx) { static char *user_cmd_nargs[] = { "0", "1", "*", "?", "+" }; if (idx >= (int)ARRAY_SIZE(user_cmd_nargs)) { return NULL; } - return (char_u *)user_cmd_nargs[idx]; + return user_cmd_nargs[idx]; } /// Function given to ExpandGeneric() to obtain the list of values for -complete. -char_u *get_user_cmd_complete(expand_T *xp, int idx) +char *get_user_cmd_complete(expand_T *xp, int idx) { if (idx >= (int)ARRAY_SIZE(command_complete)) { return NULL; } char *cmd_compl = get_command_complete(idx); if (cmd_compl == NULL) { - return (char_u *)""; + return ""; } else { - return (char_u *)cmd_compl; + return cmd_compl; } } @@ -7564,7 +7780,7 @@ static void ex_tabs(exarg_T *eap) if (buf_spname(wp->w_buffer) != NULL) { STRLCPY(IObuff, buf_spname(wp->w_buffer), IOSIZE); } else { - home_replace(wp->w_buffer, wp->w_buffer->b_fname, IObuff, IOSIZE, true); + home_replace(wp->w_buffer, (char_u *)wp->w_buffer->b_fname, IObuff, IOSIZE, true); } msg_outtrans(IObuff); ui_flush(); // output one line at a time @@ -7879,13 +8095,13 @@ static void ex_read(exarg_T *eap) if (check_fname() == FAIL) { // check for no file name return; } - i = readfile(curbuf->b_ffname, curbuf->b_fname, + i = readfile((char *)curbuf->b_ffname, curbuf->b_fname, eap->line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, 0, false); } else { if (vim_strchr(p_cpo, CPO_ALTREAD) != NULL) { (void)setaltfname((char_u *)eap->arg, (char_u *)eap->arg, (linenr_T)1); } - i = readfile((char_u *)eap->arg, NULL, + i = readfile(eap->arg, NULL, eap->line2, (linenr_T)0, (linenr_T)MAXLNUM, eap, 0, false); } if (i != OK) { @@ -7958,7 +8174,7 @@ static void post_chdir(CdScope scope, bool trigger_dirchanged) char *pdir = get_prevdir(scope); // If still in global directory, set CWD as the global directory. if (globaldir == NULL && pdir != NULL) { - globaldir = vim_strsave((char_u *)pdir); + globaldir = xstrdup(pdir); } } @@ -8376,8 +8592,7 @@ static void ex_at(exarg_T *eap) } // Put the register in the typeahead buffer with the "silent" flag. - if (do_execreg(c, TRUE, vim_strchr(p_cpo, CPO_EXECBUF) != NULL, TRUE) - == FAIL) { + if (do_execreg(c, true, vim_strchr(p_cpo, CPO_EXECBUF) != NULL, true) == FAIL) { beep_flush(); } else { bool save_efr = exec_from_reg; @@ -8520,7 +8735,7 @@ static void ex_redir(exarg_T *eap) close_redir(); // Expand environment variables and "~/". - fname = (char *)expand_env_save((char_u *)arg); + fname = expand_env_save(arg); if (fname == NULL) { return; } @@ -8584,7 +8799,7 @@ static void ex_redir(exarg_T *eap) /// ":redraw": force redraw static void ex_redraw(exarg_T *eap) { - if (State & CMDPREVIEW) { + if (State & MODE_CMDPREVIEW) { return; // Ignore :redraw during 'inccommand' preview. #9777 } int r = RedrawingDisabled; @@ -8615,10 +8830,10 @@ static void ex_redraw(exarg_T *eap) ui_flush(); } -/// ":redrawstatus": force redraw of status line(s) +/// ":redrawstatus": force redraw of status line(s) and window bar(s) static void ex_redrawstatus(exarg_T *eap) { - if (State & CMDPREVIEW) { + if (State & MODE_CMDPREVIEW) { return; // Ignore :redrawstatus during 'inccommand' preview. #9777 } int r = RedrawingDisabled; @@ -8631,8 +8846,7 @@ static void ex_redrawstatus(exarg_T *eap) } else { status_redraw_curbuf(); } - update_screen(VIsual_active ? INVERTED : - 0); + update_screen(VIsual_active ? INVERTED : 0); RedrawingDisabled = r; p_lz = p; ui_flush(); @@ -8802,7 +9016,7 @@ void restore_current_state(save_state_T *sst) /// ":normal[!] {commands}": Execute normal mode commands. static void ex_normal(exarg_T *eap) { - if (curbuf->terminal && State & TERM_FOCUS) { + if (curbuf->terminal && State & MODE_TERMINAL) { emsg("Can't re-enter normal mode from terminal mode"); return; } @@ -8893,7 +9107,7 @@ static void ex_startinsert(exarg_T *eap) // Ignore the command when already in Insert mode. Inserting an // expression register that invokes a function can do this. - if (State & INSERT) { + if (State & MODE_INSERT) { return; } @@ -9261,7 +9475,7 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum result = ""; valid = 0; // Must have ":p:h" to be valid } else { - result = (char *)curbuf->b_fname; + result = curbuf->b_fname; tilde_file = STRCMP(result, "~") == 0; } break; @@ -9315,7 +9529,7 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum result = ""; valid = 0; // Must have ":p:h" to be valid } else { - result = (char *)buf->b_fname; + result = buf->b_fname; tilde_file = STRCMP(result, "~") == 0; } } @@ -9332,17 +9546,17 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum case SPEC_AFILE: // file name for autocommand if (autocmd_fname != NULL - && !path_is_absolute(autocmd_fname) + && !path_is_absolute((char_u *)autocmd_fname) // For CmdlineEnter and related events, <afile> is not a path! #9348 - && !strequal("/", (char *)autocmd_fname)) { + && !strequal("/", autocmd_fname)) { // Still need to turn the fname into a full path. It was // postponed to avoid a delay when <afile> is not used. - result = FullName_save((char *)autocmd_fname, false); + result = FullName_save(autocmd_fname, false); // Copy into `autocmd_fname`, don't reassign it. #8165 STRLCPY(autocmd_fname, result, MAXPATHL); xfree(result); } - result = (char *)autocmd_fname; + result = autocmd_fname; if (result == NULL) { *errormsg = _("E495: no autocommand file name to substitute for \"<afile>\""); return NULL; @@ -9360,7 +9574,7 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum break; case SPEC_AMATCH: // match name for autocommand - result = (char *)autocmd_match; + result = autocmd_match; if (result == NULL) { *errormsg = _("E497: no autocommand match name to substitute for \"<amatch>\""); return NULL; @@ -9368,7 +9582,7 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum break; case SPEC_SFILE: // file name for ":so" command - result = (char *)sourcing_name; + result = sourcing_name; if (result == NULL) { *errormsg = _("E498: no :source file name to substitute for \"<sfile>\""); return NULL; @@ -9417,7 +9631,7 @@ char_u *eval_vars(char_u *src, char_u *srcstart, size_t *usedlen, linenr_T *lnum if (src[*usedlen] == '<') { (*usedlen)++; if ((s = (char *)STRRCHR(result, '.')) != NULL - && (char_u *)s >= path_tail((char_u *)result)) { + && s >= path_tail(result)) { resultlen = (size_t)(s - result); } } else if (!skip_mod) { @@ -9601,31 +9815,31 @@ static void ex_behave(exarg_T *eap) /// Function given to ExpandGeneric() to obtain the possible arguments of the /// ":behave {mswin,xterm}" command. -char_u *get_behave_arg(expand_T *xp, int idx) +char *get_behave_arg(expand_T *xp, int idx) { if (idx == 0) { - return (char_u *)"mswin"; + return "mswin"; } if (idx == 1) { - return (char_u *)"xterm"; + return "xterm"; } return NULL; } /// Function given to ExpandGeneric() to obtain the possible arguments of the /// ":messages {clear}" command. -char_u *get_messages_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx) +char *get_messages_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx) { if (idx == 0) { - return (char_u *)"clear"; + return "clear"; } return NULL; } -char_u *get_mapclear_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx) +char *get_mapclear_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx) { if (idx == 0) { - return (char_u *)"<buffer>"; + return "<buffer>"; } return NULL; } @@ -9651,8 +9865,8 @@ static void ex_filetype(exarg_T *eap) // Print current status. smsg("filetype detection:%s plugin:%s indent:%s", filetype_detect == kTrue ? "ON" : "OFF", - filetype_plugin == kTrue ? (filetype_detect == kTrue ? "ON" : "(on)") : "OFF", // NOLINT(whitespace/line_length) - filetype_indent == kTrue ? (filetype_detect == kTrue ? "ON" : "(on)") : "OFF"); // NOLINT(whitespace/line_length) + filetype_plugin == kTrue ? (filetype_detect == kTrue ? "ON" : "(on)") : "OFF", + filetype_indent == kTrue ? (filetype_detect == kTrue ? "ON" : "(on)") : "OFF"); return; } @@ -9887,7 +10101,7 @@ bool cmd_can_preview(char *cmd) if (*ea.cmd == '*') { ea.cmd = skipwhite(ea.cmd + 1); } - char *end = find_command(&ea, NULL); + char *end = find_ex_command(&ea, NULL); switch (ea.cmdidx) { case CMD_substitute: @@ -10278,3 +10492,9 @@ void verify_command(char *cmd) msg("` `.:.`.,:iii;;;;;;;;iii;;;:` `.`` " " `nW"); } + +/// Get argt of command with id +uint32_t get_cmd_argt(cmdidx_T cmdidx) +{ + return cmdnames[(int)cmdidx].cmd_argt; +} diff --git a/src/nvim/ex_eval.c b/src/nvim/ex_eval.c index 976a19300b..fa70f762a2 100644 --- a/src/nvim/ex_eval.c +++ b/src/nvim/ex_eval.c @@ -479,7 +479,7 @@ static int throw_exception(void *value, except_type_T type, char *cmdname) } excp->type = type; - excp->throw_name = (char *)vim_strsave(sourcing_name == NULL ? (char_u *)"" : sourcing_name); + excp->throw_name = xstrdup(sourcing_name == NULL ? "" : sourcing_name); excp->throw_lnum = sourcing_lnum; if (p_verbose >= 13 || debug_break_level > 0) { @@ -1361,18 +1361,18 @@ void ex_catch(exarg_T *eap) save_char = *end; *end = NUL; } - save_cpo = (char *)p_cpo; - p_cpo = (char_u *)""; + save_cpo = p_cpo; + p_cpo = ""; // Disable error messages, it will make current exception // invalid emsg_off++; - regmatch.regprog = vim_regcomp((char_u *)pat, RE_MAGIC + RE_STRING); + regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); emsg_off--; regmatch.rm_ic = false; if (end != NULL) { *end = save_char; } - p_cpo = (char_u *)save_cpo; + p_cpo = save_cpo; if (regmatch.regprog == NULL) { semsg(_(e_invarg2), pat); } else { diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 8792e9673a..1d496cbf25 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -33,12 +33,13 @@ #include "nvim/func_attr.h" #include "nvim/garray.h" #include "nvim/getchar.h" +#include "nvim/globals.h" #include "nvim/highlight.h" #include "nvim/highlight_defs.h" #include "nvim/highlight_group.h" #include "nvim/if_cscope.h" #include "nvim/indent.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/lib/kvec.h" #include "nvim/log.h" #include "nvim/lua/executor.h" @@ -292,7 +293,7 @@ static void init_incsearch_state(incsearch_state_T *s) /// Given to ExpandGeneric() to obtain all available heathcheck names. /// @param[in] idx Index of the healthcheck item. /// @param[in] xp Not used. -static char_u *get_healthcheck_names(expand_T *xp, int idx) +static char *get_healthcheck_names(expand_T *xp, int idx) { // Generate the first time or on new prompt. if (healthchecks.last_gen == 0 || healthchecks.last_gen != last_prompt_id) { @@ -310,8 +311,8 @@ static char_u *get_healthcheck_names(expand_T *xp, int idx) // Tracked to regenerate items on next prompt. healthchecks.last_gen = last_prompt_id; } - return idx < - healthchecks.names.ga_len ? ((char_u **)(healthchecks.names.ga_data))[idx] : NULL; + return idx < healthchecks.names.ga_len + ? ((char **)(healthchecks.names.ga_data))[idx] : NULL; } /// Transform healthcheck file path into it's name. @@ -325,7 +326,7 @@ static void get_healthcheck_cb(char *path, void *cookie) struct healthchecks_cookie *hcookie = (struct healthchecks_cookie *)cookie; char *pattern; char *sub = "\\1"; - char_u *res; + char *res; if (hcookie->is_lua) { // Lua: transform "../lua/vim/lsp/health.lua" into "vim.lsp" @@ -335,16 +336,16 @@ static void get_healthcheck_cb(char *path, void *cookie) pattern = ".*[\\/]\\([^\\/]*\\)\\.vim$"; } - res = (char_u *)do_string_sub(path, pattern, sub, NULL, "g"); + res = do_string_sub(path, pattern, sub, NULL, "g"); if (hcookie->is_lua && res != NULL) { // Replace slashes with dots as represented by the healthcheck plugin. - char_u *ares = (char_u *)do_string_sub((char *)res, "[\\/]", ".", NULL, "g"); + char *ares = do_string_sub(res, "[\\/]", ".", NULL, "g"); xfree(res); res = ares; } if (res != NULL) { - GA_APPEND(char_u *, hcookie->names, res); + GA_APPEND(char *, hcookie->names, res); } } } @@ -355,12 +356,12 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s int *skiplen, int *patlen) FUNC_ATTR_NONNULL_ALL { - char_u *cmd; + char *cmd; cmdmod_T save_cmdmod = cmdmod; - char_u *p; + char *p; bool delim_optional = false; int delim; - char_u *end; + char *end; char *dummy; exarg_T ea; pos_T save_cursor; @@ -396,14 +397,14 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s parse_command_modifiers(&ea, &dummy, true); cmdmod = save_cmdmod; - cmd = (char_u *)skip_range(ea.cmd, NULL); - if (vim_strchr((char_u *)"sgvl", *cmd) == NULL) { + cmd = skip_range(ea.cmd, NULL); + if (vim_strchr("sgvl", *cmd) == NULL) { goto theend; } // Skip over "substitute" to find the pattern separator. for (p = cmd; ASCII_ISALPHA(*p); p++) {} - if (*skipwhite((char *)p) == NUL) { + if (*skipwhite(p) == NUL) { goto theend; } @@ -419,9 +420,9 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s } else if (STRNCMP(cmd, "sort", MAX(p - cmd, 3)) == 0) { // skip over ! and flags if (*p == '!') { - p = (char_u *)skipwhite((char *)p + 1); + p = skipwhite(p + 1); } - while (ASCII_ISALPHA(*(p = (char_u *)skipwhite((char *)p)))) { + while (ASCII_ISALPHA(*(p = skipwhite((char *)p)))) { p++; } if (*p == NUL) { @@ -435,7 +436,7 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s // skip over "!/". if (*p == '!') { p++; - if (*skipwhite((char *)p) == NUL) { + if (*skipwhite(p) == NUL) { goto theend; } } @@ -446,10 +447,10 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s goto theend; } - p = (char_u *)skipwhite((char *)p); + p = skipwhite(p); delim = (delim_optional && vim_isIDc(*p)) ? ' ' : *p++; *search_delim = delim; - end = skip_regexp(p, delim, p_magic, NULL); + end = (char *)skip_regexp((char_u *)p, delim, p_magic, NULL); use_last_pat = end == p && *end == delim; if (end == p && !use_last_pat) { @@ -458,11 +459,11 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s // Don't do 'hlsearch' highlighting if the pattern matches everything. if (!use_last_pat) { - char_u c = *end; + char c = *end; int empty; *end = NUL; - empty = empty_pattern(p); + empty = empty_pattern((char_u *)p); *end = c; if (empty) { goto theend; @@ -470,7 +471,7 @@ static bool do_incsearch_highlighting(int firstc, int *search_delim, incsearch_s } // found a non-empty pattern or // - *skiplen = (int)(p - ccline.cmdbuff); + *skiplen = (int)((char_u *)p - ccline.cmdbuff); *patlen = (int)(end - p); // parse the address range @@ -686,8 +687,7 @@ static int may_add_char_to_search(int firstc, int *c, incsearch_state_T *s) *c = mb_tolower(*c); } if (*c == search_delim - || vim_strchr((char_u *)(p_magic ? "\\~^$.*[" : "\\^$"), *c) - != NULL) { + || vim_strchr((p_magic ? "\\~^$.*[" : "\\^$"), *c) != NULL) { // put a backslash before special characters stuffcharReadbuff(*c); *c = '\\'; @@ -804,6 +804,12 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init ccline.cmdlen = s->indent; } + if (cmdline_level == 50) { + // Somehow got into a loop recursively calling getcmdline(), bail out. + emsg(_(e_command_too_recursive)); + goto theend; + } + ExpandInit(&s->xpc); ccline.xpc = &s->xpc; @@ -841,7 +847,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init // doing ":@0" when register 0 doesn't contain a CR. msg_scroll = false; - State = CMDLINE; + State = MODE_CMDLINE; if (s->firstc == '/' || s->firstc == '?' || s->firstc == '@') { // Use ":lmap" mappings for search pattern and input(). @@ -852,7 +858,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init } if (*s->b_im_ptr == B_IMODE_LMAP) { - State |= LANGMAP; + State |= MODE_LANGMAP; } } @@ -907,8 +913,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init tv_dict_set_keys_readonly(dict); try_enter(&tstate); - apply_autocmds(EVENT_CMDLINEENTER, (char_u *)firstcbuf, (char_u *)firstcbuf, - false, curbuf); + apply_autocmds(EVENT_CMDLINEENTER, firstcbuf, firstcbuf, false, curbuf); restore_v_event(dict, &save_v_event); @@ -933,8 +938,7 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init tv_dict_add_bool(dict, S_LEN("abort"), s->gotesc ? kBoolVarTrue : kBoolVarFalse); try_enter(&tstate); - apply_autocmds(EVENT_CMDLINELEAVE, (char_u *)firstcbuf, (char_u *)firstcbuf, - false, curbuf); + apply_autocmds(EVENT_CMDLINELEAVE, firstcbuf, firstcbuf, false, curbuf); // error printed below, to avoid redraw issues tl_ret = try_leave(&tstate, &err); if (tv_dict_get_number(dict, "abort") != 0) { @@ -997,12 +1001,13 @@ static uint8_t *command_line_enter(int firstc, long count, int indent, bool init State = s->save_State; setmouse(); ui_cursor_shape(); // may show different cursor shape + sb_text_end_cmdline(); + +theend: xfree(s->save_p_icm); xfree(ccline.last_colors.cmdbuff); kv_destroy(ccline.last_colors.colors); - sb_text_end_cmdline(); - char_u *p = ccline.cmdbuff; if (ui_has(kUICmdline)) { @@ -1831,11 +1836,11 @@ static int command_line_handle_key(CommandLineState *s) return command_line_not_changed(s); case Ctrl_HAT: - if (map_to_exists_mode("", LANGMAP, false)) { + if (map_to_exists_mode("", MODE_LANGMAP, false)) { // ":lmap" mappings exists, toggle use of mappings. - State ^= LANGMAP; + State ^= MODE_LANGMAP; if (s->b_im_ptr != NULL) { - if (State & LANGMAP) { + if (State & MODE_LANGMAP) { *s->b_im_ptr = B_IMODE_LMAP; } else { *s->b_im_ptr = B_IMODE_NONE; @@ -2305,7 +2310,7 @@ static int empty_pattern(char_u *p) // remove trailing \v and the like while (n >= 2 && p[n - 2] == '\\' - && vim_strchr((char_u *)"mMvVcCZ", p[n - 1]) != NULL) { + && vim_strchr("mMvVcCZ", p[n - 1]) != NULL) { n -= 2; } return n == 0 || (n >= 2 && p[n - 2] == '\\' && p[n - 1] == '|'); @@ -2330,8 +2335,7 @@ static int command_line_changed(CommandLineState *s) tv_dict_set_keys_readonly(dict); try_enter(&tstate); - apply_autocmds(EVENT_CMDLINECHANGED, (char_u *)firstcbuf, - (char_u *)firstcbuf, false, curbuf); + apply_autocmds(EVENT_CMDLINECHANGED, firstcbuf, firstcbuf, false, curbuf); restore_v_event(dict, &save_v_event); bool tl_ret = try_leave(&tstate, &err); @@ -2353,10 +2357,10 @@ static int command_line_changed(CommandLineState *s) && !vpeekc_any()) { // Show 'inccommand' preview. It works like this: // 1. Do the command. - // 2. Command implementation detects CMDPREVIEW state, then: + // 2. Command implementation detects MODE_CMDPREVIEW state, then: // - Update the screen while the effects are in place. // - Immediately undo the effects. - State |= CMDPREVIEW; + State |= MODE_CMDPREVIEW; emsg_silent++; // Block error reporting as the command may be incomplete msg_silent++; // Block messages, namely ones that prompt do_cmdline((char *)ccline.cmdbuff, NULL, NULL, DOCMD_KEEPLINE|DOCMD_NOWAIT|DOCMD_PREVIEW); @@ -2369,8 +2373,8 @@ static int command_line_changed(CommandLineState *s) update_topline(curwin); redrawcmdline(); - } else if (State & CMDPREVIEW) { - State = (State & ~CMDPREVIEW); + } else if (State & MODE_CMDPREVIEW) { + State = (State & ~MODE_CMDPREVIEW); close_preview_windows(); update_screen(SOME_VALID); // Clear 'inccommand' preview. } else { @@ -2522,7 +2526,7 @@ char *get_text_locked_msg(void) bool curbuf_locked(void) { if (curbuf->b_ro_locked > 0) { - emsg(_("E788: Not allowed to edit another buffer now")); + emsg(_(e_cannot_edit_other_buf)); return true; } return allbuf_locked(); @@ -2601,14 +2605,14 @@ static void correct_screencol(int idx, int cells, int *col) /// /// @param c normally ':', NUL for ":append" /// @param indent indent for inside conditionals -char_u *getexline(int c, void *cookie, int indent, bool do_concat) +char *getexline(int c, void *cookie, int indent, bool do_concat) { // When executing a register, remove ':' that's in front of each line. if (exec_from_reg && vpeekc() == ':') { (void)vgetc(); } - return getcmdline(c, 1L, indent, do_concat); + return (char *)getcmdline(c, 1L, indent, do_concat); } bool cmdline_overstrike(void) @@ -2675,7 +2679,7 @@ static void realloc_cmdbuff(int len) } } -static char_u *arshape_buf = NULL; +static char *arshape_buf = NULL; #if defined(EXITFREE) void free_arshape_buf(void) @@ -3073,11 +3077,11 @@ static void draw_cmdline(int start, int len) u8c = arabic_shape(u8c, NULL, &u8cc[0], pc, pc1, nc); - newlen += utf_char2bytes(u8c, (char *)arshape_buf + newlen); + newlen += utf_char2bytes(u8c, arshape_buf + newlen); if (u8cc[0] != 0) { - newlen += utf_char2bytes(u8cc[0], (char *)arshape_buf + newlen); + newlen += utf_char2bytes(u8cc[0], arshape_buf + newlen); if (u8cc[1] != 0) { - newlen += utf_char2bytes(u8cc[1], (char *)arshape_buf + newlen); + newlen += utf_char2bytes(u8cc[1], arshape_buf + newlen); } } } else { @@ -3087,7 +3091,7 @@ static void draw_cmdline(int start, int len) } } - msg_outtrans_len(arshape_buf, newlen); + msg_outtrans_len((char_u *)arshape_buf, newlen); } else { draw_cmdline_no_arabicshape: if (kv_size(ccline.last_colors.colors)) { @@ -4490,7 +4494,7 @@ static int expand_showtail(expand_T *xp) return FALSE; } - end = path_tail((char_u *)xp->xp_pattern); + end = (char_u *)path_tail(xp->xp_pattern); if (end == (char_u *)xp->xp_pattern) { // there is no path separator return false; } @@ -4499,9 +4503,9 @@ static int expand_showtail(expand_T *xp) // Skip escaped wildcards. Only when the backslash is not a path // separator, on DOS the '*' "path\*\file" must not be skipped. if (rem_backslash(s)) { - ++s; - } else if (vim_strchr((char_u *)"*?[", *s) != NULL) { - return FALSE; + s++; + } else if (vim_strchr("*?[", *s) != NULL) { + return false; } } return TRUE; @@ -4617,7 +4621,7 @@ char_u *addstar(char_u *fname, size_t len, int context) * ` could be anywhere in the file name. * When the name ends in '$' don't add a star, remove the '$'. */ - tail = path_tail(retval); + tail = (char_u *)path_tail((char *)retval); ends_in_star = (len > 0 && retval[len - 1] == '*'); #ifndef BACKSLASH_IN_FILENAME for (ssize_t k = (ssize_t)len - 2; k >= 0; k--) { @@ -4629,8 +4633,8 @@ char_u *addstar(char_u *fname, size_t len, int context) #endif if ((*retval != '~' || tail != retval) && !ends_in_star - && vim_strchr(tail, '$') == NULL - && vim_strchr(retval, '`') == NULL) { + && vim_strchr((char *)tail, '$') == NULL + && vim_strchr((char *)retval, '`') == NULL) { retval[len++] = '*'; } else if (len > 0 && retval[len - 1] == '$') { --len; @@ -4833,7 +4837,7 @@ static void cleanup_help_tags(int num_file, char_u **file) } } -typedef char_u *(*ExpandFunc)(expand_T *, int); +typedef char *(*ExpandFunc)(expand_T *, int); /// Do the expansion based on xp->xp_context and "pat". /// @@ -5002,7 +5006,7 @@ static int ExpandFromContext(expand_T *xp, char_u *pat, int *num_file, char_u ** return nlua_expand_pat(xp, pat, num_file, file); } - regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0); + regmatch.regprog = vim_regcomp((char *)pat, p_magic ? RE_MAGIC : 0); if (regmatch.regprog == NULL) { return FAIL; } @@ -5098,8 +5102,8 @@ static void ExpandGeneric(expand_T *xp, regmatch_T *regmatch, int *num_file, cha char_u *str; // count the number of matching names - for (i = 0;; ++i) { - str = (*func)(xp, i); + for (i = 0;; i++) { + str = (char_u *)(*func)(xp, i); if (str == NULL) { // end of list break; } @@ -5120,7 +5124,7 @@ static void ExpandGeneric(expand_T *xp, regmatch_T *regmatch, int *num_file, cha // copy the matching names into allocated memory count = 0; for (i = 0;; i++) { - str = (*func)(xp, i); + str = (char_u *)(*func)(xp, i); if (str == NULL) { // End of list. break; } @@ -5219,7 +5223,7 @@ static void expand_shellcmd(char_u *filepat, int *num_file, char_u ***file, int hashtab_T found_ht; hash_init(&found_ht); for (s = path;; s = e) { - e = vim_strchr(s, ENV_SEPCHAR); + e = (char_u *)vim_strchr((char *)s, ENV_SEPCHAR); if (e == NULL) { e = s + STRLEN(s); } @@ -5351,7 +5355,7 @@ static int ExpandUserDefined(expand_T *xp, regmatch_T *regmatch, int *num_file, ga_init(&ga, (int)sizeof(char *), 3); for (char_u *s = retstr; *s != NUL; s = e) { - e = vim_strchr(s, '\n'); + e = (char_u *)vim_strchr((char *)s, '\n'); if (e == NULL) { e = s + STRLEN(s); } @@ -5570,7 +5574,7 @@ static int ExpandPackAddDir(char_u *pat, int *num_file, char_u ***file) for (int i = 0; i < ga.ga_len; i++) { char_u *match = ((char_u **)ga.ga_data)[i]; - s = path_tail(match); + s = (char_u *)path_tail((char *)match); memmove(match, s, STRLEN(s) + 1); } @@ -5677,7 +5681,7 @@ static char *(history_names[]) = * Function given to ExpandGeneric() to obtain the possible first * arguments of the ":history command. */ -static char_u *get_history_arg(expand_T *xp, int idx) +static char *get_history_arg(expand_T *xp, int idx) { static char_u compl[2] = { NUL, NUL }; char *short_names = ":=@>?/"; @@ -5686,13 +5690,13 @@ static char_u *get_history_arg(expand_T *xp, int idx) if (idx < short_names_count) { compl[0] = (char_u)short_names[idx]; - return compl; + return (char *)compl; } if (idx < short_names_count + history_name_count) { - return (char_u *)history_names[idx - short_names_count]; + return history_names[idx - short_names_count]; } if (idx == short_names_count + history_name_count) { - return (char_u *)"all"; + return "all"; } return NULL; } @@ -5852,7 +5856,7 @@ HistoryType get_histtype(const char *const name, const size_t len, const bool re } } - if (vim_strchr((char_u *)":=@>?/", name[0]) != NULL && len == 1) { + if (vim_strchr(":=@>?/", name[0]) != NULL && len == 1) { return hist_char2type(name[0]); } @@ -5938,7 +5942,7 @@ int get_history_idx(int histype) /// ccline and put the previous value in ccline.prev_ccline. static struct cmdline_info *get_ccline_ptr(void) { - if ((State & CMDLINE) == 0) { + if ((State & MODE_CMDLINE) == 0) { return NULL; } else if (ccline.cmdbuff != NULL) { return &ccline; @@ -5959,9 +5963,9 @@ char_u *get_cmdline_completion(void) if (p != NULL && p->xpc != NULL) { set_expand_context(p->xpc); - char_u *cmd_compl = get_user_cmd_complete(p->xpc, p->xpc->xp_context); + char *cmd_compl = get_user_cmd_complete(p->xpc, p->xpc->xp_context); if (cmd_compl != NULL) { - return vim_strsave(cmd_compl); + return vim_strsave((char_u *)cmd_compl); } } @@ -6152,7 +6156,7 @@ int del_history_entry(int histype, char_u *str) && histype < HIST_COUNT && *str != NUL && (idx = hisidx[histype]) >= 0 - && (regmatch.regprog = vim_regcomp(str, RE_MAGIC + RE_STRING)) + && (regmatch.regprog = vim_regcomp((char *)str, RE_MAGIC + RE_STRING)) != NULL) { i = last = idx; do { @@ -6279,7 +6283,7 @@ void ex_history(exarg_T *eap) if (!(ascii_isdigit(*arg) || *arg == '-' || *arg == ',')) { end = arg; while (ASCII_ISALPHA(*end) - || vim_strchr((char_u *)":=@>/?", *end) != NULL) { + || vim_strchr(":=@>/?", *end) != NULL) { end++; } histype1 = get_histtype((const char *)arg, (size_t)(end - arg), false); @@ -6385,7 +6389,7 @@ static int open_cmdwin(void) int i; linenr_T lnum; garray_T winsizes; - char_u typestr[2]; + char typestr[2]; int save_restart_edit = restart_edit; int save_State = State; bool save_exmode = exmode_active; @@ -6438,8 +6442,8 @@ static int open_cmdwin(void) const int histtype = hist_char2type(cmdwin_type); if (histtype == HIST_CMD || histtype == HIST_DEBUG) { if (p_wc == TAB) { - add_map((char_u *)"<buffer> <Tab> <C-X><C-V>", INSERT, false); - add_map((char_u *)"<buffer> <Tab> a<C-X><C-V>", NORMAL, false); + add_map((char_u *)"<buffer> <Tab> <C-X><C-V>", MODE_INSERT, false); + add_map((char_u *)"<buffer> <Tab> a<C-X><C-V>", MODE_NORMAL, false); } set_option_value("ft", 0L, "vim", OPT_LOCAL); } @@ -6482,14 +6486,14 @@ static int open_cmdwin(void) // No Ex mode here! exmode_active = false; - State = NORMAL; + State = MODE_NORMAL; setmouse(); // Reset here so it can be set by a CmdWinEnter autocommand. cmdwin_result = 0; // Trigger CmdwinEnter autocommands. - typestr[0] = (char_u)cmdwin_type; + typestr[0] = (char)cmdwin_type; typestr[1] = NUL; apply_autocmds(EVENT_CMDWINENTER, typestr, typestr, false, curbuf); if (restart_edit != 0) { // autocmd with ":startinsert" @@ -6641,8 +6645,8 @@ char *script_get(exarg_T *const eap, size_t *const lenp) const char *const end_pattern = (cmd[2] != NUL ? (const char *)skipwhite(cmd + 2) : "."); for (;;) { - char *const theline = (char *)eap->getline(eap->cstack->cs_looplevel > 0 ? -1 : - NUL, eap->cookie, 0, true); + char *const theline = eap->getline(eap->cstack->cs_looplevel > 0 ? -1 : NUL, eap->cookie, 0, + true); if (theline == NULL || strcmp(end_pattern, theline) == 0) { xfree(theline); diff --git a/src/nvim/ex_getln.h b/src/nvim/ex_getln.h index fe2bf958b5..5da9febe71 100644 --- a/src/nvim/ex_getln.h +++ b/src/nvim/ex_getln.h @@ -48,7 +48,7 @@ typedef enum { /// Number of history tables #define HIST_COUNT (HIST_DEBUG + 1) -typedef char_u *(*CompleteListItemGetter)(expand_T *, int); +typedef char *(*CompleteListItemGetter)(expand_T *, int); /// History entry definition typedef struct hist_entry { diff --git a/src/nvim/ex_session.c b/src/nvim/ex_session.c index 1235087500..7eef6707dd 100644 --- a/src/nvim/ex_session.c +++ b/src/nvim/ex_session.c @@ -27,7 +27,7 @@ #include "nvim/fold.h" #include "nvim/getchar.h" #include "nvim/globals.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/move.h" #include "nvim/option.h" #include "nvim/os/input.h" @@ -571,7 +571,7 @@ static int makeopens(FILE *fd, char_u *dirnow) if (ssop_flags & SSOP_SESDIR) { PUTLINE_FAIL("exe \"cd \" . escape(expand(\"<sfile>:p:h\"), ' ')"); } else if (ssop_flags & SSOP_CURDIR) { - sname = home_replace_save(NULL, globaldir != NULL ? globaldir : dirnow); + sname = home_replace_save(NULL, globaldir != NULL ? (char_u *)globaldir : dirnow); char *fname_esc = ses_escape_fname((char *)sname, &ssop_flags); if (fprintf(fd, "cd %s\n", fname_esc) < 0) { xfree(fname_esc); @@ -930,7 +930,7 @@ void ex_mkrc(exarg_T *eap) viewFile = fname; using_vdir = true; } else if (*eap->arg != NUL) { - fname = (char *)eap->arg; + fname = eap->arg; } else if (eap->cmdidx == CMD_mkvimrc) { fname = VIMRC_FILE; } else if (eap->cmdidx == CMD_mksession) { @@ -997,7 +997,7 @@ void ex_mkrc(exarg_T *eap) } } else if (*dirnow != NUL && (ssop_flags & SSOP_CURDIR) && globaldir != NULL) { - if (os_chdir((char *)globaldir) == 0) { + if (os_chdir(globaldir) == 0) { shorten_fnames(true); } } @@ -1012,15 +1012,6 @@ void ex_mkrc(exarg_T *eap) emsg(_(e_prev_dir)); } shorten_fnames(true); - // restore original dir - if (*dirnow != NUL && ((ssop_flags & SSOP_SESDIR) - || ((ssop_flags & SSOP_CURDIR) && globaldir != - NULL))) { - if (os_chdir((char *)dirnow) != 0) { - emsg(_(e_prev_dir)); - } - shorten_fnames(true); - } } xfree(dirnow); } else { diff --git a/src/nvim/file_search.c b/src/nvim/file_search.c index 6a3acef91d..47e20d58a3 100644 --- a/src/nvim/file_search.c +++ b/src/nvim/file_search.c @@ -298,7 +298,7 @@ void *vim_findfile_init(char_u *path, char_u *filename, char_u *stopdirs, int le && (vim_ispathsep(path[1]) || path[1] == NUL) && (!tagfile || vim_strchr(p_cpo, CPO_DOTTAG) == NULL) && rel_fname != NULL) { - size_t len = (size_t)(path_tail(rel_fname) - rel_fname); + size_t len = (size_t)((char_u *)path_tail((char *)rel_fname) - rel_fname); if (!vim_isAbsName(rel_fname) && len + 1 < MAXPATHL) { // Make the start dir an absolute path name. @@ -371,7 +371,7 @@ void *vim_findfile_init(char_u *path, char_u *filename, char_u *stopdirs, int le ptr = xrealloc(search_ctx->ffsc_stopdirs_v, (dircount + 1) * sizeof(char_u *)); search_ctx->ffsc_stopdirs_v = ptr; - walker = vim_strchr(walker, ';'); + walker = (char_u *)vim_strchr((char *)walker, ';'); if (walker) { assert(walker - helper >= 0); search_ctx->ffsc_stopdirs_v[dircount - 1] = @@ -396,7 +396,7 @@ void *vim_findfile_init(char_u *path, char_u *filename, char_u *stopdirs, int le * -fix path * -wildcard_stuff (might be NULL) */ - wc_part = vim_strchr(path, '*'); + wc_part = (char_u *)vim_strchr((char *)path, '*'); if (wc_part != NULL) { int64_t llevel; int len; @@ -477,7 +477,7 @@ void *vim_findfile_init(char_u *path, char_u *filename, char_u *stopdirs, int le STRCAT(ff_expand_buffer, search_ctx->ffsc_fix_path); add_pathsep((char *)ff_expand_buffer); } else { - char_u *p = path_tail(search_ctx->ffsc_fix_path); + char_u *p = (char_u *)path_tail((char *)search_ctx->ffsc_fix_path); char_u *wc_path = NULL; char_u *temp = NULL; int len = 0; @@ -1481,7 +1481,7 @@ char_u *find_file_in_path_option(char_u *ptr, size_t len, int options, int first && rel_fname != NULL && STRLEN(rel_fname) + l < MAXPATHL) { STRCPY(NameBuff, rel_fname); - STRCPY(path_tail(NameBuff), ff_file_to_find); + STRCPY(path_tail((char *)NameBuff), ff_file_to_find); l = STRLEN(NameBuff); } else { STRCPY(NameBuff, ff_file_to_find); @@ -1643,7 +1643,7 @@ void do_autocmd_dirchanged(char *new_dir, CdScope scope, CdCause cause, bool pre abort(); } - apply_autocmds(event, (char_u *)buf, (char_u *)new_dir, false, curbuf); + apply_autocmds(event, buf, new_dir, false, curbuf); restore_v_event(dict, &save_v_event); diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index a132c2db43..06d72f3395 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -173,7 +173,7 @@ void filemess(buf_T *buf, char_u *name, char_u *s, int attr) /// @param eap can be NULL! /// /// @return FAIL for failure, NOTDONE for directory (failure), or OK -int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_skip, +int readfile(char *fname, char *sfname, linenr_T from, linenr_T lines_to_skip, linenr_T lines_to_read, exarg_T *eap, int flags, bool silent) { int fd = stdin_fd >= 0 ? stdin_fd : 0; @@ -189,10 +189,10 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski colnr_T read_buf_col = 0; // next char to read from this line char_u c; linenr_T lnum = from; - char_u *ptr = NULL; // pointer into read buffer - char_u *buffer = NULL; // read buffer - char_u *new_buffer = NULL; // init to shut up gcc - char_u *line_start = NULL; // init to shut up gcc + char *ptr = NULL; // pointer into read buffer + char *buffer = NULL; // read buffer + char *new_buffer = NULL; // init to shut up gcc + char *line_start = NULL; // init to shut up gcc int wasempty; // buffer was empty before reading colnr_T len; long size = 0; @@ -227,11 +227,11 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski int bad_char_behavior = BAD_REPLACE; // BAD_KEEP, BAD_DROP or character to // replace with - char_u *tmpname = NULL; // name of 'charconvert' output file + char *tmpname = NULL; // name of 'charconvert' output file int fio_flags = 0; - char_u *fenc; // fileencoding to use + char *fenc; // fileencoding to use bool fenc_alloced; // fenc_next is in allocated memory - char_u *fenc_next = NULL; // next item in 'fencs' or NULL + char *fenc_next = NULL; // next item in 'fencs' or NULL bool advance_fenc = false; long real_size = 0; #ifdef HAVE_ICONV @@ -241,12 +241,12 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski #endif bool converted = false; // true if conversion done bool notconverted = false; // true if conversion wanted but it wasn't possible - char_u conv_rest[CONV_RESTLEN]; + char conv_rest[CONV_RESTLEN]; int conv_restlen = 0; // nr of bytes in conv_rest[] pos_T orig_start; buf_T *old_curbuf; - char_u *old_b_ffname; - char_u *old_b_fname; + char *old_b_ffname; + char *old_b_fname; int using_b_ffname; int using_b_fname; static char *msg_is_a_directory = N_("is a directory"); @@ -266,7 +266,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski && fname != NULL && vim_strchr(p_cpo, CPO_FNAMER) != NULL && !(flags & READ_DUMMY)) { - if (set_rw_fname(fname, sfname) == FAIL) { + if (set_rw_fname((char_u *)fname, (char_u *)sfname) == FAIL) { return FAIL; } } @@ -276,10 +276,10 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski // executing nasty autocommands. Also check if "fname" and "sfname" // point to one of these values. old_curbuf = curbuf; - old_b_ffname = curbuf->b_ffname; + old_b_ffname = (char *)curbuf->b_ffname; old_b_fname = curbuf->b_fname; - using_b_ffname = (fname == curbuf->b_ffname) - || (sfname == curbuf->b_ffname); + using_b_ffname = ((char_u *)fname == curbuf->b_ffname) + || ((char_u *)sfname == curbuf->b_ffname); using_b_fname = (fname == curbuf->b_fname) || (sfname == curbuf->b_fname); // After reading a file the cursor line changes but we don't want to @@ -347,7 +347,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski // If the name is too long we might crash further on, quit here. if (namelen >= MAXPATHL) { - filemess(curbuf, fname, (char_u *)_("Illegal file name"), 0); + filemess(curbuf, (char_u *)fname, (char_u *)_("Illegal file name"), 0); msg_end(); msg_scroll = msg_save; return FAIL; @@ -356,9 +356,9 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski // If the name ends in a path separator, we can't open it. Check here, // because reading the file may actually work, but then creating the // swap file may destroy it! Reported on MS-DOS and Win 95. - if (after_pathsep((const char *)fname, (const char *)(fname + namelen))) { + if (after_pathsep(fname, fname + namelen)) { if (!silent) { - filemess(curbuf, fname, (char_u *)_(msg_is_a_directory), 0); + filemess(curbuf, (char_u *)fname, (char_u *)_(msg_is_a_directory), 0); } msg_end(); msg_scroll = msg_save; @@ -367,23 +367,23 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski } if (!read_buffer && !read_stdin && !read_fifo) { - perm = os_getperm((const char *)fname); + perm = os_getperm(fname); // On Unix it is possible to read a directory, so we have to // check for it before os_open(). if (perm >= 0 && !S_ISREG(perm) // not a regular file ... && !S_ISFIFO(perm) // ... or fifo && !S_ISSOCK(perm) // ... or socket #ifdef OPEN_CHR_FILES - && !(S_ISCHR(perm) && is_dev_fd_file(fname)) + && !(S_ISCHR(perm) && is_dev_fd_file((char_u *)fname)) // ... or a character special file named /dev/fd/<n> #endif ) { if (S_ISDIR(perm)) { if (!silent) { - filemess(curbuf, fname, (char_u *)_(msg_is_a_directory), 0); + filemess(curbuf, (char_u *)fname, (char_u *)_(msg_is_a_directory), 0); } } else { - filemess(curbuf, fname, (char_u *)_("is not a file"), 0); + filemess(curbuf, (char_u *)fname, (char_u *)_("is not a file"), 0); } msg_end(); msg_scroll = msg_save; @@ -407,7 +407,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski if (newfile && !read_stdin && !read_buffer && !read_fifo) { // Remember time of file. - if (os_fileinfo((char *)fname, &file_info)) { + if (os_fileinfo(fname, &file_info)) { buf_store_file_info(curbuf, &file_info); curbuf->b_mtime_read = curbuf->b_mtime; curbuf->b_mtime_read_ns = curbuf->b_mtime_ns; @@ -443,10 +443,10 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski bool file_readonly = false; if (!read_buffer && !read_stdin) { if (!newfile || readonlymode || !(perm & 0222) - || !os_file_is_writable((char *)fname)) { + || !os_file_is_writable(fname)) { file_readonly = true; } - fd = os_open((char *)fname, O_RDONLY, 0); + fd = os_open(fname, O_RDONLY, 0); } if (fd < 0) { // cannot open at all @@ -467,7 +467,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski // SwapExists autocommand may mess things up if (curbuf != old_curbuf || (using_b_ffname - && (old_b_ffname != curbuf->b_ffname)) + && ((char_u *)old_b_ffname != curbuf->b_ffname)) || (using_b_fname && (old_b_fname != curbuf->b_fname))) { emsg(_(e_auchangedbuf)); @@ -475,10 +475,10 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski } } if (!silent) { - if (dir_of_file_exists(fname)) { - filemess(curbuf, sfname, (char_u *)new_file_message(), 0); + if (dir_of_file_exists((char_u *)fname)) { + filemess(curbuf, (char_u *)sfname, (char_u *)new_file_message(), 0); } else { - filemess(curbuf, sfname, (char_u *)_("[New DIRECTORY]"), 0); + filemess(curbuf, (char_u *)sfname, (char_u *)_("[New DIRECTORY]"), 0); } } // Even though this is a new file, it might have been @@ -498,15 +498,16 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski } return OK; // a new file is not an error } else { - filemess(curbuf, sfname, (char_u *)( - (fd == UV_EFBIG) ? _("[File too big]") : + filemess(curbuf, (char_u *)sfname, (char_u *)((fd == UV_EFBIG) ? _("[File too big]") : #if defined(UNIX) && defined(EOVERFLOW) - // libuv only returns -errno in Unix and in Windows open() does not - // set EOVERFLOW - (fd == -EOVERFLOW) ? _("[File too big]") : + // libuv only returns -errno + // in Unix and in Windows + // open() does not set + // EOVERFLOW + (fd == -EOVERFLOW) ? _("[File too big]") : #endif - _("[Permission Denied]")), 0); - curbuf->b_p_ro = TRUE; // must use "w!" now + _("[Permission Denied]")), 0); + curbuf->b_p_ro = true; // must use "w!" now } return FAIL; @@ -538,7 +539,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski check_need_swap(newfile); if (!read_stdin && (curbuf != old_curbuf - || (using_b_ffname && (old_b_ffname != curbuf->b_ffname)) + || (using_b_ffname && ((char_u *)old_b_ffname != curbuf->b_ffname)) || (using_b_fname && (old_b_fname != curbuf->b_fname)))) { emsg(_(e_auchangedbuf)); if (!read_buffer) { @@ -644,10 +645,10 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski * (cd for example) if it invalidates fname or sfname. */ if (!read_stdin && (curbuf != old_curbuf - || (using_b_ffname && (old_b_ffname != curbuf->b_ffname)) + || (using_b_ffname && ((char_u *)old_b_ffname != curbuf->b_ffname)) || (using_b_fname && (old_b_fname != curbuf->b_fname)) - || (fd = os_open((char *)fname, O_RDONLY, 0)) < 0)) { - --no_wait_return; + || (fd = os_open(fname, O_RDONLY, 0)) < 0)) { + no_wait_return--; msg_scroll = msg_save; if (fd < 0) { emsg(_("E200: *ReadPre autocommands made the file unreadable")); @@ -664,7 +665,7 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski if (!recoverymode && !filtering && !(flags & READ_DUMMY) && !silent) { if (!read_stdin && !read_buffer) { - filemess(curbuf, sfname, (char_u *)"", 0); + filemess(curbuf, (char_u *)sfname, (char_u *)"", 0); } } @@ -690,27 +691,27 @@ int readfile(char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_ski * Decide which 'encoding' to use or use first. */ if (eap != NULL && eap->force_enc != 0) { - fenc = enc_canonize((char_u *)eap->cmd + eap->force_enc); + fenc = (char *)enc_canonize((char_u *)eap->cmd + eap->force_enc); fenc_alloced = true; keep_dest_enc = true; } else if (curbuf->b_p_bin) { - fenc = (char_u *)""; // binary: don't convert + fenc = ""; // binary: don't convert fenc_alloced = false; } else if (curbuf->b_help) { // Help files are either utf-8 or latin1. Try utf-8 first, if this // fails it must be latin1. // It is needed when the first line contains non-ASCII characters. // That is only in *.??x files. - fenc_next = (char_u *)"latin1"; - fenc = (char_u *)"utf-8"; + fenc_next = "latin1"; + fenc = "utf-8"; fenc_alloced = false; } else if (*p_fencs == NUL) { - fenc = curbuf->b_p_fenc; // use format from buffer + fenc = (char *)curbuf->b_p_fenc; // use format from buffer fenc_alloced = false; } else { - fenc_next = p_fencs; // try items in 'fileencodings' - fenc = next_fenc(&fenc_next, &fenc_alloced); + fenc_next = (char *)p_fencs; // try items in 'fileencodings' + fenc = (char *)next_fenc((char_u **)&fenc_next, &fenc_alloced); } /* @@ -797,21 +798,21 @@ retry: if (fenc_alloced) { xfree(fenc); } - fenc = (char_u *)""; + fenc = ""; fenc_alloced = false; } else { if (fenc_alloced) { xfree(fenc); } if (fenc_next != NULL) { - fenc = next_fenc(&fenc_next, &fenc_alloced); + fenc = (char *)next_fenc((char_u **)&fenc_next, &fenc_alloced); } else { - fenc = (char_u *)""; + fenc = ""; fenc_alloced = false; } } if (tmpname != NULL) { - os_remove((char *)tmpname); // delete converted file + os_remove(tmpname); // delete converted file XFREE_CLEAR(tmpname); } } @@ -821,7 +822,7 @@ retry: * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4. */ fio_flags = 0; - converted = need_conversion(fenc); + converted = need_conversion((char_u *)fenc); if (converted) { // "ucs-bom" means we need to check the first bytes of the file // for a BOM. @@ -835,7 +836,7 @@ retry: // appears not to handle this correctly. This works just like // conversion to UTF-8 except how the resulting character is put in // the buffer. - fio_flags = get_fio_flags(fenc); + fio_flags = get_fio_flags((char_u *)fenc); } @@ -843,7 +844,7 @@ retry: // Try using iconv() if we can't convert internally. if (fio_flags == 0 && !did_iconv) { - iconv_fd = (iconv_t)my_iconv_open((char_u *)"utf-8", fenc); + iconv_fd = (iconv_t)my_iconv_open((char_u *)"utf-8", (char_u *)fenc); } #endif @@ -863,7 +864,7 @@ retry: // Skip conversion when it's already done (retry for wrong // "fileformat"). if (tmpname == NULL) { - tmpname = readfile_charconvert(fname, fenc, &fd); + tmpname = (char *)readfile_charconvert((char_u *)fname, (char_u *)fenc, &fd); if (tmpname == NULL) { // Conversion failed. Try another one. advance_fenc = true; @@ -1128,8 +1129,8 @@ retry: if (size < 2 || curbuf->b_p_bin) { ccname = NULL; } else { - ccname = check_for_bom(ptr, size, &blen, - fio_flags == FIO_UCSBOM ? FIO_ALL : get_fio_flags(fenc)); + ccname = check_for_bom((char_u *)ptr, size, &blen, + fio_flags == FIO_UCSBOM ? FIO_ALL : get_fio_flags((char_u *)fenc)); } if (ccname != NULL) { // Remove BOM from the text @@ -1151,7 +1152,7 @@ retry: if (fenc_alloced) { xfree(fenc); } - fenc = ccname; + fenc = (char *)ccname; fenc_alloced = false; } // retry reading without getting new bytes or rewinding @@ -1182,10 +1183,10 @@ retry: size_t from_size; size_t to_size; - fromp = (char *)ptr; + fromp = ptr; from_size = size; ptr += size; - top = (char *)ptr; + top = ptr; to_size = real_size - size; /* @@ -1201,8 +1202,7 @@ retry: goto rewind_retry; } if (conv_error == 0) { - conv_error = readfile_linenr(linecnt, - ptr, (char_u *)top); + conv_error = readfile_linenr(linecnt, (char_u *)ptr, (char_u *)top); } // Deal with a bad byte and continue with the next. @@ -1227,14 +1227,14 @@ retry: // move the linerest to before the converted characters line_start = ptr - linerest; memmove(line_start, buffer, (size_t)linerest); - size = ((char_u *)top - ptr); + size = (top - ptr); } #endif if (fio_flags != 0) { unsigned int u8c; - char_u *dest; - char_u *tail = NULL; + char *dest; + char *tail = NULL; // Convert Unicode or Latin1 to UTF-8. // Go from end to start through the buffer, because the number @@ -1243,7 +1243,7 @@ retry: // to after the next character to convert. dest = ptr + real_size; if (fio_flags == FIO_LATIN1 || fio_flags == FIO_UTF8) { - p = ptr + size; + p = (uint8_t *)ptr + size; if (fio_flags == FIO_UTF8) { // Check for a trailing incomplete UTF-8 sequence tail = ptr + size - 1; @@ -1253,16 +1253,16 @@ retry: if (tail + utf_byte2len(*tail) <= ptr + size) { tail = NULL; } else { - p = tail; + p = (uint8_t *)tail; } } } else if (fio_flags & (FIO_UCS2 | FIO_UTF16)) { // Check for a trailing byte - p = ptr + (size & ~1); + p = (uint8_t *)ptr + (size & ~1); if (size & 1) { - tail = p; + tail = (char *)p; } - if ((fio_flags & FIO_UTF16) && p > ptr) { + if ((fio_flags & FIO_UTF16) && p > (uint8_t *)ptr) { // Check for a trailing leading word if (fio_flags & FIO_ENDIAN_L) { u8c = (*--p << 8); @@ -1272,16 +1272,16 @@ retry: u8c += (*--p << 8); } if (u8c >= 0xd800 && u8c <= 0xdbff) { - tail = p; + tail = (char *)p; } else { p += 2; } } } else { // FIO_UCS4 // Check for trailing 1, 2 or 3 bytes - p = ptr + (size & ~3); + p = (uint8_t *)ptr + (size & ~3); if (size & 3) { - tail = p; + tail = (char *)p; } } @@ -1294,7 +1294,7 @@ retry: } - while (p > ptr) { + while (p > (uint8_t *)ptr) { if (fio_flags & FIO_LATIN1) { u8c = *--p; } else if (fio_flags & (FIO_UCS2 | FIO_UTF16)) { @@ -1309,14 +1309,13 @@ retry: && u8c >= 0xdc00 && u8c <= 0xdfff) { int u16c; - if (p == ptr) { + if (p == (uint8_t *)ptr) { // Missing leading word. if (can_retry) { goto rewind_retry; } if (conv_error == 0) { - conv_error = readfile_linenr(linecnt, - ptr, p); + conv_error = readfile_linenr(linecnt, (char_u *)ptr, p); } if (bad_char_behavior == BAD_DROP) { continue; @@ -1344,8 +1343,7 @@ retry: goto rewind_retry; } if (conv_error == 0) { - conv_error = readfile_linenr(linecnt, - ptr, p); + conv_error = readfile_linenr(linecnt, (char_u *)ptr, p); } if (bad_char_behavior == BAD_DROP) { continue; @@ -1375,7 +1373,7 @@ retry: if (*--p < 0x80) { u8c = *p; } else { - len = utf_head_off(ptr, p); + len = utf_head_off((char_u *)ptr, p); p -= len; u8c = utf_ptr2char((char *)p); if (len == 0) { @@ -1386,8 +1384,7 @@ retry: goto rewind_retry; } if (conv_error == 0) { - conv_error = readfile_linenr(linecnt, - ptr, p); + conv_error = readfile_linenr(linecnt, (char_u *)ptr, p); } if (bad_char_behavior == BAD_DROP) { continue; @@ -1401,7 +1398,7 @@ retry: assert(u8c <= INT_MAX); // produce UTF-8 dest -= utf_char2len((int)u8c); - (void)utf_char2bytes((int)u8c, (char *)dest); + (void)utf_char2bytes((int)u8c, dest); } // move the linerest to before the converted characters @@ -1413,8 +1410,8 @@ retry: bool incomplete_tail = false; // Reading UTF-8: Check if the bytes are valid UTF-8. - for (p = ptr;; p++) { - int todo = (int)((ptr + size) - p); + for (p = (uint8_t *)ptr;; p++) { + int todo = (int)(((uint8_t *)ptr + size) - p); int l; if (todo <= 0) { @@ -1431,13 +1428,13 @@ retry: // a truncated file is more likely, or attempting // to read the rest of an incomplete sequence when // we have already done so. - if (p > ptr || filesize > 0) { + if (p > (uint8_t *)ptr || filesize > 0) { incomplete_tail = true; } // Incomplete byte sequence, move it to conv_rest[] // and try to read the rest of it, unless we've // already done so. - if (p > ptr) { + if (p > (uint8_t *)ptr) { conv_restlen = todo; memmove(conv_rest, p, conv_restlen); size -= conv_restlen; @@ -1454,12 +1451,12 @@ retry: #ifdef HAVE_ICONV // When we did a conversion report an error. if (iconv_fd != (iconv_t)-1 && conv_error == 0) { - conv_error = readfile_linenr(linecnt, ptr, p); + conv_error = readfile_linenr(linecnt, (char_u *)ptr, p); } #endif // Remember the first linenr with an illegal byte if (conv_error == 0 && illegal_byte == 0) { - illegal_byte = readfile_linenr(linecnt, ptr, p); + illegal_byte = readfile_linenr(linecnt, (char_u *)ptr, p); } // Drop, keep or replace the bad byte. @@ -1475,7 +1472,7 @@ retry: } } } - if (p < ptr + size && !incomplete_tail) { + if (p < (uint8_t *)ptr + size && !incomplete_tail) { // Detected a UTF-8 error. rewind_retry: // Retry reading with another conversion. @@ -1509,10 +1506,10 @@ rewind_retry: try_mac = 1; } - for (p = ptr; p < ptr + size; ++p) { + for (p = (uint8_t *)ptr; p < (uint8_t *)ptr + size; p++) { if (*p == NL) { if (!try_unix - || (try_dos && p > ptr && p[-1] == CAR)) { + || (try_dos && p > (uint8_t *)ptr && p[-1] == CAR)) { fileformat = EOL_DOS; } else { fileformat = EOL_UNIX; @@ -1528,9 +1525,9 @@ rewind_retry: // Need to reset the counters when retrying fenc. try_mac = 1; try_unix = 1; - for (; p >= ptr && *p != CAR; p--) {} - if (p >= ptr) { - for (p = ptr; p < ptr + size; ++p) { + for (; p >= (uint8_t *)ptr && *p != CAR; p--) {} + if (p >= (uint8_t *)ptr) { + for (p = (uint8_t *)ptr; p < (uint8_t *)ptr + size; p++) { if (*p == NL) { try_unix++; } else if (*p == CAR) { @@ -1584,12 +1581,12 @@ rewind_retry: if (skip_count == 0) { *ptr = NUL; // end of line len = (colnr_T)(ptr - line_start + 1); - if (ml_append(lnum, (char *)line_start, len, newfile) == FAIL) { + if (ml_append(lnum, line_start, len, newfile) == FAIL) { error = true; break; } if (read_undo_file) { - sha256_update(&sha_ctx, line_start, len); + sha256_update(&sha_ctx, (char_u *)line_start, len); } ++lnum; if (--read_count == 0) { @@ -1640,12 +1637,12 @@ rewind_retry: ff_error = EOL_DOS; } } - if (ml_append(lnum, (char *)line_start, len, newfile) == FAIL) { + if (ml_append(lnum, line_start, len, newfile) == FAIL) { error = true; break; } if (read_undo_file) { - sha256_update(&sha_ctx, line_start, len); + sha256_update(&sha_ctx, (char_u *)line_start, len); } ++lnum; if (--read_count == 0) { @@ -1688,11 +1685,11 @@ failed: } *ptr = NUL; len = (colnr_T)(ptr - line_start + 1); - if (ml_append(lnum, (char *)line_start, len, newfile) == FAIL) { + if (ml_append(lnum, line_start, len, newfile) == FAIL) { error = true; } else { if (read_undo_file) { - sha256_update(&sha_ctx, line_start, len); + sha256_update(&sha_ctx, (char_u *)line_start, len); } read_no_eol_lnum = ++lnum; } @@ -1703,7 +1700,7 @@ failed: save_file_ff(curbuf); // If editing a new file: set 'fenc' for the current buffer. // Also for ":read ++edit file". - set_string_option_direct("fenc", -1, fenc, OPT_FREE | OPT_LOCAL, 0); + set_string_option_direct("fenc", -1, (char_u *)fenc, OPT_FREE | OPT_LOCAL, 0); } if (fenc_alloced) { xfree(fenc); @@ -1738,7 +1735,7 @@ failed: } if (tmpname != NULL) { - os_remove((char *)tmpname); // delete converted file + os_remove(tmpname); // delete converted file xfree(tmpname); } --no_wait_return; // may wait for return now @@ -1783,7 +1780,7 @@ failed: if (got_int) { if (!(flags & READ_DUMMY)) { - filemess(curbuf, sfname, (char_u *)_(e_interr), 0); + filemess(curbuf, (char_u *)sfname, (char_u *)_(e_interr), 0); if (newfile) { curbuf->b_p_ro = TRUE; // must use "w!" now } @@ -1932,7 +1929,7 @@ failed: char_u hash[UNDO_HASH_SIZE]; sha256_finish(&sha_ctx, hash); - u_read_undo(NULL, hash, fname); + u_read_undo(NULL, hash, (char_u *)fname); } if (!read_stdin && !read_fifo && (!read_buffer || sfname != NULL)) { @@ -1960,8 +1957,7 @@ failed: if (!au_did_filetype && *curbuf->b_p_ft != NUL) { // EVENT_FILETYPE was not triggered but the buffer already has a // filetype. Trigger EVENT_FILETYPE using the existing filetype. - apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft, curbuf->b_fname, - true, curbuf); + apply_autocmds(EVENT_FILETYPE, (char *)curbuf->b_p_ft, curbuf->b_fname, true, curbuf); } } else { apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname, @@ -1993,7 +1989,7 @@ bool is_dev_fd_file(char_u *fname) { return STRNCMP(fname, "/dev/fd/", 8) == 0 && ascii_isdigit(fname[8]) - && *skipdigits(fname + 9) == NUL + && *skipdigits((char *)fname + 9) == NUL && (fname[9] != NUL || (fname[8] != '0' && fname[8] != '1' && fname[8] != '2')); } @@ -2087,7 +2083,7 @@ static char_u *next_fenc(char_u **pp, bool *alloced) *pp = NULL; return (char_u *)""; } - p = vim_strchr(*pp, ','); + p = (char_u *)vim_strchr((char *)(*pp), ','); if (p == NULL) { r = enc_canonize(*pp); *pp += STRLEN(*pp); @@ -2188,18 +2184,18 @@ char *new_file_message(void) /// @param append append to the file /// /// @return FAIL for failure, OK otherwise -int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_T end, exarg_T *eap, +int buf_write(buf_T *buf, char *fname, char *sfname, linenr_T start, linenr_T end, exarg_T *eap, int append, int forceit, int reset_changed, int filtering) { int fd; - char_u *backup = NULL; - int backup_copy = FALSE; // copy the original file? + char *backup = NULL; + int backup_copy = false; // copy the original file? int dobackup; - char_u *ffname; - char_u *wfname = NULL; // name of file to write to - char_u *s; - char_u *ptr; - char_u c; + char *ffname; + char *wfname = NULL; // name of file to write to + char *s; + char *ptr; + char c; int len; linenr_T lnum; long nchars; @@ -2213,9 +2209,9 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ char *errmsg = NULL; int errmsgarg = 0; bool errmsg_allocated = false; - char_u *buffer; - char_u smallbuf[SMBUFSIZE]; - char_u *backup_ext; + char *buffer; + char smallbuf[SMBUFSIZE]; + char *backup_ext; int bufsize; long perm; // file permissions int retval = OK; @@ -2238,10 +2234,10 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ int fileformat; int write_bin; struct bw_info write_info; // info for buf_write_bytes() - int converted = FALSE; - int notconverted = FALSE; - char_u *fenc; // effective 'fileencoding' - char_u *fenc_tofree = NULL; // allocated "fenc" + int converted = false; + int notconverted = false; + char *fenc; // effective 'fileencoding' + char *fenc_tofree = NULL; // allocated "fenc" #ifdef HAS_BW_FLAGS int wb_flags = 0; #endif @@ -2307,7 +2303,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ && !filtering && (!append || vim_strchr(p_cpo, CPO_FNAMEAPP) != NULL) && vim_strchr(p_cpo, CPO_FNAMEW) != NULL) { - if (set_rw_fname(fname, sfname) == FAIL) { + if (set_rw_fname((char_u *)fname, (char_u *)sfname) == FAIL) { return FAIL; } buf = curbuf; // just in case autocmds made "buf" invalid @@ -2358,17 +2354,17 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * Set curbuf to the buffer to be written. * Careful: The autocommands may call buf_write() recursively! */ - if (ffname == buf->b_ffname) { - buf_ffname = TRUE; + if ((char_u *)ffname == buf->b_ffname) { + buf_ffname = true; } - if (sfname == buf->b_sfname) { - buf_sfname = TRUE; + if ((char_u *)sfname == buf->b_sfname) { + buf_sfname = true; } - if (fname == buf->b_ffname) { - buf_fname_f = TRUE; + if ((char_u *)fname == buf->b_ffname) { + buf_fname_f = true; } - if (fname == buf->b_sfname) { - buf_fname_s = TRUE; + if ((char_u *)fname == buf->b_sfname) { + buf_fname_s = true; } // Set curwin/curbuf to buf and save a few things. @@ -2469,8 +2465,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ } if (reset_changed && buf->b_changed && !append && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL)) { - /* Buffer still changed, the autocommands didn't work - * properly. */ + // Buffer still changed, the autocommands didn't work properly. return FAIL; } return OK; @@ -2508,16 +2503,16 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * be kept in fname, ffname and sfname. */ if (buf_ffname) { - ffname = buf->b_ffname; + ffname = (char *)buf->b_ffname; } if (buf_sfname) { - sfname = buf->b_sfname; + sfname = (char *)buf->b_sfname; } if (buf_fname_f) { - fname = buf->b_ffname; + fname = (char *)buf->b_ffname; } if (buf_fname_s) { - fname = buf->b_sfname; + fname = (char *)buf->b_sfname; } } @@ -2535,9 +2530,9 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ if (!filtering) { filemess(buf, #ifndef UNIX - sfname, + (char_u *)sfname, #else - fname, + (char_u *)fname, #endif (char_u *)"", 0); // show that we are busy } @@ -2559,8 +2554,8 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ FileInfo file_info_old; #if defined(UNIX) perm = -1; - if (!os_fileinfo((char *)fname, &file_info_old)) { - newfile = TRUE; + if (!os_fileinfo(fname, &file_info_old)) { + newfile = true; } else { perm = file_info_old.stat.st_mode; if (!S_ISREG(file_info_old.stat.st_mode)) { // not a file @@ -2568,7 +2563,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ SET_ERRMSG_NUM("E502", _("is a directory")); goto fail; } - if (os_nodetype((char *)fname) != NODE_WRITABLE) { + if (os_nodetype(fname) != NODE_WRITABLE) { SET_ERRMSG_NUM("E503", _("is not a file or writable device")); goto fail; } @@ -2609,7 +2604,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * Check if the file is really writable (when renaming the file to * make a backup we won't discover it later). */ - file_readonly = !os_file_is_writable((char *)fname); + file_readonly = !os_file_is_writable(fname); if (!forceit && file_readonly) { if (vim_strchr(p_cpo, CPO_FWRITE) != NULL) { @@ -2636,7 +2631,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * For systems that support ACL: get the ACL from the original file. */ if (!newfile) { - acl = mch_get_acl(fname); + acl = mch_get_acl((char_u *)fname); } #endif @@ -2644,8 +2639,8 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * If 'backupskip' is not empty, don't make a backup for some files. */ dobackup = (p_wb || p_bk || *p_pm != NUL); - if (dobackup && *p_bsk != NUL && match_file_list(p_bsk, sfname, ffname)) { - dobackup = FALSE; + if (dobackup && *p_bsk != NUL && match_file_list(p_bsk, (char_u *)sfname, (char_u *)ffname)) { + dobackup = false; } /* @@ -2683,7 +2678,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * - we don't have write permission in the directory */ if (os_fileinfo_hardlinks(&file_info_old) > 1 - || !os_fileinfo_link((char *)fname, &file_info) + || !os_fileinfo_link(fname, &file_info) || !os_fileinfo_id_equal(&file_info, &file_info_old)) { backup_copy = TRUE; } else { @@ -2695,7 +2690,9 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ */ STRCPY(IObuff, fname); for (i = 4913;; i += 123) { - sprintf((char *)path_tail(IObuff), "%d", i); + char *tail = path_tail((char *)IObuff); + size_t size = (char_u *)tail - IObuff; + snprintf(tail, IOSIZE - size, "%d", i); if (!os_fileinfo_link((char *)IObuff, &file_info)) { break; } @@ -2727,7 +2724,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ */ if ((bkc & BKC_BREAKSYMLINK) || (bkc & BKC_BREAKHARDLINK)) { #ifdef UNIX - bool file_info_link_ok = os_fileinfo_link((char *)fname, &file_info); + bool file_info_link_ok = os_fileinfo_link(fname, &file_info); // Symlinks. if ((bkc & BKC_BREAKSYMLINK) @@ -2748,17 +2745,17 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ // make sure we have a valid backup extension to use if (*p_bex == NUL) { - backup_ext = (char_u *)".bak"; + backup_ext = ".bak"; } else { - backup_ext = p_bex; + backup_ext = (char *)p_bex; } if (backup_copy) { - char_u *wp; + char *wp; int some_error = false; - char_u *dirp; - char_u *rootname; - char_u *p; + char *dirp; + char *rootname; + char *p; /* * Try to make the backup in each directory in the 'bdir' option. @@ -2772,14 +2769,14 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ * For these reasons, the existing writable file must be truncated * and reused. Creation of a backup COPY will be attempted. */ - dirp = p_bdir; + dirp = (char *)p_bdir; while (*dirp) { /* * Isolate one directory name, using an entry in 'bdir'. */ - size_t dir_len = copy_option_part(&dirp, IObuff, IOSIZE, ","); - p = IObuff + dir_len; - bool trailing_pathseps = after_pathsep((char *)IObuff, (char *)p) && p[-1] == p[-2]; + size_t dir_len = copy_option_part((char_u **)&dirp, IObuff, IOSIZE, ","); + p = (char *)IObuff + dir_len; + bool trailing_pathseps = after_pathsep((char *)IObuff, p) && p[-1] == p[-2]; if (trailing_pathseps) { IObuff[dir_len - 2] = NUL; } @@ -2794,15 +2791,14 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ } if (trailing_pathseps) { // Ends with '//', Use Full path - if ((p = (char_u *)make_percent_swname((char *)IObuff, (char *)fname)) + if ((p = make_percent_swname((char *)IObuff, fname)) != NULL) { - backup = (char_u *)modname((char *)p, (char *)backup_ext, - no_prepend_dot); + backup = modname(p, backup_ext, no_prepend_dot); xfree(p); } } - rootname = get_file_in_dir(fname, IObuff); + rootname = (char *)get_file_in_dir((char_u *)fname, IObuff); if (rootname == NULL) { some_error = TRUE; // out of memory goto nobackup; @@ -2814,8 +2810,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ // Make the backup file name. // if (backup == NULL) { - backup = (char_u *)modname((char *)rootname, (char *)backup_ext, - no_prepend_dot); + backup = modname(rootname, backup_ext, no_prepend_dot); } if (backup == NULL) { @@ -2827,7 +2822,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ /* * Check if backup file already exists. */ - if (os_fileinfo((char *)backup, &file_info_new)) { + if (os_fileinfo(backup, &file_info_new)) { if (os_fileinfo_id_equal(&file_info_new, &file_info_old)) { // // Backup file is same as original file. @@ -2846,9 +2841,8 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ wp = backup; } *wp = 'z'; - while (*wp > 'a' - && os_fileinfo((char *)backup, &file_info_new)) { - --*wp; + while (*wp > 'a' && os_fileinfo(backup, &file_info_new)) { + (*wp)--; } // They all exist??? Must be something wrong. if (*wp == 'a') { @@ -2864,7 +2858,7 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ */ if (backup != NULL) { // remove old backup, if present - os_remove((char *)backup); + os_remove(backup); // set file protection same as original file, but // strip s-bit. @@ -2877,26 +2871,26 @@ int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_ // protection bits for others. // if (file_info_new.stat.st_gid != file_info_old.stat.st_gid - && os_chown((char *)backup, -1, file_info_old.stat.st_gid) != 0) { + && os_chown(backup, -1, file_info_old.stat.st_gid) != 0) { os_setperm((const char *)backup, (perm & 0707) | ((perm & 07) << 3)); } #endif // copy the file - if (os_copy((char *)fname, (char *)backup, UV_FS_COPYFILE_FICLONE) + if (os_copy(fname, backup, UV_FS_COPYFILE_FICLONE) != 0) { SET_ERRMSG(_("E506: Can't write to backup file " "(add ! to override)")); } #ifdef UNIX - os_file_settime((char *)backup, + os_file_settime(backup, file_info_old.stat.st_atim.tv_sec, file_info_old.stat.st_mtim.tv_sec); #endif #ifdef HAVE_ACL - mch_set_acl(backup, acl); + mch_set_acl((char_u *)backup, acl); #endif break; } @@ -2913,9 +2907,9 @@ nobackup: } SET_ERRMSG(NULL); } else { - char_u *dirp; - char_u *p; - char_u *rootname; + char *dirp; + char *p; + char *rootname; /* * Make a backup by renaming the original file. @@ -2936,14 +2930,14 @@ nobackup: * path/fo.o.h.bak Try all directories in 'backupdir', first one * that works is used. */ - dirp = p_bdir; + dirp = (char *)p_bdir; while (*dirp) { /* * Isolate one directory name and make the backup file name. */ - size_t dir_len = copy_option_part(&dirp, IObuff, IOSIZE, ","); - p = IObuff + dir_len; - bool trailing_pathseps = after_pathsep((char *)IObuff, (char *)p) && p[-1] == p[-2]; + size_t dir_len = copy_option_part((char_u **)&dirp, IObuff, IOSIZE, ","); + p = (char *)IObuff + dir_len; + bool trailing_pathseps = after_pathsep((char *)IObuff, p) && p[-1] == p[-2]; if (trailing_pathseps) { IObuff[dir_len - 2] = NUL; } @@ -2958,21 +2952,19 @@ nobackup: } if (trailing_pathseps) { // path ends with '//', use full path - if ((p = (char_u *)make_percent_swname((char *)IObuff, (char *)fname)) + if ((p = make_percent_swname((char *)IObuff, fname)) != NULL) { - backup = (char_u *)modname((char *)p, (char *)backup_ext, - no_prepend_dot); + backup = modname(p, backup_ext, no_prepend_dot); xfree(p); } } if (backup == NULL) { - rootname = get_file_in_dir(fname, IObuff); + rootname = (char *)get_file_in_dir((char_u *)fname, IObuff); if (rootname == NULL) { backup = NULL; } else { - backup = (char_u *)modname((char *)rootname, (char *)backup_ext, - no_prepend_dot); + backup = modname(rootname, backup_ext, no_prepend_dot); xfree(rootname); } } @@ -2983,13 +2975,13 @@ nobackup: * delete an existing one, try to use another name. * Change one character, just before the extension. */ - if (!p_bk && os_path_exists(backup)) { + if (!p_bk && os_path_exists((char_u *)backup)) { p = backup + STRLEN(backup) - 1 - STRLEN(backup_ext); if (p < backup) { // empty file name ??? p = backup; } *p = 'z'; - while (*p > 'a' && os_path_exists(backup)) { + while (*p > 'a' && os_path_exists((char_u *)backup)) { (*p)--; } // They all exist??? Must be something wrong! @@ -3007,7 +2999,7 @@ nobackup: // If the renaming of the original file to the backup file // works, quit here. /// - if (vim_rename(fname, backup) == 0) { + if (vim_rename((char_u *)fname, (char_u *)backup) == 0) { break; } @@ -3068,21 +3060,21 @@ nobackup: // Check for forced 'fileencoding' from "++opt=val" argument. if (eap != NULL && eap->force_enc != 0) { - fenc = (char_u *)eap->cmd + eap->force_enc; - fenc = enc_canonize(fenc); + fenc = eap->cmd + eap->force_enc; + fenc = (char *)enc_canonize((char_u *)fenc); fenc_tofree = fenc; } else { - fenc = buf->b_p_fenc; + fenc = (char *)buf->b_p_fenc; } // Check if the file needs to be converted. - converted = need_conversion(fenc); + converted = need_conversion((char_u *)fenc); // Check if UTF-8 to UCS-2/4 or Latin1 conversion needs to be done. Or // Latin1 to Unicode conversion. This is handled in buf_write_bytes(). // Prepare the flags for it and allocate bw_conv_buf when needed. if (converted) { - wb_flags = get_fio_flags(fenc); + wb_flags = get_fio_flags((char_u *)fenc); if (wb_flags & (FIO_UCS2 | FIO_UCS4 | FIO_UTF16 | FIO_UTF8)) { // Need to allocate a buffer to translate into. if (wb_flags & (FIO_UCS2 | FIO_UTF16 | FIO_UTF8)) { @@ -3102,7 +3094,7 @@ nobackup: #ifdef HAVE_ICONV // Use iconv() conversion when conversion is needed and it's not done // internally. - write_info.bw_iconv_fd = (iconv_t)my_iconv_open(fenc, (char_u *)"utf-8"); + write_info.bw_iconv_fd = (iconv_t)my_iconv_open((char_u *)fenc, (char_u *)"utf-8"); if (write_info.bw_iconv_fd != (iconv_t)-1) { // We're going to use iconv(), allocate a buffer to convert in. write_info.bw_conv_buflen = bufsize * ICONV_MULT; @@ -3120,7 +3112,7 @@ nobackup: * overwrite the original file. */ if (*p_ccv != NUL) { - wfname = vim_tempname(); + wfname = (char *)vim_tempname(); if (wfname == NULL) { // Can't write without a tempfile! SET_ERRMSG(_("E214: Can't find temp file for writing")); goto restore_backup; @@ -3164,7 +3156,7 @@ nobackup: // quotum for number of files). // Appending will fail if the file does not exist and forceit is // FALSE. - while ((fd = os_open((char *)wfname, + while ((fd = os_open(wfname, O_WRONLY | (append ? (forceit ? (O_APPEND | O_CREAT) : O_APPEND) @@ -3179,7 +3171,7 @@ nobackup: // Don't delete the file when it's a hard or symbolic link. if ((!newfile && os_fileinfo_hardlinks(&file_info_old) > 1) - || (os_fileinfo_link((char *)fname, &file_info) + || (os_fileinfo_link(fname, &file_info) && !os_fileinfo_id_equal(&file_info, &file_info_old))) { SET_ERRMSG(_("E166: Can't open linked file for writing")); } else { @@ -3200,7 +3192,7 @@ nobackup: } #endif if (!append) { // don't remove when appending - os_remove((char *)wfname); + os_remove(wfname); } continue; } @@ -3221,21 +3213,21 @@ restore_backup: // This may not work if the vim_rename() fails. // In that case we leave the copy around. // If file does not exist, put the copy in its place - if (!os_path_exists(fname)) { - vim_rename(backup, fname); + if (!os_path_exists((char_u *)fname)) { + vim_rename((char_u *)backup, (char_u *)fname); } // if original file does exist throw away the copy - if (os_path_exists(fname)) { - os_remove((char *)backup); + if (os_path_exists((char_u *)fname)) { + os_remove(backup); } } else { // try to put the original file back - vim_rename(backup, fname); + vim_rename((char_u *)backup, (char_u *)fname); } } // if original file no longer exists give an extra warning - if (!newfile && !os_path_exists(fname)) { + if (!newfile && !os_path_exists((char_u *)fname)) { end = 0; } } @@ -3249,7 +3241,7 @@ restore_backup: } SET_ERRMSG(NULL); - write_info.bw_buf = buffer; + write_info.bw_buf = (char_u *)buffer; nchars = 0; // use "++bin", "++nobin" or 'binary' @@ -3262,7 +3254,7 @@ restore_backup: // Skip the BOM when appending and the file already existed, the BOM // only makes sense at the start of the file. if (buf->b_p_bomb && !write_bin && (!append || perm < 0)) { - write_info.bw_len = make_bom(buffer, fenc); + write_info.bw_len = make_bom((char_u *)buffer, (char_u *)fenc); if (write_info.bw_len > 0) { // don't convert write_info.bw_flags = FIO_NOCONVERT | wb_flags; @@ -3292,9 +3284,9 @@ restore_backup: for (lnum = start; lnum <= end; lnum++) { // The next while loop is done once for each character written. // Keep it fast! - ptr = ml_get_buf(buf, lnum, false) - 1; + ptr = (char *)ml_get_buf(buf, lnum, false) - 1; if (write_undo_file) { - sha256_update(&sha_ctx, ptr + 1, (uint32_t)(STRLEN(ptr + 1) + 1)); + sha256_update(&sha_ctx, (char_u *)ptr + 1, (uint32_t)(STRLEN(ptr + 1) + 1)); } while ((c = *++ptr) != NUL) { if (c == NL) { @@ -3403,7 +3395,7 @@ restore_backup: // don't change the owner when it's already OK, some systems remove // permission or ACL stuff FileInfo file_info; - if (!os_fileinfo((char *)wfname, &file_info) + if (!os_fileinfo(wfname, &file_info) || file_info.stat.st_uid != file_info_old.stat.st_uid || file_info.stat.st_gid != file_info_old.stat.st_gid) { os_fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid); @@ -3435,7 +3427,7 @@ restore_backup: // Probably need to set the ACL before changing the user (can't set the // ACL on a file the user doesn't own). if (!backup_copy) { - mch_set_acl(wfname, acl); + mch_set_acl((char_u *)wfname, acl); } #endif @@ -3443,13 +3435,12 @@ restore_backup: // The file was written to a temp file, now it needs to be converted // with 'charconvert' to (overwrite) the output file. if (end != 0) { - if (eval_charconvert("utf-8", (char *)fenc, - (char *)wfname, (char *)fname) == FAIL) { + if (eval_charconvert("utf-8", fenc, wfname, fname) == FAIL) { write_info.bw_conv_error = true; end = 0; } } - os_remove((char *)wfname); + os_remove(wfname); xfree(wfname); } } @@ -3493,12 +3484,12 @@ restore_backup: } // copy the file. - if (os_copy((char *)backup, (char *)fname, UV_FS_COPYFILE_FICLONE) + if (os_copy(backup, fname, UV_FS_COPYFILE_FICLONE) == 0) { end = 1; // success } } else { - if (vim_rename(backup, fname) == 0) { + if (vim_rename((char_u *)backup, (char_u *)fname) == 0) { end = 1; } } @@ -3590,7 +3581,7 @@ restore_backup: * the backup file our 'original' file. */ if (*p_pm && dobackup) { - char *const org = modname((char *)fname, (char *)p_pm, false); + char *const org = modname(fname, (char *)p_pm, false); if (backup != NULL) { /* @@ -3600,7 +3591,7 @@ restore_backup: if (org == NULL) { emsg(_("E205: Patchmode: can't save original file")); } else if (!os_path_exists((char_u *)org)) { - vim_rename(backup, (char_u *)org); + vim_rename((char_u *)backup, (char_u *)org); XFREE_CLEAR(backup); // don't delete the file #ifdef UNIX os_file_settime(org, @@ -3636,7 +3627,7 @@ restore_backup: */ if (!p_bk && backup != NULL && !write_info.bw_conv_error - && os_remove((char *)backup) != 0) { + && os_remove(backup) != 0) { emsg(_("E207: Can't delete backup file")); } @@ -3700,7 +3691,7 @@ nofail: // Update the timestamp to avoid an "overwrite changed file" // prompt when writing again. - if (os_fileinfo((char *)fname, &file_info_old)) { + if (os_fileinfo(fname, &file_info_old)) { buf_store_file_info(buf, &file_info_old); buf->b_mtime_read = buf->b_mtime; buf->b_mtime_read_ns = buf->b_mtime_ns; @@ -3714,10 +3705,10 @@ nofail: * file. */ if (retval == OK && write_undo_file) { - char_u hash[UNDO_HASH_SIZE]; + char hash[UNDO_HASH_SIZE]; - sha256_finish(&sha_ctx, hash); - u_write_undo(NULL, FALSE, buf, hash); + sha256_finish(&sha_ctx, (char_u *)hash); + u_write_undo(NULL, false, buf, (char_u *)hash); } if (!should_abort(retval)) { @@ -4334,7 +4325,7 @@ void shorten_buf_fname(buf_T *buf, char_u *dirname, int force) if (buf->b_fname != NULL && !bt_nofile(buf) - && !path_with_url((char *)buf->b_fname) + && !path_with_url(buf->b_fname) && (force || buf->b_sfname == NULL || path_is_absolute(buf->b_sfname))) { @@ -4344,10 +4335,10 @@ void shorten_buf_fname(buf_T *buf, char_u *dirname, int force) p = path_shorten_fname(buf->b_ffname, dirname); if (p != NULL) { buf->b_sfname = vim_strsave(p); - buf->b_fname = buf->b_sfname; + buf->b_fname = (char *)buf->b_sfname; } if (p == NULL) { - buf->b_fname = buf->b_ffname; + buf->b_fname = (char *)buf->b_ffname; } } } @@ -4442,7 +4433,7 @@ char *modname(const char *fname, const char *ext, bool prepend_dot) char *e; // Prepend the dot if needed. - if (prepend_dot && *(e = (char *)path_tail((char_u *)retval)) != '.') { + if (prepend_dot && *(e = path_tail(retval)) != '.') { STRMOVE(e + 1, e); *e = '.'; } @@ -4653,7 +4644,7 @@ int vim_rename(const char_u *from, const char_u *to) * the file name differs we need to go through a temp file. */ if (FNAMECMP(from, to) == 0) { - if (p_fic && (STRCMP(path_tail((char_u *)from), path_tail((char_u *)to)) + if (p_fic && (STRCMP(path_tail((char *)from), path_tail((char *)to)) != 0)) { use_tmp_file = true; } else { @@ -4688,7 +4679,7 @@ int vim_rename(const char_u *from, const char_u *to) } STRCPY(tempname, from); for (n = 123; n < 99999; n++) { - char *tail = (char *)path_tail(tempname); + char *tail = path_tail((char *)tempname); snprintf(tail, (MAXPATHL + 1) - (tail - (char *)tempname - 1), "%d", n); if (!os_path_exists(tempname)) { @@ -4964,7 +4955,7 @@ int buf_check_timestamp(buf_T *buf) buf_store_file_info(buf, &file_info); } - if (os_isdir(buf->b_fname)) { + if (os_isdir((char_u *)buf->b_fname)) { // Don't do anything for a directory. Might contain the file explorer. } else if ((buf->b_p_ar >= 0 ? buf->b_p_ar : p_ar) && !bufIsChanged(buf) && file_info_ok) { @@ -4992,15 +4983,14 @@ int buf_check_timestamp(buf_T *buf) set_vim_var_string(VV_FCS_REASON, reason, -1); set_vim_var_string(VV_FCS_CHOICE, "", -1); allbuf_lock++; - bool n = apply_autocmds(EVENT_FILECHANGEDSHELL, - buf->b_fname, buf->b_fname, false, buf); + bool n = apply_autocmds(EVENT_FILECHANGEDSHELL, buf->b_fname, buf->b_fname, false, buf); allbuf_lock--; busy = false; if (n) { if (!bufref_valid(&bufref)) { emsg(_("E246: FileChangedShell autocommand deleted buffer")); } - s = get_vim_var_str(VV_FCS_CHOICE); + s = (char_u *)get_vim_var_str(VV_FCS_CHOICE); if (STRCMP(s, "reload") == 0 && *reason != 'd') { reload = RELOAD_NORMAL; } else if (STRCMP(s, "edit") == 0) { @@ -5053,7 +5043,7 @@ int buf_check_timestamp(buf_T *buf) } if (mesg != NULL) { - path = home_replace_save(buf, buf->b_fname); + path = home_replace_save(buf, (char_u *)buf->b_fname); if (!helpmesg) { mesg2 = ""; } @@ -5078,7 +5068,7 @@ int buf_check_timestamp(buf_T *buf) reload = RELOAD_DETECT; break; } - } else if (State > NORMAL_BUSY || (State & CMDLINE) || already_warned) { + } else if (State > MODE_NORMAL_BUSY || (State & MODE_CMDLINE) || already_warned) { if (*mesg2 != NUL) { xstrlcat(tbuf, "; ", tbuf_len - 1); xstrlcat(tbuf, mesg2, tbuf_len - 1); @@ -5124,8 +5114,7 @@ int buf_check_timestamp(buf_T *buf) // Trigger FileChangedShell when the file was changed in any way. if (bufref_valid(&bufref) && retval != 0) { - (void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST, buf->b_fname, buf->b_fname, - false, buf); + (void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST, buf->b_fname, buf->b_fname, false, buf); } return retval; } @@ -5199,7 +5188,7 @@ void buf_reload(buf_T *buf, int orig_mode, bool reload_options) if (saved == OK) { curbuf->b_flags |= BF_CHECK_RO; // check for RO again keep_filetype = true; // don't detect 'filetype' - if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0, (linenr_T)0, + if (readfile((char *)buf->b_ffname, buf->b_fname, (linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM, &ea, flags, false) != OK) { if (!aborting()) { semsg(_("E321: Could not reload \"%s\""), buf->b_fname); @@ -5443,7 +5432,7 @@ void vim_deltempdir(void) { if (vim_tempdir != NULL) { // remove the trailing path separator - path_tail(vim_tempdir)[-1] = NUL; + path_tail((char *)vim_tempdir)[-1] = NUL; delete_recursive((const char *)vim_tempdir); XFREE_CLEAR(vim_tempdir); } @@ -5519,7 +5508,7 @@ char_u *vim_tempname(void) /// @param allow_dirs Allow matching with dir /// /// @return true if there is a match, false otherwise -bool match_file_pat(char_u *pattern, regprog_T **prog, char_u *fname, char_u *sfname, char_u *tail, +bool match_file_pat(char *pattern, regprog_T **prog, char *fname, char *sfname, char *tail, int allow_dirs) { regmatch_T regmatch; @@ -5542,10 +5531,10 @@ bool match_file_pat(char_u *pattern, regprog_T **prog, char_u *fname, char_u *sf */ if (regmatch.regprog != NULL && ((allow_dirs - && (vim_regexec(®match, fname, (colnr_T)0) + && (vim_regexec(®match, (char_u *)fname, (colnr_T)0) || (sfname != NULL - && vim_regexec(®match, sfname, (colnr_T)0)))) - || (!allow_dirs && vim_regexec(®match, tail, (colnr_T)0)))) { + && vim_regexec(®match, (char_u *)sfname, (colnr_T)0)))) + || (!allow_dirs && vim_regexec(®match, (char_u *)tail, (colnr_T)0)))) { result = true; } @@ -5576,17 +5565,18 @@ bool match_file_list(char_u *list, char_u *sfname, char_u *ffname) bool match; char_u *p; - tail = path_tail(sfname); + tail = (char_u *)path_tail((char *)sfname); // try all patterns in 'wildignore' p = list; while (*p) { copy_option_part(&p, buf, ARRAY_SIZE(buf), ","); - regpat = file_pat_to_reg_pat(buf, NULL, &allow_dirs, false); + regpat = (char_u *)file_pat_to_reg_pat((char *)buf, NULL, &allow_dirs, false); if (regpat == NULL) { break; } - match = match_file_pat(regpat, NULL, ffname, sfname, tail, (int)allow_dirs); + match = match_file_pat((char *)regpat, NULL, (char *)ffname, (char *)sfname, (char *)tail, + (int)allow_dirs); xfree(regpat); if (match) { return true; @@ -5606,13 +5596,12 @@ bool match_file_list(char_u *list, char_u *sfname, char_u *ffname) /// @param no_bslash Don't use a backward slash as pathsep /// /// @return NULL on failure. -char_u *file_pat_to_reg_pat(const char_u *pat, const char_u *pat_end, char *allow_dirs, - int no_bslash) +char *file_pat_to_reg_pat(const char *pat, const char *pat_end, char *allow_dirs, int no_bslash) FUNC_ATTR_NONNULL_ARG(1) { - const char_u *endp; - char_u *reg_pat; - const char_u *p; + const char *endp; + char *reg_pat; + const char *p; int nested = 0; bool add_dollar = true; @@ -5624,7 +5613,7 @@ char_u *file_pat_to_reg_pat(const char_u *pat, const char_u *pat_end, char *allo } if (pat_end == pat) { - return (char_u *)xstrdup("^$"); + return xstrdup("^$"); } size_t size = 2; // '^' at start, '$' at end. diff --git a/src/nvim/fold.c b/src/nvim/fold.c index 3e1b66fde3..090f754e93 100644 --- a/src/nvim/fold.c +++ b/src/nvim/fold.c @@ -775,7 +775,7 @@ void clearFolding(win_T *win) /// The changes in lines from top to bot (inclusive). void foldUpdate(win_T *wp, linenr_T top, linenr_T bot) { - if (compl_busy || State & INSERT) { + if (compl_busy || State & MODE_INSERT) { return; } @@ -1374,7 +1374,7 @@ void foldMarkAdjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long } // If appending a line in Insert mode, it should be included in the fold // just above the line. - if ((State & INSERT) && amount == (linenr_T)1 && line2 == MAXLNUM) { + if ((State & MODE_INSERT) && amount == (linenr_T)1 && line2 == MAXLNUM) { line1--; } foldMarkAdjustRecurse(wp, &wp->w_folds, line1, line2, amount, amount_after); @@ -1394,7 +1394,7 @@ static void foldMarkAdjustRecurse(win_T *wp, garray_T *gap, linenr_T line1, line // In Insert mode an inserted line at the top of a fold is considered part // of the fold, otherwise it isn't. - if ((State & INSERT) && amount == (linenr_T)1 && line2 == MAXLNUM) { + if ((State & MODE_INSERT) && amount == (linenr_T)1 && line2 == MAXLNUM) { top = line1 + 1; } else { top = line1; @@ -2911,7 +2911,7 @@ static void foldlevelIndent(fline_T *flp) // empty line or lines starting with a character in 'foldignore': level // depends on surrounding lines - if (*s == NUL || vim_strchr(flp->wp->w_p_fdi, *s) != NULL) { + if (*s == NUL || vim_strchr((char *)flp->wp->w_p_fdi, *s) != NULL) { // first and last line can't be undefined, use level 0 if (lnum == 1 || lnum == buf->b_ml.ml_line_count) { flp->lvl = 0; @@ -3042,7 +3042,7 @@ static void foldlevelExpr(fline_T *flp) /// Relies on the option value to have been checked for correctness already. static void parseMarker(win_T *wp) { - foldendmarker = vim_strchr(wp->w_p_fmr, ','); + foldendmarker = (char_u *)vim_strchr((char *)wp->w_p_fmr, ','); foldstartmarkerlen = (size_t)(foldendmarker++ - wp->w_p_fmr); foldendmarkerlen = STRLEN(foldendmarker); } diff --git a/src/nvim/generators/gen_eval.lua b/src/nvim/generators/gen_eval.lua index 945fa5099f..f094a04c07 100644 --- a/src/nvim/generators/gen_eval.lua +++ b/src/nvim/generators/gen_eval.lua @@ -1,9 +1,12 @@ local mpack = require('mpack') local nvimsrcdir = arg[1] -local autodir = arg[2] -local metadata_file = arg[3] -local funcs_file = arg[4] +local shared_file = arg[2] +local autodir = arg[3] +local metadata_file = arg[4] +local funcs_file = arg[5] + +_G.vim = loadfile(shared_file)() if nvimsrcdir == '--help' then print([[ @@ -20,7 +23,9 @@ package.path = nvimsrcdir .. '/?.lua;' .. package.path local funcsfname = autodir .. '/funcs.generated.h' -local gperfpipe = io.open(funcsfname .. '.gperf', 'wb') +local hashy = require'generators.hashy' + +local hashpipe = io.open(funcsfname, 'wb') local funcs = require('eval').funcs local metadata = mpack.unpack(io.open(metadata_file, 'rb'):read("*all")) @@ -38,21 +43,15 @@ local funcsdata = io.open(funcs_file, 'w') funcsdata:write(mpack.pack(funcs)) funcsdata:close() -gperfpipe:write([[ -%language=ANSI-C -%global-table -%readonly-tables -%define initializer-suffix ,0,0,BASE_NONE,NULL,NULL -%define word-array-name functions -%define hash-function-name hash_internal_func_gperf -%define lookup-function-name find_internal_func_gperf -%omit-struct-type -%struct-type -VimLFuncDef; -%% -]]) -for name, def in pairs(funcs) do +local names = vim.tbl_keys(funcs) + +local neworder, hashfun = hashy.hashy_hash("find_internal_func", names, function (idx) + return "functions["..idx.."].name" +end) +hashpipe:write("static const EvalFuncDef functions[] = {\n") +for _, name in ipairs(neworder) do + local def = funcs[name] local args = def.args or 0 if type(args) == 'number' then args = {args, args} @@ -62,7 +61,10 @@ for name, def in pairs(funcs) do local base = def.base or "BASE_NONE" local func = def.func or ('f_' .. name) local data = def.data or "NULL" - gperfpipe:write(('%s, %s, %s, %s, &%s, (FunPtr)%s\n') + hashpipe:write((' { "%s", %s, %s, %s, &%s, (FunPtr)%s },\n') :format(name, args[1], args[2], base, func, data)) end -gperfpipe:close() +hashpipe:write(' { NULL, 0, 0, BASE_NONE, NULL, NULL },\n') +hashpipe:write("};\n\n") +hashpipe:write(hashfun) +hashpipe:close() diff --git a/src/nvim/generators/hashy.lua b/src/nvim/generators/hashy.lua index fac24c810a..b10bafb9f9 100644 --- a/src/nvim/generators/hashy.lua +++ b/src/nvim/generators/hashy.lua @@ -77,7 +77,7 @@ function M.switcher(put, tab, maxlen, worst_buck_size) put "break;\n" end put " default: break;\n" - put " }\n " + put " }\n " else local startidx = #neworder table.insert(neworder, posbuck[keys[1]][1]) @@ -85,7 +85,7 @@ function M.switcher(put, tab, maxlen, worst_buck_size) put("low = "..startidx.."; ") if bucky then put("high = "..endidx.."; ") end end - put " break;\n" + put "break;\n" end end put " default: break;\n" @@ -105,17 +105,23 @@ function M.hashy_hash(name, strings, access) end local neworder = M.switcher(put, len_pos_buckets, maxlen, worst_buck_size) if worst_buck_size > 1 then - error [[ not implemented yet ]] -- TODO(bfredl) + put ([[ + for (int i = low; i < high; i++) { + if (!memcmp(str, ]]..access("i")..[[, len)) { + return i; + } + } + return -1; +]]) else - put [[ - if (low < 0) { + put ([[ + if (low < 0 || memcmp(str, ]]..access("low")..[[, len)) { return -1; } - ]] - put("if(memcmp(str, "..access("low")..", len)) {\n return -1;\n }\n") - put " return low;\n" - put "}\n\n" + return low; +]]) end + put "}\n\n" return neworder, table.concat(stats) end diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index 05ee4cbafd..8881263d1c 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -31,7 +31,7 @@ #include "nvim/garray.h" #include "nvim/getchar.h" #include "nvim/input.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/lua/executor.h" #include "nvim/main.h" #include "nvim/mbyte.h" @@ -99,8 +99,8 @@ static int block_redo = FALSE; // Put Normal/Visual mode mappings mostly separately from Insert/Cmdline mode. #define MAP_HASH(mode, \ c1) (((mode) & \ - (NORMAL + VISUAL + SELECTMODE + \ - OP_PENDING + TERM_FOCUS)) ? (c1) : ((c1) ^ 0x80)) + (MODE_NORMAL | MODE_VISUAL | MODE_SELECT | \ + MODE_OP_PENDING | MODE_TERMINAL)) ? (c1) : ((c1) ^ 0x80)) // Each mapping is put in one of the MAX_MAPHASH hash lists, // to speed up finding it. @@ -802,7 +802,7 @@ int start_redo_ins(void) // skip the count and the command character while ((c = read_redo(false, false)) != NUL) { - if (vim_strchr((char_u *)"AaIiRrOo", c) != NULL) { + if (vim_strchr("AaIiRrOo", c) != NULL) { if (c == 'O' || c == 'o') { add_buff(&readbuf2, NL_STR, -1L); } @@ -840,13 +840,16 @@ static void init_typebuf(void) void init_default_mappings(void) { - add_map((char_u *)"Y y$", NORMAL, true); + add_map((char_u *)"Y y$", MODE_NORMAL, true); // Use normal! <C-L> to prevent inserting raw <C-L> when using i_<C-O> // See https://github.com/neovim/neovim/issues/17473 - add_map((char_u *)"<C-L> <Cmd>nohlsearch<Bar>diffupdate<Bar>normal! <C-L><CR>", NORMAL, true); - add_map((char_u *)"<C-U> <C-G>u<C-U>", INSERT, true); - add_map((char_u *)"<C-W> <C-G>u<C-W>", INSERT, true); + add_map((char_u *)"<C-L> <Cmd>nohlsearch<Bar>diffupdate<Bar>normal! <C-L><CR>", + MODE_NORMAL, true); + add_map((char_u *)"<C-U> <C-G>u<C-U>", MODE_INSERT, true); + add_map((char_u *)"<C-W> <C-G>u<C-W>", MODE_INSERT, true); + add_map((char_u *)"* y/\\\\V<C-R>\"<CR>", MODE_VISUAL, true); + add_map((char_u *)"# y?\\\\V<C-R>\"<CR>", MODE_VISUAL, true); } // Insert a string in position 'offset' in the typeahead buffer (for "@r" @@ -1195,7 +1198,7 @@ void ungetchars(int len) */ void may_sync_undo(void) { - if ((!(State & (INSERT + CMDLINE)) || arrow_used) + if ((!(State & (MODE_INSERT | MODE_CMDLINE)) || arrow_used) && scriptin[curscript] == NULL) { u_sync(false); } @@ -1353,7 +1356,7 @@ void openscript(char_u *name, bool directly) int save_finish_op = finish_op; int save_msg_scroll = msg_scroll; - State = NORMAL; + State = MODE_NORMAL; 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' @@ -1636,7 +1639,7 @@ int vgetc(void) // something with a meta- or alt- modifier that was not mapped, interpret // <M-x> as <Esc>x rather than as an unbound meta keypress. #8213 // In Terminal mode, however, this is not desirable. #16220 - if (!no_mapping && KeyTyped && !(State & TERM_FOCUS) + if (!no_mapping && KeyTyped && !(State & MODE_TERMINAL) && (mod_mask == MOD_MASK_ALT || mod_mask == MOD_MASK_META)) { mod_mask = 0; int len = ins_char_typebuf(c, 0); @@ -1878,17 +1881,17 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) if (no_mapping == 0 && maphash_valid && (no_zero_mapping == 0 || tb_c1 != '0') && (typebuf.tb_maplen == 0 || is_plug_map - || (p_remap - && !(typebuf.tb_noremap[typebuf.tb_off] & (RM_NONE|RM_ABBR)))) - && !(p_paste && (State & (INSERT + CMDLINE))) - && !(State == HITRETURN && (tb_c1 == CAR || tb_c1 == ' ')) - && State != ASKMORE - && State != CONFIRM + || (!(typebuf.tb_noremap[typebuf.tb_off] & (RM_NONE|RM_ABBR)))) + && !(p_paste && (State & (MODE_INSERT | MODE_CMDLINE))) + && !(State == MODE_HITRETURN && (tb_c1 == CAR || tb_c1 == ' ')) + && State != MODE_ASKMORE + && State != MODE_CONFIRM && !at_ins_compl_key()) { if (tb_c1 == K_SPECIAL) { nolmaplen = 2; } else { - LANGMAP_ADJUST(tb_c1, !(State & (CMDLINE | INSERT)) && get_real_state() != SELECTMODE); + LANGMAP_ADJUST(tb_c1, ((State & (MODE_CMDLINE | MODE_INSERT)) == 0 + && get_real_state() != MODE_SELECT)); nolmaplen = 0; } // First try buffer-local mappings. @@ -1911,7 +1914,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) // for the current state. // Skip ":lmap" mappings if keys were mapped. if (mp->m_keys[0] == tb_c1 && (mp->m_mode & local_State) - && ((mp->m_mode & LANGMAP) == 0 || typebuf.tb_maplen == 0)) { + && ((mp->m_mode & MODE_LANGMAP) == 0 || typebuf.tb_maplen == 0)) { int nomap = nolmaplen; int c2; // find the match length of this mapping @@ -1976,8 +1979,8 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) } else if (keylen > mp_match_len || (keylen == mp_match_len && mp_match != NULL - && (mp_match->m_mode & LANGMAP) == 0 - && (mp->m_mode & LANGMAP) != 0)) { + && (mp_match->m_mode & MODE_LANGMAP) == 0 + && (mp->m_mode & MODE_LANGMAP) != 0)) { // found a longer match mp_match = mp; mp_match_len = keylen; @@ -1999,7 +2002,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) } // Check for match with 'pastetoggle' - if (*p_pt != NUL && mp == NULL && (State & (INSERT|NORMAL))) { + if (*p_pt != NUL && mp == NULL && (State & (MODE_INSERT | MODE_NORMAL))) { bool match = typebuf_match_len(p_pt, &mlen); if (match) { // write chars to script file(s) @@ -2010,7 +2013,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) del_typebuf(mlen, 0); // remove the chars set_option_value("paste", !p_paste, NULL, 0); - if (!(State & INSERT)) { + if (!(State & MODE_INSERT)) { msg_col = 0; msg_row = Rows - 1; msg_clr_eos(); // clear ruler @@ -2089,7 +2092,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) // Write chars to script file(s). // Note: :lmap mappings are written *after* being applied. #5658 - if (keylen > typebuf.tb_maplen && (mp->m_mode & LANGMAP) == 0) { + if (keylen > typebuf.tb_maplen && (mp->m_mode & MODE_LANGMAP) == 0) { gotchars(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_maplen, (size_t)(keylen - typebuf.tb_maplen)); } @@ -2101,7 +2104,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) // The depth check catches ":map x y" and ":map y x". if (++*mapdepth >= p_mmd) { emsg(_("E223: recursive mapping")); - if (State & CMDLINE) { + if (State & MODE_CMDLINE) { redrawcmdline(); } else { setcursor(); @@ -2114,7 +2117,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) // In Select mode and a Visual mode mapping is used: Switch to Visual // mode temporarily. Append K_SELECT to switch back to Select mode. - if (VIsual_active && VIsual_select && (mp->m_mode & VISUAL)) { + if (VIsual_active && VIsual_select && (mp->m_mode & MODE_VISUAL)) { VIsual_select = false; (void)ins_typebuf((char *)K_SELECT_STRING, REMAP_NONE, 0, true, false); } @@ -2163,7 +2166,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) buf[2] = KE_IGNORE; buf[3] = NUL; map_str = vim_strsave(buf); - if (State & CMDLINE) { + if (State & MODE_CMDLINE) { // redraw the command below the error msg_didout = true; if (msg_row < cmdline_row) { @@ -2190,7 +2193,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) // If this is a LANGMAP mapping, then we didn't record the keys // at the start of the function and have to record them now. - if (keylen > typebuf.tb_maplen && (mp->m_mode & LANGMAP) != 0) { + if (keylen > typebuf.tb_maplen && (mp->m_mode & MODE_LANGMAP) != 0) { gotchars(map_str, STRLEN(map_str)); } @@ -2353,7 +2356,7 @@ static int vgetorpeek(bool advance) // As a result typing CTRL-C in insert mode will // really insert a CTRL-C. if ((c || typebuf.tb_maplen) - && (State & (INSERT + CMDLINE))) { + && (State & (MODE_INSERT | MODE_CMDLINE))) { c = ESC; } else { c = Ctrl_C; @@ -2422,7 +2425,7 @@ static int vgetorpeek(bool advance) && !no_mapping && ex_normal_busy == 0 && typebuf.tb_maplen == 0 - && (State & INSERT) + && (State & MODE_INSERT) && (p_timeout || (keylen == KEYLEN_PART_KEY && p_ttimeout)) && (c = inchar(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len, 3, 25L)) == 0) { colnr_T col = 0, vcol; @@ -2517,9 +2520,9 @@ static int vgetorpeek(bool advance) // For the cmdline window: Alternate between ESC and // CTRL-C: ESC for most situations and CTRL-C to close the // cmdline window. - if (p_im && (State & INSERT)) { + if (p_im && (State & MODE_INSERT)) { c = Ctrl_L; - } else if ((State & CMDLINE) || (cmdwin_type > 0 && tc == ESC)) { + } else if ((State & MODE_CMDLINE) || (cmdwin_type > 0 && tc == ESC)) { c = Ctrl_C; } else { c = ESC; @@ -2541,7 +2544,7 @@ static int vgetorpeek(bool advance) // changed text so far. Also for when 'lazyredraw' is set and // redrawing was postponed because there was something in the // input buffer (e.g., termresponse). - if (((State & INSERT) != 0 || p_lz) && (State & CMDLINE) == 0 + if (((State & MODE_INSERT) != 0 || p_lz) && (State & MODE_CMDLINE) == 0 && advance && must_redraw != 0 && !need_wait_return) { update_screen(0); setcursor(); // put cursor back where it belongs @@ -2553,9 +2556,10 @@ static int vgetorpeek(bool advance) int showcmd_idx = 0; c1 = 0; if (typebuf.tb_len > 0 && advance && !exmode_active) { - if (((State & (NORMAL | INSERT)) || State == LANGMAP) && State != HITRETURN) { + if (((State & (MODE_NORMAL | MODE_INSERT)) || State == MODE_LANGMAP) + && State != MODE_HITRETURN) { // this looks nice when typing a dead character map - if (State & INSERT + if (State & MODE_INSERT && ptr2cells(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len - 1) == 1) { edit_putchar(typebuf.tb_buf[typebuf.tb_off + typebuf.tb_len - 1], false); setcursor(); // put cursor back where it belongs @@ -2578,7 +2582,7 @@ static int vgetorpeek(bool advance) } // this looks nice when typing a dead character map - if ((State & CMDLINE) && cmdline_star == 0) { + if ((State & MODE_CMDLINE) && cmdline_star == 0) { char_u *p = typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len - 1; if (ptr2cells(p) == 1 && *p < 128) { putcmdline((char)(*p), false); @@ -2616,10 +2620,10 @@ static int vgetorpeek(bool advance) pop_showcmd(); } if (c1 == 1) { - if (State & INSERT) { + if (State & MODE_INSERT) { edit_unputchar(); } - if (State & CMDLINE) { + if (State & MODE_CMDLINE) { unputcmdline(); } else { setcursor(); // put cursor back where it belongs @@ -2651,7 +2655,7 @@ static int vgetorpeek(bool advance) // The "INSERT" message is taken care of here: // if we return an ESC to exit insert mode, the message is deleted // if we don't return an ESC but deleted the message before, redisplay it - if (advance && p_smd && msg_silent == 0 && (State & INSERT)) { + if (advance && p_smd && msg_silent == 0 && (State & MODE_INSERT)) { if (c == ESC && !mode_deleted && !no_mapping && mode_displayed) { if (typebuf.tb_len && !KeyTyped) { redraw_cmdline = true; // delete mode later @@ -2722,7 +2726,7 @@ int inchar(char_u *buf, int maxlen, long wait_time) * recursive loop may result (write error in swapfile, hit-return, timeout * on char wait, flush swapfile, write error....). */ - if (State != HITRETURN) { + if (State != MODE_HITRETURN) { did_outofmem_msg = false; // display out of memory message (again) did_swapwrite_msg = false; // display swap file write error again } @@ -2899,8 +2903,8 @@ void set_maparg_lhs_rhs(const char *const orig_lhs, const size_t orig_lhs_len, mapargs->rhs_len = 0; mapargs->rhs_is_noop = true; } else { - replaced = replace_termcodes(orig_rhs, orig_rhs_len, &rhs_buf, - REPTERM_DO_LT | REPTERM_NO_SIMPLIFY, NULL, cpo_flags); + replaced = replace_termcodes(orig_rhs, orig_rhs_len, &rhs_buf, REPTERM_DO_LT, NULL, + cpo_flags); mapargs->rhs_len = STRLEN(replaced); // XXX: even when orig_rhs is non-empty, replace_termcodes may produce an empty string. mapargs->rhs_is_noop = orig_rhs[0] != NUL && mapargs->rhs_len == 0; @@ -3006,7 +3010,7 @@ int str_to_mapargs(const char_u *strargs, bool is_unmap, MapArguments *mapargs) // // With :unmap, literal white space is included in the {lhs}; there is no // separate {rhs}. - const char_u *lhs_end = to_parse; + const char *lhs_end = (char *)to_parse; bool do_backslash = (vim_strchr(p_cpo, CPO_BSLASH) == NULL); while (*lhs_end && (is_unmap || !ascii_iswhite(*lhs_end))) { if ((lhs_end[0] == Ctrl_V || (do_backslash && lhs_end[0] == '\\')) @@ -3022,7 +3026,7 @@ int str_to_mapargs(const char_u *strargs, bool is_unmap, MapArguments *mapargs) // Given {lhs} might be larger than MAXMAPLEN before replace_termcodes // (e.g. "<Space>" is longer than ' '), so first copy into a buffer. - size_t orig_lhs_len = (size_t)(lhs_end - to_parse); + size_t orig_lhs_len = (size_t)((char_u *)lhs_end - to_parse); char_u *lhs_to_replace = xcalloc(orig_lhs_len + 1, sizeof(char_u)); STRLCPY(lhs_to_replace, to_parse, orig_lhs_len + 1); @@ -3452,21 +3456,21 @@ theend: /// noreabbr {lhs} {rhs} " same, but no remapping for {rhs} /// unabbr {lhs} " remove abbreviation for {lhs} /// -/// for :map mode is NORMAL + VISUAL + SELECTMODE + OP_PENDING -/// for :map! mode is INSERT + CMDLINE -/// for :cmap mode is CMDLINE -/// for :imap mode is INSERT -/// for :lmap mode is LANGMAP -/// for :nmap mode is NORMAL -/// for :vmap mode is VISUAL + SELECTMODE -/// for :xmap mode is VISUAL -/// for :smap mode is SELECTMODE -/// for :omap mode is OP_PENDING -/// for :tmap mode is TERM_FOCUS +/// for :map mode is MODE_NORMAL | MODE_VISUAL | MODE_SELECT | MODE_OP_PENDING +/// for :map! mode is MODE_INSERT | MODE_CMDLINE +/// for :cmap mode is MODE_CMDLINE +/// for :imap mode is MODE_INSERT +/// for :lmap mode is MODE_LANGMAP +/// for :nmap mode is MODE_NORMAL +/// for :vmap mode is MODE_VISUAL | MODE_SELECT +/// for :xmap mode is MODE_VISUAL +/// for :smap mode is MODE_SELECT +/// for :omap mode is MODE_OP_PENDING +/// for :tmap mode is MODE_TERMINAL /// -/// for :abbr mode is INSERT + CMDLINE -/// for :iabbr mode is INSERT -/// for :cabbr mode is CMDLINE +/// for :abbr mode is MODE_INSERT | MODE_CMDLINE +/// for :iabbr mode is MODE_INSERT +/// for :cabbr mode is MODE_CMDLINE /// ``` /// /// @param maptype 0 for |:map|, 1 for |:unmap|, 2 for |noremap|. @@ -3550,29 +3554,29 @@ int get_map_mode(char **cmdp, bool forceit) p = *cmdp; modec = (uint8_t)(*p++); if (modec == 'i') { - mode = INSERT; // :imap + mode = MODE_INSERT; // :imap } else if (modec == 'l') { - mode = LANGMAP; // :lmap + mode = MODE_LANGMAP; // :lmap } else if (modec == 'c') { - mode = CMDLINE; // :cmap + mode = MODE_CMDLINE; // :cmap } else if (modec == 'n' && *p != 'o') { // avoid :noremap - mode = NORMAL; // :nmap + mode = MODE_NORMAL; // :nmap } else if (modec == 'v') { - mode = VISUAL + SELECTMODE; // :vmap + mode = MODE_VISUAL | MODE_SELECT; // :vmap } else if (modec == 'x') { - mode = VISUAL; // :xmap + mode = MODE_VISUAL; // :xmap } else if (modec == 's') { - mode = SELECTMODE; // :smap + mode = MODE_SELECT; // :smap } else if (modec == 'o') { - mode = OP_PENDING; // :omap + mode = MODE_OP_PENDING; // :omap } else if (modec == 't') { - mode = TERM_FOCUS; // :tmap + mode = MODE_TERMINAL; // :tmap } else { p--; if (forceit) { - mode = INSERT + CMDLINE; // :map ! + mode = MODE_INSERT | MODE_CMDLINE; // :map ! } else { - mode = VISUAL + SELECTMODE + NORMAL + OP_PENDING; // :map + mode = MODE_VISUAL | MODE_SELECT | MODE_NORMAL | MODE_OP_PENDING; // :map } } @@ -3671,34 +3675,34 @@ char *map_mode_to_chars(int mode) ga_init(&mapmode, 1, 7); - if ((mode & (INSERT + CMDLINE)) == INSERT + CMDLINE) { + if ((mode & (MODE_INSERT | MODE_CMDLINE)) == (MODE_INSERT | MODE_CMDLINE)) { ga_append(&mapmode, '!'); // :map! - } else if (mode & INSERT) { + } else if (mode & MODE_INSERT) { ga_append(&mapmode, 'i'); // :imap - } else if (mode & LANGMAP) { + } else if (mode & MODE_LANGMAP) { ga_append(&mapmode, 'l'); // :lmap - } else if (mode & CMDLINE) { + } else if (mode & MODE_CMDLINE) { ga_append(&mapmode, 'c'); // :cmap - } else if ((mode & (NORMAL + VISUAL + SELECTMODE + OP_PENDING)) - == NORMAL + VISUAL + SELECTMODE + OP_PENDING) { + } else if ((mode & (MODE_NORMAL | MODE_VISUAL | MODE_SELECT | MODE_OP_PENDING)) + == (MODE_NORMAL | MODE_VISUAL | MODE_SELECT | MODE_OP_PENDING)) { ga_append(&mapmode, ' '); // :map } else { - if (mode & NORMAL) { + if (mode & MODE_NORMAL) { ga_append(&mapmode, 'n'); // :nmap } - if (mode & OP_PENDING) { + if (mode & MODE_OP_PENDING) { ga_append(&mapmode, 'o'); // :omap } - if (mode & TERM_FOCUS) { + if (mode & MODE_TERMINAL) { ga_append(&mapmode, 't'); // :tmap } - if ((mode & (VISUAL + SELECTMODE)) == VISUAL + SELECTMODE) { + if ((mode & (MODE_VISUAL | MODE_SELECT)) == (MODE_VISUAL | MODE_SELECT)) { ga_append(&mapmode, 'v'); // :vmap } else { - if (mode & VISUAL) { + if (mode & MODE_VISUAL) { ga_append(&mapmode, 'x'); // :xmap } - if (mode & SELECTMODE) { + if (mode & MODE_SELECT) { ga_append(&mapmode, 's'); // :smap } } @@ -3807,17 +3811,17 @@ bool map_to_exists(const char *const str, const char *const modechars, const boo mode |= modeflags; \ } \ } while (0) - MAPMODE(mode, modechars, 'n', NORMAL); - MAPMODE(mode, modechars, 'v', VISUAL|SELECTMODE); - MAPMODE(mode, modechars, 'x', VISUAL); - MAPMODE(mode, modechars, 's', SELECTMODE); - MAPMODE(mode, modechars, 'o', OP_PENDING); - MAPMODE(mode, modechars, 'i', INSERT); - MAPMODE(mode, modechars, 'l', LANGMAP); - MAPMODE(mode, modechars, 'c', CMDLINE); + MAPMODE(mode, modechars, 'n', MODE_NORMAL); + MAPMODE(mode, modechars, 'v', MODE_VISUAL | MODE_SELECT); + MAPMODE(mode, modechars, 'x', MODE_VISUAL); + MAPMODE(mode, modechars, 's', MODE_SELECT); + MAPMODE(mode, modechars, 'o', MODE_OP_PENDING); + MAPMODE(mode, modechars, 'i', MODE_INSERT); + MAPMODE(mode, modechars, 'l', MODE_LANGMAP); + MAPMODE(mode, modechars, 'c', MODE_CMDLINE); #undef MAPMODE - retval = map_to_exists_mode((const char *)rhs, mode, abbr); + retval = map_to_exists_mode((char *)rhs, mode, abbr); xfree(buf); return retval; @@ -3895,9 +3899,9 @@ char_u *set_context_in_map_cmd(expand_T *xp, char_u *cmd, char_u *arg, bool forc if (isunmap) { expand_mapmodes = get_map_mode((char **)&cmd, forceit || isabbrev); } else { - expand_mapmodes = INSERT + CMDLINE; + expand_mapmodes = MODE_INSERT | MODE_CMDLINE; if (!isabbrev) { - expand_mapmodes += VISUAL + SELECTMODE + NORMAL + OP_PENDING; + expand_mapmodes |= MODE_VISUAL | MODE_SELECT | MODE_NORMAL | MODE_OP_PENDING; } } expand_isabbrev = isabbrev; @@ -4405,76 +4409,76 @@ int makemap(FILE *fd, buf_T *buf) cmd = "map"; } switch (mp->m_mode) { - case NORMAL + VISUAL + SELECTMODE + OP_PENDING: + case MODE_NORMAL | MODE_VISUAL | MODE_SELECT | MODE_OP_PENDING: break; - case NORMAL: + case MODE_NORMAL: c1 = 'n'; break; - case VISUAL: + case MODE_VISUAL: c1 = 'x'; break; - case SELECTMODE: + case MODE_SELECT: c1 = 's'; break; - case OP_PENDING: + case MODE_OP_PENDING: c1 = 'o'; break; - case NORMAL + VISUAL: + case MODE_NORMAL | MODE_VISUAL: c1 = 'n'; c2 = 'x'; break; - case NORMAL + SELECTMODE: + case MODE_NORMAL | MODE_SELECT: c1 = 'n'; c2 = 's'; break; - case NORMAL + OP_PENDING: + case MODE_NORMAL | MODE_OP_PENDING: c1 = 'n'; c2 = 'o'; break; - case VISUAL + SELECTMODE: + case MODE_VISUAL | MODE_SELECT: c1 = 'v'; break; - case VISUAL + OP_PENDING: + case MODE_VISUAL | MODE_OP_PENDING: c1 = 'x'; c2 = 'o'; break; - case SELECTMODE + OP_PENDING: + case MODE_SELECT | MODE_OP_PENDING: c1 = 's'; c2 = 'o'; break; - case NORMAL + VISUAL + SELECTMODE: + case MODE_NORMAL | MODE_VISUAL | MODE_SELECT: c1 = 'n'; c2 = 'v'; break; - case NORMAL + VISUAL + OP_PENDING: + case MODE_NORMAL | MODE_VISUAL | MODE_OP_PENDING: c1 = 'n'; c2 = 'x'; c3 = 'o'; break; - case NORMAL + SELECTMODE + OP_PENDING: + case MODE_NORMAL | MODE_SELECT | MODE_OP_PENDING: c1 = 'n'; c2 = 's'; c3 = 'o'; break; - case VISUAL + SELECTMODE + OP_PENDING: + case MODE_VISUAL | MODE_SELECT | MODE_OP_PENDING: c1 = 'v'; c2 = 'o'; break; - case CMDLINE + INSERT: + case MODE_CMDLINE | MODE_INSERT: if (!abbr) { cmd = "map!"; } break; - case CMDLINE: + case MODE_CMDLINE: c1 = 'c'; break; - case INSERT: + case MODE_INSERT: c1 = 'i'; break; - case LANGMAP: + case MODE_LANGMAP: c1 = 'l'; break; - case TERM_FOCUS: + case MODE_TERMINAL: c1 = 't'; break; default: @@ -4731,9 +4735,9 @@ char_u *check_map(char_u *keys, int mode, int exact, int ign_mod, int abbr, mapb void add_map(char_u *map, int mode, bool nore) { char_u *s; - char_u *cpo_save = p_cpo; + char *cpo_save = p_cpo; - p_cpo = (char_u *)""; // Allow <> notation + p_cpo = ""; // Allow <> notation // Need to put string in allocated memory, because do_map() will modify it. s = vim_strsave(map); (void)do_map(nore ? 2 : 0, s, mode, false); @@ -4825,7 +4829,7 @@ mapblock_T *get_maphash(int index, buf_T *buf) } /// Get command argument for <Cmd> key -char_u *getcmdkeycmd(int promptc, void *cookie, int indent, bool do_concat) +char *getcmdkeycmd(int promptc, void *cookie, int indent, bool do_concat) { garray_T line_ga; int c1 = -1, c2; @@ -4898,7 +4902,7 @@ char_u *getcmdkeycmd(int promptc, void *cookie, int indent, bool do_concat) ga_clear(&line_ga); } - return (char_u *)line_ga.ga_data; + return line_ga.ga_data; } bool map_execute_lua(void) diff --git a/src/nvim/globals.h b/src/nvim/globals.h index 620af9444c..1819af7ee4 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -84,7 +84,7 @@ EXTERN struct nvim_stats_s { // 0 not starting anymore // Number of Rows and Columns in the screen. -// Note: Use default_grid.Rows and default_grid.Columns to access items in +// Note: Use default_grid.rows and default_grid.cols to access items in // default_grid.chars[]. They may have different values when the screen // wasn't (re)allocated yet after setting Rows or Columns (e.g., when starting // up). @@ -253,7 +253,7 @@ EXTERN int lines_left INIT(= -1); // lines left for listing EXTERN int msg_no_more INIT(= false); // don't use more prompt, truncate // messages -EXTERN char_u *sourcing_name INIT(= NULL); // name of error message source +EXTERN char *sourcing_name INIT(= NULL); // name of error message source EXTERN linenr_T sourcing_lnum INIT(= 0); // line number of the source file EXTERN int ex_nesting_level INIT(= 0); // nesting level @@ -354,7 +354,7 @@ EXTERN bool did_source_packages INIT(= false); // provider function call EXTERN struct caller_scope { sctx_T script_ctx; - uint8_t *sourcing_name, *autocmd_fname, *autocmd_match; + char *sourcing_name, *autocmd_fname, *autocmd_match; linenr_T sourcing_lnum; int autocmd_bufnr; void *funccalp; @@ -421,10 +421,6 @@ EXTERN vimmenu_T *root_menu INIT(= NULL); // overruling of menus that the user already defined. EXTERN int sys_menu INIT(= false); -// While redrawing the screen this flag is set. It means the screen size -// ('lines' and 'rows') must not be changed. -EXTERN int updating_screen INIT(= 0); - // All windows are linked in a list. firstwin points to the first entry, // lastwin to the last entry (can be the same as firstwin) and curwin to the // currently active window. @@ -605,7 +601,7 @@ EXTERN pos_T Insstart; // This is where the latest // op_insert(), to detect correctly where inserting by the user started. EXTERN pos_T Insstart_orig; -// Stuff for VREPLACE mode. +// Stuff for MODE_VREPLACE state. EXTERN linenr_T orig_line_count INIT(= 0); // Line count when "gR" started EXTERN int vr_lines_changed INIT(= 0); // #Lines changed by "gR" so far @@ -631,13 +627,13 @@ EXTERN char_u *fenc_default INIT(= NULL); /// "State" is the main state of Vim. /// There are other variables that modify the state: -/// Visual_mode: When State is NORMAL or INSERT. -/// finish_op : When State is NORMAL, after typing the operator and +/// Visual_mode: When State is MODE_NORMAL or MODE_INSERT. +/// finish_op : When State is MODE_NORMAL, after typing the operator and /// before typing the motion command. /// motion_force: Last motion_force from do_pending_operator() /// debug_mode: Debug mode -EXTERN int State INIT(= NORMAL); // This is the current state of the - // command interpreter. +EXTERN int State INIT(= MODE_NORMAL); + EXTERN bool debug_mode INIT(= false); EXTERN bool finish_op INIT(= false); // true while an operator is pending EXTERN long opcount INIT(= 0); // count for pending operator @@ -748,16 +744,16 @@ EXTERN int global_busy INIT(= 0); ///< set when :global is executing EXTERN bool listcmd_busy INIT(= false); ///< set when :argdo, :windo or :bufdo is executing EXTERN bool need_start_insertmode INIT(= false); ///< start insert mode soon -#define MODE_MAX_LENGTH 4 // max mode length returned in get_mode() - // including the final NUL character +#define MODE_MAX_LENGTH 4 // max mode length returned in get_mode(), + // including the terminating NUL EXTERN char last_mode[MODE_MAX_LENGTH] INIT(= "n"); EXTERN char_u *last_cmdline INIT(= NULL); // last command line (for ":) EXTERN char_u *repeat_cmdline INIT(= NULL); // command line for "." EXTERN char_u *new_last_cmdline INIT(= NULL); // new value for last_cmdline -EXTERN char_u *autocmd_fname INIT(= NULL); // fname for <afile> on cmdline +EXTERN char *autocmd_fname INIT(= NULL); // fname for <afile> on cmdline EXTERN int autocmd_bufnr INIT(= 0); // fnum for <abuf> on cmdline -EXTERN char_u *autocmd_match INIT(= NULL); // name for <amatch> on cmdline +EXTERN char *autocmd_match INIT(= NULL); // name for <amatch> on cmdline EXTERN bool did_cursorhold INIT(= false); // set when CursorHold t'gerd EXTERN int postponed_split INIT(= 0); // for CTRL-W CTRL-] command @@ -811,7 +807,7 @@ extern char_u *compiled_sys; // When a window has a local directory, the absolute path of the global // current directory is stored here (in allocated memory). If the current // directory is not a local directory, globaldir is NULL. -EXTERN char_u *globaldir INIT(= NULL); +EXTERN char *globaldir INIT(= NULL); EXTERN char *last_chdir_reason INIT(= NULL); @@ -877,7 +873,8 @@ EXTERN char e_api_spawn_failed[] INIT(= N_("E903: Could not spawn API job")); EXTERN char e_argreq[] INIT(= N_("E471: Argument required")); EXTERN char e_backslash[] INIT(= N_("E10: \\ should be followed by /, ? or &")); EXTERN char e_cmdwin[] INIT(= N_("E11: Invalid in command-line window; <CR> executes, CTRL-C quits")); -EXTERN char e_curdir[] INIT(= N_( "E12: Command not allowed from exrc/vimrc in current dir or tag search")); +EXTERN char e_curdir[] INIT(= N_("E12: Command not allowed from exrc/vimrc in current dir or tag search")); +EXTERN char e_command_too_recursive[] INIT(= N_("E169: Command too recursive")); EXTERN char e_endif[] INIT(= N_("E171: Missing :endif")); EXTERN char e_endtry[] INIT(= N_("E600: Missing :endtry")); EXTERN char e_endwhile[] INIT(= N_("E170: Missing :endwhile")); @@ -997,6 +994,7 @@ EXTERN char e_listarg[] INIT(= N_("E686: Argument of %s must be a List")); EXTERN char e_unsupportedoption[] INIT(= N_("E519: Option not supported")); EXTERN char e_fnametoolong[] INIT(= N_("E856: Filename too long")); EXTERN char e_float_as_string[] INIT(= N_("E806: using Float as a String")); +EXTERN char e_cannot_edit_other_buf[] INIT(= N_("E788: Not allowed to edit another buffer now")); EXTERN char e_autocmd_err[] INIT(= N_("E5500: autocmd has thrown an exception: %s")); EXTERN char e_cmdmap_err[] INIT(= N_("E5520: <Cmd> mapping must end with <CR>")); diff --git a/src/nvim/grid.c b/src/nvim/grid.c index 8a5d8081c0..fa5c193fe0 100644 --- a/src/nvim/grid.c +++ b/src/nvim/grid.c @@ -6,6 +6,7 @@ #include "nvim/highlight.h" #include "nvim/ui.h" #include "nvim/vim.h" +#include "nvim/screen.h" #ifdef INCLUDE_GENERATED_DECLARATIONS # include "grid.c.generated.h" @@ -63,7 +64,7 @@ void grid_clear_line(ScreenGrid *grid, size_t off, int width, bool valid) void grid_invalidate(ScreenGrid *grid) { - (void)memset(grid->attrs, -1, sizeof(sattr_T) * (size_t)(grid->Rows * grid->Columns)); + (void)memset(grid->attrs, -1, sizeof(sattr_T) * (size_t)grid->rows * (size_t)grid->cols); } bool grid_invalid_row(ScreenGrid *grid, int row) @@ -92,7 +93,7 @@ bool grid_lefthalve(ScreenGrid *grid, int row, int col) grid_adjust(&grid, &row, &col); return grid_off2cells(grid, grid->line_offset[row] + (size_t)col, - grid->line_offset[row] + (size_t)grid->Columns) > 1; + grid->line_offset[row] + (size_t)grid->cols) > 1; } /// Correct a position on the screen, if it's the right half of a double-wide @@ -128,7 +129,7 @@ void grid_getbytes(ScreenGrid *grid, int row, int col, char_u *bytes, int *attrp grid_adjust(&grid, &row, &col); // safety check - if (grid->chars != NULL && row < grid->Rows && col < grid->Columns) { + if (grid->chars != NULL && row < grid->rows && col < grid->cols) { off = grid->line_offset[row] + (size_t)col; *attrp = grid->attrs[off]; schar_copy(bytes, grid->chars[off]); @@ -202,8 +203,8 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row, int col // Safety check. The check for negative row and column is to fix issue // vim/vim#4102. TODO(neovim): find out why row/col could be negative. if (grid->chars == NULL - || row >= grid->Rows || row < 0 - || col >= grid->Columns || col < 0) { + || row >= grid->rows || row < 0 + || col >= grid->cols || col < 0) { return; } @@ -225,8 +226,8 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row, int col put_dirty_last = MAX(put_dirty_last, 1); } - max_off = grid->line_offset[row] + (size_t)grid->Columns; - while (col < grid->Columns + max_off = grid->line_offset[row] + (size_t)grid->cols; + while (col < grid->cols && (len < 0 || (int)(ptr - text) < len) && *ptr != NUL) { c = *ptr; @@ -259,7 +260,7 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row, int col } else { prev_c = u8c; } - if (col + mbyte_cells > grid->Columns) { + if (col + mbyte_cells > grid->cols) { // Only 1 cell left, but character requires 2 cells: // display a '>' in the last column to avoid wrapping. */ c = '>'; @@ -338,7 +339,7 @@ void grid_puts_line_flush(bool set_cursor) if (put_dirty_first < put_dirty_last) { if (set_cursor) { ui_grid_cursor_goto(put_dirty_grid->handle, put_dirty_row, - MIN(put_dirty_last, put_dirty_grid->Columns - 1)); + MIN(put_dirty_last, put_dirty_grid->cols - 1)); } if (!put_dirty_grid->throttled) { ui_line(put_dirty_grid, put_dirty_row, put_dirty_first, put_dirty_last, @@ -371,11 +372,11 @@ void grid_fill(ScreenGrid *grid, int start_row, int end_row, int start_col, int end_col += col_off; // safety check - if (end_row > grid->Rows) { - end_row = grid->Rows; + if (end_row > grid->rows) { + end_row = grid->rows; } - if (end_col > grid->Columns) { - end_col = grid->Columns; + if (end_col > grid->cols) { + end_col = grid->cols; } // nothing to do @@ -391,7 +392,7 @@ void grid_fill(ScreenGrid *grid, int start_row, int end_row, int start_col, int if (start_col > 0 && grid_fix_col(grid, start_col, row) != start_col) { grid_puts_len(grid, (char_u *)" ", 1, row, start_col - 1, 0); } - if (end_col < grid->Columns + if (end_col < grid->cols && grid_fix_col(grid, end_col, row) != end_col) { grid_puts_len(grid, (char_u *)" ", 1, row, end_col, 0); } @@ -443,7 +444,7 @@ void grid_fill(ScreenGrid *grid, int start_row, int end_row, int start_col, int } } - if (end_col == grid->Columns) { + if (end_col == grid->cols) { grid->line_wraps[row] = false; } } @@ -491,17 +492,17 @@ void grid_put_linebuf(ScreenGrid *grid, int row, int coloff, int endcol, int cle // TODO(bfredl): check all callsites and eliminate // Check for illegal row and col, just in case - if (row >= grid->Rows) { - row = grid->Rows - 1; + if (row >= grid->rows) { + row = grid->rows - 1; } - if (endcol > grid->Columns) { - endcol = grid->Columns; + if (endcol > grid->cols) { + endcol = grid->cols; } grid_adjust(&grid, &row, &coloff); // Safety check. Avoids clang warnings down the call stack. - if (grid->chars == NULL || row >= grid->Rows || coloff >= grid->Columns) { + if (grid->chars == NULL || row >= grid->rows || coloff >= grid->cols) { DLOG("invalid state, skipped"); return; } @@ -509,7 +510,7 @@ void grid_put_linebuf(ScreenGrid *grid, int row, int coloff, int endcol, int cle size_t off_from = 0; size_t off_to = grid->line_offset[row] + (size_t)coloff; max_off_from = linebuf_size; - max_off_to = grid->line_offset[row] + (size_t)grid->Columns; + max_off_to = grid->line_offset[row] + (size_t)grid->cols; if (rlflag) { // Clear rest first, because it's left of the text. @@ -617,7 +618,7 @@ void grid_put_linebuf(ScreenGrid *grid, int row, int coloff, int endcol, int cle } } - if (clear_width > 0 || wp->w_width != grid->Columns) { + if (clear_width > 0 || wp->w_width != grid->cols) { // If we cleared after the end of the line, it did not wrap. // For vsplit, line wrapping is not possible. grid->line_wraps[row] = false; @@ -646,11 +647,11 @@ void grid_alloc(ScreenGrid *grid, int rows, int columns, bool copy, bool valid) new.line_offset = xmalloc((size_t)rows * sizeof(*new.line_offset)); new.line_wraps = xmalloc((size_t)rows * sizeof(*new.line_wraps)); - new.Rows = rows; - new.Columns = columns; + new.rows = rows; + new.cols = columns; - for (new_row = 0; new_row < new.Rows; new_row++) { - new.line_offset[new_row] = (size_t)new_row * (size_t)new.Columns; + for (new_row = 0; new_row < new.rows; new_row++) { + new.line_offset[new_row] = (size_t)new_row * (size_t)new.cols; new.line_wraps[new_row] = false; grid_clear_line(&new, new.line_offset[new_row], columns, valid); @@ -660,8 +661,8 @@ void grid_alloc(ScreenGrid *grid, int rows, int columns, bool copy, bool valid) // possible from the old screen to the new one and clear the rest // (used when resizing the window at the "--more--" prompt or when // executing an external command, for the GUI). - if (new_row < grid->Rows && grid->chars != NULL) { - int len = MIN(grid->Columns, new.Columns); + if (new_row < grid->rows && grid->chars != NULL) { + int len = MIN(grid->cols, new.cols); memmove(new.chars + new.line_offset[new_row], grid->chars + grid->line_offset[new_row], (size_t)len * sizeof(schar_T)); @@ -705,3 +706,83 @@ void grid_free_all_mem(void) xfree(linebuf_char); xfree(linebuf_attr); } + +/// (Re)allocates a window grid if size changed while in ext_multigrid mode. +/// Updates size, offsets and handle for the grid regardless. +/// +/// If "doclear" is true, don't try to copy from the old grid rather clear the +/// resized grid. +void win_grid_alloc(win_T *wp) +{ + ScreenGrid *grid = &wp->w_grid; + ScreenGrid *grid_allocated = &wp->w_grid_alloc; + + int rows = wp->w_height_inner; + int cols = wp->w_width_inner; + int total_rows = wp->w_height_outer; + int total_cols = wp->w_width_outer; + + bool want_allocation = ui_has(kUIMultigrid) || wp->w_floating; + bool has_allocation = (grid_allocated->chars != NULL); + + if (grid->rows != rows) { + wp->w_lines_valid = 0; + xfree(wp->w_lines); + wp->w_lines = xcalloc((size_t)rows + 1, sizeof(wline_T)); + } + + int was_resized = false; + if (want_allocation && (!has_allocation + || grid_allocated->rows != total_rows + || grid_allocated->cols != total_cols)) { + grid_alloc(grid_allocated, total_rows, total_cols, + wp->w_grid_alloc.valid, false); + grid_allocated->valid = true; + if (wp->w_floating && wp->w_float_config.border) { + wp->w_redr_border = true; + } + was_resized = true; + } else if (!want_allocation && has_allocation) { + // Single grid mode, all rendering will be redirected to default_grid. + // Only keep track of the size and offset of the window. + grid_free(grid_allocated); + grid_allocated->valid = false; + was_resized = true; + } else if (want_allocation && has_allocation && !wp->w_grid_alloc.valid) { + grid_invalidate(grid_allocated); + grid_allocated->valid = true; + } + + grid->rows = rows; + grid->cols = cols; + + if (want_allocation) { + grid->target = grid_allocated; + grid->row_offset = wp->w_winrow_off; + grid->col_offset = wp->w_wincol_off; + } else { + grid->target = &default_grid; + grid->row_offset = wp->w_winrow + wp->w_winrow_off; + grid->col_offset = wp->w_wincol + wp->w_wincol_off; + } + + // send grid resize event if: + // - a grid was just resized + // - screen_resize was called and all grid sizes must be sent + // - the UI wants multigrid event (necessary) + if ((resizing_screen || was_resized) && want_allocation) { + ui_call_grid_resize(grid_allocated->handle, + grid_allocated->cols, grid_allocated->rows); + } +} + +/// assign a handle to the grid. The grid need not be allocated. +void grid_assign_handle(ScreenGrid *grid) +{ + static int last_grid_handle = DEFAULT_GRID_HANDLE; + + // only assign a grid handle if not already + if (grid->handle == 0) { + grid->handle = ++last_grid_handle; + } +} diff --git a/src/nvim/grid_defs.h b/src/nvim/grid_defs.h index 2516ea52a7..a97a1c2c39 100644 --- a/src/nvim/grid_defs.h +++ b/src/nvim/grid_defs.h @@ -58,8 +58,8 @@ struct ScreenGrid { int *dirty_col; // the size of the allocated grid. - int Rows; - int Columns; + int rows; + int cols; // The state of the grid is valid. Otherwise it needs to be redrawn. bool valid; diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c index f75f304bc1..fb174baef8 100644 --- a/src/nvim/hardcopy.c +++ b/src/nvim/hardcopy.c @@ -311,12 +311,12 @@ static char *parse_list_options(char_u *option_str, option_table_T *table, size_ */ stringp = option_str; while (*stringp) { - colonp = vim_strchr(stringp, ':'); + colonp = (char_u *)vim_strchr((char *)stringp, ':'); if (colonp == NULL) { ret = N_("E550: Missing colon"); break; } - commap = vim_strchr(stringp, ','); + commap = (char_u *)vim_strchr((char *)stringp, ','); if (commap == NULL) { commap = option_str + STRLEN(option_str); } @@ -661,7 +661,7 @@ void ex_hardcopy(exarg_T *eap) */ if (mch_print_init(&settings, curbuf->b_fname == NULL ? buf_spname(curbuf) : curbuf->b_sfname == - NULL ? curbuf->b_fname : curbuf->b_sfname, eap->forceit) == FAIL) { + NULL ? (char_u *)curbuf->b_fname : curbuf->b_sfname, eap->forceit) == FAIL) { return; } @@ -1576,7 +1576,7 @@ static void prt_resource_name(char *filename, void *cookie) static int prt_find_resource(char *name, struct prt_ps_resource_S *resource) { - char_u *buffer; + char *buffer; int retval; buffer = xmallocz(MAXPATHL); @@ -1584,11 +1584,11 @@ static int prt_find_resource(char *name, struct prt_ps_resource_S *resource) STRLCPY(resource->name, name, 64); // Look for named resource file in runtimepath STRCPY(buffer, "print"); - add_pathsep((char *)buffer); + add_pathsep(buffer); STRLCAT(buffer, name, MAXPATHL); STRLCAT(buffer, ".ps", MAXPATHL); resource->filename[0] = NUL; - retval = (do_in_runtimepath((char *)buffer, 0, prt_resource_name, resource->filename) + retval = (do_in_runtimepath(buffer, 0, prt_resource_name, resource->filename) && resource->filename[0] != NUL); xfree(buffer); return retval; @@ -2344,7 +2344,7 @@ int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit) * Set up the font size. */ fontsize = PRT_PS_DEFAULT_FONTSIZE; - for (p = p_pfn; (p = vim_strchr(p, ':')) != NULL; ++p) { + for (p = p_pfn; (p = (char_u *)vim_strchr((char *)p, ':')) != NULL; p++) { if (p[1] == 'h' && ascii_isdigit(p[2])) { fontsize = atoi((char *)p + 2); } @@ -2413,7 +2413,7 @@ int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit) } prt_ps_fd = os_fopen((char *)prt_ps_file_name, WRITEBIN); } else { - p = expand_env_save(psettings->outfile); + p = (char_u *)expand_env_save((char *)psettings->outfile); if (p != NULL) { prt_ps_fd = os_fopen((char *)p, WRITEBIN); xfree(p); @@ -2525,7 +2525,7 @@ bool mch_print_begin(prt_settings_T *psettings) char ctime_buf[50]; char *p_time = os_ctime(ctime_buf, sizeof(ctime_buf)); // Note: os_ctime() adds a \n so we have to remove it :-( - p = vim_strchr((char_u *)p_time, '\n'); + p = (char_u *)vim_strchr(p_time, '\n'); if (p != NULL) { *p = NUL; } diff --git a/src/nvim/highlight_defs.h b/src/nvim/highlight_defs.h index 0515842b61..d293865efd 100644 --- a/src/nvim/highlight_defs.h +++ b/src/nvim/highlight_defs.h @@ -111,7 +111,9 @@ typedef enum { HLF_NFLOAT, // Floating window HLF_MSG, // Message area HLF_BORDER, // Floating window border - HLF_COUNT, // MUST be the last one + HLF_WBR, // Window bars + HLF_WBRNC, // Window bars of not-current windows + HLF_COUNT, // MUST be the last one } hlf_T; EXTERN const char *hlf_names[] INIT(= { @@ -172,6 +174,8 @@ EXTERN const char *hlf_names[] INIT(= { [HLF_NFLOAT] = "NormalFloat", [HLF_MSG] = "MsgArea", [HLF_BORDER] = "FloatBorder", + [HLF_WBR] = "WinBar", + [HLF_WBRNC] = "WinBarNC", }); diff --git a/src/nvim/highlight_group.c b/src/nvim/highlight_group.c index c4b826c3fd..0047cb02d6 100644 --- a/src/nvim/highlight_group.c +++ b/src/nvim/highlight_group.c @@ -103,9 +103,11 @@ static const char *highlight_init_both[] = { "TabLineFill cterm=reverse gui=reverse", "TabLineSel cterm=bold gui=bold", "TermCursor cterm=reverse gui=reverse", - "VertSplit cterm=reverse gui=reverse", + "WinBar cterm=bold gui=bold", "WildMenu ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black", + "default link VertSplit Normal", "default link WinSeparator VertSplit", + "default link WinBarNC WinBar", "default link EndOfBuffer NonText", "default link LineNrAbove LineNr", "default link LineNrBelow LineNr", @@ -560,7 +562,7 @@ int load_colors(char_u *name) recursive = true; size_t buflen = STRLEN(name) + 12; buf = xmalloc(buflen); - apply_autocmds(EVENT_COLORSCHEMEPRE, name, curbuf->b_fname, false, curbuf); + apply_autocmds(EVENT_COLORSCHEMEPRE, (char *)name, curbuf->b_fname, false, curbuf); snprintf((char *)buf, buflen, "colors/%s.vim", name); retval = source_runtime((char *)buf, DIP_START + DIP_OPT); if (retval == FAIL) { @@ -568,7 +570,7 @@ int load_colors(char_u *name) retval = source_runtime((char *)buf, DIP_START + DIP_OPT); } xfree(buf); - apply_autocmds(EVENT_COLORSCHEME, name, curbuf->b_fname, false, curbuf); + apply_autocmds(EVENT_COLORSCHEME, (char *)name, curbuf->b_fname, false, curbuf); recursive = false; diff --git a/src/nvim/if_cscope.c b/src/nvim/if_cscope.c index d9cc643e53..7174e58986 100644 --- a/src/nvim/if_cscope.c +++ b/src/nvim/if_cscope.c @@ -80,7 +80,7 @@ static enum { * Function given to ExpandGeneric() to obtain the cscope command * expansion. */ -char_u *get_cscope_name(expand_T *xp, int idx) +char *get_cscope_name(expand_T *xp, int idx) { int current_idx; @@ -88,7 +88,7 @@ char_u *get_cscope_name(expand_T *xp, int idx) case EXP_CSCOPE_SUBCMD: // Complete with sub-commands of ":cscope": // add, find, help, kill, reset, show - return (char_u *)cs_cmds[idx].name; + return cs_cmds[idx].name; case EXP_SCSCOPE_SUBCMD: { // Complete with sub-commands of ":scscope": same sub-commands as // ":cscope" but skip commands which don't support split windows @@ -100,7 +100,7 @@ char_u *get_cscope_name(expand_T *xp, int idx) } } } - return (char_u *)cs_cmds[i].name; + return cs_cmds[i].name; } case EXP_CSCOPE_FIND: { const char *query_type[] = @@ -112,7 +112,7 @@ char_u *get_cscope_name(expand_T *xp, int idx) // {query_type} can be letters (c, d, ... a) or numbers (0, 1, // ..., 9) but only complete with letters, since numbers are // redundant. - return (char_u *)query_type[idx]; + return (char *)query_type[idx]; } case EXP_CSCOPE_KILL: { static char connection[5]; @@ -128,10 +128,10 @@ char_u *get_cscope_name(expand_T *xp, int idx) } if (current_idx++ == idx) { vim_snprintf(connection, sizeof(connection), "%zu", i); - return (char_u *)connection; + return connection; } } - return (current_idx == idx && idx > 0) ? (char_u *)"-1" : NULL; + return (current_idx == idx && idx > 0) ? "-1" : NULL; } default: return NULL; @@ -962,7 +962,7 @@ static bool cs_find_common(char *opt, char *pat, int forceit, int verbose, bool cmdletter = opt[0]; } - qfpos = (char *)vim_strchr(p_csqf, cmdletter); + qfpos = vim_strchr((char *)p_csqf, cmdletter); if (qfpos != NULL) { qfpos++; // next symbol must be + or - @@ -972,8 +972,7 @@ static bool cs_find_common(char *opt, char *pat, int forceit, int verbose, bool } if (*qfpos != '0' - && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)"cscope", - curbuf->b_fname, true, curbuf)) { + && apply_autocmds(EVENT_QUICKFIXCMDPRE, "cscope", curbuf->b_fname, true, curbuf)) { if (aborting()) { return false; } @@ -1049,8 +1048,7 @@ static bool cs_find_common(char *opt, char *pat, int forceit, int verbose, bool postponed_split = 0; } - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)"cscope", - curbuf->b_fname, TRUE, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, "cscope", curbuf->b_fname, true, curbuf); if (use_ll) { /* * In the location list window, use the displayed location @@ -2008,8 +2006,8 @@ static char *cs_resolve_file(size_t i, char *name) // path in path resolution. csdir = xmalloc(MAXPATHL); STRLCPY(csdir, csinfo[i].fname, - path_tail((char_u *)csinfo[i].fname) - - (char_u *)csinfo[i].fname + 1); + path_tail(csinfo[i].fname) + - csinfo[i].fname + 1); len += STRLEN(csdir); } diff --git a/src/nvim/indent.c b/src/nvim/indent.c index b7eb6f27f5..882a10e1e8 100644 --- a/src/nvim/indent.c +++ b/src/nvim/indent.c @@ -404,10 +404,10 @@ int get_number_indent(linenr_T lnum) pos.lnum = 0; // In format_lines() (i.e. not insert mode), fo+=q is needed too... - if ((State & INSERT) || has_format_option(FO_Q_COMS)) { + if ((State & MODE_INSERT) || has_format_option(FO_Q_COMS)) { lead_len = get_leader_len(ml_get(lnum), NULL, false, true); } - regmatch.regprog = vim_regcomp(curbuf->b_p_flp, RE_MAGIC); + regmatch.regprog = vim_regcomp((char *)curbuf->b_p_flp, RE_MAGIC); if (regmatch.regprog != NULL) { regmatch.rm_ic = false; @@ -467,7 +467,7 @@ int get_breakindent_win(win_T *wp, char_u *line) // add additional indent for numbered lists if (wp->w_briopt_list != 0) { regmatch_T regmatch = { - .regprog = vim_regcomp(curbuf->b_p_flp, + .regprog = vim_regcomp((char *)curbuf->b_p_flp, RE_MAGIC + RE_STRING + RE_AUTO + RE_STRICT), }; @@ -522,6 +522,11 @@ int inindent(int extra) } } +/// @return true if the conditions are OK for smart indenting. +bool may_do_si(void) +{ + return curbuf->b_p_si && !curbuf->b_p_cin && *curbuf->b_p_inde == NUL && !p_paste; +} // Get indent level from 'indentexpr'. int get_expr_indent(void) @@ -560,7 +565,7 @@ int get_expr_indent(void) // Pretend to be in Insert mode, allow cursor past end of line for "o" // command. save_State = State; - State = INSERT; + State = MODE_INSERT; curwin->w_cursor = save_pos; curwin->w_curswant = save_curswant; curwin->w_set_curswant = save_set_curswant; diff --git a/src/nvim/indent_c.c b/src/nvim/indent_c.c index 54e7d72adc..e6dc985726 100644 --- a/src/nvim/indent_c.c +++ b/src/nvim/indent_c.c @@ -1,12 +1,9 @@ // This is an open source non-commercial project. Dear PVS-Studio, please check // it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com -// uncrustify:off - #include <assert.h> #include <inttypes.h> -#include "nvim/vim.h" #include "nvim/ascii.h" #include "nvim/charset.h" #include "nvim/cursor.h" @@ -19,11 +16,12 @@ #include "nvim/option.h" #include "nvim/search.h" #include "nvim/strings.h" +#include "nvim/vim.h" // Find result cache for cpp_baseclass typedef struct { - int found; - lpos_T lpos; + int found; + lpos_T lpos; } cpp_baseclass_cache_T; #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -44,10 +42,11 @@ pos_T *find_start_comment(int ind_maxcomment) // XXX pos_T *pos; int64_t cur_maxcomment = ind_maxcomment; - for (;; ) { + for (;;) { pos = findmatchlimit(NULL, '*', FM_BACKWARD, cur_maxcomment); - if (pos == NULL) + if (pos == NULL) { break; + } /* * Check if the comment start we found is inside a string. @@ -105,30 +104,27 @@ static pos_T *ind_find_start_CORS(linenr_T *is_raw) */ static pos_T *find_start_rawstring(int ind_maxcomment) // XXX { - pos_T *pos; - long cur_maxcomment = ind_maxcomment; + pos_T *pos; + long cur_maxcomment = ind_maxcomment; - for (;;) - { - pos = findmatchlimit(NULL, 'R', FM_BACKWARD, cur_maxcomment); - if (pos == NULL) - break; + for (;;) { + pos = findmatchlimit(NULL, 'R', FM_BACKWARD, cur_maxcomment); + if (pos == NULL) { + break; + } - /* - * Check if the raw string start we found is inside a string. - * If it is then restrict the search to below this line and try again. - */ - if (!is_pos_in_string(ml_get(pos->lnum), pos->col)) { - break; - } - cur_maxcomment = curwin->w_cursor.lnum - pos->lnum - 1; - if (cur_maxcomment <= 0) - { - pos = NULL; - break; - } + // Check if the raw string start we found is inside a string. + // If it is then restrict the search to below this line and try again. + if (!is_pos_in_string(ml_get(pos->lnum), pos->col)) { + break; } - return pos; + cur_maxcomment = curwin->w_cursor.lnum - pos->lnum - 1; + if (cur_maxcomment <= 0) { + pos = NULL; + break; + } + } + return pos; } /* @@ -154,7 +150,7 @@ static const char_u *skip_string(const char_u *p) i++; } } - if (p[i] == '\'') { // check for trailing ' + if (p[i - 1] != NUL && p[i] == '\'') { // check for trailing ' p += i; continue; } @@ -171,8 +167,8 @@ static const char_u *skip_string(const char_u *p) } } else if (p[0] == 'R' && p[1] == '"') { // Raw string: R"[delim](...)[delim]" - const char_u *delim = p + 2; - const char_u *paren = vim_strchr(delim, '('); + const char *delim = (char *)p + 2; + const char *paren = vim_strchr((char *)delim, '('); if (paren != NULL) { const ptrdiff_t delim_len = paren - delim; @@ -228,7 +224,7 @@ bool cin_is_cinword(const char_u *line) char_u *cinw_buf = xmalloc(cinw_len); line = (char_u *)skipwhite((char *)line); - for (char_u *cinw = curbuf->b_p_cinw; *cinw; ) { + for (char_u *cinw = curbuf->b_p_cinw; *cinw;) { size_t len = copy_option_part(&cinw, cinw_buf, cinw_len, ","); if (STRNCMP(line, cinw_buf, len) == 0 && (!vim_iswordc(line[len]) || !vim_iswordc(line[len - 1]))) { @@ -243,7 +239,6 @@ bool cin_is_cinword(const char_u *line) } - /* * Skip over white space and C comments within the line. * Also skip over Perl/shell comments if desired. @@ -269,8 +264,9 @@ static const char_u *cin_skipcomment(const char_u *s) s += STRLEN(s); break; } - if (*s != '*') + if (*s != '*') { break; + } for (++s; *s; s++) { // skip slash-star comment if (s[0] == '*' && s[1] == '/') { s += 2; @@ -296,8 +292,8 @@ static int cin_nocode(const char_u *s) static pos_T *find_line_comment(void) // XXX { static pos_T pos; - char_u *line; - char_u *p; + char_u *line; + char_u *p; pos = curwin->w_cursor; while (--pos.lnum > 0) { @@ -307,8 +303,9 @@ static pos_T *find_line_comment(void) // XXX pos.col = (int)(p - line); return &pos; } - if (*p != NUL) + if (*p != NUL) { break; + } } return NULL; } @@ -324,8 +321,8 @@ static bool cin_has_js_key(const char_u *text) quote = *s; ++s; } - if (!vim_isIDc(*s)) { // need at least one ID character - return FALSE; + if (!vim_isIDc(*s)) { // need at least one ID character + return false; } while (vim_isIDc(*s)) { @@ -350,8 +347,9 @@ static bool cin_islabel_skip(const char_u **s) return false; } - while (vim_isIDc(**s)) + while (vim_isIDc(**s)) { (*s)++; + } *s = cin_skipcomment(*s); @@ -431,10 +429,11 @@ static int cin_isinit(void) s = cin_skipcomment(get_cursor_line_ptr()); - if (cin_starts_with(s, "typedef")) + if (cin_starts_with(s, "typedef")) { s = cin_skipcomment(s + 7); + } - for (;; ) { + for (;;) { int i, l; for (i = 0; i < (int)ARRAY_SIZE(skip); ++i) { @@ -445,26 +444,26 @@ static int cin_isinit(void) break; } } - if (l != 0) + if (l != 0) { break; + } } - if (cin_starts_with(s, "enum")) - return TRUE; + if (cin_starts_with(s, "enum")) { + return true; + } - if (cin_ends_in(s, (char_u *)"=", (char_u *)"{")) - return TRUE; + if (cin_ends_in(s, (char_u *)"=", (char_u *)"{")) { + return true; + } return FALSE; } -/* - * Recognize a switch label: "case .*:" or "default:". - */ -bool cin_iscase( - const char_u *s, - bool strict // Allow relaxed check of case statement for JS -) +/// Recognize a switch label: "case .*:" or "default:". +/// +/// @param strict Allow relaxed check of case statement for JS +bool cin_iscase(const char_u *s, bool strict) { s = cin_skipcomment(s); if (cin_starts_with(s, "case")) { @@ -522,7 +521,7 @@ bool cin_isscopedecl(const char_u *p) bool found = false; - for (char_u *cinsd = curbuf->b_p_cinsd; *cinsd; ) { + for (char_u *cinsd = curbuf->b_p_cinsd; *cinsd;) { const size_t len = copy_option_part(&cinsd, cinsd_buf, cinsd_len, ","); if (STRNCMP(s, cinsd_buf, len) == 0) { const char_u *skip = cin_skipcomment(s + len); @@ -586,8 +585,8 @@ static bool cin_is_cpp_namespace(const char_u *s) /* * Return a pointer to the first non-empty non-comment character after a ':'. * Return NULL if not found. - * case 234: a = b; - * ^ + * case 234: a = b; + * ^ */ static const char_u *after_label(const char_u *l) { @@ -602,11 +601,13 @@ static const char_u *after_label(const char_u *l) l += 2; // skip over 'x' } } - if (*l == NUL) + if (*l == NUL) { return NULL; + } l = cin_skipcomment(l + 1); - if (*l == NUL) + if (*l == NUL) { return NULL; + } return l; } @@ -623,8 +624,9 @@ static int get_indent_nolabel(linenr_T lnum) // XXX l = ml_get(lnum); p = after_label(l); - if (p == NULL) + if (p == NULL) { return 0; + } fp.col = (colnr_T)(p - l); fp.lnum = lnum; @@ -635,8 +637,8 @@ static int get_indent_nolabel(linenr_T lnum) // XXX /* * Find indent for line "lnum", ignoring any case or jump label. * Also return a pointer to the text (after the label) in "pp". - * label: if (asdf && asdfasdf) - * ^ + * label: if (asdf && asdfasdf) + * ^ */ static int skip_label(linenr_T lnum, const char_u **pp) { @@ -666,14 +668,14 @@ static int skip_label(linenr_T lnum, const char_u **pp) /* * Return the indent of the first variable name after a type in a declaration. - * int a, indent of "a" - * static struct foo b, indent of "b" - * enum bla c, indent of "c" + * int a, indent of "a" + * static struct foo b, indent of "b" + * enum bla c, indent of "c" * Returns zero when it doesn't look like a declaration. */ static int cin_first_id_amount(void) { - char_u *line, *p, *s; + char_u *line, *p, *s; int len; pos_T fp; colnr_T col; @@ -699,10 +701,10 @@ static int cin_first_id_amount(void) p = s; } } - for (len = 0; vim_isIDc(p[len]); ++len) - ; - if (len == 0 || !ascii_iswhite(p[len]) || cin_nocode(p)) + for (len = 0; vim_isIDc(p[len]); len++) {} + if (len == 0 || !ascii_iswhite(p[len]) || cin_nocode(p)) { return 0; + } p = (char_u *)skipwhite((char *)p + len); fp.lnum = curwin->w_cursor.lnum; @@ -717,8 +719,8 @@ static int cin_first_id_amount(void) * Return zero if no (useful) equal sign found. * Return -1 if the line above "lnum" ends in a backslash. * foo = "asdf\ - * asdf\ - * here"; + * asdf\ + * here"; */ static int cin_get_equal_amount(linenr_T lnum) { @@ -729,20 +731,22 @@ static int cin_get_equal_amount(linenr_T lnum) if (lnum > 1) { line = ml_get(lnum - 1); - if (*line != NUL && line[STRLEN(line) - 1] == '\\') + if (*line != NUL && line[STRLEN(line) - 1] == '\\') { return -1; + } } line = s = ml_get(lnum); - while (*s != NUL && vim_strchr((char_u *)"=;{}\"'", *s) == NULL) { + while (*s != NUL && vim_strchr("=;{}\"'", *s) == NULL) { if (cin_iscomment(s)) { // ignore comments s = cin_skipcomment(s); } else { s++; } } - if (*s != '=') + if (*s != '=') { return 0; + } s = (char_u *)skipwhite((char *)s + 1); if (cin_nocode(s)) { @@ -785,17 +789,19 @@ static int cin_ispreproc_cont(const char_u **pp, linenr_T *lnump, int *amount) candidate_amount = get_indent_lnum(lnum); } - for (;; ) { + for (;;) { if (cin_ispreproc(line)) { retval = TRUE; *lnump = lnum; break; } - if (lnum == 1) + if (lnum == 1) { break; + } line = ml_get(--lnum); - if (*line == NUL || line[STRLEN(line) - 1] != '\\') + if (*line == NUL || line[STRLEN(line) - 1] != '\\') { break; + } } if (lnum != *lnump) { @@ -823,21 +829,18 @@ static int cin_islinecomment(const char_u *p) return p[0] == '/' && p[1] == '/'; } -/* - * Recognize a line that starts with '{' or '}', or ends with ';', ',', '{' or - * '}'. - * Don't consider "} else" a terminated line. - * If a line begins with an "else", only consider it terminated if no unmatched - * opening braces follow (handle "else { foo();" correctly). - * Return the character terminating the line (ending char's have precedence if - * both apply in order to determine initializations). - */ -static char_u -cin_isterminated( - const char_u *s, - int incl_open, // include '{' at the end as terminator - int incl_comma // recognize a trailing comma -) +/// Recognize a line that starts with '{' or '}', or ends with ';', ',', '{' or +/// '}'. +/// Don't consider "} else" a terminated line. +/// If a line begins with an "else", only consider it terminated if no unmatched +/// opening braces follow (handle "else { foo();" correctly). +/// +/// @param incl_open include '{' at the end as terminator +/// @param incl_comma recognize a trailing comma +/// +/// @return the character terminating the line (ending char's have precedence if +/// both apply in order to determine initializations). +static char_u cin_isterminated(const char_u *s, int incl_open, int incl_comma) { char_u found_start = 0; unsigned n_open = 0; @@ -845,30 +848,35 @@ cin_isterminated( s = cin_skipcomment(s); - if (*s == '{' || (*s == '}' && !cin_iselse(s))) + if (*s == '{' || (*s == '}' && !cin_iselse(s))) { found_start = *s; + } - if (!found_start) + if (!found_start) { is_else = cin_iselse(s); + } while (*s) { // skip over comments, "" strings and 'c'haracters s = skip_string(cin_skipcomment(s)); - if (*s == '}' && n_open > 0) - --n_open; + if (*s == '}' && n_open > 0) { + n_open--; + } if ((!is_else || n_open == 0) && (*s == ';' || *s == '}' || (incl_comma && *s == ',')) - && cin_nocode(s + 1)) + && cin_nocode(s + 1)) { return *s; - else if (*s == '{') { - if (incl_open && cin_nocode(s + 1)) + } else if (*s == '{') { + if (incl_open && cin_nocode(s + 1)) { return *s; - else - ++n_open; + } else { + n_open++; + } } - if (*s) + if (*s) { s++; + } } return found_start; } @@ -889,13 +897,14 @@ static int cin_isfuncdecl(const char_u **sp, linenr_T first_lnum, linenr_T min_l linenr_T lnum = first_lnum; linenr_T save_lnum = curwin->w_cursor.lnum; int retval = false; - pos_T *trypos; - int just_started = TRUE; + pos_T *trypos; + int just_started = true; - if (sp == NULL) + if (sp == NULL) { s = ml_get(lnum); - else + } else { s = *sp; + } curwin->w_cursor.lnum = lnum; if (find_last_paren(s, '(', ')') @@ -945,8 +954,9 @@ static int cin_isfuncdecl(const char_u **sp, linenr_T first_lnum, linenr_T min_l // defined(y) lnum = first_lnum - 1; s = ml_get(lnum); - if (*s == NUL || s[STRLEN(s) - 1] != '\\') - retval = TRUE; + if (*s == NUL || s[STRLEN(s) - 1] != '\\') { + retval = true; + } goto done; } if ((*s == ',' && cin_nocode(s + 1)) || s[1] == NUL || cin_nocode(s)) { @@ -956,17 +966,20 @@ static int cin_isfuncdecl(const char_u **sp, linenr_T first_lnum, linenr_T min_l * At the end: check for ',' in the next line, for this style: * func(arg1 * , arg2) */ - for (;; ) { - if (lnum >= curbuf->b_ml.ml_line_count) + for (;;) { + if (lnum >= curbuf->b_ml.ml_line_count) { break; + } s = ml_get(++lnum); - if (!cin_ispreproc(s)) + if (!cin_ispreproc(s)) { break; + } } - if (lnum >= curbuf->b_ml.ml_line_count) + if (lnum >= curbuf->b_ml.ml_line_count) { break; - /* Require a comma at end of the line or a comma or ')' at the - * start of next line. */ + } + // Require a comma at end of the line or a comma or ')' at the + // start of next line. s = (char_u *)skipwhite((char *)s); if (!just_started && (!comma && *s != ',' && *s != ')')) { break; @@ -981,8 +994,9 @@ static int cin_isfuncdecl(const char_u **sp, linenr_T first_lnum, linenr_T min_l } done: - if (lnum != first_lnum && sp != NULL) + if (lnum != first_lnum && sp != NULL) { *sp = ml_get(first_lnum); + } return retval; } @@ -1013,8 +1027,8 @@ static int cin_isdo(const char_u *p) static int cin_iswhileofdo(const char_u *p, linenr_T lnum) // XXX { pos_T cursor_save; - pos_T *trypos; - int retval = FALSE; + pos_T *trypos; + int retval = false; p = cin_skipcomment(p); if (*p == '}') { // accept "} while (cond);" @@ -1029,10 +1043,10 @@ static int cin_iswhileofdo(const char_u *p, linenr_T lnum) // XXX p++; curwin->w_cursor.col++; } - if ((trypos = findmatchlimit(NULL, 0, 0, - curbuf->b_ind_maxparen)) != NULL - && *cin_skipcomment(ml_get_pos(trypos) + 1) == ';') - retval = TRUE; + if ((trypos = findmatchlimit(NULL, 0, 0, curbuf->b_ind_maxparen)) != NULL + && *cin_skipcomment(ml_get_pos(trypos) + 1) == ';') { + retval = true; + } curwin->w_cursor = cursor_save; } return retval; @@ -1048,24 +1062,29 @@ static int cin_is_if_for_while_before_offset(const char_u *line, int *poffset) { int offset = *poffset; - if (offset-- < 2) + if (offset-- < 2) { return 0; - while (offset > 2 && ascii_iswhite(line[offset])) - --offset; + } + while (offset > 2 && ascii_iswhite(line[offset])) { + offset--; + } offset -= 1; - if (!STRNCMP(line + offset, "if", 2)) + if (!STRNCMP(line + offset, "if", 2)) { goto probablyFound; + } if (offset >= 1) { offset -= 1; - if (!STRNCMP(line + offset, "for", 3)) + if (!STRNCMP(line + offset, "for", 3)) { goto probablyFound; + } if (offset >= 2) { offset -= 2; - if (!STRNCMP(line + offset, "while", 5)) + if (!STRNCMP(line + offset, "while", 5)) { goto probablyFound; + } } } return 0; @@ -1083,7 +1102,7 @@ probablyFound: * do * nothing; * while (foo - * && bar); <-- here + * && bar); <-- here * Adjust the cursor to the line with "while". */ static int cin_iswhileofdo_end(int terminated) @@ -1125,8 +1144,9 @@ static int cin_iswhileofdo_end(int terminated) p = line + i; } } - if (*p != NUL) - ++p; + if (*p != NUL) { + p++; + } } return FALSE; } @@ -1141,15 +1161,16 @@ static int cin_isbreak(const char_u *p) * constructor-initialization. eg: * * class MyClass : - * baseClass <-- here + * baseClass <-- here * class MyClass : public baseClass, - * anotherBaseClass <-- here (should probably lineup ??) + * anotherBaseClass <-- here (should probably lineup ??) * MyClass::MyClass(...) : - * baseClass(...) <-- here (constructor-initialization) + * baseClass(...) <-- here (constructor-initialization) * * This is a lot of guessing. Watch out for "cond ? func() : foo". */ -static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) { +static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) +{ lpos_T *pos = &cached->lpos; // find position const char_u *s; int class_or_struct, lookfor_ctor_init, cpp_base_class; @@ -1167,23 +1188,24 @@ static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) { return false; } s = cin_skipcomment(s); - if (*s == NUL) - return FALSE; + if (*s == NUL) { + return false; + } cpp_base_class = lookfor_ctor_init = class_or_struct = FALSE; /* Search for a line starting with '#', empty, ending in ';' or containing * '{' or '}' and start below it. This handles the following situations: - * a = cond ? - * func() : - * asdf; - * func::foo() - * : something - * {} - * Foo::Foo (int one, int two) - * : something(4), - * somethingelse(3) - * {} + * a = cond ? + * func() : + * asdf; + * func::foo() + * : something + * {} + * Foo::Foo (int one, int two) + * : something(4), + * somethingelse(3) + * {} */ while (lnum > 1) { line = ml_get(lnum - 1); @@ -1194,20 +1216,23 @@ static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) { while (*s != NUL) { s = cin_skipcomment(s); if (*s == '{' || *s == '}' - || (*s == ';' && cin_nocode(s + 1))) + || (*s == ';' && cin_nocode(s + 1))) { break; - if (*s != NUL) - ++s; + } + if (*s != NUL) { + s++; + } } - if (*s != NUL) + if (*s != NUL) { break; - --lnum; + } + lnum--; } pos->lnum = lnum; line = ml_get(lnum); s = line; - for (;; ) { + for (;;) { if (*s == NUL) { if (lnum == curwin->w_cursor.lnum) { break; @@ -1222,13 +1247,14 @@ static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) { break; } s = cin_skipcomment(line); - if (*s == NUL) + if (*s == NUL) { continue; + } } - if (s[0] == '"' || (s[0] == 'R' && s[1] == '"')) + if (s[0] == '"' || (s[0] == 'R' && s[1] == '"')) { s = skip_string(s) + 1; - else if (s[0] == ':') { + } else if (s[0] == ':') { if (s[1] == ':') { /* skip double colon. It can't be a constructor * initialization any more */ @@ -1241,17 +1267,19 @@ static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) { lookfor_ctor_init = class_or_struct = false; pos->col = 0; s = cin_skipcomment(s + 1); - } else + } else { s = cin_skipcomment(s + 1); + } } else if ((STRNCMP(s, "class", 5) == 0 && !vim_isIDc(s[5])) || (STRNCMP(s, "struct", 6) == 0 && !vim_isIDc(s[6]))) { class_or_struct = TRUE; lookfor_ctor_init = FALSE; - if (*s == 'c') + if (*s == 'c') { s = cin_skipcomment(s + 5); - else + } else { s = cin_skipcomment(s + 6); + } } else { if (s[0] == '{' || s[0] == '}' || s[0] == ';') { cpp_base_class = lookfor_ctor_init = class_or_struct = FALSE; @@ -1297,7 +1325,7 @@ static int get_baseclass_amount(int col) { int amount; colnr_T vcol; - pos_T *trypos; + pos_T *trypos; if (col == 0) { amount = get_indent(); @@ -1313,8 +1341,9 @@ static int get_baseclass_amount(int col) getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL); amount = (int)vcol; } - if (amount < curbuf->b_ind_cpp_baseclass) + if (amount < curbuf->b_ind_cpp_baseclass) { amount = curbuf->b_ind_cpp_baseclass; + } return amount; } @@ -1340,8 +1369,9 @@ static int cin_ends_in(const char_u *s, const char_u *find, const char_u *ignore return true; } } - if (*p != NUL) - ++p; + if (*p != NUL) { + p++; + } } return FALSE; } @@ -1461,10 +1491,10 @@ static pos_T *find_match_paren(int ind_maxparen) return find_match_char('(', ind_maxparen); } -static pos_T * find_match_char(char_u c, int ind_maxparen) +static pos_T *find_match_char(char_u c, int ind_maxparen) { pos_T cursor_save; - pos_T *trypos; + pos_T *trypos; static pos_T pos_copy; int ind_maxp_wk; @@ -1488,8 +1518,7 @@ retry: trypos = &pos_copy; curwin->w_cursor = *trypos; if ((trypos_wk = ind_find_start_CORS(NULL)) != NULL) { // XXX - ind_maxp_wk = ind_maxparen - (int)(cursor_save.lnum - - trypos_wk->lnum); + ind_maxp_wk = ind_maxparen - (int)(cursor_save.lnum - trypos_wk->lnum); if (ind_maxp_wk > 0) { curwin->w_cursor = *trypos_wk; goto retry; @@ -1535,8 +1564,9 @@ static int corr_ind_maxparen(pos_T *startpos) { long n = (long)startpos->lnum - (long)curwin->w_cursor.lnum; - if (n > 0 && n < curbuf->b_ind_maxparen / 2) + if (n > 0 && n < curbuf->b_ind_maxparen / 2) { return curbuf->b_ind_maxparen - (int)n; + } return curbuf->b_ind_maxparen; } @@ -1575,8 +1605,8 @@ static int find_last_paren(const char_u *l, int start, int end) */ void parse_cino(buf_T *buf) { - char_u *p; - char_u *l; + char_u *p; + char_u *l; int divider; int fraction = 0; int sw = get_sw_value(buf); @@ -1714,7 +1744,7 @@ void parse_cino(buf_T *buf) // Handle C #pragma directives buf->b_ind_pragma = 0; - for (p = buf->b_p_cino; *p; ) { + for (p = buf->b_p_cino; *p;) { l = p++; if (*p == '-') { p++; @@ -1738,57 +1768,134 @@ void parse_cino(buf_T *buf) n = sw; // just "s" is one 'shiftwidth'. } else { n *= sw; - if (divider) + if (divider) { n += (sw * fraction + divider / 2) / divider; + } } ++p; } - if (l[1] == '-') + if (l[1] == '-') { n = -n; + } /* When adding an entry here, also update the default 'cinoptions' in * doc/indent.txt, and add explanation for it! */ switch (*l) { - case '>': buf->b_ind_level = n; break; - case 'e': buf->b_ind_open_imag = n; break; - case 'n': buf->b_ind_no_brace = n; break; - case 'f': buf->b_ind_first_open = n; break; - case '{': buf->b_ind_open_extra = n; break; - case '}': buf->b_ind_close_extra = n; break; - case '^': buf->b_ind_open_left_imag = n; break; - case 'L': buf->b_ind_jump_label = n; break; - case ':': buf->b_ind_case = n; break; - case '=': buf->b_ind_case_code = n; break; - case 'b': buf->b_ind_case_break = n; break; - case 'p': buf->b_ind_param = n; break; - case 't': buf->b_ind_func_type = n; break; - case '/': buf->b_ind_comment = n; break; - case 'c': buf->b_ind_in_comment = n; break; - case 'C': buf->b_ind_in_comment2 = n; break; - case 'i': buf->b_ind_cpp_baseclass = n; break; - case '+': buf->b_ind_continuation = n; break; - case '(': buf->b_ind_unclosed = n; break; - case 'u': buf->b_ind_unclosed2 = n; break; - case 'U': buf->b_ind_unclosed_noignore = n; break; - case 'W': buf->b_ind_unclosed_wrapped = n; break; - case 'w': buf->b_ind_unclosed_whiteok = n; break; - case 'm': buf->b_ind_matching_paren = n; break; - case 'M': buf->b_ind_paren_prev = n; break; - case ')': buf->b_ind_maxparen = n; break; - case '*': buf->b_ind_maxcomment = n; break; - case 'g': buf->b_ind_scopedecl = n; break; - case 'h': buf->b_ind_scopedecl_code = n; break; - case 'j': buf->b_ind_java = n; break; - case 'J': buf->b_ind_js = n; break; - case 'l': buf->b_ind_keep_case_label = n; break; - case '#': buf->b_ind_hash_comment = n; break; - case 'N': buf->b_ind_cpp_namespace = n; break; - case 'k': buf->b_ind_if_for_while = n; break; - case 'E': buf->b_ind_cpp_extern_c = n; break; - case 'P': buf->b_ind_pragma = n; break; - } - if (*p == ',') - ++p; + case '>': + buf->b_ind_level = n; + break; + case 'e': + buf->b_ind_open_imag = n; + break; + case 'n': + buf->b_ind_no_brace = n; + break; + case 'f': + buf->b_ind_first_open = n; + break; + case '{': + buf->b_ind_open_extra = n; + break; + case '}': + buf->b_ind_close_extra = n; + break; + case '^': + buf->b_ind_open_left_imag = n; + break; + case 'L': + buf->b_ind_jump_label = n; + break; + case ':': + buf->b_ind_case = n; + break; + case '=': + buf->b_ind_case_code = n; + break; + case 'b': + buf->b_ind_case_break = n; + break; + case 'p': + buf->b_ind_param = n; + break; + case 't': + buf->b_ind_func_type = n; + break; + case '/': + buf->b_ind_comment = n; + break; + case 'c': + buf->b_ind_in_comment = n; + break; + case 'C': + buf->b_ind_in_comment2 = n; + break; + case 'i': + buf->b_ind_cpp_baseclass = n; + break; + case '+': + buf->b_ind_continuation = n; + break; + case '(': + buf->b_ind_unclosed = n; + break; + case 'u': + buf->b_ind_unclosed2 = n; + break; + case 'U': + buf->b_ind_unclosed_noignore = n; + break; + case 'W': + buf->b_ind_unclosed_wrapped = n; + break; + case 'w': + buf->b_ind_unclosed_whiteok = n; + break; + case 'm': + buf->b_ind_matching_paren = n; + break; + case 'M': + buf->b_ind_paren_prev = n; + break; + case ')': + buf->b_ind_maxparen = n; + break; + case '*': + buf->b_ind_maxcomment = n; + break; + case 'g': + buf->b_ind_scopedecl = n; + break; + case 'h': + buf->b_ind_scopedecl_code = n; + break; + case 'j': + buf->b_ind_java = n; + break; + case 'J': + buf->b_ind_js = n; + break; + case 'l': + buf->b_ind_keep_case_label = n; + break; + case '#': + buf->b_ind_hash_comment = n; + break; + case 'N': + buf->b_ind_cpp_namespace = n; + break; + case 'k': + buf->b_ind_if_for_while = n; + break; + case 'E': + buf->b_ind_cpp_extern_c = n; + break; + case 'P': + buf->b_ind_pragma = n; + break; + } + if (*p == ',') { + p++; + } } } @@ -1803,14 +1910,14 @@ int get_c_indent(void) int scope_amount; int cur_amount = MAXCOL; colnr_T col; - char_u *theline; - char_u *linecopy; - pos_T *trypos; - pos_T *comment_pos; - pos_T *tryposBrace = NULL; - pos_T tryposCopy; + char_u *theline; + char_u *linecopy; + pos_T *trypos; + pos_T *comment_pos; + pos_T *tryposBrace = NULL; + pos_T tryposCopy; pos_T our_paren_pos; - char_u *start; + char_u *start; int start_brace; #define BRACE_IN_COL0 1 // '{' is in column 0 #define BRACE_AT_START 2 // '{' is at start of line @@ -1868,10 +1975,11 @@ int get_c_indent(void) * For unknown reasons the cursor might be past the end of the line, thus * check for that. */ - if ((State & INSERT) + if ((State & MODE_INSERT) && curwin->w_cursor.col < (colnr_T)STRLEN(linecopy) - && linecopy[curwin->w_cursor.col] == ')') + && linecopy[curwin->w_cursor.col] == ')') { linecopy[curwin->w_cursor.col] = NUL; + } theline = (char_u *)skipwhite((char *)linecopy); @@ -1907,13 +2015,10 @@ int get_c_indent(void) } } - /* - * Is it a non-case label? Then that goes at the left margin too unless: - * - JS flag is set. - * - 'L' item has a positive value. - */ - if (original_line_islabel && !curbuf->b_ind_js - && curbuf->b_ind_jump_label < 0) { + // Is it a non-case label? Then that goes at the left margin too unless: + // - JS flag is set. + // - 'L' item has a positive value. + if (original_line_islabel && !curbuf->b_ind_js && curbuf->b_ind_jump_label < 0) { amount = 0; goto theend; } @@ -1951,7 +2056,7 @@ int get_c_indent(void) char_u lead_start[COM_MAX_LEN]; // start-comment string char_u lead_middle[COM_MAX_LEN]; // middle-comment string char_u lead_end[COM_MAX_LEN]; // end-comment string - char_u *p; + char_u *p; int start_align = 0; int start_off = 0; int done = FALSE; @@ -1980,8 +2085,9 @@ int get_c_indent(void) } } - if (*p == ':') - ++p; + if (*p == ':') { + p++; + } (void)copy_option_part(&p, lead_end, COM_MAX_LEN, ","); if (what == COM_START) { STRCPY(lead_start, lead_end); @@ -2009,17 +2115,18 @@ int get_c_indent(void) amount = get_indent_lnum(curwin->w_cursor.lnum - 1); break; } else if (STRNCMP(ml_get(comment_pos->lnum) + comment_pos->col, - lead_start, lead_start_len) != 0) { - /* If the start comment string doesn't match with the - * start of the comment, skip this entry. XXX */ + lead_start, lead_start_len) != 0) { + // If the start comment string doesn't match with the + // start of the comment, skip this entry. XXX continue; } } - if (start_off != 0) + if (start_off != 0) { amount += start_off; - else if (start_align == COM_RIGHT) + } else if (start_align == COM_RIGHT) { amount += vim_strsize(lead_start) - vim_strsize(lead_middle); + } break; } @@ -2044,18 +2151,16 @@ int get_c_indent(void) * asterisk in the comment opener; otherwise, line up * with the first character of the comment text. */ - if (done) - ; - else if (theline[0] == '*') + if (done) { + // skip + } else if (theline[0] == '*') { amount += 1; - else { - /* - * If we are more than one line away from the comment opener, take - * the indent of the previous non-empty line. If 'cino' has "CO" - * and we are just below the comment opener and there are any - * white characters after it line up with the text after it; - * otherwise, add the amount specified by "c" in 'cino' - */ + } else { + // If we are more than one line away from the comment opener, take + // the indent of the previous non-empty line. If 'cino' has "CO" + // and we are just below the comment opener and there are any + // white characters after it line up with the text after it; + // otherwise, add the amount specified by "c" in 'cino' amount = -1; for (lnum = cur_curpos.lnum - 1; lnum > comment_pos->lnum; lnum--) { if (linewhite(lnum)) { // skip blank lines @@ -2074,11 +2179,12 @@ int get_c_indent(void) } getvcol(curwin, comment_pos, &col, NULL, NULL); amount = col; - if (curbuf->b_ind_in_comment2 || *look == NUL) + if (curbuf->b_ind_in_comment2 || *look == NUL) { amount += curbuf->b_ind_in_comment; + } } } - goto theend; + goto theend; } // Are we looking at a ']' that has a match? if (*skipwhite((char *)theline) == ']' @@ -2090,18 +2196,19 @@ int get_c_indent(void) // Are we inside parentheses or braces? // XXX if (((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL - && curbuf->b_ind_java == 0) - || (tryposBrace = find_start_brace()) != NULL - || trypos != NULL) { + && curbuf->b_ind_java == 0) + || (tryposBrace = find_start_brace()) != NULL + || trypos != NULL) { if (trypos != NULL && tryposBrace != NULL) { /* Both an unmatched '(' and '{' is found. Use the one which is * closer to the current cursor position, set the other to NULL. */ if (trypos->lnum != tryposBrace->lnum ? trypos->lnum < tryposBrace->lnum - : trypos->col < tryposBrace->col) + : trypos->col < tryposBrace->col) { trypos = NULL; - else + } else { tryposBrace = NULL; + } } if (trypos != NULL) { @@ -2132,16 +2239,16 @@ int get_c_indent(void) } // XXX - if ((trypos = find_match_paren( - corr_ind_maxparen(&cur_curpos))) != NULL + if ((trypos = find_match_paren(corr_ind_maxparen(&cur_curpos))) != NULL && trypos->lnum == our_paren_pos.lnum && trypos->col == our_paren_pos.col) { amount = get_indent_lnum(lnum); // XXX if (theline[0] == ')') { if (our_paren_pos.lnum != lnum - && cur_amount > amount) + && cur_amount > amount) { cur_amount = amount; + } amount = -1; } break; @@ -2164,7 +2271,7 @@ int get_c_indent(void) pos_T cursor_save = curwin->w_cursor; pos_T outermost; - char_u *line; + char_u *line; trypos = &our_paren_pos; do { @@ -2187,7 +2294,7 @@ int get_c_indent(void) look = (char_u *)skipwhite((char *)look); if (*look == '(') { linenr_T save_lnum = curwin->w_cursor.lnum; - char_u *line; + char_u *line; int look_col; /* Ignore a '(' in front of the line that has a match before @@ -2197,11 +2304,12 @@ int get_c_indent(void) look_col = (int)(look - line); curwin->w_cursor.col = look_col + 1; if ((trypos = findmatchlimit(NULL, ')', 0, - curbuf->b_ind_maxparen)) + curbuf->b_ind_maxparen)) != NULL && trypos->lnum == our_paren_pos.lnum - && trypos->col < our_paren_pos.col) + && trypos->col < our_paren_pos.col) { ignore_paren_col = trypos->col + 1; + } curwin->w_cursor.lnum = save_lnum; look = ml_get(our_paren_pos.lnum) + look_col; @@ -2230,24 +2338,28 @@ int get_c_indent(void) for (col = 0; col < our_paren_pos.col; ++col) { switch (l[col]) { case '(': - case '{': ++n; + case '{': + n++; break; case ')': - case '}': if (n > 1) - --n; + case '}': + if (n > 1) { + n--; + } break; } } our_paren_pos.col = 0; amount += n * curbuf->b_ind_unclosed_wrapped; - } else if (curbuf->b_ind_unclosed_whiteok) + } else if (curbuf->b_ind_unclosed_whiteok) { our_paren_pos.col++; - else { + } else { col = our_paren_pos.col + 1; - while (ascii_iswhite(l[col])) + while (ascii_iswhite(l[col])) { col++; + } if (l[col] != NUL) { // In case of trailing space our_paren_pos.col = col; } else { @@ -2262,8 +2374,9 @@ int get_c_indent(void) */ if (our_paren_pos.col > 0) { getvcol(curwin, &our_paren_pos, &col, NULL, NULL); - if (cur_amount > (int)col) + if (cur_amount > (int)col) { cur_amount = col; + } } } @@ -2272,8 +2385,9 @@ int get_c_indent(void) } else if ((curbuf->b_ind_unclosed == 0 && is_if_for_while == 0) || (!curbuf->b_ind_unclosed_noignore && *look == '(' && ignore_paren_col == 0)) { - if (cur_amount != MAXCOL) + if (cur_amount != MAXCOL) { amount = cur_amount; + } } else { /* Add b_ind_unclosed2 for each '(' before our matching one, * but ignore (void) before the line (ignore_paren_col). */ @@ -2281,10 +2395,12 @@ int get_c_indent(void) while ((int)our_paren_pos.col > ignore_paren_col) { --our_paren_pos.col; switch (*ml_get_pos(&our_paren_pos)) { - case '(': amount += curbuf->b_ind_unclosed2; + case '(': + amount += curbuf->b_ind_unclosed2; col = our_paren_pos.col; break; - case ')': amount -= curbuf->b_ind_unclosed2; + case ')': + amount -= curbuf->b_ind_unclosed2; col = MAXCOL; break; } @@ -2292,9 +2408,9 @@ int get_c_indent(void) /* Use b_ind_unclosed once, when the first '(' is not inside * braces */ - if (col == MAXCOL) + if (col == MAXCOL) { amount += curbuf->b_ind_unclosed; - else { + } else { curwin->w_cursor.lnum = our_paren_pos.lnum; curwin->w_cursor.col = col; if (find_match_paren_after_brace(curbuf->b_ind_maxparen)) { @@ -2311,12 +2427,13 @@ int get_c_indent(void) * For a line starting with ')' use the minimum of the two * positions, to avoid giving it more indent than the previous * lines: - * func_long_name( if (x - * arg && yy - * ) ^ not here ) ^ not here + * func_long_name( if (x + * arg && yy + * ) ^ not here ) ^ not here */ - if (cur_amount < amount) + if (cur_amount < amount) { amount = cur_amount; + } } } @@ -2345,10 +2462,11 @@ int get_c_indent(void) if (*look == '{') { getvcol(curwin, trypos, &col, NULL, NULL); amount = col; - if (*start == '{') + if (*start == '{') { start_brace = BRACE_IN_COL0; - else + } else { start_brace = BRACE_AT_START; + } } else { // That opening brace might have been on a continuation // line. If so, find the start of the line. @@ -2363,9 +2481,9 @@ int get_c_indent(void) } // It could have been something like - // case 1: if (asdf && - // ldfd) { - // } + // case 1: if (asdf && + // ldfd) { + // } if ((curbuf->b_ind_js || curbuf->b_ind_keep_case_label) && cin_iscase((char_u *)skipwhite((char *)get_cursor_line_ptr()), false)) { amount = get_indent(); @@ -2443,8 +2561,9 @@ int get_c_indent(void) } else { // Compensate for adding b_ind_open_extra later. amount -= curbuf->b_ind_open_extra; - if (amount < 0) + if (amount < 0) { amount = 0; + } } } @@ -2476,7 +2595,7 @@ int get_c_indent(void) // the usual amount relative to the conditional // that opens the block. curwin->w_cursor = cur_curpos; - for (;; ) { + for (;;) { curwin->w_cursor.lnum--; curwin->w_cursor.col = 0; @@ -2500,10 +2619,11 @@ int get_c_indent(void) /* nothing found (abuse curbuf->b_ind_maxparen as * limit) assume terminated line (i.e. a variable * initialization) */ - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else if (!curbuf->b_ind_js) + } else if (!curbuf->b_ind_js) { amount += ind_continuation; + } break; } @@ -2527,8 +2647,9 @@ int get_c_indent(void) continue; } - if (cin_nocode(l)) + if (cin_nocode(l)) { continue; + } terminated = cin_isterminated(l, FALSE, TRUE); @@ -2546,14 +2667,16 @@ int get_c_indent(void) * declaration is split over multiple lines: * cin_isfuncdecl returns FALSE then. */ - if (terminated == ',') + if (terminated == ',') { break; + } /* if it is an enum declaration or an assignment, * we are done. */ - if (terminated != ';' && cin_isinit()) + if (terminated != ';' && cin_isinit()) { break; + } // nothing useful found if (terminated == 0 || terminated == '{') { @@ -2567,12 +2690,13 @@ int get_c_indent(void) // will take us back to the start of the line. // XXX trypos = NULL; - if (find_last_paren(l, '(', ')')) - trypos = find_match_paren( - curbuf->b_ind_maxparen); + if (find_last_paren(l, '(', ')')) { + trypos = find_match_paren(curbuf->b_ind_maxparen); + } - if (trypos == NULL && find_last_paren(l, '{', '}')) + if (trypos == NULL && find_last_paren(l, '{', '}')) { trypos = find_start_brace(); + } if (trypos != NULL) { curwin->w_cursor.lnum = trypos->lnum + 1; @@ -2586,15 +2710,17 @@ int get_c_indent(void) * int a, * b; */ - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } } else if (lookfor == LOOKFOR_UNTERM) { - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } } else { if (lookfor != LOOKFOR_TERM && lookfor != LOOKFOR_CPP_BASECLASS @@ -2611,13 +2737,15 @@ int get_c_indent(void) * Looking for C++ namespace, need to look further * back. */ - if (curwin->w_cursor.lnum == ourscope) + if (curwin->w_cursor.lnum == ourscope) { continue; + } if (curwin->w_cursor.lnum == 0 || curwin->w_cursor.lnum - < ourscope - FIND_NAMESPACE_LIM) + < ourscope - FIND_NAMESPACE_LIM) { break; + } l = get_cursor_line_ptr(); @@ -2645,8 +2773,9 @@ int get_c_indent(void) break; } - if (cin_nocode(l)) + if (cin_nocode(l)) { continue; + } } } break; @@ -2671,25 +2800,25 @@ int get_c_indent(void) if (iscase || cin_isscopedecl(l)) { /* we are only looking for cpp base class * declaration/initialization any longer */ - if (lookfor == LOOKFOR_CPP_BASECLASS) + if (lookfor == LOOKFOR_CPP_BASECLASS) { break; + } /* When looking for a "do" we are not interested in * labels. */ - if (whilelevel > 0) + if (whilelevel > 0) { continue; + } - /* - * case xx: - * c = 99 + <- this indent plus continuation - **-> here; - */ - if (lookfor == LOOKFOR_UNTERM - || lookfor == LOOKFOR_ENUM_OR_INIT) { - if (cont_amount > 0) + // case xx: + // c = 99 + <- this indent plus continuation + // -> here; + if (lookfor == LOOKFOR_UNTERM || lookfor == LOOKFOR_ENUM_OR_INIT) { + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } break; } @@ -2712,40 +2841,39 @@ int get_c_indent(void) n = get_indent_nolabel(curwin->w_cursor.lnum); // XXX - /* - * case xx: if (cond) <- line up with this if - * y = y + 1; - * -> s = 99; - * - * case xx: - * if (cond) <- line up with this line - * y = y + 1; - * -> s = 99; - */ + // case xx: if (cond) <- line up with this if + // y = y + 1; + // -> s = 99; + // + // case xx: + // if (cond) <- line up with this line + // y = y + 1; + // -> s = 99; if (lookfor == LOOKFOR_TERM) { - if (n) + if (n) { amount = n; + } - if (!lookfor_break) + if (!lookfor_break) { break; + } } - /* - * case xx: x = x + 1; <- line up with this x - * -> y = y + 1; - * - * case xx: if (cond) <- line up with this if - * -> y = y + 1; - */ + // case xx: x = x + 1; <- line up with this x + // -> y = y + 1; + // + // case xx: if (cond) <- line up with this if + // -> y = y + 1; if (n) { amount = n; l = after_label(get_cursor_line_ptr()); if (l != NULL && cin_is_cinword(l)) { - if (theline[0] == '{') + if (theline[0] == '{') { amount += curbuf->b_ind_open_extra; - else + } else { amount += curbuf->b_ind_level + curbuf->b_ind_no_brace; + } } break; } @@ -2754,8 +2882,8 @@ int get_c_indent(void) * Try to get the indent of a statement before the switch * label. If nothing is found, line up relative to the * switch label. - * break; <- may line up with this line - * case xx: + * break; <- may line up with this line + * case xx: * -> y = 1; */ scope_amount = get_indent() + (iscase // XXX @@ -2784,8 +2912,9 @@ int get_c_indent(void) */ if (!curbuf->b_ind_js && cin_islabel()) { l = after_label(get_cursor_line_ptr()); - if (l == NULL || cin_nocode(l)) + if (l == NULL || cin_nocode(l)) { continue; + } } /* @@ -2810,10 +2939,11 @@ int get_c_indent(void) } if (n) { if (lookfor == LOOKFOR_UNTERM) { - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } } else if (theline[0] == '{') { // Need to find start of the declaration. lookfor = LOOKFOR_UNTERM; @@ -2828,10 +2958,11 @@ int get_c_indent(void) /* only look, whether there is a cpp base class * declaration or initialization before the opening brace. */ - if (cin_isterminated(l, TRUE, FALSE)) + if (cin_isterminated(l, true, false)) { break; - else + } else { continue; + } } /* @@ -2840,7 +2971,7 @@ int get_c_indent(void) * there is another unterminated statement behind, eg: * 123, * sizeof - * here + * here * Otherwise check whether it is an enumeration or structure * initialisation (not indented) or a variable declaration * (indented). @@ -2848,7 +2979,7 @@ int get_c_indent(void) terminated = cin_isterminated(l, FALSE, TRUE); if (js_cur_has_key) { - js_cur_has_key = false; // only check the first line + js_cur_has_key = false; // only check the first line if (curbuf->b_ind_js && terminated == ',') { // For Javascript we might be inside an object: // key: something, <- align with this @@ -2892,8 +3023,8 @@ int get_c_indent(void) } // If we're in the middle of a paren thing, Go back to the line // that starts it so we can get the right prevailing indent - // if ( foo && - // bar ) + // if ( foo && + // bar ) // Position the cursor over the rightmost paren, so that // matching it will take us back to the start of the line. @@ -2909,15 +3040,16 @@ int get_c_indent(void) // If we are looking for ',', we also look for matching // braces. if (trypos == NULL && terminated == ',' - && find_last_paren(l, '{', '}')) + && find_last_paren(l, '{', '}')) { trypos = find_start_brace(); + } if (trypos != NULL) { /* * Check if we are on a case label now. This is * handled above. * case xx: if ( asdf && - * asdf) + * asdf) */ curwin->w_cursor = *trypos; l = get_cursor_line_ptr(); @@ -2932,22 +3064,23 @@ int get_c_indent(void) * Skip over continuation lines to find the one to get the * indent from * char *usethis = "bla\ - * bla", + * bla", * here; */ if (terminated == ',') { while (curwin->w_cursor.lnum > 1) { l = ml_get(curwin->w_cursor.lnum - 1); - if (*l == NUL || l[STRLEN(l) - 1] != '\\') + if (*l == NUL || l[STRLEN(l) - 1] != '\\') { break; - --curwin->w_cursor.lnum; + } + curwin->w_cursor.lnum--; curwin->w_cursor.col = 0; } } /* * Get indent and pointer to text for current line, - * ignoring any jump label. XXX + * ignoring any jump label. XXX */ if (curbuf->b_ind_js) { cur_amount = get_indent(); @@ -2957,9 +3090,9 @@ int get_c_indent(void) /* * If this is just above the line we are indenting, and it * starts with a '{', line it up with this line. - * while (not) - * -> { - * } + * while (not) + * -> { + * } */ if (terminated != ',' && lookfor != LOOKFOR_TERM && theline[0] == '{') { @@ -2968,8 +3101,8 @@ int get_c_indent(void) * Only add b_ind_open_extra when the current line * doesn't start with a '{', which must have a match * in the same line (scope is the same). Probably: - * { 1, 2 }, - * -> { 3, 4 } + * { 1, 2 }, + * -> { 3, 4 } */ if (*skipwhite((char *)l) != '{') { amount += curbuf->b_ind_open_extra; @@ -2996,29 +3129,31 @@ int get_c_indent(void) // -> here; if (lookfor == LOOKFOR_UNTERM || lookfor == LOOKFOR_ENUM_OR_INIT) { - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } break; } /* * If this is just above the line we are indenting, we * are finished. - * while (not) - * -> here; + * while (not) + * -> here; * Otherwise this indent can be used when the line * before this is terminated. - * yyy; - * if (stat) - * while (not) - * xxx; - * -> here; + * yyy; + * if (stat) + * while (not) + * xxx; + * -> here; */ amount = cur_amount; - if (theline[0] == '{') + if (theline[0] == '{') { amount += curbuf->b_ind_open_extra; + } if (lookfor != LOOKFOR_TERM) { amount += curbuf->b_ind_level + curbuf->b_ind_no_brace; @@ -3029,14 +3164,15 @@ int get_c_indent(void) * Special trick: when expecting the while () after a * do, line up with the while() * do - * x = 1; + * x = 1; * -> here */ l = (char_u *)skipwhite((char *)get_cursor_line_ptr()); if (cin_isdo(l)) { - if (whilelevel == 0) + if (whilelevel == 0) { break; - --whilelevel; + } + whilelevel--; } /* @@ -3049,14 +3185,16 @@ int get_c_indent(void) /* If we're looking at "} else", let's make sure we * find the opening brace of the enclosing scope, * not the one from "if () {". */ - if (*l == '}') + if (*l == '}') { curwin->w_cursor.col = (colnr_T)(l - get_cursor_line_ptr()) + 1; + } if ((trypos = find_start_brace()) == NULL || find_match(LOOKFOR_IF, trypos->lnum) - == FAIL) + == FAIL) { break; + } } } /* @@ -3070,8 +3208,8 @@ int get_c_indent(void) * Found two unterminated lines on a row, line up with * the last one. * c = 99 + - * 100 + - * -> here; + * 100 + + * -> here; */ if (lookfor == LOOKFOR_UNTERM) { // When line ends in a comma add extra indent @@ -3088,8 +3226,9 @@ int get_c_indent(void) * opening brace or we are looking just for * enumerations/initializations. */ if (terminated == ',') { - if (curbuf->b_ind_cpp_baseclass == 0) + if (curbuf->b_ind_cpp_baseclass == 0) { break; + } lookfor = LOOKFOR_CPP_BASECLASS; continue; @@ -3103,15 +3242,15 @@ int get_c_indent(void) } else { // Found first unterminated line on a row, may // line up with this line, remember its indent - // 100 + // NOLINT(whitespace/tab) - // -> here; // NOLINT(whitespace/tab) + // 100 + // NOLINT(whitespace/tab) + // -> here; // NOLINT(whitespace/tab) l = get_cursor_line_ptr(); amount = cur_amount; n = (int)STRLEN(l); if (terminated == ',' && (*skipwhite((char *)l) == ']' - || (n >=2 && l[n - 2] == ']'))) { + || (n >= 2 && l[n - 2] == ']'))) { break; } @@ -3159,7 +3298,7 @@ int get_c_indent(void) && *l != NUL && l[STRLEN(l) - 1] == '\\') { // XXX - cont_amount = cin_get_equal_amount( curwin->w_cursor.lnum); + cont_amount = cin_get_equal_amount(curwin->w_cursor.lnum); } if (lookfor != LOOKFOR_TERM && lookfor != LOOKFOR_JS_KEY @@ -3179,16 +3318,17 @@ int get_c_indent(void) /* * Found an unterminated line after a while ();, line up * with the last one. - * while (cond); - * 100 + <- line up with this one - * -> here; + * while (cond); + * 100 + <- line up with this one + * -> here; */ if (lookfor == LOOKFOR_UNTERM || lookfor == LOOKFOR_ENUM_OR_INIT) { - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } break; } @@ -3234,35 +3374,37 @@ int get_c_indent(void) /* * Found a terminated line above an unterminated line. Add * the amount for a continuation line. - * x = 1; - * y = foo + - * -> here; + * x = 1; + * y = foo + + * -> here; * or - * int x = 1; - * int foo, - * -> here; + * int x = 1; + * int foo, + * -> here; */ if (lookfor == LOOKFOR_UNTERM || lookfor == LOOKFOR_ENUM_OR_INIT) { - if (cont_amount > 0) + if (cont_amount > 0) { amount = cont_amount; - else + } else { amount += ind_continuation; + } break; } /* * Found a terminated line above a terminated line or "if" * etc. line. Use the amount of the line below us. - * x = 1; x = 1; - * if (asdf) y = 2; - * while (asdf) ->here; - * here; + * x = 1; x = 1; + * if (asdf) y = 2; + * while (asdf) ->here; + * here; * ->foo; */ if (lookfor == LOOKFOR_TERM) { - if (!lookfor_break && whilelevel == 0) + if (!lookfor_break && whilelevel == 0) { break; + } } /* * First line above the one we're indenting is terminated. @@ -3275,20 +3417,17 @@ int get_c_indent(void) * that matching it will take us back to the start of * the line. Helps for: * func(asdr, - * asdfasdf); + * asdfasdf); * here; */ term_again: l = get_cursor_line_ptr(); if (find_last_paren(l, '(', ')') - && (trypos = find_match_paren( - curbuf->b_ind_maxparen)) != NULL) { - /* - * Check if we are on a case label now. This is - * handled above. - * case xx: if ( asdf && - * asdf) - */ + && (trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) { + // Check if we are on a case label now. This is + // handled above. + // case xx: if ( asdf && + // asdf) curwin->w_cursor = *trypos; l = get_cursor_line_ptr(); if (cin_iscase(l, false) || cin_isscopedecl(l)) { @@ -3301,10 +3440,10 @@ term_again: /* When aligning with the case statement, don't align * with a statement after it. * case 1: { <-- don't use this { position - * stat; + * stat; * } * case 2: - * stat; + * stat; * } */ iscase = curbuf->b_ind_keep_case_label && cin_iscase(l, false); @@ -3315,8 +3454,9 @@ term_again: */ amount = skip_label(curwin->w_cursor.lnum, &l); - if (theline[0] == '{') + if (theline[0] == '{') { amount += curbuf->b_ind_open_extra; + } // See remark above: "Only add b_ind_open_extra.." l = (char_u *)skipwhite((char *)l); if (*l == '{') { @@ -3328,7 +3468,7 @@ term_again: * When a terminated line starts with "else" skip to * the matching "if": * else 3; - * indent this; + * indent this; * Need to use the scope of this "else". XXX * If whilelevel != 0 continue looking for a "do {". */ @@ -3338,8 +3478,9 @@ term_again: && whilelevel == 0) { if ((trypos = find_start_brace()) == NULL || find_match(LOOKFOR_IF, trypos->lnum) - == FAIL) + == FAIL) { break; + } continue; } @@ -3354,9 +3495,10 @@ term_again: // if not "else {" check for terminated again // but skip block for "} else {" l = cin_skipcomment(get_cursor_line_ptr()); - if (*l == '}' || !cin_iselse(l)) + if (*l == '}' || !cin_iselse(l)) { goto term_again; - ++curwin->w_cursor.lnum; + } + curwin->w_cursor.lnum++; curwin->w_cursor.col = 0; } } @@ -3389,8 +3531,8 @@ term_again: // of a function if (theline[0] == '{') { - amount = curbuf->b_ind_first_open; - goto theend; + amount = curbuf->b_ind_first_open; + goto theend; } /* * If the NEXT line is a function declaration, the current @@ -3400,14 +3542,13 @@ term_again: * contains { or }: "void f() {\n if (1)" */ if (cur_curpos.lnum < curbuf->b_ml.ml_line_count - && !cin_nocode(theline) - && vim_strchr(theline, '{') == NULL - && vim_strchr(theline, '}') == NULL - && !cin_ends_in(theline, (char_u *)":", NULL) - && !cin_ends_in(theline, (char_u *)",", NULL) - && cin_isfuncdecl(NULL, cur_curpos.lnum + 1, - cur_curpos.lnum + 1) - && !cin_isterminated(theline, false, true)) { + && !cin_nocode(theline) + && vim_strchr((char *)theline, '{') == NULL + && vim_strchr((char *)theline, '}') == NULL + && !cin_ends_in(theline, (char_u *)":", NULL) + && !cin_ends_in(theline, (char_u *)",", NULL) + && cin_isfuncdecl(NULL, cur_curpos.lnum + 1, cur_curpos.lnum + 1) + && !cin_isterminated(theline, false, true)) { amount = curbuf->b_ind_func_type; goto theend; } @@ -3450,8 +3591,9 @@ term_again: continue; } - if (cin_nocode(l)) + if (cin_nocode(l)) { continue; + } /* * If the previous line ends in ',', use one level of @@ -3476,23 +3618,26 @@ term_again: /* For a line ending in ',' that is a continuation line go * back to the first line with a backslash: * char *foo = "bla\ - * bla", + * bla", * here; */ while (n == 0 && curwin->w_cursor.lnum > 1) { l = ml_get(curwin->w_cursor.lnum - 1); - if (*l == NUL || l[STRLEN(l) - 1] != '\\') + if (*l == NUL || l[STRLEN(l) - 1] != '\\') { break; - --curwin->w_cursor.lnum; + } + curwin->w_cursor.lnum--; curwin->w_cursor.col = 0; } amount = get_indent(); // XXX - if (amount == 0) + if (amount == 0) { amount = cin_first_id_amount(); - if (amount == 0) + } + if (amount == 0) { amount = ind_continuation; + } break; } @@ -3513,14 +3658,14 @@ term_again: break; } - /* (matching {) - * If the previous line ends on '};' (maybe followed by - * comments) align at column 0. For example: - * char *string_array[] = { "foo", - * / * x * / "b};ar" }; / * foobar * / - */ - if (cin_ends_in(l, (char_u *)"};", NULL)) + // (matching {) + // If the previous line ends on '};' (maybe followed by + // comments) align at column 0. For example: + // char *string_array[] = { "foo", + // / * x * / "b};ar" }; / * foobar * / + if (cin_ends_in(l, (char_u *)"};", NULL)) { break; + } // If the previous line ends on '[' we are probably in an // array constant: @@ -3547,8 +3692,9 @@ term_again: } } if (curwin->w_cursor.lnum > 0 - && cin_ends_in(look, (char_u *)"}", NULL)) + && cin_ends_in(look, (char_u *)"}", NULL)) { break; + } curwin->w_cursor = curpos_save; } @@ -3573,8 +3719,9 @@ term_again: if (cin_ends_in(l, (char_u *)";", NULL)) { l = ml_get(curwin->w_cursor.lnum - 1); if (cin_ends_in(l, (char_u *)",", NULL) - || (*l != NUL && l[STRLEN(l) - 1] == '\\')) + || (*l != NUL && l[STRLEN(l) - 1] == '\\')) { break; + } l = get_cursor_line_ptr(); } @@ -3587,8 +3734,9 @@ term_again: */ (void)find_last_paren(l, '(', ')'); - if ((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) + if ((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) { curwin->w_cursor = *trypos; + } amount = get_indent(); // XXX break; } @@ -3598,26 +3746,28 @@ term_again: amount += curbuf->b_ind_comment; } - /* add extra indent if the previous line ended in a backslash: - * "asdfasdf\ - * here"; - * char *foo = "asdf\ - * here"; - */ + + // add extra indent if the previous line ended in a backslash: + // "asdfasdf{backslash} + // here"; + // char *foo = "asdf{backslash} + // here"; if (cur_curpos.lnum > 1) { l = ml_get(cur_curpos.lnum - 1); if (*l != NUL && l[STRLEN(l) - 1] == '\\') { cur_amount = cin_get_equal_amount(cur_curpos.lnum - 1); - if (cur_amount > 0) + if (cur_amount > 0) { amount = cur_amount; - else if (cur_amount == 0) + } else if (cur_amount == 0) { amount += ind_continuation; + } } } theend: - if (amount < 0) + if (amount < 0) { amount = 0; + } laterend: // put the cursor back where it belongs @@ -3672,16 +3822,18 @@ static int find_match(int lookfor, linenr_T ourscope) * back than the one enclosing the else, we're * out of luck too. */ - if (theirscope->lnum < ourscope) + if (theirscope->lnum < ourscope) { break; + } /* * and if they're enclosed in a *deeper* brace, * then we can ignore it because it's in a * different scope... */ - if (theirscope->lnum > ourscope) + if (theirscope->lnum > ourscope) { continue; + } /* * if it was an "else" (that's not an "else if") @@ -3691,8 +3843,9 @@ static int find_match(int lookfor, linenr_T ourscope) look = cin_skipcomment(get_cursor_line_ptr()); if (cin_iselse(look)) { mightbeif = cin_skipcomment(look + 4); - if (!cin_isif(mightbeif)) - ++elselevel; + if (!cin_isif(mightbeif)) { + elselevel++; // NOLINT(readability/braces) + } continue; } @@ -3713,8 +3866,9 @@ static int find_match(int lookfor, linenr_T ourscope) * When looking for an "if" ignore "while"s that * get in the way. */ - if (elselevel == 0 && lookfor == LOOKFOR_IF) + if (elselevel == 0 && lookfor == LOOKFOR_IF) { whilelevel = 0; + } } // If it's a "do" decrement whilelevel @@ -3739,8 +3893,9 @@ static int find_match(int lookfor, linenr_T ourscope) */ void do_c_expr_indent(void) { - if (*curbuf->b_p_inde != NUL) + if (*curbuf->b_p_inde != NUL) { fixthisline(get_expr_indent); - else + } else { fixthisline(get_c_indent); + } } diff --git a/src/nvim/input.c b/src/nvim/input.c index 0dfd564e1f..37c2903cfd 100644 --- a/src/nvim/input.c +++ b/src/nvim/input.c @@ -39,7 +39,7 @@ int ask_yesno(const char *const str, const bool direct) const int save_State = State; no_wait_return++; - State = CONFIRM; // Mouse behaves like with :confirm. + State = MODE_CONFIRM; // Mouse behaves like with :confirm. setmouse(); // Disable mouse in xterm. no_mapping++; allow_keys++; // no mapping here, but recognize keys @@ -235,7 +235,7 @@ int prompt_for_number(int *mouse_used) save_cmdline_row = cmdline_row; cmdline_row = 0; save_State = State; - State = ASKMORE; // prevents a screen update when using a timer + State = MODE_ASKMORE; // prevents a screen update when using a timer // May show different mouse shape. setmouse(); diff --git a/src/nvim/keymap.c b/src/nvim/keycodes.c index b184b42354..676ddcf8d4 100644 --- a/src/nvim/keymap.c +++ b/src/nvim/keycodes.c @@ -9,7 +9,7 @@ #include "nvim/charset.h" #include "nvim/edit.h" #include "nvim/eval.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/mouse.h" @@ -17,12 +17,10 @@ #include "nvim/vim.h" #ifdef INCLUDE_GENERATED_DECLARATIONS -# include "keymap.c.generated.h" +# include "keycodes.c.generated.h" #endif -/* - * Some useful tables. - */ +// Some useful tables. static const struct modmasktable { uint16_t mod_mask; ///< Bit-mask for particular key modifier. @@ -43,10 +41,9 @@ static const struct modmasktable { // NOTE: when adding an entry, update MAX_KEY_NAME_LEN! }; -/* - * Shifted key terminal codes and their unshifted equivalent. - * Don't add mouse codes here, they are handled separately! - */ +// Shifted key terminal codes and their unshifted equivalent. +// Don't add mouse codes here, they are handled separately! + #define MOD_KEYS_ENTRY_SIZE 5 static char_u modifier_keys_table[] = @@ -461,10 +458,7 @@ int handle_x_keys(const int key) return key; } -/* - * Return a string which contains the name of the given key when the given - * modifiers are down. - */ +/// @return a string which contains the name of the given key when the given modifiers are down. char_u *get_special_key_name(int c, int modifiers) { static char_u string[MAX_KEY_NAME_LEN + 1]; @@ -481,10 +475,8 @@ char_u *get_special_key_name(int c, int modifiers) c = KEY2TERMCAP1(c); } - /* - * Translate shifted special keys into unshifted keys and set modifier. - * Same for CTRL and ALT modifiers. - */ + // Translate shifted special keys into unshifted keys and set modifier. + // Same for CTRL and ALT modifiers. if (IS_SPECIAL(c)) { for (i = 0; modifier_keys_table[i] != 0; i += MOD_KEYS_ENTRY_SIZE) { if (KEY2TERMCAP0(c) == (int)modifier_keys_table[i + 1] @@ -500,10 +492,8 @@ char_u *get_special_key_name(int c, int modifiers) // try to find the key in the special key table table_idx = find_special_key_in_table(c); - /* - * When not a known special key, and not a printable character, try to - * extract modifiers. - */ + // When not a known special key, and not a printable character, try to + // extract modifiers. if (c > 0 && utf_char2len(c) == 1) { if (table_idx < 0 @@ -798,10 +788,8 @@ static int extract_modifiers(int key, int *modp, const bool simplify, bool *cons return key; } -/* - * Try to find key "c" in the special key table. - * Return the index when found, -1 when not found. - */ +/// Try to find key "c" in the special key table. +/// @return the index when found, -1 when not found. int find_special_key_in_table(int c) { int i; @@ -844,10 +832,8 @@ int get_special_key_code(const char_u *name) return 0; } -/* - * Look up the given mouse code to return the relevant information in the other - * arguments. Return which button is down or was released. - */ +/// Look up the given mouse code to return the relevant information in the other arguments. +/// @return which button is down or was released. int get_mouse_button(int code, bool *is_click, bool *is_drag) { int i; @@ -1009,7 +995,7 @@ char *replace_termcodes(const char *const from, const size_t from_len, char **co } else { result[dlen++] = *src; } - ++src; + src++; } } result[dlen] = NUL; diff --git a/src/nvim/keymap.h b/src/nvim/keycodes.h index 9febd472f9..f6c576f6ee 100644 --- a/src/nvim/keymap.h +++ b/src/nvim/keycodes.h @@ -1,13 +1,11 @@ -#ifndef NVIM_KEYMAP_H -#define NVIM_KEYMAP_H +#ifndef NVIM_KEYCODES_H +#define NVIM_KEYCODES_H #include "nvim/strings.h" -/* - * Keycode definitions for special keys. - * - * Any special key code sequences are replaced by these codes. - */ +// Keycode definitions for special keys. +// +// Any special key code sequences are replaced by these codes. // // For MS-DOS some keys produce codes larger than 0xff. They are split into two @@ -15,66 +13,49 @@ // #define K_NUL (0xce) // for MS-DOS: special key follows -/* - * K_SPECIAL is the first byte of a special key code and is always followed by - * two bytes. - * The second byte can have any value. ASCII is used for normal termcap - * entries, 0x80 and higher for special keys, see below. - * The third byte is guaranteed to be between 0x02 and 0x7f. - */ - +/// K_SPECIAL is the first byte of a special key code and is always followed by +/// two bytes. +/// The second byte can have any value. ASCII is used for normal termcap +/// entries, 0x80 and higher for special keys, see below. +/// The third byte is guaranteed to be between 0x02 and 0x7f. #define K_SPECIAL (0x80) -/* - * Positive characters are "normal" characters. - * Negative characters are special key codes. Only characters below -0x200 - * are used to so that the absolute value can't be mistaken for a single-byte - * character. - */ +/// Positive characters are "normal" characters. +/// Negative characters are special key codes. Only characters below -0x200 +/// are used to so that the absolute value can't be mistaken for a single-byte +/// character. #define IS_SPECIAL(c) ((c) < 0) -/* - * Characters 0x0100 - 0x01ff have a special meaning for abbreviations. - * Multi-byte characters also have ABBR_OFF added, thus are above 0x0200. - */ +/// Characters 0x0100 - 0x01ff have a special meaning for abbreviations. +/// Multi-byte characters also have ABBR_OFF added, thus are above 0x0200. #define ABBR_OFF 0x100 -/* - * NUL cannot be in the input string, therefore it is replaced by - * K_SPECIAL KS_ZERO KE_FILLER - */ +/// NUL cannot be in the input string, therefore it is replaced by +/// K_SPECIAL KS_ZERO KE_FILLER #define KS_ZERO 255 -/* - * K_SPECIAL cannot be in the input string, therefore it is replaced by - * K_SPECIAL KS_SPECIAL KE_FILLER - */ +/// K_SPECIAL cannot be in the input string, therefore it is replaced by +/// K_SPECIAL KS_SPECIAL KE_FILLER #define KS_SPECIAL 254 -/* - * KS_EXTRA is used for keys that have no termcap name - * K_SPECIAL KS_EXTRA KE_xxx - */ +/// KS_EXTRA is used for keys that have no termcap name +/// K_SPECIAL KS_EXTRA KE_xxx #define KS_EXTRA 253 -/* - * KS_MODIFIER is used when a modifier is given for a (special) key - * K_SPECIAL KS_MODIFIER bitmask - */ +/// KS_MODIFIER is used when a modifier is given for a (special) key +/// K_SPECIAL KS_MODIFIER bitmask #define KS_MODIFIER 252 -/* - * These are used for the GUI - * K_SPECIAL KS_xxx KE_FILLER - */ +// These are used for the GUI +// K_SPECIAL KS_xxx KE_FILLER + #define KS_MOUSE 251 #define KS_MENU 250 #define KS_VER_SCROLLBAR 249 #define KS_HOR_SCROLLBAR 248 -/* - * Used for switching Select mode back on after a mapping or menu. - */ +// Used for switching Select mode back on after a mapping or menu. + #define KS_SELECT 245 #define K_SELECT_STRING (char_u *)"\200\365X" @@ -87,30 +68,24 @@ // Used for menu in a tab pages line. #define KS_TABMENU 239 -/* - * Filler used after KS_SPECIAL and others - */ +/// Filler used after KS_SPECIAL and others #define KE_FILLER ('X') -/* - * translation of three byte code "K_SPECIAL a b" into int "K_xxx" and back - */ +// translation of three byte code "K_SPECIAL a b" into int "K_xxx" and back + #define TERMCAP2KEY(a, b) (-((a) + ((int)(b) << 8))) #define KEY2TERMCAP0(x) ((-(x)) & 0xff) #define KEY2TERMCAP1(x) (((unsigned)(-(x)) >> 8) & 0xff) -/* - * get second or third byte when translating special key code into three bytes - */ +// get second or third byte when translating special key code into three bytes + #define K_SECOND(c) ((c) == K_SPECIAL ? KS_SPECIAL : (c) == \ NUL ? KS_ZERO : KEY2TERMCAP0(c)) #define K_THIRD(c) (((c) == K_SPECIAL || (c) == \ NUL) ? KE_FILLER : KEY2TERMCAP1(c)) -/* - * get single int code from second byte after K_SPECIAL - */ +/// get single int code from second byte after K_SPECIAL #define TO_SPECIAL(a, b) ((a) == KS_SPECIAL ? K_SPECIAL : (a) == \ KS_ZERO ? K_ZERO : TERMCAP2KEY(a, b)) @@ -247,9 +222,8 @@ enum key_extra { KE_COMMAND = 104, // <Cmd> special key }; -/* - * the three byte codes are replaced with the following int when using vgetc() - */ +// the three byte codes are replaced with the following int when using vgetc() + #define K_ZERO TERMCAP2KEY(KS_ZERO, KE_FILLER) #define K_UP TERMCAP2KEY('k', 'u') @@ -430,10 +404,9 @@ enum key_extra { #define K_TABLINE TERMCAP2KEY(KS_TABLINE, KE_FILLER) #define K_TABMENU TERMCAP2KEY(KS_TABMENU, KE_FILLER) -/* - * Symbols for pseudo keys which are translated from the real key symbols - * above. - */ +// Symbols for pseudo keys which are translated from the real key symbols +// above. + #define K_LEFTMOUSE TERMCAP2KEY(KS_EXTRA, KE_LEFTMOUSE) #define K_LEFTMOUSE_NM TERMCAP2KEY(KS_EXTRA, KE_LEFTMOUSE_NM) #define K_LEFTDRAG TERMCAP2KEY(KS_EXTRA, KE_LEFTDRAG) @@ -486,11 +459,8 @@ enum key_extra { #define MOD_MASK_MULTI_CLICK (MOD_MASK_2CLICK|MOD_MASK_3CLICK| \ MOD_MASK_4CLICK) -/* - * The length of the longest special key name, including modifiers. - * Current longest is <M-C-S-T-D-A-4-ScrollWheelRight> (length includes '<' and - * '>'). - */ +/// The length of the longest special key name, including modifiers. +/// Current longest is <M-C-S-T-D-A-4-ScrollWheelRight> (length includes '<' and '>'). #define MAX_KEY_NAME_LEN 32 // Maximum length of a special key event as tokens. This includes modifiers. @@ -503,7 +473,7 @@ enum key_extra { #define MAX_KEY_CODE_LEN 6 #define FLAG_CPO_BSLASH 0x01 -#define CPO_TO_CPO_FLAGS ((vim_strchr(p_cpo, CPO_BSLASH) == NULL) \ +#define CPO_TO_CPO_FLAGS ((vim_strchr((char *)p_cpo, CPO_BSLASH) == NULL) \ ? 0 \ : FLAG_CPO_BSLASH) @@ -524,6 +494,6 @@ enum { }; #ifdef INCLUDE_GENERATED_DECLARATIONS -# include "keymap.h.generated.h" +# include "keycodes.h.generated.h" #endif -#endif // NVIM_KEYMAP_H +#endif // NVIM_KEYCODES_H diff --git a/src/nvim/lib/kvec.h b/src/nvim/lib/kvec.h index 34332ba34b..68841e0af8 100644 --- a/src/nvim/lib/kvec.h +++ b/src/nvim/lib/kvec.h @@ -94,17 +94,26 @@ memcpy((v1).items, (v0).items, sizeof((v1).items[0]) * (v0).size); \ } while (0) -#define kv_splice(v1, v0) \ +/// fit at least "len" more items +#define kv_ensure_space(v, len) \ do { \ - if ((v1).capacity < (v1).size + (v0).size) { \ - (v1).capacity = (v1).size + (v0).size; \ - kv_roundup32((v1).capacity); \ - kv_resize((v1), (v1).capacity); \ + if ((v).capacity < (v).size + len) { \ + (v).capacity = (v).size + len; \ + kv_roundup32((v).capacity); \ + kv_resize((v), (v).capacity); \ } \ - memcpy((v1).items + (v1).size, (v0).items, sizeof((v1).items[0]) * (v0).size); \ - (v1).size = (v1).size + (v0).size; \ } while (0) +#define kv_concat_len(v, data, len) \ + do { \ + kv_ensure_space(v, len); \ + memcpy((v).items + (v).size, data, sizeof((v).items[0]) * len); \ + (v).size = (v).size + len; \ + } while (0) + +#define kv_concat(v, str) kv_concat_len(v, str, STRLEN(str)) +#define kv_splice(v1, v0) kv_concat_len(v1, (v0).items, (v0).size) + #define kv_pushp(v) \ ((((v).size == (v).capacity) ? (kv_resize_full(v), 0) : 0), \ ((v).items + ((v).size++))) @@ -123,6 +132,8 @@ : 0UL)), \ &(v).items[(i)])) +#define kv_printf(v, ...) kv_do_printf(&(v), __VA_ARGS__) + /// Type of a vector with a few first members allocated on stack /// /// Is compatible with #kv_A, #kv_pop, #kv_size, #kv_max, #kv_last. diff --git a/src/nvim/log.c b/src/nvim/log.c index 7d50ecf69e..815d53b570 100644 --- a/src/nvim/log.c +++ b/src/nvim/log.c @@ -51,7 +51,7 @@ static bool log_try_create(char *fname) /// Initializes path to log file. Sets $NVIM_LOG_FILE if empty. /// -/// Tries $NVIM_LOG_FILE, or falls back to $XDG_CACHE_HOME/nvim/log. Path to log +/// Tries $NVIM_LOG_FILE, or falls back to $XDG_STATE_HOME/nvim/log. Path to log /// file is cached, so only the first call has effect, unless first call was not /// successful. Failed initialization indicates either a bug in expand_env() /// or both $NVIM_LOG_FILE and $HOME environment variables are undefined. @@ -69,16 +69,16 @@ static bool log_path_init(void) || log_file_path[0] == '\0' || os_isdir((char_u *)log_file_path) || !log_try_create(log_file_path)) { - // Make kXDGCacheHome if it does not exist. - char *cachehome = get_xdg_home(kXDGCacheHome); + // Make kXDGStateHome if it does not exist. + char *loghome = get_xdg_home(kXDGStateHome); char *failed_dir = NULL; bool log_dir_failure = false; - if (!os_isdir((char_u *)cachehome)) { - log_dir_failure = (os_mkdir_recurse(cachehome, 0700, &failed_dir) != 0); + if (!os_isdir((char_u *)loghome)) { + log_dir_failure = (os_mkdir_recurse(loghome, 0700, &failed_dir) != 0); } - XFREE_CLEAR(cachehome); + XFREE_CLEAR(loghome); // Invalid $NVIM_LOG_FILE or failed to expand; fall back to default. - char *defaultpath = stdpaths_user_cache_subpath("log"); + char *defaultpath = stdpaths_user_state_subpath("log", 0, true); size_t len = xstrlcpy(log_file_path, defaultpath, size); xfree(defaultpath); // Fall back to .nvimlog diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c index 1da868c137..9758cee0a5 100644 --- a/src/nvim/lua/executor.c +++ b/src/nvim/lua/executor.c @@ -920,7 +920,7 @@ int nlua_call(lua_State *lstate) { Error err = ERROR_INIT; size_t name_len; - const char_u *name = (const char_u *)luaL_checklstring(lstate, 1, &name_len); + const char *name = luaL_checklstring(lstate, 1, &name_len); if (!nlua_is_deferred_safe()) { return luaL_error(lstate, e_luv_api_disabled, "vimL function"); } @@ -1249,7 +1249,7 @@ int nlua_source_using_linegetter(LineGetter fgetline, void *cookie, char *name) char_u *line = NULL; ga_init(&ga, (int)sizeof(char_u *), 10); - while ((line = fgetline(0, cookie, 0, false)) != NULL) { + while ((line = (char_u *)fgetline(0, cookie, 0, false)) != NULL) { GA_APPEND(char_u *, &ga, line); } char *code = ga_concat_strings_sep(&ga, "\n"); @@ -1863,8 +1863,8 @@ void nlua_do_ucmd(ucmd_T *cmd, exarg_T *eap) if (cmd->uc_argt & EX_NOSPC) { // Commands where nargs = 1 or "?" fargs is the same as args lua_rawseti(lstate, -2, 1); - } else { - // Commands with more than one possible argument we split + } else if (eap->args == NULL) { + // For commands with more than one possible argument, split if argument list isn't available. lua_pop(lstate, 1); // Pop the reference of opts.args size_t length = STRLEN(eap->arg); size_t end = 0; @@ -1881,6 +1881,13 @@ void nlua_do_ucmd(ucmd_T *cmd, exarg_T *eap) } } xfree(buf); + } else { + // If argument list is available, just use it. + lua_pop(lstate, 1); + for (size_t i = 0; i < eap->argc; i++) { + lua_pushlstring(lstate, eap->args[i], eap->arglens[i]); + lua_rawseti(lstate, -2, (int)i + 1); + } } lua_setfield(lstate, -2, "fargs"); diff --git a/src/nvim/lua/stdlib.c b/src/nvim/lua/stdlib.c index 52a9a1a84f..79e21e518c 100644 --- a/src/nvim/lua/stdlib.c +++ b/src/nvim/lua/stdlib.c @@ -295,7 +295,7 @@ int nlua_regex(lua_State *lstate) TRY_WRAP({ try_start(); - prog = vim_regcomp((char_u *)text, RE_AUTO | RE_MAGIC | RE_STRICT); + prog = vim_regcomp((char *)text, RE_AUTO | RE_MAGIC | RE_STRICT); try_end(&err); }); diff --git a/src/nvim/macros.h b/src/nvim/macros.h index d57ab65d45..c9c424568d 100644 --- a/src/nvim/macros.h +++ b/src/nvim/macros.h @@ -56,12 +56,14 @@ // Returns empty string if it is NULL. #define EMPTY_IF_NULL(x) (char *)((x) ? (x) : (char_u *)"") -// Adjust chars in a language according to 'langmap' option. -// NOTE that there is no noticeable overhead if 'langmap' is not set. -// When set the overhead for characters < 256 is small. -// Don't apply 'langmap' if the character comes from the Stuff buffer or from a -// mapping and the langnoremap option was set. -// The do-while is just to ignore a ';' after the macro. +/// Adjust chars in a language according to 'langmap' option. +/// NOTE that there is no noticeable overhead if 'langmap' is not set. +/// When set the overhead for characters < 256 is small. +/// Don't apply 'langmap' if the character comes from the Stuff buffer or from a +/// mapping and the langnoremap option was set. +/// The do-while is just to ignore a ';' after the macro. +/// +/// -V:LANGMAP_ADJUST:560 #define LANGMAP_ADJUST(c, condition) \ do { \ if (*p_langmap \ diff --git a/src/nvim/main.c b/src/nvim/main.c index 9beaa0686f..80a856e91a 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -643,8 +643,7 @@ void getout(int exitval) bufref_T bufref; set_bufref(&bufref, buf); - apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname, - buf->b_fname, false, buf); + apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname, buf->b_fname, false, buf); if (bufref_valid(&bufref)) { buf_set_changedtick(buf, -1); // note that we did it already } @@ -807,7 +806,7 @@ static void init_locale(void) snprintf(localepath, sizeof(localepath), "%s", get_vim_var_str(VV_PROGPATH)); char *tail = (char *)path_tail_with_sep((char_u *)localepath); *tail = NUL; - tail = (char *)path_tail((char_u *)localepath); + tail = path_tail(localepath); xstrlcpy(tail, "share/locale", sizeof(localepath) - (size_t)(tail - localepath)); bindtextdomain(PROJECT_NAME, localepath); @@ -1364,7 +1363,7 @@ scripterror: if (parmp->diff_mode && os_isdir(p) && GARGCOUNT > 0 && !os_isdir(alist_name(&GARGLIST[0]))) { char_u *r = (char_u *)concat_fnames((char *)p, - (char *)path_tail(alist_name(&GARGLIST[0])), true); + path_tail((char *)alist_name(&GARGLIST[0])), true); xfree(p); p = r; } @@ -1470,7 +1469,7 @@ static void init_path(const char *exename) path_guess_exepath(exename, exepath, sizeof(exepath)); } set_vim_var_string(VV_PROGPATH, exepath, -1); - set_vim_var_string(VV_PROGNAME, (char *)path_tail((char_u *)exename), -1); + set_vim_var_string(VV_PROGNAME, path_tail(exename), -1); #ifdef WIN32 // Append the process start directory to $PATH, so that ":!foo" finds tools @@ -1813,7 +1812,7 @@ static void exe_pre_commands(mparm_T *parmp) if (cnt > 0) { curwin->w_cursor.lnum = 0; // just in case.. - sourcing_name = (char_u *)_("pre-vimrc command line"); + sourcing_name = _("pre-vimrc command line"); current_sctx.sc_sid = SID_CMDARG; for (i = 0; i < cnt; i++) { do_cmdline_cmd(cmds[i]); @@ -1840,7 +1839,7 @@ static void exe_commands(mparm_T *parmp) if (parmp->tagname == NULL && curwin->w_cursor.lnum <= 1) { curwin->w_cursor.lnum = 0; } - sourcing_name = (char_u *)"command line"; + sourcing_name = "command line"; current_sctx.sc_sid = SID_CARG; current_sctx.sc_seq = 0; for (i = 0; i < parmp->n_commands; i++) { @@ -2061,16 +2060,16 @@ static int execute_env(char *env) { const char *initstr = os_getenv(env); if (initstr != NULL) { - char_u *save_sourcing_name = sourcing_name; + char_u *save_sourcing_name = (char_u *)sourcing_name; linenr_T save_sourcing_lnum = sourcing_lnum; - sourcing_name = (char_u *)env; + sourcing_name = env; sourcing_lnum = 0; const sctx_T save_current_sctx = current_sctx; current_sctx.sc_sid = SID_ENV; current_sctx.sc_seq = 0; current_sctx.sc_lnum = 0; do_cmdline_cmd((char *)initstr); - sourcing_name = save_sourcing_name; + sourcing_name = (char *)save_sourcing_name; sourcing_lnum = save_sourcing_lnum; current_sctx = save_current_sctx; return OK; @@ -2104,7 +2103,7 @@ static bool file_owned(const char *fname) static void mainerr(const char *errstr, const char *str) FUNC_ATTR_NORETURN { - char *prgname = (char *)path_tail((char_u *)argv0); + char *prgname = path_tail(argv0); signal_stop(); // kill us with CTRL-C here, if you like diff --git a/src/nvim/mark.c b/src/nvim/mark.c index 222b2a3cf3..6de8d5dfd5 100644 --- a/src/nvim/mark.c +++ b/src/nvim/mark.c @@ -717,7 +717,7 @@ static void show_one_mark(int c, char_u *arg, pos_T *p, char_u *name_arg, int cu } } } else if (!got_int - && (arg == NULL || vim_strchr(arg, c) != NULL) + && (arg == NULL || vim_strchr((char *)arg, c) != NULL) && p->lnum != 0) { // don't output anything if 'q' typed at --more-- prompt if (name == NULL && current) { diff --git a/src/nvim/match.c b/src/nvim/match.c index f10d63dd34..54f3bff472 100644 --- a/src/nvim/match.c +++ b/src/nvim/match.c @@ -65,7 +65,7 @@ static int match_add(win_T *wp, const char *const grp, const char *const pat, in if ((hlg_id = syn_check_group(grp, strlen(grp))) == 0) { return -1; } - if (pat != NULL && (regprog = vim_regcomp((char_u *)pat, RE_MAGIC)) == NULL) { + if (pat != NULL && (regprog = vim_regcomp((char *)pat, RE_MAGIC)) == NULL) { semsg(_(e_invarg2), pat); return -1; } diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c index 1d65529b75..3868d65ab9 100644 --- a/src/nvim/mbyte.c +++ b/src/nvim/mbyte.c @@ -1332,7 +1332,7 @@ bool mb_isalpha(int a) static int utf_strnicmp(const char_u *s1, const char_u *s2, size_t n1, size_t n2) { int c1, c2, cdiff; - char_u buffer[6]; + char buffer[6]; for (;;) { c1 = utf_safe_read_char_adv(&s1, &n1); @@ -1371,10 +1371,10 @@ static int utf_strnicmp(const char_u *s1, const char_u *s2, size_t n1, size_t n2 if (c1 != -1 && c2 == -1) { n1 = utf_char2bytes(utf_fold(c1), (char *)buffer); - s1 = buffer; + s1 = (char_u *)buffer; } else if (c2 != -1 && c1 == -1) { n2 = utf_char2bytes(utf_fold(c2), (char *)buffer); - s2 = buffer; + s2 = (char_u *)buffer; } while (n1 > 0 && n2 > 0 && *s1 != NUL && *s2 != NUL) { @@ -1992,6 +1992,31 @@ theend: convert_setup(&vimconv, NULL, NULL); } +/// @return true if string "s" is a valid utf-8 string. +/// When "end" is NULL stop at the first NUL. +/// When "end" is positive stop there. +bool utf_valid_string(const char_u *s, const char_u *end) +{ + const char_u *p = s; + + while (end == NULL ? *p != NUL : p < end) { + int l = utf8len_tab_zero[*p]; + if (l == 0) { + return false; // invalid lead byte + } + if (end != NULL && p + l > end) { + return false; // incomplete byte sequence + } + p++; + while (--l > 0) { + if ((*p++ & 0xc0) != 0x80) { + return false; // invalid trail byte + } + } + } + return true; +} + /* * If the cursor moves on an trail byte, set the cursor on the lead byte. * Thus it moves left if necessary. @@ -2264,7 +2289,7 @@ char_u *enc_locale(void) // Make the name lowercase and replace '_' with '-'. // Exception: "ja_JP.EUC" == "euc-jp", "zh_CN.EUC" = "euc-cn", // "ko_KR.EUC" == "euc-kr" - const char *p = (char *)vim_strchr((char_u *)s, '.'); + const char *p = vim_strchr(s, '.'); if (p != NULL) { if (p > s + 2 && !STRNICMP(p + 1, "EUC", 3) && !isalnum((int)p[4]) && p[4] != '-' && p[-3] == '_') { diff --git a/src/nvim/memline.c b/src/nvim/memline.c index 081045ab18..ac6bdfa1a4 100644 --- a/src/nvim/memline.c +++ b/src/nvim/memline.c @@ -531,8 +531,8 @@ void ml_open_file(buf_T *buf) need_wait_return = true; // call wait_return later no_wait_return++; (void)semsg(_("E303: Unable to open swap file for \"%s\", recovery impossible"), - buf_spname(buf) != NULL ? buf_spname(buf) : buf->b_fname); - --no_wait_return; + buf_spname(buf) != NULL ? buf_spname(buf) : (char_u *)buf->b_fname); + no_wait_return--; } // don't try to open a swap file again @@ -777,15 +777,14 @@ void ml_recover(bool checkext) // If the file name ends in ".s[a-w][a-z]" we assume this is the swap file. // Otherwise a search is done to find the swap file(s). - fname = curbuf->b_fname; + fname = (char_u *)curbuf->b_fname; if (fname == NULL) { // When there is no file name fname = (char_u *)""; } len = (int)STRLEN(fname); if (checkext && len >= 4 && STRNICMP(fname + len - 4, ".s", 2) == 0 - && vim_strchr((char_u *)"abcdefghijklmnopqrstuvw", - TOLOWER_ASC(fname[len - 2])) != NULL + && vim_strchr("abcdefghijklmnopqrstuvw", TOLOWER_ASC(fname[len - 2])) != NULL && ASCII_ISALPHA(fname[len - 1])) { directly = true; fname_used = vim_strsave(fname); // make a copy for mf_open() @@ -992,7 +991,7 @@ void ml_recover(bool checkext) * 'fileencoding', etc. Ignore errors. The text itself is not used. */ if (curbuf->b_ffname != NULL) { - orig_file_status = readfile(curbuf->b_ffname, NULL, (linenr_T)0, + orig_file_status = readfile((char *)curbuf->b_ffname, NULL, (linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM, NULL, READ_NEW, false); } @@ -1066,7 +1065,7 @@ void ml_recover(bool checkext) */ if (!cannot_open) { line_count = pp->pb_pointer[idx].pe_line_count; - if (readfile(curbuf->b_ffname, NULL, lnum, + if (readfile((char *)curbuf->b_ffname, NULL, lnum, pp->pb_pointer[idx].pe_old_lnum - 1, line_count, NULL, 0, false) != OK) { cannot_open = true; @@ -1248,8 +1247,8 @@ theend: if (serious_error && called_from_main) { ml_close(curbuf, TRUE); } else { - apply_autocmds(EVENT_BUFREADPOST, NULL, curbuf->b_fname, FALSE, curbuf); - apply_autocmds(EVENT_BUFWINENTER, NULL, curbuf->b_fname, FALSE, curbuf); + apply_autocmds(EVENT_BUFREADPOST, NULL, curbuf->b_fname, false, curbuf); + apply_autocmds(EVENT_BUFWINENTER, NULL, curbuf->b_fname, false, curbuf); } } @@ -1338,8 +1337,8 @@ int recover_names(char_u *fname, int list, int nr, char_u **fname_out) tail = (char_u *)make_percent_swname((char *)dir_name, (char *)fname_res); } else { - tail = path_tail(fname_res); - tail = (char_u *)concat_fnames((char *)dir_name, (char *)tail, TRUE); + tail = (char_u *)path_tail((char *)fname_res); + tail = (char_u *)concat_fnames((char *)dir_name, (char *)tail, true); } num_names = recov_file_names(names, tail, FALSE); xfree(tail); @@ -1418,7 +1417,7 @@ int recover_names(char_u *fname, int list, int nr, char_u **fname_out) // print the swap file name msg_outnum((long)++file_count); msg_puts(". "); - msg_puts((const char *)path_tail(files[i])); + msg_puts((const char *)path_tail((char *)files[i])); msg_putchar('\n'); (void)swapfile_info(files[i]); } @@ -3204,7 +3203,7 @@ int resolve_symlink(const char_u *fname, char_u *buf) if (path_is_absolute(buf)) { STRCPY(tmp, buf); } else { - char_u *tail = path_tail(tmp); + char_u *tail = (char_u *)path_tail((char *)tmp); if (STRLEN(tail) + STRLEN(buf) >= MAXPATHL) { return FAIL; } @@ -3283,7 +3282,7 @@ char_u *get_file_in_dir(char_u *fname, char_u *dname) char_u *retval; int save_char; - tail = path_tail(fname); + tail = (char_u *)path_tail((char *)fname); if (dname[0] == '.' && dname[1] == NUL) { retval = vim_strsave(fname); @@ -3321,10 +3320,10 @@ static void attention_message(buf_T *buf, char_u *fname) msg_puts("\"\n"); const time_t swap_mtime = swapfile_info(fname); msg_puts(_("While opening file \"")); - msg_outtrans(buf->b_fname); + msg_outtrans((char_u *)buf->b_fname); msg_puts("\"\n"); FileInfo file_info; - if (!os_fileinfo((char *)buf->b_fname, &file_info)) { + if (!os_fileinfo(buf->b_fname, &file_info)) { msg_puts(_(" CANNOT BE FOUND")); } else { msg_puts(_(" dated: ")); @@ -3343,7 +3342,7 @@ static void attention_message(buf_T *buf, char_u *fname) " Quit, or continue with caution.\n")); msg_puts(_("(2) An edit session for this file crashed.\n")); msg_puts(_(" If this is the case, use \":recover\" or \"vim -r ")); - msg_outtrans(buf->b_fname); + msg_outtrans((char_u *)buf->b_fname); msg_puts(_("\"\n to recover the changes (see \":help recovery\").\n")); msg_puts(_(" If you did this already, delete the swap file \"")); msg_outtrans(fname); @@ -3423,7 +3422,7 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname, bool *found_ char *fname; size_t n; char *dir_name; - char *buf_fname = (char *)buf->b_fname; + char *buf_fname = buf->b_fname; /* * Isolate a directory name from *dirp and put it in dir_name. @@ -3482,8 +3481,8 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname, bool *found_ // buffer don't compare the directory names, they can // have a different mountpoint. if (b0.b0_flags & B0_SAME_DIR) { - if (FNAMECMP(path_tail(buf->b_ffname), - path_tail(b0.b0_fname)) != 0 + if (FNAMECMP(path_tail((char *)buf->b_ffname), + path_tail((char *)b0.b0_fname)) != 0 || !same_directory((char_u *)fname, buf->b_ffname)) { // Symlinks may point to the same file even // when the name differs, need to check the @@ -3510,14 +3509,14 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname, bool *found_ // give the ATTENTION message when there is an old swap file // for the current file, and the buffer was not recovered. if (differ == false && !(curbuf->b_flags & BF_RECOVERED) - && vim_strchr(p_shm, SHM_ATTENTION) == NULL) { + && vim_strchr((char *)p_shm, SHM_ATTENTION) == NULL) { int choice = 0; process_still_running = false; // It's safe to delete the swap file if all these are true: // - the edited file exists // - the swap file has no changes and looks OK - if (os_path_exists(buf->b_fname) && swapfile_unchanged(fname)) { + if (os_path_exists((char_u *)buf->b_fname) && swapfile_unchanged(fname)) { choice = 4; if (p_verbose > 0) { verb_msg(_("Found a swap file that is not useful, deleting it")); @@ -3528,7 +3527,7 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname, bool *found_ // response, trigger it. It may return 0 to ask the user anyway. if (choice == 0 && swap_exists_action != SEA_NONE - && has_autocmd(EVENT_SWAPEXISTS, (char_u *)buf_fname, buf)) { + && has_autocmd(EVENT_SWAPEXISTS, buf_fname, buf)) { choice = do_swapexists(buf, (char_u *)fname); } diff --git a/src/nvim/menu.c b/src/nvim/menu.c index 192bed76ef..c1ce2eefe3 100644 --- a/src/nvim/menu.c +++ b/src/nvim/menu.c @@ -18,7 +18,7 @@ #include "nvim/ex_docmd.h" #include "nvim/garray.h" #include "nvim/getchar.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/memory.h" #include "nvim/menu.h" #include "nvim/message.h" @@ -1034,7 +1034,7 @@ char *set_context_in_menu_cmd(expand_T *xp, const char *cmd, char *arg, bool for * Function given to ExpandGeneric() to obtain the list of (sub)menus (not * entries). */ -char_u *get_menu_name(expand_T *xp, int idx) +char *get_menu_name(expand_T *xp, int idx) { static vimmenu_T *menu = NULL; char *str; @@ -1076,14 +1076,14 @@ char_u *get_menu_name(expand_T *xp, int idx) should_advance = !should_advance; - return (char_u *)str; + return str; } /* * Function given to ExpandGeneric() to obtain the list of menus and menu * entries. */ -char_u *get_menu_names(expand_T *xp, int idx) +char *get_menu_names(expand_T *xp, int idx) { static vimmenu_T *menu = NULL; #define TBUFFER_LEN 256 @@ -1143,7 +1143,7 @@ char_u *get_menu_names(expand_T *xp, int idx) should_advance = !should_advance; - return (char_u *)str; + return str; } @@ -1301,7 +1301,7 @@ static char *menu_text(const char *str, int *mnemonic, char **actext) char *text; // Locate accelerator text, after the first TAB - p = (char *)vim_strchr((char_u *)str, TAB); + p = vim_strchr(str, TAB); if (p != NULL) { if (actext != NULL) { *actext = xstrdup(p + 1); @@ -1314,7 +1314,7 @@ static char *menu_text(const char *str, int *mnemonic, char **actext) // Find mnemonic characters "&a" and reduce "&&" to "&". for (p = text; p != NULL;) { - p = (char *)vim_strchr((char_u *)p, '&'); + p = vim_strchr(p, '&'); if (p != NULL) { if (p[1] == NUL) { // trailing "&" break; @@ -1382,16 +1382,16 @@ static void execute_menu(const exarg_T *eap, vimmenu_T *menu) char *mode; // Use the Insert mode entry when returning to Insert mode. - if (((State & INSERT) || restart_edit) && !current_sctx.sc_sid) { + if (((State & MODE_INSERT) || restart_edit) && !current_sctx.sc_sid) { mode = "Insert"; idx = MENU_INDEX_INSERT; - } else if (State & CMDLINE) { + } else if (State & MODE_CMDLINE) { mode = "Command"; idx = MENU_INDEX_CMDLINE; - } else if (get_real_state() & VISUAL) { - /* Detect real visual mode -- if we are really in visual mode we - * don't need to do any guesswork to figure out what the selection - * is. Just execute the visual binding for the menu. */ + } else if (get_real_state() & MODE_VISUAL) { + // Detect real visual mode -- if we are really in visual mode we + // don't need to do any guesswork to figure out what the selection + // is. Just execute the visual binding for the menu. mode = "Visual"; idx = MENU_INDEX_VISUAL; } else if (eap != NULL && eap->addr_count) { diff --git a/src/nvim/message.c b/src/nvim/message.c index f4ef91d1b7..49549bcc26 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -24,7 +24,7 @@ #include "nvim/getchar.h" #include "nvim/highlight.h" #include "nvim/input.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/main.h" #include "nvim/mbyte.h" #include "nvim/memory.h" @@ -162,7 +162,7 @@ void msg_grid_validate(void) { grid_assign_handle(&msg_grid); bool should_alloc = msg_use_grid(); - if (should_alloc && (msg_grid.Rows != Rows || msg_grid.Columns != Columns + if (should_alloc && (msg_grid.rows != Rows || msg_grid.cols != Columns || !msg_grid.chars)) { // TODO(bfredl): eventually should be set to "invalid". I e all callers // will use the grid including clear to EOS if necessary. @@ -174,9 +174,9 @@ void msg_grid_validate(void) // Tricky: allow resize while pager is active int pos = msg_scrolled ? msg_grid_pos : Rows - p_ch; - ui_comp_put_grid(&msg_grid, pos, 0, msg_grid.Rows, msg_grid.Columns, + ui_comp_put_grid(&msg_grid, pos, 0, msg_grid.rows, msg_grid.cols, false, true); - ui_call_grid_resize(msg_grid.handle, msg_grid.Columns, msg_grid.Rows); + ui_call_grid_resize(msg_grid.handle, msg_grid.cols, msg_grid.rows); msg_grid.throttled = false; // don't throttle in 'cmdheight' area msg_scrolled_at_flush = msg_scrolled; @@ -586,7 +586,7 @@ void msg_source(int attr) if (sourcing_name == NULL) { last_sourcing_name = NULL; } else { - last_sourcing_name = vim_strsave(sourcing_name); + last_sourcing_name = vim_strsave((char_u *)sourcing_name); } } --no_wait_return; @@ -598,8 +598,8 @@ void msg_source(int attr) /// If "emsg_skip" is set: never do error messages. int emsg_not_now(void) { - if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL - && vim_strchr(p_debug, 't') == NULL) + if ((emsg_off > 0 && vim_strchr((char *)p_debug, 'm') == NULL + && vim_strchr((char *)p_debug, 't') == NULL) || emsg_skip > 0) { return TRUE; } @@ -623,14 +623,12 @@ static bool emsg_multiline(const char *s, bool multiline) bool severe = emsg_severe; emsg_severe = false; - if (!emsg_off || vim_strchr(p_debug, 't') != NULL) { - /* - * Cause a throw of an error exception if appropriate. Don't display - * the error message in this case. (If no matching catch clause will - * be found, the message will be displayed later on.) "ignore" is set - * when the message should be ignored completely (used for the - * interrupt message). - */ + if (!emsg_off || vim_strchr((char *)p_debug, 't') != NULL) { + // Cause a throw of an error exception if appropriate. Don't display + // the error message in this case. (If no matching catch clause will + // be found, the message will be displayed later on.) "ignore" is set + // when the message should be ignored completely (used for the + // interrupt message). if (cause_errthrow(s, severe, &ignore)) { if (!ignore) { did_emsg++; @@ -1125,7 +1123,7 @@ void wait_return(int redraw) // just changed. screenalloc(); - State = HITRETURN; + State = MODE_HITRETURN; setmouse(); cmdline_row = msg_row; // Avoid the sequence that the user types ":" at the hit-return prompt @@ -1212,7 +1210,7 @@ void wait_return(int redraw) if (c == K_LEFTMOUSE || c == K_MIDDLEMOUSE || c == K_RIGHTMOUSE || c == K_X1MOUSE || c == K_X2MOUSE) { (void)jump_to_mouse(MOUSE_SETPOS, NULL, 0); - } else if (vim_strchr((char_u *)"\r\n ", c) == NULL && c != Ctrl_C) { + } else if (vim_strchr("\r\n ", c) == NULL && c != Ctrl_C) { // Put the character back in the typeahead buffer. Don't use the // stuff buffer, because lmaps wouldn't work. ins_char_typebuf(vgetc_char, vgetc_mod_mask); @@ -1250,7 +1248,7 @@ void wait_return(int redraw) XFREE_CLEAR(keep_msg); // don't redisplay message, it's too long } - if (tmpState == SETWSIZE) { // got resize event while in vgetc() + if (tmpState == MODE_SETWSIZE) { // got resize event while in vgetc() ui_refresh(); } else if (!skip_redraw) { if (redraw == true || (msg_scrolled != 0 && redraw != -1)) { @@ -2186,7 +2184,7 @@ static void msg_puts_display(const char_u *str, int maxlen, int attr, int recurs if (lines_left > 0) { --lines_left; } - if (p_more && lines_left == 0 && State != HITRETURN + if (p_more && lines_left == 0 && State != MODE_HITRETURN && !msg_no_more && !exmode_active) { if (do_more_prompt(NUL)) { s = confirm_msg_tail; @@ -2322,10 +2320,10 @@ void msg_scroll_up(bool may_throttle) if (msg_grid_pos > 0) { msg_grid_set_pos(msg_grid_pos - 1, true); } else { - grid_del_lines(&msg_grid, 0, 1, msg_grid.Rows, 0, msg_grid.Columns); + grid_del_lines(&msg_grid, 0, 1, msg_grid.rows, 0, msg_grid.cols); memmove(msg_grid.dirty_col, msg_grid.dirty_col + 1, - (msg_grid.Rows - 1) * sizeof(*msg_grid.dirty_col)); - msg_grid.dirty_col[msg_grid.Rows - 1] = 0; + (msg_grid.rows - 1) * sizeof(*msg_grid.dirty_col)); + msg_grid.dirty_col[msg_grid.rows - 1] = 0; } } else { grid_del_lines(&msg_grid_adj, 0, 1, Rows, 0, Columns); @@ -2358,7 +2356,7 @@ void msg_scroll_flush(void) msg_grid.throttled = false; int pos_delta = msg_grid_pos_at_flush - msg_grid_pos; assert(pos_delta >= 0); - int delta = MIN(msg_scrolled - msg_scrolled_at_flush, msg_grid.Rows); + int delta = MIN(msg_scrolled - msg_scrolled_at_flush, msg_grid.rows); if (pos_delta > 0) { ui_ext_msg_set_pos(msg_grid_pos, true); @@ -2376,7 +2374,7 @@ void msg_scroll_flush(void) for (int i = MAX(Rows - MAX(delta, 1), 0); i < Rows; i++) { int row = i - msg_grid_pos; assert(row >= 0); - ui_line(&msg_grid, row, 0, msg_grid.dirty_col[row], msg_grid.Columns, + ui_line(&msg_grid, row, 0, msg_grid.dirty_col[row], msg_grid.cols, HL_ATTR(HLF_MSG), false); msg_grid.dirty_col[row] = 0; } @@ -2402,9 +2400,9 @@ void msg_reset_scroll(void) clear_cmdline = true; if (msg_grid.chars) { // non-displayed part of msg_grid is considered invalid. - for (int i = 0; i < MIN(msg_scrollsize(), msg_grid.Rows); i++) { + for (int i = 0; i < MIN(msg_scrollsize(), msg_grid.rows); i++) { grid_clear_line(&msg_grid, msg_grid.line_offset[i], - msg_grid.Columns, false); + msg_grid.cols, false); } } } else { @@ -2418,7 +2416,7 @@ void msg_reset_scroll(void) static void inc_msg_scrolled(void) { if (*get_vim_var_str(VV_SCROLLSTART) == NUL) { - char *p = (char *)sourcing_name; + char *p = sourcing_name; char *tofree = NULL; // v:scrollstart is empty, set it to the script/function name and line @@ -2707,7 +2705,7 @@ static int do_more_prompt(int typed_char) // We get called recursively when a timer callback outputs a message. In // that case don't show another prompt. Also when at the hit-Enter prompt // and nothing was typed. - if (no_need_more || entered || (State == HITRETURN && typed_char == 0)) { + if (no_need_more || entered || (State == MODE_HITRETURN && typed_char == 0)) { return false; } entered = true; @@ -2721,7 +2719,7 @@ static int do_more_prompt(int typed_char) } } - State = ASKMORE; + State = MODE_ASKMORE; setmouse(); if (typed_char == NUL) { msg_moremsg(FALSE); @@ -2992,19 +2990,19 @@ void msg_moremsg(int full) } } -/// Repeat the message for the current mode: ASKMORE, EXTERNCMD, CONFIRM or -/// exmode_active. +/// Repeat the message for the current mode: MODE_ASKMORE, MODE_EXTERNCMD, +/// MODE_CONFIRM or exmode_active. void repeat_message(void) { - if (State == ASKMORE) { - msg_moremsg(TRUE); // display --more-- message again + if (State == MODE_ASKMORE) { + msg_moremsg(true); // display --more-- message again msg_row = Rows - 1; - } else if (State == CONFIRM) { + } else if (State == MODE_CONFIRM) { display_confirm_msg(); // display ":confirm" message again msg_row = Rows - 1; - } else if (State == EXTERNCMD) { + } else if (State == MODE_EXTERNCMD) { ui_cursor_goto(msg_row, msg_col); // put cursor back - } else if (State == HITRETURN || State == SETWSIZE) { + } else if (State == MODE_HITRETURN || State == MODE_SETWSIZE) { if (msg_row == Rows - 1) { // Avoid drawing the "hit-enter" prompt below the previous one, // overwrite it. Esp. useful when regaining focus and a @@ -3076,9 +3074,9 @@ int msg_end(void) * we have to redraw the window. * Do not do this if we are abandoning the file or editing the command line. */ - if (!exiting && need_wait_return && !(State & CMDLINE)) { - wait_return(FALSE); - return FALSE; + if (!exiting && need_wait_return && !(State & MODE_CMDLINE)) { + wait_return(false); + return false; } // NOTE: ui_flush() used to be called here. This had to be removed, as it @@ -3436,7 +3434,7 @@ int do_dialog(int type, char_u *title, char_u *message, char_u *buttons, int dfl int oldState = State; msg_silent = 0; // If dialog prompts for input, user needs to see it! #8788 - State = CONFIRM; + State = MODE_CONFIRM; setmouse(); /* diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c index 8038ba2cad..fe21279ef7 100644 --- a/src/nvim/mouse.c +++ b/src/nvim/mouse.c @@ -68,12 +68,12 @@ bool is_mouse_key(int c) /// mouse was previously on a status line, then the status line may be dragged. /// /// If flags has MOUSE_MAY_VIS, then VIsual mode will be started before the -/// cursor is moved unless the cursor was on a status line. +/// cursor is moved unless the cursor was on a status line or window bar. /// This function returns one of IN_UNKNOWN, IN_BUFFER, IN_STATUS_LINE or /// IN_SEP_LINE depending on where the cursor was clicked. /// /// If flags has MOUSE_MAY_STOP_VIS, then Visual mode will be stopped, unless -/// the mouse is on the status line of the same window. +/// the mouse is on the status line or window bar of the same window. /// /// If flags has MOUSE_DID_MOVE, nothing is done if the mouse didn't move since /// the last call. @@ -87,6 +87,7 @@ int jump_to_mouse(int flags, bool *inclusive, int which_button) { static int on_status_line = 0; // #lines below bottom of window static int on_sep_line = 0; // on separator right of window + static bool on_winbar = false; static int prev_row = -1; static int prev_col = -1; static win_T *dragwin = NULL; // window being dragged @@ -126,6 +127,9 @@ retnomove: if (on_sep_line) { return IN_SEP_LINE; } + if (on_winbar) { + return IN_OTHER_WIN | MOUSE_WINBAR; + } if (flags & MOUSE_MAY_STOP_VIS) { end_visual_mode(); redraw_curbuf_later(INVERTED); // delete the inversion @@ -155,9 +159,11 @@ retnomove: fdc = win_fdccol_count(wp); dragwin = NULL; - if (row == -1) { - return IN_OTHER_WIN; + if (row == -1 + wp->w_winbar_height) { + on_winbar = !!wp->w_winbar_height; + return IN_OTHER_WIN | (on_winbar ? MOUSE_WINBAR : 0); } + on_winbar = false; // winpos and height may change in win_enter()! if (grid == DEFAULT_GRID_HANDLE && row >= wp->w_height) { @@ -253,6 +259,9 @@ retnomove: did_drag |= count; } return IN_SEP_LINE; // Cursor didn't move + } else if (on_winbar) { + // After a click on the window bar don't start Visual mode. + return IN_OTHER_WIN | MOUSE_WINBAR; } else { // keep_window_focus must be true // before moving the cursor for a left click, stop Visual mode @@ -397,6 +406,9 @@ bool mouse_comp_pos(win_T *win, int *rowp, int *colp, linenr_T *lnump) if (win->w_p_rl) { col = win->w_width_inner - 1 - col; } + if (win->w_winbar_height) { + row -= win->w_winbar_height; + } lnum = win->w_topline; @@ -497,6 +509,7 @@ win_T *mouse_find_win(int *gridp, int *rowp, int *colp) // exist. FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { if (wp == fp->fr_win) { + *rowp -= wp->w_winrow_off - wp->w_winbar_height; return wp; } } @@ -512,8 +525,8 @@ static win_T *mouse_find_grid_win(int *gridp, int *rowp, int *colp) win_T *wp = get_win_by_grid_handle(*gridp); if (wp && wp->w_grid_alloc.chars && !(wp->w_floating && !wp->w_float_config.focusable)) { - *rowp = MIN(*rowp - wp->w_grid.row_offset, wp->w_grid.Rows - 1); - *colp = MIN(*colp - wp->w_grid.col_offset, wp->w_grid.Columns - 1); + *rowp = MIN(*rowp - wp->w_grid.row_offset, wp->w_grid.rows - 1); + *colp = MIN(*colp - wp->w_grid.col_offset, wp->w_grid.cols - 1); return wp; } } else if (*gridp == 0) { @@ -784,8 +797,8 @@ int mouse_check_fold(void) wp = mouse_find_win(&click_grid, &click_row, &click_col); if (wp && multigrid) { - max_row = wp->w_grid_alloc.Rows; - max_col = wp->w_grid_alloc.Columns; + max_row = wp->w_grid_alloc.rows; + max_col = wp->w_grid_alloc.cols; } if (wp && mouse_row >= 0 && mouse_row < max_row diff --git a/src/nvim/move.c b/src/nvim/move.c index 11feb497ea..97ce92f6a9 100644 --- a/src/nvim/move.c +++ b/src/nvim/move.c @@ -1016,7 +1016,7 @@ void textpos2screenpos(win_T *wp, pos_T *pos, int *rowp, int *scolp, int *ccolp, col -= wp->w_leftcol; if (col >= 0 && col < wp->w_width) { - coloff = col - scol + (local ? 0 : wp->w_wincol + wp->w_border_adj[3]) + 1; + coloff = col - scol + (local ? 0 : wp->w_wincol + wp->w_wincol_off) + 1; } else { scol = ccol = ecol = 0; // character is left or right of the window @@ -1027,7 +1027,7 @@ void textpos2screenpos(win_T *wp, pos_T *pos, int *rowp, int *scolp, int *ccolp, } } } - *rowp = (local ? 0 : wp->w_winrow + wp->w_border_adj[0]) + row + rowoff; + *rowp = (local ? 0 : wp->w_winrow + wp->w_winrow_off) + row + rowoff; *scolp = scol + coloff; *ccolp = ccol + coloff; *ecolp = ecol + coloff; diff --git a/src/nvim/normal.c b/src/nvim/normal.c index fd974d9c05..1692970a97 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -33,7 +33,7 @@ #include "nvim/getchar.h" #include "nvim/globals.h" #include "nvim/indent.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/log.h" #include "nvim/main.h" #include "nvim/mark.h" @@ -487,7 +487,7 @@ static void normal_prepare(NormalState *s) } s->mapped_len = typebuf_maplen(); - State = NORMAL_BUSY; + State = MODE_NORMAL_BUSY; // Set v:count here, when called from main() and not a stuffed command, so // that v:count can be used in an expression mapping when there is no count. @@ -594,7 +594,7 @@ static void normal_redraw_mode_message(NormalState *s) // Draw the cursor with the right shape here if (restart_edit != 0) { - State = INSERT; + State = MODE_INSERT; } // If need to redraw, and there is a "keep_msg", redraw before the @@ -671,7 +671,7 @@ static void normal_get_additional_char(NormalState *s) // Get a second or third character. if (cp != NULL) { if (repl) { - State = REPLACE; // pretend Replace mode + State = MODE_REPLACE; // pretend Replace mode ui_cursor_shape(); // show different cursor shape } if (lang && curbuf->b_p_iminsert == B_IMODE_LMAP) { @@ -679,9 +679,9 @@ static void normal_get_additional_char(NormalState *s) no_mapping--; allow_keys--; if (repl) { - State = LREPLACE; + State = MODE_LREPLACE; } else { - State = LANGMAP; + State = MODE_LANGMAP; } langmap_active = true; } @@ -693,7 +693,7 @@ static void normal_get_additional_char(NormalState *s) no_mapping++; allow_keys++; } - State = NORMAL_BUSY; + State = MODE_NORMAL_BUSY; s->need_flushbuf |= add_to_showcmd(*cp); if (!lit) { @@ -979,7 +979,7 @@ static int normal_execute(VimState *state, int key) s->old_col = curwin->w_curswant; s->c = key; - LANGMAP_ADJUST(s->c, get_real_state() != SELECTMODE); + LANGMAP_ADJUST(s->c, get_real_state() != MODE_SELECT); // If a mapping was started in Visual or Select mode, remember the length // of the mapping. This is used below to not return to Insert mode for as @@ -1122,7 +1122,7 @@ static int normal_execute(VimState *state, int key) did_cursorhold = false; } - State = NORMAL; + State = MODE_NORMAL; if (s->ca.nchar == ESC) { clearop(&s->oa); @@ -1202,7 +1202,7 @@ static void normal_check_interrupt(NormalState *s) // Typed two CTRL-C in a row: go back to ex mode as if "Q" was // used and keep "got_int" set, so that it aborts ":g". exmode_active = true; - State = NORMAL; + State = MODE_NORMAL; } else if (!global_busy || !exmode_active) { if (!quit_more) { // flush all buffers @@ -1280,7 +1280,8 @@ static void normal_redraw(NormalState *s) validate_cursor(); if (VIsual_active) { - update_curbuf(INVERTED); // update inverted part + redraw_curbuf_later(INVERTED); // update inverted part + update_screen(INVERTED); } else if (must_redraw) { update_screen(0); } else if (redraw_cmdline || clear_cmdline) { @@ -1559,7 +1560,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) // CTRL right mouse button does CTRL-T if (is_click && (mod_mask & MOD_MASK_CTRL) && which_button == MOUSE_RIGHT) { - if (State & INSERT) { + if (State & MODE_INSERT) { stuffcharReadbuff(Ctrl_O); } if (count > 1) { @@ -1607,7 +1608,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) // Middle mouse button does a 'put' of the selected text if (which_button == MOUSE_MIDDLE) { - if (State == NORMAL) { + if (State == MODE_NORMAL) { // If an operator was pending, we don't know what the user wanted to do. // Go back to normal mode: Clear the operator and beep(). if (oap != NULL && oap->op_type != OP_NOP) { @@ -1629,7 +1630,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) return false; } // The rest is below jump_to_mouse() - } else if ((State & INSERT) == 0) { + } else if ((State & MODE_INSERT) == 0) { return false; } @@ -1638,7 +1639,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) // with do_put(). // Also paste at the cursor if the current mode isn't in 'mouse' (only // happens for the GUI). - if ((State & INSERT)) { + if ((State & MODE_INSERT)) { if (regname == '.') { insert_reg(regname, true); } else { @@ -1807,7 +1808,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) } } - if ((State & (NORMAL | INSERT)) + if ((State & (MODE_NORMAL | MODE_INSERT)) && !(mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL))) { if (which_button == MOUSE_LEFT) { if (is_click) { @@ -1850,6 +1851,11 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) oap == NULL ? NULL : &(oap->inclusive), which_button); + // A click in the window bar has no side effects. + if (jump_flags & MOUSE_WINBAR) { + return false; + } + moved = (jump_flags & CURSOR_MOVED); in_status_line = (jump_flags & IN_STATUS_LINE); in_sep_line = (jump_flags & IN_SEP_LINE); @@ -1958,7 +1964,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) } } } - } else if ((State & INSERT) && VIsual_active) { + } else if ((State & MODE_INSERT) && VIsual_active) { // If Visual mode started in insert mode, execute "CTRL-O" stuffcharReadbuff(Ctrl_O); } @@ -2005,7 +2011,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) || (curbuf->b_help && (mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK)) { // Ctrl-Mouse click (or double click in a help window) jumps to the tag // under the mouse pointer. - if (State & INSERT) { + if (State & MODE_INSERT) { stuffcharReadbuff(Ctrl_O); } stuffcharReadbuff(Ctrl_RSB); @@ -2013,7 +2019,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) } else if ((mod_mask & MOD_MASK_SHIFT)) { // Shift-Mouse click searches for the next occurrence of the word under // the mouse pointer - if (State & INSERT + if (State & MODE_INSERT || (VIsual_active && VIsual_select)) { stuffcharReadbuff(Ctrl_O); } @@ -2025,7 +2031,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) } else if (in_status_line || in_sep_line) { // Do nothing if on status line or vertical separator // Handle double clicks otherwise - } else if ((mod_mask & MOD_MASK_MULTI_CLICK) && (State & (NORMAL | INSERT))) { + } else if ((mod_mask & MOD_MASK_MULTI_CLICK) && (State & (MODE_NORMAL | MODE_INSERT))) { if (is_click || !VIsual_active) { if (VIsual_active) { orig_cursor = VIsual; @@ -2191,7 +2197,7 @@ static int get_mouse_class(char_u *p) // characters to be considered as a single word. These are things like // "->", "/ *", "*=", "+=", "&=", "<=", ">=", "!=" etc. Otherwise, each // character is in its own class. - if (c != NUL && vim_strchr((char_u *)"-+*/%<>&|^!=", c) != NULL) { + if (c != NUL && vim_strchr("-+*/%<>&|^!=", c) != NULL) { return 1; } return c; @@ -3447,7 +3453,7 @@ dozet: // and "zC" only in Visual mode. "zj" and "zk" are motion // commands. if (cap->nchar != 'f' && cap->nchar != 'F' - && !(VIsual_active && vim_strchr((char_u *)"dcCoO", cap->nchar)) + && !(VIsual_active && vim_strchr("dcCoO", cap->nchar)) && cap->nchar != 'j' && cap->nchar != 'k' && checkclearop(cap->oap)) { return; @@ -3455,7 +3461,7 @@ dozet: // For "z+", "z<CR>", "zt", "z.", "zz", "z^", "z-", "zb": // If line number given, set cursor. - if ((vim_strchr((char_u *)"+\r\nt.z^-b", nchar) != NULL) + if ((vim_strchr("+\r\nt.z^-b", nchar) != NULL) && cap->count0 && cap->count0 != curwin->w_cursor.lnum) { setpcmark(); @@ -3800,7 +3806,7 @@ dozet: no_mapping--; allow_keys--; (void)add_to_showcmd(nchar); - if (vim_strchr((char_u *)"gGwW", nchar) == NULL) { + if (vim_strchr("gGwW", nchar) == NULL) { clearopbeep(cap->oap); break; } @@ -4234,7 +4240,7 @@ static void nv_ident(cmdarg_T *cap) p = (char_u *)buf + STRLEN(buf); while (n-- > 0) { // put a backslash before \ and some others - if (vim_strchr(aux_ptr, *ptr) != NULL) { + if (vim_strchr((char *)aux_ptr, *ptr) != NULL) { *p++ = '\\'; } // When current byte is a part of multibyte character, copy all @@ -4268,7 +4274,7 @@ static void nv_ident(cmdarg_T *cap) // Start insert mode in terminal buffer restart_edit = 'i'; - add_map((char_u *)"<buffer> <esc> <Cmd>bdelete!<CR>", TERM_FOCUS, true); + add_map((char_u *)"<buffer> <esc> <Cmd>bdelete!<CR>", MODE_TERMINAL, true); } } @@ -4434,9 +4440,9 @@ static void nv_right(cmdarg_T *cap) // <Space> wraps to next line if 'whichwrap' has 's'. // 'l' wraps to next line if 'whichwrap' has 'l'. // CURS_RIGHT wraps to next line if 'whichwrap' has '>'. - if (((cap->cmdchar == ' ' && vim_strchr(p_ww, 's') != NULL) - || (cap->cmdchar == 'l' && vim_strchr(p_ww, 'l') != NULL) - || (cap->cmdchar == K_RIGHT && vim_strchr(p_ww, '>') != NULL)) + if (((cap->cmdchar == ' ' && vim_strchr((char *)p_ww, 's') != NULL) + || (cap->cmdchar == 'l' && vim_strchr((char *)p_ww, 'l') != NULL) + || (cap->cmdchar == K_RIGHT && vim_strchr((char *)p_ww, '>') != NULL)) && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) { // When deleting we also count the NL as a character. // Set cap->oap->inclusive when last char in the line is @@ -4504,9 +4510,9 @@ static void nv_left(cmdarg_T *cap) // 'h' wraps to previous line if 'whichwrap' has 'h'. // CURS_LEFT wraps to previous line if 'whichwrap' has '<'. if ((((cap->cmdchar == K_BS || cap->cmdchar == Ctrl_H) - && vim_strchr(p_ww, 'b') != NULL) - || (cap->cmdchar == 'h' && vim_strchr(p_ww, 'h') != NULL) - || (cap->cmdchar == K_LEFT && vim_strchr(p_ww, '<') != NULL)) + && vim_strchr((char *)p_ww, 'b') != NULL) + || (cap->cmdchar == 'h' && vim_strchr((char *)p_ww, 'h') != NULL) + || (cap->cmdchar == K_LEFT && vim_strchr((char *)p_ww, '<') != NULL)) && curwin->w_cursor.lnum > 1) { curwin->w_cursor.lnum--; coladvance(MAXCOL); @@ -4802,7 +4808,7 @@ static void nv_brackets(cmdarg_T *cap) // "[f" or "]f" : Edit file under the cursor (same as "gf") if (cap->nchar == 'f') { nv_gotofile(cap); - } else if (vim_strchr((char_u *)"iI\011dD\004", cap->nchar) != NULL) { + } else if (vim_strchr("iI\011dD\004", cap->nchar) != NULL) { // Find the occurrence(s) of the identifier or define under cursor // in current and included files or jump to the first occurrence. // @@ -4831,8 +4837,8 @@ static void nv_brackets(cmdarg_T *cap) MAXLNUM); curwin->w_set_curswant = true; } - } else if ((cap->cmdchar == '[' && vim_strchr((char_u *)"{(*/#mM", cap->nchar) != NULL) - || (cap->cmdchar == ']' && vim_strchr((char_u *)"})*/#mM", cap->nchar) != NULL)) { + } else if ((cap->cmdchar == '[' && vim_strchr("{(*/#mM", cap->nchar) != NULL) + || (cap->cmdchar == ']' && vim_strchr("})*/#mM", cap->nchar) != NULL)) { // "[{", "[(", "]}" or "])": go to Nth unclosed '{', '(', '}' or ')' // "[#", "]#": go to start/end of Nth innermost #if..#endif construct. // "[/", "[*", "]/", "]*": go to Nth comment start/end. @@ -5269,7 +5275,7 @@ static void nv_replace(cmdarg_T *cap) // multi-byte and the other way around. Also handles adding // composing characters for utf-8. for (long n = cap->count1; n > 0; n--) { - State = REPLACE; + State = MODE_REPLACE; if (cap->nchar == Ctrl_E || cap->nchar == Ctrl_Y) { int c = ins_copychar(curwin->w_cursor.lnum + (cap->nchar == Ctrl_Y ? -1 : 1)); @@ -5403,7 +5409,7 @@ static void n_swapchar(cmdarg_T *cap) return; } - if (LINEEMPTY(curwin->w_cursor.lnum) && vim_strchr(p_ww, '~') == NULL) { + if (LINEEMPTY(curwin->w_cursor.lnum) && vim_strchr((char *)p_ww, '~') == NULL) { clearopbeep(cap->oap); return; } @@ -5419,7 +5425,7 @@ static void n_swapchar(cmdarg_T *cap) did_change |= swapchar(cap->oap->op_type, &curwin->w_cursor); inc_cursor(); if (gchar_cursor() == NUL) { - if (vim_strchr(p_ww, '~') != NULL + if (vim_strchr((char *)p_ww, '~') != NULL && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) { curwin->w_cursor.lnum++; curwin->w_cursor.col = 0; @@ -5491,7 +5497,7 @@ static void v_visop(cmdarg_T *cap) curwin->w_curswant = MAXCOL; } } - cap->cmdchar = *(vim_strchr(trans, cap->cmdchar) + 1); + cap->cmdchar = (uint8_t)(*(vim_strchr((char *)trans, cap->cmdchar) + 1)); nv_operator(cap); } @@ -5754,7 +5760,8 @@ void start_selection(void) /// When "c" is 'o' (checking for "mouse") then also when mapped. void may_start_select(int c) { - VIsual_select = (c == 'o' || (stuff_empty() && typebuf_typed())) && vim_strchr(p_slm, c) != NULL; + VIsual_select = (c == 'o' || (stuff_empty() && typebuf_typed())) + && vim_strchr((char *)p_slm, c) != NULL; } /// Start Visual mode "c". @@ -6807,7 +6814,7 @@ void set_cursor_for_append_to_line(void) // Pretend Insert mode here to allow the cursor on the // character past the end of the line - State = INSERT; + State = MODE_INSERT; coladvance(MAXCOL); State = save_State; } else { @@ -6863,7 +6870,7 @@ static void nv_edit(cmdarg_T *cap) // Pretend Insert mode here to allow the cursor on the // character past the end of the line - State = INSERT; + State = MODE_INSERT; coladvance(getviscol()); State = save_State; } diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 9d6e516d6e..c3d7742307 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -354,7 +354,7 @@ static void shift_block(oparg_T *oap, int amount) p_ri = 0; // don't want revins in indent - State = INSERT; // don't want REPLACE for State + State = MODE_INSERT; // don't want MODE_REPLACE for State block_prep(oap, &bd, curwin->w_cursor.lnum, true); if (bd.is_short) { return; @@ -532,7 +532,7 @@ static void block_insert(oparg_T *oap, char_u *s, int b_insert, struct block_def char_u *newp, *oldp; // new, old lines linenr_T lnum; // loop var int oldstate = State; - State = INSERT; // don't want REPLACE for State + State = MODE_INSERT; // don't want MODE_REPLACE for State for (lnum = oap->start.lnum + 1; lnum <= oap->end.lnum; lnum++) { block_prep(oap, bdp, lnum, true); @@ -800,7 +800,7 @@ char_u *get_expr_line_src(void) bool valid_yank_reg(int regname, bool writing) { if ((regname > 0 && ASCII_ISALNUM(regname)) - || (!writing && vim_strchr((char_u *)"/.%:=", regname) != NULL) + || (!writing && vim_strchr("/.%:=", regname) != NULL) || regname == '#' || regname == '"' || regname == '-' @@ -884,7 +884,7 @@ yankreg_T *copy_register(int name) if (copy->y_size == 0) { copy->y_array = NULL; } else { - copy->y_array = xcalloc(copy->y_size, sizeof(char_u *)); + copy->y_array = xcalloc(copy->y_size, sizeof(char *)); for (size_t i = 0; i < copy->y_size; i++) { copy->y_array[i] = xstrdup(reg->y_array[i]); } @@ -1161,7 +1161,7 @@ int do_execreg(int regname, int colon, int addcr, int silent) * Insert lines into typeahead buffer, from last one to first one. */ put_reedit_in_typebuf(silent); - char_u *escaped; + char *escaped; for (size_t i = reg->y_size; i-- > 0;) { // from y_size - 1 to 0 included // insert NL between lines and after last line if type is kMTLineWise if (reg->y_type == kMTLineWise || i < reg->y_size - 1 || addcr) { @@ -1180,11 +1180,11 @@ int do_execreg(int regname, int colon, int addcr, int silent) free_str = true; } } - escaped = (char_u *)vim_strsave_escape_ks((char *)str); + escaped = vim_strsave_escape_ks((char *)str); if (free_str) { xfree(str); } - retval = ins_typebuf((char *)escaped, remap, 0, true, silent); + retval = ins_typebuf(escaped, remap, 0, true, silent); xfree(escaped); if (retval == FAIL) { return FAIL; @@ -1237,17 +1237,17 @@ static int put_in_typebuf(char_u *s, bool esc, bool colon, int silent) retval = ins_typebuf("\n", REMAP_NONE, 0, true, silent); } if (retval == OK) { - char_u *p; + char *p; if (esc) { - p = (char_u *)vim_strsave_escape_ks((char *)s); + p = vim_strsave_escape_ks((char *)s); } else { - p = s; + p = (char *)s; } if (p == NULL) { retval = FAIL; } else { - retval = ins_typebuf((char *)p, esc ? REMAP_NONE : REMAP_YES, 0, true, silent); + retval = ins_typebuf(p, esc ? REMAP_NONE : REMAP_YES, 0, true, silent); } if (esc) { xfree(p); @@ -1368,7 +1368,7 @@ bool get_spec_reg(int regname, char_u **argp, bool *allocated, bool errmsg) if (errmsg) { check_fname(); // will give emsg if not set } - *argp = curbuf->b_fname; + *argp = (char_u *)curbuf->b_fname; return true; case '#': // alternate file name @@ -1865,7 +1865,7 @@ static void replace_character(int c) { const int n = State; - State = REPLACE; + State = MODE_REPLACE; ins_char(c); State = n; // Backup to the replaced character. @@ -2507,10 +2507,7 @@ int op_change(oparg_T *oap) l = oap->start.col; if (oap->motion_type == kMTLineWise) { l = 0; - if (!p_paste && curbuf->b_p_si - && !curbuf->b_p_cin) { - can_si = true; // It's like opening a new line, do si - } + can_si = may_do_si(); // Like opening a new line, do smart indent } // First delete the text in the region. In an empty buffer only need to @@ -2679,7 +2676,7 @@ bool op_yank(oparg_T *oap, bool message) static void op_yank_reg(oparg_T *oap, bool message, yankreg_T *reg, bool append) { yankreg_T newreg; // new yank register when appending - char_u **new_ptr; + char **new_ptr; linenr_T lnum; // current line number size_t j; MotionType yank_type = oap->motion_type; @@ -2713,7 +2710,7 @@ static void op_yank_reg(oparg_T *oap, bool message, yankreg_T *reg, bool append) reg->y_size = yanklines; reg->y_type = yank_type; // set the yank register type reg->y_width = 0; - reg->y_array = xcalloc(yanklines, sizeof(char_u *)); + reg->y_array = xcalloc(yanklines, sizeof(char *)); reg->additional_data = NULL; reg->timestamp = os_time(); @@ -2808,10 +2805,10 @@ static void op_yank_reg(oparg_T *oap, bool message, yankreg_T *reg, bool append) if (curr != reg) { // append the new block to the old block new_ptr = xmalloc(sizeof(char_u *) * (curr->y_size + reg->y_size)); for (j = 0; j < curr->y_size; j++) { - new_ptr[j] = (char_u *)curr->y_array[j]; + new_ptr[j] = curr->y_array[j]; } xfree(curr->y_array); - curr->y_array = (char **)new_ptr; + curr->y_array = new_ptr; if (yank_type == kMTLineWise) { // kMTLineWise overrides kMTCharWise and kMTBlockWise @@ -3131,8 +3128,8 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags) if (y_array != NULL) { y_array[y_size] = ptr; } - ++y_size; - ptr = vim_strchr(ptr, '\n'); + y_size++; + ptr = (char_u *)vim_strchr((char *)ptr, '\n'); if (ptr != NULL) { if (y_array != NULL) { *ptr = NUL; @@ -3774,7 +3771,7 @@ void adjust_cursor_eol(void) if (curwin->w_cursor.col > 0 && gchar_cursor() == NUL && (cur_ve_flags & VE_ONEMORE) == 0 - && !(restart_edit || (State & INSERT))) { + && !(restart_edit || (State & MODE_INSERT))) { // Put the cursor on the last character in the line. dec_cursor(); @@ -3852,7 +3849,7 @@ void ex_display(exarg_T *eap) type = 'b'; break; } - if (arg != NULL && vim_strchr(arg, name) == NULL) { + if (arg != NULL && vim_strchr((char *)arg, name) == NULL) { continue; // did not ask for this register } @@ -3915,14 +3912,14 @@ void ex_display(exarg_T *eap) // display last inserted text if ((p = get_last_insert()) != NULL - && (arg == NULL || vim_strchr(arg, '.') != NULL) && !got_int + && (arg == NULL || vim_strchr((char *)arg, '.') != NULL) && !got_int && !message_filtered(p)) { msg_puts("\n c \". "); dis_msg(p, true); } // display last command line - if (last_cmdline != NULL && (arg == NULL || vim_strchr(arg, ':') != NULL) + if (last_cmdline != NULL && (arg == NULL || vim_strchr((char *)arg, ':') != NULL) && !got_int && !message_filtered(last_cmdline)) { msg_puts("\n c \": "); dis_msg(last_cmdline, false); @@ -3930,14 +3927,14 @@ void ex_display(exarg_T *eap) // display current file name if (curbuf->b_fname != NULL - && (arg == NULL || vim_strchr(arg, '%') != NULL) && !got_int - && !message_filtered(curbuf->b_fname)) { + && (arg == NULL || vim_strchr((char *)arg, '%') != NULL) && !got_int + && !message_filtered((char_u *)curbuf->b_fname)) { msg_puts("\n c \"% "); - dis_msg(curbuf->b_fname, false); + dis_msg((char_u *)curbuf->b_fname, false); } // display alternate file name - if ((arg == NULL || vim_strchr(arg, '%') != NULL) && !got_int) { + if ((arg == NULL || vim_strchr((char *)arg, '%') != NULL) && !got_int) { char_u *fname; linenr_T dummy; @@ -3949,14 +3946,14 @@ void ex_display(exarg_T *eap) // display last search pattern if (last_search_pat() != NULL - && (arg == NULL || vim_strchr(arg, '/') != NULL) && !got_int + && (arg == NULL || vim_strchr((char *)arg, '/') != NULL) && !got_int && !message_filtered(last_search_pat())) { msg_puts("\n c \"/ "); dis_msg(last_search_pat(), false); } // display last used expression - if (expr_line != NULL && (arg == NULL || vim_strchr(arg, '=') != NULL) + if (expr_line != NULL && (arg == NULL || vim_strchr((char *)arg, '=') != NULL) && !got_int && !message_filtered(expr_line)) { msg_puts("\n c \"= "); dis_msg(expr_line, false); @@ -4608,14 +4605,14 @@ void format_lines(linenr_T line_count, int avoid_fex) } // put cursor on last non-space - State = NORMAL; // don't go past end-of-line + State = MODE_NORMAL; // don't go past end-of-line coladvance(MAXCOL); while (curwin->w_cursor.col && ascii_isspace(gchar_cursor())) { dec_cursor(); } // do the formatting, without 'showmode' - State = INSERT; // for open_line() + State = MODE_INSERT; // for open_line() smd_save = p_smd; p_smd = FALSE; insertchar(NUL, INSCHAR_FORMAT @@ -5030,12 +5027,12 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) pos_T endpos; colnr_T save_coladd = 0; - const bool do_hex = vim_strchr(curbuf->b_p_nf, 'x') != NULL; // "heX" - const bool do_oct = vim_strchr(curbuf->b_p_nf, 'o') != NULL; // "Octal" - const bool do_bin = vim_strchr(curbuf->b_p_nf, 'b') != NULL; // "Bin" - const bool do_alpha = vim_strchr(curbuf->b_p_nf, 'p') != NULL; // "alPha" + const bool do_hex = vim_strchr((char *)curbuf->b_p_nf, 'x') != NULL; // "heX" + const bool do_oct = vim_strchr((char *)curbuf->b_p_nf, 'o') != NULL; // "Octal" + const bool do_bin = vim_strchr((char *)curbuf->b_p_nf, 'b') != NULL; // "Bin" + const bool do_alpha = vim_strchr((char *)curbuf->b_p_nf, 'p') != NULL; // "alPha" // "Unsigned" - const bool do_unsigned = vim_strchr(curbuf->b_p_nf, 'u') != NULL; + const bool do_unsigned = vim_strchr((char *)curbuf->b_p_nf, 'u') != NULL; if (virtual_active()) { save_coladd = pos->coladd; @@ -5777,7 +5774,7 @@ static void str_to_reg(yankreg_T *y_ptr, MotionType yank_type, const char_u *str // When appending, copy the previous line and free it after. size_t extra = append ? STRLEN(pp[--lnum]) : 0; - char_u *s = xmallocz(line_len + extra); + char *s = xmallocz(line_len + extra); if (extra > 0) { memcpy(s, pp[lnum], extra); } @@ -5788,7 +5785,7 @@ static void str_to_reg(yankreg_T *y_ptr, MotionType yank_type, const char_u *str xfree(pp[lnum]); append = false; // only first line is appended } - pp[lnum] = s; + pp[lnum] = (char_u *)s; // Convert NULs to '\n' to prevent truncation. memchrsub(pp[lnum], NUL, '\n', s_len); @@ -7120,7 +7117,7 @@ static bool get_clipboard(int name, yankreg_T **target, bool quiet) reg->y_type = kMTUnknown; } - reg->y_array = xcalloc((size_t)tv_list_len(lines), sizeof(char_u *)); + reg->y_array = xcalloc((size_t)tv_list_len(lines), sizeof(char *)); reg->y_size = (size_t)tv_list_len(lines); reg->additional_data = NULL; reg->timestamp = 0; diff --git a/src/nvim/option.c b/src/nvim/option.c index e738c6c3b9..61ac542fcf 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -49,7 +49,7 @@ #include "nvim/highlight.h" #include "nvim/highlight_group.h" #include "nvim/indent_c.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/macros.h" #include "nvim/mbyte.h" #include "nvim/memfile.h" @@ -363,7 +363,7 @@ void set_init_1(bool clean_arg) { const char *shell = os_getenv("SHELL"); if (shell != NULL) { - if (vim_strchr((const char_u *)shell, ' ') != NULL) { + if (vim_strchr(shell, ' ') != NULL) { const size_t len = strlen(shell) + 3; // two quotes and a trailing NUL char *const cmd = xmalloc(len); snprintf(cmd, len, "\"%s\"", shell); @@ -491,17 +491,17 @@ void set_init_1(bool clean_arg) #endif false); - char *backupdir = stdpaths_user_data_subpath("backup", 2, true); + char *backupdir = stdpaths_user_state_subpath("backup", 2, true); const size_t backupdir_len = strlen(backupdir); backupdir = xrealloc(backupdir, backupdir_len + 3); memmove(backupdir + 2, backupdir, backupdir_len + 1); memmove(backupdir, ".,", 2); set_string_default("backupdir", backupdir, true); - set_string_default("viewdir", stdpaths_user_data_subpath("view", 2, true), + set_string_default("viewdir", stdpaths_user_state_subpath("view", 2, true), true); - set_string_default("directory", stdpaths_user_data_subpath("swap", 2, true), + set_string_default("directory", stdpaths_user_state_subpath("swap", 2, true), true); - set_string_default("undodir", stdpaths_user_data_subpath("undo", 2, true), + set_string_default("undodir", stdpaths_user_state_subpath("undo", 2, true), true); // Set default for &runtimepath. All necessary expansions are performed in // this function. @@ -1099,7 +1099,7 @@ int do_set(char_u *arg, int opt_flags) if (options[opt_idx].var == NULL) { // hidden option: skip // Only give an error message when requesting the value of // a hidden option, ignore setting it. - if (vim_strchr((char_u *)"=:!&<", nextchar) == NULL + if (vim_strchr("=:!&<", nextchar) == NULL && (!(options[opt_idx].flags & P_BOOL) || nextchar == '?')) { errmsg = _(e_unsupportedoption); @@ -1153,7 +1153,7 @@ int do_set(char_u *arg, int opt_flags) goto skip; } - if (vim_strchr((char_u *)"?=:!&<", nextchar) != NULL) { + if (vim_strchr("?=:!&<", nextchar) != NULL) { arg += len; if (nextchar == '&' && arg[1] == 'v' && arg[2] == 'i') { if (arg[3] == 'm') { // "opt&vim": set to Vim default @@ -1162,7 +1162,7 @@ int do_set(char_u *arg, int opt_flags) arg += 2; } } - if (vim_strchr((char_u *)"?!&<", nextchar) != NULL + if (vim_strchr("?!&<", nextchar) != NULL && arg[1] != NUL && !ascii_iswhite(arg[1])) { errmsg = e_trailing; goto skip; @@ -1175,7 +1175,7 @@ int do_set(char_u *arg, int opt_flags) // if (nextchar == '?' || (prefix == 1 - && vim_strchr((char_u *)"=:&<", nextchar) == NULL + && vim_strchr("=:&<", nextchar) == NULL && !(flags & P_BOOL))) { /* * print value @@ -1255,7 +1255,7 @@ int do_set(char_u *arg, int opt_flags) errmsg = set_bool_option(opt_idx, varp, (int)value, opt_flags); } else { // Numeric or string. - if (vim_strchr((const char_u *)"=:&<", nextchar) == NULL + if (vim_strchr("=:&<", nextchar) == NULL || prefix != 1) { errmsg = e_invarg; goto skip; @@ -1609,14 +1609,14 @@ int do_set(char_u *arg, int opt_flags) // 'whichwrap' if (flags & P_ONECOMMA) { if (*s != ',' && *(s + 1) == ',' - && vim_strchr(s + 2, *s) != NULL) { + && vim_strchr((char *)s + 2, *s) != NULL) { // Remove the duplicated value and the next comma. STRMOVE(s, s + 2); continue; } } else { if ((!(flags & P_COMMA) || *s != ',') - && vim_strchr(s + 1, *s) != NULL) { + && vim_strchr((char *)s + 1, *s) != NULL) { STRMOVE(s, s + 1); continue; } @@ -1917,7 +1917,7 @@ char_u *find_shada_parameter(int type) if (*p == 'n') { // 'n' is always the last one break; } - p = vim_strchr(p, ','); // skip until next ',' + p = (char_u *)vim_strchr((char *)p, ','); // skip until next ',' if (p == NULL) { // hit the end without finding parameter break; } @@ -1963,13 +1963,10 @@ static char_u *option_expand(int opt_idx, char_u *val) return NameBuff; } -// After setting various option values: recompute variables that depend on -// option values. -static void didset_options(void) +/// After setting various option values: recompute variables that depend on +/// option values. +static void didset_string_options(void) { - // initialize the table for 'iskeyword' et.al. - (void)init_chartab(); - (void)opt_strings_flags(p_cmp, p_cmp_values, &cmp_flags, true); (void)opt_strings_flags(p_bkc, p_bkc_values, &bkc_flags, true); (void)opt_strings_flags(p_bo, p_bo_values, &bo_flags, true); @@ -1981,8 +1978,20 @@ static void didset_options(void) (void)opt_strings_flags(p_tc, p_tc_values, &tc_flags, false); (void)opt_strings_flags(p_tpf, p_tpf_values, &tpf_flags, true); (void)opt_strings_flags(p_ve, p_ve_values, &ve_flags, true); + (void)opt_strings_flags(p_swb, p_swb_values, &swb_flags, true); (void)opt_strings_flags(p_wop, p_wop_values, &wop_flags, true); (void)opt_strings_flags(p_jop, p_jop_values, &jop_flags, true); +} + +/// After setting various option values: recompute variables that depend on +/// option values. +static void didset_options(void) +{ + // initialize the table for 'iskeyword' et.al. + (void)init_chartab(); + + didset_string_options(); + (void)spell_check_msm(); (void)spell_check_sps(); (void)compile_cap_prog(curwin->w_s); @@ -2140,6 +2149,8 @@ static uint32_t *insecure_flag(win_T *const wp, int opt_idx, int opt_flags) switch ((int)options[opt_idx].indir) { case PV_STL: return &wp->w_p_stl_flags; + case PV_WBR: + return &wp->w_p_wbr_flags; case PV_FDE: return &wp->w_p_fde_flags; case PV_FDT: @@ -2327,7 +2338,7 @@ static bool valid_name(const char_u *val, const char *allowed) { for (const char_u *s = val; *s != NUL; s++) { if (!ASCII_ISALNUM(*s) - && vim_strchr((const char_u *)allowed, *s) == NULL) { + && vim_strchr(allowed, *s) == NULL) { return false; } } @@ -2505,8 +2516,8 @@ static char *did_set_string_option(int opt_idx, char_u **varp, bool new_value_al if (opt_strings_flags(p_rdb, p_rdb_values, &rdb_flags, true) != OK) { errmsg = e_invarg; } - } else if (varp == &p_sbo) { // 'scrollopt' - if (check_opt_strings(p_sbo, p_scbopt_values, true) != OK) { + } else if (varp == (char_u **)&p_sbo) { // 'scrollopt' + if (check_opt_strings((char_u *)p_sbo, p_scbopt_values, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_ambw || (int *)varp == &p_emoji) { @@ -2569,7 +2580,7 @@ ambw_end: if (gvarp == &p_fenc) { if (!MODIFIABLE(curbuf) && opt_flags != OPT_GLOBAL) { errmsg = e_modifiable; - } else if (vim_strchr(*varp, ',') != NULL) { + } else if (vim_strchr((char *)(*varp), ',') != NULL) { // No comma allowed in 'fileencoding'; catches confusing it // with 'fileencodings'. errmsg = e_invarg; @@ -2655,8 +2666,8 @@ ambw_end: redraw_curbuf_later(NOT_VALID); } } - } else if (varp == &p_ffs) { // 'fileformats' - if (check_opt_strings(p_ffs, p_ff_values, true) != OK) { + } else if (varp == (char_u **)&p_ffs) { // 'fileformats' + if (check_opt_strings((char_u *)p_ffs, p_ff_values, true) != OK) { errmsg = e_invarg; } } else if (gvarp == &p_mps) { // 'matchpairs' @@ -2683,7 +2694,7 @@ ambw_end: } else if (gvarp == &p_com) { // 'comments' for (s = *varp; *s;) { while (*s && *s != ':') { - if (vim_strchr((char_u *)COM_ALL, *s) == NULL + if (vim_strchr(COM_ALL, *s) == NULL && !ascii_isdigit(*s) && *s != '-') { errmsg = illegal_char(errbuf, errbuflen, *s); break; @@ -2762,7 +2773,7 @@ ambw_end: free_oldval = (options[opt_idx].flags & P_ALLOCED); for (s = p_shada; *s;) { // Check it's a valid character - if (vim_strchr((char_u *)"!\"%'/:<@cfhnrs", *s) == NULL) { + if (vim_strchr("!\"%'/:<@cfhnrs", *s) == NULL) { errmsg = illegal_char(errbuf, errbuflen, *s); break; } @@ -2826,7 +2837,7 @@ ambw_end: int flagval = (varp == &p_titlestring) ? STL_IN_TITLE : STL_IN_ICON; // NULL => statusline syntax - if (vim_strchr(*varp, '%') && check_stl_option(*varp) == NULL) { + if (vim_strchr((char *)(*varp), '%') && check_stl_option(*varp) == NULL) { stl_syntax |= flagval; } else { stl_syntax &= ~flagval; @@ -2845,8 +2856,8 @@ ambw_end: if (check_opt_strings(p_km, p_km_values, true) != OK) { errmsg = e_invarg; } else { - km_stopsel = (vim_strchr(p_km, 'o') != NULL); - km_startsel = (vim_strchr(p_km, 'a') != NULL); + km_stopsel = (vim_strchr((char *)p_km, 'o') != NULL); + km_startsel = (vim_strchr((char *)p_km, 'a') != NULL); } } else if (varp == &p_mousem) { // 'mousemodel' if (check_opt_strings(p_mousem, p_mousem_values, false) != OK) { @@ -2921,8 +2932,8 @@ ambw_end: curbuf->b_help = (curbuf->b_p_bt[0] == 'h'); redraw_titles(); } - } else if (gvarp == &p_stl || varp == &p_tal || varp == &p_ruf) { - // 'statusline', 'tabline' or 'rulerformat' + } else if (gvarp == &p_stl || gvarp == (char_u **)&p_wbr || varp == &p_tal || varp == &p_ruf) { + // 'statusline', 'winbar', 'tabline' or 'rulerformat' int wid; if (varp == &p_ruf) { // reset ru_wid first @@ -2941,12 +2952,16 @@ ambw_end: errmsg = check_stl_option(p_ruf); } } else if (varp == &p_ruf || s[0] != '%' || s[1] != '!') { - // check 'statusline' or 'tabline' only if it doesn't start with "%!" + // check 'statusline', 'winbar' or 'tabline' only if it doesn't start with "%!" errmsg = check_stl_option(s); } if (varp == &p_ruf && errmsg == NULL) { comp_col(); } + // add / remove window bars for 'winbar' + if (gvarp == (char_u **)&p_wbr) { + set_winbar(); + } } else if (gvarp == &p_cpt) { // check if it is a valid value for 'complete' -- Acevedo for (s = *varp; *s;) { @@ -2956,7 +2971,7 @@ ambw_end: if (!*s) { break; } - if (vim_strchr((char_u *)".wbuksid]tU", *s) == NULL) { + if (vim_strchr(".wbuksid]tU", *s) == NULL) { errmsg = illegal_char(errbuf, errbuflen, *s); break; } @@ -3080,7 +3095,7 @@ ambw_end: foldUpdateAll(curwin); } } else if (gvarp == &curwin->w_allbuf_opt.wo_fmr) { // 'foldmarker' - p = vim_strchr(*varp, ','); + p = (char_u *)vim_strchr((char *)(*varp), ','); if (p == NULL) { errmsg = N_("E536: comma required"); } else if (p == *varp || p[1] == NUL) { @@ -3130,9 +3145,9 @@ ambw_end: if (p_csqf != NULL) { p = p_csqf; while (*p != NUL) { - if (vim_strchr((char_u *)CSQF_CMDS, *p) == NULL + if (vim_strchr(CSQF_CMDS, *p) == NULL || p[1] == NUL - || vim_strchr((char_u *)CSQF_FLAGS, p[1]) == NULL + || vim_strchr(CSQF_FLAGS, p[1]) == NULL || (p[2] != NUL && p[2] != ',')) { errmsg = e_invarg; break; @@ -3244,7 +3259,7 @@ ambw_end: } if (varp == &p_shm) { // 'shortmess' p = (char_u *)SHM_ALL; - } else if (varp == &(p_cpo)) { // 'cpoptions' + } else if (varp == (char_u **)&(p_cpo)) { // 'cpoptions' p = (char_u *)CPO_VI; } else if (varp == &(curbuf->b_p_fo)) { // 'formatoptions' p = (char_u *)FO_ALL; @@ -3255,7 +3270,7 @@ ambw_end: } if (p != NULL) { for (s = *varp; *s; s++) { - if (vim_strchr(p, *s) == NULL) { + if (vim_strchr((char *)p, *s) == NULL) { errmsg = illegal_char(errbuf, errbuflen, *s); break; } @@ -3314,7 +3329,7 @@ ambw_end: syn_recursive++; // Only pass true for "force" when the value changed or not used // recursively, to avoid endless recurrence. - apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn, curbuf->b_fname, + apply_autocmds(EVENT_SYNTAX, (char *)curbuf->b_p_syn, curbuf->b_fname, value_changed || syn_recursive == 1, curbuf); curbuf->b_flags |= BF_SYN_SET; syn_recursive--; @@ -3334,7 +3349,7 @@ ambw_end: did_filetype = true; // Only pass true for "force" when the value changed or not // used recursively, to avoid endless recurrence. - apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft, curbuf->b_fname, + apply_autocmds(EVENT_FILETYPE, (char *)curbuf->b_p_ft, curbuf->b_fname, value_changed || ft_recursive == 1, curbuf); ft_recursive--; // Just in case the old "curbuf" is now invalid @@ -3561,6 +3576,7 @@ static char *set_chars_option(win_T *wp, char_u **varp, bool set) struct chars_tab fcs_tab[] = { { &wp->w_p_fcs_chars.stl, "stl", ' ' }, { &wp->w_p_fcs_chars.stlnc, "stlnc", ' ' }, + { &wp->w_p_fcs_chars.wbr, "wbr", ' ' }, { &wp->w_p_fcs_chars.horiz, "horiz", 9472 }, // ─ { &wp->w_p_fcs_chars.horizup, "horizup", 9524 }, // ┴ { &wp->w_p_fcs_chars.horizdown, "horizdown", 9516 }, // ┬ @@ -3603,15 +3619,15 @@ static char *set_chars_option(win_T *wp, char_u **varp, bool set) if (*p_ambw == 'd') { // XXX: If ambiwidth=double then some characters take 2 columns, // which is forbidden (TUI limitation?). Set old defaults. - fcs_tab[2].def = '-'; fcs_tab[3].def = '-'; fcs_tab[4].def = '-'; - fcs_tab[5].def = '|'; + fcs_tab[5].def = '-'; fcs_tab[6].def = '|'; fcs_tab[7].def = '|'; - fcs_tab[8].def = '+'; - fcs_tab[9].def = '-'; - fcs_tab[12].def = '|'; + fcs_tab[8].def = '|'; + fcs_tab[9].def = '+'; + fcs_tab[10].def = '-'; + fcs_tab[13].def = '|'; } } @@ -3835,7 +3851,7 @@ static char *compile_cap_prog(synblock_T *synblock) } else { // Prepend a ^ so that we only match at one column re = concat_str((char_u *)"^", synblock->b_p_spc); - synblock->b_cap_prog = vim_regcomp(re, RE_MAGIC); + synblock->b_cap_prog = vim_regcomp((char *)re, RE_MAGIC); xfree(re); if (synblock->b_cap_prog == NULL) { synblock->b_cap_prog = rp; // restore the previous program @@ -3988,7 +4004,7 @@ static char *set_bool_option(const int opt_idx, char_u *const varp, const int va || (opt_flags & OPT_GLOBAL) || opt_flags == 0) && !bufIsChanged(bp) && bp->b_ml.ml_mfp != NULL) { u_compute_hash(bp, hash); - u_read_undo(NULL, hash, bp->b_fname); + u_read_undo(NULL, hash, (char_u *)bp->b_fname); } } } @@ -4033,27 +4049,13 @@ static char *set_bool_option(const int opt_idx, char_u *const varp, const int va // buf->b_p_swf mf_close_file(curbuf, true); // remove the swap file } - } else if ((int *)varp == &p_terse) { - // when 'terse' is set change 'shortmess' - char_u *p; - - p = vim_strchr(p_shm, SHM_SEARCH); - - // insert 's' in p_shm - if (p_terse && p == NULL) { - STRCPY(IObuff, p_shm); - STRCAT(IObuff, "s"); - set_string_option_direct("shm", -1, IObuff, OPT_FREE, 0); - } else if (!p_terse && p != NULL) { // remove 's' from p_shm - STRMOVE(p, p + 1); - } } else if ((int *)varp == &p_paste) { // when 'paste' is set or reset also change other options paste_option_changed(); } else if ((int *)varp == &p_im) { // when 'insertmode' is set from an autocommand need to do work here if (p_im) { - if ((State & INSERT) == 0) { + if ((State & MODE_INSERT) == 0) { need_start_insertmode = true; } stop_insert_mode = false; @@ -4248,7 +4250,7 @@ static char *set_bool_option(const int opt_idx, char_u *const varp, const int va set_vim_var_string(VV_OPTION_COMMAND, "modeline", -1); set_vim_var_string(VV_OPTION_OLDLOCAL, buf_old, -1); } - apply_autocmds(EVENT_OPTIONSET, (char_u *)options[opt_idx].fullname, NULL, false, NULL); + apply_autocmds(EVENT_OPTIONSET, options[opt_idx].fullname, NULL, false, NULL); reset_v_option_vars(); } @@ -4690,7 +4692,7 @@ static char *set_num_option(int opt_idx, char_u *varp, long value, char *errbuf, set_vim_var_string(VV_OPTION_COMMAND, "modeline", -1); set_vim_var_string(VV_OPTION_OLDLOCAL, buf_old, -1); } - apply_autocmds(EVENT_OPTIONSET, (char_u *)options[opt_idx].fullname, NULL, false, NULL); + apply_autocmds(EVENT_OPTIONSET, options[opt_idx].fullname, NULL, false, NULL); reset_v_option_vars(); } @@ -4747,7 +4749,7 @@ static void trigger_optionsset_string(int opt_idx, int opt_flags, char *oldval, set_vim_var_string(VV_OPTION_COMMAND, "modeline", -1); set_vim_var_string(VV_OPTION_OLDLOCAL, oldval, -1); } - apply_autocmds(EVENT_OPTIONSET, (char_u *)options[opt_idx].fullname, NULL, false, NULL); + apply_autocmds(EVENT_OPTIONSET, options[opt_idx].fullname, NULL, false, NULL); reset_v_option_vars(); } } @@ -4759,7 +4761,7 @@ static void check_redraw(uint32_t flags) bool doclear = (flags & P_RCLR) == P_RCLR; bool all = ((flags & P_RALL) == P_RALL || doclear); - if ((flags & P_RSTAT) || all) { // mark all status lines dirty + if ((flags & P_RSTAT) || all) { // mark all status lines and window bars dirty status_redraw_all(); } @@ -5613,7 +5615,7 @@ static int put_setstring(FILE *fd, char *cmd, char *name, char_u **valuep, uint6 // each comma separated part of the option separately, so that it // can be expanded when read back. if (size >= MAXPATHL && (flags & P_COMMA) != 0 - && vim_strchr(*valuep, ',') != NULL) { + && vim_strchr((char *)(*valuep), ',') != NULL) { part = xmalloc(size); // write line break to clear the option, e.g. ':set rtp=' @@ -5807,6 +5809,9 @@ void unset_global_local_option(char *name, void *from) case PV_STL: clear_string_option(&((win_T *)from)->w_p_stl); break; + case PV_WBR: + clear_string_option((char_u **)&((win_T *)from)->w_p_wbr); + break; case PV_UL: buf->b_p_ul = NO_LOCAL_UNDOLEVEL; break; @@ -5884,6 +5889,8 @@ static char_u *get_varp_scope(vimoption_T *p, int opt_flags) return (char_u *)&(curwin->w_p_sbr); case PV_STL: return (char_u *)&(curwin->w_p_stl); + case PV_WBR: + return (char_u *)&(curwin->w_p_wbr); case PV_UL: return (char_u *)&(curbuf->b_p_ul); case PV_LW: @@ -5977,6 +5984,9 @@ static char_u *get_varp(vimoption_T *p) case PV_STL: return *curwin->w_p_stl != NUL ? (char_u *)&(curwin->w_p_stl) : p->var; + case PV_WBR: + return *curwin->w_p_wbr != NUL + ? (char_u *)&(curwin->w_p_wbr) : p->var; case PV_UL: return curbuf->b_p_ul != NO_LOCAL_UNDOLEVEL ? (char_u *)&(curbuf->b_p_ul) : p->var; @@ -6245,6 +6255,7 @@ void copy_winopt(winopt_T *from, winopt_T *to) to->wo_rlc = vim_strsave(from->wo_rlc); to->wo_sbr = vim_strsave(from->wo_sbr); to->wo_stl = vim_strsave(from->wo_stl); + to->wo_wbr = xstrdup(from->wo_wbr); to->wo_wrap = from->wo_wrap; to->wo_wrap_save = from->wo_wrap_save; to->wo_lbr = from->wo_lbr; @@ -6320,6 +6331,7 @@ static void check_winopt(winopt_T *wop) check_string_option(&wop->wo_fcs); check_string_option(&wop->wo_lcs); check_string_option(&wop->wo_ve); + check_string_option((char_u **)&wop->wo_wbr); } /// Free the allocated memory inside a winopt_T. @@ -6345,6 +6357,7 @@ void clear_winopt(winopt_T *wop) clear_string_option(&wop->wo_fcs); clear_string_option(&wop->wo_lcs); clear_string_option(&wop->wo_ve); + clear_string_option((char_u **)&wop->wo_wbr); } void didset_window_options(win_T *wp) @@ -7206,7 +7219,7 @@ bool has_format_option(int x) if (p_paste) { return false; } - return vim_strchr(curbuf->b_p_fo, x) != NULL; + return vim_strchr((char *)curbuf->b_p_fo, x) != NULL; } /// @returns true if "x" is present in 'shortmess' option, or @@ -7214,9 +7227,9 @@ bool has_format_option(int x) bool shortmess(int x) { return (p_shm != NULL - && (vim_strchr(p_shm, x) != NULL - || (vim_strchr(p_shm, 'a') != NULL - && vim_strchr((char_u *)SHM_ALL_ABBREVIATIONS, x) != NULL))); + && (vim_strchr((char *)p_shm, x) != NULL + || (vim_strchr((char *)p_shm, 'a') != NULL + && vim_strchr((char *)SHM_ALL_ABBREVIATIONS, x) != NULL))); } /// paste_option_changed() - Called after p_paste was set or reset. @@ -7578,7 +7591,7 @@ bool can_bs(int what) case '0': return false; } - return vim_strchr(p_bs, what) != NULL; + return vim_strchr((char *)p_bs, what) != NULL; } /// Save the current values of 'fileformat' and 'fileencoding', so that we know @@ -8137,9 +8150,9 @@ size_t copy_option_part(char_u **option, char_u *buf, size_t maxlen, char *sep_c if (*p == '.') { buf[len++] = *p++; } - while (*p != NUL && vim_strchr((char_u *)sep_chars, *p) == NULL) { + while (*p != NUL && vim_strchr(sep_chars, *p) == NULL) { // Skip backslash before a separator character and space. - if (p[0] == '\\' && vim_strchr((char_u *)sep_chars, p[1]) != NULL) { + if (p[0] == '\\' && vim_strchr(sep_chars, p[1]) != NULL) { p++; } if (len < maxlen - 1) { @@ -8161,13 +8174,13 @@ size_t copy_option_part(char_u **option, char_u *buf, size_t maxlen, char *sep_c /// Return true when 'shell' has "csh" in the tail. int csh_like_shell(void) { - return strstr((char *)path_tail(p_sh), "csh") != NULL; + return strstr(path_tail((char *)p_sh), "csh") != NULL; } /// Return true when 'shell' has "fish" in the tail. bool fish_like_shell(void) { - return strstr((char *)path_tail(p_sh), "fish") != NULL; + return strstr(path_tail((char *)p_sh), "fish") != NULL; } /// Return the number of requested sign columns, based on current @@ -8260,7 +8273,7 @@ dict_T *get_winbuf_options(const int bufopt) long get_scrolloff_value(win_T *wp) { // Disallow scrolloff in terminal-mode. #11915 - if (State & TERM_FOCUS) { + if (State & MODE_TERMINAL) { return 0; } return wp->w_p_so < 0 ? p_so : wp->w_p_so; diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h index d90ed6812c..876acf2f87 100644 --- a/src/nvim/option_defs.h +++ b/src/nvim/option_defs.h @@ -266,7 +266,7 @@ enum { STL_CLICK_FUNC = '@', ///< Click region start. }; /// C string containing all 'statusline' option flags -#define STL_ALL ((char_u[]) { \ +#define STL_ALL ((char[]) { \ STL_FILEPATH, STL_FULLPATH, STL_FILENAME, STL_COLUMN, STL_VIRTCOL, \ STL_VIRTCOL_ALT, STL_LINE, STL_NUMLINES, STL_BUFNO, STL_KEYMAP, STL_OFFSET, \ STL_OFFSET_X, STL_BYTEVAL, STL_BYTEVAL_X, STL_ROFLAG, STL_ROFLAG_ALT, \ @@ -392,7 +392,7 @@ EXTERN char_u *p_csl; // 'completeslash' EXTERN long p_pb; // 'pumblend' EXTERN long p_ph; // 'pumheight' EXTERN long p_pw; // 'pumwidth' -EXTERN char_u *p_cpo; // 'cpoptions' +EXTERN char *p_cpo; // 'cpoptions' EXTERN char_u *p_csprg; // 'cscopeprg' EXTERN int p_csre; // 'cscoperelative' EXTERN char_u *p_csqf; // 'cscopequickfix' @@ -434,7 +434,7 @@ EXTERN char_u *p_gp; // 'grepprg' EXTERN char_u *p_ei; // 'eventignore' EXTERN int p_exrc; // 'exrc' EXTERN char_u *p_fencs; // 'fileencodings' -EXTERN char_u *p_ffs; // 'fileformats' +EXTERN char *p_ffs; // 'fileformats' EXTERN int p_fic; // 'fileignorecase' EXTERN char_u *p_fcl; // 'foldclose' EXTERN long p_fdls; // 'foldlevelstart' @@ -557,7 +557,6 @@ static char *(p_rdb_values[]) = { #define RDB_NODELTA 0x008 EXTERN long p_rdt; // 'redrawtime' -EXTERN int p_remap; // 'remap' EXTERN long p_re; // 'regexpengine' EXTERN long p_report; // 'report' EXTERN long p_pvh; // 'previewheight' @@ -571,7 +570,7 @@ EXTERN char_u *p_rtp; // 'runtimepath' EXTERN long p_scbk; // 'scrollback' EXTERN long p_sj; // 'scrolljump' EXTERN long p_so; // 'scrolloff' -EXTERN char_u *p_sbo; // 'scrollopt' +EXTERN char *p_sbo; // 'scrollopt' EXTERN char_u *p_sections; // 'sections' EXTERN int p_secure; // 'secure' EXTERN char_u *p_sel; // 'selection' @@ -618,6 +617,7 @@ EXTERN int p_stmp; // 'shelltemp' EXTERN int p_ssl; // 'shellslash' #endif EXTERN char_u *p_stl; // 'statusline' +EXTERN char *p_wbr; // 'winbar' EXTERN int p_sr; // 'shiftround' EXTERN char_u *p_shm; // 'shortmess' EXTERN char_u *p_sbr; // 'showbreak' @@ -678,7 +678,6 @@ EXTERN int p_tr; ///< 'tagrelative' EXTERN char_u *p_tags; ///< 'tags' EXTERN int p_tgst; ///< 'tagstack' EXTERN int p_tbidi; ///< 'termbidi' -EXTERN int p_terse; ///< 'terse' EXTERN int p_to; ///< 'tildeop' EXTERN int p_timeout; ///< 'timeout' EXTERN long p_tm; ///< 'timeoutlen' @@ -897,6 +896,7 @@ enum { WV_FCS, WV_LCS, WV_WINBL, + WV_WBR, WV_COUNT, // must be the last one }; diff --git a/src/nvim/options.lua b/src/nvim/options.lua index 313cace4b2..809d4ab48b 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -1911,9 +1911,9 @@ return { }, { full_name='remap', - short_desc=N_("mappings to work recursively"), + short_desc=N_("No description"), type='bool', scope={'global'}, - varname='p_remap', + varname='p_force_on', defaults={if_true=true} }, { @@ -2529,9 +2529,9 @@ return { }, { full_name='terse', - short_desc=N_("hides notification of search wrap"), + short_desc=N_("No description"), type='bool', scope={'global'}, - varname='p_terse', + varname='p_force_off', defaults={if_true=false} }, { @@ -2832,6 +2832,16 @@ return { defaults={if_true="menu"} }, { + full_name='winbar', abbreviation='wbr', + short_desc=N_("custom format for the window bar"), + type='string', scope={'global', 'window'}, + alloced=true, + modelineexpr=true, + redraw={'statuslines'}, + varname='p_wbr', + defaults={if_true=""} + }, + { full_name='winblend', abbreviation='winbl', short_desc=N_("Controls transparency level for floating windows"), type='number', scope={'window'}, diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index 4e6a52a78e..c03fd60f03 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -529,9 +529,9 @@ void free_homedir(void) /// again soon. /// @param src String containing environment variables to expand /// @see {expand_env} -char_u *expand_env_save(char_u *src) +char *expand_env_save(char *src) { - return expand_env_save_opt(src, false); + return (char *)expand_env_save_opt((char_u *)src, false); } /// Similar to expand_env_save() but when "one" is `true` handle the string as @@ -644,7 +644,7 @@ void expand_env_esc(char_u *restrict srcp, char_u *restrict dst, int dstlen, boo #endif } else if (src[1] == NUL // home directory || vim_ispathsep(src[1]) - || vim_strchr((char_u *)" ,\t\n", src[1]) != NULL) { + || vim_strchr(" ,\t\n", src[1]) != NULL) { var = (char_u *)homedir; tail = src + 1; } else { // user directory @@ -884,11 +884,10 @@ void vim_get_prefix_from_exepath(char *exe_name) { // TODO(bfredl): param could have been written as "char exe_name[MAXPATHL]" // but c_grammar.lua does not recognize it (yet). - xstrlcpy(exe_name, (char *)get_vim_var_str(VV_PROGPATH), - MAXPATHL * sizeof(*exe_name)); + xstrlcpy(exe_name, get_vim_var_str(VV_PROGPATH), MAXPATHL * sizeof(*exe_name)); char *path_end = (char *)path_tail_with_sep((char_u *)exe_name); *path_end = '\0'; // remove the trailing "nvim.exe" - path_end = (char *)path_tail((char_u *)exe_name); + path_end = path_tail(exe_name); *path_end = '\0'; // remove the trailing "bin/" } @@ -940,7 +939,7 @@ char *vim_getenv(const char *name) // - the directory name from 'helpfile' (unless it contains '$') // - the executable name from argv[0] if (vim_path == NULL) { - if (p_hf != NULL && vim_strchr(p_hf, '$') == NULL) { + if (p_hf != NULL && vim_strchr((char *)p_hf, '$') == NULL) { vim_path = (char *)p_hf; } @@ -957,7 +956,7 @@ char *vim_getenv(const char *name) if (vim_path != NULL) { // remove the file name - char *vim_path_end = (char *)path_tail((char_u *)vim_path); + char *vim_path_end = path_tail(vim_path); // remove "doc/" from 'helpfile', if present if (vim_path == (char *)p_hf) { @@ -1048,7 +1047,7 @@ size_t home_replace(const buf_T *const buf, const char_u *src, char_u *const dst } if (buf != NULL && buf->b_help) { - const size_t dlen = STRLCPY(dst, path_tail(src), dstlen); + const size_t dlen = STRLCPY(dst, path_tail((char *)src), dstlen); return MIN(dlen, dstlen - 1); } @@ -1158,7 +1157,7 @@ char_u *home_replace_save(buf_T *buf, char_u *src) FUNC_ATTR_NONNULL_RET /// Function given to ExpandGeneric() to obtain an environment variable name. -char_u *get_env_name(expand_T *xp, int idx) +char *get_env_name(expand_T *xp, int idx) { #define ENVNAMELEN 100 // this static buffer is needed to avoid a memory leak in ExpandGeneric @@ -1168,7 +1167,7 @@ char_u *get_env_name(expand_T *xp, int idx) if (envname) { STRLCPY(name, envname, ENVNAMELEN); xfree(envname); - return name; + return (char *)name; } return NULL; } @@ -1226,10 +1225,10 @@ bool os_shell_is_cmdexe(const char *sh) } if (striequal(sh, "$COMSPEC")) { const char *comspec = os_getenv("COMSPEC"); - return striequal("cmd.exe", (char *)path_tail((char_u *)comspec)); + return striequal("cmd.exe", path_tail(comspec)); } if (striequal(sh, "cmd.exe") || striequal(sh, "cmd")) { return true; } - return striequal("cmd.exe", (char *)path_tail((char_u *)sh)); + return striequal("cmd.exe", path_tail(sh)); } diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c index 437baf0e08..ac21b32a3e 100644 --- a/src/nvim/os/input.c +++ b/src/nvim/os/input.c @@ -13,12 +13,13 @@ #include "nvim/ex_cmds2.h" #include "nvim/fileio.h" #include "nvim/getchar.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/main.h" #include "nvim/mbyte.h" #include "nvim/memory.h" #include "nvim/msgpack_rpc/channel.h" #include "nvim/os/input.h" +#include "nvim/screen.h" #include "nvim/state.h" #include "nvim/ui.h" #include "nvim/vim.h" @@ -81,7 +82,7 @@ void input_stop(void) static void cursorhold_event(void **argv) { - event_T event = State & INSERT ? EVENT_CURSORHOLDI : EVENT_CURSORHOLD; + event_T event = State & MODE_INSERT ? EVENT_CURSORHOLDI : EVENT_CURSORHOLD; apply_autocmds(event, NULL, NULL, false, curbuf); did_cursorhold = true; } @@ -178,15 +179,7 @@ void os_breakcheck(void) return; } - int save_us = updating_screen; - // We do not want screen_resize() to redraw here. - // TODO(bfredl): we are already special casing redraw events, is this - // hack still needed? - updating_screen++; - loop_poll_events(&main_loop, 0); - - updating_screen = save_us; } #define BREAKCHECK_SKIP 1000 diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c index 0d86dcb480..d331bd21a2 100644 --- a/src/nvim/os/shell.c +++ b/src/nvim/os/shell.c @@ -36,7 +36,7 @@ #define NS_1_SECOND 1000000000U // 1 second, in nanoseconds #define OUT_DATA_THRESHOLD 1024 * 10U // 10KB, "a few screenfuls" of data. -#define SHELL_SPECIAL (char_u *)"\t \"&'$;<>()\\|" +#define SHELL_SPECIAL "\t \"&'$;<>()\\|" typedef struct { char *data; @@ -73,7 +73,7 @@ static bool have_wildcard(int num, char_u **file) static bool have_dollars(int num, char_u **file) { for (int i = 0; i < num; i++) { - if (vim_strchr(file[i], '$') != NULL) { + if (vim_strchr((char *)file[i], '$') != NULL) { return true; } } @@ -151,7 +151,7 @@ int os_expand_wildcards(int num_pat, char_u **pat, int *num_file, char_u ***file // Don't allow the use of backticks in secure. if (secure) { for (i = 0; i < num_pat; i++) { - if (vim_strchr(pat[i], '`') != NULL + if (vim_strchr((char *)pat[i], '`') != NULL && (check_secure())) { return FAIL; } @@ -188,7 +188,7 @@ int os_expand_wildcards(int num_pat, char_u **pat, int *num_file, char_u ***file } } if (shell_style == STYLE_ECHO - && strstr((char *)path_tail(p_sh), "sh") != NULL) { + && strstr(path_tail((char *)p_sh), "sh") != NULL) { shell_style = STYLE_VIMGLOB; } @@ -644,7 +644,7 @@ int os_call_shell(char_u *cmd, ShellOpts opts, char_u *extra_args) if (opts & (kShellOptHideMess | kShellOptExpand)) { forward_output = false; } else { - State = EXTERNCMD; + State = MODE_EXTERNCMD; if (opts & kShellOptWrite) { read_input(&input); @@ -1213,7 +1213,7 @@ static void read_input(DynamicBuffer *buf) dynamic_buffer_ensure(buf, buf->len + len); buf->data[buf->len++] = NUL; } else { - char_u *s = vim_strchr(lp + written, NL); + char_u *s = (char_u *)vim_strchr((char *)lp + written, NL); len = s == NULL ? l : (size_t)(s - (lp + written)); dynamic_buffer_ensure(buf, buf->len + len); memcpy(buf->data + buf->len, lp + written, len); diff --git a/src/nvim/os/signal.c b/src/nvim/os/signal.c index 79e042b8a5..cd591801ed 100644 --- a/src/nvim/os/signal.c +++ b/src/nvim/os/signal.c @@ -210,14 +210,12 @@ static void on_signal(SignalWatcher *handle, int signum, void *data) break; #ifdef SIGUSR1 case SIGUSR1: - apply_autocmds(EVENT_SIGNAL, (char_u *)"SIGUSR1", curbuf->b_fname, true, - curbuf); + apply_autocmds(EVENT_SIGNAL, "SIGUSR1", curbuf->b_fname, true, curbuf); break; #endif #ifdef SIGWINCH case SIGWINCH: - apply_autocmds(EVENT_SIGNAL, (char_u *)"SIGWINCH", curbuf->b_fname, true, - curbuf); + apply_autocmds(EVENT_SIGNAL, "SIGWINCH", curbuf->b_fname, true, curbuf); break; #endif default: diff --git a/src/nvim/os/stdpaths.c b/src/nvim/os/stdpaths.c index 5b824d23f4..a382392bd3 100644 --- a/src/nvim/os/stdpaths.c +++ b/src/nvim/os/stdpaths.c @@ -14,6 +14,7 @@ static const char *xdg_env_vars[] = { [kXDGConfigHome] = "XDG_CONFIG_HOME", [kXDGDataHome] = "XDG_DATA_HOME", [kXDGCacheHome] = "XDG_CACHE_HOME", + [kXDGStateHome] = "XDG_STATE_HOME", [kXDGRuntimeDir] = "XDG_RUNTIME_DIR", [kXDGConfigDirs] = "XDG_CONFIG_DIRS", [kXDGDataDirs] = "XDG_DATA_DIRS", @@ -24,6 +25,7 @@ static const char *const xdg_defaults_env_vars[] = { [kXDGConfigHome] = "LOCALAPPDATA", [kXDGDataHome] = "LOCALAPPDATA", [kXDGCacheHome] = "TEMP", + [kXDGStateHome] = "LOCALAPPDATA", [kXDGRuntimeDir] = NULL, [kXDGConfigDirs] = NULL, [kXDGDataDirs] = NULL, @@ -38,6 +40,7 @@ static const char *const xdg_defaults[] = { [kXDGConfigHome] = "~\\AppData\\Local", [kXDGDataHome] = "~\\AppData\\Local", [kXDGCacheHome] = "~\\AppData\\Local\\Temp", + [kXDGStateHome] = "~\\AppData\\Local", [kXDGRuntimeDir] = NULL, [kXDGConfigDirs] = NULL, [kXDGDataDirs] = NULL, @@ -45,6 +48,7 @@ static const char *const xdg_defaults[] = { [kXDGConfigHome] = "~/.config", [kXDGDataHome] = "~/.local/share", [kXDGCacheHome] = "~/.cache", + [kXDGStateHome] = "~/.local/state", [kXDGRuntimeDir] = NULL, [kXDGConfigDirs] = "/etc/xdg/", [kXDGDataDirs] = "/usr/local/share/:/usr/share/", @@ -78,7 +82,7 @@ char *stdpaths_get_xdg_var(const XDGVarType idx) if (env_val != NULL) { ret = xstrdup(env_val); } else if (fallback) { - ret = (char *)expand_env_save((char_u *)fallback); + ret = expand_env_save((char *)fallback); } return ret; @@ -99,7 +103,8 @@ char *get_xdg_home(const XDGVarType idx) if (dir) { #if defined(WIN32) dir = concat_fnames_realloc(dir, - (idx == kXDGDataHome ? "nvim-data" : "nvim"), + ((idx == kXDGDataHome + || idx == kXDGStateHome) ? "nvim-data" : "nvim"), true); #else dir = concat_fnames_realloc(dir, "nvim", true); @@ -133,15 +138,26 @@ char *stdpaths_user_conf_subpath(const char *fname) /// Return subpath of $XDG_DATA_HOME /// /// @param[in] fname New component of the path. +/// +/// @return [allocated] `$XDG_DATA_HOME/nvim/{fname}` +char *stdpaths_user_data_subpath(const char *fname) + FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET +{ + return concat_fnames_realloc(get_xdg_home(kXDGDataHome), fname, true); +} + +/// Return subpath of $XDG_STATE_HOME +/// +/// @param[in] fname New component of the path. /// @param[in] trailing_pathseps Amount of trailing path separators to add. /// @param[in] escape_commas If true, all commas will be escaped. /// -/// @return [allocated] `$XDG_DATA_HOME/nvim/{fname}`. -char *stdpaths_user_data_subpath(const char *fname, const size_t trailing_pathseps, - const bool escape_commas) +/// @return [allocated] `$XDG_STATE_HOME/nvim/{fname}`. +char *stdpaths_user_state_subpath(const char *fname, const size_t trailing_pathseps, + const bool escape_commas) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET { - char *ret = concat_fnames_realloc(get_xdg_home(kXDGDataHome), fname, true); + char *ret = concat_fnames_realloc(get_xdg_home(kXDGStateHome), fname, true); const size_t len = strlen(ret); const size_t numcommas = (escape_commas ? memcnt(ret, ',', len) : 0); if (numcommas || trailing_pathseps) { diff --git a/src/nvim/os/stdpaths_defs.h b/src/nvim/os/stdpaths_defs.h index 44c30df373..f94c511fe7 100644 --- a/src/nvim/os/stdpaths_defs.h +++ b/src/nvim/os/stdpaths_defs.h @@ -7,6 +7,7 @@ typedef enum { kXDGConfigHome, ///< XDG_CONFIG_HOME kXDGDataHome, ///< XDG_DATA_HOME kXDGCacheHome, ///< XDG_CACHE_HOME + kXDGStateHome, ///< XDG_STATE_HOME kXDGRuntimeDir, ///< XDG_RUNTIME_DIR kXDGConfigDirs, ///< XDG_CONFIG_DIRS kXDGDataDirs, ///< XDG_DATA_DIRS diff --git a/src/nvim/os/users.c b/src/nvim/os/users.c index e0ce3fec31..4803be20c3 100644 --- a/src/nvim/os/users.c +++ b/src/nvim/os/users.c @@ -187,11 +187,11 @@ static void init_users(void) } /// Given to ExpandGeneric() to obtain an user names. -char_u *get_users(expand_T *xp, int idx) +char *get_users(expand_T *xp, int idx) { init_users(); if (idx < ga_users.ga_len) { - return ((char_u **)ga_users.ga_data)[idx]; + return ((char **)ga_users.ga_data)[idx]; } return NULL; } diff --git a/src/nvim/path.c b/src/nvim/path.c index 0bb364184a..fcb91a2783 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -92,15 +92,15 @@ FileComparison path_full_compare(char_u *const s1, char_u *const s2, const bool /// /// @return pointer just past the last path separator (empty string, if fname /// ends in a slash), or empty string if fname is NULL. -char_u *path_tail(const char_u *fname) +char *path_tail(const char *fname) FUNC_ATTR_NONNULL_RET { if (fname == NULL) { - return (char_u *)""; + return ""; } - const char_u *tail = get_past_head(fname); - const char_u *p = tail; + const char *tail = (char *)get_past_head((char_u *)fname); + const char *p = tail; // Find last part of path. while (*p != NUL) { if (vim_ispathsep_nocolon(*p)) { @@ -108,7 +108,7 @@ char_u *path_tail(const char_u *fname) } MB_PTR_ADV(p); } - return (char_u *)tail; + return (char *)tail; } /// Get pointer to tail of "fname", including path separators. @@ -126,7 +126,7 @@ char_u *path_tail_with_sep(char_u *fname) // Don't remove the '/' from "c:/file". char_u *past_head = get_past_head(fname); - char_u *tail = path_tail(fname); + char_u *tail = (char_u *)path_tail((char *)fname); while (tail > past_head && after_pathsep((char *)fname, (char *)tail)) { tail--; } @@ -275,7 +275,7 @@ int vim_ispathlistsep(int c) /// It's done in-place. void shorten_dir_len(char_u *str, int trim_len) { - char_u *tail = path_tail(str); + char_u *tail = (char_u *)path_tail((char *)str); char_u *d = str; bool skip = false; int dirchunk_len = 0; @@ -525,7 +525,7 @@ bool path_has_wildcard(const char_u *p) // Windows: const char *wildcards = "?*$[`"; #endif - if (vim_strchr((char_u *)wildcards, *p) != NULL + if (vim_strchr(wildcards, *p) != NULL || (p[0] == '~' && p[1] != NUL)) { return true; } @@ -559,7 +559,7 @@ bool path_has_exp_wildcard(const char_u *p) #else const char *wildcards = "*?["; // Windows. #endif - if (vim_strchr((char_u *)wildcards, *p) != NULL) { + if (vim_strchr(wildcards, *p) != NULL) { return true; } } @@ -640,7 +640,7 @@ static size_t do_path_expand(garray_T *gap, const char_u *path, size_t wildoff, } s = p + 1; } else if (path_end >= path + wildoff - && (vim_strchr((char_u *)"*?[{~$", *path_end) != NULL + && (vim_strchr("*?[{~$", *path_end) != NULL #ifndef WIN32 || (!p_fic && (flags & EW_ICASE) && mb_isalpha(utf_ptr2char((char *)path_end))) #endif @@ -675,7 +675,7 @@ static size_t do_path_expand(garray_T *gap, const char_u *path, size_t wildoff, // convert the file pattern to a regexp pattern int starts_with_dot = *s == '.'; - char_u *pat = file_pat_to_reg_pat(s, e, NULL, false); + char *pat = file_pat_to_reg_pat((char *)s, (char *)e, NULL, false); if (pat == NULL) { xfree(buf); return 0; @@ -849,7 +849,7 @@ static void expand_path_option(char_u *curdir, garray_T *gap) if (curbuf->b_ffname == NULL) { continue; } - char_u *p = path_tail(curbuf->b_ffname); + char_u *p = (char_u *)path_tail((char *)curbuf->b_ffname); size_t len = (size_t)(p - curbuf->b_ffname); if (len + STRLEN(buf) >= MAXPATHL) { continue; @@ -949,13 +949,13 @@ static void uniquefy_paths(garray_T *gap, char_u *pattern) file_pattern[0] = '*'; file_pattern[1] = NUL; STRCAT(file_pattern, pattern); - char_u *pat = file_pat_to_reg_pat(file_pattern, NULL, NULL, true); + char *pat = file_pat_to_reg_pat((char *)file_pattern, NULL, NULL, true); xfree(file_pattern); if (pat == NULL) { return; } - regmatch.rm_ic = TRUE; // always ignore case + regmatch.rm_ic = true; // always ignore case regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); xfree(pat); if (regmatch.regprog == NULL) { @@ -1153,7 +1153,7 @@ static bool has_env_var(char_u *p) for (; *p; MB_PTR_ADV(p)) { if (*p == '\\' && p[1] != NUL) { p++; - } else if (vim_strchr((char_u *)"$", *p) != NULL) { + } else if (vim_strchr("$", *p) != NULL) { return true; } } @@ -1174,13 +1174,13 @@ static bool has_special_wildchar(char_u *p) // Allow for escaping. if (*p == '\\' && p[1] != NUL && p[1] != '\r' && p[1] != '\n') { p++; - } else if (vim_strchr((char_u *)SPECIAL_WILDCHAR, *p) != NULL) { + } else if (vim_strchr(SPECIAL_WILDCHAR, *p) != NULL) { // A { must be followed by a matching }. - if (*p == '{' && vim_strchr(p, '}') == NULL) { + if (*p == '{' && vim_strchr((char *)p, '}') == NULL) { continue; } // A quote and backtick must be followed by another one. - if ((*p == '`' || *p == '\'') && vim_strchr(p, *p) == NULL) { + if ((*p == '`' || *p == '\'') && vim_strchr((char *)p, *p) == NULL) { continue; } return true; @@ -1375,17 +1375,18 @@ static int vim_backtick(char_u *p) /// @param flags EW_* flags static int expand_backtick(garray_T *gap, char_u *pat, int flags) { - char_u *p; - char_u *buffer; + char *p; + char *buffer; int cnt = 0; // Create the command: lop off the backticks. - char_u *cmd = vim_strnsave(pat + 1, STRLEN(pat) - 2); + char *cmd = (char *)vim_strnsave(pat + 1, STRLEN(pat) - 2); if (*cmd == '=') { // `={expr}`: Expand expression - buffer = (char_u *)eval_to_string((char *)cmd + 1, (char **)&p, true); + buffer = eval_to_string(cmd + 1, &p, true); } else { - buffer = get_cmd_output(cmd, NULL, (flags & EW_SILENT) ? kShellOptSilent : 0, NULL); + buffer = (char *)get_cmd_output((char_u *)cmd, NULL, (flags & EW_SILENT) ? kShellOptSilent : 0, + NULL); } xfree(cmd); if (buffer == NULL) { @@ -1394,16 +1395,16 @@ static int expand_backtick(garray_T *gap, char_u *pat, int flags) cmd = buffer; while (*cmd != NUL) { - cmd = (char_u *)skipwhite((char *)cmd); // skip over white space + cmd = skipwhite(cmd); // skip over white space p = cmd; while (*p != NUL && *p != '\r' && *p != '\n') { // skip over entry ++p; } // add an entry if it is not empty if (p > cmd) { - char_u i = *p; + char i = *p; *p = NUL; - addfile(gap, cmd, flags); + addfile(gap, (char_u *)cmd, flags); *p = i; ++cnt; } @@ -2244,10 +2245,10 @@ int match_suffix(char_u *fname) for (char_u *setsuf = p_su; *setsuf;) { setsuflen = copy_option_part(&setsuf, suf_buf, MAXSUFLEN, ".,"); if (setsuflen == 0) { - char_u *tail = path_tail(fname); + char_u *tail = (char_u *)path_tail((char *)fname); // empty entry: match name without a '.' - if (vim_strchr(tail, '.') == NULL) { + if (vim_strchr((char *)tail, '.') == NULL) { setsuflen = 1; break; } diff --git a/src/nvim/plines.c b/src/nvim/plines.c index bbe1a41b00..f940598bf8 100644 --- a/src/nvim/plines.c +++ b/src/nvim/plines.c @@ -155,11 +155,11 @@ int plines_win_col(win_T *wp, linenr_T lnum, long column) } // If *s is a TAB, and the TAB is not displayed as ^I, and we're not in - // INSERT mode, then col must be adjusted so that it represents the last - // screen position of the TAB. This only fixes an error when the TAB wraps - // from one screen line to the next (when 'columns' is not a multiple of - // 'ts') -- webb. - if (*s == TAB && (State & NORMAL) + // MODE_INSERT state, then col must be adjusted so that it represents the + // last screen position of the TAB. This only fixes an error when the TAB + // wraps from one screen line to the next (when 'columns' is not a multiple + // of 'ts') -- webb. + if (*s == TAB && (State & MODE_NORMAL) && (!wp->w_p_list || wp->w_p_lcs_chars.tab1)) { col += win_lbr_chartabsize(wp, line, s, col, NULL) - 1; } diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c index 78b3ceaacf..9525a84e62 100644 --- a/src/nvim/popupmnu.c +++ b/src/nvim/popupmnu.c @@ -111,10 +111,10 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed, i // To keep the code simple, we only allow changing the // draw mode when the popup menu is not being displayed pum_external = ui_has(kUIPopupmenu) - || (State == CMDLINE && ui_has(kUIWildmenu)); + || (State == MODE_CMDLINE && ui_has(kUIWildmenu)); } - pum_rl = (curwin->w_p_rl && State != CMDLINE); + pum_rl = (curwin->w_p_rl && State != MODE_CMDLINE); do { // Mark the pum as visible already here, @@ -126,7 +126,7 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed, i below_row = cmdline_row; // wildoptions=pum - if (State == CMDLINE) { + if (State == MODE_CMDLINE) { pum_win_row = ui_has(kUICmdline) ? 0 : cmdline_row; cursor_col = cmd_startcol; pum_anchor_grid = ui_has(kUICmdline) ? -1 : DEFAULT_GRID_HANDLE; @@ -419,7 +419,7 @@ void pum_redraw(void) grid_assign_handle(&pum_grid); - pum_grid.zindex = ((State == CMDLINE) + pum_grid.zindex = ((State == MODE_CMDLINE) ? kZIndexCmdlinePopupMenu : kZIndexPopupMenu); bool moved = ui_comp_put_grid(&pum_grid, pum_row, pum_col - col_off, @@ -429,9 +429,9 @@ void pum_redraw(void) must_redraw_pum = false; if (!pum_grid.chars - || pum_grid.Rows != pum_height || pum_grid.Columns != grid_width) { + || pum_grid.rows != pum_height || pum_grid.cols != grid_width) { grid_alloc(&pum_grid, pum_height, grid_width, !invalid_grid, false); - ui_call_grid_resize(pum_grid.handle, pum_grid.Columns, pum_grid.Rows); + ui_call_grid_resize(pum_grid.handle, pum_grid.cols, pum_grid.rows); } else if (invalid_grid) { grid_invalidate(&pum_grid); } @@ -694,7 +694,7 @@ static int pum_set_selected(int n, int repeat) if ((pum_array[pum_selected].pum_info != NULL) && (Rows > 10) && (repeat <= 1) - && (vim_strchr(p_cot, 'p') != NULL)) { + && (vim_strchr((char *)p_cot, 'p') != NULL)) { win_T *curwin_save = curwin; tabpage_T *curtab_save = curtab; int res = OK; @@ -748,7 +748,7 @@ static int pum_set_selected(int n, int repeat) linenr_T lnum = 0; for (p = pum_array[pum_selected].pum_info; *p != NUL;) { - e = vim_strchr(p, '\n'); + e = (char_u *)vim_strchr((char *)p, '\n'); if (e == NULL) { ml_append(lnum++, (char *)p, 0, false); break; diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index 394f819f13..883de85aee 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -369,9 +369,9 @@ static char *efmpat_to_regpat(const char *efmpat, char *regpat, efm_T *efminfo, return NULL; } if ((idx && idx < FMT_PATTERN_R - && vim_strchr((char_u *)"DXOPQ", efminfo->prefix) != NULL) + && vim_strchr("DXOPQ", efminfo->prefix) != NULL) || (idx == FMT_PATTERN_R - && vim_strchr((char_u *)"OPQ", efminfo->prefix) == NULL)) { + && vim_strchr("OPQ", efminfo->prefix) == NULL)) { semsg(_("E373: Unexpected %%%c in format string"), *efmpat); return NULL; } @@ -453,10 +453,10 @@ static char *scanf_fmt_to_regpat(const char **pefmp, const char *efm, int len, c static const char *efm_analyze_prefix(const char *efmp, efm_T *efminfo) FUNC_ATTR_NONNULL_ALL { - if (vim_strchr((char_u *)"+-", *efmp) != NULL) { + if (vim_strchr("+-", *efmp) != NULL) { efminfo->flags = *efmp++; } - if (vim_strchr((char_u *)"DXAEWINCZGOPQ", *efmp) != NULL) { + if (vim_strchr("DXAEWINCZGOPQ", *efmp) != NULL) { efminfo->prefix = *efmp; } else { semsg(_("E376: Invalid %%%c in format string prefix"), *efmp); @@ -496,7 +496,7 @@ static int efm_to_regpat(const char *efm, int len, efm_T *fmt_ptr, char *regpat) if (ptr == NULL) { return FAIL; } - } else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL) { + } else if (vim_strchr("%\\.^$~[", *efmp) != NULL) { *ptr++ = *efmp; // regexp magic characters } else if (*efmp == '#') { *ptr++ = '*'; @@ -516,7 +516,7 @@ static int efm_to_regpat(const char *efm, int len, efm_T *fmt_ptr, char *regpat) } else { // copy normal character if (*efmp == '\\' && efmp + 1 < efm + len) { efmp++; - } else if (vim_strchr((char_u *)".*^$~[", *efmp) != NULL) { + } else if (vim_strchr(".*^$~[", *efmp) != NULL) { *ptr++ = '\\'; // escape regexp atoms } if (*efmp) { @@ -609,7 +609,7 @@ static efm_T *parse_efm_option(char *efm) if (efm_to_regpat(efm, len, fmt_ptr, fmtstr) == FAIL) { goto parse_efm_error; } - if ((fmt_ptr->prog = vim_regcomp((char_u *)fmtstr, RE_MAGIC + RE_STRING)) == NULL) { + if ((fmt_ptr->prog = vim_regcomp(fmtstr, RE_MAGIC + RE_STRING)) == NULL) { goto parse_efm_error; } // Advance to next part @@ -659,7 +659,7 @@ static int qf_get_next_str_line(qfstate_T *state) return QF_END_OF_INPUT; } - p = (char *)vim_strchr((char_u *)p_str, '\n'); + p = vim_strchr(p_str, '\n'); if (p != NULL) { len = (size_t)(p - p_str) + 1; } else { @@ -961,16 +961,16 @@ restofline: fmt_start = fmt_ptr; } - if (vim_strchr((char_u *)"AEWIN", idx) != NULL) { + if (vim_strchr("AEWIN", idx) != NULL) { qfl->qf_multiline = true; // start of a multi-line message qfl->qf_multiignore = false; // reset continuation - } else if (vim_strchr((char_u *)"CZ", idx) != NULL) { + } else if (vim_strchr("CZ", idx) != NULL) { // continuation of multi-line msg status = qf_parse_multiline_pfx(idx, qfl, fields); if (status != QF_OK) { return status; } - } else if (vim_strchr((char_u *)"OPQ", idx) != NULL) { + } else if (vim_strchr("OPQ", idx) != NULL) { // global file names status = qf_parse_file_pfx(idx, fields, qfl, tail); if (status == QF_MULTISCAN) { @@ -1273,7 +1273,7 @@ static int qf_parse_fmt_f(regmatch_T *rmp, int midx, qffields_T *fields, int pre // For separate filename patterns (%O, %P and %Q), the specified file // should exist. - if (vim_strchr((char_u *)"OPQ", prefix) != NULL + if (vim_strchr("OPQ", prefix) != NULL && !os_path_exists((char_u *)fields->namebuf)) { return QF_FAIL; } @@ -1500,7 +1500,7 @@ static int qf_parse_match(char *linebuf, size_t linelen, efm_T *fmt_ptr, regmatc if ((idx == 'C' || idx == 'Z') && !qf_multiline) { return QF_FAIL; } - if (vim_strchr((char_u *)"EWIN", idx) != NULL) { + if (vim_strchr("EWIN", idx) != NULL) { fields->type = idx; } else { fields->type = 0; @@ -1545,7 +1545,7 @@ static int qf_parse_get_fields(char *linebuf, size_t linelen, efm_T *fmt_ptr, qf int status = QF_FAIL; int r; - if (qf_multiscan && vim_strchr((char_u *)"OPQ", fmt_ptr->prefix) == NULL) { + if (qf_multiscan && vim_strchr("OPQ", fmt_ptr->prefix) == NULL) { return QF_FAIL; } @@ -2170,7 +2170,7 @@ static char *qf_push_dir(char *dirbuf, struct dir_stack_T **stackptr, bool is_fi // store directory on the stack if (vim_isAbsName((char_u *)dirbuf) || (*stackptr)->next == NULL - || (*stackptr && is_file_stack)) { + || is_file_stack) { (*stackptr)->dirname = xstrdup(dirbuf); } else { // Okay we don't have an absolute path. @@ -3102,9 +3102,9 @@ static void qf_list_entry(qfline_T *qfp, int qf_idx, bool cursel) } else { if (qfp->qf_fnum != 0 && (buf = buflist_findnr(qfp->qf_fnum)) != NULL) { - fname = (char *)buf->b_fname; + fname = buf->b_fname; if (qfp->qf_type == 1) { // :helpgrep - fname = (char *)path_tail((char_u *)fname); + fname = path_tail(fname); } } if (fname == NULL) { @@ -4230,10 +4230,8 @@ static void qf_fill_buffer(qf_list_T *qfl, buf_T *buf, qfline_T *old_last, int q curbuf->b_p_ma = false; keep_filetype = true; // don't detect 'filetype' - apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL, - false, curbuf); - apply_autocmds(EVENT_BUFWINENTER, (char_u *)"quickfix", NULL, - false, curbuf); + apply_autocmds(EVENT_BUFREADPOST, "quickfix", NULL, false, curbuf); + apply_autocmds(EVENT_BUFWINENTER, "quickfix", NULL, false, curbuf); keep_filetype = false; curbuf->b_ro_locked--; @@ -4374,7 +4372,7 @@ void ex_make(exarg_T *eap) } char *const au_name = make_get_auname(eap->cmdidx); - if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, curbuf->b_fname, true, curbuf)) { if (aborting()) { return; @@ -4415,7 +4413,7 @@ void ex_make(exarg_T *eap) // check for autocommands changing the current quickfix list. unsigned save_qfid = qf_get_curlist(qi)->qf_id; if (au_name != NULL) { - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, curbuf->b_fname, true, + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf); } if (res > 0 && !eap->forceit && qflist_valid(wp, save_qfid)) { @@ -5106,7 +5104,7 @@ void ex_cfile(exarg_T *eap) au_name = cfile_get_auname(eap->cmdidx); if (au_name != NULL - && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, NULL, false, curbuf)) { + && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, NULL, false, curbuf)) { if (aborting()) { return; } @@ -5146,7 +5144,7 @@ void ex_cfile(exarg_T *eap) } unsigned save_qfid = qf_get_curlist(qi)->qf_id; if (au_name != NULL) { - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, NULL, false, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, NULL, false, curbuf); } // Jump to the first error for a new list and if autocmds didn't free the // list. @@ -5196,9 +5194,9 @@ static void vgr_init_regmatch(regmmatch_T *regmatch, char *s) emsg(_(e_noprevre)); return; } - regmatch->regprog = vim_regcomp(last_search_pat(), RE_MAGIC); + regmatch->regprog = vim_regcomp((char *)last_search_pat(), RE_MAGIC); } else { - regmatch->regprog = vim_regcomp((char_u *)s, RE_MAGIC); + regmatch->regprog = vim_regcomp(s, RE_MAGIC); } regmatch->rmm_ic = p_ic; @@ -5565,7 +5563,7 @@ static int vgr_process_files(win_T *wp, qf_info_T *qi, vgr_args_T *cmd_args, boo // options! aco_save_T aco; aucmd_prepbuf(&aco, buf); - apply_autocmds(EVENT_FILETYPE, buf->b_p_ft, buf->b_fname, true, buf); + apply_autocmds(EVENT_FILETYPE, (char *)buf->b_p_ft, buf->b_fname, true, buf); do_modelines(OPT_NOWIN); aucmd_restbuf(&aco); } @@ -5588,7 +5586,7 @@ theend: void ex_vimgrep(exarg_T *eap) { char *au_name = vgr_get_auname(eap->cmdidx); - if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, curbuf->b_fname, true, curbuf)) { if (aborting()) { return; @@ -5637,7 +5635,7 @@ void ex_vimgrep(exarg_T *eap) unsigned save_qfid = qf_get_curlist(qi)->qf_id; if (au_name != NULL) { - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf); } // The QuickFixCmdPost autocmd may free the quickfix list. Check the list @@ -5740,7 +5738,7 @@ static buf_T *load_dummy_buffer(char *fname, char *dirname_start, char *resultin curbuf->b_flags &= ~BF_DUMMY; newbuf_to_wipe.br_buf = NULL; - readfile_result = readfile((char_u *)fname, NULL, (linenr_T)0, (linenr_T)0, + readfile_result = readfile(fname, NULL, (linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM, NULL, READ_NEW | READ_DUMMY, false); newbuf->b_locked--; @@ -6887,7 +6885,7 @@ static int cbuffer_process_args(exarg_T *eap, buf_T **bufp, linenr_T *line1, lin if (*eap->arg == NUL) { buf = curbuf; - } else if (*skipwhite((char *)skipdigits((char_u *)eap->arg)) == NUL) { + } else if (*skipwhite(skipdigits(eap->arg)) == NUL) { buf = buflist_findnr(atoi(eap->arg)); } @@ -6935,7 +6933,7 @@ void ex_cbuffer(exarg_T *eap) linenr_T line2; au_name = cbuffer_get_auname(eap->cmdidx); - if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, curbuf->b_fname, true, curbuf)) { if (aborting()) { return; @@ -6975,8 +6973,7 @@ void ex_cbuffer(exarg_T *eap) unsigned save_qfid = qf_get_curlist(qi)->qf_id; if (au_name != NULL) { const buf_T *const curbuf_old = curbuf; - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, - curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf); if (curbuf != curbuf_old) { // Autocommands changed buffer, don't jump now, "qi" may // be invalid. @@ -7023,7 +7020,7 @@ void ex_cexpr(exarg_T *eap) win_T *wp = NULL; au_name = cexpr_get_auname(eap->cmdidx); - if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, curbuf->b_fname, true, curbuf)) { if (aborting()) { return; @@ -7055,8 +7052,7 @@ void ex_cexpr(exarg_T *eap) // check for autocommands changing the current quickfix list. unsigned save_qfid = qf_get_curlist(qi)->qf_id; if (au_name != NULL) { - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, - curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf); } // Jump to the first error for a new list and if autocmds didn't // free the list. @@ -7220,7 +7216,7 @@ void ex_helpgrep(exarg_T *eap) default: break; } - if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)au_name, + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, curbuf->b_fname, true, curbuf)) { if (aborting()) { return; @@ -7228,8 +7224,8 @@ void ex_helpgrep(exarg_T *eap) } // Make 'cpoptions' empty, the 'l' flag should not be used here. - char *const save_cpo = (char *)p_cpo; - p_cpo = empty_option; + char *const save_cpo = p_cpo; + p_cpo = (char *)empty_option; if (is_loclist_cmd(eap->cmdidx)) { qi = hgr_get_ll(&new_qi); @@ -7240,7 +7236,7 @@ void ex_helpgrep(exarg_T *eap) // Check for a specified language char *const lang = check_help_lang(eap->arg); regmatch_T regmatch = { - .regprog = vim_regcomp((char_u *)eap->arg, RE_MAGIC + RE_STRING), + .regprog = vim_regcomp(eap->arg, RE_MAGIC + RE_STRING), .rm_ic = false, }; if (regmatch.regprog != NULL) { @@ -7259,16 +7255,15 @@ void ex_helpgrep(exarg_T *eap) qf_update_buffer(qi, NULL); } - if (p_cpo == empty_option) { - p_cpo = (char_u *)save_cpo; + if ((char_u *)p_cpo == empty_option) { + p_cpo = save_cpo; } else { // Darn, some plugin changed the value. free_string_option((char_u *)save_cpo); } if (au_name != NULL) { - apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name, - curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, true, curbuf); // When adding a location list to an existing location list stack, // if the autocmd made the stack invalid, then just return. if (!new_qi && IS_LL_STACK(qi) && qf_find_win_with_loclist(qi) == NULL) { diff --git a/src/nvim/rbuffer.h b/src/nvim/rbuffer.h index e86765a4ad..09d6ba3d34 100644 --- a/src/nvim/rbuffer.h +++ b/src/nvim/rbuffer.h @@ -36,6 +36,8 @@ // // Note that the rbuffer_{produced,consumed} calls are necessary or these macros // create infinite loops +// +// -V:RBUFFER_UNTIL_EMPTY:1044 #define RBUFFER_UNTIL_EMPTY(buf, rptr, rcnt) \ for (size_t rcnt = 0, _r = 1; _r; _r = 0) /* NOLINT(readability/braces) */ \ for (char *rptr = rbuffer_read_ptr(buf, &rcnt); /* NOLINT(readability/braces) */ \ diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c index 2052493e3f..f0ccd19478 100644 --- a/src/nvim/regexp.c +++ b/src/nvim/regexp.c @@ -1,8 +1,6 @@ // This is an open source non-commercial project. Dear PVS-Studio, please check // it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com -// uncrustify:off - /* * Handling of regular expressions: vim_regcomp(), vim_regexec(), vim_regsub() */ @@ -18,21 +16,21 @@ #include <stdbool.h> #include <string.h> -#include "nvim/vim.h" #include "nvim/ascii.h" -#include "nvim/regexp.h" #include "nvim/charset.h" #include "nvim/eval.h" #include "nvim/eval/userfunc.h" #include "nvim/ex_cmds2.h" +#include "nvim/garray.h" #include "nvim/mark.h" #include "nvim/memline.h" #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/os/input.h" #include "nvim/plines.h" -#include "nvim/garray.h" +#include "nvim/regexp.h" #include "nvim/strings.h" +#include "nvim/vim.h" #ifdef REGEXP_DEBUG // show/save debugging data when BT engine is used @@ -62,15 +60,17 @@ typedef void (*(*fptr_T)(int *, int))(void); static int no_Magic(int x) { - if (is_Magic(x)) + if (is_Magic(x)) { return un_Magic(x); + } return x; } static int toggle_Magic(int x) { - if (is_Magic(x)) + if (is_Magic(x)) { return un_Magic(x); + } return Magic(x); } @@ -88,13 +88,12 @@ static int toggle_Magic(int x) #define IEMSG_RET_NULL(m) return (iemsg(m), rc_did_emsg = true, (void *)NULL) #define EMSG_RET_FAIL(m) return (emsg(m), rc_did_emsg = true, FAIL) #define EMSG2_RET_NULL(m, c) \ - return (semsg((m), (c) ? "" : "\\"), rc_did_emsg = true, (void *)NULL) + return (semsg((m), (c) ? "" : "\\"), rc_did_emsg = true, (void *)NULL) #define EMSG3_RET_NULL(m, c, a) \ - return (semsg((const char *)(m), (c) ? "" : "\\", (a)), rc_did_emsg = true, (void *)NULL) + return (semsg((const char *)(m), (c) ? "" : "\\", (a)), rc_did_emsg = true, (void *)NULL) #define EMSG2_RET_FAIL(m, c) \ - return (semsg((m), (c) ? "" : "\\"), rc_did_emsg = true, FAIL) -#define EMSG_ONE_RET_NULL EMSG2_RET_NULL(_( \ - "E369: invalid item in %s%%[]"), reg_magic == MAGIC_ALL) + return (semsg((m), (c) ? "" : "\\"), rc_did_emsg = true, FAIL) +#define EMSG_ONE_RET_NULL EMSG2_RET_NULL(_("E369: invalid item in %s%%[]"), reg_magic == MAGIC_ALL) #define MAX_LIMIT (32767L << 16L) @@ -128,33 +127,35 @@ static char_u e_regexp_number_after_dot_pos_search[] /// Return MULTI_MULT if c is a multi "multi" operator. static int re_multi_type(int c) { - if (c == Magic('@') || c == Magic('=') || c == Magic('?')) + if (c == Magic('@') || c == Magic('=') || c == Magic('?')) { return MULTI_ONE; - if (c == Magic('*') || c == Magic('+') || c == Magic('{')) + } + if (c == Magic('*') || c == Magic('+') || c == Magic('{')) { return MULTI_MULT; + } return NOT_MULTI; } -static char_u *reg_prev_sub = NULL; +static char_u *reg_prev_sub = NULL; /* * REGEXP_INRANGE contains all characters which are always special in a [] * range after '\'. * REGEXP_ABBR contains all characters which act as abbreviations after '\'. * These are: - * \n - New line (NL). - * \r - Carriage Return (CR). - * \t - Tab (TAB). - * \e - Escape (ESC). - * \b - Backspace (Ctrl_H). + * \n - New line (NL). + * \r - Carriage Return (CR). + * \t - Tab (TAB). + * \e - Escape (ESC). + * \b - Backspace (Ctrl_H). * \d - Character code in decimal, eg \d123 - * \o - Character code in octal, eg \o80 - * \x - Character code in hex, eg \x4a - * \u - Multibyte character code, eg \u20ac - * \U - Long multibyte character code, eg \U12345678 + * \o - Character code in octal, eg \o80 + * \x - Character code in hex, eg \x4a + * \u - Multibyte character code, eg \u20ac + * \U - Long multibyte character code, eg \U12345678 */ -static char_u REGEXP_INRANGE[] = "]^-n\\"; -static char_u REGEXP_ABBR[] = "nrtebdoxuU"; +static char REGEXP_INRANGE[] = "]^-n\\"; +static char REGEXP_ABBR[] = "nrtebdoxuU"; /* @@ -163,10 +164,14 @@ static char_u REGEXP_ABBR[] = "nrtebdoxuU"; static int backslash_trans(int c) { switch (c) { - case 'r': return CAR; - case 't': return TAB; - case 'e': return ESC; - case 'b': return BS; + case 'r': + return CAR; + case 't': + return TAB; + case 'e': + return ESC; + case 'b': + return BS; } return c; } @@ -223,11 +228,12 @@ static int get_char_class(char_u **pp) int i; if ((*pp)[1] == ':') { - for (i = 0; i < (int)ARRAY_SIZE(class_names); ++i) + for (i = 0; i < (int)ARRAY_SIZE(class_names); i++) { if (STRNCMP(*pp + 2, class_names[i], STRLEN(class_names[i])) == 0) { *pp += STRLEN(class_names[i]) + 2; return i; } + } } return CLASS_NONE; } @@ -253,41 +259,43 @@ static void init_class_tab(void) int i; static int done = false; - if (done) + if (done) { return; + } - for (i = 0; i < 256; ++i) { - if (i >= '0' && i <= '7') + for (i = 0; i < 256; i++) { + if (i >= '0' && i <= '7') { class_tab[i] = RI_DIGIT + RI_HEX + RI_OCTAL + RI_WORD; - else if (i >= '8' && i <= '9') + } else if (i >= '8' && i <= '9') { class_tab[i] = RI_DIGIT + RI_HEX + RI_WORD; - else if (i >= 'a' && i <= 'f') + } else if (i >= 'a' && i <= 'f') { class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER; - else if (i >= 'g' && i <= 'z') + } else if (i >= 'g' && i <= 'z') { class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER; - else if (i >= 'A' && i <= 'F') + } else if (i >= 'A' && i <= 'F') { class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER; - else if (i >= 'G' && i <= 'Z') + } else if (i >= 'G' && i <= 'Z') { class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER; - else if (i == '_') + } else if (i == '_') { class_tab[i] = RI_WORD + RI_HEAD; - else + } else { class_tab[i] = 0; + } } class_tab[' '] |= RI_WHITE; class_tab['\t'] |= RI_WHITE; done = true; } -# define ri_digit(c) ((c) < 0x100 && (class_tab[c] & RI_DIGIT)) -# define ri_hex(c) ((c) < 0x100 && (class_tab[c] & RI_HEX)) -# define ri_octal(c) ((c) < 0x100 && (class_tab[c] & RI_OCTAL)) -# define ri_word(c) ((c) < 0x100 && (class_tab[c] & RI_WORD)) -# define ri_head(c) ((c) < 0x100 && (class_tab[c] & RI_HEAD)) -# define ri_alpha(c) ((c) < 0x100 && (class_tab[c] & RI_ALPHA)) -# define ri_lower(c) ((c) < 0x100 && (class_tab[c] & RI_LOWER)) -# define ri_upper(c) ((c) < 0x100 && (class_tab[c] & RI_UPPER)) -# define ri_white(c) ((c) < 0x100 && (class_tab[c] & RI_WHITE)) +#define ri_digit(c) ((c) < 0x100 && (class_tab[c] & RI_DIGIT)) +#define ri_hex(c) ((c) < 0x100 && (class_tab[c] & RI_HEX)) +#define ri_octal(c) ((c) < 0x100 && (class_tab[c] & RI_OCTAL)) +#define ri_word(c) ((c) < 0x100 && (class_tab[c] & RI_WORD)) +#define ri_head(c) ((c) < 0x100 && (class_tab[c] & RI_HEAD)) +#define ri_alpha(c) ((c) < 0x100 && (class_tab[c] & RI_ALPHA)) +#define ri_lower(c) ((c) < 0x100 && (class_tab[c] & RI_LOWER)) +#define ri_upper(c) ((c) < 0x100 && (class_tab[c] & RI_UPPER)) +#define ri_white(c) ((c) < 0x100 && (class_tab[c] & RI_WHITE)) // flags for regflags #define RF_ICASE 1 // ignore case @@ -320,6 +328,8 @@ static int reg_strict; // "[abc" is illegal * META contains all characters that may be magic, except '^' and '$'. */ +// uncrustify:off + // META[] is used often enough to justify turning it into a table. static char_u META_flags[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -338,6 +348,8 @@ static char_u META_flags[] = { 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1 }; +// uncrustify:on + static int curchr; // currently parsed character // Previous character. Note: prevchr is sometimes -1 when we are not at the // start, eg in /[ ^I]^ the pattern was never found even if it existed, @@ -389,7 +401,7 @@ static int get_equi_class(char_u **pp) { int c; int l = 1; - char_u *p = *pp; + char_u *p = *pp; if (p[1] == '=' && p[2] != NUL) { l = utfc_ptr2len((char *)p + 2); @@ -413,7 +425,7 @@ static int get_coll_element(char_u **pp) { int c; int l = 1; - char_u *p = *pp; + char_u *p = *pp; if (p[0] != NUL && p[1] == '.' && p[2] != NUL) { l = utfc_ptr2len((char *)p + 2); @@ -451,7 +463,7 @@ static char_u *skip_anyof(char_u *p) while (*p != NUL && *p != ']') { if ((l = utfc_ptr2len((char *)p)) > 1) { p += l; - } else if (*p == '-') { + } else if (*p == '-') { p++; if (*p != ']' && *p != NUL) { MB_PTR_ADV(p); @@ -488,12 +500,13 @@ static char_u *skip_anyof(char_u *p) char_u *skip_regexp(char_u *startp, int dirc, int magic, char_u **newp) { int mymagic; - char_u *p = startp; + char_u *p = startp; - if (magic) + if (magic) { mymagic = MAGIC_ON; - else + } else { mymagic = MAGIC_OFF; + } get_cpo_flags(); for (; p[0] != NUL; MB_PTR_ADV(p)) { @@ -503,9 +516,10 @@ char_u *skip_regexp(char_u *startp, int dirc, int magic, char_u **newp) if ((p[0] == '[' && mymagic >= MAGIC_ON) || (p[0] == '\\' && p[1] == '[' && mymagic <= MAGIC_OFF)) { p = skip_anyof(p + 1); - if (p[0] == NUL) + if (p[0] == NUL) { break; - } else if (p[0] == '\\' && p[1] != NUL) { + } + } else if (p[0] == '\\' && p[1] != NUL) { if (dirc == '?' && newp != NULL && p[1] == '?') { // change "\?" to "?", make a copy first. if (*newp == NULL) { @@ -686,8 +700,7 @@ static int peekchr(void) } } break; - case '\\': - { + case '\\': { int c = regparse[1]; if (c == NUL) { @@ -712,13 +725,11 @@ static int peekchr(void) * Handle abbreviations, like "\t" for TAB -- webb */ curchr = backslash_trans(c); - } else if (reg_magic == MAGIC_NONE && (c == '$' || c == '^')) + } else if (reg_magic == MAGIC_NONE && (c == '$' || c == '^')) { curchr = toggle_Magic(c); - else { - /* - * Next character can never be (made) magic? - * Then backslashing it won't do anything. - */ + } else { + // Next character can never be (made) magic? + // Then backslashing it won't do anything. curchr = utf_ptr2char((char *)regparse + 1); } break; @@ -804,7 +815,7 @@ static void ungetchr(void) * Return -1 if there is no valid hex number. * The position is updated: * blahblah\%x20asdf - * before-^ ^-after + * before-^ ^-after * The parameter controls the maximum number of input characters. This will be * 2 when reading a \%x20 sequence and 4 when reading a \%u20AC sequence. */ @@ -816,15 +827,17 @@ static int64_t gethexchrs(int maxinputlen) for (i = 0; i < maxinputlen; ++i) { c = regparse[0]; - if (!ascii_isxdigit(c)) + if (!ascii_isxdigit(c)) { break; + } nr <<= 4; nr |= hex2nr(c); ++regparse; } - if (i == 0) + if (i == 0) { return -1; + } return nr; } @@ -840,16 +853,18 @@ static int64_t getdecchrs(void) for (i = 0;; ++i) { c = regparse[0]; - if (c < '0' || c > '9') + if (c < '0' || c > '9') { break; + } nr *= 10; nr += c - '0'; regparse++; curchr = -1; // no longer valid } - if (i == 0) + if (i == 0) { return -1; + } return nr; } @@ -859,7 +874,7 @@ static int64_t getdecchrs(void) * numbers > 377 correctly (for example, 400 is treated as 40) and doesn't * treat 8 or 9 as recognised characters. Position is updated: * blahblah\%o210asdf - * before-^ ^-after + * before-^ ^-after */ static int64_t getoctchrs(void) { @@ -869,15 +884,17 @@ static int64_t getoctchrs(void) for (i = 0; i < 3 && nr < 040; i++) { // -V536 c = regparse[0]; - if (c < '0' || c > '7') + if (c < '0' || c > '7') { break; + } nr <<= 3; nr |= hex2nr(c); ++regparse; } - if (i == 0) + if (i == 0) { return -1; + } return nr; } @@ -891,7 +908,7 @@ static int64_t getoctchrs(void) static int read_limits(long *minval, long *maxval) { int reverse = false; - char_u *first_char; + char_u *first_char; long tmp; if (*regparse == '-') { @@ -943,7 +960,7 @@ static int read_limits(long *minval, long *maxval) // Sometimes need to save a copy of a line. Since alloc()/free() is very // slow, we keep one allocated piece of memory and only re-allocate it when // it's too small. It's freed in bt_regexec_both() when finished. -static char_u *reg_tofree = NULL; +static char_u *reg_tofree = NULL; static unsigned reg_tofreelen; // Structure used to store the execution state of the regex engine. @@ -1039,8 +1056,8 @@ static char_u *reg_getline(linenr_T lnum) return ml_get_buf(rex.reg_buf, rex.reg_firstlnum + lnum, false); } -static char_u *reg_startzp[NSUBEXP]; // Workspace to mark beginning -static char_u *reg_endzp[NSUBEXP]; // and end of \z(...\) matches +static char_u *reg_startzp[NSUBEXP]; // Workspace to mark beginning +static char_u *reg_endzp[NSUBEXP]; // and end of \z(...\) matches static lpos_T reg_startzpos[NSUBEXP]; // idem, beginning pos static lpos_T reg_endzpos[NSUBEXP]; // idem, end pos @@ -1063,8 +1080,9 @@ static reg_extmatch_T *make_extmatch(void) */ reg_extmatch_T *ref_extmatch(reg_extmatch_T *em) { - if (em != NULL) + if (em != NULL) { em->refcnt++; + } return em; } @@ -1077,8 +1095,9 @@ void unref_extmatch(reg_extmatch_T *em) int i; if (em != NULL && --em->refcnt <= 0) { - for (i = 0; i < NSUBEXP; ++i) + for (i = 0; i < NSUBEXP; i++) { xfree(em->matches[i]); + } xfree(em); } } @@ -1087,9 +1106,8 @@ void unref_extmatch(reg_extmatch_T *em) static int reg_prev_class(void) { if (rex.input > rex.line) { - return mb_get_class_tab( - rex.input - 1 - utf_head_off(rex.line, rex.input - 1), - rex.reg_buf->b_chartab); + return mb_get_class_tab(rex.input - 1 - utf_head_off(rex.line, rex.input - 1), + rex.reg_buf->b_chartab); } return -1; } @@ -1147,10 +1165,12 @@ static bool reg_match_visual(void) } else if (mode == Ctrl_V) { getvvcol(wp, &top, &start, NULL, &end); getvvcol(wp, &bot, &start2, NULL, &end2); - if (start2 < start) + if (start2 < start) { start = start2; - if (end2 > end) + } + if (end2 > end) { end = end2; + } if (top.col == MAXCOL || bot.col == MAXCOL || curswant == MAXCOL) { end = MAXCOL; } @@ -1175,7 +1195,7 @@ static bool reg_match_visual(void) */ static int prog_magic_wrong(void) { - regprog_T *prog; + regprog_T *prog; prog = REG_MULTI ? rex.reg_mmatch->regprog : rex.reg_match->regprog; if (prog->engine == &nfa_regengine) { @@ -1241,21 +1261,18 @@ static void reg_nextline(void) * If "bytelen" is not NULL, it is set to the byte length of the match in the * last line. */ -static int match_with_backref( - linenr_T start_lnum, - colnr_T start_col, - linenr_T end_lnum, - colnr_T end_col, - int *bytelen) +static int match_with_backref(linenr_T start_lnum, colnr_T start_col, linenr_T end_lnum, + colnr_T end_col, int *bytelen) { linenr_T clnum = start_lnum; colnr_T ccol = start_col; int len; - char_u *p; + char_u *p; - if (bytelen != NULL) + if (bytelen != NULL) { *bytelen = 0; - for (;; ) { + } + for (;;) { // Since getting one line may invalidate the other, need to make copy. // Slow! if (rex.line != reg_tofree) { @@ -1275,10 +1292,11 @@ static int match_with_backref( p = reg_getline(clnum); assert(p); - if (clnum == end_lnum) + if (clnum == end_lnum) { len = end_col - ccol; - else + } else { len = (int)STRLEN(p + ccol); + } if (cstrncmp(p + ccol, rex.input, &len) != 0) { return RA_NOMATCH; // doesn't match @@ -1295,12 +1313,14 @@ static int match_with_backref( // Advance to next line. reg_nextline(); - if (bytelen != NULL) + if (bytelen != NULL) { *bytelen = 0; - ++clnum; + } + clnum++; ccol = 0; - if (got_int) + if (got_int) { return RA_FAIL; + } } // found a match! Note that rex.line may now point to a copy of the line, @@ -1324,7 +1344,7 @@ typedef struct { } decomp_T; // 0xfb20 - 0xfb4f -static decomp_T decomp_table[0xfb4f-0xfb20+1] = +static decomp_T decomp_table[0xfb4f - 0xfb20 + 1] = { { 0x5e2, 0, 0 }, // 0xfb20 alt ayin { 0x5d0, 0, 0 }, // 0xfb21 alt alef @@ -1407,7 +1427,7 @@ static int cstrncmp(char_u *s1, char_u *s2, int *n) // if it failed and it's utf8 and we want to combineignore: if (result != 0 && rex.reg_icombine) { - char_u *str1, *str2; + char_u *str1, *str2; int c1, c2, c11, c12; int junk; @@ -1435,8 +1455,9 @@ static int cstrncmp(char_u *s1, char_u *s2, int *n) } } result = c2 - c1; - if (result == 0) + if (result == 0) { *n = (int)(str2 - s2); + } } return result; @@ -1456,7 +1477,7 @@ static inline char_u *cstrchr(const char_u *const s, const int c) FUNC_ATTR_ALWAYS_INLINE { if (!rex.reg_ic) { - return vim_strchr(s, c); + return (char_u *)vim_strchr((char *)s, c); } // Use folded case for UTF-8, slow! For ASCII use libc strpbrk which is @@ -1477,7 +1498,7 @@ static inline char_u *cstrchr(const char_u *const s, const int c) } else if (ASCII_ISLOWER(c)) { cc = TOUPPER_ASC(c); } else { - return vim_strchr(s, c); + return (char_u *)vim_strchr((char *)s, c); } char tofind[] = { (char)c, (char)cc, NUL }; @@ -1533,9 +1554,9 @@ static fptr_T do_Lower(int *d, int c) */ char_u *regtilde(char_u *source, int magic, bool preview) { - char_u *newsub = source; - char_u *tmpsub; - char_u *p; + char_u *newsub = source; + char_u *tmpsub; + char_u *p; int len; int prevlen; @@ -1605,8 +1626,7 @@ static regsubmatch_T rsm; // can only be used when can_f_submatch is true /// Put the submatches in "argv[argskip]" which is a list passed into /// call_func() by vim_regsub_both(). -static int fill_submatch_list(int argc FUNC_ATTR_UNUSED, typval_T *argv, - int argskip, int argcount) +static int fill_submatch_list(int argc FUNC_ATTR_UNUSED, typval_T *argv, int argskip, int argcount) FUNC_ATTR_NONNULL_ALL { typval_T *listarg = argv + argskip; @@ -1658,8 +1678,8 @@ static void clear_submatch_list(staticList10_T *sl) /// references invalid! /// /// Returns the size of the replacement, including terminating NUL. -int vim_regsub(regmatch_T *rmp, char_u *source, typval_T *expr, char_u *dest, - int copy, int magic, int backslash) +int vim_regsub(regmatch_T *rmp, char_u *source, typval_T *expr, char_u *dest, int copy, int magic, + int backslash) { regexec_T rex_save; bool rex_in_use_save = rex_in_use; @@ -1685,8 +1705,8 @@ int vim_regsub(regmatch_T *rmp, char_u *source, typval_T *expr, char_u *dest, return result; } -int vim_regsub_multi(regmmatch_T *rmp, linenr_T lnum, char_u *source, char_u *dest, - int copy, int magic, int backslash) +int vim_regsub_multi(regmmatch_T *rmp, linenr_T lnum, char_u *source, char_u *dest, int copy, + int magic, int backslash) { regexec_T rex_save; bool rex_in_use_save = rex_in_use; @@ -1713,12 +1733,12 @@ int vim_regsub_multi(regmmatch_T *rmp, linenr_T lnum, char_u *source, char_u *de return result; } -static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, - int copy, int magic, int backslash) +static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, int copy, int magic, + int backslash) { - char_u *src; - char_u *dst; - char_u *s; + char_u *src; + char_u *dst; + char_u *s; int c; int cc; int no = -1; @@ -1737,8 +1757,9 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, emsg(_(e_null)); return 0; } - if (prog_magic_wrong()) + if (prog_magic_wrong()) { return 0; + } src = source; dst = dest; @@ -1851,28 +1872,33 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, rsm = rsm_save; } } - } else + } else { while ((c = *src++) != NUL) { - if (c == '&' && magic) + if (c == '&' && magic) { no = 0; - else if (c == '\\' && *src != NUL) { + } else if (c == '\\' && *src != NUL) { if (*src == '&' && !magic) { ++src; no = 0; } else if ('0' <= *src && *src <= '9') { no = *src++ - '0'; - } else if (vim_strchr((char_u *)"uUlLeE", *src)) { + } else if (vim_strchr("uUlLeE", *src)) { switch (*src++) { - case 'u': func_one = (fptr_T)do_upper; + case 'u': + func_one = (fptr_T)do_upper; continue; - case 'U': func_all = (fptr_T)do_Upper; + case 'U': + func_all = (fptr_T)do_Upper; continue; - case 'l': func_one = (fptr_T)do_lower; + case 'l': + func_one = (fptr_T)do_lower; continue; - case 'L': func_all = (fptr_T)do_Lower; + case 'L': + func_all = (fptr_T)do_Lower; continue; case 'e': - case 'E': func_one = func_all = (fptr_T)NULL; + case 'E': + func_one = func_all = (fptr_T)NULL; continue; } } @@ -1894,12 +1920,16 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, if (c == '\\' && *src != NUL) { // Check for abbreviations -- webb switch (*src) { - case 'r': c = CAR; ++src; break; - case 'n': c = NL; ++src; break; - case 't': c = TAB; ++src; break; + case 'r': + c = CAR; ++src; break; + case 'n': + c = NL; ++src; break; + case 't': + c = TAB; ++src; break; // Oh no! \e already has meaning in subst pat :-( // case 'e': c = ESC; ++src; break; - case 'b': c = Ctrl_H; ++src; break; + case 'b': + c = Ctrl_H; ++src; break; // If "backslash" is true the backslash will be removed // later. Used to insert a literal CR. @@ -1967,7 +1997,7 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, } } if (s != NULL) { - for (;; ) { + for (;;) { if (len == 0) { if (REG_MULTI) { if (rex.reg_mmatch->endpos[no].lnum == clnum) { @@ -2042,8 +2072,10 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, no = -1; } } - if (copy) + } + if (copy) { *dst = NUL; + } exit: return (int)((dst - dest) + 1 - num_escaped); @@ -2078,13 +2110,14 @@ static char_u *reg_getline_submatch(linenr_T lnum) */ char_u *reg_submatch(int no) { - char_u *retval = NULL; - char_u *s; + char_u *retval = NULL; + char_u *s; int round; linenr_T lnum; - if (!can_f_submatch || no < 0) + if (!can_f_submatch || no < 0) { return NULL; + } if (rsm.sm_match == NULL) { ssize_t len; @@ -2123,12 +2156,14 @@ char_u *reg_submatch(int no) lnum++; while (lnum < rsm.sm_mmatch->endpos[no].lnum) { s = reg_getline_submatch(lnum++); - if (round == 2) + if (round == 2) { STRCPY(retval + len, s); + } len += STRLEN(s); - if (round == 2) + if (round == 2) { retval[len] = '\n'; - ++len; + } + len++; } if (round == 2) { STRNCPY(retval + len, reg_getline_submatch(lnum), @@ -2250,11 +2285,11 @@ static char_u regname[][30] = { * Use vim_regfree() to free the memory. * Returns NULL for an error. */ -regprog_T *vim_regcomp(char_u *expr_arg, int re_flags) +regprog_T *vim_regcomp(char *expr_arg, int re_flags) { - regprog_T *prog = NULL; - char_u *expr = expr_arg; - int save_called_emsg; + regprog_T *prog = NULL; + char_u *expr = (char_u *)expr_arg; + int save_called_emsg; regexp_engine = p_re; @@ -2273,8 +2308,7 @@ regprog_T *vim_regcomp(char_u *expr_arg, int re_flags) regname[newengine]); #endif } else { - emsg(_( - "E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be used ")); + emsg(_("E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be used ")); regexp_engine = AUTOMATIC_ENGINE; } } @@ -2292,7 +2326,7 @@ regprog_T *vim_regcomp(char_u *expr_arg, int re_flags) called_emsg = false; if (regexp_engine != BACKTRACKING_ENGINE) { prog = nfa_regengine.regcomp(expr, - re_flags + (regexp_engine == AUTOMATIC_ENGINE ? RE_AUTO : 0)); + re_flags + (regexp_engine == AUTOMATIC_ENGINE ? RE_AUTO : 0)); } else { prog = bt_regengine.regcomp(expr, re_flags); } @@ -2339,8 +2373,9 @@ regprog_T *vim_regcomp(char_u *expr_arg, int re_flags) */ void vim_regfree(regprog_T *prog) { - if (prog != NULL) + if (prog != NULL) { prog->engine->regfree(prog); + } } @@ -2413,7 +2448,7 @@ static bool vim_regexec_string(regmatch_T *rmp, char_u *line, colnr_T col, bool p_re = BACKTRACKING_ENGINE; vim_regfree(rmp->regprog); report_re_switch(pat); - rmp->regprog = vim_regcomp(pat, re_flags); + rmp->regprog = vim_regcomp((char *)pat, re_flags); if (rmp->regprog != NULL) { rmp->regprog->re_in_use = true; result = rmp->regprog->engine->regexec_nl(rmp, line, col, nl); @@ -2462,16 +2497,17 @@ bool vim_regexec_nl(regmatch_T *rmp, char_u *line, colnr_T col) /// Note: "rmp->regprog" may be freed and changed, even set to NULL. /// Uses curbuf for line count and 'iskeyword'. /// -/// Return zero if there is no match. Return number of lines contained in the -/// match otherwise. -long vim_regexec_multi( - regmmatch_T *rmp, - win_T *win, // window in which to search or NULL - buf_T *buf, // buffer in which to search - linenr_T lnum, // nr of line to start looking for match - colnr_T col, // column to start looking for match - proftime_T *tm, // timeout limit or NULL - int *timed_out) // flag is set when timeout limit reached +/// @param win window in which to search or NULL +/// @param buf buffer in which to search +/// @param lnum nr of line to start looking for match +/// @param col column to start looking for match +/// @param tm timeout limit or NULL +/// @param timed_out flag is set when timeout limit reached +/// +/// @return zero if there is no match. Return number of lines contained in the +/// match otherwise. +long vim_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, + proftime_T *tm, int *timed_out) FUNC_ATTR_NONNULL_ARG(1) { regexec_T rex_save; @@ -2508,7 +2544,7 @@ long vim_regexec_multi( // checking for \z misuse was already done when compiling for NFA, // allow all here reg_do_extmatch = REX_ALL; - rmp->regprog = vim_regcomp(pat, re_flags); + rmp->regprog = vim_regcomp((char *)pat, re_flags); reg_do_extmatch = 0; if (rmp->regprog == NULL) { diff --git a/src/nvim/regexp_bt.c b/src/nvim/regexp_bt.c index ed03bb6172..c13c2c6832 100644 --- a/src/nvim/regexp_bt.c +++ b/src/nvim/regexp_bt.c @@ -1,8 +1,6 @@ // This is an open source non-commercial project. Dear PVS-Studio, please check // it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com -// uncrustify:off - /* * * Backtracking regular expression implementation. @@ -19,22 +17,22 @@ * * END NOTICE * - * Copyright (c) 1986 by University of Toronto. - * Written by Henry Spencer. Not derived from licensed software. + * Copyright (c) 1986 by University of Toronto. + * Written by Henry Spencer. Not derived from licensed software. * - * Permission is granted to anyone to use this software for any - * purpose on any computer system, and to redistribute it freely, - * subject to the following restrictions: + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it freely, + * subject to the following restrictions: * - * 1. The author is not responsible for the consequences of use of - * this software, no matter how awful, even if they arise - * from defects in it. + * 1. The author is not responsible for the consequences of use of + * this software, no matter how awful, even if they arise + * from defects in it. * - * 2. The origin of this software must not be misrepresented, either - * by explicit claim or by omission. + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. * - * 3. Altered versions must be plainly marked as such, and must not - * be misrepresented as being the original software. + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented as being the original software. * * Beware that some of this code is subtly aware of the way operator * precedence is structured in regular expressions. Serious changes in @@ -51,12 +49,12 @@ * compile to execute that permits the execute phase to run lots faster on * simple cases. They are: * - * regstart char that must begin a match; NUL if none obvious; Can be a - * multi-byte character. - * reganch is the match anchored (at beginning-of-line only)? - * regmust string (pointer into program) that match must include, or NULL - * regmlen length of regmust string - * regflags RF_ values or'ed together + * regstart char that must begin a match; NUL if none obvious; Can be a + * multi-byte character. + * reganch is the match anchored (at beginning-of-line only)? + * regmust string (pointer into program) that match must include, or NULL + * regmlen length of regmust string + * regflags RF_ values or'ed together * * Regstart and reganch permit very fast decisions on suitable starting points * for a match, cutting down the work a lot. Regmust permits fast rejection @@ -75,7 +73,7 @@ * plus a "next" pointer, possibly plus an operand. "Next" pointers of * all nodes except BRANCH and BRACES_COMPLEX implement concatenation; a "next" * pointer with a BRANCH on both ends of it is connecting two alternatives. - * (Here we have one of the subtle syntax dependencies: an individual BRANCH + * (Here we have one of the subtle syntax dependencies: an individual BRANCH * (as opposed to a collection of them) is never concatenated with anything * because of operator precedence). The "next" pointer of a BRACES_COMPLEX * node points to the node after the stuff to be repeated. @@ -85,52 +83,52 @@ * (NB this is *not* a tree structure: the tail of the branch connects to the * thing following the set of BRANCHes.) * - * pattern is coded like: + * pattern is coded like: * - * +-----------------+ - * | V - * <aa>\|<bb> BRANCH <aa> BRANCH <bb> --> END - * | ^ | ^ - * +------+ +----------+ + * +-----------------+ + * | V + * <aa>\|<bb> BRANCH <aa> BRANCH <bb> --> END + * | ^ | ^ + * +------+ +----------+ * * - * +------------------+ - * V | - * <aa>* BRANCH BRANCH <aa> --> BACK BRANCH --> NOTHING --> END - * | | ^ ^ - * | +---------------+ | - * +---------------------------------------------+ + * +------------------+ + * V | + * <aa>* BRANCH BRANCH <aa> --> BACK BRANCH --> NOTHING --> END + * | | ^ ^ + * | +---------------+ | + * +---------------------------------------------+ * * - * +----------------------+ - * V | - * <aa>\+ BRANCH <aa> --> BRANCH --> BACK BRANCH --> NOTHING --> END - * | | ^ ^ - * | +-----------+ | - * +--------------------------------------------------+ + * +----------------------+ + * V | + * <aa>\+ BRANCH <aa> --> BRANCH --> BACK BRANCH --> NOTHING --> END + * | | ^ ^ + * | +-----------+ | + * +--------------------------------------------------+ * * - * +-------------------------+ - * V | - * <aa>\{} BRANCH BRACE_LIMITS --> BRACE_COMPLEX <aa> --> BACK END - * | | ^ - * | +----------------+ - * +-----------------------------------------------+ + * +-------------------------+ + * V | + * <aa>\{} BRANCH BRACE_LIMITS --> BRACE_COMPLEX <aa> --> BACK END + * | | ^ + * | +----------------+ + * +-----------------------------------------------+ * * - * <aa>\@!<bb> BRANCH NOMATCH <aa> --> END <bb> --> END - * | | ^ ^ - * | +----------------+ | - * +--------------------------------+ + * <aa>\@!<bb> BRANCH NOMATCH <aa> --> END <bb> --> END + * | | ^ ^ + * | +----------------+ | + * +--------------------------------+ * - * +---------+ - * | V - * \z[abc] BRANCH BRANCH a BRANCH b BRANCH c BRANCH NOTHING --> END - * | | | | ^ ^ - * | | | +-----+ | - * | | +----------------+ | - * | +---------------------------+ | - * +------------------------------------------------------+ + * +---------+ + * | V + * \z[abc] BRANCH BRANCH a BRANCH b BRANCH c BRANCH NOTHING --> END + * | | | | ^ ^ + * | | | +-----+ | + * | | +----------------+ | + * | +---------------------------+ | + * +------------------------------------------------------+ * * They all start with a BRANCH for "\|" alternatives, even when there is only * one alternative. @@ -141,8 +139,8 @@ #include <stdbool.h> #include <string.h> -#include "nvim/regexp.h" #include "nvim/garray.h" +#include "nvim/regexp.h" /* * The opcodes are: @@ -220,10 +218,10 @@ // end of match. #define BACKREF 100 // -109 node Match same string again \1-\9. -# define ZOPEN 110 // -119 Mark this point in input as start of - // \z( … \) subexpr. -# define ZCLOSE 120 // -129 Analogous to ZOPEN. -# define ZREF 130 // -139 node Match external submatch \z1-\z9 +#define ZOPEN 110 // -119 Mark this point in input as start of + // \z( … \) subexpr. +#define ZCLOSE 120 // -129 Analogous to ZOPEN. +#define ZREF 130 // -139 node Match external submatch \z1-\z9 #define BRACE_COMPLEX 140 // -149 node Match nodes between m & n times @@ -267,8 +265,8 @@ static int brace_count[10]; ///< Current counts for complex brace repeats static int one_exactly = false; ///< only do one char for EXACTLY // When making changes to classchars also change nfa_classcodes. -static char_u *classchars = (char_u *)".iIkKfFpPsSdDxXoOwWhHaAlLuU"; -static int classcodes[] = { +static char_u *classchars = (char_u *)".iIkKfFpPsSdDxXoOwWhHaAlLuU"; +static int classcodes[] = { ANY, IDENT, SIDENT, KWORD, SKWORD, FNAME, SFNAME, PRINT, SPRINT, WHITE, NWHITE, DIGIT, NDIGIT, @@ -282,7 +280,7 @@ static int classcodes[] = { * When regcode is set to this value, code is not emitted and size is computed * instead. */ -#define JUST_CALC_SIZE ((char_u *) -1) +#define JUST_CALC_SIZE ((char_u *)-1) // Values for rs_state in regitem_T. typedef enum regstate_E { @@ -299,7 +297,7 @@ typedef enum regstate_E { RS_BEHIND1, // BEHIND / NOBEHIND matching rest RS_BEHIND2, // BEHIND / NOBEHIND matching behind part RS_STAR_LONG, // STAR/PLUS/BRACE_SIMPLE longest match - RS_STAR_SHORT // STAR/PLUS/BRACE_SIMPLE shortest match + RS_STAR_SHORT, // STAR/PLUS/BRACE_SIMPLE shortest match } regstate_T; /* @@ -307,34 +305,29 @@ typedef enum regstate_E { * restored after trying a match. Used by reg_save() and reg_restore(). * Also stores the length of "backpos". */ -typedef struct -{ - union - { - char_u *ptr; // rex.input pointer, for single-line regexp - lpos_T pos; // rex.input pos, for multi-line regexp +typedef struct { + union { + char_u *ptr; // rex.input pointer, for single-line regexp + lpos_T pos; // rex.input pos, for multi-line regexp } rs_u; - int rs_len; + int rs_len; } regsave_T; // struct to save start/end pointer/position in for \(\) -typedef struct -{ - union - { - char_u *ptr; - lpos_T pos; - } se_u; +typedef struct { + union { + char_u *ptr; + lpos_T pos; + } se_u; } save_se_T; // used for BEHIND and NOBEHIND matching -typedef struct regbehind_S -{ - regsave_T save_after; - regsave_T save_behind; - int save_need_clear_subexpr; - save_se_T save_start[NSUBEXP]; - save_se_T save_end[NSUBEXP]; +typedef struct regbehind_S { + regsave_T save_after; + regsave_T save_behind; + int save_need_clear_subexpr; + save_se_T save_start[NSUBEXP]; + save_se_T save_end[NSUBEXP]; } regbehind_T; /* @@ -343,35 +336,31 @@ typedef struct regbehind_S * Before it may be another type of item, depending on rs_state, to remember * more things. */ -typedef struct regitem_S -{ - regstate_T rs_state; // what we are doing, one of RS_ above - short rs_no; // submatch nr or BEHIND/NOBEHIND - char_u *rs_scan; // current node in program - union - { - save_se_T sesave; - regsave_T regsave; +typedef struct regitem_S { + regstate_T rs_state; // what we are doing, one of RS_ above + int16_t rs_no; // submatch nr or BEHIND/NOBEHIND + char_u *rs_scan; // current node in program + union { + save_se_T sesave; + regsave_T regsave; } rs_un; // room for saving rex.input } regitem_T; // used for STAR, PLUS and BRACE_SIMPLE matching -typedef struct regstar_S -{ - int nextb; // next byte - int nextb_ic; // next byte reverse case - long count; - long minval; - long maxval; +typedef struct regstar_S { + int nextb; // next byte + int nextb_ic; // next byte reverse case + long count; + long minval; + long maxval; } regstar_T; // used to store input position when a BACK was encountered, so that we now if // we made any progress since the last time. -typedef struct backpos_S -{ - char_u *bp_scan; // "scan" where BACK was encountered - regsave_T bp_pos; // last input position +typedef struct backpos_S { + char_u *bp_scan; // "scan" where BACK was encountered + regsave_T bp_pos; // last input position } backpos_T; /* @@ -397,34 +386,34 @@ static regsave_T behind_pos; * This makes it fast while not keeping a lot of memory allocated. * A three times speed increase was observed when using many simple patterns. */ -#define REGSTACK_INITIAL 2048 -#define BACKPOS_INITIAL 64 +#define REGSTACK_INITIAL 2048 +#define BACKPOS_INITIAL 64 /* * Opcode notes: * - * BRANCH The set of branches constituting a single choice are hooked - * together with their "next" pointers, since precedence prevents - * anything being concatenated to any individual branch. The - * "next" pointer of the last BRANCH in a choice points to the - * thing following the whole choice. This is also where the - * final "next" pointer of each individual branch points; each - * branch starts with the operand node of a BRANCH node. + * BRANCH The set of branches constituting a single choice are hooked + * together with their "next" pointers, since precedence prevents + * anything being concatenated to any individual branch. The + * "next" pointer of the last BRANCH in a choice points to the + * thing following the whole choice. This is also where the + * final "next" pointer of each individual branch points; each + * branch starts with the operand node of a BRANCH node. * - * BACK Normal "next" pointers all implicitly point forward; BACK - * exists to make loop structures possible. + * BACK Normal "next" pointers all implicitly point forward; BACK + * exists to make loop structures possible. * - * STAR,PLUS '=', and complex '*' and '+', are implemented as circular - * BRANCH structures using BACK. Simple cases (one character - * per match) are implemented with STAR and PLUS for speed - * and to minimize recursive plunges. + * STAR,PLUS '=', and complex '*' and '+', are implemented as circular + * BRANCH structures using BACK. Simple cases (one character + * per match) are implemented with STAR and PLUS for speed + * and to minimize recursive plunges. * - * BRACE_LIMITS This is always followed by a BRACE_SIMPLE or BRACE_COMPLEX - * node, and defines the min and max limits to be used for that - * node. + * BRACE_LIMITS This is always followed by a BRACE_SIMPLE or BRACE_COMPLEX + * node, and defines the min and max limits to be used for that + * node. * - * MOPEN,MCLOSE ...are numbered at compile time. - * ZOPEN,ZCLOSE ...ditto + * MOPEN,MCLOSE ...are numbered at compile time. + * ZOPEN,ZCLOSE ...ditto */ /* @@ -442,7 +431,7 @@ static regsave_T behind_pos; #define OPERAND(p) ((p) + 3) // Obtain an operand that was stored as four bytes, MSB first. #define OPERAND_MIN(p) (((long)(p)[3] << 24) + ((long)(p)[4] << 16) \ - + ((long)(p)[5] << 8) + (long)(p)[6]) + + ((long)(p)[5] << 8) + (long)(p)[6]) // Obtain a second operand stored as four bytes. #define OPERAND_MAX(p) OPERAND_MIN((p) + 4) // Obtain a second single-byte operand stored after a four bytes operand. @@ -451,14 +440,14 @@ static regsave_T behind_pos; static char_u *reg(int paren, int *flagp); #ifdef BT_REGEXP_DUMP -static void regdump(char_u *, bt_regprog_T *); +static void regdump(char_u *, bt_regprog_T *); #endif #ifdef REGEXP_DEBUG -static char_u *regprop(char_u *); +static char_u *regprop(char_u *); -static int regnarrate = 0; +static int regnarrate = 0; #endif #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -469,15 +458,14 @@ static int regnarrate = 0; /* * Setup to parse the regexp. Used once to get the length and once to do it. */ -static void regcomp_start( - char_u *expr, - int re_flags) // see vim_regcomp() +static void regcomp_start(char_u *expr, int re_flags) // see vim_regcomp() { initchr(expr); - if (re_flags & RE_MAGIC) + if (re_flags & RE_MAGIC) { reg_magic = MAGIC_ON; - else + } else { reg_magic = MAGIC_OFF; + } reg_string = (re_flags & RE_STRING); reg_strict = (re_flags & RE_STRICT); get_cpo_flags(); @@ -508,10 +496,11 @@ static bool use_multibytecode(int c) */ static void regc(int b) { - if (regcode == JUST_CALC_SIZE) + if (regcode == JUST_CALC_SIZE) { regsize++; - else + } else { *regcode++ = b; + } } /* @@ -537,12 +526,36 @@ static void reg_equi_class(int c) { switch (c) { // Do not use '\300' style, it results in a negative number. - case 'A': case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: - case 0xc5: case 0x100: case 0x102: case 0x104: case 0x1cd: - case 0x1de: case 0x1e0: case 0x1fa: case 0x202: case 0x226: - case 0x23a: case 0x1e00: case 0x1ea0: case 0x1ea2: case 0x1ea4: - case 0x1ea6: case 0x1ea8: case 0x1eaa: case 0x1eac: case 0x1eae: - case 0x1eb0: case 0x1eb2: case 0x1eb4: case 0x1eb6: + case 'A': + case 0xc0: + case 0xc1: + case 0xc2: + case 0xc3: + case 0xc4: + case 0xc5: + case 0x100: + case 0x102: + case 0x104: + case 0x1cd: + case 0x1de: + case 0x1e0: + case 0x1fa: + case 0x202: + case 0x226: + case 0x23a: + case 0x1e00: + case 0x1ea0: + case 0x1ea2: + case 0x1ea4: + case 0x1ea6: + case 0x1ea8: + case 0x1eaa: + case 0x1eac: + case 0x1eae: + case 0x1eb0: + case 0x1eb2: + case 0x1eb4: + case 0x1eb6: regmbc('A'); regmbc(0xc0); regmbc(0xc1); regmbc(0xc2); regmbc(0xc3); regmbc(0xc4); regmbc(0xc5); regmbc(0x100); regmbc(0x102); regmbc(0x104); @@ -554,33 +567,71 @@ static void reg_equi_class(int c) regmbc(0x1eae); regmbc(0x1eb0); regmbc(0x1eb2); regmbc(0x1eb4); regmbc(0x1eb6); return; - case 'B': case 0x181: case 0x243: case 0x1e02: - case 0x1e04: case 0x1e06: + case 'B': + case 0x181: + case 0x243: + case 0x1e02: + case 0x1e04: + case 0x1e06: regmbc('B'); regmbc(0x181); regmbc(0x243); regmbc(0x1e02); regmbc(0x1e04); regmbc(0x1e06); return; - case 'C': case 0xc7: - case 0x106: case 0x108: case 0x10a: case 0x10c: case 0x187: - case 0x23b: case 0x1e08: case 0xa792: + case 'C': + case 0xc7: + case 0x106: + case 0x108: + case 0x10a: + case 0x10c: + case 0x187: + case 0x23b: + case 0x1e08: + case 0xa792: regmbc('C'); regmbc(0xc7); regmbc(0x106); regmbc(0x108); regmbc(0x10a); regmbc(0x10c); regmbc(0x187); regmbc(0x23b); regmbc(0x1e08); regmbc(0xa792); return; - case 'D': case 0x10e: case 0x110: case 0x18a: - case 0x1e0a: case 0x1e0c: case 0x1e0e: case 0x1e10: + case 'D': + case 0x10e: + case 0x110: + case 0x18a: + case 0x1e0a: + case 0x1e0c: + case 0x1e0e: + case 0x1e10: case 0x1e12: regmbc('D'); regmbc(0x10e); regmbc(0x110); regmbc(0x18a); regmbc(0x1e0a); regmbc(0x1e0c); regmbc(0x1e0e); regmbc(0x1e10); regmbc(0x1e12); return; - case 'E': case 0xc8: case 0xc9: case 0xca: case 0xcb: - case 0x112: case 0x114: case 0x116: case 0x118: case 0x11a: - case 0x204: case 0x206: case 0x228: case 0x246: case 0x1e14: - case 0x1e16: case 0x1e18: case 0x1e1a: case 0x1e1c: - case 0x1eb8: case 0x1eba: case 0x1ebc: case 0x1ebe: - case 0x1ec0: case 0x1ec2: case 0x1ec4: case 0x1ec6: + case 'E': + case 0xc8: + case 0xc9: + case 0xca: + case 0xcb: + case 0x112: + case 0x114: + case 0x116: + case 0x118: + case 0x11a: + case 0x204: + case 0x206: + case 0x228: + case 0x246: + case 0x1e14: + case 0x1e16: + case 0x1e18: + case 0x1e1a: + case 0x1e1c: + case 0x1eb8: + case 0x1eba: + case 0x1ebc: + case 0x1ebe: + case 0x1ec0: + case 0x1ec2: + case 0x1ec4: + case 0x1ec6: regmbc('E'); regmbc(0xc8); regmbc(0xc9); regmbc(0xca); regmbc(0xcb); regmbc(0x112); regmbc(0x114); regmbc(0x116); regmbc(0x118); @@ -591,30 +642,61 @@ static void reg_equi_class(int c) regmbc(0x1ebc); regmbc(0x1ebe); regmbc(0x1ec0); regmbc(0x1ec2); regmbc(0x1ec4); regmbc(0x1ec6); return; - case 'F': case 0x191: case 0x1e1e: case 0xa798: + case 'F': + case 0x191: + case 0x1e1e: + case 0xa798: regmbc('F'); regmbc(0x191); regmbc(0x1e1e); regmbc(0xa798); return; - case 'G': case 0x11c: case 0x11e: case 0x120: - case 0x122: case 0x193: case 0x1e4: case 0x1e6: - case 0x1f4: case 0x1e20: case 0xa7a0: + case 'G': + case 0x11c: + case 0x11e: + case 0x120: + case 0x122: + case 0x193: + case 0x1e4: + case 0x1e6: + case 0x1f4: + case 0x1e20: + case 0xa7a0: regmbc('G'); regmbc(0x11c); regmbc(0x11e); regmbc(0x120); regmbc(0x122); regmbc(0x193); regmbc(0x1e4); regmbc(0x1e6); regmbc(0x1f4); regmbc(0x1e20); regmbc(0xa7a0); return; - case 'H': case 0x124: case 0x126: case 0x21e: - case 0x1e22: case 0x1e24: case 0x1e26: - case 0x1e28: case 0x1e2a: case 0x2c67: + case 'H': + case 0x124: + case 0x126: + case 0x21e: + case 0x1e22: + case 0x1e24: + case 0x1e26: + case 0x1e28: + case 0x1e2a: + case 0x2c67: regmbc('H'); regmbc(0x124); regmbc(0x126); regmbc(0x21e); regmbc(0x1e22); regmbc(0x1e24); regmbc(0x1e26); regmbc(0x1e28); regmbc(0x1e2a); regmbc(0x2c67); return; - case 'I': case 0xcc: case 0xcd: case 0xce: case 0xcf: - case 0x128: case 0x12a: case 0x12c: case 0x12e: - case 0x130: case 0x197: case 0x1cf: case 0x208: - case 0x20a: case 0x1e2c: case 0x1e2e: case 0x1ec8: + case 'I': + case 0xcc: + case 0xcd: + case 0xce: + case 0xcf: + case 0x128: + case 0x12a: + case 0x12c: + case 0x12e: + case 0x130: + case 0x197: + case 0x1cf: + case 0x208: + case 0x20a: + case 0x1e2c: + case 0x1e2e: + case 0x1ec8: case 0x1eca: regmbc('I'); regmbc(0xcc); regmbc(0xcd); regmbc(0xce); regmbc(0xcf); regmbc(0x128); @@ -623,44 +705,102 @@ static void reg_equi_class(int c) regmbc(0x208); regmbc(0x20a); regmbc(0x1e2c); regmbc(0x1e2e); regmbc(0x1ec8); regmbc(0x1eca); return; - case 'J': case 0x134: case 0x248: + case 'J': + case 0x134: + case 0x248: regmbc('J'); regmbc(0x134); regmbc(0x248); return; - case 'K': case 0x136: case 0x198: case 0x1e8: case 0x1e30: - case 0x1e32: case 0x1e34: case 0x2c69: case 0xa740: + case 'K': + case 0x136: + case 0x198: + case 0x1e8: + case 0x1e30: + case 0x1e32: + case 0x1e34: + case 0x2c69: + case 0xa740: regmbc('K'); regmbc(0x136); regmbc(0x198); regmbc(0x1e8); regmbc(0x1e30); regmbc(0x1e32); regmbc(0x1e34); regmbc(0x2c69); regmbc(0xa740); return; - case 'L': case 0x139: case 0x13b: case 0x13d: case 0x13f: - case 0x141: case 0x23d: case 0x1e36: case 0x1e38: - case 0x1e3a: case 0x1e3c: case 0x2c60: + case 'L': + case 0x139: + case 0x13b: + case 0x13d: + case 0x13f: + case 0x141: + case 0x23d: + case 0x1e36: + case 0x1e38: + case 0x1e3a: + case 0x1e3c: + case 0x2c60: regmbc('L'); regmbc(0x139); regmbc(0x13b); regmbc(0x13d); regmbc(0x13f); regmbc(0x141); regmbc(0x23d); regmbc(0x1e36); regmbc(0x1e38); regmbc(0x1e3a); regmbc(0x1e3c); regmbc(0x2c60); return; - case 'M': case 0x1e3e: case 0x1e40: case 0x1e42: + case 'M': + case 0x1e3e: + case 0x1e40: + case 0x1e42: regmbc('M'); regmbc(0x1e3e); regmbc(0x1e40); regmbc(0x1e42); return; - case 'N': case 0xd1: - case 0x143: case 0x145: case 0x147: case 0x1f8: - case 0x1e44: case 0x1e46: case 0x1e48: case 0x1e4a: + case 'N': + case 0xd1: + case 0x143: + case 0x145: + case 0x147: + case 0x1f8: + case 0x1e44: + case 0x1e46: + case 0x1e48: + case 0x1e4a: case 0xa7a4: regmbc('N'); regmbc(0xd1); regmbc(0x143); regmbc(0x145); regmbc(0x147); regmbc(0x1f8); regmbc(0x1e44); regmbc(0x1e46); regmbc(0x1e48); regmbc(0x1e4a); regmbc(0xa7a4); return; - case 'O': case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: - case 0xd8: case 0x14c: case 0x14e: case 0x150: case 0x19f: - case 0x1a0: case 0x1d1: case 0x1ea: case 0x1ec: case 0x1fe: - case 0x20c: case 0x20e: case 0x22a: case 0x22c: case 0x22e: - case 0x230: case 0x1e4c: case 0x1e4e: case 0x1e50: case 0x1e52: - case 0x1ecc: case 0x1ece: case 0x1ed0: case 0x1ed2: case 0x1ed4: - case 0x1ed6: case 0x1ed8: case 0x1eda: case 0x1edc: case 0x1ede: - case 0x1ee0: case 0x1ee2: + case 'O': + case 0xd2: + case 0xd3: + case 0xd4: + case 0xd5: + case 0xd6: + case 0xd8: + case 0x14c: + case 0x14e: + case 0x150: + case 0x19f: + case 0x1a0: + case 0x1d1: + case 0x1ea: + case 0x1ec: + case 0x1fe: + case 0x20c: + case 0x20e: + case 0x22a: + case 0x22c: + case 0x22e: + case 0x230: + case 0x1e4c: + case 0x1e4e: + case 0x1e50: + case 0x1e52: + case 0x1ecc: + case 0x1ece: + case 0x1ed0: + case 0x1ed2: + case 0x1ed4: + case 0x1ed6: + case 0x1ed8: + case 0x1eda: + case 0x1edc: + case 0x1ede: + case 0x1ee0: + case 0x1ee2: regmbc('O'); regmbc(0xd2); regmbc(0xd3); regmbc(0xd4); regmbc(0xd5); regmbc(0xd6); regmbc(0xd8); regmbc(0x14c); regmbc(0x14e); regmbc(0x150); @@ -675,47 +815,105 @@ static void reg_equi_class(int c) regmbc(0x1edc); regmbc(0x1ede); regmbc(0x1ee0); regmbc(0x1ee2); return; - case 'P': case 0x1a4: case 0x1e54: case 0x1e56: case 0x2c63: + case 'P': + case 0x1a4: + case 0x1e54: + case 0x1e56: + case 0x2c63: regmbc('P'); regmbc(0x1a4); regmbc(0x1e54); regmbc(0x1e56); regmbc(0x2c63); return; - case 'Q': case 0x24a: + case 'Q': + case 0x24a: regmbc('Q'); regmbc(0x24a); return; - case 'R': case 0x154: case 0x156: case 0x158: case 0x210: - case 0x212: case 0x24c: case 0x1e58: case 0x1e5a: - case 0x1e5c: case 0x1e5e: case 0x2c64: case 0xa7a6: + case 'R': + case 0x154: + case 0x156: + case 0x158: + case 0x210: + case 0x212: + case 0x24c: + case 0x1e58: + case 0x1e5a: + case 0x1e5c: + case 0x1e5e: + case 0x2c64: + case 0xa7a6: regmbc('R'); regmbc(0x154); regmbc(0x156); regmbc(0x210); regmbc(0x212); regmbc(0x158); regmbc(0x24c); regmbc(0x1e58); regmbc(0x1e5a); regmbc(0x1e5c); regmbc(0x1e5e); regmbc(0x2c64); regmbc(0xa7a6); return; - case 'S': case 0x15a: case 0x15c: case 0x15e: case 0x160: - case 0x218: case 0x1e60: case 0x1e62: case 0x1e64: - case 0x1e66: case 0x1e68: case 0x2c7e: case 0xa7a8: + case 'S': + case 0x15a: + case 0x15c: + case 0x15e: + case 0x160: + case 0x218: + case 0x1e60: + case 0x1e62: + case 0x1e64: + case 0x1e66: + case 0x1e68: + case 0x2c7e: + case 0xa7a8: regmbc('S'); regmbc(0x15a); regmbc(0x15c); regmbc(0x15e); regmbc(0x160); regmbc(0x218); regmbc(0x1e60); regmbc(0x1e62); regmbc(0x1e64); regmbc(0x1e66); regmbc(0x1e68); regmbc(0x2c7e); regmbc(0xa7a8); return; - case 'T': case 0x162: case 0x164: case 0x166: case 0x1ac: - case 0x1ae: case 0x21a: case 0x23e: case 0x1e6a: case 0x1e6c: - case 0x1e6e: case 0x1e70: + case 'T': + case 0x162: + case 0x164: + case 0x166: + case 0x1ac: + case 0x1ae: + case 0x21a: + case 0x23e: + case 0x1e6a: + case 0x1e6c: + case 0x1e6e: + case 0x1e70: regmbc('T'); regmbc(0x162); regmbc(0x164); regmbc(0x166); regmbc(0x1ac); regmbc(0x23e); regmbc(0x1ae); regmbc(0x21a); regmbc(0x1e6a); regmbc(0x1e6c); regmbc(0x1e6e); regmbc(0x1e70); return; - case 'U': case 0xd9: case 0xda: case 0xdb: case 0xdc: - case 0x168: case 0x16a: case 0x16c: case 0x16e: - case 0x170: case 0x172: case 0x1af: case 0x1d3: - case 0x1d5: case 0x1d7: case 0x1d9: case 0x1db: - case 0x214: case 0x216: case 0x244: case 0x1e72: - case 0x1e74: case 0x1e76: case 0x1e78: case 0x1e7a: - case 0x1ee4: case 0x1ee6: case 0x1ee8: case 0x1eea: - case 0x1eec: case 0x1eee: case 0x1ef0: + case 'U': + case 0xd9: + case 0xda: + case 0xdb: + case 0xdc: + case 0x168: + case 0x16a: + case 0x16c: + case 0x16e: + case 0x170: + case 0x172: + case 0x1af: + case 0x1d3: + case 0x1d5: + case 0x1d7: + case 0x1d9: + case 0x1db: + case 0x214: + case 0x216: + case 0x244: + case 0x1e72: + case 0x1e74: + case 0x1e76: + case 0x1e78: + case 0x1e7a: + case 0x1ee4: + case 0x1ee6: + case 0x1ee8: + case 0x1eea: + case 0x1eec: + case 0x1eee: + case 0x1ef0: regmbc('U'); regmbc(0xd9); regmbc(0xda); regmbc(0xdb); regmbc(0xdc); regmbc(0x168); regmbc(0x16a); regmbc(0x16c); regmbc(0x16e); @@ -728,41 +926,92 @@ static void reg_equi_class(int c) regmbc(0x1ee8); regmbc(0x1eea); regmbc(0x1eec); regmbc(0x1eee); regmbc(0x1ef0); return; - case 'V': case 0x1b2: case 0x1e7c: case 0x1e7e: + case 'V': + case 0x1b2: + case 0x1e7c: + case 0x1e7e: regmbc('V'); regmbc(0x1b2); regmbc(0x1e7c); regmbc(0x1e7e); return; - case 'W': case 0x174: case 0x1e80: case 0x1e82: - case 0x1e84: case 0x1e86: case 0x1e88: + case 'W': + case 0x174: + case 0x1e80: + case 0x1e82: + case 0x1e84: + case 0x1e86: + case 0x1e88: regmbc('W'); regmbc(0x174); regmbc(0x1e80); regmbc(0x1e82); regmbc(0x1e84); regmbc(0x1e86); regmbc(0x1e88); return; - case 'X': case 0x1e8a: case 0x1e8c: + case 'X': + case 0x1e8a: + case 0x1e8c: regmbc('X'); regmbc(0x1e8a); regmbc(0x1e8c); return; - case 'Y': case 0xdd: - case 0x176: case 0x178: case 0x1b3: case 0x232: case 0x24e: - case 0x1e8e: case 0x1ef2: case 0x1ef6: case 0x1ef4: case 0x1ef8: + case 'Y': + case 0xdd: + case 0x176: + case 0x178: + case 0x1b3: + case 0x232: + case 0x24e: + case 0x1e8e: + case 0x1ef2: + case 0x1ef6: + case 0x1ef4: + case 0x1ef8: regmbc('Y'); regmbc(0xdd); regmbc(0x176); regmbc(0x178); regmbc(0x1b3); regmbc(0x232); regmbc(0x24e); regmbc(0x1e8e); regmbc(0x1ef2); regmbc(0x1ef4); regmbc(0x1ef6); regmbc(0x1ef8); return; - case 'Z': case 0x179: case 0x17b: case 0x17d: case 0x1b5: - case 0x1e90: case 0x1e92: case 0x1e94: case 0x2c6b: + case 'Z': + case 0x179: + case 0x17b: + case 0x17d: + case 0x1b5: + case 0x1e90: + case 0x1e92: + case 0x1e94: + case 0x2c6b: regmbc('Z'); regmbc(0x179); regmbc(0x17b); regmbc(0x17d); regmbc(0x1b5); regmbc(0x1e90); regmbc(0x1e92); regmbc(0x1e94); regmbc(0x2c6b); return; - case 'a': case 0xe0: case 0xe1: case 0xe2: - case 0xe3: case 0xe4: case 0xe5: case 0x101: case 0x103: - case 0x105: case 0x1ce: case 0x1df: case 0x1e1: case 0x1fb: - case 0x201: case 0x203: case 0x227: case 0x1d8f: case 0x1e01: - case 0x1e9a: case 0x1ea1: case 0x1ea3: case 0x1ea5: - case 0x1ea7: case 0x1ea9: case 0x1eab: case 0x1ead: - case 0x1eaf: case 0x1eb1: case 0x1eb3: case 0x1eb5: - case 0x1eb7: case 0x2c65: + case 'a': + case 0xe0: + case 0xe1: + case 0xe2: + case 0xe3: + case 0xe4: + case 0xe5: + case 0x101: + case 0x103: + case 0x105: + case 0x1ce: + case 0x1df: + case 0x1e1: + case 0x1fb: + case 0x201: + case 0x203: + case 0x227: + case 0x1d8f: + case 0x1e01: + case 0x1e9a: + case 0x1ea1: + case 0x1ea3: + case 0x1ea5: + case 0x1ea7: + case 0x1ea9: + case 0x1eab: + case 0x1ead: + case 0x1eaf: + case 0x1eb1: + case 0x1eb3: + case 0x1eb5: + case 0x1eb7: + case 0x2c65: regmbc('a'); regmbc(0xe0); regmbc(0xe1); regmbc(0xe2); regmbc(0xe3); regmbc(0xe4); regmbc(0xe5); regmbc(0x101); regmbc(0x103); @@ -775,36 +1024,80 @@ static void reg_equi_class(int c) regmbc(0x1eaf); regmbc(0x1eb1); regmbc(0x1eb3); regmbc(0x1eb5); regmbc(0x1eb7); regmbc(0x2c65); return; - case 'b': case 0x180: case 0x253: case 0x1d6c: case 0x1d80: - case 0x1e03: case 0x1e05: case 0x1e07: + case 'b': + case 0x180: + case 0x253: + case 0x1d6c: + case 0x1d80: + case 0x1e03: + case 0x1e05: + case 0x1e07: regmbc('b'); regmbc(0x180); regmbc(0x253); regmbc(0x1d6c); regmbc(0x1d80); regmbc(0x1e03); regmbc(0x1e05); regmbc(0x1e07); return; - case 'c': case 0xe7: - case 0x107: case 0x109: case 0x10b: case 0x10d: case 0x188: - case 0x23c: case 0x1e09: case 0xa793: case 0xa794: + case 'c': + case 0xe7: + case 0x107: + case 0x109: + case 0x10b: + case 0x10d: + case 0x188: + case 0x23c: + case 0x1e09: + case 0xa793: + case 0xa794: regmbc('c'); regmbc(0xe7); regmbc(0x107); regmbc(0x109); regmbc(0x10b); regmbc(0x10d); regmbc(0x188); regmbc(0x23c); regmbc(0x1e09); regmbc(0xa793); regmbc(0xa794); return; - case 'd': case 0x10f: case 0x111: case 0x257: case 0x1d6d: - case 0x1d81: case 0x1d91: case 0x1e0b: case 0x1e0d: - case 0x1e0f: case 0x1e11: case 0x1e13: + case 'd': + case 0x10f: + case 0x111: + case 0x257: + case 0x1d6d: + case 0x1d81: + case 0x1d91: + case 0x1e0b: + case 0x1e0d: + case 0x1e0f: + case 0x1e11: + case 0x1e13: regmbc('d'); regmbc(0x10f); regmbc(0x111); regmbc(0x257); regmbc(0x1d6d); regmbc(0x1d81); regmbc(0x1d91); regmbc(0x1e0b); regmbc(0x1e0d); regmbc(0x1e0f); regmbc(0x1e11); regmbc(0x1e13); return; - case 'e': case 0xe8: case 0xe9: case 0xea: case 0xeb: - case 0x113: case 0x115: case 0x117: case 0x119: - case 0x11b: case 0x205: case 0x207: case 0x229: - case 0x247: case 0x1d92: case 0x1e15: case 0x1e17: - case 0x1e19: case 0x1e1b: case 0x1eb9: case 0x1ebb: - case 0x1e1d: case 0x1ebd: case 0x1ebf: case 0x1ec1: - case 0x1ec3: case 0x1ec5: case 0x1ec7: + case 'e': + case 0xe8: + case 0xe9: + case 0xea: + case 0xeb: + case 0x113: + case 0x115: + case 0x117: + case 0x119: + case 0x11b: + case 0x205: + case 0x207: + case 0x229: + case 0x247: + case 0x1d92: + case 0x1e15: + case 0x1e17: + case 0x1e19: + case 0x1e1b: + case 0x1eb9: + case 0x1ebb: + case 0x1e1d: + case 0x1ebd: + case 0x1ebf: + case 0x1ec1: + case 0x1ec3: + case 0x1ec5: + case 0x1ec7: regmbc('e'); regmbc(0xe8); regmbc(0xe9); regmbc(0xea); regmbc(0xeb); regmbc(0x113); regmbc(0x115); regmbc(0x117); regmbc(0x119); @@ -816,31 +1109,66 @@ static void reg_equi_class(int c) regmbc(0x1ec1); regmbc(0x1ec3); regmbc(0x1ec5); regmbc(0x1ec7); return; - case 'f': case 0x192: case 0x1d6e: case 0x1d82: - case 0x1e1f: case 0xa799: + case 'f': + case 0x192: + case 0x1d6e: + case 0x1d82: + case 0x1e1f: + case 0xa799: regmbc('f'); regmbc(0x192); regmbc(0x1d6e); regmbc(0x1d82); regmbc(0x1e1f); regmbc(0xa799); return; - case 'g': case 0x11d: case 0x11f: case 0x121: case 0x123: - case 0x1e5: case 0x1e7: case 0x260: case 0x1f5: case 0x1d83: - case 0x1e21: case 0xa7a1: + case 'g': + case 0x11d: + case 0x11f: + case 0x121: + case 0x123: + case 0x1e5: + case 0x1e7: + case 0x260: + case 0x1f5: + case 0x1d83: + case 0x1e21: + case 0xa7a1: regmbc('g'); regmbc(0x11d); regmbc(0x11f); regmbc(0x121); regmbc(0x123); regmbc(0x1e5); regmbc(0x1e7); regmbc(0x1f5); regmbc(0x260); regmbc(0x1d83); regmbc(0x1e21); regmbc(0xa7a1); return; - case 'h': case 0x125: case 0x127: case 0x21f: case 0x1e23: - case 0x1e25: case 0x1e27: case 0x1e29: case 0x1e2b: - case 0x1e96: case 0x2c68: case 0xa795: + case 'h': + case 0x125: + case 0x127: + case 0x21f: + case 0x1e23: + case 0x1e25: + case 0x1e27: + case 0x1e29: + case 0x1e2b: + case 0x1e96: + case 0x2c68: + case 0xa795: regmbc('h'); regmbc(0x125); regmbc(0x127); regmbc(0x21f); regmbc(0x1e23); regmbc(0x1e25); regmbc(0x1e27); regmbc(0x1e29); regmbc(0x1e2b); regmbc(0x1e96); regmbc(0x2c68); regmbc(0xa795); return; - case 'i': case 0xec: case 0xed: case 0xee: case 0xef: - case 0x129: case 0x12b: case 0x12d: case 0x12f: - case 0x1d0: case 0x209: case 0x20b: case 0x268: - case 0x1d96: case 0x1e2d: case 0x1e2f: case 0x1ec9: + case 'i': + case 0xec: + case 0xed: + case 0xee: + case 0xef: + case 0x129: + case 0x12b: + case 0x12d: + case 0x12f: + case 0x1d0: + case 0x209: + case 0x20b: + case 0x268: + case 0x1d96: + case 0x1e2d: + case 0x1e2f: + case 0x1ec9: case 0x1ecb: regmbc('i'); regmbc(0xec); regmbc(0xed); regmbc(0xee); regmbc(0xef); regmbc(0x129); @@ -849,33 +1177,66 @@ static void reg_equi_class(int c) regmbc(0x268); regmbc(0x1d96); regmbc(0x1e2d); regmbc(0x1e2f); regmbc(0x1ec9); regmbc(0x1ecb); return; - case 'j': case 0x135: case 0x1f0: case 0x249: + case 'j': + case 0x135: + case 0x1f0: + case 0x249: regmbc('j'); regmbc(0x135); regmbc(0x1f0); regmbc(0x249); return; - case 'k': case 0x137: case 0x199: case 0x1e9: - case 0x1d84: case 0x1e31: case 0x1e33: case 0x1e35: - case 0x2c6a: case 0xa741: + case 'k': + case 0x137: + case 0x199: + case 0x1e9: + case 0x1d84: + case 0x1e31: + case 0x1e33: + case 0x1e35: + case 0x2c6a: + case 0xa741: regmbc('k'); regmbc(0x137); regmbc(0x199); regmbc(0x1e9); regmbc(0x1d84); regmbc(0x1e31); regmbc(0x1e33); regmbc(0x1e35); regmbc(0x2c6a); regmbc(0xa741); return; - case 'l': case 0x13a: case 0x13c: case 0x13e: - case 0x140: case 0x142: case 0x19a: case 0x1e37: - case 0x1e39: case 0x1e3b: case 0x1e3d: case 0x2c61: + case 'l': + case 0x13a: + case 0x13c: + case 0x13e: + case 0x140: + case 0x142: + case 0x19a: + case 0x1e37: + case 0x1e39: + case 0x1e3b: + case 0x1e3d: + case 0x2c61: regmbc('l'); regmbc(0x13a); regmbc(0x13c); regmbc(0x13e); regmbc(0x140); regmbc(0x142); regmbc(0x19a); regmbc(0x1e37); regmbc(0x1e39); regmbc(0x1e3b); regmbc(0x1e3d); regmbc(0x2c61); return; - case 'm': case 0x1d6f: case 0x1e3f: case 0x1e41: case 0x1e43: + case 'm': + case 0x1d6f: + case 0x1e3f: + case 0x1e41: + case 0x1e43: regmbc('m'); regmbc(0x1d6f); regmbc(0x1e3f); regmbc(0x1e41); regmbc(0x1e43); return; - case 'n': case 0xf1: case 0x144: case 0x146: case 0x148: - case 0x149: case 0x1f9: case 0x1d70: case 0x1d87: - case 0x1e45: case 0x1e47: case 0x1e49: case 0x1e4b: + case 'n': + case 0xf1: + case 0x144: + case 0x146: + case 0x148: + case 0x149: + case 0x1f9: + case 0x1d70: + case 0x1d87: + case 0x1e45: + case 0x1e47: + case 0x1e49: + case 0x1e4b: case 0xa7a5: regmbc('n'); regmbc(0xf1); regmbc(0x144); regmbc(0x146); regmbc(0x148); regmbc(0x149); @@ -883,15 +1244,44 @@ static void reg_equi_class(int c) regmbc(0x1e45); regmbc(0x1e47); regmbc(0x1e49); regmbc(0x1e4b); regmbc(0xa7a5); return; - case 'o': case 0xf2: case 0xf3: case 0xf4: case 0xf5: - case 0xf6: case 0xf8: case 0x14d: case 0x14f: case 0x151: - case 0x1a1: case 0x1d2: case 0x1eb: case 0x1ed: case 0x1ff: - case 0x20d: case 0x20f: case 0x22b: case 0x22d: case 0x22f: - case 0x231: case 0x275: case 0x1e4d: case 0x1e4f: - case 0x1e51: case 0x1e53: case 0x1ecd: case 0x1ecf: - case 0x1ed1: case 0x1ed3: case 0x1ed5: case 0x1ed7: - case 0x1ed9: case 0x1edb: case 0x1edd: case 0x1edf: - case 0x1ee1: case 0x1ee3: + case 'o': + case 0xf2: + case 0xf3: + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf8: + case 0x14d: + case 0x14f: + case 0x151: + case 0x1a1: + case 0x1d2: + case 0x1eb: + case 0x1ed: + case 0x1ff: + case 0x20d: + case 0x20f: + case 0x22b: + case 0x22d: + case 0x22f: + case 0x231: + case 0x275: + case 0x1e4d: + case 0x1e4f: + case 0x1e51: + case 0x1e53: + case 0x1ecd: + case 0x1ecf: + case 0x1ed1: + case 0x1ed3: + case 0x1ed5: + case 0x1ed7: + case 0x1ed9: + case 0x1edb: + case 0x1edd: + case 0x1edf: + case 0x1ee1: + case 0x1ee3: regmbc('o'); regmbc(0xf2); regmbc(0xf3); regmbc(0xf4); regmbc(0xf5); regmbc(0xf6); regmbc(0xf8); regmbc(0x14d); regmbc(0x14f); @@ -906,18 +1296,37 @@ static void reg_equi_class(int c) regmbc(0x1edb); regmbc(0x1edd); regmbc(0x1edf); regmbc(0x1ee1); regmbc(0x1ee3); return; - case 'p': case 0x1a5: case 0x1d71: case 0x1d88: case 0x1d7d: - case 0x1e55: case 0x1e57: + case 'p': + case 0x1a5: + case 0x1d71: + case 0x1d88: + case 0x1d7d: + case 0x1e55: + case 0x1e57: regmbc('p'); regmbc(0x1a5); regmbc(0x1d71); regmbc(0x1d7d); regmbc(0x1d88); regmbc(0x1e55); regmbc(0x1e57); return; - case 'q': case 0x24b: case 0x2a0: + case 'q': + case 0x24b: + case 0x2a0: regmbc('q'); regmbc(0x24b); regmbc(0x2a0); return; - case 'r': case 0x155: case 0x157: case 0x159: case 0x211: - case 0x213: case 0x24d: case 0x27d: case 0x1d72: case 0x1d73: - case 0x1d89: case 0x1e59: case 0x1e5b: case 0x1e5d: case 0x1e5f: + case 'r': + case 0x155: + case 0x157: + case 0x159: + case 0x211: + case 0x213: + case 0x24d: + case 0x27d: + case 0x1d72: + case 0x1d73: + case 0x1d89: + case 0x1e59: + case 0x1e5b: + case 0x1e5d: + case 0x1e5f: case 0xa7a7: regmbc('r'); regmbc(0x155); regmbc(0x157); regmbc(0x159); regmbc(0x211); regmbc(0x213); @@ -926,32 +1335,81 @@ static void reg_equi_class(int c) regmbc(0x1e5b); regmbc(0x1e5d); regmbc(0x1e5f); regmbc(0xa7a7); return; - case 's': case 0x15b: case 0x15d: case 0x15f: case 0x161: - case 0x1e61: case 0x219: case 0x23f: case 0x1d74: case 0x1d8a: - case 0x1e63: case 0x1e65: case 0x1e67: case 0x1e69: case 0xa7a9: + case 's': + case 0x15b: + case 0x15d: + case 0x15f: + case 0x161: + case 0x1e61: + case 0x219: + case 0x23f: + case 0x1d74: + case 0x1d8a: + case 0x1e63: + case 0x1e65: + case 0x1e67: + case 0x1e69: + case 0xa7a9: regmbc('s'); regmbc(0x15b); regmbc(0x15d); regmbc(0x15f); regmbc(0x161); regmbc(0x23f); regmbc(0x219); regmbc(0x1d74); regmbc(0x1d8a); regmbc(0x1e61); regmbc(0x1e63); regmbc(0x1e65); regmbc(0x1e67); regmbc(0x1e69); regmbc(0xa7a9); return; - case 't': case 0x163: case 0x165: case 0x167: case 0x1ab: - case 0x1ad: case 0x21b: case 0x288: case 0x1d75: case 0x1e6b: - case 0x1e6d: case 0x1e6f: case 0x1e71: case 0x1e97: case 0x2c66: + case 't': + case 0x163: + case 0x165: + case 0x167: + case 0x1ab: + case 0x1ad: + case 0x21b: + case 0x288: + case 0x1d75: + case 0x1e6b: + case 0x1e6d: + case 0x1e6f: + case 0x1e71: + case 0x1e97: + case 0x2c66: regmbc('t'); regmbc(0x163); regmbc(0x165); regmbc(0x167); regmbc(0x1ab); regmbc(0x21b); regmbc(0x1ad); regmbc(0x288); regmbc(0x1d75); regmbc(0x1e6b); regmbc(0x1e6d); regmbc(0x1e6f); regmbc(0x1e71); regmbc(0x1e97); regmbc(0x2c66); return; - case 'u': case 0xf9: case 0xfa: case 0xfb: case 0xfc: - case 0x169: case 0x16b: case 0x16d: case 0x16f: - case 0x171: case 0x173: case 0x1b0: case 0x1d4: - case 0x1d6: case 0x1d8: case 0x1da: case 0x1dc: - case 0x215: case 0x217: case 0x289: case 0x1e73: - case 0x1d7e: case 0x1d99: case 0x1e75: case 0x1e77: - case 0x1e79: case 0x1e7b: case 0x1ee5: case 0x1ee7: - case 0x1ee9: case 0x1eeb: case 0x1eed: case 0x1eef: + case 'u': + case 0xf9: + case 0xfa: + case 0xfb: + case 0xfc: + case 0x169: + case 0x16b: + case 0x16d: + case 0x16f: + case 0x171: + case 0x173: + case 0x1b0: + case 0x1d4: + case 0x1d6: + case 0x1d8: + case 0x1da: + case 0x1dc: + case 0x215: + case 0x217: + case 0x289: + case 0x1e73: + case 0x1d7e: + case 0x1d99: + case 0x1e75: + case 0x1e77: + case 0x1e79: + case 0x1e7b: + case 0x1ee5: + case 0x1ee7: + case 0x1ee9: + case 0x1eeb: + case 0x1eed: + case 0x1eef: case 0x1ef1: regmbc('u'); regmbc(0xf9); regmbc(0xfa); regmbc(0xfb); regmbc(0xfc); regmbc(0x169); @@ -966,31 +1424,61 @@ static void reg_equi_class(int c) regmbc(0x1eeb); regmbc(0x1eed); regmbc(0x1eef); regmbc(0x1ef1); return; - case 'v': case 0x28b: case 0x1d8c: case 0x1e7d: case 0x1e7f: + case 'v': + case 0x28b: + case 0x1d8c: + case 0x1e7d: + case 0x1e7f: regmbc('v'); regmbc(0x28b); regmbc(0x1d8c); regmbc(0x1e7d); regmbc(0x1e7f); return; - case 'w': case 0x175: case 0x1e81: case 0x1e83: - case 0x1e85: case 0x1e87: case 0x1e89: case 0x1e98: + case 'w': + case 0x175: + case 0x1e81: + case 0x1e83: + case 0x1e85: + case 0x1e87: + case 0x1e89: + case 0x1e98: regmbc('w'); regmbc(0x175); regmbc(0x1e81); regmbc(0x1e83); regmbc(0x1e85); regmbc(0x1e87); regmbc(0x1e89); regmbc(0x1e98); return; - case 'x': case 0x1e8b: case 0x1e8d: + case 'x': + case 0x1e8b: + case 0x1e8d: regmbc('x'); regmbc(0x1e8b); regmbc(0x1e8d); return; - case 'y': case 0xfd: case 0xff: case 0x177: case 0x1b4: - case 0x233: case 0x24f: case 0x1e8f: case 0x1e99: case 0x1ef3: - case 0x1ef5: case 0x1ef7: case 0x1ef9: + case 'y': + case 0xfd: + case 0xff: + case 0x177: + case 0x1b4: + case 0x233: + case 0x24f: + case 0x1e8f: + case 0x1e99: + case 0x1ef3: + case 0x1ef5: + case 0x1ef7: + case 0x1ef9: regmbc('y'); regmbc(0xfd); regmbc(0xff); regmbc(0x177); regmbc(0x1b4); regmbc(0x233); regmbc(0x24f); regmbc(0x1e8f); regmbc(0x1e99); regmbc(0x1ef3); regmbc(0x1ef5); regmbc(0x1ef7); regmbc(0x1ef9); return; - case 'z': case 0x17a: case 0x17c: case 0x17e: case 0x1b6: - case 0x1d76: case 0x1d8e: case 0x1e91: case 0x1e93: - case 0x1e95: case 0x2c6c: + case 'z': + case 0x17a: + case 0x17c: + case 0x17e: + case 0x1b6: + case 0x1d76: + case 0x1d8e: + case 0x1e91: + case 0x1e93: + case 0x1e95: + case 0x2c6c: regmbc('z'); regmbc(0x17a); regmbc(0x17c); regmbc(0x17e); regmbc(0x1b6); regmbc(0x1d76); regmbc(0x1d8e); regmbc(0x1e91); regmbc(0x1e93); @@ -1002,19 +1490,18 @@ static void reg_equi_class(int c) } - /* * Emit a node. * Return pointer to generated code. */ static char_u *regnode(int op) { - char_u *ret; + char_u *ret; ret = regcode; - if (ret == JUST_CALC_SIZE) + if (ret == JUST_CALC_SIZE) { regsize += 3; - else { + } else { *regcode++ = op; *regcode++ = NUL; // Null "next" pointer. *regcode++ = NUL; @@ -1044,17 +1531,20 @@ static char_u *regnext(char_u *p) { int offset; - if (p == JUST_CALC_SIZE || reg_toolong) + if (p == JUST_CALC_SIZE || reg_toolong) { return NULL; + } offset = NEXT(p); - if (offset == 0) + if (offset == 0) { return NULL; + } - if (OP(p) == BACK) + if (OP(p) == BACK) { return p - offset; - else + } else { return p + offset; + } } // Set the next-pointer at the end of a node chain. @@ -1068,7 +1558,7 @@ static void regtail(char_u *p, char_u *val) // Find last node. char_u *scan = p; - for (;; ) { + for (;;) { char_u *temp = regnext(scan); if (temp == NULL) { break; @@ -1100,8 +1590,9 @@ static void regoptail(char_u *p, char_u *val) // When op is neither BRANCH nor BRACE_COMPLEX0-9, it is "operandless" if (p == NULL || p == JUST_CALC_SIZE || (OP(p) != BRANCH - && (OP(p) < BRACE_COMPLEX || OP(p) > BRACE_COMPLEX + 9))) + && (OP(p) < BRACE_COMPLEX || OP(p) > BRACE_COMPLEX + 9))) { return; + } regtail(OPERAND(p), val); } @@ -1113,9 +1604,9 @@ static void regoptail(char_u *p, char_u *val) */ static void reginsert(int op, char_u *opnd) { - char_u *src; - char_u *dst; - char_u *place; + char_u *src; + char_u *dst; + char_u *place; if (regcode == JUST_CALC_SIZE) { regsize += 3; @@ -1124,8 +1615,9 @@ static void reginsert(int op, char_u *opnd) src = regcode; regcode += 3; dst = regcode; - while (src > opnd) + while (src > opnd) { *--dst = *--src; + } place = opnd; // Op node, where operand used to be. *place++ = op; @@ -1139,9 +1631,9 @@ static void reginsert(int op, char_u *opnd) */ static void reginsert_nr(int op, long val, char_u *opnd) { - char_u *src; - char_u *dst; - char_u *place; + char_u *src; + char_u *dst; + char_u *place; if (regcode == JUST_CALC_SIZE) { regsize += 7; @@ -1150,8 +1642,9 @@ static void reginsert_nr(int op, long val, char_u *opnd) src = regcode; regcode += 7; dst = regcode; - while (src > opnd) + while (src > opnd) { *--dst = *--src; + } place = opnd; // Op node, where operand used to be. *place++ = op; @@ -1169,9 +1662,9 @@ static void reginsert_nr(int op, long val, char_u *opnd) */ static void reginsert_limits(int op, long minval, long maxval, char_u *opnd) { - char_u *src; - char_u *dst; - char_u *place; + char_u *src; + char_u *dst; + char_u *place; if (regcode == JUST_CALC_SIZE) { regsize += 11; @@ -1180,8 +1673,9 @@ static void reginsert_limits(int op, long minval, long maxval, char_u *opnd) src = regcode; regcode += 11; dst = regcode; - while (src > opnd) + while (src > opnd) { *--dst = *--src; + } place = opnd; // Op node, where operand used to be. *place++ = op; @@ -1201,15 +1695,15 @@ static void reginsert_limits(int op, long minval, long maxval, char_u *opnd) static int seen_endbrace(int refnum) { if (!had_endbrace[refnum]) { - char_u *p; + char_u *p; - // Trick: check if "@<=" or "@<!" follows, in which case - // the \1 can appear before the referenced match. - for (p = regparse; *p != NUL; p++) { - if (p[0] == '@' && p[1] == '<' && (p[2] == '!' || p[2] == '=')) { - break; - } + // Trick: check if "@<=" or "@<!" follows, in which case + // the \1 can appear before the referenced match. + for (p = regparse; *p != NUL; p++) { + if (p[0] == '@' && p[1] == '<' && (p[2] == '!' || p[2] == '=')) { + break; } + } if (*p == NUL) { emsg(_("E65: Illegal back reference")); @@ -1229,10 +1723,10 @@ static int seen_endbrace(int refnum) */ static char_u *regatom(int *flagp) { - char_u *ret; + char_u *ret; int flags; int c; - char_u *p; + char_u *p; int extra = 0; int save_prev_at_start = prev_at_start; @@ -1273,10 +1767,11 @@ static char_u *regatom(int *flagp) *flagp |= HASNL; // "\_[" is character range plus newline - if (c == '[') + if (c == '[') { goto collection; + } - // "\_x" is character class plus newline + // "\_x" is character class plus newline FALLTHROUGH; // Character classes. @@ -1307,9 +1802,10 @@ static char_u *regatom(int *flagp) case Magic('L'): case Magic('u'): case Magic('U'): - p = vim_strchr(classchars, no_Magic(c)); - if (p == NULL) + p = (char_u *)vim_strchr((char *)classchars, no_Magic(c)); + if (p == NULL) { EMSG_RET_NULL(_("E63: invalid use of \\_")); + } // When '.' is followed by a composing char ignore the dot, so that // the composing char is matched here. if (c == Magic('.') && utf_iscomposing(peekchr())) { @@ -1335,11 +1831,13 @@ static char_u *regatom(int *flagp) break; case Magic('('): - if (one_exactly) + if (one_exactly) { EMSG_ONE_RET_NULL; + } ret = reg(REG_PAREN, &flags); - if (ret == NULL) + if (ret == NULL) { return NULL; + } *flagp |= flags & (HASWIDTH | SPSTART | HASNL | HASLOOKBH); break; @@ -1347,8 +1845,9 @@ static char_u *regatom(int *flagp) case Magic('|'): case Magic('&'): case Magic(')'): - if (one_exactly) + if (one_exactly) { EMSG_ONE_RET_NULL; + } IEMSG_RET_NULL(_(e_internal)); // Supposed to be caught earlier. // NOTREACHED @@ -1365,20 +1864,23 @@ static char_u *regatom(int *flagp) case Magic('~'): // previous substitute pattern if (reg_prev_sub != NULL) { - char_u *lp; + char_u *lp; ret = regnode(EXACTLY); lp = reg_prev_sub; - while (*lp != NUL) + while (*lp != NUL) { regc(*lp++); + } regc(NUL); if (*reg_prev_sub != NUL) { *flagp |= HASWIDTH; - if ((lp - reg_prev_sub) == 1) + if ((lp - reg_prev_sub) == 1) { *flagp |= SIMPLE; + } } - } else + } else { EMSG_RET_NULL(_(e_nopresub)); + } break; case Magic('1'): @@ -1389,8 +1891,7 @@ static char_u *regatom(int *flagp) case Magic('6'): case Magic('7'): case Magic('8'): - case Magic('9'): - { + case Magic('9'): { int refnum; refnum = c - Magic('0'); @@ -1402,16 +1903,19 @@ static char_u *regatom(int *flagp) break; case Magic('z'): - { c = no_Magic(getchr()); switch (c) { - case '(': if ((reg_do_extmatch & REX_SET) == 0) + case '(': + if ((reg_do_extmatch & REX_SET) == 0) { EMSG_RET_NULL(_(e_z_not_allowed)); - if (one_exactly) + } + if (one_exactly) { EMSG_ONE_RET_NULL; + } ret = reg(REG_ZPAREN, &flags); - if (ret == NULL) + if (ret == NULL) { return NULL; + } *flagp |= flags & (HASWIDTH|SPSTART|HASNL|HASLOOKBH); re_has_z = REX_SET; break; @@ -1424,40 +1928,45 @@ static char_u *regatom(int *flagp) case '6': case '7': case '8': - case '9': if ((reg_do_extmatch & REX_USE) == 0) + case '9': + if ((reg_do_extmatch & REX_USE) == 0) { EMSG_RET_NULL(_(e_z1_not_allowed)); + } ret = regnode(ZREF + c - '0'); re_has_z = REX_USE; break; - case 's': ret = regnode(MOPEN + 0); + case 's': + ret = regnode(MOPEN + 0); if (!re_mult_next("\\zs")) { return NULL; } break; - case 'e': ret = regnode(MCLOSE + 0); + case 'e': + ret = regnode(MCLOSE + 0); if (!re_mult_next("\\ze")) { return NULL; } break; - default: EMSG_RET_NULL(_("E68: Invalid character after \\z")); + default: + EMSG_RET_NULL(_("E68: Invalid character after \\z")); } - } - break; + break; case Magic('%'): - { c = no_Magic(getchr()); switch (c) { // () without a back reference case '(': - if (one_exactly) + if (one_exactly) { EMSG_ONE_RET_NULL; + } ret = reg(REG_NPAREN, &flags); - if (ret == NULL) + if (ret == NULL) { return NULL; + } *flagp |= flags & (HASWIDTH | SPSTART | HASNL | HASLOOKBH); break; @@ -1486,18 +1995,20 @@ static char_u *regatom(int *flagp) // \%[abc]: Emit as a list of branches, all ending at the last // branch which matches nothing. case '[': - if (one_exactly) // doesn't nest + if (one_exactly) { // doesn't nest EMSG_ONE_RET_NULL; + } { - char_u *lastbranch; - char_u *lastnode = NULL; - char_u *br; + char_u *lastbranch; + char_u *lastnode = NULL; + char_u *br; ret = NULL; while ((c = getchr()) != ']') { - if (c == NUL) + if (c == NUL) { EMSG2_RET_NULL(_(e_missing_sb), - reg_magic == MAGIC_ALL); + reg_magic == MAGIC_ALL); + } br = regnode(BRANCH); if (ret == NULL) { ret = br; @@ -1516,9 +2027,10 @@ static char_u *regatom(int *flagp) return NULL; } } - if (ret == NULL) + if (ret == NULL) { EMSG2_RET_NULL(_(e_empty_sb), - reg_magic == MAGIC_ALL); + reg_magic == MAGIC_ALL); + } lastbranch = regnode(BRANCH); br = regnode(NOTHING); if (ret != JUST_CALC_SIZE) { @@ -1526,15 +2038,16 @@ static char_u *regatom(int *flagp) regtail(lastbranch, br); // connect all branches to the NOTHING // branch at the end - for (br = ret; br != lastnode; ) { + for (br = ret; br != lastnode;) { if (OP(br) == BRANCH) { regtail(br, lastbranch); if (reg_toolong) { return NULL; } br = OPERAND(br); - } else + } else { br = regnext(br); + } } } *flagp &= ~(HASWIDTH | SIMPLE); @@ -1550,12 +2063,18 @@ static char_u *regatom(int *flagp) int64_t i; switch (c) { - case 'd': i = getdecchrs(); break; - case 'o': i = getoctchrs(); break; - case 'x': i = gethexchrs(2); break; - case 'u': i = gethexchrs(4); break; - case 'U': i = gethexchrs(8); break; - default: i = -1; break; + case 'd': + i = getdecchrs(); break; + case 'o': + i = getoctchrs(); break; + case 'x': + i = gethexchrs(2); break; + case 'u': + i = gethexchrs(4); break; + case 'U': + i = gethexchrs(8); break; + default: + i = -1; break; } if (i < 0 || i > INT_MAX) { @@ -1599,9 +2118,9 @@ static char_u *regatom(int *flagp) // "\%'m", "\%<'m" and "\%>'m": Mark c = getchr(); ret = regnode(RE_MARK); - if (ret == JUST_CALC_SIZE) + if (ret == JUST_CALC_SIZE) { regsize += 2; - else { + } else { *regcode++ = c; *regcode++ = cmp; } @@ -1647,15 +2166,14 @@ static char_u *regatom(int *flagp) } EMSG2_RET_NULL(_("E71: Invalid character after %s%%"), - reg_magic == MAGIC_ALL); + reg_magic == MAGIC_ALL); } - } - break; + break; case Magic('['): collection: { - char_u *lp; + char_u *lp; // If there is no matching ']', we assume the '[' is a normal // character. This makes 'incsearch' and ":help [" work. @@ -1669,8 +2187,9 @@ collection: if (*regparse == '^') { // Complement of range. ret = regnode(ANYBUT + extra); regparse++; - } else + } else { ret = regnode(ANYOF + extra); + } // At the start ']' and '-' mean the literal character. if (*regparse == ']' || *regparse == '-') { @@ -1691,15 +2210,17 @@ collection: } else { // Also accept "a-[.z.]" endc = 0; - if (*regparse == '[') + if (*regparse == '[') { endc = get_coll_element(®parse); + } if (endc == 0) { endc = mb_ptr2char_adv((const char_u **)®parse); } // Handle \o40, \x20 and \u20AC style sequences - if (endc == '\\' && !reg_cpo_lit) + if (endc == '\\' && !reg_cpo_lit) { endc = coll_get_char(); + } if (startc > endc) { EMSG_RET_NULL(_(e_reverse_range)); @@ -1714,8 +2235,9 @@ collection: regmbc(startc); } } else { - while (++startc <= endc) + while (++startc <= endc) { regc(startc); + } } startc = -1; } @@ -1727,7 +2249,7 @@ collection: && (vim_strchr(REGEXP_INRANGE, regparse[1]) != NULL || (!reg_cpo_lit && vim_strchr(REGEXP_ABBR, - regparse[1]) != NULL))) { + regparse[1]) != NULL))) { regparse++; if (*regparse == 'n') { // '\n' in range: also match NL @@ -1748,10 +2270,11 @@ collection: || *regparse == 'u' || *regparse == 'U') { startc = coll_get_char(); - if (startc == 0) + if (startc == 0) { regc(0x0a); - else + } else { regmbc(startc); + } } else { startc = backslash_trans(*regparse++); regc(startc); @@ -1840,8 +2363,9 @@ collection: } break; case CLASS_SPACE: - for (cu = 9; cu <= 13; cu++) + for (cu = 9; cu <= 13; cu++) { regc(cu); + } regc(' '); break; case CLASS_UPPER: @@ -1908,18 +2432,19 @@ collection: } regc(NUL); prevchr_len = 1; // last char was the ']' - if (*regparse != ']') + if (*regparse != ']') { EMSG_RET_NULL(_(e_toomsbra)); // Cannot happen? + } skipchr(); // let's be friends with the lexer again *flagp |= HASWIDTH | SIMPLE; break; - } else if (reg_strict) + } else if (reg_strict) { EMSG2_RET_NULL(_(e_missingbracket), reg_magic > MAGIC_OFF); + } } FALLTHROUGH; - default: - { + default: { int len; // A multi-byte character is handled as a separate atom if it's @@ -1952,7 +2477,7 @@ do_multibyte: int l; // Need to get composing character too. - for (;; ) { + for (;;) { l = utf_ptr2len((char *)regparse); if (!utf_composinglike(regparse, regparse + l)) { break; @@ -1968,8 +2493,9 @@ do_multibyte: regc(NUL); *flagp |= HASWIDTH; - if (len == 1) + if (len == 1) { *flagp |= SIMPLE; + } } break; } @@ -1996,8 +2522,9 @@ static char_u *regpiece(int *flagp) long maxval; ret = regatom(&flags); - if (ret == NULL) + if (ret == NULL) { return NULL; + } op = peekchr(); if (re_multi_type(op) == NOT_MULTI) { @@ -2010,9 +2537,9 @@ static char_u *regpiece(int *flagp) skipchr(); switch (op) { case Magic('*'): - if (flags & SIMPLE) + if (flags & SIMPLE) { reginsert(STAR, ret); - else { + } else { // Emit x* as (x&|), where & means "self". reginsert(BRANCH, ret); // Either x regoptail(ret, regnode(BACK)); // and loop @@ -2023,9 +2550,9 @@ static char_u *regpiece(int *flagp) break; case Magic('+'): - if (flags & SIMPLE) + if (flags & SIMPLE) { reginsert(PLUS, ret); - else { + } else { // Emit x+ as x(&|), where & means "self". next = regnode(BRANCH); // Either regtail(ret, next); @@ -2036,23 +2563,29 @@ static char_u *regpiece(int *flagp) *flagp = (WORST | HASWIDTH | (flags & (HASNL | HASLOOKBH))); break; - case Magic('@'): - { + case Magic('@'): { int lop = END; int64_t nr = getdecchrs(); switch (no_Magic(getchr())) { - case '=': lop = MATCH; break; // \@= - case '!': lop = NOMATCH; break; // \@! - case '>': lop = SUBPAT; break; // \@> - case '<': switch (no_Magic(getchr())) { - case '=': lop = BEHIND; break; // \@<= - case '!': lop = NOBEHIND; break; // \@<! - } + case '=': + lop = MATCH; break; // \@= + case '!': + lop = NOMATCH; break; // \@! + case '>': + lop = SUBPAT; break; // \@> + case '<': + switch (no_Magic(getchr())) { + case '=': + lop = BEHIND; break; // \@<= + case '!': + lop = NOBEHIND; break; // \@<! + } } - if (lop == END) + if (lop == END) { EMSG2_RET_NULL(_("E59: invalid character after %s@"), - reg_magic == MAGIC_ALL); + reg_magic == MAGIC_ALL); + } // Look behind must match with behind_pos. if (lop == BEHIND || lop == NOBEHIND) { regtail(ret, regnode(BHPOS)); @@ -2060,11 +2593,13 @@ static char_u *regpiece(int *flagp) } regtail(ret, regnode(END)); // operand ends if (lop == BEHIND || lop == NOBEHIND) { - if (nr < 0) + if (nr < 0) { nr = 0; // no limit is same as zero limit + } reginsert_nr(lop, (uint32_t)nr, ret); - } else + } else { reginsert(lop, ret); + } break; } @@ -2079,23 +2614,26 @@ static char_u *regpiece(int *flagp) break; case Magic('{'): - if (!read_limits(&minval, &maxval)) + if (!read_limits(&minval, &maxval)) { return NULL; + } if (flags & SIMPLE) { reginsert(BRACE_SIMPLE, ret); reginsert_limits(BRACE_LIMITS, minval, maxval, ret); } else { - if (num_complex_braces >= 10) + if (num_complex_braces >= 10) { EMSG2_RET_NULL(_("E60: Too many complex %s{...}s"), - reg_magic == MAGIC_ALL); + reg_magic == MAGIC_ALL); + } reginsert(BRACE_COMPLEX + num_complex_braces, ret); regoptail(ret, regnode(BACK)); regoptail(ret, ret); reginsert_limits(BRACE_LIMITS, minval, maxval, ret); ++num_complex_braces; } - if (minval > 0 && maxval > 0) + if (minval > 0 && maxval > 0) { *flagp = (HASWIDTH | (flags & (HASNL | HASLOOKBH))); + } break; } if (re_multi_type(peekchr()) != NOT_MULTI) { @@ -2115,9 +2653,9 @@ static char_u *regpiece(int *flagp) */ static char_u *regconcat(int *flagp) { - char_u *first = NULL; - char_u *chain = NULL; - char_u *latest; + char_u *first = NULL; + char_u *chain = NULL; + char_u *latest; int flags; int cont = true; @@ -2165,21 +2703,25 @@ static char_u *regconcat(int *flagp) break; default: latest = regpiece(&flags); - if (latest == NULL || reg_toolong) + if (latest == NULL || reg_toolong) { return NULL; + } *flagp |= flags & (HASWIDTH | HASNL | HASLOOKBH); - if (chain == NULL) // First piece. + if (chain == NULL) { // First piece. *flagp |= flags & SPSTART; - else + } else { regtail(chain, latest); + } chain = latest; - if (first == NULL) + if (first == NULL) { first = latest; + } break; } } - if (first == NULL) // Loop ran zero times. + if (first == NULL) { // Loop ran zero times. first = regnode(NOTHING); + } return first; } @@ -2189,18 +2731,19 @@ static char_u *regconcat(int *flagp) */ static char_u *regbranch(int *flagp) { - char_u *ret; - char_u *chain = NULL; - char_u *latest; + char_u *ret; + char_u *chain = NULL; + char_u *latest; int flags; *flagp = WORST | HASNL; // Tentatively. ret = regnode(BRANCH); - for (;; ) { + for (;;) { latest = regconcat(&flags); - if (latest == NULL) + if (latest == NULL) { return NULL; + } // If one of the branches has width, the whole thing has. If one of // the branches anchors at start-of-line, the whole thing does. // If one of the branches uses look-behind, the whole thing does. @@ -2208,14 +2751,17 @@ static char_u *regbranch(int *flagp) // If one of the branches doesn't match a line-break, the whole thing // doesn't. *flagp &= ~HASNL | (flags & HASNL); - if (chain != NULL) + if (chain != NULL) { regtail(chain, latest); - if (peekchr() != Magic('&')) + } + if (peekchr() != Magic('&')) { break; + } skipchr(); regtail(latest, regnode(END)); // operand ends - if (reg_toolong) + if (reg_toolong) { break; + } reginsert(MATCH, latest); chain = latest; } @@ -2223,22 +2769,20 @@ static char_u *regbranch(int *flagp) return ret; } -/* - * Parse regular expression, i.e. main body or parenthesized thing. - * - * Caller must absorb opening parenthesis. - * - * Combining parenthesis handling with the base level of regular expression - * is a trifle forced, but the need to tie the tails of the branches to what - * follows makes it hard to avoid. - */ -static char_u *reg( - int paren, // REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN - int *flagp) +/// Parse regular expression, i.e. main body or parenthesized thing. +/// +/// Caller must absorb opening parenthesis. +/// +/// Combining parenthesis handling with the base level of regular expression +/// is a trifle forced, but the need to tie the tails of the branches to what +/// follows makes it hard to avoid. +/// +/// @param paren REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN +static char_u *reg(int paren, int *flagp) { - char_u *ret; - char_u *br; - char_u *ender; + char_u *ret; + char_u *br; + char_u *ender; int parno = 0; int flags; @@ -2246,73 +2790,83 @@ static char_u *reg( if (paren == REG_ZPAREN) { // Make a ZOPEN node. - if (regnzpar >= NSUBEXP) + if (regnzpar >= NSUBEXP) { EMSG_RET_NULL(_("E50: Too many \\z(")); + } parno = regnzpar; regnzpar++; ret = regnode(ZOPEN + parno); - } else if (paren == REG_PAREN) { + } else if (paren == REG_PAREN) { // Make a MOPEN node. - if (regnpar >= NSUBEXP) + if (regnpar >= NSUBEXP) { EMSG2_RET_NULL(_("E51: Too many %s("), reg_magic == MAGIC_ALL); + } parno = regnpar; ++regnpar; ret = regnode(MOPEN + parno); - } else if (paren == REG_NPAREN) { + } else if (paren == REG_NPAREN) { // Make a NOPEN node. ret = regnode(NOPEN); - } else + } else { ret = NULL; + } // Pick up the branches, linking them together. br = regbranch(&flags); - if (br == NULL) + if (br == NULL) { return NULL; - if (ret != NULL) + } + if (ret != NULL) { regtail(ret, br); // [MZ]OPEN -> first. - else + } else { ret = br; + } // If one of the branches can be zero-width, the whole thing can. // If one of the branches has * at start or matches a line-break, the // whole thing can. - if (!(flags & HASWIDTH)) + if (!(flags & HASWIDTH)) { *flagp &= ~HASWIDTH; + } *flagp |= flags & (SPSTART | HASNL | HASLOOKBH); while (peekchr() == Magic('|')) { skipchr(); br = regbranch(&flags); - if (br == NULL || reg_toolong) + if (br == NULL || reg_toolong) { return NULL; + } regtail(ret, br); // BRANCH -> BRANCH. - if (!(flags & HASWIDTH)) + if (!(flags & HASWIDTH)) { *flagp &= ~HASWIDTH; + } *flagp |= flags & (SPSTART | HASNL | HASLOOKBH); } // Make a closing node, and hook it on the end. - ender = regnode( - paren == REG_ZPAREN ? ZCLOSE + parno : - paren == REG_PAREN ? MCLOSE + parno : - paren == REG_NPAREN ? NCLOSE : END); + ender = regnode(paren == REG_ZPAREN ? ZCLOSE + parno : + paren == REG_PAREN ? MCLOSE + parno : + paren == REG_NPAREN ? NCLOSE : END); regtail(ret, ender); // Hook the tails of the branches to the closing node. - for (br = ret; br != NULL; br = regnext(br)) + for (br = ret; br != NULL; br = regnext(br)) { regoptail(br, ender); + } // Check for proper termination. if (paren != REG_NOPAREN && getchr() != Magic(')')) { - if (paren == REG_ZPAREN) + if (paren == REG_ZPAREN) { EMSG_RET_NULL(_("E52: Unmatched \\z(")); - else if (paren == REG_NPAREN) + } else if (paren == REG_NPAREN) { EMSG2_RET_NULL(_(e_unmatchedpp), reg_magic == MAGIC_ALL); - else + } else { EMSG2_RET_NULL(_(e_unmatchedp), reg_magic == MAGIC_ALL); + } } else if (paren == REG_NOPAREN && peekchr() != NUL) { - if (curchr == Magic(')')) + if (curchr == Magic(')')) { EMSG2_RET_NULL(_(e_unmatchedpar), reg_magic == MAGIC_ALL); - else + } else { EMSG_RET_NULL(_(e_trailing)); // "Can't happen". + } // NOTREACHED } // Here we set the flag allowing back references to this set of @@ -2347,8 +2901,8 @@ static char_u *reg( */ static regprog_T *bt_regcomp(char_u *expr, int re_flags) { - char_u *scan; - char_u *longest; + char_u *scan; + char_u *longest; int len; int flags; @@ -2362,8 +2916,9 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags) regcomp_start(expr, re_flags); regcode = JUST_CALC_SIZE; regc(REGMAGIC); - if (reg(REG_NOPAREN, &flags) == NULL) + if (reg(REG_NOPAREN, &flags) == NULL) { return NULL; + } // Allocate space. bt_regprog_T *r = xmalloc(sizeof(bt_regprog_T) + regsize); @@ -2375,8 +2930,9 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags) regc(REGMAGIC); if (reg(REG_NOPAREN, &flags) == NULL || reg_toolong) { xfree(r); - if (reg_toolong) + if (reg_toolong) { EMSG_RET_NULL(_("E339: Pattern too long")); + } return NULL; } @@ -2386,10 +2942,12 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags) r->regmust = NULL; r->regmlen = 0; r->regflags = regflags; - if (flags & HASNL) + if (flags & HASNL) { r->regflags |= RF_HASNL; - if (flags & HASLOOKBH) + } + if (flags & HASLOOKBH) { r->regflags |= RF_LOOKBH; + } // Remember whether this pattern has any \z specials in it. r->reghasz = re_has_z; scan = r->program + 1; // First BRANCH. @@ -2407,7 +2965,7 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags) } else if (OP(scan) == BOW || OP(scan) == EOW || OP(scan) == NOTHING - || OP(scan) == MOPEN + 0 || OP(scan) == NOPEN + || OP(scan) == MOPEN + 0 || OP(scan) == NOPEN || OP(scan) == MCLOSE + 0 || OP(scan) == NCLOSE) { char_u *regnext_scan = regnext(scan); if (OP(regnext_scan) == EXACTLY) { @@ -2428,11 +2986,12 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags) && !(flags & HASNL)) { longest = NULL; len = 0; - for (; scan != NULL; scan = regnext(scan)) + for (; scan != NULL; scan = regnext(scan)) { if (OP(scan) == EXACTLY && STRLEN(OPERAND(scan)) >= (size_t)len) { longest = OPERAND(scan); len = (int)STRLEN(OPERAND(scan)); } + } r->regmust = longest; r->regmlen = len; } @@ -2462,11 +3021,16 @@ static int coll_get_char(void) int64_t nr = -1; switch (*regparse++) { - case 'd': nr = getdecchrs(); break; - case 'o': nr = getoctchrs(); break; - case 'x': nr = gethexchrs(2); break; - case 'u': nr = gethexchrs(4); break; - case 'U': nr = gethexchrs(8); break; + case 'd': + nr = getdecchrs(); break; + case 'o': + nr = getoctchrs(); break; + case 'x': + nr = gethexchrs(2); break; + case 'u': + nr = gethexchrs(4); break; + case 'U': + nr = gethexchrs(8); break; } if (nr < 0 || nr > INT_MAX) { // If getting the number fails be backwards compatible: the character @@ -2492,8 +3056,8 @@ static void bt_regfree(regprog_T *prog) * to regmatch(), but they are here to reduce the amount of stack space used * (it can be called recursively many times). */ -static long bl_minval; -static long bl_maxval; +static long bl_minval; +static long bl_maxval; // Save the input line and position in a regsave_T. static void reg_save(regsave_T *save, garray_T *gap) @@ -2543,10 +3107,10 @@ static bool reg_save_equal(const regsave_T *save) // After a failed match restore the sub-expressions. #define restore_se(savep, posp, pp) { \ - if (REG_MULTI) \ - *(posp) = (savep)->se_u.pos; \ - else \ - *(pp) = (savep)->se_u.ptr; } + if (REG_MULTI) /* NOLINT(readability/braces) */ \ + *(posp) = (savep)->se_u.pos; \ + else /* NOLINT */ \ + *(pp) = (savep)->se_u.ptr; } /* * Tentatively set the sub-expression start to the current position (after @@ -2568,17 +3132,14 @@ static void save_se_one(save_se_T *savep, char_u **pp) *pp = rex.input; } -/* - * regrepeat - repeatedly match something simple, return how many. - * Advances rex.input (and rex.lnum) to just after the matched chars. - */ - static int -regrepeat( - char_u *p, - long maxcount) // maximum number of matches allowed +/// regrepeat - repeatedly match something simple, return how many. +/// Advances rex.input (and rex.lnum) to just after the matched chars. +/// +/// @param maxcount maximum number of matches allowed +static int regrepeat(char_u *p, long maxcount) { long count = 0; - char_u *opnd; + char_u *opnd; int mask; int testval = 0; @@ -2822,8 +3383,7 @@ do_class: mask = RI_UPPER; goto do_class; - case EXACTLY: - { + case EXACTLY: { int cu, cl; // This doesn't do a multi-byte character, because a MULTIBYTECODE @@ -2846,8 +3406,7 @@ do_class: break; } - case MULTIBYTECODE: - { + case MULTIBYTECODE: { int i, len, cf = 0; // Safety check (just in case 'encoding' was changed since @@ -2900,9 +3459,10 @@ do_class: } scan += len; } else { - if ((cstrchr(opnd, *scan) == NULL) == testval) + if ((cstrchr(opnd, *scan) == NULL) == testval) { break; - ++scan; + } + scan++; } ++count; } @@ -2944,7 +3504,7 @@ do_class: */ static regitem_T *regstack_push(regstate_T state, char_u *scan) { - regitem_T *rp; + regitem_T *rp; if ((long)((unsigned)regstack.ga_len >> 10) >= p_mmp) { emsg(_(e_maxmempat)); @@ -2965,7 +3525,7 @@ static regitem_T *regstack_push(regstate_T state, char_u *scan) */ static void regstack_pop(char_u **scan) { - regitem_T *rp; + regitem_T *rp; rp = (regitem_T *)((char *)regstack.ga_data + regstack.ga_len) - 1; *scan = rp->rs_scan; @@ -3021,19 +3581,20 @@ static void restore_subexpr(regbehind_T *bp) /// (that don't need to know whether the rest of the match failed) by a nested /// loop. /// -/// Returns true when there is a match. Leaves rex.input and rex.lnum -/// just after the last matched character. -/// Returns false when there is no match. Leaves rex.input and rex.lnum in an -/// undefined state! -static bool regmatch( - char_u *scan, // Current node. - proftime_T *tm, // timeout limit or NULL - int *timed_out) // flag set on timeout or NULL +/// @param scan Current node. +/// @param tm timeout limit or NULL +/// @param timed_out flag set on timeout or NULL +/// +/// @return - true when there is a match. Leaves rex.input and rex.lnum +/// just after the last matched character. +/// - false when there is no match. Leaves rex.input and rex.lnum in an +/// undefined state! +static bool regmatch(char_u *scan, proftime_T *tm, int *timed_out) { - char_u *next; // Next node. + char_u *next; // Next node. int op; int c; - regitem_T *rp; + regitem_T *rp; int no; int status; // one of the RA_ values: int tm_count = 0; @@ -3044,7 +3605,7 @@ static bool regmatch( backpos.ga_len = 0; // Repeat until "regstack" is empty. - for (;; ) { + for (;;) { // Some patterns may take a long time to match, e.g., "\([a-z]\+\)\+Q". // Allow interrupting them with CTRL-C. fast_breakcheck(); @@ -3058,7 +3619,7 @@ static bool regmatch( // Repeat for items that can be matched sequentially, without using the // regstack. - for (;; ) { + for (;;) { if (got_int || scan == NULL) { status = RA_FAIL; break; @@ -3086,8 +3647,9 @@ static bool regmatch( mch_errmsg(_("External submatches:\n")); for (i = 0; i < NSUBEXP; i++) { mch_errmsg(" \""); - if (re_extmatch_in->matches[i] != NULL) + if (re_extmatch_in->matches[i] != NULL) { mch_errmsg((char *)re_extmatch_in->matches[i]); + } mch_errmsg("\"\n"); } } @@ -3168,7 +3730,7 @@ static bool regmatch( status = RA_NOMATCH; } else { const colnr_T pos_col = pos->lnum == rex.lnum + rex.reg_firstlnum - && pos->col == MAXCOL + && pos->col == MAXCOL ? (colnr_T)STRLEN(reg_getline(pos->lnum - rex.reg_firstlnum)) : pos->col; @@ -3188,8 +3750,9 @@ static bool regmatch( break; case RE_VISUAL: - if (!reg_match_visual()) + if (!reg_match_visual()) { status = RA_NOMATCH; + } break; case RE_LNUM: @@ -3260,10 +3823,11 @@ static bool regmatch( break; case IDENT: - if (!vim_isIDc(c)) + if (!vim_isIDc(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case SIDENT: @@ -3324,135 +3888,152 @@ static bool regmatch( break; case WHITE: - if (!ascii_iswhite(c)) + if (!ascii_iswhite(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NWHITE: - if (c == NUL || ascii_iswhite(c)) + if (c == NUL || ascii_iswhite(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case DIGIT: - if (!ri_digit(c)) + if (!ri_digit(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NDIGIT: - if (c == NUL || ri_digit(c)) + if (c == NUL || ri_digit(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case HEX: - if (!ri_hex(c)) + if (!ri_hex(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NHEX: - if (c == NUL || ri_hex(c)) + if (c == NUL || ri_hex(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case OCTAL: - if (!ri_octal(c)) + if (!ri_octal(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NOCTAL: - if (c == NUL || ri_octal(c)) + if (c == NUL || ri_octal(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case WORD: - if (!ri_word(c)) + if (!ri_word(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NWORD: - if (c == NUL || ri_word(c)) + if (c == NUL || ri_word(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case HEAD: - if (!ri_head(c)) + if (!ri_head(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NHEAD: - if (c == NUL || ri_head(c)) + if (c == NUL || ri_head(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case ALPHA: - if (!ri_alpha(c)) + if (!ri_alpha(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NALPHA: - if (c == NUL || ri_alpha(c)) + if (c == NUL || ri_alpha(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case LOWER: - if (!ri_lower(c)) + if (!ri_lower(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NLOWER: - if (c == NUL || ri_lower(c)) + if (c == NUL || ri_lower(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case UPPER: - if (!ri_upper(c)) + if (!ri_upper(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; case NUPPER: - if (c == NUL || ri_upper(c)) + if (c == NUL || ri_upper(c)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; - case EXACTLY: - { + case EXACTLY: { int len; - char_u *opnd; + char_u *opnd; opnd = OPERAND(scan); // Inline the first byte, for speed. @@ -3492,29 +4073,29 @@ static bool regmatch( case ANYOF: case ANYBUT: - if (c == NUL) + if (c == NUL) { status = RA_NOMATCH; - else if ((cstrchr(OPERAND(scan), c) == NULL) == (op == ANYOF)) + } else if ((cstrchr(OPERAND(scan), c) == NULL) == (op == ANYOF)) { status = RA_NOMATCH; - else + } else { ADVANCE_REGINPUT(); + } break; - case MULTIBYTECODE: - { + case MULTIBYTECODE: { int i, len; const char_u *opnd = OPERAND(scan); - // Safety check (just in case 'encoding' was changed since - // compiling the program). + // Safety check (just in case 'encoding' was changed since + // compiling the program). if ((len = utfc_ptr2len((char *)opnd)) < 2) { status = RA_NOMATCH; break; } const int opndc = utf_ptr2char((char *)opnd); if (utf_iscomposing(opndc)) { - // When only a composing char is given match at any - // position where that composing char appears. + // When only a composing char is given match at any + // position where that composing char appears. status = RA_NOMATCH; for (i = 0; rex.input[i] != NUL; i += utf_ptr2len((char *)rex.input + i)) { @@ -3524,7 +4105,7 @@ static bool regmatch( break; } } else if (opndc == inpc) { - // Include all following composing chars. + // Include all following composing chars. len = i + utfc_ptr2len((char *)rex.input + i); status = RA_MATCH; break; @@ -3543,19 +4124,16 @@ static bool regmatch( break; case RE_COMPOSING: - { - // Skip composing characters. + // Skip composing characters. while (utf_iscomposing(utf_ptr2char((char *)rex.input))) { MB_CPTR_ADV(rex.input); } - } - break; + break; case NOTHING: break; - case BACK: - { + case BACK: { int i; // When we run into BACK we need to check if we don't keep @@ -3565,15 +4143,18 @@ static bool regmatch( // The positions are stored in "backpos" and found by the // current value of "scan", the position in the RE program. backpos_T *bp = (backpos_T *)backpos.ga_data; - for (i = 0; i < backpos.ga_len; ++i) - if (bp[i].bp_scan == scan) + for (i = 0; i < backpos.ga_len; i++) { + if (bp[i].bp_scan == scan) { break; + } + } if (i == backpos.ga_len) { backpos_T *p = GA_APPEND_VIA_PTR(backpos_T, &backpos); p->bp_scan = scan; - } else if (reg_save_equal(&bp[i].bp_pos)) + } else if (reg_save_equal(&bp[i].bp_pos)) { // Still at same position as last time, fail. status = RA_NOMATCH; + } assert(status != RA_FAIL); if (status != RA_NOMATCH) { @@ -3592,25 +4173,24 @@ static bool regmatch( case MOPEN + 7: case MOPEN + 8: case MOPEN + 9: - { no = op - MOPEN; cleanup_subexpr(); rp = regstack_push(RS_MOPEN, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = no; save_se(&rp->rs_un.sesave, &rex.reg_startpos[no], &rex.reg_startp[no]); // We simply continue and handle the result when done. } - } - break; + break; case NOPEN: // \%( case NCLOSE: // \) after \%( - if (regstack_push(RS_NOPEN, scan) == NULL) + if (regstack_push(RS_NOPEN, scan) == NULL) { status = RA_FAIL; + } // We simply continue and handle the result when done. break; @@ -3623,20 +4203,18 @@ static bool regmatch( case ZOPEN + 7: case ZOPEN + 8: case ZOPEN + 9: - { no = op - ZOPEN; cleanup_zsubexpr(); rp = regstack_push(RS_ZOPEN, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = no; save_se(&rp->rs_un.sesave, ®_startzpos[no], - ®_startzp[no]); + ®_startzp[no]); // We simply continue and handle the result when done. } - } - break; + break; case MCLOSE + 0: // Match end: \ze case MCLOSE + 1: // \) @@ -3648,7 +4226,6 @@ static bool regmatch( case MCLOSE + 7: case MCLOSE + 8: case MCLOSE + 9: - { no = op - MCLOSE; cleanup_subexpr(); rp = regstack_push(RS_MCLOSE, scan); @@ -3659,8 +4236,7 @@ static bool regmatch( save_se(&rp->rs_un.sesave, &rex.reg_endpos[no], &rex.reg_endp[no]); // We simply continue and handle the result when done. } - } - break; + break; case ZCLOSE + 1: // \) after \z( case ZCLOSE + 2: @@ -3671,20 +4247,18 @@ static bool regmatch( case ZCLOSE + 7: case ZCLOSE + 8: case ZCLOSE + 9: - { no = op - ZCLOSE; cleanup_zsubexpr(); rp = regstack_push(RS_ZCLOSE, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = no; save_se(&rp->rs_un.sesave, ®_endzpos[no], - ®_endzp[no]); + ®_endzp[no]); // We simply continue and handle the result when done. } - } - break; + break; case BACKREF + 1: case BACKREF + 2: @@ -3694,8 +4268,7 @@ static bool regmatch( case BACKREF + 6: case BACKREF + 7: case BACKREF + 8: - case BACKREF + 9: - { + case BACKREF + 9: { int len; no = op - BACKREF; @@ -3752,7 +4325,6 @@ static bool regmatch( case ZREF + 7: case ZREF + 8: case ZREF + 9: - { cleanup_zsubexpr(); no = op - ZREF; if (re_extmatch_in != NULL @@ -3766,25 +4338,22 @@ static bool regmatch( } else { // Backref was not set: Match an empty string. } - } - break; + break; case BRANCH: - { - if (OP(next) != BRANCH) // No choice. + if (OP(next) != BRANCH) { // No choice. next = OPERAND(scan); // Avoid recursion. - else { + } else { rp = regstack_push(RS_BRANCH, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else + } else { status = RA_BREAK; // rest is below + } } - } - break; + break; case BRACE_LIMITS: - { if (OP(next) == BRACE_SIMPLE) { bl_minval = OPERAND_MIN(scan); bl_maxval = OPERAND_MAX(scan); @@ -3798,8 +4367,7 @@ static bool regmatch( internal_error("BRACE_LIMITS"); status = RA_FAIL; } - } - break; + break; case BRACE_COMPLEX + 0: case BRACE_COMPLEX + 1: @@ -3811,7 +4379,6 @@ static bool regmatch( case BRACE_COMPLEX + 7: case BRACE_COMPLEX + 8: case BRACE_COMPLEX + 9: - { no = op - BRACE_COMPLEX; ++brace_count[no]; @@ -3819,9 +4386,9 @@ static bool regmatch( if (brace_count[no] <= (brace_min[no] <= brace_max[no] ? brace_min[no] : brace_max[no])) { rp = regstack_push(RS_BRCPLX_MORE, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = no; reg_save(&rp->rs_un.regsave, &backpos); next = OPERAND(scan); @@ -3835,9 +4402,9 @@ static bool regmatch( // Range is the normal way around, use longest match if (brace_count[no] <= brace_max[no]) { rp = regstack_push(RS_BRCPLX_LONG, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = no; reg_save(&rp->rs_un.regsave, &backpos); next = OPERAND(scan); @@ -3848,21 +4415,19 @@ static bool regmatch( // Range is backwards, use shortest match first if (brace_count[no] <= brace_min[no]) { rp = regstack_push(RS_BRCPLX_SHORT, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { reg_save(&rp->rs_un.regsave, &backpos); // We continue and handle the result when done. } } } - } - break; + break; case BRACE_SIMPLE: case STAR: - case PLUS: - { + case PLUS: { regstar_T rst; // Lookahead to avoid useless match attempts when we know @@ -3910,18 +4475,17 @@ static bool regmatch( } else { ga_grow(®stack, sizeof(regstar_T)); regstack.ga_len += sizeof(regstar_T); - rp = regstack_push(rst.minval <= rst.maxval - ? RS_STAR_LONG : RS_STAR_SHORT, scan); - if (rp == NULL) + rp = regstack_push(rst.minval <= rst.maxval ? RS_STAR_LONG : RS_STAR_SHORT, scan); + if (rp == NULL) { status = RA_FAIL; - else { + } else { *(((regstar_T *)rp) - 1) = rst; status = RA_BREAK; // skip the restore bits } } - } else + } else { status = RA_NOMATCH; - + } } break; @@ -3929,9 +4493,9 @@ static bool regmatch( case MATCH: case SUBPAT: rp = regstack_push(RS_NOMATCH, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { rp->rs_no = op; reg_save(&rp->rs_un.regsave, &backpos); next = OPERAND(scan); @@ -3949,9 +4513,9 @@ static bool regmatch( ga_grow(®stack, sizeof(regbehind_T)); regstack.ga_len += sizeof(regbehind_T); rp = regstack_push(RS_BEHIND1, scan); - if (rp == NULL) + if (rp == NULL) { status = RA_FAIL; - else { + } else { // Need to save the subexpr to be able to restore them // when there is a match but we don't use it. save_subexpr(((regbehind_T *)rp) - 1); @@ -4001,13 +4565,13 @@ static bool regmatch( } // If we can't continue sequentially, break the inner loop. - if (status != RA_CONT) + if (status != RA_CONT) { break; + } // Continue in inner loop, advance to next item. scan = next; - - } // end of inner loop + } // end of inner loop // If there is something on the regstack execute the code for the state. // If the state is popped then loop and use the older state. @@ -4030,9 +4594,10 @@ static bool regmatch( case RS_ZOPEN: // Pop the state. Restore pointers when there is no match. - if (status == RA_NOMATCH) + if (status == RA_NOMATCH) { restore_se(&rp->rs_un.sesave, ®_startzpos[rp->rs_no], - ®_startzp[rp->rs_no]); + ®_startzp[rp->rs_no]); + } regstack_pop(&scan); break; @@ -4047,17 +4612,18 @@ static bool regmatch( case RS_ZCLOSE: // Pop the state. Restore pointers when there is no match. - if (status == RA_NOMATCH) + if (status == RA_NOMATCH) { restore_se(&rp->rs_un.sesave, ®_endzpos[rp->rs_no], - ®_endzp[rp->rs_no]); + ®_endzp[rp->rs_no]); + } regstack_pop(&scan); break; case RS_BRANCH: - if (status == RA_MATCH) + if (status == RA_MATCH) { // this branch matched, use it regstack_pop(&scan); - else { + } else { if (status != RA_BREAK) { // After a non-matching branch: try next one. reg_restore(&rp->rs_un.regsave, &backpos); @@ -4095,15 +4661,17 @@ static bool regmatch( status = RA_CONT; } regstack_pop(&scan); - if (status == RA_CONT) + if (status == RA_CONT) { scan = regnext(scan); + } break; case RS_BRCPLX_SHORT: // Pop the state. Restore pointers when there is no match. - if (status == RA_NOMATCH) + if (status == RA_NOMATCH) { // There was no match, try to match one more item. reg_restore(&rp->rs_un.regsave, &backpos); + } regstack_pop(&scan); if (status == RA_NOMATCH) { scan = OPERAND(scan); @@ -4115,16 +4683,18 @@ static bool regmatch( // Pop the state. If the operand matches for NOMATCH or // doesn't match for MATCH/SUBPAT, we fail. Otherwise backup, // except for SUBPAT, and continue with the next item. - if (status == (rp->rs_no == NOMATCH ? RA_MATCH : RA_NOMATCH)) + if (status == (rp->rs_no == NOMATCH ? RA_MATCH : RA_NOMATCH)) { status = RA_NOMATCH; - else { + } else { status = RA_CONT; - if (rp->rs_no != SUBPAT) // zero-width + if (rp->rs_no != SUBPAT) { // zero-width reg_restore(&rp->rs_un.regsave, &backpos); + } } regstack_pop(&scan); - if (status == RA_CONT) + if (status == RA_CONT) { scan = regnext(scan); + } break; case RS_BEHIND1: @@ -4162,10 +4732,10 @@ static bool regmatch( if (status == RA_MATCH && reg_save_equal(&behind_pos)) { // found a match that ends where "next" started behind_pos = (((regbehind_T *)rp) - 1)->save_behind; - if (rp->rs_no == BEHIND) + if (rp->rs_no == BEHIND) { reg_restore(&(((regbehind_T *)rp) - 1)->save_after, - &backpos); - else { + &backpos); + } else { // But we didn't want a match. Need to restore the // subexpr, because what follows matched, so they have // been set. @@ -4187,16 +4757,15 @@ static bool regmatch( < behind_pos.rs_u.pos.lnum ? (colnr_T)STRLEN(rex.line) : behind_pos.rs_u.pos.col) - - rp->rs_un.regsave.rs_u.pos.col >= limit)) + - rp->rs_un.regsave.rs_u.pos.col >= limit)) { no = FAIL; - else if (rp->rs_un.regsave.rs_u.pos.col == 0) { + } else if (rp->rs_un.regsave.rs_u.pos.col == 0) { if (rp->rs_un.regsave.rs_u.pos.lnum < behind_pos.rs_u.pos.lnum - || reg_getline( - --rp->rs_un.regsave.rs_u.pos.lnum) - == NULL) + || reg_getline(--rp->rs_un.regsave.rs_u.pos.lnum) + == NULL) { no = FAIL; - else { + } else { reg_restore(&rp->rs_un.regsave, &backpos); rp->rs_un.regsave.rs_u.pos.col = (colnr_T)STRLEN(rex.line); @@ -4207,7 +4776,7 @@ static bool regmatch( rp->rs_un.regsave.rs_u.pos.col -= utf_head_off(line, - line + rp->rs_un.regsave.rs_u.pos.col - 1) + line + rp->rs_un.regsave.rs_u.pos.col - 1) + 1; } } else { @@ -4236,7 +4805,7 @@ static bool regmatch( behind_pos = (((regbehind_T *)rp) - 1)->save_behind; if (rp->rs_no == NOBEHIND) { reg_restore(&(((regbehind_T *)rp) - 1)->save_after, - &backpos); + &backpos); status = RA_MATCH; } else { // We do want a proper match. Need to restore the @@ -4254,9 +4823,8 @@ static bool regmatch( break; case RS_STAR_LONG: - case RS_STAR_SHORT: - { - regstar_T *rst = ((regstar_T *)rp) - 1; + case RS_STAR_SHORT: { + regstar_T *rst = ((regstar_T *)rp) - 1; if (status == RA_MATCH) { regstack_pop(&scan); @@ -4265,18 +4833,20 @@ static bool regmatch( } // Tried once already, restore input pointers. - if (status != RA_BREAK) + if (status != RA_BREAK) { reg_restore(&rp->rs_un.regsave, &backpos); + } // Repeat until we found a position where it could match. - for (;; ) { + for (;;) { if (status != RA_BREAK) { // Tried first position already, advance. if (rp->rs_state == RS_STAR_LONG) { // Trying for longest match, but couldn't or // didn't match -- back up one char. - if (--rst->count < rst->minval) + if (--rst->count < rst->minval) { break; + } if (rex.input == rex.line) { // backup to last char of previous line if (rex.lnum == 0) { @@ -4300,14 +4870,17 @@ static bool regmatch( // Couldn't or didn't match: try advancing one // char. if (rst->count == rst->minval - || regrepeat(OPERAND(rp->rs_scan), 1L) == 0) + || regrepeat(OPERAND(rp->rs_scan), 1L) == 0) { break; - ++rst->count; + } + rst->count++; } - if (got_int) + if (got_int) { break; - } else + } + } else { status = RA_NOMATCH; + } // If it could match, try it. if (rst->nextb == NUL || *rex.input == rst->nextb @@ -4331,13 +4904,15 @@ static bool regmatch( // If we want to continue the inner loop or didn't pop a state // continue matching loop if (status == RA_CONT || rp == (regitem_T *) - ((char *)regstack.ga_data + regstack.ga_len) - 1) + ((char *)regstack.ga_data + regstack.ga_len) - 1) { break; + } } // May need to continue with the inner loop, starting at "scan". - if (status == RA_CONT) + if (status == RA_CONT) { continue; + } // If the regstack is empty or something failed we are done. if (GA_EMPTY(®stack) || status == RA_FAIL) { @@ -4351,18 +4926,18 @@ static bool regmatch( } return status == RA_MATCH; } - - } // End of loop until the regstack is empty. + } // End of loop until the regstack is empty. // NOTREACHED } /// Try match of "prog" with at rex.line["col"]. -/// @returns 0 for failure, or number of lines contained in the match. -static long regtry(bt_regprog_T *prog, - colnr_T col, - proftime_T *tm, // timeout limit or NULL - int *timed_out) // flag set on timeout or NULL +/// +/// @param tm timeout limit or NULL +/// @param timed_out flag set on timeout or NULL +/// +/// @return 0 for failure, or number of lines contained in the match. +static long regtry(bt_regprog_T *prog, colnr_T col, proftime_T *tm, int *timed_out) { rex.input = rex.line + col; rex.need_clear_subexpr = true; @@ -4416,9 +4991,10 @@ static long regtry(bt_regprog_T *prog, - reg_startzpos[i].col); } } else { - if (reg_startzp[i] != NULL && reg_endzp[i] != NULL) + if (reg_startzp[i] != NULL && reg_endzp[i] != NULL) { re_extmatch_out->matches[i] = vim_strnsave(reg_startzp[i], reg_endzp[i] - reg_startzp[i]); + } } } } @@ -4427,14 +5003,16 @@ static long regtry(bt_regprog_T *prog, /// Match a regexp against a string ("line" points to the string) or multiple /// lines (if "line" is NULL, use reg_getline()). -/// @return 0 for failure, or number of lines contained in the match. -static long bt_regexec_both(char_u *line, - colnr_T col, // column to start search - proftime_T *tm, // timeout limit or NULL - int *timed_out) // flag set on timeout or NULL +/// +/// @param col column to start search +/// @param tm timeout limit or NULL +/// @param timed_out flag set on timeout or NULL +/// +/// @return 0 for failure, or number of lines contained in the match. +static long bt_regexec_both(char_u *line, colnr_T col, proftime_T *tm, int *timed_out) { - bt_regprog_T *prog; - char_u *s; + bt_regprog_T *prog; + char_u *s; long retval = 0L; // Create "regstack" and "backpos" if they are not allocated yet. @@ -4473,8 +5051,9 @@ static long bt_regexec_both(char_u *line, } // Check validity of program. - if (prog_magic_wrong()) + if (prog_magic_wrong()) { goto theend; + } // If the start column is past the maximum column: no need to try. if (rex.reg_maxcol > 0 && col >= rex.reg_maxcol) { @@ -4501,7 +5080,7 @@ static long bt_regexec_both(char_u *line, // This is used very often, esp. for ":global". Use two versions of // the loop to avoid overhead of conditions. if (!rex.reg_ic) { - while ((s = vim_strchr(s, c)) != NULL) { + while ((s = (char_u *)vim_strchr((char *)s, c)) != NULL) { if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0) { break; // Found it. } @@ -4590,10 +5169,12 @@ theend: if (reg_tofreelen > 400) { XFREE_CLEAR(reg_tofree); } - if (regstack.ga_maxlen > REGSTACK_INITIAL) + if (regstack.ga_maxlen > REGSTACK_INITIAL) { ga_clear(®stack); - if (backpos.ga_maxlen > BACKPOS_INITIAL) + } + 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 @@ -4616,19 +5197,16 @@ theend: return retval; } -/* - * Match a regexp against a string. - * "rmp->regprog" is a compiled regexp as returned by vim_regcomp(). - * Uses curbuf for line count and 'iskeyword'. - * If "line_lbr" is true, consider a "\n" in "line" to be a line break. - * - * Returns 0 for failure, number of lines contained in the match otherwise. - */ -static int bt_regexec_nl( - regmatch_T *rmp, - char_u *line, // string to match against - colnr_T col, // column to start looking for match - bool line_lbr) +/// Match a regexp against a string. +/// "rmp->regprog" is a compiled regexp as returned by vim_regcomp(). +/// Uses curbuf for line count and 'iskeyword'. +/// If "line_lbr" is true, consider a "\n" in "line" to be a line break. +/// +/// @param line string to match against +/// @param col column to start looking for match +/// +/// @return 0 for failure, number of lines contained in the match otherwise. +static int bt_regexec_nl(regmatch_T *rmp, char_u *line, colnr_T col, bool line_lbr) { rex.reg_match = rmp; rex.reg_mmatch = NULL; @@ -4658,8 +5236,7 @@ static int bt_regexec_nl( /// /// @return zero if there is no match and number of lines contained in the match /// otherwise. -static long bt_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, - linenr_T lnum, colnr_T col, +static long bt_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm, int *timed_out) { rex.reg_match = NULL; @@ -4683,10 +5260,12 @@ static int re_num_cmp(uint32_t val, char_u *scan) { uint32_t n = (uint32_t)OPERAND_MIN(scan); - if (OPERAND_CMP(scan) == '>') + if (OPERAND_CMP(scan) == '>') { return val > n; - if (OPERAND_CMP(scan) == '<') + } + if (OPERAND_CMP(scan) == '<') { return val < n; + } return val == n; } @@ -4697,21 +5276,22 @@ static int re_num_cmp(uint32_t val, char_u *scan) */ static void regdump(char_u *pattern, bt_regprog_T *r) { - char_u *s; + char_u *s; int op = EXACTLY; // Arbitrary non-END op. - char_u *next; - char_u *end = NULL; - FILE *f; + char_u *next; + char_u *end = NULL; + FILE *f; -#ifdef BT_REGEXP_LOG +# ifdef BT_REGEXP_LOG f = fopen("bt_regexp_log.log", "a"); -#else +# else f = stdout; -#endif - if (f == NULL) +# endif + if (f == NULL) { return; + } fprintf(f, "-------------------------------------\n\r\nregcomp(%s):\r\n", - pattern); + pattern); s = r->program + 1; // Loop until we find the END that isn't before a referred next (an END @@ -4720,12 +5300,14 @@ static void regdump(char_u *pattern, bt_regprog_T *r) op = OP(s); fprintf(f, "%2d%s", (int)(s - r->program), regprop(s)); // Where, what. next = regnext(s); - if (next == NULL) // Next ptr. + if (next == NULL) { // Next ptr. fprintf(f, "(0)"); - else + } else { fprintf(f, "(%d)", (int)((s - r->program) + (next - s))); - if (end < next) + } + if (end < next) { end = next; + } if (op == BRACE_LIMITS) { // Two ints fprintf(f, " minval %" PRId64 ", maxval %" PRId64, @@ -4746,8 +5328,9 @@ static void regdump(char_u *pattern, bt_regprog_T *r) || op == EXACTLY) { // Literal string, where present. fprintf(f, "\nxxxxxxxxx\n"); - while (*s != NUL) + while (*s != NUL) { fprintf(f, "%c", *s++); + } fprintf(f, "\nxxxxxxxxx\n"); s++; } @@ -4755,19 +5338,22 @@ static void regdump(char_u *pattern, bt_regprog_T *r) } // Header fields of interest. - if (r->regstart != NUL) + if (r->regstart != NUL) { fprintf(f, "start `%s' 0x%x; ", r->regstart < 256 - ? (char *)transchar(r->regstart) - : "multibyte", r->regstart); - if (r->reganch) + ? (char *)transchar(r->regstart) + : "multibyte", r->regstart); + } + if (r->reganch) { fprintf(f, "anchored; "); - if (r->regmust != NULL) + } + if (r->regmust != NULL) { fprintf(f, "must have \"%s\"", r->regmust); + } fprintf(f, "\r\n"); -#ifdef BT_REGEXP_LOG +# ifdef BT_REGEXP_LOG fclose(f); -#endif +# endif } #endif // BT_REGEXP_DUMP @@ -4778,7 +5364,7 @@ static void regdump(char_u *pattern, bt_regprog_T *r) */ static char_u *regprop(char_u *op) { - char *p; + char *p; static char buf[50]; STRCPY(buf, ":"); @@ -5144,8 +5730,9 @@ static char_u *regprop(char_u *op) p = NULL; break; } - if (p != NULL) + if (p != NULL) { STRCAT(buf, p); + } return (char_u *)buf; } #endif // REGEXP_DEBUG diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index 7ab4f4ed53..cad5e9df29 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -1,8 +1,6 @@ // This is an open source non-commercial project. Dear PVS-Studio, please check // it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com -// uncrustify:off - /* * NFA regular expression implementation. * @@ -11,8 +9,8 @@ #include <assert.h> #include <inttypes.h> -#include <stdbool.h> #include <limits.h> +#include <stdbool.h> #include "nvim/ascii.h" #include "nvim/garray.h" @@ -39,13 +37,13 @@ # define NFA_REGEXP_DEBUG_LOG "nfa_regexp_debug.log" #endif -/* Added to NFA_ANY - NFA_NUPPER_IC to include a NL. */ +// Added to NFA_ANY - NFA_NUPPER_IC to include a NL. #define NFA_ADD_NL 31 enum { NFA_SPLIT = -1024, NFA_MATCH, - NFA_EMPTY, /* matches 0-length */ + NFA_EMPTY, // matches 0-length NFA_START_COLL, // [abc] start NFA_END_COLL, // [abc] end @@ -64,17 +62,17 @@ enum { NFA_QUEST, // greedy \? (postfix only) NFA_QUEST_NONGREEDY, // non-greedy \? (postfix only) - NFA_BOL, /* ^ Begin line */ - NFA_EOL, /* $ End line */ - NFA_BOW, /* \< Begin word */ - NFA_EOW, /* \> End word */ - NFA_BOF, /* \%^ Begin file */ - NFA_EOF, /* \%$ End file */ + NFA_BOL, // ^ Begin line + NFA_EOL, // $ End line + NFA_BOW, // \< Begin word + NFA_EOW, // \> End word + NFA_BOF, // \%^ Begin file + NFA_EOF, // \%$ End file NFA_NEWL, - NFA_ZSTART, /* Used for \zs */ - NFA_ZEND, /* Used for \ze */ - NFA_NOPEN, /* Start of subexpression marked with \%( */ - NFA_NCLOSE, /* End of subexpr. marked with \%( ... \) */ + NFA_ZSTART, // Used for \zs + NFA_ZEND, // Used for \ze + NFA_NOPEN, // Start of subexpression marked with \%( + NFA_NCLOSE, // End of subexpr. marked with \%( ... \) NFA_START_INVISIBLE, NFA_START_INVISIBLE_FIRST, NFA_START_INVISIBLE_NEG, @@ -91,34 +89,34 @@ enum { // composing multibyte char NFA_END_COMPOSING, // End of a composing char in the NFA NFA_ANY_COMPOSING, // \%C: Any composing characters. - NFA_OPT_CHARS, /* \%[abc] */ - - /* The following are used only in the postfix form, not in the NFA */ - NFA_PREV_ATOM_NO_WIDTH, /* Used for \@= */ - NFA_PREV_ATOM_NO_WIDTH_NEG, /* Used for \@! */ - NFA_PREV_ATOM_JUST_BEFORE, /* Used for \@<= */ - NFA_PREV_ATOM_JUST_BEFORE_NEG, /* Used for \@<! */ - NFA_PREV_ATOM_LIKE_PATTERN, /* Used for \@> */ - - NFA_BACKREF1, /* \1 */ - NFA_BACKREF2, /* \2 */ - NFA_BACKREF3, /* \3 */ - NFA_BACKREF4, /* \4 */ - NFA_BACKREF5, /* \5 */ - NFA_BACKREF6, /* \6 */ - NFA_BACKREF7, /* \7 */ - NFA_BACKREF8, /* \8 */ - NFA_BACKREF9, /* \9 */ - NFA_ZREF1, /* \z1 */ - NFA_ZREF2, /* \z2 */ - NFA_ZREF3, /* \z3 */ - NFA_ZREF4, /* \z4 */ - NFA_ZREF5, /* \z5 */ - NFA_ZREF6, /* \z6 */ - NFA_ZREF7, /* \z7 */ - NFA_ZREF8, /* \z8 */ - NFA_ZREF9, /* \z9 */ - NFA_SKIP, /* Skip characters */ + NFA_OPT_CHARS, // \%[abc] + + // The following are used only in the postfix form, not in the NFA + NFA_PREV_ATOM_NO_WIDTH, // Used for \@= + NFA_PREV_ATOM_NO_WIDTH_NEG, // Used for \@! + NFA_PREV_ATOM_JUST_BEFORE, // Used for \@<= + NFA_PREV_ATOM_JUST_BEFORE_NEG, // Used for \@<! + NFA_PREV_ATOM_LIKE_PATTERN, // Used for \@> + + NFA_BACKREF1, // \1 + NFA_BACKREF2, // \2 + NFA_BACKREF3, // \3 + NFA_BACKREF4, // \4 + NFA_BACKREF5, // \5 + NFA_BACKREF6, // \6 + NFA_BACKREF7, // \7 + NFA_BACKREF8, // \8 + NFA_BACKREF9, // \9 + NFA_ZREF1, // \z1 + NFA_ZREF2, // \z2 + NFA_ZREF3, // \z3 + NFA_ZREF4, // \z4 + NFA_ZREF5, // \z5 + NFA_ZREF6, // \z6 + NFA_ZREF7, // \z7 + NFA_ZREF8, // \z8 + NFA_ZREF9, // \z9 + NFA_SKIP, // Skip characters NFA_MOPEN, NFA_MOPEN1, @@ -164,58 +162,58 @@ enum { NFA_ZCLOSE8, NFA_ZCLOSE9, - /* NFA_FIRST_NL */ - NFA_ANY, /* Match any one character. */ - NFA_IDENT, /* Match identifier char */ - NFA_SIDENT, /* Match identifier char but no digit */ - NFA_KWORD, /* Match keyword char */ - NFA_SKWORD, /* Match word char but no digit */ - NFA_FNAME, /* Match file name char */ - NFA_SFNAME, /* Match file name char but no digit */ - NFA_PRINT, /* Match printable char */ - NFA_SPRINT, /* Match printable char but no digit */ - NFA_WHITE, /* Match whitespace char */ - NFA_NWHITE, /* Match non-whitespace char */ - NFA_DIGIT, /* Match digit char */ - NFA_NDIGIT, /* Match non-digit char */ - NFA_HEX, /* Match hex char */ - NFA_NHEX, /* Match non-hex char */ - NFA_OCTAL, /* Match octal char */ - NFA_NOCTAL, /* Match non-octal char */ - NFA_WORD, /* Match word char */ - NFA_NWORD, /* Match non-word char */ - NFA_HEAD, /* Match head char */ - NFA_NHEAD, /* Match non-head char */ - NFA_ALPHA, /* Match alpha char */ - NFA_NALPHA, /* Match non-alpha char */ - NFA_LOWER, /* Match lowercase char */ - NFA_NLOWER, /* Match non-lowercase char */ - NFA_UPPER, /* Match uppercase char */ - NFA_NUPPER, /* Match non-uppercase char */ - NFA_LOWER_IC, /* Match [a-z] */ - NFA_NLOWER_IC, /* Match [^a-z] */ - NFA_UPPER_IC, /* Match [A-Z] */ - NFA_NUPPER_IC, /* Match [^A-Z] */ + // NFA_FIRST_NL + NFA_ANY, // Match any one character. + NFA_IDENT, // Match identifier char + NFA_SIDENT, // Match identifier char but no digit + NFA_KWORD, // Match keyword char + NFA_SKWORD, // Match word char but no digit + NFA_FNAME, // Match file name char + NFA_SFNAME, // Match file name char but no digit + NFA_PRINT, // Match printable char + NFA_SPRINT, // Match printable char but no digit + NFA_WHITE, // Match whitespace char + NFA_NWHITE, // Match non-whitespace char + NFA_DIGIT, // Match digit char + NFA_NDIGIT, // Match non-digit char + NFA_HEX, // Match hex char + NFA_NHEX, // Match non-hex char + NFA_OCTAL, // Match octal char + NFA_NOCTAL, // Match non-octal char + NFA_WORD, // Match word char + NFA_NWORD, // Match non-word char + NFA_HEAD, // Match head char + NFA_NHEAD, // Match non-head char + NFA_ALPHA, // Match alpha char + NFA_NALPHA, // Match non-alpha char + NFA_LOWER, // Match lowercase char + NFA_NLOWER, // Match non-lowercase char + NFA_UPPER, // Match uppercase char + NFA_NUPPER, // Match non-uppercase char + NFA_LOWER_IC, // Match [a-z] + NFA_NLOWER_IC, // Match [^a-z] + NFA_UPPER_IC, // Match [A-Z] + NFA_NUPPER_IC, // Match [^A-Z] NFA_FIRST_NL = NFA_ANY + NFA_ADD_NL, NFA_LAST_NL = NFA_NUPPER_IC + NFA_ADD_NL, - NFA_CURSOR, /* Match cursor pos */ - NFA_LNUM, /* Match line number */ - NFA_LNUM_GT, /* Match > line number */ - NFA_LNUM_LT, /* Match < line number */ - NFA_COL, /* Match cursor column */ - NFA_COL_GT, /* Match > cursor column */ - NFA_COL_LT, /* Match < cursor column */ - NFA_VCOL, /* Match cursor virtual column */ - NFA_VCOL_GT, /* Match > cursor virtual column */ - NFA_VCOL_LT, /* Match < cursor virtual column */ - NFA_MARK, /* Match mark */ - NFA_MARK_GT, /* Match > mark */ - NFA_MARK_LT, /* Match < mark */ - NFA_VISUAL, /* Match Visual area */ - - /* Character classes [:alnum:] etc */ + NFA_CURSOR, // Match cursor pos + NFA_LNUM, // Match line number + NFA_LNUM_GT, // Match > line number + NFA_LNUM_LT, // Match < line number + NFA_COL, // Match cursor column + NFA_COL_GT, // Match > cursor column + NFA_COL_LT, // Match < cursor column + NFA_VCOL, // Match cursor virtual column + NFA_VCOL_GT, // Match > cursor virtual column + NFA_VCOL_LT, // Match < cursor virtual column + NFA_MARK, // Match mark + NFA_MARK_GT, // Match > mark + NFA_MARK_LT, // Match < mark + NFA_VISUAL, // Match Visual area + + // Character classes [:alnum:] etc NFA_CLASS_ALNUM, NFA_CLASS_ALPHA, NFA_CLASS_BLANK, @@ -237,9 +235,9 @@ enum { NFA_CLASS_FNAME, }; -/* Keep in sync with classchars. */ +// Keep in sync with classchars. static int nfa_classcodes[] = { - NFA_ANY, NFA_IDENT, NFA_SIDENT, NFA_KWORD,NFA_SKWORD, + NFA_ANY, NFA_IDENT, NFA_SIDENT, NFA_KWORD, NFA_SKWORD, NFA_FNAME, NFA_SFNAME, NFA_PRINT, NFA_SPRINT, NFA_WHITE, NFA_NWHITE, NFA_DIGIT, NFA_NDIGIT, NFA_HEX, NFA_NHEX, NFA_OCTAL, NFA_NOCTAL, @@ -248,11 +246,9 @@ static int nfa_classcodes[] = { NFA_UPPER, NFA_NUPPER }; -static char_u e_nul_found[] = N_( - "E865: (NFA) Regexp end encountered prematurely"); +static char_u e_nul_found[] = N_("E865: (NFA) Regexp end encountered prematurely"); static char_u e_misplaced[] = N_("E866: (NFA regexp) Misplaced %c"); -static char_u e_ill_char_class[] = N_( - "E877: (NFA regexp) Invalid character class: %" PRId64); +static char_u e_ill_char_class[] = N_("E877: (NFA regexp) Invalid character class: %" PRId64); static char_u e_value_too_large[] = N_("E951: \\% value too large"); // Since the out pointers in the list are always @@ -260,13 +256,13 @@ static char_u e_value_too_large[] = N_("E951: \\% value too large"); // as storage for the Ptrlists. typedef union Ptrlist Ptrlist; union Ptrlist { - Ptrlist *next; + Ptrlist *next; nfa_state_T *s; }; struct Frag { nfa_state_T *start; - Ptrlist *out; + Ptrlist *out; }; typedef struct Frag Frag_T; @@ -276,36 +272,36 @@ typedef struct { // When REG_MULTI is true list.multi is used, otherwise list.line. union { struct multipos { - linenr_T start_lnum; - linenr_T end_lnum; + linenr_T start_lnum; + linenr_T end_lnum; colnr_T start_col; colnr_T end_col; } multi[NSUBEXP]; struct linepos { - char_u *start; - char_u *end; + char_u *start; + char_u *end; } line[NSUBEXP]; } list; } regsub_T; typedef struct { - regsub_T norm; /* \( .. \) matches */ - regsub_T synt; /* \z( .. \) matches */ + regsub_T norm; // \( .. \) matches + regsub_T synt; // \z( .. \) matches } regsubs_T; -/* nfa_pim_T stores a Postponed Invisible Match. */ +// nfa_pim_T stores a Postponed Invisible Match. typedef struct nfa_pim_S nfa_pim_T; struct nfa_pim_S { - int result; /* NFA_PIM_*, see below */ - nfa_state_T *state; /* the invisible match start state */ - regsubs_T subs; /* submatch info, only party used */ + int result; // NFA_PIM_*, see below + nfa_state_T *state; // the invisible match start state + regsubs_T subs; // submatch info, only party used union { lpos_T pos; - char_u *ptr; - } end; /* where the match must end */ + char_u *ptr; + } end; // where the match must end }; -/* nfa_thread_T contains execution information of a NFA state */ +// nfa_thread_T contains execution information of a NFA state typedef struct { nfa_state_T *state; int count; @@ -316,7 +312,7 @@ typedef struct { // nfa_list_T contains the alternative NFA execution states. typedef struct { - nfa_thread_T *t; ///< allocated array of states + nfa_thread_T *t; ///< allocated array of states int n; ///< nr of states currently in "t" int len; ///< max nr of states in "t" int id; ///< ID of the list @@ -337,10 +333,10 @@ static bool wants_nfa; static int nstate; ///< Number of states in the NFA. Also used when executing. static int istate; ///< Index in the state vector, used in alloc_state() -/* If not NULL match must end at this position */ +// If not NULL match must end at this position static save_se_T *nfa_endp = NULL; -/* 0 for first call to nfa_regmatch(), 1 for recursive call. */ +// 0 for first call to nfa_regmatch(), 1 for recursive call. static int nfa_ll_index = 0; #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -349,35 +345,31 @@ static int nfa_ll_index = 0; // Helper functions used when doing re2post() ... regatom() parsing #define EMIT(c) \ - do { \ - if (post_ptr >= post_end) { \ - realloc_post_list(); \ - } \ - *post_ptr++ = c; \ - } while (0) - -/* - * Initialize internal variables before NFA compilation. - */ -static void -nfa_regcomp_start ( - char_u *expr, - int re_flags /* see vim_regcomp() */ -) + do { \ + if (post_ptr >= post_end) { \ + realloc_post_list(); \ + } \ + *post_ptr++ = c; \ + } while (0) + +/// Initialize internal variables before NFA compilation. +/// +/// @param re_flags @see vim_regcomp() +static void nfa_regcomp_start(char_u *expr, int re_flags) { size_t postfix_size; size_t nstate_max; nstate = 0; istate = 0; - /* A reasonable estimation for maximum size */ + // A reasonable estimation for maximum size nstate_max = (STRLEN(expr) + 1) * 25; // Some items blow up in size, such as [A-z]. Add more space for that. // When it is still not enough realloc_post_list() will be used. nstate_max += 1000; - /* Size for postfix representation of expr. */ + // Size for postfix representation of expr. postfix_size = sizeof(int) * nstate_max; post_start = (int *)xmalloc(postfix_size); @@ -387,7 +379,7 @@ nfa_regcomp_start ( rex.nfa_has_zend = false; rex.nfa_has_backref = false; - /* shared with BT engine */ + // shared with BT engine regcomp_start(expr, re_flags); } @@ -399,14 +391,15 @@ static int nfa_get_reganch(nfa_state_T *start, int depth) { nfa_state_T *p = start; - if (depth > 4) + if (depth > 4) { return 0; + } while (p != NULL) { switch (p->c) { case NFA_BOL: case NFA_BOF: - return 1; /* yes! */ + return 1; // yes! case NFA_ZSTART: case NFA_ZEND: @@ -442,7 +435,7 @@ static int nfa_get_reganch(nfa_state_T *start, int depth) && nfa_get_reganch(p->out1, depth + 1); default: - return 0; /* noooo */ + return 0; // noooo } } return 0; @@ -456,12 +449,13 @@ static int nfa_get_regstart(nfa_state_T *start, int depth) { nfa_state_T *p = start; - if (depth > 4) + if (depth > 4) { return 0; + } while (p != NULL) { switch (p->c) { - /* all kinds of zero-width matches */ + // all kinds of zero-width matches case NFA_BOL: case NFA_BOF: case NFA_BOW: @@ -507,19 +501,20 @@ static int nfa_get_regstart(nfa_state_T *start, int depth) p = p->out; break; - case NFA_SPLIT: - { + case NFA_SPLIT: { int c1 = nfa_get_regstart(p->out, depth + 1); int c2 = nfa_get_regstart(p->out1, depth + 1); - if (c1 == c2) - return c1; /* yes! */ + if (c1 == c2) { + return c1; // yes! + } return 0; } default: - if (p->c > 0) - return p->c; /* yes! */ + if (p->c > 0) { + return p->c; // yes! + } return 0; } } @@ -535,21 +530,23 @@ static char_u *nfa_get_match_text(nfa_state_T *start) { nfa_state_T *p = start; int len = 0; - char_u *ret; - char_u *s; + char_u *ret; + char_u *s; - if (p->c != NFA_MOPEN) - return NULL; /* just in case */ + if (p->c != NFA_MOPEN) { + return NULL; // just in case + } p = p->out; while (p->c > 0) { len += utf_char2len(p->c); p = p->out; } - if (p->c != NFA_MCLOSE || p->out->c != NFA_MATCH) + if (p->c != NFA_MCLOSE || p->out->c != NFA_MATCH) { return NULL; + } ret = xmalloc(len); - p = start->out->out; /* skip first char, it goes into regstart */ + p = start->out->out; // skip first char, it goes into regstart s = ret; while (p->c > 0) { s += utf_char2bytes(p->c, (char *)s); @@ -587,22 +584,23 @@ static void realloc_post_list(void) */ static int nfa_recognize_char_class(char_u *start, char_u *end, int extra_newl) { -# define CLASS_not 0x80 -# define CLASS_af 0x40 -# define CLASS_AF 0x20 -# define CLASS_az 0x10 -# define CLASS_AZ 0x08 -# define CLASS_o7 0x04 -# define CLASS_o9 0x02 -# define CLASS_underscore 0x01 - - char_u *p; +#define CLASS_not 0x80 +#define CLASS_af 0x40 +#define CLASS_AF 0x20 +#define CLASS_az 0x10 +#define CLASS_AZ 0x08 +#define CLASS_o7 0x04 +#define CLASS_o9 0x02 +#define CLASS_underscore 0x01 + + char_u *p; int config = 0; bool newl = extra_newl == true; - if (*end != ']') + if (*end != ']') { return FAIL; + } p = start; if (*p == '^') { config |= CLASS_not; @@ -652,12 +650,14 @@ static int nfa_recognize_char_class(char_u *start, char_u *end, int extra_newl) } else if (*p == '\n') { newl = true; p++; - } else + } else { return FAIL; - } /* while (p < end) */ + } + } // while (p < end) - if (p != end) + if (p != end) { return FAIL; + } if (newl == true) { extra_newl = NFA_ADD_NL; @@ -769,17 +769,40 @@ static void nfa_emit_equi_class(int c) #define y_acute 0xfd #define y_diaeresis 0xff switch (c) { - case 'A': case A_grave: case A_acute: case A_circumflex: - case A_virguilla: case A_diaeresis: case A_ring: - case 0x100: case 0x102: case 0x104: case 0x1cd: - case 0x1de: case 0x1e0: case 0x1fa: case 0x200: - case 0x202: case 0x226: case 0x23a: case 0x1e00: - case 0x1ea0: case 0x1ea2: case 0x1ea4: case 0x1ea6: - case 0x1ea8: case 0x1eaa: case 0x1eac: case 0x1eae: - case 0x1eb0: case 0x1eb2: case 0x1eb4: case 0x1eb6: - EMIT2('A') EMIT2(A_grave) EMIT2(A_acute) - EMIT2(A_circumflex) EMIT2(A_virguilla) - EMIT2(A_diaeresis) EMIT2(A_ring) + case 'A': + case A_grave: + case A_acute: + case A_circumflex: + case A_virguilla: + case A_diaeresis: + case A_ring: + case 0x100: + case 0x102: + case 0x104: + case 0x1cd: + case 0x1de: + case 0x1e0: + case 0x1fa: + case 0x200: + case 0x202: + case 0x226: + case 0x23a: + case 0x1e00: + case 0x1ea0: + case 0x1ea2: + case 0x1ea4: + case 0x1ea6: + case 0x1ea8: + case 0x1eaa: + case 0x1eac: + case 0x1eae: + case 0x1eb0: + case 0x1eb2: + case 0x1eb4: + case 0x1eb6: + EMIT2('A') EMIT2(A_grave) EMIT2(A_acute) // NOLINT(whitespace/cast) + EMIT2(A_circumflex) EMIT2(A_virguilla) // NOLINT(whitespace/cast) + EMIT2(A_diaeresis) EMIT2(A_ring) // NOLINT(whitespace/cast) EMIT2(0x100) EMIT2(0x102) EMIT2(0x104) EMIT2(0x1cd) EMIT2(0x1de) EMIT2(0x1e0) EMIT2(0x1fa) EMIT2(0x200) EMIT2(0x202) @@ -790,39 +813,76 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1eb2) EMIT2(0x1eb6) EMIT2(0x1eb4) return; - case 'B': case 0x181: case 0x243: case 0x1e02: - case 0x1e04: case 0x1e06: + case 'B': + case 0x181: + case 0x243: + case 0x1e02: + case 0x1e04: + case 0x1e06: EMIT2('B') EMIT2(0x181) EMIT2(0x243) EMIT2(0x1e02) EMIT2(0x1e04) EMIT2(0x1e06) return; - case 'C': case C_cedilla: case 0x106: case 0x108: - case 0x10a: case 0x10c: case 0x187: case 0x23b: - case 0x1e08: case 0xa792: + case 'C': + case C_cedilla: + case 0x106: + case 0x108: + case 0x10a: + case 0x10c: + case 0x187: + case 0x23b: + case 0x1e08: + case 0xa792: EMIT2('C') EMIT2(C_cedilla) EMIT2(0x106) EMIT2(0x108) EMIT2(0x10a) EMIT2(0x10c) EMIT2(0x187) EMIT2(0x23b) EMIT2(0x1e08) EMIT2(0xa792) return; - case 'D': case 0x10e: case 0x110: case 0x18a: - case 0x1e0a: case 0x1e0c: case 0x1e0e: case 0x1e10: + case 'D': + case 0x10e: + case 0x110: + case 0x18a: + case 0x1e0a: + case 0x1e0c: + case 0x1e0e: + case 0x1e10: case 0x1e12: EMIT2('D') EMIT2(0x10e) EMIT2(0x110) EMIT2(0x18a) EMIT2(0x1e0a) EMIT2(0x1e0c) EMIT2(0x1e0e) EMIT2(0x1e10) EMIT2(0x1e12) return; - case 'E': case E_grave: case E_acute: case E_circumflex: - case E_diaeresis: case 0x112: case 0x114: case 0x116: - case 0x118: case 0x11a: case 0x204: case 0x206: - case 0x228: case 0x246: case 0x1e14: case 0x1e16: - case 0x1e18: case 0x1e1a: case 0x1e1c: case 0x1eb8: - case 0x1eba: case 0x1ebc: case 0x1ebe: case 0x1ec0: - case 0x1ec2: case 0x1ec4: case 0x1ec6: - EMIT2('E') EMIT2(E_grave) EMIT2(E_acute) - EMIT2(E_circumflex) EMIT2(E_diaeresis) + case 'E': + case E_grave: + case E_acute: + case E_circumflex: + case E_diaeresis: + case 0x112: + case 0x114: + case 0x116: + case 0x118: + case 0x11a: + case 0x204: + case 0x206: + case 0x228: + case 0x246: + case 0x1e14: + case 0x1e16: + case 0x1e18: + case 0x1e1a: + case 0x1e1c: + case 0x1eb8: + case 0x1eba: + case 0x1ebc: + case 0x1ebe: + case 0x1ec0: + case 0x1ec2: + case 0x1ec4: + case 0x1ec6: + EMIT2('E') EMIT2(E_grave) EMIT2(E_acute) // NOLINT(whitespace/cast) + EMIT2(E_circumflex) EMIT2(E_diaeresis) // NOLINT(whitespace/cast) EMIT2(0x112) EMIT2(0x114) EMIT2(0x116) EMIT2(0x118) EMIT2(0x11a) EMIT2(0x204) EMIT2(0x206) EMIT2(0x228) EMIT2(0x246) @@ -833,34 +893,65 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ec6) return; - case 'F': case 0x191: case 0x1e1e: case 0xa798: + case 'F': + case 0x191: + case 0x1e1e: + case 0xa798: EMIT2('F') EMIT2(0x191) EMIT2(0x1e1e) EMIT2(0xa798) return; - case 'G': case 0x11c: case 0x11e: case 0x120: - case 0x122: case 0x193: case 0x1e4: case 0x1e6: - case 0x1f4: case 0x1e20: case 0xa7a0: + case 'G': + case 0x11c: + case 0x11e: + case 0x120: + case 0x122: + case 0x193: + case 0x1e4: + case 0x1e6: + case 0x1f4: + case 0x1e20: + case 0xa7a0: EMIT2('G') EMIT2(0x11c) EMIT2(0x11e) EMIT2(0x120) EMIT2(0x122) EMIT2(0x193) EMIT2(0x1e4) EMIT2(0x1e6) EMIT2(0x1f4) EMIT2(0x1e20) EMIT2(0xa7a0) return; - case 'H': case 0x124: case 0x126: case 0x21e: - case 0x1e22: case 0x1e24: case 0x1e26: case 0x1e28: - case 0x1e2a: case 0x2c67: + case 'H': + case 0x124: + case 0x126: + case 0x21e: + case 0x1e22: + case 0x1e24: + case 0x1e26: + case 0x1e28: + case 0x1e2a: + case 0x2c67: EMIT2('H') EMIT2(0x124) EMIT2(0x126) EMIT2(0x21e) EMIT2(0x1e22) EMIT2(0x1e24) EMIT2(0x1e26) EMIT2(0x1e28) EMIT2(0x1e2a) EMIT2(0x2c67) return; - case 'I': case I_grave: case I_acute: case I_circumflex: - case I_diaeresis: case 0x128: case 0x12a: case 0x12c: - case 0x12e: case 0x130: case 0x197: case 0x1cf: - case 0x208: case 0x20a: case 0x1e2c: case 0x1e2e: - case 0x1ec8: case 0x1eca: - EMIT2('I') EMIT2(I_grave) EMIT2(I_acute) - EMIT2(I_circumflex) EMIT2(I_diaeresis) + case 'I': + case I_grave: + case I_acute: + case I_circumflex: + case I_diaeresis: + case 0x128: + case 0x12a: + case 0x12c: + case 0x12e: + case 0x130: + case 0x197: + case 0x1cf: + case 0x208: + case 0x20a: + case 0x1e2c: + case 0x1e2e: + case 0x1ec8: + case 0x1eca: + EMIT2('I') EMIT2(I_grave) EMIT2(I_acute) // NOLINT(whitespace/cast) + EMIT2(I_circumflex) EMIT2(I_diaeresis) // NOLINT(whitespace/cast) EMIT2(0x128) EMIT2(0x12a) EMIT2(0x12c) EMIT2(0x12e) EMIT2(0x130) EMIT2(0x197) EMIT2(0x1cf) EMIT2(0x208) EMIT2(0x20a) @@ -868,34 +959,62 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1eca) return; - case 'J': case 0x134: case 0x248: + case 'J': + case 0x134: + case 0x248: EMIT2('J') EMIT2(0x134) EMIT2(0x248) return; - case 'K': case 0x136: case 0x198: case 0x1e8: case 0x1e30: - case 0x1e32: case 0x1e34: case 0x2c69: case 0xa740: + case 'K': + case 0x136: + case 0x198: + case 0x1e8: + case 0x1e30: + case 0x1e32: + case 0x1e34: + case 0x2c69: + case 0xa740: EMIT2('K') EMIT2(0x136) EMIT2(0x198) EMIT2(0x1e8) EMIT2(0x1e30) EMIT2(0x1e32) EMIT2(0x1e34) EMIT2(0x2c69) EMIT2(0xa740) return; - case 'L': case 0x139: case 0x13b: case 0x13d: - case 0x13f: case 0x141: case 0x23d: case 0x1e36: - case 0x1e38: case 0x1e3a: case 0x1e3c: case 0x2c60: + case 'L': + case 0x139: + case 0x13b: + case 0x13d: + case 0x13f: + case 0x141: + case 0x23d: + case 0x1e36: + case 0x1e38: + case 0x1e3a: + case 0x1e3c: + case 0x2c60: EMIT2('L') EMIT2(0x139) EMIT2(0x13b) EMIT2(0x13d) EMIT2(0x13f) EMIT2(0x141) EMIT2(0x23d) EMIT2(0x1e36) EMIT2(0x1e38) EMIT2(0x1e3a) EMIT2(0x1e3c) EMIT2(0x2c60) return; - case 'M': case 0x1e3e: case 0x1e40: case 0x1e42: + case 'M': + case 0x1e3e: + case 0x1e40: + case 0x1e42: EMIT2('M') EMIT2(0x1e3e) EMIT2(0x1e40) EMIT2(0x1e42) return; - case 'N': case N_virguilla: - case 0x143: case 0x145: case 0x147: case 0x1f8: - case 0x1e44: case 0x1e46: case 0x1e48: case 0x1e4a: + case 'N': + case N_virguilla: + case 0x143: + case 0x145: + case 0x147: + case 0x1f8: + case 0x1e44: + case 0x1e46: + case 0x1e48: + case 0x1e4a: case 0xa7a4: EMIT2('N') EMIT2(N_virguilla) EMIT2(0x143) EMIT2(0x145) EMIT2(0x147) @@ -903,19 +1022,47 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1e48) EMIT2(0x1e4a) EMIT2(0xa7a4) return; - case 'O': case O_grave: case O_acute: case O_circumflex: - case O_virguilla: case O_diaeresis: case O_slash: - case 0x14c: case 0x14e: case 0x150: case 0x19f: - case 0x1a0: case 0x1d1: case 0x1ea: case 0x1ec: - case 0x1fe: case 0x20c: case 0x20e: case 0x22a: - case 0x22c: case 0x22e: case 0x230: case 0x1e4c: - case 0x1e4e: case 0x1e50: case 0x1e52: case 0x1ecc: - case 0x1ece: case 0x1ed0: case 0x1ed2: case 0x1ed4: - case 0x1ed6: case 0x1ed8: case 0x1eda: case 0x1edc: - case 0x1ede: case 0x1ee0: case 0x1ee2: - EMIT2('O') EMIT2(O_grave) EMIT2(O_acute) - EMIT2(O_circumflex) EMIT2(O_virguilla) - EMIT2(O_diaeresis) EMIT2(O_slash) + case 'O': + case O_grave: + case O_acute: + case O_circumflex: + case O_virguilla: + case O_diaeresis: + case O_slash: + case 0x14c: + case 0x14e: + case 0x150: + case 0x19f: + case 0x1a0: + case 0x1d1: + case 0x1ea: + case 0x1ec: + case 0x1fe: + case 0x20c: + case 0x20e: + case 0x22a: + case 0x22c: + case 0x22e: + case 0x230: + case 0x1e4c: + case 0x1e4e: + case 0x1e50: + case 0x1e52: + case 0x1ecc: + case 0x1ece: + case 0x1ed0: + case 0x1ed2: + case 0x1ed4: + case 0x1ed6: + case 0x1ed8: + case 0x1eda: + case 0x1edc: + case 0x1ede: + case 0x1ee0: + case 0x1ee2: + EMIT2('O') EMIT2(O_grave) EMIT2(O_acute) // NOLINT(whitespace/cast) + EMIT2(O_circumflex) EMIT2(O_virguilla) // NOLINT(whitespace/cast) + EMIT2(O_diaeresis) EMIT2(O_slash) // NOLINT(whitespace/cast) EMIT2(0x14c) EMIT2(0x14e) EMIT2(0x150) EMIT2(0x19f) EMIT2(0x1a0) EMIT2(0x1d1) EMIT2(0x1ea) EMIT2(0x1ec) EMIT2(0x1fe) @@ -929,51 +1076,109 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ee2) return; - case 'P': case 0x1a4: case 0x1e54: case 0x1e56: case 0x2c63: + case 'P': + case 0x1a4: + case 0x1e54: + case 0x1e56: + case 0x2c63: EMIT2('P') EMIT2(0x1a4) EMIT2(0x1e54) EMIT2(0x1e56) EMIT2(0x2c63) return; - case 'Q': case 0x24a: + case 'Q': + case 0x24a: EMIT2('Q') EMIT2(0x24a) return; - case 'R': case 0x154: case 0x156: case 0x158: case 0x210: - case 0x212: case 0x24c: case 0x1e58: case 0x1e5a: - case 0x1e5c: case 0x1e5e: case 0x2c64: case 0xa7a6: + case 'R': + case 0x154: + case 0x156: + case 0x158: + case 0x210: + case 0x212: + case 0x24c: + case 0x1e58: + case 0x1e5a: + case 0x1e5c: + case 0x1e5e: + case 0x2c64: + case 0xa7a6: EMIT2('R') EMIT2(0x154) EMIT2(0x156) EMIT2(0x158) EMIT2(0x210) EMIT2(0x212) EMIT2(0x24c) EMIT2(0x1e58) EMIT2(0x1e5a) EMIT2(0x1e5c) EMIT2(0x1e5e) EMIT2(0x2c64) EMIT2(0xa7a6) return; - case 'S': case 0x15a: case 0x15c: case 0x15e: case 0x160: - case 0x218: case 0x1e60: case 0x1e62: case 0x1e64: - case 0x1e66: case 0x1e68: case 0x2c7e: case 0xa7a8: + case 'S': + case 0x15a: + case 0x15c: + case 0x15e: + case 0x160: + case 0x218: + case 0x1e60: + case 0x1e62: + case 0x1e64: + case 0x1e66: + case 0x1e68: + case 0x2c7e: + case 0xa7a8: EMIT2('S') EMIT2(0x15a) EMIT2(0x15c) EMIT2(0x15e) EMIT2(0x160) EMIT2(0x218) EMIT2(0x1e60) EMIT2(0x1e62) EMIT2(0x1e64) EMIT2(0x1e66) EMIT2(0x1e68) EMIT2(0x2c7e) EMIT2(0xa7a8) return; - case 'T': case 0x162: case 0x164: case 0x166: case 0x1ac: - case 0x1ae: case 0x21a: case 0x23e: case 0x1e6a: case 0x1e6c: - case 0x1e6e: case 0x1e70: + case 'T': + case 0x162: + case 0x164: + case 0x166: + case 0x1ac: + case 0x1ae: + case 0x21a: + case 0x23e: + case 0x1e6a: + case 0x1e6c: + case 0x1e6e: + case 0x1e70: EMIT2('T') EMIT2(0x162) EMIT2(0x164) EMIT2(0x166) EMIT2(0x1ac) EMIT2(0x1ae) EMIT2(0x23e) EMIT2(0x21a) EMIT2(0x1e6a) EMIT2(0x1e6c) EMIT2(0x1e6e) EMIT2(0x1e70) return; - case 'U': case U_grave: case U_acute: case U_diaeresis: - case U_circumflex: case 0x168: case 0x16a: case 0x16c: - case 0x16e: case 0x170: case 0x172: case 0x1af: - case 0x1d3: case 0x1d5: case 0x1d7: case 0x1d9: - case 0x1db: case 0x214: case 0x216: case 0x244: - case 0x1e72: case 0x1e74: case 0x1e76: case 0x1e78: - case 0x1e7a: case 0x1ee4: case 0x1ee6: case 0x1ee8: - case 0x1eea: case 0x1eec: case 0x1eee: case 0x1ef0: - EMIT2('U') EMIT2(U_grave) EMIT2(U_acute) - EMIT2(U_diaeresis) EMIT2(U_circumflex) + case 'U': + case U_grave: + case U_acute: + case U_diaeresis: + case U_circumflex: + case 0x168: + case 0x16a: + case 0x16c: + case 0x16e: + case 0x170: + case 0x172: + case 0x1af: + case 0x1d3: + case 0x1d5: + case 0x1d7: + case 0x1d9: + case 0x1db: + case 0x214: + case 0x216: + case 0x244: + case 0x1e72: + case 0x1e74: + case 0x1e76: + case 0x1e78: + case 0x1e7a: + case 0x1ee4: + case 0x1ee6: + case 0x1ee8: + case 0x1eea: + case 0x1eec: + case 0x1eee: + case 0x1ef0: + EMIT2('U') EMIT2(U_grave) EMIT2(U_acute) // NOLINT(whitespace/cast) + EMIT2(U_diaeresis) EMIT2(U_circumflex) // NOLINT(whitespace/cast) EMIT2(0x168) EMIT2(0x16a) EMIT2(0x16c) EMIT2(0x16e) EMIT2(0x170) EMIT2(0x172) EMIT2(0x1af) EMIT2(0x1d3) @@ -986,23 +1191,42 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ef0) return; - case 'V': case 0x1b2: case 0x1e7c: case 0x1e7e: + case 'V': + case 0x1b2: + case 0x1e7c: + case 0x1e7e: EMIT2('V') EMIT2(0x1b2) EMIT2(0x1e7c) EMIT2(0x1e7e) return; - case 'W': case 0x174: case 0x1e80: case 0x1e82: case 0x1e84: - case 0x1e86: case 0x1e88: + case 'W': + case 0x174: + case 0x1e80: + case 0x1e82: + case 0x1e84: + case 0x1e86: + case 0x1e88: EMIT2('W') EMIT2(0x174) EMIT2(0x1e80) EMIT2(0x1e82) EMIT2(0x1e84) EMIT2(0x1e86) EMIT2(0x1e88) return; - case 'X': case 0x1e8a: case 0x1e8c: + case 'X': + case 0x1e8a: + case 0x1e8c: EMIT2('X') EMIT2(0x1e8a) EMIT2(0x1e8c) return; - case 'Y': case Y_acute: case 0x176: case 0x178: - case 0x1b3: case 0x232: case 0x24e: case 0x1e8e: - case 0x1ef2: case 0x1ef4: case 0x1ef6: case 0x1ef8: + case 'Y': + case Y_acute: + case 0x176: + case 0x178: + case 0x1b3: + case 0x232: + case 0x24e: + case 0x1e8e: + case 0x1ef2: + case 0x1ef4: + case 0x1ef6: + case 0x1ef8: EMIT2('Y') EMIT2(Y_acute) EMIT2(0x176) EMIT2(0x178) EMIT2(0x1b3) EMIT2(0x232) EMIT2(0x24e) EMIT2(0x1e8e) @@ -1010,26 +1234,56 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ef8) return; - case 'Z': case 0x179: case 0x17b: case 0x17d: - case 0x1b5: case 0x1e90: case 0x1e92: case 0x1e94: + case 'Z': + case 0x179: + case 0x17b: + case 0x17d: + case 0x1b5: + case 0x1e90: + case 0x1e92: + case 0x1e94: case 0x2c6b: EMIT2('Z') EMIT2(0x179) EMIT2(0x17b) EMIT2(0x17d) EMIT2(0x1b5) EMIT2(0x1e90) EMIT2(0x1e92) EMIT2(0x1e94) EMIT2(0x2c6b) return; - case 'a': case a_grave: case a_acute: case a_circumflex: - case a_virguilla: case a_diaeresis: case a_ring: - case 0x101: case 0x103: case 0x105: case 0x1ce: - case 0x1df: case 0x1e1: case 0x1fb: case 0x201: - case 0x203: case 0x227: case 0x1d8f: case 0x1e01: - case 0x1e9a: case 0x1ea1: case 0x1ea3: case 0x1ea5: - case 0x1ea7: case 0x1ea9: case 0x1eab: case 0x1ead: - case 0x1eaf: case 0x1eb1: case 0x1eb3: case 0x1eb5: - case 0x1eb7: case 0x2c65: - EMIT2('a') EMIT2(a_grave) EMIT2(a_acute) - EMIT2(a_circumflex) EMIT2(a_virguilla) - EMIT2(a_diaeresis) EMIT2(a_ring) + case 'a': + case a_grave: + case a_acute: + case a_circumflex: + case a_virguilla: + case a_diaeresis: + case a_ring: + case 0x101: + case 0x103: + case 0x105: + case 0x1ce: + case 0x1df: + case 0x1e1: + case 0x1fb: + case 0x201: + case 0x203: + case 0x227: + case 0x1d8f: + case 0x1e01: + case 0x1e9a: + case 0x1ea1: + case 0x1ea3: + case 0x1ea5: + case 0x1ea7: + case 0x1ea9: + case 0x1eab: + case 0x1ead: + case 0x1eaf: + case 0x1eb1: + case 0x1eb3: + case 0x1eb5: + case 0x1eb7: + case 0x2c65: + EMIT2('a') EMIT2(a_grave) EMIT2(a_acute) // NOLINT(whitespace/cast) + EMIT2(a_circumflex) EMIT2(a_virguilla) // NOLINT(whitespace/cast) + EMIT2(a_diaeresis) EMIT2(a_ring) // NOLINT(whitespace/cast) EMIT2(0x101) EMIT2(0x103) EMIT2(0x105) EMIT2(0x1ce) EMIT2(0x1df) EMIT2(0x1e1) EMIT2(0x1fb) EMIT2(0x201) EMIT2(0x203) @@ -1041,14 +1295,28 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1eb7) EMIT2(0x2c65) return; - case 'b': case 0x180: case 0x253: case 0x1d6c: case 0x1d80: - case 0x1e03: case 0x1e05: case 0x1e07: + case 'b': + case 0x180: + case 0x253: + case 0x1d6c: + case 0x1d80: + case 0x1e03: + case 0x1e05: + case 0x1e07: EMIT2('b') EMIT2(0x180) EMIT2(0x253) EMIT2(0x1d6c) EMIT2(0x1d80) EMIT2(0x1e03) EMIT2(0x1e05) EMIT2(0x1e07) return; - case 'c': case c_cedilla: case 0x107: case 0x109: case 0x10b: - case 0x10d: case 0x188: case 0x23c: case 0x1e09: case 0xa793: + case 'c': + case c_cedilla: + case 0x107: + case 0x109: + case 0x10b: + case 0x10d: + case 0x188: + case 0x23c: + case 0x1e09: + case 0xa793: case 0xa794: EMIT2('c') EMIT2(c_cedilla) EMIT2(0x107) EMIT2(0x109) EMIT2(0x10b) @@ -1056,24 +1324,54 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1e09) EMIT2(0xa793) EMIT2(0xa794) return; - case 'd': case 0x10f: case 0x111: case 0x257: case 0x1d6d: - case 0x1d81: case 0x1d91: case 0x1e0b: case 0x1e0d: case 0x1e0f: - case 0x1e11: case 0x1e13: + case 'd': + case 0x10f: + case 0x111: + case 0x257: + case 0x1d6d: + case 0x1d81: + case 0x1d91: + case 0x1e0b: + case 0x1e0d: + case 0x1e0f: + case 0x1e11: + case 0x1e13: EMIT2('d') EMIT2(0x10f) EMIT2(0x111) EMIT2(0x257) EMIT2(0x1d6d) EMIT2(0x1d81) EMIT2(0x1d91) EMIT2(0x1e0b) EMIT2(0x1e0d) EMIT2(0x1e0f) EMIT2(0x1e11) EMIT2(0x1e13) return; - case 'e': case e_grave: case e_acute: case e_circumflex: - case e_diaeresis: case 0x113: case 0x115: case 0x117: - case 0x119: case 0x11b: case 0x205: case 0x207: - case 0x229: case 0x247: case 0x1d92: case 0x1e15: - case 0x1e17: case 0x1e19: case 0x1e1b: case 0x1e1d: - case 0x1eb9: case 0x1ebb: case 0x1ebd: case 0x1ebf: - case 0x1ec1: case 0x1ec3: case 0x1ec5: case 0x1ec7: - EMIT2('e') EMIT2(e_grave) EMIT2(e_acute) - EMIT2(e_circumflex) EMIT2(e_diaeresis) + case 'e': + case e_grave: + case e_acute: + case e_circumflex: + case e_diaeresis: + case 0x113: + case 0x115: + case 0x117: + case 0x119: + case 0x11b: + case 0x205: + case 0x207: + case 0x229: + case 0x247: + case 0x1d92: + case 0x1e15: + case 0x1e17: + case 0x1e19: + case 0x1e1b: + case 0x1e1d: + case 0x1eb9: + case 0x1ebb: + case 0x1ebd: + case 0x1ebf: + case 0x1ec1: + case 0x1ec3: + case 0x1ec5: + case 0x1ec7: + EMIT2('e') EMIT2(e_grave) EMIT2(e_acute) // NOLINT(whitespace/cast) + EMIT2(e_circumflex) EMIT2(e_diaeresis) // NOLINT(whitespace/cast) EMIT2(0x113) EMIT2(0x115) EMIT2(0x117) EMIT2(0x119) EMIT2(0x11b) EMIT2(0x205) EMIT2(0x207) EMIT2(0x229) @@ -1084,37 +1382,72 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ec3) EMIT2(0x1ec5) EMIT2(0x1ec7) return; - case 'f': case 0x192: case 0x1d6e: case 0x1d82: - case 0x1e1f: case 0xa799: + case 'f': + case 0x192: + case 0x1d6e: + case 0x1d82: + case 0x1e1f: + case 0xa799: EMIT2('f') EMIT2(0x192) EMIT2(0x1d6e) EMIT2(0x1d82) EMIT2(0x1e1f) EMIT2(0xa799) return; - case 'g': case 0x11d: case 0x11f: case 0x121: case 0x123: - case 0x1e5: case 0x1e7: case 0x1f5: case 0x260: case 0x1d83: - case 0x1e21: case 0xa7a1: + case 'g': + case 0x11d: + case 0x11f: + case 0x121: + case 0x123: + case 0x1e5: + case 0x1e7: + case 0x1f5: + case 0x260: + case 0x1d83: + case 0x1e21: + case 0xa7a1: EMIT2('g') EMIT2(0x11d) EMIT2(0x11f) EMIT2(0x121) EMIT2(0x123) EMIT2(0x1e5) EMIT2(0x1e7) EMIT2(0x1f5) EMIT2(0x260) EMIT2(0x1d83) EMIT2(0x1e21) EMIT2(0xa7a1) return; - case 'h': case 0x125: case 0x127: case 0x21f: case 0x1e23: - case 0x1e25: case 0x1e27: case 0x1e29: case 0x1e2b: - case 0x1e96: case 0x2c68: case 0xa795: + case 'h': + case 0x125: + case 0x127: + case 0x21f: + case 0x1e23: + case 0x1e25: + case 0x1e27: + case 0x1e29: + case 0x1e2b: + case 0x1e96: + case 0x2c68: + case 0xa795: EMIT2('h') EMIT2(0x125) EMIT2(0x127) EMIT2(0x21f) EMIT2(0x1e23) EMIT2(0x1e25) EMIT2(0x1e27) EMIT2(0x1e29) EMIT2(0x1e2b) EMIT2(0x1e96) EMIT2(0x2c68) EMIT2(0xa795) return; - case 'i': case i_grave: case i_acute: case i_circumflex: - case i_diaeresis: case 0x129: case 0x12b: case 0x12d: - case 0x12f: case 0x1d0: case 0x209: case 0x20b: - case 0x268: case 0x1d96: case 0x1e2d: case 0x1e2f: - case 0x1ec9: case 0x1ecb: - EMIT2('i') EMIT2(i_grave) EMIT2(i_acute) - EMIT2(i_circumflex) EMIT2(i_diaeresis) + case 'i': + case i_grave: + case i_acute: + case i_circumflex: + case i_diaeresis: + case 0x129: + case 0x12b: + case 0x12d: + case 0x12f: + case 0x1d0: + case 0x209: + case 0x20b: + case 0x268: + case 0x1d96: + case 0x1e2d: + case 0x1e2f: + case 0x1ec9: + case 0x1ecb: + EMIT2('i') EMIT2(i_grave) EMIT2(i_acute) // NOLINT(whitespace/cast) + EMIT2(i_circumflex) EMIT2(i_diaeresis) // NOLINT(whitespace/cast) EMIT2(0x129) EMIT2(0x12b) EMIT2(0x12d) EMIT2(0x12f) EMIT2(0x1d0) EMIT2(0x209) EMIT2(0x20b) EMIT2(0x268) EMIT2(0x1d96) @@ -1122,34 +1455,69 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ecb) EMIT2(0x1ecb) return; - case 'j': case 0x135: case 0x1f0: case 0x249: + case 'j': + case 0x135: + case 0x1f0: + case 0x249: EMIT2('j') EMIT2(0x135) EMIT2(0x1f0) EMIT2(0x249) return; - case 'k': case 0x137: case 0x199: case 0x1e9: case 0x1d84: - case 0x1e31: case 0x1e33: case 0x1e35: case 0x2c6a: case 0xa741: + case 'k': + case 0x137: + case 0x199: + case 0x1e9: + case 0x1d84: + case 0x1e31: + case 0x1e33: + case 0x1e35: + case 0x2c6a: + case 0xa741: EMIT2('k') EMIT2(0x137) EMIT2(0x199) EMIT2(0x1e9) EMIT2(0x1d84) EMIT2(0x1e31) EMIT2(0x1e33) EMIT2(0x1e35) EMIT2(0x2c6a) EMIT2(0xa741) return; - case 'l': case 0x13a: case 0x13c: case 0x13e: case 0x140: - case 0x142: case 0x19a: case 0x1e37: case 0x1e39: case 0x1e3b: - case 0x1e3d: case 0x2c61: + case 'l': + case 0x13a: + case 0x13c: + case 0x13e: + case 0x140: + case 0x142: + case 0x19a: + case 0x1e37: + case 0x1e39: + case 0x1e3b: + case 0x1e3d: + case 0x2c61: EMIT2('l') EMIT2(0x13a) EMIT2(0x13c) EMIT2(0x13e) EMIT2(0x140) EMIT2(0x142) EMIT2(0x19a) EMIT2(0x1e37) EMIT2(0x1e39) EMIT2(0x1e3b) EMIT2(0x1e3d) EMIT2(0x2c61) return; - case 'm': case 0x1d6f: case 0x1e3f: case 0x1e41: case 0x1e43: + case 'm': + case 0x1d6f: + case 0x1e3f: + case 0x1e41: + case 0x1e43: EMIT2('m') EMIT2(0x1d6f) EMIT2(0x1e3f) EMIT2(0x1e41) EMIT2(0x1e43) return; - case 'n': case n_virguilla: case 0x144: case 0x146: case 0x148: - case 0x149: case 0x1f9: case 0x1d70: case 0x1d87: case 0x1e45: - case 0x1e47: case 0x1e49: case 0x1e4b: case 0xa7a5: + case 'n': + case n_virguilla: + case 0x144: + case 0x146: + case 0x148: + case 0x149: + case 0x1f9: + case 0x1d70: + case 0x1d87: + case 0x1e45: + case 0x1e47: + case 0x1e49: + case 0x1e4b: + case 0xa7a5: EMIT2('n') EMIT2(n_virguilla) EMIT2(0x144) EMIT2(0x146) EMIT2(0x148) EMIT2(0x149) EMIT2(0x1f9) EMIT2(0x1d70) @@ -1157,19 +1525,47 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1e49) EMIT2(0x1e4b) EMIT2(0xa7a5) return; - case 'o': case o_grave: case o_acute: case o_circumflex: - case o_virguilla: case o_diaeresis: case o_slash: - case 0x14d: case 0x14f: case 0x151: case 0x1a1: - case 0x1d2: case 0x1eb: case 0x1ed: case 0x1ff: - case 0x20d: case 0x20f: case 0x22b: case 0x22d: - case 0x22f: case 0x231: case 0x275: case 0x1e4d: - case 0x1e4f: case 0x1e51: case 0x1e53: case 0x1ecd: - case 0x1ecf: case 0x1ed1: case 0x1ed3: case 0x1ed5: - case 0x1ed7: case 0x1ed9: case 0x1edb: case 0x1edd: - case 0x1edf: case 0x1ee1: case 0x1ee3: - EMIT2('o') EMIT2(o_grave) EMIT2(o_acute) - EMIT2(o_circumflex) EMIT2(o_virguilla) - EMIT2(o_diaeresis) EMIT2(o_slash) + case 'o': + case o_grave: + case o_acute: + case o_circumflex: + case o_virguilla: + case o_diaeresis: + case o_slash: + case 0x14d: + case 0x14f: + case 0x151: + case 0x1a1: + case 0x1d2: + case 0x1eb: + case 0x1ed: + case 0x1ff: + case 0x20d: + case 0x20f: + case 0x22b: + case 0x22d: + case 0x22f: + case 0x231: + case 0x275: + case 0x1e4d: + case 0x1e4f: + case 0x1e51: + case 0x1e53: + case 0x1ecd: + case 0x1ecf: + case 0x1ed1: + case 0x1ed3: + case 0x1ed5: + case 0x1ed7: + case 0x1ed9: + case 0x1edb: + case 0x1edd: + case 0x1edf: + case 0x1ee1: + case 0x1ee3: + EMIT2('o') EMIT2(o_grave) EMIT2(o_acute) // NOLINT(whitespace/cast) + EMIT2(o_circumflex) EMIT2(o_virguilla) // NOLINT(whitespace/cast) + EMIT2(o_diaeresis) EMIT2(o_slash) // NOLINT(whitespace/cast) EMIT2(0x14d) EMIT2(0x14f) EMIT2(0x151) EMIT2(0x1a1) EMIT2(0x1d2) EMIT2(0x1eb) EMIT2(0x1ed) EMIT2(0x1ff) EMIT2(0x20d) @@ -1183,19 +1579,38 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ee3) return; - case 'p': case 0x1a5: case 0x1d71: case 0x1d7d: case 0x1d88: - case 0x1e55: case 0x1e57: + case 'p': + case 0x1a5: + case 0x1d71: + case 0x1d7d: + case 0x1d88: + case 0x1e55: + case 0x1e57: EMIT2('p') EMIT2(0x1a5) EMIT2(0x1d71) EMIT2(0x1d7d) EMIT2(0x1d88) EMIT2(0x1e55) EMIT2(0x1e57) return; - case 'q': case 0x24b: case 0x2a0: + case 'q': + case 0x24b: + case 0x2a0: EMIT2('q') EMIT2(0x24b) EMIT2(0x2a0) return; - case 'r': case 0x155: case 0x157: case 0x159: case 0x211: - case 0x213: case 0x24d: case 0x27d: case 0x1d72: case 0x1d73: - case 0x1d89: case 0x1e59: case 0x1e5b: case 0x1e5d: case 0x1e5f: + case 'r': + case 0x155: + case 0x157: + case 0x159: + case 0x211: + case 0x213: + case 0x24d: + case 0x27d: + case 0x1d72: + case 0x1d73: + case 0x1d89: + case 0x1e59: + case 0x1e5b: + case 0x1e5d: + case 0x1e5f: case 0xa7a7: EMIT2('r') EMIT2(0x155) EMIT2(0x157) EMIT2(0x159) EMIT2(0x211) EMIT2(0x213) EMIT2(0x24d) EMIT2(0x27d) @@ -1203,34 +1618,84 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1e5b) EMIT2(0x1e5d) EMIT2(0x1e5f) EMIT2(0xa7a7) return; - case 's': case 0x15b: case 0x15d: case 0x15f: case 0x161: - case 0x219: case 0x23f: case 0x1d74: case 0x1d8a: case 0x1e61: - case 0x1e63: case 0x1e65: case 0x1e67: case 0x1e69: case 0xa7a9: + case 's': + case 0x15b: + case 0x15d: + case 0x15f: + case 0x161: + case 0x219: + case 0x23f: + case 0x1d74: + case 0x1d8a: + case 0x1e61: + case 0x1e63: + case 0x1e65: + case 0x1e67: + case 0x1e69: + case 0xa7a9: EMIT2('s') EMIT2(0x15b) EMIT2(0x15d) EMIT2(0x15f) EMIT2(0x161) EMIT2(0x219) EMIT2(0x23f) EMIT2(0x1d74) EMIT2(0x1d8a) EMIT2(0x1e61) EMIT2(0x1e63) EMIT2(0x1e65) EMIT2(0x1e67) EMIT2(0x1e69) EMIT2(0xa7a9) return; - case 't': case 0x163: case 0x165: case 0x167: case 0x1ab: - case 0x1ad: case 0x21b: case 0x288: case 0x1d75: case 0x1e6b: - case 0x1e6d: case 0x1e6f: case 0x1e71: case 0x1e97: case 0x2c66: + case 't': + case 0x163: + case 0x165: + case 0x167: + case 0x1ab: + case 0x1ad: + case 0x21b: + case 0x288: + case 0x1d75: + case 0x1e6b: + case 0x1e6d: + case 0x1e6f: + case 0x1e71: + case 0x1e97: + case 0x2c66: EMIT2('t') EMIT2(0x163) EMIT2(0x165) EMIT2(0x167) EMIT2(0x1ab) EMIT2(0x1ad) EMIT2(0x21b) EMIT2(0x288) EMIT2(0x1d75) EMIT2(0x1e6b) EMIT2(0x1e6d) EMIT2(0x1e6f) EMIT2(0x1e71) EMIT2(0x1e97) EMIT2(0x2c66) return; - case 'u': case u_grave: case u_acute: case u_circumflex: - case u_diaeresis: case 0x169: case 0x16b: case 0x16d: - case 0x16f: case 0x171: case 0x173: case 0x1b0: case 0x1d4: - case 0x1d6: case 0x1d8: case 0x1da: case 0x1dc: case 0x215: - case 0x217: case 0x289: case 0x1d7e: case 0x1d99: case 0x1e73: - case 0x1e75: case 0x1e77: case 0x1e79: case 0x1e7b: - case 0x1ee5: case 0x1ee7: case 0x1ee9: case 0x1eeb: - case 0x1eed: case 0x1eef: case 0x1ef1: - EMIT2('u') EMIT2(u_grave) EMIT2(u_acute) - EMIT2(u_circumflex) EMIT2(u_diaeresis) + case 'u': + case u_grave: + case u_acute: + case u_circumflex: + case u_diaeresis: + case 0x169: + case 0x16b: + case 0x16d: + case 0x16f: + case 0x171: + case 0x173: + case 0x1b0: + case 0x1d4: + case 0x1d6: + case 0x1d8: + case 0x1da: + case 0x1dc: + case 0x215: + case 0x217: + case 0x289: + case 0x1d7e: + case 0x1d99: + case 0x1e73: + case 0x1e75: + case 0x1e77: + case 0x1e79: + case 0x1e7b: + case 0x1ee5: + case 0x1ee7: + case 0x1ee9: + case 0x1eeb: + case 0x1eed: + case 0x1eef: + case 0x1ef1: + EMIT2('u') EMIT2(u_grave) EMIT2(u_acute) // NOLINT(whitespace/cast) + EMIT2(u_circumflex) EMIT2(u_diaeresis) // NOLINT(whitespace/cast) EMIT2(0x169) EMIT2(0x16b) EMIT2(0x16d) EMIT2(0x16f) EMIT2(0x171) EMIT2(0x173) EMIT2(0x1d6) EMIT2(0x1d8) @@ -1243,24 +1708,45 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1eed) EMIT2(0x1eef) EMIT2(0x1ef1) return; - case 'v': case 0x28b: case 0x1d8c: case 0x1e7d: case 0x1e7f: + case 'v': + case 0x28b: + case 0x1d8c: + case 0x1e7d: + case 0x1e7f: EMIT2('v') EMIT2(0x28b) EMIT2(0x1d8c) EMIT2(0x1e7d) EMIT2(0x1e7f) return; - case 'w': case 0x175: case 0x1e81: case 0x1e83: case 0x1e85: - case 0x1e87: case 0x1e89: case 0x1e98: + case 'w': + case 0x175: + case 0x1e81: + case 0x1e83: + case 0x1e85: + case 0x1e87: + case 0x1e89: + case 0x1e98: EMIT2('w') EMIT2(0x175) EMIT2(0x1e81) EMIT2(0x1e83) EMIT2(0x1e85) EMIT2(0x1e87) EMIT2(0x1e89) EMIT2(0x1e98) return; - case 'x': case 0x1e8b: case 0x1e8d: + case 'x': + case 0x1e8b: + case 0x1e8d: EMIT2('x') EMIT2(0x1e8b) EMIT2(0x1e8d) return; - case 'y': case y_acute: case y_diaeresis: case 0x177: - case 0x1b4: case 0x233: case 0x24f: case 0x1e8f: - case 0x1e99: case 0x1ef3: case 0x1ef5: case 0x1ef7: + case 'y': + case y_acute: + case y_diaeresis: + case 0x177: + case 0x1b4: + case 0x233: + case 0x24f: + case 0x1e8f: + case 0x1e99: + case 0x1ef3: + case 0x1ef5: + case 0x1ef7: case 0x1ef9: EMIT2('y') EMIT2(y_acute) EMIT2(y_diaeresis) EMIT2(0x177) EMIT2(0x1b4) EMIT2(0x233) EMIT2(0x24f) @@ -1268,9 +1754,17 @@ static void nfa_emit_equi_class(int c) EMIT2(0x1ef5) EMIT2(0x1ef7) EMIT2(0x1ef9) return; - case 'z': case 0x17a: case 0x17c: case 0x17e: case 0x1b6: - case 0x1d76: case 0x1d8e: case 0x1e91: case 0x1e93: - case 0x1e95: case 0x2c6c: + case 'z': + case 0x17a: + case 0x17c: + case 0x17e: + case 0x1b6: + case 0x1d76: + case 0x1d8e: + case 0x1e91: + case 0x1e93: + case 0x1e95: + case 0x2c6c: EMIT2('z') EMIT2(0x17a) EMIT2(0x17c) EMIT2(0x17e) EMIT2(0x1b6) EMIT2(0x1d76) EMIT2(0x1d8e) EMIT2(0x1e91) EMIT2(0x1e93) EMIT2(0x1e95) EMIT2(0x2c6c) @@ -1311,9 +1805,9 @@ static int nfa_regatom(void) int equiclass; int collclass; int got_coll_char; - char_u *p; - char_u *endp; - char_u *old_regparse = regparse; + char_u *p; + char_u *endp; + char_u *old_regparse = regparse; int extra = 0; int emit_range; int negated; @@ -1344,14 +1838,15 @@ static int nfa_regatom(void) case Magic('_'): c = no_Magic(getchr()); - if (c == NUL) + if (c == NUL) { EMSG_RET_FAIL(_(e_nul_found)); + } - if (c == '^') { /* "\_^" is start-of-line */ + if (c == '^') { // "\_^" is start-of-line EMIT(NFA_BOL); break; } - if (c == '$') { /* "\_$" is end-of-line */ + if (c == '$') { // "\_$" is end-of-line EMIT(NFA_EOL); had_eol = true; break; @@ -1359,12 +1854,13 @@ static int nfa_regatom(void) extra = NFA_ADD_NL; - /* "\_[" is collection plus newline */ - if (c == '[') + // "\_[" is collection plus newline + if (c == '[') { goto collection; + } - // "\_x" is character class plus newline - FALLTHROUGH; + // "\_x" is character class plus newline + FALLTHROUGH; /* * Character classes. @@ -1396,7 +1892,7 @@ static int nfa_regatom(void) case Magic('L'): case Magic('u'): case Magic('U'): - p = vim_strchr(classchars, no_Magic(c)); + p = (char_u *)vim_strchr((char *)classchars, no_Magic(c)); if (p == NULL) { if (extra == NFA_ADD_NL) { semsg(_(e_ill_char_class), (int64_t)c); @@ -1454,9 +1950,8 @@ static int nfa_regatom(void) semsg(_(e_misplaced), (int64_t)no_Magic(c)); return FAIL; - case Magic('~'): - { - char_u *lp; + case Magic('~'): { + char_u *lp; // Previous substitute pattern. // Generated as "\%(pattern\)". @@ -1482,17 +1977,16 @@ static int nfa_regatom(void) case Magic('6'): case Magic('7'): case Magic('8'): - case Magic('9'): - { - int refnum = no_Magic(c) - '1'; + case Magic('9'): { + int refnum = no_Magic(c) - '1'; - if (!seen_endbrace(refnum + 1)) { - return FAIL; - } - EMIT(NFA_BACKREF1 + refnum); - rex.nfa_has_backref = true; + if (!seen_endbrace(refnum + 1)) { + return FAIL; } - break; + EMIT(NFA_BACKREF1 + refnum); + rex.nfa_has_backref = true; + } + break; case Magic('z'): c = no_Magic(getchr()); @@ -1548,28 +2042,35 @@ static int nfa_regatom(void) case Magic('%'): c = no_Magic(getchr()); switch (c) { - /* () without a back reference */ + // () without a back reference case '(': - if (nfa_reg(REG_NPAREN) == FAIL) + if (nfa_reg(REG_NPAREN) == FAIL) { return FAIL; + } EMIT(NFA_NOPEN); break; - case 'd': /* %d123 decimal */ - case 'o': /* %o123 octal */ - case 'x': /* %xab hex 2 */ - case 'u': /* %uabcd hex 4 */ - case 'U': /* %U1234abcd hex 8 */ + case 'd': // %d123 decimal + case 'o': // %o123 octal + case 'x': // %xab hex 2 + case 'u': // %uabcd hex 4 + case 'U': // %U1234abcd hex 8 { int64_t nr; switch (c) { - case 'd': nr = getdecchrs(); break; - case 'o': nr = getoctchrs(); break; - case 'x': nr = gethexchrs(2); break; - case 'u': nr = gethexchrs(4); break; - case 'U': nr = gethexchrs(8); break; - default: nr = -1; break; + case 'd': + nr = getdecchrs(); break; + case 'o': + nr = getoctchrs(); break; + case 'x': + nr = gethexchrs(2); break; + case 'u': + nr = gethexchrs(4); break; + case 'U': + nr = gethexchrs(8); break; + default: + nr = -1; break; } if (nr < 0 || nr > INT_MAX) { @@ -1604,18 +2105,19 @@ static int nfa_regatom(void) EMIT(NFA_ANY_COMPOSING); break; - case '[': - { + case '[': { int n; - /* \%[abc] */ - for (n = 0; (c = peekchr()) != ']'; ++n) { - if (c == NUL) + // \%[abc] + for (n = 0; (c = peekchr()) != ']'; n++) { + if (c == NUL) { EMSG2_RET_FAIL(_(e_missing_sb), - reg_magic == MAGIC_ALL); - /* recursive call! */ - if (nfa_regatom() == FAIL) + reg_magic == MAGIC_ALL); + } + // recursive call! + if (nfa_regatom() == FAIL) { return FAIL; + } } (void)getchr(); // get the ] if (n == 0) { @@ -1635,8 +2137,7 @@ static int nfa_regatom(void) break; } - default: - { + default: { int64_t n = 0; const int cmp = c; bool cur = false; @@ -1700,9 +2201,9 @@ static int nfa_regatom(void) EMIT((int)n); break; } else if (c == '\'' && n == 0) { - /* \%'m \%<'m \%>'m */ + // \%'m \%<'m \%>'m EMIT(cmp == '<' ? NFA_MARK_LT : - cmp == '>' ? NFA_MARK_GT : NFA_MARK); + cmp == '>' ? NFA_MARK_GT : NFA_MARK); EMIT(getchr()); break; } @@ -1740,8 +2241,9 @@ collection: EMIT(result - NFA_ADD_NL); EMIT(NFA_NEWL); EMIT(NFA_OR); - } else + } else { EMIT(result); + } regparse = endp; MB_PTR_ADV(regparse); return OK; @@ -1756,8 +2258,9 @@ collection: negated = true; MB_PTR_ADV(regparse); EMIT(NFA_START_NEG_COLL); - } else + } else { EMIT(NFA_START_COLL); + } if (*regparse == '-') { startc = '-'; EMIT(startc); @@ -1771,16 +2274,17 @@ collection: startc = -1; got_coll_char = false; if (*regparse == '[') { - /* Check for [: :], [= =], [. .] */ + // Check for [: :], [= =], [. .] equiclass = collclass = 0; charclass = get_char_class(®parse); if (charclass == CLASS_NONE) { equiclass = get_equi_class(®parse); - if (equiclass == 0) + if (equiclass == 0) { collclass = get_coll_element(®parse); + } } - /* Character class like [:alpha:] */ + // Character class like [:alpha:] if (charclass != CLASS_NONE) { switch (charclass) { case CLASS_ALNUM: @@ -1846,12 +2350,12 @@ collection: EMIT(NFA_CONCAT); continue; } - /* Try equivalence class [=a=] and the like */ + // Try equivalence class [=a=] and the like if (equiclass != 0) { nfa_emit_equi_class(equiclass); continue; } - /* Try collating class like [. .] */ + // Try collating class like [. .] if (collclass != 0) { startc = collclass; // allow [.a.]-x as a range // Will emit the proper atom at the end of the @@ -1876,26 +2380,23 @@ collection: && (vim_strchr(REGEXP_INRANGE, regparse[1]) != NULL || (!reg_cpo_lit && vim_strchr(REGEXP_ABBR, regparse[1]) - != NULL) - ) - ) { + != NULL))) { MB_PTR_ADV(regparse); if (*regparse == 'n') { startc = (reg_string || emit_range || regparse[1] == '-') ? NL : NFA_NEWL; - } else if (*regparse == 'd' - || *regparse == 'o' - || *regparse == 'x' - || *regparse == 'u' - || *regparse == 'U' - ) { + } else if (*regparse == 'd' + || *regparse == 'o' + || *regparse == 'x' + || *regparse == 'u' + || *regparse == 'U') { // TODO(RE): This needs more testing startc = coll_get_char(); got_coll_char = true; MB_PTR_BACK(old_regparse, regparse); } else { - /* \r,\t,\e,\b */ + // \r,\t,\e,\b startc = backslash_trans(*regparse); } } @@ -1905,7 +2406,7 @@ collection: startc = utf_ptr2char((char *)regparse); } - /* Previous char was '-', so this char is end of range. */ + // Previous char was '-', so this char is end of range. if (emit_range) { int endc = startc; startc = oldstartc; @@ -1977,7 +2478,7 @@ collection: EMIT(NFA_CONCAT); } - /* skip the trailing ] */ + // skip the trailing ] regparse = endp; MB_PTR_ADV(regparse); @@ -1995,14 +2496,14 @@ collection: } return OK; - } /* if exists closing ] */ + } // if exists closing ] - if (reg_strict) + if (reg_strict) { EMSG_RET_FAIL(_(e_missingbracket)); + } FALLTHROUGH; - default: - { + default: { int plen; nfa_do_multibyte: @@ -2019,12 +2520,14 @@ nfa_do_multibyte: // building the postfix form, not the NFA itself; // a composing char could be: a, b, c, NFA_COMPOSING // where 'b' and 'c' are chars with codes > 256. */ - for (;; ) { + for (;;) { EMIT(c); - if (i > 0) + if (i > 0) { EMIT(NFA_CONCAT); - if ((i += utf_char2len(c)) >= plen) + } + if ((i += utf_char2len(c)) >= plen) { break; + } c = utf_ptr2char((char *)old_regparse + i); } EMIT(NFA_COMPOSING); @@ -2047,8 +2550,8 @@ nfa_do_multibyte: * times the atom can be matched. Example: "a*" matches any sequence of "a" * characters: "", "a", "aa", etc. * - * piece ::= atom - * or atom multi + * piece ::= atom + * or atom multi */ static int nfa_regpiece(void) { @@ -2068,16 +2571,17 @@ static int nfa_regpiece(void) // next. save_parse_state(&old_state); - /* store current pos in the postfix form, for \{m,n} involving 0s */ + // store current pos in the postfix form, for \{m,n} involving 0s my_post_start = (int)(post_ptr - post_start); ret = nfa_regatom(); - if (ret == FAIL) - return FAIL; /* cascaded error */ - + if (ret == FAIL) { + return FAIL; // cascaded error + } op = peekchr(); - if (re_multi_type(op) == NOT_MULTI) + if (re_multi_type(op) == NOT_MULTI) { return OK; + } skipchr(); switch (op) { @@ -2099,37 +2603,39 @@ static int nfa_regpiece(void) */ restore_parse_state(&old_state); curchr = -1; - if (nfa_regatom() == FAIL) + if (nfa_regatom() == FAIL) { return FAIL; + } EMIT(NFA_STAR); EMIT(NFA_CONCAT); - skipchr(); /* skip the \+ */ + skipchr(); // skip the \+ break; case Magic('@'): c2 = getdecchrs(); op = no_Magic(getchr()); i = 0; - switch(op) { + switch (op) { case '=': - /* \@= */ + // \@= i = NFA_PREV_ATOM_NO_WIDTH; break; case '!': - /* \@! */ + // \@! i = NFA_PREV_ATOM_NO_WIDTH_NEG; break; case '<': op = no_Magic(getchr()); - if (op == '=') - /* \@<= */ + if (op == '=') { + // \@<= i = NFA_PREV_ATOM_JUST_BEFORE; - else if (op == '!') - /* \@<! */ + } else if (op == '!') { + // \@<! i = NFA_PREV_ATOM_JUST_BEFORE_NEG; + } break; case '>': - /* \@> */ + // \@> i = NFA_PREV_ATOM_LIKE_PATTERN; break; } @@ -2139,8 +2645,9 @@ static int nfa_regpiece(void) } EMIT(i); if (i == NFA_PREV_ATOM_JUST_BEFORE - || i == NFA_PREV_ATOM_JUST_BEFORE_NEG) + || i == NFA_PREV_ATOM_JUST_BEFORE_NEG) { EMIT(c2); + } break; case Magic('?'): @@ -2161,26 +2668,28 @@ static int nfa_regpiece(void) skipchr(); greedy = false; } - if (!read_limits(&minval, &maxval)) + if (!read_limits(&minval, &maxval)) { EMSG_RET_FAIL(_("E870: (NFA regexp) Error reading repetition limits")); + } // <atom>{0,inf}, <atom>{0,} and <atom>{} are equivalent to // <atom>* if (minval == 0 && maxval == MAX_LIMIT) { - if (greedy) - /* \{}, \{0,} */ + if (greedy) { + // \{}, \{0,} EMIT(NFA_STAR); - else - /* \{-}, \{-0,} */ + } else { + // \{-}, \{-0,} EMIT(NFA_STAR_NONGREEDY); + } break; } - /* Special case: x{0} or x{-0} */ + // Special case: x{0} or x{-0} if (maxval == 0) { - /* Ignore result of previous call to nfa_regatom() */ + // Ignore result of previous call to nfa_regatom() post_ptr = post_start + my_post_start; - /* NFA_EMPTY is 0-length and works everywhere */ + // NFA_EMPTY is 0-length and works everywhere EMIT(NFA_EMPTY); return OK; } @@ -2199,35 +2708,40 @@ static int nfa_regpiece(void) return FAIL; } - /* Ignore previous call to nfa_regatom() */ + // Ignore previous call to nfa_regatom() post_ptr = post_start + my_post_start; - /* Save parse state after the repeated atom and the \{} */ + // Save parse state after the repeated atom and the \{} save_parse_state(&new_state); quest = (greedy == true ? NFA_QUEST : NFA_QUEST_NONGREEDY); for (i = 0; i < maxval; i++) { - /* Goto beginning of the repeated atom */ + // Goto beginning of the repeated atom restore_parse_state(&old_state); old_post_pos = (int)(post_ptr - post_start); - if (nfa_regatom() == FAIL) + if (nfa_regatom() == FAIL) { return FAIL; - /* after "minval" times, atoms are optional */ + } + // after "minval" times, atoms are optional if (i + 1 > minval) { if (maxval == MAX_LIMIT) { - if (greedy) + if (greedy) { EMIT(NFA_STAR); - else + } else { EMIT(NFA_STAR_NONGREEDY); - } else + } + } else { EMIT(quest); + } } - if (old_post_pos != my_post_start) + if (old_post_pos != my_post_start) { EMIT(NFA_CONCAT); - if (i + 1 > minval && maxval == MAX_LIMIT) + } + if (i + 1 > minval && maxval == MAX_LIMIT) { break; + } } - /* Go to just after the repeated atom and the \{} */ + // Go to just after the repeated atom and the \{} restore_parse_state(&new_state); curchr = -1; @@ -2236,7 +2750,7 @@ static int nfa_regpiece(void) default: break; - } /* end switch */ + } // end switch if (re_multi_type(peekchr()) != NOT_MULTI) { // Can't have a multi follow a multi. @@ -2251,10 +2765,10 @@ static int nfa_regpiece(void) * first piece, followed by a match for the second piece, etc. Example: * "f[0-9]b", first matches "f", then a digit and then "b". * - * concat ::= piece - * or piece piece - * or piece piece piece - * etc. + * concat ::= piece + * or piece piece + * or piece piece piece + * etc. */ static int nfa_regconcat(void) { @@ -2326,10 +2840,10 @@ static int nfa_regconcat(void) * "foobeep\&..." matches "foo" in "foobeep". * ".*Peter\&.*Bob" matches in a line containing both "Peter" and "Bob" * - * branch ::= concat - * or concat \& concat - * or concat \& concat \& concat - * etc. + * branch ::= concat + * or concat \& concat + * or concat \& concat \& concat + * etc. */ static int nfa_regbranch(void) { @@ -2337,9 +2851,10 @@ static int nfa_regbranch(void) old_post_pos = (int)(post_ptr - post_start); - /* First branch, possibly the only one */ - if (nfa_regconcat() == FAIL) + // First branch, possibly the only one + if (nfa_regconcat() == FAIL) { return FAIL; + } // Try next concats while (peekchr() == Magic('&')) { @@ -2351,71 +2866,76 @@ static int nfa_regbranch(void) EMIT(NFA_NOPEN); EMIT(NFA_PREV_ATOM_NO_WIDTH); old_post_pos = (int)(post_ptr - post_start); - if (nfa_regconcat() == FAIL) + if (nfa_regconcat() == FAIL) { return FAIL; - /* if concat is empty do emit a node */ - if (old_post_pos == (int)(post_ptr - post_start)) + } + // if concat is empty do emit a node + if (old_post_pos == (int)(post_ptr - post_start)) { EMIT(NFA_EMPTY); + } EMIT(NFA_CONCAT); } - /* if a branch is empty, emit one node for it */ - if (old_post_pos == (int)(post_ptr - post_start)) + // if a branch is empty, emit one node for it + if (old_post_pos == (int)(post_ptr - post_start)) { EMIT(NFA_EMPTY); + } return OK; } -/* - * Parse a pattern, one or more branches, separated by "\|". It matches - * anything that matches one of the branches. Example: "foo\|beep" matches - * "foo" and matches "beep". If more than one branch matches, the first one - * is used. - * - * pattern ::= branch - * or branch \| branch - * or branch \| branch \| branch - * etc. - */ -static int -nfa_reg ( - int paren /* REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN */ -) +/// Parse a pattern, one or more branches, separated by "\|". It matches +/// anything that matches one of the branches. Example: "foo\|beep" matches +/// "foo" and matches "beep". If more than one branch matches, the first one +/// is used. +/// +/// pattern ::= branch +/// or branch \| branch +/// or branch \| branch \| branch +/// etc. +/// +/// @param paren REG_NOPAREN, REG_PAREN, REG_NPAREN or REG_ZPAREN +static int nfa_reg(int paren) { int parno = 0; if (paren == REG_PAREN) { - if (regnpar >= NSUBEXP) /* Too many `(' */ + if (regnpar >= NSUBEXP) { // Too many `(' EMSG_RET_FAIL(_("E872: (NFA regexp) Too many '('")); + } parno = regnpar++; } else if (paren == REG_ZPAREN) { - /* Make a ZOPEN node. */ - if (regnzpar >= NSUBEXP) + // Make a ZOPEN node. + if (regnzpar >= NSUBEXP) { EMSG_RET_FAIL(_("E879: (NFA regexp) Too many \\z(")); + } parno = regnzpar++; } - if (nfa_regbranch() == FAIL) - return FAIL; /* cascaded error */ - + if (nfa_regbranch() == FAIL) { + return FAIL; // cascaded error + } while (peekchr() == Magic('|')) { skipchr(); - if (nfa_regbranch() == FAIL) - return FAIL; /* cascaded error */ + if (nfa_regbranch() == FAIL) { + return FAIL; // cascaded error + } EMIT(NFA_OR); } - /* Check for proper termination. */ + // Check for proper termination. if (paren != REG_NOPAREN && getchr() != Magic(')')) { - if (paren == REG_NPAREN) + if (paren == REG_NPAREN) { EMSG2_RET_FAIL(_(e_unmatchedpp), reg_magic == MAGIC_ALL); - else + } else { EMSG2_RET_FAIL(_(e_unmatchedp), reg_magic == MAGIC_ALL); + } } else if (paren == REG_NOPAREN && peekchr() != NUL) { - if (peekchr() == Magic(')')) + if (peekchr() == Magic(')')) { EMSG2_RET_FAIL(_(e_unmatchedpar), reg_magic == MAGIC_ALL); - else + } else { EMSG_RET_FAIL(_("E873: (NFA regexp) proper termination error")); + } } // Here we set the flag allowing back references to this set of // parentheses. @@ -2443,32 +2963,57 @@ static void nfa_set_code(int c) STRCPY(code, ""); switch (c) { - case NFA_MATCH: STRCPY(code, "NFA_MATCH "); break; - case NFA_SPLIT: STRCPY(code, "NFA_SPLIT "); break; - case NFA_CONCAT: STRCPY(code, "NFA_CONCAT "); break; - case NFA_NEWL: STRCPY(code, "NFA_NEWL "); break; - case NFA_ZSTART: STRCPY(code, "NFA_ZSTART"); break; - case NFA_ZEND: STRCPY(code, "NFA_ZEND"); break; - - case NFA_BACKREF1: STRCPY(code, "NFA_BACKREF1"); break; - case NFA_BACKREF2: STRCPY(code, "NFA_BACKREF2"); break; - case NFA_BACKREF3: STRCPY(code, "NFA_BACKREF3"); break; - case NFA_BACKREF4: STRCPY(code, "NFA_BACKREF4"); break; - case NFA_BACKREF5: STRCPY(code, "NFA_BACKREF5"); break; - case NFA_BACKREF6: STRCPY(code, "NFA_BACKREF6"); break; - case NFA_BACKREF7: STRCPY(code, "NFA_BACKREF7"); break; - case NFA_BACKREF8: STRCPY(code, "NFA_BACKREF8"); break; - case NFA_BACKREF9: STRCPY(code, "NFA_BACKREF9"); break; - case NFA_ZREF1: STRCPY(code, "NFA_ZREF1"); break; - case NFA_ZREF2: STRCPY(code, "NFA_ZREF2"); break; - case NFA_ZREF3: STRCPY(code, "NFA_ZREF3"); break; - case NFA_ZREF4: STRCPY(code, "NFA_ZREF4"); break; - case NFA_ZREF5: STRCPY(code, "NFA_ZREF5"); break; - case NFA_ZREF6: STRCPY(code, "NFA_ZREF6"); break; - case NFA_ZREF7: STRCPY(code, "NFA_ZREF7"); break; - case NFA_ZREF8: STRCPY(code, "NFA_ZREF8"); break; - case NFA_ZREF9: STRCPY(code, "NFA_ZREF9"); break; - case NFA_SKIP: STRCPY(code, "NFA_SKIP"); break; + case NFA_MATCH: + STRCPY(code, "NFA_MATCH "); break; + case NFA_SPLIT: + STRCPY(code, "NFA_SPLIT "); break; + case NFA_CONCAT: + STRCPY(code, "NFA_CONCAT "); break; + case NFA_NEWL: + STRCPY(code, "NFA_NEWL "); break; + case NFA_ZSTART: + STRCPY(code, "NFA_ZSTART"); break; + case NFA_ZEND: + STRCPY(code, "NFA_ZEND"); break; + + case NFA_BACKREF1: + STRCPY(code, "NFA_BACKREF1"); break; + case NFA_BACKREF2: + STRCPY(code, "NFA_BACKREF2"); break; + case NFA_BACKREF3: + STRCPY(code, "NFA_BACKREF3"); break; + case NFA_BACKREF4: + STRCPY(code, "NFA_BACKREF4"); break; + case NFA_BACKREF5: + STRCPY(code, "NFA_BACKREF5"); break; + case NFA_BACKREF6: + STRCPY(code, "NFA_BACKREF6"); break; + case NFA_BACKREF7: + STRCPY(code, "NFA_BACKREF7"); break; + case NFA_BACKREF8: + STRCPY(code, "NFA_BACKREF8"); break; + case NFA_BACKREF9: + STRCPY(code, "NFA_BACKREF9"); break; + case NFA_ZREF1: + STRCPY(code, "NFA_ZREF1"); break; + case NFA_ZREF2: + STRCPY(code, "NFA_ZREF2"); break; + case NFA_ZREF3: + STRCPY(code, "NFA_ZREF3"); break; + case NFA_ZREF4: + STRCPY(code, "NFA_ZREF4"); break; + case NFA_ZREF5: + STRCPY(code, "NFA_ZREF5"); break; + case NFA_ZREF6: + STRCPY(code, "NFA_ZREF6"); break; + case NFA_ZREF7: + STRCPY(code, "NFA_ZREF7"); break; + case NFA_ZREF8: + STRCPY(code, "NFA_ZREF8"); break; + case NFA_ZREF9: + STRCPY(code, "NFA_ZREF9"); break; + case NFA_SKIP: + STRCPY(code, "NFA_SKIP"); break; case NFA_PREV_ATOM_NO_WIDTH: STRCPY(code, "NFA_PREV_ATOM_NO_WIDTH"); break; @@ -2481,9 +3026,12 @@ static void nfa_set_code(int c) case NFA_PREV_ATOM_LIKE_PATTERN: STRCPY(code, "NFA_PREV_ATOM_LIKE_PATTERN"); break; - case NFA_NOPEN: STRCPY(code, "NFA_NOPEN"); break; - case NFA_NCLOSE: STRCPY(code, "NFA_NCLOSE"); break; - case NFA_START_INVISIBLE: STRCPY(code, "NFA_START_INVISIBLE"); break; + case NFA_NOPEN: + STRCPY(code, "NFA_NOPEN"); break; + case NFA_NCLOSE: + STRCPY(code, "NFA_NCLOSE"); break; + case NFA_START_INVISIBLE: + STRCPY(code, "NFA_START_INVISIBLE"); break; case NFA_START_INVISIBLE_FIRST: STRCPY(code, "NFA_START_INVISIBLE_FIRST"); break; case NFA_START_INVISIBLE_NEG: @@ -2498,14 +3046,21 @@ static void nfa_set_code(int c) STRCPY(code, "NFA_START_INVISIBLE_BEFORE_NEG"); break; case NFA_START_INVISIBLE_BEFORE_NEG_FIRST: STRCPY(code, "NFA_START_INVISIBLE_BEFORE_NEG_FIRST"); break; - case NFA_START_PATTERN: STRCPY(code, "NFA_START_PATTERN"); break; - case NFA_END_INVISIBLE: STRCPY(code, "NFA_END_INVISIBLE"); break; - case NFA_END_INVISIBLE_NEG: STRCPY(code, "NFA_END_INVISIBLE_NEG"); break; - case NFA_END_PATTERN: STRCPY(code, "NFA_END_PATTERN"); break; + case NFA_START_PATTERN: + STRCPY(code, "NFA_START_PATTERN"); break; + case NFA_END_INVISIBLE: + STRCPY(code, "NFA_END_INVISIBLE"); break; + case NFA_END_INVISIBLE_NEG: + STRCPY(code, "NFA_END_INVISIBLE_NEG"); break; + case NFA_END_PATTERN: + STRCPY(code, "NFA_END_PATTERN"); break; - case NFA_COMPOSING: STRCPY(code, "NFA_COMPOSING"); break; - case NFA_END_COMPOSING: STRCPY(code, "NFA_END_COMPOSING"); break; - case NFA_OPT_CHARS: STRCPY(code, "NFA_OPT_CHARS"); break; + case NFA_COMPOSING: + STRCPY(code, "NFA_COMPOSING"); break; + case NFA_END_COMPOSING: + STRCPY(code, "NFA_END_COMPOSING"); break; + case NFA_OPT_CHARS: + STRCPY(code, "NFA_OPT_CHARS"); break; case NFA_MOPEN: case NFA_MOPEN1: @@ -2559,94 +3114,178 @@ static void nfa_set_code(int c) STRCPY(code, "NFA_ZCLOSE(x)"); code[11] = c - NFA_ZCLOSE + '0'; break; - case NFA_EOL: STRCPY(code, "NFA_EOL "); break; - case NFA_BOL: STRCPY(code, "NFA_BOL "); break; - case NFA_EOW: STRCPY(code, "NFA_EOW "); break; - case NFA_BOW: STRCPY(code, "NFA_BOW "); break; - case NFA_EOF: STRCPY(code, "NFA_EOF "); break; - case NFA_BOF: STRCPY(code, "NFA_BOF "); break; - case NFA_LNUM: STRCPY(code, "NFA_LNUM "); break; - case NFA_LNUM_GT: STRCPY(code, "NFA_LNUM_GT "); break; - case NFA_LNUM_LT: STRCPY(code, "NFA_LNUM_LT "); break; - case NFA_COL: STRCPY(code, "NFA_COL "); break; - case NFA_COL_GT: STRCPY(code, "NFA_COL_GT "); break; - case NFA_COL_LT: STRCPY(code, "NFA_COL_LT "); break; - case NFA_VCOL: STRCPY(code, "NFA_VCOL "); break; - case NFA_VCOL_GT: STRCPY(code, "NFA_VCOL_GT "); break; - case NFA_VCOL_LT: STRCPY(code, "NFA_VCOL_LT "); break; - case NFA_MARK: STRCPY(code, "NFA_MARK "); break; - case NFA_MARK_GT: STRCPY(code, "NFA_MARK_GT "); break; - case NFA_MARK_LT: STRCPY(code, "NFA_MARK_LT "); break; - case NFA_CURSOR: STRCPY(code, "NFA_CURSOR "); break; - case NFA_VISUAL: STRCPY(code, "NFA_VISUAL "); break; - case NFA_ANY_COMPOSING: STRCPY(code, "NFA_ANY_COMPOSING "); break; - - case NFA_STAR: STRCPY(code, "NFA_STAR "); break; - case NFA_STAR_NONGREEDY: STRCPY(code, "NFA_STAR_NONGREEDY "); break; - case NFA_QUEST: STRCPY(code, "NFA_QUEST"); break; - case NFA_QUEST_NONGREEDY: STRCPY(code, "NFA_QUEST_NON_GREEDY"); break; - case NFA_EMPTY: STRCPY(code, "NFA_EMPTY"); break; - case NFA_OR: STRCPY(code, "NFA_OR"); break; - - case NFA_START_COLL: STRCPY(code, "NFA_START_COLL"); break; - case NFA_END_COLL: STRCPY(code, "NFA_END_COLL"); break; - case NFA_START_NEG_COLL: STRCPY(code, "NFA_START_NEG_COLL"); break; - case NFA_END_NEG_COLL: STRCPY(code, "NFA_END_NEG_COLL"); break; - case NFA_RANGE: STRCPY(code, "NFA_RANGE"); break; - case NFA_RANGE_MIN: STRCPY(code, "NFA_RANGE_MIN"); break; - case NFA_RANGE_MAX: STRCPY(code, "NFA_RANGE_MAX"); break; - - case NFA_CLASS_ALNUM: STRCPY(code, "NFA_CLASS_ALNUM"); break; - case NFA_CLASS_ALPHA: STRCPY(code, "NFA_CLASS_ALPHA"); break; - case NFA_CLASS_BLANK: STRCPY(code, "NFA_CLASS_BLANK"); break; - case NFA_CLASS_CNTRL: STRCPY(code, "NFA_CLASS_CNTRL"); break; - case NFA_CLASS_DIGIT: STRCPY(code, "NFA_CLASS_DIGIT"); break; - case NFA_CLASS_GRAPH: STRCPY(code, "NFA_CLASS_GRAPH"); break; - case NFA_CLASS_LOWER: STRCPY(code, "NFA_CLASS_LOWER"); break; - case NFA_CLASS_PRINT: STRCPY(code, "NFA_CLASS_PRINT"); break; - case NFA_CLASS_PUNCT: STRCPY(code, "NFA_CLASS_PUNCT"); break; - case NFA_CLASS_SPACE: STRCPY(code, "NFA_CLASS_SPACE"); break; - case NFA_CLASS_UPPER: STRCPY(code, "NFA_CLASS_UPPER"); break; - case NFA_CLASS_XDIGIT: STRCPY(code, "NFA_CLASS_XDIGIT"); break; - case NFA_CLASS_TAB: STRCPY(code, "NFA_CLASS_TAB"); break; - case NFA_CLASS_RETURN: STRCPY(code, "NFA_CLASS_RETURN"); break; - case NFA_CLASS_BACKSPACE: STRCPY(code, "NFA_CLASS_BACKSPACE"); break; - case NFA_CLASS_ESCAPE: STRCPY(code, "NFA_CLASS_ESCAPE"); break; - case NFA_CLASS_IDENT: STRCPY(code, "NFA_CLASS_IDENT"); break; - case NFA_CLASS_KEYWORD: STRCPY(code, "NFA_CLASS_KEYWORD"); break; - case NFA_CLASS_FNAME: STRCPY(code, "NFA_CLASS_FNAME"); break; - - case NFA_ANY: STRCPY(code, "NFA_ANY"); break; - case NFA_IDENT: STRCPY(code, "NFA_IDENT"); break; - case NFA_SIDENT: STRCPY(code, "NFA_SIDENT"); break; - case NFA_KWORD: STRCPY(code, "NFA_KWORD"); break; - case NFA_SKWORD: STRCPY(code, "NFA_SKWORD"); break; - case NFA_FNAME: STRCPY(code, "NFA_FNAME"); break; - case NFA_SFNAME: STRCPY(code, "NFA_SFNAME"); break; - case NFA_PRINT: STRCPY(code, "NFA_PRINT"); break; - case NFA_SPRINT: STRCPY(code, "NFA_SPRINT"); break; - case NFA_WHITE: STRCPY(code, "NFA_WHITE"); break; - case NFA_NWHITE: STRCPY(code, "NFA_NWHITE"); break; - case NFA_DIGIT: STRCPY(code, "NFA_DIGIT"); break; - case NFA_NDIGIT: STRCPY(code, "NFA_NDIGIT"); break; - case NFA_HEX: STRCPY(code, "NFA_HEX"); break; - case NFA_NHEX: STRCPY(code, "NFA_NHEX"); break; - case NFA_OCTAL: STRCPY(code, "NFA_OCTAL"); break; - case NFA_NOCTAL: STRCPY(code, "NFA_NOCTAL"); break; - case NFA_WORD: STRCPY(code, "NFA_WORD"); break; - case NFA_NWORD: STRCPY(code, "NFA_NWORD"); break; - case NFA_HEAD: STRCPY(code, "NFA_HEAD"); break; - case NFA_NHEAD: STRCPY(code, "NFA_NHEAD"); break; - case NFA_ALPHA: STRCPY(code, "NFA_ALPHA"); break; - case NFA_NALPHA: STRCPY(code, "NFA_NALPHA"); break; - case NFA_LOWER: STRCPY(code, "NFA_LOWER"); break; - case NFA_NLOWER: STRCPY(code, "NFA_NLOWER"); break; - case NFA_UPPER: STRCPY(code, "NFA_UPPER"); break; - case NFA_NUPPER: STRCPY(code, "NFA_NUPPER"); break; - case NFA_LOWER_IC: STRCPY(code, "NFA_LOWER_IC"); break; - case NFA_NLOWER_IC: STRCPY(code, "NFA_NLOWER_IC"); break; - case NFA_UPPER_IC: STRCPY(code, "NFA_UPPER_IC"); break; - case NFA_NUPPER_IC: STRCPY(code, "NFA_NUPPER_IC"); break; + case NFA_EOL: + STRCPY(code, "NFA_EOL "); break; + case NFA_BOL: + STRCPY(code, "NFA_BOL "); break; + case NFA_EOW: + STRCPY(code, "NFA_EOW "); break; + case NFA_BOW: + STRCPY(code, "NFA_BOW "); break; + case NFA_EOF: + STRCPY(code, "NFA_EOF "); break; + case NFA_BOF: + STRCPY(code, "NFA_BOF "); break; + case NFA_LNUM: + STRCPY(code, "NFA_LNUM "); break; + case NFA_LNUM_GT: + STRCPY(code, "NFA_LNUM_GT "); break; + case NFA_LNUM_LT: + STRCPY(code, "NFA_LNUM_LT "); break; + case NFA_COL: + STRCPY(code, "NFA_COL "); break; + case NFA_COL_GT: + STRCPY(code, "NFA_COL_GT "); break; + case NFA_COL_LT: + STRCPY(code, "NFA_COL_LT "); break; + case NFA_VCOL: + STRCPY(code, "NFA_VCOL "); break; + case NFA_VCOL_GT: + STRCPY(code, "NFA_VCOL_GT "); break; + case NFA_VCOL_LT: + STRCPY(code, "NFA_VCOL_LT "); break; + case NFA_MARK: + STRCPY(code, "NFA_MARK "); break; + case NFA_MARK_GT: + STRCPY(code, "NFA_MARK_GT "); break; + case NFA_MARK_LT: + STRCPY(code, "NFA_MARK_LT "); break; + case NFA_CURSOR: + STRCPY(code, "NFA_CURSOR "); break; + case NFA_VISUAL: + STRCPY(code, "NFA_VISUAL "); break; + case NFA_ANY_COMPOSING: + STRCPY(code, "NFA_ANY_COMPOSING "); break; + + case NFA_STAR: + STRCPY(code, "NFA_STAR "); break; + case NFA_STAR_NONGREEDY: + STRCPY(code, "NFA_STAR_NONGREEDY "); break; + case NFA_QUEST: + STRCPY(code, "NFA_QUEST"); break; + case NFA_QUEST_NONGREEDY: + STRCPY(code, "NFA_QUEST_NON_GREEDY"); break; + case NFA_EMPTY: + STRCPY(code, "NFA_EMPTY"); break; + case NFA_OR: + STRCPY(code, "NFA_OR"); break; + + case NFA_START_COLL: + STRCPY(code, "NFA_START_COLL"); break; + case NFA_END_COLL: + STRCPY(code, "NFA_END_COLL"); break; + case NFA_START_NEG_COLL: + STRCPY(code, "NFA_START_NEG_COLL"); break; + case NFA_END_NEG_COLL: + STRCPY(code, "NFA_END_NEG_COLL"); break; + case NFA_RANGE: + STRCPY(code, "NFA_RANGE"); break; + case NFA_RANGE_MIN: + STRCPY(code, "NFA_RANGE_MIN"); break; + case NFA_RANGE_MAX: + STRCPY(code, "NFA_RANGE_MAX"); break; + + case NFA_CLASS_ALNUM: + STRCPY(code, "NFA_CLASS_ALNUM"); break; + case NFA_CLASS_ALPHA: + STRCPY(code, "NFA_CLASS_ALPHA"); break; + case NFA_CLASS_BLANK: + STRCPY(code, "NFA_CLASS_BLANK"); break; + case NFA_CLASS_CNTRL: + STRCPY(code, "NFA_CLASS_CNTRL"); break; + case NFA_CLASS_DIGIT: + STRCPY(code, "NFA_CLASS_DIGIT"); break; + case NFA_CLASS_GRAPH: + STRCPY(code, "NFA_CLASS_GRAPH"); break; + case NFA_CLASS_LOWER: + STRCPY(code, "NFA_CLASS_LOWER"); break; + case NFA_CLASS_PRINT: + STRCPY(code, "NFA_CLASS_PRINT"); break; + case NFA_CLASS_PUNCT: + STRCPY(code, "NFA_CLASS_PUNCT"); break; + case NFA_CLASS_SPACE: + STRCPY(code, "NFA_CLASS_SPACE"); break; + case NFA_CLASS_UPPER: + STRCPY(code, "NFA_CLASS_UPPER"); break; + case NFA_CLASS_XDIGIT: + STRCPY(code, "NFA_CLASS_XDIGIT"); break; + case NFA_CLASS_TAB: + STRCPY(code, "NFA_CLASS_TAB"); break; + case NFA_CLASS_RETURN: + STRCPY(code, "NFA_CLASS_RETURN"); break; + case NFA_CLASS_BACKSPACE: + STRCPY(code, "NFA_CLASS_BACKSPACE"); break; + case NFA_CLASS_ESCAPE: + STRCPY(code, "NFA_CLASS_ESCAPE"); break; + case NFA_CLASS_IDENT: + STRCPY(code, "NFA_CLASS_IDENT"); break; + case NFA_CLASS_KEYWORD: + STRCPY(code, "NFA_CLASS_KEYWORD"); break; + case NFA_CLASS_FNAME: + STRCPY(code, "NFA_CLASS_FNAME"); break; + + case NFA_ANY: + STRCPY(code, "NFA_ANY"); break; + case NFA_IDENT: + STRCPY(code, "NFA_IDENT"); break; + case NFA_SIDENT: + STRCPY(code, "NFA_SIDENT"); break; + case NFA_KWORD: + STRCPY(code, "NFA_KWORD"); break; + case NFA_SKWORD: + STRCPY(code, "NFA_SKWORD"); break; + case NFA_FNAME: + STRCPY(code, "NFA_FNAME"); break; + case NFA_SFNAME: + STRCPY(code, "NFA_SFNAME"); break; + case NFA_PRINT: + STRCPY(code, "NFA_PRINT"); break; + case NFA_SPRINT: + STRCPY(code, "NFA_SPRINT"); break; + case NFA_WHITE: + STRCPY(code, "NFA_WHITE"); break; + case NFA_NWHITE: + STRCPY(code, "NFA_NWHITE"); break; + case NFA_DIGIT: + STRCPY(code, "NFA_DIGIT"); break; + case NFA_NDIGIT: + STRCPY(code, "NFA_NDIGIT"); break; + case NFA_HEX: + STRCPY(code, "NFA_HEX"); break; + case NFA_NHEX: + STRCPY(code, "NFA_NHEX"); break; + case NFA_OCTAL: + STRCPY(code, "NFA_OCTAL"); break; + case NFA_NOCTAL: + STRCPY(code, "NFA_NOCTAL"); break; + case NFA_WORD: + STRCPY(code, "NFA_WORD"); break; + case NFA_NWORD: + STRCPY(code, "NFA_NWORD"); break; + case NFA_HEAD: + STRCPY(code, "NFA_HEAD"); break; + case NFA_NHEAD: + STRCPY(code, "NFA_NHEAD"); break; + case NFA_ALPHA: + STRCPY(code, "NFA_ALPHA"); break; + case NFA_NALPHA: + STRCPY(code, "NFA_NALPHA"); break; + case NFA_LOWER: + STRCPY(code, "NFA_LOWER"); break; + case NFA_NLOWER: + STRCPY(code, "NFA_NLOWER"); break; + case NFA_UPPER: + STRCPY(code, "NFA_UPPER"); break; + case NFA_NUPPER: + STRCPY(code, "NFA_NUPPER"); break; + case NFA_LOWER_IC: + STRCPY(code, "NFA_LOWER_IC"); break; + case NFA_NLOWER_IC: + STRCPY(code, "NFA_NLOWER_IC"); break; + case NFA_UPPER_IC: + STRCPY(code, "NFA_UPPER_IC"); break; + case NFA_NUPPER_IC: + STRCPY(code, "NFA_NUPPER_IC"); break; default: STRCPY(code, "CHAR(x)"); @@ -2659,8 +3298,8 @@ static void nfa_set_code(int c) } static FILE *log_fd; -static char_u e_log_open_failed[] = N_( - "Could not open temporary log file for writing, displaying on stderr... "); +static char_u e_log_open_failed[] = + N_("Could not open temporary log file for writing, displaying on stderr... "); /* * Print the postfix notation of the current regexp. @@ -2684,8 +3323,9 @@ static void nfa_postfix_dump(char_u *expr, int retval) fprintf(f, "%s, ", code); } fprintf(f, "\"\nPostfix notation (int): "); - for (p = post_start; *p && p < post_ptr; p++) + for (p = post_start; *p && p < post_ptr; p++) { fprintf(f, "%d ", *p); + } fprintf(f, "\n\n"); fclose(f); } @@ -2706,14 +3346,15 @@ static void nfa_print_state(FILE *debugf, nfa_state_T *state) static void nfa_print_state2(FILE *debugf, nfa_state_T *state, garray_T *indent) { - char_u *p; + char_u *p; - if (state == NULL) + if (state == NULL) { return; + } fprintf(debugf, "(%2d)", abs(state->id)); - /* Output indent */ + // Output indent p = (char_u *)indent->ga_data; if (indent->ga_len >= 3) { int last = indent->ga_len - 3; @@ -2722,39 +3363,42 @@ static void nfa_print_state2(FILE *debugf, nfa_state_T *state, garray_T *indent) STRNCPY(save, &p[last], 2); STRNCPY(&p[last], "+-", 2); fprintf(debugf, " %s", p); - STRNCPY(&p[last], save, 2); - } else + STRNCPY(&p[last], save, 2); // NOLINT(runtime/printf) + } else { fprintf(debugf, " %s", p); + } nfa_set_code(state->c); fprintf(debugf, "%s (%d) (id=%d) val=%d\n", - code, - state->c, - abs(state->id), - state->val); - if (state->id < 0) + code, + state->c, + abs(state->id), + state->val); + if (state->id < 0) { return; + } state->id = abs(state->id) * -1; - /* grow indent for state->out */ + // grow indent for state->out indent->ga_len -= 1; - if (state->out1) + if (state->out1) { ga_concat(indent, (char_u *)"| "); - else + } else { ga_concat(indent, (char_u *)" "); + } ga_append(indent, NUL); nfa_print_state2(debugf, state->out, indent); - /* replace last part of indent for state->out1 */ + // replace last part of indent for state->out1 indent->ga_len -= 3; ga_concat(indent, (char_u *)" "); ga_append(indent, NUL); nfa_print_state2(debugf, state->out1, indent); - /* shrink indent */ + // shrink indent indent->ga_len -= 3; ga_append(indent, NUL); } @@ -2769,13 +3413,16 @@ static void nfa_dump(nfa_regprog_T *prog) if (debugf != NULL) { nfa_print_state(debugf, prog->start); - if (prog->reganch) + if (prog->reganch) { fprintf(debugf, "reganch: %d\n", prog->reganch); - if (prog->regstart != NUL) + } + if (prog->regstart != NUL) { fprintf(debugf, "regstart: %c (decimal: %d)\n", - prog->regstart, prog->regstart); - if (prog->match_text != NULL) + prog->regstart, prog->regstart); + } + if (prog->match_text != NULL) { fprintf(debugf, "match_text: \"%s\"\n", prog->match_text); + } fclose(debugf); } @@ -2788,13 +3435,14 @@ static void nfa_dump(nfa_regprog_T *prog) */ static int *re2post(void) { - if (nfa_reg(REG_NOPAREN) == FAIL) + if (nfa_reg(REG_NOPAREN) == FAIL) { return NULL; + } EMIT(NFA_MOPEN); return post_start; } -/* NB. Some of the code below is inspired by Russ's. */ +// NB. Some of the code below is inspired by Russ's. /* * Represents an NFA state plus zero or one or two arrows exiting. @@ -2803,7 +3451,7 @@ static int *re2post(void) * If c < 256, labeled arrow with character c to out. */ -static nfa_state_T *state_ptr; /* points to nfa_prog->state */ +static nfa_state_T *state_ptr; // points to nfa_prog->state /* * Allocate and initialize nfa_state_T. @@ -2812,8 +3460,9 @@ static nfa_state_T *alloc_state(int c, nfa_state_T *out, nfa_state_T *out1) { nfa_state_T *s; - if (istate >= nstate) + if (istate >= nstate) { return NULL; + } s = &state_ptr[istate++]; @@ -2883,8 +3532,9 @@ static Ptrlist *append(Ptrlist *l1, Ptrlist *l2) Ptrlist *oldl1; oldl1 = l1; - while (l1->next) + while (l1->next) { l1 = l1->next; + } l1->next = l2; return oldl1; } @@ -2903,11 +3553,11 @@ static void st_error(int *postfix, int *end, int *p) df = fopen(NFA_REGEXP_ERROR_LOG, "a"); if (df) { fprintf(df, "Error popping the stack!\n"); -#ifdef REGEXP_DEBUG +# ifdef REGEXP_DEBUG fprintf(df, "Current regexp is \"%s\"\n", nfa_regengine.expr); -#endif +# endif fprintf(df, "Postfix form is: "); -#ifdef REGEXP_DEBUG +# ifdef REGEXP_DEBUG for (p2 = postfix; p2 < end; p2++) { nfa_set_code(*p2); fprintf(df, "%s, ", code); @@ -2918,7 +3568,7 @@ static void st_error(int *postfix, int *end, int *p) nfa_set_code(*p2); fprintf(df, "%s, ", code); } -#else +# else for (p2 = postfix; p2 < end; p2++) { fprintf(df, "%d, ", *p2); } @@ -2926,7 +3576,7 @@ static void st_error(int *postfix, int *end, int *p) for (p2 = postfix; p2 <= p; p2++) { fprintf(df, "%d, ", *p2); } -#endif +# endif fprintf(df, "\n--------------------------\n"); fclose(df); } @@ -2941,8 +3591,9 @@ static void st_push(Frag_T s, Frag_T **p, Frag_T *stack_end) { Frag_T *stackp = *p; - if (stackp >= stack_end) + if (stackp >= stack_end) { return; + } *stackp = s; *p = *p + 1; } @@ -2956,8 +3607,9 @@ static Frag_T st_pop(Frag_T **p, Frag_T *stack) *p = *p - 1; stackp = *p; - if (stackp < stack) + if (stackp < stack) { return empty; + } return **p; } @@ -2968,26 +3620,28 @@ static Frag_T st_pop(Frag_T **p, Frag_T *stack) static int nfa_max_width(nfa_state_T *startstate, int depth) { int l, r; - nfa_state_T *state = startstate; + nfa_state_T *state = startstate; int len = 0; - /* detect looping in a NFA_SPLIT */ - if (depth > 4) + // detect looping in a NFA_SPLIT + if (depth > 4) { return -1; + } while (state != NULL) { switch (state->c) { case NFA_END_INVISIBLE: case NFA_END_INVISIBLE_NEG: - /* the end, return what we have */ + // the end, return what we have return len; case NFA_SPLIT: - /* two alternatives, use the maximum */ + // two alternatives, use the maximum l = nfa_max_width(state->out, depth + 1); r = nfa_max_width(state->out1, depth + 1); - if (l < 0 || r < 0) + if (l < 0 || r < 0) { return -1; + } return len + (l > r ? l : r); case NFA_ANY: @@ -3006,8 +3660,8 @@ static int nfa_max_width(nfa_state_T *startstate, int depth) case NFA_WHITE: case NFA_HEX: case NFA_OCTAL: - /* ascii */ - ++len; + // ascii + len++; break; case NFA_IDENT: @@ -3045,7 +3699,7 @@ static int nfa_max_width(nfa_state_T *startstate, int depth) case NFA_START_INVISIBLE_NEG: case NFA_START_INVISIBLE_BEFORE: case NFA_START_INVISIBLE_BEFORE_NEG: - /* zero-width, out1 points to the END state */ + // zero-width, out1 points to the END state state = state->out1->out; continue; @@ -3069,7 +3723,7 @@ static int nfa_max_width(nfa_state_T *startstate, int depth) case NFA_ZREF9: case NFA_NEWL: case NFA_SKIP: - /* unknown width */ + // unknown width return -1; case NFA_BOL: @@ -3144,23 +3798,24 @@ static int nfa_max_width(nfa_state_T *startstate, int depth) case NFA_END_PATTERN: case NFA_COMPOSING: case NFA_END_COMPOSING: - /* zero-width */ + // zero-width break; default: - if (state->c < 0) - /* don't know what this is */ + if (state->c < 0) { + // don't know what this is return -1; + } // normal character len += utf_char2len(state->c); break; } - /* normal way to continue */ + // normal way to continue state = state->out; } - /* unrecognized, "cannot happen" */ + // unrecognized, "cannot happen" return -1; } @@ -3170,12 +3825,12 @@ static int nfa_max_width(nfa_state_T *startstate, int depth) */ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) { - int *p; + int *p; int mopen; int mclose; - Frag_T *stack = NULL; - Frag_T *stackp = NULL; - Frag_T *stack_end = NULL; + Frag_T *stack = NULL; + Frag_T *stackp = NULL; + Frag_T *stack_end = NULL; Frag_T e1; Frag_T e2; Frag_T e; @@ -3184,8 +3839,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) nfa_state_T *matchstate; nfa_state_T *ret = NULL; - if (postfix == NULL) + if (postfix == NULL) { return NULL; + } #define PUSH(s) st_push((s), &stackp, stack_end) #define POP() st_pop(&stackp, stack); \ @@ -3228,8 +3884,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) e2 = POP(); e1 = POP(); s = alloc_state(NFA_SPLIT, e1.start, e2.start); - if (s == NULL) + if (s == NULL) { goto theend; + } PUSH(frag(s, append(e1.out, e2.out))); break; @@ -3241,8 +3898,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s = alloc_state(NFA_SPLIT, e.start, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } patch(e.out, s); PUSH(frag(s, list1(&s->out1))); break; @@ -3255,8 +3913,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s = alloc_state(NFA_SPLIT, NULL, e.start); - if (s == NULL) + if (s == NULL) { goto theend; + } patch(e.out, s); PUSH(frag(s, list1(&s->out))); break; @@ -3269,8 +3928,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s = alloc_state(NFA_SPLIT, e.start, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } PUSH(frag(s, append(e.out, list1(&s->out1)))); break; @@ -3282,8 +3942,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s = alloc_state(NFA_SPLIT, NULL, e.start); - if (s == NULL) + if (s == NULL) { goto theend; + } PUSH(frag(s, append(e.out, list1(&s->out)))); break; @@ -3298,8 +3959,9 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s = alloc_state(NFA_END_COLL, NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } patch(e.out, s); e.start->out1 = s; PUSH(frag(e.start, list1(&s->out))); @@ -3329,13 +3991,13 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) break; } s = alloc_state(NFA_EMPTY, NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } PUSH(frag(s, list1(&s->out))); break; - case NFA_OPT_CHARS: - { + case NFA_OPT_CHARS: { int n; // \%[abc] implemented as: @@ -3354,16 +4016,18 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) nstate += n; break; } - s = NULL; /* avoid compiler warning */ - e1.out = NULL; /* stores list with out1's */ - s1 = NULL; /* previous NFA_SPLIT to connect to */ + s = NULL; // avoid compiler warning + e1.out = NULL; // stores list with out1's + s1 = NULL; // previous NFA_SPLIT to connect to while (n-- > 0) { - e = POP(); /* get character */ + e = POP(); // get character s = alloc_state(NFA_SPLIT, e.start, NULL); - if (s == NULL) + if (s == NULL) { goto theend; - if (e1.out == NULL) + } + if (e1.out == NULL) { e1 = e; + } patch(e.out, s1); append(e1.out, list1(&s->out1)); s1 = s; @@ -3376,8 +4040,7 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) case NFA_PREV_ATOM_NO_WIDTH_NEG: case NFA_PREV_ATOM_JUST_BEFORE: case NFA_PREV_ATOM_JUST_BEFORE_NEG: - case NFA_PREV_ATOM_LIKE_PATTERN: - { + case NFA_PREV_ATOM_LIKE_PATTERN: { int before = (*p == NFA_PREV_ATOM_JUST_BEFORE || *p == NFA_PREV_ATOM_JUST_BEFORE_NEG); int pattern = (*p == NFA_PREV_ATOM_LIKE_PATTERN); @@ -3404,15 +4067,15 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) start_state = NFA_START_INVISIBLE_BEFORE_NEG; end_state = NFA_END_INVISIBLE_NEG; break; - default: /* NFA_PREV_ATOM_LIKE_PATTERN: */ + default: // NFA_PREV_ATOM_LIKE_PATTERN: start_state = NFA_START_PATTERN; end_state = NFA_END_PATTERN; break; } - if (before) - n = *++p; /* get the count */ - + if (before) { + n = *++p; // get the count + } // The \@= operator: match the preceding atom with zero width. // The \@! operator: no match for the preceding atom. // The \@<= operator: match for the preceding atom. @@ -3426,14 +4089,16 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) } e = POP(); s1 = alloc_state(end_state, NULL, NULL); - if (s1 == NULL) + if (s1 == NULL) { goto theend; + } s = alloc_state(start_state, e.start, s1); - if (s == NULL) + if (s == NULL) { goto theend; + } if (pattern) { - /* NFA_ZEND -> NFA_END_PATTERN -> NFA_SKIP -> what follows. */ + // NFA_ZEND -> NFA_END_PATTERN -> NFA_SKIP -> what follows. skip = alloc_state(NFA_SKIP, NULL, NULL); if (skip == NULL) { goto theend; @@ -3463,7 +4128,7 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) case NFA_COMPOSING: // char with composing char FALLTHROUGH; - case NFA_MOPEN: /* \( \) Submatch */ + case NFA_MOPEN: // \( \) Submatch case NFA_MOPEN1: case NFA_MOPEN2: case NFA_MOPEN3: @@ -3473,7 +4138,7 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) case NFA_MOPEN7: case NFA_MOPEN8: case NFA_MOPEN9: - case NFA_ZOPEN: /* \z( \) Submatch */ + case NFA_ZOPEN: // \z( \) Submatch case NFA_ZOPEN1: case NFA_ZOPEN2: case NFA_ZOPEN3: @@ -3491,20 +4156,32 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) mopen = *p; switch (*p) { - case NFA_NOPEN: mclose = NFA_NCLOSE; break; - case NFA_ZOPEN: mclose = NFA_ZCLOSE; break; - case NFA_ZOPEN1: mclose = NFA_ZCLOSE1; break; - case NFA_ZOPEN2: mclose = NFA_ZCLOSE2; break; - case NFA_ZOPEN3: mclose = NFA_ZCLOSE3; break; - case NFA_ZOPEN4: mclose = NFA_ZCLOSE4; break; - case NFA_ZOPEN5: mclose = NFA_ZCLOSE5; break; - case NFA_ZOPEN6: mclose = NFA_ZCLOSE6; break; - case NFA_ZOPEN7: mclose = NFA_ZCLOSE7; break; - case NFA_ZOPEN8: mclose = NFA_ZCLOSE8; break; - case NFA_ZOPEN9: mclose = NFA_ZCLOSE9; break; - case NFA_COMPOSING: mclose = NFA_END_COMPOSING; break; + case NFA_NOPEN: + mclose = NFA_NCLOSE; break; + case NFA_ZOPEN: + mclose = NFA_ZCLOSE; break; + case NFA_ZOPEN1: + mclose = NFA_ZCLOSE1; break; + case NFA_ZOPEN2: + mclose = NFA_ZCLOSE2; break; + case NFA_ZOPEN3: + mclose = NFA_ZCLOSE3; break; + case NFA_ZOPEN4: + mclose = NFA_ZCLOSE4; break; + case NFA_ZOPEN5: + mclose = NFA_ZCLOSE5; break; + case NFA_ZOPEN6: + mclose = NFA_ZCLOSE6; break; + case NFA_ZOPEN7: + mclose = NFA_ZCLOSE7; break; + case NFA_ZOPEN8: + mclose = NFA_ZCLOSE8; break; + case NFA_ZOPEN9: + mclose = NFA_ZCLOSE9; break; + case NFA_COMPOSING: + mclose = NFA_END_COMPOSING; break; default: - /* NFA_MOPEN, NFA_MOPEN1 .. NFA_MOPEN9 */ + // NFA_MOPEN, NFA_MOPEN1 .. NFA_MOPEN9 mclose = *p + NSUBEXP; break; } @@ -3515,11 +4192,13 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) // empty groups of parenthesis, and empty mbyte chars if (stackp == stack) { s = alloc_state(mopen, NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } s1 = alloc_state(mclose, NULL, NULL); - if (s1 == NULL) + if (s1 == NULL) { goto theend; + } patch(list1(&s->out), s1); PUSH(frag(s, list1(&s1->out))); break; @@ -3528,18 +4207,21 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) // At least one node was emitted before NFA_MOPEN, so // at least one node will be between NFA_MOPEN and NFA_MCLOSE e = POP(); - s = alloc_state(mopen, e.start, NULL); /* `(' */ - if (s == NULL) + s = alloc_state(mopen, e.start, NULL); // `(' + if (s == NULL) { goto theend; + } - s1 = alloc_state(mclose, NULL, NULL); /* `)' */ - if (s1 == NULL) + s1 = alloc_state(mclose, NULL, NULL); // `)' + if (s1 == NULL) { goto theend; + } patch(e.out, s1); - if (mopen == NFA_COMPOSING) - /* COMPOSING->out1 = END_COMPOSING */ + if (mopen == NFA_COMPOSING) { + // COMPOSING->out1 = END_COMPOSING patch(list1(&s->out1), s1); + } PUSH(frag(s, list1(&s1->out))); break; @@ -3567,11 +4249,13 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) break; } s = alloc_state(*p, NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } s1 = alloc_state(NFA_SKIP, NULL, NULL); - if (s1 == NULL) + if (s1 == NULL) { goto theend; + } patch(list1(&s->out), s1); PUSH(frag(s, list1(&s1->out))); break; @@ -3587,17 +4271,17 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) case NFA_COL_LT: case NFA_MARK: case NFA_MARK_GT: - case NFA_MARK_LT: - { - int n = *++p; /* lnum, col or mark name */ + case NFA_MARK_LT: { + int n = *++p; // lnum, col or mark name if (nfa_calc_size == true) { nstate += 1; break; } s = alloc_state(p[-1], NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } s->val = n; PUSH(frag(s, list1(&s->out))); break; @@ -3612,18 +4296,17 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) break; } s = alloc_state(*p, NULL, NULL); - if (s == NULL) + if (s == NULL) { goto theend; + } PUSH(frag(s, list1(&s->out))); break; - - } /* switch(*p) */ - - } /* for(p = postfix; *p; ++p) */ + } // switch(*p) + } // for(p = postfix; *p; ++p) if (nfa_calc_size == true) { nstate++; - goto theend; /* Return value when counting size is ignored anyway */ + goto theend; // Return value when counting size is ignored anyway } e = POP(); @@ -3639,7 +4322,7 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) "Not enough space to store the whole NFA ")); } - matchstate = &state_ptr[istate++]; /* the match state */ + matchstate = &state_ptr[istate++]; // the match state matchstate->c = NFA_MATCH; matchstate->out = matchstate->out1 = NULL; matchstate->id = 0; @@ -3702,9 +4385,10 @@ static void nfa_postprocess(nfa_regprog_T *prog) directly = ch_follows < ch_invisible; } } - if (directly) - /* switch to the _FIRST state */ - ++prog->state[i].c; + if (directly) { + // switch to the _FIRST state + prog->state[i].c++; + } } } } @@ -3713,11 +4397,11 @@ static void nfa_postprocess(nfa_regprog_T *prog) // NFA execution code. ///////////////////////////////////////////////////////////////// -/* Values for done in nfa_pim_T. */ -#define NFA_PIM_UNUSED 0 /* pim not used */ -#define NFA_PIM_TODO 1 /* pim not done yet */ -#define NFA_PIM_MATCH 2 /* pim executed, matches */ -#define NFA_PIM_NOMATCH 3 /* pim executed, no match */ +// Values for done in nfa_pim_T. +#define NFA_PIM_UNUSED 0 // pim not used +#define NFA_PIM_TODO 1 // pim not done yet +#define NFA_PIM_MATCH 2 // pim executed, matches +#define NFA_PIM_NOMATCH 3 // pim executed, no match #ifdef REGEXP_DEBUG @@ -3733,23 +4417,24 @@ static void log_subexpr(regsub_T *sub) { int j; - for (j = 0; j < sub->in_use; j++) - if (REG_MULTI) + for (j = 0; j < sub->in_use; j++) { + if (REG_MULTI) { fprintf(log_fd, "*** group %d, start: c=%d, l=%d, end: c=%d, l=%d\n", - j, - sub->list.multi[j].start_col, - (int)sub->list.multi[j].start_lnum, - sub->list.multi[j].end_col, - (int)sub->list.multi[j].end_lnum); - else { + j, + sub->list.multi[j].start_col, + (int)sub->list.multi[j].start_lnum, + sub->list.multi[j].end_col, + (int)sub->list.multi[j].end_lnum); + } else { char *s = (char *)sub->list.line[j].start; char *e = (char *)sub->list.line[j].end; fprintf(log_fd, "*** group %d, start: \"%s\", end: \"%s\"\n", - j, - s == NULL ? "NULL" : s, - e == NULL ? "NULL" : e); + j, + s == NULL ? "NULL" : s, + e == NULL ? "NULL" : e); } + } } static char *pim_info(const nfa_pim_T *pim) @@ -3806,15 +4491,16 @@ static void copy_sub(regsub_T *to, regsub_T *from) { to->in_use = from->in_use; if (from->in_use > 0) { - /* Copy the match start and end positions. */ - if (REG_MULTI) + // Copy the match start and end positions. + if (REG_MULTI) { memmove(&to->list.multi[0], - &from->list.multi[0], - sizeof(struct multipos) * from->in_use); - else + &from->list.multi[0], + sizeof(struct multipos) * from->in_use); + } else { memmove(&to->list.line[0], - &from->list.line[0], - sizeof(struct linepos) * from->in_use); + &from->list.line[0], + sizeof(struct linepos) * from->in_use); + } } } @@ -3823,18 +4509,20 @@ static void copy_sub(regsub_T *to, regsub_T *from) */ static void copy_sub_off(regsub_T *to, regsub_T *from) { - if (to->in_use < from->in_use) + if (to->in_use < from->in_use) { to->in_use = from->in_use; + } if (from->in_use > 1) { - /* Copy the match start and end positions. */ - if (REG_MULTI) + // Copy the match start and end positions. + if (REG_MULTI) { memmove(&to->list.multi[1], - &from->list.multi[1], - sizeof(struct multipos) * (from->in_use - 1)); - else + &from->list.multi[1], + sizeof(struct multipos) * (from->in_use - 1)); + } else { memmove(&to->list.line[1], - &from->list.line[1], - sizeof(struct linepos) * (from->in_use - 1)); + &from->list.line[1], + sizeof(struct linepos) * (from->in_use - 1)); + } } } @@ -3845,13 +4533,14 @@ static void copy_ze_off(regsub_T *to, regsub_T *from) { if (rex.nfa_has_zend) { if (REG_MULTI) { - if (from->list.multi[0].end_lnum >= 0){ + if (from->list.multi[0].end_lnum >= 0) { to->list.multi[0].end_lnum = from->list.multi[0].end_lnum; to->list.multi[0].end_col = from->list.multi[0].end_col; } } else { - if (from->list.line[0].end != NULL) + if (from->list.line[0].end != NULL) { to->list.line[0].end = from->list.line[0].end; + } } } } @@ -3864,8 +4553,8 @@ static bool sub_equal(regsub_T *sub1, regsub_T *sub2) int todo; linenr_T s1; linenr_T s2; - char_u *sp1; - char_u *sp2; + char_u *sp1; + char_u *sp2; todo = sub1->in_use > sub2->in_use ? sub1->in_use : sub2->in_use; if (REG_MULTI) { @@ -3944,11 +4633,8 @@ static bool sub_equal(regsub_T *sub1, regsub_T *sub2) } #ifdef REGEXP_DEBUG -static void report_state(char *action, - regsub_T *sub, - nfa_state_T *state, - int lid, - nfa_pim_T *pim) { +static void report_state(char *action, regsub_T *sub, nfa_state_T *state, int lid, nfa_pim_T *pim) +{ int col; if (sub->in_use <= 0) { @@ -3966,14 +4652,14 @@ static void report_state(char *action, #endif -// Return true if the same state is already in list "l" with the same -// positions as "subs". -static bool has_state_with_pos( - nfa_list_T *l, // runtime state list - nfa_state_T *state, // state to update - regsubs_T *subs, // pointers to subexpressions - nfa_pim_T *pim // postponed match or NULL -) +/// @param l runtime state list +/// @param state state to update +/// @param subs pointers to subexpressions +/// @param pim postponed match or NULL +/// +/// @return true if the same state is already in list "l" with the same +/// positions as "subs". +static bool has_state_with_pos(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, nfa_pim_T *pim) FUNC_ATTR_NONNULL_ARG(1, 2, 3) { for (int i = 0; i < l->n; i++) { @@ -4048,7 +4734,7 @@ static bool match_follows(const nfa_state_T *startstate, int depth) case NFA_START_INVISIBLE_BEFORE_NEG: case NFA_START_INVISIBLE_BEFORE_NEG_FIRST: case NFA_COMPOSING: - /* skip ahead to next state */ + // skip ahead to next state state = state->out1->out; continue; @@ -4105,12 +4791,12 @@ static bool match_follows(const nfa_state_T *startstate, int depth) } -// Return true if "state" is already in list "l". -static bool state_in_list( - nfa_list_T *l, // runtime state list - nfa_state_T *state, // state to update - regsubs_T *subs // pointers to subexpressions -) +/// @param l runtime state list +/// @param state state to update +/// @param subs pointers to subexpressions +/// +/// @return true if "state" is already in list "l". +static bool state_in_list(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs) FUNC_ATTR_NONNULL_ALL { if (state->lastlist[nfa_ll_index] == l->id) { @@ -4124,15 +4810,18 @@ static bool state_in_list( // Offset used for "off" by addstate_here(). #define ADDSTATE_HERE_OFFSET 10 -// Add "state" and possibly what follows to state list ".". -// Returns "subs_arg", possibly copied into temp_subs. -// Returns NULL when recursiveness is too deep. -static regsubs_T *addstate( - nfa_list_T *l, // runtime state list - nfa_state_T *state, // state to update - regsubs_T *subs_arg, // pointers to subexpressions - nfa_pim_T *pim, // postponed look-behind match - int off_arg) // byte offset, when -1 go to next line +/// Add "state" and possibly what follows to state list ".". +/// +/// @param l runtime state list +/// @param state state to update +/// @param subs_arg pointers to subexpressions +/// @param pim postponed look-behind match +/// @param off_arg byte offset, when -1 go to next line +/// +/// @return "subs_arg", possibly copied into temp_subs. +/// NULL when recursiveness is too deep. +static regsubs_T *addstate(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs_arg, nfa_pim_T *pim, + int off_arg) FUNC_ATTR_NONNULL_ARG(1, 2) FUNC_ATTR_WARN_UNUSED_RESULT { int subidx; @@ -4141,13 +4830,13 @@ static regsubs_T *addstate( int listindex = 0; int k; int found = false; - nfa_thread_T *thread; - struct multipos save_multipos; + nfa_thread_T *thread; + struct multipos save_multipos; int save_in_use; - char_u *save_ptr; + char_u *save_ptr; int i; - regsub_T *sub; - regsubs_T *subs = subs_arg; + regsub_T *sub; + regsubs_T *subs = subs_arg; static regsubs_T temp_subs; #ifdef REGEXP_DEBUG int did_print = false; @@ -4259,12 +4948,13 @@ static regsubs_T *addstate( skip_add: #ifdef REGEXP_DEBUG nfa_set_code(state->c); - fprintf(log_fd, "> Not adding state %d to list %d. char %d: %s pim: %s has_pim: %d found: %d\n", + fprintf(log_fd, + "> Not adding state %d to list %d. char %d: %s pim: %s has_pim: %d found: %d\n", abs(state->id), l->id, state->c, code, pim == NULL ? "NULL" : "yes", l->has_pim, found); #endif - depth--; - return subs; + depth--; + return subs; } } @@ -4301,13 +4991,13 @@ skip_add: l->len = newlen; } - /* add the state to the list */ + // add the state to the list state->lastlist[nfa_ll_index] = l->id; thread = &l->t[l->n++]; thread->state = state; - if (pim == NULL) + if (pim == NULL) { thread->pim.result = NFA_PIM_UNUSED; - else { + } else { copy_pim(&thread->pim, pim); l->has_pim = true; } @@ -4322,15 +5012,16 @@ skip_add: } #ifdef REGEXP_DEBUG - if (!did_print) + if (!did_print) { report_state("Processing", &subs->norm, state, l->id, pim); + } #endif switch (state->c) { case NFA_MATCH: break; case NFA_SPLIT: - /* order matters here */ + // order matters here subs = addstate(l, state->out, subs, pim, off_arg); subs = addstate(l, state->out1, subs, pim, off_arg); break; @@ -4373,7 +5064,7 @@ skip_add: sub = &subs->norm; } - /* avoid compiler warnings */ + // avoid compiler warnings save_ptr = NULL; memset(&save_multipos, 0, sizeof(save_multipos)); @@ -4429,11 +5120,12 @@ skip_add: if (save_in_use == -1) { if (REG_MULTI) { sub->list.multi[subidx] = save_multipos; - } - else + } else { sub->list.line[subidx].start = save_ptr; - } else + } + } else { sub->in_use = save_in_use; + } break; case NFA_MCLOSE: @@ -4480,8 +5172,9 @@ skip_add: // We don't fill in gaps here, there must have been an MOPEN that // has done that. save_in_use = sub->in_use; - if (sub->in_use <= subidx) + if (sub->in_use <= subidx) { sub->in_use = subidx + 1; + } if (REG_MULTI) { save_multipos = sub->list.multi[subidx]; if (off == -1) { @@ -4492,7 +5185,7 @@ skip_add: sub->list.multi[subidx].end_col = (colnr_T)(rex.input - rex.line + off); } - /* avoid compiler warnings */ + // avoid compiler warnings save_ptr = NULL; } else { save_ptr = sub->list.line[subidx].end; @@ -4514,9 +5207,9 @@ skip_add: if (REG_MULTI) { sub->list.multi[subidx] = save_multipos; - } - else + } else { sub->list.line[subidx].end = save_ptr; + } sub->in_use = save_in_use; break; } @@ -4524,19 +5217,17 @@ skip_add: return subs; } -/* - * Like addstate(), but the new state(s) are put at position "*ip". - * Used for zero-width matches, next state to use is the added one. - * This makes sure the order of states to be tried does not change, which - * matters for alternatives. - */ -static regsubs_T *addstate_here( - nfa_list_T *l, // runtime state list - nfa_state_T *state, // state to update - regsubs_T *subs, // pointers to subexpressions - nfa_pim_T *pim, // postponed look-behind match - int *ip -) +/// Like addstate(), but the new state(s) are put at position "*ip". +/// Used for zero-width matches, next state to use is the added one. +/// This makes sure the order of states to be tried does not change, which +/// matters for alternatives. +/// +/// @param l runtime state list +/// @param state state to update +/// @param subs pointers to subexpressions +/// @param pim postponed look-behind match +static regsubs_T *addstate_here(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, nfa_pim_T *pim, + int *ip) FUNC_ATTR_NONNULL_ARG(1, 2, 5) FUNC_ATTR_WARN_UNUSED_RESULT { int tlen = l->n; @@ -4578,25 +5269,25 @@ static regsubs_T *addstate_here( nfa_thread_T *const newl = xmalloc(newsize); l->len = newlen; memmove(&(newl[0]), - &(l->t[0]), - sizeof(nfa_thread_T) * listidx); + &(l->t[0]), + sizeof(nfa_thread_T) * listidx); memmove(&(newl[listidx]), - &(l->t[l->n - count]), - sizeof(nfa_thread_T) * count); + &(l->t[l->n - count]), + sizeof(nfa_thread_T) * count); memmove(&(newl[listidx + count]), - &(l->t[listidx + 1]), - sizeof(nfa_thread_T) * (l->n - count - listidx - 1)); + &(l->t[listidx + 1]), + sizeof(nfa_thread_T) * (l->n - count - listidx - 1)); xfree(l->t); l->t = newl; } else { // make space for new states, then move them from the // end to the current position memmove(&(l->t[listidx + count]), - &(l->t[listidx + 1]), - sizeof(nfa_thread_T) * (l->n - listidx - 1)); + &(l->t[listidx + 1]), + sizeof(nfa_thread_T) * (l->n - listidx - 1)); memmove(&(l->t[listidx]), - &(l->t[l->n - 1]), - sizeof(nfa_thread_T) * count); + &(l->t[l->n - 1]), + sizeof(nfa_thread_T) * count); } } --l->n; @@ -4622,8 +5313,9 @@ static int check_char_class(int class, int c) } break; case NFA_CLASS_BLANK: - if (c == ' ' || c == '\t') + if (c == ' ' || c == '\t') { return OK; + } break; case NFA_CLASS_CNTRL: if (c >= 1 && c <= 127 && iscntrl(c)) { @@ -4631,8 +5323,9 @@ static int check_char_class(int class, int c) } break; case NFA_CLASS_DIGIT: - if (ascii_isdigit(c)) + if (ascii_isdigit(c)) { return OK; + } break; case NFA_CLASS_GRAPH: if (c >= 1 && c <= 127 && isgraph(c)) { @@ -4645,8 +5338,9 @@ static int check_char_class(int class, int c) } break; case NFA_CLASS_PRINT: - if (vim_isprintc(c)) + if (vim_isprintc(c)) { return OK; + } break; case NFA_CLASS_PUNCT: if (c >= 1 && c < 128 && ispunct(c)) { @@ -4654,8 +5348,9 @@ static int check_char_class(int class, int c) } break; case NFA_CLASS_SPACE: - if ((c >= 9 && c <= 13) || (c == ' ')) + if ((c >= 9 && c <= 13) || (c == ' ')) { return OK; + } break; case NFA_CLASS_UPPER: if (mb_isupper(c)) { @@ -4663,20 +5358,24 @@ static int check_char_class(int class, int c) } break; case NFA_CLASS_XDIGIT: - if (ascii_isxdigit(c)) + if (ascii_isxdigit(c)) { return OK; + } break; case NFA_CLASS_TAB: - if (c == '\t') + if (c == '\t') { return OK; + } break; case NFA_CLASS_RETURN: - if (c == '\r') + if (c == '\r') { return OK; + } break; case NFA_CLASS_BACKSPACE: - if (c == '\b') + if (c == '\b') { return OK; + } break; case NFA_CLASS_ESCAPE: if (c == ESC) { @@ -4707,30 +5406,28 @@ static int check_char_class(int class, int c) return FAIL; } -/* - * Check for a match with subexpression "subidx". - * Return true if it matches. - */ -static int -match_backref ( - regsub_T *sub, /* pointers to subexpressions */ - int subidx, - int *bytelen /* out: length of match in bytes */ -) +/// Check for a match with subexpression "subidx". +/// +/// @param sub pointers to subexpressions +/// @param bytelen out: length of match in bytes +/// +/// @return true if it matches. +static int match_backref(regsub_T *sub, int subidx, int *bytelen) { int len; if (sub->in_use <= subidx) { retempty: - /* backref was not set, match an empty string */ + // backref was not set, match an empty string *bytelen = 0; return true; } if (REG_MULTI) { if (sub->list.multi[subidx].start_lnum < 0 - || sub->list.multi[subidx].end_lnum < 0) + || sub->list.multi[subidx].end_lnum < 0) { goto retempty; + } if (sub->list.multi[subidx].start_lnum == rex.lnum && sub->list.multi[subidx].end_lnum == rex.lnum) { len = sub->list.multi[subidx].end_col @@ -4751,8 +5448,9 @@ retempty: } } else { if (sub->list.line[subidx].start == NULL - || sub->list.line[subidx].end == NULL) + || sub->list.line[subidx].end == NULL) { goto retempty; + } len = (int)(sub->list.line[subidx].end - sub->list.line[subidx].start); if (cstrncmp(sub->list.line[subidx].start, rex.input, &len) == 0) { *bytelen = len; @@ -4763,22 +5461,18 @@ retempty: } - -/* - * Check for a match with \z subexpression "subidx". - * Return true if it matches. - */ -static int -match_zref ( - int subidx, - int *bytelen /* out: length of match in bytes */ -) +/// Check for a match with \z subexpression "subidx". +/// +/// @param bytelen out: length of match in bytes +/// +/// @return true if it matches. +static int match_zref(int subidx, int *bytelen) { int len; cleanup_zsubexpr(); if (re_extmatch_in == NULL || re_extmatch_in->matches[subidx] == NULL) { - /* backref was not set, match an empty string */ + // backref was not set, match an empty string *bytelen = 0; return true; } @@ -4799,11 +5493,11 @@ match_zref ( static void nfa_save_listids(nfa_regprog_T *prog, int *list) { int i; - nfa_state_T *p; + nfa_state_T *p; - /* Order in the list is reverse, it's a bit faster that way. */ + // Order in the list is reverse, it's a bit faster that way. p = &prog->state[0]; - for (i = prog->nstate; --i >= 0; ) { + for (i = prog->nstate; --i >= 0;) { list[i] = p->lastlist[1]; p->lastlist[1] = 0; ++p; @@ -4816,10 +5510,10 @@ static void nfa_save_listids(nfa_regprog_T *prog, int *list) static void nfa_restore_listids(nfa_regprog_T *prog, int *list) { int i; - nfa_state_T *p; + nfa_state_T *p; p = &prog->state[0]; - for (i = prog->nstate; --i >= 0; ) { + for (i = prog->nstate; --i >= 0;) { p->lastlist[1] = list[i]; ++p; } @@ -4827,8 +5521,12 @@ static void nfa_restore_listids(nfa_regprog_T *prog, int *list) static bool nfa_re_num_cmp(uintmax_t val, int op, uintmax_t pos) { - if (op == 1) return pos > val; - if (op == 2) return pos < val; + if (op == 1) { + return pos > val; + } + if (op == 2) { + return pos < val; + } return val == pos; } @@ -4838,9 +5536,8 @@ static bool nfa_re_num_cmp(uintmax_t val, int op, uintmax_t pos) * "pim" is NULL or contains info about a Postponed Invisible Match (start * position). */ -static int recursive_regmatch( - nfa_state_T *state, nfa_pim_T *pim, nfa_regprog_T *prog, - regsubs_T *submatch, regsubs_T *m, int **listids, int *listids_len) +static int recursive_regmatch(nfa_state_T *state, nfa_pim_T *pim, nfa_regprog_T *prog, + regsubs_T *submatch, regsubs_T *m, int **listids, int *listids_len) FUNC_ATTR_NONNULL_ARG(1, 3, 5, 6, 7) { const int save_reginput_col = (int)(rex.input - rex.line); @@ -4849,7 +5546,7 @@ static int recursive_regmatch( const int save_nfa_listid = rex.nfa_listid; save_se_T *const save_nfa_endp = nfa_endp; save_se_T endpos; - save_se_T *endposp = NULL; + save_se_T *endposp = NULL; int need_restore = false; if (pim != NULL) { @@ -4919,8 +5616,9 @@ static int recursive_regmatch( } #ifdef REGEXP_DEBUG - if (log_fd != stderr) + if (log_fd != stderr) { fclose(log_fd); + } log_fd = NULL; #endif // Have to clear the lastlist field of the NFA nodes, so that @@ -4998,28 +5696,30 @@ static int failure_chance(nfa_state_T *state, int depth) int c = state->c; int l, r; - /* detect looping */ - if (depth > 4) + // detect looping + if (depth > 4) { return 1; + } switch (c) { case NFA_SPLIT: - if (state->out->c == NFA_SPLIT || state->out1->c == NFA_SPLIT) - /* avoid recursive stuff */ + if (state->out->c == NFA_SPLIT || state->out1->c == NFA_SPLIT) { + // avoid recursive stuff return 1; - /* two alternatives, use the lowest failure chance */ + } + // two alternatives, use the lowest failure chance l = failure_chance(state->out, depth + 1); r = failure_chance(state->out1, depth + 1); return l < r ? l : r; case NFA_ANY: - /* matches anything, unlikely to fail */ + // matches anything, unlikely to fail return 1; case NFA_MATCH: case NFA_MCLOSE: case NFA_ANY_COMPOSING: - /* empty match works always */ + // empty match works always return 0; case NFA_START_INVISIBLE: @@ -5031,7 +5731,7 @@ static int failure_chance(nfa_state_T *state, int depth) case NFA_START_INVISIBLE_BEFORE_NEG: case NFA_START_INVISIBLE_BEFORE_NEG_FIRST: case NFA_START_PATTERN: - /* recursive regmatch is expensive, use low failure chance */ + // recursive regmatch is expensive, use low failure chance return 5; case NFA_BOL: @@ -5106,7 +5806,7 @@ static int failure_chance(nfa_state_T *state, int depth) case NFA_ZREF7: case NFA_ZREF8: case NFA_ZREF9: - /* backreferences don't match in many places */ + // backreferences don't match in many places return 94; case NFA_LNUM_GT: @@ -5118,7 +5818,7 @@ static int failure_chance(nfa_state_T *state, int depth) case NFA_MARK_GT: case NFA_MARK_LT: case NFA_VISUAL: - /* before/after positions don't match very often */ + // before/after positions don't match very often return 85; case NFA_LNUM: @@ -5128,19 +5828,20 @@ static int failure_chance(nfa_state_T *state, int depth) case NFA_COL: case NFA_VCOL: case NFA_MARK: - /* specific positions rarely match */ + // specific positions rarely match return 98; case NFA_COMPOSING: return 95; default: - if (c > 0) - /* character match fails often */ + if (c > 0) { + // character match fails often return 95; + } } - /* something else, includes character classes */ + // something else, includes character classes return 50; } @@ -5236,8 +5937,7 @@ static int nfa_did_time_out(void) /// When there is a match "submatch" contains the positions. /// /// Note: Caller must ensure that: start != NULL. -static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, - regsubs_T *submatch, regsubs_T *m) +static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *submatch, regsubs_T *m) FUNC_ATTR_NONNULL_ARG(1, 2, 4) { int result = false; @@ -5246,9 +5946,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, nfa_thread_T *t; nfa_list_T list[2]; int listidx; - nfa_list_T *thislist; - nfa_list_T *nextlist; - int *listids = NULL; + nfa_list_T *thislist; + nfa_list_T *nextlist; + int *listids = NULL; int listids_len = 0; nfa_state_T *add_state; bool add_here; @@ -5257,7 +5957,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, int toplevel = start->c == NFA_MOPEN; regsubs_T *r; #ifdef NFA_REGEXP_DEBUG_LOG - FILE *debug = fopen(NFA_REGEXP_DEBUG_LOG, "a"); + FILE *debug = fopen(NFA_REGEXP_DEBUG_LOG, "a"); if (debug == NULL) { semsg("(NFA) COULD NOT OPEN %s!", NFA_REGEXP_DEBUG_LOG); @@ -5295,7 +5995,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, fprintf(log_fd, "**********************************\n"); nfa_set_code(start->c); fprintf(log_fd, " RUNNING nfa_regmatch() starting with state %d, code %s\n", - abs(start->id), code); + abs(start->id), code); fprintf(log_fd, "**********************************\n"); } else { emsg(_(e_log_open_failed)); @@ -5342,7 +6042,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, /* * Run for each character. */ - for (;; ) { + for (;;) { int curc = utf_ptr2char((char *)rex.input); int clen = utfc_ptr2len((char *)rex.input); if (curc == NUL) { @@ -5350,7 +6050,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, go_to_nextline = false; } - /* swap lists */ + // swap lists thislist = &list[flag]; nextlist = &list[flag ^= 1]; nextlist->n = 0; // clear nextlist @@ -5377,8 +6077,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, { int i; - for (i = 0; i < thislist->n; i++) + for (i = 0; i < thislist->n; i++) { fprintf(log_fd, "%d ", abs(thislist->t[i].state->id)); + } } fprintf(log_fd, "\n"); #endif @@ -5389,8 +6090,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, /* * If the state lists are empty we can stop. */ - if (thislist->n == 0) + if (thislist->n == 0) { break; + } // compute nextlist for (listidx = 0; listidx < thislist->n; listidx++) { @@ -5439,7 +6141,6 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, add_count = 0; switch (t->state->c) { case NFA_MATCH: - { // 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. @@ -5464,7 +6165,6 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, clen = 0; } goto nextchar; - } case NFA_END_INVISIBLE: case NFA_END_INVISIBLE_NEG: @@ -5530,11 +6230,10 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, case NFA_START_INVISIBLE_BEFORE_FIRST: case NFA_START_INVISIBLE_BEFORE_NEG: case NFA_START_INVISIBLE_BEFORE_NEG_FIRST: - { #ifdef REGEXP_DEBUG fprintf(log_fd, "Failure chance invisible: %d, what follows: %d\n", - failure_chance(t->state->out, 0), - failure_chance(t->state->out1->out, 0)); + failure_chance(t->state->out, 0), + failure_chance(t->state->out1->out, 0)); #endif // Do it directly if there already is a PIM or when // nfa_postprocess() detected it will work better. @@ -5610,11 +6309,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, goto theend; } } - } - break; + break; - case NFA_START_PATTERN: - { + case NFA_START_PATTERN: { nfa_state_T *skip = NULL; #ifdef REGEXP_DEBUG int skip_lid = 0; @@ -5628,13 +6325,13 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, skip_lid = nextlist->id; #endif } else if (state_in_list(nextlist, - t->state->out1->out->out, &t->subs)) { + t->state->out1->out->out, &t->subs)) { skip = t->state->out1->out->out; #ifdef REGEXP_DEBUG skip_lid = nextlist->id; #endif } else if (state_in_list(thislist, - t->state->out1->out->out, &t->subs)) { + t->state->out1->out->out, &t->subs)) { skip = t->state->out1->out->out; #ifdef REGEXP_DEBUG skip_lid = thislist->id; @@ -5643,10 +6340,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, if (skip != NULL) { #ifdef REGEXP_DEBUG nfa_set_code(skip->c); - fprintf( - log_fd, - "> Not trying to match pattern, output state %d is already in list %d. char %d: %s\n", - abs(skip->id), skip_lid, skip->c, code); + fprintf(log_fd, + "> Not trying to match pattern, output state %d is already in list %d. char %d: %s\n", // NOLINT(whitespace/line_length) + abs(skip->id), skip_lid, skip->c, code); #endif break; } @@ -5783,8 +6479,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, } break; - case NFA_COMPOSING: - { + case NFA_COMPOSING: { int mc = curc; int len = 0; nfa_state_T *end; @@ -5835,17 +6530,20 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, // composing chars are matched. result = OK; while (sta->c != NFA_END_COMPOSING) { - for (j = 0; j < ccount; ++j) - if (cchars[j] == sta->c) + for (j = 0; j < ccount; j++) { + if (cchars[j] == sta->c) { break; + } + } if (j == ccount) { result = FAIL; break; } sta = sta->out; } - } else + } else { result = FAIL; + } end = t->state->out1; // NFA_END_COMPOSING ADD_STATE_IF_MATCH(end); @@ -5868,11 +6566,10 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, break; case NFA_START_COLL: - case NFA_START_NEG_COLL: - { + case NFA_START_NEG_COLL: { // What follows is a list of characters, until NFA_END_COLL. // One of them must match or none of them must match. - nfa_state_T *state; + nfa_state_T *state; int result_if_matched; int c1, c2; @@ -5884,7 +6581,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, state = t->state->out; result_if_matched = (t->state->c == NFA_START_COLL); - for (;; ) { + for (;;) { if (state->c == NFA_END_COLL) { result = !result_if_matched; break; @@ -5895,7 +6592,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, c2 = state->val; #ifdef REGEXP_DEBUG fprintf(log_fd, "NFA_RANGE_MIN curc=%d c1=%d c2=%d\n", - curc, c1, c2); + curc, c1, c2); #endif if (curc >= c1 && curc <= c2) { result = result_if_matched; @@ -6210,45 +6907,43 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, case NFA_VCOL: case NFA_VCOL_GT: - case NFA_VCOL_LT: - { - int op = t->state->c - NFA_VCOL; - colnr_T col = (colnr_T)(rex.input - rex.line); - - // Bail out quickly when there can't be a match, avoid the overhead of - // win_linetabsize() on long lines. - if (op != 1 && col > t->state->val * MB_MAXBYTES) { - break; - } + case NFA_VCOL_LT: { + int op = t->state->c - NFA_VCOL; + colnr_T col = (colnr_T)(rex.input - rex.line); - result = false; - win_T *wp = rex.reg_win == NULL ? curwin : rex.reg_win; - if (op == 1 && col - 1 > t->state->val && col > 100) { - long ts = wp->w_buffer->b_p_ts; - - // Guess that a character won't use more columns than 'tabstop', - // with a minimum of 4. - if (ts < 4) { - ts = 4; - } - result = col > t->state->val * ts; - } - if (!result) { - uintmax_t lts = win_linetabsize(wp, rex.line, col); - assert(t->state->val >= 0); - result = nfa_re_num_cmp((uintmax_t)t->state->val, op, lts + 1); - } - if (result) { - add_here = true; - add_state = t->state->out; + // Bail out quickly when there can't be a match, avoid the overhead of + // win_linetabsize() on long lines. + if (op != 1 && col > t->state->val * MB_MAXBYTES) { + break; + } + + result = false; + win_T *wp = rex.reg_win == NULL ? curwin : rex.reg_win; + if (op == 1 && col - 1 > t->state->val && col > 100) { + long ts = wp->w_buffer->b_p_ts; + + // Guess that a character won't use more columns than 'tabstop', + // with a minimum of 4. + if (ts < 4) { + ts = 4; } + result = col > t->state->val * ts; } - break; + if (!result) { + uintmax_t lts = win_linetabsize(wp, rex.line, col); + assert(t->state->val >= 0); + result = nfa_re_num_cmp((uintmax_t)t->state->val, op, lts + 1); + } + if (result) { + add_here = true; + add_state = t->state->out; + } + } + break; case NFA_MARK: case NFA_MARK_GT: - case NFA_MARK_LT: - { + case NFA_MARK_LT: { pos_T *pos; size_t col = REG_MULTI ? rex.input - rex.line : 0; @@ -6264,7 +6959,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, // exists and mark is set in reg_buf. if (pos != NULL && pos->lnum > 0) { const colnr_T pos_col = pos->lnum == rex.lnum + rex.reg_firstlnum - && pos->col == MAXCOL + && pos->col == MAXCOL ? (colnr_T)STRLEN(reg_getline(pos->lnum - rex.reg_firstlnum)) : pos->col; @@ -6287,8 +6982,8 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, case NFA_CURSOR: result = rex.reg_win != NULL - && (rex.lnum + rex.reg_firstlnum == rex.reg_win->w_cursor.lnum) - && ((colnr_T)(rex.input - rex.line) == rex.reg_win->w_cursor.col); + && (rex.lnum + rex.reg_firstlnum == rex.reg_win->w_cursor.lnum) + && ((colnr_T)(rex.input - rex.line) == rex.reg_win->w_cursor.col); if (result) { add_here = true; add_state = t->state->out; @@ -6358,10 +7053,11 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, nfa_pim_T *pim; nfa_pim_T pim_copy; - if (t->pim.result == NFA_PIM_UNUSED) + if (t->pim.result == NFA_PIM_UNUSED) { pim = NULL; - else + } else { pim = &t->pim; + } // Handle the postponed invisible match if the match might end // without advancing and before the end of the line. @@ -6394,10 +7090,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, result = (pim->result == NFA_PIM_MATCH); #ifdef REGEXP_DEBUG fprintf(log_fd, "\n"); - fprintf( - log_fd, - "Using previous recursive nfa_regmatch() result, result == %d\n", - pim->result); + fprintf(log_fd, + "Using previous recursive nfa_regmatch() result, result == %d\n", + pim->result); fprintf(log_fd, "MATCH = %s\n", result ? "OK" : "false"); fprintf(log_fd, "\n"); #endif @@ -6500,7 +7195,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, || utf_fold(c) != utf_fold(prog->regstart))) { #ifdef REGEXP_DEBUG fprintf(log_fd, - " Skipping start state, regstart does not match\n"); + " Skipping start state, regstart does not match\n"); #endif add = false; } @@ -6532,8 +7227,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, { int i; - for (i = 0; i < thislist->n; i++) + for (i = 0; i < thislist->n; i++) { fprintf(log_fd, "%d ", abs(thislist->t[i].state->id)); + } } fprintf(log_fd, "\n"); #endif @@ -6565,8 +7261,9 @@ nextchar: } #ifdef REGEXP_DEBUG - if (log_fd != stderr) + if (log_fd != stderr) { fclose(log_fd); + } log_fd = NULL; #endif @@ -6583,18 +7280,19 @@ theend: return nfa_match; } -// Try match of "prog" with at rex.line["col"]. -// Returns <= 0 for failure, number of lines contained in the match otherwise. -static long nfa_regtry(nfa_regprog_T *prog, - colnr_T col, - proftime_T *tm, // timeout limit or NULL - int *timed_out) // flag set on timeout or NULL +/// Try match of "prog" with at rex.line["col"]. +/// +/// @param tm timeout limit or NULL +/// @param timed_out flag set on timeout or NULL +/// +/// @return <= 0 for failure, number of lines contained in the match otherwise. +static long nfa_regtry(nfa_regprog_T *prog, colnr_T col, proftime_T *tm, int *timed_out) { int i; regsubs_T subs, m; nfa_state_T *start = prog->start; #ifdef REGEXP_DEBUG - FILE *f; + FILE *f; #endif rex.input = rex.line + col; @@ -6606,10 +7304,10 @@ static long nfa_regtry(nfa_regprog_T *prog, f = fopen(NFA_REGEXP_RUN_LOG, "a"); if (f != NULL) { fprintf(f, - "\n\n\t=======================================================\n"); -#ifdef REGEXP_DEBUG + "\n\n\t=======================================================\n"); +# ifdef REGEXP_DEBUG fprintf(f, "\tRegexp is \"%s\"\n", nfa_regengine.expr); -#endif +# endif fprintf(f, "\tInput text is \"%s\" \n", rex.input); fprintf(f, "\t=======================================================\n\n"); nfa_print_state(f, start); @@ -6668,7 +7366,7 @@ static long nfa_regtry(nfa_regprog_T *prog, } } - /* Package any found \z(...\) matches for export. Default is none. */ + // Package any found \z(...\) matches for export. Default is none. unref_extmatch(re_extmatch_out); re_extmatch_out = NULL; @@ -6691,9 +7389,10 @@ static long nfa_regtry(nfa_regprog_T *prog, } else { struct linepos *lpos = &subs.synt.list.line[i]; - if (lpos->start != NULL && lpos->end != NULL) + if (lpos->start != NULL && lpos->end != NULL) { re_extmatch_out->matches[i] = vim_strnsave(lpos->start, lpos->end - lpos->start); + } } } } @@ -6711,10 +7410,9 @@ static long nfa_regtry(nfa_regprog_T *prog, /// /// @return <= 0 if there is no match and number of lines contained in the /// match otherwise. -static long nfa_regexec_both(char_u *line, colnr_T startcol, - proftime_T *tm, int *timed_out) +static long nfa_regexec_both(char_u *line, colnr_T startcol, proftime_T *tm, int *timed_out) { - nfa_regprog_T *prog; + nfa_regprog_T *prog; long retval = 0L; colnr_T col = startcol; @@ -6729,7 +7427,7 @@ static long nfa_regexec_both(char_u *line, colnr_T startcol, rex.reg_endp = rex.reg_match->endp; } - /* Be paranoid... */ + // Be paranoid... if (prog == NULL || line == NULL) { iemsg(_(e_null)); goto theend; @@ -6759,8 +7457,9 @@ static long nfa_regexec_both(char_u *line, colnr_T startcol, nfa_regengine.expr = prog->pattern; #endif - if (prog->reganch && col > 0) + if (prog->reganch && col > 0) { return 0L; + } rex.need_clear_subexpr = true; // Clear the external match subpointers if necessary. @@ -6834,11 +7533,12 @@ theend: */ static regprog_T *nfa_regcomp(char_u *expr, int re_flags) { - nfa_regprog_T *prog = NULL; - int *postfix; + nfa_regprog_T *prog = NULL; + int *postfix; - if (expr == NULL) + if (expr == NULL) { return NULL; + } #ifdef REGEXP_DEBUG nfa_regengine.expr = expr; @@ -6881,7 +7581,7 @@ static regprog_T *nfa_regcomp(char_u *expr, int re_flags) */ post2nfa(postfix, post_ptr, true); - /* allocate the regprog with space for the compiled regexp */ + // allocate the regprog with space for the compiled regexp size_t prog_size = sizeof(nfa_regprog_T) + sizeof(nfa_state_T) * (nstate - 1); prog = xmalloc(prog_size); state_ptr = prog->state; @@ -6912,7 +7612,7 @@ static regprog_T *nfa_regcomp(char_u *expr, int re_flags) nfa_postfix_dump(expr, OK); nfa_dump(prog); #endif - /* Remember whether this pattern has any \z specials in it. */ + // Remember whether this pattern has any \z specials in it. prog->reghasz = re_has_z; prog->pattern = vim_strsave(expr); #ifdef REGEXP_DEBUG @@ -6946,21 +7646,16 @@ static void nfa_regfree(regprog_T *prog) } } -/* - * Match a regexp against a string. - * "rmp->regprog" is a compiled regexp as returned by nfa_regcomp(). - * Uses curbuf for line count and 'iskeyword'. - * If "line_lbr" is true, consider a "\n" in "line" to be a line break. - * - * Returns <= 0 for failure, number of lines contained in the match otherwise. - */ -static int -nfa_regexec_nl ( - regmatch_T *rmp, - char_u *line, /* string to match against */ - colnr_T col, /* column to start looking for match */ - bool line_lbr -) +/// Match a regexp against a string. +/// "rmp->regprog" is a compiled regexp as returned by nfa_regcomp(). +/// Uses curbuf for line count and 'iskeyword'. +/// If "line_lbr" is true, consider a "\n" in "line" to be a line break. +/// +/// @param line string to match against +/// @param col column to start looking for match +/// +/// @return <= 0 for failure, number of lines contained in the match otherwise. +static int nfa_regexec_nl(regmatch_T *rmp, char_u *line, colnr_T col, bool line_lbr) { rex.reg_match = rmp; rex.reg_mmatch = NULL; @@ -7009,8 +7704,7 @@ nfa_regexec_nl ( /// /// @par /// FIXME if this behavior is not compatible. -static long nfa_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, - linenr_T lnum, colnr_T col, +static long nfa_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm, int *timed_out) { rex.reg_match = NULL; diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 4d0fde642d..86dbf532a7 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -132,10 +132,6 @@ static match_T search_hl; // used for 'hlsearch' highlight matching -StlClickDefinition *tab_page_click_defs = NULL; - -long tab_page_click_defs_size = 0; - // for line_putchar. Contains the state that needs to be remembered from // putting one character to the next. typedef struct { @@ -276,25 +272,25 @@ void redrawWinline(win_T *wp, linenr_T lnum) } } -/* - * update all windows that are editing the current buffer - */ -void update_curbuf(int type) -{ - redraw_curbuf_later(type); - update_screen(type); -} - /// called when the status bars for the buffer 'buf' need to be updated void redraw_buf_status_later(buf_T *buf) { FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { - if (wp->w_buffer == buf - && (wp->w_status_height || (wp == curwin && global_stl_height()))) { + if (wp->w_buffer != buf) { + continue; + } + bool redraw = false; + + if (wp->w_status_height || (wp == curwin && global_stl_height())) { wp->w_redr_status = true; - if (must_redraw < VALID) { - must_redraw = VALID; - } + redraw = true; + } + if (wp->w_winbar_height) { + wp->w_redr_winbar = true; + redraw = true; + } + if (redraw && must_redraw < VALID) { + must_redraw = VALID; } } } @@ -382,9 +378,9 @@ int update_screen(int type) int valid = MAX(Rows - msg_scrollsize(), 0); if (msg_grid.chars) { // non-displayed part of msg_grid is considered invalid. - for (int i = 0; i < MIN(msg_scrollsize(), msg_grid.Rows); i++) { + for (int i = 0; i < MIN(msg_scrollsize(), msg_grid.rows); i++) { grid_clear_line(&msg_grid, msg_grid.line_offset[i], - msg_grid.Columns, false); + msg_grid.cols, false); } } if (msg_use_msgsep()) { @@ -400,6 +396,9 @@ int update_screen(int type) if (wp->w_floating) { continue; } + if (wp->w_winrow + wp->w_winbar_height > valid) { + wp->w_redr_winbar = true; + } if (W_ENDROW(wp) > valid) { wp->w_redr_type = MAX(wp->w_redr_type, NOT_VALID); } @@ -431,6 +430,9 @@ int update_screen(int type) wp->w_redr_type = REDRAW_TOP; } else { wp->w_redr_type = NOT_VALID; + if (wp->w_winrow + wp->w_winbar_height <= msg_scrolled) { + wp->w_redr_winbar = true; + } if (!is_stl_global && W_ENDROW(wp) + wp->w_status_height <= msg_scrolled) { wp->w_redr_status = true; } @@ -585,10 +587,13 @@ int update_screen(int type) win_update(wp, &providers); } - // redraw status line after the window to minimize cursor movement + // redraw status line and window bar after the window to minimize cursor movement if (wp->w_redr_status) { win_redr_status(wp); } + if (wp->w_redr_winbar) { + win_redr_winbar(wp); + } } end_search_hl(); @@ -598,8 +603,6 @@ int update_screen(int type) pum_redraw(); } - send_grid_resize = false; - /* Reset b_mod_set flags. Going through all windows is probably faster * than going through all buffers (there could be many buffers). */ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { @@ -639,18 +642,18 @@ bool conceal_cursor_line(const win_T *wp) if (*wp->w_p_cocu == NUL) { return false; } - if (get_real_state() & VISUAL) { + if (get_real_state() & MODE_VISUAL) { c = 'v'; - } else if (State & INSERT) { + } else if (State & MODE_INSERT) { c = 'i'; - } else if (State & NORMAL) { + } else if (State & MODE_NORMAL) { c = 'n'; - } else if (State & CMDLINE) { + } else if (State & MODE_CMDLINE) { c = 'c'; } else { return false; } - return vim_strchr(wp->w_p_cocu, c) != NULL; + return vim_strchr((char *)wp->w_p_cocu, c) != NULL; } // Check if the cursor line needs to be redrawn because of 'concealcursor'. @@ -743,11 +746,12 @@ static void win_update(win_T *wp, DecorProviders *providers) if (type >= NOT_VALID) { wp->w_redr_status = true; + wp->w_redr_winbar = true; wp->w_lines_valid = 0; } // Window is zero-height: Only need to draw the separator - if (wp->w_grid.Rows == 0) { + if (wp->w_grid.rows == 0) { // draw the horizontal separator below this window draw_hsep_win(wp); draw_sep_connectors_win(wp); @@ -756,7 +760,7 @@ static void win_update(win_T *wp, DecorProviders *providers) } // Window is zero-width: Only need to draw the separator. - if (wp->w_grid.Columns == 0) { + if (wp->w_grid.cols == 0) { // draw the vertical separator right of this window draw_vsep_win(wp); draw_sep_connectors_win(wp); @@ -955,7 +959,7 @@ static void win_update(win_T *wp, DecorProviders *providers) j = 0; for (ln = wp->w_topline; ln < wp->w_lines[0].wl_lnum; ln++) { j++; - if (j >= wp->w_grid.Rows - 2) { + if (j >= wp->w_grid.rows - 2) { break; } (void)hasFoldingWin(wp, ln, NULL, &ln, true, NULL); @@ -963,13 +967,13 @@ static void win_update(win_T *wp, DecorProviders *providers) } else { j = wp->w_lines[0].wl_lnum - wp->w_topline; } - if (j < wp->w_grid.Rows - 2) { // not too far off + if (j < wp->w_grid.rows - 2) { // not too far off i = plines_m_win(wp, wp->w_topline, wp->w_lines[0].wl_lnum - 1); // insert extra lines for previously invisible filler lines if (wp->w_lines[0].wl_lnum != wp->w_topline) { i += win_get_fill(wp, wp->w_lines[0].wl_lnum) - wp->w_old_topfill; } - if (i != 0 && i < wp->w_grid.Rows - 2) { // less than a screen off + if (i != 0 && i < wp->w_grid.rows - 2) { // less than a screen off // Try to insert the correct number of lines. // If not the last window, delete the lines at the bottom. // win_ins_lines may fail when the terminal can't do it. @@ -982,8 +986,8 @@ static void win_update(win_T *wp, DecorProviders *providers) // Move the entries that were scrolled, disable // the entries for the lines to be redrawn. - if ((wp->w_lines_valid += j) > wp->w_grid.Rows) { - wp->w_lines_valid = wp->w_grid.Rows; + if ((wp->w_lines_valid += j) > wp->w_grid.rows) { + wp->w_lines_valid = wp->w_grid.rows; } for (idx = wp->w_lines_valid; idx - j >= 0; idx--) { wp->w_lines[idx] = wp->w_lines[idx - j]; @@ -1036,7 +1040,7 @@ static void win_update(win_T *wp, DecorProviders *providers) row -= wp->w_topfill; if (row > 0) { win_scroll_lines(wp, 0, -row); - bot_start = wp->w_grid.Rows - row; + bot_start = wp->w_grid.rows - row; } if ((row == 0 || bot_start < 999) && wp->w_lines_valid != 0) { /* @@ -1052,7 +1056,7 @@ static void win_update(win_T *wp, DecorProviders *providers) /* stop at line that didn't fit, unless it is still * valid (no lines deleted) */ if (row > 0 && bot_start + row - + (int)wp->w_lines[j].wl_size > wp->w_grid.Rows) { + + (int)wp->w_lines[j].wl_size > wp->w_grid.rows) { wp->w_lines_valid = idx + 1; break; } @@ -1077,18 +1081,18 @@ static void win_update(win_T *wp, DecorProviders *providers) // When starting redraw in the first line, redraw all lines. if (mid_start == 0) { - mid_end = wp->w_grid.Rows; + mid_end = wp->w_grid.rows; } } else { // Not VALID or INVERTED: redraw all lines. mid_start = 0; - mid_end = wp->w_grid.Rows; + mid_end = wp->w_grid.rows; } if (type == SOME_VALID) { // SOME_VALID: redraw all lines. mid_start = 0; - mid_end = wp->w_grid.Rows; + mid_end = wp->w_grid.rows; type = NOT_VALID; } @@ -1275,7 +1279,7 @@ static void win_update(win_T *wp, DecorProviders *providers) } } srow += mid_start; - mid_end = wp->w_grid.Rows; + mid_end = wp->w_grid.rows; for (; idx < wp->w_lines_valid; idx++) { // find end if (wp->w_lines[idx].wl_valid && wp->w_lines[idx].wl_lnum >= to + 1) { @@ -1328,7 +1332,7 @@ static void win_update(win_T *wp, DecorProviders *providers) for (;;) { /* stop updating when reached the end of the window (check for _past_ * the end of the window is at the end of the loop) */ - if (row == wp->w_grid.Rows) { + if (row == wp->w_grid.rows) { didline = true; break; } @@ -1433,7 +1437,7 @@ static void win_update(win_T *wp, DecorProviders *providers) new_rows += plines_win(wp, l, true); } j++; - if (new_rows > wp->w_grid.Rows - row - 2) { + if (new_rows > wp->w_grid.rows - row - 2) { // it's getting too much, must redraw the rest new_rows = 9999; break; @@ -1445,17 +1449,17 @@ static void win_update(win_T *wp, DecorProviders *providers) * remaining text or scrolling fails, must redraw the * rest. If scrolling works, must redraw the text * below the scrolled text. */ - if (row - xtra_rows >= wp->w_grid.Rows - 2) { + if (row - xtra_rows >= wp->w_grid.rows - 2) { mod_bot = MAXLNUM; } else { win_scroll_lines(wp, row, xtra_rows); - bot_start = wp->w_grid.Rows + xtra_rows; + bot_start = wp->w_grid.rows + xtra_rows; } } else if (xtra_rows > 0) { /* May scroll text down. If there is not enough * remaining text of scrolling fails, must redraw the * rest. */ - if (row + xtra_rows >= wp->w_grid.Rows - 2) { + if (row + xtra_rows >= wp->w_grid.rows - 2) { mod_bot = MAXLNUM; } else { win_scroll_lines(wp, row + old_rows, xtra_rows); @@ -1483,7 +1487,7 @@ static void win_update(win_T *wp, DecorProviders *providers) wp->w_lines[j] = wp->w_lines[i]; // stop at a line that won't fit if (x + (int)wp->w_lines[j].wl_size - > wp->w_grid.Rows) { + > wp->w_grid.rows) { wp->w_lines_valid = j + 1; break; } @@ -1497,8 +1501,8 @@ static void win_update(win_T *wp, DecorProviders *providers) // move entries in w_lines[] downwards j -= i; wp->w_lines_valid += j; - if (wp->w_lines_valid > wp->w_grid.Rows) { - wp->w_lines_valid = wp->w_grid.Rows; + if (wp->w_lines_valid > wp->w_grid.rows) { + wp->w_lines_valid = wp->w_grid.rows; } for (i = wp->w_lines_valid; i - j >= idx; i--) { wp->w_lines[i] = wp->w_lines[i - j]; @@ -1529,11 +1533,11 @@ static void win_update(win_T *wp, DecorProviders *providers) && wp->w_lines[idx].wl_lnum == lnum && lnum > wp->w_topline && !(dy_flags & (DY_LASTLINE | DY_TRUNCATE)) - && srow + wp->w_lines[idx].wl_size > wp->w_grid.Rows + && srow + wp->w_lines[idx].wl_size > wp->w_grid.rows && win_get_fill(wp, lnum) == 0) { // This line is not going to fit. Don't draw anything here, // will draw "@ " lines below. - row = wp->w_grid.Rows + 1; + row = wp->w_grid.rows + 1; } else { prepare_search_hl(wp, &search_hl, lnum); // Let the syntax stuff know we skipped a few lines. @@ -1544,7 +1548,7 @@ static void win_update(win_T *wp, DecorProviders *providers) // Display one line row = win_line(wp, lnum, srow, - foldinfo.fi_lines ? srow : wp->w_grid.Rows, + foldinfo.fi_lines ? srow : wp->w_grid.rows, mod_top == 0, false, foldinfo, &line_providers); if (foldinfo.fi_lines == 0) { @@ -1563,7 +1567,7 @@ static void win_update(win_T *wp, DecorProviders *providers) wp->w_lines[idx].wl_lnum = lnum; wp->w_lines[idx].wl_valid = true; - if (row > wp->w_grid.Rows) { // past end of grid + if (row > wp->w_grid.rows) { // past end of grid // we may need the size of that too long line later on if (dollar_vcol == -1) { wp->w_lines[idx].wl_size = plines_win(wp, lnum, true); @@ -1581,13 +1585,13 @@ static void win_update(win_T *wp, DecorProviders *providers) // 'relativenumber' set and cursor moved vertically: The // text doesn't need to be drawn, but the number column does. foldinfo_T info = fold_info(wp, lnum); - (void)win_line(wp, lnum, srow, wp->w_grid.Rows, true, true, + (void)win_line(wp, lnum, srow, wp->w_grid.rows, true, true, info, &line_providers); } // This line does not need to be drawn, advance to the next one. row += wp->w_lines[idx++].wl_size; - if (row > wp->w_grid.Rows) { // past end of screen + if (row > wp->w_grid.rows) { // past end of screen break; } lnum = wp->w_lines[idx - 1].wl_lastlnum + 1; @@ -1635,41 +1639,41 @@ static void win_update(win_T *wp, DecorProviders *providers) * Don't overwrite it, it can be edited. */ wp->w_botline = lnum + 1; - } else if (win_get_fill(wp, lnum) >= wp->w_grid.Rows - srow) { + } else if (win_get_fill(wp, lnum) >= wp->w_grid.rows - srow) { // Window ends in filler lines. wp->w_botline = lnum; - wp->w_filler_rows = wp->w_grid.Rows - srow; + wp->w_filler_rows = wp->w_grid.rows - srow; } else if (dy_flags & DY_TRUNCATE) { // 'display' has "truncate" - int scr_row = wp->w_grid.Rows - 1; + int scr_row = wp->w_grid.rows - 1; // Last line isn't finished: Display "@@@" in the last screen line. - grid_puts_len(&wp->w_grid, (char_u *)"@@", MIN(wp->w_grid.Columns, 2), scr_row, 0, at_attr); + grid_puts_len(&wp->w_grid, (char_u *)"@@", MIN(wp->w_grid.cols, 2), scr_row, 0, at_attr); - grid_fill(&wp->w_grid, scr_row, scr_row + 1, 2, wp->w_grid.Columns, + grid_fill(&wp->w_grid, scr_row, scr_row + 1, 2, wp->w_grid.cols, '@', ' ', at_attr); set_empty_rows(wp, srow); wp->w_botline = lnum; } else if (dy_flags & DY_LASTLINE) { // 'display' has "lastline" - int start_col = wp->w_grid.Columns - 3; + int start_col = wp->w_grid.cols - 3; // Last line isn't finished: Display "@@@" at the end. - grid_fill(&wp->w_grid, wp->w_grid.Rows - 1, wp->w_grid.Rows, - MAX(start_col, 0), wp->w_grid.Columns, '@', '@', at_attr); + grid_fill(&wp->w_grid, wp->w_grid.rows - 1, wp->w_grid.rows, + MAX(start_col, 0), wp->w_grid.cols, '@', '@', at_attr); set_empty_rows(wp, srow); wp->w_botline = lnum; } else { - win_draw_end(wp, '@', ' ', true, srow, wp->w_grid.Rows, HLF_AT); + win_draw_end(wp, '@', ' ', true, srow, wp->w_grid.rows, HLF_AT); wp->w_botline = lnum; } } else { if (eof) { // we hit the end of the file wp->w_botline = buf->b_ml.ml_line_count + 1; j = win_get_fill(wp, wp->w_botline); - if (j > 0 && !wp->w_botfill && row < wp->w_grid.Rows) { + if (j > 0 && !wp->w_botfill && row < wp->w_grid.rows) { // Display filler text below last line. win_line() will check // for ml_line_count+1 and only draw filler lines foldinfo_T info = FOLDINFO_INIT; - row = win_line(wp, wp->w_botline, row, wp->w_grid.Rows, + row = win_line(wp, wp->w_botline, row, wp->w_grid.rows, false, false, info, &line_providers); } } else if (dollar_vcol == -1) { @@ -1678,7 +1682,7 @@ static void win_update(win_T *wp, DecorProviders *providers) // make sure the rest of the screen is blank // write the 'eob' character to rows that aren't part of the file. - win_draw_end(wp, wp->w_p_fcs_chars.eob, ' ', false, row, wp->w_grid.Rows, + win_draw_end(wp, wp->w_p_fcs_chars.eob, ' ', false, row, wp->w_grid.rows, HLF_EOB); } @@ -1763,8 +1767,8 @@ static int win_fill_end(win_T *wp, int c1, int c2, int off, int width, int row, { int nn = off + width; - if (nn > wp->w_grid.Columns) { - nn = wp->w_grid.Columns; + if (nn > wp->w_grid.cols) { + nn = wp->w_grid.cols; } if (wp->w_p_rl) { @@ -1813,7 +1817,7 @@ static void win_draw_end(win_T *wp, int c1, int c2, bool draw_margin, int row, i grid_fill(&wp->w_grid, row, endrow, W_ENDCOL(wp) - 1 - n, W_ENDCOL(wp) - n, c1, c2, attr); } else { - grid_fill(&wp->w_grid, row, endrow, n, wp->w_grid.Columns, c1, c2, attr); + grid_fill(&wp->w_grid, row, endrow, n, wp->w_grid.cols, c1, c2, attr); } set_empty_rows(wp, row); @@ -1837,7 +1841,7 @@ static int compute_foldcolumn(win_T *wp, int col) { int fdc = win_fdccol_count(wp); int wmw = wp == curwin && p_wmw == 0 ? 1 : p_wmw; - int wwidth = wp->w_grid.Columns; + int wwidth = wp->w_grid.cols; if (fdc > wwidth - (col + wmw)) { fdc = wwidth - (col + wmw); @@ -2384,7 +2388,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (ae.rgb_fg_color == -1 && ae.cterm_fg_color == 0) { line_attr_lowprio = cul_attr; } else { - if (!(State & INSERT) && bt_quickfix(wp->w_buffer) + if (!(State & MODE_INSERT) && bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum) { line_attr = hl_combine_attr(cul_attr, line_attr); } else { @@ -2621,7 +2625,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc // Rightleft window: process the text in the normal direction, but put // it in linebuf_char[off] from right to left. Start at the // rightmost column of the window. - col = grid->Columns - 1; + col = grid->cols - 1; off += col; } @@ -2803,7 +2807,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (wp->w_p_rl) { n_extra = col + 1; } else { - n_extra = grid->Columns - col; + n_extra = grid->cols - col; } char_attr = 0; } else if (filler_todo > 0) { @@ -2818,7 +2822,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (wp->w_p_rl) { n_extra = col + 1; } else { - n_extra = grid->Columns - col; + n_extra = grid->cols - col; } char_attr = win_hl_attr(wp, HLF_DED); } @@ -2876,7 +2880,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (ae.rgb_fg_color == -1 && ae.cterm_fg_color == 0) { line_attr_lowprio = cul_attr; } else { - if (!(State & INSERT) && bt_quickfix(wp->w_buffer) + if (!(State & MODE_INSERT) && bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum) { line_attr = hl_combine_attr(cul_attr, line_attr); } else { @@ -2892,15 +2896,15 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc && vcol >= (long)wp->w_virtcol) || (number_only && draw_state > WL_NR)) && filler_todo <= 0) { - draw_virt_text(wp, buf, win_col_offset, &col, grid->Columns, row); - grid_put_linebuf(grid, row, 0, col, -grid->Columns, wp->w_p_rl, wp, + draw_virt_text(wp, buf, win_col_offset, &col, grid->cols, row); + grid_put_linebuf(grid, row, 0, col, -grid->cols, wp->w_p_rl, wp, wp->w_hl_attr_normal, false); // Pretend we have finished updating the window. Except when // 'cursorcolumn' is set. if (wp->w_p_cuc) { row = wp->w_cline_row + wp->w_cline_height; } else { - row = grid->Rows; + row = grid->rows; } break; } @@ -2928,19 +2932,19 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (draw_state == WL_LINE && has_fold - && col < grid->Columns + && col < grid->cols && n_extra == 0 && row == startrow) { // fill rest of line with 'fold' c_extra = wp->w_p_fcs_chars.fold; c_final = NUL; - n_extra = wp->w_p_rl ? (col + 1) : (grid->Columns - col); + n_extra = wp->w_p_rl ? (col + 1) : (grid->cols - col); } if (draw_state == WL_LINE && has_fold - && col >= grid->Columns + && col >= grid->cols && n_extra != 0 && row == startrow) { // Truncate the folding. @@ -3006,6 +3010,10 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (area_attr != 0) { char_attr = hl_combine_attr(line_attr, area_attr); + if (!highlight_match) { + // let search highlight show in Visual area if possible + char_attr = hl_combine_attr(search_attr, char_attr); + } } else if (search_attr != 0) { char_attr = hl_combine_attr(line_attr, search_attr); } @@ -3065,7 +3073,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc } // If a double-width char doesn't fit display a '>' in the last column. - if ((wp->w_p_rl ? (col <= 0) : (col >= grid->Columns - 1)) + if ((wp->w_p_rl ? (col <= 0) : (col >= grid->cols - 1)) && utf_char2cells(mb_c) == 2) { c = '>'; mb_c = c; @@ -3179,7 +3187,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc // last column; the character is displayed at the start of the // next line. if ((wp->w_p_rl ? (col <= 0) : - (col >= grid->Columns - 1)) + (col >= grid->cols - 1)) && utf_char2cells(mb_c) == 2) { c = '>'; mb_c = c; @@ -3299,7 +3307,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc /* In Insert mode only highlight a word that * doesn't touch the cursor. */ if (spell_hlf != HLF_COUNT - && (State & INSERT) != 0 + && (State & MODE_INSERT) && wp->w_cursor.lnum == lnum && wp->w_cursor.col >= (colnr_T)(prev_ptr - line) @@ -3384,7 +3392,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc } } - if (c == TAB && n_extra + col > grid->Columns) { + if (c == TAB && n_extra + col > grid->cols) { n_extra = tabstop_padding(vcol, wp->w_buffer->b_p_ts, wp->w_buffer->b_p_vts_array) - 1; } @@ -3587,7 +3595,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc || ((fromcol >= 0 || fromcol_prev >= 0) && tocol > vcol && VIsual_mode != Ctrl_V - && (wp->w_p_rl ? (col >= 0) : (col < grid->Columns)) + && (wp->w_p_rl ? (col >= 0) : (col < grid->cols)) && !(noinvcur && lnum == wp->w_cursor.lnum && (colnr_T)vcol == wp->w_virtcol))) @@ -3659,7 +3667,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc && virtual_active() && tocol != MAXCOL && vcol < tocol - && (wp->w_p_rl ? (col >= 0) : (col < grid->Columns))) { + && (wp->w_p_rl ? (col >= 0) : (col < grid->cols))) { c = ' '; ptr--; // put it back at the NUL } @@ -3668,7 +3676,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (wp->w_p_cole > 0 && (wp != curwin || lnum != wp->w_cursor.lnum || conceal_cursor_line(wp)) && ((syntax_flags & HL_CONCEAL) != 0 || has_match_conc > 0 || decor_conceal > 0) - && !(lnum_in_visual_area && vim_strchr(wp->w_p_cocu, 'v') == NULL)) { + && !(lnum_in_visual_area && vim_strchr((char *)wp->w_p_cocu, 'v') == NULL)) { char_attr = conceal_attr; if (((prev_syntax_id != syntax_seqnr && (syntax_flags & HL_CONCEAL) != 0) || has_match_conc > 1 || decor_conceal > 1) @@ -3741,7 +3749,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc && conceal_cursor_line(wp) && (int)wp->w_virtcol <= vcol + n_skip) { if (wp->w_p_rl) { - wp->w_wcol = grid->Columns - col + boguscols - 1; + wp->w_wcol = grid->cols - col + boguscols - 1; } else { wp->w_wcol = col - boguscols; } @@ -3813,7 +3821,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc n = 1; } } else { - if (col >= grid->Columns) { + if (col >= grid->cols) { n = -1; } } @@ -3881,7 +3889,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc if (((wp->w_p_cuc && (int)wp->w_virtcol >= VCOL_HLC - eol_hl_off && (int)wp->w_virtcol < - (long)grid->Columns * (row - startrow + 1) + v + (long)grid->cols * (row - startrow + 1) + v && lnum != wp->w_cursor.lnum) || draw_color_col || line_attr_lowprio || line_attr || diff_hlf != (hlf_T)0 || has_virttext)) { @@ -3919,7 +3927,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc int col_stride = wp->w_p_rl ? -1 : 1; - while (wp->w_p_rl ? col >= 0 : col < grid->Columns) { + while (wp->w_p_rl ? col >= 0 : col < grid->cols) { schar_from_ascii(linebuf_char[off], ' '); col += col_stride; if (draw_color_col) { @@ -3952,7 +3960,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc // terminal buffers may need to highlight beyond the end of the // logical line int n = wp->w_p_rl ? -1 : 1; - while (col >= 0 && col < grid->Columns) { + while (col >= 0 && col < grid->cols) { schar_from_ascii(linebuf_char[off], ' '); linebuf_attr[off] = vcol >= TERM_ATTRS_MAX ? 0 : term_attrs[vcol]; off += n; @@ -3961,8 +3969,8 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc } } - draw_virt_text(wp, buf, win_col_offset, &col, grid->Columns, row); - grid_put_linebuf(grid, row, 0, col, grid->Columns, wp->w_p_rl, wp, + draw_virt_text(wp, buf, win_col_offset, &col, grid->cols, row); + grid_put_linebuf(grid, row, 0, col, grid->cols, wp->w_p_rl, wp, wp->w_hl_attr_normal, false); row++; @@ -3987,7 +3995,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc && wp->w_p_list && !wp->w_p_wrap && filler_todo <= 0 - && (wp->w_p_rl ? col == 0 : col == grid->Columns - 1) + && (wp->w_p_rl ? col == 0 : col == grid->cols - 1) && !has_fold && (*ptr != NUL || lcs_eol_one > 0 @@ -4177,7 +4185,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc * At end of screen line and there is more to come: Display the line * so far. If there is no more to display it is caught above. */ - if ((wp->w_p_rl ? (col < 0) : (col >= grid->Columns)) + if ((wp->w_p_rl ? (col < 0) : (col >= grid->cols)) && foldinfo.fi_lines == 0 && (draw_state != WL_LINE || *ptr != NUL @@ -4190,7 +4198,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc && filler_todo <= 0 // Not drawing diff filler lines. && lcs_eol_one != -1 // Haven't printed the lcs_eol character. && row != endrow - 1 // Not the last line being displayed. - && (grid->Columns == Columns // Window spans the width of the screen, + && (grid->cols == Columns // Window spans the width of the screen, || ui_has(kUIMultigrid)) // or has dedicated grid. && !wp->w_p_rl; // Not right-to-left. @@ -4202,13 +4210,13 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc assert(i >= 0); int offset = kv_A(virt_lines, i).left_col ? 0 : win_col_offset; draw_virt_text_item(buf, offset, kv_A(virt_lines, i).line, - kHlModeReplace, grid->Columns, offset); + kHlModeReplace, grid->cols, offset); } } else { - draw_virt_text(wp, buf, win_col_offset, &draw_col, grid->Columns, row); + draw_virt_text(wp, buf, win_col_offset, &draw_col, grid->cols, row); } - grid_put_linebuf(grid, row, 0, draw_col, grid->Columns, wp->w_p_rl, + grid_put_linebuf(grid, row, 0, draw_col, grid->cols, wp->w_p_rl, wp, wp->w_hl_attr_normal, wrap); if (wrap) { ScreenGrid *current_grid = grid; @@ -4235,7 +4243,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc // When the window is too narrow draw all "@" lines. if (draw_state != WL_LINE && filler_todo <= 0) { - win_draw_end(wp, '@', ' ', true, row, wp->w_grid.Rows, HLF_AT); + win_draw_end(wp, '@', ' ', true, row, wp->w_grid.rows, HLF_AT); row = endrow; } @@ -4248,7 +4256,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc col = 0; off = 0; if (wp->w_p_rl) { - col = grid->Columns - 1; // col is not used if breaking! + col = grid->cols - 1; // col is not used if breaking! off += col; } @@ -4524,42 +4532,55 @@ void rl_mirror(char_u *str) } } -/* - * mark all status lines for redraw; used after first :cd - */ +/// Mark all status lines and window bars for redraw; used after first :cd void status_redraw_all(void) { - if (global_stl_height()) { - curwin->w_redr_status = true; - redraw_later(curwin, VALID); - } else { - FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { - if (wp->w_status_height) { - wp->w_redr_status = true; - redraw_later(wp, VALID); - } + bool is_stl_global = global_stl_height() != 0; + + FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { + bool redraw = false; + + if ((!is_stl_global && wp->w_status_height) || (is_stl_global && wp == curwin)) { + wp->w_redr_status = true; + redraw = true; + } + if (wp->w_winbar_height) { + wp->w_redr_winbar = true; + redraw = true; + } + if (redraw) { + redraw_later(wp, VALID); } } } -/// Marks all status lines of the current buffer for redraw. +/// Marks all status lines and window bars of the current buffer for redraw. void status_redraw_curbuf(void) { status_redraw_buf(curbuf); } -/// Marks all status lines of the specified buffer for redraw. +/// Marks all status lines and window bars of the given buffer for redraw. void status_redraw_buf(buf_T *buf) { - if (global_stl_height() != 0 && curwin->w_buffer == buf) { - curwin->w_redr_status = true; - redraw_later(curwin, VALID); - } else { - FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { - if (wp->w_status_height != 0 && wp->w_buffer == buf) { - wp->w_redr_status = true; - redraw_later(wp, VALID); - } + bool is_stl_global = global_stl_height() != 0; + + FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { + if (wp->w_buffer != buf) { + continue; + } + bool redraw = false; + + if ((!is_stl_global && wp->w_status_height) || (is_stl_global && wp == curwin)) { + wp->w_redr_status = true; + redraw = true; + } + if (wp->w_winbar_height) { + wp->w_redr_winbar = true; + redraw = true; + } + if (redraw) { + redraw_later(wp, VALID); } } } @@ -4573,6 +4594,9 @@ void redraw_statuslines(void) if (wp->w_redr_status) { win_redr_status(wp); } + if (wp->w_redr_winbar) { + win_redr_winbar(wp); + } } if (redraw_tabline) { draw_tabline(); @@ -5071,7 +5095,7 @@ static void redraw_custom_statusline(win_T *wp) entered = true; did_emsg = false; - win_redr_custom(wp, false); + win_redr_custom(wp, false, false); if (did_emsg) { // When there is an error disable the statusline, otherwise the // display is messed up with errors and a redraw triggers the problem @@ -5084,6 +5108,41 @@ static void redraw_custom_statusline(win_T *wp) entered = false; } +static void win_redr_winbar(win_T *wp) +{ + static bool entered = false; + + // Return when called recursively. This can happen when the winbar contains an expression + // that triggers a redraw. + if (entered) { + return; + } + entered = true; + + wp->w_redr_winbar = false; + if (wp->w_winbar_height == 0) { + // No window bar, do nothing. + } else if (!redrawing()) { + // Don't redraw right now, do it later. + wp->w_redr_winbar = true; + } else if (*p_wbr != NUL || *wp->w_p_wbr != NUL) { + int saved_did_emsg = did_emsg; + + did_emsg = false; + win_redr_custom(wp, true, false); + if (did_emsg) { + // When there is an error disable the winbar, otherwise the + // display is messed up with errors and a redraw triggers the problem + // again and again. + set_string_option_direct("winbar", -1, (char_u *)"", + OPT_FREE | (*wp->w_p_stl != NUL + ? OPT_LOCAL : OPT_GLOBAL), SID_ERROR); + } + did_emsg |= saved_did_emsg; + } + entered = false; +} + /// Only call if (wp->w_vsep_width != 0). /// /// @return true if the status line of window "wp" is connected to the status @@ -5220,11 +5279,9 @@ bool get_keymap_str(win_T *wp, char_u *fmt, char_u *buf, int len) return buf[0] != NUL; } -/* - * Redraw the status line or ruler of window "wp". - * When "wp" is NULL redraw the tab pages line from 'tabline'. - */ -static void win_redr_custom(win_T *wp, bool draw_ruler) +/// Redraw the status line, window bar or ruler of window "wp". +/// When "wp" is NULL redraw the tab pages line from 'tabline'. +static void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) { static bool entered = false; int attr; @@ -5265,6 +5322,16 @@ static void win_redr_custom(win_T *wp, bool draw_ruler) attr = HL_ATTR(HLF_TPF); maxwidth = Columns; use_sandbox = was_set_insecurely(wp, "tabline", 0); + } else if (draw_winbar) { + stl = (char_u *)((*wp->w_p_wbr != NUL) ? wp->w_p_wbr : p_wbr); + row = -1; // row zero is first row of text + col = 0; + grid = &wp->w_grid; + grid_adjust(&grid, &row, &col); + fillchar = wp->w_p_fcs_chars.wbr; + attr = (wp == curwin) ? HL_ATTR(HLF_WBR) : HL_ATTR(HLF_WBRNC); + maxwidth = wp->w_width_inner; + use_sandbox = was_set_insecurely(wp, "winbar", 0); } else { row = is_stl_global ? (Rows - p_ch - 1) : W_ENDROW(wp); fillchar = fillchar_status(&attr, wp); @@ -5500,85 +5567,6 @@ void check_for_delay(bool check_msg_scroll) } } -/// (Re)allocates a window grid if size changed while in ext_multigrid mode. -/// Updates size, offsets and handle for the grid regardless. -/// -/// If "doclear" is true, don't try to copy from the old grid rather clear the -/// resized grid. -void win_grid_alloc(win_T *wp) -{ - ScreenGrid *grid = &wp->w_grid; - ScreenGrid *grid_allocated = &wp->w_grid_alloc; - - int rows = wp->w_height_inner; - int cols = wp->w_width_inner; - int total_rows = wp->w_height_outer; - int total_cols = wp->w_width_outer; - - bool want_allocation = ui_has(kUIMultigrid) || wp->w_floating; - bool has_allocation = (grid_allocated->chars != NULL); - - if (grid->Rows != rows) { - wp->w_lines_valid = 0; - xfree(wp->w_lines); - wp->w_lines = xcalloc(rows + 1, sizeof(wline_T)); - } - - int was_resized = false; - if (want_allocation && (!has_allocation - || grid_allocated->Rows != total_rows - || grid_allocated->Columns != total_cols)) { - grid_alloc(grid_allocated, total_rows, total_cols, - wp->w_grid_alloc.valid, false); - grid_allocated->valid = true; - if (wp->w_floating && wp->w_float_config.border) { - wp->w_redr_border = true; - } - was_resized = true; - } else if (!want_allocation && has_allocation) { - // Single grid mode, all rendering will be redirected to default_grid. - // Only keep track of the size and offset of the window. - grid_free(grid_allocated); - grid_allocated->valid = false; - was_resized = true; - } else if (want_allocation && has_allocation && !wp->w_grid_alloc.valid) { - grid_invalidate(grid_allocated); - grid_allocated->valid = true; - } - - grid->Rows = rows; - grid->Columns = cols; - - if (want_allocation) { - grid->target = grid_allocated; - grid->row_offset = wp->w_border_adj[0]; - grid->col_offset = wp->w_border_adj[3]; - } else { - grid->target = &default_grid; - grid->row_offset = wp->w_winrow; - grid->col_offset = wp->w_wincol; - } - - // send grid resize event if: - // - a grid was just resized - // - screen_resize was called and all grid sizes must be sent - // - the UI wants multigrid event (necessary) - if ((send_grid_resize || was_resized) && want_allocation) { - ui_call_grid_resize(grid_allocated->handle, - grid_allocated->Columns, grid_allocated->Rows); - } -} - -/// assign a handle to the grid. The grid need not be allocated. -void grid_assign_handle(ScreenGrid *grid) -{ - static int last_grid_handle = DEFAULT_GRID_HANDLE; - - // only assign a grid handle if not already - if (grid->handle == 0) { - grid->handle = ++last_grid_handle; - } -} /// Resize the screen to Rows and Columns. /// @@ -5586,7 +5574,7 @@ void grid_assign_handle(ScreenGrid *grid) /// /// There may be some time between setting Rows and Columns and (re)allocating /// default_grid arrays. This happens when starting up and when -/// (manually) changing the shell size. Always use default_grid.Rows and +/// (manually) changing the shell size. Always use default_grid.rows and /// default_grid.Columns to access items in default_grid.chars[]. Use Rows /// and Columns for positioning text etc. where the final size of the shell is /// needed. @@ -5607,8 +5595,8 @@ retry: // when Rows and Columns have been set and we have started doing full // screen stuff. if ((default_grid.chars != NULL - && Rows == default_grid.Rows - && Columns == default_grid.Columns + && Rows == default_grid.rows + && Columns == default_grid.cols ) || Rows == 0 || Columns == 0 @@ -5707,9 +5695,9 @@ void screenclear(void) } // blank out the default grid - for (i = 0; i < default_grid.Rows; i++) { + for (i = 0; i < default_grid.rows; i++) { grid_clear_line(&default_grid, default_grid.line_offset[i], - default_grid.Columns, true); + default_grid.cols, true); default_grid.line_wraps[i] = false; } @@ -5793,16 +5781,16 @@ void win_scroll_lines(win_T *wp, int row, int line_count) } // No lines are being moved, just draw over the entire area - if (row + abs(line_count) >= wp->w_grid.Rows) { + if (row + abs(line_count) >= wp->w_grid.rows) { return; } if (line_count < 0) { grid_del_lines(&wp->w_grid, row, -line_count, - wp->w_grid.Rows, 0, wp->w_grid.Columns); + wp->w_grid.rows, 0, wp->w_grid.cols); } else { grid_ins_lines(&wp->w_grid, row, line_count, - wp->w_grid.Rows, 0, wp->w_grid.Columns); + wp->w_grid.rows, 0, wp->w_grid.cols); } } @@ -5841,7 +5829,7 @@ void grid_ins_lines(ScreenGrid *grid, int row, int line_count, int end, int col, // Shift line_offset[] line_count down to reflect the inserted lines. // Clear the inserted lines. for (i = 0; i < line_count; i++) { - if (width != grid->Columns) { + if (width != grid->cols) { // need to copy part of a line j = end - 1 - i; while ((j -= line_count) >= row) { @@ -5859,7 +5847,7 @@ void grid_ins_lines(ScreenGrid *grid, int row, int line_count, int end, int col, } grid->line_offset[j + line_count] = temp; grid->line_wraps[j + line_count] = false; - grid_clear_line(grid, temp, grid->Columns, false); + grid_clear_line(grid, temp, grid->cols, false); } } @@ -5890,7 +5878,7 @@ void grid_del_lines(ScreenGrid *grid, int row, int line_count, int end, int col, // Now shift line_offset[] line_count up to reflect the deleted lines. // Clear the inserted lines. for (i = 0; i < line_count; i++) { - if (width != grid->Columns) { + if (width != grid->cols) { // need to copy part of a line j = row + i; while ((j += line_count) <= end - 1) { @@ -5909,7 +5897,7 @@ void grid_del_lines(ScreenGrid *grid, int row, int line_count, int end, int col, } grid->line_offset[j - line_count] = temp; grid->line_wraps[j - line_count] = false; - grid_clear_line(grid, temp, grid->Columns, false); + grid_clear_line(grid, temp, grid->cols, false); } } @@ -5943,8 +5931,8 @@ int showmode(void) msg_grid_validate(); do_mode = ((p_smd && msg_silent == 0) - && ((State & TERM_FOCUS) - || (State & INSERT) + && ((State & MODE_TERMINAL) + || (State & MODE_INSERT) || restart_edit != NUL || VIsual_active)); if (do_mode || reg_recording != 0) { @@ -6013,13 +6001,13 @@ int showmode(void) } } } else { - if (State & TERM_FOCUS) { + if (State & MODE_TERMINAL) { msg_puts_attr(_(" TERMINAL"), attr); } else if (State & VREPLACE_FLAG) { msg_puts_attr(_(" VREPLACE"), attr); } else if (State & REPLACE_FLAG) { msg_puts_attr(_(" REPLACE"), attr); - } else if (State & INSERT) { + } else if (State & MODE_INSERT) { if (p_ri) { msg_puts_attr(_(" REVERSE"), attr); } @@ -6035,7 +6023,7 @@ int showmode(void) if (p_hkmap) { msg_puts_attr(_(" Hebrew"), attr); } - if (State & LANGMAP) { + if (State & MODE_LANGMAP) { if (curwin->w_p_arab) { msg_puts_attr(_(" Arabic"), attr); } else if (get_keymap_str(curwin, (char_u *)" (%s)", @@ -6043,7 +6031,7 @@ int showmode(void) msg_puts_attr((char *)NameBuff, attr); } } - if ((State & INSERT) && p_paste) { + if ((State & MODE_INSERT) && p_paste) { msg_puts_attr(_(" (paste)"), attr); } @@ -6216,7 +6204,7 @@ void draw_tabline(void) // Check for an error. If there is one we would loop in redrawing the // screen. Avoid that by making 'tabline' empty. did_emsg = false; - win_redr_custom(NULL, false); + win_redr_custom(NULL, false, false); if (did_emsg) { set_string_option_direct("tabline", -1, (char_u *)"", OPT_FREE, SID_ERROR); @@ -6390,7 +6378,7 @@ void get_trans_bufname(buf_T *buf) if (buf_spname(buf) != NULL) { STRLCPY(NameBuff, buf_spname(buf), MAXPATHL); } else { - home_replace(buf, buf->b_fname, NameBuff, MAXPATHL, TRUE); + home_replace(buf, (char_u *)buf->b_fname, NameBuff, MAXPATHL, true); } trans_characters(NameBuff, MAXPATHL); } @@ -6512,7 +6500,7 @@ static void win_redr_ruler(win_T *wp, bool always) int save_called_emsg = called_emsg; called_emsg = false; - win_redr_custom(wp, true); + win_redr_custom(wp, false, true); if (called_emsg) { set_string_option_direct("rulerformat", -1, (char_u *)"", OPT_FREE, SID_ERROR); @@ -6521,13 +6509,10 @@ static void win_redr_ruler(win_T *wp, bool always) return; } - /* - * Check if not in Insert mode and the line is empty (will show "0-1"). - */ - int empty_line = FALSE; - if (!(State & INSERT) - && *ml_get_buf(wp->w_buffer, wp->w_cursor.lnum, FALSE) == NUL) { - empty_line = TRUE; + // Check if not in Insert mode and the line is empty (will show "0-1"). + int empty_line = false; + if ((State & MODE_INSERT) == 0 && *ml_get_buf(wp->w_buffer, wp->w_cursor.lnum, false) == NUL) { + empty_line = true; } /* @@ -6753,11 +6738,9 @@ static void margin_columns_win(win_T *wp, int *left_col, int *right_col) /// Set dimensions of the Nvim application "shell". void screen_resize(int width, int height) { - static bool recursive = false; - // Avoid recursiveness, can happen when setting the window size causes // another window-changed signal. - if (updating_screen || recursive) { + if (updating_screen || resizing_screen) { return; } @@ -6765,9 +6748,9 @@ void screen_resize(int width, int height) return; } - if (State == HITRETURN || State == SETWSIZE) { + if (State == MODE_HITRETURN || State == MODE_SETWSIZE) { // postpone the resizing - State = SETWSIZE; + State = MODE_SETWSIZE; return; } @@ -6779,7 +6762,7 @@ void screen_resize(int width, int height) return; } - recursive = true; + resizing_screen = true; Rows = height; Columns = width; @@ -6796,11 +6779,11 @@ void screen_resize(int width, int height) send_grid_resize = true; - /* The window layout used to be adjusted here, but it now happens in - * screenalloc() (also invoked from screenclear()). That is because the - * "recursive" check above may skip this, but not screenalloc(). */ + /// The window layout used to be adjusted here, but it now happens in + /// screenalloc() (also invoked from screenclear()). That is because the + /// recursize "resizing_screen" check above may skip this, but not screenalloc(). - if (State != ASKMORE && State != EXTERNCMD && State != CONFIRM) { + if (State != MODE_ASKMORE && State != MODE_EXTERNCMD && State != MODE_CONFIRM) { screenclear(); } @@ -6819,7 +6802,7 @@ void screen_resize(int width, int height) * Always need to call update_screen() or screenalloc(), to make * sure Rows/Columns and the size of the screen is correct! */ - if (State == ASKMORE || State == EXTERNCMD || State == CONFIRM + if (State == MODE_ASKMORE || State == MODE_EXTERNCMD || State == MODE_CONFIRM || exmode_active) { screenalloc(); if (msg_grid.chars) { @@ -6833,7 +6816,7 @@ void screen_resize(int width, int height) if (curwin->w_p_scb) { do_check_scrollbind(true); } - if (State & CMDLINE) { + if (State & MODE_CMDLINE) { redraw_popupmenu = false; update_screen(NOT_VALID); redrawcmdline(); @@ -6857,7 +6840,7 @@ void screen_resize(int width, int height) } ui_flush(); } - recursive = false; + resizing_screen = false; } /// Check if the new Nvim application "shell" dimensions are valid. diff --git a/src/nvim/screen.h b/src/nvim/screen.h index 3afbaa5eb6..f3beeff8a9 100644 --- a/src/nvim/screen.h +++ b/src/nvim/screen.h @@ -49,14 +49,22 @@ typedef struct { } StlClickRecord; /// Array defining what should be done when tabline is clicked -extern StlClickDefinition *tab_page_click_defs; +EXTERN StlClickDefinition *tab_page_click_defs INIT(= NULL); /// Size of the tab_page_click_defs array -extern long tab_page_click_defs_size; +EXTERN long tab_page_click_defs_size INIT(= 0); #define W_ENDCOL(wp) ((wp)->w_wincol + (wp)->w_width) #define W_ENDROW(wp) ((wp)->w_winrow + (wp)->w_height) +// While redrawing the screen this flag is set. It means the screen size +// ('lines' and 'rows') must not be changed. +EXTERN bool updating_screen INIT(= 0); + +// While resizing the screen this flag is set. +EXTERN bool resizing_screen INIT(= 0); + + #ifdef INCLUDE_GENERATED_DECLARATIONS # include "screen.h.generated.h" #endif diff --git a/src/nvim/search.c b/src/nvim/search.c index b386c6a7c4..11d40c058c 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -189,7 +189,7 @@ int search_regcomp(char_u *pat, int pat_save, int pat_use, int options, regmmatc regmatch->rmm_ic = ignorecase(pat); regmatch->rmm_maxcol = 0; - regmatch->regprog = vim_regcomp(pat, magic ? RE_MAGIC : 0); + regmatch->regprog = vim_regcomp((char *)pat, magic ? RE_MAGIC : 0); if (regmatch->regprog == NULL) { return FAIL; } @@ -1055,7 +1055,7 @@ int do_search(oparg_T *oap, int dirc, int search_delim, char_u *pat, long count, * A line offset is not remembered, this is vi compatible. */ if (spats[0].off.line && vim_strchr(p_cpo, CPO_LINEOFF) != NULL) { - spats[0].off.line = FALSE; + spats[0].off.line = false; spats[0].off.off = 0; } @@ -1979,7 +1979,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel) // This is just guessing: when 'rightleft' is set, search for a matching // paren/brace in the other direction. - if (curwin->w_p_rl && vim_strchr((char_u *)"()[]{}<>", initc) != NULL) { + if (curwin->w_p_rl && vim_strchr("()[]{}<>", initc) != NULL) { backwards = !backwards; } @@ -2092,7 +2092,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel) } else if (raw_string) { if (linep[pos.col - 1] == 'R' && linep[pos.col] == '"' - && vim_strchr(linep + pos.col + 1, '(') != NULL) { + && vim_strchr((char *)linep + pos.col + 1, '(') != NULL) { // Possible start of raw string. Now that we have the // delimiter we can check if it ends before where we // started searching, or before the previously found @@ -2273,7 +2273,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel) * (actually, we skip #\( et al) */ if (curbuf->b_p_lisp - && vim_strchr((char_u *)"(){}[]", c) != NULL + && vim_strchr("(){}[]", c) != NULL && pos.col > 1 && check_prevcol(linep, pos.col, '\\', NULL) && check_prevcol(linep, pos.col - 1, '#', NULL)) { @@ -2321,7 +2321,7 @@ int check_linecomment(const char_u *line) const char_u *p = line; // scan from start // skip Lispish one-line comments if (curbuf->b_p_lisp) { - if (vim_strchr(p, ';') != NULL) { // there may be comments + if (vim_strchr((char *)p, ';') != NULL) { // there may be comments bool in_str = false; // inside of string while ((p = (char_u *)strpbrk((char *)p, "\";")) != NULL) { @@ -2346,7 +2346,7 @@ int check_linecomment(const char_u *line) p = NULL; } } else { - while ((p = vim_strchr(p, '/')) != NULL) { + while ((p = (char_u *)vim_strchr((char *)p, '/')) != NULL) { // Accept a double /, unless it's preceded with * and followed by *, // because * / / * is an end and start of a C comment. // Only accept the position if it is not inside a string. @@ -2428,7 +2428,7 @@ void showmatch(int c) save_dollar_vcol = dollar_vcol; save_state = State; - State = SHOWMATCH; + State = MODE_SHOWMATCH; ui_cursor_shape(); // may show different cursor shape curwin->w_cursor = mpos; // move to matching char *so = 0; // don't use 'scrolloff' here @@ -2507,7 +2507,7 @@ int findsent(Direction dir, long count) // go back to the previous non-white non-punctuation character bool found_dot = false; while (c = gchar_pos(&pos), ascii_iswhite(c) - || vim_strchr((char_u *)".!?)]\"'", c) != NULL) { + || vim_strchr(".!?)]\"'", c) != NULL) { tpos = pos; if (decl(&tpos) == -1 || (LINEEMPTY(tpos.lnum) && dir == FORWARD)) { break; @@ -2515,11 +2515,11 @@ int findsent(Direction dir, long count) if (found_dot) { break; } - if (vim_strchr((char_u *)".!?", c) != NULL) { + if (vim_strchr(".!?", c) != NULL) { found_dot = true; } - if (vim_strchr((char_u *)")]\"'", c) != NULL - && vim_strchr((char_u *)".!?)]\"'", gchar_pos(&tpos)) == NULL) { + if (vim_strchr(")]\"'", c) != NULL + && vim_strchr(".!?)]\"'", gchar_pos(&tpos)) == NULL) { break; } decl(&pos); @@ -2543,7 +2543,7 @@ int findsent(Direction dir, long count) if ((c = inc(&tpos)) == -1) { break; } - } while (vim_strchr((char_u *)")]\"'", c = gchar_pos(&tpos)) + } while (vim_strchr(")]\"'", c = gchar_pos(&tpos)) != NULL); if (c == -1 || (!cpo_J && (c == ' ' || c == '\t')) || c == NUL || (cpo_J && (c == ' ' && inc(&tpos) >= 0 @@ -3399,7 +3399,7 @@ int current_block(oparg_T *oap, long count, int include, int what, int other) pos_T start_pos; pos_T *end_pos; pos_T old_start, old_end; - char_u *save_cpo; + char *save_cpo; bool sol = false; // '{' at start of line old_pos = curwin->w_cursor; @@ -3434,7 +3434,7 @@ int current_block(oparg_T *oap, long count, int include, int what, int other) // Ignore quotes here. Keep the "M" flag in 'cpo', as that is what the // user wants. save_cpo = p_cpo; - p_cpo = (char_u *)(vim_strchr(p_cpo, CPO_MATCHBSL) != NULL ? "%M" : "%"); + p_cpo = vim_strchr(p_cpo, CPO_MATCHBSL) != NULL ? "%M" : "%"; if ((pos = findmatch(NULL, what)) != NULL) { while (count-- > 0) { if ((pos = findmatch(NULL, what)) == NULL) { @@ -3967,7 +3967,7 @@ static int find_next_quote(char_u *line, int col, int quotechar, char_u *escape) c = line[col]; if (c == NUL) { return -1; - } else if (escape != NULL && vim_strchr(escape, c)) { + } else if (escape != NULL && vim_strchr((char *)escape, c)) { col++; if (line[col] == NUL) { return -1; @@ -3996,7 +3996,7 @@ static int find_prev_quote(char_u *line, int col_start, int quotechar, char_u *e col_start -= utf_head_off(line, line + col_start); n = 0; if (escape != NULL) { - while (col_start - n > 0 && vim_strchr(escape, + while (col_start - n > 0 && vim_strchr((char *)escape, line[col_start - n - 1]) != NULL) { ++n; } @@ -5160,7 +5160,7 @@ static void fuzzy_match_in_list(list_T *const l, char_u *const str, const bool m int j = 0; const char_u *p = str; while (*p != NUL) { - if (!ascii_iswhite(utf_ptr2char((char *)p))) { + if (!ascii_iswhite(utf_ptr2char((char *)p)) || matchseq) { tv_list_append_number(items[match_count].lmatchpos, matches[j]); j++; } @@ -5332,7 +5332,7 @@ void find_pattern_in_path(char_u *ptr, Direction dir, size_t len, bool whole, bo char_u *pat; char_u *new_fname; - char_u *curr_fname = curbuf->b_fname; + char_u *curr_fname = (char_u *)curbuf->b_fname; char_u *prev_fname = NULL; linenr_T lnum; int depth; @@ -5372,7 +5372,7 @@ void find_pattern_in_path(char_u *ptr, Direction dir, size_t len, bool whole, bo sprintf((char *)pat, whole ? "\\<%.*s\\>" : "%.*s", (int)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((char *)pat, p_magic ? RE_MAGIC : 0); xfree(pat); if (regmatch.regprog == NULL) { goto fpip_end; @@ -5380,7 +5380,7 @@ void find_pattern_in_path(char_u *ptr, Direction dir, size_t len, bool whole, bo } 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((char *)inc_opt, p_magic ? RE_MAGIC : 0); if (incl_regmatch.regprog == NULL) { goto fpip_end; } @@ -5388,7 +5388,8 @@ void find_pattern_in_path(char_u *ptr, Direction dir, size_t len, bool whole, bo } 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); + ? (char *)p_def : (char *)curbuf->b_p_def, + p_magic ? RE_MAGIC : 0); if (def_regmatch.regprog == NULL) { goto fpip_end; } @@ -5410,7 +5411,7 @@ void find_pattern_in_path(char_u *ptr, Direction dir, size_t len, bool whole, bo for (;;) { if (incl_regmatch.regprog != NULL && vim_regexec(&incl_regmatch, line, (colnr_T)0)) { - char_u *p_fname = (curr_fname == curbuf->b_fname) + char_u *p_fname = (curr_fname == (char_u *)curbuf->b_fname) ? curbuf->b_ffname : curr_fname; if (inc_opt != NULL && strstr((char *)inc_opt, "\\zs") != NULL) { @@ -5737,7 +5738,8 @@ search_line: } const int add_r = ins_compl_add_infercase(aux, i, p_ic, - curr_fname == curbuf->b_fname ? NULL : curr_fname, + curr_fname == (char_u *)curbuf->b_fname + ? NULL : curr_fname, dir, cont_s_ipos); if (add_r == OK) { // if dir was BACKWARD then honor it just once @@ -5865,8 +5867,8 @@ exit_matched: --old_files; files[old_files].name = files[depth].name; files[old_files].matched = files[depth].matched; - --depth; - curr_fname = (depth == -1) ? curbuf->b_fname + depth--; + curr_fname = (depth == -1) ? (char_u *)curbuf->b_fname : files[depth].name; if (depth < depth_displayed) { depth_displayed = depth; diff --git a/src/nvim/shada.c b/src/nvim/shada.c index a3d88a4963..abb6c68474 100644 --- a/src/nvim/shada.c +++ b/src/nvim/shada.c @@ -1447,7 +1447,7 @@ static const char *shada_get_default_file(void) FUNC_ATTR_WARN_UNUSED_RESULT { if (default_shada_file == NULL) { - char *shada_dir = stdpaths_user_data_subpath("shada", 0, false); + char *shada_dir = stdpaths_user_state_subpath("shada", 0, false); default_shada_file = concat_fnames_realloc(shada_dir, "main.shada", true); } return default_shada_file; diff --git a/src/nvim/sign.c b/src/nvim/sign.c index 6a690f9af8..dd6fdf3cd5 100644 --- a/src/nvim/sign.c +++ b/src/nvim/sign.c @@ -1742,33 +1742,33 @@ static char_u *get_nth_sign_group_name(int idx) /// Function given to ExpandGeneric() to obtain the sign command /// expansion. -char_u *get_sign_name(expand_T *xp, int idx) +char *get_sign_name(expand_T *xp, int idx) { switch (expand_what) { case EXP_SUBCMD: - return (char_u *)cmds[idx]; + return cmds[idx]; case EXP_DEFINE: { char *define_arg[] = { "culhl=", "icon=", "linehl=", "numhl=", "text=", "texthl=", NULL }; - return (char_u *)define_arg[idx]; + return define_arg[idx]; } case EXP_PLACE: { char *place_arg[] = { "line=", "name=", "group=", "priority=", "file=", "buffer=", NULL }; - return (char_u *)place_arg[idx]; + return place_arg[idx]; } case EXP_LIST: { char *list_arg[] = { "group=", "file=", "buffer=", NULL }; - return (char_u *)list_arg[idx]; + return list_arg[idx]; } case EXP_UNPLACE: { char *unplace_arg[] = { "group=", "file=", "buffer=", NULL }; - return (char_u *)unplace_arg[idx]; + return unplace_arg[idx]; } case EXP_SIGN_NAMES: - return get_nth_sign_name(idx); + return (char *)get_nth_sign_name(idx); case EXP_SIGN_GROUPS: - return get_nth_sign_group_name(idx); + return (char *)get_nth_sign_group_name(idx); default: return NULL; } @@ -1815,7 +1815,7 @@ void set_context_in_sign_cmd(expand_T *xp, char_u *arg) p = skiptowhite(p); } while (*p != NUL); - p = vim_strchr(last, '='); + p = (char_u *)vim_strchr((char *)last, '='); // :sign define {name} {args}... {last}= // | | diff --git a/src/nvim/spell.c b/src/nvim/spell.c index fc3bcef666..1ba29e3fc1 100644 --- a/src/nvim/spell.c +++ b/src/nvim/spell.c @@ -385,7 +385,7 @@ size_t spell_check(win_T *wp, char_u *ptr, hlf_T *attrp, int *capcol, bool docou } else if (*ptr == '0' && (ptr[1] == 'x' || ptr[1] == 'X')) { mi.mi_end = skiphex(ptr + 2); } else { - mi.mi_end = skipdigits(ptr); + mi.mi_end = (char_u *)skipdigits((char *)ptr); } nrlen = (size_t)(mi.mi_end - ptr); } @@ -1173,7 +1173,7 @@ static bool match_compoundrule(slang_T *slang, char_u *compflags) } // Skip to the next "/", where the next pattern starts. - p = vim_strchr(p, '/'); + p = (char_u *)vim_strchr((char *)p, '/'); if (p == NULL) { break; } @@ -1637,7 +1637,7 @@ void spell_cat_line(char_u *buf, char_u *line, int maxlen) int n; p = (char_u *)skipwhite((char *)line); - while (vim_strchr((char_u *)"*#/\"\t", *p) != NULL) { + while (vim_strchr("*#/\"\t", *p) != NULL) { p = (char_u *)skipwhite((char *)p + 1); } @@ -1656,7 +1656,7 @@ void spell_cat_line(char_u *buf, char_u *line, int maxlen) // "lang" must be the language without the region: e.g., "en". static void spell_load_lang(char_u *lang) { - char_u fname_enc[85]; + char fname_enc[85]; int r; spelload_T sl; int round; @@ -1682,8 +1682,8 @@ static void spell_load_lang(char_u *lang) r = do_in_runtimepath((char *)fname_enc, 0, spell_load_cb, &sl); if (r == FAIL && *sl.sl_lang != NUL && round == 1 - && apply_autocmds(EVENT_SPELLFILEMISSING, lang, - curbuf->b_fname, FALSE, curbuf)) { + && apply_autocmds(EVENT_SPELLFILEMISSING, (char *)lang, + curbuf->b_fname, false, curbuf)) { continue; } break; @@ -1961,14 +1961,14 @@ int init_syl_tab(slang_T *slang) int l; ga_init(&slang->sl_syl_items, sizeof(syl_item_T), 4); - p = vim_strchr(slang->sl_syllable, '/'); + p = (char_u *)vim_strchr((char *)slang->sl_syllable, '/'); while (p != NULL) { *p++ = NUL; if (*p == NUL) { // trailing slash break; } s = p; - p = vim_strchr(p, '/'); + p = (char_u *)vim_strchr((char *)p, '/'); if (p == NULL) { l = (int)STRLEN(s); } else { @@ -2025,7 +2025,7 @@ static int count_syllables(slang_T *slang, const char_u *word) // No recognized syllable item, at least a syllable char then? c = utf_ptr2char((char *)p); len = utfc_ptr2len((char *)p); - if (vim_strchr(slang->sl_syllable, c) == NULL) { + if (vim_strchr((char *)slang->sl_syllable, c) == NULL) { skip = false; // No, search for next syllable } else if (!skip) { ++cnt; // Yes, count it @@ -2105,7 +2105,7 @@ char *did_set_spelllang(win_T *wp) filename = true; // Locate a region and remove it from the file name. - p = vim_strchr(path_tail(lang), '_'); + p = (char_u *)vim_strchr(path_tail((char *)lang), '_'); if (p != NULL && ASCII_ISALPHA(p[1]) && ASCII_ISALPHA(p[2]) && !ASCII_ISALPHA(p[3])) { STRLCPY(region_cp, p + 1, 3); @@ -2247,8 +2247,8 @@ char *did_set_spelllang(win_T *wp) if (round == 0) { STRCPY(lang, "internal wordlist"); } else { - STRLCPY(lang, path_tail(spf_name), MAXWLEN + 1); - p = vim_strchr(lang, '.'); + STRLCPY(lang, path_tail((char *)spf_name), MAXWLEN + 1); + p = (char_u *)vim_strchr((char *)lang, '.'); if (p != NULL) { *p = NUL; // truncate at ".encoding.add" } @@ -2686,7 +2686,7 @@ static bool spell_iswordp(const char_u *p, const win_T *wp) if (c < 256 ? wp->w_s->b_spell_ismw[c] : (wp->w_s->b_spell_ismw_mb != NULL - && vim_strchr(wp->w_s->b_spell_ismw_mb, c) != NULL)) { + && vim_strchr((char *)wp->w_s->b_spell_ismw_mb, c) != NULL)) { s = p + l; } } @@ -2730,9 +2730,10 @@ static bool spell_iswordp_w(const int *p, const win_T *wp) { const int *s; - if (*p < 256 ? wp->w_s->b_spell_ismw[*p] - : (wp->w_s->b_spell_ismw_mb != NULL - && vim_strchr(wp->w_s->b_spell_ismw_mb, *p) != NULL)) { + if (*p < + 256 ? wp->w_s->b_spell_ismw[*p] : (wp->w_s->b_spell_ismw_mb != NULL + && vim_strchr((char *)wp->w_s->b_spell_ismw_mb, + *p) != NULL)) { s = p + 1; } else { s = p; @@ -3413,7 +3414,7 @@ static void spell_suggest_file(suginfo_T *su, char_u *fname) while (!vim_fgets(line, MAXWLEN * 2, fd) && !got_int) { line_breakcheck(); - p = vim_strchr(line, '/'); + p = (char_u *)vim_strchr((char *)line, '/'); if (p == NULL) { continue; // No Tab found, just skip the line. } @@ -5652,12 +5653,12 @@ static void make_case_word(char_u *fword, char_u *cword, int flags) static bool similar_chars(slang_T *slang, int c1, int c2) { int m1, m2; - char_u buf[MB_MAXBYTES + 1]; + char buf[MB_MAXBYTES + 1]; hashitem_T *hi; if (c1 >= 256) { buf[utf_char2bytes(c1, (char *)buf)] = 0; - hi = hash_find(&slang->sl_map_hash, buf); + hi = hash_find(&slang->sl_map_hash, (char_u *)buf); if (HASHITEM_EMPTY(hi)) { m1 = 0; } else { @@ -5672,7 +5673,7 @@ static bool similar_chars(slang_T *slang, int c1, int c2) if (c2 >= 256) { buf[utf_char2bytes(c2, (char *)buf)] = 0; - hi = hash_find(&slang->sl_map_hash, buf); + hi = hash_find(&slang->sl_map_hash, (char_u *)buf); if (HASHITEM_EMPTY(hi)) { m2 = 0; } else { @@ -6260,7 +6261,7 @@ static void spell_soundfold_wsal(slang_T *slang, char_u *inword, char_u *res) // replace string ws = smp[n].sm_to_w; s = smp[n].sm_rules; - p0 = (vim_strchr(s, '<') != NULL) ? 1 : 0; + p0 = (vim_strchr((char *)s, '<') != NULL) ? 1 : 0; if (p0 == 1 && z == 0) { // rule with '<' is used if (reslen > 0 && ws != NULL && *ws != NUL @@ -6871,20 +6872,20 @@ void ex_spellinfo(exarg_T *eap) // ":spelldump" void ex_spelldump(exarg_T *eap) { - char_u *spl; + char *spl; long dummy; if (no_spell_checking(curwin)) { return; } - get_option_value("spl", &dummy, (char **)&spl, OPT_LOCAL); + get_option_value("spl", &dummy, &spl, OPT_LOCAL); // Create a new empty buffer in a new window. do_cmdline_cmd("new"); // enable spelling locally in the new window set_option_value("spell", true, "", OPT_LOCAL); - set_option_value("spl", dummy, (char *)spl, OPT_LOCAL); + set_option_value("spl", dummy, spl, OPT_LOCAL); xfree(spl); if (!buf_is_empty(curbuf)) { diff --git a/src/nvim/spellfile.c b/src/nvim/spellfile.c index b7ee3e7374..f8c01bc27f 100644 --- a/src/nvim/spellfile.c +++ b/src/nvim/spellfile.c @@ -302,6 +302,7 @@ #define CF_UPPER 0x02 static char *e_spell_trunc = N_("E758: Truncated spell file"); +static char *e_illegal_character_in_word = N_("E1280: Illegal character in word"); static char *e_afftrailing = N_("Trailing text in %s line %d: %s"); static char *e_affname = N_("Affix name too long in %s line %d: %s"); static char *msg_compressing = N_("Compressing word tree..."); @@ -575,7 +576,7 @@ slang_T *spell_load_file(char_u *fname, char_u *lang, slang_T *old_lp, bool sile char_u *p; int n; int len; - char_u *save_sourcing_name = sourcing_name; + char_u *save_sourcing_name = (char_u *)sourcing_name; linenr_T save_sourcing_lnum = sourcing_lnum; slang_T *lp = NULL; int c = 0; @@ -605,13 +606,13 @@ slang_T *spell_load_file(char_u *fname, char_u *lang, slang_T *old_lp, bool sile lp->sl_fname = vim_strsave(fname); // Check for .add.spl. - lp->sl_add = strstr((char *)path_tail(fname), SPL_FNAME_ADD) != NULL; + lp->sl_add = strstr(path_tail((char *)fname), SPL_FNAME_ADD) != NULL; } else { lp = old_lp; } // Set sourcing_name, so that error messages mention the file name. - sourcing_name = fname; + sourcing_name = (char *)fname; sourcing_lnum = 0; // <HEADER>: <fileID> @@ -809,7 +810,7 @@ endOK: if (fd != NULL) { fclose(fd); } - sourcing_name = save_sourcing_name; + sourcing_name = (char *)save_sourcing_name; sourcing_lnum = save_sourcing_lnum; return lp; @@ -1099,7 +1100,7 @@ static int read_prefcond_section(FILE *fd, slang_T *lp) buf[0] = '^'; // always match at one position only SPELL_READ_NONNUL_BYTES(buf + 1, (size_t)n, fd,; ); buf[n + 1] = NUL; - lp->sl_prefprog[i] = vim_regcomp((char_u *)buf, RE_MAGIC | RE_STRING); + lp->sl_prefprog[i] = vim_regcomp(buf, RE_MAGIC | RE_STRING); } } return 0; @@ -1201,7 +1202,7 @@ static int read_sal_section(FILE *fd, slang_T *slang) int i = 0; for (; i < ccnt; ++i) { c = getc(fd); // <salfrom> - if (vim_strchr((char_u *)"0123456789(-<^$", c) != NULL) { + if (vim_strchr("0123456789(-<^$", c) != NULL) { break; } *p++ = c; @@ -1465,7 +1466,7 @@ static int read_compound(FILE *fd, slang_T *slang, int len) } // Add all flags to "sl_compallflags". - if (vim_strchr((char_u *)"?*+[]/", c) == NULL + if (vim_strchr("?*+[]/", c) == NULL && !byte_in_str(slang->sl_compallflags, c)) { *ap++ = c; *ap = NUL; @@ -1520,7 +1521,7 @@ static int read_compound(FILE *fd, slang_T *slang, int len) *crp = NUL; } - slang->sl_compprog = vim_regcomp(pat, RE_MAGIC + RE_STRING + RE_STRICT); + slang->sl_compprog = vim_regcomp((char *)pat, RE_MAGIC + RE_STRING + RE_STRICT); xfree(pat); if (slang->sl_compprog == NULL) { return SP_FORMERROR; @@ -2251,7 +2252,7 @@ static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname) } } else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2)) { // Don't use the first rule if it is a number. - if (compflags != NULL || *skipdigits(items[1]) != NUL) { + if (compflags != NULL || *skipdigits((char *)items[1]) != NUL) { // Concatenate this string to previously defined ones, // using a slash to separate them. l = (int)STRLEN(items[1]) + 1; @@ -2460,7 +2461,7 @@ static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname) aff_entry->ae_add = getroom_save(spin, items[3]); // Recognize flags on the affix: abcd/XYZ - aff_entry->ae_flags = vim_strchr(aff_entry->ae_add, '/'); + aff_entry->ae_flags = (char_u *)vim_strchr((char *)aff_entry->ae_add, '/'); if (aff_entry->ae_flags != NULL) { *aff_entry->ae_flags++ = NUL; aff_process_flags(aff, aff_entry); @@ -2483,8 +2484,7 @@ static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname) } else { sprintf((char *)buf, "%s$", items[4]); } - aff_entry->ae_prog = vim_regcomp(buf, - RE_MAGIC + RE_STRING + RE_STRICT); + aff_entry->ae_prog = vim_regcomp((char *)buf, RE_MAGIC + RE_STRING + RE_STRICT); if (aff_entry->ae_prog == NULL) { smsg(_("Broken condition in %s line %d: %s"), fname, lnum, items[4]); @@ -2532,7 +2532,7 @@ static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname) sprintf((char *)buf, "^%s", aff_entry->ae_cond); vim_regfree(aff_entry->ae_prog); - aff_entry->ae_prog = vim_regcomp(buf, RE_MAGIC + RE_STRING); + aff_entry->ae_prog = vim_regcomp((char *)buf, RE_MAGIC + RE_STRING); } } } @@ -2651,7 +2651,7 @@ static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname) if ((!GA_EMPTY(&spin->si_map) && vim_strchr(spin->si_map.ga_data, c) != NULL) - || vim_strchr(p, c) != NULL) { + || vim_strchr((char *)p, c) != NULL) { smsg(_("Duplicate character in MAP in %s line %d"), fname, lnum); } @@ -2923,7 +2923,7 @@ static void process_compflags(spellinfo_T *spin, afffile_T *aff, char_u *compfla tp = p + STRLEN(p); for (p = compflags; *p != NUL;) { - if (vim_strchr((char_u *)"/?*+[]", *p) != NULL) { + if (vim_strchr("/?*+[]", *p) != NULL) { // Copy non-flag characters directly. *tp++ = *p++; } else { @@ -2946,7 +2946,7 @@ static void process_compflags(spellinfo_T *spin, afffile_T *aff, char_u *compfla do { check_renumber(spin); id = spin->si_newcompID--; - } while (vim_strchr((char_u *)"/?*+[]\\-^", id) != NULL); + } while (vim_strchr("/?*+[]\\-^", id) != NULL); ci->ci_newID = id; hash_add(&aff->af_comp, ci->ci_key); } @@ -2981,7 +2981,7 @@ static bool flag_in_afflist(int flagtype, char_u *afflist, unsigned flag) switch (flagtype) { case AFT_CHAR: - return vim_strchr(afflist, flag) != NULL; + return vim_strchr((char *)afflist, flag) != NULL; case AFT_CAPLONG: case AFT_LONG: @@ -3782,7 +3782,7 @@ static int spell_read_wordfile(spellinfo_T *spin, char_u *fname) regionmask = spin->si_region; // Check for flags and region after a slash. - p = vim_strchr(line, '/'); + p = (char_u *)vim_strchr((char *)line, '/'); if (p != NULL) { *p++ = NUL; while (*p != NUL) { @@ -3927,6 +3927,11 @@ static int store_word(spellinfo_T *spin, char_u *word, int flags, int region, co char_u foldword[MAXWLEN]; int res = OK; + // Avoid adding illegal bytes to the word tree. + if (!utf_valid_string(word, NULL)) { + return FAIL; + } + (void)spell_casefold(curwin, word, len, foldword, MAXWLEN); for (const char_u *p = pfxlist; res == OK; p++) { if (!need_affix || (p != NULL && *p != NUL)) { @@ -4401,7 +4406,7 @@ static int write_vim_spell(spellinfo_T *spin, char_u *fname) // Also skip this for an .add.spl file, the main spell file must contain // the table (avoids that it conflicts). File is shorter too. if (!spin->si_ascii && !spin->si_add) { - char_u folchars[128 * 8]; + char folchars[128 * 8]; int flags; putc(SN_CHARFLAGS, fd); // <sectionID> @@ -5320,19 +5325,19 @@ static void mkspell(int fcount, char_u **fnames, bool ascii, bool over_write, bo } // Check for .ascii.spl. - if (strstr((char *)path_tail(wfname), SPL_FNAME_ASCII) != NULL) { + if (strstr(path_tail((char *)wfname), SPL_FNAME_ASCII) != NULL) { spin.si_ascii = true; } // Check for .add.spl. - if (strstr((char *)path_tail(wfname), SPL_FNAME_ADD) != NULL) { + if (strstr(path_tail((char *)wfname), SPL_FNAME_ADD) != NULL) { spin.si_add = true; } } if (incount <= 0) { emsg(_(e_invarg)); // need at least output and input names - } else if (vim_strchr(path_tail(wfname), '_') != NULL) { + } else if (vim_strchr(path_tail((char *)wfname), '_') != NULL) { emsg(_("E751: Output file name must not have region name")); } else if (incount > MAXREGIONS) { semsg(_("E754: Only up to %d regions supported"), MAXREGIONS); @@ -5357,7 +5362,7 @@ static void mkspell(int fcount, char_u **fnames, bool ascii, bool over_write, bo if (incount > 1) { len = (int)STRLEN(innames[i]); - if (STRLEN(path_tail(innames[i])) < 5 + if (STRLEN(path_tail((char *)innames[i])) < 5 || innames[i][len - 3] != '_') { semsg(_("E755: Invalid region in %s"), innames[i]); goto theend; @@ -5525,6 +5530,11 @@ void spell_add_word(char_u *word, int len, SpellAddType what, int idx, bool undo int i; char_u *spf; + if (!utf_valid_string(word, NULL)) { + emsg(_(e_illegal_character_in_word)); + return; + } + if (idx == 0) { // use internal wordlist if (int_wordlist == NULL) { int_wordlist = vim_tempname(); @@ -5682,7 +5692,7 @@ static void init_spellfile(void) // Find the end of the language name. Exclude the region. If there // is a path separator remember the start of the tail. for (lend = curwin->w_s->b_p_spl; *lend != NUL - && vim_strchr((char_u *)",._", *lend) == NULL; ++lend) { + && vim_strchr(",._", *lend) == NULL; lend++) { if (vim_ispathsep(*lend)) { aspath = true; lstart = lend + 1; @@ -5725,7 +5735,7 @@ static void init_spellfile(void) ->lp_slang->sl_fname; vim_snprintf((char *)buf + l, MAXPATHL - l, ".%s.add", ((fname != NULL - && strstr((char *)path_tail(fname), ".ascii.") != NULL) + && strstr(path_tail((char *)fname), ".ascii.") != NULL) ? "ascii" : (const char *)spell_enc())); set_option_value("spellfile", 0L, (const char *)buf, OPT_LOCAL); @@ -5862,19 +5872,19 @@ static void set_map_str(slang_T *lp, char_u *map) if (c >= 256) { int cl = utf_char2len(c); int headcl = utf_char2len(headc); - char_u *b; + char *b; hash_T hash; hashitem_T *hi; b = xmalloc(cl + headcl + 2); - utf_char2bytes(c, (char *)b); + utf_char2bytes(c, b); b[cl] = NUL; - utf_char2bytes(headc, (char *)b + cl + 1); + utf_char2bytes(headc, b + cl + 1); b[cl + 1 + headcl] = NUL; - hash = hash_hash(b); + hash = hash_hash((char_u *)b); hi = hash_lookup(&lp->sl_map_hash, (const char *)b, STRLEN(b), hash); if (HASHITEM_EMPTY(hi)) { - hash_add_item(&lp->sl_map_hash, hi, b, hash); + hash_add_item(&lp->sl_map_hash, hi, (char_u *)b, hash); } else { // This should have been checked when generating the .spl // file. diff --git a/src/nvim/state.c b/src/nvim/state.c index 6f4bab62d1..36789016a9 100644 --- a/src/nvim/state.c +++ b/src/nvim/state.c @@ -56,7 +56,7 @@ getkey: key = K_EVENT; } else { // Duplicate display updating logic in vgetorpeek() - if (((State & INSERT) != 0 || p_lz) && (State & CMDLINE) == 0 + if (((State & MODE_INSERT) != 0 || p_lz) && (State & MODE_CMDLINE) == 0 && must_redraw != 0 && !need_wait_return) { update_screen(0); setcursor(); // put cursor back where it belongs @@ -136,21 +136,22 @@ bool virtual_active(void) } return cur_ve_flags == VE_ALL || ((cur_ve_flags & VE_BLOCK) && VIsual_active && VIsual_mode == Ctrl_V) - || ((cur_ve_flags & VE_INSERT) && (State & INSERT)); + || ((cur_ve_flags & VE_INSERT) && (State & MODE_INSERT)); } -/// VISUAL, SELECTMODE and OP_PENDING State are never set, they are equal to -/// NORMAL State with a condition. This function returns the real State. +/// MODE_VISUAL, MODE_SELECTMODE and MODE_OP_PENDING State are never set, they are +/// equal to MODE_NORMAL State with a condition. This function returns the real +/// State. int get_real_state(void) { - if (State & NORMAL) { + if (State & MODE_NORMAL) { if (VIsual_active) { if (VIsual_select) { - return SELECTMODE; + return MODE_SELECT; } - return VISUAL; + return MODE_VISUAL; } else if (finish_op) { - return OP_PENDING; + return MODE_OP_PENDING; } } return State; @@ -173,17 +174,17 @@ void get_mode(char *buf) buf[i++] = 's'; } } - } else if (State == HITRETURN || State == ASKMORE || State == SETWSIZE - || State == CONFIRM) { + } else if (State == MODE_HITRETURN || State == MODE_ASKMORE || State == MODE_SETWSIZE + || State == MODE_CONFIRM) { buf[i++] = 'r'; - if (State == ASKMORE) { + if (State == MODE_ASKMORE) { buf[i++] = 'm'; - } else if (State == CONFIRM) { + } else if (State == MODE_CONFIRM) { buf[i++] = '?'; } - } else if (State == EXTERNCMD) { + } else if (State == MODE_EXTERNCMD) { buf[i++] = '!'; - } else if (State & INSERT) { + } else if (State & MODE_INSERT) { if (State & VREPLACE_FLAG) { buf[i++] = 'R'; buf[i++] = 'v'; @@ -199,12 +200,12 @@ void get_mode(char *buf) } else if (ctrl_x_mode_not_defined_yet()) { buf[i++] = 'x'; } - } else if ((State & CMDLINE) || exmode_active) { + } else if ((State & MODE_CMDLINE) || exmode_active) { buf[i++] = 'c'; if (exmode_active) { buf[i++] = 'v'; } - } else if (State & TERM_FOCUS) { + } else if (State & MODE_TERMINAL) { buf[i++] = 't'; } else { buf[i++] = 'n'; @@ -232,7 +233,7 @@ void may_trigger_modechanged(void) } char curr_mode[MODE_MAX_LENGTH]; - char_u pattern_buf[2 * MODE_MAX_LENGTH]; + char pattern_buf[2 * MODE_MAX_LENGTH]; get_mode(curr_mode); if (STRCMP(curr_mode, last_mode) == 0) { @@ -246,7 +247,7 @@ void may_trigger_modechanged(void) tv_dict_set_keys_readonly(v_event); // concatenate modes in format "old_mode:new_mode" - vim_snprintf((char *)pattern_buf, sizeof(pattern_buf), "%s:%s", last_mode, curr_mode); + vim_snprintf(pattern_buf, sizeof(pattern_buf), "%s:%s", last_mode, curr_mode); apply_autocmds(EVENT_MODECHANGED, pattern_buf, NULL, false, curbuf); STRCPY(last_mode, curr_mode); diff --git a/src/nvim/strings.c b/src/nvim/strings.c index 0307cf4696..cde2059a9d 100644 --- a/src/nvim/strings.c +++ b/src/nvim/strings.c @@ -104,8 +104,8 @@ char_u *vim_strsave_escaped_ext(const char_u *string, const char_u *esc_chars, c p += l - 1; continue; } - if (vim_strchr(esc_chars, *p) != NULL || (bsl && rem_backslash(p))) { - ++length; // count a backslash + if (vim_strchr((char *)esc_chars, *p) != NULL || (bsl && rem_backslash(p))) { + length++; // count a backslash } ++length; // count an ordinary char } @@ -120,7 +120,7 @@ char_u *vim_strsave_escaped_ext(const char_u *string, const char_u *esc_chars, c p += l - 1; // skip multibyte char continue; } - if (vim_strchr(esc_chars, *p) != NULL || (bsl && rem_backslash(p))) { + if (vim_strchr((char *)esc_chars, *p) != NULL || (bsl && rem_backslash(p))) { *p2++ = cc; } *p2++ = *p; @@ -473,18 +473,18 @@ int vim_strnicmp(const char *s1, const char *s2, size_t len) /// @return Pointer to the first byte of the found character in string or NULL /// if it was not found or character is invalid. NUL character is never /// found, use `strlen()` instead. -char_u *vim_strchr(const char_u *const string, const int c) +char *vim_strchr(const char *const string, const int c) FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { if (c <= 0) { return NULL; } else if (c < 0x80) { - return (char_u *)strchr((const char *)string, c); + return strchr(string, c); } else { char u8char[MB_MAXBYTES + 1]; const int len = utf_char2bytes(c, u8char); u8char[len] = NUL; - return (char_u *)strstr((const char *)string, u8char); + return strstr(string, u8char); } } @@ -634,7 +634,7 @@ static const void *tv_ptr(const typval_T *const tvs, int *const idxp) FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT { #define OFF(attr) offsetof(union typval_vval_union, attr) - STATIC_ASSERT(OFF(v_string) == OFF(v_list) + STATIC_ASSERT(OFF(v_string) == OFF(v_list) // -V568 && OFF(v_string) == OFF(v_dict) && OFF(v_string) == OFF(v_partial) && sizeof(tvs[0].vval.v_string) == sizeof(tvs[0].vval.v_list) @@ -1313,8 +1313,7 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap, t if (fmt_spec == 'f' || fmt_spec == 'F') { tp = tmp + str_arg_l - 1; } else { - tp = (char *)vim_strchr((char_u *)tmp, - fmt_spec == 'e' ? 'e' : 'E'); + tp = vim_strchr(tmp, fmt_spec == 'e' ? 'e' : 'E'); if (tp) { // remove superfluous '+' and leading zeroes from exponent if (tp[1] == '+') { @@ -1343,8 +1342,7 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap, t } else { // Be consistent: some printf("%e") use 1.0e+12 and some // 1.0e+012; remove one zero in the last case. - char *tp = (char *)vim_strchr((char_u *)tmp, - fmt_spec == 'e' ? 'e' : 'E'); + char *tp = vim_strchr(tmp, fmt_spec == 'e' ? 'e' : 'E'); if (tp && (tp[1] == '+' || tp[1] == '-') && tp[2] == '0' && ascii_isdigit(tp[3]) && ascii_isdigit(tp[4])) { STRMOVE(tp + 2, tp + 3); @@ -1480,3 +1478,32 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap, t // written to the buffer if it were large enough. return (int)str_l; } + +int kv_do_printf(StringBuilder *str, const char *fmt, ...) + FUNC_ATTR_PRINTF(2, 3) +{ + size_t remaining = str->capacity - str->size; + + va_list ap; + va_start(ap, fmt); + int printed = vsnprintf(str->items ? str->items + str->size : NULL, remaining, fmt, ap); + va_end(ap); + + if (printed < 0) { + return -1; + } + + // printed string didn't fit, resize and try again + if ((size_t)printed >= remaining) { + kv_ensure_space(*str, (size_t)printed + 1); // include space for NUL terminator at the end + va_start(ap, fmt); + printed = vsnprintf(str->items + str->size, str->capacity - str->size, fmt, ap); + va_end(ap); + if (printed < 0) { + return -1; + } + } + + str->size += (size_t)printed; + return printed; +} diff --git a/src/nvim/strings.h b/src/nvim/strings.h index 893b0ea269..0503cecc8a 100644 --- a/src/nvim/strings.h +++ b/src/nvim/strings.h @@ -7,6 +7,7 @@ #include "nvim/eval/typval.h" #include "nvim/types.h" +#include "nvim/lib/kvec.h" /// Append string to string and return pointer to the next byte /// @@ -25,6 +26,8 @@ static inline char *strappend(char *const dst, const char *const src) return (char *)memmove(dst, src, src_len) + src_len; } +typedef kvec_t(char) StringBuilder; + #ifdef INCLUDE_GENERATED_DECLARATIONS # include "strings.h.generated.h" #endif diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index d8d1b736d2..6744e4445c 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -27,7 +27,7 @@ #include "nvim/highlight.h" #include "nvim/highlight_group.h" #include "nvim/indent_c.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/lua/executor.h" #include "nvim/macros.h" #include "nvim/mbyte.h" @@ -3807,7 +3807,7 @@ static void put_pattern(const char *const s, const int c, const synpat_T *const msg_putchar(c); // output the pattern, in between a char that is not in the pattern - for (i = 0; vim_strchr(spp->sp_pattern, sepchars[i]) != NULL;) { + for (i = 0; vim_strchr((char *)spp->sp_pattern, sepchars[i]) != NULL;) { if (sepchars[++i] == NUL) { i = 0; // no good char found, just use the first one break; @@ -4393,7 +4393,7 @@ static void syn_cmd_keyword(exarg_T *eap, int syncing) // 2: Add an entry for each keyword. for (kw = keyword_copy; --cnt >= 0; kw += STRLEN(kw) + 1) { - for (p = vim_strchr(kw, '[');;) { + for (p = (char_u *)vim_strchr((char *)kw, '[');;) { if (p != NULL) { *p = NUL; } @@ -5075,7 +5075,7 @@ static char_u *get_syn_pattern(char_u *arg, synpat_T *ci) char_u *end; int *p; int idx; - char_u *cpo_save; + char *cpo_save; // need at least three chars if (arg == NULL || arg[0] == NUL || arg[1] == NUL || arg[2] == NUL) { @@ -5092,8 +5092,8 @@ static char_u *get_syn_pattern(char_u *arg, synpat_T *ci) // Make 'cpoptions' empty, to avoid the 'l' flag cpo_save = p_cpo; - p_cpo = (char_u *)""; - ci->sp_prog = vim_regcomp(ci->sp_pattern, RE_MAGIC); + p_cpo = ""; + ci->sp_prog = vim_regcomp((char *)ci->sp_pattern, RE_MAGIC); p_cpo = cpo_save; if (ci->sp_prog == NULL) { @@ -5174,7 +5174,7 @@ static void syn_cmd_sync(exarg_T *eap, int syncing) int illegal = FALSE; int finished = FALSE; long n; - char_u *cpo_save; + char *cpo_save; if (ends_excmd(*arg_start)) { syn_cmd_list(eap, TRUE); @@ -5253,9 +5253,9 @@ static void syn_cmd_sync(exarg_T *eap, int syncing) // Make 'cpoptions' empty, to avoid the 'l' flag cpo_save = p_cpo; - p_cpo = (char_u *)""; + p_cpo = ""; curwin->w_s->b_syn_linecont_prog = - vim_regcomp(curwin->w_s->b_syn_linecont_pat, RE_MAGIC); + vim_regcomp((char *)curwin->w_s->b_syn_linecont_pat, RE_MAGIC); p_cpo = cpo_save; syn_clear_time(&curwin->w_s->b_syn_linecont_time); @@ -5303,8 +5303,8 @@ static void syn_cmd_sync(exarg_T *eap, int syncing) /// @return FAIL for some error, OK for success. static int get_id_list(char_u **const arg, const int keylen, int16_t **const list, const bool skip) { - char_u *p = NULL; - char_u *end; + char *p = NULL; + char *end; int total_count = 0; int16_t *retval = NULL; regmatch_T regmatch; @@ -5318,12 +5318,12 @@ static int get_id_list(char_u **const arg, const int keylen, int16_t **const lis // grow when a regexp is used. In that case round 1 is done once again. for (int round = 1; round <= 2; round++) { // skip "contains" - p = (char_u *)skipwhite((char *)(*arg) + keylen); + p = skipwhite((char *)(*arg) + keylen); if (*p != '=') { semsg(_("E405: Missing equal sign: %s"), *arg); break; } - p = (char_u *)skipwhite((char *)p + 1); + p = skipwhite(p + 1); if (ends_excmd(*p)) { semsg(_("E406: Empty argument: %s"), *arg); break; @@ -5333,7 +5333,7 @@ static int get_id_list(char_u **const arg, const int keylen, int16_t **const lis int count = 0; do { for (end = p; *end && !ascii_iswhite(*end) && *end != ','; end++) {} - char_u *const name = xmalloc(end - p + 3); // leave room for "^$" + char *const name = xmalloc(end - p + 3); // leave room for "^$" STRLCPY(name + 1, p, end - p + 1); if (STRCMP(name + 1, "ALLBUT") == 0 || STRCMP(name + 1, "ALL") == 0 @@ -5367,14 +5367,14 @@ static int get_id_list(char_u **const arg, const int keylen, int16_t **const lis if (skip) { id = -1; } else { - id = syn_check_cluster(name + 2, (int)(end - p - 1)); + id = syn_check_cluster((char_u *)name + 2, (int)(end - p - 1)); } } else { /* * Handle full group name. */ - if (strpbrk((char *)name + 1, "\\.*^$~[") == NULL) { - id = syn_check_group((char *)(name + 1), (int)(end - p)); + if (strpbrk(name + 1, "\\.*^$~[") == NULL) { + id = syn_check_group((name + 1), (int)(end - p)); } else { // Handle match of regexp with group names. *name = '^'; @@ -5427,11 +5427,11 @@ static int get_id_list(char_u **const arg, const int keylen, int16_t **const lis } ++count; } - p = (char_u *)skipwhite((char *)end); + p = skipwhite(end); if (*p != ',') { break; } - p = (char_u *)skipwhite((char *)p + 1); // skip comma in between arguments + p = skipwhite(p + 1); // skip comma in between arguments } while (!ends_excmd(*p)); if (failed) { break; @@ -5443,7 +5443,7 @@ static int get_id_list(char_u **const arg, const int keylen, int16_t **const lis } } - *arg = p; + *arg = (char_u *)p; if (failed || retval == NULL) { xfree(retval); return FAIL; @@ -5669,7 +5669,7 @@ void ex_ownsyntax(exarg_T *eap) } // Apply the "syntax" autocommand event, this finds and loads the syntax file. - apply_autocmds(EVENT_SYNTAX, (char_u *)eap->arg, curbuf->b_fname, true, curbuf); + apply_autocmds(EVENT_SYNTAX, eap->arg, curbuf->b_fname, true, curbuf); // Move value of b:current_syntax to w:current_syntax. new_value = get_var_value("b:current_syntax"); @@ -5763,26 +5763,26 @@ void set_context_in_syntax_cmd(expand_T *xp, const char *arg) * Function given to ExpandGeneric() to obtain the list syntax names for * expansion. */ -char_u *get_syntax_name(expand_T *xp, int idx) +char *get_syntax_name(expand_T *xp, int idx) { switch (expand_what) { case EXP_SUBCMD: - return (char_u *)subcommands[idx].name; + return subcommands[idx].name; case EXP_CASE: { static char *case_args[] = { "match", "ignore", NULL }; - return (char_u *)case_args[idx]; + return case_args[idx]; } case EXP_SPELL: { static char *spell_args[] = { "toplevel", "notoplevel", "default", NULL }; - return (char_u *)spell_args[idx]; + return spell_args[idx]; } case EXP_SYNC: { static char *sync_args[] = { "ccomment", "clear", "fromstart", "linebreaks=", "linecont", "lines=", "match", "maxlines=", "minlines=", "region", NULL }; - return (char_u *)sync_args[idx]; + return sync_args[idx]; } } return NULL; @@ -5965,17 +5965,17 @@ static void syntime_clear(void) * Function given to ExpandGeneric() to obtain the possible arguments of the * ":syntime {on,off,clear,report}" command. */ -char_u *get_syntime_arg(expand_T *xp, int idx) +char *get_syntime_arg(expand_T *xp, int idx) { switch (idx) { case 0: - return (char_u *)"on"; + return "on"; case 1: - return (char_u *)"off"; + return "off"; case 2: - return (char_u *)"clear"; + return "clear"; case 3: - return (char_u *)"report"; + return "report"; } return NULL; } diff --git a/src/nvim/tag.c b/src/nvim/tag.c index c914ad5251..8a21ec3e5d 100644 --- a/src/nvim/tag.c +++ b/src/nvim/tag.c @@ -1108,10 +1108,8 @@ static void prepare_pats(pat_T *pats, int has_re) if (pats->head == pats->pat) { pats->headlen = 0; } else { - for (pats->headlen = 0; pats->head[pats->headlen] != NUL; - ++pats->headlen) { - if (vim_strchr((char_u *)(p_magic ? ".[~*\\$" : "\\$"), - pats->head[pats->headlen]) != NULL) { + for (pats->headlen = 0; pats->head[pats->headlen] != NUL; pats->headlen++) { + if (vim_strchr((p_magic ? ".[~*\\$" : "\\$"), pats->head[pats->headlen]) != NULL) { break; } } @@ -1122,7 +1120,7 @@ static void prepare_pats(pat_T *pats, int has_re) } if (has_re) { - pats->regmatch.regprog = vim_regcomp(pats->pat, p_magic ? RE_MAGIC : 0); + pats->regmatch.regprog = vim_regcomp((char *)pats->pat, p_magic ? RE_MAGIC : 0); } else { pats->regmatch.regprog = NULL; } @@ -1604,8 +1602,8 @@ int find_tags(char_u *pat, int *num_matches, char_u ***matchesp, int flags, int if (STRNICMP(s, help_lang, 2) == 0) { break; } - ++help_pri; - if ((s = vim_strchr(s, ',')) == NULL) { + help_pri++; + if ((s = (char_u *)vim_strchr((char *)s, ',')) == NULL) { break; } } @@ -1864,7 +1862,7 @@ parse_line: // This speeds up tag searching a lot! if (orgpat.headlen) { tagp.tagname = lbuf; - tagp.tagname_end = vim_strchr(lbuf, TAB); + tagp.tagname_end = (char_u *)vim_strchr((char *)lbuf, TAB); if (tagp.tagname_end == NULL) { // Corrupted tag line. line_error = true; @@ -1982,7 +1980,7 @@ parse_line: // Can be a matching tag, isolate the file name and command. tagp.fname = tagp.tagname_end + 1; - tagp.fname_end = vim_strchr(tagp.fname, TAB); + tagp.fname_end = (char_u *)vim_strchr((char *)tagp.fname, TAB); tagp.command = tagp.fname_end + 1; if (tagp.fname_end == NULL) { i = FAIL; @@ -2129,7 +2127,7 @@ parse_line: STRLCPY(mfp, tagp.tagname, len + 1); // if wanted, re-read line to get long form too - if (State & INSERT) { + if (State & MODE_INSERT) { get_it_again = p_sft; } } @@ -2369,7 +2367,7 @@ int get_tagfname(tagname_T *tnp, int first, char_u *buf) } ++tnp->tn_hf_idx; STRCPY(buf, p_hf); - STRCPY(path_tail(buf), "tags"); + STRCPY(path_tail((char *)buf), "tags"); #ifdef BACKSLASH_IN_FILENAME slash_adjust(buf); #endif @@ -2428,7 +2426,7 @@ int get_tagfname(tagname_T *tnp, int first, char_u *buf) r_ptr = vim_findfile_stopdir(buf); // move the filename one char forward and truncate the // filepath with a NUL - filename = path_tail(buf); + filename = (char_u *)path_tail((char *)buf); STRMOVE(filename + 1, filename); *filename++ = NUL; @@ -2473,7 +2471,7 @@ static int parse_tag_line(char_u *lbuf, tagptrs_T *tagp) // Isolate the tagname, from lbuf up to the first white tagp->tagname = lbuf; - p = vim_strchr(lbuf, TAB); + p = (char_u *)vim_strchr((char *)lbuf, TAB); if (p == NULL) { return FAIL; } @@ -2484,7 +2482,7 @@ static int parse_tag_line(char_u *lbuf, tagptrs_T *tagp) ++p; } tagp->fname = p; - p = vim_strchr(p, TAB); + p = (char_u *)vim_strchr((char *)p, TAB); if (p == NULL) { return FAIL; } @@ -2522,8 +2520,8 @@ static bool test_for_static(tagptrs_T *tagp) // Check for new style static tag ":...<Tab>file:[<Tab>...]" p = tagp->command; - while ((p = vim_strchr(p, '\t')) != NULL) { - ++p; + while ((p = (char_u *)vim_strchr((char *)p, '\t')) != NULL) { + p++; if (STRNCMP(p, "file:", 5) == 0) { return TRUE; } @@ -2595,8 +2593,8 @@ static int parse_match(char_u *lbuf, tagptrs_T *tagp) break; } - pc = vim_strchr(p, ':'); - pt = vim_strchr(p, '\t'); + pc = (char_u *)vim_strchr((char *)p, ':'); + pt = (char_u *)vim_strchr((char *)p, '\t'); if (pc == NULL || (pt != NULL && pc > pt)) { tagp->tagkind = p; } @@ -2715,7 +2713,7 @@ static int jumpto_tag(const char_u *lbuf_arg, int forceit, int keep_help) * autocommand event (e.g., http://sys/file). */ if (!os_path_exists(fname) - && !has_autocmd(EVENT_BUFREADCMD, fname, + && !has_autocmd(EVENT_BUFREADCMD, (char *)fname, NULL)) { retval = NOTAGFILE; xfree(nofile_fname); @@ -2997,7 +2995,7 @@ static char_u *expand_tag_fname(char_u *fname, char_u *const tag_fname, const bo char_u *retval; if ((p_tr || curbuf->b_help) && !vim_isAbsName(fname) - && (p = path_tail(tag_fname)) != tag_fname) { + && (p = (char_u *)path_tail((char *)tag_fname)) != tag_fname) { retval = xmalloc(MAXPATHL); STRCPY(retval, tag_fname); STRLCPY(retval + (p - tag_fname), fname, @@ -3054,7 +3052,7 @@ static int find_extra(char_u **pp) // Repeat for addresses separated with ';' for (;;) { if (ascii_isdigit(*str)) { - str = skipdigits(str + 1); + str = (char_u *)skipdigits((char *)str + 1); } else if (*str == '/' || *str == '?') { str = skip_regexp(str + 1, *str, false, NULL); if (*str != first_char) { diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index 142da8f184..c8f70d4afd 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -56,7 +56,7 @@ #include "nvim/getchar.h" #include "nvim/highlight.h" #include "nvim/highlight_group.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/log.h" #include "nvim/macros.h" #include "nvim/main.h" @@ -381,7 +381,7 @@ void terminal_check_size(Terminal *term) invalidate_terminal(term, -1, -1); } -/// Implements TERM_FOCUS mode. :help Terminal-mode +/// Implements MODE_TERMINAL state. :help Terminal-mode void terminal_enter(void) { buf_T *buf = curbuf; @@ -398,13 +398,13 @@ void terminal_enter(void) int save_state = State; s->save_rd = RedrawingDisabled; - State = TERM_FOCUS; - mapped_ctrl_c |= TERM_FOCUS; // Always map CTRL-C to avoid interrupt. + State = MODE_TERMINAL; + mapped_ctrl_c |= MODE_TERMINAL; // Always map CTRL-C to avoid interrupt. RedrawingDisabled = false; // Disable these options in terminal-mode. They are nonsense because cursor is // placed at end of buffer to "follow" output. #11072 - win_T *save_curwin = curwin; + handle_T save_curwin = curwin->handle; bool save_w_p_cul = curwin->w_p_cul; char_u *save_w_p_culopt = NULL; char_u save_w_p_culopt_flags = curwin->w_p_culopt_flags; @@ -442,7 +442,7 @@ void terminal_enter(void) RedrawingDisabled = s->save_rd; apply_autocmds(EVENT_TERMLEAVE, NULL, NULL, false, curbuf); - if (save_curwin == curwin) { // save_curwin may be invalid (window closed)! + if (save_curwin == curwin->handle) { // Else: window was closed. curwin->w_p_cul = save_w_p_cul; if (save_w_p_culopt) { xfree(curwin->w_p_culopt); @@ -1374,26 +1374,21 @@ static void fetch_row(Terminal *term, int row, int end_col) while (col < end_col) { VTermScreenCell cell; fetch_cell(term, row, col, &cell); - int cell_len = 0; if (cell.chars[0]) { + int cell_len = 0; for (int i = 0; cell.chars[i]; i++) { cell_len += utf_char2bytes((int)cell.chars[i], ptr + cell_len); } - } else { - *ptr = ' '; - cell_len = 1; - } - char c = *ptr; - ptr += cell_len; - if (c != ' ') { - // only increase the line length if the last character is not whitespace + ptr += cell_len; line_len = (size_t)(ptr - term->textbuf); + } else { + *ptr++ = ' '; } col += cell.width; } - // trim trailing whitespace - term->textbuf[line_len] = 0; + // end of line + term->textbuf[line_len] = NUL; } static bool fetch_cell(Terminal *term, int row, int col, VTermScreenCell *cell) @@ -1637,7 +1632,7 @@ static int linenr_to_row(Terminal *term, int linenr) static bool is_focused(Terminal *term) { - return State & TERM_FOCUS && curbuf->terminal == term; + return State & MODE_TERMINAL && curbuf->terminal == term; } static char *get_config_string(char *key) diff --git a/src/nvim/testdir/setup.vim b/src/nvim/testdir/setup.vim index 15e3b31498..f1092af358 100644 --- a/src/nvim/testdir/setup.vim +++ b/src/nvim/testdir/setup.vim @@ -26,11 +26,9 @@ set sessionoptions+=options set viewoptions+=options set switchbuf= -" Unmap Nvim default mappings. -unmap Y -unmap <C-L> -iunmap <C-U> -iunmap <C-W> +" Clear Nvim default mappings. +mapclear +mapclear! " Prevent Nvim log from writing to stderr. let $NVIM_LOG_FILE = exists($NVIM_LOG_FILE) ? $NVIM_LOG_FILE : 'Xnvim.log' diff --git a/src/nvim/testdir/test_buffer.vim b/src/nvim/testdir/test_buffer.vim index a31cdbb49a..9eb768f124 100644 --- a/src/nvim/testdir/test_buffer.vim +++ b/src/nvim/testdir/test_buffer.vim @@ -61,4 +61,15 @@ func Test_buffer_scheme() set shellslash& endfunc +" this was using a NULL pointer after failing to use the pattern +func Test_buf_pattern_invalid() + vsplit 0000000 + silent! buf [0--]\&\zs*\zs*e + bwipe! + + vsplit 00000000000000000000000000 + silent! buf [0--]\&\zs*\zs*e + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_cindent.vim b/src/nvim/testdir/test_cindent.vim index 4d69aed96c..7ba8ef3397 100644 --- a/src/nvim/testdir/test_cindent.vim +++ b/src/nvim/testdir/test_cindent.vim @@ -5311,6 +5311,13 @@ func Test_cindent_case() bwipe! endfunc +" This was reading past the end of the line +func Test_cindent_check_funcdecl() + new + sil norm o0('\0=L + bwipe! +endfunc + func Test_cindent_scopedecls() new setl cindent ts=4 sw=4 diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim index 759caac878..b2c752376f 100644 --- a/src/nvim/testdir/test_cmdline.vim +++ b/src/nvim/testdir/test_cmdline.vim @@ -1224,4 +1224,16 @@ func Test_screenpos_and_completion() call feedkeys(":let a\<C-R>=Check_completion()\<CR>\<Esc>", "xt") endfunc +func Test_recursive_register() + let @= = '' + silent! ?e/ + let caught = 'no' + try + normal // + catch /E169:/ + let caught = 'yes' + endtry + call assert_equal('yes', caught) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_cursor_func.vim b/src/nvim/testdir/test_cursor_func.vim index 9ba82e3b70..6c6a6290cb 100644 --- a/src/nvim/testdir/test_cursor_func.vim +++ b/src/nvim/testdir/test_cursor_func.vim @@ -102,10 +102,11 @@ func Test_screenpos() bwipe! call assert_equal({'col': 1, 'row': 1, 'endcol': 1, 'curscol': 1}, screenpos(win_getid(), 1, 1)) - " Needs WinBar " nmenu WinBar.TEST : - " call assert_equal({'col': 1, 'row': 2, 'endcol': 1, 'curscol': 1}, screenpos(win_getid(), 1, 1)) + setlocal winbar=TEST + call assert_equal({'col': 1, 'row': 2, 'endcol': 1, 'curscol': 1}, screenpos(win_getid(), 1, 1)) " nunmenu WinBar.TEST + setlocal winbar& endfunc func Test_screenpos_number() diff --git a/src/nvim/testdir/test_matchfuzzy.vim b/src/nvim/testdir/test_matchfuzzy.vim index d53f8b0f4d..533aec8d9a 100644 --- a/src/nvim/testdir/test_matchfuzzy.vim +++ b/src/nvim/testdir/test_matchfuzzy.vim @@ -135,6 +135,9 @@ func Test_matchfuzzypos() " match multiple words (separated by space) call assert_equal([['foo bar baz'], [[8, 9, 10, 0, 1, 2]], [369]], ['foo bar baz', 'foo', 'foo bar', 'baz bar']->matchfuzzypos('baz foo')) + call assert_equal([[], [], []], ['foo bar baz', 'foo', 'foo bar', 'baz bar']->matchfuzzypos('baz foo', {'matchseq': 1})) + call assert_equal([['foo bar baz'], [[0, 1, 2, 8, 9, 10]], [369]], ['foo bar baz', 'foo', 'foo bar', 'baz bar']->matchfuzzypos('foo baz')) + call assert_equal([['foo bar baz'], [[0, 1, 2, 3, 4, 5, 10]], [326]], ['foo bar baz', 'foo', 'foo bar', 'baz bar']->matchfuzzypos('foo baz', {'matchseq': 1})) call assert_equal([[], [], []], ['foo bar baz', 'foo', 'foo bar', 'baz bar']->matchfuzzypos('one two')) call assert_equal([[], [], []], ['foo bar']->matchfuzzypos(" \t ")) call assert_equal([['grace'], [[1, 2, 3, 4, 2, 3, 4, 0, 1, 2, 3, 4]], [657]], ['grace']->matchfuzzypos('race ace grace')) diff --git a/src/nvim/testdir/test_options.vim b/src/nvim/testdir/test_options.vim index 8f67b1732e..9e16625cc2 100644 --- a/src/nvim/testdir/test_options.vim +++ b/src/nvim/testdir/test_options.vim @@ -832,4 +832,17 @@ func Test_opt_cdhome() set cdhome& endfunc +func Test_switchbuf_reset() + set switchbuf=useopen + sblast + call assert_equal(1, winnr('$')) + set all& + " Nvim has a different default for 'switchbuf' + " call assert_equal('', &switchbuf) + call assert_equal('uselast', &switchbuf) + sblast + call assert_equal(2, winnr('$')) + only! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim index d359e69f91..454c956996 100644 --- a/src/nvim/testdir/test_search.vim +++ b/src/nvim/testdir/test_search.vim @@ -925,6 +925,26 @@ func Test_hlsearch_block_visual_match() call delete('Xhlsearch_block') endfunc +func Test_hlsearch_and_visual() + CheckOption hlsearch + CheckScreendump + + call writefile([ + \ 'set hlsearch', + \ 'call setline(1, repeat(["xxx yyy zzz"], 3))', + \ 'hi Search cterm=bold', + \ '/yyy', + \ 'call cursor(1, 6)', + \ ], 'Xhlvisual_script') + let buf = RunVimInTerminal('-S Xhlvisual_script', {'rows': 6, 'cols': 40}) + call term_sendkeys(buf, "vjj") + call VerifyScreenDump(buf, 'Test_hlsearch_visual_1', {}) + call term_sendkeys(buf, "\<Esc>") + + call StopVimInTerminal(buf) + call delete('Xhlvisual_script') +endfunc + func Test_incsearch_substitute() CheckFunction test_override CheckOption incsearch diff --git a/src/nvim/testdir/test_smartindent.vim b/src/nvim/testdir/test_smartindent.vim index dc0f99e93f..f3650a9ac4 100644 --- a/src/nvim/testdir/test_smartindent.vim +++ b/src/nvim/testdir/test_smartindent.vim @@ -61,4 +61,26 @@ func Test_smartindent_braces() close! endfunc +func Test_si_after_completion() + new + setlocal ai smartindent indentexpr= + call setline(1, 'foo foot') + call feedkeys("o f\<C-X>\<C-N>#", 'tx') + call assert_equal(' foo#', getline(2)) + + call setline(2, '') + call feedkeys("1Go f\<C-X>\<C-N>}", 'tx') + call assert_equal(' foo}', getline(2)) + + bwipe! +endfunc + +func Test_no_si_after_completion() + new + call setline(1, 'foo foot') + call feedkeys("o f\<C-X>\<C-N>#", 'tx') + call assert_equal(' foo#', getline(2)) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_spell.vim b/src/nvim/testdir/test_spell.vim index 56ed97cdd9..ce21b8bdc9 100644 --- a/src/nvim/testdir/test_spell.vim +++ b/src/nvim/testdir/test_spell.vim @@ -776,14 +776,6 @@ func Test_spell_screendump() call delete('XtestSpell') endfunc -func Test_spell_single_word() - new - silent! norm 0R00 - spell! - silent 0norm 0r$ Dvz= - bwipe! -endfunc - let g:test_data_aff1 = [ \"SET ISO8859-1", \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ", diff --git a/src/nvim/testdir/test_spell_utf8.vim b/src/nvim/testdir/test_spell_utf8.vim index 3d159f3352..1d323df67e 100644 --- a/src/nvim/testdir/test_spell_utf8.vim +++ b/src/nvim/testdir/test_spell_utf8.vim @@ -768,4 +768,10 @@ func Test_spellfile_value() set spellfile=Xdir/Xtest.utf-8.add,Xtest_other.add endfunc +" Invalid bytes may cause trouble when creating the word list. +func Test_check_for_valid_word() + call assert_fails("spellgood! 0\xac", 'E1280:') +endfunc + + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_statusline.vim b/src/nvim/testdir/test_statusline.vim index 492d09c645..8579457d9f 100644 --- a/src/nvim/testdir/test_statusline.vim +++ b/src/nvim/testdir/test_statusline.vim @@ -461,7 +461,6 @@ func Test_statusline_removed_group() call writefile(lines, 'XTest_statusline') let buf = RunVimInTerminal('-S XTest_statusline', {'rows': 10, 'cols': 50}) - call term_wait(buf, 100) call VerifyScreenDump(buf, 'Test_statusline_1', {}) " clean up @@ -535,4 +534,22 @@ func Test_statusline_verylong_filename() bwipe! endfunc +func Test_statusline_highlight_truncate() + CheckScreendump + + let lines =<< trim END + set laststatus=2 + hi! link User1 Directory + hi! link User2 ErrorMsg + set statusline=%.5(%1*ABC%2*DEF%1*GHI%) + END + call writefile(lines, 'XTest_statusline') + + let buf = RunVimInTerminal('-S XTest_statusline', {'rows': 6}) + call VerifyScreenDump(buf, 'Test_statusline_hl', {}) + + call StopVimInTerminal(buf) + call delete('XTest_statusline') +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_tagjump.vim b/src/nvim/testdir/test_tagjump.vim index e0b05edf15..2fe3c448d6 100644 --- a/src/nvim/testdir/test_tagjump.vim +++ b/src/nvim/testdir/test_tagjump.vim @@ -1077,6 +1077,15 @@ Type number and <Enter> (q or empty cancels): %bwipe endfunc +func Test_define_search() + " this was accessing freed memory + new + call setline(1, ['first line', '', '#define something 0']) + sil norm o0 + sil! norm + bwipe! +endfunc + " Test for the 'taglength' option func Test_tag_length() set tags=Xtags diff --git a/src/nvim/testdir/test_undo.vim b/src/nvim/testdir/test_undo.vim index 30e00e7ad4..848860649e 100644 --- a/src/nvim/testdir/test_undo.vim +++ b/src/nvim/testdir/test_undo.vim @@ -733,4 +733,21 @@ func Test_undofile_cryptmethod_blowfish2() set undofile& undolevels& cryptmethod& endfunc +func Test_undo_mark() + new + " The undo is applied to the only line. + call setline(1, 'hello') + call feedkeys("ggyiw$p", 'xt') + undo + call assert_equal([0, 1, 1, 0], getpos("'[")) + call assert_equal([0, 1, 1, 0], getpos("']")) + " The undo removes the last line. + call feedkeys("Goaaaa\<Esc>", 'xt') + call feedkeys("obbbb\<Esc>", 'xt') + undo + call assert_equal([0, 2, 1, 0], getpos("'[")) + call assert_equal([0, 2, 1, 0], getpos("']")) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_visual.vim b/src/nvim/testdir/test_visual.vim index 2b88deb813..41c29c5bb0 100644 --- a/src/nvim/testdir/test_visual.vim +++ b/src/nvim/testdir/test_visual.vim @@ -1249,11 +1249,23 @@ endfunc func Test_visual_block_append_invalid_char() " this was going over the end of the line + set isprint=@,161-255 new call setline(1, [' let xxx', 'xxxxx', 'xxxxxxxxxxx']) exe "normal 0\<C-V>jjA-\<Esc>" call assert_equal([' - let xxx', 'xxxxx -', 'xxxxxxxx-xxx'], getline(1, 3)) bwipe! + set isprint& +endfunc + +func Test_visual_block_with_substitute() + " this was reading beyond the end of the line + new + norm a0) + sil! norm O + s/) + sil! norm + bwipe! endfunc func Test_visual_reselect_with_count() diff --git a/src/nvim/tui/terminfo_defs.h b/src/nvim/tui/terminfo_defs.h index 40261058dc..4e8affa4d3 100644 --- a/src/nvim/tui/terminfo_defs.h +++ b/src/nvim/tui/terminfo_defs.h @@ -4,7 +4,7 @@ // uncrustify:off // -// Generated by scripts/update_terminfo.sh and ncurses 6.1.20180127 +// Generated by scripts/update_terminfo.sh and ncurses 6.3.20211021 // #ifndef NVIM_TUI_TERMINFO_DEFS_H @@ -96,7 +96,7 @@ // user8=\E[?%[;0123456789]c, // user9=\E[c, static const int8_t ansi_terminfo[] = { - 26,1,40,0,38,0,16,0,125,1,68,2,97,110,115,105,124,97,110,115,105,47,112,99,45,116,101,114,109,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,99,111,108,111,114,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,80,0,8,0,24,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,3,0,0,0,4,0,6,0,-1,-1,8,0,13,0,20,0,24,0,28,0,-1,-1,39,0,56,0,60,0,-1,-1,64,0,-1,-1,-1,-1,68,0,-1,-1,72,0,-1,-1,76,0,80,0,-1,-1,-1,-1,84,0,90,0,95,0,-1,-1,-1,-1,-1,-1,-1,-1,100,0,-1,-1,105,0,110,0,115,0,120,0,-127,0,-121,0,-1,-1,-1,-1,-1,-1,-113,0,-109,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-105,0,-1,-1,-101,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-99,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-95,0,-91,0,-1,-1,-87,0,-1,-1,-1,-1,-1,-1,-83,0,-1,-1,-1,-1,-1,-1,-79,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-75,0,-1,-1,-70,0,-61,0,-52,0,-43,0,-34,0,-25,0,-16,0,-7,0,2,1,11,1,-1,-1,-1,-1,-1,-1,-1,-1,20,1,25,1,30,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,1,-1,-1,61,1,-1,-1,63,1,-107,1,-1,-1,-104,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-100,1,-1,-1,-37,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-33,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-28,1,-17,1,-12,1,7,2,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,20,2,30,2,-1,-1,-1,-1,-1,-1,40,2,44,2,48,2,52,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,2,62,2,27,91,90,0,7,0,13,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,68,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,49,109,0,27,91,53,109,0,27,91,49,109,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,91,49,48,109,0,27,91,48,59,49,48,109,0,27,91,109,0,27,91,109,0,27,91,76,0,8,0,27,91,66,0,27,91,72,0,27,91,76,0,27,91,68,0,27,91,67,0,27,91,65,0,13,27,91,83,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,52,105,0,27,91,53,105,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,91,37,105,37,112,49,37,100,100,0,10,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,57,37,116,59,49,49,37,59,109,0,27,72,0,27,91,73,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,90,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,40,66,0,27,41,66,0,27,42,66,0,27,43,66,0,27,91,49,49,109,0,27,91,49,48,109,0,1,0,0,0,0,0,1,0,3,0,1,0,0,0,65,88,0 // NOLINT + 26,1,40,0,38,0,16,0,125,1,68,2,97,110,115,105,124,97,110,115,105,47,112,99,45,116,101,114,109,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,99,111,108,111,114,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,80,0,8,0,24,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,3,0,0,0,4,0,6,0,-1,-1,8,0,13,0,20,0,24,0,28,0,-1,-1,39,0,56,0,60,0,-1,-1,64,0,-1,-1,-1,-1,68,0,-1,-1,72,0,-1,-1,76,0,80,0,-1,-1,-1,-1,84,0,90,0,95,0,-1,-1,-1,-1,-1,-1,-1,-1,100,0,-1,-1,105,0,110,0,115,0,120,0,-127,0,-121,0,-1,-1,-1,-1,-1,-1,-113,0,-109,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-105,0,-1,-1,-101,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-99,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-95,0,-91,0,-1,-1,-87,0,-1,-1,-1,-1,-1,-1,-83,0,-1,-1,-1,-1,-1,-1,-79,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-75,0,-1,-1,-70,0,-61,0,-52,0,-43,0,-34,0,-25,0,-16,0,-7,0,2,1,11,1,-1,-1,-1,-1,-1,-1,-1,-1,20,1,25,1,30,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,1,-1,-1,61,1,-1,-1,63,1,-107,1,-1,-1,-104,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-100,1,-1,-1,-37,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-33,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-28,1,-17,1,-12,1,7,2,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,20,2,30,2,-1,-1,-1,-1,-1,-1,40,2,44,2,48,2,52,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,2,62,2,27,91,90,0,7,0,13,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,68,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,49,109,0,27,91,53,109,0,27,91,49,109,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,91,49,48,109,0,27,91,48,59,49,48,109,0,27,91,109,0,27,91,109,0,27,91,76,0,8,0,27,91,66,0,27,91,72,0,27,91,76,0,27,91,68,0,27,91,67,0,27,91,65,0,13,27,91,83,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,52,105,0,27,91,53,105,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,91,37,105,37,112,49,37,100,100,0,10,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,57,37,116,59,49,49,37,59,109,0,27,72,0,27,91,73,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,90,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,40,66,0,27,41,66,0,27,42,66,0,27,43,66,0,27,91,49,49,109,0,27,91,49,48,109,0,1,0,0,0,0,0,1,0,3,0,1,0,0,0,65,88,0 }; // conemu|ANIS X3.64 and Xterm 256 colors for ConEmu with libuv, @@ -118,6 +118,7 @@ static const int8_t ansi_terminfo[] = { // carriage_return=\r, // change_scroll_region=\E[%i%p1%d;%p2%dr, // clear_all_tabs@, +// clear_margins=\E[?69l, // clear_screen=\E[H\E[2J, // clr_bol=\E[1K, // clr_eol=\E[K, @@ -159,9 +160,13 @@ static const int8_t ansi_terminfo[] = { // init_2string@, // initialize_color@, // insert_line=\E[L, +// key_a1=\EOw, +// key_a3=\EOy, // key_b2=\E[G, // key_backspace=^H, // key_btab=\E[Z, +// key_c1=\EOq, +// key_c3=\EOs, // key_dc=\E[3~, // key_down=\E[B, // key_end=\E[4~, @@ -253,6 +258,7 @@ static const int8_t ansi_terminfo[] = { // memory_unlock@, // meta_off@, // meta_on@, +// newline=\EE, // orig_colors@, // orig_pair=\E[39;49m, // parm_dch=\E[%p1%dP, @@ -279,6 +285,7 @@ static const int8_t ansi_terminfo[] = { // set_a_background=\E[48;5;%p1%dm, // set_a_foreground=\E[38;5;%p1%dm, // set_attributes=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m, +// set_lr_margin=\E[?69h\E[%i%p1%d;%p2%ds, // set_tab@, // tab=^I, // user6@, @@ -286,7 +293,7 @@ static const int8_t ansi_terminfo[] = { // user8@, // user9@, static const int8_t conemu_terminfo[] = { - 30,2,61,0,38,0,15,0,-99,1,31,3,99,111,110,101,109,117,124,65,78,73,83,32,88,51,46,54,52,32,97,110,100,32,88,116,101,114,109,32,50,53,54,32,99,111,108,111,114,115,32,102,111,114,32,67,111,110,69,109,117,32,119,105,116,104,32,108,105,98,117,118,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,-2,-1,0,0,2,0,4,0,-2,-1,21,0,29,0,33,0,37,0,-1,-1,48,0,65,0,69,0,73,0,80,0,-1,-1,82,0,89,0,-1,-1,93,0,-2,-1,97,0,101,0,-1,-1,-1,-1,-2,-1,-2,-1,105,0,110,0,-1,-1,-2,-1,-2,-1,-2,-1,-1,-1,119,0,124,0,-127,0,-122,0,-2,-1,-113,0,-108,0,-1,-1,-2,-1,-99,0,-93,0,-2,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-87,0,-1,-1,-83,0,-1,-1,-1,-1,-1,-1,-81,0,-1,-1,-76,0,-1,-1,-1,-1,-1,-1,-1,-1,-72,0,-67,0,-61,0,-56,0,-51,0,-46,0,-41,0,-35,0,-29,0,-23,0,-17,0,-12,0,-1,-1,-7,0,-1,-1,-3,0,2,1,7,1,11,1,18,1,-1,-1,25,1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,29,1,38,1,47,1,56,1,65,1,74,1,83,1,92,1,101,1,110,1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,119,1,-2,-1,-2,-1,-1,-1,-1,-1,-117,1,-114,1,-103,1,-100,1,-98,1,-95,1,-2,-1,-1,-1,-52,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-50,1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-46,1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-42,1,-37,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-33,1,-1,-1,-1,-1,-26,1,-1,-1,-1,-1,-1,-1,-1,-1,-19,1,-12,1,-5,1,-1,-1,-1,-1,2,2,-1,-1,9,2,-1,-1,-1,-1,-1,-1,16,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,23,2,29,2,35,2,41,2,47,2,53,2,59,2,65,2,71,2,77,2,83,2,89,2,95,2,101,2,107,2,113,2,119,2,125,2,-125,2,-119,2,-113,2,-107,2,-101,2,-95,2,-89,2,-83,2,-77,2,-71,2,-65,2,-59,2,-52,2,-46,2,-40,2,-34,2,-28,2,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-22,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-17,2,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-8,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,3,3,17,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,91,65,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,9,0,27,91,71,0,27,91,90,0,27,91,52,126,0,27,79,77,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,49,59,54,83,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,51,56,59,53,59,37,112,49,37,100,109,0,27,91,52,56,59,53,59,37,112,49,37,100,109,0,0,3,0,1,0,74,0,-104,0,-95,1,1,0,1,0,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,0,0,-2,-1,-1,-1,5,0,-1,-1,11,0,-1,-1,-2,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,21,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,39,0,42,0,45,0,48,0,54,0,60,0,65,0,70,0,75,0,80,0,85,0,89,0,94,0,99,0,104,0,109,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-70,0,-65,0,-60,0,-55,0,-50,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,75,1,79,1,84,1,89,1,94,1,99,1,104,1,108,1,112,1,116,1,120,1,125,1,-126,1,27,91,51,74,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,49,59,50,65,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,109,117,108,120,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,61,0,38,0,15,0,-99,1,80,3,99,111,110,101,109,117,124,65,78,73,83,32,88,51,46,54,52,32,97,110,100,32,88,116,101,114,109,32,50,53,54,32,99,111,108,111,114,115,32,102,111,114,32,67,111,110,69,109,117,32,119,105,116,104,32,108,105,98,117,118,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,-2,-1,0,0,2,0,4,0,-2,-1,21,0,29,0,33,0,37,0,-1,-1,48,0,65,0,69,0,73,0,80,0,-1,-1,82,0,89,0,-1,-1,93,0,-2,-1,97,0,101,0,-1,-1,-1,-1,-2,-1,-2,-1,105,0,110,0,-1,-1,-2,-1,-2,-1,-2,-1,-1,-1,119,0,124,0,-127,0,-122,0,-2,-1,-113,0,-108,0,-1,-1,-2,-1,-99,0,-93,0,-2,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-87,0,-1,-1,-83,0,-1,-1,-1,-1,-1,-1,-81,0,-1,-1,-76,0,-1,-1,-1,-1,-1,-1,-1,-1,-72,0,-67,0,-61,0,-56,0,-51,0,-46,0,-41,0,-35,0,-29,0,-23,0,-17,0,-12,0,-1,-1,-7,0,-1,-1,-3,0,2,1,7,1,11,1,18,1,-1,-1,25,1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,29,1,-1,-1,32,1,41,1,50,1,59,1,68,1,77,1,86,1,95,1,104,1,113,1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,122,1,-2,-1,-2,-1,-1,-1,-1,-1,-114,1,-111,1,-100,1,-97,1,-95,1,-92,1,-2,-1,-1,-1,-49,1,-1,-1,-1,-1,-1,-1,-1,-1,-47,1,-43,1,-39,1,-35,1,-31,1,-1,-1,-1,-1,-2,-1,-1,-1,-27,1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-23,1,-18,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-14,1,-1,-1,-1,-1,-7,1,-1,-1,-1,-1,-1,-1,-1,-1,0,2,7,2,14,2,-1,-1,-1,-1,21,2,-1,-1,28,2,-1,-1,-1,-1,-1,-1,35,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,42,2,48,2,54,2,60,2,66,2,72,2,78,2,84,2,90,2,96,2,102,2,108,2,114,2,120,2,126,2,-124,2,-118,2,-112,2,-106,2,-100,2,-94,2,-88,2,-82,2,-76,2,-70,2,-64,2,-58,2,-52,2,-46,2,-40,2,-33,2,-27,2,-21,2,-15,2,-9,2,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-3,2,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,9,3,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,18,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,23,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,29,3,43,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,57,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,91,65,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,9,0,27,79,119,0,27,79,121,0,27,91,71,0,27,79,113,0,27,79,115,0,27,91,90,0,27,91,52,126,0,27,79,77,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,49,59,54,83,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,63,54,57,108,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,51,56,59,53,59,37,112,49,37,100,109,0,27,91,52,56,59,53,59,37,112,49,37,100,109,0,27,91,63,54,57,104,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,115,0,2,0,0,0,74,0,92,0,-46,1,1,1,-2,-1,-2,-1,0,0,-2,-1,5,0,11,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,21,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,28,0,32,0,36,0,40,0,44,0,48,0,52,0,56,0,60,0,64,0,68,0,72,0,-2,-1,-2,-1,-2,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,32,0,37,0,42,0,47,0,52,0,56,0,61,0,66,0,71,0,76,0,81,0,87,0,93,0,99,0,105,0,111,0,117,0,123,0,-127,0,-121,0,-115,0,-110,0,-105,0,-100,0,-95,0,-90,0,-84,0,-78,0,-72,0,-66,0,-60,0,-54,0,-48,0,-42,0,-36,0,-30,0,-24,0,-18,0,-12,0,-6,0,0,1,6,1,12,1,18,1,24,1,30,1,34,1,39,1,44,1,49,1,54,1,59,1,63,1,67,1,71,1,75,1,79,1,85,1,91,1,97,1,103,1,109,1,115,1,121,1,126,1,-125,1,27,91,51,74,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,49,59,50,65,0,27,79,120,0,27,79,116,0,27,79,118,0,27,79,114,0,27,79,69,0,27,79,107,0,27,79,108,0,27,79,111,0,27,79,110,0,27,79,106,0,27,79,109,0,27,79,112,0,65,88,0,88,84,0,67,114,0,67,115,0,69,51,0,77,115,0,83,101,0,83,115,0,88,77,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,107,112,53,0,107,112,65,68,68,0,107,112,67,77,65,0,107,112,68,73,86,0,107,112,68,79,84,0,107,112,77,85,76,0,107,112,83,85,66,0,107,112,90,82,79,0,114,109,120,120,0,115,109,120,120,0,120,109,0 }; // cygwin|ANSI emulation for Cygwin, @@ -392,7 +399,7 @@ static const int8_t conemu_terminfo[] = { // user8=\E[?6c, // user9=\E[c, static const int8_t cygwin_terminfo[] = { - 26,1,33,0,21,0,15,0,125,1,-108,2,99,121,103,119,105,110,124,65,78,83,73,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,67,121,103,119,105,110,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,11,0,15,0,19,0,-1,-1,30,0,47,0,51,0,-1,-1,55,0,-1,-1,-1,-1,57,0,-1,-1,61,0,-1,-1,65,0,69,0,-1,-1,-1,-1,73,0,-1,-1,79,0,84,0,-1,-1,-1,-1,93,0,98,0,-1,-1,103,0,108,0,113,0,-1,-1,118,0,124,0,-124,0,-1,-1,-111,0,-106,0,-100,0,-1,-1,-1,-1,-94,0,-1,-1,-1,-1,-1,-1,-1,-1,-92,0,-88,0,-1,-1,-84,0,-1,-1,-1,-1,-1,-1,-82,0,-1,-1,-77,0,-1,-1,-1,-1,-1,-1,-1,-1,-73,0,-68,0,-62,0,-57,0,-52,0,-47,0,-42,0,-36,0,-30,0,-24,0,-18,0,-13,0,-1,-1,-8,0,-1,-1,-4,0,1,1,6,1,-1,-1,-1,-1,-1,-1,10,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,1,-1,-1,17,1,26,1,35,1,44,1,-1,-1,53,1,62,1,71,1,-1,-1,80,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,89,1,-1,-1,-1,-1,-1,-1,95,1,98,1,109,1,112,1,114,1,117,1,-1,-1,-1,-1,-64,1,-62,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-1,-1,-1,-1,-1,-1,-1,-1,-54,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,2,22,2,28,2,34,2,40,2,46,2,52,2,58,2,64,2,70,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,76,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,81,2,92,2,97,2,103,2,107,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,116,2,126,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-120,2,-114,2,7,0,13,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,8,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,49,109,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,49,48,109,0,27,91,48,59,49,48,109,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,7,0,27,91,64,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,93,82,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,57,37,116,59,49,49,37,59,109,0,9,0,27,93,59,0,27,91,71,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,52,126,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,49,109,0,27,91,49,48,109,0 // NOLINT + 26,1,33,0,21,0,15,0,125,1,-108,2,99,121,103,119,105,110,124,65,78,83,73,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,67,121,103,119,105,110,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,11,0,15,0,19,0,-1,-1,30,0,47,0,51,0,-1,-1,55,0,-1,-1,-1,-1,57,0,-1,-1,61,0,-1,-1,65,0,69,0,-1,-1,-1,-1,73,0,-1,-1,79,0,84,0,-1,-1,-1,-1,93,0,98,0,-1,-1,103,0,108,0,113,0,-1,-1,118,0,124,0,-124,0,-1,-1,-111,0,-106,0,-100,0,-1,-1,-1,-1,-94,0,-1,-1,-1,-1,-1,-1,-1,-1,-92,0,-88,0,-1,-1,-84,0,-1,-1,-1,-1,-1,-1,-82,0,-1,-1,-77,0,-1,-1,-1,-1,-1,-1,-1,-1,-73,0,-68,0,-62,0,-57,0,-52,0,-47,0,-42,0,-36,0,-30,0,-24,0,-18,0,-13,0,-1,-1,-8,0,-1,-1,-4,0,1,1,6,1,-1,-1,-1,-1,-1,-1,10,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,1,-1,-1,17,1,26,1,35,1,44,1,-1,-1,53,1,62,1,71,1,-1,-1,80,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,89,1,-1,-1,-1,-1,-1,-1,95,1,98,1,109,1,112,1,114,1,117,1,-1,-1,-1,-1,-64,1,-62,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-1,-1,-1,-1,-1,-1,-1,-1,-54,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,2,22,2,28,2,34,2,40,2,46,2,52,2,58,2,64,2,70,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,76,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,81,2,92,2,97,2,103,2,107,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,116,2,126,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-120,2,-114,2,7,0,13,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,8,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,91,49,49,109,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,49,48,109,0,27,91,48,59,49,48,109,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,7,0,27,91,64,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,93,82,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,57,37,116,59,49,49,37,59,109,0,9,0,27,93,59,0,27,91,71,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,52,126,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,49,109,0,27,91,49,48,109,0 }; // interix|opennt|opennt-25|ntconsole|ntconsole-25|OpenNT-term compatible with color, @@ -517,7 +524,6 @@ static const int8_t cygwin_terminfo[] = { // parm_right_cursor=\E[%p1%dC, // parm_rindex=\E[%p1%dT, // parm_up_cursor=\E[%p1%dA, -// repeat_char=%p1%c\E[%p2%{1}%-%db, // reset_1string=\Ec, // restore_cursor=\E[u, // save_cursor=\E[s, @@ -527,7 +533,7 @@ static const int8_t cygwin_terminfo[] = { // set_a_foreground=\E[3%p1%dm, // tab=^I, static const int8_t interix_8colour_terminfo[] = { - 26,1,82,0,29,0,16,0,105,1,116,2,105,110,116,101,114,105,120,124,111,112,101,110,110,116,124,111,112,101,110,110,116,45,50,53,124,110,116,99,111,110,115,111,108,101,124,110,116,99,111,110,115,111,108,101,45,50,53,124,79,112,101,110,78,84,45,116,101,114,109,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,99,111,108,111,114,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,80,0,8,0,25,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,3,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,9,0,13,0,-1,-1,-1,-1,17,0,34,0,36,0,-1,-1,40,0,-1,-1,-1,-1,44,0,48,0,52,0,-1,-1,-1,-1,56,0,-1,-1,-1,-1,-1,-1,-1,-1,60,0,65,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,73,0,78,0,83,0,-1,-1,-1,-1,88,0,93,0,-1,-1,-1,-1,105,0,109,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,0,-1,-1,117,0,-1,-1,-1,-1,-1,-1,119,0,-1,-1,121,0,-1,-1,-1,-1,-1,-1,125,0,-127,0,-123,0,-119,0,-115,0,-111,0,-107,0,-103,0,-99,0,-95,0,-91,0,-87,0,-83,0,-1,-1,-79,0,-75,0,-71,0,-67,0,-63,0,-59,0,-55,0,-1,-1,-51,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-47,0,-1,-1,-1,-1,-44,0,-35,0,-1,-1,-26,0,-17,0,-8,0,1,1,10,1,19,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,1,48,1,-1,-1,-1,-1,-1,-1,51,1,-1,-1,55,1,59,1,63,1,-1,-1,-1,-1,-1,-1,67,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,69,1,-1,-1,-124,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-120,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-116,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-112,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-108,1,-104,1,-100,1,-96,1,-92,1,-88,1,-84,1,-80,1,-76,1,-72,1,-68,1,-64,1,-60,1,-56,1,-52,1,-48,1,-44,1,-40,1,-36,1,-32,1,-28,1,-24,1,-20,1,-16,1,-12,1,-8,1,-4,1,0,2,4,2,8,2,12,2,16,2,20,2,24,2,28,2,32,2,36,2,40,2,44,2,48,2,52,2,56,2,60,2,64,2,68,2,72,2,76,2,80,2,84,2,88,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,92,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,96,2,106,2,7,0,13,0,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,68,0,27,91,67,0,27,91,85,0,27,91,65,0,27,91,77,0,27,91,49,109,0,27,91,115,27,91,49,98,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,48,109,0,27,91,50,98,27,91,117,13,27,91,75,0,27,91,109,0,27,91,109,0,27,91,76,0,8,0,127,0,27,91,66,0,27,70,65,0,27,70,49,0,27,70,65,0,27,70,50,0,27,70,51,0,27,70,52,0,27,70,53,0,27,70,54,0,27,70,55,0,27,70,56,0,27,70,57,0,27,91,72,0,27,91,76,0,27,91,68,0,27,91,85,0,27,91,84,0,27,91,83,0,27,91,67,0,27,70,43,0,27,70,45,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,99,0,27,91,117,0,27,91,115,0,27,91,83,0,27,91,84,0,9,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,90,0,27,91,85,0,27,70,94,0,27,70,36,0,27,70,66,0,27,70,67,0,27,70,68,0,27,70,69,0,27,70,70,0,27,70,71,0,27,70,72,0,27,70,73,0,27,70,74,0,27,70,75,0,27,70,76,0,27,70,77,0,27,70,78,0,27,70,79,0,27,70,80,0,27,70,81,0,27,70,82,0,27,70,83,0,27,70,84,0,27,70,85,0,27,70,86,0,27,70,87,0,27,70,88,0,27,70,89,0,27,70,90,0,27,70,97,0,27,70,98,0,27,70,99,0,27,70,100,0,27,70,101,0,27,70,102,0,27,70,103,0,27,70,104,0,27,70,105,0,27,70,106,0,27,70,107,0,27,70,109,0,27,70,110,0,27,70,111,0,27,70,112,0,27,70,113,0,27,70,114,0,27,70,115,0,27,70,116,0,27,70,117,0,27,70,118,0,27,70,119,0,27,70,120,0,27,70,121,0,27,70,122,0,27,91,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0 // NOLINT + 26,1,82,0,29,0,16,0,105,1,96,2,105,110,116,101,114,105,120,124,111,112,101,110,110,116,124,111,112,101,110,110,116,45,50,53,124,110,116,99,111,110,115,111,108,101,124,110,116,99,111,110,115,111,108,101,45,50,53,124,79,112,101,110,78,84,45,116,101,114,109,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,99,111,108,111,114,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,80,0,8,0,25,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,3,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,9,0,13,0,-1,-1,-1,-1,17,0,34,0,36,0,-1,-1,40,0,-1,-1,-1,-1,44,0,48,0,52,0,-1,-1,-1,-1,56,0,-1,-1,-1,-1,-1,-1,-1,-1,60,0,65,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,73,0,78,0,83,0,-1,-1,-1,-1,88,0,93,0,-1,-1,-1,-1,105,0,109,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,0,-1,-1,117,0,-1,-1,-1,-1,-1,-1,119,0,-1,-1,121,0,-1,-1,-1,-1,-1,-1,125,0,-127,0,-123,0,-119,0,-115,0,-111,0,-107,0,-103,0,-99,0,-95,0,-91,0,-87,0,-83,0,-1,-1,-79,0,-75,0,-71,0,-67,0,-63,0,-59,0,-55,0,-1,-1,-51,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-47,0,-1,-1,-1,-1,-44,0,-35,0,-1,-1,-26,0,-17,0,-8,0,1,1,10,1,19,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,1,-1,-1,-1,-1,-1,-1,31,1,-1,-1,35,1,39,1,43,1,-1,-1,-1,-1,-1,-1,47,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,49,1,-1,-1,112,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,116,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,120,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,124,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,1,-124,1,-120,1,-116,1,-112,1,-108,1,-104,1,-100,1,-96,1,-92,1,-88,1,-84,1,-80,1,-76,1,-72,1,-68,1,-64,1,-60,1,-56,1,-52,1,-48,1,-44,1,-40,1,-36,1,-32,1,-28,1,-24,1,-20,1,-16,1,-12,1,-8,1,-4,1,0,2,4,2,8,2,12,2,16,2,20,2,24,2,28,2,32,2,36,2,40,2,44,2,48,2,52,2,56,2,60,2,64,2,68,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,76,2,86,2,7,0,13,0,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,68,0,27,91,67,0,27,91,85,0,27,91,65,0,27,91,77,0,27,91,49,109,0,27,91,115,27,91,49,98,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,48,109,0,27,91,50,98,27,91,117,13,27,91,75,0,27,91,109,0,27,91,109,0,27,91,76,0,8,0,127,0,27,91,66,0,27,70,65,0,27,70,49,0,27,70,65,0,27,70,50,0,27,70,51,0,27,70,52,0,27,70,53,0,27,70,54,0,27,70,55,0,27,70,56,0,27,70,57,0,27,91,72,0,27,91,76,0,27,91,68,0,27,91,85,0,27,91,84,0,27,91,83,0,27,91,67,0,27,70,43,0,27,70,45,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,99,0,27,91,117,0,27,91,115,0,27,91,83,0,27,91,84,0,9,0,43,16,44,17,45,24,46,25,48,-37,96,4,97,-79,102,-8,103,-15,104,-80,106,-39,107,-65,108,-38,109,-64,110,-59,111,126,112,-60,113,-60,114,-60,115,95,116,-61,117,-76,118,-63,119,-62,120,-77,121,-13,122,-14,123,-29,124,-40,125,-100,126,-2,0,27,91,90,0,27,91,85,0,27,70,94,0,27,70,36,0,27,70,66,0,27,70,67,0,27,70,68,0,27,70,69,0,27,70,70,0,27,70,71,0,27,70,72,0,27,70,73,0,27,70,74,0,27,70,75,0,27,70,76,0,27,70,77,0,27,70,78,0,27,70,79,0,27,70,80,0,27,70,81,0,27,70,82,0,27,70,83,0,27,70,84,0,27,70,85,0,27,70,86,0,27,70,87,0,27,70,88,0,27,70,89,0,27,70,90,0,27,70,97,0,27,70,98,0,27,70,99,0,27,70,100,0,27,70,101,0,27,70,102,0,27,70,103,0,27,70,104,0,27,70,105,0,27,70,106,0,27,70,107,0,27,70,109,0,27,70,110,0,27,70,111,0,27,70,112,0,27,70,113,0,27,70,114,0,27,70,115,0,27,70,116,0,27,70,117,0,27,70,118,0,27,70,119,0,27,70,120,0,27,70,121,0,27,70,122,0,27,91,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0 }; // iTerm2.app|iterm2|terminal emulator for Mac OS X, @@ -670,7 +676,7 @@ static const int8_t interix_8colour_terminfo[] = { // user8=\E[?%[;0123456789]c, // user9=\E[c, static const int8_t iterm_256colour_terminfo[] = { - 30,2,49,0,29,0,15,0,105,1,-29,3,105,84,101,114,109,50,46,97,112,112,124,105,116,101,114,109,50,124,116,101,114,109,105,110,97,108,32,101,109,117,108,97,116,111,114,32,102,111,114,32,77,97,99,32,79,83,32,88,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,95,0,-1,-1,99,0,-1,-1,103,0,107,0,111,0,-1,-1,117,0,119,0,124,0,-127,0,-1,-1,-109,0,-104,0,-1,-1,-1,-1,-99,0,-94,0,-89,0,-1,-1,-84,0,-82,0,-77,0,-1,-1,-59,0,-54,0,-48,0,-42,0,-1,-1,-24,0,-1,-1,-1,-1,-1,-1,-1,-1,-22,0,-18,0,-1,-1,-14,0,-1,-1,-1,-1,-1,-1,-12,0,-1,-1,-7,0,-1,-1,-1,-1,-1,-1,-1,-1,-3,0,1,1,7,1,11,1,15,1,19,1,25,1,31,1,37,1,43,1,49,1,-1,-1,-1,-1,53,1,-1,-1,57,1,62,1,67,1,71,1,78,1,-1,-1,85,1,89,1,97,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,1,-1,-1,108,1,117,1,126,1,-121,1,-112,1,-103,1,-94,1,-85,1,-76,1,-67,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-1,-1,-1,-1,-32,1,-29,1,-18,1,-15,1,-13,1,-10,1,68,2,-1,-1,71,2,73,2,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-1,-1,78,2,-1,-1,-127,2,-1,-1,-1,-1,-123,2,-117,2,-1,-1,-1,-1,-111,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-104,2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-100,2,-1,-1,-1,-1,-1,-1,-1,-1,-93,2,-1,-1,-86,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-72,2,-66,2,-60,2,-53,2,-46,2,-39,2,-32,2,-24,2,-16,2,-8,2,0,3,8,3,16,3,24,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,3,48,3,53,3,72,3,76,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,85,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,90,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,96,3,-1,-1,-1,-1,-1,-1,100,3,-93,3,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,93,50,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,27,91,50,50,59,48,59,48,116,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,27,91,50,51,59,48,59,48,116,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,50,48,48,47,62,27,91,63,53,108,0,7,0,27,91,64,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,50,59,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,40,66,27,41,48,0,27,79,70,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,49,59,50,68,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,1,0,0,0,33,0,67,0,-37,1,0,0,0,0,5,0,32,0,37,0,45,0,52,0,59,0,66,0,74,0,81,0,88,0,96,0,104,0,111,0,119,0,126,0,-123,0,-115,0,-107,0,-102,0,-94,0,-87,0,-80,0,-74,0,-68,0,-63,0,-55,0,-48,0,-41,0,-36,0,-28,0,-21,0,-14,0,0,0,3,0,6,0,9,0,14,0,19,0,24,0,29,0,35,0,41,0,47,0,53,0,59,0,65,0,71,0,77,0,83,0,89,0,95,0,101,0,107,0,113,0,119,0,125,0,-125,0,-119,0,-113,0,-107,0,-101,0,-95,0,-90,0,-85,0,-80,0,-75,0,27,93,50,59,0,27,91,63,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,27,91,66,0,27,91,49,59,49,48,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,57,70,0,27,91,49,59,49,48,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,49,51,70,0,27,91,49,59,49,52,70,0,27,91,49,59,57,72,0,27,91,49,59,49,48,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,49,51,72,0,27,91,49,59,49,52,72,0,27,27,91,68,0,27,91,49,59,49,48,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,27,91,54,126,0,27,27,91,53,126,0,27,27,91,67,0,27,91,49,59,49,48,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,27,91,65,0,27,91,49,59,49,48,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,77,37,63,37,112,52,37,116,51,37,101,37,112,51,37,39,32,39,37,43,37,99,37,59,37,112,50,37,39,33,39,37,43,37,99,37,112,49,37,39,33,39,37,43,37,99,0,65,88,0,84,83,0,88,77,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,78,88,84,51,0,107,80,82,86,51,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,120,109,0 // NOLINT + 30,2,49,0,29,0,15,0,105,1,-29,3,105,84,101,114,109,50,46,97,112,112,124,105,116,101,114,109,50,124,116,101,114,109,105,110,97,108,32,101,109,117,108,97,116,111,114,32,102,111,114,32,77,97,99,32,79,83,32,88,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,95,0,-1,-1,99,0,-1,-1,103,0,107,0,111,0,-1,-1,117,0,119,0,124,0,-127,0,-1,-1,-109,0,-104,0,-1,-1,-1,-1,-99,0,-94,0,-89,0,-1,-1,-84,0,-82,0,-77,0,-1,-1,-59,0,-54,0,-48,0,-42,0,-1,-1,-24,0,-1,-1,-1,-1,-1,-1,-1,-1,-22,0,-18,0,-1,-1,-14,0,-1,-1,-1,-1,-1,-1,-12,0,-1,-1,-7,0,-1,-1,-1,-1,-1,-1,-1,-1,-3,0,1,1,7,1,11,1,15,1,19,1,25,1,31,1,37,1,43,1,49,1,-1,-1,-1,-1,53,1,-1,-1,57,1,62,1,67,1,71,1,78,1,-1,-1,85,1,89,1,97,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,1,-1,-1,108,1,117,1,126,1,-121,1,-112,1,-103,1,-94,1,-85,1,-76,1,-67,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-1,-1,-1,-1,-32,1,-29,1,-18,1,-15,1,-13,1,-10,1,68,2,-1,-1,71,2,73,2,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-1,-1,78,2,-1,-1,-127,2,-1,-1,-1,-1,-123,2,-117,2,-1,-1,-1,-1,-111,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-104,2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-100,2,-1,-1,-1,-1,-1,-1,-1,-1,-93,2,-1,-1,-86,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-72,2,-66,2,-60,2,-53,2,-46,2,-39,2,-32,2,-24,2,-16,2,-8,2,0,3,8,3,16,3,24,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,3,48,3,53,3,72,3,76,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,85,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,90,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,96,3,-1,-1,-1,-1,-1,-1,100,3,-93,3,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,93,50,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,27,91,50,50,59,48,59,48,116,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,27,91,50,51,59,48,59,48,116,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,50,48,48,47,62,27,91,63,53,108,0,7,0,27,91,64,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,50,59,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,40,66,27,41,48,0,27,79,70,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,49,59,50,68,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,0,0,0,0,33,0,66,0,-37,1,0,0,5,0,32,0,37,0,45,0,52,0,59,0,66,0,74,0,81,0,88,0,96,0,104,0,111,0,119,0,126,0,-123,0,-115,0,-107,0,-102,0,-94,0,-87,0,-80,0,-74,0,-68,0,-63,0,-55,0,-48,0,-41,0,-36,0,-28,0,-21,0,-14,0,0,0,3,0,6,0,11,0,16,0,21,0,26,0,32,0,38,0,44,0,50,0,56,0,62,0,68,0,74,0,80,0,86,0,92,0,98,0,104,0,110,0,116,0,122,0,-128,0,-122,0,-116,0,-110,0,-104,0,-98,0,-93,0,-88,0,-83,0,-78,0,27,93,50,59,0,27,91,63,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,27,91,66,0,27,91,49,59,49,48,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,57,70,0,27,91,49,59,49,48,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,49,51,70,0,27,91,49,59,49,52,70,0,27,91,49,59,57,72,0,27,91,49,59,49,48,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,49,51,72,0,27,91,49,59,49,52,72,0,27,27,91,68,0,27,91,49,59,49,48,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,27,91,54,126,0,27,27,91,53,126,0,27,27,91,67,0,27,91,49,59,49,48,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,27,91,65,0,27,91,49,59,49,48,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,77,37,63,37,112,52,37,116,37,112,51,37,101,37,123,51,125,37,59,37,39,32,39,37,43,37,99,37,112,50,37,39,33,39,37,43,37,99,37,112,49,37,39,33,39,37,43,37,99,0,84,83,0,88,77,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,78,88,84,51,0,107,80,82,86,51,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,120,109,0 }; // linux|linux console, @@ -686,7 +692,7 @@ static const int8_t iterm_256colour_terminfo[] = { // max_colors#8, // max_pairs#64, // no_color_video#18, -// acs_chars=++\054\054--..00__``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}c~~, +// acs_chars=++\054\054--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, // bell=^G, // carriage_return=\r, // change_scroll_region=\E[%i%p1%d;%p2%dr, @@ -792,7 +798,7 @@ static const int8_t iterm_256colour_terminfo[] = { // user8=\E[?6c, // user9=\E[c, static const int8_t linux_16colour_terminfo[] = { - 26,1,20,0,29,0,16,0,125,1,69,3,108,105,110,117,120,124,108,105,110,117,120,32,99,111,110,115,111,108,101,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,18,0,-1,-1,0,0,2,0,4,0,21,0,26,0,33,0,37,0,41,0,-1,-1,52,0,69,0,71,0,75,0,87,0,-1,-1,89,0,101,0,-1,-1,105,0,109,0,121,0,125,0,-1,-1,-1,-1,-127,0,-125,0,-120,0,-1,-1,-1,-1,-115,0,-110,0,-1,-1,-1,-1,-105,0,-100,0,-95,0,-90,0,-81,0,-79,0,-1,-1,-1,-1,-74,0,-69,0,-63,0,-57,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-39,0,-35,0,-1,-1,-31,0,-1,-1,-1,-1,-1,-1,-29,0,-1,-1,-24,0,-1,-1,-1,-1,-1,-1,-1,-1,-20,0,-15,0,-9,0,-4,0,1,1,6,1,11,1,17,1,23,1,29,1,35,1,40,1,-1,-1,45,1,-1,-1,49,1,54,1,59,1,-1,-1,-1,-1,-1,-1,63,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,67,1,-1,-1,70,1,79,1,88,1,97,1,-1,-1,106,1,115,1,124,1,-1,-1,-123,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-114,1,-1,-1,-1,-1,-1,-1,-108,1,-105,1,-94,1,-91,1,-89,1,-86,1,1,2,-1,-1,4,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,2,-1,-1,-1,-1,-1,-1,-1,-1,10,2,-1,-1,77,2,-1,-1,-1,-1,81,2,87,2,-1,-1,-1,-1,93,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,97,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,102,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,104,2,110,2,116,2,122,2,-128,2,-122,2,-116,2,-110,2,-104,2,-98,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-92,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-87,2,-76,2,-71,2,-65,2,-61,2,-52,2,-48,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,33,3,-1,-1,-1,-1,-1,-1,37,3,47,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,57,3,63,3,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,27,91,63,49,99,0,8,0,27,91,63,50,53,104,27,91,63,48,99,0,27,91,67,0,27,91,65,0,27,91,63,50,53,104,27,91,63,56,99,0,27,91,80,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,109,15,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,50,48,48,47,62,27,91,63,53,108,0,27,91,64,0,27,91,76,0,127,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,93,82,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,54,37,116,59,49,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,91,71,0,43,43,44,44,45,45,46,46,48,48,95,95,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,99,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,41,48,0,27,91,52,126,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,82,0,27,93,80,37,112,49,37,120,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,0,27,91,77,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,49,109,0,27,91,49,48,109,0,0,3,0,1,0,12,0,28,0,63,0,1,0,0,0,1,0,-1,-1,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,33,0,39,0,43,0,47,0,51,0,55,0,27,91,51,74,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,69,51,0,83,48,0,84,83,0,88,77,0,107,69,78,68,53,0,107,72,79,77,53,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT + 26,1,20,0,29,0,16,0,125,1,67,3,108,105,110,117,120,124,108,105,110,117,120,32,99,111,110,115,111,108,101,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,18,0,-1,-1,0,0,2,0,4,0,21,0,26,0,33,0,37,0,41,0,-1,-1,52,0,69,0,71,0,75,0,87,0,-1,-1,89,0,101,0,-1,-1,105,0,109,0,121,0,125,0,-1,-1,-1,-1,-127,0,-125,0,-120,0,-1,-1,-1,-1,-115,0,-110,0,-1,-1,-1,-1,-105,0,-100,0,-95,0,-90,0,-81,0,-79,0,-1,-1,-1,-1,-74,0,-69,0,-63,0,-57,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-39,0,-35,0,-1,-1,-31,0,-1,-1,-1,-1,-1,-1,-29,0,-1,-1,-24,0,-1,-1,-1,-1,-1,-1,-1,-1,-20,0,-15,0,-9,0,-4,0,1,1,6,1,11,1,17,1,23,1,29,1,35,1,40,1,-1,-1,45,1,-1,-1,49,1,54,1,59,1,-1,-1,-1,-1,-1,-1,63,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,67,1,-1,-1,70,1,79,1,88,1,97,1,-1,-1,106,1,115,1,124,1,-1,-1,-123,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-114,1,-1,-1,-1,-1,-1,-1,-108,1,-105,1,-94,1,-91,1,-89,1,-86,1,1,2,-1,-1,4,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,2,-1,-1,-1,-1,-1,-1,-1,-1,10,2,-1,-1,75,2,-1,-1,-1,-1,79,2,85,2,-1,-1,-1,-1,91,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,95,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,100,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,102,2,108,2,114,2,120,2,126,2,-124,2,-118,2,-112,2,-106,2,-100,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-94,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-89,2,-78,2,-73,2,-67,2,-63,2,-54,2,-50,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,31,3,-1,-1,-1,-1,-1,-1,35,3,45,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,55,3,61,3,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,27,91,63,49,99,0,8,0,27,91,63,50,53,104,27,91,63,48,99,0,27,91,67,0,27,91,65,0,27,91,63,50,53,104,27,91,63,56,99,0,27,91,80,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,109,15,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,50,48,48,47,62,27,91,63,53,108,0,27,91,64,0,27,91,76,0,127,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,93,82,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,59,49,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,54,37,116,59,49,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,91,71,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,41,48,0,27,91,52,126,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,82,0,27,93,80,37,112,49,37,120,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,48,50,120,0,27,91,77,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,49,109,0,27,91,49,48,109,0,0,1,0,1,0,1,0,4,0,14,0,1,0,1,0,0,0,0,0,3,0,6,0,27,91,51,74,0,65,88,0,85,56,0,69,51,0 }; // putty-256color|PuTTY 0.58 with xterm 256-colors, @@ -855,12 +861,18 @@ static const int8_t linux_16colour_terminfo[] = { // from_status_line=^G, // init_2string=\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>\E]R, // insert_line=\E[L, -// key_b2=\E[G, +// key_a1=\EOq, +// key_a3=\EOs, +// key_b2=\EOr, // key_backspace=\177, // key_btab=\E[Z, +// key_c1=\EOp, +// key_c3=\EOn, // key_dc=\E[3~, // key_down=\EOB, // key_end=\E[4~, +// key_enter=\EOM, +// key_f0=\EOy, // key_f1=\E[11~, // key_f10=\E[21~, // key_f11=\E[23~, @@ -884,14 +896,12 @@ static const int8_t linux_16colour_terminfo[] = { // key_home=\E[1~, // key_ic=\E[2~, // key_left=\EOD, -// key_mouse=\E[M, +// key_mouse=\E[<, // key_npage=\E[6~, // key_ppage=\E[5~, // key_right=\EOC, // key_sf=\E[B, -// key_sleft=\E[D, // key_sr=\E[A, -// key_sright=\E[C, // key_suspend=^Z, // key_up=\EOA, // keypad_local=\E[?1l\E>, @@ -908,6 +918,7 @@ static const int8_t linux_16colour_terminfo[] = { // parm_right_cursor=\E[%p1%dC, // parm_rindex=\E[%p1%dT, // parm_up_cursor=\E[%p1%dA, +// repeat_char=%p1%c\E[%p2%{1}%-%db, // reset_2string=\E<\E["p\E[50;6"p\Ec\E[?3l\E]R\E[?1000l, // restore_cursor=\E8, // row_address=\E[%i%p1%dd, @@ -928,7 +939,7 @@ static const int8_t linux_16colour_terminfo[] = { // user8=\E[?6c, // user9=\E[c, static const int8_t putty_256colour_terminfo[] = { - 30,2,48,0,29,0,16,0,125,1,-106,4,112,117,116,116,121,45,50,53,54,99,111,108,111,114,124,80,117,84,84,89,32,48,46,53,56,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,1,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,-1,-1,-1,-1,8,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,22,0,0,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,103,0,107,0,111,0,-1,-1,117,0,119,0,124,0,-127,0,-1,-1,-1,-1,-120,0,-1,-1,-1,-1,-115,0,-110,0,-105,0,-100,0,-91,0,-89,0,-84,0,-1,-1,-73,0,-68,0,-62,0,-56,0,-1,-1,-38,0,-1,-1,-36,0,-1,-1,-1,-1,-1,-1,-2,0,-1,-1,2,1,-1,-1,-1,-1,-1,-1,4,1,-1,-1,9,1,-1,-1,-1,-1,-1,-1,-1,-1,13,1,19,1,25,1,31,1,37,1,43,1,49,1,55,1,61,1,67,1,73,1,78,1,-1,-1,83,1,-1,-1,87,1,92,1,97,1,101,1,105,1,-1,-1,109,1,113,1,121,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-127,1,-1,-1,-124,1,-115,1,-106,1,-1,-1,-97,1,-88,1,-79,1,-70,1,-61,1,-52,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-43,1,-1,-1,-1,-1,-10,1,-7,1,4,2,7,2,9,2,12,2,84,2,-1,-1,87,2,89,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,94,2,-1,-1,-1,-1,-1,-1,-1,-1,98,2,-1,-1,-107,2,-1,-1,-1,-1,-103,2,-97,2,-1,-1,-1,-1,-91,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-84,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-77,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-73,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-69,2,-63,2,-57,2,-51,2,-45,2,-39,2,-33,2,-27,2,-21,2,-15,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-4,2,7,3,12,3,18,3,22,3,31,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,35,3,-1,-1,-1,-1,-1,-1,39,3,102,3,-1,-1,-1,-1,-1,-1,-90,3,-84,3,-78,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-72,3,-118,4,-112,4,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,68,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,52,55,104,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,109,15,0,27,91,50,74,27,91,63,52,55,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,7,0,27,55,27,91,114,27,91,109,27,91,63,55,104,27,91,63,49,59,52,59,54,108,27,91,52,108,27,56,27,62,27,93,82,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,91,49,49,126,0,27,91,50,49,126,0,27,91,49,50,126,0,27,91,49,51,126,0,27,91,49,52,126,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,66,0,27,91,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,60,27,91,34,112,27,91,53,48,59,54,34,112,27,99,27,91,63,51,108,27,93,82,27,91,63,49,48,48,48,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,54,37,124,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,48,59,0,27,91,71,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,40,66,27,41,48,0,27,91,52,126,0,26,0,27,91,68,0,27,91,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,82,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,49,48,109,0,27,91,49,49,109,0,27,91,49,50,109,0,37,63,37,112,49,37,123,56,125,37,61,37,116,27,37,37,71,-30,-105,-104,27,37,37,64,37,101,37,112,49,37,123,49,48,125,37,61,37,116,27,37,37,71,-30,-105,-103,27,37,37,64,37,101,37,112,49,37,123,49,50,125,37,61,37,116,27,37,37,71,-30,-103,-128,27,37,37,64,37,101,37,112,49,37,123,49,51,125,37,61,37,116,27,37,37,71,-30,-103,-86,27,37,37,64,37,101,37,112,49,37,123,49,52,125,37,61,37,116,27,37,37,71,-30,-103,-85,27,37,37,64,37,101,37,112,49,37,123,49,53,125,37,61,37,116,27,37,37,71,-30,-104,-68,27,37,37,64,37,101,37,112,49,37,123,50,55,125,37,61,37,116,27,37,37,71,-30,-122,-112,27,37,37,64,37,101,37,112,49,37,123,49,53,53,125,37,61,37,116,27,37,37,71,-32,-126,-94,27,37,37,64,37,101,37,112,49,37,99,37,59,0,27,91,49,49,109,0,27,91,49,48,109,0,3,0,1,0,60,0,124,0,74,1,0,0,1,0,1,0,0,0,-1,-1,0,0,-1,-1,-1,-1,-1,-1,5,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,39,0,45,0,50,0,55,0,60,0,65,0,70,0,74,0,79,0,84,0,89,0,94,0,99,0,105,0,111,0,117,0,123,0,-127,0,-121,0,-115,0,-109,0,-103,0,-97,0,-91,0,-85,0,-80,0,-75,0,-69,0,-63,0,-57,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,25,1,30,1,35,1,40,1,45,1,49,1,53,1,57,1,61,1,27,91,51,74,0,27,93,48,59,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,69,51,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,53,0,107,73,67,54,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,53,0,107,78,88,84,54,0,107,80,82,86,51,0,107,80,82,86,53,0,107,80,82,86,54,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT + 30,2,48,0,29,0,16,0,125,1,-70,4,112,117,116,116,121,45,50,53,54,99,111,108,111,114,124,80,117,84,84,89,32,48,46,53,56,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,1,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,-1,-1,-1,-1,8,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,22,0,0,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,103,0,107,0,111,0,-1,-1,117,0,119,0,124,0,-127,0,-1,-1,-1,-1,-120,0,-1,-1,-1,-1,-115,0,-110,0,-105,0,-100,0,-91,0,-89,0,-84,0,-1,-1,-73,0,-68,0,-62,0,-56,0,-1,-1,-38,0,-1,-1,-36,0,-1,-1,-1,-1,-1,-1,-2,0,-1,-1,2,1,-1,-1,-1,-1,-1,-1,4,1,-1,-1,9,1,-1,-1,-1,-1,-1,-1,13,1,17,1,23,1,29,1,35,1,41,1,47,1,53,1,59,1,65,1,71,1,77,1,82,1,-1,-1,87,1,-1,-1,91,1,96,1,101,1,105,1,109,1,-1,-1,113,1,117,1,125,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-123,1,-1,-1,-120,1,-111,1,-102,1,-1,-1,-93,1,-84,1,-75,1,-66,1,-57,1,-48,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-39,1,-1,-1,-19,1,-1,-1,-1,-1,14,2,17,2,28,2,31,2,33,2,36,2,108,2,-1,-1,111,2,113,2,-1,-1,-1,-1,-1,-1,118,2,122,2,126,2,-126,2,-122,2,-1,-1,-1,-1,-118,2,-1,-1,-67,2,-1,-1,-1,-1,-63,2,-57,2,-1,-1,-1,-1,-51,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-44,2,-39,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-35,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-33,2,-27,2,-21,2,-15,2,-9,2,-3,2,3,3,9,3,15,3,21,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,27,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,3,43,3,48,3,54,3,58,3,67,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,71,3,-1,-1,-1,-1,-1,-1,75,3,-118,3,-1,-1,-1,-1,-1,-1,-54,3,-48,3,-42,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-36,3,-82,4,-76,4,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,68,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,52,55,104,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,109,15,0,27,91,50,74,27,91,63,52,55,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,7,0,27,55,27,91,114,27,91,109,27,91,63,55,104,27,91,63,49,59,52,59,54,108,27,91,52,108,27,56,27,62,27,93,82,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,121,0,27,91,49,49,126,0,27,91,50,49,126,0,27,91,49,50,126,0,27,91,49,51,126,0,27,91,49,52,126,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,66,0,27,91,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,13,10,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,60,27,91,34,112,27,91,53,48,59,54,34,112,27,99,27,91,63,51,108,27,93,82,27,91,63,49,48,48,48,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,54,37,124,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,48,59,0,27,79,113,0,27,79,115,0,27,79,114,0,27,79,112,0,27,79,110,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,40,66,27,41,48,0,27,91,52,126,0,27,79,77,0,26,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,54,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,82,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,49,48,109,0,27,91,49,49,109,0,27,91,49,50,109,0,37,63,37,112,49,37,123,56,125,37,61,37,116,27,37,37,71,-30,-105,-104,27,37,37,64,37,101,37,112,49,37,123,49,48,125,37,61,37,116,27,37,37,71,-30,-105,-103,27,37,37,64,37,101,37,112,49,37,123,49,50,125,37,61,37,116,27,37,37,71,-30,-103,-128,27,37,37,64,37,101,37,112,49,37,123,49,51,125,37,61,37,116,27,37,37,71,-30,-103,-86,27,37,37,64,37,101,37,112,49,37,123,49,52,125,37,61,37,116,27,37,37,71,-30,-103,-85,27,37,37,64,37,101,37,112,49,37,123,49,53,125,37,61,37,116,27,37,37,71,-30,-104,-68,27,37,37,64,37,101,37,112,49,37,123,50,55,125,37,61,37,116,27,37,37,71,-30,-122,-112,27,37,37,64,37,101,37,112,49,37,123,49,53,53,125,37,61,37,116,27,37,37,71,-32,-126,-94,27,37,37,64,37,101,37,112,49,37,99,37,59,0,27,91,49,49,109,0,27,91,49,48,109,0,1,0,1,0,20,0,42,0,-17,0,1,0,1,0,0,0,0,0,5,0,10,0,42,0,46,0,50,0,54,0,58,0,62,0,66,0,70,0,74,0,78,0,82,0,86,0,90,0,94,0,98,0,102,0,106,0,0,0,3,0,6,0,9,0,12,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,57,0,63,0,69,0,75,0,81,0,87,0,93,0,27,91,51,74,0,27,93,48,59,0,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,79,113,0,27,79,114,0,27,79,115,0,27,79,116,0,27,79,117,0,27,79,118,0,27,79,119,0,27,79,120,0,27,79,121,0,27,79,108,0,27,79,81,0,27,79,110,0,27,79,82,0,27,79,80,0,27,79,83,0,27,79,112,0,27,91,60,37,105,37,112,51,37,100,59,37,112,49,37,100,59,37,112,50,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,88,84,0,85,56,0,69,51,0,84,83,0,88,77,0,107,112,49,0,107,112,50,0,107,112,51,0,107,112,52,0,107,112,53,0,107,112,54,0,107,112,55,0,107,112,56,0,107,112,57,0,107,112,65,68,68,0,107,112,68,73,86,0,107,112,68,79,84,0,107,112,77,85,76,0,107,112,78,85,77,0,107,112,83,85,66,0,107,112,90,82,79,0,120,109,0 }; // rxvt-256color|rxvt 2.7.9 with xterm 256-colors, @@ -984,7 +995,6 @@ static const int8_t putty_256colour_terminfo[] = { // init_1string=\E[?47l\E=\E[?1l, // init_2string=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, // initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\, -// insert_character=\E[@, // insert_line=\E[L, // key_a1=\EOw, // key_a3=\EOy, @@ -1093,7 +1103,7 @@ static const int8_t putty_256colour_terminfo[] = { // user8=\E[?1;2c, // user9=\E[c, static const int8_t rxvt_256colour_terminfo[] = { - 30,2,47,0,38,0,15,0,110,1,-31,4,114,120,118,116,45,50,53,54,99,111,108,111,114,124,114,120,118,116,32,50,46,55,46,57,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,-1,-1,0,0,2,0,4,0,21,0,26,0,34,0,38,0,42,0,-1,-1,53,0,70,0,72,0,76,0,83,0,-1,-1,85,0,92,0,-1,-1,96,0,-1,-1,-1,-1,100,0,-1,-1,-1,-1,104,0,106,0,111,0,116,0,-1,-1,-1,-1,125,0,-1,-1,-1,-1,-126,0,-121,0,-116,0,-1,-1,-111,0,-109,0,-104,0,-1,-1,-91,0,-86,0,-80,0,-74,0,-1,-1,-1,-1,-56,0,-42,0,-1,-1,-1,-1,-8,0,-4,0,-1,-1,0,1,-1,-1,-1,-1,-1,-1,2,1,-1,-1,7,1,-1,-1,11,1,-1,-1,16,1,22,1,28,1,34,1,40,1,46,1,52,1,58,1,64,1,70,1,76,1,82,1,87,1,-1,-1,92,1,-1,-1,96,1,101,1,106,1,110,1,114,1,-1,-1,118,1,122,1,125,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,1,-119,1,-110,1,-1,-1,-101,1,-92,1,-83,1,-1,-1,-74,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-65,1,-32,1,-1,-1,-1,-1,18,2,21,2,32,2,35,2,37,2,40,2,107,2,-1,-1,110,2,-1,-1,-1,-1,-1,-1,-1,-1,112,2,116,2,120,2,124,2,-128,2,-1,-1,-1,-1,-124,2,-1,-1,-73,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-69,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-62,2,-57,2,-1,-1,-53,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-48,2,-1,-1,-43,2,-38,2,-1,-1,-1,-1,-1,-1,-1,-1,-33,2,-28,2,-23,2,-1,-1,-1,-1,-19,2,-1,-1,-14,2,-1,-1,-1,-1,-1,-1,-9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-5,2,1,3,7,3,13,3,19,3,25,3,31,3,37,3,43,3,49,3,55,3,61,3,67,3,73,3,79,3,85,3,91,3,97,3,103,3,109,3,115,3,121,3,127,3,-123,3,-117,3,-111,3,-105,3,-99,3,-93,3,-87,3,-81,3,-75,3,-69,3,-63,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-57,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-52,3,-41,3,-36,3,-28,3,-24,3,-15,3,-8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,86,4,-1,-1,-1,-1,-1,-1,90,4,-103,4,-1,-1,-1,-1,-1,-1,-39,4,-35,4,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,63,52,55,108,27,61,27,91,63,49,108,0,27,91,114,27,91,109,27,91,50,74,27,91,72,27,91,63,55,104,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,0,27,91,64,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,56,94,0,27,91,50,49,126,0,27,91,49,49,126,0,27,91,50,49,126,0,27,91,49,50,126,0,27,91,49,51,126,0,27,91,49,52,126,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,55,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,97,0,27,91,98,0,27,91,65,0,27,62,0,27,61,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,62,27,91,49,59,51,59,52,59,53,59,54,108,27,91,63,55,104,27,91,109,27,91,114,27,91,50,74,27,91,72,0,27,91,114,27,91,109,27,91,50,74,27,91,72,27,91,63,55,104,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,79,119,0,27,79,121,0,27,79,117,0,27,79,113,0,27,79,115,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,56,126,0,27,79,77,0,27,91,49,126,0,27,91,51,36,0,27,91,52,126,0,27,91,56,36,0,27,91,55,36,0,27,91,50,36,0,27,91,100,0,27,91,54,36,0,27,91,53,36,0,27,91,99,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,40,66,0,27,40,48,0,0,2,0,0,0,25,0,52,0,-27,0,1,1,-1,-1,-1,-1,0,0,5,0,10,0,14,0,18,0,23,0,28,0,33,0,38,0,43,0,48,0,52,0,57,0,62,0,67,0,72,0,76,0,80,0,84,0,88,0,92,0,96,0,-1,-1,0,0,3,0,6,0,9,0,12,0,17,0,22,0,26,0,31,0,37,0,43,0,49,0,55,0,60,0,65,0,71,0,77,0,83,0,89,0,95,0,101,0,105,0,110,0,114,0,118,0,122,0,126,0,27,91,51,94,0,27,91,51,64,0,27,91,98,0,27,79,98,0,27,91,56,94,0,27,91,56,64,0,27,91,55,94,0,27,91,55,64,0,27,91,50,94,0,27,91,50,64,0,27,79,100,0,27,91,54,94,0,27,91,54,64,0,27,91,53,94,0,27,91,53,64,0,27,79,99,0,27,91,97,0,27,79,97,0,27,79,120,0,27,79,116,0,27,79,118,0,27,79,114,0,65,88,0,88,84,0,84,83,0,88,77,0,107,68,67,53,0,107,68,67,54,0,107,68,78,0,107,68,78,53,0,107,69,78,68,53,0,107,69,78,68,54,0,107,72,79,77,53,0,107,72,79,77,54,0,107,73,67,53,0,107,73,67,54,0,107,76,70,84,53,0,107,78,88,84,53,0,107,78,88,84,54,0,107,80,82,86,53,0,107,80,82,86,54,0,107,82,73,84,53,0,107,85,80,0,107,85,80,53,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT + 30,2,47,0,38,0,15,0,110,1,-35,4,114,120,118,116,45,50,53,54,99,111,108,111,114,124,114,120,118,116,32,50,46,55,46,57,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,-1,-1,0,0,2,0,4,0,21,0,26,0,34,0,38,0,42,0,-1,-1,53,0,70,0,72,0,76,0,83,0,-1,-1,85,0,92,0,-1,-1,96,0,-1,-1,-1,-1,100,0,-1,-1,-1,-1,104,0,106,0,111,0,116,0,-1,-1,-1,-1,125,0,-1,-1,-1,-1,-126,0,-121,0,-116,0,-1,-1,-111,0,-109,0,-104,0,-1,-1,-91,0,-86,0,-80,0,-74,0,-1,-1,-1,-1,-56,0,-42,0,-1,-1,-1,-1,-1,-1,-8,0,-1,-1,-4,0,-1,-1,-1,-1,-1,-1,-2,0,-1,-1,3,1,-1,-1,7,1,-1,-1,12,1,18,1,24,1,30,1,36,1,42,1,48,1,54,1,60,1,66,1,72,1,78,1,83,1,-1,-1,88,1,-1,-1,92,1,97,1,102,1,106,1,110,1,-1,-1,114,1,118,1,121,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,124,1,-123,1,-114,1,-1,-1,-105,1,-96,1,-87,1,-1,-1,-78,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-69,1,-36,1,-1,-1,-1,-1,14,2,17,2,28,2,31,2,33,2,36,2,103,2,-1,-1,106,2,-1,-1,-1,-1,-1,-1,-1,-1,108,2,112,2,116,2,120,2,124,2,-1,-1,-1,-1,-128,2,-1,-1,-77,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-73,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-66,2,-61,2,-1,-1,-57,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-52,2,-1,-1,-47,2,-42,2,-1,-1,-1,-1,-1,-1,-1,-1,-37,2,-32,2,-27,2,-1,-1,-1,-1,-23,2,-1,-1,-18,2,-1,-1,-1,-1,-1,-1,-13,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-9,2,-3,2,3,3,9,3,15,3,21,3,27,3,33,3,39,3,45,3,51,3,57,3,63,3,69,3,75,3,81,3,87,3,93,3,99,3,105,3,111,3,117,3,123,3,-127,3,-121,3,-115,3,-109,3,-103,3,-97,3,-91,3,-85,3,-79,3,-73,3,-67,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-61,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-56,3,-45,3,-40,3,-32,3,-28,3,-19,3,-12,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,82,4,-1,-1,-1,-1,-1,-1,86,4,-107,4,-1,-1,-1,-1,-1,-1,-43,4,-39,4,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,52,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,63,52,55,108,27,61,27,91,63,49,108,0,27,91,114,27,91,109,27,91,50,74,27,91,72,27,91,63,55,104,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,56,94,0,27,91,50,49,126,0,27,91,49,49,126,0,27,91,50,49,126,0,27,91,49,50,126,0,27,91,49,51,126,0,27,91,49,52,126,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,55,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,97,0,27,91,98,0,27,91,65,0,27,62,0,27,61,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,62,27,91,49,59,51,59,52,59,53,59,54,108,27,91,63,55,104,27,91,109,27,91,114,27,91,50,74,27,91,72,0,27,91,114,27,91,109,27,91,50,74,27,91,72,27,91,63,55,104,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,79,119,0,27,79,121,0,27,79,117,0,27,79,113,0,27,79,115,0,96,96,97,97,102,102,103,103,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,56,126,0,27,79,77,0,27,91,49,126,0,27,91,51,36,0,27,91,52,126,0,27,91,56,36,0,27,91,55,36,0,27,91,50,36,0,27,91,100,0,27,91,54,36,0,27,91,53,36,0,27,91,99,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,40,66,0,27,40,48,0,0,2,0,0,0,22,0,46,0,-36,0,1,1,0,0,5,0,10,0,14,0,18,0,23,0,28,0,33,0,38,0,43,0,48,0,52,0,57,0,62,0,67,0,72,0,76,0,80,0,84,0,88,0,92,0,96,0,0,0,3,0,6,0,11,0,16,0,20,0,25,0,31,0,37,0,43,0,49,0,54,0,59,0,65,0,71,0,77,0,83,0,89,0,95,0,99,0,104,0,108,0,112,0,116,0,27,91,51,94,0,27,91,51,64,0,27,91,98,0,27,79,98,0,27,91,56,94,0,27,91,56,64,0,27,91,55,94,0,27,91,55,64,0,27,91,50,94,0,27,91,50,64,0,27,79,100,0,27,91,54,94,0,27,91,54,64,0,27,91,53,94,0,27,91,53,64,0,27,79,99,0,27,91,97,0,27,79,97,0,27,79,120,0,27,79,116,0,27,79,118,0,27,79,114,0,65,88,0,88,84,0,107,68,67,53,0,107,68,67,54,0,107,68,78,0,107,68,78,53,0,107,69,78,68,53,0,107,69,78,68,54,0,107,72,79,77,53,0,107,72,79,77,54,0,107,73,67,53,0,107,73,67,54,0,107,76,70,84,53,0,107,78,88,84,53,0,107,78,88,84,54,0,107,80,82,86,53,0,107,80,82,86,54,0,107,82,73,84,53,0,107,85,80,0,107,85,80,53,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0 }; // screen-256color|GNU Screen with 256 colors, @@ -1187,6 +1197,7 @@ static const int8_t rxvt_256colour_terminfo[] = { // parm_insert_line=\E[%p1%dL, // parm_left_cursor=\E[%p1%dD, // parm_right_cursor=\E[%p1%dC, +// parm_rindex=\E[%p1%dT, // parm_up_cursor=\E[%p1%dA, // reset_2string=\Ec\E[?1000l\E[?25h, // restore_cursor=\E8, @@ -1199,13 +1210,18 @@ static const int8_t rxvt_256colour_terminfo[] = { // set_attributes=\E[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t^N%e^O%;, // set_tab=\EH, // tab=^I, +// user6=\E[%i%d;%dR, +// user7=\E[6n, +// user8=\E[?1;2c, +// user9=\E[c, static const int8_t screen_256colour_terminfo[] = { - 30,2,43,0,43,0,15,0,105,1,4,3,115,99,114,101,101,110,45,50,53,54,99,111,108,111,114,124,71,78,85,32,83,99,114,101,101,110,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,100,0,-1,-1,104,0,107,0,113,0,117,0,-1,-1,-1,-1,121,0,123,0,-128,0,-123,0,-1,-1,-114,0,-109,0,-1,-1,-1,-1,-104,0,-99,0,-94,0,-1,-1,-89,0,-87,0,-82,0,-1,-1,-73,0,-68,0,-62,0,-56,0,-1,-1,-1,-1,-1,-1,-53,0,-1,-1,-1,-1,-1,-1,-49,0,-1,-1,-45,0,-1,-1,-1,-1,-1,-1,-43,0,-1,-1,-38,0,-1,-1,-1,-1,-1,-1,-1,-1,-34,0,-30,0,-24,0,-20,0,-16,0,-12,0,-6,0,0,1,6,1,12,1,18,1,23,1,-1,-1,28,1,-1,-1,32,1,37,1,42,1,-1,-1,-1,-1,-1,-1,46,1,50,1,58,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,1,-1,-1,69,1,78,1,87,1,96,1,105,1,114,1,123,1,-124,1,-1,-1,-115,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-106,1,-1,-1,-1,-1,-89,1,-86,1,-75,1,-72,1,-70,1,-67,1,17,2,-1,-1,20,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,22,2,-1,-1,87,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,98,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,103,2,109,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,120,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-127,2,-1,-1,-1,-1,-1,-1,-123,2,-60,2,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,51,52,104,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,51,52,108,0,27,91,80,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,51,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,51,109,0,27,91,50,52,109,0,27,103,0,27,41,48,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,49,37,116,59,51,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,52,126,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,3,0,1,0,33,0,70,0,-71,0,1,1,0,0,1,0,0,0,0,0,4,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,29,0,34,0,39,0,44,0,49,0,53,0,58,0,63,0,68,0,73,0,78,0,84,0,90,0,96,0,102,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-102,0,-98,0,-94,0,-90,0,-86,0,27,40,66,0,27,40,37,112,49,37,99,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,83,48,0,84,83,0,88,77,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,53,0,107,72,79,77,53,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,120,109,0 // NOLINT + 30,2,43,0,43,0,15,0,105,1,41,3,115,99,114,101,101,110,45,50,53,54,99,111,108,111,114,124,71,78,85,32,83,99,114,101,101,110,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,100,0,-1,-1,104,0,107,0,113,0,117,0,-1,-1,-1,-1,121,0,123,0,-128,0,-123,0,-1,-1,-114,0,-109,0,-1,-1,-1,-1,-104,0,-99,0,-94,0,-1,-1,-89,0,-87,0,-82,0,-1,-1,-73,0,-68,0,-62,0,-56,0,-1,-1,-1,-1,-1,-1,-53,0,-1,-1,-1,-1,-1,-1,-49,0,-1,-1,-45,0,-1,-1,-1,-1,-1,-1,-43,0,-1,-1,-38,0,-1,-1,-1,-1,-1,-1,-1,-1,-34,0,-30,0,-24,0,-20,0,-16,0,-12,0,-6,0,0,1,6,1,12,1,18,1,23,1,-1,-1,28,1,-1,-1,32,1,37,1,42,1,-1,-1,-1,-1,-1,-1,46,1,50,1,58,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,1,-1,-1,69,1,78,1,87,1,96,1,105,1,114,1,123,1,-124,1,-115,1,-106,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-97,1,-1,-1,-1,-1,-80,1,-77,1,-66,1,-63,1,-61,1,-58,1,26,2,-1,-1,29,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,31,2,-1,-1,96,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,100,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,107,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,112,2,118,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,124,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-127,2,-116,2,-111,2,-103,2,-99,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-90,2,-1,-1,-1,-1,-1,-1,-86,2,-23,2,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,51,52,104,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,51,52,108,0,27,91,80,0,27,91,77,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,55,109,0,27,91,51,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,51,109,0,27,91,50,52,109,0,27,103,0,27,41,48,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,99,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,49,37,116,59,51,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,52,126,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,2,0,1,0,2,0,7,0,27,0,1,1,1,0,0,0,0,0,4,0,0,0,3,0,6,0,9,0,12,0,27,40,66,0,27,40,37,112,49,37,99,0,65,88,0,71,48,0,85,56,0,69,48,0,83,48,0 }; // st-256color|stterm-256color|simpleterm with 256 colors, // auto_right_margin, // back_color_erase, +// can_change, // eat_newline_glitch, // has_status_line, // move_insert_mode, @@ -1232,10 +1248,9 @@ static const int8_t screen_256colour_terminfo[] = { // cursor_home=\E[H, // cursor_invisible=\E[?25l, // cursor_left=^H, -// cursor_normal=\E[?12l\E[?25h, +// cursor_normal=\E[?25h, // cursor_right=\E[C, // cursor_up=\E[A, -// cursor_visible=\E[?25h, // delete_character=\E[P, // delete_line=\E[M, // dis_status_line=\E]0;^G, @@ -1262,7 +1277,7 @@ static const int8_t screen_256colour_terminfo[] = { // flash_screen=\E[?5h$<100/>\E[?5l, // from_status_line=^G, // init_2string=\E[4l\E>\E[?1034l, -// initialize_color@, +// initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\, // insert_line=\E[L, // key_a1=\E[1~, // key_a3=\E[5~, @@ -1362,7 +1377,7 @@ static const int8_t screen_256colour_terminfo[] = { // key_up=\EOA, // keypad_local=\E[?1l\E>, // keypad_xmit=\E[?1h\E=, -// orig_colors@, +// orig_colors=\E]104^G, // orig_pair=\E[39;49m, // parm_dch=\E[%p1%dP, // parm_delete_line=\E[%p1%dM, @@ -1372,6 +1387,7 @@ static const int8_t screen_256colour_terminfo[] = { // parm_insert_line=\E[%p1%dL, // parm_left_cursor=\E[%p1%dD, // parm_right_cursor=\E[%p1%dC, +// parm_rindex=\E[%p1%dT, // parm_up_cursor=\E[%p1%dA, // print_screen=\E[i, // prtr_off=\E[4i, @@ -1394,7 +1410,7 @@ static const int8_t screen_256colour_terminfo[] = { // user8=\E[?1;2c, // user9=\E[c, static const int8_t st_256colour_terminfo[] = { - 30,2,55,0,29,0,15,0,105,1,-125,5,115,116,45,50,53,54,99,111,108,111,114,124,115,116,116,101,114,109,45,50,53,54,99,111,108,111,114,124,115,105,109,112,108,101,116,101,114,109,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,102,0,-1,-1,106,0,110,0,117,0,121,0,125,0,-1,-1,-125,0,-121,0,-116,0,-111,0,-1,-1,-102,0,-97,0,-92,0,-1,-1,-87,0,-82,0,-77,0,-72,0,-63,0,-59,0,-54,0,-1,-1,-45,0,-40,0,-34,0,-28,0,-1,-1,-10,0,-1,-1,-8,0,-1,-1,-1,-1,-1,-1,7,1,-1,-1,11,1,-1,-1,13,1,-1,-1,20,1,25,1,32,1,36,1,43,1,50,1,-1,-1,57,1,61,1,67,1,71,1,75,1,79,1,85,1,91,1,97,1,103,1,109,1,114,1,119,1,126,1,-1,-1,-126,1,-121,1,-116,1,-112,1,-105,1,-1,-1,-98,1,-94,1,-86,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-78,1,-69,1,-60,1,-51,1,-42,1,-33,1,-24,1,-15,1,-1,-1,-6,1,-1,-1,-1,-1,-1,-1,3,2,7,2,12,2,-1,-1,17,2,20,2,-1,-1,-1,-1,35,2,38,2,49,2,52,2,54,2,57,2,-106,2,-1,-1,-103,2,-101,2,-1,-1,-1,-1,-1,-1,-96,2,-91,2,-86,2,-82,2,-77,2,-1,-1,-1,-1,-72,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-7,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,-1,-1,-1,-1,9,3,-1,-1,-1,-1,-1,-1,-1,-1,16,3,23,3,30,3,-1,-1,-1,-1,37,3,-1,-1,44,3,-1,-1,-1,-1,-1,-1,51,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,58,3,64,3,70,3,77,3,84,3,91,3,98,3,106,3,114,3,122,3,-126,3,-118,3,-110,3,-102,3,-94,3,-87,3,-80,3,-73,3,-66,3,-58,3,-50,3,-42,3,-34,3,-26,3,-18,3,-10,3,-2,3,5,4,12,4,19,4,26,4,34,4,42,4,50,4,58,4,66,4,74,4,82,4,90,4,97,4,104,4,111,4,118,4,126,4,-122,4,-114,4,-106,4,-98,4,-90,4,-82,4,-74,4,-67,4,-60,4,-53,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-48,4,-37,4,-32,4,-24,4,-20,4,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-11,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-6,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,5,-1,-1,-1,-1,-1,-1,4,5,67,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,63,50,53,104,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,27,40,48,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,7,0,27,91,52,108,27,62,27,91,63,49,48,51,52,108,0,27,91,76,0,127,0,27,91,51,59,53,126,0,27,91,51,126,0,27,91,51,59,50,126,0,27,79,66,0,27,91,50,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,53,70,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,50,59,53,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,91,105,0,27,91,52,105,0,27,91,53,105,0,27,99,0,27,91,52,108,27,62,27,91,63,49,48,51,52,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,37,63,37,112,57,37,116,27,40,48,37,101,27,40,66,37,59,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,109,0,27,72,0,9,0,27,93,48,59,0,27,91,49,126,0,27,91,53,126,0,27,79,117,0,27,91,52,126,0,27,91,54,126,0,43,67,44,68,45,65,46,66,48,69,96,96,97,97,102,102,103,103,104,70,105,71,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,41,48,0,27,91,52,126,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,3,0,1,0,71,0,-110,0,-1,1,0,0,1,0,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,-1,18,0,24,0,34,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,39,0,-1,-1,46,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,53,0,-1,-1,60,0,-1,-1,-1,-1,67,0,-1,-1,74,0,-1,-1,-1,-1,81,0,-1,-1,88,0,-1,-1,-1,-1,95,0,-1,-1,102,0,-1,-1,-1,-1,-1,-1,109,0,-1,-1,116,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,123,0,-127,0,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,42,0,48,0,53,0,58,0,63,0,68,0,73,0,77,0,82,0,87,0,92,0,97,0,102,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-77,0,-72,0,-67,0,-62,0,-57,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,67,1,72,1,77,1,82,1,87,1,92,1,96,1,100,1,104,1,108,1,113,1,118,1,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,93,48,59,0,27,91,49,59,51,66,0,27,91,49,59,53,66,0,27,91,49,59,51,68,0,27,91,49,59,53,68,0,27,91,54,59,51,126,0,27,91,54,59,53,126,0,27,91,53,59,51,126,0,27,91,53,59,53,126,0,27,91,49,59,51,67,0,27,91,49,59,53,67,0,27,91,49,59,51,65,0,27,91,49,59,53,65,0,27,91,50,57,109,0,27,91,57,109,0,65,88,0,71,48,0,88,84,0,85,56,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,55,0,29,0,15,0,105,1,-28,5,115,116,45,50,53,54,99,111,108,111,114,124,115,116,116,101,114,109,45,50,53,54,99,111,108,111,114,124,115,105,109,112,108,101,116,101,114,109,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,104,0,108,0,112,0,-1,-1,118,0,122,0,127,0,-124,0,-1,-1,-115,0,-110,0,-105,0,-1,-1,-100,0,-95,0,-90,0,-85,0,-76,0,-72,0,-67,0,-1,-1,-58,0,-53,0,-47,0,-41,0,-1,-1,-23,0,-1,-1,-21,0,-1,-1,-1,-1,-1,-1,-6,0,-1,-1,-2,0,-1,-1,0,1,-1,-1,7,1,12,1,19,1,23,1,30,1,37,1,-1,-1,44,1,48,1,54,1,58,1,62,1,66,1,72,1,78,1,84,1,90,1,96,1,101,1,106,1,113,1,-1,-1,117,1,122,1,127,1,-125,1,-118,1,-1,-1,-111,1,-107,1,-99,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-91,1,-82,1,-73,1,-64,1,-55,1,-46,1,-37,1,-28,1,-19,1,-10,1,-1,-1,-1,-1,-1,-1,-1,1,3,2,8,2,-1,-1,13,2,16,2,-1,-1,-1,-1,31,2,34,2,45,2,48,2,50,2,53,2,-110,2,-1,-1,-107,2,-105,2,-1,-1,-1,-1,-1,-1,-100,2,-95,2,-90,2,-86,2,-81,2,-1,-1,-1,-1,-76,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-7,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,2,-1,-1,-1,-1,5,3,-1,-1,-1,-1,-1,-1,-1,-1,12,3,19,3,26,3,-1,-1,-1,-1,33,3,-1,-1,40,3,-1,-1,-1,-1,-1,-1,47,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,54,3,60,3,66,3,73,3,80,3,87,3,94,3,102,3,110,3,118,3,126,3,-122,3,-114,3,-106,3,-98,3,-91,3,-84,3,-77,3,-70,3,-62,3,-54,3,-46,3,-38,3,-30,3,-22,3,-14,3,-6,3,1,4,8,4,15,4,22,4,30,4,38,4,46,4,54,4,62,4,70,4,78,4,86,4,93,4,100,4,107,4,114,4,122,4,-126,4,-118,4,-110,4,-102,4,-94,4,-86,4,-78,4,-71,4,-64,4,-57,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-52,4,-41,4,-36,4,-28,4,-24,4,-15,4,-8,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,86,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,97,5,-1,-1,-1,-1,-1,-1,101,5,-92,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,27,40,48,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,7,0,27,91,52,108,27,62,27,91,63,49,48,51,52,108,0,27,91,76,0,127,0,27,91,51,59,53,126,0,27,91,51,126,0,27,91,51,59,50,126,0,27,79,66,0,27,91,50,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,53,70,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,50,59,53,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,105,0,27,91,52,105,0,27,91,53,105,0,27,99,0,27,91,52,108,27,62,27,91,63,49,48,51,52,108,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,37,63,37,112,57,37,116,27,40,48,37,101,27,40,66,37,59,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,109,0,27,72,0,9,0,27,93,48,59,0,27,91,49,126,0,27,91,53,126,0,27,79,117,0,27,91,52,126,0,27,91,54,126,0,43,67,44,68,45,65,46,66,48,69,96,96,97,97,102,102,103,103,104,70,105,71,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,41,48,0,27,91,52,126,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,1,0,0,0,18,0,37,0,-29,0,1,0,0,0,18,0,24,0,34,0,39,0,46,0,53,0,60,0,67,0,74,0,81,0,88,0,95,0,102,0,109,0,116,0,123,0,-127,0,0,0,3,0,6,0,9,0,12,0,15,0,20,0,25,0,31,0,37,0,43,0,49,0,55,0,61,0,67,0,73,0,78,0,83,0,88,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,93,48,59,0,27,91,49,59,51,66,0,27,91,49,59,53,66,0,27,91,49,59,51,68,0,27,91,49,59,53,68,0,27,91,54,59,51,126,0,27,91,54,59,53,126,0,27,91,53,59,51,126,0,27,91,53,59,53,126,0,27,91,49,59,51,67,0,27,91,49,59,53,67,0,27,91,49,59,51,65,0,27,91,49,59,53,65,0,27,91,50,57,109,0,27,91,57,109,0,88,84,0,77,115,0,83,101,0,83,115,0,84,83,0,107,68,78,51,0,107,68,78,53,0,107,76,70,84,51,0,107,76,70,84,53,0,107,78,88,84,51,0,107,78,88,84,53,0,107,80,82,86,51,0,107,80,82,86,53,0,107,82,73,84,51,0,107,82,73,84,53,0,107,85,80,51,0,107,85,80,53,0,114,109,120,120,0,115,109,120,120,0 }; // tmux-256color|tmux with 256 colors, @@ -1457,7 +1473,7 @@ static const int8_t st_256colour_terminfo[] = { // from_status_line=^G, // init_2string=\E)0, // insert_line=\E[L, -// key_backspace=^H, +// key_backspace=\177, // key_btab=\E[Z, // key_dc=\E[3~, // key_down=\EOB, @@ -1568,8 +1584,12 @@ static const int8_t st_256colour_terminfo[] = { // set_tab=\EH, // tab=^I, // to_status_line=\E]0;, +// user6=\E[%i%d;%dR, +// user7=\E[6n, +// user8=\E[?1;2c, +// user9=\E[c, static const int8_t tmux_256colour_terminfo[] = { - 30,2,35,0,43,0,15,0,105,1,-15,4,116,109,117,120,45,50,53,54,99,111,108,111,114,124,116,109,117,120,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,100,0,-1,-1,104,0,107,0,113,0,117,0,121,0,-1,-1,127,0,-127,0,-122,0,-117,0,-1,-1,-108,0,-103,0,-98,0,-1,-1,-93,0,-88,0,-83,0,-1,-1,-78,0,-76,0,-71,0,-1,-1,-62,0,-57,0,-51,0,-45,0,-1,-1,-42,0,-1,-1,-40,0,-1,-1,-1,-1,-1,-1,-36,0,-1,-1,-32,0,-1,-1,-1,-1,-1,-1,-30,0,-1,-1,-25,0,-1,-1,-1,-1,-1,-1,-1,-1,-21,0,-17,0,-11,0,-7,0,-3,0,1,1,7,1,13,1,19,1,25,1,31,1,36,1,-1,-1,41,1,-1,-1,45,1,50,1,55,1,59,1,66,1,-1,-1,73,1,77,1,85,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,93,1,-1,-1,96,1,105,1,114,1,123,1,-124,1,-115,1,-106,1,-97,1,-1,-1,-88,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,1,-1,-1,-1,-1,-62,1,-59,1,-48,1,-45,1,-43,1,-40,1,49,2,-1,-1,52,2,54,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,2,-1,-1,124,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-121,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-116,2,-1,-1,-1,-1,-109,2,-1,-1,-1,-1,-1,-1,-1,-1,-102,2,-95,2,-88,2,-1,-1,-1,-1,-81,2,-1,-1,-74,2,-1,-1,-1,-1,-1,-1,-67,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-60,2,-54,2,-48,2,-41,2,-34,2,-27,2,-20,2,-12,2,-4,2,4,3,12,3,20,3,28,3,36,3,44,3,51,3,58,3,65,3,72,3,80,3,88,3,96,3,104,3,112,3,120,3,-128,3,-120,3,-113,3,-106,3,-99,3,-92,3,-84,3,-76,3,-68,3,-60,3,-52,3,-44,3,-36,3,-28,3,-21,3,-14,3,-7,3,0,4,8,4,16,4,24,4,32,4,40,4,48,4,56,4,64,4,71,4,78,4,85,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,90,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,99,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,104,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,110,4,-1,-1,-1,-1,-1,-1,114,4,-79,4,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,51,52,104,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,51,52,108,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,103,0,7,0,27,41,48,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,48,59,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,52,126,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,3,0,1,0,73,0,-106,0,65,3,1,1,0,0,1,0,0,0,0,0,7,0,19,0,23,0,28,0,46,0,54,0,60,0,70,0,-1,-1,-1,-1,-1,-1,75,0,82,0,89,0,96,0,103,0,110,0,117,0,124,0,-125,0,-118,0,-111,0,-104,0,-97,0,-90,0,-83,0,-76,0,-1,-1,-69,0,-62,0,-55,0,-48,0,-41,0,-1,-1,-34,0,-27,0,-20,0,-13,0,-6,0,1,1,8,1,15,1,22,1,29,1,36,1,43,1,50,1,57,1,64,1,71,1,78,1,85,1,92,1,99,1,106,1,113,1,120,1,127,1,-122,1,-115,1,-108,1,-101,1,-94,1,-87,1,-80,1,-1,-1,-1,-1,-1,-1,-1,-1,-73,1,-67,1,-1,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,39,0,42,0,48,0,54,0,59,0,64,0,69,0,74,0,79,0,83,0,88,0,93,0,98,0,103,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-71,0,-66,0,-61,0,-56,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,73,1,78,1,83,1,88,1,93,1,98,1,102,1,106,1,110,1,114,1,119,1,124,1,27,93,49,49,50,7,0,27,93,49,50,59,37,112,49,37,115,7,0,27,40,66,0,27,91,51,74,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,40,37,112,49,37,99,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,93,48,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,35,0,43,0,15,0,105,1,13,5,116,109,117,120,45,50,53,54,99,111,108,111,114,124,116,109,117,120,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,37,0,41,0,45,0,-1,-1,56,0,73,0,75,0,79,0,86,0,-1,-1,88,0,100,0,-1,-1,104,0,107,0,113,0,117,0,121,0,-1,-1,127,0,-127,0,-122,0,-117,0,-1,-1,-108,0,-103,0,-98,0,-1,-1,-93,0,-88,0,-83,0,-1,-1,-78,0,-76,0,-71,0,-1,-1,-62,0,-57,0,-51,0,-45,0,-1,-1,-42,0,-1,-1,-40,0,-1,-1,-1,-1,-1,-1,-36,0,-1,-1,-32,0,-1,-1,-1,-1,-1,-1,-30,0,-1,-1,-25,0,-1,-1,-1,-1,-1,-1,-1,-1,-21,0,-17,0,-11,0,-7,0,-3,0,1,1,7,1,13,1,19,1,25,1,31,1,36,1,-1,-1,41,1,-1,-1,45,1,50,1,55,1,59,1,66,1,-1,-1,73,1,77,1,85,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,93,1,-1,-1,96,1,105,1,114,1,123,1,-124,1,-115,1,-106,1,-97,1,-1,-1,-88,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-79,1,-1,-1,-1,-1,-62,1,-59,1,-48,1,-45,1,-43,1,-40,1,49,2,-1,-1,52,2,54,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,2,-1,-1,124,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-121,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-116,2,-1,-1,-1,-1,-109,2,-1,-1,-1,-1,-1,-1,-1,-1,-102,2,-95,2,-88,2,-1,-1,-1,-1,-81,2,-1,-1,-74,2,-1,-1,-1,-1,-1,-1,-67,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-60,2,-54,2,-48,2,-41,2,-34,2,-27,2,-20,2,-12,2,-4,2,4,3,12,3,20,3,28,3,36,3,44,3,51,3,58,3,65,3,72,3,80,3,88,3,96,3,104,3,112,3,120,3,-128,3,-120,3,-113,3,-106,3,-99,3,-92,3,-84,3,-76,3,-68,3,-60,3,-52,3,-44,3,-36,3,-28,3,-21,3,-14,3,-7,3,0,4,8,4,16,4,24,4,32,4,40,4,48,4,56,4,64,4,71,4,78,4,85,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,90,4,101,4,106,4,114,4,118,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,127,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-124,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-118,4,-1,-1,-1,-1,-1,-1,-114,4,-51,4,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,51,52,104,27,91,63,50,53,104,0,27,91,67,0,27,77,0,27,91,51,52,108,0,27,91,80,0,27,91,77,0,27,93,48,59,7,0,14,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,15,0,27,91,109,15,0,27,91,63,49,48,52,57,108,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,103,0,7,0,27,41,48,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,99,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,93,48,59,0,43,43,44,44,45,45,46,46,48,48,96,96,97,97,102,102,103,103,104,104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,40,66,27,41,48,0,27,91,52,126,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,49,59,50,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,91,51,109,0,27,91,50,51,109,0,27,91,77,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,2,0,1,0,64,0,-125,0,33,3,1,1,1,0,0,0,0,0,7,0,19,0,23,0,28,0,46,0,54,0,60,0,71,0,81,0,86,0,93,0,100,0,107,0,114,0,121,0,-128,0,-121,0,-114,0,-107,0,-100,0,-93,0,-86,0,-79,0,-72,0,-65,0,-58,0,-51,0,-44,0,-37,0,-30,0,-23,0,-16,0,-9,0,-2,0,5,1,12,1,19,1,26,1,33,1,40,1,47,1,54,1,61,1,68,1,75,1,82,1,89,1,96,1,103,1,110,1,117,1,124,1,-125,1,-118,1,-111,1,-104,1,-97,1,-90,1,-83,1,-76,1,-69,1,-62,1,-56,1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,36,0,39,0,42,0,47,0,52,0,57,0,62,0,67,0,71,0,76,0,81,0,86,0,91,0,96,0,102,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-95,0,-90,0,-85,0,-80,0,-75,0,-69,0,-63,0,-57,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,49,1,54,1,59,1,64,1,69,1,74,1,79,1,27,93,49,49,50,7,0,27,93,49,50,59,37,112,49,37,115,7,0,27,40,66,0,27,91,51,74,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,40,37,112,49,37,99,0,27,91,50,32,113,0,27,91,52,58,37,112,49,37,100,109,0,27,91,37,112,49,37,100,32,113,0,27,93,48,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,65,88,0,71,48,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,109,117,108,120,0,83,115,0,84,83,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,114,109,120,120,0,115,109,120,120,0 }; // vte-256color|VTE with xterm 256-colors, @@ -1754,7 +1774,7 @@ static const int8_t tmux_256colour_terminfo[] = { // user8=\E[?%[;0123456789]c, // user9=\E[c, static const int8_t vte_256colour_terminfo[] = { - 30,2,39,0,38,0,15,0,-99,1,-49,5,118,116,101,45,50,53,54,99,111,108,111,114,124,86,84,69,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,104,0,108,0,-1,-1,-1,-1,112,0,-1,-1,114,0,119,0,-1,-1,-128,0,-123,0,-118,0,-1,-1,-113,0,-108,0,-103,0,-98,0,-89,0,-87,0,-81,0,-1,-1,-68,0,-63,0,-57,0,-51,0,-1,-1,-1,-1,-1,-1,-33,0,-1,-1,-1,-1,-1,-1,0,1,-1,-1,4,1,-1,-1,-1,-1,-1,-1,6,1,-1,-1,11,1,-1,-1,-1,-1,-1,-1,-1,-1,15,1,19,1,25,1,29,1,33,1,37,1,43,1,49,1,55,1,61,1,67,1,71,1,-1,-1,76,1,-1,-1,80,1,85,1,90,1,94,1,101,1,-1,-1,108,1,112,1,120,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,1,-119,1,-110,1,-101,1,-92,1,-83,1,-74,1,-65,1,-56,1,-47,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-38,1,-35,1,-1,-1,-1,-1,16,2,19,2,30,2,33,2,35,2,38,2,116,2,-1,-1,119,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,121,2,-1,-1,-1,-1,-1,-1,-1,-1,125,2,-1,-1,-78,2,-1,-1,-1,-1,-74,2,-68,2,-1,-1,-1,-1,-62,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,2,-54,2,-1,-1,-50,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-45,2,-1,-1,-38,2,-33,2,-1,-1,-1,-1,-1,-1,-1,-1,-26,2,-19,2,-12,2,-1,-1,-1,-1,-5,2,-1,-1,2,3,-1,-1,-1,-1,-1,-1,9,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,3,22,3,28,3,35,3,42,3,49,3,56,3,64,3,72,3,80,3,88,3,96,3,104,3,112,3,120,3,127,3,-122,3,-115,3,-108,3,-100,3,-92,3,-84,3,-76,3,-68,3,-60,3,-52,3,-44,3,-37,3,-30,3,-23,3,-16,3,-8,3,0,4,8,4,16,4,24,4,32,4,40,4,48,4,55,4,62,4,69,4,76,4,84,4,92,4,100,4,108,4,116,4,124,4,-124,4,-116,4,-109,4,-102,4,-95,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-90,4,-79,4,-74,4,-55,4,-51,4,-42,4,-35,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,64,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,5,-1,-1,-1,-1,-1,-1,74,5,-119,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-55,5,-52,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,14,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,48,109,15,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,109,27,91,63,55,104,27,91,52,108,27,62,27,55,27,91,114,27,91,63,49,59,51,59,52,59,54,108,27,56,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,99,0,27,55,27,91,114,27,56,27,91,109,27,91,63,55,104,27,91,33,112,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,91,69,0,96,96,97,97,102,102,103,103,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,41,48,0,27,79,70,0,27,79,77,0,27,91,49,126,0,27,91,51,59,50,126,0,27,91,52,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,108,0,27,109,0,0,3,0,1,0,73,0,-106,0,57,3,0,0,1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,-1,-1,-1,32,0,39,0,46,0,53,0,60,0,67,0,74,0,81,0,88,0,95,0,102,0,109,0,116,0,123,0,-126,0,-119,0,-1,-1,-112,0,-105,0,-98,0,-91,0,-84,0,-1,-1,-77,0,-70,0,-63,0,-56,0,-49,0,-42,0,-35,0,-28,0,-21,0,-14,0,-7,0,0,1,7,1,14,1,21,1,28,1,35,1,42,1,49,1,56,1,63,1,70,1,77,1,84,1,91,1,98,1,105,1,112,1,119,1,126,1,-123,1,-1,-1,-1,-1,-1,-1,-1,-1,-116,1,-110,1,-105,1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,39,0,42,0,48,0,54,0,59,0,64,0,69,0,74,0,79,0,83,0,88,0,93,0,98,0,103,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-71,0,-66,0,-61,0,-56,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,73,1,78,1,83,1,88,1,93,1,98,1,102,1,106,1,110,1,114,1,119,1,124,1,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,27,91,60,37,112,49,37,100,59,37,112,50,37,100,59,37,112,51,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,39,0,38,0,15,0,-99,1,-49,5,118,116,101,45,50,53,54,99,111,108,111,114,124,86,84,69,32,119,105,116,104,32,120,116,101,114,109,32,50,53,54,45,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,96,0,-1,-1,100,0,-1,-1,104,0,108,0,-1,-1,-1,-1,112,0,-1,-1,114,0,119,0,-1,-1,-128,0,-123,0,-118,0,-1,-1,-113,0,-108,0,-103,0,-98,0,-89,0,-87,0,-81,0,-1,-1,-68,0,-63,0,-57,0,-51,0,-1,-1,-1,-1,-1,-1,-33,0,-1,-1,-1,-1,-1,-1,0,1,-1,-1,4,1,-1,-1,-1,-1,-1,-1,6,1,-1,-1,11,1,-1,-1,-1,-1,-1,-1,-1,-1,15,1,19,1,25,1,29,1,33,1,37,1,43,1,49,1,55,1,61,1,67,1,71,1,-1,-1,76,1,-1,-1,80,1,85,1,90,1,94,1,101,1,-1,-1,108,1,112,1,120,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-128,1,-119,1,-110,1,-101,1,-92,1,-83,1,-74,1,-65,1,-56,1,-47,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-38,1,-35,1,-1,-1,-1,-1,16,2,19,2,30,2,33,2,35,2,38,2,116,2,-1,-1,119,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,121,2,-1,-1,-1,-1,-1,-1,-1,-1,125,2,-1,-1,-78,2,-1,-1,-1,-1,-74,2,-68,2,-1,-1,-1,-1,-62,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-58,2,-54,2,-1,-1,-50,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-45,2,-1,-1,-38,2,-33,2,-1,-1,-1,-1,-1,-1,-1,-1,-26,2,-19,2,-12,2,-1,-1,-1,-1,-5,2,-1,-1,2,3,-1,-1,-1,-1,-1,-1,9,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,3,22,3,28,3,35,3,42,3,49,3,56,3,64,3,72,3,80,3,88,3,96,3,104,3,112,3,120,3,127,3,-122,3,-115,3,-108,3,-100,3,-92,3,-84,3,-76,3,-68,3,-60,3,-52,3,-44,3,-37,3,-30,3,-23,3,-16,3,-8,3,0,4,8,4,16,4,24,4,32,4,40,4,48,4,55,4,62,4,69,4,76,4,84,4,92,4,100,4,108,4,116,4,124,4,-124,4,-116,4,-109,4,-102,4,-95,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-90,4,-79,4,-74,4,-55,4,-51,4,-42,4,-35,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,64,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,5,-1,-1,-1,-1,-1,-1,74,5,-119,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-55,5,-52,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,14,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,15,0,27,91,48,109,15,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,109,27,91,63,55,104,27,91,52,108,27,62,27,55,27,91,114,27,91,63,49,59,51,59,52,59,54,108,27,56,0,27,91,76,0,127,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,99,0,27,55,27,91,114,27,56,27,91,109,27,91,63,55,104,27,91,33,112,27,91,63,49,59,51,59,52,59,54,108,27,91,52,108,27,62,27,91,63,49,48,48,48,108,27,91,63,50,53,104,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,55,37,116,59,56,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,109,37,63,37,112,57,37,116,14,37,101,15,37,59,0,27,72,0,9,0,27,91,69,0,96,96,97,97,102,102,103,103,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,41,48,0,27,79,70,0,27,79,77,0,27,91,49,126,0,27,91,51,59,50,126,0,27,91,52,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,108,0,27,109,0,0,1,0,0,0,59,0,119,0,22,3,1,0,0,0,6,0,12,0,23,0,55,0,62,0,69,0,76,0,83,0,90,0,97,0,104,0,111,0,118,0,125,0,-124,0,-117,0,-110,0,-103,0,-96,0,-89,0,-82,0,-75,0,-68,0,-61,0,-54,0,-47,0,-40,0,-33,0,-26,0,-19,0,-12,0,-5,0,2,1,9,1,16,1,23,1,30,1,37,1,44,1,51,1,58,1,65,1,72,1,79,1,86,1,93,1,100,1,107,1,114,1,121,1,-128,1,-121,1,-114,1,-107,1,-100,1,-93,1,-87,1,-82,1,0,0,3,0,8,0,13,0,19,0,22,0,27,0,32,0,37,0,42,0,47,0,51,0,56,0,61,0,66,0,71,0,76,0,82,0,88,0,94,0,100,0,106,0,112,0,118,0,124,0,-126,0,-120,0,-115,0,-110,0,-105,0,-100,0,-95,0,-89,0,-83,0,-77,0,-71,0,-65,0,-59,0,-53,0,-47,0,-41,0,-35,0,-29,0,-23,0,-17,0,-11,0,-5,0,1,1,7,1,13,1,19,1,25,1,29,1,34,1,39,1,44,1,49,1,54,1,59,1,64,1,27,91,53,53,109,0,27,91,53,51,109,0,27,91,52,58,37,112,49,37,100,109,0,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,27,91,60,37,105,37,112,51,37,100,59,37,112,49,37,100,59,37,112,50,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,88,84,0,82,109,111,108,0,83,109,111,108,0,83,109,117,108,120,0,88,77,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,114,109,120,120,0,115,109,120,120,0,120,109,0 }; // vtpcon|ANIS emulation for console virtual terminal sequence with libuv, @@ -1776,6 +1796,7 @@ static const int8_t vte_256colour_terminfo[] = { // carriage_return=\r, // change_scroll_region=\E[%i%p1%d;%p2%dr, // clear_all_tabs@, +// clear_margins=\E[?69l, // clear_screen=\E[H\E[2J, // clr_bol=\E[1K, // clr_eol=\E[K, @@ -1817,9 +1838,13 @@ static const int8_t vte_256colour_terminfo[] = { // init_2string=\E[\041p\E[?3l, // initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E, // insert_line=\E[L, +// key_a1=\EOw, +// key_a3=\EOy, // key_b2=\E[G, // key_backspace=^H, // key_btab=\E[Z, +// key_c1=\EOq, +// key_c3=\EOs, // key_dc=\E[3~, // key_down=\E[B, // key_end=\E[4~, @@ -1911,6 +1936,7 @@ static const int8_t vte_256colour_terminfo[] = { // memory_unlock@, // meta_off@, // meta_on@, +// newline=\EE, // orig_colors@, // orig_pair=\E[39;49m, // parm_dch=\E[%p1%dP, @@ -1937,6 +1963,7 @@ static const int8_t vte_256colour_terminfo[] = { // set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, // set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, // set_attributes=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m, +// set_lr_margin=\E[?69h\E[%i%p1%d;%p2%ds, // set_tab=\EH, // tab=^I, // user6@, @@ -1944,7 +1971,7 @@ static const int8_t vte_256colour_terminfo[] = { // user8@, // user9@, static const int8_t vtpcon_terminfo[] = { - 30,2,71,0,38,0,15,0,-99,1,21,4,118,116,112,99,111,110,124,65,78,73,83,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,99,111,110,115,111,108,101,32,118,105,114,116,117,97,108,32,116,101,114,109,105,110,97,108,32,115,101,113,117,101,110,99,101,32,119,105,116,104,32,108,105,98,117,118,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,-2,-1,25,0,33,0,37,0,41,0,-1,-1,52,0,69,0,73,0,77,0,84,0,-1,-1,86,0,99,0,-1,-1,103,0,-2,-1,107,0,111,0,-1,-1,-1,-1,115,0,-2,-1,119,0,124,0,-1,-1,-2,-1,-2,-1,-2,-1,-1,-1,-123,0,-118,0,-113,0,-108,0,-99,0,-95,0,-90,0,-1,-1,-2,-1,-81,0,-75,0,-2,-1,-1,-1,-1,-1,-1,-1,-69,0,-1,-1,-1,-1,-1,-1,-59,0,-1,-1,-55,0,-1,-1,-1,-1,-1,-1,-53,0,-1,-1,-48,0,-1,-1,-1,-1,-1,-1,-1,-1,-44,0,-39,0,-33,0,-28,0,-23,0,-18,0,-13,0,-7,0,-1,0,5,1,11,1,16,1,-1,-1,21,1,-1,-1,25,1,30,1,35,1,39,1,46,1,-1,-1,53,1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,57,1,66,1,75,1,84,1,93,1,102,1,111,1,120,1,-127,1,-118,1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-109,1,-2,-1,-2,-1,-1,-1,-1,-1,-89,1,-86,1,-75,1,-72,1,-70,1,-67,1,-24,1,-1,-1,-21,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-19,1,-1,-1,-1,-1,-1,-1,-1,-1,-15,1,-1,-1,8,2,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,2,17,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,21,2,-1,-1,-1,-1,28,2,-1,-1,-1,-1,-1,-1,-1,-1,35,2,42,2,49,2,-1,-1,-1,-1,56,2,-1,-1,63,2,-1,-1,-1,-1,-1,-1,70,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,77,2,83,2,89,2,95,2,101,2,107,2,113,2,119,2,125,2,-125,2,-119,2,-113,2,-107,2,-101,2,-95,2,-89,2,-83,2,-77,2,-71,2,-65,2,-59,2,-53,2,-47,2,-41,2,-35,2,-29,2,-23,2,-17,2,-11,2,-5,2,2,3,8,3,14,3,20,3,26,3,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,32,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,37,3,-2,-1,46,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-117,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-112,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-106,3,-43,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,40,48,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,33,112,27,91,63,51,108,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,91,65,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,27,72,0,9,0,27,91,71,0,106,106,107,107,108,108,109,109,110,110,113,113,116,116,117,117,118,118,119,119,120,120,0,27,91,90,0,27,91,52,126,0,27,79,77,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,49,59,54,83,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,0,27,91,51,109,0,27,91,50,51,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,0,3,0,1,0,74,0,-104,0,-95,1,1,0,1,0,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,0,0,-2,-1,-1,-1,5,0,-1,-1,11,0,-1,-1,-2,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,21,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,39,0,42,0,45,0,48,0,54,0,60,0,65,0,70,0,75,0,80,0,85,0,89,0,94,0,99,0,104,0,109,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-70,0,-65,0,-60,0,-55,0,-50,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,75,1,79,1,84,1,89,1,94,1,99,1,104,1,108,1,112,1,116,1,120,1,125,1,-126,1,27,91,51,74,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,49,59,50,65,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,109,117,108,120,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,71,0,38,0,15,0,-99,1,70,4,118,116,112,99,111,110,124,65,78,73,83,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,99,111,110,115,111,108,101,32,118,105,114,116,117,97,108,32,116,101,114,109,105,110,97,108,32,115,101,113,117,101,110,99,101,32,119,105,116,104,32,108,105,98,117,118,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,-2,-1,25,0,33,0,37,0,41,0,-1,-1,52,0,69,0,73,0,77,0,84,0,-1,-1,86,0,99,0,-1,-1,103,0,-2,-1,107,0,111,0,-1,-1,-1,-1,115,0,-2,-1,119,0,124,0,-1,-1,-2,-1,-2,-1,-2,-1,-1,-1,-123,0,-118,0,-113,0,-108,0,-99,0,-95,0,-90,0,-1,-1,-2,-1,-81,0,-75,0,-2,-1,-1,-1,-1,-1,-1,-1,-69,0,-1,-1,-1,-1,-1,-1,-59,0,-1,-1,-55,0,-1,-1,-1,-1,-1,-1,-53,0,-1,-1,-48,0,-1,-1,-1,-1,-1,-1,-1,-1,-44,0,-39,0,-33,0,-28,0,-23,0,-18,0,-13,0,-7,0,-1,0,5,1,11,1,16,1,-1,-1,21,1,-1,-1,25,1,30,1,35,1,39,1,46,1,-1,-1,53,1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,57,1,-1,-1,60,1,69,1,78,1,87,1,96,1,105,1,114,1,123,1,-124,1,-115,1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-106,1,-2,-1,-2,-1,-1,-1,-1,-1,-86,1,-83,1,-72,1,-69,1,-67,1,-64,1,-21,1,-1,-1,-18,1,-1,-1,-1,-1,-1,-1,-1,-1,-16,1,-12,1,-8,1,-4,1,0,2,-1,-1,-1,-1,4,2,-1,-1,27,2,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,31,2,36,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,40,2,-1,-1,-1,-1,47,2,-1,-1,-1,-1,-1,-1,-1,-1,54,2,61,2,68,2,-1,-1,-1,-1,75,2,-1,-1,82,2,-1,-1,-1,-1,-1,-1,89,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,96,2,102,2,108,2,114,2,120,2,126,2,-124,2,-118,2,-112,2,-106,2,-100,2,-94,2,-88,2,-82,2,-76,2,-70,2,-64,2,-58,2,-52,2,-46,2,-40,2,-34,2,-28,2,-22,2,-16,2,-10,2,-4,2,2,3,8,3,14,3,21,3,27,3,33,3,39,3,45,3,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,51,3,56,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,63,3,-2,-1,72,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-91,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-86,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-80,3,-17,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,47,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,80,0,27,91,77,0,27,40,48,0,27,91,49,109,0,27,91,63,49,48,52,57,104,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,91,48,109,0,27,91,63,49,48,52,57,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,33,112,27,91,63,51,108,0,27,91,76,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,91,65,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,27,91,48,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,27,72,0,9,0,27,79,119,0,27,79,121,0,27,91,71,0,27,79,113,0,27,79,115,0,106,106,107,107,108,108,109,109,110,110,113,113,116,116,117,117,118,118,119,119,120,120,0,27,91,90,0,27,91,52,126,0,27,79,77,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,49,59,54,83,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,63,54,57,108,0,27,91,51,57,59,52,57,109,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,0,27,91,51,109,0,27,91,50,51,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,63,54,57,104,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,115,0,2,0,0,0,74,0,92,0,-46,1,1,1,-2,-1,-2,-1,0,0,-2,-1,5,0,11,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,21,0,-2,-1,-2,-1,-2,-1,-2,-1,-2,-1,28,0,32,0,36,0,40,0,44,0,48,0,52,0,56,0,60,0,64,0,68,0,72,0,-2,-1,-2,-1,-2,-1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,32,0,37,0,42,0,47,0,52,0,56,0,61,0,66,0,71,0,76,0,81,0,87,0,93,0,99,0,105,0,111,0,117,0,123,0,-127,0,-121,0,-115,0,-110,0,-105,0,-100,0,-95,0,-90,0,-84,0,-78,0,-72,0,-66,0,-60,0,-54,0,-48,0,-42,0,-36,0,-30,0,-24,0,-18,0,-12,0,-6,0,0,1,6,1,12,1,18,1,24,1,30,1,34,1,39,1,44,1,49,1,54,1,59,1,63,1,67,1,71,1,75,1,79,1,85,1,91,1,97,1,103,1,109,1,115,1,121,1,126,1,-125,1,27,91,51,74,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,49,59,50,65,0,27,79,120,0,27,79,116,0,27,79,118,0,27,79,114,0,27,79,69,0,27,79,107,0,27,79,108,0,27,79,111,0,27,79,110,0,27,79,106,0,27,79,109,0,27,79,112,0,65,88,0,88,84,0,67,114,0,67,115,0,69,51,0,77,115,0,83,101,0,83,115,0,88,77,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,107,112,53,0,107,112,65,68,68,0,107,112,67,77,65,0,107,112,68,73,86,0,107,112,68,79,84,0,107,112,77,85,76,0,107,112,83,85,66,0,107,112,90,82,79,0,114,109,120,120,0,115,109,120,120,0,120,109,0 }; // win32con|ANSI emulation for libuv on legacy console, @@ -2080,7 +2107,7 @@ static const int8_t vtpcon_terminfo[] = { // user8@, // user9@, static const int8_t win32con_terminfo[] = { - 26,1,52,0,15,0,15,0,125,1,106,2,119,105,110,51,50,99,111,110,124,65,78,83,73,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,108,105,98,117,118,32,111,110,32,108,101,103,97,99,121,32,99,111,110,115,111,108,101,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,11,0,15,0,19,0,-1,-1,30,0,47,0,51,0,-1,-1,55,0,-1,-1,-1,-1,57,0,-1,-1,61,0,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-2,-1,-1,-1,65,0,70,0,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,79,0,84,0,-2,-1,-1,-1,-2,-1,89,0,94,0,-1,-1,-2,-1,107,0,-2,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,113,0,-1,-1,-1,-1,-1,-1,115,0,-1,-1,120,0,-1,-1,-1,-1,-1,-1,-1,-1,124,0,-127,0,-121,0,-116,0,-111,0,-106,0,-101,0,-95,0,-89,0,-83,0,-77,0,-72,0,-1,-1,-67,0,-1,-1,-63,0,-58,0,-53,0,-1,-1,-1,-1,-1,-1,-49,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-45,0,-1,-1,-2,-1,-2,-1,-42,0,-2,-1,-1,-1,-2,-1,-33,0,-24,0,-1,-1,-15,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-6,0,-3,0,8,1,-2,-1,-2,-1,11,1,-1,-1,-1,-1,49,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,51,1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,55,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,60,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,1,-1,-1,-1,-1,69,1,-1,-1,-1,-1,-1,-1,-1,-1,76,1,83,1,90,1,-1,-1,-1,-1,97,1,-1,-1,104,1,-1,-1,-1,-1,-1,-1,111,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,118,1,124,1,-126,1,-120,1,-114,1,-108,1,-102,1,-96,1,-90,1,-84,1,-78,1,-72,1,-66,1,-60,1,-54,1,-48,1,-42,1,-36,1,-30,1,-24,1,-18,1,-12,1,-6,1,0,2,6,2,12,2,18,2,24,2,30,2,-1,-1,36,2,42,2,48,2,54,2,60,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,71,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,2,90,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,100,2,7,0,13,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,8,0,27,91,67,0,27,91,65,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,55,109,0,27,91,55,109,0,27,91,48,109,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,50,55,109,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,27,91,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,9,0,27,91,71,0,27,91,52,126,0,26,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,48,109,0,1,0,0,0,2,0,5,0,25,0,0,0,0,0,6,0,0,0,3,0,6,0,27,91,48,32,113,0,27,91,37,112,49,37,100,32,113,0,65,88,0,83,101,0,83,115,0 // NOLINT + 26,1,52,0,15,0,15,0,125,1,106,2,119,105,110,51,50,99,111,110,124,65,78,83,73,32,101,109,117,108,97,116,105,111,110,32,102,111,114,32,108,105,98,117,118,32,111,110,32,108,101,103,97,99,121,32,99,111,110,115,111,108,101,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,-1,-1,8,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,0,64,0,-1,-1,0,0,2,0,-1,-1,-1,-1,4,0,11,0,15,0,19,0,-1,-1,30,0,47,0,51,0,-1,-1,55,0,-1,-1,-1,-1,57,0,-1,-1,61,0,-1,-1,-2,-1,-2,-1,-1,-1,-1,-1,-2,-1,-1,-1,65,0,70,0,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,79,0,84,0,-2,-1,-1,-1,-2,-1,89,0,94,0,-1,-1,-2,-1,107,0,-2,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-1,-1,113,0,-1,-1,-1,-1,-1,-1,115,0,-1,-1,120,0,-1,-1,-1,-1,-1,-1,-1,-1,124,0,-127,0,-121,0,-116,0,-111,0,-106,0,-101,0,-95,0,-89,0,-83,0,-77,0,-72,0,-1,-1,-67,0,-1,-1,-63,0,-58,0,-53,0,-1,-1,-1,-1,-1,-1,-49,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-45,0,-1,-1,-2,-1,-2,-1,-42,0,-2,-1,-1,-1,-2,-1,-33,0,-24,0,-1,-1,-15,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-6,0,-3,0,8,1,-2,-1,-2,-1,11,1,-1,-1,-1,-1,49,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,51,1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,55,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,60,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,1,-1,-1,-1,-1,69,1,-1,-1,-1,-1,-1,-1,-1,-1,76,1,83,1,90,1,-1,-1,-1,-1,97,1,-1,-1,104,1,-1,-1,-1,-1,-1,-1,111,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,118,1,124,1,-126,1,-120,1,-114,1,-108,1,-102,1,-96,1,-90,1,-84,1,-78,1,-72,1,-66,1,-60,1,-54,1,-48,1,-42,1,-36,1,-30,1,-24,1,-18,1,-12,1,-6,1,0,2,6,2,12,2,18,2,24,2,30,2,-1,-1,36,2,42,2,48,2,54,2,60,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-2,-1,-2,-1,-2,-1,71,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,2,90,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,100,2,7,0,13,0,27,91,72,27,91,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,27,91,66,0,27,91,72,0,8,0,27,91,67,0,27,91,65,0,27,91,49,109,0,27,55,27,91,63,52,55,104,0,27,91,55,109,0,27,91,55,109,0,27,91,48,109,0,27,91,50,74,27,91,63,52,55,108,27,56,0,27,91,50,55,109,0,8,0,27,91,51,126,0,27,91,66,0,27,91,91,65,0,27,91,50,49,126,0,27,91,91,66,0,27,91,91,67,0,27,91,91,68,0,27,91,91,69,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,91,49,126,0,27,91,50,126,0,27,91,68,0,27,91,54,126,0,27,91,53,126,0,27,91,67,0,27,91,65,0,13,10,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,65,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,27,91,48,37,63,37,112,49,37,116,59,55,37,59,37,63,37,112,51,37,116,59,55,37,59,37,63,37,112,54,37,116,59,49,37,59,109,0,9,0,27,91,71,0,27,91,52,126,0,26,0,27,91,51,59,50,126,0,27,91,52,59,50,126,0,27,91,49,59,50,126,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,50,53,126,0,27,91,50,54,126,0,27,91,50,56,126,0,27,91,50,57,126,0,27,91,51,49,126,0,27,91,51,50,126,0,27,91,51,51,126,0,27,91,51,52,126,0,27,91,50,51,36,0,27,91,50,52,36,0,27,91,49,49,94,0,27,91,49,50,94,0,27,91,49,51,94,0,27,91,49,52,94,0,27,91,49,53,94,0,27,91,49,55,94,0,27,91,49,56,94,0,27,91,49,57,94,0,27,91,50,48,94,0,27,91,50,49,94,0,27,91,50,51,94,0,27,91,50,52,94,0,27,91,50,53,94,0,27,91,50,54,94,0,27,91,50,56,94,0,27,91,50,57,94,0,27,91,51,49,94,0,27,91,51,50,94,0,27,91,51,51,94,0,27,91,51,52,94,0,27,91,50,51,64,0,27,91,50,52,64,0,27,91,49,75,0,27,91,51,57,59,52,57,109,0,27,91,51,37,112,49,37,100,109,0,27,91,52,37,112,49,37,100,109,0,27,91,49,48,109,0,0,0,0,0,2,0,4,0,22,0,0,0,6,0,0,0,3,0,27,91,48,32,113,0,27,91,37,112,49,37,100,32,113,0,83,101,0,83,115,0 }; // xterm-256color|xterm with 256 colors, @@ -2105,6 +2132,7 @@ static const int8_t win32con_terminfo[] = { // carriage_return=\r, // change_scroll_region=\E[%i%p1%d;%p2%dr, // clear_all_tabs=\E[3g, +// clear_margins=\E[?69l, // clear_screen=\E[H\E[2J, // clr_bol=\E[1K, // clr_eol=\E[K, @@ -2146,9 +2174,13 @@ static const int8_t win32con_terminfo[] = { // init_2string=\E[\041p\E[?3;4l\E[4l\E>, // initialize_color=\E]4;%p1%d;rgb\072%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\, // insert_line=\E[L, -// key_b2=\EOE, +// key_a1=\EOw, +// key_a3=\EOy, +// key_b2=\EOu, // key_backspace=^H, // key_btab=\E[Z, +// key_c1=\EOq, +// key_c3=\EOs, // key_dc=\E[3~, // key_down=\EOB, // key_end=\EOF, @@ -2240,6 +2272,7 @@ static const int8_t win32con_terminfo[] = { // memory_unlock=\Em, // meta_off=\E[?1034l, // meta_on=\E[?1034h, +// newline=\EE, // orig_colors=\E]104^G, // orig_pair=\E[39;49m, // parm_dch=\E[%p1%dP, @@ -2266,6 +2299,7 @@ static const int8_t win32con_terminfo[] = { // set_a_background=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, // set_a_foreground=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, // set_attributes=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, +// set_lr_margin=\E[?69h\E[%i%p1%d;%p2%ds, // set_tab=\EH, // tab=^I, // user6=\E[%i%d;%dR, @@ -2273,6 +2307,6 @@ static const int8_t win32con_terminfo[] = { // user8=\E[?%[;0123456789]c, // user9=\E[c, static const int8_t xterm_256colour_terminfo[] = { - 30,2,37,0,38,0,15,0,-99,1,2,6,120,116,101,114,109,45,50,53,54,99,111,108,111,114,124,120,116,101,114,109,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,102,0,-1,-1,106,0,110,0,120,0,124,0,-1,-1,-1,-1,-128,0,-124,0,-119,0,-114,0,-1,-1,-96,0,-91,0,-86,0,-1,-1,-81,0,-76,0,-71,0,-66,0,-57,0,-53,0,-46,0,-1,-1,-28,0,-23,0,-17,0,-11,0,-1,-1,-1,-1,-1,-1,7,1,-1,-1,-1,-1,-1,-1,25,1,-1,-1,29,1,-1,-1,-1,-1,-1,-1,31,1,-1,-1,36,1,-1,-1,-1,-1,-1,-1,-1,-1,40,1,44,1,50,1,54,1,58,1,62,1,68,1,74,1,80,1,86,1,92,1,96,1,-1,-1,101,1,-1,-1,105,1,110,1,115,1,119,1,126,1,-1,-1,-123,1,-119,1,-111,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-103,1,-94,1,-1,-1,-1,-1,-85,1,-76,1,-67,1,-58,1,-49,1,-40,1,-31,1,-22,1,-13,1,-4,1,-1,-1,-1,-1,-1,-1,5,2,9,2,14,2,19,2,39,2,48,2,-1,-1,-1,-1,66,2,69,2,80,2,83,2,85,2,88,2,-75,2,-1,-1,-72,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-70,2,-1,-1,-1,-1,-1,-1,-1,-1,-66,2,-1,-1,-13,2,-1,-1,-1,-1,-9,2,-3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,3,7,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,3,-1,-1,-1,-1,18,3,-1,-1,-1,-1,-1,-1,-1,-1,25,3,32,3,39,3,-1,-1,-1,-1,46,3,-1,-1,53,3,-1,-1,-1,-1,-1,-1,60,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,67,3,73,3,79,3,86,3,93,3,100,3,107,3,115,3,123,3,-125,3,-117,3,-109,3,-101,3,-93,3,-85,3,-78,3,-71,3,-64,3,-57,3,-49,3,-41,3,-33,3,-25,3,-17,3,-9,3,-1,3,7,4,14,4,21,4,28,4,35,4,43,4,51,4,59,4,67,4,75,4,83,4,91,4,99,4,106,4,113,4,120,4,127,4,-121,4,-113,4,-105,4,-97,4,-89,4,-81,4,-73,4,-65,4,-58,4,-51,4,-44,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-39,4,-28,4,-23,4,-4,4,0,5,9,5,16,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,110,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,121,5,-1,-1,-1,-1,-1,-1,125,5,-68,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-4,5,-1,5,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,63,49,50,59,50,53,104,0,27,91,80,0,27,91,77,0,27,40,48,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,27,91,50,50,59,48,59,48,116,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,40,66,27,91,109,0,27,91,63,49,48,52,57,108,27,91,50,51,59,48,59,48,116,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,63,49,48,51,52,108,0,27,91,63,49,48,51,52,104,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,105,0,27,91,52,105,0,27,91,53,105,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,99,27,93,49,48,52,7,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,37,63,37,112,57,37,116,27,40,48,37,101,27,40,66,37,59,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,55,37,116,59,56,37,59,109,0,27,72,0,9,0,27,79,69,0,96,96,97,97,102,102,103,103,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,79,70,0,27,79,77,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,108,0,27,109,0,3,0,1,0,73,0,-106,0,115,3,1,0,1,0,-1,-1,-1,-1,0,0,7,0,-1,-1,19,0,24,0,-1,-1,42,0,48,0,-1,-1,58,0,-1,-1,-1,-1,90,0,97,0,104,0,111,0,118,0,125,0,-124,0,-117,0,-110,0,-103,0,-96,0,-89,0,-82,0,-75,0,-68,0,-61,0,-1,-1,-54,0,-47,0,-40,0,-33,0,-26,0,-1,-1,-19,0,-12,0,-5,0,2,1,9,1,16,1,23,1,30,1,37,1,44,1,51,1,58,1,65,1,72,1,79,1,86,1,93,1,100,1,107,1,114,1,121,1,-128,1,-121,1,-114,1,-107,1,-100,1,-93,1,-86,1,-79,1,-72,1,-65,1,-1,-1,-1,-1,-1,-1,-1,-1,-58,1,-52,1,-47,1,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,30,0,33,0,36,0,39,0,42,0,48,0,54,0,59,0,64,0,69,0,74,0,79,0,83,0,88,0,93,0,98,0,103,0,108,0,114,0,120,0,126,0,-124,0,-118,0,-112,0,-106,0,-100,0,-94,0,-88,0,-82,0,-76,0,-71,0,-66,0,-61,0,-56,0,-51,0,-45,0,-39,0,-33,0,-27,0,-21,0,-15,0,-9,0,-3,0,3,1,9,1,15,1,21,1,27,1,33,1,39,1,45,1,51,1,57,1,63,1,69,1,73,1,78,1,83,1,88,1,93,1,98,1,102,1,106,1,110,1,114,1,119,1,124,1,27,93,49,49,50,7,0,27,93,49,50,59,37,112,49,37,115,7,0,27,91,51,74,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,91,50,57,109,0,27,91,57,109,0,27,91,60,37,112,49,37,100,59,37,112,50,37,100,59,37,112,51,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,65,88,0,71,48,0,88,84,0,85,56,0,67,114,0,67,115,0,69,48,0,69,51,0,77,115,0,83,48,0,83,101,0,83,115,0,84,83,0,88,77,0,103,114,98,111,109,0,103,115,98,111,109,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,69,78,68,56,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,72,79,77,56,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,114,109,120,120,0,115,109,120,120,0,120,109,0 // NOLINT + 30,2,37,0,38,0,15,0,-99,1,51,6,120,116,101,114,109,45,50,53,54,99,111,108,111,114,124,120,116,101,114,109,32,119,105,116,104,32,50,53,54,32,99,111,108,111,114,115,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,1,0,80,0,0,0,8,0,0,0,24,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,0,0,0,0,1,0,0,0,4,0,6,0,8,0,25,0,30,0,38,0,42,0,46,0,-1,-1,57,0,74,0,76,0,80,0,87,0,-1,-1,89,0,102,0,-1,-1,106,0,110,0,120,0,124,0,-1,-1,-1,-1,-128,0,-124,0,-119,0,-114,0,-1,-1,-96,0,-91,0,-86,0,-1,-1,-81,0,-76,0,-71,0,-66,0,-57,0,-53,0,-46,0,-1,-1,-28,0,-23,0,-17,0,-11,0,-1,-1,-1,-1,-1,-1,7,1,-1,-1,-1,-1,-1,-1,25,1,-1,-1,29,1,-1,-1,-1,-1,-1,-1,31,1,-1,-1,36,1,-1,-1,-1,-1,-1,-1,-1,-1,40,1,44,1,50,1,54,1,58,1,62,1,68,1,74,1,80,1,86,1,92,1,96,1,-1,-1,101,1,-1,-1,105,1,110,1,115,1,119,1,126,1,-1,-1,-123,1,-119,1,-111,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-103,1,-94,1,-85,1,-1,-1,-82,1,-73,1,-64,1,-55,1,-46,1,-37,1,-28,1,-19,1,-10,1,-1,1,-1,-1,-1,-1,-1,-1,8,2,12,2,17,2,22,2,42,2,51,2,-1,-1,-1,-1,69,2,72,2,83,2,86,2,88,2,91,2,-72,2,-1,-1,-69,2,-1,-1,-1,-1,-1,-1,-1,-1,-67,2,-63,2,-59,2,-55,2,-51,2,-1,-1,-1,-1,-47,2,-1,-1,6,3,-1,-1,-1,-1,10,3,16,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,22,3,26,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,3,-1,-1,-1,-1,37,3,-1,-1,-1,-1,-1,-1,-1,-1,44,3,51,3,58,3,-1,-1,-1,-1,65,3,-1,-1,72,3,-1,-1,-1,-1,-1,-1,79,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,86,3,92,3,98,3,105,3,112,3,119,3,126,3,-122,3,-114,3,-106,3,-98,3,-90,3,-82,3,-74,3,-66,3,-59,3,-52,3,-45,3,-38,3,-30,3,-22,3,-14,3,-6,3,2,4,10,4,18,4,26,4,33,4,40,4,47,4,54,4,62,4,70,4,78,4,86,4,94,4,102,4,110,4,118,4,125,4,-124,4,-117,4,-110,4,-102,4,-94,4,-86,4,-78,4,-70,4,-62,4,-54,4,-46,4,-39,4,-32,4,-25,4,-20,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-13,4,-2,4,3,5,22,5,26,5,35,5,42,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-120,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-115,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-109,5,-1,-1,-1,-1,-1,-1,-105,5,-42,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,22,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,45,6,48,6,27,91,90,0,7,0,13,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,114,0,27,91,51,103,0,27,91,72,27,91,50,74,0,27,91,75,0,27,91,74,0,27,91,37,105,37,112,49,37,100,71,0,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,72,0,10,0,27,91,72,0,27,91,63,50,53,108,0,8,0,27,91,63,49,50,108,27,91,63,50,53,104,0,27,91,67,0,27,91,65,0,27,91,63,49,50,59,50,53,104,0,27,91,80,0,27,91,77,0,27,40,48,0,27,91,53,109,0,27,91,49,109,0,27,91,63,49,48,52,57,104,27,91,50,50,59,48,59,48,116,0,27,91,50,109,0,27,91,52,104,0,27,91,56,109,0,27,91,55,109,0,27,91,55,109,0,27,91,52,109,0,27,91,37,112,49,37,100,88,0,27,40,66,0,27,40,66,27,91,109,0,27,91,63,49,48,52,57,108,27,91,50,51,59,48,59,48,116,0,27,91,52,108,0,27,91,50,55,109,0,27,91,50,52,109,0,27,91,63,53,104,36,60,49,48,48,47,62,27,91,63,53,108,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,0,27,91,76,0,8,0,27,91,51,126,0,27,79,66,0,27,79,80,0,27,91,50,49,126,0,27,79,81,0,27,79,82,0,27,79,83,0,27,91,49,53,126,0,27,91,49,55,126,0,27,91,49,56,126,0,27,91,49,57,126,0,27,91,50,48,126,0,27,79,72,0,27,91,50,126,0,27,79,68,0,27,91,54,126,0,27,91,53,126,0,27,79,67,0,27,91,49,59,50,66,0,27,91,49,59,50,65,0,27,79,65,0,27,91,63,49,108,27,62,0,27,91,63,49,104,27,61,0,27,91,63,49,48,51,52,108,0,27,91,63,49,48,51,52,104,0,27,69,0,27,91,37,112,49,37,100,80,0,27,91,37,112,49,37,100,77,0,27,91,37,112,49,37,100,66,0,27,91,37,112,49,37,100,64,0,27,91,37,112,49,37,100,83,0,27,91,37,112,49,37,100,76,0,27,91,37,112,49,37,100,68,0,27,91,37,112,49,37,100,67,0,27,91,37,112,49,37,100,84,0,27,91,37,112,49,37,100,65,0,27,91,105,0,27,91,52,105,0,27,91,53,105,0,37,112,49,37,99,27,91,37,112,50,37,123,49,125,37,45,37,100,98,0,27,99,27,93,49,48,52,7,0,27,91,33,112,27,91,63,51,59,52,108,27,91,52,108,27,62,0,27,56,0,27,91,37,105,37,112,49,37,100,100,0,27,55,0,10,0,27,77,0,37,63,37,112,57,37,116,27,40,48,37,101,27,40,66,37,59,27,91,48,37,63,37,112,54,37,116,59,49,37,59,37,63,37,112,53,37,116,59,50,37,59,37,63,37,112,50,37,116,59,52,37,59,37,63,37,112,49,37,112,51,37,124,37,116,59,55,37,59,37,63,37,112,52,37,116,59,53,37,59,37,63,37,112,55,37,116,59,56,37,59,109,0,27,72,0,9,0,27,79,119,0,27,79,121,0,27,79,117,0,27,79,113,0,27,79,115,0,96,96,97,97,102,102,103,103,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,120,121,121,122,122,123,123,124,124,125,125,126,126,0,27,91,90,0,27,91,63,55,104,0,27,91,63,55,108,0,27,79,70,0,27,79,77,0,27,91,51,59,50,126,0,27,91,49,59,50,70,0,27,91,49,59,50,72,0,27,91,50,59,50,126,0,27,91,49,59,50,68,0,27,91,54,59,50,126,0,27,91,53,59,50,126,0,27,91,49,59,50,67,0,27,91,50,51,126,0,27,91,50,52,126,0,27,91,49,59,50,80,0,27,91,49,59,50,81,0,27,91,49,59,50,82,0,27,91,49,59,50,83,0,27,91,49,53,59,50,126,0,27,91,49,55,59,50,126,0,27,91,49,56,59,50,126,0,27,91,49,57,59,50,126,0,27,91,50,48,59,50,126,0,27,91,50,49,59,50,126,0,27,91,50,51,59,50,126,0,27,91,50,52,59,50,126,0,27,91,49,59,53,80,0,27,91,49,59,53,81,0,27,91,49,59,53,82,0,27,91,49,59,53,83,0,27,91,49,53,59,53,126,0,27,91,49,55,59,53,126,0,27,91,49,56,59,53,126,0,27,91,49,57,59,53,126,0,27,91,50,48,59,53,126,0,27,91,50,49,59,53,126,0,27,91,50,51,59,53,126,0,27,91,50,52,59,53,126,0,27,91,49,59,54,80,0,27,91,49,59,54,81,0,27,91,49,59,54,82,0,27,91,49,59,54,83,0,27,91,49,53,59,54,126,0,27,91,49,55,59,54,126,0,27,91,49,56,59,54,126,0,27,91,49,57,59,54,126,0,27,91,50,48,59,54,126,0,27,91,50,49,59,54,126,0,27,91,50,51,59,54,126,0,27,91,50,52,59,54,126,0,27,91,49,59,51,80,0,27,91,49,59,51,81,0,27,91,49,59,51,82,0,27,91,49,59,51,83,0,27,91,49,53,59,51,126,0,27,91,49,55,59,51,126,0,27,91,49,56,59,51,126,0,27,91,49,57,59,51,126,0,27,91,50,48,59,51,126,0,27,91,50,49,59,51,126,0,27,91,50,51,59,51,126,0,27,91,50,52,59,51,126,0,27,91,49,59,52,80,0,27,91,49,59,52,81,0,27,91,49,59,52,82,0,27,91,49,75,0,27,91,63,54,57,108,0,27,91,37,105,37,100,59,37,100,82,0,27,91,54,110,0,27,91,63,37,91,59,48,49,50,51,52,53,54,55,56,57,93,99,0,27,91,99,0,27,91,51,57,59,52,57,109,0,27,93,49,48,52,7,0,27,93,52,59,37,112,49,37,100,59,114,103,98,58,37,112,50,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,51,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,47,37,112,52,37,123,50,53,53,125,37,42,37,123,49,48,48,48,125,37,47,37,50,46,50,88,27,92,0,27,91,51,109,0,27,91,50,51,109,0,27,91,60,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,51,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,57,37,112,49,37,123,56,125,37,45,37,100,37,101,51,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,37,63,37,112,49,37,123,56,125,37,60,37,116,52,37,112,49,37,100,37,101,37,112,49,37,123,49,54,125,37,60,37,116,49,48,37,112,49,37,123,56,125,37,45,37,100,37,101,52,56,59,53,59,37,112,49,37,100,37,59,109,0,27,91,63,54,57,104,27,91,37,105,37,112,49,37,100,59,37,112,50,37,100,115,0,27,108,0,27,109,0,0,2,0,0,0,74,0,-106,0,-84,3,1,1,0,0,7,0,19,0,24,0,42,0,48,0,58,0,90,0,97,0,104,0,111,0,118,0,125,0,-124,0,-117,0,-110,0,-103,0,-96,0,-89,0,-82,0,-75,0,-68,0,-61,0,-54,0,-47,0,-40,0,-33,0,-26,0,-19,0,-12,0,-5,0,2,1,9,1,16,1,23,1,30,1,37,1,44,1,51,1,58,1,65,1,72,1,79,1,86,1,93,1,100,1,107,1,114,1,121,1,-128,1,-121,1,-114,1,-107,1,-100,1,-93,1,-86,1,-79,1,-72,1,-65,1,-58,1,-54,1,-50,1,-46,1,-42,1,-38,1,-34,1,-30,1,-26,1,-22,1,-18,1,-14,1,-10,1,-4,1,1,2,0,0,3,0,6,0,9,0,12,0,15,0,18,0,21,0,24,0,27,0,32,0,37,0,42,0,47,0,52,0,56,0,61,0,66,0,71,0,76,0,81,0,87,0,93,0,99,0,105,0,111,0,117,0,123,0,-127,0,-121,0,-115,0,-110,0,-105,0,-100,0,-95,0,-90,0,-84,0,-78,0,-72,0,-66,0,-60,0,-54,0,-48,0,-42,0,-36,0,-30,0,-24,0,-18,0,-12,0,-6,0,0,1,6,1,12,1,18,1,24,1,30,1,34,1,39,1,44,1,49,1,54,1,59,1,63,1,67,1,71,1,75,1,79,1,85,1,91,1,97,1,103,1,109,1,115,1,121,1,126,1,-125,1,27,93,49,49,50,7,0,27,93,49,50,59,37,112,49,37,115,7,0,27,91,51,74,0,27,93,53,50,59,37,112,49,37,115,59,37,112,50,37,115,7,0,27,91,50,32,113,0,27,91,37,112,49,37,100,32,113,0,27,91,63,49,48,48,54,59,49,48,48,48,37,63,37,112,49,37,123,49,125,37,61,37,116,104,37,101,108,37,59,0,27,91,51,59,51,126,0,27,91,51,59,52,126,0,27,91,51,59,53,126,0,27,91,51,59,54,126,0,27,91,51,59,55,126,0,27,91,49,59,50,66,0,27,91,49,59,51,66,0,27,91,49,59,52,66,0,27,91,49,59,53,66,0,27,91,49,59,54,66,0,27,91,49,59,55,66,0,27,91,49,59,51,70,0,27,91,49,59,52,70,0,27,91,49,59,53,70,0,27,91,49,59,54,70,0,27,91,49,59,55,70,0,27,91,49,59,51,72,0,27,91,49,59,52,72,0,27,91,49,59,53,72,0,27,91,49,59,54,72,0,27,91,49,59,55,72,0,27,91,50,59,51,126,0,27,91,50,59,52,126,0,27,91,50,59,53,126,0,27,91,50,59,54,126,0,27,91,50,59,55,126,0,27,91,49,59,51,68,0,27,91,49,59,52,68,0,27,91,49,59,53,68,0,27,91,49,59,54,68,0,27,91,49,59,55,68,0,27,91,54,59,51,126,0,27,91,54,59,52,126,0,27,91,54,59,53,126,0,27,91,54,59,54,126,0,27,91,54,59,55,126,0,27,91,53,59,51,126,0,27,91,53,59,52,126,0,27,91,53,59,53,126,0,27,91,53,59,54,126,0,27,91,53,59,55,126,0,27,91,49,59,51,67,0,27,91,49,59,52,67,0,27,91,49,59,53,67,0,27,91,49,59,54,67,0,27,91,49,59,55,67,0,27,91,49,59,50,65,0,27,91,49,59,51,65,0,27,91,49,59,52,65,0,27,91,49,59,53,65,0,27,91,49,59,54,65,0,27,91,49,59,55,65,0,27,79,120,0,27,79,116,0,27,79,118,0,27,79,114,0,27,79,69,0,27,79,107,0,27,79,108,0,27,79,111,0,27,79,110,0,27,79,106,0,27,79,109,0,27,79,112,0,27,91,50,57,109,0,27,91,57,109,0,27,91,60,37,105,37,112,51,37,100,59,37,112,49,37,100,59,37,112,50,37,100,59,37,63,37,112,52,37,116,77,37,101,109,37,59,0,65,88,0,88,84,0,67,114,0,67,115,0,69,51,0,77,115,0,83,101,0,83,115,0,88,77,0,107,68,67,51,0,107,68,67,52,0,107,68,67,53,0,107,68,67,54,0,107,68,67,55,0,107,68,78,0,107,68,78,51,0,107,68,78,52,0,107,68,78,53,0,107,68,78,54,0,107,68,78,55,0,107,69,78,68,51,0,107,69,78,68,52,0,107,69,78,68,53,0,107,69,78,68,54,0,107,69,78,68,55,0,107,72,79,77,51,0,107,72,79,77,52,0,107,72,79,77,53,0,107,72,79,77,54,0,107,72,79,77,55,0,107,73,67,51,0,107,73,67,52,0,107,73,67,53,0,107,73,67,54,0,107,73,67,55,0,107,76,70,84,51,0,107,76,70,84,52,0,107,76,70,84,53,0,107,76,70,84,54,0,107,76,70,84,55,0,107,78,88,84,51,0,107,78,88,84,52,0,107,78,88,84,53,0,107,78,88,84,54,0,107,78,88,84,55,0,107,80,82,86,51,0,107,80,82,86,52,0,107,80,82,86,53,0,107,80,82,86,54,0,107,80,82,86,55,0,107,82,73,84,51,0,107,82,73,84,52,0,107,82,73,84,53,0,107,82,73,84,54,0,107,82,73,84,55,0,107,85,80,0,107,85,80,51,0,107,85,80,52,0,107,85,80,53,0,107,85,80,54,0,107,85,80,55,0,107,97,50,0,107,98,49,0,107,98,51,0,107,99,50,0,107,112,53,0,107,112,65,68,68,0,107,112,67,77,65,0,107,112,68,73,86,0,107,112,68,79,84,0,107,112,77,85,76,0,107,112,83,85,66,0,107,112,90,82,79,0,114,109,120,120,0,115,109,120,120,0,120,109,0 }; #endif // NVIM_TUI_TERMINFO_DEFS_H diff --git a/src/nvim/ui.c b/src/nvim/ui.c index ac20b00c71..01583c032f 100644 --- a/src/nvim/ui.c +++ b/src/nvim/ui.c @@ -344,7 +344,7 @@ void vim_beep(unsigned val) // When 'debug' contains "beep" produce a message. If we are sourcing // a script or executing a function give the user a hint where the beep // comes from. - if (vim_strchr(p_debug, 'e') != NULL) { + if (vim_strchr((char *)p_debug, 'e') != NULL) { msg_source(HL_ATTR(HLF_W)); msg_attr(_("Beep!"), HL_ATTR(HLF_W)); } @@ -436,7 +436,7 @@ void ui_set_ext_option(UI *ui, UIExtension ext, bool active) void ui_line(ScreenGrid *grid, int row, int startcol, int endcol, int clearcol, int clearattr, bool wrap) { - assert(0 <= row && row < grid->Rows); + assert(0 <= row && row < grid->rows); LineFlags flags = wrap ? kLineFlagWrap : 0; if (startcol == -1) { startcol = 0; @@ -453,7 +453,7 @@ void ui_line(ScreenGrid *grid, int row, int startcol, int endcol, int clearcol, if (p_wd && !(rdb_flags & RDB_COMPOSITOR)) { // If 'writedelay' is active, set the cursor to indicate what was drawn. ui_call_grid_cursor_goto(grid->handle, row, - MIN(clearcol, (int)grid->Columns - 1)); + MIN(clearcol, (int)grid->cols - 1)); ui_call_flush(); uint64_t wd = (uint64_t)labs(p_wd); os_microdelay(wd * 1000u, true); @@ -549,13 +549,13 @@ void ui_check_mouse(void) int checkfor = MOUSE_NORMAL; // assume normal mode if (VIsual_active) { checkfor = MOUSE_VISUAL; - } else if (State == HITRETURN || State == ASKMORE || State == SETWSIZE) { + } else if (State == MODE_HITRETURN || State == MODE_ASKMORE || State == MODE_SETWSIZE) { checkfor = MOUSE_RETURN; - } else if (State & INSERT) { + } else if (State & MODE_INSERT) { checkfor = MOUSE_INSERT; - } else if (State & CMDLINE) { + } else if (State & MODE_CMDLINE) { checkfor = MOUSE_COMMAND; - } else if (State == CONFIRM || State == EXTERNCMD) { + } else if (State == MODE_CONFIRM || State == MODE_EXTERNCMD) { checkfor = ' '; // don't use mouse for ":confirm" or ":!cmd" } @@ -567,7 +567,7 @@ void ui_check_mouse(void) for (char_u *p = p_mouse; *p; p++) { switch (*p) { case 'a': - if (vim_strchr((char_u *)MOUSE_A, checkfor) != NULL) { + if (vim_strchr(MOUSE_A, checkfor) != NULL) { has_mouse = true; return; } diff --git a/src/nvim/ui_compositor.c b/src/nvim/ui_compositor.c index f76158ff12..1dce84a1de 100644 --- a/src/nvim/ui_compositor.c +++ b/src/nvim/ui_compositor.c @@ -138,19 +138,19 @@ bool ui_comp_put_grid(ScreenGrid *grid, int row, int col, int height, int width, // use it. grid->comp_disabled = true; compose_area(grid->comp_row, row, - grid->comp_col, grid->comp_col + grid->Columns); + grid->comp_col, grid->comp_col + grid->cols); if (grid->comp_col < col) { compose_area(MAX(row, grid->comp_row), - MIN(row + height, grid->comp_row + grid->Rows), + MIN(row + height, grid->comp_row + grid->rows), grid->comp_col, col); } - if (col + width < grid->comp_col + grid->Columns) { + if (col + width < grid->comp_col + grid->cols) { compose_area(MAX(row, grid->comp_row), - MIN(row + height, grid->comp_row + grid->Rows), - col + width, grid->comp_col + grid->Columns); + MIN(row + height, grid->comp_row + grid->rows), + col + width, grid->comp_col + grid->cols); } - compose_area(row + height, grid->comp_row + grid->Rows, - grid->comp_col, grid->comp_col + grid->Columns); + compose_area(row + height, grid->comp_row + grid->rows, + grid->comp_col, grid->comp_col + grid->cols); grid->comp_disabled = false; } grid->comp_row = row; @@ -188,8 +188,8 @@ bool ui_comp_put_grid(ScreenGrid *grid, int row, int col, int height, int width, grid->comp_index = insert_at; } if (moved && valid && ui_comp_should_draw()) { - compose_area(grid->comp_row, grid->comp_row + grid->Rows, - grid->comp_col, grid->comp_col + grid->Columns); + compose_area(grid->comp_row, grid->comp_row + grid->rows, + grid->comp_col, grid->comp_col + grid->cols); } return moved; } @@ -249,10 +249,10 @@ static void ui_comp_raise_grid(ScreenGrid *grid, size_t new_index) for (size_t i = old_index; i < new_index; i++) { ScreenGrid *grid2 = kv_A(layers, i); int startcol = MAX(grid->comp_col, grid2->comp_col); - int endcol = MIN(grid->comp_col + grid->Columns, - grid2->comp_col + grid2->Columns); + int endcol = MIN(grid->comp_col + grid->cols, + grid2->comp_col + grid2->cols); compose_area(MAX(grid->comp_row, grid2->comp_row), - MIN(grid->comp_row + grid->Rows, grid2->comp_row + grid2->Rows), + MIN(grid->comp_row + grid->rows, grid2->comp_row + grid2->rows), startcol, endcol); } } @@ -279,7 +279,7 @@ static void ui_comp_grid_cursor_goto(UI *ui, Integer grid_handle, Integer r, Int } } - if (cursor_col >= default_grid.Columns || cursor_row >= default_grid.Rows) { + if (cursor_col >= default_grid.cols || cursor_row >= default_grid.rows) { // TODO(bfredl): this happens with 'writedelay', refactor? // abort(); return; @@ -292,8 +292,8 @@ ScreenGrid *ui_comp_mouse_focus(int row, int col) for (ssize_t i = (ssize_t)kv_size(layers) - 1; i > 0; i--) { ScreenGrid *grid = kv_A(layers, i); if (grid->focusable - && row >= grid->comp_row && row < grid->comp_row + grid->Rows - && col >= grid->comp_col && col < grid->comp_col + grid->Columns) { + && row >= grid->comp_row && row < grid->comp_row + grid->rows + && col >= grid->comp_col && col < grid->comp_col + grid->cols) { return grid; } } @@ -315,7 +315,7 @@ static void compose_line(Integer row, Integer startcol, Integer endcol, LineFlag startcol--; skipstart = 1; } - if (endcol < default_grid.Columns && (flags & kLineFlagInvalid)) { + if (endcol < default_grid.cols && (flags & kLineFlagInvalid)) { endcol++; skipend = 1; } @@ -337,8 +337,8 @@ static void compose_line(Integer row, Integer startcol, Integer endcol, LineFlag // first check to see if any grids have pending updates to width/height, // to ensure that we don't accidentally put any characters into `linebuf` // that have been invalidated. - grid_width = MIN(g->Columns, g->comp_width); - grid_height = MIN(g->Rows, g->comp_height); + grid_width = MIN(g->cols, g->comp_width); + grid_height = MIN(g->rows, g->comp_height); if (g->comp_row > row || row >= g->comp_row + grid_height || g->comp_disabled) { continue; @@ -354,7 +354,7 @@ static void compose_line(Integer row, Integer startcol, Integer endcol, LineFlag assert(grid != NULL); assert(until > col); - assert(until <= default_grid.Columns); + assert(until <= default_grid.cols); size_t n = (size_t)(until - col); if (row == msg_sep_row && grid->comp_index <= msg_grid.comp_index) { @@ -371,7 +371,7 @@ static void compose_line(Integer row, Integer startcol, Integer endcol, LineFlag + (size_t)(col - grid->comp_col); memcpy(linebuf + (col - startcol), grid->chars + off, n * sizeof(*linebuf)); memcpy(attrbuf + (col - startcol), grid->attrs + off, n * sizeof(*attrbuf)); - if (grid->comp_col + grid->Columns > until + if (grid->comp_col + grid->cols > until && grid->chars[off + n][0] == NUL) { linebuf[until - 1 - startcol][0] = ' '; linebuf[until - 1 - startcol][1] = '\0'; @@ -452,8 +452,8 @@ static void compose_debug(Integer startrow, Integer endrow, Integer startcol, In return; } - endrow = MIN(endrow, default_grid.Rows); - endcol = MIN(endcol, default_grid.Columns); + endrow = MIN(endrow, default_grid.rows); + endcol = MIN(endcol, default_grid.cols); int attr = syn_id2attr(syn_id); for (int row = (int)startrow; row < endrow; row++) { @@ -480,8 +480,8 @@ static void debug_delay(Integer lines) static void compose_area(Integer startrow, Integer endrow, Integer startcol, Integer endcol) { compose_debug(startrow, endrow, startcol, endcol, dbghl_recompose, true); - endrow = MIN(endrow, default_grid.Rows); - endcol = MIN(endcol, default_grid.Columns); + endrow = MIN(endrow, default_grid.rows); + endcol = MIN(endcol, default_grid.cols); if (endcol <= startcol) { return; } @@ -497,8 +497,8 @@ static void compose_area(Integer startrow, Integer endrow, Integer startcol, Int void ui_comp_compose_grid(ScreenGrid *grid) { if (ui_comp_should_draw()) { - compose_area(grid->comp_row, grid->comp_row + grid->Rows, - grid->comp_col, grid->comp_col + grid->Columns); + compose_area(grid->comp_row, grid->comp_row + grid->rows, + grid->comp_col, grid->comp_col + grid->cols); } } @@ -523,17 +523,17 @@ static void ui_comp_raw_line(UI *ui, Integer grid, Integer row, Integer startcol // TODO(bfredl): this should not really be necessary. But on some condition // when resizing nvim, a window will be attempted to be drawn on the older // and possibly larger global screen size. - if (row >= default_grid.Rows) { + if (row >= default_grid.rows) { DLOG("compositor: invalid row %" PRId64 " on grid %" PRId64, row, grid); return; } - if (clearcol > default_grid.Columns) { + if (clearcol > default_grid.cols) { DLOG("compositor: invalid last column %" PRId64 " on grid %" PRId64, clearcol, grid); - if (startcol >= default_grid.Columns) { + if (startcol >= default_grid.cols) { return; } - clearcol = default_grid.Columns; + clearcol = default_grid.cols; endcol = MIN(endcol, clearcol); } @@ -581,7 +581,7 @@ static void ui_comp_msg_set_pos(UI *ui, Integer grid, Integer row, Boolean scrol } if (row > msg_current_row && ui_comp_should_draw()) { - compose_area(MAX(msg_current_row - 1, 0), row, 0, default_grid.Columns); + compose_area(MAX(msg_current_row - 1, 0), row, 0, default_grid.cols); } else if (row < msg_current_row && ui_comp_should_draw() && msg_current_row < Rows) { int delta = msg_current_row - (int)row; diff --git a/src/nvim/undo.c b/src/nvim/undo.c index 937e86b161..529eef19a3 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -702,7 +702,7 @@ char *u_get_undo_file_name(const char *const buf_ffname, const bool reading) const size_t ffname_len = strlen(ffname); undo_file_name = xmalloc(ffname_len + 6); memmove(undo_file_name, ffname, ffname_len + 1); - char *const tail = (char *)path_tail((char_u *)undo_file_name); + char *const tail = path_tail(undo_file_name); const size_t tail_len = strlen(tail); memmove(tail + 1, tail, tail_len + 1); *tail = '.'; @@ -2418,10 +2418,11 @@ static void u_undoredo(int undo, bool do_buf_event) changed_lines(top + 1, 0, bot, newsize - oldsize, do_buf_event); - // set '[ and '] mark + // Set the '[ mark. if (top + 1 < curbuf->b_op_start.lnum) { curbuf->b_op_start.lnum = top + 1; } + // Set the '] mark. if (newsize == 0 && top + 1 > curbuf->b_op_end.lnum) { curbuf->b_op_end.lnum = top + 1; } else if (top + newsize > curbuf->b_op_end.lnum) { @@ -2442,6 +2443,14 @@ static void u_undoredo(int undo, bool do_buf_event) newlist = uep; } + // Ensure the '[ and '] marks are within bounds. + if (curbuf->b_op_start.lnum > curbuf->b_ml.ml_line_count) { + curbuf->b_op_start.lnum = curbuf->b_ml.ml_line_count; + } + if (curbuf->b_op_end.lnum > curbuf->b_ml.ml_line_count) { + curbuf->b_op_end.lnum = curbuf->b_ml.ml_line_count; + } + // Adjust Extmarks ExtmarkUndoObject undo_info; if (undo) { diff --git a/src/nvim/version.c b/src/nvim/version.c index 2369681dca..1b520780d1 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -215,7 +215,7 @@ static const int included_patches[] = { 1709, 1708, 1707, - // 1706, + 1706, 1705, 1704, 1703, @@ -305,14 +305,14 @@ static const int included_patches[] = { 1619, 1618, 1617, - // 1616, + 1616, 1615, 1614, 1613, 1612, 1611, 1610, - // 1609, + 1609, 1608, 1607, 1606, @@ -359,7 +359,7 @@ static const int included_patches[] = { 1565, 1564, 1563, - // 1562, + 1562, 1561, 1560, 1559, @@ -554,7 +554,7 @@ static const int included_patches[] = { 1370, 1369, 1368, - // 1367, + 1367, 1366, 1365, 1364, @@ -582,11 +582,11 @@ static const int included_patches[] = { 1342, 1341, 1340, - // 1339, + 1339, 1338, 1337, 1336, - // 1335, + 1335, 1334, 1333, 1332, @@ -614,7 +614,7 @@ static const int included_patches[] = { 1310, 1309, 1308, - // 1307, + 1307, 1306, 1305, 1304, @@ -802,7 +802,7 @@ static const int included_patches[] = { 1122, 1121, 1120, - // 1119, + 1119, 1118, 1117, 1116, @@ -2201,8 +2201,8 @@ void maybe_intro_message(void) if (buf_is_empty(curbuf) && (curbuf->b_fname == NULL) && (firstwin->w_next == NULL) - && (vim_strchr(p_shm, SHM_INTRO) == NULL)) { - intro_message(FALSE); + && (vim_strchr((char *)p_shm, SHM_INTRO) == NULL)) { + intro_message(false); } } diff --git a/src/nvim/vim.h b/src/nvim/vim.h index 3c8a865fb1..1c05387da3 100644 --- a/src/nvim/vim.h +++ b/src/nvim/vim.h @@ -31,49 +31,49 @@ enum { NUMBUFLEN = 65, }; #define ROOT_UID 0 #include "nvim/gettext.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/macros.h" // special attribute addition: Put message in history #define MSG_HIST 0x1000 -// values for State +// Values for State // -// The lower bits up to 0x20 are used to distinguish normal/visual/op_pending -// and cmdline/insert+replace mode. This is used for mapping. If none of -// these bits are set, no mapping is done. -// The upper bits are used to distinguish between other states. - -#define NORMAL 0x01 // Normal mode, command expected -#define VISUAL 0x02 // Visual mode - use get_real_state() -#define OP_PENDING 0x04 // Normal mode, operator is pending - use - // get_real_state() -#define CMDLINE 0x08 // Editing command line -#define INSERT 0x10 // Insert mode -#define LANGMAP 0x20 // Language mapping, can be combined with - // INSERT and CMDLINE - -#define REPLACE_FLAG 0x40 // Replace mode flag -#define REPLACE (REPLACE_FLAG + INSERT) -#define VREPLACE_FLAG 0x80 // Virtual-replace mode flag -#define VREPLACE (REPLACE_FLAG + VREPLACE_FLAG + INSERT) -#define LREPLACE (REPLACE_FLAG + LANGMAP) - -#define NORMAL_BUSY (0x100 + NORMAL) // Normal mode, busy with a command -#define HITRETURN (0x200 + NORMAL) // waiting for return or command -#define ASKMORE 0x300 // Asking if you want --more-- -#define SETWSIZE 0x400 // window size has changed -#define ABBREV 0x500 // abbreviation instead of mapping -#define EXTERNCMD 0x600 // executing an external command -#define SHOWMATCH (0x700 + INSERT) // show matching paren -#define CONFIRM 0x800 // ":confirm" prompt -#define SELECTMODE 0x1000 // Select mode, only for mappings -#define TERM_FOCUS 0x2000 // Terminal focus mode -#define CMDPREVIEW 0x4000 // Showing 'inccommand' command "live" preview. - -// all mode bits used for mapping -#define MAP_ALL_MODES (0x3f | SELECTMODE | TERM_FOCUS) +// The lower bits up to 0x80 are used to distinguish normal/visual/op_pending +// /cmdline/insert/replace/terminal mode. This is used for mapping. If none +// of these bits are set, no mapping is done. See the comment above do_map(). +// The upper bits are used to distinguish between other states and variants of +// the base modes. + +#define MODE_NORMAL 0x01 // Normal mode, command expected +#define MODE_VISUAL 0x02 // Visual mode - use get_real_state() +#define MODE_OP_PENDING 0x04 // Normal mode, operator is pending - use + // get_real_state() +#define MODE_CMDLINE 0x08 // Editing the command line +#define MODE_INSERT 0x10 // Insert mode, also for Replace mode +#define MODE_LANGMAP 0x20 // Language mapping, can be combined with + // MODE_INSERT and MODE_CMDLINE +#define MODE_SELECT 0x40 // Select mode, use get_real_state() +#define MODE_TERMINAL 0x80 // Terminal mode + +#define MAP_ALL_MODES 0xff // all mode bits used for mapping + +#define REPLACE_FLAG 0x100 // Replace mode flag +#define MODE_REPLACE (REPLACE_FLAG | MODE_INSERT) +#define VREPLACE_FLAG 0x200 // Virtual-replace mode flag +#define MODE_VREPLACE (REPLACE_FLAG | VREPLACE_FLAG | MODE_INSERT) +#define MODE_LREPLACE (REPLACE_FLAG | MODE_LANGMAP) + +#define MODE_NORMAL_BUSY (0x1000 | MODE_NORMAL) // Normal mode, busy with a command +#define MODE_HITRETURN (0x2000 | MODE_NORMAL) // waiting for return or command +#define MODE_ASKMORE 0x3000 // Asking if you want --more-- +#define MODE_SETWSIZE 0x4000 // window size has changed +#define MODE_EXTERNCMD 0x5000 // executing an external command +#define MODE_SHOWMATCH (0x6000 | MODE_INSERT) // show matching paren +#define MODE_CONFIRM 0x7000 // ":confirm" prompt +#define MODE_CMDPREVIEW 0x8000 // Showing 'inccommand' command "live" preview. + /// Directions. typedef enum { diff --git a/src/nvim/window.c b/src/nvim/window.c index de57ce7a1d..9c9b1fe176 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -515,9 +515,14 @@ wingotofile: if ((len = find_ident_under_cursor(&ptr, FIND_IDENT)) == 0) { break; } + + // Make a copy, if the line was changed it will be freed. + ptr = vim_strnsave(ptr, len); + find_pattern_in_path(ptr, 0, len, true, Prenum == 0, type, Prenum1, ACTION_SPLIT, 1, MAXLNUM); - curwin->w_set_curswant = TRUE; + xfree(ptr); + curwin->w_set_curswant = true; break; // Quickfix window only: view the result under the cursor in a new split. @@ -695,6 +700,7 @@ win_T *win_new_float(win_T *wp, bool last, FloatConfig fconfig, Error *err) } wp->w_floating = 1; wp->w_status_height = 0; + wp->w_winbar_height = 0; wp->w_hsep_height = 0; wp->w_vsep_width = 0; @@ -780,10 +786,8 @@ void win_config_float(win_T *wp, FloatConfig fconfig) } if (!ui_has(kUIMultigrid)) { - wp->w_height = MIN(wp->w_height, - Rows - 1 - (wp->w_border_adj[0] + wp->w_border_adj[2])); - wp->w_width = MIN(wp->w_width, - Columns - (wp->w_border_adj[1] + wp->w_border_adj[3])); + wp->w_height = MIN(wp->w_height, Rows - 1 - win_extra_height(wp)); + wp->w_width = MIN(wp->w_width, Columns - win_extra_width(wp)); } win_set_inner_size(wp); @@ -1138,15 +1142,12 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) } else { layout = FR_COL; - /* - * Check if we are able to split the current window and compute its - * height. - */ - // Current window requires at least 1 space. - wmh1 = p_wmh == 0 ? 1 : p_wmh; + // Check if we are able to split the current window and compute its height. + // Current window requires at least 1 space plus space for the window bar. + wmh1 = MAX(p_wmh, 1) + oldwin->w_winbar_height; needed = wmh1 + STATUS_HEIGHT; if (flags & WSP_ROOM) { - needed += p_wh - wmh1; + needed += p_wh - wmh1 + oldwin->w_winbar_height; } if (flags & (WSP_BOT | WSP_TOP)) { minheight = frame_minheight(topframe, NOWIN) + need_status; @@ -1155,8 +1156,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) } else if (p_ea) { minheight = frame_minheight(oldwin->w_frame, NOWIN) + need_status; prevfrp = oldwin->w_frame; - for (frp = oldwin->w_frame->fr_parent; frp != NULL; - frp = frp->fr_parent) { + for (frp = oldwin->w_frame->fr_parent; frp != NULL; frp = frp->fr_parent) { if (frp->fr_layout == FR_COL) { FOR_ALL_FRAMES(frp2, frp->fr_child) { if (frp2 != prevfrp) { @@ -1339,6 +1339,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) set_fraction(oldwin); } wp->w_fraction = oldwin->w_fraction; + wp->w_winbar_height = oldwin->w_winbar_height; if (flags & WSP_VERT) { wp->w_p_scr = curwin->w_p_scr; @@ -1416,9 +1417,9 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) if (flags & (WSP_TOP | WSP_BOT)) { int new_fr_height = curfrp->fr_height - new_size; - if (!((flags & WSP_BOT) && p_ls == 0) && global_stl_height() == 0) { + if (!((flags & WSP_BOT) && p_ls == 0) && !is_stl_global) { new_fr_height -= STATUS_HEIGHT; - } else if (global_stl_height() > 0) { + } else if (is_stl_global) { if (flags & WSP_BOT) { frame_add_hsep(curfrp); } else { @@ -1452,7 +1453,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) } } } - if ((flags & WSP_BOT) && global_stl_height() == 0) { + if ((flags & WSP_BOT) && !is_stl_global) { frame_add_statusline(curfrp); } frame_fix_height(wp); @@ -1482,10 +1483,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) * equalize the window sizes. */ if (do_equal || dir != 0) { - win_equal(wp, true, - (flags & WSP_VERT) ? (dir == 'v' ? 'b' : 'h') - : dir == 'h' ? 'b' : - 'v'); + win_equal(wp, true, (flags & WSP_VERT) ? (dir == 'v' ? 'b' : 'h') : (dir == 'h' ? 'b' : 'v')); } // Don't change the window height/width to 'winheight' / 'winwidth' if a @@ -1675,10 +1673,10 @@ int win_count(void) } /// Make "count" windows on the screen. -/// Must be called when there is just one window, filling the whole screen +/// Must be called when there is just one window, filling the whole screen. /// (excluding the command line). /// -/// @param vertical split windows vertically if true +/// @param vertical split windows vertically if true. /// /// @return actual number of windows on the screen. int make_windows(int count, bool vertical) @@ -1687,15 +1685,15 @@ int make_windows(int count, bool vertical) int todo; if (vertical) { - // Each window needs at least 'winminwidth' lines and a separator - // column. + // Each window needs at least 'winminwidth' lines and a separator column. maxcount = (curwin->w_width + curwin->w_vsep_width - (p_wiw - p_wmw)) / (p_wmw + 1); } else { - // Each window needs at least 'winminheight' lines - // If statusline isn't global, each window also needs a statusline + // Each window needs at least 'winminheight' lines. + // If statusline isn't global, each window also needs a statusline. + // If 'winbar' is set, each window also needs a winbar. maxcount = (curwin->w_height + curwin->w_hsep_height + curwin->w_status_height - - (p_wh - p_wmh)) / (p_wmh + STATUS_HEIGHT); + - (p_wh - p_wmh)) / (p_wmh + STATUS_HEIGHT + global_winbar_height()); } if (maxcount < 2) { @@ -1705,17 +1703,13 @@ int make_windows(int count, bool vertical) count = maxcount; } - /* - * add status line now, otherwise first window will be too big - */ + // add status line now, otherwise first window will be too big if (count > 1) { last_status(true); } - /* - * Don't execute autocommands while creating the windows. Must do that - * when putting the buffers in the windows. - */ + // Don't execute autocommands while creating the windows. Must do that + // when putting the buffers in the windows. block_autocmds(); // todo is number of windows left to create @@ -1790,7 +1784,7 @@ static void win_exchange(long Prenum) * if wp != wp2 * 3. remove wp from the list * 4. insert wp after wp2 - * 5. exchange the status line height, hsep height and vsep width. + * 5. exchange the status line height, winbar height, hsep height and vsep width. */ wp2 = curwin->w_prev; frp2 = curwin->w_frame->fr_prev; @@ -1897,7 +1891,7 @@ static void win_rotate(bool upwards, int count) frame_insert(frp->fr_parent->fr_child, frp); } - // exchange status height, hsep height and vsep width of old and new last window + // exchange status height, winbar height, hsep height and vsep width of old and new last window n = wp2->w_status_height; wp2->w_status_height = wp1->w_status_height; wp1->w_status_height = n; @@ -1988,7 +1982,8 @@ void win_move_after(win_T *win1, win_T *win2) return; } - // may need move the status line, horizontal or vertical separator of the last window + // may need move the status line, window bar, horizontal or vertical separator of the last + // window if (win1 == lastwin) { height = win1->w_prev->w_status_height; win1->w_prev->w_status_height = win1->w_status_height; @@ -2237,7 +2232,7 @@ static void win_equal_rec(win_T *next_curwin, bool current, frame_T *topfr, int } else { extra_sep = 0; } - totwincount = (n + extra_sep) / (p_wmh + STATUS_HEIGHT); + totwincount = (n + extra_sep) / (p_wmh + STATUS_HEIGHT + global_winbar_height()); has_next_curwin = frame_has_win(topfr, next_curwin); /* @@ -2272,7 +2267,7 @@ static void win_equal_rec(win_T *next_curwin, bool current, frame_T *topfr, int } else { // These windows don't use up room. totwincount -= (n + (fr->fr_next == NULL - ? extra_sep : 0)) / (p_wmh + STATUS_HEIGHT); + ? extra_sep : 0)) / (p_wmh + STATUS_HEIGHT + global_winbar_height()); } room -= new_size - n; if (room < 0) { @@ -2318,7 +2313,7 @@ static void win_equal_rec(win_T *next_curwin, bool current, frame_T *topfr, int // Compute the maximum number of windows vert. in "fr". n = frame_minheight(fr, NOWIN); wincount = (n + (fr->fr_next == NULL ? extra_sep : 0)) - / (p_wmh + STATUS_HEIGHT); + / (p_wmh + STATUS_HEIGHT + global_winbar_height()); m = frame_minheight(fr, next_curwin); if (has_next_curwin) { hnc = frame_has_win(fr, next_curwin); @@ -2376,7 +2371,7 @@ static void leaving_window(win_T *const win) // When leaving the window (or closing the window) was done from a // callback we need to break out of the Insert mode loop and restart Insert // mode when entering the window again. - if (State & INSERT) { + if (State & MODE_INSERT) { stop_insert_mode = true; if (win->w_buffer->b_prompt_insert == NUL) { win->w_buffer->b_prompt_insert = 'A'; @@ -2400,7 +2395,7 @@ void entering_window(win_T *const win) // When entering the prompt window restart Insert mode if we were in Insert // mode when we left it and not already in Insert mode. - if ((State & INSERT) == 0) { + if ((State & MODE_INSERT) == 0) { restart_edit = win->w_buffer->b_prompt_insert; } } @@ -2916,8 +2911,8 @@ static void do_autocmd_winclosed(win_T *win) return; } recursive = true; - char_u winid[NUMBUFLEN]; - vim_snprintf((char *)winid, sizeof(winid), "%d", win->handle); + char winid[NUMBUFLEN]; + vim_snprintf(winid, sizeof(winid), "%d", win->handle); apply_autocmds(EVENT_WINCLOSED, winid, winid, false, win->w_buffer); recursive = false; } @@ -2984,9 +2979,9 @@ void win_close_othertab(win_T *win, int free_buf, tabpage_T *tp) // When closing the last window in a tab page remove the tab page. if (tp->tp_firstwin == tp->tp_lastwin) { - char_u prev_idx[NUMBUFLEN]; + char prev_idx[NUMBUFLEN]; if (has_event(EVENT_TABCLOSED)) { - vim_snprintf((char *)prev_idx, NUMBUFLEN, "%i", tabpage_index(tp)); + vim_snprintf(prev_idx, NUMBUFLEN, "%i", tabpage_index(tp)); } if (tp == first_tabpage) { @@ -3732,13 +3727,9 @@ static void frame_fix_height(win_T *wp) wp->w_frame->fr_height = wp->w_height + wp->w_hsep_height + wp->w_status_height; } -/* - * Compute the minimal height for frame "topfrp". - * Uses the 'winminheight' option. - * When "next_curwin" isn't NULL, use p_wh for this window. - * When "next_curwin" is NOWIN, don't use at least one line for the current - * window. - */ +/// Compute the minimal height for frame "topfrp". Uses the 'winminheight' option. +/// When "next_curwin" isn't NULL, use p_wh for this window. +/// When "next_curwin" is NOWIN, don't use at least one line for the current window. static int frame_minheight(frame_T *topfrp, win_T *next_curwin) { frame_T *frp; @@ -3746,12 +3737,14 @@ static int frame_minheight(frame_T *topfrp, win_T *next_curwin) int n; if (topfrp->fr_win != NULL) { + // Combined height of window bar and separator column or status line. + int extra_height = topfrp->fr_win->w_winbar_height + topfrp->fr_win->w_hsep_height + + topfrp->fr_win->w_status_height; + if (topfrp->fr_win == next_curwin) { - m = p_wh + topfrp->fr_win->w_hsep_height + topfrp->fr_win->w_status_height; + m = p_wh + extra_height; } else { - // window: minimal height of the window plus separator column or status line - // depending on whether global statusline is enabled - m = p_wmh + topfrp->fr_win->w_hsep_height + topfrp->fr_win->w_status_height; + m = p_wmh + extra_height; if (topfrp->fr_win == curwin && next_curwin == NULL) { // Current window is minimal one line high. if (p_wmh == 0) { @@ -3976,7 +3969,7 @@ static void new_frame(win_T *wp) void win_init_size(void) { firstwin->w_height = ROWS_AVAIL; - firstwin->w_height_inner = firstwin->w_height; + firstwin->w_height_inner = firstwin->w_height - firstwin->w_winbar_height; firstwin->w_height_outer = firstwin->w_height; topframe->fr_height = ROWS_AVAIL; firstwin->w_width = Columns; @@ -4087,6 +4080,7 @@ int win_new_tabpage(int after, char_u *filename) newtp->tp_topframe = topframe; last_status(false); + set_winbar(); redraw_all_later(NOT_VALID); @@ -4098,7 +4092,7 @@ int win_new_tabpage(int after, char_u *filename) apply_autocmds(EVENT_WINNEW, NULL, NULL, false, curbuf); apply_autocmds(EVENT_WINENTER, NULL, NULL, false, curbuf); - apply_autocmds(EVENT_TABNEW, filename, filename, false, curbuf); + apply_autocmds(EVENT_TABNEW, (char *)filename, (char *)filename, false, curbuf); apply_autocmds(EVENT_TABENTER, NULL, NULL, false, curbuf); return OK; @@ -4890,7 +4884,7 @@ void fix_current_dir(void) // (unless that was done already) and change to the local directory. if (globaldir == NULL) { if (cwd[0] != NUL) { - globaldir = (char_u *)xstrdup(cwd); + globaldir = xstrdup(cwd); } } bool dir_differs = pathcmp(new_dir, cwd, -1) != 0; @@ -4909,13 +4903,13 @@ void fix_current_dir(void) } else if (globaldir != NULL) { // Window doesn't have a local directory and we are not in the global // directory: Change to the global directory. - bool dir_differs = pathcmp((char *)globaldir, cwd, -1) != 0; + bool dir_differs = pathcmp(globaldir, cwd, -1) != 0; if (!p_acd && dir_differs) { - do_autocmd_dirchanged((char *)globaldir, kCdScopeGlobal, kCdCauseWindow, true); + do_autocmd_dirchanged(globaldir, kCdScopeGlobal, kCdCauseWindow, true); } - if (os_chdir((char *)globaldir) == 0) { + if (os_chdir(globaldir) == 0) { if (!p_acd && dir_differs) { - do_autocmd_dirchanged((char *)globaldir, kCdScopeGlobal, kCdCauseWindow, false); + do_autocmd_dirchanged(globaldir, kCdScopeGlobal, kCdCauseWindow, false); } } XFREE_CLEAR(globaldir); @@ -5317,8 +5311,8 @@ void may_trigger_winscrolled(void) || wp->w_last_leftcol != wp->w_leftcol || wp->w_last_width != wp->w_width || wp->w_last_height != wp->w_height) { - char_u winid[NUMBUFLEN]; - vim_snprintf((char *)winid, sizeof(winid), "%d", wp->handle); + char winid[NUMBUFLEN]; + vim_snprintf(winid, sizeof(winid), "%d", wp->handle); recursive = true; apply_autocmds(EVENT_WINSCROLLED, winid, winid, false, wp->w_buffer); @@ -5460,16 +5454,9 @@ void win_setheight(int height) */ void win_setheight_win(int height, win_T *win) { - if (win == curwin) { - // Always keep current window at least one line high, even when - // 'winminheight' is zero. - if (height < p_wmh) { - height = p_wmh; - } - if (height == 0) { - height = 1; - } - } + // Always keep current window at least one line high, even when 'winminheight' is zero. + // Keep window at least two lines high if 'winbar' is enabled. + height = MAX(height, (win == curwin ? MAX(p_wmh, 1) : p_wmh) + win->w_winbar_height); if (win->w_floating) { win->w_float_config.height = height; @@ -6262,7 +6249,7 @@ void win_set_inner_size(win_T *wp) int prev_height = wp->w_height_inner; int height = wp->w_height_request; if (height == 0) { - height = wp->w_height; + height = wp->w_height - wp->w_winbar_height; } if (height != prev_height) { @@ -6279,8 +6266,8 @@ void win_set_inner_size(win_T *wp) set_fraction(wp); } } - wp->w_height_inner = height; wp->w_skipcol = 0; + wp->w_height_inner = height; // There is no point in adjusting the scroll position when exiting. Some // values might be invalid. @@ -6306,10 +6293,20 @@ void win_set_inner_size(win_T *wp) terminal_check_size(wp->w_buffer->terminal); } - wp->w_height_outer = (wp->w_height_inner - + wp->w_border_adj[0] + wp->w_border_adj[2]); - wp->w_width_outer = (wp->w_width_inner - + wp->w_border_adj[1] + wp->w_border_adj[3]); + wp->w_height_outer = (wp->w_height_inner + win_extra_height(wp)); + wp->w_width_outer = (wp->w_width_inner + win_extra_width(wp)); + wp->w_winrow_off = wp->w_border_adj[0] + wp->w_winbar_height; + wp->w_wincol_off = wp->w_border_adj[3]; +} + +static int win_extra_height(win_T *wp) +{ + return wp->w_border_adj[0] + wp->w_border_adj[2] + wp->w_winbar_height; +} + +static int win_extra_width(win_T *wp) +{ + return wp->w_border_adj[1] + wp->w_border_adj[3]; } /// Set the width of a window. @@ -6477,7 +6474,7 @@ char_u *file_name_at_cursor(int options, long count, linenr_T *file_lnum) char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u *rel_fname, linenr_T *file_lnum) { - char_u *ptr; + char *ptr; size_t len; bool in_type = true; bool is_url = false; @@ -6485,7 +6482,7 @@ char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u /* * search forward for what could be the start of a file name */ - ptr = line + col; + ptr = (char *)line + col; while (*ptr != NUL && !vim_isfilec(*ptr)) { MB_PTR_ADV(ptr); } @@ -6500,11 +6497,10 @@ char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u * Search backward for first char of the file name. * Go one char back to ":" before "//" even when ':' is not in 'isfname'. */ - while (ptr > line) { - if ((len = (size_t)(utf_head_off(line, ptr - 1))) > 0) { + while ((char_u *)ptr > line) { + if ((len = (size_t)(utf_head_off(line, (char_u *)ptr - 1))) > 0) { ptr -= len + 1; - } else if (vim_isfilec(ptr[-1]) - || ((options & FNAME_HYP) && path_is_url((char *)ptr - 1))) { + } else if (vim_isfilec(ptr[-1]) || ((options & FNAME_HYP) && path_is_url(ptr - 1))) { ptr--; } else { break; @@ -6517,13 +6513,13 @@ char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u */ len = 0; while (vim_isfilec(ptr[len]) || (ptr[len] == '\\' && ptr[len + 1] == ' ') - || ((options & FNAME_HYP) && path_is_url((char *)ptr + len)) - || (is_url && vim_strchr((char_u *)":?&=", ptr[len]) != NULL)) { + || ((options & FNAME_HYP) && path_is_url(ptr + len)) + || (is_url && vim_strchr(":?&=", ptr[len]) != NULL)) { // After type:// we also include :, ?, & and = as valid characters, so that // http://google.com:8080?q=this&that=ok works. if ((ptr[len] >= 'A' && ptr[len] <= 'Z') || (ptr[len] >= 'a' && ptr[len] <= 'z')) { - if (in_type && path_is_url((char *)ptr + len + 1)) { + if (in_type && path_is_url(ptr + len + 1)) { is_url = true; } } else { @@ -6534,20 +6530,20 @@ char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u // Skip over the "\" in "\ ". ++len; } - len += (size_t)(utfc_ptr2len((char *)ptr + len)); + len += (size_t)(utfc_ptr2len(ptr + len)); } /* * If there is trailing punctuation, remove it. * But don't remove "..", could be a directory name. */ - if (len > 2 && vim_strchr((char_u *)".,:;!", ptr[len - 1]) != NULL + if (len > 2 && vim_strchr(".,:;!", ptr[len - 1]) != NULL && ptr[len - 2] != '.') { --len; } if (file_lnum != NULL) { - char_u *p; + char *p; const char *line_english = " line "; const char *line_transl = _(line_msg); @@ -6560,20 +6556,20 @@ char_u *file_name_in_line(char_u *line, int col, int options, long count, char_u } else if (STRNCMP(p, line_transl, STRLEN(line_transl)) == 0) { p += STRLEN(line_transl); } else { - p = (char_u *)skipwhite((char *)p); + p = skipwhite(p); } if (*p != NUL) { if (!isdigit(*p)) { p++; // skip the separator } - p = (char_u *)skipwhite((char *)p); + p = skipwhite(p); if (isdigit(*p)) { - *file_lnum = getdigits_long(&p, false, 0); + *file_lnum = getdigits_long((char_u **)&p, false, 0); } } } - return find_file_name_in_path(ptr, len, options, count, rel_fname); + return find_file_name_in_path((char_u *)ptr, len, options, count, rel_fname); } /// Add or remove a status line from window(s), according to the @@ -6663,6 +6659,19 @@ static void last_status_rec(frame_T *fr, bool statusline, bool is_stl_global) } } +// Add or remove window bars from windows depending on the value of 'winbar'. +void set_winbar(void) +{ + FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { + int winbar_height = (*p_wbr != NUL || *wp->w_p_wbr != NUL) ? 1 : 0; + if (wp->w_winbar_height != winbar_height) { + wp->w_winbar_height = winbar_height; + win_set_inner_size(wp); + wp->w_redr_winbar = winbar_height; + } + } +} + /// Return the number of lines used by the tab page line. int tabline_height(void) { @@ -6679,6 +6688,12 @@ int tabline_height(void) return 1; } +/// Return the number of lines used by default by the window bar. +int global_winbar_height(void) +{ + return *p_wbr != NUL ? 1 : 0; +} + /// Return the number of lines used by the global statusline int global_stl_height(void) { diff --git a/test/functional/api/autocmd_spec.lua b/test/functional/api/autocmd_spec.lua index 41de308a2c..c08c411de1 100644 --- a/test/functional/api/autocmd_spec.lua +++ b/test/functional/api/autocmd_spec.lua @@ -230,6 +230,34 @@ describe('autocmd api', function() }, meths.get_var("autocmd_args")) end) + + it('can receive arbitrary data', function() + local function test(data) + eq(data, exec_lua([[ + local input = ... + local output + vim.api.nvim_create_autocmd("User", { + pattern = "Test", + callback = function(args) + output = args.data + end, + }) + + vim.api.nvim_exec_autocmds("User", { + pattern = "Test", + data = input, + }) + + return output + ]], data)) + end + + test("Hello") + test(42) + test(true) + test({ "list" }) + test({ foo = "bar" }) + end) end) describe('nvim_get_autocmds', function() diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua index fc09e4cde0..2728dcf74c 100644 --- a/test/functional/api/buffer_updates_spec.lua +++ b/test/functional/api/buffer_updates_spec.lua @@ -785,7 +785,8 @@ describe('API: buffer events:', function() local function lines_subset(first, second) for i = 1,#first do - if first[i] ~= second[i] then + -- need to ignore trailing spaces + if first[i]:gsub(' +$', '') ~= second[i]:gsub(' +$', '') then return false end end @@ -827,7 +828,6 @@ describe('API: buffer events:', function() end it('when :terminal lines change', function() - if helpers.pending_win32(pending) then return end local buffer_lines = {} local expected_lines = {} command('terminal "'..nvim_prog..'" -u NONE -i NONE -n -c "set shortmess+=A"') diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index d68f299277..c4748cc00d 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -1,5 +1,6 @@ local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') +local lfs = require('lfs') local fmt = string.format local assert_alive = helpers.assert_alive @@ -25,6 +26,7 @@ local tmpname = helpers.tmpname local write_file = helpers.write_file local exec_lua = helpers.exec_lua local exc_exec = helpers.exc_exec +local insert = helpers.insert local pcall_err = helpers.pcall_err local format_string = helpers.format_string @@ -3042,6 +3044,10 @@ describe('API', function() eq('fillchar must be a single character', pcall_err(meths.eval_statusline, '', { fillchar = 1 })) end) + it('rejects invalid string', function() + eq('E539: Illegal character <}>', + pcall_err(meths.eval_statusline, '%{%}', {})) + end) describe('highlight parsing', function() it('works', function() eq({ @@ -3096,6 +3102,19 @@ describe('API', function() 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', { use_tabline = true, highlights = true })) end) + it('works with winbar', function() + eq({ + str = 'TextWithNoHighlightTextWithWarningHighlight', + width = 43, + highlights = { + { start = 0, group = 'WinBar' }, + { start = 19, group = 'WarningMsg' } + } + }, + meths.eval_statusline( + 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', + { use_winbar = true, highlights = true })) + end) end) end) describe('nvim_parse_cmd', function() @@ -3473,4 +3492,149 @@ describe('API', function() pcall_err(meths.parse_cmd, '4,6Fubar', {})) end) end) + describe('nvim_cmd', function() + it('works', function () + meths.cmd({ cmd = "set", args = { "cursorline" } }, {}) + eq(true, meths.get_option_value("cursorline", {})) + end) + it('captures output', function() + eq("foo", meths.cmd({ cmd = "echo", args = { '"foo"' } }, { output = true })) + end) + it('sets correct script context', function() + meths.cmd({ cmd = "set", args = { "cursorline" } }, {}) + local str = meths.exec([[verbose set cursorline?]], true) + neq(nil, str:find("cursorline\n\tLast set from API client %(channel id %d+%)")) + end) + it('works with range', function() + insert [[ + line1 + line2 + line3 + line4 + you didn't expect this + line5 + line6 + ]] + meths.cmd({ cmd = "del", range = {2, 4} }, {}) + expect [[ + line1 + you didn't expect this + line5 + line6 + ]] + end) + it('works with count', function() + insert [[ + line1 + line2 + line3 + line4 + you didn't expect this + line5 + line6 + ]] + meths.cmd({ cmd = "del", range = { 2 }, count = 4 }, {}) + expect [[ + line1 + line5 + line6 + ]] + end) + it('works with register', function() + insert [[ + line1 + line2 + line3 + line4 + you didn't expect this + line5 + line6 + ]] + meths.cmd({ cmd = "del", range = { 2, 4 }, reg = 'a' }, {}) + meths.exec("1put a", false) + expect [[ + line1 + line2 + line3 + line4 + you didn't expect this + line5 + line6 + ]] + end) + it('works with bang', function () + meths.create_user_command("Foo", 'echo "<bang>"', { bang = true }) + eq("!", meths.cmd({ cmd = "Foo", bang = true }, { output = true })) + eq("", meths.cmd({ cmd = "Foo", bang = false }, { output = true })) + end) + it('works with modifiers', function() + meths.create_user_command("Foo", 'set verbose', {}) + eq(" verbose=1", meths.cmd({ cmd = "Foo", mods = { verbose = 1 } }, { output = true })) + eq(0, meths.get_option_value("verbose", {})) + end) + it('works with magic.file', function() + exec_lua([[ + vim.api.nvim_create_user_command("Foo", function(opts) + vim.api.nvim_echo({{ opts.fargs[1] }}, false, {}) + end, { nargs = 1 }) + ]]) + eq(lfs.currentdir(), + meths.cmd({ cmd = "Foo", args = { '%:p:h' }, magic = { file = true } }, + { output = true })) + end) + it('splits arguments correctly', function() + meths.exec([[ + function! FooFunc(...) + echo a:000 + endfunction + ]], false) + meths.create_user_command("Foo", "call FooFunc(<f-args>)", { nargs = '+' }) + eq([=[['a quick', 'brown fox', 'jumps over the', 'lazy dog']]=], + meths.cmd({ cmd = "Foo", args = { "a quick", "brown fox", "jumps over the", "lazy dog"}}, + { output = true })) + eq([=[['test \ \\ \"""\', 'more\ tests\" ']]=], + meths.cmd({ cmd = "Foo", args = { [[test \ \\ \"""\]], [[more\ tests\" ]] } }, + { output = true })) + end) + it('splits arguments correctly for Lua callback', function() + meths.exec_lua([[ + local function FooFunc(opts) + vim.pretty_print(opts.fargs) + end + + vim.api.nvim_create_user_command("Foo", FooFunc, { nargs = '+' }) + ]], {}) + eq([[{ "a quick", "brown fox", "jumps over the", "lazy dog" }]], + meths.cmd({ cmd = "Foo", args = { "a quick", "brown fox", "jumps over the", "lazy dog"}}, + { output = true })) + eq([[{ 'test \\ \\\\ \\"""\\', 'more\\ tests\\" ' }]], + meths.cmd({ cmd = "Foo", args = { [[test \ \\ \"""\]], [[more\ tests\" ]] } }, + { output = true })) + end) + it('works with buffer names', function() + command("edit foo.txt | edit bar.txt") + meths.cmd({ cmd = "buffer", args = { "foo.txt" } }, {}) + eq("foo.txt", funcs.fnamemodify(meths.buf_get_name(0), ":t")) + meths.cmd({ cmd = "buffer", args = { "bar.txt" } }, {}) + eq("bar.txt", funcs.fnamemodify(meths.buf_get_name(0), ":t")) + end) + it('triggers CmdUndefined event if command is not found', function() + meths.exec_lua([[ + vim.api.nvim_create_autocmd("CmdUndefined", + { pattern = "Foo", + callback = function() + vim.api.nvim_create_user_command("Foo", "echo 'foo'", {}) + end + }) + ]], {}) + eq("foo", meths.cmd({ cmd = "Foo" }, { output = true })) + end) + it('errors if command is not implemented', function() + eq("Command not implemented: popup", pcall_err(meths.cmd, { cmd = "popup" }, {})) + end) + it('works with empty arguments list', function() + meths.cmd({ cmd = "update" }, {}) + meths.cmd({ cmd = "buffer", count = 0 }, {}) + end) + end) end) diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index c31ab2060a..9aacac37bf 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -166,23 +166,23 @@ describe('API/win', function() local oldwin = curwin() command('vsplit') screen:expect([[ - aaa {4:│}aaa | - bbb {4:│}bbb | - ccc {4:│}ccc | - {2:dd^d }{4:│}{2:ddd }| - {1:~ }{4:│}{1:~ }| - {1:~ }{4:│}{1:~ }| + aaa │aaa | + bbb │bbb | + ccc │ccc | + {2:dd^d }│{2:ddd }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| {3:[No Name] [+] 4,3 All }{4:[No Name] [+] 4,3 All}| | ]]) window('set_cursor', oldwin, {1, 0}) screen:expect([[ - aaa {4:│}{2:aaa }| - bbb {4:│}bbb | - ccc {4:│}ccc | - {2:dd^d }{4:│}ddd | - {1:~ }{4:│}{1:~ }| - {1:~ }{4:│}{1:~ }| + aaa │{2:aaa }| + bbb │bbb | + ccc │ccc | + {2:dd^d }│ddd | + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| {3:[No Name] [+] 4,3 All }{4:[No Name] [+] 1,1 All}| | ]]) diff --git a/test/functional/core/startup_spec.lua b/test/functional/core/startup_spec.lua index 20ea3621f0..f87fd8e951 100644 --- a/test/functional/core/startup_spec.lua +++ b/test/functional/core/startup_spec.lua @@ -53,7 +53,6 @@ describe('startup', function() ]]) end) it('in a TTY: has("ttyin")==1 has("ttyout")==1', function() - if helpers.pending_win32(pending) then return end local screen = Screen.new(25, 4) screen:attach() if iswin() then @@ -105,7 +104,6 @@ describe('startup', function() end) end) it('input from pipe (implicit) #7679', function() - if helpers.pending_win32(pending) then return end local screen = Screen.new(25, 4) screen:attach() if iswin() then @@ -261,7 +259,6 @@ describe('startup', function() end) it('ENTER dismisses early message #7967', function() - if helpers.pending_win32(pending) then return end local screen screen = Screen.new(60, 6) screen:attach() @@ -494,14 +491,14 @@ describe('sysinit', function() end) it('fixed hang issue with -D (#12647)', function() - if helpers.pending_win32(pending) then return end local screen - screen = Screen.new(60, 6) + screen = Screen.new(60, 7) screen:attach() command([[let g:id = termopen('"]]..nvim_prog.. [[" -u NONE -i NONE --cmd "set noruler" -D')]]) screen:expect([[ ^ | + | Entering Debug mode. Type "cont" to continue. | cmd: augroup nvim_terminal | > | @@ -512,6 +509,7 @@ describe('sysinit', function() screen:expect([[ ^ | ~ | + ~ | [No Name] | | <" -u NONE -i NONE --cmd "set noruler" -D 1,0-1 All| diff --git a/test/functional/editor/tabpage_spec.lua b/test/functional/editor/tabpage_spec.lua index 2494daf99b..3b2c1db350 100644 --- a/test/functional/editor/tabpage_spec.lua +++ b/test/functional/editor/tabpage_spec.lua @@ -7,6 +7,7 @@ local neq = helpers.neq local feed = helpers.feed local eval = helpers.eval local exec = helpers.exec +local funcs = helpers.funcs describe('tabpage', function() before_each(clear) @@ -51,5 +52,13 @@ describe('tabpage', function() ]]) neq(999, eval('g:win_closed')) end) -end) + it(":tabmove handles modifiers and addr", function() + command('tabnew | tabnew | tabnew') + eq(4, funcs.nvim_tabpage_get_number(0)) + command(' silent :keepalt :: ::: silent! - tabmove') + eq(3, funcs.nvim_tabpage_get_number(0)) + command(' silent :keepalt :: ::: silent! -2 tabmove') + eq(1, funcs.nvim_tabpage_get_number(0)) + end) +end) diff --git a/test/functional/ex_cmds/drop_spec.lua b/test/functional/ex_cmds/drop_spec.lua index 9d84a2d4f6..2537ab9cdc 100644 --- a/test/functional/ex_cmds/drop_spec.lua +++ b/test/functional/ex_cmds/drop_spec.lua @@ -41,14 +41,14 @@ describe(":drop", function() feed_command("edit tmp2") feed_command("drop tmp1") screen:expect([[ - {2:│}^ | - {0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }| + │^ | + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| {2:tmp2 }{1:tmp1 }| :drop tmp1 | ]]) @@ -62,14 +62,14 @@ describe(":drop", function() feed("iABC<esc>") feed_command("drop tmp3") screen:expect([[ - ^ {2:│} | - {0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }| - {1:tmp3 }{2:│}{0:~ }| - ABC {2:│}{0:~ }| - {0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }| + ^ │ | + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {1:tmp3 }│{0:~ }| + ABC │{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| {2:tmp2 [+] tmp1 }| "tmp3" [New] | ]]) diff --git a/test/functional/ex_cmds/mksession_spec.lua b/test/functional/ex_cmds/mksession_spec.lua index 2702fb196f..c1b4777d16 100644 --- a/test/functional/ex_cmds/mksession_spec.lua +++ b/test/functional/ex_cmds/mksession_spec.lua @@ -1,20 +1,22 @@ local lfs = require('lfs') local helpers = require('test.functional.helpers')(after_each) +local Screen = require('test.functional.ui.screen') local clear = helpers.clear local command = helpers.command local get_pathsep = helpers.get_pathsep +local iswin = helpers.iswin local eq = helpers.eq local neq = helpers.neq local funcs = helpers.funcs local matches = helpers.matches local pesc = helpers.pesc local rmdir = helpers.rmdir +local sleep = helpers.sleep local file_prefix = 'Xtest-functional-ex_cmds-mksession_spec' describe(':mksession', function() - if helpers.pending_win32(pending) then return end local session_file = file_prefix .. '.vim' local tab_dir = file_prefix .. '.d' @@ -103,9 +105,13 @@ describe(':mksession', function() local session_path = cwd_dir..'/'..session_file command('cd '..tab_dir) - command('terminal echo $PWD') + command('terminal') command('cd '..cwd_dir) command('mksession '..session_path) + command('bdelete!') + if iswin() then + sleep(100) -- Make sure all child processes have exited. + end command('qall!') -- Create a new test instance of Nvim. @@ -114,6 +120,50 @@ describe(':mksession', function() local expected_cwd = cwd_dir..'/'..tab_dir matches('^term://'..pesc(expected_cwd)..'//%d+:', funcs.expand('%')) + command('bdelete!') + if iswin() then + sleep(100) -- Make sure all child processes have exited. + end + end) + + it('restores CWD for :terminal buffer at root directory #16988', function() + if iswin() then + pending('N/A for Windows') + return + end + + local screen + local cwd_dir = funcs.fnamemodify('.', ':p:~'):gsub([[[\/]*$]], '') + local session_path = cwd_dir..'/'..session_file + + screen = Screen.new(50, 6) + screen:attach({rgb=false}) + local expected_screen = [[ + ^/ | + | + [Process exited 0] | + | + | + | + ]] + + command('cd /') + command('terminal echo $PWD') + + -- Verify that the terminal's working directory is "/". + screen:expect(expected_screen) + + command('cd '..cwd_dir) + command('mksession '..session_path) command('qall!') + + -- Create a new test instance of Nvim. + clear() + screen = Screen.new(50, 6) + screen:attach({rgb=false}) + command('silent source '..session_path) + + -- Verify that the terminal's working directory is "/". + screen:expect(expected_screen) end) end) diff --git a/test/functional/fixtures/fake-lsp-server.lua b/test/functional/fixtures/fake-lsp-server.lua index f589f5955f..86cdf4ef56 100644 --- a/test/functional/fixtures/fake-lsp-server.lua +++ b/test/functional/fixtures/fake-lsp-server.lua @@ -766,8 +766,21 @@ function tests.code_action_filter() isPreferred = true, command = 'preferred_command', } + local quickfix_action = { + title = 'Action 3', + kind = 'quickfix', + command = 'quickfix_command', + } + local quickfix_foo_action = { + title = 'Action 4', + kind = 'quickfix.foo', + command = 'quickfix_foo_command', + } + expect_request('textDocument/codeAction', function() + return nil, { action, preferred_action, quickfix_action, quickfix_foo_action, } + end) expect_request('textDocument/codeAction', function() - return nil, { action, preferred_action, } + return nil, { action, preferred_action, quickfix_action, quickfix_foo_action, } end) notify('shutdown') end; diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua index e9c3d4bd92..3d64625752 100644 --- a/test/functional/helpers.lua +++ b/test/functional/helpers.lua @@ -41,10 +41,8 @@ module.nvim_set = ( module.nvim_argv = { module.nvim_prog, '-u', 'NONE', '-i', 'NONE', '--cmd', module.nvim_set, - '--cmd', 'unmap Y', - '--cmd', 'unmap <C-L>', - '--cmd', 'iunmap <C-U>', - '--cmd', 'iunmap <C-W>', + '--cmd', 'mapclear', + '--cmd', 'mapclear!', '--embed'} -- Directory containing nvim. diff --git a/test/functional/legacy/display_spec.lua b/test/functional/legacy/display_spec.lua index 4c7915403c..ccc709cbf6 100644 --- a/test/functional/legacy/display_spec.lua +++ b/test/functional/legacy/display_spec.lua @@ -71,14 +71,14 @@ describe('display', function() 100wincmd < ]]) screen:expect([[ - ^a{3:│}aaa | - a{3:│}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb| - a{3:│}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb | - b{3:│}{1:~ }| - b{3:│}{1:~ }| - b{3:│}{1:~ }| - b{3:│}{1:~ }| - {1:@}{3:│}{1:~ }| + ^a│aaa | + a│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb| + a│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb | + b│{1:~ }| + b│{1:~ }| + b│{1:~ }| + b│{1:~ }| + {1:@}│{1:~ }| {2:< }{3:[No Name] [+] }| | ]]) @@ -86,14 +86,14 @@ describe('display', function() screen:expect_unchanged() command('100wincmd >') screen:expect([[ - ^aaa {3:│}a| - bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{3:│}a| - bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {3:│}a| - {1:~ }{3:│}b| - {1:~ }{3:│}b| - {1:~ }{3:│}b| - {1:~ }{3:│}b| - {1:~ }{3:│}{1:@}| + ^aaa │a| + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│a| + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │a| + {1:~ }│b| + {1:~ }│b| + {1:~ }│b| + {1:~ }│b| + {1:~ }│{1:@}| {2:[No Name] [+] }{3:<}| | ]]) diff --git a/test/functional/legacy/listchars_spec.lua b/test/functional/legacy/listchars_spec.lua index 206e226767..a94ec431d4 100644 --- a/test/functional/legacy/listchars_spec.lua +++ b/test/functional/legacy/listchars_spec.lua @@ -117,106 +117,106 @@ describe("'listchars'", function() ]]) feed('13<C-W>>') screen:expect([[ - {4: }aaa {3:│}{4: }a{1:>}{3:│}{4: }^aaa | - {4: } {3:│}{4: } {3:│}{4: } | - {4: }a {3:│}{4: }a {3:│}{4: }a | - {4: }aaaaaa {3:│}{4: }a{1:>}{3:│}{4: }aaaaaa | - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| + {4: }aaa │{4: }a{1:>}│{4: }^aaa | + {4: } │{4: } │{4: } | + {4: }a │{4: }a │{4: }a | + {4: }aaaaaa │{4: }a{1:>}│{4: }aaaaaa | + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| {3:[No Name] [+] <[+] }{2:[No Name] [+] }| | ]]) feed('<C-W>>') screen:expect([[ - {4: }aaa {3:│}{4: }{1:>}{3:│}{4: }^aaa | - {4: } {3:│}{4: } {3:│}{4: } | - {4: }a {3:│}{4: }a{3:│}{4: }a | - {4: }aaaaaa {3:│}{4: }{1:>}{3:│}{4: }aaaaaa | - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| + {4: }aaa │{4: }{1:>}│{4: }^aaa | + {4: } │{4: } │{4: } | + {4: }a │{4: }a│{4: }a | + {4: }aaaaaa │{4: }{1:>}│{4: }aaaaaa | + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| {3:[No Name] [+] <+] }{2:[No Name] [+] }| | ]]) feed('<C-W>>') screen:expect([[ - {4: }aaa {3:│}{4: }{3:│}{4: }^aaa | - {4: } {3:│}{4: }{3:│}{4: } | - {4: }a {3:│}{4: }{3:│}{4: }a | - {4: }aaaaaa {3:│}{4: }{3:│}{4: }aaaaaa | - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| + {4: }aaa │{4: }│{4: }^aaa | + {4: } │{4: }│{4: } | + {4: }a │{4: }│{4: }a | + {4: }aaaaaa │{4: }│{4: }aaaaaa | + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| {3:[No Name] [+] <] }{2:[No Name] [+] }| | ]]) feed('<C-W>>') screen:expect([[ - {4: }aaa {3:│}{4: }{3:│}{4: }^aaa | - {4: } {3:│}{4: }{3:│}{4: } | - {4: }a {3:│}{4: }{3:│}{4: }a | - {4: }aaaaaa {3:│}{4: }{3:│}{4: }aaaaaa | - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| + {4: }aaa │{4: }│{4: }^aaa | + {4: } │{4: }│{4: } | + {4: }a │{4: }│{4: }a | + {4: }aaaaaa │{4: }│{4: }aaaaaa | + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| {3:[No Name] [+] < }{2:[No Name] [+] }| | ]]) feed('<C-W>>') screen:expect([[ - {4: }aaa {3:│}{4: }{3:│}{4: }^aaa | - {4: } {3:│}{4: }{3:│}{4: } | - {4: }a {3:│}{4: }{3:│}{4: }a | - {4: }aaaaaa {3:│}{4: }{3:│}{4: }aaaaaa | - {1:~ }{3:│}{1:~}{3:│}{1:~ }| - {1:~ }{3:│}{1:~}{3:│}{1:~ }| - {1:~ }{3:│}{1:~}{3:│}{1:~ }| - {1:~ }{3:│}{1:~}{3:│}{1:~ }| + {4: }aaa │{4: }│{4: }^aaa | + {4: } │{4: }│{4: } | + {4: }a │{4: }│{4: }a | + {4: }aaaaaa │{4: }│{4: }aaaaaa | + {1:~ }│{1:~}│{1:~ }| + {1:~ }│{1:~}│{1:~ }| + {1:~ }│{1:~}│{1:~ }| + {1:~ }│{1:~}│{1:~ }| {3:[No Name] [+] < }{2:[No Name] [+] }| | ]]) feed('<C-W>h') feed_command('set nowrap foldcolumn=4') screen:expect([[ - {4: }aaa {3:│}{4: }^aaa {3:│}{4: }aaa | - {4: } {3:│}{4: } {3:│}{4: } | - {4: }a {3:│}{4: }a {3:│}{4: }a | - {4: }aaaaaa {3:│}{4: }aaaaaa {3:│}{4: }aaaaaa | - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| + {4: }aaa │{4: }^aaa │{4: }aaa | + {4: } │{4: } │{4: } | + {4: }a │{4: }a │{4: }a | + {4: }aaaaaa │{4: }aaaaaa │{4: }aaaaaa | + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| {3:[No Name] [+] }{2:[No Name] [+] }{3:[No Name] [+] }| :set nowrap foldcolumn=4 | ]]) feed('15<C-W><lt>') screen:expect([[ - {4: }aaa {3:│}{4: }{3:│}{4: }aaa | - {4: } {3:│}{4: }{3:│}{4: } | - {4: }a {3:│}{4: }{3:│}{4: }a | - {4: }aaaaaa {3:│}{4: ^ }{3:│}{4: }aaaaaa | - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }{3:│}{1:~ }| + {4: }aaa │{4: }│{4: }aaa | + {4: } │{4: }│{4: } | + {4: }a │{4: }│{4: }a | + {4: }aaaaaa │{4: ^ }│{4: }aaaaaa | + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| + {1:~ }│{1:~ }│{1:~ }| {3:[No Name] [+] }{2:<[+] }{3:[No Name] [+] }| :set nowrap foldcolumn=4 | ]]) feed('4<C-W><lt>') screen:expect([[ - {4: }aaa {3:│}{4: }{3:│}{4: }aaa | - {4: } {3:│}{4: }{3:│}{4: } | - {4: }a {3:│}{4: }{3:│}{4: }a | - {4: }aaaaaa {3:│}{4:^ }{3:│}{4: }aaaaaa | - {1:~ }{3:│}{1:~}{3:│}{1:~ }| - {1:~ }{3:│}{1:~}{3:│}{1:~ }| - {1:~ }{3:│}{1:~}{3:│}{1:~ }| - {1:~ }{3:│}{1:~}{3:│}{1:~ }| + {4: }aaa │{4: }│{4: }aaa | + {4: } │{4: }│{4: } | + {4: }a │{4: }│{4: }a | + {4: }aaaaaa │{4:^ }│{4: }aaaaaa | + {1:~ }│{1:~}│{1:~ }| + {1:~ }│{1:~}│{1:~ }| + {1:~ }│{1:~}│{1:~ }| + {1:~ }│{1:~}│{1:~ }| {3:[No Name] [+] }{2:< }{3:[No Name] [+] }| :set nowrap foldcolumn=4 | ]]) diff --git a/test/functional/legacy/search_spec.lua b/test/functional/legacy/search_spec.lua index 4ed08881de..67991f5d48 100644 --- a/test/functional/legacy/search_spec.lua +++ b/test/functional/legacy/search_spec.lua @@ -7,6 +7,7 @@ local eval = helpers.eval local feed = helpers.feed local funcs = helpers.funcs local poke_eventloop = helpers.poke_eventloop +local exec = helpers.exec describe('search cmdline', function() local screen @@ -640,3 +641,34 @@ describe('search cmdline', function() feed('<esc>') end) end) + +describe('Search highlight', function() + before_each(clear) + it('Search highlight is combined with Visual highlight vim-patch:8.2.2797', function() + local screen = Screen.new(40, 6) + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText + [2] = {bold = true}, -- ModeMsg, Search + [3] = {background = Screen.colors.LightGrey}, -- Visual + [4] = {background = Screen.colors.Yellow, bold = true}, -- Search + [5] = {background = Screen.colors.LightGrey, bold = true}, -- Visual + Search + }) + screen:attach() + exec([[ + set hlsearch noincsearch + call setline(1, repeat(["xxx yyy zzz"], 3)) + hi Search gui=bold + /yyy + call cursor(1, 6) + ]]) + feed('vjj') + screen:expect([[ + xxx {4:y}{5:yy}{3: zzz} | + {3:xxx }{5:yyy}{3: zzz} | + {3:xxx }{5:y}{4:^yy} zzz | + {1:~ }| + {1:~ }| + {2:-- VISUAL --} | + ]]) + end) +end) diff --git a/test/functional/legacy/statusline_spec.lua b/test/functional/legacy/statusline_spec.lua new file mode 100644 index 0000000000..5eb46077ec --- /dev/null +++ b/test/functional/legacy/statusline_spec.lua @@ -0,0 +1,71 @@ +local helpers = require('test.functional.helpers')(after_each) +local Screen = require('test.functional.ui.screen') +local clear = helpers.clear +local exec = helpers.exec +local feed = helpers.feed + +before_each(clear) + +describe('statusline', function() + local screen + + before_each(function() + screen = Screen.new(50, 7) + screen:attach() + end) + + it('is updated in cmdline mode when using window-local statusline vim-patch:8.2.2737', function() + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText + [2] = {bold = true, reverse = true}, -- StatusLine + [3] = {reverse = true}, -- StatusLineNC, VertSplit + }) + exec([[ + setlocal statusline=-%{mode()}- + split + setlocal statusline=+%{mode()}+ + ]]) + screen:expect([[ + ^ | + {1:~ }| + {2:+n+ }| + | + {1:~ }| + {3:-n- }| + | + ]]) + feed(':') + screen:expect([[ + | + {1:~ }| + {2:+c+ }| + | + {1:~ }| + {3:-c- }| + :^ | + ]]) + end) + + it('truncated item does not cause off-by-one highlight vim-patch:8.2.4929', function() + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText + [2] = {foreground = Screen.colors.Blue}, -- User1 + [3] = {background = Screen.colors.Red, foreground = Screen.colors.White}, -- User2 + }) + exec([[ + set laststatus=2 + hi! link User1 Directory + hi! link User2 ErrorMsg + set statusline=%.5(%1*ABC%2*DEF%1*GHI%) + ]]) + screen:expect([[ + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {3:<F}{2:GHI }| + | + ]]) + end) +end) diff --git a/test/functional/options/cursorbind_spec.lua b/test/functional/options/cursorbind_spec.lua index f762808dd6..fcb753451c 100644 --- a/test/functional/options/cursorbind_spec.lua +++ b/test/functional/options/cursorbind_spec.lua @@ -30,23 +30,23 @@ describe("'cursorbind'", function() ]]) feed('20l') screen:expect([[ - a bb cc dd ee ff gg {3:│}aa bb cc dd ee ff gg^ hh ii jj kk ll mm | - {4: }{3:│} {4: } | - {4: }{3:│} {4: } | - {4: }{3:│} {4: } | - {4: }{3:│} {4: } | - {1:~ }{3:│}{1:~ }| + a bb cc dd ee ff gg │aa bb cc dd ee ff gg^ hh ii jj kk ll mm | + {4: }│ {4: } | + {4: }│ {4: } | + {4: }│ {4: } | + {4: }│ {4: } | + {1:~ }│{1:~ }| {3:[No Name] [+] }{2:[No Name] [+] }| | ]]) feed('10l') screen:expect([[ - hh ii jj kk ll mm n{3:│}aa bb cc dd ee ff gg hh ii jj ^kk ll mm | - {4: } {3:│} {4: } | - {4: } {3:│} {4: } | - {4: } {3:│} {4: } | - {4: } {3:│} {4: } | - {1:~ }{3:│}{1:~ }| + hh ii jj kk ll mm n│aa bb cc dd ee ff gg hh ii jj ^kk ll mm | + {4: } │ {4: } | + {4: } │ {4: } | + {4: } │ {4: } | + {4: } │ {4: } | + {1:~ }│{1:~ }| {3:[No Name] [+] }{2:[No Name] [+] }| | ]]) @@ -54,23 +54,23 @@ describe("'cursorbind'", function() feed('0') feed('20l') screen:expect([[ - {4:a bb cc dd ee ff gg }{3:│}{4:aa bb cc dd ee ff gg^ hh ii jj kk ll mm }| - {4: }{3:│} {4: } | - {4: }{3:│} {4: } | - {4: }{3:│} {4: } | - {4: }{3:│} {4: } | - {1:~ }{3:│}{1:~ }| + {4:a bb cc dd ee ff gg }│{4:aa bb cc dd ee ff gg^ hh ii jj kk ll mm }| + {4: }│ {4: } | + {4: }│ {4: } | + {4: }│ {4: } | + {4: }│ {4: } | + {1:~ }│{1:~ }| {3:[No Name] [+] }{2:[No Name] [+] }| | ]]) feed('10l') screen:expect([[ - {4: hh ii jj kk ll mm n}{3:│}{4:aa bb cc dd ee ff gg hh ii jj ^kk ll mm }| - {4: } {3:│} {4: } | - {4: } {3:│} {4: } | - {4: } {3:│} {4: } | - {4: } {3:│} {4: } | - {1:~ }{3:│}{1:~ }| + {4: hh ii jj kk ll mm n}│{4:aa bb cc dd ee ff gg hh ii jj ^kk ll mm }| + {4: } │ {4: } | + {4: } │ {4: } | + {4: } │ {4: } | + {4: } │ {4: } | + {1:~ }│{1:~ }| {3:[No Name] [+] }{2:[No Name] [+] }| | ]]) @@ -78,12 +78,12 @@ describe("'cursorbind'", function() feed('0') feed('40l') screen:expect([[ - kk ll mm nn oo pp qq{3:│} bb cc dd ee ff gg hh ii jj kk ll mm n^n| - {3:│} | - {3:│} | - {3:│} | - {3:│} | - {1:~ }{3:│}{1:~ }| + kk ll mm nn oo pp qq│ bb cc dd ee ff gg hh ii jj kk ll mm n^n| + │ | + │ | + │ | + │ | + {1:~ }│{1:~ }| {3:[No Name] [+] }{2:[No Name] [+] }| | ]]) diff --git a/test/functional/options/defaults_spec.lua b/test/functional/options/defaults_spec.lua index 6620c9acef..4731df7b95 100644 --- a/test/functional/options/defaults_spec.lua +++ b/test/functional/options/defaults_spec.lua @@ -163,7 +163,7 @@ describe('startup defaults', function() end) it("'shadafile' ('viminfofile')", function() - local env = {XDG_DATA_HOME='Xtest-userdata', XDG_CONFIG_HOME='Xtest-userconfig'} + local env = {XDG_DATA_HOME='Xtest-userdata', XDG_STATE_HOME='Xtest-userstate', XDG_CONFIG_HOME='Xtest-userconfig'} clear{args={}, args_rm={'-i'}, env=env} -- Default 'shadafile' is empty. -- This means use the default location. :help shada-file-name @@ -178,7 +178,7 @@ describe('startup defaults', function() clear{args={}, args_rm={'-i'}, env=env} eq({ f }, eval('v:oldfiles')) os.remove('Xtest-foo') - rmdir('Xtest-userdata') + rmdir('Xtest-userstate') -- Handles viminfo/viminfofile as alias for shada/shadafile. eq('\n shadafile=', eval('execute("set shadafile?")')) @@ -206,7 +206,7 @@ describe('startup defaults', function() describe('$NVIM_LOG_FILE', function() local xdgdir = 'Xtest-startup-xdg-logpath' - local xdgcachedir = xdgdir..'/nvim' + local xdgstatedir = iswin() and xdgdir..'/nvim-data' or xdgdir..'/nvim' after_each(function() os.remove('Xtest-logpath') rmdir(xdgdir) @@ -218,21 +218,21 @@ describe('startup defaults', function() }}) eq('Xtest-logpath', eval('$NVIM_LOG_FILE')) end) - it('defaults to stdpath("cache")/log if empty', function() - eq(true, mkdir(xdgdir) and mkdir(xdgcachedir)) + it('defaults to stdpath("log")/log if empty', function() + eq(true, mkdir(xdgdir) and mkdir(xdgstatedir)) clear({env={ - XDG_CACHE_HOME=xdgdir, + XDG_STATE_HOME=xdgdir, NVIM_LOG_FILE='', -- Empty is invalid. }}) - eq(xdgcachedir..'/log', string.gsub(eval('$NVIM_LOG_FILE'), '\\', '/')) + eq(xdgstatedir..'/log', string.gsub(eval('$NVIM_LOG_FILE'), '\\', '/')) end) - it('defaults to stdpath("cache")/log if invalid', function() - eq(true, mkdir(xdgdir) and mkdir(xdgcachedir)) + it('defaults to stdpath("log")/log if invalid', function() + eq(true, mkdir(xdgdir) and mkdir(xdgstatedir)) clear({env={ - XDG_CACHE_HOME=xdgdir, + XDG_STATE_HOME=xdgdir, NVIM_LOG_FILE='.', -- Any directory is invalid. }}) - eq(xdgcachedir..'/log', string.gsub(eval('$NVIM_LOG_FILE'), '\\', '/')) + eq(xdgstatedir..'/log', string.gsub(eval('$NVIM_LOG_FILE'), '\\', '/')) end) end) end) @@ -264,6 +264,7 @@ describe('XDG-based defaults', function() XDG_CONFIG_HOME=nil, XDG_DATA_HOME=nil, XDG_CACHE_HOME=nil, + XDG_STATE_HOME=nil, XDG_RUNTIME_DIR=nil, XDG_CONFIG_DIRS=nil, XDG_DATA_DIRS=nil, @@ -293,6 +294,7 @@ describe('XDG-based defaults', function() local env_sep = iswin() and ';' or ':' local data_dir = iswin() and 'nvim-data' or 'nvim' + local state_dir = iswin() and 'nvim-data' or 'nvim' local root_path = iswin() and 'C:' or '' describe('with too long XDG variables', function() @@ -303,6 +305,7 @@ describe('XDG-based defaults', function() .. env_sep.. root_path .. ('/b'):rep(2048) .. (env_sep .. root_path .. '/c'):rep(512)), XDG_DATA_HOME=(root_path .. ('/X'):rep(4096)), + XDG_STATE_HOME=(root_path .. ('/X'):rep(4096)), XDG_DATA_DIRS=(root_path .. ('/A'):rep(2048) .. env_sep .. root_path .. ('/B'):rep(2048) .. (env_sep .. root_path .. '/C'):rep(512)), @@ -355,13 +358,13 @@ describe('XDG-based defaults', function() .. ',' .. root_path .. ('/a'):rep(2048) .. '/nvim/after' .. ',' .. root_path .. ('/x'):rep(4096) .. '/nvim/after' ):gsub('\\', '/')), (meths.get_option('runtimepath')):gsub('\\', '/')) - eq('.,' .. root_path .. ('/X'):rep(4096).. '/' .. data_dir .. '/backup//', + eq('.,' .. root_path .. ('/X'):rep(4096).. '/' .. state_dir .. '/backup//', (meths.get_option('backupdir'):gsub('\\', '/'))) - eq(root_path .. ('/X'):rep(4096) .. '/' .. data_dir .. '/swap//', + eq(root_path .. ('/X'):rep(4096) .. '/' .. state_dir .. '/swap//', (meths.get_option('directory')):gsub('\\', '/')) - eq(root_path .. ('/X'):rep(4096) .. '/' .. data_dir .. '/undo//', + eq(root_path .. ('/X'):rep(4096) .. '/' .. state_dir .. '/undo//', (meths.get_option('undodir')):gsub('\\', '/')) - eq(root_path .. ('/X'):rep(4096) .. '/' .. data_dir .. '/view//', + eq(root_path .. ('/X'):rep(4096) .. '/' .. state_dir .. '/view//', (meths.get_option('viewdir')):gsub('\\', '/')) end) end) @@ -372,6 +375,7 @@ describe('XDG-based defaults', function() XDG_CONFIG_HOME='$XDG_DATA_HOME', XDG_CONFIG_DIRS='$XDG_DATA_DIRS', XDG_DATA_HOME='$XDG_CONFIG_HOME', + XDG_STATE_HOME='$XDG_CONFIG_HOME', XDG_DATA_DIRS='$XDG_CONFIG_DIRS', }}) end) @@ -405,13 +409,13 @@ describe('XDG-based defaults', function() .. ',$XDG_DATA_DIRS/nvim/after' .. ',$XDG_DATA_HOME/nvim/after' ):gsub('\\', '/')), (meths.get_option('runtimepath')):gsub('\\', '/')) - eq(('.,$XDG_CONFIG_HOME/' .. data_dir .. '/backup//'), + eq(('.,$XDG_CONFIG_HOME/' .. state_dir .. '/backup//'), meths.get_option('backupdir'):gsub('\\', '/')) - eq(('$XDG_CONFIG_HOME/' .. data_dir .. '/swap//'), + eq(('$XDG_CONFIG_HOME/' .. state_dir .. '/swap//'), meths.get_option('directory'):gsub('\\', '/')) - eq(('$XDG_CONFIG_HOME/' .. data_dir .. '/undo//'), + eq(('$XDG_CONFIG_HOME/' .. state_dir .. '/undo//'), meths.get_option('undodir'):gsub('\\', '/')) - eq(('$XDG_CONFIG_HOME/' .. data_dir .. '/view//'), + eq(('$XDG_CONFIG_HOME/' .. state_dir .. '/view//'), meths.get_option('viewdir'):gsub('\\', '/')) meths.command('set all&') eq(('$XDG_DATA_HOME/nvim' @@ -425,13 +429,13 @@ describe('XDG-based defaults', function() .. ',$XDG_DATA_DIRS/nvim/after' .. ',$XDG_DATA_HOME/nvim/after' ):gsub('\\', '/'), (meths.get_option('runtimepath')):gsub('\\', '/')) - eq(('.,$XDG_CONFIG_HOME/' .. data_dir .. '/backup//'), + eq(('.,$XDG_CONFIG_HOME/' .. state_dir .. '/backup//'), meths.get_option('backupdir'):gsub('\\', '/')) - eq(('$XDG_CONFIG_HOME/' .. data_dir .. '/swap//'), + eq(('$XDG_CONFIG_HOME/' .. state_dir .. '/swap//'), meths.get_option('directory'):gsub('\\', '/')) - eq(('$XDG_CONFIG_HOME/' .. data_dir .. '/undo//'), + eq(('$XDG_CONFIG_HOME/' .. state_dir .. '/undo//'), meths.get_option('undodir'):gsub('\\', '/')) - eq(('$XDG_CONFIG_HOME/' .. data_dir .. '/view//'), + eq(('$XDG_CONFIG_HOME/' .. state_dir .. '/view//'), meths.get_option('viewdir'):gsub('\\', '/')) end) end) @@ -442,6 +446,7 @@ describe('XDG-based defaults', function() XDG_CONFIG_HOME=', , ,', XDG_CONFIG_DIRS=',-,-,' .. env_sep .. '-,-,-', XDG_DATA_HOME=',=,=,', + XDG_STATE_HOME=',=,=,', XDG_DATA_DIRS=',≡,≡,' .. env_sep .. '≡,≡,≡', }}) end) @@ -484,13 +489,13 @@ describe('XDG-based defaults', function() .. ',\\,-\\,-\\,' .. path_sep ..'nvim' .. path_sep ..'after' .. ',\\, \\, \\,' .. path_sep ..'nvim' .. path_sep ..'after' ), meths.get_option('runtimepath')) - eq('.,\\,=\\,=\\,' .. path_sep .. data_dir .. '' .. path_sep ..'backup' .. (path_sep):rep(2), + eq('.,\\,=\\,=\\,' .. path_sep .. state_dir .. '' .. path_sep ..'backup' .. (path_sep):rep(2), meths.get_option('backupdir')) - eq('\\,=\\,=\\,' .. path_sep ..'' .. data_dir .. '' .. path_sep ..'swap' .. (path_sep):rep(2), + eq('\\,=\\,=\\,' .. path_sep ..'' .. state_dir .. '' .. path_sep ..'swap' .. (path_sep):rep(2), meths.get_option('directory')) - eq('\\,=\\,=\\,' .. path_sep ..'' .. data_dir .. '' .. path_sep ..'undo' .. (path_sep):rep(2), + eq('\\,=\\,=\\,' .. path_sep ..'' .. state_dir .. '' .. path_sep ..'undo' .. (path_sep):rep(2), meths.get_option('undodir')) - eq('\\,=\\,=\\,' .. path_sep ..'' .. data_dir .. '' .. path_sep ..'view' .. (path_sep):rep(2), + eq('\\,=\\,=\\,' .. path_sep ..'' .. state_dir .. '' .. path_sep ..'view' .. (path_sep):rep(2), meths.get_option('viewdir')) end) end) @@ -499,8 +504,9 @@ end) describe('stdpath()', function() -- Windows appends 'nvim-data' instead of just 'nvim' to prevent collisions - -- due to XDG_CONFIG_HOME and XDG_DATA_HOME being the same. + -- due to XDG_CONFIG_HOME, XDG_DATA_HOME and XDG_STATE_HOME being the same. local datadir = iswin() and 'nvim-data' or 'nvim' + local statedir = iswin() and 'nvim-data' or 'nvim' local env_sep = iswin() and ';' or ':' it('acceptance', function() @@ -509,6 +515,7 @@ describe('stdpath()', function() eq('nvim', funcs.fnamemodify(funcs.stdpath('cache'), ':t')) eq('nvim', funcs.fnamemodify(funcs.stdpath('config'), ':t')) eq(datadir, funcs.fnamemodify(funcs.stdpath('data'), ':t')) + eq(statedir, funcs.fnamemodify(funcs.stdpath('state'), ':t')) eq('table', type(funcs.stdpath('config_dirs'))) eq('table', type(funcs.stdpath('data_dirs'))) assert_alive() -- Check for crash. #8393 @@ -582,6 +589,39 @@ describe('stdpath()', function() end) end) + describe('with "state"' , function () + it('knows XDG_STATE_HOME', function() + clear({env={ + XDG_STATE_HOME=alter_slashes('/home/docwhat/.local'), + }}) + eq(alter_slashes('/home/docwhat/.local/'..statedir), funcs.stdpath('state')) + end) + + it('handles changes during runtime', function() + clear({env={ + XDG_STATE_HOME=alter_slashes('/home/original'), + }}) + eq(alter_slashes('/home/original/'..statedir), funcs.stdpath('state')) + command("let $XDG_STATE_HOME='"..alter_slashes('/home/new').."'") + eq(alter_slashes('/home/new/'..statedir), funcs.stdpath('state')) + end) + + it("doesn't expand $VARIABLES", function() + clear({env={ + XDG_STATE_HOME='$VARIABLES', + VARIABLES='this-should-not-happen', + }}) + eq(alter_slashes('$VARIABLES/'..statedir), funcs.stdpath('state')) + end) + + it("doesn't expand ~/", function() + clear({env={ + XDG_STATE_HOME=alter_slashes('~/frobnitz'), + }}) + eq(alter_slashes('~/frobnitz/'..statedir), funcs.stdpath('state')) + end) + end) + describe('with "cache"' , function () it('knows XDG_CACHE_HOME', function() clear({env={ diff --git a/test/functional/plugin/lsp_spec.lua b/test/functional/plugin/lsp_spec.lua index 33a8976b79..6c961eff7d 100644 --- a/test/functional/plugin/lsp_spec.lua +++ b/test/functional/plugin/lsp_spec.lua @@ -18,6 +18,7 @@ local NIL = helpers.NIL local read_file = require('test.helpers').read_file local write_file = require('test.helpers').write_file local isCI = helpers.isCI +local meths = helpers.meths -- Use these to get access to a coroutine so that I can run async tests and use -- yield. @@ -341,6 +342,43 @@ describe('LSP', function() } end) + it('should fire autocommands on attach and detach', function() + local client + test_rpc_server { + test_name = "basic_init"; + on_setup = function() + exec_lua [[ + BUFFER = vim.api.nvim_create_buf(false, true) + vim.api.nvim_create_autocmd('LspAttach', { + callback = function(args) + local client = vim.lsp.get_client_by_id(args.data.client_id) + vim.g.lsp_attached = client.name + end, + }) + vim.api.nvim_create_autocmd('LspDetach', { + callback = function(args) + local client = vim.lsp.get_client_by_id(args.data.client_id) + vim.g.lsp_detached = client.name + end, + }) + ]] + end; + on_init = function(_client) + client = _client + eq(true, exec_lua("return lsp.buf_attach_client(BUFFER, TEST_RPC_CLIENT_ID)")) + client.notify('finish') + end; + on_handler = function(_, _, ctx) + if ctx.method == 'finish' then + eq('basic_init', meths.get_var('lsp_attached')) + exec_lua("return lsp.buf_detach_client(BUFFER, TEST_RPC_CLIENT_ID)") + eq('basic_init', meths.get_var('lsp_detached')) + client.stop() + end + end; + } + end) + it('client should return settings via workspace/configuration handler', function() local expected_handlers = { {NIL, {}, {method="shutdown", client_id=1}}; @@ -2753,12 +2791,33 @@ describe('LSP', function() vim.lsp.commands['executed_preferred'] = function() end end + vim.lsp.commands['quickfix_command'] = function(cmd) + vim.lsp.commands['executed_quickfix'] = function() + end + end local bufnr = vim.api.nvim_get_current_buf() vim.lsp.buf_attach_client(bufnr, TEST_RPC_CLIENT_ID) vim.lsp.buf.code_action({ filter = function(a) return a.isPreferred end, apply = true, }) + vim.lsp.buf.code_action({ + -- expect to be returned actions 'quickfix' and 'quickfix.foo' + context = { only = {'quickfix'}, }, + apply = true, + filter = function(a) + if a.kind == 'quickfix.foo' then + vim.lsp.commands['filtered_quickfix_foo'] = function() end + return false + elseif a.kind == 'quickfix' then + return true + else + assert(nil, 'unreachable') + end + end, + }) ]]) elseif ctx.method == 'shutdown' then eq('function', exec_lua[[return type(vim.lsp.commands['executed_preferred'])]]) + eq('function', exec_lua[[return type(vim.lsp.commands['filtered_quickfix_foo'])]]) + eq('function', exec_lua[[return type(vim.lsp.commands['executed_quickfix'])]]) client.stop() end end diff --git a/test/functional/plugin/man_spec.lua b/test/functional/plugin/man_spec.lua index e5b2e7dc1f..c8da5a711f 100644 --- a/test/functional/plugin/man_spec.lua +++ b/test/functional/plugin/man_spec.lua @@ -2,13 +2,19 @@ local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') local command, eval, rawfeed = helpers.command, helpers.eval, helpers.rawfeed local clear = helpers.clear +local funcs = helpers.funcs +local nvim_prog = helpers.nvim_prog +local matches = helpers.matches describe(':Man', function() + before_each(function() + clear() + end) + describe('man.lua: highlight_line()', function() local screen before_each(function() - clear() command('syntax on') command('set filetype=man') command('syntax off') -- Ignore syntax groups @@ -137,4 +143,10 @@ describe(':Man', function() ]]) end) end) + + it('q quits in "$MANPAGER mode" (:Man!) #18281', function() + -- This will hang if #18281 regresses. + local args = {nvim_prog, '--headless', '+autocmd VimLeave * echo "quit works!!"', '+Man!', '+call nvim_input("q")'} + matches('quit works!!', funcs.system(args, {'manpage contents'})) + end) end) diff --git a/test/functional/terminal/cursor_spec.lua b/test/functional/terminal/cursor_spec.lua index 3b905f1f56..6e06304acd 100644 --- a/test/functional/terminal/cursor_spec.lua +++ b/test/functional/terminal/cursor_spec.lua @@ -5,6 +5,7 @@ local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim local nvim_dir, command = helpers.nvim_dir, helpers.command local nvim_prog = helpers.nvim_prog local eq, eval = helpers.eq, helpers.eval +local matches = helpers.matches local feed_command = helpers.feed_command local hide_cursor = thelpers.hide_cursor local show_cursor = thelpers.show_cursor @@ -177,7 +178,6 @@ describe('cursor with customized highlighting', function() end) describe('buffer cursor position is correct in terminal without number column', function() - if helpers.pending_win32(pending) then return end local screen local function setup_ex_register(str) @@ -525,10 +525,36 @@ describe('buffer cursor position is correct in terminal without number column', eq({6, 1}, eval('nvim_win_get_cursor(0)')) end) end) + + it('at the end of a line with trailing spaces #16234', function() + setup_ex_register('aaaaaaaa ') + feed('<C-R>r') + screen:expect([[ + | + | + | + | + Entering Ex mode. Type "visual" to go to Normal mode. | + :aaaaaaaa {1: } | + {3:-- TERMINAL --} | + ]]) + matches('^:aaaaaaaa [ ]*$', eval('nvim_get_current_line()')) + eq({6, 13}, eval('nvim_win_get_cursor(0)')) + feed([[<C-\><C-N>]]) + screen:expect([[ + | + | + | + | + Entering Ex mode. Type "visual" to go to Normal mode. | + :aaaaaaaa ^ {2: } | + | + ]]) + eq({6, 12}, eval('nvim_win_get_cursor(0)')) + end) end) describe('buffer cursor position is correct in terminal with number column', function() - if helpers.pending_win32(pending) then return end local screen local function setup_ex_register(str) @@ -879,4 +905,31 @@ describe('buffer cursor position is correct in terminal with number column', fun eq({6, 1}, eval('nvim_win_get_cursor(0)')) end) end) + + it('at the end of a line with trailing spaces #16234', function() + setup_ex_register('aaaaaaaa ') + feed('<C-R>r') + screen:expect([[ + {7: 1 } | + {7: 2 } | + {7: 3 } | + {7: 4 } | + {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. | + {7: 6 }:aaaaaaaa {1: } | + {3:-- TERMINAL --} | + ]]) + matches('^:aaaaaaaa [ ]*$', eval('nvim_get_current_line()')) + eq({6, 13}, eval('nvim_win_get_cursor(0)')) + feed([[<C-\><C-N>]]) + screen:expect([[ + {7: 1 } | + {7: 2 } | + {7: 3 } | + {7: 4 } | + {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. | + {7: 6 }:aaaaaaaa ^ {2: } | + | + ]]) + eq({6, 12}, eval('nvim_win_get_cursor(0)')) + end) end) diff --git a/test/functional/terminal/highlight_spec.lua b/test/functional/terminal/highlight_spec.lua index 32c911a5e8..2a63971d48 100644 --- a/test/functional/terminal/highlight_spec.lua +++ b/test/functional/terminal/highlight_spec.lua @@ -117,7 +117,6 @@ describe(':terminal highlight', function() end) it(':terminal highlight has lower precedence than editor #9964', function() - if helpers.pending_win32(pending) then return end clear() local screen = Screen.new(30, 4) screen:set_default_attr_ids({ diff --git a/test/functional/terminal/scrollback_spec.lua b/test/functional/terminal/scrollback_spec.lua index d1cfc7e91b..34fcb6cab9 100644 --- a/test/functional/terminal/scrollback_spec.lua +++ b/test/functional/terminal/scrollback_spec.lua @@ -6,6 +6,7 @@ local feed, nvim_dir, feed_command = helpers.feed, helpers.nvim_dir, helpers.fee local iswin = helpers.iswin local eval = helpers.eval local command = helpers.command +local matches = helpers.matches local poke_eventloop = helpers.poke_eventloop local retry = helpers.retry local curbufmeths = helpers.curbufmeths @@ -460,8 +461,8 @@ describe("'scrollback' option", function() expect_lines(58) -- Verify off-screen state - eq((iswin() and '36: line' or '35: line'), eval("getline(line('w0') - 1)")) - eq((iswin() and '27: line' or '26: line'), eval("getline(line('w0') - 10)")) + matches((iswin() and '^36: line[ ]*$' or '^35: line[ ]*$'), eval("getline(line('w0') - 1)")) + matches((iswin() and '^27: line[ ]*$' or '^26: line[ ]*$'), eval("getline(line('w0') - 10)")) end) it('defaults to 10000 in :terminal buffers', function() diff --git a/test/functional/ui/cursor_spec.lua b/test/functional/ui/cursor_spec.lua index 92300a8fa2..d61eebe3ea 100644 --- a/test/functional/ui/cursor_spec.lua +++ b/test/functional/ui/cursor_spec.lua @@ -212,10 +212,10 @@ describe('ui/cursor', function() if m.blinkwait then m.blinkwait = 700 end end if m.hl_id then - m.hl_id = 62 + m.hl_id = 64 m.attr = {background = Screen.colors.DarkGray} end - if m.id_lm then m.id_lm = 63 end + if m.id_lm then m.id_lm = 65 end end -- Assert the new expectation. diff --git a/test/functional/ui/diff_spec.lua b/test/functional/ui/diff_spec.lua index 6f67dea2be..5d056cd6c3 100644 --- a/test/functional/ui/diff_spec.lua +++ b/test/functional/ui/diff_spec.lua @@ -57,40 +57,40 @@ describe('Diff mode screen', function() feed(':set diffopt=filler<cr>') screen:expect([[ - {1: }{2:------------------}{3:│}{1: }{4:0 }| - {1: }^1 {3:│}{1: }1 | - {1: }2 {3:│}{1: }2 | - {1: }3 {3:│}{1: }3 | - {1: }4 {3:│}{1: }4 | - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1:+ }{5:+-- 4 lines: 7···}{3:│}{1:+ }{5:+-- 4 lines: 7··}| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }{2:------------------}│{1: }{4:0 }| + {1: }^1 │{1: }1 | + {1: }2 │{1: }2 | + {1: }3 │{1: }3 | + {1: }4 │{1: }4 | + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1:+ }{5:+-- 4 lines: 7···}│{1:+ }{5:+-- 4 lines: 7··}| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=filler | ]]) feed(':set diffopt+=internal<cr>') screen:expect([[ - {1: }{2:------------------}{3:│}{1: }{4:0 }| - {1: }^1 {3:│}{1: }1 | - {1: }2 {3:│}{1: }2 | - {1: }3 {3:│}{1: }3 | - {1: }4 {3:│}{1: }4 | - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1:+ }{5:+-- 4 lines: 7···}{3:│}{1:+ }{5:+-- 4 lines: 7··}| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }{2:------------------}│{1: }{4:0 }| + {1: }^1 │{1: }1 | + {1: }2 │{1: }2 | + {1: }3 │{1: }3 | + {1: }4 │{1: }4 | + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1:+ }{5:+-- 4 lines: 7···}│{1:+ }{5:+-- 4 lines: 7··}| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt+=internal | ]]) @@ -103,40 +103,40 @@ describe('Diff mode screen', function() feed(":set diffopt=filler<cr>") screen:expect([[ - {1: }{4:^0 }{3:│}{1: }{2:-----------------}| - {1: }1 {3:│}{1: }1 | - {1: }2 {3:│}{1: }2 | - {1: }3 {3:│}{1: }3 | - {1: }4 {3:│}{1: }4 | - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1:+ }{5:+-- 4 lines: 7···}{3:│}{1:+ }{5:+-- 4 lines: 7··}| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }{4:^0 }│{1: }{2:-----------------}| + {1: }1 │{1: }1 | + {1: }2 │{1: }2 | + {1: }3 │{1: }3 | + {1: }4 │{1: }4 | + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1:+ }{5:+-- 4 lines: 7···}│{1:+ }{5:+-- 4 lines: 7··}| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=filler | ]]) feed(":set diffopt+=internal<cr>") screen:expect([[ - {1: }{4:^0 }{3:│}{1: }{2:-----------------}| - {1: }1 {3:│}{1: }1 | - {1: }2 {3:│}{1: }2 | - {1: }3 {3:│}{1: }3 | - {1: }4 {3:│}{1: }4 | - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1:+ }{5:+-- 4 lines: 7···}{3:│}{1:+ }{5:+-- 4 lines: 7··}| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }{4:^0 }│{1: }{2:-----------------}| + {1: }1 │{1: }1 | + {1: }2 │{1: }2 | + {1: }3 │{1: }3 | + {1: }4 │{1: }4 | + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1:+ }{5:+-- 4 lines: 7···}│{1:+ }{5:+-- 4 lines: 7··}| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt+=internal | ]]) @@ -149,53 +149,53 @@ describe('Diff mode screen', function() feed(":set diffopt=filler<cr>") screen:expect([[ - {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}| - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1: }7 {3:│}{1: }7 | - {1: }8 {3:│}{1: }8 | - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | - {1: }{2:------------------}{3:│}{1: }{4:11 }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1:+ }{5:^+-- 4 lines: 1···}│{1:+ }{5:+-- 4 lines: 1··}| + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1: }7 │{1: }7 | + {1: }8 │{1: }8 | + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | + {1: }{2:------------------}│{1: }{4:11 }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=filler | ]]) feed(":set diffopt+=internal<cr>") screen:expect([[ - {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}| - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1: }7 {3:│}{1: }7 | - {1: }8 {3:│}{1: }8 | - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | - {1: }{2:------------------}{3:│}{1: }{4:11 }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1:+ }{5:^+-- 4 lines: 1···}│{1:+ }{5:+-- 4 lines: 1··}| + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1: }7 │{1: }7 | + {1: }8 │{1: }8 | + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | + {1: }{2:------------------}│{1: }{4:11 }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt+=internal | ]]) screen:try_resize(40, 9) screen:expect([[ - {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}| - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1: }7 {3:│}{1: }7 | - {1: }8 {3:│}{1: }8 | - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | + {1:+ }{5:^+-- 4 lines: 1···}│{1:+ }{5:+-- 4 lines: 1··}| + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1: }7 │{1: }7 | + {1: }8 │{1: }8 | + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| | ]]) @@ -208,53 +208,53 @@ describe('Diff mode screen', function() feed(":set diffopt=filler<cr>") screen:expect([[ - {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}| - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1: }7 {3:│}{1: }7 | - {1: }8 {3:│}{1: }8 | - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | - {1: }{4:11 }{3:│}{1: }{2:-----------------}| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1:+ }{5:^+-- 4 lines: 1···}│{1:+ }{5:+-- 4 lines: 1··}| + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1: }7 │{1: }7 | + {1: }8 │{1: }8 | + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | + {1: }{4:11 }│{1: }{2:-----------------}| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=filler | ]]) feed(":set diffopt+=internal<cr>") screen:expect([[ - {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}| - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1: }7 {3:│}{1: }7 | - {1: }8 {3:│}{1: }8 | - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | - {1: }{4:11 }{3:│}{1: }{2:-----------------}| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1:+ }{5:^+-- 4 lines: 1···}│{1:+ }{5:+-- 4 lines: 1··}| + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1: }7 │{1: }7 | + {1: }8 │{1: }8 | + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | + {1: }{4:11 }│{1: }{2:-----------------}| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt+=internal | ]]) screen:try_resize(40, 9) screen:expect([[ - {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}| - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1: }7 {3:│}{1: }7 | - {1: }8 {3:│}{1: }8 | - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | + {1:+ }{5:^+-- 4 lines: 1···}│{1:+ }{5:+-- 4 lines: 1··}| + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1: }7 │{1: }7 | + {1: }8 │{1: }8 | + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| | ]]) @@ -267,40 +267,40 @@ describe('Diff mode screen', function() feed(':set diffopt=filler<cr>') screen:expect([[ - {1: }^1 {3:│}{1: }1 | - {1: }2 {3:│}{1: }2 | - {1: }3 {3:│}{1: }3 | - {1: }4 {3:│}{1: }4 | - {1: }{2:------------------}{3:│}{1: }{4:4 }| - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1: }7 {3:│}{1: }7 | - {1: }8 {3:│}{1: }8 | - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | - {1: }{4:11 }{3:│}{1: }{2:-----------------}| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^1 │{1: }1 | + {1: }2 │{1: }2 | + {1: }3 │{1: }3 | + {1: }4 │{1: }4 | + {1: }{2:------------------}│{1: }{4:4 }| + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1: }7 │{1: }7 | + {1: }8 │{1: }8 | + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | + {1: }{4:11 }│{1: }{2:-----------------}| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=filler | ]]) feed(':set diffopt+=internal<cr>') screen:expect([[ - {1: }^1 {3:│}{1: }1 | - {1: }2 {3:│}{1: }2 | - {1: }3 {3:│}{1: }3 | - {1: }4 {3:│}{1: }4 | - {1: }{2:------------------}{3:│}{1: }{4:4 }| - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1: }7 {3:│}{1: }7 | - {1: }8 {3:│}{1: }8 | - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | - {1: }{4:11 }{3:│}{1: }{2:-----------------}| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^1 │{1: }1 | + {1: }2 │{1: }2 | + {1: }3 │{1: }3 | + {1: }4 │{1: }4 | + {1: }{2:------------------}│{1: }{4:4 }| + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1: }7 │{1: }7 | + {1: }8 │{1: }8 | + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | + {1: }{4:11 }│{1: }{2:-----------------}| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt+=internal | ]]) @@ -313,40 +313,40 @@ describe('Diff mode screen', function() feed(':set diffopt=filler<cr>') screen:expect([[ - {1: }^1 {3:│}{1: }1 | - {1: }2 {3:│}{1: }2 | - {1: }3 {3:│}{1: }3 | - {1: }4 {3:│}{1: }4 | - {1: }{4:4 }{3:│}{1: }{2:-----------------}| - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1: }7 {3:│}{1: }7 | - {1: }8 {3:│}{1: }8 | - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | - {1: }{2:------------------}{3:│}{1: }{4:11 }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^1 │{1: }1 | + {1: }2 │{1: }2 | + {1: }3 │{1: }3 | + {1: }4 │{1: }4 | + {1: }{4:4 }│{1: }{2:-----------------}| + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1: }7 │{1: }7 | + {1: }8 │{1: }8 | + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | + {1: }{2:------------------}│{1: }{4:11 }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=filler | ]]) feed(':set diffopt+=internal<cr>') screen:expect([[ - {1: }^1 {3:│}{1: }1 | - {1: }2 {3:│}{1: }2 | - {1: }3 {3:│}{1: }3 | - {1: }4 {3:│}{1: }4 | - {1: }{4:4 }{3:│}{1: }{2:-----------------}| - {1: }5 {3:│}{1: }5 | - {1: }6 {3:│}{1: }6 | - {1: }7 {3:│}{1: }7 | - {1: }8 {3:│}{1: }8 | - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | - {1: }{2:------------------}{3:│}{1: }{4:11 }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^1 │{1: }1 | + {1: }2 │{1: }2 | + {1: }3 │{1: }3 | + {1: }4 │{1: }4 | + {1: }{4:4 }│{1: }{2:-----------------}| + {1: }5 │{1: }5 | + {1: }6 │{1: }6 | + {1: }7 │{1: }7 | + {1: }8 │{1: }8 | + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | + {1: }{2:------------------}│{1: }{4:11 }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt+=internal | ]]) @@ -413,40 +413,40 @@ int main(int argc, char **argv) reread() feed(':set diffopt=internal,filler<cr>') screen:expect([[ - {1: }^#include <stdio.h>{3:│}{1: }#include <stdio.h| - {1: } {3:│}{1: } | - {1: }{8:// Frobs foo heart}{3:│}{1: }{8:int fib(int n)}{9: }| - {1: }{4:int frobnitz(int f}{3:│}{1: }{2:-----------------}| - {1: }{ {3:│}{1: }{ | - {1: }{9: i}{8:nt i;}{9: }{3:│}{1: }{9: i}{8:f(n > 2)}{9: }| - {1: }{4: for(i = 0; i <}{3:│}{1: }{2:-----------------}| - {1: } { {3:│}{1: } { | - {1: }{9: }{8:printf("Yo}{3:│}{1: }{9: }{8:return fi}| - {1: }{4: printf("%d}{3:│}{1: }{2:-----------------}| - {1: } } {3:│}{1: } } | - {1: }{2:------------------}{3:│}{1: }{4: return 1; }| - {1: }} {3:│}{1: }} | - {1: } {3:│}{1: } | + {1: }^#include <stdio.h>│{1: }#include <stdio.h| + {1: } │{1: } | + {1: }{8:// Frobs foo heart}│{1: }{8:int fib(int n)}{9: }| + {1: }{4:int frobnitz(int f}│{1: }{2:-----------------}| + {1: }{ │{1: }{ | + {1: }{9: i}{8:nt i;}{9: }│{1: }{9: i}{8:f(n > 2)}{9: }| + {1: }{4: for(i = 0; i <}│{1: }{2:-----------------}| + {1: } { │{1: } { | + {1: }{9: }{8:printf("Yo}│{1: }{9: }{8:return fi}| + {1: }{4: printf("%d}│{1: }{2:-----------------}| + {1: } } │{1: } } | + {1: }{2:------------------}│{1: }{4: return 1; }| + {1: }} │{1: }} | + {1: } │{1: } | {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=internal,filler | ]]) feed('G') screen:expect([[ - {1: }{2:------------------}{3:│}{1: }{4:int frobnitz(int }| - {1: }{ {3:│}{1: }{ | - {1: }{9: i}{8:f(n > 1)}{9: }{3:│}{1: }{9: i}{8:nt i;}{9: }| - {1: }{2:------------------}{3:│}{1: }{4: for(i = 0; i }| - {1: } { {3:│}{1: } { | - {1: }{9: }{8:return fac}{3:│}{1: }{9: }{8:printf("%}| - {1: } } {3:│}{1: } } | - {1: }{4: return 1; }{3:│}{1: }{2:-----------------}| - {1: }} {3:│}{1: }} | - {1: } {3:│}{1: } | - {1: }int main(int argc,{3:│}{1: }int main(int argc| - {1: }{ {3:│}{1: }{ | - {1: }{9: frobnitz(f}{8:act}{9:(}{3:│}{1: }{9: frobnitz(f}{8:ib}{9:(}| - {1: }^} {3:│}{1: }} | + {1: }{2:------------------}│{1: }{4:int frobnitz(int }| + {1: }{ │{1: }{ | + {1: }{9: i}{8:f(n > 1)}{9: }│{1: }{9: i}{8:nt i;}{9: }| + {1: }{2:------------------}│{1: }{4: for(i = 0; i }| + {1: } { │{1: } { | + {1: }{9: }{8:return fac}│{1: }{9: }{8:printf("%}| + {1: } } │{1: } } | + {1: }{4: return 1; }│{1: }{2:-----------------}| + {1: }} │{1: }} | + {1: } │{1: } | + {1: }int main(int argc,│{1: }int main(int argc| + {1: }{ │{1: }{ | + {1: }{9: frobnitz(f}{8:act}{9:(}│{1: }{9: frobnitz(f}{8:ib}{9:(}| + {1: }^} │{1: }} | {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=internal,filler | ]]) @@ -456,40 +456,40 @@ int main(int argc, char **argv) reread() feed(':set diffopt=internal,filler,algorithm:patience<cr>') screen:expect([[ - {1: }^#include <stdio.h>{3:│}{1: }#include <stdio.h| - {1: } {3:│}{1: } | - {1: }{2:------------------}{3:│}{1: }{4:int fib(int n) }| - {1: }{2:------------------}{3:│}{1: }{4:{ }| - {1: }{2:------------------}{3:│}{1: }{4: if(n > 2) }| - {1: }{2:------------------}{3:│}{1: }{4: { }| - {1: }{2:------------------}{3:│}{1: }{4: return fi}| - {1: }{2:------------------}{3:│}{1: }{4: } }| - {1: }{2:------------------}{3:│}{1: }{4: return 1; }| - {1: }{2:------------------}{3:│}{1: }{4:} }| - {1: }{2:------------------}{3:│}{1: }{4: }| - {1: }// Frobs foo heart{3:│}{1: }// Frobs foo hear| - {1: }int frobnitz(int f{3:│}{1: }int frobnitz(int | - {1: }{ {3:│}{1: }{ | + {1: }^#include <stdio.h>│{1: }#include <stdio.h| + {1: } │{1: } | + {1: }{2:------------------}│{1: }{4:int fib(int n) }| + {1: }{2:------------------}│{1: }{4:{ }| + {1: }{2:------------------}│{1: }{4: if(n > 2) }| + {1: }{2:------------------}│{1: }{4: { }| + {1: }{2:------------------}│{1: }{4: return fi}| + {1: }{2:------------------}│{1: }{4: } }| + {1: }{2:------------------}│{1: }{4: return 1; }| + {1: }{2:------------------}│{1: }{4:} }| + {1: }{2:------------------}│{1: }{4: }| + {1: }// Frobs foo heart│{1: }// Frobs foo hear| + {1: }int frobnitz(int f│{1: }int frobnitz(int | + {1: }{ │{1: }{ | {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| | ]]) feed('G') screen:expect([[ - {1: } {3:│}{1: } | - {1: }{4:int fact(int n) }{3:│}{1: }{2:-----------------}| - {1: }{4:{ }{3:│}{1: }{2:-----------------}| - {1: }{4: if(n > 1) }{3:│}{1: }{2:-----------------}| - {1: }{4: { }{3:│}{1: }{2:-----------------}| - {1: }{4: return fac}{3:│}{1: }{2:-----------------}| - {1: }{4: } }{3:│}{1: }{2:-----------------}| - {1: }{4: return 1; }{3:│}{1: }{2:-----------------}| - {1: }{4:} }{3:│}{1: }{2:-----------------}| - {1: }{4: }{3:│}{1: }{2:-----------------}| - {1: }int main(int argc,{3:│}{1: }int main(int argc| - {1: }{ {3:│}{1: }{ | - {1: }{9: frobnitz(f}{8:act}{9:(}{3:│}{1: }{9: frobnitz(f}{8:ib}{9:(}| - {1: }^} {3:│}{1: }} | + {1: } │{1: } | + {1: }{4:int fact(int n) }│{1: }{2:-----------------}| + {1: }{4:{ }│{1: }{2:-----------------}| + {1: }{4: if(n > 1) }│{1: }{2:-----------------}| + {1: }{4: { }│{1: }{2:-----------------}| + {1: }{4: return fac}│{1: }{2:-----------------}| + {1: }{4: } }│{1: }{2:-----------------}| + {1: }{4: return 1; }│{1: }{2:-----------------}| + {1: }{4:} }│{1: }{2:-----------------}| + {1: }{4: }│{1: }{2:-----------------}| + {1: }int main(int argc,│{1: }int main(int argc| + {1: }{ │{1: }{ | + {1: }{9: frobnitz(f}{8:act}{9:(}│{1: }{9: frobnitz(f}{8:ib}{9:(}| + {1: }^} │{1: }} | {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| | ]]) @@ -499,40 +499,40 @@ int main(int argc, char **argv) reread() feed(':set diffopt=internal,filler,algorithm:histogram<cr>') screen:expect([[ - {1: }^#include <stdio.h>{3:│}{1: }#include <stdio.h| - {1: } {3:│}{1: } | - {1: }{2:------------------}{3:│}{1: }{4:int fib(int n) }| - {1: }{2:------------------}{3:│}{1: }{4:{ }| - {1: }{2:------------------}{3:│}{1: }{4: if(n > 2) }| - {1: }{2:------------------}{3:│}{1: }{4: { }| - {1: }{2:------------------}{3:│}{1: }{4: return fi}| - {1: }{2:------------------}{3:│}{1: }{4: } }| - {1: }{2:------------------}{3:│}{1: }{4: return 1; }| - {1: }{2:------------------}{3:│}{1: }{4:} }| - {1: }{2:------------------}{3:│}{1: }{4: }| - {1: }// Frobs foo heart{3:│}{1: }// Frobs foo hear| - {1: }int frobnitz(int f{3:│}{1: }int frobnitz(int | - {1: }{ {3:│}{1: }{ | + {1: }^#include <stdio.h>│{1: }#include <stdio.h| + {1: } │{1: } | + {1: }{2:------------------}│{1: }{4:int fib(int n) }| + {1: }{2:------------------}│{1: }{4:{ }| + {1: }{2:------------------}│{1: }{4: if(n > 2) }| + {1: }{2:------------------}│{1: }{4: { }| + {1: }{2:------------------}│{1: }{4: return fi}| + {1: }{2:------------------}│{1: }{4: } }| + {1: }{2:------------------}│{1: }{4: return 1; }| + {1: }{2:------------------}│{1: }{4:} }| + {1: }{2:------------------}│{1: }{4: }| + {1: }// Frobs foo heart│{1: }// Frobs foo hear| + {1: }int frobnitz(int f│{1: }int frobnitz(int | + {1: }{ │{1: }{ | {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| | ]]) feed('G') screen:expect([[ - {1: } {3:│}{1: } | - {1: }{4:int fact(int n) }{3:│}{1: }{2:-----------------}| - {1: }{4:{ }{3:│}{1: }{2:-----------------}| - {1: }{4: if(n > 1) }{3:│}{1: }{2:-----------------}| - {1: }{4: { }{3:│}{1: }{2:-----------------}| - {1: }{4: return fac}{3:│}{1: }{2:-----------------}| - {1: }{4: } }{3:│}{1: }{2:-----------------}| - {1: }{4: return 1; }{3:│}{1: }{2:-----------------}| - {1: }{4:} }{3:│}{1: }{2:-----------------}| - {1: }{4: }{3:│}{1: }{2:-----------------}| - {1: }int main(int argc,{3:│}{1: }int main(int argc| - {1: }{ {3:│}{1: }{ | - {1: }{9: frobnitz(f}{8:act}{9:(}{3:│}{1: }{9: frobnitz(f}{8:ib}{9:(}| - {1: }^} {3:│}{1: }} | + {1: } │{1: } | + {1: }{4:int fact(int n) }│{1: }{2:-----------------}| + {1: }{4:{ }│{1: }{2:-----------------}| + {1: }{4: if(n > 1) }│{1: }{2:-----------------}| + {1: }{4: { }│{1: }{2:-----------------}| + {1: }{4: return fac}│{1: }{2:-----------------}| + {1: }{4: } }│{1: }{2:-----------------}| + {1: }{4: return 1; }│{1: }{2:-----------------}| + {1: }{4:} }│{1: }{2:-----------------}| + {1: }{4: }│{1: }{2:-----------------}| + {1: }int main(int argc,│{1: }int main(int argc| + {1: }{ │{1: }{ | + {1: }{9: frobnitz(f}{8:act}{9:(}│{1: }{9: frobnitz(f}{8:ib}{9:(}| + {1: }^} │{1: }} | {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| | ]]) @@ -566,20 +566,20 @@ int main(int argc, char **argv) reread() feed(":set diffopt=internal,filler<cr>") screen:expect([[ - {1: }^def finalize(value{3:│}{1: }def finalize(valu| - {1: } {3:│}{1: } | - {1: } values.each do |{3:│}{1: } values.each do | - {1: }{2:------------------}{3:│}{1: }{4: v.prepare }| - {1: }{2:------------------}{3:│}{1: }{4: end }| - {1: }{2:------------------}{3:│}{1: }{4: }| - {1: }{2:------------------}{3:│}{1: }{4: values.each do }| - {1: } v.finalize {3:│}{1: } v.finalize | - {1: } end {3:│}{1: } end | - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^def finalize(value│{1: }def finalize(valu| + {1: } │{1: } | + {1: } values.each do |│{1: } values.each do | + {1: }{2:------------------}│{1: }{4: v.prepare }| + {1: }{2:------------------}│{1: }{4: end }| + {1: }{2:------------------}│{1: }{4: }| + {1: }{2:------------------}│{1: }{4: values.each do }| + {1: } v.finalize │{1: } v.finalize | + {1: } end │{1: } end | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=internal,filler | ]]) @@ -589,20 +589,20 @@ int main(int argc, char **argv) reread() feed(':set diffopt=internal,filler,indent-heuristic<cr>') screen:expect([[ - {1: }^def finalize(value{3:│}{1: }def finalize(valu| - {1: } {3:│}{1: } | - {1: }{2:------------------}{3:│}{1: }{4: values.each do }| - {1: }{2:------------------}{3:│}{1: }{4: v.prepare }| - {1: }{2:------------------}{3:│}{1: }{4: end }| - {1: }{2:------------------}{3:│}{1: }{4: }| - {1: } values.each do |{3:│}{1: } values.each do | - {1: } v.finalize {3:│}{1: } v.finalize | - {1: } end {3:│}{1: } end | - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^def finalize(value│{1: }def finalize(valu| + {1: } │{1: } | + {1: }{2:------------------}│{1: }{4: values.each do }| + {1: }{2:------------------}│{1: }{4: v.prepare }| + {1: }{2:------------------}│{1: }{4: end }| + {1: }{2:------------------}│{1: }{4: }| + {1: } values.each do |│{1: } values.each do | + {1: } v.finalize │{1: } v.finalize | + {1: } end │{1: } end | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| | ]]) @@ -613,20 +613,20 @@ int main(int argc, char **argv) feed(':set diffopt=internal,filler,indent-heuristic,algorithm:patience<cr>') feed(':<cr>') screen:expect([[ - {1: }^def finalize(value{3:│}{1: }def finalize(valu| - {1: } {3:│}{1: } | - {1: }{2:------------------}{3:│}{1: }{4: values.each do }| - {1: }{2:------------------}{3:│}{1: }{4: v.prepare }| - {1: }{2:------------------}{3:│}{1: }{4: end }| - {1: }{2:------------------}{3:│}{1: }{4: }| - {1: } values.each do |{3:│}{1: } values.each do | - {1: } v.finalize {3:│}{1: } v.finalize | - {1: } end {3:│}{1: } end | - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^def finalize(value│{1: }def finalize(valu| + {1: } │{1: } | + {1: }{2:------------------}│{1: }{4: values.each do }| + {1: }{2:------------------}│{1: }{4: v.prepare }| + {1: }{2:------------------}│{1: }{4: end }| + {1: }{2:------------------}│{1: }{4: }| + {1: } values.each do |│{1: } values.each do | + {1: } v.finalize │{1: } v.finalize | + {1: } end │{1: } end | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| : | ]]) @@ -640,40 +640,40 @@ int main(int argc, char **argv) feed(':set diffopt=filler<cr>') screen:expect([[ - {1:+ }{5:^+-- 10 lines: 1···}{3:│}{1:+ }{5:+-- 10 lines: 1··}| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1:+ }{5:^+-- 10 lines: 1···}│{1:+ }{5:+-- 10 lines: 1··}| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=filler | ]]) feed(':set diffopt+=internal<cr>') screen:expect([[ - {1:+ }{5:^+-- 10 lines: 1···}{3:│}{1:+ }{5:+-- 10 lines: 1··}| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1:+ }{5:^+-- 10 lines: 1···}│{1:+ }{5:+-- 10 lines: 1··}| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt+=internal | ]]) @@ -686,40 +686,40 @@ int main(int argc, char **argv) feed(':set diffopt=filler<cr>') screen:expect([[ - {1:- }^ {3:│}{1:- } | - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1:- }^ │{1:- } | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=filler | ]]) feed(':set diffopt+=internal<cr>') screen:expect([[ - {1:- }^ {3:│}{1:- } | - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1:- }^ │{1:- } | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt+=internal | ]]) @@ -732,40 +732,40 @@ int main(int argc, char **argv) feed(':set diffopt=filler,icase<cr>') screen:expect([[ - {1: }^a {3:│}{1: }A | - {1: }b {3:│}{1: }b | - {1: }{9:cd }{3:│}{1: }{9:cD}{8:e}{9: }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^a │{1: }A | + {1: }b │{1: }b | + {1: }{9:cd }│{1: }{9:cD}{8:e}{9: }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=filler,icase | ]]) feed(':set diffopt+=internal<cr>') screen:expect([[ - {1: }^a {3:│}{1: }A | - {1: }b {3:│}{1: }b | - {1: }{9:cd }{3:│}{1: }{9:cD}{8:e}{9: }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^a │{1: }A | + {1: }b │{1: }b | + {1: }{9:cd }│{1: }{9:cD}{8:e}{9: }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt+=internal | ]]) @@ -784,20 +784,20 @@ int main(int argc, char **argv) reread() feed(':set diffopt=filler,iwhite<cr>') screen:expect([[ - {1: }^int main() {3:│}{1: }int main() | - {1: }{ {3:│}{1: }{ | - {1: }{2:------------------}{3:│}{1: }{4: if (0) }| - {1: }{2:------------------}{3:│}{1: }{4: { }| - {1: } printf("Hello, {3:│}{1: } printf("Hel| - {1: } return 0; {3:│}{1: } return 0; | - {1: }{2:------------------}{3:│}{1: }{4: } }| - {1: }} {3:│}{1: }} | - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^int main() │{1: }int main() | + {1: }{ │{1: }{ | + {1: }{2:------------------}│{1: }{4: if (0) }| + {1: }{2:------------------}│{1: }{4: { }| + {1: } printf("Hello, │{1: } printf("Hel| + {1: } return 0; │{1: } return 0; | + {1: }{2:------------------}│{1: }{4: } }| + {1: }} │{1: }} | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=filler,iwhite | ]]) @@ -807,20 +807,20 @@ int main(int argc, char **argv) reread() feed(':set diffopt=filler,iwhite,internal<cr>') screen:expect([[ - {1: }^int main() {3:│}{1: }int main() | - {1: }{ {3:│}{1: }{ | - {1: }{2:------------------}{3:│}{1: }{4: if (0) }| - {1: }{2:------------------}{3:│}{1: }{4: { }| - {1: } printf("Hello, {3:│}{1: } printf("Hel| - {1: } return 0; {3:│}{1: } return 0; | - {1: }{2:------------------}{3:│}{1: }{4: } }| - {1: }} {3:│}{1: }} | - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^int main() │{1: }int main() | + {1: }{ │{1: }{ | + {1: }{2:------------------}│{1: }{4: if (0) }| + {1: }{2:------------------}│{1: }{4: { }| + {1: } printf("Hello, │{1: } printf("Hel| + {1: } return 0; │{1: } return 0; | + {1: }{2:------------------}│{1: }{4: } }| + {1: }} │{1: }} | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=filler,iwhite,internal | ]]) @@ -838,20 +838,20 @@ int main(int argc, char **argv) reread() feed(':set diffopt=internal,filler,iblank<cr>') screen:expect([[ - {1: }^a {3:│}{1: }a | - {1: }{4: }{3:│}{1: }{2:-----------------}| - {1: }{4: }{3:│}{1: }{2:-----------------}| - {1: }cd {3:│}{1: }cd | - {1: }ef {3:│}{1: } | - {1: }{8:xxx}{9: }{3:│}{1: }ef | - {6:~ }{3:│}{1: }{8:yyy}{9: }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^a │{1: }a | + {1: }{4: }│{1: }{2:-----------------}| + {1: }{4: }│{1: }{2:-----------------}| + {1: }cd │{1: }cd | + {1: }ef │{1: } | + {1: }{8:xxx}{9: }│{1: }ef | + {6:~ }│{1: }{8:yyy}{9: }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| :set diffopt=internal,filler,iblank | ]]) @@ -862,20 +862,20 @@ int main(int argc, char **argv) feed(':set diffopt=internal,filler,iblank,iwhite<cr>') feed(':<cr>') screen:expect([[ - {1: }^a {3:│}{1: }a | - {1: } {3:│}{1: }cd | - {1: } {3:│}{1: } | - {1: }cd {3:│}{1: }ef | - {1: }ef {3:│}{1: }{8:yyy}{9: }| - {1: }{8:xxx}{9: }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^a │{1: }a | + {1: } │{1: }cd | + {1: } │{1: } | + {1: }cd │{1: }ef | + {1: }ef │{1: }{8:yyy}{9: }| + {1: }{8:xxx}{9: }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| : | ]]) @@ -886,20 +886,20 @@ int main(int argc, char **argv) feed(':set diffopt=internal,filler,iblank,iwhiteall<cr>') feed(':<cr>') screen:expect([[ - {1: }^a {3:│}{1: }a | - {1: } {3:│}{1: }cd | - {1: } {3:│}{1: } | - {1: }cd {3:│}{1: }ef | - {1: }ef {3:│}{1: }{8:yyy}{9: }| - {1: }{8:xxx}{9: }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^a │{1: }a | + {1: } │{1: }cd | + {1: } │{1: } | + {1: }cd │{1: }ef | + {1: }ef │{1: }{8:yyy}{9: }| + {1: }{8:xxx}{9: }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| : | ]]) @@ -910,20 +910,20 @@ int main(int argc, char **argv) feed(':set diffopt=internal,filler,iblank,iwhiteeol<cr>') feed(':<cr>') screen:expect([[ - {1: }^a {3:│}{1: }a | - {1: } {3:│}{1: }cd | - {1: } {3:│}{1: } | - {1: }cd {3:│}{1: }ef | - {1: }ef {3:│}{1: }{8:yyy}{9: }| - {1: }{8:xxx}{9: }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^a │{1: }a | + {1: } │{1: }cd | + {1: } │{1: } | + {1: }cd │{1: }ef | + {1: }ef │{1: }{8:yyy}{9: }| + {1: }{8:xxx}{9: }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| : | ]]) @@ -942,20 +942,20 @@ int main(int argc, char **argv) feed(':set diffopt=internal,filler,iwhiteeol<cr>') feed(':<cr>') screen:expect([[ - {1: }^a {3:│}{1: }a | - {1: }x {3:│}{1: }x | - {1: }{9:cd }{3:│}{1: }{9:c}{8: }{9:d }| - {1: }{9:ef }{3:│}{1: }{8: }{9:ef }| - {1: }{9:xx }{8: }{9:xx }{3:│}{1: }{9:xx xx }| - {1: }foo {3:│}{1: }foo | - {1: }{2:------------------}{3:│}{1: }{4: }| - {1: }bar {3:│}{1: }bar | - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^a │{1: }a | + {1: }x │{1: }x | + {1: }{9:cd }│{1: }{9:c}{8: }{9:d }| + {1: }{9:ef }│{1: }{8: }{9:ef }| + {1: }{9:xx }{8: }{9:xx }│{1: }{9:xx xx }| + {1: }foo │{1: }foo | + {1: }{2:------------------}│{1: }{4: }| + {1: }bar │{1: }bar | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| : | ]]) @@ -966,20 +966,20 @@ int main(int argc, char **argv) feed(':set diffopt=internal,filler,iwhiteall<cr>') feed(':<cr>') screen:expect([[ - {1: }^a {3:│}{1: }a | - {1: }x {3:│}{1: }x | - {1: }cd {3:│}{1: }c d | - {1: }ef {3:│}{1: } ef | - {1: }xx xx {3:│}{1: }xx xx | - {1: }foo {3:│}{1: }foo | - {1: }{2:------------------}{3:│}{1: }{4: }| - {1: }bar {3:│}{1: }bar | - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| - {6:~ }{3:│}{6:~ }| + {1: }^a │{1: }a | + {1: }x │{1: }x | + {1: }cd │{1: }c d | + {1: }ef │{1: } ef | + {1: }xx xx │{1: }xx xx | + {1: }foo │{1: }foo | + {1: }{2:------------------}│{1: }{4: }| + {1: }bar │{1: }bar | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }| : | ]]) @@ -1029,14 +1029,14 @@ it('win_update redraws lines properly', function() command("windo diffthis") command("windo 1") screen:expect{grid=[[ - {13: }{16:-----------------------}{14:│}{13: }{15:^1 }| - {13: }{16:-----------------------}{14:│}{13: }{15: }| - {13: }{16:-----------------------}{14:│}{13: }{15: }| - {13: }2 {14:│}{13: }2 | - {13: }{17:2}{18:a }{14:│}{13: }{17:1}{18:a }| - {13: }{15:2b }{14:│}{13: }{16:----------------------}| - {13: } {14:│}{13: } | - {1:~ }{14:│}{1:~ }| + {13: }{16:-----------------------}│{13: }{15:^1 }| + {13: }{16:-----------------------}│{13: }{15: }| + {13: }{16:-----------------------}│{13: }{15: }| + {13: }2 │{13: }2 | + {13: }{17:2}{18:a }│{13: }{17:1}{18:a }| + {13: }{15:2b }│{13: }{16:----------------------}| + {13: } │{13: } | + {1:~ }│{1:~ }| {14:left [+] }{12:[No Name] [+] }| | ]]} @@ -1046,14 +1046,14 @@ it('win_update redraws lines properly', function() feed('<C-y>') feed('<C-y>') screen:expect{grid=[[ - {13: }{16:-----------------------}{14:│}{13: }{15:1 }| - {13: }{16:-----------------------}{14:│}{13: }{15: }| - {13: }{16:-----------------------}{14:│}{13: }{15:^ }| - {13: }2 {14:│}{13: }2 | - {13: }{17:2}{18:a }{14:│}{13: }{17:1}{18:a }| - {13: }{15:2b }{14:│}{13: }{16:----------------------}| - {13: } {14:│}{13: } | - {1:~ }{14:│}{1:~ }| + {13: }{16:-----------------------}│{13: }{15:1 }| + {13: }{16:-----------------------}│{13: }{15: }| + {13: }{16:-----------------------}│{13: }{15:^ }| + {13: }2 │{13: }2 | + {13: }{17:2}{18:a }│{13: }{17:1}{18:a }| + {13: }{15:2b }│{13: }{16:----------------------}| + {13: } │{13: } | + {1:~ }│{1:~ }| {14:left [+] }{12:[No Name] [+] }| | ]]} @@ -1084,52 +1084,52 @@ it('diff updates line numbers below filler lines', function() setlocal number rnu cursorline cursorlineopt=number foldcolumn=0 ]]) screen:expect([[ - {1: }a {3:│}{10:1 }^a | - {1: }a {3:│}{11: 1 }a | - {1: }a {3:│}{11: 2 }a | - {1: }{8:x}{9: }{3:│}{11: 3 }{8:y}{9: }| - {1: }{4:x }{3:│}{11: }{2:----------------}| - {1: }{4:x }{3:│}{11: }{2:----------------}| - {1: }b {3:│}{11: 4 }b | - {1: }b {3:│}{11: 5 }b | - {1: }b {3:│}{11: 6 }b | - {1: }b {3:│}{11: 7 }b | - {1: }b {3:│}{11: 8 }b | - {6:~ }{3:│}{6:~ }| + {1: }a │{10:1 }^a | + {1: }a │{11: 1 }a | + {1: }a │{11: 2 }a | + {1: }{8:x}{9: }│{11: 3 }{8:y}{9: }| + {1: }{4:x }│{11: }{2:----------------}| + {1: }{4:x }│{11: }{2:----------------}| + {1: }b │{11: 4 }b | + {1: }b │{11: 5 }b | + {1: }b │{11: 6 }b | + {1: }b │{11: 7 }b | + {1: }b │{11: 8 }b | + {6:~ }│{6:~ }| {3:[No Name] [+] }{7:[No Name] [+] }| | ]]) feed('j') screen:expect([[ - {1: }a {3:│}{11: 1 }a | - {1: }a {3:│}{10:2 }^a | - {1: }a {3:│}{11: 1 }a | - {1: }{8:x}{9: }{3:│}{11: 2 }{8:y}{9: }| - {1: }{4:x }{3:│}{11: }{2:----------------}| - {1: }{4:x }{3:│}{11: }{2:----------------}| - {1: }b {3:│}{11: 3 }b | - {1: }b {3:│}{11: 4 }b | - {1: }b {3:│}{11: 5 }b | - {1: }b {3:│}{11: 6 }b | - {1: }b {3:│}{11: 7 }b | - {6:~ }{3:│}{6:~ }| + {1: }a │{11: 1 }a | + {1: }a │{10:2 }^a | + {1: }a │{11: 1 }a | + {1: }{8:x}{9: }│{11: 2 }{8:y}{9: }| + {1: }{4:x }│{11: }{2:----------------}| + {1: }{4:x }│{11: }{2:----------------}| + {1: }b │{11: 3 }b | + {1: }b │{11: 4 }b | + {1: }b │{11: 5 }b | + {1: }b │{11: 6 }b | + {1: }b │{11: 7 }b | + {6:~ }│{6:~ }| {3:[No Name] [+] }{7:[No Name] [+] }| | ]]) feed('j') screen:expect([[ - {1: }a {3:│}{11: 2 }a | - {1: }a {3:│}{11: 1 }a | - {1: }a {3:│}{10:3 }^a | - {1: }{8:x}{9: }{3:│}{11: 1 }{8:y}{9: }| - {1: }{4:x }{3:│}{11: }{2:----------------}| - {1: }{4:x }{3:│}{11: }{2:----------------}| - {1: }b {3:│}{11: 2 }b | - {1: }b {3:│}{11: 3 }b | - {1: }b {3:│}{11: 4 }b | - {1: }b {3:│}{11: 5 }b | - {1: }b {3:│}{11: 6 }b | - {6:~ }{3:│}{6:~ }| + {1: }a │{11: 2 }a | + {1: }a │{11: 1 }a | + {1: }a │{10:3 }^a | + {1: }{8:x}{9: }│{11: 1 }{8:y}{9: }| + {1: }{4:x }│{11: }{2:----------------}| + {1: }{4:x }│{11: }{2:----------------}| + {1: }b │{11: 2 }b | + {1: }b │{11: 3 }b | + {1: }b │{11: 4 }b | + {1: }b │{11: 5 }b | + {1: }b │{11: 6 }b | + {6:~ }│{6:~ }| {3:[No Name] [+] }{7:[No Name] [+] }| | ]]) @@ -1158,70 +1158,70 @@ it('Align the filler lines when changing text in diff mode', function() exe "normal Gl5\<C-E>" ]]) screen:expect{grid=[[ - {1: }{2:------------------}{3:│}{1: }{4:6 }| - {1: }{2:------------------}{3:│}{1: }{4:7 }| - {1: }{2:------------------}{3:│}{1: }{4:8 }| - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | - {1: }11 {3:│}{1: }11 | - {1: }12 {3:│}{1: }12 | - {1: }13 {3:│}{1: }13 | - {1: }14 {3:│}{1: }14 | - {1:- }1^5 {3:│}{1:- }15 | - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| + {1: }{2:------------------}│{1: }{4:6 }| + {1: }{2:------------------}│{1: }{4:7 }| + {1: }{2:------------------}│{1: }{4:8 }| + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | + {1: }11 │{1: }11 | + {1: }12 │{1: }12 | + {1: }13 │{1: }13 | + {1: }14 │{1: }14 | + {1:- }1^5 │{1:- }15 | + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| {8:[No Name] [+] }{3:[No Name] [+] }| | ]]} feed('ax<Esc>') screen:expect{grid=[[ - {1: }{2:------------------}{3:│}{1: }{4:6 }| - {1: }{2:------------------}{3:│}{1: }{4:7 }| - {1: }{2:------------------}{3:│}{1: }{4:8 }| - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | - {1: }11 {3:│}{1: }11 | - {1: }12 {3:│}{1: }12 | - {1: }13 {3:│}{1: }13 | - {1: }14 {3:│}{1: }14 | - {1: }{5:15}{6:^x}{5: }{3:│}{1: }{5:15 }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| + {1: }{2:------------------}│{1: }{4:6 }| + {1: }{2:------------------}│{1: }{4:7 }| + {1: }{2:------------------}│{1: }{4:8 }| + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | + {1: }11 │{1: }11 | + {1: }12 │{1: }12 | + {1: }13 │{1: }13 | + {1: }14 │{1: }14 | + {1: }{5:15}{6:^x}{5: }│{1: }{5:15 }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| {8:[No Name] [+] }{3:[No Name] [+] }| | ]]} feed('<C-W>lay<Esc>') screen:expect{grid=[[ - {1: }{2:-----------------}{3:│}{1: }{4:6 }| - {1: }{2:-----------------}{3:│}{1: }{4:7 }| - {1: }{2:-----------------}{3:│}{1: }{4:8 }| - {1: }9 {3:│}{1: }9 | - {1: }10 {3:│}{1: }10 | - {1: }11 {3:│}{1: }11 | - {1: }12 {3:│}{1: }12 | - {1: }13 {3:│}{1: }13 | - {1: }14 {3:│}{1: }14 | - {1: }{5:15}{6:x}{5: }{3:│}{1: }{5:15}{6:^y}{5: }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| + {1: }{2:-----------------}│{1: }{4:6 }| + {1: }{2:-----------------}│{1: }{4:7 }| + {1: }{2:-----------------}│{1: }{4:8 }| + {1: }9 │{1: }9 | + {1: }10 │{1: }10 | + {1: }11 │{1: }11 | + {1: }12 │{1: }12 | + {1: }13 │{1: }13 | + {1: }14 │{1: }14 | + {1: }{5:15}{6:x}{5: }│{1: }{5:15}{6:^y}{5: }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| {3:[No Name] [+] }{8:[No Name] [+] }| | ]]} @@ -1253,24 +1253,24 @@ it('diff mode works properly if file contains NUL bytes vim-patch:8.2.3925', fun -- Test using internal diff screen:expect([[ - {1: }{5:^A}{4: }{2:│}{1: }{5:a}{4: }| - {1: }b {2:│}{1: }b | - {1: }{4:c }{2:│}{1: }{4:c}{7:^@}{4: }| - {1: }d {2:│}{1: }d | - {1: }{5:E}{4: }{2:│}{1: }{5:e}{4: }| - {1: }f {2:│}{1: }f | - {1: }g {2:│}{1: }g | - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| + {1: }{5:^A}{4: }│{1: }{5:a}{4: }| + {1: }b │{1: }b | + {1: }{4:c }│{1: }{4:c}{7:^@}{4: }| + {1: }d │{1: }d | + {1: }{5:E}{4: }│{1: }{5:e}{4: }| + {1: }f │{1: }f | + {1: }g │{1: }g | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {8:[No Name] [+] }{2:[No Name] [+] }| | ]]) @@ -1279,24 +1279,24 @@ it('diff mode works properly if file contains NUL bytes vim-patch:8.2.3925', fun command('set diffopt+=icase') feed('<C-L>') screen:expect([[ - {1: }^A {2:│}{1: }a | - {1: }b {2:│}{1: }b | - {1: }{4:c }{2:│}{1: }{4:c}{7:^@}{4: }| - {1: }d {2:│}{1: }d | - {1: }E {2:│}{1: }e | - {1: }f {2:│}{1: }f | - {1: }g {2:│}{1: }g | - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| + {1: }^A │{1: }a | + {1: }b │{1: }b | + {1: }{4:c }│{1: }{4:c}{7:^@}{4: }| + {1: }d │{1: }d | + {1: }E │{1: }e | + {1: }f │{1: }f | + {1: }g │{1: }g | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {8:[No Name] [+] }{2:[No Name] [+] }| | ]]) @@ -1305,24 +1305,24 @@ it('diff mode works properly if file contains NUL bytes vim-patch:8.2.3925', fun command('set diffopt=filler') feed('<C-L>') screen:expect([[ - {1: }{5:^A}{4: }{2:│}{1: }{5:a}{4: }| - {1: }b {2:│}{1: }b | - {1: }{4:c }{2:│}{1: }{4:c}{7:^@}{4: }| - {1: }d {2:│}{1: }d | - {1: }{5:E}{4: }{2:│}{1: }{5:e}{4: }| - {1: }f {2:│}{1: }f | - {1: }g {2:│}{1: }g | - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| + {1: }{5:^A}{4: }│{1: }{5:a}{4: }| + {1: }b │{1: }b | + {1: }{4:c }│{1: }{4:c}{7:^@}{4: }| + {1: }d │{1: }d | + {1: }{5:E}{4: }│{1: }{5:e}{4: }| + {1: }f │{1: }f | + {1: }g │{1: }g | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {8:[No Name] [+] }{2:[No Name] [+] }| | ]]) @@ -1331,24 +1331,24 @@ it('diff mode works properly if file contains NUL bytes vim-patch:8.2.3925', fun command('set diffopt+=filler,icase') feed('<C-L>') screen:expect([[ - {1: }^A {2:│}{1: }a | - {1: }b {2:│}{1: }b | - {1: }{4:c }{2:│}{1: }{4:c}{7:^@}{4: }| - {1: }d {2:│}{1: }d | - {1: }E {2:│}{1: }e | - {1: }f {2:│}{1: }f | - {1: }g {2:│}{1: }g | - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| - {6:~ }{2:│}{6:~ }| + {1: }^A │{1: }a | + {1: }b │{1: }b | + {1: }{4:c }│{1: }{4:c}{7:^@}{4: }| + {1: }d │{1: }d | + {1: }E │{1: }e | + {1: }f │{1: }f | + {1: }g │{1: }g | + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| + {6:~ }│{6:~ }| {8:[No Name] [+] }{2:[No Name] [+] }| | ]]) diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua index 96e7b1b6bc..03170c79e6 100644 --- a/test/functional/ui/float_spec.lua +++ b/test/functional/ui/float_spec.lua @@ -22,6 +22,7 @@ local curbuf, curwin, curtab = helpers.curbuf, helpers.curwin, helpers.curtab describe('float window', function() before_each(function() clear() + command('hi VertSplit gui=reverse') end) local attrs = { [0] = {bold=true, foreground=Screen.colors.Blue}, @@ -7590,6 +7591,53 @@ describe('float window', function() ]]} end end) + + it('can use winbar', function() + local buf = meths.create_buf(false,false) + local win1 = meths.open_win(buf, false, {relative='editor', width=15, height=3, row=1, col=5}) + meths.win_set_option(win1, 'winbar', 'floaty bar') + + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [3:----------------------------------------]| + ## grid 2 + ^ | + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + ## grid 3 + | + ## grid 4 + {3:floaty bar }| + {1: }| + {2:~ }| + ]], float_pos={ + [4] = {{id = 1001}, "NW", 1, 1, 5, true, 50}; + }, win_viewport={ + [2] = {win = {id = 1000}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1}; + [4] = {win = {id = 1001}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1}; + }} + else + screen:expect{grid=[[ + ^ | + {0:~ }{3:floaty bar }{0: }| + {0:~ }{1: }{0: }| + {0:~ }{2:~ }{0: }| + {0:~ }| + {0:~ }| + | + ]]} + end + end) end describe('with ext_multigrid', function() diff --git a/test/functional/ui/fold_spec.lua b/test/functional/ui/fold_spec.lua index bc52696418..9762805dee 100644 --- a/test/functional/ui/fold_spec.lua +++ b/test/functional/ui/fold_spec.lua @@ -21,12 +21,14 @@ local content1 = [[ describe("folded lines", function() before_each(function() clear() + command('hi VertSplit gui=reverse') end) local function with_ext_multigrid(multigrid) local screen before_each(function() clear() + command('hi VertSplit gui=reverse') screen = Screen.new(45, 8) screen:attach({rgb=true, ext_multigrid=multigrid}) screen:set_default_attr_ids({ diff --git a/test/functional/ui/global_statusline_spec.lua b/test/functional/ui/global_statusline_spec.lua index f6821ec589..369c4a31f1 100644 --- a/test/functional/ui/global_statusline_spec.lua +++ b/test/functional/ui/global_statusline_spec.lua @@ -65,20 +65,20 @@ describe('global statusline', function() it('works with splits', function() command('vsplit | split | vsplit | vsplit | wincmd l | split | 2wincmd l | split') screen:expect{grid=[[ - {1:│} {1:│} {1:│}^ | - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:├────────────────┤}{2:~}{1:│}{2:~ }| - {2:~ }{1:│} {1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:├────────────────────}| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│} | - {1:────────────────────┴────────────────┴─┤}{2:~ }| - {1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| + │ │ │^ | + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }├────────────────┤{2:~}│{2:~ }| + {2:~ }│ │{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}├────────────────────| + {2:~ }│{2:~ }│{2:~}│ | + ────────────────────┴────────────────┴─┤{2:~ }| + │{2:~ }| + {2:~ }│{2:~ }| + {2:~ }│{2:~ }| + {2:~ }│{2:~ }| {3:[No Name] 0,0-1 All}| | ]], attr_ids={ @@ -137,20 +137,20 @@ describe('global statusline', function() command('vsplit | split | vsplit | vsplit | wincmd l | split | 2wincmd l | split') command('set laststatus=2') screen:expect{grid=[[ - {1:│} {1:│} {1:│}^ | - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│< Name] 0,0-1 │}{2:~}{1:│}{2:~ }| - {2:~ }{1:│} {1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{3:<No Name] 0,0-1 All}| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│} | - {1:<No Name] 0,0-1 All < Name] 0,0-1 <│}{2:~ }| - {1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| + │ │ │^ | + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{1:< Name] 0,0-1 }│{2:~}│{2:~ }| + {2:~ }│ │{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{3:<No Name] 0,0-1 All}| + {2:~ }│{2:~ }│{2:~}│ | + {1:<No Name] 0,0-1 All < Name] 0,0-1 <}│{2:~ }| + │{2:~ }| + {2:~ }│{2:~ }| + {2:~ }│{2:~ }| + {2:~ }│{2:~ }| {1:[No Name] 0,0-1 All <No Name] 0,0-1 All}| | ]], attr_ids={ @@ -161,20 +161,20 @@ describe('global statusline', function() command('set laststatus=3') screen:expect{grid=[[ - {1:│} {1:│} {1:│}^ | - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:├────────────────┤}{2:~}{1:│}{2:~ }| - {2:~ }{1:│} {1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:├────────────────────}| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│} | - {1:────────────────────┴────────────────┴─┤}{2:~ }| - {1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| + │ │ │^ | + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }├────────────────┤{2:~}│{2:~ }| + {2:~ }│ │{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}├────────────────────| + {2:~ }│{2:~ }│{2:~}│ | + ────────────────────┴────────────────┴─┤{2:~ }| + │{2:~ }| + {2:~ }│{2:~ }| + {2:~ }│{2:~ }| + {2:~ }│{2:~ }| {3:[No Name] 0,0-1 All}| | ]], attr_ids={ @@ -185,21 +185,21 @@ describe('global statusline', function() command('set laststatus=0') screen:expect{grid=[[ - {1:│} {1:│} {1:│}^ | - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│< Name] 0,0-1 │}{2:~}{1:│}{2:~ }| - {2:~ }{1:│} {1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{3:<No Name] 0,0-1 All}| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│} | - {1:<No Name] 0,0-1 All < Name] 0,0-1 <│}{2:~ }| - {1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| + │ │ │^ | + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{1:< Name] 0,0-1 }│{2:~}│{2:~ }| + {2:~ }│ │{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{3:<No Name] 0,0-1 All}| + {2:~ }│{2:~ }│{2:~}│ | + {1:<No Name] 0,0-1 All < Name] 0,0-1 <}│{2:~ }| + │{2:~ }| + {2:~ }│{2:~ }| + {2:~ }│{2:~ }| + {2:~ }│{2:~ }| + {2:~ }│{2:~ }| 0,0-1 All | ]], attr_ids={ [1] = {reverse = true}; @@ -209,20 +209,20 @@ describe('global statusline', function() command('set laststatus=3') screen:expect{grid=[[ - {1:│} {1:│} {1:│}^ | - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:├────────────────┤}{2:~}{1:│}{2:~ }| - {2:~ }{1:│} {1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:├────────────────────}| - {2:~ }{1:│}{2:~ }{1:│}{2:~}{1:│} | - {1:────────────────────┴────────────────┴─┤}{2:~ }| - {1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| - {2:~ }{1:│}{2:~ }| + │ │ │^ | + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }├────────────────┤{2:~}│{2:~ }| + {2:~ }│ │{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}│{2:~ }| + {2:~ }│{2:~ }│{2:~}├────────────────────| + {2:~ }│{2:~ }│{2:~}│ | + ────────────────────┴────────────────┴─┤{2:~ }| + │{2:~ }| + {2:~ }│{2:~ }| + {2:~ }│{2:~ }| + {2:~ }│{2:~ }| {3:[No Name] 0,0-1 All}| | ]], attr_ids={ diff --git a/test/functional/ui/highlight_spec.lua b/test/functional/ui/highlight_spec.lua index 8afc69a649..22589fb107 100644 --- a/test/functional/ui/highlight_spec.lua +++ b/test/functional/ui/highlight_spec.lua @@ -104,12 +104,12 @@ describe('highlight defaults', function() }) feed_command('sp', 'vsp', 'vsp') screen:expect([[ - ^ {2:│} {2:│} | - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| + ^ │ │ | + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| {1:[No Name] }{2:[No Name] [No Name] }| | {0:~ }| @@ -122,12 +122,12 @@ describe('highlight defaults', function() -- navigate to verify that the attributes are properly moved feed('<c-w>j') screen:expect([[ - {2:│} {2:│} | - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| + │ │ | + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| {2:[No Name] [No Name] [No Name] }| ^ | {0:~ }| @@ -142,12 +142,12 @@ describe('highlight defaults', function() -- (upstream vim has the same behavior) feed('<c-w>k<c-w>l') screen:expect([[ - {2:│}^ {2:│} | - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| + │^ │ | + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| {2:[No Name] }{1:[No Name] }{2:[No Name] }| | {0:~ }| @@ -159,12 +159,12 @@ describe('highlight defaults', function() ]]) feed('<c-w>l') screen:expect([[ - {2:│} {2:│}^ | - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| + │ │^ | + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| {2:[No Name] [No Name] }{1:[No Name] }| | {0:~ }| @@ -176,12 +176,12 @@ describe('highlight defaults', function() ]]) feed('<c-w>h<c-w>h') screen:expect([[ - ^ {2:│} {2:│} | - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| - {0:~ }{2:│}{0:~ }{2:│}{0:~ }| + ^ │ │ | + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| {1:[No Name] }{2:[No Name] [No Name] }| | {0:~ }| @@ -1185,31 +1185,31 @@ describe('CursorLine and CursorLineNr highlights', function() feed('<esc>gg') command('windo diffthis') screen:expect([[ - {1: }{7:line 1 some text }{4:│}{1: }{7:^line 1 some text }| - {1: }{3:line 2 mo}{2:Re text!}{3: }{4:│}{1: }{3:line 2 mo}{2:re text}{3: }| - {1: }{5:extra line! }{4:│}{1: }{6:----------------------}| - {1: }extra line! {4:│}{1: }extra line! | - {1: }extra line! {4:│}{1: }extra line! | - {1: }last line ... {4:│}{1: }last line ... | - {1: } {4:│}{1: } | - {8:~ }{4:│}{8:~ }| - {8:~ }{4:│}{8:~ }| - {8:~ }{4:│}{8:~ }| + {1: }{7:line 1 some text }│{1: }{7:^line 1 some text }| + {1: }{3:line 2 mo}{2:Re text!}{3: }│{1: }{3:line 2 mo}{2:re text}{3: }| + {1: }{5:extra line! }│{1: }{6:----------------------}| + {1: }extra line! │{1: }extra line! | + {1: }extra line! │{1: }extra line! | + {1: }last line ... │{1: }last line ... | + {1: } │{1: } | + {8:~ }│{8:~ }| + {8:~ }│{8:~ }| + {8:~ }│{8:~ }| {4:[No Name] [+] }{9:[No Name] [+] }| | ]]) feed('jjjjj') screen:expect([[ - {1: }line 1 some text {4:│}{1: }line 1 some text | - {1: }{3:line 2 mo}{2:Re text!}{3: }{4:│}{1: }{3:line 2 mo}{2:re text}{3: }| - {1: }{5:extra line! }{4:│}{1: }{6:----------------------}| - {1: }extra line! {4:│}{1: }extra line! | - {1: }extra line! {4:│}{1: }extra line! | - {1: }last line ... {4:│}{1: }last line ... | - {1: }{7: }{4:│}{1: }{7:^ }| - {8:~ }{4:│}{8:~ }| - {8:~ }{4:│}{8:~ }| - {8:~ }{4:│}{8:~ }| + {1: }line 1 some text │{1: }line 1 some text | + {1: }{3:line 2 mo}{2:Re text!}{3: }│{1: }{3:line 2 mo}{2:re text}{3: }| + {1: }{5:extra line! }│{1: }{6:----------------------}| + {1: }extra line! │{1: }extra line! | + {1: }extra line! │{1: }extra line! | + {1: }last line ... │{1: }last line ... | + {1: }{7: }│{1: }{7:^ }| + {8:~ }│{8:~ }| + {8:~ }│{8:~ }| + {8:~ }│{8:~ }| {4:[No Name] [+] }{9:[No Name] [+] }| | ]]) @@ -1219,16 +1219,16 @@ describe('CursorLine and CursorLineNr highlights', function() command('hi CursorLine ctermbg=red ctermfg=NONE guibg=red guifg=NONE') feed('kkkk') screen:expect([[ - {1: }line 1 some text {4:│}{1: }line 1 some text | - {1: }{11:line 2 mo}{12:Re text!}{11: }{4:│}{1: }{11:^line 2 mo}{12:re text}{11: }| - {1: }{5:extra line! }{4:│}{1: }{6:----------------------}| - {1: }extra line! {4:│}{1: }extra line! | - {1: }extra line! {4:│}{1: }extra line! | - {1: }last line ... {4:│}{1: }last line ... | - {1: } {4:│}{1: } | - {8:~ }{4:│}{8:~ }| - {8:~ }{4:│}{8:~ }| - {8:~ }{4:│}{8:~ }| + {1: }line 1 some text │{1: }line 1 some text | + {1: }{11:line 2 mo}{12:Re text!}{11: }│{1: }{11:^line 2 mo}{12:re text}{11: }| + {1: }{5:extra line! }│{1: }{6:----------------------}| + {1: }extra line! │{1: }extra line! | + {1: }extra line! │{1: }extra line! | + {1: }last line ... │{1: }last line ... | + {1: } │{1: } | + {8:~ }│{8:~ }| + {8:~ }│{8:~ }| + {8:~ }│{8:~ }| {4:[No Name] [+] }{9:[No Name] [+] }| | ]], { @@ -1274,31 +1274,31 @@ describe('CursorLine and CursorLineNr highlights', function() command('windo diffthis') command('1wincmd w') screen:expect([[ - {1: }{9: }{2:-------------------}{3:│}{1: }{9: 1 }{4:baz }| - {1: }{6: 1 }{5:^foo }{3:│}{1: }{6: 2 }{5:foo }| - {1: }{9: 2 }foo {3:│}{1: }{9: 3 }foo | - {1: }{9: 3 }bar {3:│}{1: }{9: 4 }bar | - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| + {1: }{9: }{2:-------------------}│{1: }{9: 1 }{4:baz }| + {1: }{6: 1 }{5:^foo }│{1: }{6: 2 }{5:foo }| + {1: }{9: 2 }foo │{1: }{9: 3 }foo | + {1: }{9: 3 }bar │{1: }{9: 4 }bar | + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| {8:[No Name] [+] }{3:[No Name] [+] }| | ]]) command('set cursorlineopt=number') screen:expect([[ - {1: }{9: }{2:-------------------}{3:│}{1: }{9: 1 }{4:baz }| - {1: }{6: 1 }^foo {3:│}{1: }{6: 2 }{5:foo }| - {1: }{9: 2 }foo {3:│}{1: }{9: 3 }foo | - {1: }{9: 3 }bar {3:│}{1: }{9: 4 }bar | - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| - {7:~ }{3:│}{7:~ }| + {1: }{9: }{2:-------------------}│{1: }{9: 1 }{4:baz }| + {1: }{6: 1 }^foo │{1: }{6: 2 }{5:foo }| + {1: }{9: 2 }foo │{1: }{9: 3 }foo | + {1: }{9: 3 }bar │{1: }{9: 4 }bar | + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| + {7:~ }│{7:~ }| {8:[No Name] [+] }{3:[No Name] [+] }| | ]]) diff --git a/test/functional/ui/hlstate_spec.lua b/test/functional/ui/hlstate_spec.lua index dcea2c76dd..925af11627 100644 --- a/test/functional/ui/hlstate_spec.lua +++ b/test/functional/ui/hlstate_spec.lua @@ -14,6 +14,7 @@ describe('ext_hlstate detailed highlights', function() before_each(function() clear() command('syntax on') + command('hi VertSplit gui=reverse') screen = Screen.new(40, 8) screen:attach({ext_hlstate=true}) end) @@ -59,7 +60,7 @@ describe('ext_hlstate detailed highlights', function() it('work with cleared UI highlights', function() screen:set_default_attr_ids({ - [1] = {{}, {{hi_name = "VertSplit", ui_name = "WinSeparator", kind = "ui"}}}, + [1] = {{}, {{hi_name = "Normal", ui_name = "WinSeparator", kind = "ui"}}}, [2] = {{bold = true, foreground = Screen.colors.Blue1}, {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}}, [3] = {{bold = true, reverse = true}, diff --git a/test/functional/ui/inccommand_spec.lua b/test/functional/ui/inccommand_spec.lua index 10700d9508..879c44773a 100644 --- a/test/functional/ui/inccommand_spec.lua +++ b/test/functional/ui/inccommand_spec.lua @@ -1858,26 +1858,26 @@ describe("'inccommand' split windows", function() feed_command("split") feed(":%s/tw") screen:expect([[ - Inc substitution on {10:│}Inc substitution on| - {12:tw}o lines {10:│}{12:tw}o lines | - {10:│} | - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {11:[No Name] [+] }{10:│}{15:~ }| - Inc substitution on {10:│}{15:~ }| - {12:tw}o lines {10:│}{15:~ }| - {10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| + Inc substitution on │Inc substitution on| + {12:tw}o lines │{12:tw}o lines | + │ | + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {11:[No Name] [+] }│{15:~ }| + Inc substitution on │{15:~ }| + {12:tw}o lines │{15:~ }| + │{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| {10:[No Name] [+] [No Name] [+] }| |2| {12:tw}o lines | {15:~ }| @@ -1897,20 +1897,20 @@ describe("'inccommand' split windows", function() feed(":%s/tw") screen:expect([[ - Inc substitution on {10:│}Inc substitution on| - {12:tw}o lines {10:│}{12:tw}o lines | - {10:│} | - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| - {15:~ }{10:│}{15:~ }| + Inc substitution on │Inc substitution on| + {12:tw}o lines │{12:tw}o lines | + │ | + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| + {15:~ }│{15:~ }| {11:[No Name] [+] }{10:[No Name] [+] }| Inc substitution on | {12:tw}o lines | diff --git a/test/functional/ui/input_spec.lua b/test/functional/ui/input_spec.lua index 07582ba602..0f4e97088c 100644 --- a/test/functional/ui/input_spec.lua +++ b/test/functional/ui/input_spec.lua @@ -313,11 +313,6 @@ it('unsimplified mapping works when there was a partial match vim-patch:8.2.4504 expect('xb') end) -it('rhs of a mapping is not simplified', function() - command('nnoremap <Plug>foo <C-J>') - eq('<C-J>', funcs.maparg('<Plug>foo')) -end) - describe('input non-printable chars', function() after_each(function() os.remove('Xtest-overwrite') diff --git a/test/functional/ui/messages_spec.lua b/test/functional/ui/messages_spec.lua index 3320f53d86..ee1e37c675 100644 --- a/test/functional/ui/messages_spec.lua +++ b/test/functional/ui/messages_spec.lua @@ -1223,7 +1223,7 @@ describe('ui/ext_messages', function() {1:~ }| {1:~ }| {1:~ }| - {6:────────────────────────────────────────────────────────────────────────────────}| + ────────────────────────────────────────────────────────────────────────────────| | {1:~ }| {1:~ }| @@ -1256,7 +1256,7 @@ describe('ui/ext_messages', function() {1:~ }| {1:~ }| {1:~ }| - {6:────────────────────────────────────────────────────────────────────────────────}| + ────────────────────────────────────────────────────────────────────────────────| | {1:~ }| {1:~ }| @@ -1291,7 +1291,7 @@ describe('ui/ext_messages', function() {1:~ }| {1:~ }| {1:~ }| - {6:────────────────────────────────────────────────────────────────────────────────}| + ────────────────────────────────────────────────────────────────────────────────| | {1:~ }| {1:~ }| @@ -1312,7 +1312,6 @@ end) describe('ui/msg_puts_printf', function() it('output multibyte characters correctly', function() - if helpers.pending_win32(pending) then return end local screen local cmd = '' local locale_dir = test_build_dir..'/share/locale/ja/LC_MESSAGES' diff --git a/test/functional/ui/mouse_spec.lua b/test/functional/ui/mouse_spec.lua index 8d3c312def..e5284894cb 100644 --- a/test/functional/ui/mouse_spec.lua +++ b/test/functional/ui/mouse_spec.lua @@ -595,54 +595,54 @@ describe('ui/mouse/input', function() feed('ifoo\nbar<esc>') screen:expect{grid=[[ - testing {4:│}testing | - mouse {4:│}mouse | - support and selection {4:│}support and selection | - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│[No Name] [+] }| - {0:~ }{4:│}foo{0:$} | - {0:~ }{4:│}ba^r{0:$} | - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| + testing │testing | + mouse │mouse | + support and selection │support and selection | + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{4:[No Name] [+] }| + {0:~ }│foo{0:$} | + {0:~ }│ba^r{0:$} | + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| {4:[No Name] [+] }{5:[No Name] [+] }| | ]]} meths.input_mouse('left', 'press', '', 0, 6, 27) screen:expect{grid=[[ - testing {4:│}testing | - mouse {4:│}mouse | - support and selection {4:│}support and selection | - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│[No Name] [+] }| - {0:~ }{4:│}^foo{0:$} | - {0:~ }{4:│}bar{0:$} | - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| + testing │testing | + mouse │mouse | + support and selection │support and selection | + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{4:[No Name] [+] }| + {0:~ }│^foo{0:$} | + {0:~ }│bar{0:$} | + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| {4:[No Name] [+] }{5:[No Name] [+] }| | ]]} meths.input_mouse('left', 'drag', '', 0, 7, 30) screen:expect{grid=[[ - testing {4:│}testing | - mouse {4:│}mouse | - support and selection {4:│}support and selection | - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│[No Name] [+] }| - {0:~ }{4:│}{1:foo}{3:$} | - {0:~ }{4:│}{1:bar}{0:^$} | - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| - {0:~ }{4:│}{0:~ }| + testing │testing | + mouse │mouse | + support and selection │support and selection | + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{4:[No Name] [+] }| + {0:~ }│{1:foo}{3:$} | + {0:~ }│{1:bar}{0:^$} | + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| + {0:~ }│{0:~ }| {4:[No Name] [+] }{5:[No Name] [+] }| {2:-- VISUAL --} | ]]} @@ -729,12 +729,12 @@ describe('ui/mouse/input', function() feed('k') feed_command('sp', 'vsp') screen:expect([[ - lines {4:│}lines | - to {4:│}to | - test {4:│}test | - ^mouse scrolling {4:│}mouse scrolling | - {4:│} | - {0:~ }{4:│}{0:~ }| + lines │lines | + to │to | + test │test | + ^mouse scrolling │mouse scrolling | + │ | + {0:~ }│{0:~ }| {5:[No Name] [+] }{4:[No Name] [+] }| to | test | @@ -750,12 +750,12 @@ describe('ui/mouse/input', function() feed('<ScrollWheelDown><0,0>') end screen:expect([[ - ^mouse scrolling {4:│}lines | - {4:│}to | - {0:~ }{4:│}test | - {0:~ }{4:│}mouse scrolling | - {0:~ }{4:│} | - {0:~ }{4:│}{0:~ }| + ^mouse scrolling │lines | + │to | + {0:~ }│test | + {0:~ }│mouse scrolling | + {0:~ }│ | + {0:~ }│{0:~ }| {5:[No Name] [+] }{4:[No Name] [+] }| to | test | @@ -771,12 +771,12 @@ describe('ui/mouse/input', function() feed('<ScrollWheelUp><27,0>') end screen:expect([[ - ^mouse scrolling {4:│}text | - {4:│}with | - {0:~ }{4:│}many | - {0:~ }{4:│}lines | - {0:~ }{4:│}to | - {0:~ }{4:│}test | + ^mouse scrolling │text | + │with | + {0:~ }│many | + {0:~ }│lines | + {0:~ }│to | + {0:~ }│test | {5:[No Name] [+] }{4:[No Name] [+] }| to | test | @@ -793,12 +793,12 @@ describe('ui/mouse/input', function() feed('<ScrollWheelUp><27,7><ScrollWheelUp>') end screen:expect([[ - ^mouse scrolling {4:│}text | - {4:│}with | - {0:~ }{4:│}many | - {0:~ }{4:│}lines | - {0:~ }{4:│}to | - {0:~ }{4:│}test | + ^mouse scrolling │text | + │with | + {0:~ }│many | + {0:~ }│lines | + {0:~ }│to | + {0:~ }│test | {5:[No Name] [+] }{4:[No Name] [+] }| Inserting | text | diff --git a/test/functional/ui/multigrid_spec.lua b/test/functional/ui/multigrid_spec.lua index 4e5e9c3a71..0fba55e76b 100644 --- a/test/functional/ui/multigrid_spec.lua +++ b/test/functional/ui/multigrid_spec.lua @@ -77,18 +77,18 @@ describe('ext_multigrid', function() command('vsplit') screen:expect{grid=[[ ## grid 1 - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| {11:[No Name] }{12:[No Name] }| [3:-----------------------------------------------------]| ## grid 2 @@ -129,18 +129,18 @@ describe('ext_multigrid', function() command('split') screen:expect{grid=[[ ## grid 1 - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}{11:[No Name] }| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│{11:[No Name] }| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| {12:[No Name] [No Name] }| [3:-----------------------------------------------------]| ## grid 2 @@ -300,12 +300,12 @@ describe('ext_multigrid', function() command('vsp') screen:expect{grid=[[ ## grid 1 - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| {11:[No Name] }{12:[No Name] [No Name] }| [2:-----------------------------------------------------]| [2:-----------------------------------------------------]| @@ -347,12 +347,12 @@ describe('ext_multigrid', function() insert('hello') screen:expect{grid=[[ ## grid 1 - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| - [6:--------------------]{12:│}[5:----------------]{12:│}[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| + [6:--------------------]│[5:----------------]│[4:---------------]| {11:[No Name] [+] }{12:[No Name] [+] [No Name] [+] }| [2:-----------------------------------------------------]| [2:-----------------------------------------------------]| @@ -467,18 +467,18 @@ describe('ext_multigrid', function() command('vsp') screen:expect{grid=[[ ## grid 1 - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| {11:[No Name] }{12:[No Name] }| [3:-----------------------------------------------------]| ## grid 2 @@ -516,18 +516,18 @@ describe('ext_multigrid', function() command('vertical resize 10') screen:expect{grid=[[ ## grid 1 - [4:----------]{12:│}[2:------------------------------------------]| - [4:----------]{12:│}[2:------------------------------------------]| - [4:----------]{12:│}[2:------------------------------------------]| - [4:----------]{12:│}[2:------------------------------------------]| - [4:----------]{12:│}[2:------------------------------------------]| - [4:----------]{12:│}[2:------------------------------------------]| - [4:----------]{12:│}[2:------------------------------------------]| - [4:----------]{12:│}[2:------------------------------------------]| - [4:----------]{12:│}[2:------------------------------------------]| - [4:----------]{12:│}[2:------------------------------------------]| - [4:----------]{12:│}[2:------------------------------------------]| - [4:----------]{12:│}[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| + [4:----------]│[2:------------------------------------------]| {11:<No Name] }{12:[No Name] }| [3:-----------------------------------------------------]| ## grid 2 @@ -565,18 +565,18 @@ describe('ext_multigrid', function() command('sp') screen:expect{grid=[[ ## grid 1 - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - {11:[No Name] }{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + {11:[No Name] }│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| {12:[No Name] [No Name] }| [3:-----------------------------------------------------]| ## grid 2 @@ -611,18 +611,18 @@ describe('ext_multigrid', function() insert('hello') screen:expect{grid=[[ ## grid 1 - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - {11:[No Name] [+] }{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + {11:[No Name] [+] }│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| {12:[No Name] [+] [No Name] [+] }| [3:-----------------------------------------------------]| ## grid 2 @@ -659,18 +659,18 @@ describe('ext_multigrid', function() command('vsp') screen:expect{grid=[[ ## grid 1 - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| {11:[No Name] }{12:[No Name] }| [3:-----------------------------------------------------]| ## grid 2 @@ -1056,12 +1056,12 @@ describe('ext_multigrid', function() command('vsp') screen:expect{grid=[[ ## grid 1 - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| {11:[No Name] }{12:[No Name] }| [2:-----------------------------------------------------]| [2:-----------------------------------------------------]| @@ -1097,12 +1097,12 @@ describe('ext_multigrid', function() feed(":echoerr 'very' | echoerr 'much' | echoerr 'fail'<cr>") screen:expect{grid=[[ ## grid 1 - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| {11:[No Name] }{12:[No Name] }| [2:-----------------------------------------------------]| [2:-----------------------------------------------------]| @@ -1141,12 +1141,12 @@ describe('ext_multigrid', function() feed('<cr>') screen:expect{grid=[[ ## grid 1 - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| {11:[No Name] }{12:[No Name] }| [2:-----------------------------------------------------]| [2:-----------------------------------------------------]| @@ -1242,12 +1242,12 @@ describe('ext_multigrid', function() feed("<c-c>") screen:expect{grid=[[ ## grid 1 - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| - [5:--------------------------]{12:│}[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| + [5:--------------------------]│[4:--------------------------]| {11:[No Name] }{12:[No Name] }| [2:-----------------------------------------------------]| [2:-----------------------------------------------------]| @@ -1285,18 +1285,18 @@ describe('ext_multigrid', function() command('vsp') screen:expect{grid=[[ ## grid 1 - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| {11:[No Name] }{12:[No Name] }| [3:-----------------------------------------------------]| ## grid 2 @@ -1453,17 +1453,17 @@ describe('ext_multigrid', function() screen:expect{grid=[[ ## grid 1 {7: }{18:2}{7: [No Name] }{16: }{17:2}{16: [No Name] }{12: }{16:X}| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| {11:[No Name] }{12:[No Name] }| [3:-----------------------------------------------------]| ## grid 2 @@ -1637,18 +1637,18 @@ describe('ext_multigrid', function() command('tabclose') screen:expect{grid=[[ ## grid 1 - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| {11:[No Name] }{12:[No Name] }| [3:-----------------------------------------------------]| ## grid 2 @@ -1960,13 +1960,13 @@ describe('ext_multigrid', function() [4:-----------------------------------------------------]| [4:-----------------------------------------------------]| {12:[No Name] [+] }| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| - [5:--------------------------]{12:│}[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| + [5:--------------------------]│[2:--------------------------]| {11:[No Name] [+] }{12:[No Name] [+] }| [3:-----------------------------------------------------]| ## grid 2 @@ -2002,13 +2002,13 @@ describe('ext_multigrid', function() [4:-----------------------------------------------------]| [4:-----------------------------------------------------]| {12:[No Name] [+] }| - [5:------------------------------]{12:│}[2:----------------------]| - [5:------------------------------]{12:│}[2:----------------------]| - [5:------------------------------]{12:│}[2:----------------------]| - [5:------------------------------]{12:│}[2:----------------------]| - [5:------------------------------]{12:│}[2:----------------------]| - [5:------------------------------]{12:│}[2:----------------------]| - [5:------------------------------]{12:│}[2:----------------------]| + [5:------------------------------]│[2:----------------------]| + [5:------------------------------]│[2:----------------------]| + [5:------------------------------]│[2:----------------------]| + [5:------------------------------]│[2:----------------------]| + [5:------------------------------]│[2:----------------------]| + [5:------------------------------]│[2:----------------------]| + [5:------------------------------]│[2:----------------------]| {11:[No Name] [+] }{12:[No Name] [+] }| [3:-----------------------------------------------------]| ## grid 2 @@ -2049,18 +2049,18 @@ describe('ext_multigrid', function() screen:expect{grid=[[ ## grid 1 - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}[5:--------------------------]| - [4:--------------------------]{12:│}{11:[No Name] [+] }| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| - [4:--------------------------]{12:│}[2:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│[5:--------------------------]| + [4:--------------------------]│{11:[No Name] [+] }| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| + [4:--------------------------]│[2:--------------------------]| {12:[No Name] [No Name] }| [3:-----------------------------------------------------]| ## grid 2 @@ -2369,4 +2369,44 @@ describe('ext_multigrid', function() [2] = {win = {id = 1000}, topline = 6, botline = 12, curline = 10, curcol = 1, linecount = 11}, }} end) + + it('with winbar', function() + command 'split' + command 'setlocal winbar=very\\ bar' + screen:expect{grid=[[ + ## grid 1 + [4:-----------------------------------------------------]| + [4:-----------------------------------------------------]| + [4:-----------------------------------------------------]| + [4:-----------------------------------------------------]| + [4:-----------------------------------------------------]| + [4:-----------------------------------------------------]| + {11:[No Name] }| + [2:-----------------------------------------------------]| + [2:-----------------------------------------------------]| + [2:-----------------------------------------------------]| + [2:-----------------------------------------------------]| + [2:-----------------------------------------------------]| + {12:[No Name] }| + [3:-----------------------------------------------------]| + ## grid 2 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + | + ## grid 4 + {7:very bar }| + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]], win_viewport={ + [2] = {win = {id = 1000}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1}; + [4] = {win = {id = 1001}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1}; + }} + end) end) diff --git a/test/functional/ui/output_spec.lua b/test/functional/ui/output_spec.lua index 7305baa761..50e5dfac84 100644 --- a/test/functional/ui/output_spec.lua +++ b/test/functional/ui/output_spec.lua @@ -14,7 +14,6 @@ local has_powershell = helpers.has_powershell local set_shell_powershell = helpers.set_shell_powershell describe("shell command :!", function() - if helpers.pending_win32(pending) then return end local screen before_each(function() clear() diff --git a/test/functional/ui/popupmenu_spec.lua b/test/functional/ui/popupmenu_spec.lua index 067d3eef4a..ef65dbd2bd 100644 --- a/test/functional/ui/popupmenu_spec.lua +++ b/test/functional/ui/popupmenu_spec.lua @@ -953,72 +953,72 @@ describe('builtin popupmenu', function() insert('aaa aab aac\n') feed(':vsplit<cr>') screen:expect([[ - aaa aab aac {3:│}aaa aab aac| - ^ {3:│} | - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| + aaa aab aac │aaa aab aac| + ^ │ | + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| {4:[No Name] [+] }{3:<Name] [+] }| :vsplit | ]]) feed('ibbb a<c-x><c-n>') screen:expect([[ - aaa aab aac {3:│}aaa aab aac| - bbb aaa^ {3:│}bbb aaa | - {1:~ }{s: aaa }{1: }{3:│}{1:~ }| - {1:~ }{n: aab }{1: }{3:│}{1:~ }| - {1:~ }{n: aac }{1: }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| + aaa aab aac │aaa aab aac| + bbb aaa^ │bbb aaa | + {1:~ }{s: aaa }{1: }│{1:~ }| + {1:~ }{n: aab }{1: }│{1:~ }| + {1:~ }{n: aac }{1: }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| {4:[No Name] [+] }{3:<Name] [+] }| {2:-- }{5:match 1 of 3} | ]]) feed('<esc><c-w><c-w>oc a<c-x><c-n>') screen:expect([[ - aaa aab aac{3:│}aaa aab aac | - bbb aaa {3:│}bbb aaa | - c aaa {3:│}c aaa^ | - {1:~ }{3:│}{1:~}{s: aaa }{1: }| - {1:~ }{3:│}{1:~}{n: aab }{1: }| - {1:~ }{3:│}{1:~}{n: aac }{1: }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| - {1:~ }{3:│}{1:~ }| + aaa aab aac│aaa aab aac | + bbb aaa │bbb aaa | + c aaa │c aaa^ | + {1:~ }│{1:~}{s: aaa }{1: }| + {1:~ }│{1:~}{n: aab }{1: }| + {1:~ }│{1:~}{n: aac }{1: }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| {3:<Name] [+] }{4:[No Name] [+] }| {2:-- }{5:match 1 of 3} | ]]) diff --git a/test/functional/ui/screen_basic_spec.lua b/test/functional/ui/screen_basic_spec.lua index 09bcbc2bbd..6c872e52d3 100644 --- a/test/functional/ui/screen_basic_spec.lua +++ b/test/functional/ui/screen_basic_spec.lua @@ -326,12 +326,12 @@ local function screen_tests(linegrid) command('vsp') command('vsp') screen:expect([[ - ^ {3:│} {3:│} | - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| + ^ │ │ | + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| {1:[No Name] }{3:[No Name] [No Name] }| | {0:~ }| @@ -343,12 +343,12 @@ local function screen_tests(linegrid) ]]) insert('hello') screen:expect([[ - hell^o {3:│}hello {3:│}hello | - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| + hell^o │hello │hello | + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| {1:[No Name] [+] }{3:[No Name] [+] [No Name] [+] }| hello | {0:~ }| @@ -369,12 +369,12 @@ local function screen_tests(linegrid) command('vsp') insert('hello') screen:expect([[ - hell^o {3:│}hello {3:│}hello | - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| + hell^o │hello │hello | + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| {1:[No Name] [+] }{3:[No Name] [+] [No Name] [+] }| hello | {0:~ }| @@ -406,12 +406,12 @@ local function screen_tests(linegrid) command('tabprevious') screen:expect([[ {2: }{6:4}{2:+ [No Name] }{4: + [No Name] }{3: }{4:X}| - hell^o {3:│}hello {3:│}hello | - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| - {0:~ }{3:│}{0:~ }{3:│}{0:~ }| + hell^o │hello │hello | + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| + {0:~ }│{0:~ }│{0:~ }| {1:[No Name] [+] }{3:[No Name] [+] [No Name] [+] }| hello | {0:~ }| @@ -520,36 +520,36 @@ local function screen_tests(linegrid) command('vsplit') screen:expect([[ - ^foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | + ^foo │foo | + foo │foo | + foo │foo | + foo │foo | + foo │foo | + foo │foo | + foo │foo | + foo │foo | + foo │foo | + foo │foo | + foo │foo | + foo │foo | {1:[No Name] [+] }{3:[No Name] [+] }| | ]]) feed('<PageDown>') screen:expect([[ - ^foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | - foo {3:│}foo | - bar {3:│}foo | - bar {3:│}foo | - bar {3:│}foo | - bar {3:│}foo | - bar {3:│}foo | - bar {3:│}foo | - bar {3:│}foo | - bar {3:│}foo | + ^foo │foo | + foo │foo | + foo │foo | + foo │foo | + bar │foo | + bar │foo | + bar │foo | + bar │foo | + bar │foo | + bar │foo | + bar │foo | + bar │foo | {1:[No Name] [+] }{3:[No Name] [+] }| | ]]) @@ -748,12 +748,12 @@ local function screen_tests(linegrid) command('vsp') command('vsp') screen:expect([[ - and {3:│}and {3:│}and | - clearing {3:│}clearing {3:│}clearing | - in {3:│}in {3:│}in | - split {3:│}split {3:│}split | - windows {3:│}windows {3:│}windows | - ^ {3:│} {3:│} | + and │and │and | + clearing │clearing │clearing | + in │in │in | + split │split │split | + windows │windows │windows | + ^ │ │ | {1:[No Name] [+] }{3:[No Name] [+] [No Name] [+] }| clearing | in | @@ -768,12 +768,12 @@ local function screen_tests(linegrid) it('only affects the current scroll region', function() feed('6k') screen:expect([[ - ^scrolling {3:│}and {3:│}and | - and {3:│}clearing {3:│}clearing | - clearing {3:│}in {3:│}in | - in {3:│}split {3:│}split | - split {3:│}windows {3:│}windows | - windows {3:│} {3:│} | + ^scrolling │and │and | + and │clearing │clearing | + clearing │in │in | + in │split │split | + split │windows │windows | + windows │ │ | {1:[No Name] [+] }{3:[No Name] [+] [No Name] [+] }| clearing | in | @@ -785,12 +785,12 @@ local function screen_tests(linegrid) ]]) feed('<c-w>l') screen:expect([[ - scrolling {3:│}and {3:│}and | - and {3:│}clearing {3:│}clearing | - clearing {3:│}in {3:│}in | - in {3:│}split {3:│}split | - split {3:│}windows {3:│}windows | - windows {3:│}^ {3:│} | + scrolling │and │and | + and │clearing │clearing | + clearing │in │in | + in │split │split | + split │windows │windows | + windows │^ │ | {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }| clearing | in | @@ -802,12 +802,12 @@ local function screen_tests(linegrid) ]]) feed('gg') screen:expect([[ - scrolling {3:│}^Inserting {3:│}and | - and {3:│}text {3:│}clearing | - clearing {3:│}with {3:│}in | - in {3:│}many {3:│}split | - split {3:│}lines {3:│}windows | - windows {3:│}to {3:│} | + scrolling │^Inserting │and | + and │text │clearing | + clearing │with │in | + in │many │split | + split │lines │windows | + windows │to │ | {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }| clearing | in | @@ -819,12 +819,12 @@ local function screen_tests(linegrid) ]]) feed('7j') screen:expect([[ - scrolling {3:│}with {3:│}and | - and {3:│}many {3:│}clearing | - clearing {3:│}lines {3:│}in | - in {3:│}to {3:│}split | - split {3:│}test {3:│}windows | - windows {3:│}^scrolling {3:│} | + scrolling │with │and | + and │many │clearing | + clearing │lines │in | + in │to │split | + split │test │windows | + windows │^scrolling │ | {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }| clearing | in | @@ -836,12 +836,12 @@ local function screen_tests(linegrid) ]]) feed('2j') screen:expect([[ - scrolling {3:│}lines {3:│}and | - and {3:│}to {3:│}clearing | - clearing {3:│}test {3:│}in | - in {3:│}scrolling {3:│}split | - split {3:│}and {3:│}windows | - windows {3:│}^clearing {3:│} | + scrolling │lines │and | + and │to │clearing | + clearing │test │in | + in │scrolling │split | + split │and │windows | + windows │^clearing │ | {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }| clearing | in | @@ -853,12 +853,12 @@ local function screen_tests(linegrid) ]]) feed('5k') screen:expect([[ - scrolling {3:│}^lines {3:│}and | - and {3:│}to {3:│}clearing | - clearing {3:│}test {3:│}in | - in {3:│}scrolling {3:│}split | - split {3:│}and {3:│}windows | - windows {3:│}clearing {3:│} | + scrolling │^lines │and | + and │to │clearing | + clearing │test │in | + in │scrolling │split | + split │and │windows | + windows │clearing │ | {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }| clearing | in | @@ -870,12 +870,12 @@ local function screen_tests(linegrid) ]]) feed('k') screen:expect([[ - scrolling {3:│}^many {3:│}and | - and {3:│}lines {3:│}clearing | - clearing {3:│}to {3:│}in | - in {3:│}test {3:│}split | - split {3:│}scrolling {3:│}windows | - windows {3:│}and {3:│} | + scrolling │^many │and | + and │lines │clearing | + clearing │to │in | + in │test │split | + split │scrolling │windows | + windows │and │ | {3:[No Name] [+] }{1:[No Name] [+] }{3:<Name] [+] }| clearing | in | diff --git a/test/functional/ui/winbar_spec.lua b/test/functional/ui/winbar_spec.lua new file mode 100644 index 0000000000..abc6088801 --- /dev/null +++ b/test/functional/ui/winbar_spec.lua @@ -0,0 +1,197 @@ +local helpers = require('test.functional.helpers')(after_each) +local Screen = require('test.functional.ui.screen') +local clear = helpers.clear +local command = helpers.command +local insert = helpers.insert +local meths = helpers.meths +local eq = helpers.eq + +describe('winbar', function() + local screen + + before_each(function() + clear() + screen = Screen.new(60, 13) + screen:attach() + screen:set_default_attr_ids({ + [1] = {bold = true}, + [2] = {reverse = true}, + [3] = {bold = true, foreground = Screen.colors.Blue}, + [4] = {bold = true, reverse = true}, + [5] = {bold = true, foreground = Screen.colors.Red}, + [6] = {foreground = Screen.colors.Blue}, + }) + command('set winbar=Set\\ Up\\ The\\ Bars') + end) + it('works', function() + screen:expect([[ + {1:Set Up The Bars }| + ^ | + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + | + ]]) + end) + it('works with custom \'fillchars\' value', function() + command('set fillchars=wbr:+') + screen:expect([[ + {1:Set Up The Bars+++++++++++++++++++++++++++++++++++++++++++++}| + ^ | + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + | + ]]) + end) + it('works with custom highlight', function() + command('hi WinBar guifg=red') + screen:expect([[ + {5:Set Up The Bars }| + ^ | + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + | + ]]) + end) + it('works with splits', function() + command('hi WinBar guifg=red') + command('hi WinBarNC guifg=blue') + command('belowright vsplit | split | split') + screen:expect([[ + {6:Set Up The Bars }│{5:Set Up The Bars }| + │^ | + {3:~ }│{3:~ }| + {3:~ }│{4:[No Name] }| + {3:~ }│{6:Set Up The Bars }| + {3:~ }│ | + {3:~ }│{3:~ }| + {3:~ }│{2:[No Name] }| + {3:~ }│{6:Set Up The Bars }| + {3:~ }│ | + {3:~ }│{3:~ }| + {2:[No Name] [No Name] }| + | + ]]) + end) + it('works when switching value of \'winbar\'', function() + command('belowright vsplit | split | split | set winbar=') + screen:expect([[ + │^ | + {3:~ }│{3:~ }| + {3:~ }│{3:~ }| + {3:~ }│{4:[No Name] }| + {3:~ }│ | + {3:~ }│{3:~ }| + {3:~ }│{3:~ }| + {3:~ }│{2:[No Name] }| + {3:~ }│ | + {3:~ }│{3:~ }| + {3:~ }│{3:~ }| + {2:[No Name] [No Name] }| + | + ]]) + command('set winbar=All\\ Your\\ Bar\\ Are\\ Belong\\ To\\ Us') + screen:expect([[ + {1:All Your Bar Are Belong To Us}│{1:All Your Bar Are Belong To Us }| + │^ | + {3:~ }│{3:~ }| + {3:~ }│{4:[No Name] }| + {3:~ }│{1:All Your Bar Are Belong To Us }| + {3:~ }│ | + {3:~ }│{3:~ }| + {3:~ }│{2:[No Name] }| + {3:~ }│{1:All Your Bar Are Belong To Us }| + {3:~ }│ | + {3:~ }│{3:~ }| + {2:[No Name] [No Name] }| + | + ]]) + command('set winbar=Changed\\ winbar') + screen:expect([[ + {1:Changed winbar }│{1:Changed winbar }| + │^ | + {3:~ }│{3:~ }| + {3:~ }│{4:[No Name] }| + {3:~ }│{1:Changed winbar }| + {3:~ }│ | + {3:~ }│{3:~ }| + {3:~ }│{2:[No Name] }| + {3:~ }│{1:Changed winbar }| + {3:~ }│ | + {3:~ }│{3:~ }| + {2:[No Name] [No Name] }| + | + ]]) + end) + it('works with laststatus=3', function() + command('set laststatus=3') + screen:expect([[ + {1:Set Up The Bars }| + ^ | + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {4:[No Name] }| + | + ]]) + command('belowright vsplit | split | split') + screen:expect([[ + {1:Set Up The Bars }│{1:Set Up The Bars }| + │^ | + {3:~ }│{3:~ }| + {3:~ }├──────────────────────────────| + {3:~ }│{1:Set Up The Bars }| + {3:~ }│ | + {3:~ }│{3:~ }| + {3:~ }├──────────────────────────────| + {3:~ }│{1:Set Up The Bars }| + {3:~ }│ | + {3:~ }│{3:~ }| + {4:[No Name] }| + | + ]]) + end) + it('sets correct position on mouse click', function() + insert[[ + line 1 + line 2 + line 3 + line 4 + line -42 + line i + line sin(theta) + line 8 + ]] + meths.input_mouse('left', 'press', '', 0, 5, 1) + eq({5, 1}, meths.win_get_cursor(0)) + end) +end) diff --git a/test/symbolic/klee/nvim/keymap.c b/test/symbolic/klee/nvim/keymap.c index ed5f95a344..1f7f0e0911 100644 --- a/test/symbolic/klee/nvim/keymap.c +++ b/test/symbolic/klee/nvim/keymap.c @@ -1,7 +1,7 @@ #include <stdbool.h> #include "nvim/types.h" -#include "nvim/keymap.h" +#include "nvim/keycodes.h" #include "nvim/ascii.h" #include "nvim/eval/typval.h" diff --git a/test/symbolic/klee/viml_expressions_lexer.c b/test/symbolic/klee/viml_expressions_lexer.c index ee7dc312e9..03c9d66ca4 100644 --- a/test/symbolic/klee/viml_expressions_lexer.c +++ b/test/symbolic/klee/viml_expressions_lexer.c @@ -17,7 +17,7 @@ #include "nvim/charset.c" #include "nvim/garray.c" #include "nvim/gettext.c" -#include "nvim/keymap.c" +#include "nvim/keycodes.c" #include "nvim/viml/parser/expressions.c" #define INPUT_SIZE 7 diff --git a/test/symbolic/klee/viml_expressions_parser.c b/test/symbolic/klee/viml_expressions_parser.c index 9a876ed3fa..b0e1d71127 100644 --- a/test/symbolic/klee/viml_expressions_parser.c +++ b/test/symbolic/klee/viml_expressions_parser.c @@ -17,7 +17,7 @@ #include "nvim/garray.c" #include "nvim/gettext.c" #include "nvim/viml/parser/expressions.c" -#include "nvim/keymap.c" +#include "nvim/keycodes.c" #define INPUT_SIZE 50 diff --git a/test/unit/fixtures/rbuffer.c b/test/unit/fixtures/rbuffer.c index 3f4062fa18..efa7ab1986 100644 --- a/test/unit/fixtures/rbuffer.c +++ b/test/unit/fixtures/rbuffer.c @@ -15,7 +15,7 @@ void ut_rbuffer_each_read_chunk(RBuffer *buf, each_ptr_cb cb) void ut_rbuffer_each_write_chunk(RBuffer *buf, each_ptr_cb cb) { - RBUFFER_UNTIL_FULL(buf, wptr, wcnt) { + RBUFFER_UNTIL_FULL(buf, wptr, wcnt) { // -V1044 cb(wptr, wcnt); rbuffer_produced(buf, wcnt); } diff --git a/test/unit/keymap_spec.lua b/test/unit/keycodes_spec.lua index 1f1f32bb9e..5bf27c9232 100644 --- a/test/unit/keymap_spec.lua +++ b/test/unit/keycodes_spec.lua @@ -5,10 +5,10 @@ local ffi = helpers.ffi local eq = helpers.eq local neq = helpers.neq -local keymap = helpers.cimport('./src/nvim/keymap.h') +local keymap = helpers.cimport('./src/nvim/keycodes.h') local NULL = helpers.NULL -describe('keymap.c', function() +describe('keycodes.c', function() describe('find_special_key()', function() local srcp = ffi.new('const unsigned char *[1]') diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index d494a96907..0464f90734 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -39,7 +39,6 @@ set(DEPS_DOWNLOAD_DIR "${DEPS_BUILD_DIR}/downloads" CACHE PATH "Dependencies dow option(USE_BUNDLED "Use bundled dependencies." ON) -option(USE_BUNDLED_GPERF "Use the bundled version of gperf." ${USE_BUNDLED}) option(USE_BUNDLED_UNIBILIUM "Use the bundled unibilium." ${USE_BUNDLED}) option(USE_BUNDLED_LIBTERMKEY "Use the bundled libtermkey." ${USE_BUNDLED}) option(USE_BUNDLED_LIBVTERM "Use the bundled libvterm." ${USE_BUNDLED}) @@ -94,25 +93,12 @@ if(CMAKE_GENERATOR MATCHES "Makefiles") set(MAKE_PRG "$(MAKE)") endif() -if(MINGW AND CMAKE_GENERATOR MATCHES "Ninja") - find_program(MAKE_PRG NAMES mingw32-make) - if(NOT MAKE_PRG) - message(FATAL_ERROR "GNU Make for mingw32 is required to build the dependencies.") - else() - message(STATUS "Found GNU Make for mingw32: ${MAKE_PRG}") - endif() -endif() - if(CMAKE_C_COMPILER_ARG1) set(DEPS_C_COMPILER "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}") else() set(DEPS_C_COMPILER "${CMAKE_C_COMPILER}") endif() -if(USE_BUNDLED_GPERF) - enable_language(CXX) -endif() - if(CMAKE_CXX_COMPILER) set(DEPS_CXX_COMPILER "${CMAKE_CXX_COMPILER}") endif() @@ -144,8 +130,8 @@ endif() include(ExternalProject) -set(LIBUV_URL https://github.com/libuv/libuv/archive/v1.44.1.tar.gz) -set(LIBUV_SHA256 e91614e6dc2dd0bfdd140ceace49438882206b7a6fb00b8750914e67a9ed6d6b) +set(LIBUV_URL https://github.com/libuv/libuv/archive/730e07e2f77a4001bdf6894112271c926399f5a8.tar.gz) +set(LIBUV_SHA256 271869759a7dbdaf1d1bf75f1ec388a7307592153b34ebb52d3934715cbaac8a) set(MSGPACK_URL https://github.com/msgpack/msgpack-c/releases/download/c-4.0.0/msgpack-c-4.0.0.tar.gz) set(MSGPACK_SHA256 420fe35e7572f2a168d17e660ef981a589c9cbe77faa25eb34a520e1fcc032c8) @@ -170,15 +156,12 @@ set(LIBVTERM_URL https://www.leonerd.org.uk/code/libvterm/libvterm-0.1.4.tar.gz) set(LIBVTERM_SHA256 bc70349e95559c667672fc8c55b9527d9db9ada0fb80a3beda533418d782d3dd) set(LUV_VERSION 1.43.0-0) -set(LUV_URL https://github.com/luvit/luv/archive/${LUV_VERSION}.tar.gz) -set(LUV_SHA256 a36865f34db029e2caa01245a41341a067038c09e94459b50db1346d9fdf82f0) +set(LUV_URL https://github.com/luvit/luv/archive/c51e7052ec4f0a25058f70c1b4ee99dd36180e59.tar.gz) +set(LUV_SHA256 cabb7e650f35992686eb95ae167c71614e281cd2979fc804e4e70f8051555728) set(LUA_COMPAT53_URL https://github.com/keplerproject/lua-compat-5.3/archive/v0.9.tar.gz) set(LUA_COMPAT53_SHA256 ad05540d2d96a48725bb79a1def35cf6652a4e2ec26376e2617c8ce2baa6f416) -set(GPERF_URL https://github.com/neovim/deps/raw/ff5b4b18a87397a8564016071ae64f64bcd8c635/opt/gperf-3.1.tar.gz) -set(GPERF_SHA256 588546b945bba4b70b6a3a616e80b4ab466e3f33024a352fc2198112cdbb3ae2) - # cat.exe curl.exe curl-ca-bundle.crt diff.exe tee.exe xxd.exe set(WINTOOLS_URL https://github.com/neovim/deps/raw/d66e306abf5b846484b4f2adffd896bce7e065d2/opt/win32tools.zip) set(WINTOOLS_SHA256 2fb2f8d69070b3f16e029913fb95008e6be33893d77fc358012396c275a0fdb7) @@ -242,10 +225,6 @@ if(USE_BUNDLED_LUV) include(BuildLuv) endif() -if(USE_BUNDLED_GPERF) - include(BuildGperf) -endif() - if(USE_BUNDLED_GETTEXT) include(BuildGettext) endif() diff --git a/third-party/cmake/BuildGperf.cmake b/third-party/cmake/BuildGperf.cmake deleted file mode 100644 index 5401191150..0000000000 --- a/third-party/cmake/BuildGperf.cmake +++ /dev/null @@ -1,68 +0,0 @@ -# Gperf recipe. Gperf is only required when building Neovim, when -# cross compiling we still want to build for the HOST system, whenever -# writing a recipe that is meant for cross-compile, use the HOSTDEPS_* variables -# instead of DEPS_* - check the main CMakeLists.txt for a list. - -# BuildGperf(CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...) -# Reusable function to build Gperf, wraps ExternalProject_Add. -# Failing to pass a command argument will result in no command being run -function(BuildGperf) - cmake_parse_arguments(_gperf - "" - "" - "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND" - ${ARGN}) - - if(NOT _gperf_CONFIGURE_COMMAND AND NOT _gperf_BUILD_COMMAND - AND NOT _gperf_INSTALL_COMMAND) - message(FATAL_ERROR "Must pass at least one of CONFIGURE_COMMAND, BUILD_COMMAND, INSTALL_COMMAND") - endif() - - ExternalProject_Add(gperf - PREFIX ${DEPS_BUILD_DIR} - URL ${GPERF_URL} - DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/gperf - DOWNLOAD_COMMAND ${CMAKE_COMMAND} - -DPREFIX=${DEPS_BUILD_DIR} - -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/gperf - -DURL=${GPERF_URL} - -DEXPECTED_SHA256=${GPERF_SHA256} - -DTARGET=gperf - -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR} - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake - BUILD_IN_SOURCE 1 - CONFIGURE_COMMAND "${_gperf_CONFIGURE_COMMAND}" - BUILD_COMMAND "${_gperf_BUILD_COMMAND}" - INSTALL_COMMAND "${_gperf_INSTALL_COMMAND}") -endfunction() - -set(GPERF_BUILDARGS CC=${HOSTDEPS_C_COMPILER} CXX=${HOSTDEPS_CXX_COMPILER} - LD=${HOSTDEPS_C_COMPILER}) - -if(UNIX OR (MINGW AND CMAKE_CROSSCOMPILING)) - - BuildGperf( - CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/src/gperf/configure - --prefix=${HOSTDEPS_INSTALL_DIR} - MAKE=${MAKE_PRG} ${GPERF_BUILDARGS} - INSTALL_COMMAND ${MAKE_PRG} install) - -elseif(MSVC OR MINGW) - - BuildGperf( - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/GperfCMakeLists.txt - ${DEPS_BUILD_DIR}/src/gperf/CMakeLists.txt - COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/gperf/CMakeLists.txt - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_GENERATOR=${CMAKE_GENERATOR} - -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM} - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR} - BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE} - INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE}) - -else() - message(FATAL_ERROR "Trying to build gperf in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}") -endif() diff --git a/third-party/cmake/BuildLibuv.cmake b/third-party/cmake/BuildLibuv.cmake index 42650308a8..9d0707201f 100644 --- a/third-party/cmake/BuildLibuv.cmake +++ b/third-party/cmake/BuildLibuv.cmake @@ -45,24 +45,11 @@ if(UNIX) CONFIGURE_COMMAND ${UNIX_CFGCMD} MAKE=${MAKE_PRG} INSTALL_COMMAND ${MAKE_PRG} V=1 install) -elseif(MINGW AND CMAKE_CROSSCOMPILING) - # Build libuv for the host - BuildLibuv(TARGET libuv_host - CONFIGURE_COMMAND sh ${DEPS_BUILD_DIR}/src/libuv_host/autogen.sh && ${DEPS_BUILD_DIR}/src/libuv_host/configure --with-pic --disable-shared --prefix=${HOSTDEPS_INSTALL_DIR} CC=${HOST_C_COMPILER} - INSTALL_COMMAND ${MAKE_PRG} V=1 install) - - # Build libuv for the target - BuildLibuv( - CONFIGURE_COMMAND ${UNIX_CFGCMD} --host=${CROSS_TARGET} - INSTALL_COMMAND ${MAKE_PRG} V=1 install) - elseif(WIN32) set(UV_OUTPUT_DIR ${DEPS_BUILD_DIR}/src/libuv/${CMAKE_BUILD_TYPE}) if(MSVC) set(BUILD_SHARED ON) - elseif(MINGW) - set(BUILD_SHARED OFF) else() message(FATAL_ERROR "Trying to build libuv in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}") endif() diff --git a/third-party/cmake/BuildLua.cmake b/third-party/cmake/BuildLua.cmake index a40cb7dcb2..02f762234b 100644 --- a/third-party/cmake/BuildLua.cmake +++ b/third-party/cmake/BuildLua.cmake @@ -39,8 +39,6 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") set(LUA_TARGET freebsd) elseif(CMAKE_SYSTEM_NAME MATCHES "BSD") set(CMAKE_LUA_TARGET bsd) -elseif(CMAKE_SYSTEM_NAME MATCHES "^MINGW") - set(CMAKE_LUA_TARGET mingw) else() if(UNIX) set(LUA_TARGET posix) diff --git a/third-party/cmake/BuildLuajit.cmake b/third-party/cmake/BuildLuajit.cmake index e02d7fe609..9c0a6cfba2 100644 --- a/third-party/cmake/BuildLuajit.cmake +++ b/third-party/cmake/BuildLuajit.cmake @@ -76,57 +76,6 @@ if(UNIX) CC=${DEPS_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR} ${DEPLOYMENT_TARGET}) -elseif(MINGW AND CMAKE_CROSSCOMPILING) - - # Build luajit for the host - BuildLuaJit(TARGET luajit_host - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND ${INSTALLCMD_UNIX} - CC=${HOST_C_COMPILER} PREFIX=${HOSTDEPS_INSTALL_DIR}) - - # Build luajit for the target - BuildLuaJit( - # Similar to Unix + cross - fPIC - INSTALL_COMMAND - ${MAKE_PRG} PREFIX=${DEPS_INSTALL_DIR} - BUILDMODE=static install - TARGET_SYS=${CMAKE_SYSTEM_NAME} - CROSS=${CROSS_TARGET}- - HOST_CC=${HOST_C_COMPILER} HOST_CFLAGS=${HOST_C_FLAGS} - HOST_LDFLAGS=${HOST_EXE_LINKER_FLAGS} - FILE_T=luajit.exe - Q= - INSTALL_TSYMNAME=luajit.exe) - -elseif(MINGW) - - if(CMAKE_GENERATOR MATCHES "Ninja") - set(LUAJIT_MAKE_PRG ${MAKE_PRG}) - else() - set(LUAJIT_MAKE_PRG ${CMAKE_MAKE_PROGRAM}) - endif() - BuildLuaJit(BUILD_COMMAND ${LUAJIT_MAKE_PRG} CC=${DEPS_C_COMPILER} - PREFIX=${DEPS_INSTALL_DIR} - CFLAGS+=-DLUA_USE_APICHECK - CFLAGS+=-funwind-tables - CCDEBUG+=-g - BUILDMODE=static - # Build a DLL too - COMMAND ${LUAJIT_MAKE_PRG} CC=${DEPS_C_COMPILER} BUILDMODE=dynamic - - INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin - COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/luajit.exe ${DEPS_INSTALL_DIR}/bin - COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.dll ${DEPS_INSTALL_DIR}/bin - COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib - # Luarocks searches for lua51.dll in lib - COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.dll ${DEPS_INSTALL_DIR}/lib - COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/libluajit.a ${DEPS_INSTALL_DIR}/lib - COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/include/luajit-2.1 - COMMAND ${CMAKE_COMMAND} -DFROM_GLOB=${DEPS_BUILD_DIR}/src/luajit/src/*.h -DTO=${DEPS_INSTALL_DIR}/include/luajit-2.1 -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyFilesGlob.cmake - COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin/lua/jit - COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPS_BUILD_DIR}/src/luajit/src/jit ${DEPS_INSTALL_DIR}/bin/lua/jit - ) elseif(MSVC) BuildLuaJit( diff --git a/third-party/cmake/BuildLuarocks.cmake b/third-party/cmake/BuildLuarocks.cmake index 244d1d9fb8..98783d533e 100644 --- a/third-party/cmake/BuildLuarocks.cmake +++ b/third-party/cmake/BuildLuarocks.cmake @@ -56,7 +56,7 @@ endif() # Defaults to 5.1 for bundled LuaJIT/Lua. set(LUA_VERSION "5.1") -if(UNIX OR (MINGW AND CMAKE_CROSSCOMPILING)) +if(UNIX) if(USE_BUNDLED_LUAJIT) list(APPEND LUAROCKS_OPTS @@ -94,13 +94,9 @@ if(UNIX OR (MINGW AND CMAKE_CROSSCOMPILING)) CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/src/luarocks/configure --prefix=${HOSTDEPS_INSTALL_DIR} --force-config ${LUAROCKS_OPTS} INSTALL_COMMAND ${MAKE_PRG} -j1 bootstrap) -elseif(MSVC OR MINGW) +elseif(MSVC) - if(MINGW) - set(COMPILER_FLAG /MW) - elseif(MSVC) - set(COMPILER_FLAG /MSVC) - endif() + set(COMPILER_FLAG /MSVC) # Ignore USE_BUNDLED_LUAJIT - always ON for native Win32 BuildLuarocks(INSTALL_COMMAND install.bat /FORCECONFIG /NOREG /NOADMIN /Q /F @@ -123,9 +119,6 @@ list(APPEND THIRD_PARTY_DEPS luarocks) if(USE_BUNDLED_LUAJIT) add_dependencies(luarocks luajit) - if(MINGW AND CMAKE_CROSSCOMPILING) - add_dependencies(luarocks luajit_host) - endif() elseif(USE_BUNDLED_LUA) add_dependencies(luarocks lua) endif() @@ -196,9 +189,6 @@ if(USE_BUNDLED_BUSTED) set(LUV_DEPS luacheck) if(USE_BUNDLED_LUV) list(APPEND LUV_DEPS luv-static lua-compat-5.3) - if(MINGW AND CMAKE_CROSSCOMPILING) - list(APPEND LUV_DEPS libuv_host) - endif() set(LUV_ARGS "CFLAGS=-O0 -g3 -fPIC") if(USE_BUNDLED_LIBUV) list(APPEND LUV_ARGS LIBUV_DIR=${HOSTDEPS_INSTALL_DIR}) diff --git a/third-party/cmake/BuildLuv.cmake b/third-party/cmake/BuildLuv.cmake index 99822249c2..001f5a325a 100644 --- a/third-party/cmake/BuildLuv.cmake +++ b/third-party/cmake/BuildLuv.cmake @@ -91,16 +91,7 @@ if(USE_BUNDLED_LIBUV) -DCMAKE_PREFIX_PATH=${DEPS_INSTALL_DIR}) endif() -if(MINGW AND CMAKE_CROSSCOMPILING) - get_filename_component(TOOLCHAIN ${CMAKE_TOOLCHAIN_FILE} REALPATH) - set(LUV_CONFIGURE_COMMAND - ${LUV_CONFIGURE_COMMAND_COMMON} - # Pass toolchain - -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN} - "-DCMAKE_C_FLAGS:STRING=${LUV_INCLUDE_FLAGS} -D_WIN32_WINNT=0x0600" - # Hack to avoid -rdynamic in Mingw - -DCMAKE_SHARED_LIBRARY_LINK_C_FLAGS="") -elseif(MSVC) +if(MSVC) set(LUV_CONFIGURE_COMMAND ${LUV_CONFIGURE_COMMAND_COMMON} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} diff --git a/third-party/cmake/BuildMsgpack.cmake b/third-party/cmake/BuildMsgpack.cmake index f66a3bdd32..a89c1e34d0 100644 --- a/third-party/cmake/BuildMsgpack.cmake +++ b/third-party/cmake/BuildMsgpack.cmake @@ -42,18 +42,7 @@ set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack set(MSGPACK_BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}) set(MSGPACK_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE}) -if(MINGW AND CMAKE_CROSSCOMPILING) - get_filename_component(TOOLCHAIN ${CMAKE_TOOLCHAIN_FILE} REALPATH) - set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack - -DMSGPACK_BUILD_TESTS=OFF - -DMSGPACK_BUILD_EXAMPLES=OFF - -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR} - # Pass toolchain - -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN} - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - # Hack to avoid -rdynamic in Mingw - -DCMAKE_SHARED_LIBRARY_LINK_C_FLAGS="") -elseif(MSVC) +if(MSVC) # Same as Unix without fPIC set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack -DMSGPACK_BUILD_TESTS=OFF diff --git a/third-party/cmake/GperfCMakeLists.txt b/third-party/cmake/GperfCMakeLists.txt deleted file mode 100644 index 15ae305ba8..0000000000 --- a/third-party/cmake/GperfCMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12) -project(gperf LANGUAGES C CXX) - -add_executable(gperf - lib/getline.cc - lib/hash.cc - lib/getopt.c - lib/getopt1.c - src/version.cc - src/positions.cc - src/options.cc - src/keyword.cc - src/keyword-list.cc - src/input.cc - src/bool-array.cc - src/hash-table.cc - src/search.cc - src/output.cc - src/main.cc) - -include_directories(lib) - -# Copy the config.h template without modifying it -# because none of the definitions are necessary -execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/src/config.h.in ${CMAKE_BINARY_DIR}/config/config.h) -include_directories(${CMAKE_BINARY_DIR}/config) - -include(GNUInstallDirs) -install(TARGETS gperf - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) |