SlideShare a Scribd company logo
Perl Hacks
  on Vim
            Lin You-An
          c9s / Cornelius
       pause id: CORNELIUS
HI
I am
       Lin You-An
Taiwan
VIM & Perl
how can vim improve
perl coding productivity
The worst way to edit
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
#!/usr/bin/env perl
my $hppiness = yapcasia->join();

     Oops!
      lost “a”
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
                            xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
                          xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
                         xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
                        xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
                      xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
                     xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
                    xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
                  xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
                 xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
               xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
            xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
        xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
      xN
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
#!/usr/bin/env perl
my $happiness = yapcasia->join();
#!/usr/bin/env perl
my $happiness = yapcasia->join();

               if this costs 4 sec
#!/usr/bin/env perl
my $happiness = yapcasia->join();

                      if this costs 4 sec

        if x 50 times this kind of situation per day
#!/usr/bin/env perl
my $happiness = yapcasia->join();

                      if this costs 4 sec

        if x 50 times this kind of situation per day
#!/usr/bin/env perl
my $happiness = yapcasia->join();

                        if this costs 4 sec

          if x 50 times this kind of situation per day
     and you work for more than 300 day per year
                                        = 16.6 hours
#!/usr/bin/env perl
my $happiness = yapcasia->join();

                        if this costs 4 sec

          x 50 times this kind of situation per day ?
     and you work for more than 300 day per year
                                        = 16.6 hours
#!/usr/bin/env perl
my $happiness = yapcasia->join();

                        if this costs 4 sec


              Awful
          x 50 times this kind of situation per day ?
     and you work for more than 300 day per year
                                        = 16.6 hours
What can you do in
   16.6 hours
with family
with friends
kids
or more hacking
sleep...
anyway , time is money
The VIM way...
VIM:
#!/usr/bin/env perl
my $hppiness = yapcasia->join();
                        F   h
VIM:
#!/usr/bin/env perl
my $happiness = yapcasia->join();
       a ppend a
VIM:
#!/usr/bin/env perl
my $happiness = yapcasia->join();
    f   y
VIM:
#!/usr/bin/env perl
my $happiness = Yapcasia->join();
                ~
VIM:
#!/usr/bin/env perl
my $happiness = YApcasia->join();
                 ~
VIM:
#!/usr/bin/env perl
my $happiness = YAPcasia->join();
                  ~
VIM:
#!/usr/bin/env perl
my $happiness = YAPCasia->join();
                   ~
So What is VIM ?
VIM is not an
    IDE
VIM is an
 Editor
VI Improved
Move More Efficiently.
Learning Curve
Perl.Hacks.On.Vim
Features
1. Mode
More Than
4 Edit Mode
INSERT
NORMAL
 VISUAL
 SELECT
  ... et cetera
ESC
      [Ii]NSERT
      NORMAL
      [Vv]ISUAL
1.1 Normal Mode
Motion
Perl.Hacks.On.Vim
Perl.Hacks.On.Vim
HJKL
←↓↑→
h ,j ,k ,l
H ,M ,L
 w ,e ,b
f[x] , t[x]
[{ , ]} , %
 ( ,) ,{ ,}
# comments ...

foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	
}

sub func1 {



}
# comments ...

foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	             Cursor
}

sub func1 {



}
# comments ...

foreach my $foo ( @bar ) {

    # do something            [{

   my @outs = grep /pattern/ , @list;
	 	
}

sub func1 {



}
# comments ...

foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	
}                                  f@

sub func1 {



}
# comments ...

foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	
}                                       $

sub func1 {



}
# comments ...

foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	
}      ^

sub func1 {



}
# comments ...
    H
foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	
}

sub func1 {



}
# comments ...

foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	 M
}

sub func1 {



}
# comments ...

foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	
}

sub func1 {



}
      L
# comments ...

foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	
}

sub func1 {



}
# comments ...

foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	
}                    C
                                 Insert mode
sub func1 {



}
# comments ...

foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	
}

sub func1 {



}
# comments ...

foreach my $foo ( @bar ) {

    # do something

   my @outs = grep /pattern/ , @list;
	 	
}

     %
sub func1 {



}
:h motion.txt
1.2 Insert Mode
Editing text
Insert Mode

• i : Insert text before the cursor
Insert Mode

• i : Insert text before the cursor
• I : Insert text before the first non-blank in the
  line
Insert Mode

• i : Insert text before the cursor
• I : Insert text before the first non-blank in the
  line
• a : Append text after the cursor
Insert Mode

• i : Insert text before the cursor
• I : Insert text before the first non-blank in the
  line
• a : Append text after the cursor
• A : Append text at the end of the line
1.3 Visual Mode
Select region
Visual Mode

• v : start Visual mode per character.
Visual Mode

• v : start Visual mode per character.
• V : start Visual mode linewise.
Visual Mode

• v : start Visual mode per character.
• V : start Visual mode linewise.
• Ctrl-v : start Visual mode blockwise.
Visual Mode

• v : start Visual mode per character.
• V : start Visual mode linewise.
• Ctrl-v : start Visual mode blockwise.
                 operator       y (yank) , d
                (delete) , c (change) ... etc
2. Syntax Highlight Support
/opt/local/share/vim/vim72
$ ls -1 syntax/ | wc -l
   520


              more than 500 syntax files
Customizable
   Syntax
Perl needs syntax
but we design more
   syntax in Perl
Modules need syntax too
Template::Declare
  template simple => sub {
     html {
       head {}
       body {
          p {'Hello, world wide web!'}
       }
     }
  };

   # ... templates
Perl.Hacks.On.Vim
Perl.Hacks.On.Vim
package MyView;
use Markapl;

tempalte '/a/page.html' => sub {
  h1("#title") { "Hi" };
  p(".first") { "In the begining, lorem ipsum...." };
  p(style => "color: red;") { "But...." };
}
Jifty::DBI::Schema
  package TestApp::Model::Phone;
  use Jifty::DBI::Schema;
  use Jifty::DBI::Record schema {
     column user =>
        references TestApp::Model::User by 'id',
        is mandatory;
     column type => ...;
     column value => ...;
  };
~/.vim/syntax/[filetype].vim
~/.vim/syntax/[filetype].vim

syn match [id] [re] [options]
~/.vim/syntax/[filetype].vim

syn match [id] [re] [options]
syn region [id] start=[re] end=[re]
~/.vim/syntax/[filetype].vim

syn match [id] [re] [options]
syn region [id] start=[re] end=[re]
syn keyword [id] [keyword] ...
~/.vim/syntax/[filetype].vim

syn match [id] [re] [options]
syn region [id] start=[re] end=[re]
syn keyword [id] [keyword] ...

hi [id]   guibg=[color] ctermfg=[color]
~/.vim/syntax/perl/*.vim
~/.vim/syntax/perl/jifty.vim
~/.vim/syntax/perl/template-declare.vim
~/.vim/syntax/perl/markapl.vim
" Fold Jifty Templates
syn region jifty_td_fold
    start=+^(privates+)=templates+
    end=+^};+ transparent fold keepend

" Fold Jifty Template Delcare Tags
syn region jifty_tag_fold
     start="^z(s*)<(div|table|row|form|script|
cell|row|th|tfoot)>s*{"
     end="^z1};=" fold keepend
Fold Jifty::DBI schema columns and action params

 syn region jfscolumn
      start=+^s*(param|column)>+
      end=+;+ contained
      contains=jfspropertybe,jfsproperty,jfscol,jfscolname,
         perlComment, perlString, perlFunction, perlFloat,
perlNumber, perlSpecialString, perlStringUnexpanded
         fold
:help syntax.txt
4.
  key
mapping
:map
:nmap
:vmap
:imap
:smap
:xmap
... more
:map       (all)

:nmap      (normal mode)

:vmap      (visual mode)

:imap      (insert mode)

:smap      (select mode)

:xmap      (visual , select mode)
... more
:nmap <C-c><C-c> :!perl -Wc %



Ctrl C      Ctrl C

     let perl check current perl script syntax
use Tab and Shift-Tab to indent region ,
        instead of “>” and “<“

nmap         <tab>   v>
nmap         <s-tab> v<

vmap         <tab>   >gv
vmap         <s-tab> <gv
imap <F2> <C-R>=strftime("%c")<CR>
imap <F2> <C-R>=system(‘perl -MDateTime -e
DateTime->now’)<CR>



               to insert timestamp
cmap   <c-a>   <home>
cmap   <c-e>   <end>
cnoremap <c-b>        <left>
cnoremap <c-d>        <del>
cnoremap <c-f>        <right>
cnoremap <c-n>        <down>
cnoremap <c-p>        <up>

cnoremap   <esc><c-b> <s-left>
cnoremap   <esc><c-f> <s-right>

           support bash-like key mapping
:h map.txt
5.
Text Object
Text Object

• word
• string      ⇛             action
• paragraph       (yank,delete,change ...etc)

• block
Operator Mapping

v|c|d       i|a            { | [ | ( |“ |‘

   visual                         Region
  change    Inner Object            {}
  delete     An Object              []
                                    ()
                                    ““
Operator                            ‘‘
va{
Perl.Hacks.On.Vim
sub( blah , blah )
           ci(


     sub( )

   sub( new_args )
“Hello World”
          di”


     “”

“Hello New World”
Vim7.1 Comes with
  tag block region
<aaa> Hola </aaa>
           vit


<aaa> Hola </aaa>

            Visual Select
Alias
   "dl" delete character (alias: "x")   |dl|
   "diw" delete inner word               *diw*
   "daw" delete a word                  *daw*
   "diW" delete inner WORD (see |WORD|)            *diW*
   "daW" delete a WORD (see |WORD|)               *daW*
   "dd" delete one line               |dd|
   "dis" delete inner sentence           *dis*
   "das" delete a sentence              *das*
   "dib" delete inner '(' ')' block    *dib*
   "dab" delete a '(' ')' block       *dab*
   "dip" delete inner paragraph           *dip*
   "dap" delete a paragraph              *dap*
   "diB" delete inner '{' '}' block    *diB*
   "daB" delete a '{' '}' block
8.
FOLDS
FOLD IS
Perl.Hacks.On.Vim
Fold Methods
Fold Methods
 Syntax Fold
Fold Methods
   Syntax Fold
                 :set foldmethod=syntax


set fold method as syntax , check out more options in:
             $VIMRUNTIME/syntax/*.vim
Perl built-in syntax
/opt/local/share/vim/vim72/syntax/perl.vim


if exists("perl_want_scope_in_variables")
“ .....
if exists("perl_extended_vars")
“ .....
  if exists("perl_fold")
“ .....
                                you can enablethose features in
                                         your .vimrc

                             let perl_fold = 1
                             let perl_extended_vars = 1
                             “ .... etc
for complex things like
                                        @{${"foo"}}.



let   perl_include_pod = 1
let   perl_extended_vars = 1
let   perl_want_scope_in_variables = 1
let   perl_fold = 1
let   perl_fold_blocks = 1
                                         for something like
                                           $pack::var1
Fold Methods
 Syntax Fold
 Marker Fold
Fold Methods
 Syntax Fold
 Marker Fold

          :set foldmethod=marker

               fold region by markers , the
               default marker is “{{{“ , “}}}”
# fold this {{{
sub do_something {

    # a lot of work ...

}
#   }}}
# fold this {{{
sub do_something {

    # a lot of work ...
    # foldlevel 2 {{{2
         # foldlevel 4 {{{4

         # }}}4
      # foldlevel here is 3
    # }}}2
}
#   }}}
Perl.Hacks.On.Vim
Fold Methods
 Syntax Fold
 Marker Fold
 Indent Fold
Fold Methods
 Syntax Fold
 Marker Fold
 Indent Fold
          :set foldmethod=indent

                use indent to fold
Fold Methods
 Syntax Fold
 Marker Fold
 Indent Fold
 Manual Fold
:set foldmethod=manual

          create folds manually
autocmd   BufWinLeave *.*          silent mkview
autocmd   BufWinEnter *.*          silent loadview

                autocmd   mkview , loadview
                                          ~/.vim/view/
Fold Methods
 Syntax Fold
 Marker Fold
 Indent Fold
 Manual Fold
 Expr Fold (Custom Fold Function)
:set foldexpr=MyFoldLevel(v:lnum)


                customized fold function
Fold Methods
 Syntax Fold
 Marker Fold
 Indent Fold
 Manual Fold
 Expr Fold (Custom Fold Function)
 Diff Fold
*za*
          za    When on a closed fold: open it. When folds are nested, you
               may have to use "za" several times. When a count is given,
               that many closed folds are opened.
za             When on an open fold: close it and set 'foldenable'. This
               will only close one level, since using "za" again will open

zA
               the fold. When a count is given that many folds will be
               closed (that's not the same as repeating "za" that many
               times).

                                       *zA*
          zA    When on a closed fold: open it recursively.

zm             When on an open fold: close it recursively and set



zM
               zm         Fold more: Subtract one from 'foldlevel'. If 'foldlevel' was
                        already zero nothing happens.

zr                      'foldenable' will be set.

                                                     *zM*

zR             zM          Close all folds: set 'foldlevel' to 0.
                        'foldenable' will be set.




zj , zk

[z , ]z
:h folding
10. QuickFix
:grep
:grep [pattern] [filepath]
Result ⇛ QuickFix Window
QuickFix Window
:set grepprg=/path/to/grep
:copen
:cclose
:cnext
:cprevious
QuickFix Window Toggle
com! -bang -nargs=? QFix cal QFixToggle(<bang>0)
fu! QFixToggle(forced)
   if exists("g:qfix_win") && a:forced == 0
      cclose
      unlet g:qfix_win
   else
      copen 10
      let g:qfix_win = bufnr("$")
   en
endf
nn        <leader>q :QFix<cr>


            nmap to “q” , the default <leader> key is “”
9.
Helpful Settings
Should we re-indent code
       manually ?
PerlTidy++
:set equalprg=perltidy
:set equalprg=perltidy

 to re-format a region , set perltidy as your reformater

              then press “=” , it will pass to perltidy
autocmd Filetype perl :set equalprg=perltidy


                 when filetype is perl
             use autocmd to set equalprg
to reformat SQL ,
we have SQL::Beautify module
SQL::Beautify
 $ cat bin/sql-beautify.pl
 #!/usr/bin/env perl
 use warnings;
 use strict;
 use SQL::Beautify;
 local $/;
 my $sql = SQL::Beautify->new( query => <STDIN> , spaces =>
 4 , break => "n" );
 print $sql->beautify;


autocmd Filetype sql :set equalprg=sql-beautify.pl

  command! -range SQLF :'<,'>!/Users/c9s/bin/sql-beautify.pl
HTML Entities      $ cat bin/html-entities.pl
                   use HTML::Entities;
                   for ( <STDIN> ) {
                      print encode_entities( $_ ) . "n";
                   }
command! -range Entities :'<,'>!/Users/c9s/bin/html-entities.pl


              " <a href="">YAPC ASIA</a>


&quot; &lt;a href=&quot;&quot;&gt;YAPC ASIA&lt;/a&gt;
Morse Encoder
    use Convert::Morse qw(as_ascii as_morse is_morsable);
    print as_morse( $_ ) . “n” for ( <STDIN> );

command! -range Morse :'<,'>!/Users/c9s/bin/morse-encode.pl

                sub handler_start {
                  my ( $kernel, $heap, $session ) = @_[ KERNEL, HEAP, SESSION ];
                  print "Session ", $session->ID, " has started.n";
                  $heap->{count} = 0;
                  $kernel->yield('increment');
                }

        ... ..- -... .... .- -. -.. .-.. . .-. ..--.- ... - .- .-. - {
             -- -.-- -.--. $-.- . .-. -. . .-.. --..-- $.... . .- .--. --..-- $... . ... ... .. --- -. -.--.- -...- .--.-. ..--.- [ -.-
             .--. .-. .. -. - .-..-. ... . ... ... .. --- -. .-..-. --..-- $... . ... ... .. --- -. -....- >.. -.. --..-- .-..-. .... .- .
             $.... . .- .--. -....- >{-.-. --- ..- -. - } -...- ----- -.-.-
             $-.- . .-. -. . .-.. -....- >-.-- .. . .-.. -.. -.--. .----. .. -. -.-. .-. . -- . -. - .----. -.--.- -.-.-
        }
source code
  traverse
Case:
    use Data::Dumper;

         we need to find Data/Dumper.pm in @INC
                   then type something like
        $ vim /opt/local/..../site_perl/Data/Dumper.pm
fu! GetCursorModuleName()
  let cw = substitute( expand("<cWORD>") , '.{-}((w+)(::w+
)*).*$' , '1' , '' )
  return cw
endfunction


fu! TranslateModuleName(n)
  return substitute( a:n , '::' , '/' , 'g' ) . '.pm'
endf



fu! GetPerlLibPaths()
  let out = system('perl -e ''print join "n",@INC''')
  let paths = split( out , "n" )
  return paths
endf
fu! FindModuleFileInPaths()
  let paths = GetPerlLibPaths()
  let fname = TranslateModuleName(    GetCursorModuleName()   )
  let methodname = GetMethodName()

  if TabGotoFile( 'lib/' .   fname , methodname )
    return
  endif

  for p in paths
    let fullpath = p . '/' . fname
    if TabGotoFile( fullpath , methodname )
      break
    endif
  endfor
endfunction

nmap <leader>fm :call FindModuleFileInPaths()<CR>
         type “fm” rather than type $ perldoc ‐m Module::Name
Install CPAN Module from <cWORD>
 nmap <C-x><C-i> :call InstallCPANModule()<CR>
 function! InstallCPANModule()
   let l = getline('.')
   let cw = substitute( expand('<cWORD>') , ";$" , "" , "g" )
   let cw = substitute( cw , "['"]" , "" , "g" )
   echo "Installing CPAN Module: " . cw . "n"
   silent exec "!cpanp i " . cw . " >& /dev/null"
   echo "Donen"
 endfunction
Skeletons

au bufnewfile *.pl 0r ~/.vim/skeleton/template.pl
au bufnewfile *.pod 0r ~/.vim/skeleton/template.pod
au bufnewfile *.pm 0r ~/.vim/skeleton/template.pm
more than one skeleton for perl code

fu! ReadTemplate()
  let sname = input( "template type:" )
  exec '0r ~/.vim/skeleton/perl/' . sname .
'.pl'
endf
command! NewFromSkeleton :call ReadTemplate()
nm cr= ^f=cf;
nm cl= ^f=c^
Pod Helper
fu! PodHelperFunctionHeader()
  let subname = substitute( getline('.') , 'subs+(w+)s
+.*$' , '1' , "" )
  let lines = [
          '=head2 ' . subname ,
          '' ,
          '' ,
          '' ,
          '=cut' ,
          '',
         ]
  for text in lines
     :call append( line('.') - 1 , text )
  endfor
  :call cursor( line('.') - len( lines ) + 2 , 1 )
endf
nmap <leader>pf :call PodHelperFunctionHeader()<CR>
abbr _perlbin #!/usr/bin/env perl
         abbr _s $self
detect features
if has('perl')

endif

if has(‘netbeans_intg’)

endif
crossplatform settings
 if has('mac')

 elseif has(‘win32’)

 elseif has(‘unix’)

 endif
if you compiled vim
      with perl
function! WhitePearl()
perl << EOF
     VIM::Msg("pearls are nice for necklaces");
     VIM::Msg("rubys for rings");
     VIM::Msg("pythons for bags");
     VIM::Msg("tcls????");
EOF
endfunction
:perl $a=1
:perldo $_ = reverse($_);1
:perl VIM::Msg("hello")
:perl $line = $curbuf->Get(42)
:perl   VIM::Msg("Text")                # displays a message
:perl   VIM::Msg("Error", "ErrorMsg")   # displays an error message
:perl   VIM::Msg("remark", "Comment")   # displays a highlighted message
:perl   VIM::SetOption("ai")            # sets a vim option
:perl   $nbuf = VIM::Buffers()          # returns the number of buffers
:perl   @buflist = VIM::Buffers()       # returns array of all buffers
:perl   $mybuf = (VIM::Buffers('qq.c'))[0] # returns buffer object for 'q
:perl   @winlist = VIM::Windows()       # returns array of all windows
:perl   $nwin = VIM::Windows()          # returns the number of windows
:perl   ($success, $v) = VIM::Eval('&path') # $v: option 'path', $success
:perl   ($success, $v) = VIM::Eval('&xyz') # $v: '' and $success: 0
:perl   $v = VIM::Eval('expand("<cfile>")') # expands <cfile>
:perl   $curwin->SetHeight(10)          # sets the window height
:perl   @pos = $curwin->Cursor()        # returns (row, col) array
:perl   @pos = (10, 10)
:perl   $curwin->Cursor(@pos)           # sets cursor to @pos
:perl   $curwin->Cursor(10,10)          # sets cursor to row 10 col 10
11.
Plugins
perlprove.vim
 parse test output to quickfix window

        ':make *t', or ':make t'
SnipMate
snippet cla class .. initialize .. end
    class ${1:`substitute(Filename(), '^.', 'u&', '')`}
        def initialize(${2:args})
            ${3}
        end

    end
                                code snippet
DBExt.vim
Database extension support
  Oracle, Sybase, MSSQL ,
     MySQL, DBI etc..
xml.vim
 xml related
FuzzyFinder.vim
 Fuzzy/Partial pattern explorer
The_NERD_TREE.vim
    Directory Tree Explorer
The NERD Commenter
     Comment Helper
taglist.vim
     ctags
macro , function , variable
autocomplpop.vim
MRU
most recently used
bufexplorer.vim
    Buffer Explorer
git-vim
vimrc
http://oulixe.us/_vimrc
http://oulixe.us/_gvimrc
The old way to
install vim scripts
Perl.Hacks.On.Vim
Perl.Hacks.On.Vim
Perl.Hacks.On.Vim
Perl.Hacks.On.Vim
Download
Read Install details
Read Install details
             Awful!
Awful!
Perl.Hacks.On.Vim
Vimana
  Vim script Manager
• Vimball
• Archive File ( zip , rar )
• .vim extension file
• Cache::File
• App::CLI
• Archive::Any
• ...etc
it’s on CPAN


 $ cpan Vimana
$ vimana search xml
$ vimana search xml
rrd.vim             - Edit RRD data with Vim.
qt.vim              - tiny tool for the uic used in Qt from
Trolltech
syntax-for-xul      - Highlighting for XML User interface Language.
maven2.vim          - Compiler plugin for maven2
 .... skip
$ vimana info xml.vim
$ vimana install xml.vim
$ vimana   install   xml.vim
$ vimana   install   rails.vim
$ vimana   install   the-nerd-tree.vim
$ vimana   install   taglist.vim
$ vimana   install   snipmate
$ vimana   install   fuzzyfinder.vim
etc ...
                               ALL Works
Future Plan

• upgrade
• remove
• config
• support makefile
Git Repository
http://github.com/c9s/Vimana/tree/master
ENJOY
Thank You

More Related Content

Perl.Hacks.On.Vim