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
--
--
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.