2017-10-13 19:31 GMT+09:00 LCD 47 <[email protected]>:

> On 12 October 2017, Bram Moolenaar <[email protected]> wrote:
> >
> > Lcd wrote:
> >
> > > On 10 October 2017, LCD 47 <[email protected]> wrote:
> > > > On 10 October 2017, Bram Moolenaar <[email protected]> wrote:
> > > > >
> > > > > lcd wrote:
> > > > >
> > > > > >     Per title: if MANPAGER is set to "env MAN_PN=1 vim -M
> +MANPAGER -",
> > > > > > running "man Xorg" results in a message "Cannot find a 'xorg'.".
> > > > > >
> > > > > >     The culprit is a "tolower()" in plugin/manpager.vim.  Man
> page names
> > > > > > are case-sensitive on most UNIX systems.  The patch below seems
> to fix
> > > > > > the problem.
> > > > > >
> > > > > >     /lcd
> > > > > >
> > > > > >
> > > > > > diff --git a/runtime/plugin/manpager.vim
> b/runtime/plugin/manpager.vim
> > > > > > index be6e30b70..9d30fab2f 100644
> > > > > > --- a/runtime/plugin/manpager.vim
> > > > > > +++ b/runtime/plugin/manpager.vim
> > > > > > @@ -20,7 +20,7 @@ function! s:MANPAGER()
> > > > > >      let manpage = expand('$MAN_PN')
> > > > > >    endif
> > > > > >
> > > > > > -  let page_sec = matchlist(tolower(manpage), '^' .
> pagesec_pattern  . '$')
> > > > > > +  let page_sec = matchlist(manpage, '^' . pagesec_pattern  .
> '$')
> > > > > >
> > > > > >    bwipe!
> > > > >
> > > > > Can you try this instead:
> > > > >   let page_sec = matchlist(tolower(manpage), '^' .
> tolower(pagesec_pattern)  . '$')
> > > >
> > > >     It doesn't help, "Xorg" still gets converted to "xorg".
> > > >
> > > >     As I understand it, what's going on is something like this: Vim
> > > > receives the formatted man page via MANPAGER, but this is not
> directly
> > > > usable, so Vim needs to run "man" again.  However at that point the
> > > > original "man" options are not available, so Vim tries to infer them
> > > > from the first line in the formatted man page.
> > > >
> > > >     Now, some man pages preserve the case of the name of the utility
> > > > they document (such as "Xorg(1)"), others uppercase it (f.i.
> "LS(1)").
> > > > That's why Vim calls tolower().  This works for most man pages,
> > > > because the names are all lower-case, but fails for things like
> "Xorg"
> > > > and "Net::DNS".  Please note that the ":Man" command is not affected,
> > > > it's only the MANPAGER mechanism that has this problem.
> > > [...]
> > >
> > >     I'm attaching a better partial fix.
> > >
> > >     The patch to plugin/manpager.vim fixes two issues:
> > >
> > > (1) man pages with ":" in names (such as Net::DNS) are not recognized;
> > > (2) man pages with upper case letters in names (f.i. "Xorg") are not
> > >     recognized.
> > >
> > >     The fix is partial because it only addresses (2) when MAN_PN is
> > > set.  Sadly BSD "man" and "man" on most commercial UNIX systems don't
> do
> > > that, only "man-db" on Linux does.  On systems where "man" doesn't set
> > > MAN_PN the patch falls back to reading the first line in the formatted
> > > man page.  On these systems it's possible to write a wrapper script for
> > > "man" that sets MAN_PN before actually running "man", but the details
> > > are necessarily OS-dependent.
> > >
> > >     The other patch, to ftplugin/man.vim, is unrelated, and is a minor
> > > optimisation.  There is no need for "col -b", a simple %s/.\b//g does
> > > the exact same thing inside Vim.
> >
> > I would appreciate a few people trying this out on various systems.
>
>     A slightly more polished version attached below.
>
>     /lcd
>
>
> diff --git a/runtime/ftplugin/man.vim b/runtime/ftplugin/man.vim
> index c7fc3bbdf..83f8a893b 100644
> --- a/runtime/ftplugin/man.vim
> +++ b/runtime/ftplugin/man.vim
> @@ -22,7 +22,8 @@ if &filetype == "man"
>    endif
>
>    " allow dot and dash in manual page name.
> -  setlocal iskeyword+=\.,-
> +  setlocal iskeyword+=\.,-,:
> +  setlocal isfname+=:
>
>    " Add mappings, unless the user didn't want this.
>    if !exists("no_plugin_maps") && !exists("no_man_maps")
> @@ -40,7 +41,7 @@ if &filetype == "man"
>      setlocal foldmethod=indent foldnestmax=1 foldenable
>    endif
>
> -  let b:undo_ftplugin = "setlocal iskeyword<"
> +  let b:undo_ftplugin = "setlocal iskeyword< isfname<"
>
>  endif
>
> @@ -176,7 +177,9 @@ func <SID>GetPage(...)
>      let $MANWIDTH = winwidth(0)
>      let unsetwidth = 1
>    endif
> -  silent exec "r !man ".s:GetCmdArg(sect, page)." | col -b"
> +  silent exec "r !man ".s:GetCmdArg(sect, page)
> +  silent keepj %s/\m_\b\ze.//ge
> +  silent keepj %s/\v(.)\b\ze\1//ge
>    if unsetwidth
>      let $MANWIDTH = ''
>    endif
> diff --git a/runtime/plugin/manpager.vim b/runtime/plugin/manpager.vim
> index be6e30b70..a7efdb1c2 100644
> --- a/runtime/plugin/manpager.vim
> +++ b/runtime/plugin/manpager.vim
> @@ -10,20 +10,21 @@ endif
>  command! -nargs=0 MANPAGER call s:MANPAGER() | delcommand MANPAGER
>
>  function! s:MANPAGER()
> -  let page_pattern = '\v\w+%([-_.]\w+)*'
> +  setlocal filetype=man
> +
> +  let page_pattern = '\v\w%(\k*\w)?'
>    let sec_pattern = '\v\w+%(\+\w+)*'
>    let pagesec_pattern = '\v(' . page_pattern . ')\((' . sec_pattern .
> ')\)'
>
>    if $MAN_PN is '1'
> -    let manpage = matchstr( getline(1), '^' . pagesec_pattern )
> +    let manpage = tolower(matchstr( getline(1), '^' . pagesec_pattern ))
>    else
> -    let manpage = expand('$MAN_PN')
> +    let manpage = $MAN_PN
>    endif
>
> -  let page_sec = matchlist(tolower(manpage), '^' . pagesec_pattern  . '$')
> +  let page_sec = matchlist(manpage, '^' . pagesec_pattern  . '$')
>
>    bwipe!
>
> -  setlocal filetype=man
>    exe 'Man' page_sec[2] page_sec[1]
>  endfunction
>
> --
> --
>

HI,

To get your patch to work for macOS, I needed to add some tweaks to that.
Please find the attached patch and consider merging it into yours.   Of
course, it's fine to me that you reject or modify it freely; I leave that
to you.

More precisely, contrary to the description it claims (:h manpager), I
haven't been able to get manpager.vim to work for macOS since it was
introduced.  As Bram asked for confirmation if your patch worked for other
platforms, I looked into the issue and found a way to have it work properly
for the OS.

Hopefully, with your patch, the issue is all fixed for the BSD clan.

Please note that the patch was made against the the version prior to the
above, since I found it didn't work with \(bu (^H appears next to it).

Kazunobu


You received this message from the "vim_dev" maillist.
> Do not top-post! Type your reply below the text you are replying to.
> For more information, visit http://www.vim.org/maillist.php
>
> ---
> You received this message because you are subscribed to the Google Groups
> "vim_dev" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.
diff --git a/runtime/ftplugin/man.vim b/runtime/ftplugin/man.vim
index 49f2025a5..7d1a340cb 100644
--- a/runtime/ftplugin/man.vim
+++ b/runtime/ftplugin/man.vim
@@ -176,7 +176,11 @@ func <SID>GetPage(...)
     let $MANWIDTH = winwidth(0)
     let unsetwidth = 1
   endif
-  silent exec "r !man ".s:GetCmdArg(sect, page)
+  if has('mac')
+    silent exec "r !unset MANPAGER; man ".s:GetCmdArg(sect, page)
+  else
+    silent exec "r !man ".s:GetCmdArg(sect, page)
+  endif
   silent keepj %s/.\b//ge
   if unsetwidth
     let $MANWIDTH = ''
diff --git a/runtime/plugin/manpager.vim b/runtime/plugin/manpager.vim
index 939f33ec5..2b211e960 100644
--- a/runtime/plugin/manpager.vim
+++ b/runtime/plugin/manpager.vim
@@ -14,8 +14,19 @@ function! s:MANPAGER()
   let sec_pattern = '\v\w+%(\+\w+)*'
   let pagesec_pattern = '\v(' . page_pattern . ')\((' . sec_pattern . ')\)'
 
+  let i = 1
+  while i <= line('$')
+    if getline(i) !~ '^$'
+      break
+    endif
+    let i+= 1
+  endwhile
+
   if $MAN_PN is '1'
-    let manpage = tolower(matchstr( getline(1), '^' . pagesec_pattern ))
+    let manpage = matchstr( getline(i), '^' . pagesec_pattern )
+    if !has('mac') || manpage =~ '\v^[-_.:0-9A-Z]+\('
+      let manpage = tolower(manpage)
+    endif
   else
     let manpage = $MAN_PN
   endif

Raspunde prin e-mail lui