NAME Vim::X - Candy for Perl programming in Vim VERSION version 0.2.0 SYNOPSIS package Vim::X::Plugin::MostUsedVariable; use strict; use warnings; use Vim::X; sub MostUsedVariable :Vim { my %var; for my $line ( vim_lines ) { $var{$1}++ while $line =~ /[$@%](\s+)/g; } my ( $most_used ) = reverse sort { $var{$a} <=> $var{$b} } keys %var; vim_msg "variable name $most_used used $var{$most_used} times"; } and then in your ".vimrc": perl push @INC, '/path/to/plugin/lib'; perl use Vim::X::Plugin::MostUsedVariable; map m :call MostUsedVariable() DESCRIPTION *Vim::X* provides two tools to make writing Perl functions for Vim a little easier: it auto-exports functions tagged by the attribute ":Vim" in Vim-space, and it defines a slew of helper functions and objects that are a little more *Do What I Mean* than the *VIM* API module that comes with Vim itself. Obviously, for this module to work, Vim has to be compiled with Perl interpreter support. Import Perl function in Vim-space Function labeled with the ":Vim" attribute are automatically exported to Vim. The ":Vim" attribute accepts two optional parameters: "args" and "range". :Vim(args) If "args" is present, the function will be exported expecting arguments, that will be passed to the function via the usual @_ way. sub Howdie :Vim(args) { vim_msg( "Hi there, ", $_[0] ); } # and then in vim: call Howdie("buddy") :Vim(range) If "range" is present, the function will be called only once when invoked over a range, instead than once per line (which is the default behavior). sub ReverseLines :Vim(range) { my @lines = reverse map { "$_" } vim_range(); for my $line ( vim_range ) { $line <<= pop @lines; } } # and then in vim: :5,15 call ReverseLines() Loading libraries If your collection of functions is growing, "load_function_dir()" can help with their management. See that function below for more details. FUNCTIONS load_function_dir( $library_dir) Looks into the given *$library_dir* and imports the functions in all files with the extension ".pl" (non-recursively). Each file must have the name of its main function to be imported to Vim-space. To have good start-up time, and to avoid loading all dependencies even for unused functions, the different files aren't sourced at start-up, but are using the "autocmd" function of Vim to load those files only if used. E.g., # in ~/.vim/vimx/perlweekly/PWGetInfo.pl use Vim::X; use LWP::UserAgent; use Web::Query; use Escape::Houdini; sub PWGetInfo :Vim() { ...; } # in .vimrc perl use Vim::X; autocmd BufNewFile,BufRead **/perlweekly/src/*.mkd \ perl Vim::X::load_function_dir('~/.vim/vimx/perlweekly') autocmd BufNewFile,BufRead **/perlweekly/src/*.mkd \ map pw :call PWGetInfo() And there you do, the mapping 'pw' will only be created if a markdown file within the perlweekly directory will be visited. load_function_file( $file_path ) Loads the code within *$file_path* under the namespace *Vim::X::Function::$name*, where name if the basename of the *$file_path*, minus the ".pl" extension. Not that useful by itself, but used by "load_function_dir". vim_msg( @text ) Display the strings of *@text* concatenated as a vim message. vim_msg "Hello from Perl"; vim_buffer( $i ) Returns the Vim::X::Buffer object associated with the *$i*th buffer. If *$i* is not given or set to '0', it returns the current buffer. vim_lines( @indexes ) Returns the Vim::X::Line objects for the lines in *@indexes* of the current buffer. If no index is given, returns all the lines of the buffer. vim_line($index) Returns the Vim::X::Line object for line *$index* of the current buffer. If *$index* is not given, returns the line at the cursor. vim_append(@lines) Appends the given lines after the line under the cursor. If carriage returns are present in the lines, they will be split in consequence. vim_eval(@expressions) Evals the given @expressions and returns their results. vim_range() Returns the range of line (if any) on which the command has been called. vim_command( @commands ) Run the given 'ex' commands and return their results. vim_command 'normal 10G', 'normal iHi there!'; vim_call( $function, @args ) Calls the vim-space function *$function* with the provided arguments. vim_call( 'SetVersion', '1.23' ) # equivalent of doing # :call SetVersion( '1.23' ) # in vim vim_window( $i ) Returns the Vim::X::Window associated with the *$i*th window. If *$i* is not provided or is zero, returns the object for the current window. vim_cursor Returns the Vim::X::Line associated with the position of the cursor in the current window. vim_delete( @lines ) Deletes the given lines from the current buffer. SEE ALSO The original blog entry: AUTHOR Yanick Champoux COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Yanick Champoux. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.