mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge #12203 from janlazo/vim-8.2.0648
vim-patch:8.1.{800,868,1581},8.2.{648,649,663,678,681,688,691,692}
This commit is contained in:
commit
f04a9a2c9a
@ -6516,9 +6516,11 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
>= 1 When the shada file is read or written.
|
>= 1 When the shada file is read or written.
|
||||||
>= 2 When a file is ":source"'ed.
|
>= 2 When a file is ":source"'ed.
|
||||||
>= 3 UI info, terminal capabilities
|
>= 3 UI info, terminal capabilities
|
||||||
|
>= 4 Shell commands.
|
||||||
>= 5 Every searched tags file and include file.
|
>= 5 Every searched tags file and include file.
|
||||||
>= 8 Files for which a group of autocommands is executed.
|
>= 8 Files for which a group of autocommands is executed.
|
||||||
>= 9 Every executed autocommand.
|
>= 9 Every executed autocommand.
|
||||||
|
>= 11 Finding items in a path
|
||||||
>= 12 Every executed function.
|
>= 12 Every executed function.
|
||||||
>= 13 When an exception is thrown, caught, finished, or discarded.
|
>= 13 When an exception is thrown, caught, finished, or discarded.
|
||||||
>= 14 Anything pending in a ":finally" clause.
|
>= 14 Anything pending in a ":finally" clause.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
" Vim support file to detect file types
|
" Vim support file to detect file types
|
||||||
"
|
"
|
||||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||||
" Last Change: 2020 Apr 12
|
" Last Change: 2020 Apr 29
|
||||||
|
|
||||||
" Listen very carefully, I will say this only once
|
" Listen very carefully, I will say this only once
|
||||||
if exists("did_load_filetypes")
|
if exists("did_load_filetypes")
|
||||||
@ -1646,7 +1646,9 @@ au BufNewFile,BufRead */etc/systemd/system/*.d/*.conf setf systemd
|
|||||||
au BufNewFile,BufRead */.config/systemd/user/*.d/*.conf setf systemd
|
au BufNewFile,BufRead */.config/systemd/user/*.d/*.conf setf systemd
|
||||||
" Systemd temp files
|
" Systemd temp files
|
||||||
au BufNewFile,BufRead */etc/systemd/system/*.d/.#* setf systemd
|
au BufNewFile,BufRead */etc/systemd/system/*.d/.#* setf systemd
|
||||||
|
au BufNewFile,BufRead */etc/systemd/system/.#* setf systemd
|
||||||
au BufNewFile,BufRead */.config/systemd/user/*.d/.#* setf systemd
|
au BufNewFile,BufRead */.config/systemd/user/*.d/.#* setf systemd
|
||||||
|
au BufNewFile,BufRead */.config/systemd/user/.#* setf systemd
|
||||||
|
|
||||||
" Synopsys Design Constraints
|
" Synopsys Design Constraints
|
||||||
au BufNewFile,BufRead *.sdc setf sdc
|
au BufNewFile,BufRead *.sdc setf sdc
|
||||||
|
@ -9129,7 +9129,8 @@ static int ins_apply_autocmds(event_T event)
|
|||||||
|
|
||||||
// If u_savesub() was called then we are not prepared to start
|
// If u_savesub() was called then we are not prepared to start
|
||||||
// a new line. Call u_save() with no contents to fix that.
|
// a new line. Call u_save() with no contents to fix that.
|
||||||
if (tick != buf_get_changedtick(curbuf)) {
|
// Except when leaving Insert mode.
|
||||||
|
if (event != EVENT_INSERTLEAVE && tick != buf_get_changedtick(curbuf)) {
|
||||||
u_save(curwin->w_cursor.lnum, (linenr_T)(curwin->w_cursor.lnum + 1));
|
u_save(curwin->w_cursor.lnum, (linenr_T)(curwin->w_cursor.lnum + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -592,6 +592,8 @@ static void cleanup_function_call(funccall_T *fc)
|
|||||||
if (!fc_referenced(fc)) {
|
if (!fc_referenced(fc)) {
|
||||||
free_funccal(fc, false);
|
free_funccal(fc, false);
|
||||||
} else {
|
} else {
|
||||||
|
static int made_copy = 0;
|
||||||
|
|
||||||
// "fc" is still in use. This can happen when returning "a:000",
|
// "fc" is still in use. This can happen when returning "a:000",
|
||||||
// assigning "l:" to a global variable or defining a closure.
|
// assigning "l:" to a global variable or defining a closure.
|
||||||
// Link "fc" in the list for garbage collection later.
|
// Link "fc" in the list for garbage collection later.
|
||||||
@ -607,6 +609,15 @@ static void cleanup_function_call(funccall_T *fc)
|
|||||||
TV_LIST_ITER(&fc->l_varlist, li, {
|
TV_LIST_ITER(&fc->l_varlist, li, {
|
||||||
tv_copy(TV_LIST_ITEM_TV(li), TV_LIST_ITEM_TV(li));
|
tv_copy(TV_LIST_ITEM_TV(li), TV_LIST_ITEM_TV(li));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (++made_copy == 10000) {
|
||||||
|
// We have made a lot of copies. This can happen when
|
||||||
|
// repetitively calling a function that creates a reference to
|
||||||
|
// itself somehow. Call the garbage collector soon to avoid using
|
||||||
|
// too much memory.
|
||||||
|
made_copy = 0;
|
||||||
|
want_garbage_collect = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2394,7 +2394,7 @@ int do_in_path(char_u *path, char_u *name, int flags,
|
|||||||
char_u *rtp_copy = vim_strsave(path);
|
char_u *rtp_copy = vim_strsave(path);
|
||||||
char_u *buf = xmallocz(MAXPATHL);
|
char_u *buf = xmallocz(MAXPATHL);
|
||||||
{
|
{
|
||||||
if (p_verbose > 1 && name != NULL) {
|
if (p_verbose > 10 && name != NULL) {
|
||||||
verbose_enter();
|
verbose_enter();
|
||||||
smsg(_("Searching for \"%s\" in \"%s\""),
|
smsg(_("Searching for \"%s\" in \"%s\""),
|
||||||
(char *)name, (char *)path);
|
(char *)name, (char *)path);
|
||||||
@ -2436,7 +2436,7 @@ int do_in_path(char_u *path, char_u *name, int flags,
|
|||||||
copy_option_part(&np, tail, (size_t)(MAXPATHL - (tail - buf)),
|
copy_option_part(&np, tail, (size_t)(MAXPATHL - (tail - buf)),
|
||||||
"\t ");
|
"\t ");
|
||||||
|
|
||||||
if (p_verbose > 2) {
|
if (p_verbose > 10) {
|
||||||
verbose_enter();
|
verbose_enter();
|
||||||
smsg(_("Searching for \"%s\""), buf);
|
smsg(_("Searching for \"%s\""), buf);
|
||||||
verbose_leave();
|
verbose_leave();
|
||||||
|
@ -2476,8 +2476,11 @@ int parse_cmd_address(exarg_T *eap, char_u **errormsg)
|
|||||||
if (*eap->cmd == ';') {
|
if (*eap->cmd == ';') {
|
||||||
if (!eap->skip) {
|
if (!eap->skip) {
|
||||||
curwin->w_cursor.lnum = eap->line2;
|
curwin->w_cursor.lnum = eap->line2;
|
||||||
// don't leave the cursor on an illegal line or column
|
// Don't leave the cursor on an illegal line or column, but do
|
||||||
check_cursor();
|
// accept zero as address, so 0;/PATTERN/ works correctly.
|
||||||
|
if (eap->line2 > 0) {
|
||||||
|
check_cursor();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (*eap->cmd != ',') {
|
} else if (*eap->cmd != ',') {
|
||||||
break;
|
break;
|
||||||
|
@ -63,9 +63,12 @@ static void pum_compute_size(void)
|
|||||||
pum_kind_width = 0;
|
pum_kind_width = 0;
|
||||||
pum_extra_width = 0;
|
pum_extra_width = 0;
|
||||||
for (int i = 0; i < pum_size; i++) {
|
for (int i = 0; i < pum_size; i++) {
|
||||||
int w = vim_strsize(pum_array[i].pum_text);
|
int w;
|
||||||
if (pum_base_width < w) {
|
if (pum_array[i].pum_text != NULL) {
|
||||||
pum_base_width = w;
|
w = vim_strsize(pum_array[i].pum_text);
|
||||||
|
if (pum_base_width < w) {
|
||||||
|
pum_base_width = w;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (pum_array[i].pum_kind != NULL) {
|
if (pum_array[i].pum_kind != NULL) {
|
||||||
w = vim_strsize(pum_array[i].pum_kind) + 1;
|
w = vim_strsize(pum_array[i].pum_kind) + 1;
|
||||||
|
@ -5714,6 +5714,7 @@ void grid_puts_line_flush(bool set_cursor)
|
|||||||
static void start_search_hl(void)
|
static void start_search_hl(void)
|
||||||
{
|
{
|
||||||
if (p_hls && !no_hlsearch) {
|
if (p_hls && !no_hlsearch) {
|
||||||
|
end_search_hl(); // just in case it wasn't called before
|
||||||
last_pat_prog(&search_hl.rm);
|
last_pat_prog(&search_hl.rm);
|
||||||
// Set the time limit to 'redrawtime'.
|
// Set the time limit to 'redrawtime'.
|
||||||
search_hl.tm = profile_setlimit(p_rdt);
|
search_hl.tm = profile_setlimit(p_rdt);
|
||||||
|
@ -98,11 +98,6 @@ func GetAllocId(name)
|
|||||||
return lnum - top - 1
|
return lnum - top - 1
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func CanRunVimInTerminal()
|
|
||||||
" Nvim: always false, we use Lua screen-tests instead.
|
|
||||||
return 0
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
func RunTheTest(test)
|
func RunTheTest(test)
|
||||||
echo 'Executing ' . a:test
|
echo 'Executing ' . a:test
|
||||||
|
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
source shared.vim
|
||||||
|
source term_util.vim
|
@ -1,10 +1,12 @@
|
|||||||
" Functions shared by several tests.
|
" Functions shared by several tests.
|
||||||
|
|
||||||
" Only load this script once.
|
" Only load this script once.
|
||||||
if exists('*WaitFor')
|
if exists('*PythonProg')
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
source view_util.vim
|
||||||
|
|
||||||
" {Nvim}
|
" {Nvim}
|
||||||
" Filepath captured from output may be truncated, like this:
|
" Filepath captured from output may be truncated, like this:
|
||||||
" /home/va...estdir/Xtest-tmpdir/nvimxbXN4i/10
|
" /home/va...estdir/Xtest-tmpdir/nvimxbXN4i/10
|
||||||
@ -328,17 +330,6 @@ func RunVimPiped(before, after, arguments, pipecmd)
|
|||||||
return 1
|
return 1
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" Get line "lnum" as displayed on the screen.
|
|
||||||
" Trailing white space is trimmed.
|
|
||||||
func! Screenline(lnum)
|
|
||||||
let chars = []
|
|
||||||
for c in range(1, winwidth(0))
|
|
||||||
call add(chars, nr2char(screenchar(a:lnum, c)))
|
|
||||||
endfor
|
|
||||||
let line = join(chars, '')
|
|
||||||
return matchstr(line, '^.\{-}\ze\s*$')
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
func CanRunGui()
|
func CanRunGui()
|
||||||
return has('gui') && ($DISPLAY != "" || has('gui_running'))
|
return has('gui') && ($DISPLAY != "" || has('gui_running'))
|
||||||
endfunc
|
endfunc
|
||||||
|
11
src/nvim/testdir/term_util.vim
Normal file
11
src/nvim/testdir/term_util.vim
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
" Functions about terminal shared by several tests
|
||||||
|
|
||||||
|
" Only load this script once.
|
||||||
|
if exists('*CanRunVimInTerminal')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
func CanRunVimInTerminal()
|
||||||
|
" Nvim: always false, we use Lua screen-tests instead.
|
||||||
|
return 0
|
||||||
|
endfunc
|
@ -1,7 +1,7 @@
|
|||||||
" Tests for setbufline(), getbufline(), appendbufline(), deletebufline()
|
" Tests for setbufline(), getbufline(), appendbufline(), deletebufline()
|
||||||
|
|
||||||
source shared.vim
|
source shared.vim
|
||||||
" source screendump.vim
|
source screendump.vim
|
||||||
|
|
||||||
func Test_setbufline_getbufline()
|
func Test_setbufline_getbufline()
|
||||||
new
|
new
|
||||||
|
@ -801,3 +801,16 @@ func Test_buffers_lastused()
|
|||||||
bwipeout bufb
|
bwipeout bufb
|
||||||
bwipeout bufc
|
bwipeout bufc
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" test that ";" works to find a match at the start of the first line
|
||||||
|
func Test_zero_line_search()
|
||||||
|
new
|
||||||
|
call setline(1, ["1, pattern", "2, ", "3, pattern"])
|
||||||
|
call cursor(1,1)
|
||||||
|
0;/pattern/d
|
||||||
|
call assert_equal(["2, ", "3, pattern"], getline(1,'$'))
|
||||||
|
q!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
|
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
" Tests for the Vim script debug commands
|
" Tests for the Vim script debug commands
|
||||||
|
|
||||||
source shared.vim
|
source shared.vim
|
||||||
" source screendump.vim
|
source screendump.vim
|
||||||
|
|
||||||
" Run a Vim debugger command
|
" Run a Vim debugger command
|
||||||
" If the expected output argument is supplied, then check for it.
|
" If the expected output argument is supplied, then check for it.
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
" Tests for diff mode
|
" Tests for diff mode
|
||||||
|
source shared.vim
|
||||||
|
source screendump.vim
|
||||||
|
|
||||||
func Test_diff_fold_sync()
|
func Test_diff_fold_sync()
|
||||||
enew!
|
enew!
|
||||||
|
@ -1439,7 +1439,7 @@ func Test_edit_alt()
|
|||||||
call delete('XAltFile')
|
call delete('XAltFile')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_leave_insert_autocmd()
|
func Test_edit_InsertLeave()
|
||||||
new
|
new
|
||||||
au InsertLeave * let g:did_au = 1
|
au InsertLeave * let g:did_au = 1
|
||||||
let g:did_au = 0
|
let g:did_au = 0
|
||||||
@ -1469,6 +1469,21 @@ func Test_leave_insert_autocmd()
|
|||||||
iunmap x
|
iunmap x
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_edit_InsertLeave_undo()
|
||||||
|
new XtestUndo
|
||||||
|
set undofile
|
||||||
|
au InsertLeave * wall
|
||||||
|
exe "normal ofoo\<Esc>"
|
||||||
|
call assert_equal(2, line('$'))
|
||||||
|
normal u
|
||||||
|
call assert_equal(1, line('$'))
|
||||||
|
|
||||||
|
bwipe!
|
||||||
|
au! InsertLeave
|
||||||
|
call delete('XtestUndo')
|
||||||
|
set undofile&
|
||||||
|
endfunc
|
||||||
|
|
||||||
" Test for inserting characters using CTRL-V followed by a number.
|
" Test for inserting characters using CTRL-V followed by a number.
|
||||||
func Test_edit_special_chars()
|
func Test_edit_special_chars()
|
||||||
new
|
new
|
||||||
|
@ -437,7 +437,7 @@ let s:filename_checks = {
|
|||||||
\ 'swiftgyb': ['file.swift.gyb'],
|
\ 'swiftgyb': ['file.swift.gyb'],
|
||||||
\ 'sil': ['file.sil'],
|
\ 'sil': ['file.sil'],
|
||||||
\ 'sysctl': ['/etc/sysctl.conf', '/etc/sysctl.d/file.conf'],
|
\ 'sysctl': ['/etc/sysctl.conf', '/etc/sysctl.d/file.conf'],
|
||||||
\ 'systemd': ['any/systemd/file.automount', 'any/systemd/file.mount', 'any/systemd/file.path', 'any/systemd/file.service', 'any/systemd/file.socket', 'any/systemd/file.swap', 'any/systemd/file.target', 'any/systemd/file.timer', '/etc/systemd/system/some.d/file.conf', '/etc/systemd/system/some.d/.#file', '/home/user/.config/systemd/user/some.d/mine.conf', '/home/user/.config/systemd/user/some.d/.#file'],
|
\ 'systemd': ['any/systemd/file.automount', 'any/systemd/file.mount', 'any/systemd/file.path', 'any/systemd/file.service', 'any/systemd/file.socket', 'any/systemd/file.swap', 'any/systemd/file.target', 'any/systemd/file.timer', '/etc/systemd/system/some.d/file.conf', '/etc/systemd/system/some.d/.#file', '/etc/systemd/system/.#otherfile', '/home/user/.config/systemd/user/some.d/mine.conf', '/home/user/.config/systemd/user/some.d/.#file', '/home/user/.config/systemd/user/.#otherfile'],
|
||||||
\ 'systemverilog': ['file.sv', 'file.svh'],
|
\ 'systemverilog': ['file.sv', 'file.svh'],
|
||||||
\ 'tags': ['tags'],
|
\ 'tags': ['tags'],
|
||||||
\ 'tak': ['file.tak'],
|
\ 'tak': ['file.tak'],
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
" Test for folding
|
" Test for folding
|
||||||
|
|
||||||
source view_util.vim
|
source view_util.vim
|
||||||
|
source screendump.vim
|
||||||
|
|
||||||
func PrepIndent(arg)
|
func PrepIndent(arg)
|
||||||
return [a:arg] + repeat(["\t".a:arg], 5)
|
return [a:arg] + repeat(["\t".a:arg], 5)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
" Tests for ":highlight" and highlighting.
|
" Tests for ":highlight" and highlighting.
|
||||||
|
|
||||||
source view_util.vim
|
source view_util.vim
|
||||||
|
source screendump.vim
|
||||||
|
|
||||||
func Test_highlight()
|
func Test_highlight()
|
||||||
" basic test if ":highlight" doesn't crash
|
" basic test if ":highlight" doesn't crash
|
||||||
|
@ -6,6 +6,9 @@ if !has('mksession')
|
|||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
source shared.vim
|
||||||
|
source term_util.vim
|
||||||
|
|
||||||
func Test_mksession()
|
func Test_mksession()
|
||||||
tabnew
|
tabnew
|
||||||
let wrap_save = &wrap
|
let wrap_save = &wrap
|
||||||
|
@ -271,7 +271,7 @@ func Test_V_arg()
|
|||||||
call assert_equal(" verbose=0\n", out)
|
call assert_equal(" verbose=0\n", out)
|
||||||
|
|
||||||
let out = system(GetVimCommand() . ' --clean -es -X -V2 -c "set verbose?" -cq')
|
let out = system(GetVimCommand() . ' --clean -es -X -V2 -c "set verbose?" -cq')
|
||||||
" call assert_match("sourcing \"$VIMRUNTIME[\\/]defaults\.vim\"\r\nSearching for \"filetype\.vim\".*\n", out)
|
" call assert_match("sourcing \"$VIMRUNTIME[\\/]defaults\.vim\"\r\nline \\d\\+: sourcing \"[^\"]*runtime[\\/]filetype\.vim\".*\n", out)
|
||||||
call assert_match(" verbose=2\n", out)
|
call assert_match(" verbose=2\n", out)
|
||||||
|
|
||||||
let out = system(GetVimCommand() . ' --clean -es -X -V15 -c "set verbose?" -cq')
|
let out = system(GetVimCommand() . ' --clean -es -X -V15 -c "set verbose?" -cq')
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
" Tests for startup using utf-8.
|
" Tests for startup using utf-8.
|
||||||
|
|
||||||
source shared.vim
|
source shared.vim
|
||||||
" source screendump.vim
|
source screendump.vim
|
||||||
|
|
||||||
func Test_read_stdin_utf8()
|
func Test_read_stdin_utf8()
|
||||||
let linesin = ['テスト', '€ÀÈÌÒÙ']
|
let linesin = ['テスト', '€ÀÈÌÒÙ']
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
" Test :suspend
|
" Test :suspend
|
||||||
|
|
||||||
source shared.vim
|
source shared.vim
|
||||||
|
source term_util.vim
|
||||||
|
|
||||||
func CheckSuspended(buf, fileExists)
|
func CheckSuspended(buf, fileExists)
|
||||||
call WaitForAssert({-> assert_match('[$#] $', term_getline(a:buf, '.'))})
|
call WaitForAssert({-> assert_match('[$#] $', term_getline(a:buf, '.'))})
|
||||||
@ -55,7 +56,7 @@ func Test_suspend()
|
|||||||
call term_wait(buf)
|
call term_wait(buf)
|
||||||
" Wait until Vim actually exited and shell shows a prompt
|
" Wait until Vim actually exited and shell shows a prompt
|
||||||
call WaitForAssert({-> assert_match('[$#] $', term_getline(buf, '.'))})
|
call WaitForAssert({-> assert_match('[$#] $', term_getline(buf, '.'))})
|
||||||
call Stop_shell_in_terminal(buf)
|
call StopShellInTerminal(buf)
|
||||||
|
|
||||||
exe buf . 'bwipe!'
|
exe buf . 'bwipe!'
|
||||||
call delete('Xfoo')
|
call delete('Xfoo')
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
" Tests for tabpage
|
" Tests for tabpage
|
||||||
|
|
||||||
" source screendump.vim
|
source screendump.vim
|
||||||
|
|
||||||
function Test_tabpage()
|
function Test_tabpage()
|
||||||
bw!
|
bw!
|
||||||
|
@ -5,7 +5,7 @@ if !has('timers')
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
source shared.vim
|
source shared.vim
|
||||||
source screendump.vim
|
source term_util.vim
|
||||||
source load.vim
|
source load.vim
|
||||||
|
|
||||||
func MyHandler(timer)
|
func MyHandler(timer)
|
||||||
|
@ -1,10 +1,21 @@
|
|||||||
" Functions about view shared by several tests
|
" Functions about view shared by several tests
|
||||||
|
|
||||||
" Only load this script once.
|
" Only load this script once.
|
||||||
if exists('*ScreenLines')
|
if exists('*Screenline')
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" Get line "lnum" as displayed on the screen.
|
||||||
|
" Trailing white space is trimmed.
|
||||||
|
func Screenline(lnum)
|
||||||
|
let chars = []
|
||||||
|
for c in range(1, winwidth(0))
|
||||||
|
call add(chars, nr2char(screenchar(a:lnum, c)))
|
||||||
|
endfor
|
||||||
|
let line = join(chars, '')
|
||||||
|
return matchstr(line, '^.\{-}\ze\s*$')
|
||||||
|
endfunc
|
||||||
|
|
||||||
" ScreenLines(lnum, width) or
|
" ScreenLines(lnum, width) or
|
||||||
" ScreenLines([start, end], width)
|
" ScreenLines([start, end], width)
|
||||||
function! ScreenLines(lnum, width) abort
|
function! ScreenLines(lnum, width) abort
|
||||||
|
Loading…
Reference in New Issue
Block a user