aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ci.yml6
-rw-r--r--.github/workflows/nightly.yml128
-rw-r--r--.github/workflows/release.yml169
-rw-r--r--runtime/autoload/man.vim6
-rw-r--r--runtime/plugin/man.vim4
-rw-r--r--src/nvim/api/buffer.c230
-rw-r--r--src/nvim/api/deprecated.c367
-rw-r--r--src/nvim/api/deprecated.h11
-rw-r--r--src/nvim/api/private/dispatch.c1
-rw-r--r--src/nvim/api/tabpage.c42
-rw-r--r--src/nvim/api/vim.c37
-rw-r--r--src/nvim/api/window.c42
-rw-r--r--src/nvim/message.c2
-rw-r--r--src/nvim/window.c31
-rw-r--r--test/functional/ui/multigrid_spec.lua71
15 files changed, 648 insertions, 499 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 70cdc3b4a2..dcc3c2c45f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,5 +1,9 @@
name: CI
-on: [push, pull_request]
+on:
+ push:
+ branches: '**'
+ pull_request:
+ branches: 'master'
jobs:
build:
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
deleted file mode 100644
index d4187d9dad..0000000000
--- a/.github/workflows/nightly.yml
+++ /dev/null
@@ -1,128 +0,0 @@
-name: Nightly release
-on:
- schedule:
- - cron: '5 5 * * *'
-
-jobs:
- linux:
- runs-on: ubuntu-20.04
- outputs:
- version: ${{ steps.build.outputs.version }}
- release: ${{ steps.build.outputs.release }}
- steps:
- - uses: actions/checkout@v2
- - name: Install dependencies
- 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
- - name: Build nightly
- id: build
- run: |
- make CMAKE_BUILD_TYPE=RelWithDebinfo CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH="
- printf '::set-output name=version::%s\n' "$(./build/bin/nvim --version | head -n 3 | sed -z 's/\n/%0A/g')"
- printf '::set-output name=release::%s\n' "$(./build/bin/nvim --version | head -n 1 | sed 's/-.*//')"
- make DESTDIR="$GITHUB_WORKSPACE/build/nightly/nvim-linux64" install
- cd "$GITHUB_WORKSPACE/build/nightly"
- tar cfz nvim-linux64.tar.gz nvim-linux64
- - uses: actions/upload-artifact@v2
- with:
- name: nvim-linux64.tar.gz
- path: build/nightly/nvim-linux64.tar.gz
- retention-days: 1
-
- macOS:
- runs-on: macos-10.15
- steps:
- - uses: actions/checkout@v2
- - name: Install brew packages
- run: |
- brew update >/dev/null
- brew install automake ninja
- - name: Build nightly
- run: |
- make CMAKE_BUILD_TYPE=Release CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11"
- make DESTDIR="$GITHUB_WORKSPACE/build/nightly/nvim-osx64" install
- - name: Create package
- run: |
- cd "$GITHUB_WORKSPACE/build/nightly"
- mkdir -p bundle/nvim/libs
- mkdir -p bundle/nvim/bin
- cp nvim-osx64/bin/nvim bundle/nvim/bin/
- libs=($(otool -L nvim-osx64/bin/nvim | sed 1d | sed -E -e 's|^[[:space:]]*||' -e 's| .*||'))
- echo "libs:"
- for lib in "${libs[@]}"; do
- if echo "$lib" | grep -q -E 'libSystem|CoreFoundation' 2>/dev/null; then
- echo " [skipped] $lib"
- else
- echo " $lib"
- relname="libs/${lib##*/}"
- cp -L "$lib" "bundle/nvim/$relname"
- install_name_tool -change "$lib" "@executable_path/../$relname" bundle/nvim/bin/nvim
- fi
- done
- tar cjSf nvim-macos.tar.bz2 -C bundle nvim
- - uses: actions/upload-artifact@v2
- with:
- name: nvim-macos.tar.bz2
- path: build/nightly/nvim-macos.tar.bz2
- retention-days: 1
-
- publish:
- needs: [linux, macOS]
- runs-on: ubuntu-20.04
- steps:
- - uses: actions/download-artifact@v2
- - uses: actions/create-release@v1
- id: create_release
- with:
- tag_name: nightly
- release_name: NVIM ${{ needs.linux.outputs.release }}
- body: |
- Nvim development (prerelease) build.
- ```
- ${{ needs.linux.outputs.version }}
- ```
-
- ## Install
-
- ### Windows
-
- 1. Extract **nvim-win64.zip** (or **nvim-win32.zip**)
- 2. Run `nvim-qt.exe`
-
- ### macOS
-
- 1. Download **nvim-macos.tar.gz**
- 2. Extract: `tar xzvf nvim-macos.tar.gz`
- 3. Run `./nvim-osx64/bin/nvim`
-
- ### Linux (x64)
-
- 1. Download **nvim.appimage**
- 2. Run `chmod u+x nvim.appimage && ./nvim.appimage`
- - If your system does not have FUSE you can [extract the appimage](https://github.com/AppImage/AppImageKit/wiki/FUSE#type-2-appimage):
- ```
- ./nvim.appimage --appimage-extract
- ./squashfs-root/usr/bin/nvim
- ```
-
- ### Other
-
- - Install by [package manager](https://github.com/neovim/neovim/wiki/Installing-Neovim)
- prerelease: true
- - uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./nvim-macos.tar.bz2
- asset_name: nvim-macos.tar.bz2
- asset_content_type: application/x-bzip2
- - uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./nvim-linux64.tar.gz
- asset_name: nvim-linux64.tar.gz
- asset_content_type: application/gzip
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000000..610d62211a
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,169 @@
+name: Release
+on:
+ schedule:
+ - cron: '5 5 * * *'
+ workflow_dispatch:
+ inputs:
+ tag_name:
+ description: 'Tag name for release'
+ required: false
+ default: nightly
+ push:
+ tags:
+ - v[0-9]+.[0-9]+.[0-9]+
+
+jobs:
+ linux:
+ runs-on: ubuntu-20.04
+ outputs:
+ version: ${{ steps.build.outputs.version }}
+ release: ${{ steps.build.outputs.release }}
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y autoconf automake build-essential cmake gcc-multilib gettext gperf libtool-bin locales ninja-build pkg-config unzip
+ - name: Build release
+ id: build
+ run: |
+ make CMAKE_BUILD_TYPE=RelWithDebinfo CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH="
+ printf '::set-output name=version::%s\n' "$(./build/bin/nvim --version | head -n 3 | sed -z 's/\n/%0A/g')"
+ printf '::set-output name=release::%s\n' "$(./build/bin/nvim --version | head -n 1)"
+ make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-linux64" install
+ cd "$GITHUB_WORKSPACE/build/release"
+ tar cfz nvim-linux64.tar.gz nvim-linux64
+ - uses: actions/upload-artifact@v2
+ with:
+ name: nvim-linux64
+ path: build/release/nvim-linux64.tar.gz
+ retention-days: 1
+
+ appimage:
+ # Build on the oldest supported image, so we have broader compatibility
+ runs-on: ubuntu-16.04
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y autoconf automake build-essential cmake gcc-multilib gettext gperf 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: make appimage-latest
+ - if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
+ run: make appimage-nightly
+ - uses: actions/upload-artifact@v2
+ with:
+ name: appimage
+ path: build/bin/nvim.appimage
+ retention-days: 1
+ - uses: actions/upload-artifact@v2
+ with:
+ name: appimage
+ path: build/bin/nvim.appimage.zsync
+ retention-days: 1
+
+ macOS:
+ runs-on: macos-10.15
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install brew packages
+ run: |
+ brew update >/dev/null
+ brew install automake ninja
+ - name: Build release
+ run: |
+ make CMAKE_BUILD_TYPE=Release CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11"
+ make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-osx64" install
+ - name: Create package
+ run: |
+ cd "$GITHUB_WORKSPACE/build/release"
+ mkdir -p nvim-osx64/libs
+ libs=($(otool -L nvim-osx64/bin/nvim | sed 1d | sed -E -e 's|^[[:space:]]*||' -e 's| .*||'))
+ echo "libs:"
+ for lib in "${libs[@]}"; do
+ if echo "$lib" | grep -q -E 'libSystem|CoreFoundation' 2>/dev/null; then
+ echo " [skipped] $lib"
+ else
+ echo " $lib"
+ relname="libs/${lib##*/}"
+ cp -L "$lib" "nvim-osx64/$relname"
+ install_name_tool -change "$lib" "@executable_path/../$relname" nvim-osx64/bin/nvim
+ fi
+ done
+ tar cfz nvim-macos.tar.gz nvim-osx64
+ - uses: actions/upload-artifact@v2
+ with:
+ name: nvim-macos
+ path: build/release/nvim-macos.tar.gz
+ retention-days: 1
+
+ publish:
+ needs: [linux, appimage, macOS]
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/download-artifact@v2
+ - if: github.event_name == 'workflow_dispatch'
+ run: echo "TAG_NAME=${{ github.event.inputs.tag_name }}" >> $GITHUB_ENV
+ - if: github.event_name == 'schedule'
+ run: echo 'TAG_NAME=nightly' >> $GITHUB_ENV
+ - if: github.event_name == 'push'
+ run: |
+ TAG_NAME=${{ github.ref }}
+ echo "TAG_NAME=${TAG_NAME#refs/tags/}" >> $GITHUB_ENV
+ - if: env.TAG_NAME == 'nightly'
+ run: echo 'SUBJECT=Nvim development (prerelease) build' >> $GITHUB_ENV
+ - if: env.TAG_NAME != 'nightly'
+ run: echo 'SUBJECT=Nvim release build' >> $GITHUB_ENV
+ - if: env.TAG_NAME == 'nightly'
+ uses: dev-drprasad/delete-tag-and-release@v0.1.2
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ delete_release: false
+ tag_name: nightly
+ - uses: meeDamian/github-release@2.0
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ tag: ${{ env.TAG_NAME }}
+ name: ${{ needs.linux.outputs.release }}
+ prerelease: ${{ env.TAG_NAME == 'nightly' }}
+ commitish: ${{ github.sha }}
+ gzip: false
+ allow_override: ${{ env.TAG_NAME == 'nightly' }}
+ files: |
+ nvim-macos.tar.gz:./nvim-macos/nvim-macos.tar.gz
+ nvim-linux64.tar.gz:./nvim-linux64/nvim-linux64.tar.gz
+ nvim.appimage:./appimage/nvim.appimage
+ nvim.appimage.zsync:./appimage/nvim.appimage.zsync
+ body: |
+ ${{ env.SUBJECT }}
+ ```
+ ${{ needs.linux.outputs.version }}```
+
+ ## Install
+
+ ### Windows
+
+ 1. Extract **nvim-win64.zip** (or **nvim-win32.zip**)
+ 2. Run `nvim-qt.exe`
+
+ ### macOS
+
+ 1. Download **nvim-macos.tar.gz**
+ 2. Extract: `tar xzvf nvim-macos.tar.gz`
+ 3. Run `./nvim-osx64/bin/nvim`
+
+ ### Linux (x64)
+
+ 1. Download **nvim.appimage**
+ 2. Run `chmod u+x nvim.appimage && ./nvim.appimage`
+ - If your system does not have FUSE you can [extract the appimage](https://github.com/AppImage/AppImageKit/wiki/FUSE#type-2-appimage):
+ ```
+ ./nvim.appimage --appimage-extract
+ ./squashfs-root/usr/bin/nvim
+ ```
+
+ ### Other
+
+ - Install by [package manager](https://github.com/neovim/neovim/wiki/Installing-Neovim)
diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim
index 486ed99e3f..99d8c41dba 100644
--- a/runtime/autoload/man.vim
+++ b/runtime/autoload/man.vim
@@ -18,7 +18,7 @@ function! man#init() abort
endtry
endfunction
-function! man#open_page(count, count1, mods, ...) abort
+function! man#open_page(count, mods, ...) abort
if a:0 > 2
call s:error('too many arguments')
return
@@ -39,9 +39,7 @@ function! man#open_page(count, count1, mods, ...) abort
endif
try
let [sect, name] = s:extract_sect_and_name_ref(ref)
- if a:count ==# a:count1
- " v:count defaults to 0 which is a valid section, and v:count1 defaults to
- " 1, also a valid section. If they are equal, count explicitly set.
+ if a:count >= 0
let sect = string(a:count)
endif
let path = s:verify_exists(sect, name)
diff --git a/runtime/plugin/man.vim b/runtime/plugin/man.vim
index e762eb3664..689aa32ef3 100644
--- a/runtime/plugin/man.vim
+++ b/runtime/plugin/man.vim
@@ -5,9 +5,9 @@ if exists('g:loaded_man')
endif
let g:loaded_man = 1
-command! -bang -bar -range=0 -complete=customlist,man#complete -nargs=* Man
+command! -bang -bar -range=-1 -complete=customlist,man#complete -nargs=* Man
\ if <bang>0 | set ft=man |
- \ else | call man#open_page(v:count, v:count1, <q-mods>, <f-args>) | endif
+ \ else | call man#open_page(<count>, <q-mods>, <f-args>) | endif
augroup man
autocmd!
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c
index 1011f050fd..db37e2100d 100644
--- a/src/nvim/api/buffer.c
+++ b/src/nvim/api/buffer.c
@@ -1,7 +1,7 @@
// 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
-// Much of this code was adapted from 'if_py_both.h' from the original
+// Some of this code was adapted from 'if_py_both.h' from the original
// vim source
#include <stdbool.h>
#include <stdint.h>
@@ -80,34 +80,6 @@ Integer nvim_buf_line_count(Buffer buffer, Error *err)
return buf->b_ml.ml_line_count;
}
-/// Gets a buffer line
-///
-/// @deprecated use nvim_buf_get_lines instead.
-/// for positive indices (including 0) use
-/// "nvim_buf_get_lines(buffer, index, index+1, true)"
-/// for negative indices use
-/// "nvim_buf_get_lines(buffer, index-1, index, true)"
-///
-/// @param buffer Buffer handle
-/// @param index Line index
-/// @param[out] err Error details, if any
-/// @return Line string
-String buffer_get_line(Buffer buffer, Integer index, Error *err)
-{
- String rv = { .size = 0 };
-
- index = convert_index(index);
- Array slice = nvim_buf_get_lines(0, buffer, index, index+1, true, err);
-
- if (!ERROR_SET(err) && slice.size) {
- rv = slice.items[0].data.string;
- }
-
- xfree(slice.items);
-
- return rv;
-}
-
/// Activates buffer-update events on a channel, or as Lua callbacks.
///
/// Example (Lua): capture buffer updates in a global `events` variable
@@ -258,68 +230,6 @@ void nvim__buf_redraw_range(Buffer buffer, Integer first, Integer last,
redraw_buf_range_later(buf, (linenr_T)first+1, (linenr_T)last);
}
-/// Sets a buffer line
-///
-/// @deprecated use nvim_buf_set_lines instead.
-/// for positive indices use
-/// "nvim_buf_set_lines(buffer, index, index+1, true, [line])"
-/// for negative indices use
-/// "nvim_buf_set_lines(buffer, index-1, index, true, [line])"
-///
-/// @param buffer Buffer handle
-/// @param index Line index
-/// @param line Contents of the new line
-/// @param[out] err Error details, if any
-void buffer_set_line(Buffer buffer, Integer index, String line, Error *err)
-{
- Object l = STRING_OBJ(line);
- Array array = { .items = &l, .size = 1 };
- index = convert_index(index);
- nvim_buf_set_lines(0, buffer, index, index+1, true, array, err);
-}
-
-/// Deletes a buffer line
-///
-/// @deprecated use nvim_buf_set_lines instead.
-/// for positive indices use
-/// "nvim_buf_set_lines(buffer, index, index+1, true, [])"
-/// for negative indices use
-/// "nvim_buf_set_lines(buffer, index-1, index, true, [])"
-/// @param buffer buffer handle
-/// @param index line index
-/// @param[out] err Error details, if any
-void buffer_del_line(Buffer buffer, Integer index, Error *err)
-{
- Array array = ARRAY_DICT_INIT;
- index = convert_index(index);
- nvim_buf_set_lines(0, buffer, index, index+1, true, array, err);
-}
-
-/// Retrieves a line range from the buffer
-///
-/// @deprecated use nvim_buf_get_lines(buffer, newstart, newend, false)
-/// where newstart = start + int(not include_start) - int(start < 0)
-/// newend = end + int(include_end) - int(end < 0)
-/// int(bool) = 1 if bool is true else 0
-/// @param buffer Buffer handle
-/// @param start First line index
-/// @param end Last line index
-/// @param include_start True if the slice includes the `start` parameter
-/// @param include_end True if the slice includes the `end` parameter
-/// @param[out] err Error details, if any
-/// @return Array of lines
-ArrayOf(String) buffer_get_line_slice(Buffer buffer,
- Integer start,
- Integer end,
- Boolean include_start,
- Boolean include_end,
- Error *err)
-{
- start = convert_index(start) + !include_start;
- end = convert_index(end) + include_end;
- return nvim_buf_get_lines(0, buffer, start , end, false, err);
-}
-
/// Gets a line-range from the buffer.
///
/// Indexing is zero-based, end-exclusive. Negative indices are interpreted
@@ -392,35 +302,6 @@ end:
}
-/// Replaces a line range on the buffer
-///
-/// @deprecated use nvim_buf_set_lines(buffer, newstart, newend, false, lines)
-/// where newstart = start + int(not include_start) + int(start < 0)
-/// newend = end + int(include_end) + int(end < 0)
-/// int(bool) = 1 if bool is true else 0
-///
-/// @param buffer Buffer handle, or 0 for current buffer
-/// @param start First line index
-/// @param end Last line index
-/// @param include_start True if the slice includes the `start` parameter
-/// @param include_end True if the slice includes the `end` parameter
-/// @param replacement Array of lines to use as replacement (0-length
-// array will delete the line range)
-/// @param[out] err Error details, if any
-void buffer_set_line_slice(Buffer buffer,
- Integer start,
- Integer end,
- Boolean include_start,
- Boolean include_end,
- ArrayOf(String) replacement,
- Error *err)
-{
- start = convert_index(start) + !include_start;
- end = convert_index(end) + include_end;
- nvim_buf_set_lines(0, buffer, start, end, false, replacement, err);
-}
-
-
/// Sets (replaces) a line-range in the buffer.
///
/// Indexing is zero-based, end-exclusive. Negative indices are interpreted
@@ -787,48 +668,6 @@ void nvim_buf_del_var(Buffer buffer, String name, Error *err)
dict_set_var(buf->b_vars, name, NIL, true, false, err);
}
-/// Sets a buffer-scoped (b:) variable
-///
-/// @deprecated
-///
-/// @param buffer Buffer handle, or 0 for current buffer
-/// @param name Variable name
-/// @param value Variable value
-/// @param[out] err Error details, if any
-/// @return Old value or nil if there was no previous value.
-///
-/// @warning It may return nil if there was no previous value
-/// or if previous value was `v:null`.
-Object buffer_set_var(Buffer buffer, String name, Object value, Error *err)
-{
- buf_T *buf = find_buffer_by_handle(buffer, err);
-
- if (!buf) {
- return (Object) OBJECT_INIT;
- }
-
- return dict_set_var(buf->b_vars, name, value, false, true, err);
-}
-
-/// Removes a buffer-scoped (b:) variable
-///
-/// @deprecated
-///
-/// @param buffer Buffer handle, or 0 for current buffer
-/// @param name Variable name
-/// @param[out] err Error details, if any
-/// @return Old value
-Object buffer_del_var(Buffer buffer, String name, Error *err)
-{
- buf_T *buf = find_buffer_by_handle(buffer, err);
-
- if (!buf) {
- return (Object) OBJECT_INIT;
- }
-
- return dict_set_var(buf->b_vars, name, NIL, true, true, err);
-}
-
/// Gets a buffer option value
///
@@ -869,28 +708,6 @@ void nvim_buf_set_option(uint64_t channel_id, Buffer buffer,
set_option_to(channel_id, buf, SREQ_BUF, name, value, err);
}
-/// Gets the buffer number
-///
-/// @deprecated The buffer number now is equal to the object id,
-/// so there is no need to use this function.
-///
-/// @param buffer Buffer handle, or 0 for current buffer
-/// @param[out] err Error details, if any
-/// @return Buffer number
-Integer nvim_buf_get_number(Buffer buffer, Error *err)
- FUNC_API_SINCE(1)
- FUNC_API_DEPRECATED_SINCE(2)
-{
- Integer rv = 0;
- buf_T *buf = find_buffer_by_handle(buffer, err);
-
- if (!buf) {
- return rv;
- }
-
- return buf->b_fnum;
-}
-
/// Gets the full file name for the buffer
///
/// @param buffer Buffer handle, or 0 for current buffer
@@ -1017,25 +834,6 @@ Boolean nvim_buf_is_valid(Buffer buffer)
return ret;
}
-/// Inserts a sequence of lines to a buffer at a certain index
-///
-/// @deprecated use nvim_buf_set_lines(buffer, lnum, lnum, true, lines)
-///
-/// @param buffer Buffer handle
-/// @param lnum Insert the lines after `lnum`. If negative, appends to
-/// the end of the buffer.
-/// @param lines Array of lines
-/// @param[out] err Error details, if any
-void buffer_insert(Buffer buffer,
- Integer lnum,
- ArrayOf(String) lines,
- Error *err)
-{
- // "lnum" will be the index of the line after inserting,
- // no matter if it is negative or not
- nvim_buf_set_lines(0, buffer, lnum, lnum, true, lines, err);
-}
-
/// Return a tuple (row,col) representing the position of the named mark.
///
/// Marks are (1,0)-indexed. |api-indexing|
@@ -1667,27 +1465,6 @@ void nvim_buf_clear_namespace(Buffer buffer,
(int)line_end-1, MAXCOL);
}
-/// Clears highlights and virtual text from namespace and range of lines
-///
-/// @deprecated use |nvim_buf_clear_namespace()|.
-///
-/// @param buffer Buffer handle, or 0 for current buffer
-/// @param ns_id Namespace to clear, or -1 to clear all.
-/// @param line_start Start of range of lines to clear
-/// @param line_end End of range of lines to clear (exclusive) or -1 to clear
-/// to end of file.
-/// @param[out] err Error details, if any
-void nvim_buf_clear_highlight(Buffer buffer,
- Integer ns_id,
- Integer line_start,
- Integer line_end,
- Error *err)
- FUNC_API_SINCE(1)
-{
- nvim_buf_clear_namespace(buffer, ns_id, line_start, line_end, err);
-}
-
-
/// Set the virtual text (annotation) for a buffer line.
///
/// By default (and currently the only option) the text will be placed after
@@ -1873,8 +1650,3 @@ static int64_t normalize_index(buf_T *buf, int64_t index, bool *oob)
index++;
return index;
}
-
-static int64_t convert_index(int64_t index)
-{
- return index < 0 ? index - 1 : index;
-}
diff --git a/src/nvim/api/deprecated.c b/src/nvim/api/deprecated.c
new file mode 100644
index 0000000000..3989386bb9
--- /dev/null
+++ b/src/nvim/api/deprecated.c
@@ -0,0 +1,367 @@
+// 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
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#include "nvim/api/deprecated.h"
+#include "nvim/api/buffer.h"
+#include "nvim/api/vim.h"
+#include "nvim/api/private/helpers.h"
+#include "nvim/api/private/defs.h"
+#include "nvim/lua/executor.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "api/deprecated.c.generated.h"
+#endif
+
+/// @deprecated
+/// @see nvim_exec
+String nvim_command_output(String command, Error *err)
+ FUNC_API_SINCE(1)
+ FUNC_API_DEPRECATED_SINCE(7)
+{
+ return nvim_exec(command, true, err);
+}
+
+/// @deprecated Use nvim_exec_lua() instead.
+/// @see nvim_exec_lua
+Object nvim_execute_lua(String code, Array args, Error *err)
+ FUNC_API_SINCE(3)
+ FUNC_API_DEPRECATED_SINCE(7)
+ FUNC_API_REMOTE_ONLY
+{
+ return nlua_exec(code, args, err);
+}
+
+/// Gets the buffer number
+///
+/// @deprecated The buffer number now is equal to the object id,
+/// so there is no need to use this function.
+///
+/// @param buffer Buffer handle, or 0 for current buffer
+/// @param[out] err Error details, if any
+/// @return Buffer number
+Integer nvim_buf_get_number(Buffer buffer, Error *err)
+ FUNC_API_SINCE(1)
+ FUNC_API_DEPRECATED_SINCE(2)
+{
+ Integer rv = 0;
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+
+ if (!buf) {
+ return rv;
+ }
+
+ return buf->b_fnum;
+}
+
+/// Clears highlights and virtual text from namespace and range of lines
+///
+/// @deprecated use |nvim_buf_clear_namespace()|.
+///
+/// @param buffer Buffer handle, or 0 for current buffer
+/// @param ns_id Namespace to clear, or -1 to clear all.
+/// @param line_start Start of range of lines to clear
+/// @param line_end End of range of lines to clear (exclusive) or -1 to clear
+/// to end of file.
+/// @param[out] err Error details, if any
+void nvim_buf_clear_highlight(Buffer buffer,
+ Integer ns_id,
+ Integer line_start,
+ Integer line_end,
+ Error *err)
+ FUNC_API_SINCE(1)
+ FUNC_API_DEPRECATED_SINCE(7)
+{
+ nvim_buf_clear_namespace(buffer, ns_id, line_start, line_end, err);
+}
+
+
+/// Inserts a sequence of lines to a buffer at a certain index
+///
+/// @deprecated use nvim_buf_set_lines(buffer, lnum, lnum, true, lines)
+///
+/// @param buffer Buffer handle
+/// @param lnum Insert the lines after `lnum`. If negative, appends to
+/// the end of the buffer.
+/// @param lines Array of lines
+/// @param[out] err Error details, if any
+void buffer_insert(Buffer buffer,
+ Integer lnum,
+ ArrayOf(String) lines,
+ Error *err)
+{
+ // "lnum" will be the index of the line after inserting,
+ // no matter if it is negative or not
+ nvim_buf_set_lines(0, buffer, lnum, lnum, true, lines, err);
+}
+
+/// Gets a buffer line
+///
+/// @deprecated use nvim_buf_get_lines instead.
+/// for positive indices (including 0) use
+/// "nvim_buf_get_lines(buffer, index, index+1, true)"
+/// for negative indices use
+/// "nvim_buf_get_lines(buffer, index-1, index, true)"
+///
+/// @param buffer Buffer handle
+/// @param index Line index
+/// @param[out] err Error details, if any
+/// @return Line string
+String buffer_get_line(Buffer buffer, Integer index, Error *err)
+{
+ String rv = { .size = 0 };
+
+ index = convert_index(index);
+ Array slice = nvim_buf_get_lines(0, buffer, index, index+1, true, err);
+
+ if (!ERROR_SET(err) && slice.size) {
+ rv = slice.items[0].data.string;
+ }
+
+ xfree(slice.items);
+
+ return rv;
+}
+
+/// Sets a buffer line
+///
+/// @deprecated use nvim_buf_set_lines instead.
+/// for positive indices use
+/// "nvim_buf_set_lines(buffer, index, index+1, true, [line])"
+/// for negative indices use
+/// "nvim_buf_set_lines(buffer, index-1, index, true, [line])"
+///
+/// @param buffer Buffer handle
+/// @param index Line index
+/// @param line Contents of the new line
+/// @param[out] err Error details, if any
+void buffer_set_line(Buffer buffer, Integer index, String line, Error *err)
+{
+ Object l = STRING_OBJ(line);
+ Array array = { .items = &l, .size = 1 };
+ index = convert_index(index);
+ nvim_buf_set_lines(0, buffer, index, index+1, true, array, err);
+}
+
+/// Deletes a buffer line
+///
+/// @deprecated use nvim_buf_set_lines instead.
+/// for positive indices use
+/// "nvim_buf_set_lines(buffer, index, index+1, true, [])"
+/// for negative indices use
+/// "nvim_buf_set_lines(buffer, index-1, index, true, [])"
+/// @param buffer buffer handle
+/// @param index line index
+/// @param[out] err Error details, if any
+void buffer_del_line(Buffer buffer, Integer index, Error *err)
+{
+ Array array = ARRAY_DICT_INIT;
+ index = convert_index(index);
+ nvim_buf_set_lines(0, buffer, index, index+1, true, array, err);
+}
+
+/// Retrieves a line range from the buffer
+///
+/// @deprecated use nvim_buf_get_lines(buffer, newstart, newend, false)
+/// where newstart = start + int(not include_start) - int(start < 0)
+/// newend = end + int(include_end) - int(end < 0)
+/// int(bool) = 1 if bool is true else 0
+/// @param buffer Buffer handle
+/// @param start First line index
+/// @param end Last line index
+/// @param include_start True if the slice includes the `start` parameter
+/// @param include_end True if the slice includes the `end` parameter
+/// @param[out] err Error details, if any
+/// @return Array of lines
+ArrayOf(String) buffer_get_line_slice(Buffer buffer,
+ Integer start,
+ Integer end,
+ Boolean include_start,
+ Boolean include_end,
+ Error *err)
+{
+ start = convert_index(start) + !include_start;
+ end = convert_index(end) + include_end;
+ return nvim_buf_get_lines(0, buffer, start , end, false, err);
+}
+
+/// Replaces a line range on the buffer
+///
+/// @deprecated use nvim_buf_set_lines(buffer, newstart, newend, false, lines)
+/// where newstart = start + int(not include_start) + int(start < 0)
+/// newend = end + int(include_end) + int(end < 0)
+/// int(bool) = 1 if bool is true else 0
+///
+/// @param buffer Buffer handle, or 0 for current buffer
+/// @param start First line index
+/// @param end Last line index
+/// @param include_start True if the slice includes the `start` parameter
+/// @param include_end True if the slice includes the `end` parameter
+/// @param replacement Array of lines to use as replacement (0-length
+// array will delete the line range)
+/// @param[out] err Error details, if any
+void buffer_set_line_slice(Buffer buffer,
+ Integer start,
+ Integer end,
+ Boolean include_start,
+ Boolean include_end,
+ ArrayOf(String) replacement,
+ Error *err)
+{
+ start = convert_index(start) + !include_start;
+ end = convert_index(end) + include_end;
+ nvim_buf_set_lines(0, buffer, start, end, false, replacement, err);
+}
+
+
+/// Sets a buffer-scoped (b:) variable
+///
+/// @deprecated
+///
+/// @param buffer Buffer handle, or 0 for current buffer
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+/// @return Old value or nil if there was no previous value.
+///
+/// @warning It may return nil if there was no previous value
+/// or if previous value was `v:null`.
+Object buffer_set_var(Buffer buffer, String name, Object value, Error *err)
+{
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+
+ if (!buf) {
+ return NIL;
+ }
+
+ return dict_set_var(buf->b_vars, name, value, false, true, err);
+}
+
+/// Removes a buffer-scoped (b:) variable
+///
+/// @deprecated
+///
+/// @param buffer Buffer handle, or 0 for current buffer
+/// @param name Variable name
+/// @param[out] err Error details, if any
+/// @return Old value
+Object buffer_del_var(Buffer buffer, String name, Error *err)
+{
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+
+ if (!buf) {
+ return NIL;
+ }
+
+ return dict_set_var(buf->b_vars, name, NIL, true, true, err);
+}
+
+/// Sets a window-scoped (w:) variable
+///
+/// @deprecated
+///
+/// @param window Window handle, or 0 for current window
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+/// @return Old value or nil if there was no previous value.
+///
+/// @warning It may return nil if there was no previous value
+/// or if previous value was `v:null`.
+Object window_set_var(Window window, String name, Object value, Error *err)
+{
+ win_T *win = find_window_by_handle(window, err);
+
+ if (!win) {
+ return NIL;
+ }
+
+ return dict_set_var(win->w_vars, name, value, false, true, err);
+}
+
+/// Removes a window-scoped (w:) variable
+///
+/// @deprecated
+///
+/// @param window Window handle, or 0 for current window
+/// @param name variable name
+/// @param[out] err Error details, if any
+/// @return Old value
+Object window_del_var(Window window, String name, Error *err)
+{
+ win_T *win = find_window_by_handle(window, err);
+
+ if (!win) {
+ return NIL;
+ }
+
+ return dict_set_var(win->w_vars, name, NIL, true, true, err);
+}
+
+/// Sets a tab-scoped (t:) variable
+///
+/// @deprecated
+///
+/// @param tabpage Tabpage handle, or 0 for current tabpage
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+/// @return Old value or nil if there was no previous value.
+///
+/// @warning It may return nil if there was no previous value
+/// or if previous value was `v:null`.
+Object tabpage_set_var(Tabpage tabpage, String name, Object value, Error *err)
+{
+ tabpage_T *tab = find_tab_by_handle(tabpage, err);
+
+ if (!tab) {
+ return NIL;
+ }
+
+ return dict_set_var(tab->tp_vars, name, value, false, true, err);
+}
+
+/// Removes a tab-scoped (t:) variable
+///
+/// @deprecated
+///
+/// @param tabpage Tabpage handle, or 0 for current tabpage
+/// @param name Variable name
+/// @param[out] err Error details, if any
+/// @return Old value
+Object tabpage_del_var(Tabpage tabpage, String name, Error *err)
+{
+ tabpage_T *tab = find_tab_by_handle(tabpage, err);
+
+ if (!tab) {
+ return NIL;
+ }
+
+ return dict_set_var(tab->tp_vars, name, NIL, true, true, err);
+}
+
+/// @deprecated
+/// @see nvim_set_var
+/// @warning May return nil if there was no previous value
+/// OR if previous value was `v:null`.
+/// @return Old value or nil if there was no previous value.
+Object vim_set_var(String name, Object value, Error *err)
+{
+ return dict_set_var(&globvardict, name, value, false, true, err);
+}
+
+/// @deprecated
+/// @see nvim_del_var
+Object vim_del_var(String name, Error *err)
+{
+ return dict_set_var(&globvardict, name, NIL, true, true, err);
+}
+
+static int64_t convert_index(int64_t index)
+{
+ return index < 0 ? index - 1 : index;
+}
diff --git a/src/nvim/api/deprecated.h b/src/nvim/api/deprecated.h
new file mode 100644
index 0000000000..79095167e1
--- /dev/null
+++ b/src/nvim/api/deprecated.h
@@ -0,0 +1,11 @@
+#ifndef NVIM_API_DEPRECATED_H
+#define NVIM_API_DEPRECATED_H
+
+#include <stdint.h>
+
+#include "nvim/api/private/defs.h"
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "api/deprecated.h.generated.h"
+#endif
+#endif // NVIM_API_DEPRECATED_H
diff --git a/src/nvim/api/private/dispatch.c b/src/nvim/api/private/dispatch.c
index 2975df3c68..eae4581f42 100644
--- a/src/nvim/api/private/dispatch.c
+++ b/src/nvim/api/private/dispatch.c
@@ -19,6 +19,7 @@
#include "nvim/api/ui.h"
#include "nvim/api/vim.h"
#include "nvim/api/window.h"
+#include "nvim/api/deprecated.h"
static Map(String, MsgpackRpcRequestHandler) *methods = NULL;
diff --git a/src/nvim/api/tabpage.c b/src/nvim/api/tabpage.c
index dd17bc03e5..5f727dbc38 100644
--- a/src/nvim/api/tabpage.c
+++ b/src/nvim/api/tabpage.c
@@ -97,48 +97,6 @@ void nvim_tabpage_del_var(Tabpage tabpage, String name, Error *err)
dict_set_var(tab->tp_vars, name, NIL, true, false, err);
}
-/// Sets a tab-scoped (t:) variable
-///
-/// @deprecated
-///
-/// @param tabpage Tabpage handle, or 0 for current tabpage
-/// @param name Variable name
-/// @param value Variable value
-/// @param[out] err Error details, if any
-/// @return Old value or nil if there was no previous value.
-///
-/// @warning It may return nil if there was no previous value
-/// or if previous value was `v:null`.
-Object tabpage_set_var(Tabpage tabpage, String name, Object value, Error *err)
-{
- tabpage_T *tab = find_tab_by_handle(tabpage, err);
-
- if (!tab) {
- return (Object) OBJECT_INIT;
- }
-
- return dict_set_var(tab->tp_vars, name, value, false, true, err);
-}
-
-/// Removes a tab-scoped (t:) variable
-///
-/// @deprecated
-///
-/// @param tabpage Tabpage handle, or 0 for current tabpage
-/// @param name Variable name
-/// @param[out] err Error details, if any
-/// @return Old value
-Object tabpage_del_var(Tabpage tabpage, String name, Error *err)
-{
- tabpage_T *tab = find_tab_by_handle(tabpage, err);
-
- if (!tab) {
- return (Object) OBJECT_INIT;
- }
-
- return dict_set_var(tab->tp_vars, name, NIL, true, true, err);
-}
-
/// Gets the current window in a tabpage
///
/// @param tabpage Tabpage handle, or 0 for current tabpage
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 8ac820abd9..8b80d4aad9 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -15,6 +15,7 @@
#include "nvim/api/private/dispatch.h"
#include "nvim/api/buffer.h"
#include "nvim/api/window.h"
+#include "nvim/api/deprecated.h"
#include "nvim/msgpack_rpc/channel.h"
#include "nvim/msgpack_rpc/helpers.h"
#include "nvim/lua/executor.h"
@@ -479,15 +480,6 @@ String nvim_replace_termcodes(String str, Boolean from_part, Boolean do_lt,
return cstr_as_string(ptr);
}
-/// @deprecated
-/// @see nvim_exec
-String nvim_command_output(String command, Error *err)
- FUNC_API_SINCE(1)
- FUNC_API_DEPRECATED_SINCE(7)
-{
- return nvim_exec(command, true, err);
-}
-
/// Evaluates a VimL |expression|.
/// Dictionaries and Lists are recursively expanded.
///
@@ -534,16 +526,6 @@ Object nvim_eval(String expr, Error *err)
return rv;
}
-/// @deprecated Use nvim_exec_lua() instead.
-/// @see nvim_exec_lua
-Object nvim_execute_lua(String code, Array args, Error *err)
- FUNC_API_SINCE(3)
- FUNC_API_DEPRECATED_SINCE(7)
- FUNC_API_REMOTE_ONLY
-{
- return nlua_exec(code, args, err);
-}
-
/// Execute Lua code. Parameters (if any) are available as `...` inside the
/// chunk. The chunk can return a value.
///
@@ -920,23 +902,6 @@ void nvim_del_var(String name, Error *err)
dict_set_var(&globvardict, name, NIL, true, false, err);
}
-/// @deprecated
-/// @see nvim_set_var
-/// @warning May return nil if there was no previous value
-/// OR if previous value was `v:null`.
-/// @return Old value or nil if there was no previous value.
-Object vim_set_var(String name, Object value, Error *err)
-{
- return dict_set_var(&globvardict, name, value, false, true, err);
-}
-
-/// @deprecated
-/// @see nvim_del_var
-Object vim_del_var(String name, Error *err)
-{
- return dict_set_var(&globvardict, name, NIL, true, true, err);
-}
-
/// Gets a v: variable.
///
/// @param name Variable name
diff --git a/src/nvim/api/window.c b/src/nvim/api/window.c
index f09a03f592..a3ec1c8e53 100644
--- a/src/nvim/api/window.c
+++ b/src/nvim/api/window.c
@@ -288,48 +288,6 @@ void nvim_win_del_var(Window window, String name, Error *err)
dict_set_var(win->w_vars, name, NIL, true, false, err);
}
-/// Sets a window-scoped (w:) variable
-///
-/// @deprecated
-///
-/// @param window Window handle, or 0 for current window
-/// @param name Variable name
-/// @param value Variable value
-/// @param[out] err Error details, if any
-/// @return Old value or nil if there was no previous value.
-///
-/// @warning It may return nil if there was no previous value
-/// or if previous value was `v:null`.
-Object window_set_var(Window window, String name, Object value, Error *err)
-{
- win_T *win = find_window_by_handle(window, err);
-
- if (!win) {
- return (Object) OBJECT_INIT;
- }
-
- return dict_set_var(win->w_vars, name, value, false, true, err);
-}
-
-/// Removes a window-scoped (w:) variable
-///
-/// @deprecated
-///
-/// @param window Window handle, or 0 for current window
-/// @param name variable name
-/// @param[out] err Error details, if any
-/// @return Old value
-Object window_del_var(Window window, String name, Error *err)
-{
- win_T *win = find_window_by_handle(window, err);
-
- if (!win) {
- return (Object) OBJECT_INIT;
- }
-
- return dict_set_var(win->w_vars, name, NIL, true, true, err);
-}
-
/// Gets a window option value
///
/// @param window Window handle, or 0 for current window
diff --git a/src/nvim/message.c b/src/nvim/message.c
index ad38e6d060..02a7732f5c 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -1712,7 +1712,7 @@ void msg_prt_line(char_u *s, int list)
col += utf_ptr2cells(s);
char buf[MB_MAXBYTES + 1];
if (l >= MB_MAXBYTES) {
- xstrlcpy(buf, "¿", sizeof(buf));
+ xstrlcpy(buf, "?", sizeof(buf));
} else if (curwin->w_p_lcs_chars.nbsp != NUL && list
&& (utf_ptr2char(s) == 160
|| utf_ptr2char(s) == 0x202f)) {
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 72ee400e40..9eb16e67ec 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -3787,32 +3787,35 @@ void free_tabpage(tabpage_T *tp)
/// @return Was the new tabpage created successfully? FAIL or OK.
int win_new_tabpage(int after, char_u *filename)
{
- tabpage_T *tp = curtab;
+ tabpage_T *old_curtab = curtab;
tabpage_T *newtp;
int n;
newtp = alloc_tabpage();
- /* Remember the current windows in this Tab page. */
- if (leave_tabpage(curbuf, TRUE) == FAIL) {
+ // Remember the current windows in this Tab page.
+ if (leave_tabpage(curbuf, true) == FAIL) {
xfree(newtp);
return FAIL;
}
- newtp->tp_localdir = tp->tp_localdir ? vim_strsave(tp->tp_localdir) : NULL;
+ newtp->tp_localdir = old_curtab->tp_localdir
+ ? vim_strsave(old_curtab->tp_localdir) : NULL;
curtab = newtp;
- /* Create a new empty window. */
- if (win_alloc_firstwin(tp->tp_curwin) == OK) {
- /* Make the new Tab page the new topframe. */
+ // Create a new empty window.
+ if (win_alloc_firstwin(old_curtab->tp_curwin) == OK) {
+ // Make the new Tab page the new topframe.
if (after == 1) {
- /* New tab page becomes the first one. */
+ // New tab page becomes the first one.
newtp->tp_next = first_tabpage;
first_tabpage = newtp;
} else {
+ tabpage_T *tp = old_curtab;
+
if (after > 0) {
- /* Put new tab page before tab page "after". */
+ // Put new tab page before tab page "after".
n = 2;
for (tp = first_tabpage; tp->tp_next != NULL
&& n < after; tp = tp->tp_next)
@@ -3826,13 +3829,13 @@ int win_new_tabpage(int after, char_u *filename)
win_comp_scroll(curwin);
newtp->tp_topframe = topframe;
- last_status(FALSE);
+ last_status(false);
redraw_all_later(NOT_VALID);
- tabpage_check_windows(tp);
+ tabpage_check_windows(old_curtab);
- lastused_tabpage = tp;
+ lastused_tabpage = old_curtab;
apply_autocmds(EVENT_WINNEW, NULL, NULL, false, curbuf);
apply_autocmds(EVENT_WINENTER, NULL, NULL, false, curbuf);
@@ -3842,8 +3845,8 @@ int win_new_tabpage(int after, char_u *filename)
return OK;
}
- /* Failed, get back the previous Tab page */
- enter_tabpage(curtab, curbuf, TRUE, TRUE);
+ // Failed, get back the previous Tab page
+ enter_tabpage(curtab, curbuf, true, true);
return FAIL;
}
diff --git a/test/functional/ui/multigrid_spec.lua b/test/functional/ui/multigrid_spec.lua
index 6601c2d68e..719e2ee82a 100644
--- a/test/functional/ui/multigrid_spec.lua
+++ b/test/functional/ui/multigrid_spec.lua
@@ -1562,6 +1562,77 @@ describe('ext_multigrid', function()
{1:~ }|
]]}
+ command('tabnext')
+ command('$tabnew')
+ screen:expect{grid=[[
+ ## grid 1
+ {16: }{17:2}{16: [No Name] }{17:2}{16: [No Name] }{7: [No Name] }{12: }{16:X}|
+ [7:-----------------------------------------------------]|
+ [7:-----------------------------------------------------]|
+ [7:-----------------------------------------------------]|
+ [7:-----------------------------------------------------]|
+ [7:-----------------------------------------------------]|
+ [7:-----------------------------------------------------]|
+ [7:-----------------------------------------------------]|
+ [7:-----------------------------------------------------]|
+ [7:-----------------------------------------------------]|
+ [7:-----------------------------------------------------]|
+ [7:-----------------------------------------------------]|
+ {11:[No Name] }|
+ [3:-----------------------------------------------------]|
+ ## grid 2 (hidden)
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 3
+ |
+ ## grid 4 (hidden)
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 5 (hidden)
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 6 (hidden)
+ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ## grid 7
+ ^ |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ]]}
+
+ command('tabclose')
command('tabclose')
screen:expect{grid=[[
## grid 1