diff options
-rw-r--r-- | runtime/doc/options.txt | 10 | ||||
-rw-r--r-- | runtime/doc/various.txt | 19 | ||||
-rw-r--r-- | runtime/ftplugin/man.vim | 2 | ||||
-rw-r--r-- | src/nvim/normal.c | 46 | ||||
-rw-r--r-- | src/nvim/options.lua | 2 |
5 files changed, 39 insertions, 40 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 410e116064..fc4d685cb2 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -3877,18 +3877,20 @@ A jump table for the options with a short description can be found at |Q_op|. The 'keymodel' option is set by the |:behave| command. *'keywordprg'* *'kp'* -'keywordprg' 'kp' string (default "man" or "man -s", DOS: ":help") +'keywordprg' 'kp' string (default ":Man", Windows: ":help") global or local to buffer |global-local| Program to use for the |K| command. Environment variables are expanded |:set_env|. ":help" may be used to access the Vim internal help. (Note that previously setting the global option to the empty value did this, which is now deprecated.) - When "man" is used, Vim will automatically translate a count for the - "K" command to a section number. Also for "man -s", in which case the - "-s" is removed when there is no count. + When the first character is ":", the command is invoked as a Vim + command prefixed with [count]. {Nvim} + When "man" or "man -s" is used, Vim will automatically translate + a [count] for the "K" command to a section number. See |option-backslash| about including spaces and backslashes. Example: > :set keywordprg=man\ -s + :set keywordprg=:Man < This option cannot be set from a |modeline| or in the |sandbox|, for security reasons. diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt index 6b53b8e24f..3cc0e7c8ab 100644 --- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -542,7 +542,7 @@ which it was defined is reported. {not available when compiled without the |+eval| feature} *K* -K Run a program to lookup the keyword under the +[count]K Run a program to lookup the keyword under the cursor. The name of the program is given with the 'keywordprg' (kp) option (default is "man"). The keyword is formed of letters, numbers and the @@ -550,19 +550,18 @@ K Run a program to lookup the keyword under the right of the cursor is used. The same can be done with the command > :!{program} {keyword} -< There is an example of a program to use in the tools - directory of Vim. It is called 'ref' and does a - simple spelling check. - Special cases: +< Special cases: + - If 'keywordprg' begins with ":" it is invoked as + a Vim command with [count]. - If 'keywordprg' is empty, the ":help" command is used. It's a good idea to include more characters in 'iskeyword' then, to be able to find more help. - - When 'keywordprg' is equal to "man", a count before - "K" is inserted after the "man" command and before - the keyword. For example, using "2K" while the - cursor is on "mkdir", results in: > + - When 'keywordprg' is equal to "man", a [count] + before "K" is inserted after the "man" command and + before the keyword. For example, using "2K" while + the cursor is on "mkdir", results in: > !man 2 mkdir -< - When 'keywordprg' is equal to "man -s", a count +< - When 'keywordprg' is equal to "man -s", a [count] before "K" is inserted after the "-s". If there is no count, the "-s" is removed. diff --git a/runtime/ftplugin/man.vim b/runtime/ftplugin/man.vim index 11b2b0a665..e907220d0a 100644 --- a/runtime/ftplugin/man.vim +++ b/runtime/ftplugin/man.vim @@ -120,7 +120,7 @@ func <SID>GetPage(...) let sect = "" endif if s:FindPage(sect, page) == 0 - echo "\nCannot find a '".page."'." + echo "\nNo manual entry for '".page."'." return endif exec "let s:man_tag_buf_".s:man_tag_depth." = ".bufnr("%") diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 5b35af9209..8ce2065336 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -4213,18 +4213,12 @@ void do_nv_ident(int c1, int c2) static void nv_ident(cmdarg_T *cap) { char_u *ptr = NULL; - char_u *buf; - char_u *newbuf; char_u *p; - char_u *kp; /* value of 'keywordprg' */ - bool kp_help; /* 'keywordprg' is ":help" */ size_t n = 0; /* init for GCC */ int cmdchar; bool g_cmd; /* "g" command */ bool tag_cmd = false; char_u *aux_ptr; - bool isman; - bool isman_s; if (cap->cmdchar == 'g') { /* "g*", "g#", "g]" and "gCTRL-]" */ cmdchar = cap->nchar; @@ -4259,10 +4253,10 @@ static void nv_ident(cmdarg_T *cap) /* Allocate buffer to put the command in. Inserting backslashes can * double the length of the word. p_kp / curbuf->b_p_kp could be added * and some numbers. */ - kp = (*curbuf->b_p_kp == NUL ? p_kp : curbuf->b_p_kp); - kp_help = (*kp == NUL || STRCMP(kp, ":he") == 0 - || STRCMP(kp, ":help") == 0); - buf = xmalloc(n * 2 + 30 + STRLEN(kp)); + char_u *kp = (*curbuf->b_p_kp == NUL ? p_kp : curbuf->b_p_kp); //'keywordprg' + assert(*kp != NUL); //option.c::do_set() should default to ":help" if empty. + bool kp_ex = (*kp == ':'); //'keywordprg' is an ex command + char *buf = xmalloc(n * 2 + 30 + STRLEN(kp)); buf[0] = NUL; switch (cmdchar) { @@ -4283,9 +4277,13 @@ static void nv_ident(cmdarg_T *cap) break; case 'K': - if (kp_help) - STRCPY(buf, "he! "); - else { + if (kp_ex) { + if (cap->count0 != 0) { // Send the count to the ex command. + sprintf(buf, "%" PRId64, (int64_t)(cap->count0)); + } + STRCAT(buf, kp); + STRCAT(buf, " "); + } else { /* An external command will probably use an argument starting * with "-" as an option. To avoid trouble we skip the "-". */ while (*ptr == '-' && n > 0) { @@ -4300,10 +4298,10 @@ static void nv_ident(cmdarg_T *cap) /* When a count is given, turn it into a range. Is this * really what we want? */ - isman = (STRCMP(kp, "man") == 0); - isman_s = (STRCMP(kp, "man -s") == 0); + bool isman = (STRCMP(kp, "man") == 0); + bool isman_s = (STRCMP(kp, "man -s") == 0); if (cap->count0 != 0 && !(isman || isman_s)) - sprintf((char *)buf, ".,.+%" PRId64, (int64_t)(cap->count0 - 1)); + sprintf(buf, ".,.+%" PRId64, (int64_t)(cap->count0 - 1)); STRCAT(buf, "! "); if (cap->count0 == 0 && isman_s) @@ -4312,7 +4310,7 @@ static void nv_ident(cmdarg_T *cap) STRCAT(buf, kp); STRCAT(buf, " "); if (cap->count0 != 0 && (isman || isman_s)) { - sprintf((char *)buf + STRLEN(buf), "%" PRId64, (int64_t)cap->count0); + sprintf(buf + STRLEN(buf), "%" PRId64, (int64_t)cap->count0); STRCAT(buf, " "); } } @@ -4334,19 +4332,19 @@ static void nv_ident(cmdarg_T *cap) if (g_cmd) STRCPY(buf, "tj "); else - sprintf((char *)buf, "%" PRId64 "ta ", (int64_t)cap->count0); + sprintf(buf, "%" PRId64 "ta ", (int64_t)cap->count0); } } /* * Now grab the chars in the identifier */ - if (cmdchar == 'K' && !kp_help) { + if (cmdchar == 'K' && !kp_ex) { /* Escape the argument properly for a shell command */ ptr = vim_strnsave(ptr, n); p = vim_strsave_shellescape(ptr, true, true); xfree(ptr); - newbuf = (char_u *)xrealloc(buf, STRLEN(buf) + STRLEN(p) + 1); + char *newbuf = xrealloc(buf, STRLEN(buf) + STRLEN(p) + 1); buf = newbuf; STRCAT(buf, p); xfree(p); @@ -4364,7 +4362,7 @@ static void nv_ident(cmdarg_T *cap) } else aux_ptr = (char_u *)"\\|\"\n*?["; - p = buf + STRLEN(buf); + p = (char_u *)buf + STRLEN(buf); while (n-- > 0) { /* put a backslash before \ and some others */ if (vim_strchr(aux_ptr, *ptr) != NULL) @@ -4391,10 +4389,10 @@ static void nv_ident(cmdarg_T *cap) STRCAT(buf, "\\>"); /* put pattern in search history */ init_history(); - add_to_history(HIST_SEARCH, buf, true, NUL); - (void)normal_search(cap, cmdchar == '*' ? '/' : '?', buf, 0); + add_to_history(HIST_SEARCH, (char_u *)buf, true, NUL); + (void)normal_search(cap, cmdchar == '*' ? '/' : '?', (char_u *)buf, 0); } else - do_cmdline_cmd((char *)buf); + do_cmdline_cmd(buf); xfree(buf); } diff --git a/src/nvim/options.lua b/src/nvim/options.lua index 723736d376..e02326be78 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -1329,7 +1329,7 @@ return { expand=true, varname='p_kp', defaults={ - if_true={vi="man -s"}, + if_true={vi=":Man"}, } }, { |