Compare commits

...

74 Commits

Author SHA1 Message Date
Kazuki Sakamoto 67c67d1bd2 MacVim Snapshot 126
Binary targets macOS 10.8+

- Vim patch 8.0.0297

Script interfaces have compatibility with these versions

- Lua 5.2
- Perl 5.16
- Python2 2.7
- Python3 3.6
- Ruby 2.0
2017-02-03 07:45:19 -08:00
Kazuki Sakamoto 54e5082d7c Merge remote-tracking branch 'vim/master' 2017-02-02 18:06:17 -08:00
Bram Moolenaar 03ff9bcbc9 patch 8.0.0297: double free on exit when using a closure
Problem:    Double free on exit when using a closure. (James McCoy)
Solution:   Split free_al_functions in two parts. (closes #1428)
2017-02-02 22:59:27 +01:00
Bram Moolenaar fd8983b09c patch 8.0.0296: bracketed paste can only append, not insert
Problem:    Bracketed paste can only append, not insert.
Solution:   When the cursor is in the first column insert the text.
2017-02-02 22:21:29 +01:00
Bram Moolenaar 7a073549a3 patch 8.0.0295: test_viml hangs
Problem:    test_viml hangs.
Solution:   Put resetting 'more' before sourcing the script.
2017-02-01 23:17:36 +01:00
Bram Moolenaar 79da563cf9 patch 8.0.0294: argument list is not stored correctly in a session file
Problem:    Argument list is not stored correctly in a session file.
            (lgpasquale)
Solution:   Use "$argadd" instead of "argadd". (closes #1434)
2017-02-01 22:52:44 +01:00
Bram Moolenaar e5f2a075e3 patch 8.0.0293: some tests have a one or three second wait
Problem:    Some tests have a one or three second wait.
Solution:   Reset the 'showmode' option.  Use a test time of one to disable
            sleep after an error or warning message.
2017-02-01 22:31:49 +01:00
Bram Moolenaar a2f28859bf patch 8.0.0292: the stat test is a bit slow
Problem:    The stat test is a bit slow.
Solution:   Remove a couple of sleep comments and reduce another.
2017-02-01 22:05:28 +01:00
Bram Moolenaar 23fa81d222 patch 8.0.0291: Visual block insertion does not insert in all lines
Problem:    Visual block insertion does not insert in all lines.
Solution:   Don't bail out of insert too early. Add a test. (Christian
            Brabandt, closes #1290)
2017-02-01 21:50:21 +01:00
Bram Moolenaar 04e87b72c5 patch 8.0.0290: cursor positioning wrong if wide character wraps
Problem:    If a wide character doesn't fit at the end of the screen line, and
            the line doesn't fit on the screen, then the cursor position may
            be wrong. (anliting)
Solution:   Don't skip over wide character. (Christian Brabandt, closes #1408)
2017-02-01 21:23:10 +01:00
Bram Moolenaar 21d7c9b601 patch 8.0.0289: no test for "ga" and :ascii
Problem:    No test for "ga" and :ascii.
Solution:   Add a test. (Dominique Pelle, closes #1429)
2017-02-01 20:53:38 +01:00
Bram Moolenaar 4e032e1b17 patch 8.0.0288: errors reported while running tests
Problem:    Errors reported while running tests.
Solution:   Put comma in the right place.
2017-02-01 20:48:13 +01:00
Bram Moolenaar c7d9eacefa patch 8.0.0287: debug mode: cannot access function arguments
Problem:    Cannot access the arguments of the current function in debug mode.
            (Luc Hermitte)
Solution:   use get_funccal(). (Lemonboy, closes #1432, closes #1352)
2017-02-01 20:26:51 +01:00
Kazuki Sakamoto 88f75a70df MacVim Snapshot 125
Binary targets macOS 10.8+

- Vim patch 8.0.0286

Script interfaces have compatibility with these versions

- Lua 5.2
- Perl 5.16
- Python2 2.7
- Python3 3.6
- Ruby 2.0
2017-02-01 09:43:37 -08:00
Kazuki Sakamoto ed465e81f9 Revert "MacVim Snapshot 125"
This reverts commit b9818a953c.
2017-02-01 09:43:12 -08:00
Kazuki Sakamoto 648ec8d5f2 Merge remote-tracking branch 'vim/master' 2017-02-01 09:42:23 -08:00
Bram Moolenaar c10f0e7cb0 patch 8.0.0286: not always redrawing after screen resize
Problem:    When concealing is active and the screen is resized in the GUI it
            is not immediately redrawn.
Solution:   Use update_prepare() and update_finish() from
            update_single_line().
2017-02-01 18:37:14 +01:00
Bram Moolenaar c386267ffe patch 8.0.0285: tests fail with tiny build on Unix
Problem:    Tests fail with tiny build on Unix.
Solution:   Only set g:tester_HOME when build with the +eval feature.
2017-02-01 18:07:38 +01:00
Bram Moolenaar b245559fa9 patch 8.0.0284: collapse buffers test failed once
Problem:    The Test_collapse_buffers() test failed once, looks like it is
            flaky.
Solution:   Add it to the list of flaky tests.
2017-02-01 18:00:13 +01:00
Bram Moolenaar e90858d022 patch 8.0.0283: mode() does not indicate Insert mode completion
Problem:    The return value of mode() does not indicate that completion is
            active in Replace and Insert mode. (Zhen-Huan (Kenny) Hu)
Solution:   Add "c" or "x" for two kinds of completion. (Yegappan Lakshmanan,
            closes #1397)  Test some more modes.
2017-02-01 17:24:34 +01:00
Kazuki Sakamoto b9818a953c MacVim Snapshot 125
Binary targets macOS 10.8+

- Vim patch 8.0.0282

Script interfaces have compatibility with these versions

- Lua 5.2
- Perl 5.16
- Python2 2.7
- Python3 3.6
- Ruby 2.0
2017-02-01 08:04:58 -08:00
Kazuki Sakamoto a8c5796d0d Merge remote-tracking branch 'vim/master' 2017-02-01 08:04:11 -08:00
Bram Moolenaar 0b5c93a7f2 patch 8.0.0282: need to use CTRL-O twice when in Visual-Insert mode
Problem:    When doing a Visual selection and using "I" to go to insert mode,
            CTRL-O needs to be used twice to go to Normal mode. (Coacher)
Solution:   Check for the return value of edit(). (Christian Brabandt,
            closes #1290)
2017-02-01 15:03:30 +01:00
Bram Moolenaar 1266d678bf patch 8.0.0281: some files are still using ARGSUSED instead of UNUSED
Problem:    MS-Windows files are still using ARGSUSED while most other files
            have UNUSED.
Solution:   Change ARGSUSED to UNUSED or delete it.
2017-02-01 13:43:36 +01:00
Bram Moolenaar 7c23d1d9d9 patch 8.0.0280: problem setting multi-byte environment var on MS-Windows
Problem:    On MS-Windows setting an environment variable with multi-byte
            strings does not work well.
Solution:   Use wputenv when possible. (Taro Muraoka, Ken Takata)
2017-02-01 13:14:16 +01:00
Bram Moolenaar 168dd00f72 patch 8.0.0279: MSVC 2015 uses a different dll name
Problem:    With MSVC 2015 the dll name is vcruntime140.dll.
Solution:   Check the MSVC version and use the right dll name. (Ken Takata)
2017-02-01 13:02:47 +01:00
Bram Moolenaar f1ab9c1370 patch 8.0.0278: GUI test fails on MS-Windows
Problem:    GUI test fails on MS-Windows.
Solution:   Check that tester_HOME exists.
2017-02-01 12:32:58 +01:00
Bram Moolenaar 56e6bd7ba2 patch 8.0.0277: the GUI test may trigger fontconfig and take a long time
Problem:    The GUI test may trigger fontconfig and take a long time.
Solution:   Set $XDG_CACHE_HOME. (Kazunobu Kuriyama)
2017-02-01 12:08:47 +01:00
Bram Moolenaar 3954e3c4b5 patch 8.0.0276: unnecessary #ifdefs
Problem:    Checking for FEAT_GUI_GNOME inside GTK 3 code is unnecessary.
Solution:   Remove the #ifdef. (Kazunobu Kuriyama)
2017-02-01 11:50:09 +01:00
Bram Moolenaar e3caa11090 patch 8.0.0275: the screen may be updated at the wrong time
Problem:    When checking for CTRL-C typed the GUI may detect a screen resize
            and redraw the screen, causing trouble.
Solution:   Set updating_screen in ui_breakcheck().
2017-01-31 22:07:42 +01:00
Bram Moolenaar 070b33da93 patch 8.0.0274: possible recursive screen updating causes trouble
Problem:    When update_single_line() is called recursively, or another screen
            update happens while it is busy, errors may occur.
Solution:   Check and update updating_screen. (Christian Brabandt)
2017-01-31 21:53:39 +01:00
Kazuki Sakamoto 3df2134ed1 Merge pull request #447 from macvim-dev/CFBundleShortVersionString
Set Info.plist CFBundleShortVersionString via configure
2017-01-30 14:03:06 -08:00
Bram Moolenaar c4a249a736 patch 8.0.0273: dead code detected by Coverity
Problem:    Dead code detected by Coverity when not using gnome.
Solution:   Rearrange the #ifdefs to avoid dead code.
2017-01-30 22:56:48 +01:00
Bram Moolenaar 432c839ebd patch 8.0.0272: crash on exit is not detected when running tests
Problem:    Crash on exit is not detected when running tests.
Solution:   Remove the dash before the command. (Dominique Pelle, closes
            #1425)
2017-01-30 22:01:01 +01:00
Kazuki Sakamoto f0b4353248 Set Info.plist CFBundleShortVersionString via configure
Close #436
2017-01-30 11:11:24 -08:00
Kazuki Sakamoto a311d0da6f Merge remote-tracking branch 'vim/master' 2017-01-29 20:44:34 -08:00
Bram Moolenaar a4c906a4a1 patch 8.0.0271: may get ml_get error when :tcldo deletes lines
Problem:    May get ml_get error when :tcldo deletes lines or switches to
            another buffer. (Nikolai Pavlov, closes #1421)
Solution:   Check the buffer and line every time.
2017-01-29 23:26:37 +01:00
Bram Moolenaar c593fee0e5 patch 8.0.0270: may get ml_get error when :rubydo deletes lines
Problem:    May get ml_get error when :rubydo deletes lines or switches to
            another buffer. (Nikolai Pavlov, issue #1421)
Solution:   Check the buffer and line every time.
2017-01-29 23:11:25 +01:00
Bram Moolenaar 85b5743d3e patch 8.0.0269: may get ml_get error when :perldo deletes lines
Problem:    May get ml_get error when :perldo deletes lines or switches to
            another buffer. (Nikolai Pavlov, issue #1421)
Solution:   Check the buffer and line every time.
2017-01-29 22:59:12 +01:00
Bram Moolenaar d58f03b1c2 patch 8.0.0268: may get ml_get error when :luado deletes lines
Problem:    May get ml_get error when :luado deletes lines or switches to
            another buffer. (Nikolai Pavlov, issue #1421)
Solution:   Check the buffer and line every time.
2017-01-29 22:48:45 +01:00
Bram Moolenaar 6fe2eb43d2 patch 8.0.0267: channel test sometimes fails on Mac
Problem:    A channel test sometimes fails on Mac.
Solution:   Add the test to the list of flaky tests.
2017-01-29 21:49:51 +01:00
Bram Moolenaar c625155ea4 patch 8.0.0266: compiler warning for using uninitialized variable
Problem:    Compiler warning for using uninitialized variable.
Solution:   Set tab_number also when there is an error.
2017-01-29 21:42:20 +01:00
Bram Moolenaar a58883b4ea patch 8.0.0265: may get ml_get error when :pydo deletes lines
Problem:    May get ml_get error when :pydo deletes lines or switches to
            another buffer. (Nikolai Pavlov, issue #1421)
Solution:   Check the buffer and line every time.
2017-01-29 21:31:09 +01:00
Bram Moolenaar d297f35eb0 patch 8.0.0264: memory error reported by ubsan
Problem:    Memory error reported by ubsan, probably for using the string
            returned by execute().
Solution:   NUL terminate the result of execute().
2017-01-29 20:31:21 +01:00
Bram Moolenaar 80627cf51f patch 8.0.0263: Farsi support is not tested enough
Problem:    Farsi support is not tested enough.
Solution:   Add more tests for Farsi.  Clean up the code.
2017-01-29 19:59:39 +01:00
Bram Moolenaar ddf662a1c8 patch 8.0.0262: Farsi support is barely tested
Problem:    Farsi support is barely tested.
Solution:   Add more tests for Farsi.  Clean up the code.
2017-01-29 17:59:12 +01:00
Bram Moolenaar 24c2e48ef8 patch 8.0.0261: not enough test coverage for eval functions
Problem:    Not enough test coverage for eval functions.
Solution:   Add more tests. (Dominique Pelle, closes #1420)
2017-01-29 15:45:12 +01:00
Bram Moolenaar dea2570740 patch 8.0.0260: build fails with tiny features
Problem:    Build fails with tiny features.
Solution:   Move get_tabpage_arg() inside #ifdef.
2017-01-29 15:18:10 +01:00
Bram Moolenaar 2f72c70657 patch 8.0.0259: tab commands do not handle count correctly
Problem:    Tab commands do not handle count correctly. (Ken Hamada)
Solution:   Add ADDR_TABS_RELATIVE. (Hirohito Higashi)
2017-01-29 14:48:10 +01:00
Bram Moolenaar c9b56b2ceb patch 8.0.0258: mksession test leaves file behind
Problem:    mksession test leaves file behind.
Solution:   Delete the file.  Rename files to start with "X".
2017-01-29 14:14:09 +01:00
Kazuki Sakamoto 7b046c06fa Merge remote-tracking branch 'vim/master' 2017-01-28 19:55:38 -08:00
Bram Moolenaar e0b66da691 patch 8.0.0257: test file missing in distribution
Problem:    The keyword test file is not included in the archive.
Solution:   Update the list of files.
2017-01-28 18:42:56 +01:00
Bram Moolenaar 690afe1fef Update runtime files. 2017-01-28 18:34:47 +01:00
Bram Moolenaar 3a29abcb61 patch 8.0.0256: missing changes to one file breaks test
Problem:    Tests fail because some changes were not included.
Solution:   Add changes to evalfunc.c
2017-01-28 18:31:41 +01:00
Bram Moolenaar f13e00b2cf patch 8.0.0255: setpos() does not use the buffer argument for all marks
Problem:    When calling setpos() with a buffer argument it often is ignored.
            (Matthew Malcomson)
Solution:   Make the buffer argument work for all marks local to a buffer.
            (neovim #5713)  Add more tests.
2017-01-28 18:23:54 +01:00
Bram Moolenaar c7b831ca15 patch 8.0.0254: error message of assert functions is sometimes incomplete
Problem:    When using an assert function one can either specify a message or
            get a message about what failed, not both.
Solution:   Concatenate the error with the message.
2017-01-28 18:08:12 +01:00
Bram Moolenaar 36ae89c550 patch 8.0.0253: error when loading session if winminheight is 2
Problem:    When creating a session when winminheight is 2 or larger and
            loading that session gives an error.
Solution:   Also set winminheight before setting winheight to 1. (Rafael
            Bodill, neovim #5717)
2017-01-28 17:11:14 +01:00
Bram Moolenaar 4019cf90b8 patch 8.0.0252: not properly recognizing word characters between 128 and 255
Problem:    Characters below 256 that are not one byte are not always
            recognized as word characters.
Solution:   Make vim_iswordc() and vim_iswordp() work the same way. Add a test
            for this. (Ozaki Kiichi)
2017-01-28 16:39:34 +01:00
Bram Moolenaar f42dd3c390 patch 8.0.0251: not easy to select Python 2 or 3
Problem:    It is not so easy to write a script that works with both Python 2
            and Python 3, even when the Python code works with both.
Solution:   Add 'pyxversion', :pyx, etc. (Marc Weber, Ken Takata)
2017-01-28 16:06:38 +01:00
Bram Moolenaar 0c0590d982 patch 8.0.0250: virtcol() does not work well for multi-byte characters
Problem:    When virtcol() gets a column that is not the first byte of a
            multi-byte character the result is unpredictable. (Christian
            Ludwig)
Solution:   Correct the column to the first byte of a multi-byte character.
            Change the utf-8 test to new style.
2017-01-28 13:48:10 +01:00
Bram Moolenaar 4bc2f2e9fd patch 8.0.0249: CI failure when a submit is close to previous one
Problem:    When two submits happen quick after each other, the tests for the
            first one may error out.
Solution:   Use a git depth of 10 instead of 1. (Christian Brabandt)
2017-01-27 22:20:13 +01:00
Bram Moolenaar 45600ce8f2 patch 8.0.0248: vim_strcat() cannot handle overlapping arguments
Problem:    vim_strcat() cannot handle overlapping arguments.
Solution:   Use mch_memmove() instead of strcpy(). (Justin M Keyes,
            closes #1415)
2017-01-27 21:54:07 +01:00
Bram Moolenaar aed6d0b81a patch 8.0.0247: need to type Ctrl-N twice to select a completion
Problem:    Under some circumstances, one needs to type Ctrl-N or Ctrl-P twice
            to have a menu entry selected. (Lifepillar)
Solution:   call ins_compl_free(). (Christian Brabandt, closes #1411)
2017-01-27 21:48:54 +01:00
Bram Moolenaar 3a118be150 patch 8.0.0246: compiler warnings for int to pointer conversion
Problem:    Compiler warnings for int to pointer conversion.
Solution:   Fix macro for mch_memmove(). (John Marriott)
2017-01-27 21:22:19 +01:00
Bram Moolenaar 16038d50c4 patch 8.0.0245: zh_CN.cp936.po has a conversion error
Problem:    The generated zh_CN.cp936.po message file is not encoded properly.
Solution:   Instead of using zh_CN.po as input, use zh_CN.UTF-8.po.
2017-01-27 20:37:49 +01:00
Bram Moolenaar d9c60648e5 patch 8.0.0244: making t_BE empty only has an effect before startup
Problem:    When the user sets t_BE empty after startup to disable bracketed
            paste, this has no direct effect.
Solution:   When t_BE is made empty write t_BD.  When t_BE is made non-empty
            write the new value.
2017-01-27 20:03:18 +01:00
Kazuki Sakamoto 8a17c52926 Merge remote-tracking branch 'vim/master' 2017-01-26 21:30:06 -08:00
Bram Moolenaar cc5b22b3bf patch 8.0.0243: tolower() does not work if the byte count changes
Problem:    When making a character lower case with tolower() changes the byte
            cound, it is not made lower case.
Solution:   Add strlow_save(). (Dominique Pelle, closes #1406)
2017-01-26 22:51:56 +01:00
Bram Moolenaar 65c836e600 patch 8.0.0242: no tests for user command completion
Problem:    Completion of user defined functions is not covered by tests.
Solution:   Add tests.  Also test various errors of user-defined commands.
            (Dominique Pelle, closes #1413)
2017-01-26 22:07:33 +01:00
Bram Moolenaar 52c0de1de1 patch 8.0.0241: fallback implementation of mch_memmove is unused
Problem:    Vim defines a mch_memmove() function but it doesn't work, thus is
            always unused.
Solution:   Remove the mch_memmove implementation. (suggested by Dominique
            Pelle)
2017-01-26 21:36:34 +01:00
Bram Moolenaar 4f7090b93d patch 8.0.0240: failure with one build on CI
Problem:    The clang build on CI fails with one configuration.
Solution:   Redo a previous patch that was accidentally reverted.
2017-01-26 21:24:02 +01:00
Bram Moolenaar 1e07633a5d patch 8.0.0239: no CI with an address sanitizer
Problem:    The address sanitizer sometimes finds errors, but it needs to be
            run manually.
Solution:   Add an environment to Travis with clang and the address sanitizer.
            (Christian Brabandt)  Also include changes only on github.
2017-01-26 20:11:12 +01:00
Kazuki Sakamoto a27eb06c50 Merge remote-tracking branch 'vim/master' 2017-01-25 20:57:50 -08:00
Bram Moolenaar 9e817c8a31 patch 8.0.0238: bracketed paste does not disable autoindent
Problem:    When using bracketed paste autoindent causes indent to be
            increased.
Solution:   Disable 'ai' and set 'paste' temporarily. (Ken Takata)
2017-01-25 21:36:17 +01:00
109 changed files with 3521 additions and 1199 deletions
+1
View File
@@ -81,6 +81,7 @@ src/testdir/viminfo
src/memfile_test
src/json_test
src/message_test
src/kword_test
# From MacVim
.*.swp
+2
View File
@@ -45,6 +45,7 @@ SRC_ALL = \
src/hashtab.c \
src/json.c \
src/json_test.c \
src/kword_test.c \
src/list.c \
src/keymap.h \
src/macros.h \
@@ -122,6 +123,7 @@ SRC_ALL = \
src/testdir/pythonx/topmodule/submodule/subsubmodule/subsubsubmodule.py \
src/testdir/python_after/*.py \
src/testdir/python_before/*.py \
src/testdir/pyxfile/*.py \
src/testdir/bench*.in \
src/testdir/bench*.vim \
src/testdir/samples/*.txt \
+41 -17
View File
@@ -1,4 +1,4 @@
*eval.txt* For Vim version 8.0. Last change: 2017 Jan 14
*eval.txt* For Vim version 8.0. Last change: 2017 Jan 28
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -2222,8 +2222,8 @@ matchstr({expr}, {pat}[, {start}[, {count}]])
String {count}'th match of {pat} in {expr}
matchstrpos({expr}, {pat}[, {start}[, {count}]])
List {count}'th match of {pat} in {expr}
max({list}) Number maximum value of items in {list}
min({list}) Number minimum value of items in {list}
max({expr}) Number maximum value of items in {expr}
min({expr}) Number minimum value of items in {expr}
mkdir({name} [, {path} [, {prot}]])
Number create directory {name}
mode([expr]) String current editing mode
@@ -2239,6 +2239,7 @@ printf({fmt}, {expr1}...) String format text
pumvisible() Number whether popup menu is visible
pyeval({expr}) any evaluate |Python| expression
py3eval({expr}) any evaluate |python3| expression
pyxeval({expr}) any evaluate |python_x| expression
range({expr} [, {max} [, {stride}]])
List items from {expr} to {max}
readfile({fname} [, {binary} [, {max}]])
@@ -4171,6 +4172,10 @@ getchar([expr]) *getchar()*
exe "normal " . v:mouse_col . "|"
endif
<
When using bracketed paste only the first character is
returned, the rest of the pasted text is dropped.
|xterm-bracketed-paste|.
There is no prompt, you will somehow have to make clear to the
user that a character has to be typed.
There is no mapping for the character.
@@ -5796,16 +5801,20 @@ matchstrpos({expr}, {pat}[, {start}[, {count}]]) *matchstrpos()*
The type isn't changed, it's not necessarily a String.
*max()*
max({list}) Return the maximum value of all items in {list}.
If {list} is not a list or one of the items in {list} cannot
be used as a Number this results in an error.
An empty |List| results in zero.
max({expr}) Return the maximum value of all items in {expr}.
{expr} can be a list or a dictionary. For a dictionary,
it returns the maximum of all values in the dictionary.
If {expr} is neither a list nor a dictionary, or one of the
items in {expr} cannot be used as a Number this results in
an error. An empty |List| or |Dictionary| results in zero.
*min()*
min({list}) Return the minimum value of all items in {list}.
If {list} is not a list or one of the items in {list} cannot
be used as a Number this results in an error.
An empty |List| results in zero.
min({expr}) Return the minimum value of all items in {expr}.
{expr} can be a list or a dictionary. For a dictionary,
it returns the minimum of all values in the dictionary.
If {expr} is neither a list nor a dictionary, or one of the
items in {expr} cannot be used as a Number this results in
an error. An empty |List| or |Dictionary| results in zero.
*mkdir()* *E739*
mkdir({name} [, {path} [, {prot}]])
@@ -5839,9 +5848,13 @@ mode([expr]) Return a string that indicates the current mode.
S Select by line
CTRL-S Select blockwise
i Insert
ic Insert mode completion |compl-generic|
ix Insert mode |i_CTRL-X| completion
R Replace |R|
Rc Replace mode completion |compl-generic|
Rv Virtual Replace |gR|
c Command-line
Rx Replace mode |i_CTRL-X| completion
c Command-line editing
cv Vim Ex mode |gQ|
ce Normal Ex mode |Q|
r Hit-enter prompt
@@ -6163,6 +6176,14 @@ pyeval({expr}) *pyeval()*
non-string keys result in error.
{only available when compiled with the |+python| feature}
pyxeval({expr}) *pyxeval()*
Evaluate Python expression {expr} and return its result
converted to Vim data structures.
Uses Python 2 or 3, see |python_x| and 'pyxversion'.
See also: |pyeval()|, |py3eval()|
{only available when compiled with the |+python| or the
|+python3| feature}
*E726* *E727*
range({expr} [, {max} [, {stride}]]) *range()*
Returns a |List| with Numbers:
@@ -6789,10 +6810,12 @@ setpos({expr}, {list})
[bufnum, lnum, col, off, curswant]
"bufnum" is the buffer number. Zero can be used for the
current buffer. Setting the cursor is only possible for
the current buffer. To set a mark in another buffer you can
use the |bufnr()| function to turn a file name into a buffer
number.
current buffer. When setting an uppercase mark "bufnum" is
used for the mark position. For other marks it specifies the
buffer to set the mark in. You can use the |bufnr()| function
to turn a file name into a buffer number.
For setting the cursor and the ' mark "bufnum" is ignored,
since these are associated with a window, not a buffer.
Does not change the jumplist.
"lnum" and "col" are the position in the buffer. The first
@@ -8135,7 +8158,7 @@ winnr([{arg}]) The result is a Number, which is the number of the current
is returned.
The number can be used with |CTRL-W_w| and ":wincmd w"
|:wincmd|.
Also see |tabpagewinnr()|.
Also see |tabpagewinnr()| and |win_getid()|.
*winrestcmd()*
winrestcmd() Returns a sequence of |:resize| commands that should restore
@@ -8405,6 +8428,7 @@ printer Compiled with |:hardcopy| support.
profile Compiled with |:profile| support.
python Compiled with Python 2.x interface. |has-python|
python3 Compiled with Python 3.x interface. |has-python|
pythonx Compiled with |python_x| interface. |has-pythonx|
qnx QNX version of Vim.
quickfix Compiled with |quickfix| support.
reltime Compiled with |reltime()| support.
+67 -1
View File
@@ -1,4 +1,4 @@
*if_pyth.txt* For Vim version 8.0. Last change: 2016 Sep 17
*if_pyth.txt* For Vim version 8.0. Last change: 2017 Jan 28
VIM REFERENCE MANUAL by Paul Moore
@@ -16,6 +16,7 @@ The Python Interface to Vim *python* *Python*
8. pyeval(), py3eval() Vim functions |python-pyeval|
9. Dynamic loading |python-dynamic|
10. Python 3 |python3|
11. Python X |python_x|
{Vi does not have any of these commands}
@@ -711,6 +712,7 @@ vim.Function object *python-Function*
To facilitate bi-directional interface, you can use |pyeval()| and |py3eval()|
functions to evaluate Python expressions and pass their values to VimL.
|pyxeval()| is also available.
==============================================================================
9. Dynamic loading *python-dynamic*
@@ -811,5 +813,69 @@ dynamically, these has() calls will try to load them. If only one can be
loaded at a time, just checking if Python 2 or 3 are available will prevent
the other one from being available.
==============================================================================
11. Python X *python_x* *pythonx*
Because most python code can be written so that it works with python 2.6+ and
python 3 the pyx* functions and commands have been writen. They work exactly
the same as the Python 2 and 3 variants, but select the Python version using
the 'pyxversion' setting.
You should set 'pyxversion' in your |.vimrc| to prefer Python 2 or Python 3
for Python commands. If you change this setting at runtime you may risk that
state of plugins (such as initialization) may be lost.
If you want to use a module, you can put it in the {rtp}/pythonx directory.
See |pythonx-directory|.
*:pyx* *:pythonx*
The `:pyx` and `:pythonx` commands work similar to `:python`. A simple check
if the `:pyx` command is working: >
:pyx print("Hello")
To see what version of Python is being used: >
:pyx import sys
:pyx print(sys.version)
<
*:pyxfile* *python_x-special-comments*
The `:pyxfile` command works similar to `:pyfile`. However you can add one of
these comments to force Vim using `:pyfile` or `:py3file`: >
#!/any string/python2 " Shebang. Must be the first line of the file.
#!/any string/python3 " Shebang. Must be the first line of the file.
# requires python 2.x " Maximum lines depend on 'modelines'.
# requires python 3.x " Maximum lines depend on 'modelines'.
Unlike normal modelines, the bottom of the file is not checked.
If none of them are found, the 'pyxversion' setting is used.
*W20* *W21*
If Vim does not support the selected Python version a silent message will be
printed. Use `:messages` to read them.
*:pyxdo*
The `:pyxdo` command works similar to `:pydo`.
*has-pythonx*
You can test if pyx* commands are available with: >
if has('pythonx')
echo 'pyx* commands are available. (Python ' . &pyx . ')'
endif
When compiled with only one of |+python| or |+python3|, the has() returns 1.
When compiled with both |+python| and |+python3|, the test depends on the
'pyxversion' setting. If 'pyxversion' is 0, it tests Python 3 first, and if
it is not available then Python 2. If 'pyxversion' is 2 or 3, it tests only
Python 2 or 3 respectively.
Note that for has('pythonx') to work it may try to dynamically load Python 3
or 2. This may have side effects, especially when Vim can only load one of
the two.
If a user prefers Python 2 and want to fallback to Python 3, he needs to set
'pyxversion' explicitly in his |.vimrc|. E.g.: >
if has('python')
set pyx=2
elseif has('python3')
set pyx=3
endif
==============================================================================
vim:tw=78:ts=8:ft=help:norl:
+4
View File
@@ -1442,6 +1442,10 @@ tag command action ~
|:python| :py[thon] execute Python command
|:pydo| :pyd[o] execute Python command for each line
|:pyfile| :pyf[ile] execute Python script file
|:pyx| :pyx execute |python_x| command
|:pythonx| :pythonx same as :pyx
|:pyxdo| :pyxd[o] execute |python_x| command for each line
|:pyxfile| :pyxf[ile] execute |python_x| script file
|:quit| :q[uit] quit current window (when one window quit Vim)
|:quitall| :quita[ll] quit Vim
|:qall| :qa[ll] quit Vim
+30 -1
View File
@@ -1,4 +1,4 @@
*options.txt* For Vim version 8.0. Last change: 2017 Jan 15
*options.txt* For Vim version 8.0. Last change: 2017 Jan 28
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -5968,6 +5968,35 @@ A jump table for the options with a short description can be found at |Q_op|.
PYTHON3_HOME, which was specified at compile time, will be used for
the Python 3 home directory.
Environment variables are expanded |:set_env|.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
*'pyxversion'* *'pyx'*
'pyxversion' 'pyx' number (default depends on the build)
global
{not in Vi}
{only available when compiled with the |+python| or
the |+python3| feature}
Specifies the python version used for pyx* functions and commands
|python_x|. The default value is as follows:
Compiled with Default ~
|+python| and |+python3| 0
only |+python| 2
only |+python3| 3
Available values are 0, 2 and 3.
If 'pyxversion' is 0, it is set to 2 or 3 after the first execution of
any python2/3 commands or functions. E.g. `:py` sets to 2, and `:py3`
sets to 3. `:pyx` sets it to 3 if Python 3 is available, otherwise sets
to 2 if Python 2 is available.
See also: |has-pythonx|
If Vim is compiled with only |+python| or |+python3| setting
'pyxversion' has no effect. The pyx* functions and commands are
always the same as the compiled version.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
+1
View File
@@ -843,6 +843,7 @@ Short explanation of each option: *option-list*
'pythonhome' name of the Python 2 home directory
'pythonthreedll' name of the Python 3 dynamic library
'pythonthreehome' name of the Python 3 home directory
'pyxversion' 'pyx' Python version used for pyx* commands
'quoteescape' 'qe' escape characters used in a string
'readonly' 'ro' disallow writing the buffer
'redrawtime' 'rdt' timeout for 'hlsearch' and |:match| highlighting
+11 -1
View File
@@ -1,4 +1,4 @@
*syntax.txt* For Vim version 8.0. Last change: 2016 Oct 30
*syntax.txt* For Vim version 8.0. Last change: 2017 Jan 17
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -3479,6 +3479,8 @@ DEFINING CASE *:syn-case* *E390*
"ignore". Note that any items before this are not affected, and all
items until the next ":syntax case" command are affected.
:sy[ntax] case
Show either "syntax case match" or "syntax case ignore" (translated).
SPELL CHECKING *:syn-spell*
@@ -3496,6 +3498,11 @@ SPELL CHECKING *:syn-spell*
To activate spell checking the 'spell' option must be set.
:sy[ntax] spell
Show either "syntax spell toplevel", "syntax spell notoplevel" or
"syntax spell default" (translated).
SYNTAX ISKEYWORD SETTING *:syn-iskeyword*
:sy[ntax] iskeyword [clear | {option}]
@@ -4089,6 +4096,9 @@ IMPLICIT CONCEAL *:syn-conceal-implicit*
off" returns to the normal state where the "conceal" flag must be
given explicitly.
:sy[ntax] conceal
Show either "syntax conceal on" or "syntax conceal off" (translated).
==============================================================================
7. Syntax patterns *:syn-pattern* *E401* *E402*
+20
View File
@@ -790,6 +790,8 @@ $VIM_POSIX vi_diff.txt /*$VIM_POSIX*
'pvw' options.txt /*'pvw'*
'pythondll' options.txt /*'pythondll'*
'pythonthreedll' options.txt /*'pythonthreedll'*
'pyx' options.txt /*'pyx'*
'pyxversion' options.txt /*'pyxversion'*
'qe' options.txt /*'qe'*
'quote motion.txt /*'quote*
'quoteescape' options.txt /*'quoteescape'*
@@ -939,6 +941,8 @@ $VIM_POSIX vi_diff.txt /*$VIM_POSIX*
't_AB' term.txt /*'t_AB'*
't_AF' term.txt /*'t_AF'*
't_AL' term.txt /*'t_AL'*
't_BD' term.txt /*'t_BD'*
't_BE' term.txt /*'t_BE'*
't_CS' term.txt /*'t_CS'*
't_CV' term.txt /*'t_CV'*
't_Ce' term.txt /*'t_Ce'*
@@ -2747,6 +2751,10 @@ $VIM_POSIX vi_diff.txt /*$VIM_POSIX*
:pyfile if_pyth.txt /*:pyfile*
:python if_pyth.txt /*:python*
:python3 if_pyth.txt /*:python3*
:pythonx if_pyth.txt /*:pythonx*
:pyx if_pyth.txt /*:pyx*
:pyxdo if_pyth.txt /*:pyxdo*
:pyxfile if_pyth.txt /*:pyxfile*
:q editing.txt /*:q*
:qa editing.txt /*:qa*
:qall editing.txt /*:qall*
@@ -4823,6 +4831,8 @@ W16 message.txt /*W16*
W17 arabic.txt /*W17*
W18 syntax.txt /*W18*
W19 autocmd.txt /*W19*
W20 if_pyth.txt /*W20*
W21 if_pyth.txt /*W21*
WORD motion.txt /*WORD*
WWW intro.txt /*WWW*
Win32 os_win32.txt /*Win32*
@@ -6664,6 +6674,7 @@ hangulin.txt hangulin.txt /*hangulin.txt*
has() eval.txt /*has()*
has-patch eval.txt /*has-patch*
has-python if_pyth.txt /*has-python*
has-pythonx if_pyth.txt /*has-pythonx*
has_key() eval.txt /*has_key()*
haskell.vim syntax.txt /*haskell.vim*
haslocaldir() eval.txt /*haslocaldir()*
@@ -7997,7 +8008,11 @@ python.vim syntax.txt /*python.vim*
python2-directory if_pyth.txt /*python2-directory*
python3 if_pyth.txt /*python3*
python3-directory if_pyth.txt /*python3-directory*
python_x if_pyth.txt /*python_x*
python_x-special-comments if_pyth.txt /*python_x-special-comments*
pythonx if_pyth.txt /*pythonx*
pythonx-directory if_pyth.txt /*pythonx-directory*
pyxeval() eval.txt /*pyxeval()*
q repeat.txt /*q*
q/ cmdline.txt /*q\/*
q: cmdline.txt /*q:*
@@ -8539,6 +8554,8 @@ t_@7 term.txt /*t_@7*
t_AB term.txt /*t_AB*
t_AF term.txt /*t_AF*
t_AL term.txt /*t_AL*
t_BD term.txt /*t_BD*
t_BE term.txt /*t_BE*
t_CS term.txt /*t_CS*
t_CV term.txt /*t_CV*
t_Ce term.txt /*t_Ce*
@@ -8577,6 +8594,8 @@ t_KI term.txt /*t_KI*
t_KJ term.txt /*t_KJ*
t_KK term.txt /*t_KK*
t_KL term.txt /*t_KL*
t_PE term.txt /*t_PE*
t_PS term.txt /*t_PS*
t_RB term.txt /*t_RB*
t_RI term.txt /*t_RI*
t_RV term.txt /*t_RV*
@@ -9428,6 +9447,7 @@ xterm-8-bit term.txt /*xterm-8-bit*
xterm-8bit term.txt /*xterm-8bit*
xterm-blink syntax.txt /*xterm-blink*
xterm-blinking-cursor syntax.txt /*xterm-blinking-cursor*
xterm-bracketed-paste term.txt /*xterm-bracketed-paste*
xterm-clipboard term.txt /*xterm-clipboard*
xterm-codes term.txt /*xterm-codes*
xterm-color syntax.txt /*xterm-color*
+14 -4
View File
@@ -1,4 +1,4 @@
*term.txt* For Vim version 8.0. Last change: 2016 Sep 02
*term.txt* For Vim version 8.0. Last change: 2017 Feb 02
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -95,11 +95,21 @@ terminal when entering "raw" mode and 't_BD' when leaving "raw" mode. The
terminal is then expected to put 't_PS' before pasted text and 't_PE' after
pasted text. This way Vim can separate text that is pasted from characters
that are typed. The pasted text is handled like when the middle mouse button
is used.
is used, it is inserted literally and not interpreted as commands.
When the cursor is in the first column, the pasted text will be inserted
before it. Otherwise the pasted text is appended after the cursor position.
This means one cannot paste after the first column. Unfortunately Vim does
not have a way to tell where the mouse pointer was.
Note that in some situations Vim will not recognize the bracketed paste and
you will get the raw text. In other situations Vim will only get the first
pasted character and drop the rest, e.g. when using the "r" command.
pasted character and drop the rest, e.g. when using the "r" command. If you
have a problem with this, disable bracketed paste by putting this in your
.vimrc: >
set t_BE=
If this is done while Vim is running the 't_BD' will be sent to the terminal
to disable bracketed paste.
*cs7-problem*
Note: If the terminal settings are changed after running Vim, you might have
@@ -414,7 +424,7 @@ Note: Use the <> form if possible
t_KK <k8> keypad 8 *<k8>* *t_KK* *'t_KK'*
t_KL <k9> keypad 9 *<k9>* *t_KL* *'t_KL'*
<Mouse> leader of mouse code *<Mouse>*
t_PS start of brackted paste |xterm-bracketed-paste| *t_PS* 't_PS'
t_PS start of bracketed paste |xterm-bracketed-paste| *t_PS* 't_PS'
t_PE end of bracketed paste |xterm-bracketed-paste| *t_PE* 't_PE'
Note about t_so and t_mr: When the termcap entry "so" is not present the
+19 -33
View File
@@ -1,4 +1,4 @@
*todo.txt* For Vim version 8.0. Last change: 2017 Jan 16
*todo.txt* For Vim version 8.0. Last change: 2017 Jan 28
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -35,8 +35,6 @@ entered there will not be repeated below, unless there is extra information.
*known-bugs*
-------------------- Known bugs and current work -----------------------
get_syn_options() does not respect skip in else part. (Zyx)
+channel:
- Try out background make plugin:
https://github.com/AndrewVos/vim-make-background
@@ -60,6 +58,7 @@ get_syn_options() does not respect skip in else part. (Zyx)
connecting in the main loop with zero timeout.
- job_start(): run job in a newly opened terminal.
With xterm could use -S{pty}.
Although user could use "xterm -e 'cmd arg'".
Regexp problems:
- Since 7.4.704 the old regex engine fails to match [[:print:]] in 0xf6.
@@ -108,40 +107,27 @@ Regexp problems:
'] mark invalid after undoing insert "hello".
Make html indent file use javascript indent, now that it's not just cindent.
#1220
Concatenation with null string causes an error: 'a'[1:0] .. 'b'
Might as well handle it like an empty string.
When using symbolic links, a package path will not be inserted at the right
position in 'runtimepath'. (Dugan Chen, 2016 Nov 18)
json_encode(): should convert to utf-8. (Nikolai Pavlov, 2016 Jan 23)
What if there is an invalid character?
Include rust files. (Klabnik, #1356)
Allow using json with empty key? Dict already has it.
Json string with trailing \u should be an error. (Lcd)
Patch to deal with changed configure events in GTK 3. (Jan Alexander Steffens,
2016 Oct 23 #1193)
Remarks from nuko8, 2016 Nov 2.
Multi-byte bug: dv} splits char. (Urtica Dioica, 2017 Jan 9)
Patch to change order of compiler flags. (Yousong Zhou, 2016 Sep 19, #1100)
Patch: Make mode() return "ix" or "Rx" when in completion mode.
(Yegappan Lakshmanan, 2017 Jan 19, #1397, update Jan 22)
Patch to add command line completion for :cexpr commands. (Yegappan
Lakshmanan, 2016 Dec 13)
With Visual selection of a multi-byte character the '] mark is on the last
byte, should be first byte?
Patch for :pyx, run python commands depending on the supported version.
(Marc Weber, update from Ken Takata, 2016 Sep 19, 2017 Jan 6)
Patch to avoid warnings for overflow. (Mike Williams, 2016 Dec 16)
Update Dec 19.
When session file has name in argument list but the buffer was deleted, the
buffer is not deleted when using the session file. (#1393)
Should add the buffer in hidden state.
When an item in the quickfix list has a file name that does not exist, behave
like the item was not a match for :cnext.
@@ -150,18 +136,13 @@ Wrong diff highlighting with three files. (2016 Oct 20, #1186)
Also get E749 on exit.
Another example in #1309
Patch to fix vim_iswordp() works differently on chars <256 that are two bytes.
Ozaki Kiichi, 2016 Dec 11.
Completion for user-defined commands does not work if a few chararacters were
already typed. (Dominique, 2017 Jan 26)
When deleting a mark or register, leave a tombstone, so that it's also deleted
when writing viminfo (and the delete was the most recent action). #1339
Relevant neovim patch:
https://github.com/neovim/neovim/pull/5717
test case:
https://github.com/neovim/neovim/pull/5717#issuecomment-264845481
Others:
https://github.com/neovim/neovim/issues/5713#issuecomment-265136186
https://github.com/neovim/neovim/pull/5737#issuecomment-266055165
Patch for better explanation of 'compatible' side effects.
@@ -199,6 +180,10 @@ Patch for restoring wide characters in the console buffer.
Patch to fix escaping of job arguments. (Yasuhiro Matsumoto, 2016 Oct 5)
Update Oct 14: https://gist.github.com/mattn/d47e7d3bfe5ade4be86062b565a4bfca
The TermResponse event is not triggered when a plugin has set 'eventignore' to
"all". Netrw does this. (Gary Johnson, 2017 Jan 24)
Postpone the event until 'eventignore' is reset.
Once .exe with updated installer is available: Add remark to download page
about /S and /D options (Ken Takata, 2016 Apr 13)
Or point to nightly builds: https://github.com/vim/vim-win32-installer/releases
@@ -220,6 +205,7 @@ lines: :g/^/normal yyp On Unix it works OK. (Bryce Orgill, 2016 Nov 5)
Patch for wrong cursor position on wrapped line, involving breakindent.
(Ozaki Kiichi, 2016 Nov 25)
Does this also fix #1408 ?
Patch for 'cursorlinenr' option. (Ozaki Kiichi, 2016 Nov 30)
@@ -569,6 +555,9 @@ Patch to add :mapgroup, put mappings in a group like augroup.
Value returned by virtcol() changes depending on how lines wrap. This is
inconsistent with the documentation.
Value of virtcol() for '[ and '] depend on multi-byte character.
(Luchr, #277)
Can we cache the syntax attributes, so that updates for 'relativenumber' and
'cursorline'/'cursorcolumn' are a lot faster?
@@ -1061,9 +1050,6 @@ Aug 16)
When there are no command line arguments ":next" and ":argu" give E163, which
is confusing. Should say "the argument list is empty".
xterm supports escape sequences to mark a paste operation. Need to be
enabled. (Bruno Sutic, 2014 Jul 11) How to know the terminal supports this?
URXVT:
- will get stuck if byte sequence does not contain the expected semicolon.
- Use urxvt mouse support also in xterm. Explanations:
+1
View File
@@ -1000,6 +1000,7 @@ Various: *various-functions*
perleval() evaluate Perl expression (|+perl|)
py3eval() evaluate Python expression (|+python3|)
pyeval() evaluate Python expression (|+python|)
pyxeval() evaluate |python_x| expression
==============================================================================
*41.7* Defining a function
+3 -3
View File
@@ -1,7 +1,7 @@
" Vim filetype plugin file
" Language: man
" Maintainer: SungHyun Nam <goweol@gmail.com>
" Last Change: 2017 Jan 04
" Last Change: 2017 Jan 18
" To make the ":Man" command available before editing a manual page, source
" this script from your startup vimrc file.
@@ -97,7 +97,7 @@ func <SID>GetCmdArg(sect, page)
endfunc
func <SID>FindPage(sect, page)
let where = system("/usr/bin/man ".s:man_find_arg.' '.s:GetCmdArg(a:sect, a:page))
let where = system("man ".s:man_find_arg.' '.s:GetCmdArg(a:sect, a:page))
if where !~ "^/"
if matchstr(where, " [^ ]*$") !~ "^ /"
return 0
@@ -176,7 +176,7 @@ func <SID>GetPage(...)
let $MANWIDTH = winwidth(0)
let unsetwidth = 1
endif
silent exec "r!/usr/bin/man ".s:GetCmdArg(sect, page)." | col -b"
silent exec "r !man ".s:GetCmdArg(sect, page)." | col -b"
if unsetwidth
let $MANWIDTH = ''
endif
+10 -15
View File
@@ -2,7 +2,7 @@
" Header: "{{{
" Maintainer: Bram Moolenaar
" Original Author: Andy Wokula <anwoku@yahoo.de>
" Last Change: 2016 Mar 30
" Last Change: 2017 Jan 17
" Version: 1.0
" Description: HTML indent script with cached state for faster indenting on a
" range of lines.
@@ -25,27 +25,22 @@
if exists("b:did_indent") "{{{
finish
endif
" Load the Javascript indent script first, it defines GetJavascriptIndent().
" Undo the rest.
" Load base python indent.
if !exists('*GetJavascriptIndent')
runtime! indent/javascript.vim
endif
let b:did_indent = 1
setlocal indentexpr=HtmlIndent()
setlocal indentkeys=o,O,<Return>,<>>,{,},!^F
" "j1" is included to make cindent() work better with Javascript.
setlocal cino=j1
" "J1" should be included, but it doen't work properly before 7.4.355.
if has("patch-7.4.355")
setlocal cino+=J1
endif
" Before patch 7.4.355 indenting after "(function() {" does not work well, add
" )2 to limit paren search.
if !has("patch-7.4.355")
setlocal cino+=)2
endif
" Needed for % to work when finding start/end of a tag.
setlocal matchpairs+=<:>
let b:undo_indent = "setlocal inde< indk< cino<"
let b:undo_indent = "setlocal inde< indk<"
" b:hi_indent keeps state to speed up indenting consecutive lines.
let b:hi_indent = {"lnum": -1}
@@ -596,7 +591,7 @@ func! s:Alien3()
return eval(b:hi_js1indent)
endif
if b:hi_indent.scripttype == "javascript"
return cindent(v:lnum)
return GetJavascriptIndent()
else
return -1
endif
+5 -1
View File
@@ -940,7 +940,7 @@ if has("folding")
call append("$", "foldmarker\tmarkers used when 'foldmethod' is \"marker\"")
call append("$", "\t(local to window)")
call <SID>OptionL("fmr")
call append("$", "foldnestmax\tmaximum fold depth for when 'foldmethod is \"indent\" or \"syntax\"")
call append("$", "foldnestmax\tmaximum fold depth for when 'foldmethod' is \"indent\" or \"syntax\"")
call append("$", "\t(local to window)")
call <SID>OptionL("fdn")
endif
@@ -1341,6 +1341,10 @@ if exists("&perldll")
call append("$", "perldll\tname of the Perl dynamic library")
call <SID>OptionG("perldll", &perldll)
endif
if has('pythonx')
call append("$", "pyxversion\twhether to use Python 2 or 3")
call append("$", " \tset pyx=" . &wd)
endif
if exists("&pythondll")
call append("$", "pythondll\tname of the Python 2 dynamic library")
call <SID>OptionG("pythondll", &pythondll)
+107 -81
View File
@@ -1,8 +1,10 @@
" Vim syntax file
" Language: AutoHotkey script file
" Maintainer: SungHyun Nam <goweol@gmail.com>
" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
" Latest Revision: 2015-10-29
" Maintainer: Michael Wong
" https://github.com/mmikeww/autohotkey.vim
" Latest Revision: 2017-01-23
" Previous Maintainers: SungHyun Nam <goweol@gmail.com>
" Nikolai Weibull <now@bitwi.se>
if exists("b:current_syntax")
finish
@@ -17,68 +19,11 @@ syn keyword autohotkeyTodo
\ contained
\ TODO FIXME XXX NOTE
syn cluster autohotkeyCommentGroup
\ contains=
\ autohotkeyTodo,
\ @Spell
syn match autohotkeyComment
\ display
\ contains=@autohotkeyCommentGroup
\ '`\@<!;.*$'
syn region autohotkeyComment
\ contains=@autohotkeyCommentGroup
\ matchgroup=autohotkeyCommentStart
\ start='/\*'
\ end='\*/'
" only these chars are valid as escape sequences: ,%`;nrbtvaf
" https://autohotkey.com/docs/commands/_EscapeChar.htm
syn match autohotkeyEscape
\ display
\ '`.'
syn match autohotkeyHotkey
\ contains=autohotkeyKey,
\ autohotkeyHotkeyDelimiter
\ display
\ '^.\{-}::'
syn match autohotkeyKey
\ contained
\ display
\ '^.\{-}'
syn match autohotkeyDelimiter
\ contained
\ display
\ '::'
syn match autohotkeyHotstringDefinition
\ contains=autohotkeyHotstring,
\ autohotkeyHotstringDelimiter
\ display
\ '^:\%(B0\|C1\|K\d\+\|P\d\+\|S[IPE]\|Z\d\=\|[*?COR]\)*:.\{-}::'
syn match autohotkeyHotstring
\ contained
\ display
\ '.\{-}'
syn match autohotkeyHotstringDelimiter
\ contained
\ display
\ '::'
syn match autohotkeyHotstringDelimiter
\ contains=autohotkeyHotstringOptions
\ contained
\ display
\ ':\%(B0\|C1\|K\d\+\|P\d\+\|S[IPE]\|Z\d\=\|[*?COR]\):'
syn match autohotkeyHotstringOptions
\ contained
\ display
\ '\%(B0\|C1\|K\d\+\|P\d\+\|S[IPE]\|Z\d\=\|[*?COR]\)'
\ '`[,%`;nrbtvaf]'
syn region autohotkeyString
\ display
@@ -88,39 +33,46 @@ syn region autohotkeyString
\ end=+"+
\ contains=autohotkeyEscape
syn region autohotkeyVariable
syn match autohotkeyVariable
\ display
\ oneline
\ contains=autohotkeyBuiltinVariable
\ matchgroup=autohotkeyVariableDelimiter
\ start="%"
\ end="%"
\ keepend
\ '%\S\{-}%'
syn keyword autohotkeyBuiltinVariable
\ A_Space A_Tab
\ A_WorkingDir A_ScriptDir A_ScriptName A_ScriptFullPath A_LineNumber
\ A_LineFile A_AhkVersion A_AhkPAth A_IsCompiled A_ExitReason
\ A_YYYY A_MM A_DD A_MMMM A_MMM A_DDDD A_DDD A_WDay A_YWeek A_Hour A_Min
\ A_WorkingDir A_ScriptDir A_ScriptName A_ScriptFullPath A_ScriptHwnd A_LineNumber
\ A_LineFile A_ThisFunc A_ThisLabel A_AhkVersion A_AhkPath A_IsUnicode A_IsCompiled A_ExitReason
\ A_YYYY A_MM A_DD A_MMMM A_MMM A_DDDD A_DDD A_WDay A_YDay A_YWeek A_Hour A_Min
\ A_Mon A_Year A_MDay A_NumBatchLines
\ A_Sec A_MSec A_Now A_NowUTC A_TickCount
\ A_IsSuspended A_BatchLines A_TitleMatchMode A_TitleMatchModeSpeed
\ A_DetectHiddenWindows A_DetectHiddenText A_AutoTrim A_STringCaseSense
\ A_FormatInteger A_FormatFloat A_KeyDelay A_WinDelay A_ControlDelay
\ A_MouseDelay A_DefaultMouseSpeed A_IconHidden A_IconTip A_IconFile
\ A_IsSuspended A_IsPaused A_IsCritical A_BatchLines A_TitleMatchMode A_TitleMatchModeSpeed
\ A_DetectHiddenWindows A_DetectHiddenText A_AutoTrim A_StringCaseSense
\ A_FileEncoding A_FormatInteger A_FormatFloat A_KeyDelay A_WinDelay A_ControlDelay
\ A_SendMode A_SendLevel A_StoreCapsLockMode A_KeyDelay A_KeyDelayDuration
\ A_KeyDelayPlay A_KeyDelayPlayDuration A_MouseDelayPlay
\ A_MouseDelay A_DefaultMouseSpeed A_RegView A_IconHidden A_IconTip A_IconFile
\ A_CoordModeToolTip A_CoordModePixel A_CoordModeMouse A_CoordModeCaret A_CoordModeMenu
\ A_IconNumber
\ A_TimeIdle A_TimeIdlePhysical
\ A_TimeIdle A_TimeIdlePhysical A_DefaultGui A_DefaultListView A_DefaultTreeView
\ A_Gui A_GuiControl A_GuiWidth A_GuiHeight A_GuiX A_GuiY A_GuiEvent
\ A_GuiControlEvent A_EventInfo
\ A_ThisMenuItem A_ThisMenu A_ThisMenuItemPos A_ThisHotkey A_PriorHotkey
\ A_TimeSinceThisHotkey A_TimeSincePriorHotkey A_EndChar
\ A_PriorKey A_TimeSinceThisHotkey A_TimeSincePriorHotkey A_EndChar
\ ComSpec A_Temp A_OSType A_OSVersion A_Language A_ComputerName A_UserName
\ A_Is64BitOS A_PtrSize
\ A_WinDir A_ProgramFiles ProgramFiles A_AppData A_AppDataCommon A_Desktop
\ A_DesktopCommon A_StartMenu A_StartMenuCommon A_Programs
\ A_ProgramsCommon A_Startup A_StartupCommon A_MyDocuments A_IsAdmin
\ A_ScreenWidth A_ScreenHeight A_IPAddress1 A_IPAddress2 A_IPAddress3
\ A_ScreenWidth A_ScreenHeight A_ScreenDPI A_IPAddress1 A_IPAddress2 A_IPAddress3
\ A_IPAddress4
\ A_Cursor A_CaretX A_CaretY Clipboard ClipboardAll ErrorLevel A_LastError
\ A_Index A_LoopFileName A_LoopRegName A_LoopReadLine A_LoopField
\ A_LoopFileExt A_LoopFileFullPath A_LoopFileLongPath A_LoopFileShortPath
\ A_LoopFileShortName A_LoopFileDir A_LoopFileTimeModified A_LoopFileTimeCreated
\ A_LoopFileTimeAccessed A_LoopFileAttrib A_LoopFileSize A_LoopFileSizeKB A_LoopFileSizeMB
\ A_LoopRegType A_LoopRegKey A_LoopRegSubKey A_LoopRegTimeModified
syn match autohotkeyBuiltinVariable
\ contained
@@ -130,7 +82,7 @@ syn match autohotkeyBuiltinVariable
syn keyword autohotkeyCommand
\ ClipWait EnvGet EnvSet EnvUpdate
\ Drive DriveGet DriveSpaceFree FileAppend FileCopy FileCopyDir
\ FileCreateDir FileCreateShortcut FileDelete FileGetAttrib
\ FileCreateDir FileCreateShortcut FileDelete FileGetAttrib FileEncoding
\ FileGetShortcut FileGetSize FileGetTime FileGetVersion FileInstall
\ FileMove FileMoveDir FileReadLine FileRead FileRecycle FileRecycleEmpty
\ FileRemoveDir FileSelectFolder FileSelectFile FileSetAttrib FileSetTime
@@ -153,7 +105,7 @@ syn keyword autohotkeyCommand
\ SoundSetWaveVolume
\ FormatTime IfInString IfNotInString Sort StringCaseSense StringGetPos
\ StringLeft StringRight StringLower StringUpper StringMid StringReplace
\ StringSplit StringTrimLeft StringTrimRight
\ StringSplit StringTrimLeft StringTrimRight StringLen
\ Control ControlClick ControlFocus ControlGet ControlGetFocus
\ ControlGetPos ControlGetText ControlMove ControlSend ControlSendRaw
\ ControlSetText Menu PostMessage SendMessage SetControlDelay
@@ -164,12 +116,16 @@ syn keyword autohotkeyCommand
\ WinGetText WinGetTitle WinHide WinKill WinMaximize WinMinimize
\ WinMinimizeAll WinMinimizeAllUndo WinMove WinRestore WinSet
\ WinSetTitle WinShow WinWait WinWaitActive WinWaitNotActive WinWaitClose
\ SetCapsLockState SetNumLockState SetScrollLockState
syn keyword autohotkeyFunction
\ InStr RegExMatch RegExReplace StrLen SubStr Asc Chr
\ DllCall VarSetCapacity WinActive WinExist IsLabel OnMessage
\ Abs Ceil Exp Floor Log Ln Mod Round Sqrt Sin Cos Tan ASin ACos ATan
\ FileExist GetKeyState
\ FileExist GetKeyState NumGet NumPut StrGet StrPut RegisterCallback
\ IsFunc Trim LTrim RTrim IsObject Object Array FileOpen
\ ComObjActive ComObjArray ComObjConnect ComObjCreate ComObjGet
\ ComObjError ComObjFlags ComObjQuery ComObjType ComObjValue ComObject
syn keyword autohotkeyStatement
\ Break Continue Exit ExitApp Gosub Goto OnExit Pause Return
@@ -180,7 +136,9 @@ syn keyword autohotkeyRepeat
syn keyword autohotkeyConditional
\ IfExist IfNotExist If IfEqual IfLess IfGreater Else
\ IfWinExist IfWinNotExist
\ IfWinExist IfWinNotExist IfWinActive IfWinNotActive
\ IfNotEqual IfLessOrEqual IfGreaterOrEqual
\ while until for in
syn match autohotkeyPreProcStart
\ nextgroup=
@@ -200,6 +158,7 @@ syn keyword autohotkeyPreProc
\ HotkeyInterval HotKeyModifierTimeout
\ Hotstring
\ IfWinActive IfWinNotActive IfWinExist IfWinNotExist
\ If IfTimeout
\ MaxHotkeysPerInterval MaxThreads MaxThreadsBuffer MaxThreadsPerHotkey
\ UseHook InstallKeybdHook InstallMouseHook
\ KeyHistory
@@ -213,6 +172,10 @@ syn keyword autohotkeyPreProc
\ MaxMem
\ NoEnv
\ Persistent
\ LTrim
\ InputLevel
\ MenuMaskKey
\ Warn
syn keyword autohotkeyMatchClass
\ ahk_group ahk_class ahk_id ahk_pid
@@ -243,11 +206,74 @@ syn match autohotkeyFloat
syn keyword autohotkeyType
\ local
\ global
\ static
\ byref
syn keyword autohotkeyBoolean
\ true
\ false
syn match autohotkeyHotkey
\ contains=autohotkeyKey,
\ autohotkeyHotkeyDelimiter
\ display
\ '^.\{-}::'
syn match autohotkeyKey
\ contained
\ display
\ '^.\{-}'
syn match autohotkeyDelimiter
\ contained
\ display
\ '::'
" allowable hotstring options:
" https://autohotkey.com/docs/Hotstrings.htm
syn match autohotkeyHotstringDefinition
\ contains=autohotkeyHotstring,
\ autohotkeyHotstringDelimiter
\ display
\ '^\s*:\%([*?]\|[BORZ]0\?\|C[01]\?\|K\d\+\|P\d\+\|S[IPE]\)*:.\{-}::'
syn match autohotkeyHotstring
\ contained
\ display
\ '.\{-}'
syn match autohotkeyHotstringDelimiter
\ contained
\ display
\ '::'
syn match autohotkeyHotstringDelimiter
\ contains=autohotkeyHotstringOptions
\ contained
\ display
\ ':\%([*?]\|[BORZ]0\?\|C[01]\?\|K\d\+\|P\d\+\|S[IPE]\)*:'
syn match autohotkeyHotstringOptions
\ contained
\ display
\ '\%([*?]\|[BORZ]0\?\|C[01]\?\|K\d\+\|P\d\+\|S[IPE]\)*'
syn cluster autohotkeyCommentGroup
\ contains=
\ autohotkeyTodo,
\ @Spell
syn match autohotkeyComment
\ display
\ contains=@autohotkeyCommentGroup
\ '\%(^;\|\s\+;\).*$'
syn region autohotkeyComment
\ contains=@autohotkeyCommentGroup
\ matchgroup=autohotkeyCommentStart
\ start='^\s*/\*'
\ end='^\s*\*/'
" TODO: Shouldn't we look for g:, b:, variables before defaulting to
" something?
if exists("g:autohotkey_syntax_sync_minlines")
+15 -6
View File
@@ -3,7 +3,7 @@
" Maintainer: Jorge Maldonado Ventura <jorgesumle@freakspot.net>
" Previous Maintainer: Claudio Fleiner <claudio@fleiner.com>
" Repository: https://notabug.org/jorgesumle/vim-html-syntax
" Last Change: 2017 Jan 04
" Last Change: 2017 Jan 21
" included patch from Jorge Maldonado Ventura
" Please check :help html.vim for some comments and a description of the options
@@ -55,9 +55,9 @@ syn keyword htmlTagName contained colgroup del fieldset iframe ins legend
syn keyword htmlTagName contained object optgroup q s tbody tfoot thead
" new html 5 tags
syn keyword htmlTagName contained article aside audio bdi canvas datalist
syn keyword htmlTagName contained details embed figcaption figure
syn keyword htmlTagName contained footer header hgroup main mark
syn keyword htmlTagName contained article aside audio bdi canvas data
syn keyword htmlTagName contained datalist details embed figcaption figure
syn keyword htmlTagName contained footer header hgroup keygen main mark
syn keyword htmlTagName contained menuitem meter nav output picture
syn keyword htmlTagName contained progress rb rp rt rtc ruby section
syn keyword htmlTagName contained slot source template time track video wbr
@@ -97,8 +97,17 @@ syn keyword htmlArg contained rules scheme scope span standby style
syn keyword htmlArg contained summary tabindex valuetype version
" html 5 arg names
syn keyword htmlArg contained contenteditable contextmenu draggable dropzone
syn keyword htmlArg contained hidden spellcheck title translate
syn keyword htmlArg contained allowfullscreen async autocomplete autofocus
syn keyword htmlArg contained autoplay challenge contenteditable contextmenu
syn keyword htmlArg contained controls crossorigin default dirname download
syn keyword htmlArg contained draggable dropzone form formaction formenctype
syn keyword htmlArg contained formmethod formnovalidate formtarget hidden
syn keyword htmlArg contained high icon inputmode keytype kind list loop low
syn keyword htmlArg contained max min minlength muted nonce novalidate open
syn keyword htmlArg contained optimum pattern placeholder poster preload
syn keyword htmlArg contained radiogroup required reversed sandbox spellcheck
syn keyword htmlArg contained sizes srcset srcdoc srclang step title translate
syn keyword htmlArg contained typemustmatch
" special characters
syn match htmlSpecialChar "&#\=[0-9A-Za-z]\{1,8};"
+7 -3
View File
@@ -1,11 +1,13 @@
" Vim syntax file
" Language: Matlab
" Maintainer: Maurizio Tranchero - maurizio(.)tranchero(@)gmail(.)com
" Maintainer: Alex Burka <vim@alexburka.com>
" Credits: Preben 'Peppe' Guldberg <peppe-vim@wielders.org>
" Maurizio Tranchero - maurizio(.)tranchero(@)gmail(.)com
" Original author: Mario Eusebio
" Last Change: Wed Jan 13 11:12:34 CET 2010
" sinh added to matlab implicit commands
" Last Change: Mon Jan 23 2017
" added support for cell mode
" Change History:
" - now highlights cell-mode separator comments
" - 'global' and 'persistent' keyword are now recognized
" quit when a syntax file was already loaded
@@ -60,6 +62,7 @@ syn match matlabComment "%.*$" contains=matlabTodo,matlabTab
" MT_ADDON - correctly highlights words after '...' as comments
syn match matlabComment "\.\.\..*$" contains=matlabTodo,matlabTab
syn region matlabMultilineComment start=+%{+ end=+%}+ contains=matlabTodo,matlabTab
syn match matlabCellComment "^%%.*$"
syn keyword matlabOperator break zeros default margin round ones rand
syn keyword matlabOperator ceil floor size clear zeros eye mean std cov
@@ -96,6 +99,7 @@ hi def link matlabOO Statement
hi def link matlabSemicolon SpecialChar
hi def link matlabComment Comment
hi def link matlabMultilineComment Comment
hi def link matlabCellComment Todo
hi def link matlabScope Type
hi def link matlabArithmeticOperator matlabOperator
+22 -3
View File
@@ -1,9 +1,10 @@
" Vim syntax file
" Language: NASM - The Netwide Assembler (v0.98)
" Maintainer: Andriy Sokolov <andriy145@gmail.com>
" Maintainer: Andrii Sokolov <andriy145@gmail.com>
" Original Author: Manuel M.H. Stol <Manuel.Stol@allieddata.nl>
" Former Maintainer: Manuel M.H. Stol <Manuel.Stol@allieddata.nl>
" Last Change: 2012 Feb 7
" Contributors: Leonard König <leonard.r.koenig@gmail.com> (C string highlighting)
" Last Change: 2017 Jan 23
" NASM Home: http://www.nasm.us/
@@ -67,8 +68,23 @@ syn match nasmLabelError "\<\~\s*\(\k*\s*:\|\$\=\.\k*\)"
" Constants:
syn match nasmStringError +["']+
syn match nasmStringError +["'`]+
" NASM is case sensitive here: eg. u-prefix allows for 4-digit, U-prefix for
" 8-digit Unicode characters
syn case match
" one-char escape-sequences
syn match nasmCStringEscape display contained "\\["\\\?abtnvfre]"
" hex and octal numbers
syn match nasmCStringEscape display contained "\\\(x\x\{2}\|\o\{1,3}\)"
" Unicode characters
syn match nasmCStringEscape display contained "\\\(u\x\{4}\|U\x\{8}\)"
" ISO C99 format strings (copied from cFormat in runtime/syntax/c.vim)
syn match nasmCStringFormat display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlLjzt]\|ll\|hh\)\=\([aAbdiuoxXDOUfFeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
syn match nasmCStringFormat display "%%" contained
syn match nasmString +\("[^"]\{-}"\|'[^']\{-}'\)+
" Highlight C escape- and format-sequences within ``-strings
syn match nasmCString +\(`[^`]\{-}`\)+ contains=nasmCStringEscape,nasmCStringFormat extend
syn case ignore
syn match nasmBinNumber "\<[0-1]\+b\>"
syn match nasmBinNumber "\<\~[0-1]\+b\>"lc=1
syn match nasmOctNumber "\<\o\+q\>"
@@ -443,7 +459,10 @@ hi def link nasmInCommentTodo Todo
" Constant Group:
hi def link nasmString String
hi def link nasmCString String
hi def link nasmStringError Error
hi def link nasmCStringEscape SpecialChar
hi def link nasmCStringFormat SpecialChar
hi def link nasmBinNumber Number
hi def link nasmOctNumber Number
hi def link nasmDecNumber Number
+9 -9
View File
@@ -2,8 +2,8 @@
" Language: shell (sh) Korn shell (ksh) bash (sh)
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
" Previous Maintainer: Lennart Schultz <Lennart.Schultz@ecmwf.int>
" Last Change: Sep 22, 2016
" Version: 165
" Last Change: Jan 03, 2017
" Version: 167
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH
" For options and settings, please use: :help ft-sh-syntax
" This file includes many ideas from Eric Brunet (eric.brunet@ens.fr)
@@ -305,7 +305,7 @@ if exists("b:is_bash")
syn cluster shCommandSubList add=bashSpecialVariables,bashStatement
syn cluster shCaseList add=bashAdminStatement,bashStatement
syn keyword bashSpecialVariables contained auto_resume BASH BASH_ALIASES BASH_ALIASES BASH_ARGC BASH_ARGC BASH_ARGV BASH_ARGV BASH_CMDS BASH_CMDS BASH_COMMAND BASH_COMMAND BASH_ENV BASH_EXECUTION_STRING BASH_EXECUTION_STRING BASH_LINENO BASH_LINENO BASHOPTS BASHOPTS BASHPID BASHPID BASH_REMATCH BASH_REMATCH BASH_SOURCE BASH_SOURCE BASH_SUBSHELL BASH_SUBSHELL BASH_VERSINFO BASH_VERSION BASH_XTRACEFD BASH_XTRACEFD CDPATH COLUMNS COLUMNS COMP_CWORD COMP_CWORD COMP_KEY COMP_KEY COMP_LINE COMP_LINE COMP_POINT COMP_POINT COMPREPLY COMPREPLY COMP_TYPE COMP_TYPE COMP_WORDBREAKS COMP_WORDBREAKS COMP_WORDS COMP_WORDS COPROC COPROC DIRSTACK EMACS EMACS ENV ENV EUID FCEDIT FIGNORE FUNCNAME FUNCNAME FUNCNEST FUNCNEST GLOBIGNORE GROUPS histchars HISTCMD HISTCONTROL HISTFILE HISTFILESIZE HISTIGNORE HISTSIZE HISTTIMEFORMAT HISTTIMEFORMAT HOME HOSTFILE HOSTNAME HOSTTYPE IFS IGNOREEOF INPUTRC LANG LC_ALL LC_COLLATE LC_CTYPE LC_CTYPE LC_MESSAGES LC_NUMERIC LC_NUMERIC LINENO LINES LINES MACHTYPE MAIL MAILCHECK MAILPATH MAPFILE MAPFILE OLDPWD OPTARG OPTERR OPTIND OSTYPE PATH PIPESTATUS POSIXLY_CORRECT POSIXLY_CORRECT PPID PROMPT_COMMAND PS1 PS2 PS3 PS4 PWD RANDOM READLINE_LINE READLINE_LINE READLINE_POINT READLINE_POINT REPLY SECONDS SHELL SHELL SHELLOPTS SHLVL TIMEFORMAT TIMEOUT TMPDIR TMPDIR UID
syn keyword bashStatement chmod clear complete du egrep expr fgrep find gnufind gnugrep grep less ls mkdir mv rm rmdir rpm sed sleep sort strip tail
syn keyword bashStatement chmod clear complete du egrep expr fgrep find gnufind gnugrep grep less ls mkdir mv rm rmdir rpm sed sleep sort strip tail
syn keyword bashAdminStatement daemon killall killproc nice reload restart start status stop
syn keyword bashStatement command compgen
endif
@@ -376,8 +376,8 @@ ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc06 start="<<-\s*\"\z([^ \
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc07 start="<<\s*\\\_$\_s*\z([^ \t|>]\+\)" matchgroup=shHereDoc07 end="^\z1\s*$" contains=@shDblQuoteList
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc08 start="<<\s*\\\_$\_s*'\z([^ \t|>]\+\)'" matchgroup=shHereDoc08 end="^\z1\s*$"
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc09 start="<<\s*\\\_$\_s*\"\z([^ \t|>]\+\)\"" matchgroup=shHereDoc09 end="^\z1\s*$"
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc10 start="<<-\s*\\\_$\_s*\z([^ \t|>]\+\)" matchgroup=shHereDoc10 end="^\s*\z1\s*$"
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc11 start="<<-\s*\\\_$\_s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc11 end="^\s*\z1\s*$"
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc10 start="<<-\s*\\\_$\_s*\z([^ \t|>]\+\)" matchgroup=shHereDoc10 end="^\s*\z1\s*$"
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc11 start="<<-\s*\\\_$\_s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc11 end="^\s*\z1\s*$"
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc12 start="<<-\s*\\\_$\_s*'\z([^ \t|>]\+\)'" matchgroup=shHereDoc12 end="^\s*\z1\s*$"
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc13 start="<<-\s*\\\_$\_s*\"\z([^ \t|>]\+\)\"" matchgroup=shHereDoc13 end="^\s*\z1\s*$"
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc14 start="<<\\\z([^ \t|>]\+\)" matchgroup=shHereDoc14 end="^\z1\s*$"
@@ -386,7 +386,7 @@ ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc15 start="<<-\s*\\\z([^ \
" Here Strings: {{{1
" =============
" available for: bash; ksh (really should be ksh93 only) but not if its a posix
if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("g:is_posix"))
if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("b:is_posix"))
syn match shHereString "<<<" skipwhite nextgroup=shCmdParenRegion
endif
@@ -407,7 +407,7 @@ else
endif
" Functions: {{{1
if !exists("g:is_posix")
if !exists("b:is_posix")
syn keyword shFunctionKey function skipwhite skipnl nextgroup=shFunctionTwo
endif
@@ -533,7 +533,7 @@ endif
" ====================
if exists("b:is_kornshell") || exists("b:is_bash")
syn keyword shStatement autoload bg false fc fg functions getopts hash history integer jobs let nohup printf r stop suspend times true type unalias whence
if exists("g:is_posix")
if exists("b:is_posix")
syn keyword shStatement command
else
syn keyword shStatement time
@@ -542,7 +542,7 @@ if exists("b:is_kornshell") || exists("b:is_bash")
" Useful bash Keywords: {{{1
" =====================
if exists("b:is_bash")
syn keyword shStatement bind builtin dirs disown enable help local logout popd pushd shopt source
syn keyword shStatement bind builtin dirs disown enable help logout popd pushd shopt source
else
syn keyword shStatement login newgrp
endif
+32 -4
View File
@@ -1,8 +1,8 @@
" Vim syntax file
" Language: TeX
" Maintainer: Charles E. Campbell <NdrchipO@ScampbellPfamily.AbizM>
" Last Change: Sep 20, 2016
" Version: 101
" Last Change: Dec 07, 2016
" Version: 102
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TEX
"
" Notes: {{{1
@@ -494,13 +494,11 @@ if !exists("g:tex_no_math")
\ ['\\backslash' , '\'] ,
\ ['\\downarrow' , '↓'] ,
\ ['\\Downarrow' , '⇓'] ,
\ ['\\langle' , '<'] ,
\ ['\\lbrace' , '['] ,
\ ['\\lceil' , '⌈'] ,
\ ['\\lfloor' , '⌊'] ,
\ ['\\lgroup' , '⌊'] ,
\ ['\\lmoustache' , '⎛'] ,
\ ['\\rangle' , '>'] ,
\ ['\\rbrace' , ']'] ,
\ ['\\rceil' , '⌉'] ,
\ ['\\rfloor' , '⌋'] ,
@@ -510,6 +508,15 @@ if !exists("g:tex_no_math")
\ ['\\Uparrow' , '↑'] ,
\ ['\\updownarrow', '↕'] ,
\ ['\\Updownarrow', '⇕']]
if &ambw == "double" || exists("g:tex_usedblwidth")
let s:texMathDelimList= s:texMathDelimList + [
\ ['\\langle' , '〈'] ,
\ ['\\rangle' , '〉'] ,
else
let s:texMathDelimList= s:texMathDelimList + [
\ ['\\langle' , '<'] ,
\ ['\\rangle' , '>']]
endif
syn match texMathDelim '\\[bB]igg\=[lr]' contained nextgroup=texMathDelimBad
for texmath in s:texMathDelimList
exe "syn match texMathDelim '\\\\[bB]igg\\=[lr]\\=".texmath[0]."' contained conceal cchar=".texmath[1]
@@ -680,6 +687,7 @@ if has("conceal") && &enc == 'utf-8'
\ ['backslash' , ''],
\ ['barwedge' , '⊼'],
\ ['because' , '∵'],
\ ['beth' , 'ܒ'],
\ ['between' , '≬'],
\ ['bigcap' , '∩'],
\ ['bigcirc' , '○'],
@@ -699,6 +707,7 @@ if has("conceal") && &enc == 'utf-8'
\ ['boxminus' , '⊟'],
\ ['boxplus' , '⊞'],
\ ['boxtimes' , '⊠'],
\ ['Box' , '☐'],
\ ['bullet' , '•'],
\ ['bumpeq' , '≏'],
\ ['Bumpeq' , '≎'],
@@ -748,6 +757,7 @@ if has("conceal") && &enc == 'utf-8'
\ ['eqslantgtr' , '⪖'],
\ ['eqslantless' , '⪕'],
\ ['equiv' , '≡'],
\ ['eth' , 'ð'],
\ ['exists' , '∃'],
\ ['fallingdotseq' , '≒'],
\ ['flat' , '♭'],
@@ -757,6 +767,7 @@ if has("conceal") && &enc == 'utf-8'
\ ['geq' , '≥'],
\ ['geqq' , '≧'],
\ ['gets' , '←'],
\ ['gimel' , 'ℷ'],
\ ['gg' , '⟫'],
\ ['gneqq' , '≩'],
\ ['gtrdot' , '⋗'],
@@ -767,13 +778,17 @@ if has("conceal") && &enc == 'utf-8'
\ ['heartsuit' , '♡'],
\ ['hookleftarrow' , '↩'],
\ ['hookrightarrow' , '↪'],
\ ['iff' , '⇔'],
\ ['iiint' , '∭'],
\ ['iint' , '∬'],
\ ['Im' , ''],
\ ['imath' , 'ɩ'],
\ ['implies' , '⇒'],
\ ['in' , '∈'],
\ ['infty' , '∞'],
\ ['int' , '∫'],
\ ['jmath' , '𝚥'],
\ ['land' , '∧'],
\ ['lceil' , '⌈'],
\ ['ldots' , '…'],
\ ['le' , '≤'],
@@ -800,6 +815,7 @@ if has("conceal") && &enc == 'utf-8'
\ ['ll' , '≪'],
\ ['lmoustache' , '╭'],
\ ['lneqq' , '≨'],
\ ['lor' , ''],
\ ['ltimes' , '⋉'],
\ ['mapsto' , '↦'],
\ ['measuredangle' , '∡'],
@@ -826,6 +842,7 @@ if has("conceal") && &enc == 'utf-8'
\ ['nless' , '≮'],
\ ['nmid' , '∤'],
\ ['notin' , '∉'],
\ ['nparallel' , '∦'],
\ ['nprec' , '⊀'],
\ ['nrightarrow' , '↛'],
\ ['nRightarrow' , '⇏'],
@@ -927,10 +944,12 @@ if has("conceal") && &enc == 'utf-8'
\ ['trianglerighteq', '⊵'],
\ ['twoheadleftarrow', '↞'],
\ ['twoheadrightarrow', '↠'],
\ ['ulcorner' , '⌜'],
\ ['uparrow' , '↑'],
\ ['Uparrow' , '⇑'],
\ ['updownarrow' , '↕'],
\ ['Updownarrow' , '⇕'],
\ ['urcorner' , '⌝'],
\ ['varnothing' , '∅'],
\ ['vartriangle' , '∆'],
\ ['vdash' , '⊢'],
@@ -946,6 +965,15 @@ if has("conceal") && &enc == 'utf-8'
" \ ['jmath' , 'X']
" \ ['uminus' , 'X']
" \ ['uplus' , 'X']
if &ambw == "double" || exists("g:tex_usedblwidth")
let s:texMathList= s:texMathList + [
\ ['right\\rangle' , '〉'],
\ ['left\\langle' , '〈']]
else
let s:texMathList= s:texMathList + [
\ ['right\\rangle' , '>'],
\ ['left\\langle' , '<']]
endif
for texmath in s:texMathList
if texmath[0] =~# '\w$'
exe "syn match texMathSymbol '\\\\".texmath[0]."\\>' contained conceal cchar=".texmath[1]
+4 -3
View File
@@ -1,8 +1,8 @@
" Vim syntax file
" Language: Vim 8.0 script
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
" Last Change: September 29, 2016
" Version: 8.0-01
" Last Change: Jan 19, 2017
" Version: 8.0-02
" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM
" Automatically generated keyword lists: {{{1
@@ -164,6 +164,7 @@ endif
syn match vimNumber "\<\d\+\%(\.\d\+\%([eE][+-]\=\d\+\)\=\)\=" skipwhite nextgroup=vimGlobal,vimSubst,vimCommand
syn match vimNumber "-\d\+\%(\.\d\+\%([eE][+-]\=\d\+\)\=\)\=" skipwhite nextgroup=vimGlobal,vimSubst,vimCommand
syn match vimNumber "\<0[xX]\x\+"
syn match vimNumber "\<0[bB][01]\+"
syn match vimNumber "\%(^\|[^a-zA-Z]\)\zs#\x\{6}"
" All vimCommands are contained by vimIsCommands. {{{2
@@ -225,7 +226,7 @@ endif
" Functions : Tag is provided for those who wish to highlight tagged functions {{{2
" =========
syn cluster vimFuncList contains=vimCommand,vimFunctionError,vimFuncKey,Tag,vimFuncSID
syn cluster vimFuncBodyList contains=vimAbb,vimAddress,vimAugroupKey,vimAutoCmd,vimCmplxRepeat,vimComment,vimComment,vimContinue,vimCtrlChar,vimEcho,vimEchoHL,vimExecute,vimIf,vimIsCommand,vimFBVar,vimFunc,vimFunction,vimFuncVar,vimGlobal,vimHighlight,vimIsCommand,vimLet,vimLineComment,vimMap,vimMark,vimNorm,vimNotation,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegion,vimRegister,vimSet,vimSpecFile,vimString,vimSubst,vimSynLine,vimUnmap,vimUserCommand
syn cluster vimFuncBodyList contains=vimAbb,vimAddress,vimAugroupKey,vimAutoCmd,vimCmplxRepeat,vimComment,vimContinue,vimCtrlChar,vimEcho,vimEchoHL,vimExecute,vimIf,vimIsCommand,vimFBVar,vimFunc,vimFunction,vimFuncVar,vimGlobal,vimHighlight,vimIsCommand,vimLet,vimLineComment,vimMap,vimMark,vimNorm,vimNotation,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegion,vimRegister,vimSet,vimSpecFile,vimString,vimSubst,vimSynLine,vimUnmap,vimUserCommand
syn match vimFunction "\<fu\%[nction]!\=\s\+\%(<[sS][iI][dD]>\|[sSgGbBwWtTlL]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)*\ze\s*(" contains=@vimFuncList nextgroup=vimFuncBody
if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f'
+2 -2
View File
@@ -1238,7 +1238,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>8.0</string>
<string>${VIM_SHORT_VERSION_STRING}</string>
<key>CFBundleSignature</key>
<string>VIMM</string>
<key>CFBundleURLTypes</key>
@@ -1255,7 +1255,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>124</string>
<string>126</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
+3 -1
View File
@@ -285,8 +285,10 @@ MSVCRT_VER = ($(MSVCVER) / 10 - 50)
# Base name of the msvcrXX.dll
!if $(MSVCRT_VER) <= 60
MSVCRT_NAME = msvcrt
!else
!elseif $(MSVCRT_VER) <= 130
MSVCRT_NAME = msvcr$(MSVCRT_VER)
!else
MSVCRT_NAME = vcruntime$(MSVCRT_VER)
!endif
!if $(MSVC_MAJOR) == 6
+45 -6
View File
@@ -1601,14 +1601,16 @@ EXTRA_SRC = hangulin.c if_lua.c if_mzsch.c auto/if_perl.c if_perlsfio.c \
# Unittest files
JSON_TEST_SRC = json_test.c
JSON_TEST_TARGET = json_test$(EXEEXT)
KWORD_TEST_SRC = kword_test.c
KWORD_TEST_TARGET = kword_test$(EXEEXT)
MEMFILE_TEST_SRC = memfile_test.c
MEMFILE_TEST_TARGET = memfile_test$(EXEEXT)
MESSAGE_TEST_SRC = message_test.c
MESSAGE_TEST_TARGET = message_test$(EXEEXT)
UNITTEST_SRC = $(JSON_TEST_SRC) $(MEMFILE_TEST_SRC) $(MESSAGE_TEST_SRC)
UNITTEST_TARGETS = $(JSON_TEST_TARGET) $(MEMFILE_TEST_TARGET) $(MESSAGE_TEST_TARGET)
RUN_UNITTESTS = run_json_test run_memfile_test run_message_test
UNITTEST_SRC = $(JSON_TEST_SRC) $(KWORD_TEST_SRC) $(MEMFILE_TEST_SRC) $(MESSAGE_TEST_SRC)
UNITTEST_TARGETS = $(JSON_TEST_TARGET) $(KWORD_TEST_TARGET) $(MEMFILE_TEST_TARGET) $(MESSAGE_TEST_TARGET)
RUN_UNITTESTS = run_json_test run_kword_test run_memfile_test run_message_test
# All sources, also the ones that are not configured
ALL_SRC = $(BASIC_SRC) $(ALL_GUI_SRC) $(UNITTEST_SRC) $(EXTRA_SRC)
@@ -1628,7 +1630,6 @@ OBJ_COMMON = \
objects/arabic.o \
objects/buffer.o \
objects/blowfish.o \
objects/charset.o \
objects/crypt.o \
objects/crypt_zip.o \
objects/dict.o \
@@ -1696,6 +1697,7 @@ OBJ_COMMON = \
# The files included by tests are not in OBJ_COMMON.
OBJ_MAIN = \
objects/charset.o \
objects/json.o \
objects/main.o \
objects/memfile.o \
@@ -1704,13 +1706,23 @@ OBJ_MAIN = \
OBJ = $(OBJ_COMMON) $(OBJ_MAIN)
OBJ_JSON_TEST = \
objects/charset.o \
objects/memfile.o \
objects/message.o \
objects/json_test.o
JSON_TEST_OBJ = $(OBJ_COMMON) $(OBJ_JSON_TEST)
OBJ_KWORD_TEST = \
objects/json.o \
objects/memfile.o \
objects/message.o \
objects/kword_test.o
KWORD_TEST_OBJ = $(OBJ_COMMON) $(OBJ_KWORD_TEST)
OBJ_MEMFILE_TEST = \
objects/charset.o \
objects/json.o \
objects/message.o \
objects/memfile_test.o
@@ -1718,6 +1730,7 @@ OBJ_MEMFILE_TEST = \
MEMFILE_TEST_OBJ = $(OBJ_COMMON) $(OBJ_MEMFILE_TEST)
OBJ_MESSAGE_TEST = \
objects/charset.o \
objects/json.o \
objects/memfile.o \
objects/message_test.o
@@ -1727,6 +1740,7 @@ MESSAGE_TEST_OBJ = $(OBJ_COMMON) $(OBJ_MESSAGE_TEST)
ALL_OBJ = $(OBJ_COMMON) \
$(OBJ_MAIN) \
$(OBJ_JSON_TEST) \
$(OBJ_KWORD_TEST) \
$(OBJ_MEMFILE_TEST) \
$(OBJ_MESSAGE_TEST)
@@ -2053,6 +2067,9 @@ unittest unittests: $(RUN_UNITTESTS)
run_json_test: $(JSON_TEST_TARGET)
$(VALGRIND) ./$(JSON_TEST_TARGET) || exit 1; echo $* passed;
run_kword_test: $(KWORD_TEST_TARGET)
$(VALGRIND) ./$(KWORD_TEST_TARGET) || exit 1; echo $* passed;
run_memfile_test: $(MEMFILE_TEST_TARGET)
$(VALGRIND) ./$(MEMFILE_TEST_TARGET) || exit 1; echo $* passed;
@@ -2075,7 +2092,6 @@ test1 \
test_listlbr \
test_listlbr_utf8 \
test_search_mbyte \
test_utf8 \
test_wordcount \
test3 test4 test5 test6 test7 test8 test9 \
test11 test12 test14 test15 test17 test18 test19 \
@@ -2128,8 +2144,9 @@ test_arglist \
test_fnameescape \
test_fnamemodify \
test_fold \
test_glob2regpat \
test_ga \
test_gf \
test_glob2regpat \
test_gn \
test_goto \
test_gui \
@@ -2148,6 +2165,7 @@ test_arglist \
test_langmap \
test_largefile \
test_lispwords \
test_lua \
test_man \
test_mapping \
test_marks \
@@ -2169,6 +2187,10 @@ test_arglist \
test_popup \
test_profile \
test_put \
test_python2 \
test_python3 \
test_pyx2 \
test_pyx3 \
test_quickfix \
test_regexp_latin \
test_regexp_utf8 \
@@ -2194,12 +2216,14 @@ test_arglist \
test_tabpage \
test_tagcase \
test_tagjump \
test_tcl \
test_textobjects \
test_timers \
test_true_false \
test_undo \
test_unlet \
test_usercommands \
test_utf8 \
test_viminfo \
test_viml \
test_visual \
@@ -2237,6 +2261,13 @@ $(JSON_TEST_TARGET): auto/config.mk objects $(JSON_TEST_OBJ)
MAKE="$(MAKE)" LINK_AS_NEEDED=$(LINK_AS_NEEDED) \
sh $(srcdir)/link.sh
$(KWORD_TEST_TARGET): auto/config.mk objects $(KWORD_TEST_OBJ)
$(CCC) version.c -o objects/version.o
@LINK="$(PURIFY) $(SHRPENV) $(CClink) $(ALL_LIB_DIRS) $(LDFLAGS) \
-o $(KWORD_TEST_TARGET) $(KWORD_TEST_OBJ) $(ALL_LIBS)" \
MAKE="$(MAKE)" LINK_AS_NEEDED=$(LINK_AS_NEEDED) \
sh $(srcdir)/link.sh
$(MEMFILE_TEST_TARGET): auto/config.mk objects $(MEMFILE_TEST_OBJ)
$(CCC) version.c -o objects/version.o
@LINK="$(PURIFY) $(SHRPENV) $(CClink) $(ALL_LIB_DIRS) $(LDFLAGS) \
@@ -2771,6 +2802,7 @@ shadow: runtime pixmaps
../../testdir/*.vim \
../../testdir/*.py \
../../testdir/python* \
../../testdir/pyxfile \
../../testdir/sautest \
../../testdir/samples \
../../testdir/test83-tags? \
@@ -3081,6 +3113,9 @@ objects/json.o: json.c
objects/json_test.o: json_test.c
$(CCC) -o $@ json_test.c
objects/kword_test.o: kword_test.c
$(CCC) -o $@ kword_test.c
objects/list.o: list.c
$(CCC) -o $@ list.c
@@ -3653,6 +3688,10 @@ objects/json_test.o: json_test.c main.c vim.h auto/config.h feature.h os_unix.h
auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \
regexp.h gui.h gui_beval.h proto/gui_beval.pro alloc.h ex_cmds.h spell.h \
proto.h globals.h farsi.h arabic.h json.c
objects/kword_test.o: kword_test.c main.c vim.h auto/config.h feature.h os_unix.h \
auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \
regexp.h gui.h gui_beval.h proto/gui_beval.pro alloc.h ex_cmds.h spell.h \
proto.h globals.h farsi.h arabic.h charset.c mbyte.c
objects/memfile_test.o: memfile_test.c main.c vim.h auto/config.h feature.h \
os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h \
structs.h regexp.h gui.h gui_beval.h proto/gui_beval.pro alloc.h \
+5
View File
@@ -14192,6 +14192,11 @@ $as_echo "using default" >&6; }
fi
vim_short_version_string=`grep 'define.*VIM_VERSION_SHORT' $srcdir/version.h|sed -E -e 's/.*"([0-9.]*)".*/\1/'`
snapshot=`grep -C2 "Add new patch number below this line" $srcdir/version.c|tail -1|sed -E -e 's/^ *([0-9]+),.*/\1/'`
vim_short_version_string="$vim_short_version_string.$snapshot"
XCODEFLAGS="$XCODEFLAGS VIM_SHORT_VERSION_STRING=$vim_short_version_string"
fi
+18 -12
View File
@@ -899,16 +899,17 @@ vim_iswordc(int c)
int
vim_iswordc_buf(int c, buf_T *buf)
{
#ifdef FEAT_MBYTE
if (c >= 0x100)
{
#ifdef FEAT_MBYTE
if (enc_dbcs != 0)
return dbcs_class((unsigned)c >> 8, (unsigned)(c & 0xff)) >= 2;
if (enc_utf8)
return utf_class(c) >= 2;
}
return utf_class_buf(c, buf) >= 2;
#endif
return (c > 0 && c < 0x100 && GET_CHARTAB(buf, c) != 0);
return FALSE;
}
return (c > 0 && GET_CHARTAB(buf, c) != 0);
}
/*
@@ -917,21 +918,19 @@ vim_iswordc_buf(int c, buf_T *buf)
int
vim_iswordp(char_u *p)
{
#ifdef FEAT_MBYTE
if (has_mbyte && MB_BYTE2LEN(*p) > 1)
return mb_get_class(p) >= 2;
#endif
return GET_CHARTAB(curbuf, *p) != 0;
return vim_iswordp_buf(p, curbuf);
}
int
vim_iswordp_buf(char_u *p, buf_T *buf)
{
int c = *p;
#ifdef FEAT_MBYTE
if (has_mbyte && MB_BYTE2LEN(*p) > 1)
return mb_get_class(p) >= 2;
if (has_mbyte && MB_BYTE2LEN(c) > 1)
c = (*mb_ptr2char)(p);
#endif
return (GET_CHARTAB(buf, *p) != 0);
return vim_iswordc_buf(c, buf);
}
/*
@@ -1296,7 +1295,14 @@ getvcol(
if (pos->col == MAXCOL)
posptr = NULL; /* continue until the NUL */
else
{
posptr = ptr + pos->col;
#ifdef FEAT_MBYTE
if (has_mbyte)
/* always start on the first byte */
posptr -= (*mb_head_off)(line, posptr);
#endif
}
/*
* This function is used very often, do some speed optimizations.
+6
View File
@@ -4347,6 +4347,12 @@ if test "x$MACOSX" = "xyes"; then
AC_MSG_RESULT($withval) ],
[ AC_MSG_RESULT(using default) ])
dnl Set CFBundleShortVersionString of Info.plist
vim_short_version_string=`grep 'define.*VIM_VERSION_SHORT' $srcdir/version.h|sed -E -e 's/.*"([[0-9.]]*)".*/\1/'`
snapshot=`grep -C2 "Add new patch number below this line" $srcdir/version.c|tail -1|sed -E -e 's/^ *([[0-9]]+),.*/\1/'`
vim_short_version_string="$vim_short_version_string.$snapshot"
XCODEFLAGS="$XCODEFLAGS VIM_SHORT_VERSION_STRING=$vim_short_version_string"
AC_SUBST(XCODEFLAGS)
fi
+12 -4
View File
@@ -2830,6 +2830,7 @@ set_completion(colnr_T startcol, list_T *list)
if (ctrl_x_mode != 0)
ins_compl_prep(' ');
ins_compl_clear();
ins_compl_free();
compl_direction = FORWARD;
if (startcol > curwin->w_cursor.col)
@@ -6179,6 +6180,9 @@ insertchar(
&& (!has_mbyte || MB_BYTE2LEN_CHECK(c) == 1)
#endif
&& i < INPUT_BUFLEN
# ifdef FEAT_FKMAP
&& !(p_fkmap && KeyTyped) /* Farsi mode mapping moves cursor */
# endif
&& (textwidth == 0
|| (virtcol += byte2cells(buf[i - 1])) < (colnr_T)textwidth)
&& !(!no_abbr && !vim_iswordc(c) && vim_iswordc(buf[i - 1])))
@@ -6187,10 +6191,6 @@ insertchar(
c = vgetc();
if (p_hkmap && KeyTyped)
c = hkmap(c); /* Hebrew mode mapping */
# ifdef FEAT_FKMAP
if (p_fkmap && KeyTyped)
c = fkmap(c); /* Farsi mode mapping */
# endif
buf[i++] = c;
#else
buf[i++] = vgetc();
@@ -9496,12 +9496,17 @@ bracketed_paste(paste_mode_T mode, int drop, garray_T *gap)
char_u *end = find_termcode((char_u *)"PE");
int ret_char = -1;
int save_allow_keys = allow_keys;
int save_paste = p_paste;
int save_ai = curbuf->b_p_ai;
/* If the end code is too long we can't detect it, read everything. */
if (STRLEN(end) >= NUMBUFLEN)
end = NULL;
++no_mapping;
allow_keys = 0;
p_paste = TRUE;
curbuf->b_p_ai = FALSE;
for (;;)
{
/* When the end is not defined read everything. */
@@ -9567,8 +9572,11 @@ bracketed_paste(paste_mode_T mode, int drop, garray_T *gap)
}
idx = 0;
}
--no_mapping;
allow_keys = save_allow_keys;
p_paste = save_paste;
curbuf->b_p_ai = save_ai;
return ret_char;
}
+23 -24
View File
@@ -9240,35 +9240,34 @@ fill_assert_error(
if (opt_msg_tv->v_type != VAR_UNKNOWN)
{
ga_concat(gap, tv2string(opt_msg_tv, &tofree, numbuf, 0));
ga_concat(gap, echo_string(opt_msg_tv, &tofree, numbuf, 0));
vim_free(tofree);
ga_concat(gap, (char_u *)": ");
}
if (atype == ASSERT_MATCH || atype == ASSERT_NOTMATCH)
ga_concat(gap, (char_u *)"Pattern ");
else if (atype == ASSERT_NOTEQUAL)
ga_concat(gap, (char_u *)"Expected not equal to ");
else
ga_concat(gap, (char_u *)"Expected ");
if (exp_str == NULL)
{
ga_concat_esc(gap, tv2string(exp_tv, &tofree, numbuf, 0));
vim_free(tofree);
}
else
ga_concat_esc(gap, exp_str);
if (atype != ASSERT_NOTEQUAL)
{
if (atype == ASSERT_MATCH || atype == ASSERT_NOTMATCH)
ga_concat(gap, (char_u *)"Pattern ");
else if (atype == ASSERT_NOTEQUAL)
ga_concat(gap, (char_u *)"Expected not equal to ");
if (atype == ASSERT_MATCH)
ga_concat(gap, (char_u *)" does not match ");
else if (atype == ASSERT_NOTMATCH)
ga_concat(gap, (char_u *)" does match ");
else
ga_concat(gap, (char_u *)"Expected ");
if (exp_str == NULL)
{
ga_concat_esc(gap, tv2string(exp_tv, &tofree, numbuf, 0));
vim_free(tofree);
}
else
ga_concat_esc(gap, exp_str);
if (atype != ASSERT_NOTEQUAL)
{
if (atype == ASSERT_MATCH)
ga_concat(gap, (char_u *)" does not match ");
else if (atype == ASSERT_NOTMATCH)
ga_concat(gap, (char_u *)" does match ");
else
ga_concat(gap, (char_u *)" but got ");
ga_concat_esc(gap, tv2string(got_tv, &tofree, numbuf, 0));
vim_free(tofree);
}
ga_concat(gap, (char_u *)" but got ");
ga_concat_esc(gap, tv2string(got_tv, &tofree, numbuf, 0));
vim_free(tofree);
}
}
+88 -65
View File
@@ -289,6 +289,9 @@ static void f_py3eval(typval_T *argvars, typval_T *rettv);
#ifdef FEAT_PYTHON
static void f_pyeval(typval_T *argvars, typval_T *rettv);
#endif
#if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
static void f_pyxeval(typval_T *argvars, typval_T *rettv);
#endif
static void f_range(typval_T *argvars, typval_T *rettv);
static void f_readfile(typval_T *argvars, typval_T *rettv);
static void f_reltime(typval_T *argvars, typval_T *rettv);
@@ -715,6 +718,9 @@ static struct fst
#endif
#ifdef FEAT_PYTHON
{"pyeval", 1, 1, f_pyeval},
#endif
#if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
{"pyxeval", 1, 1, f_pyxeval},
#endif
{"range", 1, 3, f_range},
{"readfile", 1, 3, f_readfile},
@@ -2813,7 +2819,17 @@ f_execute(typval_T *argvars, typval_T *rettv)
--list->lv_refcount;
}
rettv->vval.v_string = redir_execute_ga.ga_data;
/* Need to append a NUL to the result. */
if (ga_grow(&redir_execute_ga, 1) == OK)
{
((char *)redir_execute_ga.ga_data)[redir_execute_ga.ga_len] = NUL;
rettv->vval.v_string = redir_execute_ga.ga_data;
}
else
{
ga_clear(&redir_execute_ga);
rettv->vval.v_string = NULL;
}
msg_silent = save_msg_silent;
emsg_silent = save_emsg_silent;
emsg_noredir = save_emsg_noredir;
@@ -5747,15 +5763,13 @@ f_has(typval_T *argvars, typval_T *rettv)
#ifdef FEAT_PERSISTENT_UNDO
"persistent_undo",
#endif
#ifdef FEAT_PYTHON
#ifndef DYNAMIC_PYTHON
#if defined(FEAT_PYTHON) && !defined(DYNAMIC_PYTHON)
"python",
"pythonx",
#endif
#endif
#ifdef FEAT_PYTHON3
#ifndef DYNAMIC_PYTHON3
#if defined(FEAT_PYTHON3) && !defined(DYNAMIC_PYTHON3)
"python3",
#endif
"pythonx",
#endif
#ifdef FEAT_POSTSCRIPT
"postscript",
@@ -5991,17 +6005,30 @@ f_has(typval_T *argvars, typval_T *rettv)
else if (STRICMP(name, "ruby") == 0)
n = ruby_enabled(FALSE);
#endif
#ifdef FEAT_PYTHON
#ifdef DYNAMIC_PYTHON
else if (STRICMP(name, "python") == 0)
n = python_enabled(FALSE);
#endif
#endif
#ifdef FEAT_PYTHON3
#ifdef DYNAMIC_PYTHON3
else if (STRICMP(name, "python3") == 0)
n = python3_enabled(FALSE);
#endif
#if defined(DYNAMIC_PYTHON) || defined(DYNAMIC_PYTHON3)
else if (STRICMP(name, "pythonx") == 0)
{
# if defined(DYNAMIC_PYTHON) && defined(DYNAMIC_PYTHON3)
if (p_pyx == 0)
n = python3_enabled(FALSE) || python_enabled(FALSE);
else if (p_pyx == 3)
n = python3_enabled(FALSE);
else if (p_pyx == 2)
n = python_enabled(FALSE);
# elif defined(DYNAMIC_PYTHON)
n = python_enabled(FALSE);
# elif defined(DYNAMIC_PYTHON3)
n = python3_enabled(FALSE);
# endif
}
#endif
#ifdef DYNAMIC_PERL
else if (STRICMP(name, "perl") == 0)
@@ -7775,21 +7802,26 @@ f_mode(typval_T *argvars, typval_T *rettv)
}
else
#endif
if (State & REPLACE_FLAG)
buf[0] = 'R';
else
buf[0] = 'i';
{
if (State & REPLACE_FLAG)
buf[0] = 'R';
else
buf[0] = 'i';
#ifdef FEAT_INS_EXPAND
if (ins_compl_active())
buf[1] = 'c';
else if (ctrl_x_mode == 1)
buf[1] = 'x';
#endif
}
}
else if (State & CMDLINE)
else if ((State & CMDLINE) || exmode_active)
{
buf[0] = 'c';
if (exmode_active)
if (exmode_active == EXMODE_VIM)
buf[1] = 'v';
}
else if (exmode_active)
{
buf[0] = 'c';
buf[1] = 'e';
else if (exmode_active == EXMODE_NORMAL)
buf[1] = 'e';
}
else
{
@@ -8026,6 +8058,9 @@ f_py3eval(typval_T *argvars, typval_T *rettv)
char_u *str;
char_u buf[NUMBUFLEN];
if (p_pyx == 0)
p_pyx = 3;
str = get_tv_string_buf(&argvars[0], buf);
do_py3eval(str, rettv);
}
@@ -8041,11 +8076,35 @@ f_pyeval(typval_T *argvars, typval_T *rettv)
char_u *str;
char_u buf[NUMBUFLEN];
if (p_pyx == 0)
p_pyx = 2;
str = get_tv_string_buf(&argvars[0], buf);
do_pyeval(str, rettv);
}
#endif
#if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
/*
* "pyxeval()" function
*/
static void
f_pyxeval(typval_T *argvars, typval_T *rettv)
{
# if defined(FEAT_PYTHON) && defined(FEAT_PYTHON3)
init_pyxversion();
if (p_pyx == 2)
f_pyeval(argvars, rettv);
else
f_py3eval(argvars, rettv);
# elif defined(FEAT_PYTHON)
f_pyeval(argvars, rettv);
# elif defined(FEAT_PYTHON3)
f_py3eval(argvars, rettv);
# endif
}
#endif
/*
* "range()" function
*/
@@ -10119,20 +10178,15 @@ f_setpos(typval_T *argvars, typval_T *rettv)
pos.col = 0;
if (name[0] == '.' && name[1] == NUL)
{
/* set cursor */
if (fnum == curbuf->b_fnum)
/* set cursor; "fnum" is ignored */
curwin->w_cursor = pos;
if (curswant >= 0)
{
curwin->w_cursor = pos;
if (curswant >= 0)
{
curwin->w_curswant = curswant - 1;
curwin->w_set_curswant = FALSE;
}
check_cursor();
rettv->vval.v_number = 0;
curwin->w_curswant = curswant - 1;
curwin->w_set_curswant = FALSE;
}
else
EMSG(_(e_invarg));
check_cursor();
rettv->vval.v_number = 0;
}
else if (name[0] == '\'' && name[1] != NUL && name[2] == NUL)
{
@@ -12530,39 +12584,8 @@ f_timer_stopall(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
static void
f_tolower(typval_T *argvars, typval_T *rettv)
{
char_u *p;
p = vim_strsave(get_tv_string(&argvars[0]));
rettv->v_type = VAR_STRING;
rettv->vval.v_string = p;
if (p != NULL)
while (*p != NUL)
{
#ifdef FEAT_MBYTE
int l;
if (enc_utf8)
{
int c, lc;
c = utf_ptr2char(p);
lc = utf_tolower(c);
l = utf_ptr2len(p);
/* TODO: reallocate string when byte count changes. */
if (utf_char2len(lc) == l)
utf_char2bytes(lc, p);
p += l;
}
else if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
p += l; /* skip multi-byte character */
else
#endif
{
*p = TOLOWER_LOC(*p); /* note that tolower() can be a macro */
++p;
}
}
rettv->vval.v_string = strlow_save(get_tv_string(&argvars[0]));
}
/*
+27 -14
View File
@@ -65,7 +65,8 @@
#define ADDR_LOADED_BUFFERS 3
#define ADDR_BUFFERS 4
#define ADDR_TABS 5
#define ADDR_QUICKFIX 6
#define ADDR_TABS_RELATIVE 6 /* Tab page that only relative */
#define ADDR_QUICKFIX 7
#define ADDR_OTHER 99
#ifndef DO_DECLARE_EXCMD
@@ -1138,6 +1139,18 @@ EX(CMD_python3, "python3", ex_py3,
EX(CMD_py3file, "py3file", ex_py3file,
RANGE|FILE1|NEEDARG|CMDWIN,
ADDR_LINES),
EX(CMD_pyx, "pyx", ex_pyx,
RANGE|EXTRA|NEEDARG|CMDWIN,
ADDR_LINES),
EX(CMD_pyxdo, "pyxdo", ex_pyxdo,
RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN,
ADDR_LINES),
EX(CMD_pythonx, "pythonx", ex_pyx,
RANGE|EXTRA|NEEDARG|CMDWIN,
ADDR_LINES),
EX(CMD_pyxfile, "pyxfile", ex_pyxfile,
RANGE|FILE1|NEEDARG|CMDWIN,
ADDR_LINES),
EX(CMD_quit, "quit", ex_quit,
BANG|RANGE|COUNT|NOTADR|TRLBAR|CMDWIN,
ADDR_WINDOWS),
@@ -1419,9 +1432,9 @@ EX(CMD_tags, "tags", do_tags,
ADDR_LINES),
EX(CMD_tab, "tab", ex_wrongmodifier,
NEEDARG|EXTRA|NOTRLCOM,
ADDR_LINES),
ADDR_TABS),
EX(CMD_tabclose, "tabclose", ex_tabclose,
RANGE|NOTADR|COUNT|BANG|TRLBAR|CMDWIN,
BANG|RANGE|NOTADR|ZEROR|EXTRA|NOSPC|TRLBAR|CMDWIN,
ADDR_TABS),
EX(CMD_tabdo, "tabdo", ex_listdo,
NEEDARG|EXTRA|NOTRLCOM|RANGE|NOTADR|DFLALL,
@@ -1434,34 +1447,34 @@ EX(CMD_tabfind, "tabfind", ex_splitview,
ADDR_TABS),
EX(CMD_tabfirst, "tabfirst", ex_tabnext,
TRLBAR,
ADDR_LINES),
ADDR_TABS),
EX(CMD_tabmove, "tabmove", ex_tabmove,
RANGE|NOTADR|ZEROR|EXTRA|NOSPC|TRLBAR,
ADDR_TABS),
EX(CMD_tablast, "tablast", ex_tabnext,
TRLBAR,
ADDR_LINES),
ADDR_TABS),
EX(CMD_tabnext, "tabnext", ex_tabnext,
RANGE|NOTADR|COUNT|TRLBAR,
ADDR_LINES),
RANGE|NOTADR|ZEROR|EXTRA|NOSPC|TRLBAR,
ADDR_TABS),
EX(CMD_tabnew, "tabnew", ex_splitview,
BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|TRLBAR,
ADDR_TABS),
EX(CMD_tabonly, "tabonly", ex_tabonly,
BANG|RANGE|NOTADR|TRLBAR|CMDWIN,
BANG|RANGE|NOTADR|ZEROR|EXTRA|NOSPC|TRLBAR|CMDWIN,
ADDR_TABS),
EX(CMD_tabprevious, "tabprevious", ex_tabnext,
RANGE|NOTADR|COUNT|TRLBAR,
ADDR_LINES),
RANGE|NOTADR|ZEROR|EXTRA|NOSPC|TRLBAR,
ADDR_TABS_RELATIVE),
EX(CMD_tabNext, "tabNext", ex_tabnext,
RANGE|NOTADR|COUNT|TRLBAR,
ADDR_LINES),
RANGE|NOTADR|ZEROR|EXTRA|NOSPC|TRLBAR,
ADDR_TABS_RELATIVE),
EX(CMD_tabrewind, "tabrewind", ex_tabnext,
TRLBAR,
ADDR_LINES),
ADDR_TABS),
EX(CMD_tabs, "tabs", ex_tabs,
TRLBAR|CMDWIN,
ADDR_LINES),
ADDR_TABS),
EX(CMD_tcl, "tcl", ex_tcl,
RANGE|EXTRA|NEEDARG|CMDWIN,
ADDR_LINES),
+188
View File
@@ -3748,6 +3748,194 @@ ex_options(
}
#endif
#if defined(FEAT_PYTHON3) || defined(FEAT_PYTHON) || defined(PROTO)
# if (defined(FEAT_PYTHON) && defined(FEAT_PYTHON3)) || defined(PROTO)
/*
* Detect Python 3 or 2, and initialize 'pyxversion'.
*/
void
init_pyxversion(void)
{
if (p_pyx == 0)
{
if (python3_enabled(FALSE))
p_pyx = 3;
else if (python_enabled(FALSE))
p_pyx = 2;
}
}
# endif
/*
* Does a file contain one of the following strings at the beginning of any
* line?
* "#!(any string)python2" => returns 2
* "#!(any string)python3" => returns 3
* "# requires python 2.x" => returns 2
* "# requires python 3.x" => returns 3
* otherwise return 0.
*/
static int
requires_py_version(char_u *filename)
{
FILE *file;
int requires_py_version = 0;
int i, lines;
lines = (int)p_mls;
if (lines < 0)
lines = 5;
file = mch_fopen((char *)filename, "r");
if (file != NULL)
{
for (i = 0; i < lines; i++)
{
if (vim_fgets(IObuff, IOSIZE, file))
break;
if (i == 0 && IObuff[0] == '#' && IObuff[1] == '!')
{
/* Check shebang. */
if (strstr((char *)IObuff + 2, "python2") != NULL)
{
requires_py_version = 2;
break;
}
if (strstr((char *)IObuff + 2, "python3") != NULL)
{
requires_py_version = 3;
break;
}
}
IObuff[21] = '\0';
if (STRCMP("# requires python 2.x", IObuff) == 0)
{
requires_py_version = 2;
break;
}
if (STRCMP("# requires python 3.x", IObuff) == 0)
{
requires_py_version = 3;
break;
}
}
fclose(file);
}
return requires_py_version;
}
/*
* Source a python file using the requested python version.
*/
static void
source_pyx_file(exarg_T *eap, char_u *fname)
{
exarg_T ex;
int v = requires_py_version(fname);
# if defined(FEAT_PYTHON) && defined(FEAT_PYTHON3)
init_pyxversion();
# endif
if (v == 0)
{
# if defined(FEAT_PYTHON) && defined(FEAT_PYTHON3)
/* user didn't choose a preference, 'pyx' is used */
v = p_pyx;
# elif defined(FEAT_PYTHON)
v = 2;
# elif defined(FEAT_PYTHON3)
v = 3;
# endif
}
/*
* now source, if required python version is not supported show
* unobtrusive message.
*/
if (eap == NULL)
vim_memset(&ex, 0, sizeof(ex));
else
ex = *eap;
ex.arg = fname;
ex.cmd = (char_u *)(v == 2 ? "pyfile" : "pyfile3");
if (v == 2)
{
# ifdef FEAT_PYTHON
ex_pyfile(&ex);
# else
vim_snprintf((char *)IObuff, IOSIZE,
_("W20: Required python version 2.x not supported, ignoring file: %s"),
fname);
MSG(IObuff);
# endif
return;
}
else
{
# ifdef FEAT_PYTHON3
ex_py3file(&ex);
# else
vim_snprintf((char *)IObuff, IOSIZE,
_("W21: Required python version 3.x not supported, ignoring file: %s"),
fname);
MSG(IObuff);
# endif
return;
}
}
/*
* ":pyxfile {fname}"
*/
void
ex_pyxfile(exarg_T *eap)
{
source_pyx_file(eap, eap->arg);
}
/*
* ":pyx"
*/
void
ex_pyx(exarg_T *eap)
{
# if defined(FEAT_PYTHON) && defined(FEAT_PYTHON3)
init_pyxversion();
if (p_pyx == 2)
ex_python(eap);
else
ex_py3(eap);
# elif defined(FEAT_PYTHON)
ex_python(eap);
# elif defined(FEAT_PYTHON3)
ex_py3(eap);
# endif
}
/*
* ":pyxdo"
*/
void
ex_pyxdo(exarg_T *eap)
{
# if defined(FEAT_PYTHON) && defined(FEAT_PYTHON3)
init_pyxversion();
if (p_pyx == 2)
ex_pydo(eap);
else
ex_py3do(eap);
# elif defined(FEAT_PYTHON)
ex_pydo(eap);
# elif defined(FEAT_PYTHON3)
ex_py3do(eap);
# endif
}
#endif
/*
* ":source {fname}"
*/
+218 -86
View File
@@ -290,6 +290,11 @@ static void ex_popup(exarg_T *eap);
# define ex_py3do ex_ni
# define ex_py3file ex_ni
#endif
#if !defined(FEAT_PYTHON) && !defined(FEAT_PYTHON3)
# define ex_pyx ex_script_ni
# define ex_pyxdo ex_ni
# define ex_pyxfile ex_ni
#endif
#ifndef FEAT_TCL
# define ex_tcl ex_script_ni
# define ex_tcldo ex_ni
@@ -2164,8 +2169,7 @@ do_one_cmd(
ea.line2 = curwin->w_cursor.lnum;
break;
case ADDR_WINDOWS:
lnum = CURRENT_WIN_NR;
ea.line2 = lnum;
ea.line2 = CURRENT_WIN_NR;
break;
case ADDR_ARGUMENTS:
ea.line2 = curwin->w_arg_idx + 1;
@@ -2177,8 +2181,10 @@ do_one_cmd(
ea.line2 = curbuf->b_fnum;
break;
case ADDR_TABS:
lnum = CURRENT_TAB_NR;
ea.line2 = lnum;
ea.line2 = CURRENT_TAB_NR;
break;
case ADDR_TABS_RELATIVE:
ea.line2 = 1;
break;
#ifdef FEAT_QUICKFIX
case ADDR_QUICKFIX:
@@ -2237,6 +2243,10 @@ do_one_cmd(
goto doend;
}
break;
case ADDR_TABS_RELATIVE:
errormsg = (char_u *)_(e_invrange);
goto doend;
break;
case ADDR_ARGUMENTS:
if (ARGCOUNT == 0)
ea.line1 = ea.line2 = 0;
@@ -2712,6 +2722,9 @@ do_one_cmd(
case ADDR_TABS:
ea.line2 = LAST_TAB_NR;
break;
case ADDR_TABS_RELATIVE:
ea.line2 = 1;
break;
case ADDR_ARGUMENTS:
if (ARGCOUNT == 0)
ea.line1 = ea.line2 = 0;
@@ -2788,7 +2801,8 @@ do_one_cmd(
/*
* Be vi compatible: no error message for out of range.
*/
if (ea.line2 > curbuf->b_ml.ml_line_count)
if (ea.addr_type == ADDR_LINES
&& ea.line2 > curbuf->b_ml.ml_line_count)
ea.line2 = curbuf->b_ml.ml_line_count;
}
}
@@ -4439,6 +4453,11 @@ get_address(
case ADDR_TABS:
lnum = CURRENT_TAB_NR;
break;
case ADDR_TABS_RELATIVE:
EMSG(_(e_invrange));
cmd = NULL;
goto error;
break;
#ifdef FEAT_QUICKFIX
case ADDR_QUICKFIX:
lnum = qf_get_cur_valid_idx(eap);
@@ -4476,6 +4495,11 @@ get_address(
case ADDR_TABS:
lnum = LAST_TAB_NR;
break;
case ADDR_TABS_RELATIVE:
EMSG(_(e_invrange));
cmd = NULL;
goto error;
break;
#ifdef FEAT_QUICKFIX
case ADDR_QUICKFIX:
lnum = qf_get_size(eap);
@@ -4658,6 +4682,9 @@ get_address(
case ADDR_TABS:
lnum = CURRENT_TAB_NR;
break;
case ADDR_TABS_RELATIVE:
lnum = 1;
break;
#ifdef FEAT_QUICKFIX
case ADDR_QUICKFIX:
lnum = qf_get_cur_valid_idx(eap);
@@ -4674,7 +4701,14 @@ get_address(
n = 1;
else
n = getdigits(&cmd);
if (addr_type == ADDR_LOADED_BUFFERS
if (addr_type == ADDR_TABS_RELATIVE)
{
EMSG(_(e_invrange));
cmd = NULL;
goto error;
}
else if (addr_type == ADDR_LOADED_BUFFERS
|| addr_type == ADDR_BUFFERS)
lnum = compute_buffer_local_count(
addr_type, lnum, (i == '-') ? -1 * n : n);
@@ -4807,6 +4841,9 @@ invalid_range(exarg_T *eap)
if (eap->line2 > LAST_TAB_NR)
return (char_u *)_(e_invrange);
break;
case ADDR_TABS_RELATIVE:
/* Do nothing */
break;
#ifdef FEAT_QUICKFIX
case ADDR_QUICKFIX:
if (eap->line2 != 1 && eap->line2 > qf_get_size(eap))
@@ -7448,6 +7485,107 @@ ex_win_close(
win_close_othertab(win, !need_hide && !P_HID(buf), tp);
}
/*
* Handle the argument for a tabpage related ex command.
* Returns a tabpage number.
* When an error is encountered then eap->errmsg is set.
*/
static int
get_tabpage_arg(exarg_T *eap)
{
int tab_number;
int unaccept_arg0 = (eap->cmdidx == CMD_tabmove) ? 0 : 1;
if (eap->arg && *eap->arg != NUL)
{
char_u *p = eap->arg;
char_u *p_save;
int relative = 0; /* argument +N/-N means: go to N places to the
* right/left relative to the current position. */
if (*p == '-')
{
relative = -1;
p++;
}
else if (*p == '+')
{
relative = 1;
p++;
}
p_save = p;
tab_number = getdigits(&p);
if (relative == 0)
{
if (STRCMP(p, "$") == 0)
tab_number = LAST_TAB_NR;
else if (p == p_save || *p_save == '-' || *p != NUL
|| tab_number > LAST_TAB_NR)
{
/* No numbers as argument. */
eap->errmsg = e_invarg;
goto theend;
}
}
else
{
if (*p_save == NUL)
tab_number = 1;
else if (p == p_save || *p_save == '-' || *p != NUL
|| tab_number == 0)
{
/* No numbers as argument. */
eap->errmsg = e_invarg;
goto theend;
}
tab_number = tab_number * relative + tabpage_index(curtab);
if (!unaccept_arg0 && relative == -1)
--tab_number;
}
if (tab_number < unaccept_arg0 || tab_number > LAST_TAB_NR)
eap->errmsg = e_invarg;
}
else if (eap->addr_count > 0)
{
if (unaccept_arg0 && eap->line2 == 0)
{
eap->errmsg = e_invrange;
tab_number = 0;
}
else
{
tab_number = eap->line2;
if (!unaccept_arg0 && **eap->cmdlinep == '-')
{
--tab_number;
if (tab_number < unaccept_arg0)
eap->errmsg = e_invarg;
}
}
}
else
{
switch (eap->cmdidx)
{
case CMD_tabnext:
tab_number = tabpage_index(curtab) + 1;
if (tab_number > LAST_TAB_NR)
tab_number = 1;
break;
case CMD_tabmove:
tab_number = LAST_TAB_NR;
break;
default:
tab_number = tabpage_index(curtab);
}
}
theend:
return tab_number;
}
/*
* ":tabclose": close current tab page, unless it is the last one.
* ":tabclose N": close tab page N.
@@ -7456,6 +7594,7 @@ ex_win_close(
ex_tabclose(exarg_T *eap)
{
tabpage_T *tp;
int tab_number;
# ifdef FEAT_CMDWIN
if (cmdwin_type != 0)
@@ -7466,9 +7605,10 @@ ex_tabclose(exarg_T *eap)
EMSG(_("E784: Cannot close last tab page"));
else
{
if (eap->addr_count > 0)
tab_number = get_tabpage_arg(eap);
if (eap->errmsg == NULL)
{
tp = find_tabpage((int)eap->line2);
tp = find_tabpage(tab_number);
if (tp == NULL)
{
beep_flush();
@@ -7479,13 +7619,13 @@ ex_tabclose(exarg_T *eap)
tabpage_close_other(tp, eap->forceit);
return;
}
}
if (!text_locked()
else if (!text_locked()
#ifdef FEAT_AUTOCMD
&& !curbuf_locked()
&& !curbuf_locked()
#endif
)
tabpage_close(eap->forceit);
)
tabpage_close(eap->forceit);
}
}
}
@@ -7497,6 +7637,7 @@ ex_tabonly(exarg_T *eap)
{
tabpage_T *tp;
int done;
int tab_number;
# ifdef FEAT_CMDWIN
if (cmdwin_type != 0)
@@ -7507,24 +7648,27 @@ ex_tabonly(exarg_T *eap)
MSG(_("Already only one tab page"));
else
{
if (eap->addr_count > 0)
goto_tabpage(eap->line2);
/* Repeat this up to a 1000 times, because autocommands may mess
* up the lists. */
for (done = 0; done < 1000; ++done)
tab_number = get_tabpage_arg(eap);
if (eap->errmsg == NULL)
{
FOR_ALL_TABPAGES(tp)
if (tp->tp_topframe != topframe)
{
tabpage_close_other(tp, eap->forceit);
/* if we failed to close it quit */
if (valid_tabpage(tp))
done = 1000;
/* start over, "tp" is now invalid */
goto_tabpage(tab_number);
/* Repeat this up to a 1000 times, because autocommands may
* mess up the lists. */
for (done = 0; done < 1000; ++done)
{
FOR_ALL_TABPAGES(tp)
if (tp->tp_topframe != topframe)
{
tabpage_close_other(tp, eap->forceit);
/* if we failed to close it quit */
if (valid_tabpage(tp))
done = 1000;
/* start over, "tp" is now invalid */
break;
}
if (first_tabpage->tp_next == NULL)
break;
}
if (first_tabpage->tp_next == NULL)
break;
}
}
}
}
@@ -8267,6 +8411,8 @@ tabpage_new(void)
static void
ex_tabnext(exarg_T *eap)
{
int tab_number;
switch (eap->cmdidx)
{
case CMD_tabfirst:
@@ -8278,10 +8424,40 @@ ex_tabnext(exarg_T *eap)
break;
case CMD_tabprevious:
case CMD_tabNext:
goto_tabpage(eap->addr_count == 0 ? -1 : -(int)eap->line2);
if (eap->arg && *eap->arg != NUL)
{
char_u *p = eap->arg;
char_u *p_save = p;
tab_number = getdigits(&p);
if (p == p_save || *p_save == '-' || *p != NUL
|| tab_number == 0)
{
/* No numbers as argument. */
eap->errmsg = e_invarg;
return;
}
}
else
{
if (eap->addr_count == 0)
tab_number = 1;
else
{
tab_number = eap->line2;
if (tab_number < 1)
{
eap->errmsg = e_invrange;
return;
}
}
}
goto_tabpage(-tab_number);
break;
default: /* CMD_tabnext */
goto_tabpage(eap->addr_count == 0 ? 0 : (int)eap->line2);
tab_number = get_tabpage_arg(eap);
if (eap->errmsg == NULL)
goto_tabpage(tab_number);
break;
}
}
@@ -8294,59 +8470,9 @@ ex_tabmove(exarg_T *eap)
{
int tab_number;
if (eap->arg && *eap->arg != NUL)
{
char_u *p = eap->arg;
int relative = 0; /* argument +N/-N means: move N places to the
* right/left relative to the current position. */
if (*eap->arg == '-')
{
relative = -1;
p = eap->arg + 1;
}
else if (*eap->arg == '+')
{
relative = 1;
p = eap->arg + 1;
}
else
p = eap->arg;
if (relative == 0)
{
if (STRCMP(p, "$") == 0)
tab_number = LAST_TAB_NR;
else if (p == skipdigits(p))
{
/* No numbers as argument. */
eap->errmsg = e_invarg;
return;
}
else
tab_number = getdigits(&p);
}
else
{
if (*p != NUL)
tab_number = getdigits(&p);
else
tab_number = 1;
tab_number = tab_number * relative + tabpage_index(curtab);
if (relative == -1)
--tab_number;
}
}
else if (eap->addr_count != 0)
{
tab_number = eap->line2;
if (**eap->cmdlinep == '-')
--tab_number;
}
else
tab_number = LAST_TAB_NR;
tabpage_move(tab_number);
tab_number = get_tabpage_arg(eap);
if (eap->errmsg == NULL)
tabpage_move(tab_number);
}
/*
@@ -11227,8 +11353,10 @@ makeopens(
* resized when moving between windows.
* Do this before restoring the view, so that the topline and the
* cursor can be set. This is done again below.
* winminheight and winminwidth need to be set to avoid an error if the
* user has set winheight or winwidth.
*/
if (put_line(fd, "set winheight=1 winwidth=1") == FAIL)
if (put_line(fd, "set winminheight=1 winheight=1 winminwidth=1 winwidth=1") == FAIL)
return FAIL;
if (nr > 1 && ses_winsizes(fd, restore_size, tab_firstwin) == FAIL)
return FAIL;
@@ -11298,6 +11426,10 @@ makeopens(
if (fprintf(fd, "set winheight=%ld winwidth=%ld shortmess=%s",
p_wh, p_wiw, p_shm) < 0 || put_eol(fd) == FAIL)
return FAIL;
/* Re-apply 'winminheight' and 'winminwidth'. */
if (fprintf(fd, "set winminheight=%ld winminwidth=%ld",
p_wmh, p_wmw) < 0 || put_eol(fd) == FAIL)
return FAIL;
/*
* Lastly, execute the x.vim file if it exists.
@@ -11693,7 +11825,7 @@ ses_arglist(
s = buf;
}
}
if (fputs("argadd ", fd) < 0
if (fputs("$argadd ", fd) < 0
|| ses_put_fname(fd, s, flagp) == FAIL
|| put_eol(fd) == FAIL)
{
+339 -355
View File
@@ -15,30 +15,11 @@
#if defined(FEAT_FKMAP) || defined(PROTO)
static int toF_Xor_X_(int c);
static int F_is_TyE(int c);
static int F_is_TyC_TyD(int c);
static int F_is_TyB_TyC_TyD(int src, int offset);
static int toF_TyB(int c);
static void put_curr_and_l_to_X(int c);
static void put_and_redo(int c);
static void chg_c_toX_orX(void);
static void chg_c_to_X_orX_(void);
static void chg_c_to_X_or_X(void);
static void chg_l_to_X_orX_(void);
static void chg_l_toXor_X(void);
static void chg_r_to_Xor_X_(void);
static int toF_leading(int c);
static int toF_Rjoin(int c);
static int canF_Ljoin(int c);
static int canF_Rjoin(int c);
static int F_isterm(int c);
static int toF_ending(int c);
static void lrswapbuf(char_u *buf, int len);
/*
* Convert the given Farsi character into a _X or _X_ type
*/
*/
static int
toF_Xor_X_(int c)
{
@@ -105,7 +86,7 @@ toF_Xor_X_(int c)
/*
* Convert the given Farsi character into Farsi capital character.
*/
*/
static int
toF_TyA(int c)
{
@@ -156,7 +137,7 @@ toF_TyA(int c)
* Is the character under the cursor+offset in the given buffer a join type.
* That is a character that is combined with the others.
* Note: the offset is used only for command line buffer.
*/
*/
static int
F_is_TyB_TyC_TyD(int src, int offset)
{
@@ -207,7 +188,7 @@ F_is_TyB_TyC_TyD(int src, int offset)
/*
* Is the Farsi character one of the terminating only type.
*/
*/
static int
F_is_TyE(int c)
{
@@ -230,7 +211,7 @@ F_is_TyE(int c)
/*
* Is the Farsi character one of the none leading type.
*/
*/
static int
F_is_TyC_TyD(int c)
{
@@ -254,7 +235,7 @@ F_is_TyC_TyD(int c)
/*
* Convert a none leading Farsi char into a leading type.
*/
*/
static int
toF_TyB(int c)
{
@@ -275,9 +256,18 @@ toF_TyB(int c)
return c;
}
static void
put_and_redo(int c)
{
pchar_cursor(c);
AppendCharToRedobuff(K_BS);
AppendCharToRedobuff(c);
}
/*
* Overwrite the current redo and cursor characters + left adjust.
*/
*/
static void
put_curr_and_l_to_X(int c)
{
@@ -312,17 +302,9 @@ put_curr_and_l_to_X(int c)
put_and_redo(c);
}
static void
put_and_redo(int c)
{
pchar_cursor(c);
AppendCharToRedobuff(K_BS);
AppendCharToRedobuff(c);
}
/*
* Change the char. under the cursor to a X_ or X type
*/
*/
static void
chg_c_toX_orX(void)
{
@@ -446,8 +428,7 @@ chg_c_toX_orX(void)
/*
* Change the char. under the cursor to a _X_ or X_ type
*/
*/
static void
chg_c_to_X_orX_(void)
{
@@ -498,9 +479,9 @@ chg_c_to_X_orX_(void)
/*
* Change the char. under the cursor to a _X_ or _X type
*/
*/
static void
chg_c_to_X_or_X (void)
chg_c_to_X_or_X(void)
{
int tempc;
@@ -529,7 +510,7 @@ chg_c_to_X_or_X (void)
/*
* Change the character left to the cursor to a _X_ or X_ type
*/
*/
static void
chg_l_to_X_orX_(void)
{
@@ -597,10 +578,9 @@ chg_l_to_X_orX_(void)
/*
* Change the character left to the cursor to a X or _X type
*/
*/
static void
chg_l_toXor_X (void)
chg_l_toXor_X(void)
{
int tempc;
@@ -666,8 +646,7 @@ chg_l_toXor_X (void)
/*
* Change the character right to the cursor to a _X or _X_ type
*/
*/
static void
chg_r_to_Xor_X_(void)
{
@@ -691,48 +670,50 @@ chg_r_to_Xor_X_(void)
/*
* Map Farsi keyboard when in fkmap mode.
*/
*/
int
fkmap(int c)
{
int tempc;
static int revins;
int insert_mode = (State & INSERT);
static int revins = 0;
if (IS_SPECIAL(c))
return c;
if (VIM_ISDIGIT(c) || ((c == '.' || c == '+' || c == '-' ||
c == '^' || c == '%' || c == '#' || c == '=') && revins))
if (insert_mode)
{
if (!revins)
if (VIM_ISDIGIT(c) || ((c == '.' || c == '+' || c == '-' ||
c == '^' || c == '%' || c == '#' || c == '=') && revins))
{
if (curwin->w_cursor.col)
/* Numbers are entered left-to-right. */
if (!revins)
{
if (!p_ri)
dec_cursor();
if (curwin->w_cursor.col)
{
if (!p_ri)
dec_cursor();
chg_c_toX_orX ();
chg_l_toXor_X ();
chg_c_toX_orX ();
chg_l_toXor_X ();
if (!p_ri)
inc_cursor();
if (!p_ri)
inc_cursor();
}
}
arrow_used = TRUE;
(void)stop_arrow();
if (!curwin->w_p_rl && revins)
inc_cursor();
++revins;
p_ri = 1;
}
arrow_used = TRUE;
(void)stop_arrow();
if (!curwin->w_p_rl && revins)
inc_cursor();
++revins;
p_ri=1;
}
else
{
if (revins)
else if (revins)
{
/* Stop entering number. */
arrow_used = TRUE;
(void)stop_arrow();
@@ -773,14 +754,14 @@ fkmap(int c)
if (!revins)
{
if (curwin->w_p_rl)
p_ri=0;
p_ri = 0;
if (!curwin->w_p_rl)
p_ri=1;
p_ri = 1;
}
if ((c < 0x100) && (isalpha(c) || c == '&' || c == '^' || c == ';' ||
if ((c < 0x100) && (isalpha(c) || c == '&' || c == '^' || c == ';' ||
c == '\''|| c == ',' || c == '[' ||
c == ']' || c == '{' || c == '}' ))
c == ']' || c == '{' || c == '}'))
chg_r_to_Xor_X_();
tempc = 0;
@@ -844,13 +825,12 @@ fkmap(int c)
case NL:
case TAB:
if (p_ri && c == NL && curwin->w_cursor.col)
if (p_ri && c == NL && curwin->w_cursor.col && insert_mode)
{
/*
* If the char before the cursor is _X_ or X_ do not change
* the one under the cursor with X type.
*/
*/
dec_cursor();
if (F_isalpha(gchar_cursor()))
@@ -920,215 +900,219 @@ fkmap(int c)
}
break;
}
if (!p_ri)
dec_cursor();
switch ((tempc = gchar_cursor()))
if (insert_mode)
{
case _BE:
case _PE:
case _TE:
case _SE:
case _JIM:
case _CHE:
case _HE_J:
case _XE:
case _SIN:
case _SHIN:
case _SAD:
case _ZAD:
case _FE:
case _GHAF:
case _KAF:
case _KAF_H:
case _GAF:
case _LAM:
case _MIM:
case _NOON:
case _HE:
case _HE_:
case _TA:
case _ZA:
put_curr_and_l_to_X(toF_TyA(tempc));
break;
case _AYN:
case _AYN_:
if (!p_ri)
dec_cursor();
if (!p_ri)
if (!curwin->w_cursor.col)
{
put_curr_and_l_to_X(AYN);
break;
}
switch ((tempc = gchar_cursor()))
{
case _BE:
case _PE:
case _TE:
case _SE:
case _JIM:
case _CHE:
case _HE_J:
case _XE:
case _SIN:
case _SHIN:
case _SAD:
case _ZAD:
case _FE:
case _GHAF:
case _KAF:
case _KAF_H:
case _GAF:
case _LAM:
case _MIM:
case _NOON:
case _HE:
case _HE_:
case _TA:
case _ZA:
put_curr_and_l_to_X(toF_TyA(tempc));
break;
case _AYN:
case _AYN_:
if (p_ri)
inc_cursor();
else
dec_cursor();
if (!p_ri)
if (!curwin->w_cursor.col)
{
put_curr_and_l_to_X(AYN);
break;
}
if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
tempc = AYN_;
else
tempc = AYN;
if (p_ri)
inc_cursor();
else
dec_cursor();
if (p_ri)
dec_cursor();
else
inc_cursor();
if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
tempc = AYN_;
else
tempc = AYN;
put_curr_and_l_to_X(tempc);
if (p_ri)
dec_cursor();
else
inc_cursor();
break;
case _GHAYN:
case _GHAYN_:
put_curr_and_l_to_X(tempc);
if (!p_ri)
if (!curwin->w_cursor.col)
{
put_curr_and_l_to_X(GHAYN);
break;
}
break;
case _GHAYN:
case _GHAYN_:
if (p_ri)
inc_cursor();
else
dec_cursor();
if (!p_ri)
if (!curwin->w_cursor.col)
{
put_curr_and_l_to_X(GHAYN);
break;
}
if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
tempc = GHAYN_;
else
tempc = GHAYN;
if (p_ri)
inc_cursor();
else
dec_cursor();
if (p_ri)
dec_cursor();
else
inc_cursor();
if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
tempc = GHAYN_;
else
tempc = GHAYN;
put_curr_and_l_to_X(tempc);
break;
case _YE:
case _IE:
case _YEE:
if (!p_ri)
if (!curwin->w_cursor.col)
{
put_curr_and_l_to_X((tempc == _YE ? YE :
(tempc == _IE ? IE : YEE)));
break;
}
if (p_ri)
dec_cursor();
else
inc_cursor();
if (p_ri)
inc_cursor();
else
dec_cursor();
put_curr_and_l_to_X(tempc);
break;
case _YE:
case _IE:
case _YEE:
if (!p_ri)
if (!curwin->w_cursor.col)
{
put_curr_and_l_to_X((tempc == _YE ? YE :
(tempc == _IE ? IE : YEE)));
break;
}
if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
tempc = (tempc == _YE ? YE_ :
(tempc == _IE ? IE_ : YEE_));
else
tempc = (tempc == _YE ? YE :
(tempc == _IE ? IE : YEE));
if (p_ri)
inc_cursor();
else
dec_cursor();
if (p_ri)
dec_cursor();
else
inc_cursor();
if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
tempc = (tempc == _YE ? YE_ :
(tempc == _IE ? IE_ : YEE_));
else
tempc = (tempc == _YE ? YE :
(tempc == _IE ? IE : YEE));
put_curr_and_l_to_X(tempc);
break;
if (p_ri)
dec_cursor();
else
inc_cursor();
put_curr_and_l_to_X(tempc);
break;
}
if (!p_ri)
inc_cursor();
}
tempc = 0;
tempc = 0;
switch (c)
{
case '0': return FARSI_0;
case '1': return FARSI_1;
case '2': return FARSI_2;
case '3': return FARSI_3;
case '4': return FARSI_4;
case '5': return FARSI_5;
case '6': return FARSI_6;
case '7': return FARSI_7;
case '8': return FARSI_8;
case '9': return FARSI_9;
case 'B': return F_PSP;
case 'E': return JAZR_N;
case 'F': return ALEF_D_H;
case 'H': return ALEF_A;
case 'I': return TASH;
case 'K': return F_LQUOT;
case 'L': return F_RQUOT;
case 'M': return HAMZE;
case 'O': return '[';
case 'P': return ']';
case 'Q': return OO;
case 'R': return MAD_N;
case 'T': return OW;
case 'U': return MAD;
case 'W': return OW_OW;
case 'Y': return JAZR;
case '`': return F_PCN;
case '!': return F_EXCL;
case '@': return F_COMMA;
case '#': return F_DIVIDE;
case '$': return F_CURRENCY;
case '%': return F_PERCENT;
case '^': return F_MUL;
case '&': return F_BCOMMA;
case '*': return F_STAR;
case '(': return F_LPARENT;
case ')': return F_RPARENT;
case '-': return F_MINUS;
case '_': return F_UNDERLINE;
case '=': return F_EQUALS;
case '+': return F_PLUS;
case '\\': return F_BSLASH;
case '|': return F_PIPE;
case ':': return F_DCOLON;
case '"': return F_SEMICOLON;
case '.': return F_PERIOD;
case '/': return F_SLASH;
case '<': return F_LESS;
case '>': return F_GREATER;
case '?': return F_QUESTION;
case ' ': return F_BLANK;
}
break;
switch (c)
{
case '0': return FARSI_0;
case '1': return FARSI_1;
case '2': return FARSI_2;
case '3': return FARSI_3;
case '4': return FARSI_4;
case '5': return FARSI_5;
case '6': return FARSI_6;
case '7': return FARSI_7;
case '8': return FARSI_8;
case '9': return FARSI_9;
case 'B': return F_PSP;
case 'E': return JAZR_N;
case 'F': return ALEF_D_H;
case 'H': return ALEF_A;
case 'I': return TASH;
case 'K': return F_LQUOT;
case 'L': return F_RQUOT;
case 'M': return HAMZE;
case 'O': return '[';
case 'P': return ']';
case 'Q': return OO;
case 'R': return MAD_N;
case 'T': return OW;
case 'U': return MAD;
case 'W': return OW_OW;
case 'Y': return JAZR;
case '`': return F_PCN;
case '!': return F_EXCL;
case '@': return F_COMMA;
case '#': return F_DIVIDE;
case '$': return F_CURRENCY;
case '%': return F_PERCENT;
case '^': return F_MUL;
case '&': return F_BCOMMA;
case '*': return F_STAR;
case '(': return F_LPARENT;
case ')': return F_RPARENT;
case '-': return F_MINUS;
case '_': return F_UNDERLINE;
case '=': return F_EQUALS;
case '+': return F_PLUS;
case '\\': return F_BSLASH;
case '|': return F_PIPE;
case ':': return F_DCOLON;
case '"': return F_SEMICOLON;
case '.': return F_PERIOD;
case '/': return F_SLASH;
case '<': return F_LESS;
case '>': return F_GREATER;
case '?': return F_QUESTION;
case ' ': return F_BLANK;
}
break;
case 'a':
tempc = _SHIN;
break;
tempc = _SHIN;
break;
case 'A':
tempc = WAW_H;
break;
tempc = WAW_H;
break;
case 'b':
tempc = ZAL;
break;
tempc = ZAL;
break;
case 'c':
tempc = ZE;
break;
tempc = ZE;
break;
case 'C':
tempc = JE;
break;
tempc = JE;
break;
case 'd':
tempc = _YE;
break;
tempc = _YE;
break;
case 'D':
tempc = _YEE;
break;
tempc = _YEE;
break;
case 'e':
tempc = _SE;
break;
tempc = _SE;
break;
case 'f':
tempc = _BE;
break;
tempc = _BE;
break;
case 'g':
tempc = _LAM;
break;
tempc = _LAM;
break;
case 'G':
if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
{
@@ -1230,7 +1214,7 @@ fkmap(int c)
inc_cursor();
break;
case 'j':
tempc = _TE;
tempc = _TE;
break;
case 'J':
if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
@@ -1260,73 +1244,73 @@ fkmap(int c)
return tempc;
case 'k':
tempc = _NOON;
tempc = _NOON;
break;
case 'l':
tempc = _MIM;
tempc = _MIM;
break;
case 'm':
tempc = _PE;
tempc = _PE;
break;
case 'n':
case 'N':
tempc = DAL;
tempc = DAL;
break;
case 'o':
tempc = _XE;
tempc = _XE;
break;
case 'p':
tempc = _HE_J;
tempc = _HE_J;
break;
case 'q':
tempc = _ZAD;
tempc = _ZAD;
break;
case 'r':
tempc = _GHAF;
tempc = _GHAF;
break;
case 's':
tempc = _SIN;
tempc = _SIN;
break;
case 'S':
tempc = _IE;
tempc = _IE;
break;
case 't':
tempc = _FE;
tempc = _FE;
break;
case 'u':
if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
{
if (!p_ri && !F_is_TyE(tempc))
chg_c_to_X_orX_ ();
if (p_ri)
chg_c_to_X_or_X ();
if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
{
if (!p_ri && !F_is_TyE(tempc))
chg_c_to_X_orX_ ();
if (p_ri)
chg_c_to_X_or_X ();
}
}
if (!p_ri && !curwin->w_cursor.col)
return _AYN;
if (!p_ri && !curwin->w_cursor.col)
return _AYN;
if (!p_ri)
dec_cursor();
if (!p_ri)
dec_cursor();
if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
tempc = _AYN_;
else
tempc = _AYN;
if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
tempc = _AYN_;
else
tempc = _AYN;
if (!p_ri)
inc_cursor();
if (!p_ri)
inc_cursor();
break;
case 'v':
case 'V':
tempc = RE;
tempc = RE;
break;
case 'w':
tempc = _SAD;
tempc = _SAD;
break;
case 'x':
case 'X':
tempc = _TA;
tempc = _TA;
break;
case 'y':
if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
@@ -1354,36 +1338,36 @@ fkmap(int c)
break;
case 'z':
tempc = _ZA;
tempc = _ZA;
break;
case 'Z':
tempc = _KAF_H;
tempc = _KAF_H;
break;
case ';':
tempc = _KAF;
tempc = _KAF;
break;
case '\'':
tempc = _GAF;
tempc = _GAF;
break;
case ',':
tempc = WAW;
tempc = WAW;
break;
case '[':
tempc = _JIM;
tempc = _JIM;
break;
case ']':
tempc = _CHE;
tempc = _CHE;
break;
}
if ((F_isalpha(tempc) || F_isdigit(tempc)))
if (F_isalpha(tempc) || F_isdigit(tempc))
{
if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
{
if (!p_ri && !F_is_TyE(tempc))
chg_c_to_X_orX_ ();
chg_c_to_X_orX_();
if (p_ri)
chg_c_to_X_or_X ();
chg_c_to_X_or_X();
}
if (curwin->w_cursor.col)
@@ -1392,9 +1376,9 @@ fkmap(int c)
dec_cursor();
if (F_is_TyE(tempc))
chg_l_toXor_X ();
chg_l_toXor_X();
else
chg_l_to_X_orX_ ();
chg_l_to_X_orX_();
if (!p_ri)
inc_cursor();
@@ -1407,7 +1391,7 @@ fkmap(int c)
/*
* Convert a none leading Farsi char into a leading type.
*/
*/
static int
toF_leading(int c)
{
@@ -1461,7 +1445,7 @@ toF_leading(int c)
/*
* Convert a given Farsi char into right joining type.
*/
*/
static int
toF_Rjoin(int c)
{
@@ -1517,7 +1501,7 @@ toF_Rjoin(int c)
/*
* Can a given Farsi character join via its left edj.
*/
*/
static int
canF_Ljoin(int c)
{
@@ -1591,7 +1575,7 @@ canF_Ljoin(int c)
/*
* Can a given Farsi character join via its right edj.
*/
*/
static int
canF_Rjoin(int c)
{
@@ -1619,7 +1603,7 @@ canF_Rjoin(int c)
/*
* is a given Farsi character a terminating type.
*/
*/
static int
F_isterm(int c)
{
@@ -1646,7 +1630,7 @@ F_isterm(int c)
/*
* Convert the given Farsi character into a ending type .
*/
*/
static int
toF_ending(int c)
{
@@ -1691,7 +1675,7 @@ toF_ending(int c)
/*
* Convert the Farsi 3342 standard into Farsi VIM.
*/
*/
static void
conv_to_pvim(void)
{
@@ -1936,56 +1920,56 @@ cmdl_fkmap(int c)
case NL:
case TAB:
switch ((tempc = cmd_gchar(AT_CURSOR)))
{
case _BE:
case _PE:
case _TE:
case _SE:
case _JIM:
case _CHE:
case _HE_J:
case _XE:
case _SIN:
case _SHIN:
case _SAD:
case _ZAD:
case _AYN:
case _GHAYN:
case _FE:
case _GHAF:
case _KAF:
case _GAF:
case _LAM:
case _MIM:
case _NOON:
case _HE:
case _HE_:
cmd_pchar(toF_TyA(tempc), AT_CURSOR);
break;
case _AYN_:
cmd_pchar(AYN_, AT_CURSOR);
break;
case _GHAYN_:
cmd_pchar(GHAYN_, AT_CURSOR);
break;
case _IE:
if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
cmd_pchar(IE_, AT_CURSOR);
else
cmd_pchar(IE, AT_CURSOR);
break;
case _YEE:
if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
cmd_pchar(YEE_, AT_CURSOR);
else
cmd_pchar(YEE, AT_CURSOR);
break;
case _YE:
if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
cmd_pchar(YE_, AT_CURSOR);
else
cmd_pchar(YE, AT_CURSOR);
switch ((tempc = cmd_gchar(AT_CURSOR)))
{
case _BE:
case _PE:
case _TE:
case _SE:
case _JIM:
case _CHE:
case _HE_J:
case _XE:
case _SIN:
case _SHIN:
case _SAD:
case _ZAD:
case _AYN:
case _GHAYN:
case _FE:
case _GHAF:
case _KAF:
case _GAF:
case _LAM:
case _MIM:
case _NOON:
case _HE:
case _HE_:
cmd_pchar(toF_TyA(tempc), AT_CURSOR);
break;
case _AYN_:
cmd_pchar(AYN_, AT_CURSOR);
break;
case _GHAYN_:
cmd_pchar(GHAYN_, AT_CURSOR);
break;
case _IE:
if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
cmd_pchar(IE_, AT_CURSOR);
else
cmd_pchar(IE, AT_CURSOR);
break;
case _YEE:
if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
cmd_pchar(YEE_, AT_CURSOR);
else
cmd_pchar(YEE, AT_CURSOR);
break;
case _YE:
if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
cmd_pchar(YE_, AT_CURSOR);
else
cmd_pchar(YE, AT_CURSOR);
}
switch (c)
+9 -6
View File
@@ -3171,9 +3171,9 @@ delete_event_cb(GtkWidget *widget UNUSED,
static int
get_item_dimensions(GtkWidget *widget, GtkOrientation orientation)
{
# ifdef FEAT_GUI_GNOME
GtkOrientation item_orientation = GTK_ORIENTATION_HORIZONTAL;
# ifdef FEAT_GUI_GNOME
if (using_gnome && widget != NULL)
{
GtkWidget *parent;
@@ -3192,7 +3192,10 @@ get_item_dimensions(GtkWidget *widget, GtkOrientation orientation)
item_orientation = bonobo_dock_item_get_orientation(dockitem);
}
}
# else
# define item_orientation GTK_ORIENTATION_HORIZONTAL
# endif
# if GTK_CHECK_VERSION(3,0,0)
if (widget != NULL
&& item_orientation == orientation
@@ -3209,16 +3212,16 @@ get_item_dimensions(GtkWidget *widget, GtkOrientation orientation)
GtkAllocation allocation;
gtk_widget_get_allocation(widget, &allocation);
if (orientation == GTK_ORIENTATION_HORIZONTAL)
return allocation.height;
else
return allocation.width;
return allocation.height;
# else
# ifdef FEAT_GUI_GNOME
if (orientation == GTK_ORIENTATION_HORIZONTAL)
return widget->allocation.height;
else
return widget->allocation.width;
# else
return widget->allocation.height;
# endif
# endif
}
return 0;
+47 -71
View File
@@ -558,13 +558,12 @@ gui_mch_set_blinking(long wait, long on, long off)
blink_offtime = off;
}
/* ARGSUSED */
static VOID CALLBACK
_OnBlinkTimer(
HWND hwnd,
UINT uMsg,
UINT uMsg UNUSED,
UINT idEvent,
DWORD dwTime)
DWORD dwTime UNUSED)
{
MSG msg;
@@ -590,7 +589,7 @@ _OnBlinkTimer(
gui_update_cursor(TRUE, FALSE);
blink_state = BLINK_ON;
blink_timer = (UINT) SetTimer(NULL, 0, (UINT)blink_ontime,
(TIMERPROC)_OnBlinkTimer);
(TIMERPROC)_OnBlinkTimer);
}
}
@@ -644,13 +643,12 @@ gui_mch_start_blink(void)
* Call-back routines.
*/
/*ARGSUSED*/
static VOID CALLBACK
_OnTimer(
HWND hwnd,
UINT uMsg,
UINT uMsg UNUSED,
UINT idEvent,
DWORD dwTime)
DWORD dwTime UNUSED)
{
MSG msg;
@@ -667,12 +665,11 @@ _OnTimer(
s_wait_timer = 0;
}
/*ARGSUSED*/
static void
_OnDeadChar(
HWND hwnd,
UINT ch,
int cRepeat)
HWND hwnd UNUSED,
UINT ch UNUSED,
int cRepeat UNUSED)
{
dead_key = 1;
}
@@ -752,12 +749,11 @@ char_to_string(int ch, char_u *string, int slen, int had_alt)
/*
* Key hit, add it to the input buffer.
*/
/*ARGSUSED*/
static void
_OnChar(
HWND hwnd,
HWND hwnd UNUSED,
UINT ch,
int cRepeat)
int cRepeat UNUSED)
{
char_u string[40];
int len = 0;
@@ -777,12 +773,11 @@ _OnChar(
/*
* Alt-Key hit, add it to the input buffer.
*/
/*ARGSUSED*/
static void
_OnSysChar(
HWND hwnd,
HWND hwnd UNUSED,
UINT cch,
int cRepeat)
int cRepeat UNUSED)
{
char_u string[40]; /* Enough for multibyte character */
int len;
@@ -861,11 +856,10 @@ _OnMouseEvent(
gui_send_mouse_event(button, x, y, repeated_click, vim_modifiers);
}
/*ARGSUSED*/
static void
_OnMouseButtonDown(
HWND hwnd,
BOOL fDoubleClick,
HWND hwnd UNUSED,
BOOL fDoubleClick UNUSED,
int x,
int y,
UINT keyFlags)
@@ -960,10 +954,9 @@ _OnMouseButtonDown(
}
}
/*ARGSUSED*/
static void
_OnMouseMoveOrRelease(
HWND hwnd,
HWND hwnd UNUSED,
int x,
int y,
UINT keyFlags)
@@ -1038,13 +1031,12 @@ gui_mswin_find_menu(
return pMenu;
}
/*ARGSUSED*/
static void
_OnMenu(
HWND hwnd,
HWND hwnd UNUSED,
int id,
HWND hwndCtl,
UINT codeNotify)
HWND hwndCtl UNUSED,
UINT codeNotify UNUSED)
{
vimmenu_T *pMenu;
@@ -1527,9 +1519,8 @@ gui_mch_get_font(
* Return the name of font "font" in allocated memory.
* Don't know how to get the actual name, thus use the provided name.
*/
/*ARGSUSED*/
char_u *
gui_mch_get_fontname(GuiFont font, char_u *name)
gui_mch_get_fontname(GuiFont font UNUSED, char_u *name)
{
if (name == NULL)
return NULL;
@@ -2175,13 +2166,12 @@ gui_mch_enable_menu(int flag)
#endif
}
/*ARGSUSED*/
void
gui_mch_set_menu_pos(
int x,
int y,
int w,
int h)
int x UNUSED,
int y UNUSED,
int w UNUSED,
int h UNUSED)
{
/* It will be in the right place anyway */
}
@@ -2817,10 +2807,8 @@ _OnEndSession(void)
* Get this message when the user clicks on the cross in the top right corner
* of a Windows95 window.
*/
/*ARGSUSED*/
static void
_OnClose(
HWND hwnd)
_OnClose(HWND hwnd UNUSED)
{
gui_shell_closed();
}
@@ -2829,8 +2817,7 @@ _OnClose(
* Get a message when the window is being destroyed.
*/
static void
_OnDestroy(
HWND hwnd)
_OnDestroy(HWND hwnd)
{
if (!destroying)
_OnClose(hwnd);
@@ -2883,11 +2870,10 @@ _OnPaint(
}
}
/*ARGSUSED*/
static void
_OnSize(
HWND hwnd,
UINT state,
UINT state UNUSED,
int cx,
int cy)
{
@@ -3124,9 +3110,8 @@ gui_mch_insert_lines(
}
/*ARGSUSED*/
void
gui_mch_exit(int rc)
gui_mch_exit(int rc UNUSED)
{
#if defined(FEAT_DIRECTX)
DWriteContext_Close(s_dwc);
@@ -3285,9 +3270,8 @@ gui_mch_wide_font_changed(void)
* Initialise vim to use the font with the given name.
* Return FAIL if the font could not be loaded, OK otherwise.
*/
/*ARGSUSED*/
int
gui_mch_init_font(char_u *font_name, int fontset)
gui_mch_init_font(char_u *font_name, int fontset UNUSED)
{
LOGFONT lf;
GuiFont font = NOFONT;
@@ -3416,11 +3400,10 @@ gui_mch_newfont(void)
/*
* Set the window title
*/
/*ARGSUSED*/
void
gui_mch_settitle(
char_u *title,
char_u *icon)
char_u *icon UNUSED)
{
set_window_title(s_hwnd, (title == NULL ? "VIM" : (char *)title));
}
@@ -3772,10 +3755,9 @@ gui_mch_browse(
}
#endif /* FEAT_BROWSE */
/*ARGSUSED*/
static void
_OnDropFiles(
HWND hwnd,
HWND hwnd UNUSED,
HDROP hDrop)
{
#ifdef FEAT_WINDOWS
@@ -3833,10 +3815,9 @@ _OnDropFiles(
#endif
}
/*ARGSUSED*/
static int
_OnScroll(
HWND hwnd,
HWND hwnd UNUSED,
HWND hwndCtl,
UINT code,
int pos)
@@ -3954,7 +3935,6 @@ _OnScroll(
* Return pointer to buffer in "tofree".
* Returns zero when out of memory.
*/
/*ARGSUSED*/
int
get_cmd_args(char *prog, char *cmdline, char ***argvp, char **tofree)
{
@@ -5588,10 +5568,14 @@ get_work_area(RECT *spi_rect)
/*
* Set the size of the window to the given width and height in pixels.
*/
/*ARGSUSED*/
void
gui_mch_set_shellsize(int width, int height,
int min_width, int min_height, int base_width, int base_height,
gui_mch_set_shellsize(
int width,
int height,
int min_width UNUSED,
int min_height UNUSED,
int base_width UNUSED,
int base_height UNUSED,
int direction)
{
RECT workarea_rect;
@@ -5752,9 +5736,8 @@ gui_mch_set_sp_color(guicolor_T color)
/*
* handle WM_IME_NOTIFY message
*/
/*ARGSUSED*/
static LRESULT
_OnImeNotify(HWND hWnd, DWORD dwCommand, DWORD dwData)
_OnImeNotify(HWND hWnd, DWORD dwCommand, DWORD dwData UNUSED)
{
LRESULT lResult = 0;
HIMC hImc;
@@ -5802,9 +5785,8 @@ _OnImeNotify(HWND hWnd, DWORD dwCommand, DWORD dwData)
return lResult;
}
/*ARGSUSED*/
static LRESULT
_OnImeComposition(HWND hwnd, WPARAM dbcs, LPARAM param)
_OnImeComposition(HWND hwnd, WPARAM dbcs UNUSED, LPARAM param)
{
char_u *ret;
int len;
@@ -6844,13 +6826,12 @@ gui_mch_menu_grey(
* pressed, return that button's ID - IDCANCEL (2), which is the button's
* number.
*/
/*ARGSUSED*/
static LRESULT CALLBACK
dialog_callback(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
LPARAM lParam UNUSED)
{
if (message == WM_INITDIALOG)
{
@@ -8536,13 +8517,12 @@ delete_tooltip(BalloonEval *beval)
PostMessage(beval->balloon, WM_CLOSE, 0, 0);
}
/*ARGSUSED*/
static VOID CALLBACK
BevalTimerProc(
HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime)
HWND hwnd UNUSED,
UINT uMsg UNUSED,
UINT_PTR idEvent UNUSED,
DWORD dwTime)
{
POINT pt;
RECT rect;
@@ -8578,16 +8558,14 @@ BevalTimerProc(
}
}
/*ARGSUSED*/
void
gui_mch_disable_beval_area(BalloonEval *beval)
gui_mch_disable_beval_area(BalloonEval *beval UNUSED)
{
// TRACE0("gui_mch_disable_beval_area {{{");
KillTimer(s_textArea, BevalTimerId);
// TRACE0("gui_mch_disable_beval_area }}}");
}
/*ARGSUSED*/
void
gui_mch_enable_beval_area(BalloonEval *beval)
{
@@ -8619,7 +8597,6 @@ gui_mch_post_balloon(BalloonEval *beval, char_u *mesg)
// TRACE0("gui_mch_post_balloon }}}");
}
/*ARGSUSED*/
BalloonEval *
gui_mch_create_beval_area(
void *target, /* ignored, always use s_textArea */
@@ -8659,9 +8636,8 @@ gui_mch_create_beval_area(
return beval;
}
/*ARGSUSED*/
static void
Handle_WM_Notify(HWND hwnd, LPNMHDR pnmh)
Handle_WM_Notify(HWND hwnd UNUSED, LPNMHDR pnmh)
{
if (pnmh->idFrom != ID_BEVAL_TOOLTIP) /* it is not our tooltip */
return;
+9
View File
@@ -1716,6 +1716,8 @@ ex_luado(exarg_T *eap)
const char *s = (const char *) eap->arg;
luaL_Buffer b;
size_t len;
buf_T *was_curbuf = curbuf;
if (lua_init() == FAIL) return;
if (u_save(eap->line1 - 1, eap->line2 + 1) == FAIL)
{
@@ -1739,6 +1741,10 @@ ex_luado(exarg_T *eap)
lua_replace(L, -2); /* function -> body */
for (l = eap->line1; l <= eap->line2; l++)
{
/* Check the line number, the command my have deleted lines. */
if (l > curbuf->b_ml.ml_line_count)
break;
lua_pushvalue(L, -1); /* function */
luaV_pushline(L, curbuf, l); /* current line as arg */
lua_pushinteger(L, l); /* current line number as arg */
@@ -1747,6 +1753,9 @@ ex_luado(exarg_T *eap)
luaV_emsg(L);
break;
}
/* Catch the command switching to another buffer. */
if (curbuf != was_curbuf)
break;
if (lua_isstring(L, -1)) /* update line? */
{
#ifdef HAVE_SANDBOX
+5 -1
View File
@@ -1286,6 +1286,7 @@ ex_perldo(exarg_T *eap)
SV *sv;
char *str;
linenr_T i;
buf_T *was_curbuf = curbuf;
if (bufempty())
return;
@@ -1321,11 +1322,14 @@ ex_perldo(exarg_T *eap)
SAVETMPS;
for (i = eap->line1; i <= eap->line2; i++)
{
/* Check the line number, the command my have deleted lines. */
if (i > curbuf->b_ml.ml_line_count)
break;
sv_setpv(GvSV(PL_defgv), (char *)ml_get(i));
PUSHMARK(sp);
perl_call_pv("VIM::perldo", G_SCALAR | G_EVAL);
str = SvPV(GvSV(PL_errgv), length);
if (length)
if (length || curbuf != was_curbuf)
break;
SPAGAIN;
if (SvTRUEx(POPs))
+14 -1
View File
@@ -5619,6 +5619,7 @@ run_do(const char *cmd, void *arg UNUSED
int status;
PyObject *pyfunc, *pymain;
PyObject *run_ret;
buf_T *was_curbuf = curbuf;
if (u_save((linenr_T)RangeStart - 1, (linenr_T)RangeEnd + 1) != OK)
{
@@ -5671,7 +5672,9 @@ run_do(const char *cmd, void *arg UNUSED
#ifdef PY_CAN_RECURSE
*pygilstate = PyGILState_Ensure();
#endif
if (!(line = GetBufferLine(curbuf, lnum)))
/* Check the line number, the command my have deleted lines. */
if (lnum > curbuf->b_ml.ml_line_count
|| !(line = GetBufferLine(curbuf, lnum)))
goto err;
if (!(linenr = PyInt_FromLong((long) lnum)))
{
@@ -5684,9 +5687,19 @@ run_do(const char *cmd, void *arg UNUSED
if (!ret)
goto err;
/* Check that the command didn't switch to another buffer. */
if (curbuf != was_curbuf)
{
Py_XDECREF(ret);
goto err;
}
if (ret != Py_None)
if (SetBufferLine(curbuf, lnum, ret, NULL) == FAIL)
{
Py_XDECREF(ret);
goto err;
}
Py_XDECREF(ret);
PythonIO_Flush();
+9
View File
@@ -1122,6 +1122,9 @@ ex_python(exarg_T *eap)
{
char_u *script;
if (p_pyx == 0)
p_pyx = 2;
script = script_get(eap, eap->arg);
if (!eap->skip)
{
@@ -1145,6 +1148,9 @@ ex_pyfile(exarg_T *eap)
const char *file = (char *)eap->arg;
char *p;
if (p_pyx == 0)
p_pyx = 2;
/* Have to do it like this. PyRun_SimpleFile requires you to pass a
* stdio file pointer, but Vim and the Python DLL are compiled with
* different options under Windows, meaning that stdio pointers aren't
@@ -1183,6 +1189,9 @@ ex_pyfile(exarg_T *eap)
void
ex_pydo(exarg_T *eap)
{
if (p_pyx == 0)
p_pyx = 2;
DoPyCommand((char *)eap->arg,
(rangeinitializer) init_range_cmd,
(runner)run_do,
+9
View File
@@ -1018,6 +1018,9 @@ ex_py3(exarg_T *eap)
{
char_u *script;
if (p_pyx == 0)
p_pyx = 3;
script = script_get(eap, eap->arg);
if (!eap->skip)
{
@@ -1042,6 +1045,9 @@ ex_py3file(exarg_T *eap)
char *p;
int i;
if (p_pyx == 0)
p_pyx = 3;
/* Have to do it like this. PyRun_SimpleFile requires you to pass a
* stdio file pointer, but Vim and the Python DLL are compiled with
* different options under Windows, meaning that stdio pointers aren't
@@ -1094,6 +1100,9 @@ ex_py3file(exarg_T *eap)
void
ex_py3do(exarg_T *eap)
{
if (p_pyx == 0)
p_pyx = 3;
DoPyCommand((char *)eap->arg,
(rangeinitializer)init_range_cmd,
(runner)run_do,
+5
View File
@@ -792,6 +792,7 @@ void ex_rubydo(exarg_T *eap)
{
int state;
linenr_T i;
buf_T *was_curbuf = curbuf;
if (ensure_ruby_initialized())
{
@@ -801,6 +802,8 @@ void ex_rubydo(exarg_T *eap)
{
VALUE line;
if (i > curbuf->b_ml.ml_line_count)
break;
line = vim_str2rb_enc_str((char *)ml_get(i));
rb_lastline_set(line);
eval_enc_string_protect((char *) eap->arg, &state);
@@ -809,6 +812,8 @@ void ex_rubydo(exarg_T *eap)
error_print(state);
break;
}
if (was_curbuf != curbuf)
break;
line = rb_lastline_get();
if (!NIL_P(line))
{
+4 -1
View File
@@ -1958,6 +1958,7 @@ ex_tcldo(exarg_T *eap)
char var_line[VARNAME_SIZE];
linenr_T first_line = 0;
linenr_T last_line = 0;
buf_T *was_curbuf = curbuf;
rs = eap->line1;
re = eap->line2;
@@ -1979,6 +1980,8 @@ ex_tcldo(exarg_T *eap)
}
while (err == TCL_OK && rs <= re)
{
if ((linenr_T)rs > curbuf->b_ml.ml_line_count)
break;
line = (char *)ml_get_buf(curbuf, (linenr_T)rs, FALSE);
if (!line)
{
@@ -1994,7 +1997,7 @@ ex_tcldo(exarg_T *eap)
#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION >= 5) || TCL_MAJOR_VERSION > 8
|| Tcl_LimitExceeded(tclinfo.interp)
#endif
)
|| curbuf != was_curbuf)
break;
line = (char *)Tcl_GetVar(tclinfo.interp, var_line, 0);
if (line)
+85
View File
@@ -0,0 +1,85 @@
/* vi:set ts=8 sts=4 sw=4 noet:
*
* VIM - Vi IMproved by Bram Moolenaar
*
* Do ":help uganda" in Vim to read copying and usage conditions.
* Do ":help credits" in Vim to see a list of people who contributed.
* See README.txt for an overview of the Vim source code.
*/
/*
* kword_test.c: Unittests for vim_iswordc() and vim_iswordp().
*/
#undef NDEBUG
#include <assert.h>
/* Must include main.c because it contains much more than just main() */
#define NO_VIM_MAIN
#include "main.c"
/* This file has to be included because the tested functions are static */
#include "charset.c"
#ifdef FEAT_MBYTE
/*
* Test the results of vim_iswordc() and vim_iswordp() are matched.
*/
static void
test_isword_funcs_utf8(void)
{
buf_T buf;
int c;
vim_memset(&buf, 0, sizeof(buf));
p_enc = (char_u *)"utf-8";
p_isi = (char_u *)"";
p_isp = (char_u *)"";
p_isf = (char_u *)"";
buf.b_p_isk = (char_u *)"@,48-57,_,128-167,224-235";
curbuf = &buf;
mb_init(); /* calls init_chartab() */
for (c = 0; c < 0x10000; ++c)
{
char_u p[4] = {0};
int c1;
int retc;
int retp;
utf_char2bytes(c, p);
c1 = utf_ptr2char(p);
if (c != c1)
{
fprintf(stderr, "Failed: ");
fprintf(stderr,
"[c = %#04x, p = {%#02x, %#02x, %#02x}] ",
c, p[0], p[1], p[2]);
fprintf(stderr, "c != utf_ptr2char(p) (=%#04x)\n", c1);
abort();
}
retc = vim_iswordc_buf(c, &buf);
retp = vim_iswordp_buf(p, &buf);
if (retc != retp)
{
fprintf(stderr, "Failed: ");
fprintf(stderr,
"[c = %#04x, p = {%#02x, %#02x, %#02x}] ",
c, p[0], p[1], p[2]);
fprintf(stderr, "vim_iswordc(c) (=%d) != vim_iswordp(p) (=%d)\n",
retc, retp);
abort();
}
}
}
#endif
int
main(void)
{
#ifdef FEAT_MBYTE
test_isword_funcs_utf8();
#endif
return 0;
}
+15 -9
View File
@@ -57,6 +57,7 @@ setmark(int c)
setmark_pos(int c, pos_T *pos, int fnum)
{
int i;
buf_T *buf;
/* Check for a special key (may cause islower() to crash). */
if (c < 0)
@@ -75,9 +76,13 @@ setmark_pos(int c, pos_T *pos, int fnum)
return OK;
}
buf = buflist_findnr(fnum);
if (buf == NULL)
return FAIL;
if (c == '"')
{
curbuf->b_last_cursor = *pos;
buf->b_last_cursor = *pos;
return OK;
}
@@ -85,31 +90,31 @@ setmark_pos(int c, pos_T *pos, int fnum)
* file. */
if (c == '[')
{
curbuf->b_op_start = *pos;
buf->b_op_start = *pos;
return OK;
}
if (c == ']')
{
curbuf->b_op_end = *pos;
buf->b_op_end = *pos;
return OK;
}
if (c == '<' || c == '>')
{
if (c == '<')
curbuf->b_visual.vi_start = *pos;
buf->b_visual.vi_start = *pos;
else
curbuf->b_visual.vi_end = *pos;
if (curbuf->b_visual.vi_mode == NUL)
buf->b_visual.vi_end = *pos;
if (buf->b_visual.vi_mode == NUL)
/* Visual_mode has not yet been set, use a sane default. */
curbuf->b_visual.vi_mode = 'v';
buf->b_visual.vi_mode = 'v';
return OK;
}
if (ASCII_ISLOWER(c))
{
i = c - 'a';
curbuf->b_namedm[i] = *pos;
buf->b_namedm[i] = *pos;
return OK;
}
if (ASCII_ISUPPER(c) || VIM_ISDIGIT(c))
@@ -396,7 +401,8 @@ getmark_buf_fnum(
{
startp = &buf->b_visual.vi_start;
endp = &buf->b_visual.vi_end;
if ((c == '<') == lt(*startp, *endp))
if (((c == '<') == lt(*startp, *endp) || endp->lnum == 0)
&& startp->lnum != 0)
posp = startp;
else
posp = endp;
+8 -2
View File
@@ -895,7 +895,7 @@ mb_get_class_buf(char_u *p, buf_T *buf)
if (enc_dbcs != 0 && p[0] != NUL && p[1] != NUL)
return dbcs_class(p[0], p[1]);
if (enc_utf8)
return utf_class(utf_ptr2char(p));
return utf_class_buf(utf_ptr2char(p), buf);
return 0;
}
@@ -2693,6 +2693,12 @@ static struct interval emoji_all[] =
*/
int
utf_class(int c)
{
return utf_class_buf(c, curbuf);
}
int
utf_class_buf(int c, buf_T *buf)
{
/* sorted list of non-overlapping intervals */
static struct clinterval
@@ -2780,7 +2786,7 @@ utf_class(int c)
{
if (c == ' ' || c == '\t' || c == NUL || c == 0xa0)
return 0; /* blank */
if (vim_iswordc(c))
if (vim_iswordc_buf(c, buf))
return 2; /* word character */
return 1; /* punctuation */
}
+5 -4
View File
@@ -3264,7 +3264,11 @@ change_warning(
#endif
msg_clr_eos();
(void)msg_end();
if (msg_silent == 0 && !silent_mode)
if (msg_silent == 0 && !silent_mode
#ifdef FEAT_EVAL
&& time_for_testing != 1
#endif
)
{
out_flush();
ui_delay(1000L, TRUE); /* give the user time to think about it */
@@ -4459,9 +4463,6 @@ vim_setenv(char_u *name, char_u *val)
{
sprintf((char *)envbuf, "%s=%s", name, val);
putenv((char *)envbuf);
# ifdef libintl_putenv
libintl_putenv((char *)envbuf);
# endif
}
#endif
#ifdef FEAT_GETTEXT
+69 -31
View File
@@ -1602,7 +1602,10 @@ strup_save(char_u *orig)
{
s = alloc((unsigned)STRLEN(res) + 1 + newl - l);
if (s == NULL)
break;
{
vim_free(res);
return NULL;
}
mch_memmove(s, res, p - res);
STRCPY(s + (p - res) + newl, p + l);
p = s + (p - res);
@@ -1625,6 +1628,69 @@ strup_save(char_u *orig)
return res;
}
/*
* Make string "s" all lower-case and return it in allocated memory.
* Handles multi-byte characters as well as possible.
* Returns NULL when out of memory.
*/
char_u *
strlow_save(char_u *orig)
{
char_u *p;
char_u *res;
res = p = vim_strsave(orig);
if (res != NULL)
while (*p != NUL)
{
# ifdef FEAT_MBYTE
int l;
if (enc_utf8)
{
int c, lc;
int newl;
char_u *s;
c = utf_ptr2char(p);
lc = utf_tolower(c);
/* Reallocate string when byte count changes. This is rare,
* thus it's OK to do another malloc()/free(). */
l = utf_ptr2len(p);
newl = utf_char2len(lc);
if (newl != l)
{
s = alloc((unsigned)STRLEN(res) + 1 + newl - l);
if (s == NULL)
{
vim_free(res);
return NULL;
}
mch_memmove(s, res, p - res);
STRCPY(s + (p - res) + newl, p + l);
p = s + (p - res);
vim_free(res);
res = s;
}
utf_char2bytes(lc, p);
p += newl;
}
else if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
p += l; /* skip multi-byte character */
else
# endif
{
*p = TOLOWER_LOC(*p); /* note that tolower() can be a macro */
p++;
}
}
return res;
}
#endif
/*
@@ -1653,7 +1719,7 @@ vim_strncpy(char_u *to, char_u *from, size_t len)
/*
* Like strcat(), but make sure the result fits in "tosize" bytes and is
* always NUL terminated.
* always NUL terminated. "from" and "to" may overlap.
*/
void
vim_strcat(char_u *to, char_u *from, size_t tosize)
@@ -1667,7 +1733,7 @@ vim_strcat(char_u *to, char_u *from, size_t tosize)
to[tosize - 1] = NUL;
}
else
STRCPY(to + tolen, from);
mch_memmove(to + tolen, from, fromlen + 1);
}
/*
@@ -1740,34 +1806,6 @@ vim_memset(void *ptr, int c, size_t size)
}
#endif
/* skipped when generating prototypes, the prototype is in vim.h */
#ifdef VIM_MEMMOVE
/*
* Version of memmove() that handles overlapping source and destination.
* For systems that don't have a function that is guaranteed to do that (SYSV).
*/
void
mch_memmove(void *src_arg, void *dst_arg, size_t len)
{
/*
* A void doesn't have a size, we use char pointers.
*/
char *dst = dst_arg, *src = src_arg;
/* overlap, copy backwards */
if (dst > src && dst < src + len)
{
src += len;
dst += len;
while (len-- > 0)
*--dst = *--src;
}
else /* copy forwards */
while (len-- > 0)
*dst++ = *src++;
}
#endif
#if (!defined(HAVE_STRCASECMP) && !defined(HAVE_STRICMP)) || defined(PROTO)
/*
* Compare two strings, ignoring case, using current locale.
+8 -1
View File
@@ -2041,6 +2041,8 @@ do_pending_operator(cmdarg_T *cap, int old_col, int gui_yank)
if (restart_edit == 0)
restart_edit = restart_edit_save;
else
cap->retval |= CA_COMMAND_BUSY;
}
#else
vim_beep(BO_OPER);
@@ -9111,8 +9113,13 @@ nv_edit(cmdarg_T *cap)
beginline(BL_WHITE|BL_FIX);
break;
case K_PS: /* Bracketed paste works like "a"ppend, unless the
cursor is in the first column, then it inserts. */
if (curwin->w_cursor.col == 0)
break;
/*FALLTHROUGH*/
case 'a': /* "a"ppend is like "i"nsert on the next character. */
case K_PS: /* bracketed paste works like "a"ppend */
#ifdef FEAT_VIRTUALEDIT
/* increment coladd when in virtual space, increment the
* column otherwise, also to append after an unprintable char */
+1 -1
View File
@@ -2571,7 +2571,7 @@ op_insert(oparg_T *oap, long count1)
}
t1 = oap->start;
edit(NUL, FALSE, (linenr_T)count1);
(void)edit(NUL, FALSE, (linenr_T)count1);
/* When a tab was inserted, and the characters in front of the tab
* have been converted to a tab as well, the column of the cursor
+37
View File
@@ -485,6 +485,17 @@ struct vimoption
# define HIGHLIGHT_INIT "8:SpecialKey,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,N:CursorLineNr,r:Question,s:StatusLine,S:StatusLineNC,t:Title,v:Visual,w:WarningMsg,W:WildMenu,>:SignColumn,*:TabLine,#:TabLineSel,_:TabLineFill"
#endif
/* Default python version for pyx* commands */
#if defined(FEAT_PYTHON) && defined(FEAT_PYTHON3)
# define DEFAULT_PYTHON_VER 0
#elif defined(FEAT_PYTHON3)
# define DEFAULT_PYTHON_VER 3
#elif defined(FEAT_PYTHON)
# define DEFAULT_PYTHON_VER 2
#else
# define DEFAULT_PYTHON_VER 0
#endif
/*
* options[] is initialized here.
* The order of the options MUST be alphabetic for ":set all" and findoption().
@@ -2204,6 +2215,14 @@ static struct vimoption options[] =
{(char_u *)"", (char_u *)0L}
SCRIPTID_INIT},
#endif
{"pyxversion", "pyx", P_NUM|P_VI_DEF|P_SECURE,
#if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
(char_u *)&p_pyx, PV_NONE,
#else
(char_u *)NULL, PV_NONE,
#endif
{(char_u *)DEFAULT_PYTHON_VER, (char_u *)0L}
SCRIPTID_INIT},
{"quoteescape", "qe", P_STRING|P_ALLOCED|P_VI_DEF,
#ifdef FEAT_TEXTOBJ
(char_u *)&p_qe, PV_QE,
@@ -6716,6 +6735,15 @@ did_set_string_option(
mch_set_normal_colors();
#endif
}
if (varp == &T_BE && termcap_active)
{
if (*T_BE == NUL)
/* When clearing t_BE we assume the user no longer wants
* bracketed paste, thus disable it by writing t_BD. */
out_str(T_BD);
else
out_str(T_BE);
}
}
#ifdef FEAT_LINEBREAK
@@ -8973,6 +9001,15 @@ set_num_option(
mzvim_reset_timer();
#endif
#if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
/* 'pyxversion' */
else if (pp == &p_pyx)
{
if (p_pyx != 0 && p_pyx != 2 && p_pyx != 3)
errmsg = e_invarg;
}
#endif
/* sync undo before 'undolevels' changes */
else if (pp == &p_ul)
{
+3
View File
@@ -712,6 +712,9 @@ EXTERN char_u *p_py3home; /* 'pythonthreehome' */
EXTERN char_u *p_pydll; /* 'pythondll' */
EXTERN char_u *p_pyhome; /* 'pythonhome' */
#endif
#if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
EXTERN long p_pyx; /* 'pyxversion' */
#endif
#ifdef FEAT_RELTIME
EXTERN long p_rdt; /* 'redrawtime' */
#endif
+14 -22
View File
@@ -306,10 +306,8 @@ mch_settitle(
* 2: Just restore icon (which we don't have)
* 3: Restore title and icon (which we don't have)
*/
/*ARGSUSED*/
void
mch_restore_title(
int which)
mch_restore_title(int which UNUSED)
{
#ifndef FEAT_GUI_MSWIN
SetConsoleTitle(g_szOrigTitle);
@@ -345,13 +343,12 @@ mch_can_restore_icon(void)
* When 'shellslash' set do it the other way around.
* Return OK or FAIL.
*/
/*ARGSUSED*/
int
mch_FullName(
char_u *fname,
char_u *buf,
int len,
int force)
int force UNUSED)
{
int nResult = FAIL;
@@ -636,9 +633,8 @@ vim_stat(const char *name, stat_T *stp)
}
#if defined(FEAT_GUI_MSWIN) || defined(PROTO)
/*ARGSUSED*/
void
mch_settmode(int tmode)
mch_settmode(int tmode UNUSED)
{
/* nothing to do */
}
@@ -817,10 +813,8 @@ mch_char_avail(void)
/*
* set screen mode, always fails.
*/
/*ARGSUSED*/
int
mch_screenmode(
char_u *arg)
mch_screenmode(char_u *arg UNUSED)
{
EMSG(_(e_screenmode));
return FAIL;
@@ -996,10 +990,8 @@ mch_libcall(
/*
* Debugging helper: expose the MCH_WRITE_DUMP stuff to other modules
*/
/*ARGSUSED*/
void
DumpPutS(
const char *psz)
DumpPutS(const char *psz UNUSED)
{
# ifdef MCH_WRITE_DUMP
if (fdDump)
@@ -1173,9 +1165,12 @@ swap_me(COLORREF colorref)
# define PDP_RETVAL INT_PTR
#endif
/*ARGSUSED*/
static PDP_RETVAL CALLBACK
PrintDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
PrintDlgProc(
HWND hDlg,
UINT message,
WPARAM wParam UNUSED,
LPARAM lParam UNUSED)
{
#ifdef FEAT_GETTEXT
NONCLIENTMETRICS nm;
@@ -1236,9 +1231,8 @@ PrintDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
return FALSE;
}
/*ARGSUSED*/
static BOOL CALLBACK
AbortProc(HDC hdcPrn, int iCode)
AbortProc(HDC hdcPrn UNUSED, int iCode UNUSED)
{
MSG msg;
@@ -1683,9 +1677,8 @@ mch_print_begin(prt_settings_T *psettings)
return (ret > 0);
}
/*ARGSUSED*/
void
mch_print_end(prt_settings_T *psettings)
mch_print_end(prt_settings_T *psettings UNUSED)
{
EndDoc(prt_dlg.hDC);
if (!*bUserAbort)
@@ -2764,12 +2757,11 @@ points_to_pixels(char_u *str, char_u **end, int vertical, long_i pprinter_dc)
return pixels;
}
/*ARGSUSED*/
static int CALLBACK
font_enumproc(
ENUMLOGFONT *elf,
NEWTEXTMETRIC *ntm,
int type,
NEWTEXTMETRIC *ntm UNUSED,
int type UNUSED,
LPARAM lparam)
{
/* Return value:
+4 -8
View File
@@ -423,21 +423,17 @@ typedef struct dsc$descriptor DESC;
# endif
#endif
/* memmove is not present on all systems, use memmove, bcopy, memcpy or our
* own version */
/* Some systems have (void *) arguments, some (char *). If we use (char *) it
/* memmove() is not present on all systems, use memmove, bcopy or memcpy.
* Some systems have (void *) arguments, some (char *). If we use (char *) it
* works for all */
#ifdef USEMEMMOVE
#if defined(USEMEMMOVE) || (!defined(USEBCOPY) && !defined(USEMEMCPY))
# define mch_memmove(to, from, len) memmove((char *)(to), (char *)(from), len)
#else
# ifdef USEBCOPY
# define mch_memmove(to, from, len) bcopy((char *)(from), (char *)(to), len)
# else
# ifdef USEMEMCPY
/* ifdef USEMEMCPY */
# define mch_memmove(to, from, len) memcpy((char *)(to), (char *)(from), len)
# else
# define VIM_MEMMOVE /* found in misc2.c */
# endif
# endif
#endif
+3 -4
View File
@@ -38,13 +38,12 @@ void _cdecl SaveInst(HINSTANCE hInst);
static void (_cdecl *pSaveInst)(HINSTANCE);
#endif
/*ARGSUSED*/
int WINAPI
WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInst,
HINSTANCE hInstance UNUSED,
HINSTANCE hPrevInst UNUSED,
LPSTR lpszCmdLine,
int nCmdShow)
int nCmdShow UNUSED)
{
int argc = 0;
char **argv;
+74 -29
View File
@@ -515,6 +515,7 @@ static char *null_libintl_textdomain(const char *);
static char *null_libintl_bindtextdomain(const char *, const char *);
static char *null_libintl_bind_textdomain_codeset(const char *, const char *);
static int null_libintl_putenv(const char *);
static int null_libintl_wputenv(const wchar_t *);
static HINSTANCE hLibintlDLL = NULL;
char *(*dyn_libintl_gettext)(const char *) = null_libintl_gettext;
@@ -526,6 +527,7 @@ char *(*dyn_libintl_bindtextdomain)(const char *, const char *)
char *(*dyn_libintl_bind_textdomain_codeset)(const char *, const char *)
= null_libintl_bind_textdomain_codeset;
int (*dyn_libintl_putenv)(const char *) = null_libintl_putenv;
int (*dyn_libintl_wputenv)(const wchar_t *) = null_libintl_wputenv;
int
dyn_libintl_init(void)
@@ -591,9 +593,14 @@ dyn_libintl_init(void)
/* _putenv() function for the libintl.dll is optional. */
hmsvcrt = find_imported_module_by_funcname(hLibintlDLL, "getenv");
if (hmsvcrt != NULL)
{
dyn_libintl_putenv = (void *)GetProcAddress(hmsvcrt, "_putenv");
if (dyn_libintl_putenv == NULL || dyn_libintl_putenv == putenv)
dyn_libintl_wputenv = (void *)GetProcAddress(hmsvcrt, "_wputenv");
}
if (dyn_libintl_putenv == NULL || dyn_libintl_putenv == _putenv)
dyn_libintl_putenv = null_libintl_putenv;
if (dyn_libintl_wputenv == NULL || dyn_libintl_wputenv == _wputenv)
dyn_libintl_wputenv = null_libintl_wputenv;
return 1;
}
@@ -610,16 +617,15 @@ dyn_libintl_end(void)
dyn_libintl_bindtextdomain = null_libintl_bindtextdomain;
dyn_libintl_bind_textdomain_codeset = null_libintl_bind_textdomain_codeset;
dyn_libintl_putenv = null_libintl_putenv;
dyn_libintl_wputenv = null_libintl_wputenv;
}
/*ARGSUSED*/
static char *
null_libintl_gettext(const char *msgid)
{
return (char*)msgid;
}
/*ARGSUSED*/
static char *
null_libintl_ngettext(
const char *msgid,
@@ -629,31 +635,36 @@ null_libintl_ngettext(
return (char *)(n == 1 ? msgid : msgid_plural);
}
/*ARGSUSED*/
static char *
null_libintl_bindtextdomain(const char *domainname, const char *dirname)
null_libintl_bindtextdomain(
const char *domainname UNUSED,
const char *dirname UNUSED)
{
return NULL;
}
/*ARGSUSED*/
static char *
null_libintl_bind_textdomain_codeset(const char *domainname,
const char *codeset)
null_libintl_bind_textdomain_codeset(
const char *domainname UNUSED,
const char *codeset UNUSED)
{
return NULL;
}
/*ARGSUSED*/
static char *
null_libintl_textdomain(const char *domainname)
null_libintl_textdomain(const char *domainname UNUSED)
{
return NULL;
}
/*ARGSUSED*/
int
null_libintl_putenv(const char *envstring)
null_libintl_putenv(const char *envstring UNUSED)
{
return 0;
}
int
null_libintl_wputenv(const wchar_t *envstring UNUSED)
{
return 0;
}
@@ -1045,9 +1056,8 @@ decode_key_event(
* For the GUI the mouse handling is in gui_w32.c.
*/
# ifdef FEAT_GUI_W32
/*ARGSUSED*/
void
mch_setmouse(int on)
mch_setmouse(int on UNUSED)
{
}
# else
@@ -1643,13 +1653,12 @@ tgetch(int *pmodifiers, WCHAR *pch2)
* If time == -1, wait forever for characters.
* Returns the number of characters read into buf.
*/
/*ARGSUSED*/
int
mch_inchar(
char_u *buf,
int maxlen,
long time,
int tb_change_cnt)
char_u *buf UNUSED,
int maxlen UNUSED,
long time UNUSED,
int tb_change_cnt UNUSED)
{
#ifndef FEAT_GUI_W32 /* this isn't used for the GUI */
@@ -2577,11 +2586,10 @@ mch_exit(int r)
/*
* Do we have an interactive window?
*/
/*ARGSUSED*/
int
mch_check_win(
int argc,
char **argv)
int argc UNUSED,
char **argv UNUSED)
{
get_exe_name();
@@ -5333,11 +5341,10 @@ termcap_mode_end(void)
#ifdef FEAT_GUI_W32
/*ARGSUSED*/
void
mch_write(
char_u *s,
int len)
char_u *s UNUSED,
int len UNUSED)
{
/* never used */
}
@@ -6035,11 +6042,10 @@ mch_write(
/*
* Delay for "msec" milliseconds.
*/
/*ARGSUSED*/
void
mch_delay(
long msec,
int ignoreinput)
int ignoreinput UNUSED)
{
#ifdef FEAT_GUI_W32
Sleep((int)msec); /* never wait for input */
@@ -6128,9 +6134,8 @@ mch_breakcheck(int force)
/*
* How much main memory in KiB that can be used by VIM.
*/
/*ARGSUSED*/
long_u
mch_total_mem(int special)
mch_total_mem(int special UNUSED)
{
MEMORYSTATUSEX ms;
@@ -6985,3 +6990,43 @@ fix_arg_enc(void)
set_alist_count();
}
#endif
int
mch_setenv(char *var, char *value, int x)
{
char_u *envbuf;
envbuf = alloc((unsigned)(STRLEN(var) + STRLEN(value) + 2));
if (envbuf == NULL)
return -1;
sprintf((char *)envbuf, "%s=%s", var, value);
#ifdef FEAT_MBYTE
if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
{
WCHAR *p = enc_to_utf16(envbuf, NULL);
vim_free(envbuf);
if (p == NULL)
return -1;
_wputenv(p);
# ifdef libintl_wputenv
libintl_wputenv(p);
# endif
/* Unlike Un*x systems, we can free the string for _wputenv(). */
vim_free(p);
}
else
#endif
{
_putenv((char *)envbuf);
# ifdef libintl_putenv
libintl_putenv((char *)envbuf);
# endif
/* Unlike Un*x systems, we can free the string for _putenv(). */
vim_free(envbuf);
}
return 0;
}
+3 -1
View File
@@ -202,7 +202,9 @@ Trace(char *pszFormat, ...);
#define ASSERT_NULL_OR_POINTER(p, type) \
ASSERT(((p) == NULL) || IsValidAddress((p), sizeof(type), FALSE))
#define mch_setenv(name, val, x) setenv(name, val, x)
#ifndef HAVE_SETENV
# define HAVE_SETENV
#endif
#define mch_getenv(x) (char_u *)getenv((char *)(x))
#ifdef __BORLANDC__
# define vim_mkdir(x, y) mkdir(x)
+6 -5
View File
@@ -232,12 +232,13 @@ sk.cp1250.po: sk.po
iconv -f iso-8859-2 -t cp1250 sk.po | \
sed -e 's/charset=ISO-8859-2/charset=cp1250/' -e 's/# Original translations/# Generated from sk.po, DO NOT EDIT/' > sk.cp1250.po
# Convert zh_CN.po to create zh_CN.cp936.po.
# set 'charset' to gbk to avoid that msfmt generates a warning
zh_CN.cp936.po: zh_CN.po
# Convert zh_CN.UTF-8.po to create zh_CN.cp936.po.
# Set 'charset' to gbk to avoid that msfmt generates a warning.
# This used to convert from zh_CN.po, but that results in a conversion error.
zh_CN.cp936.po: zh_CN.UTF-8.po
rm -f zh_CN.cp936.po
iconv -f gb2312 -t cp936 zh_CN.po | \
sed -e 's/charset=gb2312/charset=gbk/' -e 's/# Original translations/# Generated from zh_CN.po, DO NOT EDIT/' > zh_CN.cp936.po
iconv -f UTF-8 -t cp936 zh_CN.UTF-8.po | \
sed -e 's/charset=utf-8/charset=gbk/' -e 's/# Original translations/# Generated from zh_CN.po, DO NOT EDIT/' > zh_CN.cp936.po
# Convert ko.UTF-8.po to create ko.po.
ko.po: ko.UTF-8.po
+2 -1
View File
@@ -2894,7 +2894,8 @@ msgstr "-X\t\t\t不连接到 X Server"
msgid "--remote <files>\tEdit <files> in a Vim server if possible"
msgstr "--remote <files>\t如有可能,在 Vim 服务器上编辑文件 <files>"
msgid "--remote-silent <files> Same, don't complain if there is no server"
msgid ""
"--remote-silent <files> Same, don't complain if there is no server"
msgstr "--remote-silent <files> 同上,找不到服务器时不抱怨"
msgid ""
+6 -7
View File
@@ -241,9 +241,8 @@ msgstr "
msgid " Tag completion (^]^N^P)"
msgstr " Tag 补全 (^]^N^P)"
#, fuzzy
#~ msgid " Path pattern completion (^N^P)"
#~ msgstr " 路径模式补全 (^N^P)"
msgid " Path pattern completion (^N^P)"
msgstr " 头文件模式补全 (^N^P)"
msgid " Definition completion (^D^N^P)"
msgstr " 定义补全 (^D^N^P)"
@@ -2896,7 +2895,7 @@ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
msgstr "--remote <files>\t如有可能,在 Vim 服务器上编辑文件 <files>"
msgid "--remote-silent <files> Same, don't complain if there is no server"
msgstr "--remote-silent <files> 同上,找不到服务器时槐г"
msgstr "--remote-silent <files> 同上,找不到服务器时不抱怨"
msgid ""
"--remote-wait <files> As --remote but wait for files to have been edited"
@@ -5284,7 +5283,7 @@ msgstr "Vim:
#. must display the prompt
msgid "No undo possible; continue anyway"
msgstr "无法撤销;继续"
msgstr "无法撤销;仍然继续"
msgid "Already at oldest change"
msgstr "已位于最旧的改变"
@@ -5601,13 +5600,13 @@ msgid "type :help cp-default<Enter> for info on this"
msgstr "输入 :help cp-default<Enter> 查看相关说明 "
msgid "menu Help->Orphans for information "
msgstr "菜单 Help->Orphans 查看说明 "
msgstr "菜单 帮助->孤儿 查看说明 "
msgid "Running modeless, typed text is inserted"
msgstr "无模式运行,输入文字即插入"
msgid "menu Edit->Global Settings->Toggle Insert Mode "
msgstr "菜单 Edit->Global Settings->Toggle Insert Mode "
msgstr "菜单 编辑->全局设定->开/关插入模式 "
#, fuzzy
#~ msgid " for two modes "
+4
View File
@@ -75,6 +75,10 @@ int do_in_runtimepath(char_u *name, int flags, void (*callback)(char_u *fname, v
void ex_packloadall(exarg_T *eap);
void ex_packadd(exarg_T *eap);
void ex_options(exarg_T *eap);
void init_pyxversion(void);
void ex_pyxfile(exarg_T *eap);
void ex_pyx(exarg_T *eap);
void ex_pyxdo(exarg_T *eap);
void ex_source(exarg_T *eap);
linenr_T *source_breakpoint(void *cookie);
int *source_dbg_tick(void *cookie);
+1
View File
@@ -40,6 +40,7 @@ int utf_char2bytes(int c, char_u *buf);
int utf_iscomposing(int c);
int utf_printable(int c);
int utf_class(int c);
int utf_class_buf(int c, buf_T *buf);
int utf_ambiguous_width(int c);
int utf_fold(int a);
int utf_toupper(int a);
+1
View File
@@ -40,6 +40,7 @@ char_u *vim_strsave_up(char_u *string);
char_u *vim_strnsave_up(char_u *string, int len);
void vim_strup(char_u *p);
char_u *strup_save(char_u *orig);
char_u *strlow_save(char_u *orig);
void del_trailing_spaces(char_u *ptr);
void vim_strncpy(char_u *to, char_u *from, size_t len);
void vim_strcat(char_u *to, char_u *from, size_t tosize);
+1
View File
@@ -65,4 +65,5 @@ void free_cmd_argsW(void);
void used_file_arg(char *name, int literal, int full_path, int diff_mode);
void set_alist_count(void);
void fix_arg_enc(void);
int mch_setenv(char *var, char *value, int x);
/* vim: set ft=c : */
+88 -97
View File
@@ -777,101 +777,7 @@ update_screen(int type)
#endif
}
#if defined(FEAT_CONCEAL) || defined(PROTO)
/*
* Return TRUE if the cursor line in window "wp" may be concealed, according
* to the 'concealcursor' option.
*/
int
conceal_cursor_line(win_T *wp)
{
int c;
if (*wp->w_p_cocu == NUL)
return FALSE;
if (get_real_state() & VISUAL)
c = 'v';
else if (State & INSERT)
c = 'i';
else if (State & NORMAL)
c = 'n';
else if (State & CMDLINE)
c = 'c';
else
return FALSE;
return vim_strchr(wp->w_p_cocu, c) != NULL;
}
/*
* Check if the cursor line needs to be redrawn because of 'concealcursor'.
*/
void
conceal_check_cursur_line(void)
{
if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin))
{
need_cursor_line_redraw = TRUE;
/* Need to recompute cursor column, e.g., when starting Visual mode
* without concealing. */
curs_columns(TRUE);
}
}
void
update_single_line(win_T *wp, linenr_T lnum)
{
int row;
int j;
/* Don't do anything if the screen structures are (not yet) valid. */
if (!screen_valid(TRUE))
return;
if (lnum >= wp->w_topline && lnum < wp->w_botline
&& foldedCount(wp, lnum, &win_foldinfo) == 0)
{
# ifdef FEAT_GUI
/* Remove the cursor before starting to do anything, because scrolling
* may make it difficult to redraw the text under it. */
if (gui.in_use)
gui_undraw_cursor();
# endif
row = 0;
for (j = 0; j < wp->w_lines_valid; ++j)
{
if (lnum == wp->w_lines[j].wl_lnum)
{
screen_start(); /* not sure of screen cursor */
# ifdef FEAT_SEARCH_EXTRA
init_search_hl(wp);
start_search_hl();
prepare_search_hl(wp, lnum);
# endif
win_line(wp, lnum, row, row + wp->w_lines[j].wl_size, FALSE);
# if defined(FEAT_SEARCH_EXTRA)
end_search_hl();
# endif
break;
}
row += wp->w_lines[j].wl_size;
}
# ifdef FEAT_GUI
/* Redraw the cursor */
if (gui.in_use)
{
out_flush(); /* required before updating the cursor */
gui_update_cursor(FALSE, FALSE);
}
# endif
}
need_cursor_line_redraw = FALSE;
}
#endif
#if defined(FEAT_SIGNS) || defined(FEAT_GUI)
static void update_prepare(void);
static void update_finish(void);
#if defined(FEAT_SIGNS) || defined(FEAT_GUI) || defined(FEAT_CONCEAL)
/*
* Prepare for updating one or more windows.
* Caller must check for "updating_screen" already set to avoid recursiveness.
@@ -922,6 +828,87 @@ update_finish(void)
}
#endif
#if defined(FEAT_CONCEAL) || defined(PROTO)
/*
* Return TRUE if the cursor line in window "wp" may be concealed, according
* to the 'concealcursor' option.
*/
int
conceal_cursor_line(win_T *wp)
{
int c;
if (*wp->w_p_cocu == NUL)
return FALSE;
if (get_real_state() & VISUAL)
c = 'v';
else if (State & INSERT)
c = 'i';
else if (State & NORMAL)
c = 'n';
else if (State & CMDLINE)
c = 'c';
else
return FALSE;
return vim_strchr(wp->w_p_cocu, c) != NULL;
}
/*
* Check if the cursor line needs to be redrawn because of 'concealcursor'.
*/
void
conceal_check_cursur_line(void)
{
if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin))
{
need_cursor_line_redraw = TRUE;
/* Need to recompute cursor column, e.g., when starting Visual mode
* without concealing. */
curs_columns(TRUE);
}
}
void
update_single_line(win_T *wp, linenr_T lnum)
{
int row;
int j;
/* Don't do anything if the screen structures are (not yet) valid. */
if (!screen_valid(TRUE) || updating_screen)
return;
if (lnum >= wp->w_topline && lnum < wp->w_botline
&& foldedCount(wp, lnum, &win_foldinfo) == 0)
{
update_prepare();
row = 0;
for (j = 0; j < wp->w_lines_valid; ++j)
{
if (lnum == wp->w_lines[j].wl_lnum)
{
screen_start(); /* not sure of screen cursor */
# ifdef FEAT_SEARCH_EXTRA
init_search_hl(wp);
start_search_hl();
prepare_search_hl(wp, lnum);
# endif
win_line(wp, lnum, row, row + wp->w_lines[j].wl_size, FALSE);
# if defined(FEAT_SEARCH_EXTRA)
end_search_hl();
# endif
break;
}
row += wp->w_lines[j].wl_size;
}
update_finish();
}
need_cursor_line_redraw = FALSE;
}
#endif
#if defined(FEAT_SIGNS) || defined(PROTO)
void
update_debug_sign(buf_T *buf, linenr_T lnum)
@@ -2916,7 +2903,7 @@ win_line(
int endrow,
int nochange UNUSED) /* not updating for changed text */
{
int col; /* visual column on screen */
int col = 0; /* visual column on screen */
unsigned off; /* offset in ScreenLines/ScreenAttrs */
int c = 0; /* init for GCC */
long vcol = 0; /* virtual column (for tabs) */
@@ -3442,7 +3429,11 @@ win_line(
#else
--ptr;
#endif
n_skip = v - vcol;
#ifdef FEAT_MBYTE
/* character fits on the screen, don't need to skip it */
if ((*mb_ptr2cells)(ptr) >= c && col == 0)
#endif
n_skip = v - vcol;
}
/*
+1
View File
@@ -1337,6 +1337,7 @@ typedef struct
int uf_varargs; /* variable nr of arguments */
int uf_flags;
int uf_calls; /* nr of active calls */
int uf_cleared; /* func_clear() was already called */
garray_T uf_args; /* arguments */
garray_T uf_lines; /* function lines */
#ifdef FEAT_PROFILE
+7 -2
View File
@@ -84,7 +84,6 @@ SCRIPTS_ALL = \
test_listchars.out \
test_listlbr.out \
test_search_mbyte.out \
test_utf8.out \
test_wordcount.out
@@ -165,6 +164,7 @@ NEW_TESTS = test_arglist.res \
test_job_fails.res \
test_json.res \
test_langmap.res \
test_lua.res \
test_man.res \
test_marks.res \
test_matchadd_conceal.res \
@@ -173,10 +173,14 @@ NEW_TESTS = test_arglist.res \
test_nested_function.res \
test_netbeans.res \
test_normal.res \
test_paste.res \
test_packadd.res \
test_paste.res \
test_perl.res \
test_profile.res \
test_python2.res \
test_python3.res \
test_pyx2.res \
test_pyx3.res \
test_quickfix.res \
test_retab.res \
test_ruby.res \
@@ -189,6 +193,7 @@ NEW_TESTS = test_arglist.res \
test_substitute.res \
test_syntax.res \
test_system.res \
test_tcl.res \
test_textobjects.res \
test_undo.res \
test_usercommands.res \
+2 -2
View File
@@ -78,7 +78,7 @@ test1.out: test1.in
# 200 msec is sufficient, but only modern sleep supports a fraction of
# a second, fall back to a second if it fails.
@-/bin/sh -c "sleep .2 > /dev/null 2>&1 || sleep 1"
-$(RUN_VIM) $*.in
$(RUN_VIM) $*.in
# For flaky tests retry one time. No tests at the moment.
#@/bin/sh -c "if test -f test.out -a $* = test61; then \
@@ -108,7 +108,7 @@ bench_re_freeze.out: bench_re_freeze.vim
# 200 msec is sufficient, but only modern sleep supports a fraction of
# a second, fall back to a second if it fails.
@-/bin/sh -c "sleep .2 > /dev/null 2>&1 || sleep 1"
-$(RUN_VIM) $*.in
$(RUN_VIM) $*.in
@/bin/sh -c "if test -f benchmark.out; then cat benchmark.out; fi"
nolog:
+4
View File
@@ -0,0 +1,4 @@
# requires python 2.x
import sys
print(sys.version)
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/python2
import sys
print(sys.version)
+4
View File
@@ -0,0 +1,4 @@
# requires python 3.x
import sys
print(sys.version)
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/python3
import sys
print(sys.version)
+2
View File
@@ -0,0 +1,2 @@
import sys
print(sys.version)
+13 -4
View File
@@ -88,6 +88,14 @@ endfunc
function RunTheTest(test)
echo 'Executing ' . a:test
" Avoid stopping at the "hit enter" prompt
set nomore
" Avoid a three second wait when a message is about to be overwritten by the
" mode message.
set noshowmode
if exists("*SetUp")
try
call SetUp()
@@ -153,15 +161,16 @@ endif
" Names of flaky tests.
let s:flaky = [
\ 'Test_reltime()',
\ 'Test_nb_basic()',
\ 'Test_close_and_exit_cb()',
\ 'Test_collapse_buffers()',
\ 'Test_communicate()',
\ 'Test_nb_basic()',
\ 'Test_pipe_through_sort_all()',
\ 'Test_pipe_through_sort_some()'
\ 'Test_pipe_through_sort_some()',
\ 'Test_reltime()',
\ ]
" Locate Test_ functions and execute them.
set nomore
redir @q
silent function /^Test_
redir END
+1
View File
@@ -19,6 +19,7 @@ source test_float_func.vim
source test_fnamemodify.vim
source test_functions.vim
source test_glob2regpat.vim
source test_ga.vim
source test_goto.vim
source test_help_tagjump.vim
source test_join.vim
+1
View File
@@ -9,3 +9,4 @@ source test_expr_utf8.vim
source test_matchadd_conceal_utf8.vim
source test_regexp_utf8.vim
source test_source_utf8.vim
source test_utf8.vim
+6
View File
@@ -121,6 +121,12 @@ func Test_assert_inrange()
call assert_fails('call assert_inrange(1, 1)', 'E119:')
endfunc
func Test_assert_with_msg()
call assert_equal('foo', 'bar', 'testing')
call assert_match("testing: Expected 'foo' but got 'bar'", v:errors[0])
call remove(v:errors, 0)
endfunc
func Test_user_is_happy()
smile
sleep 300m
+49
View File
@@ -1,4 +1,5 @@
" Simplistic testing of Farsi mode.
" Note: must be edited with latin1 encoding.
if !has('farsi')
finish
@@ -82,3 +83,51 @@ func Test_farsi_map()
set noaltkeymap
bwipe!
endfunc
func Test_input_farsi()
new
setlocal rightleft fkmap
" numbers switch input direction
call feedkeys("aabc0123456789.+-^%#=xyz\<Esc>", 'tx')
call assert_equal("\x8c旽蔭左重此虞項斑盛啪\x93", getline('.'))
" all non-number special chars with spaces
call feedkeys("oB E F H I K L M O P Q R T U W Y ` ! @ # $ % ^ & * () - _ = + \\ | : \" . / < > ? \<Esc>", 'tx')
call assert_equal("[髗𦡆𦆭峁𦷜𣙷𧂭𨯂迚𣳇𧒆𠼻𧙖𥻗舚朌僙", getline('.'))
" all non-number special chars without spaces
call feedkeys("oBEFHIKLMOPQRTUWY`!@#$%^&*()-_=+\\|:\"./<>?\<Esc>",'tx')
call assert_equal("↑滙欉褅[]蘼襝蘘╯妙丰狀閮帛朣恨篝誚紋撚", getline('.'))
" all letter chars with spaces
call feedkeys("oa A b c C d D e f g G h i j J k l m n N o p q r s S t u v V w x X y z Z ; \ , [ ] \<Esc>", 'tx')
call assert_equal("煢蟎臈", getline('.'))
" all letter chars without spaces
call feedkeys("oaAbcCdDefgGhijJklmnNopqrsStuvVwxXyzZ;\,[]\<Esc>", 'tx')
call assert_equal("\x8c癵恘\x9f螰x86\x83媱縷x9d\x85\x80\x9c\x9b\x84佫\x8a\x89\x8e\x96\x8b餤x95\x90迋\x8d娵\x93淏\x97綅x87\x88", getline('.'))
bwipe!
endfunc
func Test_command_line_farsi()
set allowrevins altkeymap
" letter characters with spaces
call feedkeys(":\"\<C-_>a A b c C d D e f g G h i j J k l m n N o p q r s S t u v V w x X y z Z ; \\ , [ ]\<CR>", 'tx')
call assert_equal("\"\x88蟎煢𧙖㷛瑨瑨蟁覩覩趦眫眫涹𤀑𦍌㘵瓧螌詉貭貭畓憜㳑齐𦻑恷眤𤼎悤𦟌螩𦉫蓚瓸譃䕢榲", getreg(':'))
" letter characters without spaces
call feedkeys(":\"\<C-_>aAbcCdDefgGhijJklmnNopqrsStuvVwxXyzZ;\\,[]\<CR>", 'tx')
call assert_equal("\"\x88\x87蜎祰惝x93娵\x8d迋\x90\x95餤x8b\x96\x8e\x89\x8a佫\x84\x9b\x9c\x80\x85\x9d霞鄃x83\x86螰x9f玴泂\x8c", getreg(':'))
" other characters with spaces
call feedkeys(":\"\<C-_>0 1 2 3 4 5 6 7 8 9 ` . ! \" $ % ^ & / () = \\ ? + - _ * : # ~ @ < > { } | B E F H I K L M O P Q R T U W Y\<CR>", 'tx')
call assert_equal("\"]惽覉删䭾𠃮脃嬟𨨏嵗𥻗栂𣏵聢聛𡵆㗒矾舚㰘𣳇𠼻䁥阸𨸹朌僙𨯂覔瓲甅絍聣聦稭糚𥼚糂", getreg(':'))
" other characters without spaces
call feedkeys(":\"\<C-_>0123456789`.!\"$%^&/()=\\?+-_*:#~@<>{}|BEFHIKLMOPQRTUWY\<CR>", 'tx')
call assert_equal("\"嚬貗齀][釐翫盪禲瞕{撫坍捏鴇重辨蔗辛洩奶誨弛兢毓絕陴掠", getreg(':'))
set noallowrevins noaltkeymap
endfunc
+374
View File
@@ -1,5 +1,78 @@
" Tests for various functions.
func Test_empty()
call assert_equal(1, empty(''))
call assert_equal(0, empty('a'))
call assert_equal(1, empty(0))
call assert_equal(1, empty(-0))
call assert_equal(0, empty(1))
call assert_equal(0, empty(-1))
call assert_equal(1, empty(0.0))
call assert_equal(1, empty(-0.0))
call assert_equal(0, empty(1.0))
call assert_equal(0, empty(-1.0))
call assert_equal(0, empty(1.0/0.0))
call assert_equal(0, empty(0.0/0.0))
call assert_equal(1, empty([]))
call assert_equal(0, empty(['a']))
call assert_equal(1, empty({}))
call assert_equal(0, empty({'a':1}))
call assert_equal(1, empty(v:null))
call assert_equal(1, empty(v:none))
call assert_equal(1, empty(v:false))
call assert_equal(0, empty(v:true))
call assert_equal(0, empty(function('Test_empty')))
endfunc
func Test_len()
call assert_equal(1, len(0))
call assert_equal(2, len(12))
call assert_equal(0, len(''))
call assert_equal(2, len('ab'))
call assert_equal(0, len([]))
call assert_equal(2, len([2, 1]))
call assert_equal(0, len({}))
call assert_equal(2, len({'a': 1, 'b': 2}))
call assert_fails('call len(v:none)', 'E701:')
call assert_fails('call len({-> 0})', 'E701:')
endfunc
func Test_max()
call assert_equal(0, max([]))
call assert_equal(2, max([2]))
call assert_equal(2, max([1, 2]))
call assert_equal(2, max([1, 2, v:null]))
call assert_equal(0, max({}))
call assert_equal(2, max({'a':1, 'b':2}))
call assert_fails('call max(1)', 'E712:')
call assert_fails('call max(v:none)', 'E712:')
endfunc
func Test_min()
call assert_equal(0, min([]))
call assert_equal(2, min([2]))
call assert_equal(1, min([1, 2]))
call assert_equal(0, min([1, 2, v:null]))
call assert_equal(0, min({}))
call assert_equal(1, min({'a':1, 'b':2}))
call assert_fails('call min(1)', 'E712:')
call assert_fails('call min(v:none)', 'E712:')
endfunc
func Test_str2nr()
call assert_equal(0, str2nr(''))
call assert_equal(1, str2nr('1'))
@@ -15,4 +88,305 @@ func Test_str2nr()
call assert_equal(123456789, str2nr('123456789'))
call assert_equal(-123456789, str2nr('-123456789'))
call assert_equal(5, str2nr('101', 2))
call assert_equal(5, str2nr('0b101', 2))
call assert_equal(5, str2nr('0B101', 2))
call assert_equal(-5, str2nr('-101', 2))
call assert_equal(-5, str2nr('-0b101', 2))
call assert_equal(-5, str2nr('-0B101', 2))
call assert_equal(65, str2nr('101', 8))
call assert_equal(65, str2nr('0101', 8))
call assert_equal(-65, str2nr('-101', 8))
call assert_equal(-65, str2nr('-0101', 8))
call assert_equal(11259375, str2nr('abcdef', 16))
call assert_equal(11259375, str2nr('ABCDEF', 16))
call assert_equal(-11259375, str2nr('-ABCDEF', 16))
call assert_equal(11259375, str2nr('0xabcdef', 16))
call assert_equal(11259375, str2nr('0Xabcdef', 16))
call assert_equal(11259375, str2nr('0XABCDEF', 16))
call assert_equal(-11259375, str2nr('-0xABCDEF', 16))
call assert_equal(0, str2nr('0x10'))
call assert_equal(0, str2nr('0b10'))
call assert_equal(1, str2nr('12', 2))
call assert_equal(1, str2nr('18', 8))
call assert_equal(1, str2nr('1g', 16))
call assert_equal(0, str2nr(v:null))
call assert_equal(0, str2nr(v:none))
call assert_fails('call str2nr([])', 'E730:')
call assert_fails('call str2nr({->2})', 'E729:')
call assert_fails('call str2nr(1.2)', 'E806:')
call assert_fails('call str2nr(10, [])', 'E474:')
endfunc
func Test_strftime()
if !exists('*strftime')
return
endif
" Format of strftime() depends on system. We assume
" that basic formats tested here are available and
" identical on all systems which support strftime().
"
" The 2nd parameter of strftime() is a local time, so the output day
" of strftime() can be 17 or 18, depending on timezone.
call assert_match('^2017-01-1[78]$', strftime('%Y-%m-%d', 1484695512))
"
call assert_match('^\d\d\d\d-\(0\d\|1[012]\)-\([012]\d\|3[01]\) \([01]\d\|2[0-3]\):[0-5]\d:\([0-5]\d\|60\)$', strftime('%Y-%m-%d %H:%M:%S'))
call assert_fails('call strftime([])', 'E730:')
call assert_fails('call strftime("%Y", [])', 'E745:')
endfunc
func Test_simplify()
call assert_equal('', simplify(''))
call assert_equal('/', simplify('/'))
call assert_equal('/', simplify('/.'))
call assert_equal('/', simplify('/..'))
call assert_equal('/...', simplify('/...'))
call assert_equal('./dir/file', simplify('./dir/file'))
call assert_equal('./dir/file', simplify('.///dir//file'))
call assert_equal('./dir/file', simplify('./dir/./file'))
call assert_equal('./file', simplify('./dir/../file'))
call assert_equal('../dir/file', simplify('dir/../../dir/file'))
call assert_equal('./file', simplify('dir/.././file'))
call assert_fails('call simplify({->0})', 'E729:')
call assert_fails('call simplify([])', 'E730:')
call assert_fails('call simplify({})', 'E731:')
call assert_fails('call simplify(1.2)', 'E806:')
endfunc
func Test_tolower()
call assert_equal("", tolower(""))
" Test with all printable ASCII characters.
call assert_equal(' !"#$%&''()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~',
\ tolower(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'))
if !has('multi_byte')
return
endif
" Test with a few uppercase diacritics.
call assert_equal("aàáâãäåāăąǎǟǡả", tolower("AÀÁÂÃÄÅĀĂĄǍǞǠẢ"))
call assert_equal("bḃḇ", tolower("BḂḆ"))
call assert_equal("cçćĉċč", tolower("CÇĆĈĊČ"))
call assert_equal("dďđḋḏḑ", tolower("DĎĐḊḎḐ"))
call assert_equal("eèéêëēĕėęěẻẽ", tolower("EÈÉÊËĒĔĖĘĚẺẼ"))
call assert_equal("fḟ ", tolower("FḞ "))
call assert_equal("gĝğġģǥǧǵḡ", tolower("GĜĞĠĢǤǦǴḠ"))
call assert_equal("hĥħḣḧḩ", tolower("HĤĦḢḦḨ"))
call assert_equal("iìíîïĩīĭįiǐỉ", tolower("IÌÍÎÏĨĪĬĮİǏỈ"))
call assert_equal("jĵ", tolower("JĴ"))
call assert_equal("kķǩḱḵ", tolower("KĶǨḰḴ"))
call assert_equal("lĺļľŀłḻ", tolower("LĹĻĽĿŁḺ"))
call assert_equal("mḿṁ", tolower("MḾṀ"))
call assert_equal("nñńņňṅṉ", tolower("NÑŃŅŇṄṈ"))
call assert_equal("oòóôõöøōŏőơǒǫǭỏ", tolower("OÒÓÔÕÖØŌŎŐƠǑǪǬỎ"))
call assert_equal("pṕṗ", tolower("PṔṖ"))
call assert_equal("q", tolower("Q"))
call assert_equal("rŕŗřṙṟ", tolower("RŔŖŘṘṞ"))
call assert_equal("sśŝşšṡ", tolower("SŚŜŞŠṠ"))
call assert_equal("tţťŧṫṯ", tolower("TŢŤŦṪṮ"))
call assert_equal("uùúûüũūŭůűųưǔủ", tolower("UÙÚÛÜŨŪŬŮŰŲƯǓỦ"))
call assert_equal("vṽ", tolower("VṼ"))
call assert_equal("wŵẁẃẅẇ", tolower("WŴẀẂẄẆ"))
call assert_equal("xẋẍ", tolower("XẊẌ"))
call assert_equal("yýŷÿẏỳỷỹ", tolower("YÝŶŸẎỲỶỸ"))
call assert_equal("zźżžƶẑẕ", tolower("ZŹŻŽƵẐẔ"))
" Test with a few lowercase diacritics, which should remain unchanged.
call assert_equal("aàáâãäåāăąǎǟǡả", tolower("aàáâãäåāăąǎǟǡả"))
call assert_equal("bḃḇ", tolower("bḃḇ"))
call assert_equal("cçćĉċč", tolower("cçćĉċč"))
call assert_equal("dďđḋḏḑ", tolower("dďđḋḏḑ"))
call assert_equal("eèéêëēĕėęěẻẽ", tolower("eèéêëēĕėęěẻẽ"))
call assert_equal("fḟ", tolower("fḟ"))
call assert_equal("gĝğġģǥǧǵḡ", tolower("gĝğġģǥǧǵḡ"))
call assert_equal("hĥħḣḧḩẖ", tolower("hĥħḣḧḩẖ"))
call assert_equal("iìíîïĩīĭįǐỉ", tolower("iìíîïĩīĭįǐỉ"))
call assert_equal("jĵǰ", tolower("jĵǰ"))
call assert_equal("kķǩḱḵ", tolower("kķǩḱḵ"))
call assert_equal("lĺļľŀłḻ", tolower("lĺļľŀłḻ"))
call assert_equal("mḿṁ ", tolower("mḿṁ "))
call assert_equal("nñńņňʼnṅṉ", tolower("nñńņňʼnṅṉ"))
call assert_equal("oòóôõöøōŏőơǒǫǭỏ", tolower("oòóôõöøōŏőơǒǫǭỏ"))
call assert_equal("pṕṗ", tolower("pṕṗ"))
call assert_equal("q", tolower("q"))
call assert_equal("rŕŗřṙṟ", tolower("rŕŗřṙṟ"))
call assert_equal("sśŝşšṡ", tolower("sśŝşšṡ"))
call assert_equal("tţťŧṫṯẗ", tolower("tţťŧṫṯẗ"))
call assert_equal("uùúûüũūŭůűųưǔủ", tolower("uùúûüũūŭůűųưǔủ"))
call assert_equal("vṽ", tolower("vṽ"))
call assert_equal("wŵẁẃẅẇẘ", tolower("wŵẁẃẅẇẘ"))
call assert_equal("ẋẍ", tolower("ẋẍ"))
call assert_equal("yýÿŷẏẙỳỷỹ", tolower("yýÿŷẏẙỳỷỹ"))
call assert_equal("zźżžƶẑẕ", tolower("zźżžƶẑẕ"))
" According to https://twitter.com/jifa/status/625776454479970304
" Ⱥ (U+023A) and Ⱦ (U+023E) are the *only* code points to increase
" in length (2 to 3 bytes) when lowercased. So let's test them.
call assert_equal("ⱥ ⱦ", tolower("Ⱥ Ⱦ"))
endfunc
func Test_toupper()
call assert_equal("", toupper(""))
" Test with all printable ASCII characters.
call assert_equal(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~',
\ toupper(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'))
if !has('multi_byte')
return
endif
" Test with a few lowercase diacritics.
call assert_equal("AÀÁÂÃÄÅĀĂĄǍǞǠẢ", toupper("aàáâãäåāăąǎǟǡả"))
call assert_equal("BḂḆ", toupper("bḃḇ"))
call assert_equal("CÇĆĈĊČ", toupper("cçćĉċč"))
call assert_equal("DĎĐḊḎḐ", toupper("dďđḋḏḑ"))
call assert_equal("EÈÉÊËĒĔĖĘĚẺẼ", toupper("eèéêëēĕėęěẻẽ"))
call assert_equal("FḞ", toupper("fḟ"))
call assert_equal("GĜĞĠĢǤǦǴḠ", toupper("gĝğġģǥǧǵḡ"))
call assert_equal("HĤĦḢḦḨẖ", toupper("hĥħḣḧḩẖ"))
call assert_equal("IÌÍÎÏĨĪĬĮǏỈ", toupper("iìíîïĩīĭįǐỉ"))
call assert_equal("JĴǰ", toupper("jĵǰ"))
call assert_equal("KĶǨḰḴ", toupper("kķǩḱḵ"))
call assert_equal("LĹĻĽĿŁḺ", toupper("lĺļľŀłḻ"))
call assert_equal("MḾṀ ", toupper("mḿṁ "))
call assert_equal("NÑŃŅŇʼnṄṈ", toupper("nñńņňʼnṅṉ"))
call assert_equal("OÒÓÔÕÖØŌŎŐƠǑǪǬỎ", toupper("oòóôõöøōŏőơǒǫǭỏ"))
call assert_equal("PṔṖ", toupper("pṕṗ"))
call assert_equal("Q", toupper("q"))
call assert_equal("RŔŖŘṘṞ", toupper("rŕŗřṙṟ"))
call assert_equal("SŚŜŞŠṠ", toupper("sśŝşšṡ"))
call assert_equal("TŢŤŦṪṮẗ", toupper("tţťŧṫṯẗ"))
call assert_equal("UÙÚÛÜŨŪŬŮŰŲƯǓỦ", toupper("uùúûüũūŭůűųưǔủ"))
call assert_equal("VṼ", toupper("vṽ"))
call assert_equal("WŴẀẂẄẆẘ", toupper("wŵẁẃẅẇẘ"))
call assert_equal("ẊẌ", toupper("ẋẍ"))
call assert_equal("YÝŸŶẎẙỲỶỸ", toupper("yýÿŷẏẙỳỷỹ"))
call assert_equal("ZŹŻŽƵẐẔ", toupper("zźżžƶẑẕ"))
" Test that uppercase diacritics, which should remain unchanged.
call assert_equal("AÀÁÂÃÄÅĀĂĄǍǞǠẢ", toupper("AÀÁÂÃÄÅĀĂĄǍǞǠẢ"))
call assert_equal("BḂḆ", toupper("BḂḆ"))
call assert_equal("CÇĆĈĊČ", toupper("CÇĆĈĊČ"))
call assert_equal("DĎĐḊḎḐ", toupper("DĎĐḊḎḐ"))
call assert_equal("EÈÉÊËĒĔĖĘĚẺẼ", toupper("EÈÉÊËĒĔĖĘĚẺẼ"))
call assert_equal("FḞ ", toupper("FḞ "))
call assert_equal("GĜĞĠĢǤǦǴḠ", toupper("GĜĞĠĢǤǦǴḠ"))
call assert_equal("HĤĦḢḦḨ", toupper("HĤĦḢḦḨ"))
call assert_equal("IÌÍÎÏĨĪĬĮİǏỈ", toupper("IÌÍÎÏĨĪĬĮİǏỈ"))
call assert_equal("JĴ", toupper("JĴ"))
call assert_equal("KĶǨḰḴ", toupper("KĶǨḰḴ"))
call assert_equal("LĹĻĽĿŁḺ", toupper("LĹĻĽĿŁḺ"))
call assert_equal("MḾṀ", toupper("MḾṀ"))
call assert_equal("NÑŃŅŇṄṈ", toupper("NÑŃŅŇṄṈ"))
call assert_equal("OÒÓÔÕÖØŌŎŐƠǑǪǬỎ", toupper("OÒÓÔÕÖØŌŎŐƠǑǪǬỎ"))
call assert_equal("PṔṖ", toupper("PṔṖ"))
call assert_equal("Q", toupper("Q"))
call assert_equal("RŔŖŘṘṞ", toupper("RŔŖŘṘṞ"))
call assert_equal("SŚŜŞŠṠ", toupper("SŚŜŞŠṠ"))
call assert_equal("TŢŤŦṪṮ", toupper("TŢŤŦṪṮ"))
call assert_equal("UÙÚÛÜŨŪŬŮŰŲƯǓỦ", toupper("UÙÚÛÜŨŪŬŮŰŲƯǓỦ"))
call assert_equal("VṼ", toupper("VṼ"))
call assert_equal("WŴẀẂẄẆ", toupper("WŴẀẂẄẆ"))
call assert_equal("XẊẌ", toupper("XẊẌ"))
call assert_equal("YÝŶŸẎỲỶỸ", toupper("YÝŶŸẎỲỶỸ"))
call assert_equal("ZŹŻŽƵẐẔ", toupper("ZŹŻŽƵẐẔ"))
call assert_equal("Ⱥ Ⱦ", toupper("ⱥ ⱦ"))
endfunc
" Tests for the mode() function
let current_modes = ''
func! Save_mode()
let g:current_modes = mode(0) . '-' . mode(1)
return ''
endfunc
func! Test_mode()
new
call append(0, ["Blue Ball Black", "Brown Band Bowl", ""])
inoremap <F2> <C-R>=Save_mode()<CR>
normal! 3G
exe "normal i\<F2>\<Esc>"
call assert_equal('i-i', g:current_modes)
exe "normal i\<C-G>uBa\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iBro\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iBa\<C-X>\<F2>\<Esc>u"
call assert_equal('i-ix', g:current_modes)
exe "normal iBa\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iBro\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iBro\<C-X>\<C-P>\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iCom\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iCom\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal RBa\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RBro\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RBa\<C-X>\<F2>\<Esc>u"
call assert_equal('R-Rx', g:current_modes)
exe "normal RBa\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RBro\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RBro\<C-X>\<C-P>\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RCom\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RCom\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
call assert_equal('n', mode(0))
call assert_equal('n', mode(1))
" How to test operator-pending mode?
call feedkeys("v", 'xt')
call assert_equal('v', mode())
call assert_equal('v', mode(1))
call feedkeys("\<Esc>V", 'xt')
call assert_equal('V', mode())
call assert_equal('V', mode(1))
call feedkeys("\<Esc>\<C-V>", 'xt')
call assert_equal("\<C-V>", mode())
call assert_equal("\<C-V>", mode(1))
call feedkeys("\<Esc>", 'xt')
call feedkeys("gh", 'xt')
call assert_equal('s', mode())
call assert_equal('s', mode(1))
call feedkeys("\<Esc>gH", 'xt')
call assert_equal('S', mode())
call assert_equal('S', mode(1))
call feedkeys("\<Esc>g\<C-H>", 'xt')
call assert_equal("\<C-S>", mode())
call assert_equal("\<C-S>", mode(1))
call feedkeys("\<Esc>", 'xt')
call feedkeys(":echo \<C-R>=Save_mode()\<C-U>\<CR>", 'xt')
call assert_equal('c-c', g:current_modes)
call feedkeys("gQecho \<C-R>=Save_mode()\<CR>\<CR>vi\<CR>", 'xt')
call assert_equal('c-cv', g:current_modes)
" How to test Ex mode?
bwipe!
iunmap <F2>
endfunc
+37
View File
@@ -0,0 +1,37 @@
" Test ga normal command, and :ascii Ex command.
func Do_ga(c)
call setline(1, a:c)
let l:a = execute("norm 1goga")
let l:b = execute("ascii")
call assert_equal(l:a, l:b)
return l:a
endfunc
func Test_ga_command()
new
set display=uhex
call assert_equal("\nNUL", Do_ga(''))
call assert_equal("\n<<01>> 1, Hex 01, Octal 001", Do_ga("\x01"))
call assert_equal("\n<<09>> 9, Hex 09, Octal 011", Do_ga("\t"))
set display=
call assert_equal("\nNUL", Do_ga(''))
call assert_equal("\n<^A> 1, Hex 01, Octal 001", Do_ga("\x01"))
call assert_equal("\n<^I> 9, Hex 09, Octal 011", Do_ga("\t"))
call assert_equal("\n<e> 101, Hex 65, Octal 145", Do_ga('e'))
if !has('multi_byte')
return
endif
" Test a few multi-bytes characters.
call assert_equal("\n<é> 233, Hex 00e9, Octal 351", Do_ga('é'))
call assert_equal("\n<ẻ> 7867, Hex 1ebb, Octal 17273", Do_ga('ẻ'))
" Test with combining characters.
call assert_equal("\n<e> 101, Hex 65, Octal 145 < ́> 769, Hex 0301, Octal 1401", Do_ga("e\u0301"))
call assert_equal("\n<e> 101, Hex 65, Octal 145 < ́> 769, Hex 0301, Octal 1401 < ̱> 817, Hex 0331, Octal 1461", Do_ga("e\u0301\u0331"))
call assert_equal("\n<e> 101, Hex 65, Octal 145 < ́> 769, Hex 0301, Octal 1401 < ̱> 817, Hex 0331, Octal 1461 < ̸> 824, Hex 0338, Octal 1470", Do_ga("e\u0301\u0331\u0338"))
bwipe!
endfunc
+6 -1
View File
@@ -10,7 +10,12 @@ func SetUp()
set guifont=Courier\ 10\ Pitch/8/-1/5/50/0/0/0/0/0
endif
" Gnome insists on creating $HOME/.gnome2/..
" Gnome insists on creating $HOME/.gnome2/, set $HOME to avoid changing the
" actual home directory. But avoid triggering fontconfig by setting the
" cache directory. Only needed for Unix.
if $XDG_CACHE_HOME == '' && exists('g:tester_HOME')
let $XDG_CACHE_HOME = g:tester_HOME . '/.cache'
endif
call mkdir('Xhome')
let $HOME = fnamemodify('Xhome', ':p')
endfunc
+22
View File
@@ -0,0 +1,22 @@
" Tests for Lua.
" TODO: move tests from test85.in here.
if !has('lua')
finish
endif
func Test_luado()
new
call setline(1, ['one', 'two', 'three'])
luado vim.command("%d_")
bwipe!
" Check switching to another buffer does not trigger ml_get error.
new
let wincount = winnr('$')
call setline(1, ['one', 'two', 'three'])
luado vim.command("new")
call assert_equal(wincount + 1, winnr('$'))
bwipe!
bwipe!
endfunc
+3 -1
View File
@@ -110,6 +110,8 @@ func Test_map_langmap()
call feedkeys(":call append(line('$'), '+')\<CR>", "xt")
call assert_equal('+', getline('$'))
iunmap a
iunmap c
set nomodified
endfunc
@@ -120,7 +122,7 @@ func Test_map_feedkeys()
$-1
call feedkeys("0qqdw.ifoo\<Esc>qj0@q\<Esc>", "xt")
call assert_equal(['fooc d', 'fooc d'], getline(line('$') - 1, line('$')))
unmap .
nunmap .
set nomodified
endfunc
+44
View File
@@ -24,3 +24,47 @@ function! Test_Incr_Marks()
call assert_equal("XXX 123 123", getline(3))
enew!
endfunction
func Test_setpos()
new one
let onebuf = bufnr('%')
let onewin = win_getid()
call setline(1, ['aaa', 'bbb', 'ccc'])
new two
let twobuf = bufnr('%')
let twowin = win_getid()
call setline(1, ['aaa', 'bbb', 'ccc'])
" for the cursor the buffer number is ignored
call setpos(".", [0, 2, 1, 0])
call assert_equal([0, 2, 1, 0], getpos("."))
call setpos(".", [onebuf, 3, 3, 0])
call assert_equal([0, 3, 3, 0], getpos("."))
call setpos("''", [0, 1, 3, 0])
call assert_equal([0, 1, 3, 0], getpos("''"))
call setpos("''", [onebuf, 2, 2, 0])
call assert_equal([0, 2, 2, 0], getpos("''"))
" buffer-local marks
for mark in ["'a", "'\"", "'[", "']", "'<", "'>"]
call win_gotoid(twowin)
call setpos(mark, [0, 2, 1, 0])
call assert_equal([0, 2, 1, 0], getpos(mark), "for mark " . mark)
call setpos(mark, [onebuf, 1, 3, 0])
call win_gotoid(onewin)
call assert_equal([0, 1, 3, 0], getpos(mark), "for mark " . mark)
endfor
" global marks
call win_gotoid(twowin)
call setpos("'N", [0, 2, 1, 0])
call assert_equal([twobuf, 2, 1, 0], getpos("'N"))
call setpos("'N", [onebuf, 1, 3, 0])
call assert_equal([onebuf, 1, 3, 0], getpos("'N"))
call win_gotoid(onewin)
bwipe!
call win_gotoid(twowin)
bwipe!
endfunc
+25 -4
View File
@@ -22,7 +22,7 @@ func Test_mksession()
\ 'aä Ä two multiByte characters',
\ 'Aäöü three mulTibyte characters'
\ ])
let tmpfile = tempname()
let tmpfile = 'Xtemp'
exec 'w! ' . tmpfile
/^start:
set wrap
@@ -63,8 +63,8 @@ func Test_mksession()
norm! j016|3zl
split
call wincol()
mksession! test_mks.out
let li = filter(readfile('test_mks.out'), 'v:val =~# "\\(^ *normal! 0\\|^ *exe ''normal!\\)"')
mksession! Xtest_mks.out
let li = filter(readfile('Xtest_mks.out'), 'v:val =~# "\\(^ *normal! 0\\|^ *exe ''normal!\\)"')
let expected = [
\ 'normal! 016|',
\ 'normal! 016|',
@@ -96,9 +96,30 @@ func Test_mksession()
call assert_equal(expected, li)
tabclose!
call delete('test_mks.out')
call delete('Xtest_mks.out')
call delete(tmpfile)
let &wrap = wrap_save
endfunc
func Test_mksession_winheight()
new
set winheight=10 winminheight=2
mksession! Xtest_mks.out
source Xtest_mks.out
call delete('Xtest_mks.out')
endfunc
func Test_mksession_arglist()
argdel *
next file1 file2 file3 file4
mksession! Xtest_mks.out
source Xtest_mks.out
call assert_equal(['file1', 'file2', 'file3', 'file4'], argv())
call delete('Xtest_mks.out')
argdel *
endfunc
" vim: shiftwidth=2 sts=2 expandtab
+3
View File
@@ -2193,6 +2193,8 @@ func! Test_normal51_FileChangedRO()
if !has("autocmd")
return
endif
" Don't sleep after the warning message.
call test_settime(1)
call writefile(['foo'], 'Xreadonly.log')
new Xreadonly.log
setl ro
@@ -2202,6 +2204,7 @@ func! Test_normal51_FileChangedRO()
call assert_equal('Xreadonly.log', bufname(''))
" cleanup
call test_settime(0)
bw!
call delete("Xreadonly.log")
endfunc
+32 -4
View File
@@ -8,18 +8,36 @@ set term=xterm
func Test_paste_normal_mode()
new
" In first column text is inserted
call setline(1, ['a', 'b', 'c'])
2
call cursor(2, 1)
call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
call assert_equal('bfoo', getline(2))
call assert_equal('bar', getline(3))
call assert_equal('foo', getline(2))
call assert_equal('barb', getline(3))
call assert_equal('c', getline(4))
" When repeating text is appended
normal .
call assert_equal('barfoo', getline(3))
call assert_equal('bar', getline(4))
call assert_equal('barb', getline(4))
call assert_equal('c', getline(5))
bwipe!
" In second column text is appended
call setline(1, ['a', 'bbb', 'c'])
call cursor(2, 2)
call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
call assert_equal('bbfoo', getline(2))
call assert_equal('barb', getline(3))
call assert_equal('c', getline(4))
" In last column text is appended
call setline(1, ['a', 'bbb', 'c'])
call cursor(2, 3)
call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
call assert_equal('bbbfoo', getline(2))
call assert_equal('bar', getline(3))
call assert_equal('c', getline(4))
endfunc
func Test_paste_insert_mode()
@@ -35,6 +53,16 @@ func Test_paste_insert_mode()
call assert_equal('bar donfoo', getline(3))
call assert_equal('bar doneeb', getline(4))
call assert_equal('c', getline(5))
set ai et tw=10
call setline(1, ['a', ' b', 'c'])
2
call feedkeys("A\<Esc>[200~foo\<CR> bar bar bar\<Esc>[201~\<Esc>", 'xt')
call assert_equal(' bfoo', getline(2))
call assert_equal(' bar bar bar', getline(3))
call assert_equal('c', getline(4))
set ai& et& tw=0
bwipe!
endfunc
+15
View File
@@ -82,6 +82,21 @@ function Test_perldo()
1
call assert_false(search('\Cperl'))
bw!
" Check deleting lines does not trigger ml_get error.
new
call setline(1, ['one', 'two', 'three'])
perldo VIM::DoCommand("%d_")
bwipe!
" Check switching to another buffer does not trigger ml_get error.
new
let wincount = winnr('$')
call setline(1, ['one', 'two', 'three'])
perldo VIM::DoCommand("new")
call assert_equal(wincount + 1, winnr('$'))
bwipe!
bwipe!
endfunc
function Test_VIM_package()
+33 -4
View File
@@ -7,10 +7,10 @@ func! ListMonths()
if g:setting != ''
exe ":set" g:setting
endif
let mth=copy(g:months)
let mth = copy(g:months)
let entered = strcharpart(getline('.'),0,col('.'))
if !empty(entered)
let mth=filter(mth, 'v:val=~"^".entered')
let mth = filter(mth, 'v:val=~"^".entered')
endif
call complete(1, mth)
return ''
@@ -468,7 +468,7 @@ endfunc
" auto-wrap text.
func Test_completion_ctrl_e_without_autowrap()
new
let tw_save=&tw
let tw_save = &tw
set tw=78
let li = [
\ '" zzz',
@@ -478,8 +478,37 @@ func Test_completion_ctrl_e_without_autowrap()
call feedkeys("A\<C-X>\<C-N>\<C-E>\<Esc>", "tx")
call assert_equal(li, getline(1, '$'))
let &tw=tw_save
let &tw = tw_save
q!
endfunc
function! DummyCompleteSix()
call complete(1, ['Hello', 'World'])
return ''
endfunction
" complete() correctly clears the list of autocomplete candidates
" See #1411
func Test_completion_clear_candidate_list()
new
%d
" select first entry from the completion popup
call feedkeys("a xxx\<C-N>\<C-R>=DummyCompleteSix()\<CR>", "tx")
call assert_equal('Hello', getline(1))
%d
" select second entry from the completion popup
call feedkeys("a xxx\<C-N>\<C-R>=DummyCompleteSix()\<CR>\<C-N>", "tx")
call assert_equal('World', getline(1))
%d
" select original text
call feedkeys("a xxx\<C-N>\<C-R>=DummyCompleteSix()\<CR>\<C-N>\<C-N>", "tx")
call assert_equal(' xxx', getline(1))
%d
" back at first entry from completion list
call feedkeys("a xxx\<C-N>\<C-R>=DummyCompleteSix()\<CR>\<C-N>\<C-N>\<C-N>", "tx")
call assert_equal('Hello', getline(1))
bw!
endfunc
" vim: shiftwidth=2 sts=2 expandtab
+24
View File
@@ -0,0 +1,24 @@
" Test for python 2 commands.
" TODO: move tests from test87.in here.
if !has('python')
finish
endif
func Test_pydo()
" Check deleting lines does not trigger ml_get error.
py import vim
new
call setline(1, ['one', 'two', 'three'])
pydo vim.command("%d_")
bwipe!
" Check switching to another buffer does not trigger ml_get error.
new
let wincount = winnr('$')
call setline(1, ['one', 'two', 'three'])
pydo vim.command("new")
call assert_equal(wincount + 1, winnr('$'))
bwipe!
bwipe!
endfunc
+24
View File
@@ -0,0 +1,24 @@
" Test for python 2 commands.
" TODO: move tests from test88.in here.
if !has('python3')
finish
endif
func Test_py3do()
" Check deleting lines does not trigger an ml_get error.
py3 import vim
new
call setline(1, ['one', 'two', 'three'])
py3do vim.command("%d_")
bwipe!
" Check switching to another buffer does not trigger an ml_get error.
new
let wincount = winnr('$')
call setline(1, ['one', 'two', 'three'])
py3do vim.command("new")
call assert_equal(wincount + 1, winnr('$'))
bwipe!
bwipe!
endfunc
+74
View File
@@ -0,0 +1,74 @@
" Test for pyx* commands and functions with Python 2.
set pyx=2
if !has('python')
finish
endif
let s:py2pattern = '^2\.[0-7]\.\d\+'
let s:py3pattern = '^3\.\d\+\.\d\+'
func Test_has_pythonx()
call assert_true(has('pythonx'))
endfunc
func Test_pyx()
redir => var
pyx << EOF
import sys
print(sys.version)
EOF
redir END
call assert_match(s:py2pattern, split(var)[0])
endfunc
func Test_pyxdo()
pyx import sys
enew
pyxdo return sys.version.split("\n")[0]
call assert_match(s:py2pattern, split(getline('.'))[0])
endfunc
func Test_pyxeval()
pyx import sys
call assert_match(s:py2pattern, split(pyxeval('sys.version'))[0])
endfunc
func Test_pyxfile()
" No special comments nor shebangs
redir => var
pyxfile pyxfile/pyx.py
redir END
call assert_match(s:py2pattern, split(var)[0])
" Python 2 special comment
redir => var
pyxfile pyxfile/py2_magic.py
redir END
call assert_match(s:py2pattern, split(var)[0])
" Python 2 shebang
redir => var
pyxfile pyxfile/py2_shebang.py
redir END
call assert_match(s:py2pattern, split(var)[0])
if has('python3')
" Python 3 special comment
redir => var
pyxfile pyxfile/py3_magic.py
redir END
call assert_match(s:py3pattern, split(var)[0])
" Python 3 shebang
redir => var
pyxfile pyxfile/py3_shebang.py
redir END
call assert_match(s:py3pattern, split(var)[0])
endif
endfunc
+74
View File
@@ -0,0 +1,74 @@
" Test for pyx* commands and functions with Python 3.
set pyx=3
if !has('python3')
finish
endif
let s:py2pattern = '^2\.[0-7]\.\d\+'
let s:py3pattern = '^3\.\d\+\.\d\+'
func Test_has_pythonx()
call assert_true(has('pythonx'))
endfunc
func Test_pyx()
redir => var
pyx << EOF
import sys
print(sys.version)
EOF
redir END
call assert_match(s:py3pattern, split(var)[0])
endfunc
func Test_pyxdo()
pyx import sys
enew
pyxdo return sys.version.split("\n")[0]
call assert_match(s:py3pattern, split(getline('.'))[0])
endfunc
func Test_pyxeval()
pyx import sys
call assert_match(s:py3pattern, split(pyxeval('sys.version'))[0])
endfunc
func Test_pyxfile()
" No special comments nor shebangs
redir => var
pyxfile pyxfile/pyx.py
redir END
call assert_match(s:py3pattern, split(var)[0])
" Python 3 special comment
redir => var
pyxfile pyxfile/py3_magic.py
redir END
call assert_match(s:py3pattern, split(var)[0])
" Python 3 shebang
redir => var
pyxfile pyxfile/py3_shebang.py
redir END
call assert_match(s:py3pattern, split(var)[0])
if has('python')
" Python 2 special comment
redir => var
pyxfile pyxfile/py2_magic.py
redir END
call assert_match(s:py2pattern, split(var)[0])
" Python 2 shebang
redir => var
pyxfile pyxfile/py2_shebang.py
redir END
call assert_match(s:py2pattern, split(var)[0])
endif
endfunc
+17
View File
@@ -32,3 +32,20 @@ func Test_ruby_evaluate_dict()
redir END
call assert_equal(['{"a"=>"foo", "b"=>123}'], split(l:out, "\n"))
endfunc
func Test_rubydo()
" Check deleting lines does not trigger ml_get error.
new
call setline(1, ['one', 'two', 'three'])
rubydo Vim.command("%d_")
bwipe!
" Check switching to another buffer does not trigger ml_get error.
new
let wincount = winnr('$')
call setline(1, ['one', 'two', 'three'])
rubydo Vim.command("new")
call assert_equal(wincount + 1, winnr('$'))
bwipe!
bwipe!
endfunc
+21 -14
View File
@@ -1,24 +1,24 @@
" Tests for stat functions and checktime
func Test_existent_file()
let fname='Xtest.tmp'
let fname = 'Xtest.tmp'
let ts=localtime()
sleep 1
let fl=['Hello World!']
let ts = localtime()
let fl = ['Hello World!']
call writefile(fl, fname)
let tf=getftime(fname)
sleep 1
let te=localtime()
let tf = getftime(fname)
let te = localtime()
call assert_true(ts <= tf && tf <= te)
call assert_equal(strlen(fl[0] . "\n"), getfsize(fname))
call assert_equal('file', getftype(fname))
call assert_equal('rw-', getfperm(fname)[0:2])
call delete(fname)
endfunc
func Test_existent_directory()
let dname='.'
let dname = '.'
call assert_equal(0, getfsize(dname))
call assert_equal('dir', getftype(dname))
@@ -26,22 +26,29 @@ func Test_existent_directory()
endfunc
func Test_checktime()
let fname='Xtest.tmp'
let fname = 'Xtest.tmp'
let fl=['Hello World!']
let fl = ['Hello World!']
call writefile(fl, fname)
set autoread
exec 'e' fname
sleep 2
let fl=readfile(fname)
" FAT has a granularity of 2 seconds, otherwise it's usually 1 second
if has('win32')
sleep 2
else
sleep 1
endif
let fl = readfile(fname)
let fl[0] .= ' - checktime'
call writefile(fl, fname)
checktime
call assert_equal(fl[0], getline(1))
call delete(fname)
endfunc
func Test_nonexistent_file()
let fname='Xtest.tmp'
let fname = 'Xtest.tmp'
call delete(fname)
call assert_equal(-1, getftime(fname))
@@ -55,7 +62,7 @@ func Test_win32_symlink_dir()
" So we use an existing symlink for this test.
if has('win32')
" Check if 'C:\Users\All Users' is a symlink to a directory.
let res=system('dir C:\Users /a')
let res = system('dir C:\Users /a')
if match(res, '\C<SYMLINKD> *All Users') >= 0
" Get the filetype of the symlink.
call assert_equal('dir', getftype('C:\Users\All Users'))
+231 -11
View File
@@ -94,10 +94,6 @@ function Test_tabpage()
call assert_equal(7, tabpagenr())
tabmove
call assert_equal(10, tabpagenr())
tabmove -20
call assert_equal(1, tabpagenr())
tabmove +20
call assert_equal(10, tabpagenr())
0tabmove
call assert_equal(1, tabpagenr())
$tabmove
@@ -110,7 +106,16 @@ function Test_tabpage()
call assert_equal(4, tabpagenr())
7tabmove 5
call assert_equal(5, tabpagenr())
call assert_fails("99tabmove", 'E16:')
call assert_fails("+99tabmove", 'E16:')
call assert_fails("-99tabmove", 'E16:')
call assert_fails("tabmove foo", 'E474:')
call assert_fails("tabmove 99", 'E474:')
call assert_fails("tabmove +99", 'E474:')
call assert_fails("tabmove -99", 'E474:')
call assert_fails("tabmove -3+", 'E474:')
call assert_fails("tabmove $3", 'E474:')
1tabonly!
endfunc
" Test autocommands
@@ -118,7 +123,6 @@ function Test_tabpage_with_autocmd()
if !has('autocmd')
return
endif
tabonly!
command -nargs=1 -bar C :call add(s:li, '=== ' . <q-args> . ' ===')|<args>
augroup TestTabpageGroup
au!
@@ -183,8 +187,10 @@ function Test_tabpage_with_autocmd()
autocmd TabDestructive TabEnter * nested :C tabnext 2 | C tabclose 3
let s:li = []
C tabnext 3
call assert_equal(['=== tabnext 3 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ===', 'BufEnter', '=== tabclose 3 ==='], s:li)
call assert_equal(3, tabpagenr('$'))
C tabnext 2
call assert_equal(2, tabpagenr('$'))
call assert_equal(['=== tabnext 2 ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ==='], s:li)
call assert_equal(['2/2'], [tabpagenr().'/'.tabpagenr('$')])
delcommand C
@@ -192,8 +198,7 @@ function Test_tabpage_with_autocmd()
augroup! TabDestructive
autocmd! TestTabpageGroup
augroup! TestTabpageGroup
tabonly!
bw!
1tabonly!
endfunction
function Test_tabpage_with_tab_modifier()
@@ -224,8 +229,223 @@ function Test_tabpage_with_tab_modifier()
call assert_fails('-99tab help', 'E16:')
delfunction s:check_tab
tabonly!
bw!
1tabonly!
endfunction
function Check_tab_count(pre_nr, cmd, post_nr)
exec 'tabnext' a:pre_nr
normal! G
exec a:cmd
call assert_equal(a:post_nr, tabpagenr(), a:cmd)
endfunc
" Test for [count] of tabnext
function Test_tabpage_with_tabnext()
for n in range(4)
tabedit
call setline(1, ['', '', '3'])
endfor
call Check_tab_count(1, 'tabnext', 2)
call Check_tab_count(1, '3tabnext', 3)
call Check_tab_count(1, '.tabnext', 1)
call Check_tab_count(1, '.+1tabnext', 2)
call Check_tab_count(2, '+tabnext', 3)
call Check_tab_count(2, '+2tabnext', 4)
call Check_tab_count(4, '-tabnext', 3)
call Check_tab_count(4, '-2tabnext', 2)
call Check_tab_count(3, '$tabnext', 5)
call assert_fails('0tabnext', 'E16:')
call assert_fails('99tabnext', 'E16:')
call assert_fails('+99tabnext', 'E16:')
call assert_fails('-99tabnext', 'E16:')
call Check_tab_count(1, 'tabnext 3', 3)
call Check_tab_count(2, 'tabnext +', 3)
call Check_tab_count(2, 'tabnext +2', 4)
call Check_tab_count(4, 'tabnext -', 3)
call Check_tab_count(4, 'tabnext -2', 2)
call Check_tab_count(3, 'tabnext $', 5)
call assert_fails('tabnext 0', 'E474:')
call assert_fails('tabnext .', 'E474:')
call assert_fails('tabnext -+', 'E474:')
call assert_fails('tabnext +2-', 'E474:')
call assert_fails('tabnext $3', 'E474:')
call assert_fails('tabnext 99', 'E474:')
call assert_fails('tabnext +99', 'E474:')
call assert_fails('tabnext -99', 'E474:')
1tabonly!
endfunction
" Test for [count] of tabprevious
function Test_tabpage_with_tabprevious()
for n in range(5)
tabedit
call setline(1, ['', '', '3'])
endfor
for cmd in ['tabNext', 'tabprevious']
call Check_tab_count(6, cmd, 5)
call Check_tab_count(6, '3' . cmd, 3)
call Check_tab_count(6, '8' . cmd, 4)
call Check_tab_count(6, cmd . ' 3', 3)
call Check_tab_count(6, cmd . ' 8', 4)
for n in range(2)
for c in ['0', '.+3', '+', '+2' , '-', '-2' , '$', '+99', '-99']
if n == 0 " pre count
let entire_cmd = c . cmd
let err_code = 'E16:'
else
let entire_cmd = cmd . ' ' . c
let err_code = 'E474:'
endif
call assert_fails(entire_cmd, err_code)
endfor
endfor
endfor
1tabonly!
endfunction
function s:reconstruct_tabpage_for_test(nr)
let n = (a:nr > 2) ? a:nr - 2 : 1
1tabonly!
0tabedit n0
for n in range(1, n)
exec '$tabedit n' . n
if n == 1
call setline(1, ['', '', '3'])
endif
endfor
endfunc
" Test for [count] of tabclose
function Test_tabpage_with_tabclose()
" pre count
call s:reconstruct_tabpage_for_test(6)
call Check_tab_count(3, 'tabclose!', 3)
call Check_tab_count(1, '3tabclose', 1)
call Check_tab_count(4, '4tabclose', 3)
call Check_tab_count(3, '1tabclose', 2)
call Check_tab_count(2, 'tabclose', 1)
call assert_equal(1, tabpagenr('$'))
call assert_equal('', bufname(''))
call s:reconstruct_tabpage_for_test(6)
call Check_tab_count(2, '$tabclose', 2)
call Check_tab_count(4, '.tabclose', 4)
call Check_tab_count(3, '.+tabclose', 3)
call Check_tab_count(3, '.-2tabclose', 2)
call Check_tab_count(1, '.+1tabclose!', 1)
call assert_equal(1, tabpagenr('$'))
call assert_equal('', bufname(''))
" post count
call s:reconstruct_tabpage_for_test(6)
call Check_tab_count(3, 'tabclose!', 3)
call Check_tab_count(1, 'tabclose 3', 1)
call Check_tab_count(4, 'tabclose 4', 3)
call Check_tab_count(3, 'tabclose 1', 2)
call Check_tab_count(2, 'tabclose', 1)
call assert_equal(1, tabpagenr('$'))
call assert_equal('', bufname(''))
call s:reconstruct_tabpage_for_test(6)
call Check_tab_count(2, 'tabclose $', 2)
call Check_tab_count(4, 'tabclose', 4)
call Check_tab_count(3, 'tabclose +', 3)
call Check_tab_count(3, 'tabclose -2', 2)
call Check_tab_count(1, 'tabclose! +1', 1)
call assert_equal(1, tabpagenr('$'))
call assert_equal('', bufname(''))
call s:reconstruct_tabpage_for_test(6)
for n in range(2)
for c in ['0', '$3', '99', '+99', '-99']
if n == 0 " pre count
let entire_cmd = c . 'tabclose'
let err_code = 'E16:'
else
let entire_cmd = 'tabclose ' . c
let err_code = 'E474:'
endif
call assert_fails(entire_cmd, err_code)
call assert_equal(6, tabpagenr('$'))
endfor
endfor
call assert_fails('3tabclose', 'E37:')
call assert_fails('tabclose 3', 'E37:')
call assert_fails('tabclose -+', 'E474:')
call assert_fails('tabclose +2-', 'E474:')
call assert_equal(6, tabpagenr('$'))
1tabonly!
endfunction
" Test for [count] of tabonly
function Test_tabpage_with_tabonly()
" Test for the normal behavior (pre count only)
let tc = [ [4, '.', '!'], [2, '.+', ''], [3, '.-2', '!'], [1, '.+1', '!'] ]
for c in tc
call s:reconstruct_tabpage_for_test(6)
let entire_cmd = c[1] . 'tabonly' . c[2]
call Check_tab_count(c[0], entire_cmd, 1)
call assert_equal(1, tabpagenr('$'))
endfor
" Test for the normal behavior
let tc2 = [ [3, '', ''], [1, '3', ''], [4, '4', '!'], [3, '1', '!'],
\ [2, '', '!'],
\ [2, '$', '!'], [3, '+', '!'], [3, '-2', '!'], [3, '+1', '!']
\ ]
for n in range(2)
for c in tc2
call s:reconstruct_tabpage_for_test(6)
if n == 0 " pre count
let entire_cmd = c[1] . 'tabonly' . c[2]
else
let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
endif
call Check_tab_count(c[0], entire_cmd, 1)
call assert_equal(1, tabpagenr('$'))
endfor
endfor
" Test for the error behavior
for n in range(2)
for c in ['0', '$3', '99', '+99', '-99']
call s:reconstruct_tabpage_for_test(6)
if n == 0 " pre count
let entire_cmd = c . 'tabonly'
let err_code = 'E16:'
else
let entire_cmd = 'tabonly ' . c
let err_code = 'E474:'
endif
call assert_fails(entire_cmd, err_code)
call assert_equal(6, tabpagenr('$'))
endfor
endfor
" Test for the error behavior (post count only)
for c in tc
call s:reconstruct_tabpage_for_test(6)
let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
let err_code = 'E474:'
call assert_fails(entire_cmd, err_code)
call assert_equal(6, tabpagenr('$'))
endfor
call assert_fails('tabonly -+', 'E474:')
call assert_fails('tabonly +2-', 'E474:')
call assert_equal(6, tabpagenr('$'))
1tabonly!
new
only!
endfunction
func Test_tabnext_on_buf_unload1()
+23
View File
@@ -0,0 +1,23 @@
" Tests for the Tcl interface.
if !has('tcl')
finish
end
function Test_tcldo()
" Check deleting lines does not trigger ml_get error.
new
call setline(1, ['one', 'two', 'three'])
tcldo ::vim::command %d_
bwipe!
" Check switching to another buffer does not trigger ml_get error.
new
let wincount = winnr('$')
call setline(1, ['one', 'two', 'three'])
tcldo ::vim::command new
call assert_equal(wincount + 1, winnr('$'))
bwipe!
bwipe!
endfunc
+104
View File
@@ -102,3 +102,107 @@ func Test_CmdUndefined()
call assert_fails('Dothat', 'E492:')
call assert_equal('yes', g:didnot)
endfunc
func Test_CmdErrors()
call assert_fails('com! docmd :', 'E183:')
call assert_fails('com! \<Tab> :', 'E182:')
call assert_fails('com! _ :', 'E182:')
call assert_fails('com! X :', 'E841:')
call assert_fails('com! - DoCmd :', 'E175:')
call assert_fails('com! -xxx DoCmd :', 'E181:')
call assert_fails('com! -addr DoCmd :', 'E179:')
call assert_fails('com! -complete DoCmd :', 'E179:')
call assert_fails('com! -complete=xxx DoCmd :', 'E180:')
call assert_fails('com! -complete=custom DoCmd :', 'E467:')
call assert_fails('com! -complete=customlist DoCmd :', 'E467:')
call assert_fails('com! -complete=behave,CustomComplete DoCmd :', 'E468:')
call assert_fails('com! -nargs=x DoCmd :', 'E176:')
call assert_fails('com! -count=1 -count=2 DoCmd :', 'E177:')
call assert_fails('com! -count=x DoCmd :', 'E178:')
call assert_fails('com! -range=x DoCmd :', 'E178:')
com! -nargs=0 DoCmd :
call assert_fails('DoCmd x', 'E488:')
com! -nargs=1 DoCmd :
call assert_fails('DoCmd', 'E471:')
com! -nargs=+ DoCmd :
call assert_fails('DoCmd', 'E471:')
call assert_fails('com DoCmd :', 'E174:')
comclear
call assert_fails('delcom DoCmd', 'E184:')
endfunc
func CustomComplete(A, L, P)
return "January\nFebruary\nMars\n"
endfunc
func CustomCompleteList(A, L, P)
return [ "Monday", "Tuesday", "Wednesday" ]
endfunc
func Test_CmdCompletion()
call feedkeys(":com -\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"com -addr bang bar buffer complete count nargs range register', @:)
call feedkeys(":com -nargs=0 -\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"com -nargs=0 -addr bang bar buffer complete count nargs range register', @:)
call feedkeys(":com -nargs=\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"com -nargs=* + 0 1 ?', @:)
call feedkeys(":com -addr=\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"com -addr=arguments buffers lines loaded_buffers quickfix tabs windows', @:)
call feedkeys(":com -complete=co\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"com -complete=color command compiler', @:)
command! DoCmd1 :
command! DoCmd2 :
call feedkeys(":com \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"com DoCmd1 DoCmd2', @:)
call feedkeys(":DoC\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"DoCmd1 DoCmd2', @:)
call feedkeys(":delcom DoC\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"delcom DoCmd1 DoCmd2', @:)
delcom DoCmd1
call feedkeys(":delcom DoC\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"delcom DoCmd2', @:)
call feedkeys(":com DoC\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"com DoCmd2', @:)
delcom DoCmd2
call feedkeys(":delcom DoC\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"delcom DoC', @:)
call feedkeys(":com DoC\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"com DoC', @:)
com! -complete=behave DoCmd :
call feedkeys(":DoCmd \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"DoCmd mswin xterm', @:)
" This does not work. Why?
"call feedkeys(":DoCmd x\<C-A>\<C-B>\"\<CR>", 'tx')
"call assert_equal('"DoCmd xterm', @:)
com! -complete=custom,CustomComplete DoCmd :
call feedkeys(":DoCmd \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"DoCmd January February Mars', @:)
com! -complete=customlist,CustomCompleteList DoCmd :
call feedkeys(":DoCmd \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"DoCmd Monday Tuesday Wednesday', @:)
com! -complete=custom,CustomCompleteList DoCmd :
call assert_fails("call feedkeys(':DoCmd \<C-D>', 'tx')", 'E730:')
com! -complete=customlist,CustomComp DoCmd :
call assert_fails("call feedkeys(':DoCmd \<C-D>', 'tx')", 'E117:')
endfunc
-46
View File
@@ -1,46 +0,0 @@
Tests for Unicode manipulations vim: set ft=vim :
STARTTEST
:so small.vim
:set encoding=utf-8
:"
:" Visual block Insert adjusts for multi-byte char
:new
:call setline(1, ["aaa", "あああ", "bbb"])
:exe ":norm! gg0l\<C-V>jjIx\<Esc>"
:let r = getline(1, '$')
:"
:bwipeout!
:$put=r
:"
:" Test for built-in function strchars()
:for str in ["a", "あいa", "A\u20dd", "A\u20dd\u20dd", "\u20dd"]
: $put=strchars(str)
: $put=strchars(str, 0)
: $put=strchars(str, 1)
:endfor
:"
:" Test for customlist completion
:function! CustomComplete1(lead, line, pos)
: return ['あ', 'い']
:endfunction
:command -nargs=1 -complete=customlist,CustomComplete1 Test1 echo
:call feedkeys(":Test1 \<C-L>'\<C-B>$put='\<CR>", 'it')
:"
:function! CustomComplete2(lead, line, pos)
: return ['あたし', 'あたま', 'あたりめ']
:endfunction
:command -nargs=1 -complete=customlist,CustomComplete2 Test2 echo
:call feedkeys(":Test2 \<C-L>'\<C-B>$put='\<CR>", 'it')
:"
:function! CustomComplete3(lead, line, pos)
: return ['Nこ', 'Nん', 'Nぶ']
:endfunction
:command -nargs=1 -complete=customlist,CustomComplete3 Test3 echo
:call feedkeys(":Test3 \<C-L>'\<C-B>$put='\<CR>", 'it')
:"
:call garbagecollect(1)
:/^start:/,$wq! test.out
ENDTEST
start:

Some files were not shown because too many files have changed in this diff Show More