Coder Social home page Coder Social logo

vim-x's Introduction

NAME

Vim::X - Candy for Perl programming in Vim

VERSION

version 1.0.1

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 =~ /[$@%](\w+)/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 <leader>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 for all functions, the different files aren't sourced at start-up, but are rather using the autocmd function of Vim to trigger the loading of 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 <leader>pw :call PWGetInfo()<CR>

source_function_dir( $library_dir )

Like load_function_dir, but if it finds files with the exension .pvim, it'll also source them as vimL files at load-time, allowing to define both the Perl bindings and the vim macros in the same file. Note that, magically, the Perl code will still only be compiled if the function is invoked.

For that special type of magic to happen, the .pvim files must follow a certain pattern to be able to live their double-life as Perl scripts and vim file:

""; <<'finish';

" your vim code goes here

finish

# the Perl code goes here

When sourced as a vim script, the first line is considered a comment and ignored, and the rest is read until it hits finish, which cause Vim to stop reading the file. When read as a Perl file, the first line contains a heredoc that makes all the Vim code into an unused string, so basically ignore it in a fancy way.

For example, the snippet for load_function_dir could be rewritten as such:

# in ~/.vim/vimx/perlweekly/PWGetInfo.pvim
""; <<'finish';

    map <leader>pw :call PWGetInfo()<CR>

finish

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::source_function_dir('~/.vim/vimx/perlweekly')

load_function_file( $file_path )

Loads the code within $file_path under the namespace Vim::X::Function::$name, where name is the basename of the $file_path, minus the .pl/.pvim 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($from, $to)

vim_range($line)

vim_range()

Returns a Vim::X::Range object for the given lines, or single line, in the current buffer. The lines can be passed as indexes, or Vim::X::Line objects.

If no line whatsoever is passed, the range will be the one on which the command has been called (i.e.: :afirstline and a:lastline).

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: http://techblog.babyl.ca/entry/vim-x

CONTRIBUTORS

Hernan Lopes

AUTHOR

Yanick Champoux [email protected] endorse

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.

vim-x's People

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.