From 7554c548a493cba50b2d0ea3521cac14f28a1f07 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 6 Oct 2018 15:03:15 +0200 Subject: [PATCH 01/17] patch 8.1.0452: MS-Windows: not finding intl.dll Problem: MS-Windows: not finding intl.dll. Solution: Also find intl.dll next to libintl.dll. (Ken Takata) --- runtime/doc/mlang.txt | 6 ++++-- src/os_win32.c | 17 +++++++++++------ src/version.c | 2 ++ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/runtime/doc/mlang.txt b/runtime/doc/mlang.txt index 4d85bbd43d..f25aef2751 100644 --- a/runtime/doc/mlang.txt +++ b/runtime/doc/mlang.txt @@ -102,8 +102,10 @@ Or: This also contains tools xgettext, msgformat and others. -libintl.dll should be placed in same directory with (g)vim.exe, or some -place where PATH environment value describe. Vim also finds libintl-8.dll. +libintl.dll should be placed in same directory as (g)vim.exe, or one of the +directories listed in the PATH environment value. Vim also looks for the +alternate names "libintl-8.dll" and "intl.dll". + Message files (vim.mo) have to be placed in "$VIMRUNTIME/lang/xx/LC_MESSAGES", where "xx" is the abbreviation of the language (mostly two letters). diff --git a/src/os_win32.c b/src/os_win32.c index a53b7b6270..4ba060bb90 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -573,7 +573,8 @@ get_dll_import_func(HINSTANCE hInst, const char *funcname) #if defined(DYNAMIC_GETTEXT) || defined(PROTO) # ifndef GETTEXT_DLL # define GETTEXT_DLL "libintl.dll" -# define GETTEXT_DLL_ALT "libintl-8.dll" +# define GETTEXT_DLL_ALT1 "libintl-8.dll" +# define GETTEXT_DLL_ALT2 "intl.dll" # endif /* Dummy functions */ static char *null_libintl_gettext(const char *); @@ -614,14 +615,18 @@ dyn_libintl_init(void) }; HINSTANCE hmsvcrt; - /* No need to initialize twice. */ - if (hLibintlDLL) + // No need to initialize twice. + if (hLibintlDLL != NULL) return 1; - /* Load gettext library (libintl.dll) */ + // Load gettext library (libintl.dll and other names). hLibintlDLL = vimLoadLib(GETTEXT_DLL); -#ifdef GETTEXT_DLL_ALT +#ifdef GETTEXT_DLL_ALT1 if (!hLibintlDLL) - hLibintlDLL = vimLoadLib(GETTEXT_DLL_ALT); + hLibintlDLL = vimLoadLib(GETTEXT_DLL_ALT1); +#endif +#ifdef GETTEXT_DLL_ALT2 + if (!hLibintlDLL) + hLibintlDLL = vimLoadLib(GETTEXT_DLL_ALT2); #endif if (!hLibintlDLL) { diff --git a/src/version.c b/src/version.c index a225cb9c23..b50ce81aa5 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 452, /**/ 451, /**/ From 8295666dc2c65e42135b91d5c61e2a140d002333 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 6 Oct 2018 15:18:45 +0200 Subject: [PATCH 02/17] patch 8.1.0453: MS-Windows: executable() is not reliable Problem: MS-Windows: executable() is not reliable. Solution: Use $PATHEXT properly. (Yasuhiro Matsumoto, closes #3412) --- src/os_win32.c | 33 ++++++++++++++++++++++++++++----- src/testdir/test_functions.vim | 13 +++++++++++++ src/version.c | 2 ++ 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/os_win32.c b/src/os_win32.c index 4ba060bb90..9d1d8cbc22 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -3535,21 +3535,44 @@ mch_can_exe(char_u *name, char_u **path, int use_path) { char_u buf[_MAX_PATH]; int len = (int)STRLEN(name); - char_u *p; + char_u *p, *saved; if (len >= _MAX_PATH) /* safety check */ return FALSE; - /* If there already is an extension try using the name directly. Also do - * this with a Unix-shell like 'shell'. */ - if (vim_strchr(gettail(name), '.') != NULL - || strstr((char *)gettail(p_sh), "sh") != NULL) + /* Ty using the name directly when a Unix-shell like 'shell'. */ + if (strstr((char *)gettail(p_sh), "sh") != NULL) if (executable_exists((char *)name, path, use_path)) return TRUE; /* * Loop over all extensions in $PATHEXT. */ + p = mch_getenv("PATHEXT"); + if (p == NULL) + p = (char_u *)".com;.exe;.bat;.cmd"; + saved = vim_strsave(p); + if (saved == NULL) + return FALSE; + p = saved; + while (*p) + { + char_u *tmp = vim_strchr(p, ';'); + + if (tmp != NULL) + *tmp = NUL; + if (_stricoll((char *)name + len - STRLEN(p), (char *)p) == 0 + && executable_exists((char *)name, path, use_path)) + { + vim_free(saved); + return TRUE; + } + if (tmp == NULL) + break; + p = tmp + 1; + } + vim_free(saved); + vim_strncpy(buf, name, _MAX_PATH - 1); p = mch_getenv("PATHEXT"); if (p == NULL) diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index cc82f8191c..17f7c1905e 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -800,6 +800,19 @@ func Test_filewritable() bw! endfunc +func Test_Executable() + if has('win32') + call assert_equal(1, executable('notepad')) + call assert_equal(1, executable('notepad.exe')) + call assert_equal(0, executable('notepad.exe.exe')) + call assert_equal(0, executable('shell32.dll')) + call assert_equal(0, executable('win.ini')) + elseif has('unix') + call assert_equal(1, executable('cat')) + call assert_equal(0, executable('dog')) + endif +endfunc + func Test_hostname() let hostname_vim = hostname() if has('unix') diff --git a/src/version.c b/src/version.c index b50ce81aa5..dee74d3e0a 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 453, /**/ 452, /**/ From 261099070940fb64d4633a766ae3510fffe4171d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 6 Oct 2018 15:43:17 +0200 Subject: [PATCH 03/17] patch 8.1.0454: resolve() was not tested with a symlink cycle Problem: resolve() was not tested with a symlink cycle. Solution: Add a test. (Dominique Pelle, closes #3513) --- src/testdir/test_functions.vim | 46 ++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 2 files changed, 48 insertions(+) diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 17f7c1905e..d601c278cc 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -190,6 +190,52 @@ func Test_strftime() call assert_fails('call strftime("%Y", [])', 'E745:') endfunc +func Test_resolve() + if !has('unix') + return + endif + + " Xlink1 -> Xlink2 + " Xlink2 -> Xlink3 + silent !ln -s -f Xlink2 Xlink1 + silent !ln -s -f Xlink3 Xlink2 + call assert_equal('Xlink3', resolve('Xlink1')) + call assert_equal('./Xlink3', resolve('./Xlink1')) + call assert_equal('Xlink3/', resolve('Xlink2/')) + " FIXME: these tests result in things like "Xlink2/" instead of "Xlink3/"?! + "call assert_equal('Xlink3/', resolve('Xlink1/')) + "call assert_equal('./Xlink3/', resolve('./Xlink1/')) + "call assert_equal(getcwd() . '/Xlink3/', resolve(getcwd() . '/Xlink1/')) + call assert_equal(getcwd() . '/Xlink3', resolve(getcwd() . '/Xlink1')) + + " Test resolve() with a symlink cycle. + " Xlink1 -> Xlink2 + " Xlink2 -> Xlink3 + " Xlink3 -> Xlink1 + silent !ln -s -f Xlink1 Xlink3 + call assert_fails('call resolve("Xlink1")', 'E655:') + call assert_fails('call resolve("./Xlink1")', 'E655:') + call assert_fails('call resolve("Xlink2")', 'E655:') + call assert_fails('call resolve("Xlink3")', 'E655:') + call delete('Xlink1') + call delete('Xlink2') + call delete('Xlink3') + + silent !ln -s -f Xdir//Xfile Xlink + call assert_equal('Xdir/Xfile', resolve('Xlink')) + call delete('Xlink') + + silent !ln -s -f Xlink2/ Xlink1 + call assert_equal('Xlink2', resolve('Xlink1')) + call assert_equal('Xlink2/', resolve('Xlink1/')) + call delete('Xlink1') + + silent !ln -s -f ./Xlink2 Xlink1 + call assert_equal('Xlink2', resolve('Xlink1')) + call assert_equal('./Xlink2', resolve('./Xlink1')) + call delete('Xlink1') +endfunc + func Test_simplify() call assert_equal('', simplify('')) call assert_equal('/', simplify('/')) diff --git a/src/version.c b/src/version.c index dee74d3e0a..caf71687ff 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 454, /**/ 453, /**/ From 019dfe6855e011c02427bb922aafeae0245372c9 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 14:38:49 +0200 Subject: [PATCH 04/17] patch 8.1.0455: checking for empty quickfix stack is not consistent Problem: Checking for empty quickfix stack is not consistent. Solution: Use qf_stack_empty(). (Yegappan Lakshmanan) --- src/quickfix.c | 38 ++++++++++++++++++++++---------------- src/version.c | 2 ++ 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/quickfix.c b/src/quickfix.c index 19363d3582..30f9bdeb2d 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -1498,6 +1498,15 @@ restofline: return QF_OK; } +/* + * Returns TRUE if the specified quickfix/location stack is empty + */ + static int +qf_stack_empty(qf_info_T *qi) +{ + return qi == NULL || qi->qf_listcount <= 0; +} + /* * Returns TRUE if the specified quickfix/location list is empty. */ @@ -3220,8 +3229,7 @@ qf_jump(qf_info_T *qi, if (qi == NULL) qi = &ql_info; - if (qi->qf_curlist >= qi->qf_listcount - || qf_list_empty(qi, qi->qf_curlist)) + if (qf_stack_empty(qi) || qf_list_empty(qi, qi->qf_curlist)) { EMSG(_(e_quickfix)); return; @@ -3412,8 +3420,7 @@ qf_list(exarg_T *eap) } } - if (qi->qf_curlist >= qi->qf_listcount - || qf_list_empty(qi, qi->qf_curlist)) + if (qf_stack_empty(qi) || qf_list_empty(qi, qi->qf_curlist)) { EMSG(_(e_quickfix)); return; @@ -3601,8 +3608,7 @@ qf_history(exarg_T *eap) if (is_loclist_cmd(eap->cmdidx)) qi = GET_LOC_LIST(curwin); - if (qi == NULL || (qi->qf_listcount == 0 - && qf_list_empty(qi, qi->qf_curlist))) + if (qf_stack_empty(qi) || qf_list_empty(qi, qi->qf_curlist)) MSG(_("No entries")); else for (i = 0; i < qi->qf_listcount; ++i) @@ -3830,9 +3836,9 @@ ex_cwindow(exarg_T *eap) * close the window. If a quickfix window is not open, then open * it if we have errors; otherwise, leave it closed. */ - if (qi->qf_lists[qi->qf_curlist].qf_nonevalid - || qf_list_empty(qi, qi->qf_curlist) - || qi->qf_curlist >= qi->qf_listcount) + if (qf_stack_empty(qi) + || qi->qf_lists[qi->qf_curlist].qf_nonevalid + || qf_list_empty(qi, qi->qf_curlist)) { if (win != NULL) ex_cclose(eap); @@ -4342,7 +4348,7 @@ qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last) } /* Check if there is anything to display */ - if (qi->qf_curlist < qi->qf_listcount) + if (!qf_stack_empty(qi)) { char_u dirname[MAXPATHL]; @@ -5333,7 +5339,7 @@ ex_vimgrep(exarg_T *eap) if ((eap->cmdidx != CMD_grepadd && eap->cmdidx != CMD_lgrepadd && eap->cmdidx != CMD_vimgrepadd && eap->cmdidx != CMD_lvimgrepadd) - || qi->qf_curlist == qi->qf_listcount) + || qf_stack_empty(qi)) /* make place for a new list */ qf_new_list(qi, title != NULL ? title : qf_cmdtitle(*eap->cmdlinep)); @@ -6107,11 +6113,11 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict) flags = qf_getprop_keys2flags(what, (wp != NULL)); - if (qi != NULL && qi->qf_listcount != 0) + if (!qf_stack_empty(qi)) qf_idx = qf_getprop_qfidx(qi, what); /* List is not present or is empty */ - if (qi == NULL || qi->qf_listcount == 0 || qf_idx == INVALID_QFIDX) + if (qf_stack_empty(qi) || qf_idx == INVALID_QFIDX) return qf_getprop_defaults(qi, flags, retdict); qfl = &qi->qf_lists[qf_idx]; @@ -6313,7 +6319,7 @@ qf_setprop_get_qfidx( * stack. */ *newlist = TRUE; - qf_idx = qi->qf_listcount > 0 ? qi->qf_listcount - 1 : 0; + qf_idx = qf_stack_empty(qi) ? 0 : qi->qf_listcount - 1; } else if (qf_idx < 0 || qf_idx >= qi->qf_listcount) return INVALID_QFIDX; @@ -6324,7 +6330,7 @@ qf_setprop_get_qfidx( && di->di_tv.vval.v_string != NULL && STRCMP(di->di_tv.vval.v_string, "$") == 0) { - if (qi->qf_listcount > 0) + if (!qf_stack_empty(qi)) qf_idx = qi->qf_listcount - 1; else if (*newlist) qf_idx = 0; @@ -6452,7 +6458,7 @@ qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title) int qf_idx; int newlist = FALSE; - if (action == ' ' || qi->qf_curlist == qi->qf_listcount) + if (action == ' ' || qf_stack_empty(qi)) newlist = TRUE; qf_idx = qf_setprop_get_qfidx(qi, what, action, &newlist); diff --git a/src/version.c b/src/version.c index caf71687ff..d4c872a832 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 455, /**/ 454, /**/ From d8f27b30d6ec0bcfcb8f44c6201e36c003d1ce88 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 15:42:07 +0200 Subject: [PATCH 05/17] patch 8.1.0456: running test hangs when the input file is being edited Problem: Running test hangs when the input file is being edited. Solution: Use a SwapExists autocommand to ignore editing the test script. --- src/testdir/Makefile | 6 ++++-- src/testdir/runtest.vim | 14 ++++++++++++++ src/version.c | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/testdir/Makefile b/src/testdir/Makefile index 6a9ef0f974..e9e0f4b320 100644 --- a/src/testdir/Makefile +++ b/src/testdir/Makefile @@ -9,8 +9,10 @@ XXDPROG = ../xxd/xxd SCRIPTSOURCE = ../../runtime -# Change this to empty to see the verbose output of tests. -REDIR_TEST_TO_NULL = > /dev/null +# Comment out this line to see the verbose output of tests. +# +# Catches SwapExists to avoid hanging at the ATTENTION prompt. +REDIR_TEST_TO_NULL = --cmd 'au SwapExists * let v:swapchoice = "e"' > /dev/null # Uncomment this line to use valgrind for memory leaks and extra warnings. # The output goes into a file "valgrind.testN" diff --git a/src/testdir/runtest.vim b/src/testdir/runtest.vim index c3414914f8..ff32abcc32 100644 --- a/src/testdir/runtest.vim +++ b/src/testdir/runtest.vim @@ -57,6 +57,19 @@ else set encoding=latin1 endif +" REDIR_TEST_TO_NULL has a very permissive SwapExists autocommand which is for +" the test_name.vim file itself. Replace it here with a more restrictive one, +" so we still catch mistakes. +let s:test_script_fname = expand('%') +au! SwapExists * call HandleSwapExists() +func HandleSwapExists() + " Only ignore finding a swap file for the test script (the user might be + " editing it and do ":make test_name") and the output file. + if expand('') == 'messages' || expand('') =~ s:test_script_fname + let v:swapchoice = 'e' + endif +endfunc + " Avoid stopping at the "hit enter" prompt set nomore @@ -146,6 +159,7 @@ func RunTheTest(test) " Clear any autocommands au! + au SwapExists * call HandleSwapExists() " Close any extra tab pages and windows and make the current one not modified. while tabpagenr('$') > 1 diff --git a/src/version.c b/src/version.c index d4c872a832..926efea0bf 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 456, /**/ 455, /**/ From 0cc7b2d6ccc79d6ce69f5405f9914a42cb4f615e Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 15:49:56 +0200 Subject: [PATCH 06/17] patch 8.1.0457: win32 console: key mappings don't work Problem: Win32 console: key mappings don't work. Solution: Use another solution for the keypad keys that doesn't break mappings. Some values will be negative. (Mike Williams) --- src/os_win32.c | 98 ++++++++++++++++++++++++++++---------------------- src/version.c | 2 ++ 2 files changed, 58 insertions(+), 42 deletions(-) diff --git a/src/os_win32.c b/src/os_win32.c index 9d1d8cbc22..6d6faa9aba 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -852,7 +852,7 @@ static const struct int chAlt; } VirtKeyMap[] = { -/* Key ANSI alone shift ctrl alt */ +// Key ANSI alone shift ctrl alt { VK_ESCAPE,FALSE, ESC, ESC, ESC, ESC, }, { VK_F1, TRUE, ';', 'T', '^', 'h', }, @@ -865,49 +865,50 @@ static const struct { VK_F8, TRUE, 'B', '[', 'e', 'o', }, { VK_F9, TRUE, 'C', '\\', 'f', 'p', }, { VK_F10, TRUE, 'D', ']', 'g', 'q', }, - { VK_F11, TRUE, 0x85, 0x87, 0x89, 0x8B, }, - { VK_F12, TRUE, 0x86, 0x88, 0x8a, 0x8c, }, + { VK_F11, TRUE, '\205', '\207', '\211', '\213', }, + { VK_F12, TRUE, '\206', '\210', '\212', '\214', }, - { VK_HOME, TRUE, 'G', 0xc2, 'w', 0xc3, }, - { VK_UP, TRUE, 'H', 0xc4, 0xc5, 0xc6, }, - { VK_PRIOR, TRUE, 'I', 0xc7, 0x84, 0xc8, }, /*PgUp*/ - { VK_LEFT, TRUE, 'K', 0xc9, 's', 0xca, }, - { VK_RIGHT, TRUE, 'M', 0xcb, 't', 0xcc, }, - { VK_END, TRUE, 'O', 0xcd, 'u', 0xce, }, - { VK_DOWN, TRUE, 'P', 0xcf, 0xd0, 0xd1, }, - { VK_NEXT, TRUE, 'Q', 0xd2, 'v', 0xd3, }, /*PgDn*/ - { VK_INSERT,TRUE, 'R', 0xd4, 0xd5, 0xd6, }, - { VK_DELETE,TRUE, 'S', 0xd7, 0xd8, 0xd9, }, + { VK_HOME, TRUE, 'G', '\302', 'w', '\303', }, + { VK_UP, TRUE, 'H', '\304', '\305', '\306', }, + { VK_PRIOR, TRUE, 'I', '\307', '\204', '\310', }, // PgUp + { VK_LEFT, TRUE, 'K', '\311', 's', '\312', }, + { VK_RIGHT, TRUE, 'M', '\313', 't', '\314', }, + { VK_END, TRUE, 'O', '\315', 'u', '\316', }, + { VK_DOWN, TRUE, 'P', '\317', '\320', '\321', }, + { VK_NEXT, TRUE, 'Q', '\322', 'v', '\323', }, // PgDn + { VK_INSERT,TRUE, 'R', '\324', '\325', '\326', }, + { VK_DELETE,TRUE, 'S', '\327', '\330', '\331', }, - { VK_SNAPSHOT,TRUE, 0, 0, 0, 'r', }, /*PrtScrn*/ + { VK_SNAPSHOT,TRUE, 0, 0, 0, 'r', }, // PrtScrn #if 0 - /* Most people don't have F13-F20, but what the hell... */ - { VK_F13, TRUE, 0xda, 0xdb, 0xdc, 0xdd, }, - { VK_F14, TRUE, 0xde, 0xdf, 0xe0, 0xe1, }, - { VK_F15, TRUE, 0xe2, 0xe3, 0xe4, 0xe5, }, - { VK_F16, TRUE, 0xe6, 0xe7, 0xe8, 0xe9, }, - { VK_F17, TRUE, 0xea, 0xeb, 0xec, 0xed, }, - { VK_F18, TRUE, 0xee, 0xef, 0xf0, 0xf1, }, - { VK_F19, TRUE, 0xf2, 0xf3, 0xf4, 0xf5, }, - { VK_F20, TRUE, 0xf6, 0xf7, 0xf8, 0xf9, }, + // Most people don't have F13-F20, but what the hell... + { VK_F13, TRUE, '\332', '\333', '\334', '\335', }, + { VK_F14, TRUE, '\336', '\337', '\340', '\341', }, + { VK_F15, TRUE, '\342', '\343', '\344', '\345', }, + { VK_F16, TRUE, '\346', '\347', '\350', '\351', }, + { VK_F17, TRUE, '\352', '\353', '\354', '\355', }, + { VK_F18, TRUE, '\356', '\357', '\360', '\361', }, + { VK_F19, TRUE, '\362', '\363', '\364', '\365', }, + { VK_F20, TRUE, '\366', '\367', '\370', '\371', }, #endif - { VK_ADD, TRUE, 'N', 'N', 'N', 'N', }, /* keyp '+' */ - { VK_SUBTRACT, TRUE,'J', 'J', 'J', 'J', }, /* keyp '-' */ - /* { VK_DIVIDE, TRUE,'N', 'N', 'N', 'N', }, keyp '/' */ - { VK_MULTIPLY, TRUE,'7', '7', '7', '7', }, /* keyp '*' */ + { VK_ADD, TRUE, 'N', 'N', 'N', 'N', }, // keyp '+' + { VK_SUBTRACT, TRUE,'J', 'J', 'J', 'J', }, // keyp '-' + // { VK_DIVIDE, TRUE,'N', 'N', 'N', 'N', }, // keyp '/' + { VK_MULTIPLY, TRUE,'7', '7', '7', '7', }, // keyp '*' + + { VK_NUMPAD0,TRUE, '\332', '\333', '\334', '\335', }, + { VK_NUMPAD1,TRUE, '\336', '\337', '\340', '\341', }, + { VK_NUMPAD2,TRUE, '\342', '\343', '\344', '\345', }, + { VK_NUMPAD3,TRUE, '\346', '\347', '\350', '\351', }, + { VK_NUMPAD4,TRUE, '\352', '\353', '\354', '\355', }, + { VK_NUMPAD5,TRUE, '\356', '\357', '\360', '\361', }, + { VK_NUMPAD6,TRUE, '\362', '\363', '\364', '\365', }, + { VK_NUMPAD7,TRUE, '\366', '\367', '\370', '\371', }, + { VK_NUMPAD8,TRUE, '\372', '\373', '\374', '\375', }, + // Sorry, out of number space! + { VK_NUMPAD9,TRUE, '\376', '\377', '\377', '\367', }, - { VK_NUMPAD0,TRUE, 0xda, 0xdb, 0xdc, 0xdd, }, - { VK_NUMPAD1,TRUE, 0xde, 0xdf, 0xe0, 0xe1, }, - { VK_NUMPAD2,TRUE, 0xe2, 0xe3, 0xe4, 0xe5, }, - { VK_NUMPAD3,TRUE, 0xe6, 0xe7, 0xe8, 0xe9, }, - { VK_NUMPAD4,TRUE, 0xea, 0xeb, 0xec, 0xed, }, - { VK_NUMPAD5,TRUE, 0xee, 0xef, 0xf0, 0xf1, }, - { VK_NUMPAD6,TRUE, 0xf2, 0xf3, 0xf4, 0xf5, }, - { VK_NUMPAD7,TRUE, 0xf6, 0xf7, 0xf8, 0xf9, }, - { VK_NUMPAD8,TRUE, 0xfa, 0xfb, 0xfc, 0xfd, }, - /* Sorry, out of number space! */ - { VK_NUMPAD9,TRUE, 0xfe, 0xff, 0xff, 0xf7, }, }; @@ -1914,11 +1915,24 @@ mch_inchar( typeahead[typeaheadlen] = c; if (ch2 != NUL) { - if (c == K_NUL && (ch2 & 0xff00) != 0) + if (c == K_NUL) { - /* fAnsiKey with modifier keys */ - typeahead[typeaheadlen + n] = (char_u)ch2; - n++; + switch (ch2) + { + case (WCHAR)'\324': // SHIFT+Insert + case (WCHAR)'\325': // CTRL+Insert + case (WCHAR)'\327': // SHIFT+Delete + case (WCHAR)'\330': // CTRL+Delete + typeahead[typeaheadlen + n] = (char_u)ch2; + n++; + break; + + default: + typeahead[typeaheadlen + n] = 3; + typeahead[typeaheadlen + n + 1] = (char_u)ch2; + n += 2; + break; + } } else { diff --git a/src/version.c b/src/version.c index 926efea0bf..f701c2521b 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 457, /**/ 456, /**/ From df77cef92ec034796723ffa3adb12e8b46daa98e Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 17:46:42 +0200 Subject: [PATCH 07/17] patch 8.1.0458: ml_get error and crash when using "do" Problem: Ml_get error and crash when using "do". Solution: Adjust cursor position also when diffupdate is not needed. (Hirohito Higashi) --- src/diff.c | 19 ++++++++++--------- src/testdir/test_diffmode.vim | 22 ++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/diff.c b/src/diff.c index d63bd9373f..054924e67e 100644 --- a/src/diff.c +++ b/src/diff.c @@ -2848,18 +2848,19 @@ ex_diffgetput(exarg_T *eap) theend: diff_busy = FALSE; if (diff_need_update) - { - diff_need_update = FALSE; ex_diffupdate(NULL); - } + + // Check that the cursor is on a valid character and update it's + // position. When there were filler lines the topline has become + // invalid. + check_cursor(); + changed_line_abv_curs(); + + if (diff_need_update) + // redraw already done by ex_diffupdate() + diff_need_update = FALSE; else { - // Check that the cursor is on a valid character and update it's - // position. When there were filler lines the topline has become - // invalid. - check_cursor(); - changed_line_abv_curs(); - // Also need to redraw the other buffers. diff_redraw(FALSE); apply_autocmds(EVENT_DIFFUPDATED, NULL, NULL, FALSE, curbuf); diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim index 760440a9b4..e1da19fefe 100644 --- a/src/testdir/test_diffmode.vim +++ b/src/testdir/test_diffmode.vim @@ -277,6 +277,28 @@ func Test_dp_do_buffer() %bwipe! endfunc +func Test_do_lastline() + e! one + call setline(1, ['1','2','3','4','5','6']) + diffthis + + new two + call setline(1, ['2','4','5']) + diffthis + + 1 + norm dp]c + norm dp]c + wincmd w + call assert_equal(4, line('$')) + norm G + norm do + call assert_equal(3, line('$')) + + windo diffoff + %bwipe! +endfunc + func Test_diffoff() enew! call setline(1, ['Two', 'Three']) diff --git a/src/version.c b/src/version.c index f701c2521b..b25f132455 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 458, /**/ 457, /**/ From a05a0d325c7615439f4a42f00682b2ebad43c8d9 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 18:43:05 +0200 Subject: [PATCH 08/17] patch 8.1.0459: Test_executable fails when there is a dog in the system Problem: Test_executable fails when there is a dog in the system. Solution: Rename the dog. (Hirohito Higashi) --- src/testdir/test_functions.vim | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index d601c278cc..e59cdf82a3 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -855,7 +855,7 @@ func Test_Executable() call assert_equal(0, executable('win.ini')) elseif has('unix') call assert_equal(1, executable('cat')) - call assert_equal(0, executable('dog')) + call assert_equal(0, executable('nodogshere')) endif endfunc diff --git a/src/version.c b/src/version.c index b25f132455..c868496700 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 459, /**/ 458, /**/ From 1307d1c003b01b4f67524c95feb07c3d91c7c428 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 20:16:49 +0200 Subject: [PATCH 09/17] patch 8.1.0460: assert_fails() does not take a message argument Problem: assert_fails() does not take a message argument Solution: Add the argument. --- src/eval.c | 11 ++++++++++- src/evalfunc.c | 4 ++-- src/testdir/test_assert.vim | 8 ++++++++ src/version.c | 2 ++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/eval.c b/src/eval.c index 4f457a457b..8746d55563 100644 --- a/src/eval.c +++ b/src/eval.c @@ -9041,6 +9041,8 @@ assert_fails(typval_T *argvars) char_u *cmd = get_tv_string_chk(&argvars[0]); garray_T ga; int ret = 0; + char_u numbuf[NUMBUFLEN]; + char_u *tofree; called_emsg = FALSE; suppress_errthrow = TRUE; @@ -9050,7 +9052,14 @@ assert_fails(typval_T *argvars) { prepare_assert_error(&ga); ga_concat(&ga, (char_u *)"command did not fail: "); - ga_concat(&ga, cmd); + if (argvars[1].v_type != VAR_UNKNOWN + && argvars[2].v_type != VAR_UNKNOWN) + { + ga_concat(&ga, echo_string(&argvars[2], &tofree, numbuf, 0)); + vim_free(tofree); + } + else + ga_concat(&ga, cmd); assert_error(&ga); ga_clear(&ga); ret = 1; diff --git a/src/evalfunc.c b/src/evalfunc.c index c9f4c4581c..0d799964ff 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -512,7 +512,7 @@ static struct fst {"assert_equal", 2, 3, f_assert_equal}, {"assert_equalfile", 2, 2, f_assert_equalfile}, {"assert_exception", 1, 2, f_assert_exception}, - {"assert_fails", 1, 2, f_assert_fails}, + {"assert_fails", 1, 3, f_assert_fails}, {"assert_false", 1, 2, f_assert_false}, {"assert_inrange", 3, 4, f_assert_inrange}, {"assert_match", 2, 3, f_assert_match}, @@ -1507,7 +1507,7 @@ f_assert_exception(typval_T *argvars, typval_T *rettv) } /* - * "assert_fails(cmd [, error])" function + * "assert_fails(cmd [, error[, msg]])" function */ static void f_assert_fails(typval_T *argvars, typval_T *rettv) diff --git a/src/testdir/test_assert.vim b/src/testdir/test_assert.vim index 28db289b2a..fb31478aa4 100644 --- a/src/testdir/test_assert.vim +++ b/src/testdir/test_assert.vim @@ -152,6 +152,14 @@ func Test_assert_fail_fails() call assert_equal(1, assert_fails('xxx', {})) call assert_match("Expected {} but got 'E731:", v:errors[0]) call remove(v:errors, 0) + + call assert_equal(1, assert_fails('xxx', {}, 'stupid')) + call assert_match("stupid: Expected {} but got 'E731:", v:errors[0]) + call remove(v:errors, 0) + + call assert_equal(1, assert_fails('echo', '', 'echo command')) + call assert_match("command did not fail: echo command", v:errors[0]) + call remove(v:errors, 0) endfunc func Test_assert_beeps() diff --git a/src/version.c b/src/version.c index c868496700..7a2e94a112 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 460, /**/ 459, /**/ From 00bf8cd2115be7c14258aee48c0a7568147c9cd7 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 20:26:20 +0200 Subject: [PATCH 10/17] patch 8.1.0461: quickfix code uses too many /* */ comments Problem: Quickfix code uses too many /* */ comments. Solution: Change to // comments. (Yegappan Lakshmanan) --- src/quickfix.c | 1086 ++++++++++++++++++++++-------------------------- src/version.c | 2 + 2 files changed, 503 insertions(+), 585 deletions(-) diff --git a/src/quickfix.c b/src/quickfix.c index 30f9bdeb2d..1b491c280a 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -27,20 +27,20 @@ struct dir_stack_T typedef struct qfline_S qfline_T; struct qfline_S { - qfline_T *qf_next; /* pointer to next error in the list */ - qfline_T *qf_prev; /* pointer to previous error in the list */ - linenr_T qf_lnum; /* line number where the error occurred */ - int qf_fnum; /* file number for the line */ - int qf_col; /* column where the error occurred */ - int qf_nr; /* error number */ - char_u *qf_module; /* module name for this error */ - char_u *qf_pattern; /* search pattern for the error */ - char_u *qf_text; /* description of the error */ - char_u qf_viscol; /* set to TRUE if qf_col is screen column */ - char_u qf_cleared; /* set to TRUE if line has been deleted */ - char_u qf_type; /* type of the error (mostly 'E'); 1 for - :helpgrep */ - char_u qf_valid; /* valid error message detected */ + qfline_T *qf_next; // pointer to next error in the list + qfline_T *qf_prev; // pointer to previous error in the list + linenr_T qf_lnum; // line number where the error occurred + int qf_fnum; // file number for the line + int qf_col; // column where the error occurred + int qf_nr; // error number + char_u *qf_module; // module name for this error + char_u *qf_pattern; // search pattern for the error + char_u *qf_text; // description of the error + char_u qf_viscol; // set to TRUE if qf_col is screen column + char_u qf_cleared; // set to TRUE if line has been deleted + char_u qf_type; // type of the error (mostly 'E'); 1 for + // :helpgrep + char_u qf_valid; // valid error message detected }; /* @@ -60,16 +60,16 @@ struct qfline_S */ typedef struct qf_list_S { - int_u qf_id; /* Unique identifier for this list */ - qfline_T *qf_start; /* pointer to the first error */ - qfline_T *qf_last; /* pointer to the last error */ - qfline_T *qf_ptr; /* pointer to the current error */ - int qf_count; /* number of errors (0 means empty list) */ - int qf_index; /* current index in the error list */ - int qf_nonevalid; /* TRUE if not a single valid entry found */ - char_u *qf_title; /* title derived from the command that created - * the error list or set by setqflist */ - typval_T *qf_ctx; /* context set by setqflist/setloclist */ + int_u qf_id; // Unique identifier for this list + qfline_T *qf_start; // pointer to the first error + qfline_T *qf_last; // pointer to the last error + qfline_T *qf_ptr; // pointer to the current error + int qf_count; // number of errors (0 means empty list) + int qf_index; // current index in the error list + int qf_nonevalid; // TRUE if not a single valid entry found + char_u *qf_title; // title derived from the command that created + // the error list or set by setqflist + typval_T *qf_ctx; // context set by setqflist/setloclist struct dir_stack_T *qf_dir_stack; char_u *qf_directory; @@ -87,22 +87,20 @@ typedef struct qf_list_S */ struct qf_info_S { - /* - * Count of references to this list. Used only for location lists. - * When a location list window reference this list, qf_refcount - * will be 2. Otherwise, qf_refcount will be 1. When qf_refcount - * reaches 0, the list is freed. - */ + // Count of references to this list. Used only for location lists. + // When a location list window reference this list, qf_refcount + // will be 2. Otherwise, qf_refcount will be 1. When qf_refcount + // reaches 0, the list is freed. int qf_refcount; - int qf_listcount; /* current number of lists */ - int qf_curlist; /* current error list */ + int qf_listcount; // current number of lists + int qf_curlist; // current error list qf_list_T qf_lists[LISTCOUNT]; }; -static qf_info_T ql_info; /* global quickfix list */ -static int_u last_qf_id = 0; /* Last used quickfix list id */ +static qf_info_T ql_info; // global quickfix list +static int_u last_qf_id = 0; // Last used quickfix list id -#define FMT_PATTERNS 11 /* maximum number of % recognized */ +#define FMT_PATTERNS 11 // maximum number of % recognized /* * Structure used to hold the info of one part of 'errorformat' @@ -110,29 +108,29 @@ static int_u last_qf_id = 0; /* Last used quickfix list id */ typedef struct efm_S efm_T; struct efm_S { - regprog_T *prog; /* pre-formatted part of 'errorformat' */ - efm_T *next; /* pointer to next (NULL if last) */ - char_u addr[FMT_PATTERNS]; /* indices of used % patterns */ - char_u prefix; /* prefix of this format line: */ - /* 'D' enter directory */ - /* 'X' leave directory */ - /* 'A' start of multi-line message */ - /* 'E' error message */ - /* 'W' warning message */ - /* 'I' informational message */ - /* 'C' continuation line */ - /* 'Z' end of multi-line message */ - /* 'G' general, unspecific message */ - /* 'P' push file (partial) message */ - /* 'Q' pop/quit file (partial) message */ - /* 'O' overread (partial) message */ - char_u flags; /* additional flags given in prefix */ - /* '-' do not include this line */ - /* '+' include whole line in message */ - int conthere; /* %> used */ + regprog_T *prog; // pre-formatted part of 'errorformat' + efm_T *next; // pointer to next (NULL if last) + char_u addr[FMT_PATTERNS]; // indices of used % patterns + char_u prefix; // prefix of this format line: + // 'D' enter directory + // 'X' leave directory + // 'A' start of multi-line message + // 'E' error message + // 'W' warning message + // 'I' informational message + // 'C' continuation line + // 'Z' end of multi-line message + // 'G' general, unspecific message + // 'P' push file (partial) message + // 'Q' pop/quit file (partial) message + // 'O' overread (partial) message + char_u flags; // additional flags given in prefix + // '-' do not include this line + // '+' include whole line in message + int conthere; // %> used }; -static efm_T *fmt_start = NULL; /* cached across qf_parse_line() calls */ +static efm_T *fmt_start = NULL; // cached across qf_parse_line() calls static void qf_new_list(qf_info_T *qi, char_u *qf_title); static int qf_add_entry(qf_info_T *qi, int qf_idx, char_u *dir, char_u *fname, char_u *module, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid); @@ -153,9 +151,9 @@ static void wipe_dummy_buffer(buf_T *buf, char_u *dirname_start); static void unload_dummy_buffer(buf_T *buf, char_u *dirname_start); static qf_info_T *ll_get_or_alloc_list(win_T *); -/* Quickfix window check helper macro */ +// Quickfix window check helper macro #define IS_QF_WINDOW(wp) (bt_quickfix(wp->w_buffer) && wp->w_llist_ref == NULL) -/* Location list window check helper macro */ +// Location list window check helper macro #define IS_LL_WINDOW(wp) (bt_quickfix(wp->w_buffer) && wp->w_llist_ref != NULL) // Quickfix and location list stack check helper macros @@ -189,7 +187,7 @@ static struct fmtpattern char *pattern; } fmt_pat[FMT_PATTERNS] = { - {'f', ".\\+"}, /* only used when at end */ + {'f', ".\\+"}, // only used when at end {'n', "\\d\\+"}, {'l', "\\d\\+"}, {'c', "\\d\\+"}, @@ -221,7 +219,7 @@ efmpat_to_regpat( if (efminfo->addr[idx]) { - /* Each errorformat pattern can occur only once */ + // Each errorformat pattern can occur only once sprintf((char *)errmsg, _("E372: Too many %%%c in format string"), *efmpat); EMSG(errmsg); @@ -243,9 +241,9 @@ efmpat_to_regpat( #ifdef BACKSLASH_IN_FILENAME if (*efmpat == 'f') { - /* Also match "c:" in the file name, even when - * checking for a colon next: "%f:". - * "\%(\a:\)\=" */ + // Also match "c:" in the file name, even when + // checking for a colon next: "%f:". + // "\%(\a:\)\=" STRCPY(regpat, "\\%(\\a:\\)\\="); regpat += 10; } @@ -254,18 +252,18 @@ efmpat_to_regpat( { if (efmpat[1] != '\\' && efmpat[1] != '%') { - /* A file name may contain spaces, but this isn't - * in "\f". For "%f:%l:%m" there may be a ":" in - * the file name. Use ".\{-1,}x" instead (x is - * the next character), the requirement that :999: - * follows should work. */ + // A file name may contain spaces, but this isn't + // in "\f". For "%f:%l:%m" there may be a ":" in + // the file name. Use ".\{-1,}x" instead (x is + // the next character), the requirement that :999: + // follows should work. STRCPY(regpat, ".\\{-1,}"); regpat += 7; } else { - /* File name followed by '\\' or '%': include as - * many file name chars as possible. */ + // File name followed by '\\' or '%': include as + // many file name chars as possible. STRCPY(regpat, "\\f\\+"); regpat += 4; } @@ -298,16 +296,16 @@ scanf_fmt_to_regpat( if (*efmp == '[' || *efmp == '\\') { - if ((*regpat++ = *efmp) == '[') /* %*[^a-z0-9] etc. */ + if ((*regpat++ = *efmp) == '[') // %*[^a-z0-9] etc. { if (efmp[1] == '^') *regpat++ = *++efmp; if (efmp < efm + len) { - *regpat++ = *++efmp; /* could be ']' */ + *regpat++ = *++efmp; // could be ']' while (efmp < efm + len && (*regpat++ = *++efmp) != ']') - /* skip */; + // skip ; if (efmp == efm + len) { EMSG(_("E374: Missing ] in format string")); @@ -315,14 +313,14 @@ scanf_fmt_to_regpat( } } } - else if (efmp < efm + len) /* %*\D, %*\s etc. */ + else if (efmp < efm + len) // %*\D, %*\s etc. *regpat++ = *++efmp; *regpat++ = '\\'; *regpat++ = '+'; } else { - /* TODO: scanf()-like: %*ud, %*3c, %*f, ... ? */ + // TODO: scanf()-like: %*ud, %*3c, %*f, ... ? sprintf((char *)errmsg, _("E375: Unsupported %%%c in format string"), *efmp); EMSG(errmsg); @@ -374,9 +372,7 @@ efm_to_regpat( int round; int idx = 0; - /* - * Build a regexp pattern for a 'errorformat' option part - */ + // Build a regexp pattern for a 'errorformat' option part ptr = regpat; *ptr++ = '^'; round = 0; @@ -404,17 +400,15 @@ efm_to_regpat( return FAIL; } else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL) - *ptr++ = *efmp; /* regexp magic characters */ + *ptr++ = *efmp; // regexp magic characters else if (*efmp == '#') *ptr++ = '*'; else if (*efmp == '>') fmt_ptr->conthere = TRUE; - else if (efmp == efm + 1) /* analyse prefix */ + else if (efmp == efm + 1) // analyse prefix { - /* - * prefix is allowed only at the beginning of the errorformat - * option part - */ + // prefix is allowed only at the beginning of the errorformat + // option part efmp = efm_analyze_prefix(efmp, fmt_ptr, errmsg); if (efmp == NULL) return FAIL; @@ -427,12 +421,12 @@ efm_to_regpat( return FAIL; } } - else /* copy normal character */ + else // copy normal character { if (*efmp == '\\' && efmp + 1 < efm + len) ++efmp; else if (vim_strchr((char_u *)".*^$~[", *efmp) != NULL) - *ptr++ = '\\'; /* escape regexp atoms */ + *ptr++ = '\\'; // escape regexp atoms if (*efmp) *ptr++ = *efmp; } @@ -474,9 +468,9 @@ efm_regpat_bufsz(char_u *efm) for (i = FMT_PATTERNS; i > 0; ) sz += (int)STRLEN(fmt_pat[--i].pattern); #ifdef BACKSLASH_IN_FILENAME - sz += 12; /* "%f" can become twelve chars longer (see efm_to_regpat) */ + sz += 12; // "%f" can become twelve chars longer (see efm_to_regpat) #else - sz += 2; /* "%f" can become two chars longer */ + sz += 2; // "%f" can become two chars longer #endif return sz; @@ -519,48 +513,38 @@ parse_efm_option(char_u *efm) if (errmsg == NULL) goto parse_efm_end; - /* - * Each part of the format string is copied and modified from errorformat - * to regex prog. Only a few % characters are allowed. - */ + // Each part of the format string is copied and modified from errorformat + // to regex prog. Only a few % characters are allowed. - /* - * Get some space to modify the format string into. - */ + // Get some space to modify the format string into. sz = efm_regpat_bufsz(efm); if ((fmtstr = alloc(sz)) == NULL) goto parse_efm_error; while (efm[0] != NUL) { - /* - * Allocate a new eformat structure and put it at the end of the list - */ + // Allocate a new eformat structure and put it at the end of the list fmt_ptr = (efm_T *)alloc_clear((unsigned)sizeof(efm_T)); if (fmt_ptr == NULL) goto parse_efm_error; - if (fmt_first == NULL) /* first one */ + if (fmt_first == NULL) // first one fmt_first = fmt_ptr; else fmt_last->next = fmt_ptr; fmt_last = fmt_ptr; - /* - * Isolate one part in the 'errorformat' option - */ + // Isolate one part in the 'errorformat' option len = efm_option_part_len(efm); if (efm_to_regpat(efm, len, fmt_ptr, fmtstr, errmsg) == FAIL) goto parse_efm_error; if ((fmt_ptr->prog = vim_regcomp(fmtstr, RE_MAGIC + RE_STRING)) == NULL) goto parse_efm_error; - /* - * Advance to next part - */ - efm = skip_to_option_part(efm + len); /* skip comma and spaces */ + // Advance to next part + efm = skip_to_option_part(efm + len); // skip comma and spaces } - if (fmt_first == NULL) /* nothing found */ + if (fmt_first == NULL) // nothing found EMSG(_("E378: 'errorformat' contains no pattern")); goto parse_efm_end; @@ -611,10 +595,8 @@ qf_grow_linebuf(qfstate_T *state, int newsz) { char_u *p; - /* - * If the line exceeds LINE_MAXLEN exclude the last - * byte since it's not a NL character. - */ + // If the line exceeds LINE_MAXLEN exclude the last + // byte since it's not a NL character. state->linelen = newsz > LINE_MAXLEN ? LINE_MAXLEN - 1 : newsz; if (state->growbuf == NULL) { @@ -639,12 +621,12 @@ qf_grow_linebuf(qfstate_T *state, int newsz) static int qf_get_next_str_line(qfstate_T *state) { - /* Get the next line from the supplied string */ + // Get the next line from the supplied string char_u *p_str = state->p_str; char_u *p; int len; - if (*p_str == NUL) /* Reached the end of the string */ + if (*p_str == NUL) // Reached the end of the string return QF_END_OF_INPUT; p = vim_strchr(p_str, '\n'); @@ -666,10 +648,8 @@ qf_get_next_str_line(qfstate_T *state) } vim_strncpy(state->linebuf, p_str, state->linelen); - /* - * Increment using len in order to discard the rest of the - * line if it exceeds LINE_MAXLEN. - */ + // Increment using len in order to discard the rest of the + // line if it exceeds LINE_MAXLEN. p_str += len; state->p_str = p_str; @@ -688,9 +668,9 @@ qf_get_next_list_line(qfstate_T *state) while (p_li != NULL && (p_li->li_tv.v_type != VAR_STRING || p_li->li_tv.vval.v_string == NULL)) - p_li = p_li->li_next; /* Skip non-string items */ + p_li = p_li->li_next; // Skip non-string items - if (p_li == NULL) /* End of the list */ + if (p_li == NULL) // End of the list { state->p_li = NULL; return QF_END_OF_INPUT; @@ -711,7 +691,7 @@ qf_get_next_list_line(qfstate_T *state) vim_strncpy(state->linebuf, p_li->li_tv.vval.v_string, state->linelen); - state->p_li = p_li->li_next; /* next item */ + state->p_li = p_li->li_next; // next item return QF_OK; } @@ -724,7 +704,7 @@ qf_get_next_buf_line(qfstate_T *state) char_u *p_buf = NULL; int len; - /* Get the next line from the supplied buffer */ + // Get the next line from the supplied buffer if (state->buflnum > state->lnumlast) return QF_END_OF_INPUT; @@ -764,10 +744,8 @@ qf_get_next_file_line(qfstate_T *state) state->linelen = (int)STRLEN(IObuff); if (state->linelen == IOSIZE - 1 && !(IObuff[state->linelen - 1] == '\n')) { - /* - * The current line exceeds IObuff, continue reading using - * growbuf until EOL or LINE_MAXLEN bytes is read. - */ + // The current line exceeds IObuff, continue reading using + // growbuf until EOL or LINE_MAXLEN bytes is read. if (state->growbuf == NULL) { state->growbufsiz = 2 * (IOSIZE - 1); @@ -776,7 +754,7 @@ qf_get_next_file_line(qfstate_T *state) return QF_NOMEM; } - /* Copy the read part of the line, excluding null-terminator */ + // Copy the read part of the line, excluding null-terminator memcpy(state->growbuf, IObuff, IOSIZE - 1); growbuflen = state->linelen; @@ -806,11 +784,9 @@ qf_get_next_file_line(qfstate_T *state) while (discard) { - /* - * The current line is longer than LINE_MAXLEN, continue - * reading but discard everything until EOL or EOF is - * reached. - */ + // The current line is longer than LINE_MAXLEN, continue + // reading but discard everything until EOL or EOF is + // reached. if (fgets((char *)IObuff, IOSIZE, state->fd) == NULL || (int)STRLEN(IObuff) < IOSIZE - 1 || IObuff[IOSIZE - 1] == '\n') @@ -824,7 +800,7 @@ qf_get_next_file_line(qfstate_T *state) state->linebuf = IObuff; #ifdef FEAT_MBYTE - /* Convert a line if it contains a non-ASCII character. */ + // Convert a line if it contains a non-ASCII character. if (state->vc.vc_type != CONV_NONE && has_non_ascii(state->linebuf)) { char_u *line; @@ -864,24 +840,24 @@ qf_get_nextline(qfstate_T *state) if (state->tv != NULL) { if (state->tv->v_type == VAR_STRING) - /* Get the next line from the supplied string */ + // Get the next line from the supplied string status = qf_get_next_str_line(state); else if (state->tv->v_type == VAR_LIST) - /* Get the next line from the supplied list */ + // Get the next line from the supplied list status = qf_get_next_list_line(state); } else - /* Get the next line from the supplied buffer */ + // Get the next line from the supplied buffer status = qf_get_next_buf_line(state); } else - /* Get the next line from the supplied file */ + // Get the next line from the supplied file status = qf_get_next_file_line(state); if (status != QF_OK) return status; - /* remove newline/CR from the line */ + // remove newline/CR from the line if (state->linelen > 0 && state->linebuf[state->linelen - 1] == '\n') { state->linebuf[state->linelen - 1] = NUL; @@ -924,16 +900,14 @@ qf_parse_fmt_f(regmatch_T *rmp, int midx, qffields_T *fields, int prefix) if (rmp->startp[midx] == NULL || rmp->endp[midx] == NULL) return QF_FAIL; - /* Expand ~/file and $HOME/file to full path. */ + // Expand ~/file and $HOME/file to full path. c = *rmp->endp[midx]; *rmp->endp[midx] = NUL; expand_env(rmp->startp[midx], fields->namebuf, CMDBUFFSIZE); *rmp->endp[midx] = c; - /* - * For separate filename patterns (%O, %P and %Q), the specified file - * should exist. - */ + // For separate filename patterns (%O, %P and %Q), the specified file + // should exist. if (vim_strchr((char_u *)"OPQ", prefix) != NULL && mch_getperm(fields->namebuf) == -1) return QF_FAIL; @@ -1004,7 +978,7 @@ qf_parse_fmt_plus(char_u *linebuf, int linelen, qffields_T *fields) if (linelen >= fields->errmsglen) { - /* linelen + null terminator */ + // linelen + null terminator if ((p = vim_realloc(fields->errmsg, linelen + 1)) == NULL) return QF_NOMEM; fields->errmsg = p; @@ -1029,7 +1003,7 @@ qf_parse_fmt_m(regmatch_T *rmp, int midx, qffields_T *fields) len = (int)(rmp->endp[midx] - rmp->startp[midx]); if (len >= fields->errmsglen) { - /* len + null terminator */ + // len + null terminator if ((p = vim_realloc(fields->errmsg, len + 1)) == NULL) return QF_NOMEM; fields->errmsg = p; @@ -1181,27 +1155,26 @@ qf_parse_match( fields->type = idx; else fields->type = 0; - /* - * Extract error message data from matched line. - * We check for an actual submatch, because "\[" and "\]" in - * the 'errorformat' may cause the wrong submatch to be used. - */ + + // Extract error message data from matched line. + // We check for an actual submatch, because "\[" and "\]" in + // the 'errorformat' may cause the wrong submatch to be used. for (i = 0; i < FMT_PATTERNS; i++) { status = QF_OK; midx = (int)fmt_ptr->addr[i]; - if (i == 0 && midx > 0) /* %f */ + if (i == 0 && midx > 0) // %f status = qf_parse_fmt_f(regmatch, midx, fields, idx); else if (i == 5) { - if (fmt_ptr->flags == '+' && !qf_multiscan) /* %+ */ + if (fmt_ptr->flags == '+' && !qf_multiscan) // %+ status = qf_parse_fmt_plus(linebuf, linelen, fields); - else if (midx > 0) /* %m */ + else if (midx > 0) // %m status = qf_parse_fmt_m(regmatch, midx, fields); } - else if (i == 6 && midx > 0) /* %r */ + else if (i == 6 && midx > 0) // %r status = qf_parse_fmt_r(regmatch, midx, tail); - else if (midx > 0) /* others */ + else if (midx > 0) // others status = (qf_parse_fmt[i])(regmatch, midx, fields); if (status != QF_OK) @@ -1247,7 +1220,7 @@ qf_parse_get_fields( fields->type = 0; *tail = NULL; - /* Always ignore case when looking for a matching error. */ + // Always ignore case when looking for a matching error. regmatch.rm_ic = TRUE; regmatch.regprog = fmt_ptr->prog; r = vim_regexec(®match, linebuf, (colnr_T)0); @@ -1267,7 +1240,7 @@ qf_parse_get_fields( static int qf_parse_dir_pfx(int idx, qffields_T *fields, qf_list_T *qfl) { - if (idx == 'D') /* enter directory */ + if (idx == 'D') // enter directory { if (*fields->namebuf == NUL) { @@ -1279,7 +1252,7 @@ qf_parse_dir_pfx(int idx, qffields_T *fields, qf_list_T *qfl) if (qfl->qf_directory == NULL) return QF_FAIL; } - else if (idx == 'X') /* leave directory */ + else if (idx == 'X') // leave directory qfl->qf_directory = qf_pop_dir(&qfl->qf_dir_stack); return QF_OK; @@ -1324,18 +1297,18 @@ qf_parse_line_nomatch(char_u *linebuf, int linelen, qffields_T *fields) { char_u *p; - fields->namebuf[0] = NUL; /* no match found, remove file name */ - fields->lnum = 0; /* don't jump to this line */ + fields->namebuf[0] = NUL; // no match found, remove file name + fields->lnum = 0; // don't jump to this line fields->valid = FALSE; if (linelen >= fields->errmsglen) { - /* linelen + null terminator */ + // linelen + null terminator if ((p = vim_realloc(fields->errmsg, linelen + 1)) == NULL) return QF_NOMEM; fields->errmsg = p; fields->errmsglen = linelen + 1; } - /* copy whole line to error message */ + // copy whole line to error message vim_strncpy(fields->errmsg, linebuf, linelen); return QF_OK; @@ -1376,7 +1349,7 @@ qf_parse_multiline_pfx( if (qfprev->qf_nr == -1) qfprev->qf_nr = fields->enr; if (vim_isprintc(fields->type) && !qfprev->qf_type) - /* only printable chars allowed */ + // only printable chars allowed qfprev->qf_type = fields->type; if (!qfprev->qf_lnum) @@ -1419,20 +1392,18 @@ qf_parse_line( int status; restofline: - /* If there was no %> item start at the first pattern */ + // If there was no %> item start at the first pattern if (fmt_start == NULL) fmt_ptr = fmt_first; else { - /* Otherwise start from the last used pattern */ + // Otherwise start from the last used pattern fmt_ptr = fmt_start; fmt_start = NULL; } - /* - * Try to match each part of 'errorformat' until we find a complete - * match or no match. - */ + // Try to match each part of 'errorformat' until we find a complete + // match or no match. fields->valid = TRUE; for ( ; fmt_ptr != NULL; fmt_ptr = fmt_ptr->next) { @@ -1450,7 +1421,7 @@ restofline: { if (fmt_ptr != NULL) { - /* 'D' and 'X' directory specifiers */ + // 'D' and 'X' directory specifiers status = qf_parse_dir_pfx(idx, fields, qfl); if (status != QF_OK) return status; @@ -1465,31 +1436,31 @@ restofline: } else if (fmt_ptr != NULL) { - /* honor %> item */ + // honor %> item if (fmt_ptr->conthere) fmt_start = fmt_ptr; if (vim_strchr((char_u *)"AEWI", idx) != NULL) { - qfl->qf_multiline = TRUE; /* start of a multi-line message */ - qfl->qf_multiignore = FALSE;/* reset continuation */ + qfl->qf_multiline = TRUE; // start of a multi-line message + qfl->qf_multiignore = FALSE;// reset continuation } else if (vim_strchr((char_u *)"CZ", idx) != NULL) - { /* continuation of multi-line msg */ + { // continuation of multi-line msg status = qf_parse_multiline_pfx(qi, qf_idx, idx, qfl, fields); if (status != QF_OK) return status; } else if (vim_strchr((char_u *)"OPQ", idx) != NULL) - { /* global file names */ + { // global file names status = qf_parse_file_pfx(idx, fields, qfl, tail); if (status == QF_MULTISCAN) goto restofline; } - if (fmt_ptr->flags == '-') /* generally exclude this line */ + if (fmt_ptr->flags == '-') // generally exclude this line { if (qfl->qf_multiline) - /* also exclude continuation lines */ + // also exclude continuation lines qfl->qf_multiignore = TRUE; return QF_IGNORE_LINE; } @@ -1624,9 +1595,9 @@ qf_init_ext( buf_T *buf, typval_T *tv, char_u *errorformat, - int newlist, /* TRUE: start a new error list */ - linenr_T lnumfirst, /* first line number to use */ - linenr_T lnumlast, /* last line number to use */ + int newlist, // TRUE: start a new error list + linenr_T lnumfirst, // first line number to use + linenr_T lnumlast, // last line number to use char_u *qf_title, char_u *enc) { @@ -1638,10 +1609,10 @@ qf_init_ext( static efm_T *fmt_first = NULL; char_u *efm; static char_u *last_efm = NULL; - int retval = -1; /* default: return error flag */ + int retval = -1; // default: return error flag int status; - /* Do not used the cached buffer, it may have been wiped out. */ + // Do not used the cached buffer, it may have been wiped out. VIM_CLEAR(qf_last_bufname); vim_memset(&state, 0, sizeof(state)); @@ -1653,13 +1624,13 @@ qf_init_ext( if (newlist || qf_idx == qi->qf_listcount) { - /* make place for a new list */ + // make place for a new list qf_new_list(qi, qf_title); qf_idx = qi->qf_curlist; } else { - /* Adding to existing list, use last entry. */ + // Adding to existing list, use last entry. adding = TRUE; if (!qf_list_empty(qi, qf_idx)) old_last = qi->qf_lists[qf_idx].qf_last; @@ -1667,48 +1638,42 @@ qf_init_ext( qfl = &qi->qf_lists[qf_idx]; - /* Use the local value of 'errorformat' if it's set. */ + // Use the local value of 'errorformat' if it's set. if (errorformat == p_efm && tv == NULL && *buf->b_p_efm != NUL) efm = buf->b_p_efm; else efm = errorformat; - /* - * If the errorformat didn't change between calls, then reuse the - * previously parsed values. - */ + // If the errorformat didn't change between calls, then reuse the + // previously parsed values. if (last_efm == NULL || (STRCMP(last_efm, efm) != 0)) { - /* free the previously parsed data */ + // free the previously parsed data VIM_CLEAR(last_efm); free_efm_list(&fmt_first); - /* parse the current 'efm' */ + // parse the current 'efm' fmt_first = parse_efm_option(efm); if (fmt_first != NULL) last_efm = vim_strsave(efm); } - if (fmt_first == NULL) /* nothing found */ + if (fmt_first == NULL) // nothing found goto error2; - /* - * got_int is reset here, because it was probably set when killing the - * ":make" command, but we still want to read the errorfile then. - */ + // got_int is reset here, because it was probably set when killing the + // ":make" command, but we still want to read the errorfile then. got_int = FALSE; - /* - * Read the lines in the error file one by one. - * Try to recognize one of the error formats in each line. - */ + // Read the lines in the error file one by one. + // Try to recognize one of the error formats in each line. while (!got_int) { - /* Get the next line from a file/buffer/list/string */ + // Get the next line from a file/buffer/list/string status = qf_get_nextline(&state); - if (status == QF_NOMEM) /* memory alloc failure */ + if (status == QF_NOMEM) // memory alloc failure goto qf_init_end; - if (status == QF_END_OF_INPUT) /* end of input */ + if (status == QF_END_OF_INPUT) // end of input break; status = qf_parse_line(qi, qf_idx, state.linebuf, state.linelen, @@ -1744,7 +1709,7 @@ qf_init_ext( { if (qfl->qf_index == 0) { - /* no valid entry found */ + // no valid entry found qfl->qf_ptr = qfl->qf_start; qfl->qf_index = 1; qfl->qf_nonevalid = TRUE; @@ -1755,7 +1720,7 @@ qf_init_ext( if (qfl->qf_ptr == NULL) qfl->qf_ptr = qfl->qf_start; } - /* return number of matches */ + // return number of matches retval = qfl->qf_count; goto qf_init_end; } @@ -1763,7 +1728,7 @@ qf_init_ext( error2: if (!adding) { - /* Error when creating a new list. Free the new list */ + // Error when creating a new list. Free the new list qf_free(&qi->qf_lists[qi->qf_curlist]); qi->qf_listcount--; if (qi->qf_curlist > 0) @@ -1787,7 +1752,7 @@ qf_init_end: qf_init(win_T *wp, char_u *efile, char_u *errorformat, - int newlist, /* TRUE: start a new error list */ + int newlist, // TRUE: start a new error list char_u *qf_title, char_u *enc) { @@ -1848,18 +1813,14 @@ qf_new_list(qf_info_T *qi, char_u *qf_title) { int i; - /* - * If the current entry is not the last entry, delete entries beyond - * the current entry. This makes it possible to browse in a tree-like - * way with ":grep'. - */ + // If the current entry is not the last entry, delete entries beyond + // the current entry. This makes it possible to browse in a tree-like + // way with ":grep'. while (qi->qf_listcount > qi->qf_curlist + 1) qf_free(&qi->qf_lists[--qi->qf_listcount]); - /* - * When the stack is full, remove to oldest entry - * Otherwise, add a new entry. - */ + // When the stack is full, remove to oldest entry + // Otherwise, add a new entry. if (qi->qf_listcount == LISTCOUNT) { qf_free(&qi->qf_lists[0]); @@ -1886,12 +1847,12 @@ ll_free_all(qf_info_T **pqi) qi = *pqi; if (qi == NULL) return; - *pqi = NULL; /* Remove reference to this list */ + *pqi = NULL; // Remove reference to this list qi->qf_refcount--; if (qi->qf_refcount < 1) { - /* No references to this location list */ + // No references to this location list for (i = 0; i < qi->qf_listcount; ++i) qf_free(&qi->qf_lists[i]); vim_free(qi); @@ -1909,12 +1870,12 @@ qf_free_all(win_T *wp) if (wp != NULL) { - /* location list */ + // location list ll_free_all(&wp->w_llist); ll_free_all(&wp->w_llist_ref); } else - /* quickfix list */ + // quickfix list for (i = 0; i < qi->qf_listcount; ++i) qf_free(&qi->qf_lists[i]); } @@ -1925,24 +1886,24 @@ qf_free_all(win_T *wp) */ static int qf_add_entry( - qf_info_T *qi, /* quickfix list */ - int qf_idx, /* list index */ - char_u *dir, /* optional directory name */ - char_u *fname, /* file name or NULL */ - char_u *module, /* module name or NULL */ - int bufnum, /* buffer number or zero */ - char_u *mesg, /* message */ - long lnum, /* line number */ - int col, /* column */ - int vis_col, /* using visual column */ - char_u *pattern, /* search pattern */ - int nr, /* error number */ - int type, /* type character */ - int valid) /* valid entry */ + qf_info_T *qi, // quickfix list + int qf_idx, // list index + char_u *dir, // optional directory name + char_u *fname, // file name or NULL + char_u *module, // module name or NULL + int bufnum, // buffer number or zero + char_u *mesg, // message + long lnum, // line number + int col, // column + int vis_col, // using visual column + char_u *pattern, // search pattern + int nr, // error number + int type, // type character + int valid) // valid entry { qf_list_T *qfl = &qi->qf_lists[qf_idx]; qfline_T *qfp; - qfline_T **lastp; /* pointer to qf_last or NULL */ + qfline_T **lastp; // pointer to qf_last or NULL if ((qfp = (qfline_T *)alloc((unsigned)sizeof(qfline_T))) == NULL) return FAIL; @@ -1983,13 +1944,13 @@ qf_add_entry( return FAIL; } qfp->qf_nr = nr; - if (type != 1 && !vim_isprintc(type)) /* only printable chars allowed */ + if (type != 1 && !vim_isprintc(type)) // only printable chars allowed type = 0; qfp->qf_type = type; qfp->qf_valid = valid; lastp = &qfl->qf_last; - if (qf_list_empty(qi, qf_idx)) /* first element in the list */ + if (qf_list_empty(qi, qf_idx)) // first element in the list { qfl->qf_start = qfp; qfl->qf_ptr = qfp; @@ -2005,8 +1966,7 @@ qf_add_entry( qfp->qf_cleared = FALSE; *lastp = qfp; ++qfl->qf_count; - if (qfl->qf_index == 0 && qfp->qf_valid) - /* first valid entry */ + if (qfl->qf_index == 0 && qfp->qf_valid) // first valid entry { qfl->qf_index = qfl->qf_count; qfl->qf_ptr = qfp; @@ -2037,17 +1997,15 @@ ll_new_list(void) ll_get_or_alloc_list(win_T *wp) { if (IS_LL_WINDOW(wp)) - /* For a location list window, use the referenced location list */ + // For a location list window, use the referenced location list return wp->w_llist_ref; - /* - * For a non-location list window, w_llist_ref should not point to a - * location list. - */ + // For a non-location list window, w_llist_ref should not point to a + // location list. ll_free_all(&wp->w_llist_ref); if (wp->w_llist == NULL) - wp->w_llist = ll_new_list(); /* new location list */ + wp->w_llist = ll_new_list(); // new location list return wp->w_llist; } @@ -2195,7 +2153,7 @@ qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *directory, char_u *fname) buf_T *buf; char_u *bufname; - if (fname == NULL || *fname == NUL) /* no file name */ + if (fname == NULL || *fname == NUL) // no file name return 0; #ifdef VMS @@ -2209,12 +2167,10 @@ qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *directory, char_u *fname) if (directory != NULL && !vim_isAbsName(fname) && (ptr = concat_fnames(directory, fname, TRUE)) != NULL) { - /* - * Here we check if the file really exists. - * This should normally be true, but if make works without - * "leaving directory"-messages we might have missed a - * directory change. - */ + // Here we check if the file really exists. + // This should normally be true, but if make works without + // "leaving directory"-messages we might have missed a + // directory change. if (mch_getperm(ptr) < 0) { vim_free(ptr); @@ -2224,7 +2180,7 @@ qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *directory, char_u *fname) else ptr = vim_strsave(fname); } - /* Use concatenated directory name and file name */ + // Use concatenated directory name and file name bufname = ptr; } else @@ -2264,7 +2220,7 @@ qf_push_dir(char_u *dirbuf, struct dir_stack_T **stackptr, int is_file_stack) struct dir_stack_T *ds_new; struct dir_stack_T *ds_ptr; - /* allocate new stack element and hook it in */ + // allocate new stack element and hook it in ds_new = (struct dir_stack_T *)alloc((unsigned)sizeof(struct dir_stack_T)); if (ds_new == NULL) return NULL; @@ -2272,17 +2228,16 @@ qf_push_dir(char_u *dirbuf, struct dir_stack_T **stackptr, int is_file_stack) ds_new->next = *stackptr; *stackptr = ds_new; - /* store directory on the stack */ + // store directory on the stack if (vim_isAbsName(dirbuf) || (*stackptr)->next == NULL || (*stackptr && is_file_stack)) (*stackptr)->dirname = vim_strsave(dirbuf); else { - /* Okay we don't have an absolute path. - * dirbuf must be a subdir of one of the directories on the stack. - * Let's search... - */ + // Okay we don't have an absolute path. + // dirbuf must be a subdir of one of the directories on the stack. + // Let's search... ds_new = (*stackptr)->next; (*stackptr)->dirname = NULL; while (ds_new) @@ -2296,7 +2251,7 @@ qf_push_dir(char_u *dirbuf, struct dir_stack_T **stackptr, int is_file_stack) ds_new = ds_new->next; } - /* clean up all dirs we already left */ + // clean up all dirs we already left while ((*stackptr)->next != ds_new) { ds_ptr = (*stackptr)->next; @@ -2305,7 +2260,7 @@ qf_push_dir(char_u *dirbuf, struct dir_stack_T **stackptr, int is_file_stack) vim_free(ds_ptr); } - /* Nothing found -> it must be on top level */ + // Nothing found -> it must be on top level if (ds_new == NULL) { vim_free((*stackptr)->dirname); @@ -2333,10 +2288,10 @@ qf_pop_dir(struct dir_stack_T **stackptr) { struct dir_stack_T *ds_ptr; - /* TODO: Should we check if dirbuf is the directory on top of the stack? - * What to do if it isn't? */ + // TODO: Should we check if dirbuf is the directory on top of the stack? + // What to do if it isn't? - /* pop top element and free it */ + // pop top element and free it if (*stackptr != NULL) { ds_ptr = *stackptr; @@ -2345,7 +2300,7 @@ qf_pop_dir(struct dir_stack_T **stackptr) vim_free(ds_ptr); } - /* return NEW top element as current dir or NULL if stack is empty*/ + // return NEW top element as current dir or NULL if stack is empty return *stackptr ? (*stackptr)->dirname : NULL; } @@ -2392,7 +2347,7 @@ qf_guess_filepath(qf_list_T *qfl, char_u *filename) struct dir_stack_T *ds_tmp; char_u *fullname; - /* no dirs on the stack - there's nothing we can do */ + // no dirs on the stack - there's nothing we can do if (qfl->qf_dir_stack == NULL) return NULL; @@ -2403,9 +2358,8 @@ qf_guess_filepath(qf_list_T *qfl, char_u *filename) vim_free(fullname); fullname = concat_fnames(ds_ptr->dirname, filename, TRUE); - /* If concat_fnames failed, just go on. The worst thing that can happen - * is that we delete the entire stack. - */ + // If concat_fnames failed, just go on. The worst thing that can happen + // is that we delete the entire stack. if ((fullname != NULL) && (mch_getperm(fullname) >= 0)) break; @@ -2414,7 +2368,7 @@ qf_guess_filepath(qf_list_T *qfl, char_u *filename) vim_free(fullname); - /* clean up all dirs we already left */ + // clean up all dirs we already left while (qfl->qf_dir_stack->next != ds_ptr) { ds_tmp = qfl->qf_dir_stack->next; @@ -2437,7 +2391,7 @@ qflist_valid (win_T *wp, int_u qf_id) if (wp != NULL) { - qi = GET_LOC_LIST(wp); /* Location list */ + qi = GET_LOC_LIST(wp); // Location list if (qi == NULL) return FALSE; } @@ -2461,13 +2415,13 @@ is_qf_entry_present(qf_list_T *qfl, qfline_T *qf_ptr) qfline_T *qfp; int i; - /* Search for the entry in the current list */ + // Search for the entry in the current list for (i = 0, qfp = qfl->qf_start; i < qfl->qf_count; ++i, qfp = qfp->qf_next) if (qfp == NULL || qfp == qf_ptr) break; - if (i == qfl->qf_count) /* Entry is not found */ + if (i == qfl->qf_count) // Entry is not found return FALSE; return TRUE; @@ -2667,16 +2621,14 @@ jump_to_help_window(qf_info_T *qi, int *opened_window) win_enter(wp, TRUE); else { - /* - * Split off help window; put it at far top if no position - * specified, the current window is vertically split and narrow. - */ + // Split off help window; put it at far top if no position + // specified, the current window is vertically split and narrow. flags = WSP_HELP; if (cmdmod.split == 0 && curwin->w_width != Columns && curwin->w_width < 80) flags |= WSP_TOP; if (IS_LL_STACK(qi)) - flags |= WSP_NEWLOC; /* don't copy the location list */ + flags |= WSP_NEWLOC; // don't copy the location list if (win_split(0, flags) == FAIL) return FAIL; @@ -2688,14 +2640,14 @@ jump_to_help_window(qf_info_T *qi, int *opened_window) if (IS_LL_STACK(qi)) // not a quickfix list { - /* The new window should use the supplied location list */ + // The new window should use the supplied location list curwin->w_llist = qi; qi->qf_refcount++; } } if (!p_im) - restart_edit = 0; /* don't want insert mode in help file */ + restart_edit = 0; // don't want insert mode in help file return OK; } @@ -2764,14 +2716,14 @@ qf_open_new_file_win(qf_info_T *ll_ref) if (ll_ref != NULL) flags |= WSP_NEWLOC; if (win_split(0, flags) == FAIL) - return FAIL; /* not enough room for window */ - p_swb = empty_option; /* don't split again */ + return FAIL; // not enough room for window + p_swb = empty_option; // don't split again swb_flags = 0; RESET_BINDING(curwin); if (ll_ref != NULL) { - /* The new window should use the location list from the - * location list window */ + // The new window should use the location list from the + // location list window curwin->w_llist = ll_ref; ll_ref->qf_refcount++; } @@ -2791,29 +2743,29 @@ qf_goto_win_with_ll_file(win_T *use_win, int qf_fnum, qf_info_T *ll_ref) if (win == NULL) { - /* Find the window showing the selected file */ + // Find the window showing the selected file FOR_ALL_WINDOWS(win) if (win->w_buffer->b_fnum == qf_fnum) break; if (win == NULL) { - /* Find a previous usable window */ + // Find a previous usable window win = curwin; do { if (bt_normal(win->w_buffer)) break; if (win->w_prev == NULL) - win = lastwin; /* wrap around the top */ + win = lastwin; // wrap around the top else - win = win->w_prev; /* go to previous window */ + win = win->w_prev; // go to previous window } while (win != curwin); } } win_goto(win); - /* If the location list for the window is not set, then set it - * to the location list from the location window */ + // If the location list for the window is not set, then set it + // to the location list from the location window if (win->w_llist == NULL) { win->w_llist = ll_ref; @@ -2841,14 +2793,14 @@ qf_goto_win_with_qfl_file(int qf_fnum) if (win->w_buffer->b_fnum == qf_fnum) break; if (win->w_prev == NULL) - win = lastwin; /* wrap around the top */ + win = lastwin; // wrap around the top else - win = win->w_prev; /* go to previous window */ + win = win->w_prev; // go to previous window if (IS_QF_WINDOW(win)) { - /* Didn't find it, go to the window before the quickfix - * window. */ + // Didn't find it, go to the window before the quickfix + // window. if (altwin != NULL) win = altwin; else if (curwin->w_prev != NULL) @@ -2858,7 +2810,7 @@ qf_goto_win_with_qfl_file(int qf_fnum) break; } - /* Remember a usable window. */ + // Remember a usable window. if (altwin == NULL && !win->w_p_pvw && bt_normal(win->w_buffer)) altwin = win; } @@ -2885,7 +2837,7 @@ qf_jump_to_usable_window(int qf_fnum, int *opened_window) ll_ref = curwin->w_llist_ref; if (ll_ref != NULL) { - /* Find a non-quickfix window with this location list */ + // Find a non-quickfix window with this location list usable_win_ptr = qf_find_win_with_loclist(ll_ref); if (usable_win_ptr != NULL) usable_win = 1; @@ -2893,34 +2845,30 @@ qf_jump_to_usable_window(int qf_fnum, int *opened_window) if (!usable_win) { - /* Locate a window showing a normal buffer */ + // Locate a window showing a normal buffer win = qf_find_win_with_normal_buf(); if (win != NULL) usable_win = 1; } - /* - * If no usable window is found and 'switchbuf' contains "usetab" - * then search in other tabs. - */ + // If no usable window is found and 'switchbuf' contains "usetab" + // then search in other tabs. if (!usable_win && (swb_flags & SWB_USETAB)) usable_win = qf_goto_tabwin_with_file(qf_fnum); - /* - * If there is only one window and it is the quickfix window, create a - * new one above the quickfix window. - */ + // If there is only one window and it is the quickfix window, create a + // new one above the quickfix window. if ((ONE_WINDOW && bt_quickfix(curbuf)) || !usable_win) { if (qf_open_new_file_win(ll_ref) != OK) return FAIL; - *opened_window = TRUE; /* close it when fail */ + *opened_window = TRUE; // close it when fail } else { - if (curwin->w_llist_ref != NULL) /* In a location window */ + if (curwin->w_llist_ref != NULL) // In a location window qf_goto_win_with_ll_file(usable_win_ptr, qf_fnum, ll_ref); - else /* In a quickfix window */ + else // In a quickfix window qf_goto_win_with_qfl_file(qf_fnum); } @@ -2946,8 +2894,8 @@ qf_jump_edit_buffer( if (qf_ptr->qf_type == 1) { - /* Open help file (do_ecmd() will set b_help flag, readfile() will - * set b_p_ro flag). */ + // Open help file (do_ecmd() will set b_help flag, readfile() will + // set b_p_ro flag). if (!can_abandon(curbuf, forceit)) { no_write_message(); @@ -2968,10 +2916,8 @@ qf_jump_edit_buffer( if (IS_LL_STACK(qi)) { - /* - * Location list. Check whether the associated window is still - * present and the list is still valid. - */ + // Location list. Check whether the associated window is still + // present and the list is still valid. if (!win_valid_any_tab(oldwin)) { EMSG(_("E924: Current window was closed")); @@ -3016,9 +2962,7 @@ qf_jump_goto_line( if (qf_pattern == NULL) { - /* - * Go to line with error, unless qf_lnum is 0. - */ + // Go to line with error, unless qf_lnum is 0. i = qf_lnum; if (i > 0) { @@ -3034,12 +2978,10 @@ qf_jump_goto_line( #endif if (qf_viscol == TRUE) { - /* - * Check each character from the beginning of the error - * line up to the error column. For each tab character - * found, reduce the error column value by the length of - * a tab character. - */ + // Check each character from the beginning of the error + // line up to the error column. For each tab character + // found, reduce the error column value by the length of + // a tab character. line = ml_get_curline(); screen_col = 0; for (char_col = 0; char_col < curwin->w_cursor.col; ++char_col) @@ -3065,7 +3007,7 @@ qf_jump_goto_line( { pos_T save_cursor; - /* Move the cursor to the first line in the buffer */ + // Move the cursor to the first line in the buffer save_cursor = curwin->w_cursor; curwin->w_cursor.lnum = 0; if (!do_search(NULL, '/', qf_pattern, (long)1, @@ -3088,21 +3030,21 @@ qf_jump_print_msg( linenr_T i; int len; - /* Update the screen before showing the message, unless the screen - * scrolled up. */ + // Update the screen before showing the message, unless the screen + // scrolled up. if (!msg_scrolled) update_topline_redraw(); sprintf((char *)IObuff, _("(%d of %d)%s%s: "), qf_index, qi->qf_lists[qi->qf_curlist].qf_count, qf_ptr->qf_cleared ? _(" (line deleted)") : "", (char *)qf_types(qf_ptr->qf_type, qf_ptr->qf_nr)); - /* Add the message, skipping leading whitespace and newlines. */ + // Add the message, skipping leading whitespace and newlines. len = (int)STRLEN(IObuff); qf_fmt_text(skipwhite(qf_ptr->qf_text), IObuff + len, IOSIZE - len); - /* Output the message. Overwrite to avoid scrolling when the 'O' - * flag is present in 'shortmess'; But when not jumping, print the - * whole message. */ + // Output the message. Overwrite to avoid scrolling when the 'O' + // flag is present in 'shortmess'; But when not jumping, print the + // whole message. i = msg_scroll; if (curbuf == old_curbuf && curwin->w_cursor.lnum == old_lnum) msg_scroll = TRUE; @@ -3304,9 +3246,7 @@ theend: } } -/* - * Highlight attributes used for displaying entries from the quickfix list. - */ +// Highlight attributes used for displaying entries from the quickfix list. static int qfFileAttr; static int qfSepAttr; static int qfLineAttr; @@ -3333,7 +3273,7 @@ qf_list_entry(qfline_T *qfp, int qf_idx, int cursel) && (buf = buflist_findnr(qfp->qf_fnum)) != NULL) { fname = buf->b_fname; - if (qfp->qf_type == 1) /* :helpgrep */ + if (qfp->qf_type == 1) // :helpgrep fname = gettail(fname); } if (fname == NULL) @@ -3382,14 +3322,14 @@ qf_list_entry(qfline_T *qfp, int qf_idx, int cursel) } msg_puts((char_u *)" "); - /* Remove newlines and leading whitespace from the text. For an - * unrecognized line keep the indent, the compiler may mark a word - * with ^^^^. */ + // Remove newlines and leading whitespace from the text. For an + // unrecognized line keep the indent, the compiler may mark a word + // with ^^^^. qf_fmt_text((fname != NULL || qfp->qf_lnum != 0) ? skipwhite(qfp->qf_text) : qfp->qf_text, IObuff, IOSIZE); msg_prt_line(IObuff, FALSE); - out_flush(); /* show one line at a time */ + out_flush(); // show one line at a time } /* @@ -3406,8 +3346,8 @@ qf_list(exarg_T *eap) int idx2 = -1; char_u *arg = eap->arg; int plus = FALSE; - int all = eap->forceit; /* if not :cl!, only show - recognised errors */ + int all = eap->forceit; // if not :cl!, only show + // recognised errors qf_info_T *qi = &ql_info; if (is_loclist_cmd(eap->cmdidx)) @@ -3451,13 +3391,11 @@ qf_list(exarg_T *eap) idx2 = (-idx2 > i) ? 0 : idx2 + i + 1; } - /* Shorten all the file names, so that it is easy to read */ + // Shorten all the file names, so that it is easy to read shorten_fnames(FALSE); - /* - * Get the attributes for the different quickfix highlight items. Note - * that this depends on syntax items defined in the qf.vim syntax file - */ + // Get the attributes for the different quickfix highlight items. Note + // that this depends on syntax items defined in the qf.vim syntax file qfFileAttr = syn_name2attr((char_u *)"qfFileName"); if (qfFileAttr == 0) qfFileAttr = HL_ATTR(HLF_D); @@ -3638,9 +3576,9 @@ qf_free_items(qf_list_T *qfl) stop = (qfp == qfpnext); vim_free(qfp); if (stop) - /* Somehow qf_count may have an incorrect value, set it to 1 - * to avoid crashing when it's wrong. - * TODO: Avoid qf_count being incorrect. */ + // Somehow qf_count may have an incorrect value, set it to 1 + // to avoid crashing when it's wrong. + // TODO: Avoid qf_count being incorrect. qfl->qf_count = 1; } qfl->qf_start = qfpnext; @@ -3828,14 +3766,12 @@ ex_cwindow(exarg_T *eap) return; } - /* Look for an existing quickfix window. */ + // Look for an existing quickfix window. win = qf_find_win(qi); - /* - * If a quickfix window is open but we have no errors to display, - * close the window. If a quickfix window is not open, then open - * it if we have errors; otherwise, leave it closed. - */ + // If a quickfix window is open but we have no errors to display, + // close the window. If a quickfix window is not open, then open + // it if we have errors; otherwise, leave it closed. if (qf_stack_empty(qi) || qi->qf_lists[qi->qf_curlist].qf_nonevalid || qf_list_empty(qi, qi->qf_curlist)) @@ -3864,7 +3800,7 @@ ex_cclose(exarg_T *eap) return; } - /* Find existing quickfix window and close it. */ + // Find existing quickfix window and close it. win = qf_find_win(qi); if (win != NULL) win_close(win, FALSE); @@ -4052,9 +3988,9 @@ qf_win_goto(win_T *win, linenr_T lnum) curwin->w_cursor.coladd = 0; #endif curwin->w_curswant = 0; - update_topline(); /* scroll to show the line */ + update_topline(); // scroll to show the line redraw_later(VALID); - curwin->w_redr_status = TRUE; /* update ruler */ + curwin->w_redr_status = TRUE; // update ruler curwin = old_curwin; curbuf = curwin->w_buffer; } @@ -4093,7 +4029,7 @@ qf_current_entry(win_T *wp) qf_info_T *qi = &ql_info; if (IS_LL_WINDOW(wp)) - /* In the location list window, use the referenced location list */ + // In the location list window, use the referenced location list qi = wp->w_llist_ref; return qi->qf_lists[qi->qf_curlist].qf_index; @@ -4106,15 +4042,13 @@ qf_current_entry(win_T *wp) static int qf_win_pos_update( qf_info_T *qi, - int old_qf_index) /* previous qf_index or zero */ + int old_qf_index) // previous qf_index or zero { win_T *win; int qf_index = qi->qf_lists[qi->qf_curlist].qf_index; - /* - * Put the cursor on the current error in the quickfix window, so that - * it's viewable. - */ + // Put the cursor on the current error in the quickfix window, so that + // it's viewable. win = qf_find_win(qi); if (win != NULL && qf_index <= win->w_buffer->b_ml.ml_line_count @@ -4142,12 +4076,10 @@ qf_win_pos_update( static int is_qf_win(win_T *win, qf_info_T *qi) { - /* - * A window displaying the quickfix buffer will have the w_llist_ref field - * set to NULL. - * A window displaying a location list buffer will have the w_llist_ref - * pointing to the location list. - */ + // A window displaying the quickfix buffer will have the w_llist_ref field + // set to NULL. + // A window displaying a location list buffer will have the w_llist_ref + // pointing to the location list. if (bt_quickfix(win->w_buffer)) if ((IS_QF_STACK(qi) && win->w_llist_ref == NULL) || (IS_LL_STACK(qi) && win->w_llist_ref == qi)) @@ -4216,14 +4148,14 @@ qf_update_buffer(qf_info_T *qi, qfline_T *old_last) win_T *win; aco_save_T aco; - /* Check if a buffer for the quickfix list exists. Update it. */ + // Check if a buffer for the quickfix list exists. Update it. buf = qf_find_buf(qi); if (buf != NULL) { linenr_T old_line_count = buf->b_ml.ml_line_count; if (old_last == NULL) - /* set curwin/curbuf to buf and save a few things */ + // set curwin/curbuf to buf and save a few things aucmd_prepbuf(&aco, buf); qf_update_win_titlevar(qi); @@ -4235,12 +4167,12 @@ qf_update_buffer(qf_info_T *qi, qfline_T *old_last) { (void)qf_win_pos_update(qi, 0); - /* restore curwin/curbuf and a few other things */ + // restore curwin/curbuf and a few other things aucmd_restbuf(&aco); } - /* Only redraw when added lines are visible. This avoids flickering - * when the added lines are not visible. */ + // Only redraw when added lines are visible. This avoids flickering + // when the added lines are not visible. if ((win = qf_find_win(qi)) != NULL && old_line_count < win->w_botline) redraw_buf_later(buf, NOT_VALID); } @@ -4264,11 +4196,11 @@ qf_buf_add_line(buf_T *buf, linenr_T lnum, qfline_T *qfp, char_u *dirname) && (errbuf = buflist_findnr(qfp->qf_fnum)) != NULL && errbuf->b_fname != NULL) { - if (qfp->qf_type == 1) /* :helpgrep */ + if (qfp->qf_type == 1) // :helpgrep STRCPY(IObuff, gettail(errbuf->b_fname)); else { - /* shorten the file name if not done already */ + // shorten the file name if not done already if (errbuf->b_sfname == NULL || mch_isFullName(errbuf->b_sfname)) { @@ -4307,9 +4239,9 @@ qf_buf_add_line(buf_T *buf, linenr_T lnum, qfline_T *qfp, char_u *dirname) IObuff[len++] = '|'; IObuff[len++] = ' '; - /* Remove newlines and leading whitespace from the text. - * For an unrecognized line keep the indent, the compiler may - * mark a word with ^^^^. */ + // Remove newlines and leading whitespace from the text. + // For an unrecognized line keep the indent, the compiler may + // mark a word with ^^^^. qf_fmt_text(len > 3 ? skipwhite(qfp->qf_text) : qfp->qf_text, IObuff + len, IOSIZE - len); @@ -4342,19 +4274,19 @@ qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last) return; } - /* delete all existing lines */ + // delete all existing lines while ((curbuf->b_ml.ml_flags & ML_EMPTY) == 0) (void)ml_delete((linenr_T)1, FALSE); } - /* Check if there is anything to display */ + // Check if there is anything to display if (!qf_stack_empty(qi)) { char_u dirname[MAXPATHL]; *dirname = NUL; - /* Add one line for each error */ + // Add one line for each error if (old_last == NULL) { qfp = qi->qf_lists[qi->qf_curlist].qf_start; @@ -4377,23 +4309,23 @@ qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last) } if (old_last == NULL) - /* Delete the empty line which is now at the end */ + // Delete the empty line which is now at the end (void)ml_delete(lnum + 1, FALSE); } - /* correct cursor position */ + // correct cursor position check_lnums(TRUE); if (old_last == NULL) { - /* Set the 'filetype' to "qf" each time after filling the buffer. - * This resembles reading a file into a buffer, it's more logical when - * using autocommands. */ + // Set the 'filetype' to "qf" each time after filling the buffer. + // This resembles reading a file into a buffer, it's more logical when + // using autocommands. ++curbuf_lock; set_option_value((char_u *)"ft", 0L, (char_u *)"qf", OPT_LOCAL); curbuf->b_p_ma = FALSE; - keep_filetype = TRUE; /* don't detect 'filetype' */ + keep_filetype = TRUE; // don't detect 'filetype' apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL, FALSE, curbuf); apply_autocmds(EVENT_BUFWINENTER, (char_u *)"quickfix", NULL, @@ -4401,11 +4333,11 @@ qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last) keep_filetype = FALSE; --curbuf_lock; - /* make sure it will be redrawn */ + // make sure it will be redrawn redraw_curbuf_later(NOT_VALID); } - /* Restore KeyTyped, setting 'filetype' may reset it. */ + // Restore KeyTyped, setting 'filetype' may reset it. KeyTyped = old_KeyTyped; } @@ -4694,7 +4626,7 @@ qf_get_size(exarg_T *eap) if (is_loclist_cmd(eap->cmdidx)) { - /* Location list */ + // Location list qi = GET_LOC_LIST(curwin); if (qi == NULL) return 0; @@ -4707,10 +4639,10 @@ qf_get_size(exarg_T *eap) if (qfp->qf_valid) { if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo) - sz++; /* Count all valid entries */ + sz++; // Count all valid entries else if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum) { - /* Count the number of files */ + // Count the number of files sz++; prev_fnum = qfp->qf_fnum; } @@ -4731,7 +4663,7 @@ qf_get_cur_idx(exarg_T *eap) if (is_loclist_cmd(eap->cmdidx)) { - /* Location list */ + // Location list qi = GET_LOC_LIST(curwin); if (qi == NULL) return 0; @@ -4755,7 +4687,7 @@ qf_get_cur_valid_idx(exarg_T *eap) if (is_loclist_cmd(eap->cmdidx)) { - /* Location list */ + // Location list qi = GET_LOC_LIST(curwin); if (qi == NULL) return 1; @@ -4764,7 +4696,7 @@ qf_get_cur_valid_idx(exarg_T *eap) qfl = &qi->qf_lists[qi->qf_curlist]; qfp = qfl->qf_start; - /* check if the list has valid errors */ + // check if the list has valid errors if (qfl->qf_count <= 0 || qfl->qf_nonevalid) return 1; @@ -4776,7 +4708,7 @@ qf_get_cur_valid_idx(exarg_T *eap) { if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum) { - /* Count the number of files */ + // Count the number of files eidx++; prev_fnum = qfp->qf_fnum; } @@ -4802,7 +4734,7 @@ qf_get_nth_valid_entry(qf_list_T *qfl, int n, int fdo) int i, eidx; int prev_fnum = 0; - /* check if the list has valid errors */ + // check if the list has valid errors if (qfl->qf_count <= 0 || qfl->qf_nonevalid) return 1; @@ -4815,7 +4747,7 @@ qf_get_nth_valid_entry(qf_list_T *qfl, int n, int fdo) { if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum) { - /* Count the number of files */ + // Count the number of files eidx++; prev_fnum = qfp->qf_fnum; } @@ -4873,9 +4805,8 @@ ex_cc(exarg_T *eap) } } - /* For cdo and ldo commands, jump to the nth valid error. - * For cfdo and lfdo commands, jump to the nth valid file entry. - */ + // For cdo and ldo commands, jump to the nth valid error. + // For cfdo and lfdo commands, jump to the nth valid file entry. if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo || eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo) errornr = qf_get_nth_valid_entry(&qi->qf_lists[qi->qf_curlist], @@ -4949,7 +4880,7 @@ ex_cfile(exarg_T *eap) win_T *wp = NULL; qf_info_T *qi = &ql_info; char_u *au_name = NULL; - int_u save_qfid = 0; /* init for gcc */ + int_u save_qfid = 0; // init for gcc int res; switch (eap->cmdidx) @@ -4986,16 +4917,14 @@ ex_cfile(exarg_T *eap) if (is_loclist_cmd(eap->cmdidx)) wp = curwin; - /* - * This function is used by the :cfile, :cgetfile and :caddfile - * commands. - * :cfile always creates a new quickfix list and jumps to the - * first error. - * :cgetfile creates a new quickfix list but doesn't jump to the - * first error. - * :caddfile adds to an existing quickfix list. If there is no - * quickfix list then a new list is created. - */ + // This function is used by the :cfile, :cgetfile and :caddfile + // commands. + // :cfile always creates a new quickfix list and jumps to the + // first error. + // :cgetfile creates a new quickfix list but doesn't jump to the + // first error. + // :caddfile adds to an existing quickfix list. If there is no + // quickfix list then a new list is created. res = qf_init(wp, p_ef, p_efm, (eap->cmdidx != CMD_caddfile && eap->cmdidx != CMD_laddfile), qf_cmdtitle(*eap->cmdlinep), enc); @@ -5045,12 +4974,12 @@ vgr_get_auname(cmdidx_T cmdidx) static void vgr_init_regmatch(regmmatch_T *regmatch, char_u *s) { - /* Get the search pattern: either white-separated or enclosed in // */ + // Get the search pattern: either white-separated or enclosed in // regmatch->regprog = NULL; if (s == NULL || *s == NUL) { - /* Pattern is empty, use last search pattern. */ + // Pattern is empty, use last search pattern. if (last_search_pat() == NULL) { EMSG(_(e_noprevre)); @@ -5083,8 +5012,8 @@ vgr_display_fname(char_u *fname) vim_free(p); } msg_clr_eos(); - msg_didout = FALSE; /* overwrite this message */ - msg_nowait = TRUE; /* don't wait for this message */ + msg_didout = FALSE; // overwrite this message + msg_nowait = TRUE; // don't wait for this message msg_col = 0; out_flush(); } @@ -5105,16 +5034,16 @@ vgr_load_dummy_buf( buf_T *buf; #if defined(FEAT_SYN_HL) - /* Don't do Filetype autocommands to avoid loading syntax and - * indent scripts, a great speed improvement. */ + // Don't do Filetype autocommands to avoid loading syntax and + // indent scripts, a great speed improvement. save_ei = au_event_disable(",Filetype"); #endif - /* Don't use modelines here, it's useless. */ + // Don't use modelines here, it's useless. save_mls = p_mls; p_mls = 0; - /* Load file into a buffer, so that 'fileencoding' is detected, - * autocommands applied, etc. */ + // Load file into a buffer, so that 'fileencoding' is detected, + // autocommands applied, etc. buf = load_dummy_buffer(fname, dirname_start, dirname_now); p_mls = save_mls; @@ -5137,18 +5066,18 @@ vgr_qflist_valid( int_u qfid, char_u *title) { - /* Verify that the quickfix/location list was not freed by an autocmd */ + // Verify that the quickfix/location list was not freed by an autocmd if (!qflist_valid(wp, qfid)) { if (wp != NULL) { - /* An autocmd has freed the location list. */ + // An autocmd has freed the location list. EMSG(_(e_loc_list_changed)); return FALSE; } else { - /* Quickfix list is not found, create a new one. */ + // Quickfix list is not found, create a new one. qf_new_list(qi, title); return TRUE; } @@ -5184,12 +5113,12 @@ vgr_match_buflines( while (vim_regexec_multi(regmatch, curwin, buf, lnum, col, NULL, NULL) > 0) { - /* Pass the buffer number so that it gets used even for a - * dummy buffer, unless duplicate_name is set, then the - * buffer will be wiped out below. */ + // Pass the buffer number so that it gets used even for a + // dummy buffer, unless duplicate_name is set, then the + // buffer will be wiped out below. if (qf_add_entry(qi, qi->qf_curlist, - NULL, /* dir */ + NULL, // dir fname, NULL, duplicate_name ? 0 : buf->b_fnum, @@ -5197,11 +5126,11 @@ vgr_match_buflines( regmatch->startpos[0].lnum + lnum, FALSE), regmatch->startpos[0].lnum + lnum, regmatch->startpos[0].col + 1, - FALSE, /* vis_col */ - NULL, /* search pattern */ - 0, /* nr */ - 0, /* type */ - TRUE /* valid */ + FALSE, // vis_col + NULL, // search pattern + 0, // nr + 0, // type + TRUE // valid ) == FAIL) { got_int = TRUE; @@ -5242,11 +5171,11 @@ vgr_jump_to_match( buf = curbuf; qf_jump(qi, 0, 0, forceit); if (buf != curbuf) - /* If we jumped to another buffer redrawing will already be - * taken care of. */ + // If we jumped to another buffer redrawing will already be + // taken care of. *redraw_for_dummy = FALSE; - /* Jump to the directory used after loading the buffer. */ + // Jump to the directory used after loading the buffer. if (curbuf == first_match_buf && target_dir != NULL) { exarg_T ea; @@ -5315,7 +5244,7 @@ ex_vimgrep(exarg_T *eap) else tomatch = MAXLNUM; - /* Get the search pattern: either white-separated or enclosed in // */ + // Get the search pattern: either white-separated or enclosed in // regmatch.regprog = NULL; title = vim_strsave(qf_cmdtitle(*eap->cmdlinep)); p = skip_vimgrep_pat(eap->arg, &s, &flags); @@ -5340,10 +5269,10 @@ ex_vimgrep(exarg_T *eap) && eap->cmdidx != CMD_vimgrepadd && eap->cmdidx != CMD_lvimgrepadd) || qf_stack_empty(qi)) - /* make place for a new list */ + // make place for a new list qf_new_list(qi, title != NULL ? title : qf_cmdtitle(*eap->cmdlinep)); - /* parse the list of arguments */ + // parse the list of arguments if (get_arglist_exp(p, &fcount, &fnames, TRUE) == FAIL) goto theend; if (fcount == 0) @@ -5360,12 +5289,12 @@ ex_vimgrep(exarg_T *eap) goto theend; } - /* Remember the current directory, because a BufRead autocommand that does - * ":lcd %:p:h" changes the meaning of short path names. */ + // Remember the current directory, because a BufRead autocommand that does + // ":lcd %:p:h" changes the meaning of short path names. mch_dirname(dirname_start, MAXPATHL); - /* Remember the current quickfix list identifier, so that we can check for - * autocommands changing the current quickfix list. */ + // Remember the current quickfix list identifier, so that we can check for + // autocommands changing the current quickfix list. save_qfid = qi->qf_lists[qi->qf_curlist].qf_id; seconds = (time_t)0; @@ -5374,8 +5303,8 @@ ex_vimgrep(exarg_T *eap) fname = shorten_fname1(fnames[fi]); if (time(NULL) > seconds) { - /* Display the file name every second or so, show the user we are - * working on it. */ + // Display the file name every second or so, show the user we are + // working on it. seconds = time(NULL); vgr_display_fname(fname); } @@ -5383,7 +5312,7 @@ ex_vimgrep(exarg_T *eap) buf = buflist_findname_exp(fnames[fi]); if (buf == NULL || buf->b_ml.ml_mfp == NULL) { - /* Remember that a buffer with this name already exists. */ + // Remember that a buffer with this name already exists. duplicate_name = (buf != NULL); using_dummy = TRUE; redraw_for_dummy = TRUE; @@ -5391,11 +5320,11 @@ ex_vimgrep(exarg_T *eap) buf = vgr_load_dummy_buf(fname, dirname_start, dirname_now); } else - /* Use existing, loaded buffer. */ + // Use existing, loaded buffer. using_dummy = FALSE; - /* Check whether the quickfix list is still valid. When loading a - * buffer above, autocommands might have changed the quickfix list. */ + // Check whether the quickfix list is still valid. When loading a + // buffer above, autocommands might have changed the quickfix list. if (!vgr_qflist_valid(wp, qi, save_qfid, qf_cmdtitle(*eap->cmdlinep))) { FreeWild(fcount, fnames); @@ -5410,8 +5339,8 @@ ex_vimgrep(exarg_T *eap) } else { - /* Try for a match in all lines of the buffer. - * For ":1vimgrep" look for first match only. */ + // Try for a match in all lines of the buffer. + // For ":1vimgrep" look for first match only. found_match = vgr_match_buflines(qi, fname, buf, ®match, tomatch, duplicate_name, flags); @@ -5421,22 +5350,22 @@ ex_vimgrep(exarg_T *eap) first_match_buf = buf; if (duplicate_name) { - /* Never keep a dummy buffer if there is another buffer - * with the same name. */ + // Never keep a dummy buffer if there is another buffer + // with the same name. wipe_dummy_buffer(buf, dirname_start); buf = NULL; } else if (!cmdmod.hide - || buf->b_p_bh[0] == 'u' /* "unload" */ - || buf->b_p_bh[0] == 'w' /* "wipe" */ - || buf->b_p_bh[0] == 'd') /* "delete" */ + || buf->b_p_bh[0] == 'u' // "unload" + || buf->b_p_bh[0] == 'w' // "wipe" + || buf->b_p_bh[0] == 'd') // "delete" { - /* When no match was found we don't need to remember the - * buffer, wipe it out. If there was a match and it - * wasn't the first one or we won't jump there: only - * unload the buffer. - * Ignore 'hidden' here, because it may lead to having too - * many swap files. */ + // When no match was found we don't need to remember the + // buffer, wipe it out. If there was a match and it + // wasn't the first one or we won't jump there: only + // unload the buffer. + // Ignore 'hidden' here, because it may lead to having too + // many swap files. if (!found_match) { wipe_dummy_buffer(buf, dirname_start); @@ -5445,7 +5374,7 @@ ex_vimgrep(exarg_T *eap) else if (buf != first_match_buf || (flags & VGR_NOJUMP)) { unload_dummy_buffer(buf, dirname_start); - /* Keeping the buffer, remove the dummy flag. */ + // Keeping the buffer, remove the dummy flag. buf->b_flags &= ~BF_DUMMY; buf = NULL; } @@ -5453,20 +5382,20 @@ ex_vimgrep(exarg_T *eap) if (buf != NULL) { - /* Keeping the buffer, remove the dummy flag. */ + // Keeping the buffer, remove the dummy flag. buf->b_flags &= ~BF_DUMMY; - /* If the buffer is still loaded we need to use the - * directory we jumped to below. */ + // If the buffer is still loaded we need to use the + // directory we jumped to below. if (buf == first_match_buf && target_dir == NULL && STRCMP(dirname_start, dirname_now) != 0) target_dir = vim_strsave(dirname_now); - /* The buffer is still loaded, the Filetype autocommands - * need to be done now, in that buffer. And the modelines - * need to be done (again). But not the window-local - * options! */ + // The buffer is still loaded, the Filetype autocommands + // need to be done now, in that buffer. And the modelines + // need to be done (again). But not the window-local + // options! aucmd_prepbuf(&aco, buf); #if defined(FEAT_SYN_HL) apply_autocmds(EVENT_FILETYPE, buf->b_p_ft, @@ -5491,10 +5420,8 @@ ex_vimgrep(exarg_T *eap) if (au_name != NULL) apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, TRUE, curbuf); - /* - * The QuickFixCmdPost autocmd may free the quickfix list. Check the list - * is still valid. - */ + // The QuickFixCmdPost autocmd may free the quickfix list. Check the list + // is still valid. if (!qflist_valid(wp, save_qfid)) goto theend; @@ -5511,8 +5438,8 @@ ex_vimgrep(exarg_T *eap) else EMSG2(_(e_nomatch2), s); - /* If we loaded a dummy buffer into the current window, the autocommands - * may have messed up things, need to redraw and recompute folds. */ + // If we loaded a dummy buffer into the current window, the autocommands + // may have messed up things, need to redraw and recompute folds. if (redraw_for_dummy) { #ifdef FEAT_FOLDING @@ -5544,8 +5471,8 @@ restore_start_dir(char_u *dirname_start) mch_dirname(dirname_now, MAXPATHL); if (STRCMP(dirname_start, dirname_now) != 0) { - /* If the directory has changed, change it back by building up an - * appropriate ex command and executing it. */ + // If the directory has changed, change it back by building up an + // appropriate ex command and executing it. exarg_T ea; ea.arg = dirname_start; @@ -5571,8 +5498,8 @@ restore_start_dir(char_u *dirname_start) static buf_T * load_dummy_buffer( char_u *fname, - char_u *dirname_start, /* in: old directory */ - char_u *resulting_dir) /* out: new directory */ + char_u *dirname_start, // in: old directory + char_u *resulting_dir) // out: new directory { buf_T *newbuf; bufref_T newbufref; @@ -5581,32 +5508,32 @@ load_dummy_buffer( aco_save_T aco; int readfile_result; - /* Allocate a buffer without putting it in the buffer list. */ + // Allocate a buffer without putting it in the buffer list. newbuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY); if (newbuf == NULL) return NULL; set_bufref(&newbufref, newbuf); - /* Init the options. */ + // Init the options. buf_copy_options(newbuf, BCO_ENTER | BCO_NOHELP); - /* need to open the memfile before putting the buffer in a window */ + // need to open the memfile before putting the buffer in a window if (ml_open(newbuf) == OK) { - /* Make sure this buffer isn't wiped out by autocommands. */ + // Make sure this buffer isn't wiped out by autocommands. ++newbuf->b_locked; - /* set curwin/curbuf to buf and save a few things */ + // set curwin/curbuf to buf and save a few things aucmd_prepbuf(&aco, newbuf); - /* Need to set the filename for autocommands. */ + // Need to set the filename for autocommands. (void)setfname(curbuf, fname, NULL, FALSE); - /* Create swap file now to avoid the ATTENTION message. */ + // Create swap file now to avoid the ATTENTION message. check_need_swap(TRUE); - /* Remove the "dummy" flag, otherwise autocommands may not - * work. */ + // Remove the "dummy" flag, otherwise autocommands may not + // work. curbuf->b_flags &= ~BF_DUMMY; newbuf_to_wipe.br_buf = NULL; @@ -5621,30 +5548,28 @@ load_dummy_buffer( failed = FALSE; if (curbuf != newbuf) { - /* Bloody autocommands changed the buffer! Can happen when - * using netrw and editing a remote file. Use the current - * buffer instead, delete the dummy one after restoring the - * window stuff. */ + // Bloody autocommands changed the buffer! Can happen when + // using netrw and editing a remote file. Use the current + // buffer instead, delete the dummy one after restoring the + // window stuff. set_bufref(&newbuf_to_wipe, newbuf); newbuf = curbuf; } } - /* restore curwin/curbuf and a few other things */ + // restore curwin/curbuf and a few other things aucmd_restbuf(&aco); if (newbuf_to_wipe.br_buf != NULL && bufref_valid(&newbuf_to_wipe)) wipe_buffer(newbuf_to_wipe.br_buf, FALSE); - /* Add back the "dummy" flag, otherwise buflist_findname_stat() won't - * skip it. */ + // Add back the "dummy" flag, otherwise buflist_findname_stat() won't + // skip it. newbuf->b_flags |= BF_DUMMY; } - /* - * When autocommands/'autochdir' option changed directory: go back. - * Let the caller know what the resulting dir was first, in case it is - * important. - */ + // When autocommands/'autochdir' option changed directory: go back. + // Let the caller know what the resulting dir was first, in case it is + // important. mch_dirname(resulting_dir, MAXPATHL); restore_start_dir(dirname_start); @@ -5666,25 +5591,25 @@ load_dummy_buffer( static void wipe_dummy_buffer(buf_T *buf, char_u *dirname_start) { - if (curbuf != buf) /* safety check */ + if (curbuf != buf) // safety check { #if defined(FEAT_EVAL) cleanup_T cs; - /* Reset the error/interrupt/exception state here so that aborting() - * returns FALSE when wiping out the buffer. Otherwise it doesn't - * work when got_int is set. */ + // Reset the error/interrupt/exception state here so that aborting() + // returns FALSE when wiping out the buffer. Otherwise it doesn't + // work when got_int is set. enter_cleanup(&cs); #endif wipe_buffer(buf, FALSE); #if defined(FEAT_EVAL) - /* Restore the error/interrupt/exception state if not discarded by a - * new aborting error, interrupt, or uncaught exception. */ + // Restore the error/interrupt/exception state if not discarded by a + // new aborting error, interrupt, or uncaught exception. leave_cleanup(&cs); #endif - /* When autocommands/'autochdir' option changed directory: go back. */ + // When autocommands/'autochdir' option changed directory: go back. restore_start_dir(dirname_start); } } @@ -5697,11 +5622,11 @@ wipe_dummy_buffer(buf_T *buf, char_u *dirname_start) static void unload_dummy_buffer(buf_T *buf, char_u *dirname_start) { - if (curbuf != buf) /* safety check */ + if (curbuf != buf) // safety check { close_buffer(NULL, buf, DOBUF_UNLOAD, FALSE); - /* When autocommands/'autochdir' option changed directory: go back. */ + // When autocommands/'autochdir' option changed directory: go back. restore_start_dir(dirname_start); } } @@ -5741,7 +5666,7 @@ get_errorlist(qf_info_T *qi_arg, win_T *wp, int qf_idx, list_T *list) qfp = qi->qf_lists[qf_idx].qf_start; for (i = 1; !got_int && i <= qi->qf_lists[qf_idx].qf_count; ++i) { - /* Handle entries with a non-existing buffer number. */ + // Handle entries with a non-existing buffer number. bufnum = qfp->qf_fnum; if (bufnum != 0 && (buflist_findnr(bufnum) == NULL)) bufnum = 0; @@ -5772,9 +5697,7 @@ get_errorlist(qf_info_T *qi_arg, win_T *wp, int qf_idx, list_T *list) return OK; } -/* - * Flags used by getqflist()/getloclist() to determine which fields to return. - */ +// Flags used by getqflist()/getloclist() to determine which fields to return. enum { QF_GETLIST_NONE = 0x0, QF_GETLIST_TITLE = 0x1, @@ -5803,12 +5726,11 @@ qf_get_list_from_lines(dict_T *what, dictitem_T *di, dict_T *retdict) dictitem_T *efm_di; list_T *l; - /* Only a List value is supported */ + // Only a List value is supported if (di->di_tv.v_type == VAR_LIST && di->di_tv.vval.v_list != NULL) { - /* If errorformat is supplied then use it, otherwise use the 'efm' - * option setting - */ + // If errorformat is supplied then use it, otherwise use the 'efm' + // option setting if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL) { if (efm_di->di_tv.v_type != VAR_STRING || @@ -5847,8 +5769,8 @@ qf_winid(qf_info_T *qi) { win_T *win; - /* The quickfix window can be opened even if the quickfix list is not set - * using ":copen". This is not true for location lists. */ + // The quickfix window can be opened even if the quickfix list is not set + // using ":copen". This is not true for location lists. if (qi == NULL) return 0; win = qf_find_win(qi); @@ -5922,13 +5844,13 @@ qf_getprop_qfidx(qf_info_T *qi, dict_T *what) int qf_idx; dictitem_T *di; - qf_idx = qi->qf_curlist; /* default is the current list */ + qf_idx = qi->qf_curlist; // default is the current list if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL) { - /* Use the specified quickfix/location list */ + // Use the specified quickfix/location list if (di->di_tv.v_type == VAR_NUMBER) { - /* for zero use the current list */ + // for zero use the current list if (di->di_tv.vval.v_number != 0) { qf_idx = di->di_tv.vval.v_number - 1; @@ -5939,7 +5861,7 @@ qf_getprop_qfidx(qf_info_T *qi, dict_T *what) else if (di->di_tv.v_type == VAR_STRING && di->di_tv.vval.v_string != NULL && STRCMP(di->di_tv.vval.v_string, "$") == 0) - /* Get the last quickfix list number */ + // Get the last quickfix list number qf_idx = qi->qf_listcount - 1; else qf_idx = INVALID_QFIDX; @@ -5947,12 +5869,10 @@ qf_getprop_qfidx(qf_info_T *qi, dict_T *what) if ((di = dict_find(what, (char_u *)"id", -1)) != NULL) { - /* Look for a list with the specified id */ + // Look for a list with the specified id if (di->di_tv.v_type == VAR_NUMBER) { - /* - * For zero, use the current list or the list specified by 'nr' - */ + // For zero, use the current list or the list specified by 'nr' if (di->di_tv.vval.v_number != 0) qf_idx = qf_id2nr(qi, di->di_tv.vval.v_number); } @@ -6085,7 +6005,7 @@ qf_getprop_idx(qf_info_T *qi, int qf_idx, dict_T *retdict) { int idx = qi->qf_lists[qf_idx].qf_index; if (qf_list_empty(qi, qf_idx)) - /* For empty lists, qf_index is set to 1 */ + // For empty lists, qf_index is set to 1 idx = 0; return dict_add_number(retdict, "idx", idx); } @@ -6116,7 +6036,7 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict) if (!qf_stack_empty(qi)) qf_idx = qf_getprop_qfidx(qi, what); - /* List is not present or is empty */ + // List is not present or is empty if (qf_stack_empty(qi) || qf_idx == INVALID_QFIDX) return qf_getprop_defaults(qi, flags, retdict); @@ -6243,13 +6163,13 @@ qf_add_entries( if (action == ' ' || qf_idx == qi->qf_listcount) { - /* make place for a new list */ + // make place for a new list qf_new_list(qi, title); qf_idx = qi->qf_curlist; qfl = &qi->qf_lists[qf_idx]; } else if (action == 'a' && !qf_list_empty(qi, qf_idx)) - /* Adding to existing list, use last entry. */ + // Adding to existing list, use last entry. old_last = qfl->qf_last; else if (action == 'r') { @@ -6260,7 +6180,7 @@ qf_add_entries( for (li = list->lv_first; li != NULL; li = li->li_next) { if (li->li_tv.v_type != VAR_DICT) - continue; /* Skip non-dict items */ + continue; // Skip non-dict items d = li->li_tv.vval.v_dict; if (d == NULL) @@ -6272,7 +6192,7 @@ qf_add_entries( } if (qfl->qf_index == 0) - /* no valid entry */ + // no valid entry qfl->qf_nonevalid = TRUE; else qfl->qf_nonevalid = FALSE; @@ -6283,7 +6203,7 @@ qf_add_entries( qfl->qf_index = 1; } - /* Don't update the cursor in quickfix window when appending entries */ + // Don't update the cursor in quickfix window when appending entries qf_update_buffer(qi, old_last); return retval; @@ -6300,31 +6220,29 @@ qf_setprop_get_qfidx( int *newlist) { dictitem_T *di; - int qf_idx = qi->qf_curlist; /* default is the current list */ + int qf_idx = qi->qf_curlist; // default is the current list if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL) { - /* Use the specified quickfix/location list */ + // Use the specified quickfix/location list if (di->di_tv.v_type == VAR_NUMBER) { - /* for zero use the current list */ + // for zero use the current list if (di->di_tv.vval.v_number != 0) qf_idx = di->di_tv.vval.v_number - 1; if ((action == ' ' || action == 'a') && qf_idx == qi->qf_listcount) { - /* - * When creating a new list, accept qf_idx pointing to the next - * non-available list and add the new list at the end of the - * stack. - */ + // When creating a new list, accept qf_idx pointing to the next + // non-available list and add the new list at the end of the + // stack. *newlist = TRUE; qf_idx = qf_stack_empty(qi) ? 0 : qi->qf_listcount - 1; } else if (qf_idx < 0 || qf_idx >= qi->qf_listcount) return INVALID_QFIDX; else if (action != ' ') - *newlist = FALSE; /* use the specified list */ + *newlist = FALSE; // use the specified list } else if (di->di_tv.v_type == VAR_STRING && di->di_tv.vval.v_string != NULL @@ -6343,7 +6261,7 @@ qf_setprop_get_qfidx( if (!*newlist && (di = dict_find(what, (char_u *)"id", -1)) != NULL) { - /* Use the quickfix/location list with the specified id */ + // Use the quickfix/location list with the specified id if (di->di_tv.v_type != VAR_NUMBER) return INVALID_QFIDX; @@ -6406,7 +6324,7 @@ qf_setprop_items_from_lines( dictitem_T *efm_di; int retval = FAIL; - /* Use the user supplied errorformat settings (if present) */ + // Use the user supplied errorformat settings (if present) if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL) { if (efm_di->di_tv.v_type != VAR_STRING || @@ -6415,7 +6333,7 @@ qf_setprop_items_from_lines( errorformat = efm_di->di_tv.vval.v_string; } - /* Only a List value is supported */ + // Only a List value is supported if (di->di_tv.v_type != VAR_LIST || di->di_tv.vval.v_list == NULL) return FAIL; @@ -6462,7 +6380,7 @@ qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title) newlist = TRUE; qf_idx = qf_setprop_get_qfidx(qi, what, action, &newlist); - if (qf_idx == INVALID_QFIDX) /* List not found */ + if (qf_idx == INVALID_QFIDX) // List not found return FAIL; if (newlist) @@ -6516,7 +6434,7 @@ qf_free_stack(win_T *wp, qf_info_T *qi) if (qfwin != NULL) { - /* If the quickfix/location list window is open, then clear it */ + // If the quickfix/location list window is open, then clear it if (qi->qf_curlist < qi->qf_listcount) qf_free(&qi->qf_lists[qi->qf_curlist]); qf_update_buffer(qi, NULL); @@ -6524,9 +6442,8 @@ qf_free_stack(win_T *wp, qf_info_T *qi) if (wp != NULL && IS_LL_WINDOW(wp)) { - /* If in the location list window, then use the non-location list - * window with this location list (if present) - */ + // If in the location list window, then use the non-location list + // window with this location list (if present) llwin = find_win_with_ll(qi); if (llwin != NULL) wp = llwin; @@ -6535,17 +6452,17 @@ qf_free_stack(win_T *wp, qf_info_T *qi) qf_free_all(wp); if (wp == NULL) { - /* quickfix list */ + // quickfix list qi->qf_curlist = 0; qi->qf_listcount = 0; } else if (IS_LL_WINDOW(orig_wp)) { - /* If the location list window is open, then create a new empty - * location list */ + // If the location list window is open, then create a new empty + // location list qf_info_T *new_ll = ll_new_list(); - /* first free the list reference in the location list window */ + // first free the list reference in the location list window ll_free_all(&orig_wp->w_llist_ref); orig_wp->w_llist_ref = new_ll; @@ -6582,7 +6499,7 @@ set_errorlist( if (action == 'f') { - /* Free the entire quickfix or location list stack */ + // Free the entire quickfix or location list stack qf_free_stack(wp, qi); } else if (what != NULL) @@ -6643,10 +6560,9 @@ set_ref_in_quickfix(int copyID) } if (IS_LL_WINDOW(win) && (win->w_llist_ref->qf_refcount == 1)) { - /* In a location list window and none of the other windows is - * referring to this location list. Mark the location list - * context as still in use. - */ + // In a location list window and none of the other windows is + // referring to this location list. Mark the location list + // context as still in use. abort = mark_quickfix_ctx(win->w_llist_ref, copyID); if (abort) return abort; @@ -6694,7 +6610,7 @@ ex_cbuffer(exarg_T *eap) #endif } - /* Must come after autocommands. */ + // Must come after autocommands. if (is_loclist_cmd(eap->cmdidx)) { qi = ll_get_or_alloc_list(curwin); @@ -6807,8 +6723,8 @@ ex_cexpr(exarg_T *eap) wp = curwin; } - /* Evaluate the expression. When the result is a string or a list we can - * use it to fill the errorlist. */ + // Evaluate the expression. When the result is a string or a list we can + // use it to fill the errorlist. tv = eval_expr(eap->arg, NULL); if (tv != NULL) { @@ -6854,21 +6770,21 @@ hgr_get_ll(int *new_ll) win_T *wp; qf_info_T *qi; - /* If the current window is a help window, then use it */ + // If the current window is a help window, then use it if (bt_help(curwin->w_buffer)) wp = curwin; else - /* Find an existing help window */ + // Find an existing help window wp = qf_find_help_win(); - if (wp == NULL) /* Help window not found */ + if (wp == NULL) // Help window not found qi = NULL; else qi = wp->w_llist; if (qi == NULL) { - /* Allocate a new location list for help text matches */ + // Allocate a new location list for help text matches if ((qi = ll_new_list()) == NULL) return NULL; *new_ll = TRUE; @@ -6901,8 +6817,8 @@ hgr_search_file( { char_u *line = IObuff; #ifdef FEAT_MBYTE - /* Convert a line if 'encoding' is not utf-8 and - * the line contains a non-ASCII character. */ + // Convert a line if 'encoding' is not utf-8 and + // the line contains a non-ASCII character. if (p_vc->vc_type != CONV_NONE && has_non_ascii(IObuff)) { @@ -6916,25 +6832,25 @@ hgr_search_file( { int l = (int)STRLEN(line); - /* remove trailing CR, LF, spaces, etc. */ + // remove trailing CR, LF, spaces, etc. while (l > 0 && line[l - 1] <= ' ') line[--l] = NUL; if (qf_add_entry(qi, qi->qf_curlist, - NULL, /* dir */ + NULL, // dir fname, NULL, 0, line, lnum, (int)(p_regmatch->startp[0] - line) - + 1, /* col */ - FALSE, /* vis_col */ - NULL, /* search pattern */ - 0, /* nr */ - 1, /* type */ - TRUE /* valid */ + + 1, // col + FALSE, // vis_col + NULL, // search pattern + 0, // nr + 1, // type + TRUE // valid ) == FAIL) { got_int = TRUE; @@ -6976,7 +6892,7 @@ hgr_search_files_in_dir( char_u **fnames; int fi; - /* Find all "*.txt" and "*.??x" files in the "doc" directory. */ + // Find all "*.txt" and "*.??x" files in the "doc" directory. add_pathsep(dirname); STRCAT(dirname, "doc/*.\\(txt\\|??x\\)"); if (gen_expand_wildcards(1, &dirname, &fcount, @@ -6986,7 +6902,7 @@ hgr_search_files_in_dir( for (fi = 0; fi < fcount && !got_int; ++fi) { #ifdef FEAT_MULTI_LANG - /* Skip files for a different language. */ + // Skip files for a different language. if (lang != NULL && STRNICMP(lang, fnames[fi] + STRLEN(fnames[fi]) - 3, 2) != 0 @@ -7020,15 +6936,15 @@ hgr_search_in_rtp(qf_info_T *qi, regmatch_T *p_regmatch, char_u *lang) #ifdef FEAT_MBYTE vimconv_T vc; - /* Help files are in utf-8 or latin1, convert lines when 'encoding' - * differs. */ + // Help files are in utf-8 or latin1, convert lines when 'encoding' + // differs. vc.vc_type = CONV_NONE; if (!enc_utf8) convert_setup(&vc, (char_u *)"utf-8", p_enc); #endif - /* Go through all the directories in 'runtimepath' */ + // Go through all the directories in 'runtimepath' p = p_rtp; while (*p != NUL && !got_int) { @@ -7124,11 +7040,11 @@ ex_helpgrep(exarg_T *eap) apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, TRUE, curbuf); if (!new_qi && IS_LL_STACK(qi) && qf_find_buf(qi) == NULL) - /* autocommands made "qi" invalid */ + // autocommands made "qi" invalid return; } - /* Jump to first match. */ + // Jump to first match. if (!qf_list_empty(qi, qi->qf_curlist)) qf_jump(qi, 0, 0, FALSE); else diff --git a/src/version.c b/src/version.c index 7a2e94a112..93cbc30508 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 461, /**/ 460, /**/ From c0543e145fdd29739ac887e71ab96c50282066cd Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 20:35:12 +0200 Subject: [PATCH 11/17] patch 8.1.0462: when using ConPTY Vim can be a child process Problem: When using ConPTY Vim can be a child process. Solution: To find a Vim window use both EnumWindows() and EnumChildWindows(). (Nobuhiro Takasaki, closes #3521) --- src/os_mswin.c | 39 +++++++++++++++++++++++++++++++++++++-- src/version.c | 2 ++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/os_mswin.c b/src/os_mswin.c index 2112b0c2aa..bd38e9d3f1 100644 --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -2324,6 +2324,41 @@ enumWindowsGetNames(HWND hwnd, LPARAM lparam) return TRUE; } +struct enum_windows_s +{ + WNDENUMPROC lpEnumFunc; + LPARAM lParam; +}; + + static BOOL CALLBACK +enum_windows_child(HWND hwnd, LPARAM lParam) +{ + struct enum_windows_s *ew = (struct enum_windows_s *)lParam; + + return (ew->lpEnumFunc)(hwnd, ew->lParam); +} + + static BOOL CALLBACK +enum_windows_toplevel(HWND hwnd, LPARAM lParam) +{ + struct enum_windows_s *ew = (struct enum_windows_s *)lParam; + + if ((ew->lpEnumFunc)(hwnd, ew->lParam) == FALSE) + return FALSE; + return EnumChildWindows(hwnd, enum_windows_child, lParam); +} + +/* Enumerate all windows including children. */ + static BOOL +enum_windows(WNDENUMPROC lpEnumFunc, LPARAM lParam) +{ + struct enum_windows_s ew; + + ew.lpEnumFunc = lpEnumFunc; + ew.lParam = lParam; + return EnumWindows(enum_windows_toplevel, (LPARAM)&ew); +} + static HWND findServer(char_u *name) { @@ -2332,7 +2367,7 @@ findServer(char_u *name) id.name = name; id.hwnd = 0; - EnumWindows(enumWindowsGetServer, (LPARAM)(&id)); + enum_windows(enumWindowsGetServer, (LPARAM)(&id)); return id.hwnd; } @@ -2395,7 +2430,7 @@ serverGetVimNames(void) ga_init2(&ga, 1, 100); - EnumWindows(enumWindowsGetNames, (LPARAM)(&ga)); + enum_windows(enumWindowsGetNames, (LPARAM)(&ga)); ga_append(&ga, NUL); return ga.ga_data; diff --git a/src/version.c b/src/version.c index 93cbc30508..103483a940 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 462, /**/ 461, /**/ From 798184cc67036285a24b38c0bf6668d4d1525548 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 20:48:39 +0200 Subject: [PATCH 12/17] patch 8.1.0463: "simalt ~x" in .vimrc blocks swap file prompt Problem: "simalt ~x" in .vimrc blocks swap file prompt. Solution: Flush buffers before prompting. (Yasuhiro Matsumoto, closes #3518, closes #2192) --- src/memline.c | 18 +++++++++++------- src/version.c | 2 ++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/memline.c b/src/memline.c index c06f9571c0..f7a3d06a71 100644 --- a/src/memline.c +++ b/src/memline.c @@ -4506,19 +4506,23 @@ findswapname( #endif { #ifdef FEAT_GUI - /* If we are supposed to start the GUI but it wasn't - * completely started yet, start it now. This makes - * the messages displayed in the Vim window when - * loading a session from the .gvimrc file. */ + // If we are supposed to start the GUI but it wasn't + // completely started yet, start it now. This makes + // the messages displayed in the Vim window when + // loading a session from the .gvimrc file. if (gui.starting && !gui.in_use) gui_start(); #endif - /* Show info about the existing swap file. */ + // Show info about the existing swap file. attention_message(buf, fname); - /* We don't want a 'q' typed at the more-prompt - * interrupt loading a file. */ + // We don't want a 'q' typed at the more-prompt + // interrupt loading a file. got_int = FALSE; + + // If vimrc has "simalt ~x" we don't want it to + // interfere with the prompt here. + flush_buffers(TRUE); } #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) diff --git a/src/version.c b/src/version.c index 103483a940..90588efd97 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 463, /**/ 462, /**/ From 1df2fa47b49dae568af6048b1dce1edbf4eee7e7 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 21:36:11 +0200 Subject: [PATCH 13/17] patch 8.1.0464: MS-Windows: job_info() has cmd without backslashes Problem: MS-Windows: job_info() has cmd without backslashes. (Daniel Hahler) Solution: Use rem_backslash(). (closes #3517, closes #3404) --- src/misc2.c | 8 ++++---- src/testdir/test_channel.vim | 16 ++++++++++++++++ src/version.c | 2 ++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/misc2.c b/src/misc2.c index 754fcdc5d6..ad96bea0c7 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -6458,14 +6458,14 @@ mch_parse_cmd(char_u *cmd, int use_shcf, char ***argv, int *argc) while (*p != NUL && (inquote || (*p != ' ' && *p != TAB))) { if (p[0] == '"') - /* quotes surrounding an argument and are dropped */ + // quotes surrounding an argument and are dropped inquote = !inquote; else { - if (p[0] == '\\' && p[1] != NUL) + if (rem_backslash(p)) { - /* First pass: skip over "\ " and "\"". - * Second pass: Remove the backslash. */ + // First pass: skip over "\ " and "\"". + // Second pass: Remove the backslash. ++p; } if (i == 1) diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim index 5d071473a5..832f54e7c8 100644 --- a/src/testdir/test_channel.vim +++ b/src/testdir/test_channel.vim @@ -1721,6 +1721,22 @@ func Test_read_from_terminated_job() call WaitForAssert({-> assert_equal(1, g:linecount)}) endfunc +func Test_job_start_windows() + if !has('job') || !has('win32') + return + endif + + " Check that backslash in $COMSPEC is handled properly. + let g:echostr = '' + let cmd = $COMSPEC . ' /c echo 123' + let job = job_start(cmd, {'callback': {ch,msg -> execute(":let g:echostr .= msg")}}) + let info = job_info(job) + call assert_equal([$COMSPEC, '/c', 'echo', '123'], info.cmd) + + call WaitForAssert({-> assert_equal("123", g:echostr)}) + unlet g:echostr +endfunc + func Test_env() if !has('job') return diff --git a/src/version.c b/src/version.c index 90588efd97..8da8e7132c 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 464, /**/ 463, /**/ From 95ba5c364f097121b95879896b05ec737ecafd1c Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 22:47:07 +0200 Subject: [PATCH 14/17] patch 8.1.0465: client-server test fails Problem: Client-server test fails. Solution: Change logic in EnumWindows(). --- src/os_mswin.c | 4 ++-- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/os_mswin.c b/src/os_mswin.c index bd38e9d3f1..9767a5b077 100644 --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -2343,8 +2343,8 @@ enum_windows_toplevel(HWND hwnd, LPARAM lParam) { struct enum_windows_s *ew = (struct enum_windows_s *)lParam; - if ((ew->lpEnumFunc)(hwnd, ew->lParam) == FALSE) - return FALSE; + if ((ew->lpEnumFunc)(hwnd, ew->lParam)) + return TRUE; return EnumChildWindows(hwnd, enum_windows_child, lParam); } diff --git a/src/version.c b/src/version.c index 8da8e7132c..9f4991aa66 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 465, /**/ 464, /**/ From 6a2633b00bb00bcf0d994f08d1c54ace2c221b58 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 7 Oct 2018 23:16:36 +0200 Subject: [PATCH 15/17] patch 8.1.0466: autocmd test fails Problem: Autocmd test fails. Solution: Do call inchar() when flushing typeahead. --- src/getchar.c | 37 ++++++++++++++++++++----------------- src/memline.c | 2 +- src/message.c | 4 ++-- src/misc1.c | 2 +- src/proto/getchar.pro | 2 +- src/version.c | 2 ++ src/vim.h | 7 +++++++ 7 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/getchar.c b/src/getchar.c index 679eae1603..53c0ef35bf 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -438,7 +438,7 @@ typeahead_noflush(int c) * flush all typeahead characters (used when interrupted by a CTRL-C). */ void -flush_buffers(int flush_typeahead) +flush_buffers(flush_buffers_T flush_typeahead) { init_typebuf(); @@ -446,15 +446,21 @@ flush_buffers(int flush_typeahead) while (read_readbuffers(TRUE) != NUL) ; - if (flush_typeahead) /* remove all typeahead */ + if (flush_typeahead == FLUSH_MINIMAL) { - /* - * We have to get all characters, because we may delete the first part - * of an escape sequence. - * In an xterm we get one char at a time and we have to get them all. - */ - while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L) != 0) - ; + // remove mapped characters at the start only + typebuf.tb_off += typebuf.tb_maplen; + typebuf.tb_len -= typebuf.tb_maplen; + } + else + { + // remove typeahead + if (flush_typeahead == FLUSH_INPUT) + // We have to get all characters, because we may delete the first + // part of an escape sequence. In an xterm we get one char at a + // time and we have to get them all. + while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L) != 0) + ; typebuf.tb_off = MAXMAPLEN; typebuf.tb_len = 0; #if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL) @@ -463,11 +469,6 @@ flush_buffers(int flush_typeahead) typebuf_was_filled = FALSE; #endif } - else /* remove mapped characters at the start only */ - { - typebuf.tb_off += typebuf.tb_maplen; - typebuf.tb_len -= typebuf.tb_maplen; - } typebuf.tb_maplen = 0; typebuf.tb_silent = 0; cmd_silent = FALSE; @@ -1858,6 +1859,7 @@ plain_vgetc(void) * Check if a character is available, such that vgetc() will not block. * If the next character is a special character or multi-byte, the returned * character is not valid!. + * Returns NUL if no character is available. */ int vpeekc(void) @@ -1956,7 +1958,8 @@ vungetc(int c) * KeyTyped is set to TRUE in the case the user typed the key. * KeyStuffed is TRUE if the character comes from the stuff buffer. * if "advance" is FALSE (vpeekc()): - * just look whether there is a character available. + * Just look whether there is a character available. + * Return NUL if not. * * When "no_mapping" is zero, checks for mappings in the current mode. * Only returns one byte (of a multi-byte character). @@ -2084,7 +2087,7 @@ vgetorpeek(int advance) c = ESC; else c = Ctrl_C; - flush_buffers(TRUE); /* flush all typeahead */ + flush_buffers(FLUSH_INPUT); // flush all typeahead if (advance) { @@ -2510,7 +2513,7 @@ vgetorpeek(int advance) redrawcmdline(); else setcursor(); - flush_buffers(FALSE); + flush_buffers(FLUSH_MINIMAL); mapdepth = 0; /* for next one */ c = -1; break; diff --git a/src/memline.c b/src/memline.c index f7a3d06a71..0881e6c7ad 100644 --- a/src/memline.c +++ b/src/memline.c @@ -4522,7 +4522,7 @@ findswapname( // If vimrc has "simalt ~x" we don't want it to // interfere with the prompt here. - flush_buffers(TRUE); + flush_buffers(FLUSH_TYPEAHEAD); } #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) diff --git a/src/message.c b/src/message.c index c7ecb61963..c2318bd8af 100644 --- a/src/message.c +++ b/src/message.c @@ -688,8 +688,8 @@ emsg(char_u *s) if (p_eb) beep_flush(); /* also includes flush_buffers() */ else - flush_buffers(FALSE); /* flush internal buffers */ - did_emsg = TRUE; /* flag for DoOneCmd() */ + flush_buffers(FLUSH_MINIMAL); // flush internal buffers + did_emsg = TRUE; // flag for DoOneCmd() #ifdef FEAT_EVAL did_uncaught_emsg = TRUE; #endif diff --git a/src/misc1.c b/src/misc1.c index 34b4134a04..820f8f994f 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -3825,7 +3825,7 @@ beep_flush(void) { if (emsg_silent == 0) { - flush_buffers(FALSE); + flush_buffers(FLUSH_MINIMAL); vim_beep(BO_ERROR); } } diff --git a/src/proto/getchar.pro b/src/proto/getchar.pro index aac522f152..07336627fc 100644 --- a/src/proto/getchar.pro +++ b/src/proto/getchar.pro @@ -5,7 +5,7 @@ char_u *get_inserted(void); int stuff_empty(void); int readbuf1_empty(void); void typeahead_noflush(int c); -void flush_buffers(int flush_typeahead); +void flush_buffers(flush_buffers_T flush_typeahead); void ResetRedobuff(void); void CancelRedo(void); void saveRedobuff(save_redo_T *save_redo); diff --git a/src/version.c b/src/version.c index 9f4991aa66..c416032f56 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 466, /**/ 465, /**/ diff --git a/src/vim.h b/src/vim.h index cb72711cc2..7a66ab0e29 100644 --- a/src/vim.h +++ b/src/vim.h @@ -2108,6 +2108,13 @@ typedef enum { PASTE_ONE_CHAR /* return first character */ } paste_mode_T; +// Argument for flush_buffers(). +typedef enum { + FLUSH_MINIMAL, + FLUSH_TYPEAHEAD, // flush current typebuf contents + FLUSH_INPUT // flush typebuf and inchar() input +} flush_buffers_T; + #include "ex_cmds.h" /* Ex command defines */ #include "spell.h" /* spell checking stuff */ From 1d3dbcf743be9c72a0df5fc0711553fce287d3f8 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 8 Oct 2018 20:07:39 +0200 Subject: [PATCH 16/17] patch 8.1.0467: cannot build with Mac OS X 10.5 Problem: Cannot build with Mac OS X 10.5. Solution: Change #ifdef into #if. (Akshay Hegde, closes #3022) --- src/os_macosx.m | 8 ++++---- src/version.c | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/os_macosx.m b/src/os_macosx.m index 752bdae116..50ca361fbb 100644 --- a/src/os_macosx.m +++ b/src/os_macosx.m @@ -63,7 +63,7 @@ clip_mch_request_selection(VimClipboard *cbd) NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSPasteboard *pb = [NSPasteboard generalPasteboard]; -#ifdef AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 NSArray *supportedTypes = [NSArray arrayWithObjects:VimPboardType, NSPasteboardTypeString, nil]; #else @@ -99,7 +99,7 @@ clip_mch_request_selection(VimClipboard *cbd) { /* Use NSPasteboardTypeString. The motion type is detected automatically. */ -#ifdef AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 NSMutableString *mstring = [[pb stringForType:NSPasteboardTypeString] mutableCopy]; #else @@ -188,7 +188,7 @@ clip_mch_set_selection(VimClipboard *cbd) /* See clip_mch_request_selection() for info on pasteboard types. */ NSPasteboard *pb = [NSPasteboard generalPasteboard]; -#ifdef AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 NSArray *supportedTypes = [NSArray arrayWithObjects:VimPboardType, NSPasteboardTypeString, nil]; #else @@ -201,7 +201,7 @@ clip_mch_set_selection(VimClipboard *cbd) NSArray *plist = [NSArray arrayWithObjects:motion, string, nil]; [pb setPropertyList:plist forType:VimPboardType]; -#ifdef AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 [pb setString:string forType:NSPasteboardTypeString]; #else [pb setString:string forType:NSStringPboardType]; diff --git a/src/version.c b/src/version.c index c416032f56..def449a576 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 467, /**/ 466, /**/ From 0664089eccec1083dd04ef2255856fb34ce62f15 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 9 Oct 2018 21:49:33 +0200 Subject: [PATCH 17/17] patch 8.1.0468: MS-Windows: filter command with pipe character fails Problem: MS-Windows: Filter command with pipe character fails. (Johannes Riecken) Solution: Find the pipe character outside of quotes. (Yasuhiro Matsumoto, closes #1743, closes #3523) --- src/ex_cmds.c | 24 ++++++++++++++++++++++-- src/testdir/test_filter_cmd.vim | 13 +++++++++++++ src/version.c | 2 ++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 99c19f9136..0a5387c52b 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -1676,6 +1676,26 @@ do_shell( apply_autocmds(EVENT_SHELLCMDPOST, NULL, NULL, FALSE, curbuf); } +#if !defined(UNIX) + static char_u * +find_pipe(char_u *cmd) +{ + char_u *p; + int inquote = FALSE; + + for (p = cmd; *p != NUL; ++p) + { + if (!inquote && *p == '|') + return p; + if (*p == '"') + inquote = !inquote; + else if (rem_backslash(p)) + ++p; + } + return NULL; +} +#endif + /* * Create a shell command from a command string, input redirection file and * output redirection file. @@ -1746,7 +1766,7 @@ make_filter_cmd( */ if (*p_shq == NUL) { - p = vim_strchr(buf, '|'); + p = find_pipe(buf); if (p != NULL) *p = NUL; } @@ -1754,7 +1774,7 @@ make_filter_cmd( STRCAT(buf, itmp); if (*p_shq == NUL) { - p = vim_strchr(cmd, '|'); + p = find_pipe(cmd); if (p != NULL) { STRCAT(buf, " "); /* insert a space before the '|' for DOS */ diff --git a/src/testdir/test_filter_cmd.vim b/src/testdir/test_filter_cmd.vim index 5aa5fa64df..86347ab77f 100644 --- a/src/testdir/test_filter_cmd.vim +++ b/src/testdir/test_filter_cmd.vim @@ -74,3 +74,16 @@ func Test_filter_cmd_completion() call assert_equal('filter /pat/ print', s:complete_filter_cmd('filter /pat/ pri')) call assert_equal('filter #pat# print', s:complete_filter_cmd('filter #pat# pri')) endfunc + +func Test_filter_cmd_with_filter() + new + set shelltemp + %!echo "a|b" + let out = getline(1) + bw! + if has('win32') + let out = trim(out, '" ') + endif + call assert_equal('a|b', out) + set shelltemp& +endfunction diff --git a/src/version.c b/src/version.c index def449a576..d4cccb941a 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 468, /**/ 467, /**/