Merge remote-tracking branch 'vim/master'

This commit is contained in:
Kazuki Sakamoto
2016-11-17 20:48:39 -08:00
34 changed files with 1178 additions and 334 deletions
+16
View File
@@ -0,0 +1,16 @@
" Vim compiler file
" Compiler: csslint for CSS
" Maintainer: Daniel Moch <daniel@danielmoch.com>
" Last Change: 2016 May 21
if exists("current_compiler")
finish
endif
let current_compiler = "csslint"
if exists(":CompilerSet") != 2 " older Vim always used :setlocal
command -nargs=* CompilerSet setlocal <args>
endif
CompilerSet makeprg=csslint\ --format=compact
CompilerSet errorformat=%-G,%-G%f:\ lint\ free!,%f:\ line\ %l\\,\ col\ %c\\,\ %trror\ -\ %m,%f:\ line\ %l\\,\ col\ %c\\,\ %tarning\ -\ %m,%f:\ line\ %l\\,\ col\ %c\\,\ %m
+16
View File
@@ -0,0 +1,16 @@
" Vim compiler file
" Compiler: Pylint for Python
" Maintainer: Daniel Moch <daniel@danielmoch.com>
" Last Change: 2016 May 20
if exists("current_compiler")
finish
endif
let current_compiler = "pylint"
if exists(":CompilerSet") != 2 " older Vim always used :setlocal
command -nargs=* CompilerSet setlocal <args>
endif
CompilerSet makeprg=pylint\ --output-format=text\ --msg-template=\"{path}:{line}:{column}:{C}:\ [{symbol}]\ {msg}\"\ --reports=no
CompilerSet errorformat=%A%f:%l:%c:%t:\ %m,%A%f:%l:\ %m,%A%f:(%l):\ %m,%-Z%p^%.%#,%-G%.%#
+2 -2
View File
@@ -1,4 +1,4 @@
*channel.txt* For Vim version 8.0. Last change: 2016 Oct 27
*channel.txt* For Vim version 8.0. Last change: 2016 Nov 07
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -369,7 +369,7 @@ Leave out the fourth argument if no response is to be sent:
==============================================================================
6. Using a RAW or NL channel *channel-raw*
If mode is RAW or NL then a message can be send like this: >
If mode is RAW or NL then a message can be sent like this: >
let response = ch_evalraw(channel, {string})
The {string} is sent as-is. The response will be what can be read from the
+2 -1
View File
@@ -1,4 +1,4 @@
*pi_gzip.txt* For Vim version 8.0. Last change: 2016 Oct 30
*pi_gzip.txt* For Vim version 8.0. Last change: 2016 Nov 06
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -28,6 +28,7 @@ with these extensions:
*.lzma lzma
*.xz xz
*.lz lzip
*.zst zstd
That's actually the only thing you need to know. There are no options.
+3 -2
View File
@@ -1,4 +1,4 @@
*scroll.txt* For Vim version 8.0. Last change: 2006 Aug 27
*scroll.txt* For Vim version 8.0. Last change: 2016 Nov 10
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -108,7 +108,8 @@ z^ Without [count]: Redraw with the line just above the
3. Scrolling relative to cursor *scroll-cursor*
The following commands reposition the edit window (the part of the buffer that
you see) while keeping the cursor on the same line:
you see) while keeping the cursor on the same line. Note that the 'scrolloff'
option may cause context lines to show above and below the cursor.
*z<CR>*
z<CR> Redraw, line [count] at top of window (default
+41 -8
View File
@@ -1,4 +1,4 @@
*todo.txt* For Vim version 8.0. Last change: 2016 Nov 06
*todo.txt* For Vim version 8.0. Last change: 2016 Nov 17
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -28,13 +28,29 @@ See |develop.txt| for development plans. You can vote for which items should
be worked on, but only if you sponsor Vim development. See |sponsor|.
Issues can also be entered online: https://github.com/vim/vim/issues
Updates will be forwarded to the vim_dev maillist. Issues entered there will
not be repeated below, unless there is extra information.
Only use this for bug reports, not for questions! Those belong on the
maillist. Updates will be forwarded to the vim_dev maillist. Issues entered
there will not be repeated below, unless there is extra information.
*known-bugs*
-------------------- Known bugs and current work -----------------------
Test_help_complete sometimes fails on MS-Windows:
function RunTheTest[9]..Test_help_complete line 22: Expected ['h test-char@ab',
'h test-char@en', 'h test-col@ab', 'h test-col@en'] but got ['h test-char@en', '
h test-char@en\t', 'h test-col@ab', 'h test-col@en']
Appears to be related to calling feedkeys() with exactly 8 characters.
Patch for GTK3: Kazunobu Kuriyama, 14 Nov.
Patch for fix breakindent bug (Christian, Nov 15)
+channel:
- Skip checking if job ended if there aren't any. (ichizok, 2016 Nov 7, #1196)
- problem with channel callback getting job, while the job was already
deleted. #1242. Fix in #1245 (ichizok), but is that correct?
Perhaps just replace job_still_alive() with job_still_useful()?
That's not sufficient.
- Problem with stderr on Windows? (Vincent Rischmann, 2016 Aug 31, #1026)
- Add 'cwd' argument to start_job(): directory to change to in the child.
check for valid directory before forking.
@@ -96,15 +112,29 @@ Regexp problems:
- The pattern "\1" with the old engine gives E65, with the new engine it
matches the empty string. (Dominique Pelle, 2015 Oct 2, Nov 24)
had_endbrace[] is set but not initialized or used.
- Difference between two engines: ".*\zs\/\@>\/" on text "///"
(Chris Paul, 2016 Nov 13) New engine not greedy enough?
Patch to support nested namespace syntax. (Pauli, 2016 Oct 30, #1214)
Patch to fix popup menu positioning. (Hirohito Higashi, 2016 Nov 7, #1241)
Patch to make help tag jumps keep language. (Tatsuki, #1249)
Test by Hirohito Higashi.
Make html indent file use javascript indent, now that it's not just cindent.
#1220
Patch to use buffer id for system() and systemlist() (LemonBoy, 2016 Nov 7,
#1240)
json_encode(): should convert to utf-8. (Nikolai Pavlov, 2016 Jan 23)
What if there is an invalid character?
Bug: ":earlier 100d" doesn't work after using undo file.
(Pavol Juhas, 2016 Nov 15, #1254)
Fix by Christian, but lacks a test.
Bug: Json with same key should not give internal error. (Lcd, 2016 Oct 26)
Make dict_add give a duplicate key error.
@@ -145,6 +175,9 @@ Or point to nightly builds: https://github.com/vim/vim-win32-installer/releases
Problem passing non-UTF-8 strings to Python 3. (Björn Linse, 2016 Sep 11,
#1053) With patch, does it work?
Patch to make finding duplicate tags much faster, using a hashtab. (James
McCoy, 2016 Sept 14, #1046) Should work now. Updated Nov 12.
>
Use ADDR_OTHER instead of ADDR_LINES for many more commands.
Add tests for using number larger than number of lines in buffer.
@@ -187,6 +220,9 @@ Include the test.
When 'keywordprg' starts with ":" the argument is still escaped as a shell
command argument. (Romain Lafourcade, 2016 Oct 16, #1175)
Patch to support CamelCase for spell checking: See a lower-to-upper case
change as a word boundary. (btucker-MPCData, 2016 Nov 6, #1235)
Idea from Sven: record sequence of keys. Useful to show others what they are
doing (look over the shoulder), and also to see what happened.
Probably list of keystrokes, with some annotations for mode changes.
@@ -296,9 +332,6 @@ Add redrawtabline command. (Naruhiko Nishino, 2016 Jun 11)
Neovim patch for utfc_ptr2char_len() https://github.com/neovim/neovim/pull/4574
No test, needs some work to include.
Patch to make finding duplicate tags much faster, using a hashtab. (James
McCoy, 2016 Sept 14, #1046) Should work now.
>
Patch to improve indenting for C++ constructor with initializer list.
(Hirohito Higashi, 2016 Mar 31)
@@ -3830,7 +3863,7 @@ Code size:
left out.
8 When compiled with a GUI-only version, the termcap entries for terminals
can be removed.
8 Can the check for libelf in configure.in be removed?
8 Can the check for libelf in configure.ac be removed?
Messages:
@@ -5552,7 +5585,7 @@ From vile:
Far future and "big" extensions:
- Instead of using a Makefile and autoconf, use a simple shell script to
find the C compiler and do everything with C code. Translate something
like an Aap recipe and configure.in to C. Avoids depending on Python,
like an Aap recipe and configure.ac to C. Avoids depending on Python,
thus will work everywhere. With batch file to find the C compiler it
would also work on MS-Windows.
- Make it easy to setup Vim for groups of users: novice vi users, novice
+417 -1
View File
@@ -1,4 +1,4 @@
*version8.txt* For Vim version 8.0. Last change: 2016 Sep 14
*version8.txt* For Vim version 8.0. Last change: 2016 Nov 06
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -14507,4 +14507,420 @@ Problem: Test runner misses a comma.
Solution: Add the comma.
Files: src/testdir/runtest.vim
Patch 8.0.0001
Problem: Intro screen still mentions version7. (Paul)
Solution: Change it to version8.
Files: src/version.c
Patch 8.0.0002
Problem: The netrw plugin does not work.
Solution: Make it accept version 8.0.
Files: runtime/autoload/netrw.vim
Patch 8.0.0003
Problem: getwinvar() returns wrong Value of boolean and number options,
especially non big endian systems. (James McCoy)
Solution: Cast the pointer to long or int. (closes #1060)
Files: src/option.c, src/testdir/test_bufwintabinfo.vim
Patch 8.0.0004
Problem: A string argument for function() that is not a function name
results in an error message with NULL. (Christian Brabandt)
Solution: Use the argument for the error message.
Files: src/evalfunc.c, src/testdir/test_expr.vim
Patch 8.0.0005
Problem: Netbeans test fails with Python 3. (Jonathonf)
Solution: Encode the string before sending it. (closes #1070)
Files: src/testdir/test_netbeans.py
Patch 8.0.0006
Problem: ":lb" is interpreted as ":lbottom" while the documentation says it
means ":lbuffer".
Solution: Adjust the order of the commands. (haya14busa, closes #1093)
Files: src/ex_cmds.h
Patch 8.0.0007
Problem: Vim 7.4 is still mentioned in a few places.
Solution: Update to Vim 8. (Uncle Bill, closes #1094)
Files: src/INSTALLpc.txt, src/vimtutor, uninstal.txt
Patch 8.0.0008
Problem: Popup complete test is disabled.
Solution: Enable the test and change the assert. (Hirohito Higashi)
Files: src/testdir/test_popup.vim
Patch 8.0.0009
Problem: Unnecessary workaround for AppVeyor.
Solution: Revert patch 7.4.990. (Christian Brabandt)
Files: appveyor.yml
Patch 8.0.0010
Problem: Crash when editing file that starts with crypt header. (igor2x)
Solution: Check for length of text. (Christian Brabandt) Add a test.
Files: src/fileio.c, src/testdir/test_crypt.vim, src/Makefile,
src/testdir/Make_all.mak
Patch 8.0.0011
Problem: On OSX Test_pipe_through_sort_all() sometimes fails.
Solution: Add the test to the list of flaky tests.
Files: src/testdir/runtest.vim
Patch 8.0.0012
Problem: Typos in comments.
Solution: Change "its" to "it's". (Matthew Brener, closes #1088)
Files: src/evalfunc.c, src/main.aap, src/nbdebug.c, src/netbeans.c,
src/quickfix.c, src/workshop.c, src/wsdebug.c
Patch 8.0.0013 (after 8.0.0011)
Problem: Missing comma in list.
Solution: Add the comma.
Files: src/testdir/runtest.vim
Patch 8.0.0014
Problem: Crypt tests are old style.
Solution: Convert to new style.
Files: src/testdir/test71.in, src/testdir/test71.ok,
src/testdir/test71a.in, src/testdir/test_crypt.vim, src/Makefile,
src/testdir/Make_all.mak
Patch 8.0.0015
Problem: Can't tell which part of a channel has "buffered" status.
Solution: Add an optional argument to ch_status(). Let ch_info() also
return "buffered" for out_status and err_status.
Files: src/evalfunc.c, src/channel.c, src/proto/channel.pro,
src/testdir/test_channel.vim, runtime/doc/eval.txt
Patch 8.0.0016 (after 8.0.0015)
Problem: Build fails.
Solution: Include missing change.
Files: src/eval.c
Patch 8.0.0017
Problem: Cannot get the number of the current quickfix or location list.
Solution: Use the current list if "nr" in "what" is zero. (Yegappan
Lakshmanan) Remove debug command from test.
Files: src/quickfix.c, src/testdir/test_quickfix.vim,
runtime/doc/eval.txt
Patch 8.0.0018
Problem: When using ":sleep" channel input is not handled.
Solution: When there is a channel check for input also when not in raw mode.
Check every 100 msec.
Files: src/channel.c, src/proto/channel.pro, src/ui.c, src/proto/ui.pro,
src/ex_docmd.c, src/os_amiga.c, src/proto/os_amiga.pro,
src/os_unix.c, src/proto/os_unix.pro, src/os_win32.c,
src/proto/os_win32.pro
Patch 8.0.0019
Problem: Test_command_count is old style.
Solution: Turn it into a new style test. (Naruhiko Nishino)
Use more assert functions.
Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/test_alot.vim,
src/testdir/test_autocmd.vim, src/testdir/test_command_count.in,
src/testdir/test_command_count.ok,
src/testdir/test_command_count.vim
Patch 8.0.0020
Problem: The regexp engines are not reentrant.
Solution: Add regexec_T and save/restore the state when needed.
Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test_expr.vim,
runtime/doc/eval.txt, runtime/doc/change.txt
Patch 8.0.0021
Problem: In the GUI when redrawing the cursor it may be on the second half
of a double byte character.
Solution: Correct the cursor column. (Yasuhiro Matsumoto)
Files: src/screen.c
Patch 8.0.0022
Problem: If a channel in NL mode is missing the NL at the end the remaining
characters are dropped.
Solution: When the channel is closed use the remaining text. (Ozaki Kiichi)
Files: src/channel.c, src/testdir/test_channel.vim
Patch 8.0.0023
Problem: "gd" and "gD" may find a match in a comment or string.
Solution: Ignore matches in comments and strings. (Anton Lindqvist)
Files: src/normal.c, src/testdir/test_goto.vim
Patch 8.0.0024
Problem: When the netbeans channel closes, "DETACH" is put in the output
part. (Ozaki Kiichi)
Solution: Write "DETACH" in the socket part.
Files: src/channel.c, src/testdir/test_netbeans.vim
Patch 8.0.0025
Problem: Inconsistent use of spaces vs tabs in gd test.
Solution: Use tabs. (Anton Lindqvist)
Files: src/testdir/test_goto.vim
Patch 8.0.0026
Problem: Error format with %W, %C and %Z does not work. (Gerd Wachsmuth)
Solution: Skip code when qf_multiignore is set. (Lcd)
Files: src/quickfix.c, src/testdir/test_quickfix.vim
Patch 8.0.0027
Problem: A channel is closed when reading on stderr or stdout fails, but
there may still be something to read on another part.
Solution: Turn ch_to_be_closed into a bitfield. (Ozaki Kiichi)
Files: src/channel.c, src/eval.c, src/structs.h, src/proto/channel.pro,
src/testdir/test_channel.vim
Patch 8.0.0028
Problem: Superfluous semicolons.
Solution: Remove them. (Ozaki Kiichi)
Files: src/ex_cmds2.c
Patch 8.0.0029
Problem: Code for MS-Windows is complicated because of the exceptions for
old systems.
Solution: Drop support for MS-Windows older than Windows XP. (Ken Takata)
Files: runtime/doc/gui_w32.txt, runtime/doc/os_win32.txt,
runtime/doc/todo.txt, src/GvimExt/Makefile, src/Make_mvc.mak,
src/evalfunc.c, src/ex_cmds.c, src/ex_docmd.c, src/gui_w32.c,
src/if_cscope.c, src/misc1.c, src/misc2.c, src/option.c,
src/os_mswin.c, src/os_win32.c, src/os_win32.h,
src/proto/os_mswin.pro, src/proto/os_win32.pro, src/version.c
Patch 8.0.0030
Problem: Mouse mode is not automatically detected for tmux.
Solution: Check for 'term' to be "tmux". (Michael Henry)
Files: src/os_unix.c
Patch 8.0.0031
Problem: After ":bwipeout" 'fileformat' is not set to the right default.
Solution: Get the default from 'fileformats'. (Mike Williams)
Files: src/option.c, src/Makefile, src/testdir/test_fileformat.vim,
src/testdir/test_alot.vim
Patch 8.0.0032
Problem: Tests may change the input file when something goes wrong.
Solution: Avoid writing the input file.
Files: src/testdir/test51.in, src/testdir/test67.in,
src/testdir/test97.in, src/testdir/test_tabpage.vim
Patch 8.0.0033
Problem: Cannot use overlapping positions with matchaddpos().
Solution: Check end of match. (Ozaki Kiichi) Add a test (Hirohito Higashi)
Files: src/screen.c, src/testdir/test_match.vim
Patch 8.0.0034
Problem: No completion for ":messages".
Solution: Complete "clear" argument. (Hirohito Higashi)
Files: src/ex_docmd.c, src/ex_getln.c, src/proto/ex_docmd.pro,
src/testdir/test_cmdline.vim, src/vim.h,
runtime/doc/eval.txt, runtime/doc/map.txt
Patch 8.0.0035 (after 7.4.2013)
Problem: Order of matches for 'omnifunc' is messed up. (Danny Su)
Solution: Do not set compl_curr_match when called from complete_check().
(closes #1168)
Files: src/edit.c, src/evalfunc.c, src/proto/edit.pro, src/search.c,
src/spell.c, src/tag.c, src/testdir/test76.in,
src/testdir/test76.ok, src/testdir/test_popup.vim, src/Makefile,
src/testdir/Make_all.mak
Patch 8.0.0036
Problem: Detecting that a job has finished may take a while.
Solution: Check for a finished job more often (Ozaki Kiichi)
Files: src/channel.c, src/os_unix.c, src/os_win32.c,
src/proto/os_unix.pro, src/proto/os_win32.pro,
src/testdir/test_channel.vim
Patch 8.0.0037
Problem: Get E924 when switching tabs. ()
Solution: Use win_valid_any_tab() instead of win_valid(). (Martin Vuille,
closes #1167, closes #1171)
Files: src/quickfix.c, src/testdir/test_quickfix.vim
Patch 8.0.0038
Problem: OPEN_CHR_FILES not defined for FreeBSD using Debian userland
files.
Solution: Check for __FreeBSD_kernel__. (James McCoy, closes #1166)
Files: src/vim.h
Patch 8.0.0039
Problem: When Vim 8 reads an old viminfo and exits, the next time marks are
not read from viminfo. (Ned Batchelder)
Solution: Set a mark when it wasn't set before, even when the timestamp is
zero. (closes #1170)
Files: src/mark.c, src/testdir/test_viminfo.vim
Patch 8.0.0040 (after 8.0.0033)
Problem: Whole line highlighting with matchaddpos() does not work.
Solution: Check for zero length. (Hirohito Higashi)
Files: src/screen.c, src/testdir/test_match.vim
Patch 8.0.0041
Problem: When using Insert mode completion but not actually inserting
anything an undo item is still created. (Tommy Allen)
Solution: Do not call stop_arrow() when not inserting anything.
Files: src/edit.c, src/testdir/test_popup.vim
Patch 8.0.0042 (after 8.0.0041)
Problem: When using Insert mode completion with 'completeopt' containing
"noinsert" change is not saved for undo. (Tommy Allen)
Solution: Call stop_arrow() before inserting for pressing Enter.
Files: src/edit.c, src/testdir/test_popup.vim
Patch 8.0.0043 (after 8.0.0041)
Problem: When using Insert mode completion with 'completeopt' containing
"noinsert" with CTRL-N the change is not saved for undo. (Tommy
Allen)
Solution: Call stop_arrow() before inserting for any key.
Files: src/edit.c, src/testdir/test_popup.vim
Patch 8.0.0044
Problem: In diff mode the cursor may end up below the last line, resulting
in an ml_get error.
Solution: Check the line to be valid.
Files: src/move.c, src/diff.c, src/proto/diff.pro,
src/testdir/test_diffmode.vim
Patch 8.0.0045
Problem: Calling job_stop() right after job_start() does not work.
Solution: Block signals while fork is still busy. (Ozaki Kiichi, closes
#1155)
Files: src/auto/configure, src/config.h.in, src/configure.in,
src/os_unix.c, src/testdir/test_channel.vim
Patch 8.0.0046
Problem: Using NUL instead of NULL.
Solution: Change to NULL. (Dominique Pelle)
Files: src/ex_cmds.c, src/json.c
Patch 8.0.0047
Problem: Crash when using the preview window from an unnamed buffer.
(lifepillar)
Solution: Do not clear the wrong buffer. (closes #1200)
Files: src/popupmnu.c
Patch 8.0.0048
Problem: On Windows job_stop() stops cmd.exe, not the processes it runs.
(Linwei)
Solution: Iterate over all processes and terminate the one where the parent
is the job process. (Yasuhiro Matsumoto, closes #1184)
Files: src/os_win32.c, src/structs.h
Patch 8.0.0049
Problem: When a match ends in part of concealed text highlighting, it might
mess up concealing by resetting prev_syntax_id.
Solution: Do not reset prev_syntax_id and add a test to verify. (Christian
Brabandt, closes #1092)
Files: src/screen.c, src/testdir/test_matchadd_conceal.vim
Patch 8.0.0050
Problem: An exiting job is detected with a large latency.
Solution: Check for pending job more often. (Ozaki Kiichi) Change the
double loop in mch_inchar() into one.
Files: src/channel.c, src/os_unix.c, src/testdir/shared.vim,
src/testdir/test_channel.vim
Patch 8.0.0051 (after 8.0.0048)
Problem: New code for job_stop() breaks channel test on AppVeyor.
Solution: Revert the change.
Files: src/os_win32.c, src/structs.h
Patch 8.0.0052 (after 8.0.0049)
Problem: Conceal test passes even without the bug fix.
Solution: Add a redraw command. (Christian Brabandt)
Files: src/testdir/test_matchadd_conceal.vim
Patch 8.0.0053 (after 8.0.0047)
Problem: No test for what 8.0.0047 fixes.
Solution: Add a test. (Hirohito Higashi)
Files: src/testdir/test_popup.vim
Patch 8.0.0054 (after 8.0.0051)
Problem: On Windows job_stop() stops cmd.exe, not the processes it runs.
(Linwei)
Solution: Iterate over all processes and terminate the one where the parent
is the job process. Now only when there is no job object.
(Yasuhiro Matsumoto, closes #1203)
Files: src/os_win32.c
Patch 8.0.0055
Problem: Minor comment and style deficiencies.
Solution: Update comments and fix style.
Files: src/buffer.c, src/misc2.c, src/os_unix.c
Patch 8.0.0056
Problem: When setting 'filetype' there is no check for a valid name.
Solution: Only allow valid characters in 'filetype', 'syntax' and 'keymap'.
Files: src/option.c, src/testdir/test_options.vim
Patch 8.0.0057 (after 8.0.0056)
Problem: Tests fail without the 'keymap' features.
Solution: Check for feature in test.
Files: src/testdir/test_options.vim
Patch 8.0.0058
Problem: Positioning of the popup menu is not good.
Solution: Position it better. (Hirohito Higashi)
Files: src/popupmnu.c
Patch 8.0.0059
Problem: Vim does not build on VMS systems.
Solution: Various changes for VMS. (Zoltan Arpadffy)
Files: src/json.c, src/macros.h, src/Make_vms.mms, src/os_unix.c,
src/os_unix.h, src/os_vms.c, src/os_vms_conf.h,
src/proto/os_vms.pro, src/testdir/Make_vms.mms
Patch 8.0.0060
Problem: When using an Ex command for 'keywordprg' it is escaped as with a
shell command. (Romain Lafourcade)
Solution: Escape for an Ex command. (closes #1175)
Files: src/normal.c, src/testdir/test_normal.vim
Patch 8.0.0061 (after 8.0.0058)
Problem: Compiler warning for unused variable.
Solution: Add #ifdef. (John Marriott)
Files: src/popupmnu.c
Patch 8.0.0062
Problem: No digraph for HORIZONTAL ELLIPSIS.
Solution: Use ",.". (Hans Ginzel, closes #1226)
Files: src/digraph.c, runtime/doc/digraph.txt
Patch 8.0.0063
Problem: Compiler warning for comparing with unsigned. (Zoltan Arpadffy)
Solution: Change <= to ==.
Files: src/undo.c
Patch 8.0.0064 (after 8.0.0060)
Problem: Normal test fails on MS-Windows.
Solution: Don't try using an illegal file name.
Files: src/testdir/test_normal.vim
Patch 8.0.0065 (after 8.0.0056)
Problem: Compiler warning for unused function in tiny build. (Tony
Mechelynck)
Solution: Add #ifdef.
Files: src/option.c
Patch 8.0.0066
Problem: when calling an operator function when 'linebreak' is set, it is
internally reset before calling the operator function.
Solution: Restore 'linebreak' before calling op_function(). (Christian
Brabandt)
Files: src/normal.c, src/testdir/test_normal.vim
Patch 8.0.0067
Problem: VMS has a problem with infinity.
Solution: Avoid an overflow. (Zoltan Arpadffy)
Files: src/json.c, src/macros.h
Patch 8.0.0068
Problem: Checking did_throw after executing autocommands is wrong. (Daniel
Hahler)
Solution: Call aborting() instead, and only when autocommands were executed.
Files: src/quickfix.c, src/if_cscope.c, src/testdir/test_quickfix.vim
Patch 8.0.0069
Problem: Compiler warning for self-comparison.
Solution: Define ONE_WINDOW and add #ifdef.
Files: src/globals.h, src/buffer.c, src/ex_docmd.c, src/move.c,
src/screen.c, src/quickfix.c, src/window.c
vim:tw=78:ts=8:ft=help:norl:
+6 -6
View File
@@ -1,7 +1,7 @@
" Vim indent file
" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, and 77)
" Version: 0.46
" Last Change: 2016 Sep. 27
" Version: 47
" Last Change: 2016 Oct. 29
" Maintainer: Ajit J. Thakkar <ajit@unb.ca>; <http://www2.unb.ca/~ajit/>
" Usage: For instructions, do :help fortran-indent from Vim
" Credits:
@@ -100,9 +100,9 @@ function FortranGetIndent(lnum)
endif
endif
"Add a shiftwidth to statements following if, else, else if, case,
"Add a shiftwidth to statements following if, else, else if, case, class,
"where, else where, forall, type, interface and associate statements
if prevstat =~? '^\s*\(case\|else\|else\s*if\|else\s*where\)\>'
if prevstat =~? '^\s*\(case\|class\|else\|else\s*if\|else\s*where\)\>'
\ ||prevstat=~? '^\s*\(type\|interface\|associate\|enum\)\>'
\ ||prevstat=~?'^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*\(forall\|where\|block\)\>'
\ ||prevstat=~? '^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*if\>'
@@ -136,11 +136,11 @@ function FortranGetIndent(lnum)
endif
endif
"Subtract a shiftwidth from else, else if, elsewhere, case, end if,
"Subtract a shiftwidth from else, else if, elsewhere, case, class, end if,
" end where, end select, end forall, end interface, end associate,
" end enum, end type, end block and end type statements
if getline(v:lnum) =~? '^\s*\(\d\+\s\)\=\s*'
\. '\(else\|else\s*if\|else\s*where\|case\|'
\. '\(else\|else\s*if\|else\s*where\|case\|class\|'
\. 'end\s*\(if\|where\|select\|interface\|'
\. 'type\|forall\|associate\|enum\|block\)\)\>'
let ind = ind - shiftwidth()
+5 -1
View File
@@ -20,29 +20,33 @@ augroup gzip
"
" Set binary mode before reading the file.
" Use "gzip -d", gunzip isn't always available.
autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z,*.lzma,*.xz,*.lz setlocal bin
autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z,*.lzma,*.xz,*.lz,*.zst setlocal bin
autocmd BufReadPost,FileReadPost *.gz call gzip#read("gzip -dn")
autocmd BufReadPost,FileReadPost *.bz2 call gzip#read("bzip2 -d")
autocmd BufReadPost,FileReadPost *.Z call gzip#read("uncompress")
autocmd BufReadPost,FileReadPost *.lzma call gzip#read("lzma -d")
autocmd BufReadPost,FileReadPost *.xz call gzip#read("xz -d")
autocmd BufReadPost,FileReadPost *.lz call gzip#read("lzip -d")
autocmd BufReadPost,FileReadPost *.zst call gzip#read("zstd -d --rm")
autocmd BufWritePost,FileWritePost *.gz call gzip#write("gzip")
autocmd BufWritePost,FileWritePost *.bz2 call gzip#write("bzip2")
autocmd BufWritePost,FileWritePost *.Z call gzip#write("compress -f")
autocmd BufWritePost,FileWritePost *.lzma call gzip#write("lzma -z")
autocmd BufWritePost,FileWritePost *.xz call gzip#write("xz -z")
autocmd BufWritePost,FileWritePost *.lz call gzip#write("lzip")
autocmd BufWritePost,FileWritePost *.zst call gzip#write("zstd --rm")
autocmd FileAppendPre *.gz call gzip#appre("gzip -dn")
autocmd FileAppendPre *.bz2 call gzip#appre("bzip2 -d")
autocmd FileAppendPre *.Z call gzip#appre("uncompress")
autocmd FileAppendPre *.lzma call gzip#appre("lzma -d")
autocmd FileAppendPre *.xz call gzip#appre("xz -d")
autocmd FileAppendPre *.lz call gzip#appre("lzip -d")
autocmd FileAppendPre *.zst call gzip#appre("zstd -d --rm")
autocmd FileAppendPost *.gz call gzip#write("gzip")
autocmd FileAppendPost *.bz2 call gzip#write("bzip2")
autocmd FileAppendPost *.Z call gzip#write("compress -f")
autocmd FileAppendPost *.lzma call gzip#write("lzma -z")
autocmd FileAppendPost *.xz call gzip#write("xz -z")
autocmd FileAppendPost *.lz call gzip#write("lzip")
autocmd FileAppendPost *.zst call gzip#write("zstd --rm")
augroup END
+2 -2
View File
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: C
" Maintainer: Bram Moolenaar <Bram@vim.org>
" Last Change: 2016 Oct 27
" Last Change: 2016 Nov 17
" Quit when a (custom) syntax file was already loaded
if exists("b:current_syntax")
@@ -365,7 +365,7 @@ if !exists("c_no_if0")
syn region cCppOutWrapper start="^\s*\zs\(%:\|#\)\s*if\s\+0\+\s*\($\|//\|/\*\|&\)" end=".\@=\|$" contains=cCppOutIf,cCppOutElse,@NoSpell fold
syn region cCppOutIf contained start="0\+" matchgroup=cCppOutWrapper end="^\s*\zs\(%:\|#\)\s*endif\>" contains=cCppOutIf2,cCppOutElse
if !exists("c_no_if0_fold")
syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\zs\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell fold
syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell fold
else
syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell
endif
+6 -4
View File
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, and 77)
" Version: 0.99
" Last Change: 2016 Sep. 23
" Version: 100
" Last Change: 2016 Oct. 29
" Maintainer: Ajit J. Thakkar <ajit@unb.ca>; <http://www2.unb.ca/~ajit/>
" Usage: For instructions, do :help fortran-syntax from Vim
" Credits:
@@ -397,6 +397,7 @@ if exists("fortran_fold")
syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
syn region fortranBlockData transparent fold keepend start="\<block\s*data\(\s\+\z(\a\w*\)\)\=" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
syn region fortranAssociate transparent fold keepend start="^\s*\<associate\s\+" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
syn region fortranInterface transparent fold keepend extend start="^\s*\(abstract \)\=\s*interface\>" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\|abstract\)\)\=\s*::" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock,fortranInterface
else
@@ -406,6 +407,7 @@ if exists("fortran_fold")
syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
syn region fortranBlockData transparent fold keepend start="\<block\s*data\(\s\+\z(\a\w*\)\)\=" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
syn region fortranAssociate transparent fold keepend start="^\s*\<associate\s\+" skip="^\s*[!#].*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
syn region fortranInterface transparent fold keepend extend start="^\s*\(abstract \)\=\s*interface\>" skip="^\s*[!#].*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\|abstract\)\)\=\s*::" skip="^\s*[!#].*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock,fortranInterface
endif
@@ -415,12 +417,12 @@ if exists("fortran_fold")
syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(.\+)\s*then\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortranCase transparent fold keepend extend start="\<select\s*\(case\|type\)\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
else
syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\s*[!#].*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(\(.\|&\s*\n\)\+)\(\s\|&\s*\n\)*then\>" skip="^\s*[!#].*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
syn region fortranCase transparent fold keepend extend start="\<select\s*\(case\|type\)\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
endif
endif
+5 -5
View File
@@ -61,8 +61,8 @@ NOTE : Les touches fl
Ceci quitte l'éditeur SANS enregistrer les changements que vous avez
faits.
3. Lorsque l'invite du shell vous sera présentée, tapez la commande qui
vous a mené dans ce tutoriel. Cela pourrait être : vimtutor <Entrée>
3. Revenez ici en tapant la commande qui vous a mené à ce tutoriel.
Cela pourrait être : vimtutor <Entrée>
4. Si vous avez mémorisé ces étapes et êtes confiant, effectuez les étapes
1 à 3 pour sortir puis rentrer dans l'éditeur.
@@ -154,7 +154,7 @@ NOTE : En avan
!! NOTE : Lisez toute la leçon avant d'exécuter les instructions ci-dessous !!
1. Sortez de ce tutoriel comme vous l'avez fait dans la Leçon 1.2 : :q!
Ou, si vous avez accès à un autre terminal, exécutez y les actions
Ou, si vous avez accès à un autre terminal, exécutez-y les actions
qui suivent.
2. À l'invite du shell, tapez cette commande : vim tutor <Entrée>
@@ -704,7 +704,7 @@ NOTE : Si vous quittez Vim et le red
3. Appuyez : . En bas de l'écran :'<,'> va apparaître.
4. Tapez w TEST , où TEST est un nom de fichier qui n'existe pas.
Vérifiez que vous voyez :'<,'>w TEST avant de d'appuyer sur <Entrée>.
Vérifiez que vous voyez :'<,'>w TEST avant d'appuyer sur <Entrée>.
5. Vim va enregistrer les lignes sélectionnées dans le fichier TEST.
Utilisez :!dir ou :!ls pour le voir. Ne l'effacez pas encore !
@@ -1034,5 +1034,5 @@ NOTE : Le compl
Dernières mises à jour par Dominique Pellé.
E-mail : dominique.pelle@gmail.com
Last Change : 2016 Jul 02
Last Change : 2016 Nov 08
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+5 -5
View File
@@ -61,8 +61,8 @@ NOTE : Les touches fléchées devraient également fonctionner. Mais en utilisan
Ceci quitte l'éditeur SANS enregistrer les changements que vous avez
faits.
3. Lorsque l'invite du shell vous sera présentée, tapez la commande qui
vous a mené dans ce tutoriel. Cela pourrait être : vimtutor <Entrée>
3. Revenez ici en tapant la commande qui vous a mené à ce tutoriel.
Cela pourrait être : vimtutor <Entrée>
4. Si vous avez mémorisé ces étapes et êtes confiant, effectuez les étapes
1 à 3 pour sortir puis rentrer dans l'éditeur.
@@ -154,7 +154,7 @@ NOTE : En avançant dans ce cours, n'essayez pas de mémoriser, apprenez par
!! NOTE : Lisez toute la leçon avant d'exécuter les instructions ci-dessous !!
1. Sortez de ce tutoriel comme vous l'avez fait dans la Leçon 1.2 : :q!
Ou, si vous avez accès à un autre terminal, exécutez y les actions
Ou, si vous avez accès à un autre terminal, exécutez-y les actions
qui suivent.
2. À l'invite du shell, tapez cette commande : vim tutor <Entrée>
@@ -704,7 +704,7 @@ NOTE : Si vous quittez Vim et le redémarrez de nouveau avec le fichier TEST,
3. Appuyez : . En bas de l'écran :'<,'> va apparaître.
4. Tapez w TEST , où TEST est un nom de fichier qui n'existe pas.
Vérifiez que vous voyez :'<,'>w TEST avant de d'appuyer sur <Entrée>.
Vérifiez que vous voyez :'<,'>w TEST avant d'appuyer sur <Entrée>.
5. Vim va enregistrer les lignes sélectionnées dans le fichier TEST.
Utilisez :!dir ou :!ls pour le voir. Ne l'effacez pas encore !
@@ -1034,5 +1034,5 @@ NOTE : Le complètement fonctionne pour de nombreuses commandes. Essayez
Dernières mises à jour par Dominique Pellé.
E-mail : dominique.pelle@gmail.com
Last Change : 2016 Jul 02
Last Change : 2016 Nov 08
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 -1
View File
@@ -2046,7 +2046,6 @@ run_message_test: $(MESSAGE_TEST_TARGET)
test1 \
test_autocmd_option \
test_autoformat_join \
test_breakindent \
test_changelist \
test_close_count \
test_comparators \
@@ -2081,6 +2080,7 @@ test_arglist \
test_autochdir \
test_autocmd \
test_backspace_opt \
test_breakindent \
test_bufwintabinfo \
test_cdo \
test_channel \
+87 -54
View File
@@ -4458,19 +4458,66 @@ job_free(job_T *job)
}
}
#if defined(EXITFREE) || defined(PROTO)
void
job_free_all(void)
{
while (first_job != NULL)
job_free(first_job);
}
#endif
/*
* Return TRUE if we need to check if the process of "job" has ended.
*/
static int
job_need_end_check(job_T *job)
{
return job->jv_status == JOB_STARTED
&& (job->jv_stoponexit != NULL || job->jv_exit_cb != NULL);
}
/*
* Return TRUE if the channel of "job" is still useful.
*/
static int
job_channel_still_useful(job_T *job)
{
return job->jv_channel != NULL && channel_still_useful(job->jv_channel);
}
/*
* Return TRUE if the job should not be freed yet. Do not free the job when
* it has not ended yet and there is a "stoponexit" flag, an exit callback
* or when the associated channel will do something with the job output.
*/
static int
job_still_useful(job_T *job)
{
return job_need_end_check(job) || job_channel_still_useful(job);
}
/*
* NOTE: Must call job_cleanup() only once right after the status of "job"
* changed to JOB_ENDED (i.e. after job_status() returned "dead" first or
* mch_detect_ended_job() returned non-NULL).
*/
static void
job_cleanup(job_T *job)
{
if (job->jv_status != JOB_ENDED)
return;
/* Ready to cleanup the job. */
job->jv_status = JOB_FINISHED;
if (job->jv_exit_cb != NULL)
{
typval_T argv[3];
typval_T rettv;
int dummy;
/* invoke the exit callback; make sure the refcount is > 0 */
/* Invoke the exit callback. Make sure the refcount is > 0. */
++job->jv_refcount;
argv[0].v_type = VAR_JOB;
argv[0].vval.v_job = job;
@@ -4483,42 +4530,18 @@ job_cleanup(job_T *job)
--job->jv_refcount;
channel_need_redraw = TRUE;
}
if (job->jv_refcount == 0)
/* Do not free the job in case the close callback of the associated channel
* isn't invoked yet and may get information by job_info(). */
if (job->jv_refcount == 0 && !job_channel_still_useful(job))
{
/* The job was already unreferenced, now that it ended it can be
* freed. Careful: caller must not use "job" after this! */
/* The job was already unreferenced and the associated channel was
* detached, now that it ended it can be freed. Careful: caller must
* not use "job" after this! */
job_free(job);
}
}
#if defined(EXITFREE) || defined(PROTO)
void
job_free_all(void)
{
while (first_job != NULL)
job_free(first_job);
}
#endif
/*
* Return TRUE if the job should not be freed yet. Do not free the job when
* it has not ended yet and there is a "stoponexit" flag, an exit callback
* or when the associated channel will do something with the job output.
*/
static int
job_still_useful(job_T *job)
{
return (job->jv_stoponexit != NULL || job->jv_exit_cb != NULL
|| (job->jv_channel != NULL
&& channel_still_useful(job->jv_channel)));
}
static int
job_still_alive(job_T *job)
{
return (job->jv_status == JOB_STARTED) && job_still_useful(job);
}
/*
* Mark references in jobs that are still useful.
*/
@@ -4530,7 +4553,7 @@ set_ref_in_job(int copyID)
typval_T tv;
for (job = first_job; job != NULL; job = job->jv_next)
if (job_still_alive(job))
if (job_still_useful(job))
{
tv.v_type = VAR_JOB;
tv.vval.v_job = job;
@@ -4539,26 +4562,33 @@ set_ref_in_job(int copyID)
return abort;
}
/*
* Dereference "job". Note that after this "job" may have been freed.
*/
void
job_unref(job_T *job)
{
if (job != NULL && --job->jv_refcount <= 0)
{
/* Do not free the job when it has not ended yet and there is a
* "stoponexit" flag or an exit callback. */
if (!job_still_alive(job))
/* Do not free the job if there is a channel where the close callback
* may get the job info. */
if (!job_channel_still_useful(job))
{
job_free(job);
}
else if (job->jv_channel != NULL
&& !channel_still_useful(job->jv_channel))
{
/* Do remove the link to the channel, otherwise it hangs
* around until Vim exits. See job_free() for refcount. */
ch_log(job->jv_channel, "detaching channel from job");
job->jv_channel->ch_job = NULL;
channel_unref(job->jv_channel);
job->jv_channel = NULL;
/* Do not free the job when it has not ended yet and there is a
* "stoponexit" flag or an exit callback. */
if (!job_need_end_check(job))
{
job_free(job);
}
else if (job->jv_channel != NULL)
{
/* Do remove the link to the channel, otherwise it hangs
* around until Vim exits. See job_free() for refcount. */
ch_log(job->jv_channel, "detaching channel from job");
job->jv_channel->ch_job = NULL;
channel_unref(job->jv_channel);
job->jv_channel = NULL;
}
}
}
}
@@ -4571,7 +4601,7 @@ free_unused_jobs_contents(int copyID, int mask)
for (job = first_job; job != NULL; job = job->jv_next)
if ((job->jv_copyID & mask) != (copyID & mask)
&& !job_still_alive(job))
&& !job_still_useful(job))
{
/* Free the channel and ordinary items it contains, but don't
* recurse into Lists, Dictionaries etc. */
@@ -4591,7 +4621,7 @@ free_unused_jobs(int copyID, int mask)
{
job_next = job->jv_next;
if ((job->jv_copyID & mask) != (copyID & mask)
&& !job_still_alive(job))
&& !job_still_useful(job))
{
/* Free the job struct itself. */
job_free_job(job);
@@ -4685,8 +4715,7 @@ has_pending_job(void)
/* Only should check if the channel has been closed, if the channel is
* open the job won't exit. */
if (job->jv_status == JOB_STARTED && job->jv_exit_cb != NULL
&& (job->jv_channel == NULL
|| !channel_still_useful(job->jv_channel)))
&& !job_channel_still_useful(job))
return TRUE;
return FALSE;
}
@@ -4701,14 +4730,18 @@ job_check_ended(void)
{
int i;
if (first_job == NULL)
return;
for (i = 0; i < MAX_CHECK_ENDED; ++i)
{
/* NOTE: mch_detect_ended_job() must only return a job of which the
* status was just set to JOB_ENDED. */
job_T *job = mch_detect_ended_job(first_job);
if (job == NULL)
break;
if (job_still_useful(job))
job_cleanup(job); /* may free "job" */
job_cleanup(job); /* may free "job" */
}
if (channel_need_redraw)
@@ -4922,7 +4955,7 @@ job_status(job_T *job)
{
char *result;
if (job->jv_status == JOB_ENDED)
if (job->jv_status >= JOB_ENDED)
/* No need to check, dead is dead. */
result = "dead";
else if (job->jv_status == JOB_FAILED)
+1 -1
View File
@@ -7290,7 +7290,7 @@ get_tv_string_buf_chk(typval_T *varp, char_u *buf)
if (job == NULL)
return (char_u *)"no process";
status = job->jv_status == JOB_FAILED ? "fail"
: job->jv_status == JOB_ENDED ? "dead"
: job->jv_status >= JOB_ENDED ? "dead"
: "run";
# ifdef UNIX
vim_snprintf((char *)buf, NUMBUFLEN,
+11
View File
@@ -1178,12 +1178,23 @@ drawBalloon(BalloonEval *beval)
int y_offset = EVAL_OFFSET_Y;
PangoLayout *layout;
# ifdef HAVE_GTK_MULTIHEAD
# if GTK_CHECK_VERSION(3,22,2)
GdkRectangle rect;
GdkMonitor * const mon = gdk_display_get_monitor_at_window(
gtk_widget_get_display(beval->balloonShell),
gtk_widget_get_window(beval->balloonShell));
gdk_monitor_get_geometry(mon, &rect);
screen_w = rect.width;
screen_h = rect.height;
# else
GdkScreen *screen;
screen = gtk_widget_get_screen(beval->target);
gtk_window_set_screen(GTK_WINDOW(beval->balloonShell), screen);
screen_w = gdk_screen_get_width(screen);
screen_h = gdk_screen_get_height(screen);
# endif
# else
screen_w = gdk_screen_width();
screen_h = gdk_screen_height();
+71
View File
@@ -1881,10 +1881,36 @@ gui_mch_show_popupmenu(vimmenu_T *menu)
# endif
# endif /* FEAT_XIM */
# if GTK_CHECK_VERSION(3,22,2)
{
GdkEventButton trigger;
/* A pseudo event to have gtk_menu_popup_at_pointer() work. Since the
* function calculates the popup menu position on the basis of the
* actual pointer position when it is invoked, the fields x, y, x_root
* and y_root are set to zero for convenience. */
trigger.type = GDK_BUTTON_PRESS;
trigger.window = gtk_widget_get_window(gui.drawarea);
trigger.send_event = FALSE;
trigger.time = gui.event_time;
trigger.x = 0.0;
trigger.y = 0.0;
trigger.axes = NULL;
trigger.state = 0;
trigger.button = 3;
trigger.device = NULL;
trigger.x_root = 0.0;
trigger.y_root = 0.0;
gtk_menu_popup_at_pointer(GTK_MENU(menu->submenu_id),
(GdkEvent *)&trigger);
}
#else
gtk_menu_popup(GTK_MENU(menu->submenu_id),
NULL, NULL,
(GtkMenuPositionFunc)NULL, NULL,
3U, gui.event_time);
#endif
}
/* Ugly global variable to pass "mouse_pos" flag from gui_make_popup() to
@@ -1942,10 +1968,55 @@ gui_make_popup(char_u *path_name, int mouse_pos)
if (menu != NULL && menu->submenu_id != NULL)
{
# if GTK_CHECK_VERSION(3,22,2)
GdkWindow * const win = gtk_widget_get_window(gui.drawarea);
GdkEventButton trigger;
/* A pseudo event to have gtk_menu_popup_at_*() functions work. Since
* the position where the menu pops up is automatically adjusted by
* the functions, none of the fields x, y, x_root and y_root has to be
* set to a specific value here; therefore, they are set to zero for
* convenience.*/
trigger.type = GDK_BUTTON_PRESS;
trigger.window = win;
trigger.send_event = FALSE;
trigger.time = GDK_CURRENT_TIME;
trigger.x = 0.0;
trigger.y = 0.0;
trigger.axes = NULL;
trigger.state = 0;
trigger.button = 0;
trigger.device = NULL;
trigger.x_root = 0.0;
trigger.y_root = 0.0;
if (mouse_pos)
gtk_menu_popup_at_pointer(GTK_MENU(menu->submenu_id),
(GdkEvent *)&trigger);
else
{
gint origin_x, origin_y;
GdkRectangle rect = { 0, 0, 0, 0 };
gdk_window_get_origin(win, &origin_x, &origin_y);
popup_menu_position_func(NULL, &rect.x, &rect.y, NULL, NULL);
rect.x -= origin_x;
rect.y -= origin_y;
gtk_menu_popup_at_rect(GTK_MENU(menu->submenu_id),
win,
&rect,
GDK_GRAVITY_SOUTH_EAST,
GDK_GRAVITY_NORTH_WEST,
(GdkEvent *)&trigger);
}
# else
gtk_menu_popup(GTK_MENU(menu->submenu_id),
NULL, NULL,
&popup_menu_position_func, NULL,
0U, (guint32)GDK_CURRENT_TIME);
# endif
}
}
+104 -2
View File
@@ -3076,10 +3076,16 @@ drawarea_unrealize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED)
gui.blank_pointer = NULL;
}
#if GTK_CHECK_VERSION(3,22,2)
static void
drawarea_style_updated_cb(GtkWidget *widget UNUSED,
gpointer data UNUSED)
#else
static void
drawarea_style_set_cb(GtkWidget *widget UNUSED,
GtkStyle *previous_style UNUSED,
gpointer data UNUSED)
#endif
{
gui_mch_new_colors();
}
@@ -3096,6 +3102,31 @@ drawarea_configure_event_cb(GtkWidget *widget,
g_return_val_if_fail(event
&& event->width >= 1 && event->height >= 1, TRUE);
# if GTK_CHECK_VERSION(3,22,2)
/* As of 3.22.2, GdkWindows have started distributing configure events to
* their "native" children (https://git.gnome.org/browse/gtk+/commit/?h=gtk-3-22&id=12579fe71b3b8f79eb9c1b80e429443bcc437dd0).
*
* As can be seen from the implementation of move_native_children() and
* configure_native_child() in gdkwindow.c, those functions actually
* propagate configure events to every child, failing to distinguish
* "native" one from non-native one.
*
* Naturally, configure events propagated to here like that are fallacious
* and, as a matter of fact, they trigger a geometric collapse of
* gui.drawarea in fullscreen and miximized modes.
*
* To filter out such nuisance events, we are making use of the fact that
* the field send_event of such GdkEventConfigures is set to FALSE in
* configure_native_child().
*
* Obviously, this is a terrible hack making GVim depend on GTK's
* implementation details. Therefore, watch out any relevant internal
* changes happening in GTK in the feature (sigh).
*/
if (event->send_event == FALSE)
return TRUE;
# endif
if (event->width == cur_width && event->height == cur_height)
return TRUE;
@@ -3519,8 +3550,12 @@ on_tabline_menu(GtkWidget *widget, GdkEvent *event)
/* If the event was generated for 3rd button popup the menu. */
if (bevent->button == 3)
{
# if GTK_CHECK_VERSION(3,22,2)
gtk_menu_popup_at_pointer(GTK_MENU(widget), event);
# else
gtk_menu_popup(GTK_MENU(widget), NULL, NULL, NULL, NULL,
bevent->button, bevent->time);
# endif
/* We handled the event. */
return TRUE;
}
@@ -4116,6 +4151,9 @@ gui_mch_init(void)
#endif
gui.drawarea = gtk_drawing_area_new();
#if GTK_CHECK_VERSION(3,22,2)
gtk_widget_set_name(gui.drawarea, "vim-gui-drawarea");
#endif
#if GTK_CHECK_VERSION(3,0,0)
gui.surface = NULL;
gui.by_signal = FALSE;
@@ -4167,8 +4205,13 @@ gui_mch_init(void)
G_CALLBACK(drawarea_unrealize_cb), NULL);
g_signal_connect(G_OBJECT(gui.drawarea), "configure-event",
G_CALLBACK(drawarea_configure_event_cb), NULL);
# if GTK_CHECK_VERSION(3,22,2)
g_signal_connect_after(G_OBJECT(gui.drawarea), "style-updated",
G_CALLBACK(&drawarea_style_updated_cb), NULL);
# else
g_signal_connect_after(G_OBJECT(gui.drawarea), "style-set",
G_CALLBACK(&drawarea_style_set_cb), NULL);
# endif
#else
gtk_signal_connect(GTK_OBJECT(gui.drawarea), "realize",
GTK_SIGNAL_FUNC(drawarea_realize_cb), NULL);
@@ -4384,14 +4427,34 @@ set_cairo_source_rgba_from_color(cairo_t *cr, guicolor_T color)
gui_mch_new_colors(void)
{
#if GTK_CHECK_VERSION(3,0,0)
# if !GTK_CHECK_VERSION(3,22,2)
GdkWindow * const da_win = gtk_widget_get_window(gui.drawarea);
# endif
if (gui.drawarea != NULL && gtk_widget_get_window(gui.drawarea) != NULL)
#else
if (gui.drawarea != NULL && gui.drawarea->window != NULL)
#endif
{
#if GTK_CHECK_VERSION(3,4,0)
#if GTK_CHECK_VERSION(3,22,2)
GtkStyleContext * const context
= gtk_widget_get_style_context(gui.drawarea);
GtkCssProvider * const provider = gtk_css_provider_new();
gchar * const css = g_strdup_printf(
"widget#vim-gui-drawarea {\n"
" background-color: #%.2lx%.2lx%.2lx;\n"
"}\n",
(gui.back_pixel >> 16) & 0xff,
(gui.back_pixel >> 8) & 0xff,
gui.back_pixel & 0xff);
gtk_css_provider_load_from_data(provider, css, -1, NULL);
gtk_style_context_add_provider(context,
GTK_STYLE_PROVIDER(provider), G_MAXUINT);
g_free(css);
g_object_unref(provider);
#elif GTK_CHECK_VERSION(3,4,0) /* !GTK_CHECK_VERSION(3,22,2) */
GdkRGBA rgba;
rgba = color_to_rgba(gui.back_pixel);
@@ -4415,7 +4478,7 @@ gui_mch_new_colors(void)
# else
gdk_window_set_background(gui.drawarea->window, &color);
# endif
#endif /* !GTK_CHECK_VERSION(3,4,0) */
#endif /* !GTK_CHECK_VERSION(3,22,2) */
}
}
@@ -4429,6 +4492,26 @@ form_configure_event(GtkWidget *widget UNUSED,
{
int usable_height = event->height;
#if GTK_CHECK_VERSION(3,22,2)
/* As of 3.22.2, GdkWindows have started distributing configure events to
* their "native" children (https://git.gnome.org/browse/gtk+/commit/?h=gtk-3-22&id=12579fe71b3b8f79eb9c1b80e429443bcc437dd0).
*
* As can be seen from the implementation of move_native_children() and
* configure_native_child() in gdkwindow.c, those functions actually
* propagate configure events to every child, failing to distinguish
* "native" one from non-native one.
*
* Naturally, configure events propagated to here like that are fallacious
* and, as a matter of fact, they trigger a geometric collapse of
* gui.formwin.
*
* To filter out such fallacious events, check if the given event is the
* one that was sent out to the right place. Ignore it if not.
*/
if (event->window != gtk_widget_get_window(gui.formwin))
return TRUE;
#endif
/* When in a GtkPlug, we can't guarantee valid heights (as a round
* no. of char-heights), so we have to manually sanitise them.
* Widths seem to sort themselves out, don't ask me why.
@@ -4890,6 +4973,16 @@ gui_mch_set_shellsize(int width, int height,
gui_mch_get_screen_dimensions(int *screen_w, int *screen_h)
{
#ifdef HAVE_GTK_MULTIHEAD
# if GTK_CHECK_VERSION(3,22,2)
GdkRectangle rect;
GdkMonitor * const mon = gdk_display_get_monitor_at_window(
gtk_widget_get_display(gui.mainwin),
gtk_widget_get_window(gui.mainwin));
gdk_monitor_get_geometry(mon, &rect);
*screen_w = rect.width;
*screen_h = rect.height - p_ghr;
# else
GdkScreen* screen;
if (gui.mainwin != NULL && gtk_widget_has_screen(gui.mainwin))
@@ -4899,6 +4992,7 @@ gui_mch_get_screen_dimensions(int *screen_w, int *screen_h)
*screen_w = gdk_screen_get_width(screen);
*screen_h = gdk_screen_get_height(screen) - p_ghr;
# endif
#else
*screen_w = gdk_screen_width();
/* Subtract 'guiheadroom' from the height to allow some room for the
@@ -6626,11 +6720,15 @@ gui_mch_clear_block(int row1, int col1, int row2, int col2)
};
GdkWindow * const win = gtk_widget_get_window(gui.drawarea);
cairo_t * const cr = cairo_create(gui.surface);
# if GTK_CHECK_VERSION(3,22,2)
set_cairo_source_rgba_from_color(cr, gui.back_pixel);
# else
cairo_pattern_t * const pat = gdk_window_get_background_pattern(win);
if (pat != NULL)
cairo_set_source(cr, pat);
else
set_cairo_source_rgba_from_color(cr, gui.back_pixel);
# endif
gdk_cairo_rectangle(cr, &rect);
cairo_fill(cr);
cairo_destroy(cr);
@@ -6659,11 +6757,15 @@ gui_gtk_window_clear(GdkWindow *win)
0, 0, gdk_window_get_width(win), gdk_window_get_height(win)
};
cairo_t * const cr = cairo_create(gui.surface);
# if GTK_CHECK_VERSION(3,22,2)
set_cairo_source_rgba_from_color(cr, gui.back_pixel);
# else
cairo_pattern_t * const pat = gdk_window_get_background_pattern(win);
if (pat != NULL)
cairo_set_source(cr, pat);
else
set_cairo_source_rgba_from_color(cr, gui.back_pixel);
# endif
gdk_cairo_rectangle(cr, &rect);
cairo_fill(cr);
cairo_destroy(cr);
+9
View File
@@ -5768,6 +5768,7 @@ cin_is_cpp_namespace(char_u *s)
{
char_u *p;
int has_name = FALSE;
int has_name_start = FALSE;
s = cin_skipcomment(s);
if (STRNCMP(s, "namespace", 9) == 0 && (s[9] == NUL || !vim_iswordc(s[9])))
@@ -5786,10 +5787,18 @@ cin_is_cpp_namespace(char_u *s)
}
else if (vim_iswordc(*p))
{
has_name_start = TRUE;
if (has_name)
return FALSE; /* word character after skipping past name */
++p;
}
else if (p[0] == ':' && p[1] == ':' && vim_iswordc(p[2]))
{
if (!has_name_start || has_name)
return FALSE;
/* C++ 17 nested namespace */
p += 3;
}
else
{
return FALSE;
+2 -2
View File
@@ -5376,7 +5376,7 @@ mch_job_status(job_T *job)
return "run";
return_dead:
if (job->jv_status != JOB_ENDED)
if (job->jv_status < JOB_ENDED)
{
ch_log(job->jv_channel, "Job ended");
job->jv_status = JOB_ENDED;
@@ -5420,7 +5420,7 @@ mch_detect_ended_job(job_T *job_list)
job->jv_exitval = WEXITSTATUS(status);
else if (WIFSIGNALED(status))
job->jv_exitval = -1;
if (job->jv_status != JOB_ENDED)
if (job->jv_status < JOB_ENDED)
{
ch_log(job->jv_channel, "Job ended");
job->jv_status = JOB_ENDED;
+1 -1
View File
@@ -4978,7 +4978,7 @@ mch_job_status(job_T *job)
|| dwExitCode != STILL_ACTIVE)
{
job->jv_exitval = (int)dwExitCode;
if (job->jv_status != JOB_ENDED)
if (job->jv_status < JOB_ENDED)
{
ch_log(job->jv_channel, "Job ended");
job->jv_status = JOB_ENDED;
+6 -3
View File
@@ -3010,7 +3010,8 @@ win_line(
#endif
colnr_T trailcol = MAXCOL; /* start of trailing spaces */
#ifdef FEAT_LINEBREAK
int need_showbreak = FALSE;
int need_showbreak = FALSE; /* overlong line, skipping first x
chars */
#endif
#if defined(FEAT_SIGNS) || (defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)) \
|| defined(FEAT_SYN_HL) || defined(FEAT_DIFF)
@@ -3793,13 +3794,15 @@ win_line(
if (draw_state == WL_BRI - 1 && n_extra == 0)
{
draw_state = WL_BRI;
if (wp->w_p_bri && n_extra == 0 && row != startrow
/* if need_showbreak is set, breakindent also applies */
if (wp->w_p_bri && n_extra == 0
&& (row != startrow || need_showbreak)
# ifdef FEAT_DIFF
&& filler_lines == 0
# endif
)
{
char_attr = 0; /* was: hl_attr(HLF_AT); */
char_attr = 0;
# ifdef FEAT_DIFF
if (diff_hlf != (hlf_T)0)
{
+3 -1
View File
@@ -1421,11 +1421,13 @@ struct partial_S
dict_T *pt_dict; /* dict for "self" */
};
/* Status of a job. Order matters! */
typedef enum
{
JOB_FAILED,
JOB_STARTED,
JOB_ENDED
JOB_ENDED, /* detected job done */
JOB_FINISHED /* job done and cleanup done */
} jobstatus_T;
/*
+1 -1
View File
@@ -75,7 +75,6 @@ SCRIPTS_ALL = \
test108.out \
test_autocmd_option.out \
test_autoformat_join.out \
test_breakindent.out \
test_changelist.out \
test_close_count.out \
test_comparators.out \
@@ -141,6 +140,7 @@ NEW_TESTS = test_arglist.res \
test_assert.res \
test_autochdir.res \
test_backspace_opt.res \
test_breakindent.res \
test_bufwintabinfo.res \
test_cdo.res \
test_channel.res \
+12 -2
View File
@@ -89,7 +89,11 @@ endfunc
function RunTheTest(test)
echo 'Executing ' . a:test
if exists("*SetUp")
call SetUp()
try
call SetUp()
catch
call add(v:errors, 'Caught exception in SetUp() before ' . a:test . ': ' . v:exception . ' @ ' . v:throwpoint)
endtry
endif
call add(s:messages, 'Executing ' . a:test)
@@ -104,7 +108,11 @@ function RunTheTest(test)
endtry
if exists("*TearDown")
call TearDown()
try
call TearDown()
catch
call add(v:errors, 'Caught exception in TearDown() after ' . a:test . ': ' . v:exception . ' @ ' . v:throwpoint)
endtry
endif
" Close any extra windows and make the current one not modified.
@@ -221,3 +229,5 @@ call append(line('$'), s:messages)
write
qall!
" vim: shiftwidth=2 sts=2 expandtab
+20
View File
@@ -1932,6 +1932,26 @@ namespace test
{
111111111111111111;
}
namespace test::cpp17
{
111111111111111111;
}
namespace ::incorrectcpp17
{
111111111111111111;
}
namespace test::incorrectcpp17::
{
111111111111111111;
}
namespace test:incorrectcpp17
{
111111111111111111;
}
namespace test:::incorrectcpp17
{
111111111111111111;
}
namespace{
111111111111111111;
}
+20
View File
@@ -1730,6 +1730,26 @@ namespace test
{
111111111111111111;
}
namespace test::cpp17
{
111111111111111111;
}
namespace ::incorrectcpp17
{
111111111111111111;
}
namespace test::incorrectcpp17::
{
111111111111111111;
}
namespace test:incorrectcpp17
{
111111111111111111;
}
namespace test:::incorrectcpp17
{
111111111111111111;
}
namespace{
111111111111111111;
}
-122
View File
@@ -1,122 +0,0 @@
Test for breakindent
STARTTEST
:so small.vim
:if !exists("+breakindent") | e! test.ok | w! test.out | qa! | endif
:10new|:vsp|:vert resize 20
:put =\"\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP\"
:set ts=4 sw=4 sts=4 breakindent
:fu! ScreenChar(line, width)
: let c=''
: for i in range(1,a:width)
: let c.=nr2char(screenchar(a:line, i))
: endfor
: let c.="\n"
: for i in range(1,a:width)
: let c.=nr2char(screenchar(a:line+1, i))
: endfor
: let c.="\n"
: for i in range(1,a:width)
: let c.=nr2char(screenchar(a:line+2, i))
: endfor
: return c
:endfu
:fu DoRecordScreen()
: wincmd l
: $put =printf(\"\n%s\", g:test)
: $put =g:line1
: wincmd p
:endfu
:set briopt=min:0
:let g:test="Test 1: Simple breakindent"
:let line1=ScreenChar(line('.'),8)
:call DoRecordScreen()
:let g:test="Test 2: Simple breakindent + sbr=>>"
:set sbr=>>
:let line1=ScreenChar(line('.'),8)
:call DoRecordScreen()
:let g:test ="Test 3: Simple breakindent + briopt:sbr"
:set briopt=sbr,min:0 sbr=++
:let line1=ScreenChar(line('.'),8)
:call DoRecordScreen()
:let g:test ="Test 4: Simple breakindent + min width: 18"
:set sbr= briopt=min:18
:let line1=ScreenChar(line('.'),8)
:call DoRecordScreen()
:let g:test =" Test 5: Simple breakindent + shift by 2"
:set briopt=shift:2,min:0
:let line1=ScreenChar(line('.'),8)
:call DoRecordScreen()
:let g:test=" Test 6: Simple breakindent + shift by -1"
:set briopt=shift:-1,min:0
:let line1=ScreenChar(line('.'),8)
:call DoRecordScreen()
:let g:test=" Test 7: breakindent + shift by +1 + nu + sbr=? briopt:sbr"
:set briopt=shift:1,sbr,min:0 nu sbr=? nuw=4
:let line1=ScreenChar(line('.'),10)
:call DoRecordScreen()
:let g:test=" Test 8: breakindent + shift:1 + nu + sbr=# list briopt:sbr"
:set briopt=shift:1,sbr,min:0 nu sbr=# list
:let line1=ScreenChar(line('.'),10)
:call DoRecordScreen()
:let g:test=" Test 9: breakindent + shift by +1 + 'nu' + sbr=# list"
:set briopt-=sbr
:let line1=ScreenChar(line('.'),10)
:call DoRecordScreen()
:let g:test=" Test 10: breakindent + shift by +1 + 'nu' + sbr=~ cpo+=n"
:set cpo+=n sbr=~ nu nuw=4 nolist briopt=sbr,min:0
:let line1=ScreenChar(line('.'),10)
:call DoRecordScreen()
:wincmd p
:let g:test="\n Test 11: strdisplaywidth when breakindent is on"
:set cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4
:let text=getline(2) "skip leading tab when calculating text width
:let width = strlen(text[1:])+indent(2)*4+strlen(&sbr)*3 " text wraps 3 times
:$put =g:test
:$put =printf(\"strdisplaywidth: %d == calculated: %d\", strdisplaywidth(text), width)
:let g:str="\t\t\t\t\t{"
:let g:test=" Test 12: breakindent + long indent"
:wincmd p
:set all& breakindent linebreak briopt=min:10 nu numberwidth=3 ts=4
:$put =g:str
zt:let line1=ScreenChar(1,10)
:wincmd p
:call DoRecordScreen()
:"
:" Test, that the string " a\tb\tc\td\te" is correctly
:" displayed in a 20 column wide window (see bug report
:" https://groups.google.com/d/msg/vim_dev/ZOdg2mc9c9Y/TT8EhFjEy0IJ
:only
:vert 20new
:set all& nocp breakindent briopt=min:10
:call setline(1, [" a\tb\tc\td\te", " z y x w v"])
:/^\s*a
fbgjyl:let line1 = @0
:?^\s*z
fygjyl:let line2 = @0
:quit!
:$put ='Test 13: breakindent with wrapping Tab'
:$put =line1
:$put =line2
:"
:let g:test="Test 14: breakindent + visual blockwise delete #1"
:set all& breakindent viminfo+=nviminfo
:30vnew
:normal! 3a1234567890
:normal! a abcde
:exec "normal! 0\<C-V>tex"
:let line1=ScreenChar(line('.'),8)
:call DoRecordScreen()
:"
:let g:test="Test 15: breakindent + visual blockwise delete #2"
:%d
:normal! 4a1234567890
:exec "normal! >>\<C-V>3f0x"
:let line1=ScreenChar(line('.'),20)
:call DoRecordScreen()
:quit!
:"
:%w! test.out
:qa!
ENDTEST
dummy text
-74
View File
@@ -1,74 +0,0 @@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP
Test 1: Simple breakindent
abcd
qrst
GHIJ
Test 2: Simple breakindent + sbr=>>
abcd
>>qr
>>EF
Test 3: Simple breakindent + briopt:sbr
abcd
++ qrst
++ GHIJ
Test 4: Simple breakindent + min width: 18
abcd
qrstuv
IJKLMN
Test 5: Simple breakindent + shift by 2
abcd
qr
EF
Test 6: Simple breakindent + shift by -1
abcd
qrstu
HIJKL
Test 7: breakindent + shift by +1 + nu + sbr=? briopt:sbr
2 ab
? m
? x
Test 8: breakindent + shift:1 + nu + sbr=# list briopt:sbr
2 ^Iabcd
# opq
# BCD
Test 9: breakindent + shift by +1 + 'nu' + sbr=# list
2 ^Iabcd
#op
#AB
Test 10: breakindent + shift by +1 + 'nu' + sbr=~ cpo+=n
2 ab
~ mn
~ yz
Test 11: strdisplaywidth when breakindent is on
strdisplaywidth: 46 == calculated: 64
{
Test 12: breakindent + long indent
56
~
Test 13: breakindent with wrapping Tab
d
w
Test 14: breakindent + visual blockwise delete #1
e
~
~
Test 15: breakindent + visual blockwise delete #2
1234567890
~
~
+241
View File
@@ -0,0 +1,241 @@
" Test for breakindent
"
" Note: if you get strange failures when adding new tests, it might be that
" while the test is run, the breakindent cacheing gets in its way.
" It helps to change the tabastop setting and force a redraw (e.g. see
" Test_breakindent08())
if !exists('+breakindent')
finish
endif
let s:input ="\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP"
function s:screenline(lnum, width) abort
" always get 4 screen lines
redraw!
let line = []
for j in range(3)
for c in range(1, a:width)
call add(line, nr2char(screenchar(a:lnum+j, c)))
endfor
call add(line, "\n")
endfor
return join(line, '')
endfunction
function s:testwindows(...)
10new
vsp
vert resize 20
setl ts=4 sw=4 sts=4 breakindent
put =s:input
if a:0
exe a:1
endif
endfunction
function s:close_windows(...)
bw!
if a:0
exe a:1
endif
unlet! g:line g:expect
endfunction
function Test_breakindent01()
" simple breakindent test
call s:testwindows('setl briopt=min:0')
let g:line=s:screenline(line('.'),8)
let g:expect=" abcd\n qrst\n GHIJ\n"
call assert_equal(g:expect, g:line)
call s:close_windows()
endfunction
function Test_breakindent02()
" simple breakindent test with showbreak set
call s:testwindows('setl briopt=min:0 sbr=>>')
let g:line=s:screenline(line('.'),8)
let g:expect=" abcd\n >>qr\n >>EF\n"
call assert_equal(g:expect, g:line)
call s:close_windows('set sbr=')
endfunction
function Test_breakindent03()
" simple breakindent test with showbreak set and briopt including sbr
call s:testwindows('setl briopt=sbr,min:0 sbr=++')
let g:line=s:screenline(line('.'),8)
let g:expect=" abcd\n++ qrst\n++ GHIJ\n"
call assert_equal(g:expect, g:line)
" clean up
call s:close_windows('set sbr=')
endfunction
function Test_breakindent04()
" breakindent set with min width 18
call s:testwindows('setl sbr= briopt=min:18')
let g:line=s:screenline(line('.'),8)
let g:expect=" abcd\n qrstuv\n IJKLMN\n"
call assert_equal(g:expect, g:line)
" clean up
call s:close_windows('set sbr=')
endfunction
function Test_breakindent05()
" breakindent set and shift by 2
call s:testwindows('setl briopt=shift:2,min:0')
let g:line=s:screenline(line('.'),8)
let g:expect=" abcd\n qr\n EF\n"
call assert_equal(g:expect, g:line)
call s:close_windows()
endfunction
function Test_breakindent06()
" breakindent set and shift by -1
call s:testwindows('setl briopt=shift:-1,min:0')
let g:line=s:screenline(line('.'),8)
let g:expect=" abcd\n qrstu\n HIJKL\n"
call assert_equal(g:expect, g:line)
call s:close_windows()
endfunction
function Test_breakindent07()
" breakindent set and shift by 1, Number set sbr=? and briopt:sbr
call s:testwindows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4 cpo+=n')
let g:line=s:screenline(line('.'),10)
let g:expect=" 2 ab\n? m\n? x\n"
call assert_equal(g:expect, g:line)
" clean up
call s:close_windows('set sbr= cpo-=n')
endfunction
function Test_breakindent07a()
" breakindent set and shift by 1, Number set sbr=? and briopt:sbr
call s:testwindows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4')
let g:line=s:screenline(line('.'),10)
let g:expect=" 2 ab\n ? m\n ? x\n"
call assert_equal(g:expect, g:line)
" clean up
call s:close_windows('set sbr=')
endfunction
function Test_breakindent08()
" breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
call s:testwindows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list cpo+=n ts=4')
" make sure, cache is invalidated!
set ts=8
redraw!
set ts=4
redraw!
let g:line=s:screenline(line('.'),10)
let g:expect=" 2 ^Iabcd\n# opq\n# BCD\n"
call assert_equal(g:expect, g:line)
call s:close_windows('set sbr= cpo-=n')
endfunction
function Test_breakindent08a()
" breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
call s:testwindows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list')
let g:line=s:screenline(line('.'),10)
let g:expect=" 2 ^Iabcd\n # opq\n # BCD\n"
call assert_equal(g:expect, g:line)
call s:close_windows('set sbr=')
endfunction
function Test_breakindent09()
" breakindent set and shift by 1, Number and list set sbr=#
call s:testwindows('setl briopt=shift:1,min:0 nu nuw=4 sbr=# list')
let g:line=s:screenline(line('.'),10)
let g:expect=" 2 ^Iabcd\n #op\n #AB\n"
call assert_equal(g:expect, g:line)
call s:close_windows('set sbr=')
endfunction
function Test_breakindent10()
" breakindent set, Number set sbr=~
call s:testwindows('setl cpo+=n sbr=~ nu nuw=4 nolist briopt=sbr,min:0')
" make sure, cache is invalidated!
set ts=8
redraw!
set ts=4
redraw!
let g:line=s:screenline(line('.'),10)
let g:expect=" 2 ab\n~ mn\n~ yz\n"
call assert_equal(g:expect, g:line)
call s:close_windows('set sbr= cpo-=n')
endfunction
function Test_breakindent11()
" test strdisplaywidth()
call s:testwindows('setl cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4')
let text=getline(2)
let width = strlen(text[1:])+indent(2)+strlen(&sbr)*3 " text wraps 3 times
call assert_equal(width, strdisplaywidth(text))
call s:close_windows('set sbr=')
endfunction
function Test_breakindent12()
" test breakindent with long indent
let s:input="\t\t\t\t\t{"
call s:testwindows('setl breakindent linebreak briopt=min:10 nu numberwidth=3 ts=4 list listchars=tab:>-')
let g:line=s:screenline(2,16)
let g:expect=" 2 >--->--->--->\n ---{ \n~ \n"
call assert_equal(g:expect, g:line)
call s:close_windows('set nuw=4 listchars=')
endfunction
function Test_breakindent13()
let s:input=""
call s:testwindows('setl breakindent briopt=min:10 ts=8')
vert resize 20
call setline(1, [" a\tb\tc\td\te", " z y x w v"])
1
norm! fbgj"ayl
2
norm! fygj"byl
call assert_equal('d', @a)
call assert_equal('w', @b)
call s:close_windows()
endfunction
function Test_breakindent14()
let s:input=""
call s:testwindows('setl breakindent briopt= ts=8')
vert resize 30
norm! 3a1234567890
norm! a abcde
exec "norm! 0\<C-V>tex"
let g:line=s:screenline(line('.'),8)
let g:expect="e \n~ \n~ \n"
call assert_equal(g:expect, g:line)
call s:close_windows()
endfunction
function Test_breakindent15()
let s:input=""
call s:testwindows('setl breakindent briopt= ts=8 sw=8')
vert resize 30
norm! 4a1234567890
exe "normal! >>\<C-V>3f0x"
let g:line=s:screenline(line('.'),20)
let g:expect=" 1234567890 \n~ \n~ \n"
call assert_equal(g:expect, g:line)
call s:close_windows()
endfunction
function Test_breakindent16()
" Check that overlong lines are indented correctly.
" TODO: currently it does not fail even when the bug is not fixed.
let s:input=""
call s:testwindows('setl breakindent briopt=min:0 ts=4')
call setline(1, "\t".repeat("1234567890", 10))
resize 6
norm! 1gg$
redraw!
let g:line=s:screenline(1,10)
let g:expect=" 123456\n 789012\n 345678\n"
call assert_equal(g:expect, g:line)
let g:line=s:screenline(4,10)
let g:expect=" 901234\n 567890\n 123456\n"
call assert_equal(g:expect, g:line)
call s:close_windows()
endfunction
+26
View File
@@ -1232,6 +1232,32 @@ func Test_out_cb_lambda()
endtry
endfunc
func Test_close_and_exit_cb()
if !has('job')
return
endif
call ch_log('Test_close_and_exit_cb')
let dict = {'ret': {}}
func dict.close_cb(ch) dict
let self.ret['close_cb'] = job_status(ch_getjob(a:ch))
endfunc
func dict.exit_cb(job, status) dict
let self.ret['exit_cb'] = job_status(a:job)
endfunc
let g:job = job_start('echo', {
\ 'close_cb': dict.close_cb,
\ 'exit_cb': dict.exit_cb,
\ })
call assert_equal('run', job_status(g:job))
unlet g:job
call WaitFor('len(dict.ret) >= 2')
call assert_equal(2, len(dict.ret))
call assert_match('^\%(dead\|run\)', dict.ret['close_cb'])
call assert_equal('dead', dict.ret['exit_cb'])
endfunc
""""""""""
let g:Ch_unletResponse = ''
+24 -33
View File
@@ -77,17 +77,8 @@ func s:doc_config_teardown()
endif
endfunc
func s:get_cmd_compl_list(cmd)
let list = []
let str = ''
for cnt in range(1, 999)
call feedkeys(a:cmd . repeat("\<Tab>", cnt) . "'\<C-B>let str='\<CR>", 'tx')
if str ==# a:cmd[1:]
break
endif
call add(list, str)
endfor
return list
func s:get_help_compl_list(cmd)
return getcompletion(a:cmd, 'help')
endfunc
func Test_help_complete()
@@ -99,49 +90,49 @@ func Test_help_complete()
if has('multi_lang')
set helplang=
endif
let list = s:get_cmd_compl_list(":h test")
call assert_equal(['h test-col', 'h test-char'], list)
let list = s:get_help_compl_list("test")
call assert_equal(['test-col', 'test-char'], list)
if has('multi_lang')
" 'helplang=ab' and help file lang is 'en'
set helplang=ab
let list = s:get_cmd_compl_list(":h test")
call assert_equal(['h test-col', 'h test-char'], list)
let list = s:get_help_compl_list("test")
call assert_equal(['test-col', 'test-char'], list)
" 'helplang=' and help file lang is 'en' and 'ab'
set rtp+=Xdir1/doc-ab
set helplang=
let list = s:get_cmd_compl_list(":h test")
call assert_equal(sort(['h test-col@en', 'h test-col@ab',
\ 'h test-char@en', 'h test-char@ab']), sort(list))
let list = s:get_help_compl_list("test")
call assert_equal(sort(['test-col@en', 'test-col@ab',
\ 'test-char@en', 'test-char@ab']), sort(list))
" 'helplang=ab' and help file lang is 'en' and 'ab'
set helplang=ab
let list = s:get_cmd_compl_list(":h test")
call assert_equal(sort(['h test-col', 'h test-col@en',
\ 'h test-char', 'h test-char@en']), sort(list))
let list = s:get_help_compl_list("test")
call assert_equal(sort(['test-col', 'test-col@en',
\ 'test-char', 'test-char@en']), sort(list))
" 'helplang=' and help file lang is 'en', 'ab' and 'ja'
set rtp+=Xdir1/doc-ja
set helplang=
let list = s:get_cmd_compl_list(":h test")
call assert_equal(sort(['h test-col@en', 'h test-col@ab',
\ 'h test-col@ja', 'h test-char@en',
\ 'h test-char@ab', 'h test-char@ja']), sort(list))
let list = s:get_help_compl_list("test")
call assert_equal(sort(['test-col@en', 'test-col@ab',
\ 'test-col@ja', 'test-char@en',
\ 'test-char@ab', 'test-char@ja']), sort(list))
" 'helplang=ab' and help file lang is 'en', 'ab' and 'ja'
set helplang=ab
let list = s:get_cmd_compl_list(":h test")
call assert_equal(sort(['h test-col', 'h test-col@en',
\ 'h test-col@ja', 'h test-char',
\ 'h test-char@en', 'h test-char@ja']), sort(list))
let list = s:get_help_compl_list("test")
call assert_equal(sort(['test-col', 'test-col@en',
\ 'test-col@ja', 'test-char',
\ 'test-char@en', 'test-char@ja']), sort(list))
" 'helplang=ab,ja' and help file lang is 'en', 'ab' and 'ja'
set helplang=ab,ja
let list = s:get_cmd_compl_list(":h test")
call assert_equal(sort(['h test-col', 'h test-col@ja',
\ 'h test-col@en', 'h test-char',
\ 'h test-char@ja', 'h test-char@en']), sort(list))
let list = s:get_help_compl_list("test")
call assert_equal(sort(['test-col', 'test-col@ja',
\ 'test-col@en', 'test-char',
\ 'test-char@ja', 'test-char@en']), sort(list))
endif
catch
call assert_exception('X')
+12
View File
@@ -779,6 +779,18 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
92,
/**/
91,
/**/
90,
/**/
89,
/**/
88,
/**/
87,
/**/
86,
/**/