2019-11-24 18:30:04 -07:00
|
|
|
" Maintainer: Anmol Sethi <hi@nhooyr.io>
|
2015-01-23 15:52:47 -07:00
|
|
|
|
2018-09-01 02:42:43 -07:00
|
|
|
if exists('s:loaded_man')
|
|
|
|
finish
|
|
|
|
endif
|
|
|
|
let s:loaded_man = 1
|
|
|
|
|
2017-05-18 12:04:17 -07:00
|
|
|
let s:find_arg = '-w'
|
|
|
|
let s:localfile_arg = v:true " Always use -l if possible. #6683
|
2020-07-21 08:46:42 -07:00
|
|
|
let s:section_arg = '-S'
|
2017-05-25 12:49:53 -07:00
|
|
|
|
2020-07-21 08:46:42 -07:00
|
|
|
function! man#init() abort
|
2017-05-18 12:04:17 -07:00
|
|
|
try
|
|
|
|
" Check for -l support.
|
2018-05-08 04:44:32 -07:00
|
|
|
call s:get_page(s:get_path('', 'man'))
|
2017-05-18 12:04:17 -07:00
|
|
|
catch /E145:/
|
|
|
|
" Ignore the error in restricted mode
|
|
|
|
catch /command error .*/
|
|
|
|
let s:localfile_arg = v:false
|
|
|
|
endtry
|
|
|
|
endfunction
|
2015-01-23 15:52:47 -07:00
|
|
|
|
2016-08-11 07:20:44 -07:00
|
|
|
function! man#open_page(count, count1, mods, ...) abort
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
if a:0 > 2
|
|
|
|
call s:error('too many arguments')
|
2015-01-23 15:52:47 -07:00
|
|
|
return
|
2016-09-03 18:53:58 -07:00
|
|
|
elseif a:0 == 0
|
|
|
|
let ref = &filetype ==# 'man' ? expand('<cWORD>') : expand('<cword>')
|
|
|
|
if empty(ref)
|
2016-08-07 22:23:12 -07:00
|
|
|
call s:error('no identifier under cursor')
|
|
|
|
return
|
|
|
|
endif
|
2016-09-03 18:53:58 -07:00
|
|
|
elseif a:0 ==# 1
|
2016-08-06 02:52:36 -07:00
|
|
|
let ref = a:1
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
else
|
2016-08-24 08:56:33 -07:00
|
|
|
" Combine the name and sect into a manpage reference so that all
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
" verification/extraction can be kept in a single function.
|
2016-08-06 02:52:36 -07:00
|
|
|
" If a:2 is a reference as well, that is fine because it is the only
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
" reference that will match.
|
2016-08-06 02:52:36 -07:00
|
|
|
let ref = a:2.'('.a:1.')'
|
2015-01-23 15:52:47 -07:00
|
|
|
endif
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
try
|
2020-06-12 20:43:53 -07:00
|
|
|
let [sect, name] = s:extract_sect_and_name_ref(ref)
|
2016-08-04 21:04:48 -07:00
|
|
|
if a:count ==# a:count1
|
2016-08-24 08:56:33 -07:00
|
|
|
" v:count defaults to 0 which is a valid section, and v:count1 defaults to
|
|
|
|
" 1, also a valid section. If they are equal, count explicitly set.
|
2016-08-04 21:04:48 -07:00
|
|
|
let sect = string(a:count)
|
|
|
|
endif
|
2020-06-12 20:22:59 -07:00
|
|
|
let path = s:verify_exists(sect, name)
|
|
|
|
let [sect, name] = s:extract_sect_and_name_path(path)
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
catch
|
|
|
|
call s:error(v:exception)
|
|
|
|
return
|
|
|
|
endtry
|
2016-12-07 21:04:23 -07:00
|
|
|
|
2019-10-29 11:41:30 -07:00
|
|
|
let [l:buf, l:save_tfu] = [bufnr(), &tagfunc]
|
2017-02-20 12:55:40 -07:00
|
|
|
try
|
2019-10-29 11:41:30 -07:00
|
|
|
set tagfunc=man#goto_tag
|
|
|
|
let l:target = l:name . '(' . l:sect . ')'
|
2017-02-20 12:55:40 -07:00
|
|
|
if a:mods !~# 'tab' && s:find_man()
|
2019-10-29 11:41:30 -07:00
|
|
|
execute 'silent keepalt tag' l:target
|
2017-02-20 12:55:40 -07:00
|
|
|
else
|
2019-10-29 11:41:30 -07:00
|
|
|
execute 'silent keepalt' a:mods 'stag' l:target
|
2017-02-20 12:55:40 -07:00
|
|
|
endif
|
|
|
|
finally
|
2019-10-29 11:41:30 -07:00
|
|
|
call setbufvar(l:buf, '&tagfunc', l:save_tfu)
|
2017-01-31 08:03:45 -07:00
|
|
|
endtry
|
|
|
|
|
2016-08-24 08:56:33 -07:00
|
|
|
let b:man_sect = sect
|
2016-08-06 02:52:36 -07:00
|
|
|
endfunction
|
|
|
|
|
|
|
|
function! man#read_page(ref) abort
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
try
|
2020-06-12 20:43:53 -07:00
|
|
|
let [sect, name] = s:extract_sect_and_name_ref(a:ref)
|
2020-06-12 20:22:59 -07:00
|
|
|
let path = s:verify_exists(sect, name)
|
|
|
|
let [sect, name] = s:extract_sect_and_name_path(path)
|
2016-12-07 21:04:23 -07:00
|
|
|
let page = s:get_page(path)
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
catch
|
2017-03-25 14:43:25 -07:00
|
|
|
call s:error(v:exception)
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
return
|
|
|
|
endtry
|
2017-02-20 12:55:40 -07:00
|
|
|
let b:man_sect = sect
|
2016-12-07 21:04:23 -07:00
|
|
|
call s:put_page(page)
|
2016-08-06 02:52:36 -07:00
|
|
|
endfunction
|
|
|
|
|
2016-12-07 21:04:23 -07:00
|
|
|
" Handler for s:system() function.
|
|
|
|
function! s:system_handler(jobid, data, event) dict abort
|
2017-05-18 12:04:17 -07:00
|
|
|
if a:event is# 'stdout' || a:event is# 'stderr'
|
|
|
|
let self[a:event] .= join(a:data, "\n")
|
2016-12-07 21:04:23 -07:00
|
|
|
else
|
|
|
|
let self.exit_code = a:data
|
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
" Run a system command and timeout after 30 seconds.
|
|
|
|
function! s:system(cmd, ...) abort
|
|
|
|
let opts = {
|
|
|
|
\ 'stdout': '',
|
|
|
|
\ 'stderr': '',
|
|
|
|
\ 'exit_code': 0,
|
|
|
|
\ 'on_stdout': function('s:system_handler'),
|
|
|
|
\ 'on_stderr': function('s:system_handler'),
|
|
|
|
\ 'on_exit': function('s:system_handler'),
|
|
|
|
\ }
|
|
|
|
let jobid = jobstart(a:cmd, opts)
|
|
|
|
|
|
|
|
if jobid < 1
|
|
|
|
throw printf('command error %d: %s', jobid, join(a:cmd))
|
|
|
|
endif
|
|
|
|
|
|
|
|
let res = jobwait([jobid], 30000)
|
|
|
|
if res[0] == -1
|
|
|
|
try
|
|
|
|
call jobstop(jobid)
|
|
|
|
throw printf('command timed out: %s', join(a:cmd))
|
2017-05-18 12:04:17 -07:00
|
|
|
catch /^Vim(call):E900:/
|
2016-12-07 21:04:23 -07:00
|
|
|
endtry
|
|
|
|
elseif res[0] == -2
|
|
|
|
throw printf('command interrupted: %s', join(a:cmd))
|
|
|
|
endif
|
|
|
|
if opts.exit_code != 0
|
2017-01-01 07:09:27 -07:00
|
|
|
throw printf("command error (%d) %s: %s", jobid, join(a:cmd), substitute(opts.stderr, '\_s\+$', '', &gdefault ? '' : 'g'))
|
2016-12-07 21:04:23 -07:00
|
|
|
endif
|
|
|
|
|
|
|
|
return opts.stdout
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
function! s:get_page(path) abort
|
2018-09-30 09:35:19 -07:00
|
|
|
" Disable hard-wrap by using a big $MANWIDTH (max 1000 on some systems #9065).
|
2019-02-20 10:15:41 -07:00
|
|
|
" Soft-wrap: ftplugin/man.vim sets wrap/breakindent/….
|
|
|
|
" Hard-wrap: driven by `man`.
|
2020-07-21 08:46:42 -07:00
|
|
|
let manwidth = !get(g:, 'man_hardwrap', 1) ? 999 : (empty($MANWIDTH) ? winwidth(0) : $MANWIDTH)
|
2016-09-03 10:56:47 -07:00
|
|
|
" Force MANPAGER=cat to ensure Vim is not recursively invoked (by man-db).
|
|
|
|
" http://comments.gmane.org/gmane.editors.vim.devel/29085
|
2017-11-10 21:27:00 -07:00
|
|
|
" Set MAN_KEEP_FORMATTING so Debian man doesn't discard backspaces.
|
|
|
|
let cmd = ['env', 'MANPAGER=cat', 'MANWIDTH='.manwidth, 'MAN_KEEP_FORMATTING=1', 'man']
|
2017-05-18 12:04:17 -07:00
|
|
|
return s:system(cmd + (s:localfile_arg ? ['-l', a:path] : [a:path]))
|
2016-12-07 21:04:23 -07:00
|
|
|
endfunction
|
|
|
|
|
|
|
|
function! s:put_page(page) abort
|
|
|
|
setlocal modifiable
|
|
|
|
setlocal noreadonly
|
2019-11-13 14:57:17 -07:00
|
|
|
setlocal noswapfile
|
2019-11-27 22:01:04 -07:00
|
|
|
" git-ls-files(1) is all one keyword/tag-target
|
|
|
|
setlocal iskeyword+=(,)
|
2016-12-07 21:04:23 -07:00
|
|
|
silent keepjumps %delete _
|
|
|
|
silent put =a:page
|
2016-08-06 02:52:36 -07:00
|
|
|
while getline(1) =~# '^\s*$'
|
|
|
|
silent keepjumps 1delete _
|
|
|
|
endwhile
|
2018-09-21 00:08:39 -07:00
|
|
|
" XXX: nroff justifies text by filling it with whitespace. That interacts
|
2018-09-30 09:35:19 -07:00
|
|
|
" badly with our use of $MANWIDTH=999. Hack around this by using a fixed
|
2018-09-21 00:08:39 -07:00
|
|
|
" size for those whitespace regions.
|
2018-09-30 09:35:19 -07:00
|
|
|
silent! keeppatterns keepjumps %s/\s\{199,}/\=repeat(' ', 10)/g
|
2018-09-27 01:07:00 -07:00
|
|
|
1
|
2017-12-24 10:16:58 -07:00
|
|
|
lua require("man").highlight_man_page()
|
2016-08-06 02:52:36 -07:00
|
|
|
setlocal filetype=man
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
endfunction
|
2015-09-19 14:44:23 -07:00
|
|
|
|
2016-08-04 21:47:28 -07:00
|
|
|
function! man#show_toc() abort
|
|
|
|
let bufname = bufname('%')
|
|
|
|
let info = getloclist(0, {'winid': 1})
|
|
|
|
if !empty(info) && getwinvar(info.winid, 'qf_toc') ==# bufname
|
|
|
|
lopen
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
let toc = []
|
|
|
|
let lnum = 2
|
|
|
|
let last_line = line('$') - 1
|
|
|
|
while lnum && lnum < last_line
|
|
|
|
let text = getline(lnum)
|
|
|
|
if text =~# '^\%( \{3\}\)\=\S.*$'
|
|
|
|
call add(toc, {'bufnr': bufnr('%'), 'lnum': lnum, 'text': text})
|
|
|
|
endif
|
|
|
|
let lnum = nextnonblank(lnum + 1)
|
|
|
|
endwhile
|
|
|
|
|
|
|
|
call setloclist(0, toc, ' ')
|
|
|
|
call setloclist(0, [], 'a', {'title': 'Man TOC'})
|
|
|
|
lopen
|
|
|
|
let w:qf_toc = bufname
|
|
|
|
endfunction
|
|
|
|
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
" attempt to extract the name and sect out of 'name(sect)'
|
|
|
|
" otherwise just return the largest string of valid characters in ref
|
2020-06-12 20:43:53 -07:00
|
|
|
function! s:extract_sect_and_name_ref(ref) abort
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
if a:ref[0] ==# '-' " try ':Man -pandoc' with this disabled.
|
2016-08-24 08:56:33 -07:00
|
|
|
throw 'manpage name cannot start with ''-'''
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
endif
|
|
|
|
let ref = matchstr(a:ref, '[^()]\+([^()]\+)')
|
|
|
|
if empty(ref)
|
|
|
|
let name = matchstr(a:ref, '[^()]\+')
|
|
|
|
if empty(name)
|
2016-08-24 08:56:33 -07:00
|
|
|
throw 'manpage reference cannot contain only parentheses'
|
2015-01-23 15:52:47 -07:00
|
|
|
endif
|
2020-06-12 20:22:59 -07:00
|
|
|
return ['', name]
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
endif
|
|
|
|
let left = split(ref, '(')
|
|
|
|
" see ':Man 3X curses' on why tolower.
|
|
|
|
" TODO(nhooyr) Not sure if this is portable across OSs
|
|
|
|
" but I have not seen a single uppercase section.
|
|
|
|
return [tolower(split(left[1], ')')[0]), left[0]]
|
|
|
|
endfunction
|
2015-09-23 01:11:04 -07:00
|
|
|
|
2016-08-24 08:56:33 -07:00
|
|
|
function! s:get_path(sect, name) abort
|
2018-07-08 08:31:10 -07:00
|
|
|
" Some man implementations (OpenBSD) return all available paths from the
|
|
|
|
" search command, so we get() the first one. #8341
|
2016-08-24 08:56:33 -07:00
|
|
|
if empty(a:sect)
|
2018-05-10 07:03:13 -07:00
|
|
|
return substitute(get(split(s:system(['man', s:find_arg, a:name])), 0, ''), '\n\+$', '', '')
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
endif
|
2016-08-24 08:56:33 -07:00
|
|
|
" '-s' flag handles:
|
|
|
|
" - tokens like 'printf(echo)'
|
|
|
|
" - sections starting with '-'
|
|
|
|
" - 3pcap section (found on macOS)
|
|
|
|
" - commas between sections (for section priority)
|
2018-07-08 08:31:10 -07:00
|
|
|
return substitute(get(split(s:system(['man', s:find_arg, s:section_arg, a:sect, a:name])), 0, ''), '\n\+$', '', '')
|
2016-08-24 08:56:33 -07:00
|
|
|
endfunction
|
|
|
|
|
2020-06-12 20:22:59 -07:00
|
|
|
" s:verify_exists attempts to find the path to a manpage
|
|
|
|
" based on the passed section and name.
|
|
|
|
"
|
|
|
|
" 1. If the passed section is empty, b:man_default_sects is used.
|
|
|
|
" 2. If manpage could not be found with the given sect and name,
|
|
|
|
" then another attempt is made with b:man_default_sects.
|
|
|
|
" 3. If it still could not be found, then we try again without a section.
|
|
|
|
" 4. If still not found but $MANSECT is set, then we try again with $MANSECT
|
|
|
|
" unset.
|
|
|
|
"
|
|
|
|
" This function is careful to avoid duplicating a search if a previous
|
|
|
|
" step has already done it. i.e if we use b:man_default_sects in step 1,
|
|
|
|
" then we don't do it again in step 2.
|
2016-08-24 08:56:33 -07:00
|
|
|
function! s:verify_exists(sect, name) abort
|
2020-06-12 20:22:59 -07:00
|
|
|
let sect = a:sect
|
|
|
|
if empty(sect)
|
|
|
|
let sect = get(b:, 'man_default_sects', '')
|
|
|
|
endif
|
|
|
|
|
2017-02-01 13:12:52 -07:00
|
|
|
try
|
2020-06-12 20:22:59 -07:00
|
|
|
return s:get_path(sect, a:name)
|
2017-02-01 13:12:52 -07:00
|
|
|
catch /^command error (/
|
2020-06-12 20:22:59 -07:00
|
|
|
endtry
|
|
|
|
|
|
|
|
if !empty(get(b:, 'man_default_sects', '')) && sect !=# b:man_default_sects
|
2017-02-01 13:12:52 -07:00
|
|
|
try
|
2020-06-12 20:22:59 -07:00
|
|
|
return s:get_path(b:man_default_sects, a:name)
|
2017-02-01 13:12:52 -07:00
|
|
|
catch /^command error (/
|
|
|
|
endtry
|
2020-06-12 20:22:59 -07:00
|
|
|
endif
|
|
|
|
|
|
|
|
if !empty(sect)
|
|
|
|
try
|
|
|
|
return s:get_path('', a:name)
|
|
|
|
catch /^command error (/
|
|
|
|
endtry
|
|
|
|
endif
|
|
|
|
|
|
|
|
if !empty($MANSECT)
|
|
|
|
try
|
|
|
|
let MANSECT = $MANSECT
|
|
|
|
unset $MANSECT
|
|
|
|
return s:get_path('', a:name)
|
|
|
|
catch /^command error (/
|
|
|
|
finally
|
|
|
|
let $MANSECT = MANSECT
|
|
|
|
endtry
|
|
|
|
endif
|
|
|
|
|
|
|
|
throw 'no manual entry for ' . a:name
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
endfunction
|
|
|
|
|
2020-06-12 20:22:59 -07:00
|
|
|
" Extracts the name/section from the 'path/name.sect', because sometimes the actual section is
|
|
|
|
" more specific than what we provided to `man` (try `:Man 3 App::CLI`).
|
|
|
|
" Also on linux, name seems to be case-insensitive. So for `:Man PRIntf`, we
|
|
|
|
" still want the name of the buffer to be 'printf'.
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
function! s:extract_sect_and_name_path(path) abort
|
|
|
|
let tail = fnamemodify(a:path, ':t')
|
|
|
|
if a:path =~# '\.\%([glx]z\|bz2\|lzma\|Z\)$' " valid extensions
|
|
|
|
let tail = fnamemodify(tail, ':r')
|
|
|
|
endif
|
|
|
|
let sect = matchstr(tail, '\.\zs[^.]\+$')
|
2016-08-24 08:56:33 -07:00
|
|
|
let name = matchstr(tail, '^.\+\ze\.')
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
return [sect, name]
|
|
|
|
endfunction
|
2015-01-23 15:52:47 -07:00
|
|
|
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
function! s:find_man() abort
|
2019-10-25 09:41:22 -07:00
|
|
|
let l:win = 1
|
|
|
|
while l:win <= winnr('$')
|
|
|
|
let l:buf = winbufnr(l:win)
|
|
|
|
if getbufvar(l:buf, '&filetype', '') ==# 'man'
|
|
|
|
execute l:win.'wincmd w'
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
return 1
|
|
|
|
endif
|
2019-10-25 09:41:22 -07:00
|
|
|
let l:win += 1
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
endwhile
|
2019-10-25 09:41:22 -07:00
|
|
|
return 0
|
2015-01-23 15:52:47 -07:00
|
|
|
endfunction
|
|
|
|
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
function! s:error(msg) abort
|
|
|
|
redraw
|
|
|
|
echohl ErrorMsg
|
2016-08-04 20:22:51 -07:00
|
|
|
echon 'man.vim: ' a:msg
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
echohl None
|
2015-09-20 06:46:55 -07:00
|
|
|
endfunction
|
|
|
|
|
2020-06-12 20:43:53 -07:00
|
|
|
" see s:extract_sect_and_name_ref on why tolower(sect)
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
function! man#complete(arg_lead, cmd_line, cursor_pos) abort
|
|
|
|
let args = split(a:cmd_line)
|
2018-01-22 08:49:35 -07:00
|
|
|
let cmd_offset = index(args, 'Man')
|
|
|
|
if cmd_offset > 0
|
|
|
|
" Prune all arguments up to :Man itself. Otherwise modifier commands like
|
|
|
|
" :tab, :vertical, etc. would lead to a wrong length.
|
|
|
|
let args = args[cmd_offset:]
|
|
|
|
endif
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
let l = len(args)
|
|
|
|
if l > 3
|
|
|
|
return
|
|
|
|
elseif l ==# 1
|
|
|
|
let name = ''
|
|
|
|
let sect = ''
|
|
|
|
elseif a:arg_lead =~# '^[^()]\+([^()]*$'
|
|
|
|
" cursor (|) is at ':Man printf(|' or ':Man 1 printf(|'
|
|
|
|
" The later is is allowed because of ':Man pri<TAB>'.
|
|
|
|
" It will offer 'priclass.d(1m)' even though section is specified as 1.
|
|
|
|
let tmp = split(a:arg_lead, '(')
|
|
|
|
let name = tmp[0]
|
|
|
|
let sect = tolower(get(tmp, 1, ''))
|
2016-12-26 16:26:00 -07:00
|
|
|
return s:complete(sect, '', name)
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
elseif args[1] !~# '^[^()]\+$'
|
|
|
|
" cursor (|) is at ':Man 3() |' or ':Man (3|' or ':Man 3() pri|'
|
|
|
|
" or ':Man 3() pri |'
|
|
|
|
return
|
|
|
|
elseif l ==# 2
|
|
|
|
if empty(a:arg_lead)
|
|
|
|
" cursor (|) is at ':Man 1 |'
|
|
|
|
let name = ''
|
|
|
|
let sect = tolower(args[1])
|
|
|
|
else
|
|
|
|
" cursor (|) is at ':Man pri|'
|
|
|
|
if a:arg_lead =~# '\/'
|
|
|
|
" if the name is a path, complete files
|
|
|
|
" TODO(nhooyr) why does this complete the last one automatically
|
|
|
|
return glob(a:arg_lead.'*', 0, 1)
|
|
|
|
endif
|
|
|
|
let name = a:arg_lead
|
|
|
|
let sect = ''
|
|
|
|
endif
|
|
|
|
elseif a:arg_lead !~# '^[^()]\+$'
|
|
|
|
" cursor (|) is at ':Man 3 printf |' or ':Man 3 (pr)i|'
|
|
|
|
return
|
|
|
|
else
|
|
|
|
" cursor (|) is at ':Man 3 pri|'
|
|
|
|
let name = a:arg_lead
|
|
|
|
let sect = tolower(args[1])
|
2015-01-23 15:52:47 -07:00
|
|
|
endif
|
2016-12-26 16:26:00 -07:00
|
|
|
return s:complete(sect, sect, name)
|
|
|
|
endfunction
|
|
|
|
|
2020-02-20 13:19:49 -07:00
|
|
|
function! s:get_paths(sect, name, do_fallback) abort
|
|
|
|
" callers must try-catch this, as some `man` implementations don't support `s:find_arg`
|
2016-12-07 21:04:23 -07:00
|
|
|
try
|
2017-05-18 12:04:17 -07:00
|
|
|
let mandirs = join(split(s:system(['man', s:find_arg]), ':\|\n'), ',')
|
2020-06-12 20:43:53 -07:00
|
|
|
let paths = globpath(mandirs, 'man?/'.a:name.'*.'.a:sect.'*', 0, 1)
|
|
|
|
try
|
|
|
|
" Prioritize the result from verify_exists as it obeys b:man_default_sects.
|
|
|
|
let first = s:verify_exists(a:sect, a:name)
|
|
|
|
let paths = filter(paths, 'v:val !=# first')
|
|
|
|
let paths = [first] + paths
|
|
|
|
catch
|
|
|
|
endtry
|
|
|
|
return paths
|
2016-12-07 21:04:23 -07:00
|
|
|
catch
|
2020-02-20 13:19:49 -07:00
|
|
|
if !a:do_fallback
|
|
|
|
throw v:exception
|
|
|
|
endif
|
|
|
|
|
2020-06-12 20:43:53 -07:00
|
|
|
" Fallback to a single path, with the page we're trying to find.
|
|
|
|
try
|
|
|
|
return [s:verify_exists(a:sect, a:name)]
|
|
|
|
catch
|
|
|
|
return []
|
|
|
|
endtry
|
2016-12-07 21:04:23 -07:00
|
|
|
endtry
|
2019-10-24 12:25:58 -07:00
|
|
|
endfunction
|
|
|
|
|
|
|
|
function! s:complete(sect, psect, name) abort
|
2020-02-20 13:19:49 -07:00
|
|
|
let pages = s:get_paths(a:sect, a:name, v:false)
|
2016-12-26 18:27:44 -07:00
|
|
|
" We remove duplicates in case the same manpage in different languages was found.
|
|
|
|
return uniq(sort(map(pages, 's:format_candidate(v:val, a:psect)'), 'i'))
|
2015-01-23 15:52:47 -07:00
|
|
|
endfunction
|
|
|
|
|
2016-12-26 16:26:00 -07:00
|
|
|
function! s:format_candidate(path, psect) abort
|
2016-08-22 06:03:37 -07:00
|
|
|
if a:path =~# '\.\%(pdf\|in\)$' " invalid extensions
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
return
|
|
|
|
endif
|
2016-08-22 06:03:37 -07:00
|
|
|
let [sect, name] = s:extract_sect_and_name_path(a:path)
|
2016-12-26 16:26:00 -07:00
|
|
|
if sect ==# a:psect
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
return name
|
2016-12-26 16:26:00 -07:00
|
|
|
elseif sect =~# a:psect.'.\+$'
|
man.vim: rewrite
- Smart autocomplete. It's automatically sorted, filtered for duplicates
and even formats the candidates based on what is needed. For example,
`:Man 1 printf<TAB>` will show the pages that are in section 1m as
'page(sect)' to let you know they are in a more specific section.
- Instead of trying to unset $MANPAGER we use the -P flag to set the
pager to cat
- Always use the section arg '-s', it makes the code much simpler
(see comment in s:man-args).
- A manpage name starting with '-' is invalid. It's fine for sections
because of the use of '-s'.
- The tagstack is an actual stack now, makes it much simpler.
- By using v:count and v:count1, the plugin can explicitly check whether
the user set a count, instead of relying on a default value (0) that
is actually a real manpage section.
- Extraction of a manpage reference is much more simple. No giant long
complicated regexes. Now, the plugin lets `man` handle the actual
validation. We merely extract the section and page. Syntax regexes are
a bit more specific though to prevent highlighting everything.
- Multilingual support in the syntax file. Removed the cruft that was only
relevent to vim. Also simplified and improved many of the regexes.
- Using shellescape when sending the page and sect as arguments
- In general, the code flow is much more obvious.
- man#get_page has been split up into smaller functions with explicit
responsibilties
- ':help' behavior in opening splits and manpages
- Comments explaining anything that needs explaining and isn't
immediately obvious.
- If a manpage has already been loaded but if it were to reloaded at the
current width which is the same as the width at which it was loaded at
previously, it is not reloaded.
- Use substitute to remove the backspaced instead of `col -b`, as the
latter doesn't work with other languages.
- Open paths to manpages
- It uses cWORD instead of cword to get the manpage under the cursor, this
helps with files that do not have (,) in iskeyword. It also means the
plugin does not set iskeyword locally anymore.
- <Plug>(Man) mapping for easy remapping
- Switched to single quotes wherever possible.
- Updated docs in $VIMRUNTIME/doc/filetype.txt (still need to update
user-manual)
- Always call tolower on section name. See comment in
s:extract_page_and_sect_fpage
- Formatting/consistency cleanup
- Automatically map q to ':q<CR>' when invoked as $MANPAGER
- It also fully supports being used as $MANPAGER. Setting the name and
stuff automatically.
- Split up the setlocals into multiple lines for easier readability
- Better detection of errors by redirecting stderr to /dev/null. If an
error occured, stdout will be empty.
- Functions return [sect, page] not [page, sect]. Makes more sense with
how man takes the arguments as sect and then page.
- Pretty prints errors on a single line.
- If no section is given, automatically finds the correct section for
the buffer name. It also gets the correct page. See the comment in
s:get_page
- If $MANWIDTH is not set, do not assign directly to $MANWIDTH because
then $MANWIDTH will always stay set to the same value as we only use
winwidth(0) when the global $MANWIDTH is empty. Instead we set it
locally for the command.
- Maintainer notes on all files.
2016-03-14 02:05:28 -07:00
|
|
|
" We include the section if the user provided section is a prefix
|
|
|
|
" of the actual section.
|
|
|
|
return name.'('.sect.')'
|
|
|
|
endif
|
2015-01-23 15:52:47 -07:00
|
|
|
endfunction
|
2016-11-18 23:08:23 -07:00
|
|
|
|
|
|
|
function! man#init_pager() abort
|
2019-11-24 18:30:04 -07:00
|
|
|
" https://github.com/neovim/neovim/issues/6828
|
|
|
|
let og_modifiable = &modifiable
|
|
|
|
setlocal modifiable
|
|
|
|
|
2016-11-18 23:08:23 -07:00
|
|
|
if getline(1) =~# '^\s*$'
|
|
|
|
silent keepjumps 1delete _
|
|
|
|
else
|
|
|
|
keepjumps 1
|
|
|
|
endif
|
2017-12-24 10:16:58 -07:00
|
|
|
lua require("man").highlight_man_page()
|
2018-10-25 17:50:21 -07:00
|
|
|
" Guess the ref from the heading (which is usually uppercase, so we cannot
|
|
|
|
" know the correct casing, cf. `man glDrawArraysInstanced`).
|
2016-12-26 19:01:37 -07:00
|
|
|
let ref = substitute(matchstr(getline(1), '^[^)]\+)'), ' ', '_', 'g')
|
2016-11-18 23:08:23 -07:00
|
|
|
try
|
2020-06-12 20:43:53 -07:00
|
|
|
let b:man_sect = s:extract_sect_and_name_ref(ref)[0]
|
2016-11-18 23:08:23 -07:00
|
|
|
catch
|
|
|
|
let b:man_sect = ''
|
|
|
|
endtry
|
2018-10-24 18:20:55 -07:00
|
|
|
if -1 == match(bufname('%'), 'man:\/\/') " Avoid duplicate buffers, E95.
|
2018-10-25 17:50:21 -07:00
|
|
|
execute 'silent file man://'.tolower(fnameescape(ref))
|
2018-10-24 18:20:55 -07:00
|
|
|
endif
|
2019-11-24 18:30:04 -07:00
|
|
|
|
|
|
|
let &l:modifiable = og_modifiable
|
2016-11-18 23:08:23 -07:00
|
|
|
endfunction
|
2017-05-18 12:04:17 -07:00
|
|
|
|
2019-10-22 15:40:16 -07:00
|
|
|
function! man#goto_tag(pattern, flags, info) abort
|
2020-06-12 20:43:53 -07:00
|
|
|
let [l:sect, l:name] = s:extract_sect_and_name_ref(a:pattern)
|
2019-10-22 15:40:16 -07:00
|
|
|
|
2020-02-20 13:19:49 -07:00
|
|
|
let l:paths = s:get_paths(l:sect, l:name, v:true)
|
2019-11-13 15:00:11 -07:00
|
|
|
let l:structured = []
|
2019-10-22 15:40:16 -07:00
|
|
|
|
2019-11-13 15:00:11 -07:00
|
|
|
for l:path in l:paths
|
|
|
|
let l:n = s:extract_sect_and_name_path(l:path)[1]
|
|
|
|
let l:structured += [{ 'name': l:n, 'path': l:path }]
|
|
|
|
endfor
|
|
|
|
|
2020-01-06 22:57:36 -07:00
|
|
|
if &cscopetag
|
|
|
|
" return only a single entry so we work well with :cstag (#11675)
|
|
|
|
let l:structured = l:structured[:0]
|
|
|
|
endif
|
|
|
|
|
2019-11-13 15:00:11 -07:00
|
|
|
return map(l:structured, {
|
|
|
|
\ _, entry -> {
|
|
|
|
\ 'name': entry.name,
|
|
|
|
\ 'filename': 'man://' . entry.path,
|
2019-10-22 15:40:16 -07:00
|
|
|
\ 'cmd': '1'
|
|
|
|
\ }
|
|
|
|
\ })
|
|
|
|
endfunction
|
|
|
|
|
2020-07-21 08:46:42 -07:00
|
|
|
call man#init()
|