Wikia

Vim Tips Wiki

Changes: Perldoc function and module keyboard mappings

Edit

Back to page

(Modern Design)
(Undo revision 28933 by 109.67.193.204 (talk))
Line 1: Line 1:
Hip Design - Intimate Design, Ideas, Styles, Architecture
+
{{duplicate|461}}
Hip Design - Intimate Design, Ideas, Styles, Architecture
+
{{review}}
  +
{{TipImported
  +
|id=614
  +
|previous=613
  +
|next=615
  +
|created=December 10, 2003
  +
|complexity=intermediate
  +
|author=Adam Monsen
  +
|version=5.7
  +
|rating=22/7
  +
|category1=
  +
|category2=
  +
}}
  +
<pre>
  +
" put the cursor over a perl function and try backslash-pf to see perldoc
  +
:nmap <Leader>pf :!perldoc -f <cword><CR>
  +
  +
" put the cursor over a perl module name and try backslash-pd to see perldoc
  +
:nmap <Leader>pd :e `perldoc -ml <cword>`<CR>
  +
" see ':help mapleader' for more info... default is backslash.
  +
</pre>
  +
  +
==Comments==
  +
Here's something similar I use, with these improvements on original post:
  +
#Only sets up the mapping when editing perl files
  +
#Sets up 1 smart mapping that automatically works for perl functions as well as modules
  +
#Uses vim's build-in keyword definition feature instead of defining a new mapping
  +
  +
In your .vimrc add these 2 lines:
  +
  +
<pre>
  +
autocmd BufEnter *.pl,*.pm,*.cgi let oldkp=&kp | set keywordprg=perl \ -e\ $c=shift;exec\"perldoc\".($c=~/^[a-z]+$/?\"\ -f\ \":\"\ \").$c'
  +
autocmd BufLeave *.pl,*.pm,*.cgi let &keywordprg=oldkp
  +
</pre>
  +
  +
Then when editing a perl file you can use perl's built-in keyword definition mapping (capital K == shift+k) when under a perl function or module to see it's POD.
  +
  +
See {{help|K}}.
  +
  +
----
  +
Doesn't work. This is the error message I get.
  +
  +
<pre>
  +
Error detected while processing BufEnter Auto commands for "*.pl":
  +
E518: Unknown option: \ -e\ $c=shift;exec"perldoc".($c=~/^[a-z]+$/?"\ -f\ ":"\ ").$c'
  +
</pre>
  +
  +
----
  +
Try this:
  +
  +
autocmd BufEnter *.pl,*.pm,*.cgi setlocal keywordprg=perl\ -e'$c=shift;exec\"perldoc\ \".(/::/?\"\":\"-f\").\"\ $c\"'
  +
  +
(You don't need the BufLeave with setlocal)
  +
  +
It's clumsy. If you try to look at docs for Modules like CGI or DBI perldoc -f will still be called. You have to press enter once or twice before seeing the desired documentation and once or twice afterwards, depending on various conditions.
  +
  +
If there is a vimscript that handles this better I'd like to see it. Something that checks perldoc's exit code and tries again probably.
  +
  +
----
  +
Try this:
  +
  +
autocmd FileType perl :setlocal keywordprg=perl\ -e\ '$c=shift;exec\"perldoc\ $c\ \|\|\ perldoc\ -f\ $c\ \|\|\ echo\"'
  +
  +
This will try the keyword as a module first and if that fails it will call perldoc again with -f on the assumption that we're looking at a function. If that fails then echo an empty string to avoid some wierdities.
  +
  +
However. It's still clumsy. You have to press q and then any key to get back to your buffer. Is there anyway to get this output into a help buffer?
  +
  +
  +
----
  +
Try this:
  +
  +
autocmd FileType perl noremap K :!echo <cWORD> <cword> <bar> perl -e '$line = <STDIN>; if ($line =~ /(\w+::\w+)/){exec("perldoc $1")} elsif($line =~ /(\w+)/){exec "perldoc -f $1 <bar><bar> perldoc $1"}'<cr><cr>
  +
  +
This will work on:
  +
use MIME::Lite;
  +
use Encode;
  +
print("El Barto was here")
  +
$msg->send;

Revision as of 11:45, December 9, 2010

Duplicate tip

This tip is very similar to the following:

These tips need to be merged – see the merge guidelines.

Tip 614 Printable Monobook Previous Next

created December 10, 2003 · complexity intermediate · author Adam Monsen · version 5.7


" put the cursor over a perl function and try backslash-pf to see perldoc
:nmap <Leader>pf :!perldoc -f <cword><CR>

" put the cursor over a perl module name and try backslash-pd to see perldoc
:nmap <Leader>pd :e `perldoc -ml <cword>`<CR>
" see ':help mapleader' for more info... default is backslash.

Comments

Here's something similar I use, with these improvements on original post:

  1. Only sets up the mapping when editing perl files
  2. Sets up 1 smart mapping that automatically works for perl functions as well as modules
  3. Uses vim's build-in keyword definition feature instead of defining a new mapping

In your .vimrc add these 2 lines:

autocmd BufEnter *.pl,*.pm,*.cgi let oldkp=&kp | set keywordprg=perl \ -e\ $c=shift;exec\"perldoc\".($c=~/^[a-z]+$/?\"\ -f\ \":\"\ \").$c'
autocmd BufLeave *.pl,*.pm,*.cgi let &keywordprg=oldkp

Then when editing a perl file you can use perl's built-in keyword definition mapping (capital K == shift+k) when under a perl function or module to see it's POD.

See :help K.


Doesn't work. This is the error message I get.

Error detected while processing BufEnter Auto commands for "*.pl":
E518: Unknown option: \ -e\ $c=shift;exec"perldoc".($c=~/^[a-z]+$/?"\ -f\ ":"\ ").$c'

Try this:

autocmd BufEnter *.pl,*.pm,*.cgi setlocal keywordprg=perl\ -e'$c=shift;exec\"perldoc\ \".(/::/?\"\":\"-f\").\"\ $c\"'

(You don't need the BufLeave with setlocal)

It's clumsy. If you try to look at docs for Modules like CGI or DBI perldoc -f will still be called. You have to press enter once or twice before seeing the desired documentation and once or twice afterwards, depending on various conditions.

If there is a vimscript that handles this better I'd like to see it. Something that checks perldoc's exit code and tries again probably.


Try this:

autocmd FileType perl :setlocal keywordprg=perl\ -e\ '$c=shift;exec\"perldoc\ $c\ \|\|\ perldoc\ -f\ $c\ \|\|\ echo\"'

This will try the keyword as a module first and if that fails it will call perldoc again with -f on the assumption that we're looking at a function. If that fails then echo an empty string to avoid some wierdities.

However. It's still clumsy. You have to press q and then any key to get back to your buffer. Is there anyway to get this output into a help buffer?



Try this:

autocmd FileType perl noremap K :!echo <cWORD> <cword> <bar> perl -e '$line = <STDIN>; if ($line =~ /(\w+::\w+)/){exec("perldoc $1")} elsif($line =~ /(\w+)/){exec "perldoc -f $1 <bar><bar> perldoc $1"}'<cr><cr>

This will work on:

use MIME::Lite;
use Encode;
print("El Barto was here")
$msg->send;

Around Wikia's network

Random Wiki