downloaded - steve oualline, the practical programmer
TRANSCRIPT
![Page 1: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/1.jpg)
1
Advanced VimSyntax
Programmingand
Scripting
![Page 2: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/2.jpg)
2
Announcement
Managements requests that all the Emacs chauvinist in the audience refrain from arguing with the Vim chauvinist on stage concerning which editor is better.
Such arguments are generally considered intellectual combat between two unarmed opponents.
![Page 3: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/3.jpg)
3
Topics
● Programming the Syntax Engine● Creating keyboard macros● Using the :map command● Basic Functions● Creating a simple function● Connecting the editor and the function● Combining syntax coloring and function
definitions.
![Page 4: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/4.jpg)
4
Topics
● Perl Programming● Advanced Features
![Page 5: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/5.jpg)
5
The Instructor
Steve Oualline● Author of “Vim (Vi Improved)”● Contributed tutorial text material to the
Vim project● Website http://www.oualline.com● E-Mail: [email protected]
![Page 6: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/6.jpg)
6
Cheat Sheets
● You should all have a copy of the cheat sheets showing the scripts and examples being discussed here.
● These will be referenced throughout the tutorial.
● Cheat sheets and slides can be downloaded from:
http://www.oualline.com/vim.talk
![Page 7: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/7.jpg)
7
Programming the Syntax Engine
![Page 8: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/8.jpg)
8
Cheat Sheet Time
● We will be discussing
1) syntax.sl – Sample file written in a strange language.
2) syntax.vim – Syntax coloring rules for “sl”
![Page 9: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/9.jpg)
9
Getting Started
Clear out the old syntax
:syntax clear
Tell Vim if the language is case sensitive
:syntax case ignore:syntax case match
![Page 10: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/10.jpg)
10
Highlight
● To see the names of the various highlight groups
:highlight● To define your own
:highlight StrangeWord \ guifg=purple
\ guibg=yellow● (Many more options available)
![Page 11: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/11.jpg)
11
Define Some Keywords
To define a keyword
:syntax keyword LangWord if then
Use a different highlight for system functions.
:syntax keyword Function print
Defining a keyword
Highlightto use
The keywords
![Page 12: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/12.jpg)
12
Define elements that match a regular expression
Define a match for an identifier
:syntax match Identifier
\ /[_a-zA-Z][_a-zA-Z0-9]*/
Now define an element that matches numbers.
:syntax match Number /[0-9]\+/
![Page 13: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/13.jpg)
13
Defining a region
Comments start with “comment”
End with “end-comment”
Vim syntax definition is:
:syntax region Comment
\ start=/comment/
\ end=/end-comment/
![Page 14: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/14.jpg)
14
Defining a string
The problem:
“String with \” in it”
The solution
:syntax region String \ start=/"/ end=/"/
\ skip=/\\"/
![Page 15: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/15.jpg)
15
Highlighting TODO in comments
Define the region to be highlighted, but only if “contained” in another element
:syntax region Todo \
\ start=/TODO:/ end=/$/\ contained
![Page 16: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/16.jpg)
16
Highlighting TODO in comments
Tell Vim that a comment can contain a TODO:
:syntax region Comment
\ start=/comment/ \ end=/end-comment/
\ contains=Todo
![Page 17: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/17.jpg)
17
Defining a one line syntax element
Normally matches span lines. But with the “oneline” option they do not.
:syntax region PreProc
\ start=/^#/ \ end=/$/ oneline
![Page 18: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/18.jpg)
18
Continuation Lines
Revised PreProc – Notice contains clause.
:syntax region PreProc\ start=/^#/ end=/$/
\ oneline\ contains=LineContinue
● Note: You must clear out the old PreProc definition before using this:
:syntax clear PreProc
![Page 19: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/19.jpg)
19
Continuation Lines
Define continuation line
:syntax match LineContinue\ /\\\n.*/ contained
Since this can contain a newline it continues the previous line.
![Page 20: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/20.jpg)
20
Fixing the highlight the same
Highlight both syntax elements the same.
:highlight link\ LineContinue PreProc
![Page 21: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/21.jpg)
21
Extreme Syntax Coloring
● Rainbow.vim – Syntax coloring to highlight nested parenthesis.
● Use the option matchgroup to indicate the group ends match one highlight and the body another.
![Page 22: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/22.jpg)
22
Autoloading Syntax Files
● Local Syntax files go in
$VIMRUNTIME/syntax/<l>.vimWhere <l> is the language name (as
defined by the filetype option)
Note: Filetype is controlled by the file:
$VIMRUNTIME/filetype.vim
![Page 23: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/23.jpg)
23
Syntax Help
● To get information about how to write a syntax file use the command:
:help :syntax● This file also describes the language
specific options. For example the C specific options c_gnu
![Page 24: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/24.jpg)
24
C Specific Options
● c_gnu
GNU gcc specific items● c_comment_strings
strings and numbers inside a comment
● c_space_errors
trailing white space and spaces before a <Tab>
![Page 25: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/25.jpg)
25
Advanced Syntax Items
● Any item which contains @Spell will be spell checked.
● Any item which contains @NoSpell will not be spell checked.
![Page 26: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/26.jpg)
26
Keyboard Macros and Mapping
![Page 27: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/27.jpg)
27
Cheat Sheet Time
● Follow along in
i-map.vim
![Page 28: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/28.jpg)
28
Keyboard Macro Example
The problem change lines like:
foo.hinto
#include <foo.h>for lots of lines.
![Page 29: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/29.jpg)
29
Keyboard Macros
q{register} Record commands into a register
{commands} Execute commands
q End recording
@{register} Execute keyboard macro
![Page 30: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/30.jpg)
30
Keyboard Macro Example
qa – Start recording in register a
^ – Go to beginning of line
i#include < esc – Insert #include
A> esc – Append > to the end of the line
j – go to the next line (Important)
q – Stop recording macro
![Page 31: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/31.jpg)
31
Keyboard Macro Example
After recording use the command
@ato execute it.
To execute 5 times
5@a
![Page 32: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/32.jpg)
32
Keyboard Macros
● Advantages
QuickSimple
● Disadvantages
LimitedTemporary
Impossible to Edit (almost)
![Page 33: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/33.jpg)
33
Mapping
Make a mapping out of the macro
:map <F11> ^i#include <lt><ESC>A><ESC>j
(one line)
<F11> -- Key name
Rest of the line is the macro
<lt> -- Less than (there is no <gt>)
![Page 34: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/34.jpg)
34
Making it Permanent
● To automatically define this mapping when Vim starts put it in the file
$HOME/.vimrc
![Page 35: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/35.jpg)
35
Modes and Mapping
● :cmap – Command line mode● :imap – Insert mode only● :lmap – Inputing a language dependent
argument for command mode or insert mode.
● :map – Normal, visual, select, operator pending.
● There's more
![Page 36: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/36.jpg)
36
Modes and Mapping
● :map! – Command line and insert● :nmap – Normal● :omap – Operator pending● :smap – Select● :vmap – Visual and select● :xmap – Visual
![Page 37: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/37.jpg)
37
Mapping and modes
How the different mappings work● Normal mode
:map <F11> ^i#include <lt><ESC>A><ESC>j
● Insert mode
:imap <F11> <ESC>^i#include <lt><ESC>A>
![Page 38: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/38.jpg)
38
Adding it to the menu
Adding it to the menu of gvim.
:menu 40.290 &Tools.&Include<Tab>F11
<F11>
(one line)
![Page 39: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/39.jpg)
39
Adding it to the menu
:menu 40.290 &Tools.&Include<Tab>F11
<F11>
(one line)
Menu Priority Submenu
Priority
![Page 40: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/40.jpg)
40
Adding it to the menu
:menu 40.290 &Tools.&Include<Tab>F11
<F11>
(one line)
Top Level Menu Name Literal
(5 character)
Keyboard equivalent
![Page 41: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/41.jpg)
41
Finding Out What's in a Menu
● List all menu items
:menu● List the Tools menu
:menu Tools● List only our entry
:menu Tools.Include
![Page 42: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/42.jpg)
42
Vim Scripting Syntax
![Page 43: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/43.jpg)
43
Cheat Sheet
● We're now going through the file:
i-call.vim
![Page 44: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/44.jpg)
44
Variable Types
● Variable names follow the usual rules (case sensitive)
● Assignment
:let foo = “hello”
:echo foo
![Page 45: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/45.jpg)
45
Prefixes denote name space
<none> -- In a function, local. Outside a function, global.
b: -- Buffer specific
w: -- Window Specific
t: -- Tab Specific
g: -- Global
![Page 46: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/46.jpg)
46
Prefixes denote name space
l: -- Local to a function
s: -- Local to a script
a: -- Function argument
v: -- System defined variable
![Page 47: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/47.jpg)
47
Other types of “variables”
&option – The value of an option. The local version is checked first, the the global.
&l:option – Local version of the option.
&g:option – Global option
@register – Register
$ENV – Environment variable
![Page 48: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/48.jpg)
48
Variable Variable Names
● If {} are used in a variable name, the value of the variable inside the {} becomes part of the name:
:let sam_name = “Sam”:let joe_name = “Joe”
:let who = “joe”
:echo {who}_name
![Page 49: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/49.jpg)
49
Expression Syntax
● Mostly the usual operators (+, -, *, etc.)● Regular Expression comparison
str =~ “re”
![Page 50: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/50.jpg)
50
String Comparison
● String compare, case insensitive
str ==? “value”● String compare case sensitive
str ==# “value”● String compare, maybe ignore case
(depending on 'ignorecase' option)
str == “value”
![Page 51: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/51.jpg)
51
Sub-string expressions
● Single character
echo str[5]● Substring
echo str[3:5]● Next to last character
echo str[-2:-2]● Character 5 on
echo str[5:]
![Page 52: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/52.jpg)
52
“Include” Macro As a Function
:function! Include(): " Get the current line: let l:line = getline(".")
: " Put the #include in the right place: let l:line = "#include <".l:line.">"
: " Replace the line: call setline(".", l:line):endfunction
![Page 53: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/53.jpg)
53
Defining the Function
● Functions names must begin with a capitol.
● The force (!) operator allows us to redefine an existing function.
:function! Include()....
:endfunction
![Page 54: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/54.jpg)
54
Get the line
● Comments begin with “. Makes it hard to comment a string assignment.
● “.” is the current line. Assign it to a local variable (l:line)
: " Get the current line: let l:line = getline(".")
![Page 55: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/55.jpg)
55
Add on the #include stuff
● The dot (.) operator concatenates strings.
:" Put the #include in :” the right place
:let l:line =
\ "#include <".l:line.">"
![Page 56: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/56.jpg)
56
Replace the line with the new one
● Replace the line with the new one.● Again “.” is the current line number.
: " Replace the line: call setline(".", l:line)
![Page 57: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/57.jpg)
57
Calling the Function
● To call the function, type:
:call Include()
● But that's too difficult, so let's map it:
:map <F11> :call Include()<CR>
![Page 58: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/58.jpg)
58
Initializing Vim's GUI
● We will be putting our macro in the top level menu. This must be done before the menu is built.
● To run a script before the GUI is done:
gvim -U macro-file file
![Page 59: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/59.jpg)
59
Initializing Vim's GUI
● All top level menu commands are ignored after the GUI is built.
● If you want it to load automatically put it in:
$HOME/.gvimrc● WARNING: Do not put it in .vimrc, it won't
work
![Page 60: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/60.jpg)
60
Diversion: Initialization Problems
● Vim starts in Vi compatibility mode. (Yuck)
● In Vi mode <F11> is 5 characters, not a function key.
![Page 61: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/61.jpg)
61
Initialization Solutions
● Save the compatibility options, then set them to the Vim defaults
" Save options
:let s:cpo_save = &cpo:set cpo&vim
● ... at the end restore them
:let &cpo = s:cpo_save
:unlet s:cpo_save
![Page 62: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/62.jpg)
62
Problem: -U skips .gvimrc
● The file you specify with -U skips the .gvimrc
● Solution #1. Two -U
–gvim -U m.vim -U ~/.gvimrc
![Page 63: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/63.jpg)
63
Problem: -U skips .gvimrc
● Solution #2. Source it at the end of your file:
:let &cpo = s:cpo_save
:unlet s:cpo_save:source ~/.gvimrc
![Page 64: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/64.jpg)
64
Putting the command in the menu
:menu 40.290
\ &Tools.&Include<Tab>\ call\ Include()
\ :call Include() ● But there is a problem. The commands
disappear in some modes
![Page 65: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/65.jpg)
65
The Mode Problem
● Normal Mode ● Insert Mode
![Page 66: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/66.jpg)
66
Let's look at what :menu did
:menu Tools.Include
--- Menus ---290 &Include^I:call Include()
n :call Include()<CR>
v :call Include()<CR>
s :call Include()<CR>
o :call Include()<CR>
![Page 67: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/67.jpg)
67
Define a menu item for all modes
:amenu 40.295
\ &Tools.&Include(a)<Tab>
\ call\ Include() \ :call Include()
![Page 68: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/68.jpg)
68
Our menu looks different
:amenu Tools.Include(a)
--- Menus ---
295 &Include(a)^I:call Include()
n :call Include()<CR>
v <C-C>:call Include()<CR><C-\><C-G>
s <C-C>:call Include()<CR><C-\><C-G>
o <C-C>:call Include()<CR><C-\><C-G>
i <C-O>:call Include()<CR>
c <C-C>:call Include()<CR><C-\><C-G>
Press ENTER or type command to continue
![Page 69: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/69.jpg)
69
What's happening
v <C-C>:call Include()<CR><C-\><C-G>
V – Visual mode
<C-C> -- Exit visual mode
:call Include() -- The command
<C-\><C-G> -- Back go previous mode
![Page 70: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/70.jpg)
70
What's happening
i <C-O>:call Include()<CR>
i – Insert mode
<C-O> -- Execute a single normal mode code, then go into insert mode.
:call Include() -- The command
![Page 71: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/71.jpg)
71
Adding it to the popup menu
● Add the call to the menu which pops up when you press the right menu button.
:amenu 1.5
PopUp.&Include:call\ Include() :call Include()
(one line)
● WARNING: You must have enable the popup
:set mousemodel=popup
![Page 72: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/72.jpg)
72
The new popup menu
![Page 73: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/73.jpg)
73
Putting the command in the toolbar
● The menu “Toolbar” is the top level tool bar.
● You can include an icon specification in the menu command as well as the normal stuff.
:amenu icon=/home/sdo/vim /include/include.xpm 1.1 ToolBar.Include :call Include()
(one line)
![Page 74: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/74.jpg)
74
Adding a tool tip to the toolbar icon
:tmenu ToolBar.Include
\ Put in the #include line
![Page 75: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/75.jpg)
75
Creating a top level menu
● Creates a top level menu C-Tools with a single item
:amenu 30
\ &C-Tools.Include<Tab>F11\ :call Include()
![Page 76: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/76.jpg)
76
Enabling and disabling the menu
● Enable
:menu enable &C-Tools
● Disable
:menu disable &C-Tools
![Page 77: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/77.jpg)
77
The function to enable or disable the C-Tools menu
Depending on file type (&ft) enable the menu
:function CMenuCheck(): if ((&ft == "c") || (&ft == "cpp")): :menu enable &C-Tools: else: :menu disable &C-Tools: endif:endfunction
![Page 78: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/78.jpg)
78
Automatically Calling the function
● Automatically call the function when a buffer is entered.
:autocmd Bufenter *
\ :call CmenuCheck()● Call it when the file type changes
:autocmd FileType *
\ :call CMenuCheck()
![Page 79: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/79.jpg)
79
Cheetsheet time
● We've now moved on to:
i-cmd.vim
![Page 80: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/80.jpg)
80
Creating a new command
● Defining a user command to do the includes
:command! -nargs=0
-range Include :call IncludeRange(
<line1>, <line2>)(one line)
![Page 81: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/81.jpg)
81
Defining a command
:command! -- Define a user command
-nargs=0 – Number of arguments
-range – Can take a line range as input
Include – Name of the command (User commands must start with upper case letter)
:call.... -- Command to execute
<line1>, <line2> -- Start / Ending lines for the command.
![Page 82: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/82.jpg)
82
Definition of IncludeRange with debugging code
:function! IncludeRange(first_line, last_line): let l:cur_line = a:first_line:: while (l:cur_line < a:last_line) : call setpos('.', [0, l:cur_line, 0, 0]): call Include()" Debug stuff:echo l:cur_line:redraw:sleep 5: let l:cur_line = l:cur_line + 1: endwhile:endfunction
![Page 83: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/83.jpg)
83
Starting off
● Function takes two arguments, a first line and a last line.
:function! IncludeRange(first_line, last_line)
● Define a variable to loop through the lines: let l:cur_line = a:first_line
![Page 84: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/84.jpg)
84
Move the Cursor to the given line
● Loop through each line: while (l:cur_line < a:last_line)
● Move the cursor ('.') to the given
[buffer, line, character, offset]
: call setpos('.', [0, l:cur_line, 0, 0])
● Call the Include() function
: call Include()
![Page 85: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/85.jpg)
85
Debug Stuff
● Print the current line● Redraw the screen (show partial progress)● Sleep for 5 seconds (to make sure we can
see what happened)" Debug stuff:echo l:cur_line:redraw:sleep 5
![Page 86: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/86.jpg)
86
Finishing Up
● Finishing up
: let l:cur_line = l:cur_line + 1: endwhile:endfunction
![Page 87: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/87.jpg)
87
Defining a better command
:command! -nargs=0
-range Include2
<line1>, <line2>:call Include()
(one line)● If a <range> is specified for :call, then
the function is called once for each line.
![Page 88: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/88.jpg)
88
Review: What we can do with functions
1. Call them directly (:call)
2. Map them to a key (:map)
3. Put them in the menu (:amenu)
4. Put them in the toolbar (:amenu toolbar)
5. Put them in the popup menu (:amenu popup)
6. Create a user command to call them (:command)
![Page 89: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/89.jpg)
89
Improving the Include function
● Checks local directories for the file● If local puts in #include “file.h”● Checks system directories● If found puts in #include <file.h>
![Page 90: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/90.jpg)
90
Cheat Cheat
● Moving on we reach the cheat sheet
i-fancy.vim
![Page 91: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/91.jpg)
91
Improved Include function
First some definitions
" System include dirs:let g:SystemIncludes = [\ "/usr/include",..... \]" Local includes follow:let g:LocalIncludes = [...
![Page 92: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/92.jpg)
92
Define the function
● Some starting code to get the line
:function! Include()
: " Get the current line
: let l:line = getline(".")
![Page 93: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/93.jpg)
93
Loop through the dirs
: for l:cur_dir in g:LocalIncludes
: if (filereadable(l:cur_dir."/".l:line))
: let l:line =
\ "#include \"".l:line."\""
: call setline(".", l:line)
: return
: endif
: endfor
● Do the same thing for the system dirs
![Page 94: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/94.jpg)
94
Debugging the function
● To start the debugger
:debug call Include()● Debugging commands
:echo – Display expression
:step – Single Step:next – Skip over function
![Page 95: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/95.jpg)
95
Debugging the function
● Setting a breakpoint
:breakadd func <line> <function>
![Page 96: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/96.jpg)
96
Debugging Commands
● Running a command with the debug:
:debug call Include()● Turning on the verbose chatter:
:16verbose call Include()● Setting the verbose level:
:set verbose=16
![Page 97: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/97.jpg)
97
Saving the output
● To log the output
:redir! >log.txt● To stop logging
:redir END
![Page 98: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/98.jpg)
98
The Configuration Problem
● We must configure the thing by setting two global variables.
● There is a Vim option called path. Why can't we use that?
![Page 99: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/99.jpg)
99
Cheat Sheet
● Almost done with include. Take a look at:
i-path.vim
![Page 100: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/100.jpg)
100
Revised Function
● Turn the path option (&path) into a list of directories.
:let l:dir_list =
\ split(&path, ",")
![Page 101: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/101.jpg)
101
Revised Function
● Loop through each entry looking for the file
:for l:cur_dir in l:dir_list
:if (filereadable(
l:cur_dir."/".l:line))
![Page 102: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/102.jpg)
102
Revised function
● System directory?
if (match(l:cur_dir,\ "/usr/include") == 0)
: let l:line =
\ "#include <".l:line.">"
![Page 103: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/103.jpg)
103
Demonstration of Fancy Include
Function
![Page 104: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/104.jpg)
104
GUI Version of the Include
● This version asks you which type of include (system, local) you want and does the work accordingly.
![Page 105: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/105.jpg)
105
Cheat Sheet
● The cheat sheet for this is
i-gui.vim
![Page 106: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/106.jpg)
106
Displaying a Dialog Box
● Let's display a dialog box with three choices:
: let l:choice =confirm("What type of #include is ".l:line."?",
"&System\n&Local\nNo \&Change")
![Page 107: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/107.jpg)
107
The Dialog Box
![Page 108: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/108.jpg)
108
confirm() return values
1. System
2. Local
3. No Change
0. Dialog was closed manually
![Page 109: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/109.jpg)
109
Dealing with the result
: if (l:choice == 1): let l:line = "#include <".l:line.">": call setline(".", l:line): return: elseif (l:choice == 2): let l:line = "#include \"".l:line."\"": call setline(".", l:line): return: elseif (l:choice == 3) : return: elseif (l:choice == 0): throw "WARNING: You closed the dialog!": else: throw "ERROR: There is no choice ".l:choice." Huh?"
: endif
![Page 110: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/110.jpg)
110
Demonstration
GUI Based #include generator
![Page 111: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/111.jpg)
111
Congradulations
#include is now exhausted
![Page 112: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/112.jpg)
112
Java Editing Function
● Define a function to make Java editing easier
● Automatically adds the “getter” for a java program.
![Page 113: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/113.jpg)
113
Cheat Sheet
● Our first java cheat sheets:
g1.vimbean.java
![Page 114: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/114.jpg)
114
Java – Adding the getter
● What we have
class bean {
private int value;};
![Page 115: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/115.jpg)
115
What we want
class bean {
private int value;
public int getValue() {
return (value); }
};
![Page 116: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/116.jpg)
116
Algorithm
1. Parse the line under the cursor. Determine the variable's name and type.
2. Search backward for “class”
3. Search forward for “{“
4. Finding matching “}”
5. Insert the getter code.
![Page 117: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/117.jpg)
117
1. Parsing the line
:function! Getter(): " Get the line defining the variable: let l:var_line = getline('.')
: let l:prot = substitute(l:var_line, '\v^\W*(\w+)\W+.*$', '\1', '')
: let l:type = substitute(l:var_line, '\v^\W*\w+\W+(\w+)\W+.*$', '\1', '')
: let l:var = substitute(l:var_line, '\v^\W*\w+\W+\w+\W+(\w+).*', '\1', '')
![Page 118: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/118.jpg)
118
Notes on step 1.
● Can you make the regular expressions a little more complex?
A: Absolutely You should see my talk on regular expressions.
● What do they all mean?
A: Use the :match command in Vim to find out. It highlights text matched by a regular expression.
![Page 119: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/119.jpg)
119
Regular Expression Exploded
\v – Make all the following characters special except digits and letters
^ -- Start of line
\W* -- Whitespace (\W) zero or more times (*)
(\w+) -- Place matching item in \1. Word characters (\w), one or more times (+)
![Page 120: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/120.jpg)
120
Regular Expression Exploded
\W+ -- Whitespace (\W) one or more times (+)
.* -- Any character (.) zero or more times (*)
$ -- End of line.
![Page 121: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/121.jpg)
121
A short demonstration of :match
![Page 122: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/122.jpg)
122
Sanity Checking
:if ((l:prot != 'public')
\ && (l:prot != 'private')
\ && (l:prot !=\ 'protected'))
: throw "ERROR: Unable to parse variable line"
:endif
![Page 123: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/123.jpg)
123
2. Reverse search for “class”
:if (search(
\ 'class', 'b') == 0)
: throw "ERROR: ....":endif
![Page 124: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/124.jpg)
124
3. Forward search for “{“
:if (search(
'{', '') == 0)
: throw "ERROR: ....":endif
![Page 125: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/125.jpg)
125
4. Finding the matching “}”
%● Simple wasn't it.
![Page 126: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/126.jpg)
126
5. Compute the function name
● Substitute in l:var● Everything (.*)● Make next (first) character upper case
(\u) and then everything else the same (&)
: let l:fun_name = substitute(l:var,
'.*', '\u&', '')
![Page 127: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/127.jpg)
127
Computing the text to insert
:let l:getter = [" /**",\ " * Get the current value of ".l:var,\ " *",\ " * @returns ".l:var,\ " */",\ " public ".l:type." get".l:fun_name."() {",\ " return(".l:var.");",\ " }"\ ]
![Page 128: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/128.jpg)
128
Insert the text
: let l:where = line('.')
: let l:where = l:where - 1
: call append(\ l:where, l:getter)
![Page 129: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/129.jpg)
129
Demonstration
Live Demo of Getter Version 1
![Page 130: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/130.jpg)
130
For those who came in late
● I am Steve Oualline● Slides and cheat sheets at
–www.oualline.com/vim.talk
![Page 131: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/131.jpg)
131
But what about mean programmers?
class mean {
/* comment with
* “class” in it * and “}” as well
*/ private int value;
![Page 132: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/132.jpg)
132
Cheat Sheet Time
● We now go to the nasty bean and the getter for it.
mean.java
g2.vim
![Page 133: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/133.jpg)
133
Fixing the problem
● We don't have to get clever because Vim already is.
● We just need to look for “class” which is syntax colored as a Java keyword.
● To find the name syntax item the cursor is sitting on:
:echo synIDattr( synID( \ line('.'), col('.'), 1),
\ 'name')
![Page 134: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/134.jpg)
134
Function synID
synID(line, col, trans)● line – Line number of the item● col – Column number of the item● trans – If set transparent items are
reduced to the base syntax
![Page 135: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/135.jpg)
135
Function synIDattr
synIDattr(id, what)● id – The syntax id number● what – What to get ('name' is the name of
the item.)
![Page 136: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/136.jpg)
136
Revised “class” search
:while (1) : if (search('class', 'b') == 0) : throw 'ERROR: Could .....: endif: if (synIDattr(\ synID(line('.'), col('.'), 1),\ 'name') == 'javaClassDecl'): break: endif:endwhile
![Page 137: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/137.jpg)
137
getter Limitations
● Does not handle complex types such as:
java.util.Map foo;● Solution: Better regular expressions
● Does not indent the function properly● Solution: Use Vim's :indent command.
![Page 138: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/138.jpg)
138
Vim and Perl Programming
![Page 139: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/139.jpg)
139
First Lesson of Programming
● Remember Vim has a filter command (!) that let's you filter text through an external program.
● Use that and you don't have to mess around with Vim programming
![Page 140: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/140.jpg)
140
Introducing the Players
● tab.pm – Module containing one function: make_tab.
● Turns a series of lines into column aligned lines.
● tab.pl – Program that passes all it's input through make_tab.
● perl.vim – Interface module between Vim and tab.pm.
![Page 141: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/141.jpg)
141
Getting Started
● The program tab.pl is a stand alone filter that can be run from the command line.
● We can use it (without special work) from withing Vim by using the filter (!) command.
![Page 142: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/142.jpg)
142
First step: Vim and Perl
● Perl is not compiled in by default● Always make sure you have the module
before defining a script
:if ! has('perl')
: throw "ERROR: This version of Vim has no Perl feature"
:endif
![Page 143: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/143.jpg)
143
Perl Related Commands
● Putting Perl Code in Vim
:perl <<EOF... perl code ...
EOF● Filter a set of lines through perl
:<range>perldo <command>
![Page 144: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/144.jpg)
144
Perl / Vim Interface
● Output a message
VIM::Msg(“Hello World”);● Vim also supplies you with a set of
Window and Buffer objects with which to play width:
my $window = $main::curwin;
my ($row, $column) =
$window->Cursor();
![Page 145: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/145.jpg)
145
Getting help
● For information about the Vim/Perl interface:
:help :perl
![Page 146: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/146.jpg)
146
:perl <<EOF# Real work done hererequire 'tab.pm';
sub tab_lines($$) { my $start = shift; my $end = shift; my $cur_buf = $main::curbuf;
my @lines = $cur_buf->Get($start..$end); @lines = make_tab(@lines); $cur_buf->Set($start, @lines);}EOF
![Page 147: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/147.jpg)
147
● Bring in the other module
:perl <<EOF# Real work done hererequire 'tab.pm';
● Define a function with two arguments
sub tab_lines($$) { my $start = shift; my $end = shift;
Initial work
![Page 148: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/148.jpg)
148
● Get the lines, push them through the function, put them back in the buffer
my $cur_buf = $main::curbuf; my @lines = $cur_buf->Get($start..$end); @lines = make_tab(@lines); $cur_buf->Set($start, @lines);
Process the lines
![Page 149: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/149.jpg)
149
Now link the perl function to a Vim command
:command! -nargs=0 -range Table\ :perl tab_lines(\ <line1>, <line2>)
![Page 150: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/150.jpg)
150
Perl Demonstration
![Page 151: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/151.jpg)
151
More Perl / Vim Interface
● Global variables
$main::curwin● The current window object.
$main::curbuf● The current buffer object.
![Page 152: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/152.jpg)
152
Message Functions
● Simple Message
VIM::Msg("Text")Message with highlighting
VIM::Msg(
\ "remark", "Comment")
![Page 153: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/153.jpg)
153
Option Related Functions
● Set option
VIM::SetOption("opt")● Getting an option
my $opt = VIM::Eval(“&opt”);
![Page 154: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/154.jpg)
154
Buffer and Window Information
● Get a list of buffer
@buflist = VIM::Buffers()● Get buffers for a specific file
@buf =
(VIM::Buffers('file'))● Get Window List
@winlist = VIM::Windows()
![Page 155: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/155.jpg)
155
Window Operations● Set height
$window->SetHeight(10)● Get cursor location (row, column)
($row, $col)= $window->Cursor()
● Set cursor location
$window->Cursor($row, $col)● Get the buffer for the window
$mybuf = $curwin->Buffer()
![Page 156: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/156.jpg)
156
Buffer Information
● Get the buffer's name
$name =$buffer->Name()● Get the buffer's number
$number = $buffer->Number()● Get the number of lines in the buffer
$lines = $buffer->Count()
![Page 157: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/157.jpg)
157
Buffer Data
● Get a line or array of lines
$line=$buffer->Get($number)@lines = $buffer->Get( @number_array)
● Setting a line or set of lines$buffer->Set( $number, $line)$buffer->Set($start_number, @line_array)
![Page 158: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/158.jpg)
158
Buffer Data
● Deleting lines
$buffer->Delete($line)$buffer->Delete( $start, $end)
● Adding lines
$buffer->Append( $number, $line)$buffer->Append( $number, @line_array)
![Page 159: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/159.jpg)
159
Advanced Topics
![Page 160: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/160.jpg)
160
Dictionaries
● Defining a dictionary variable
:let g:dict = { “key” : “value”,
“key2” : “value2” }● Getting a value
echo dict[“key”]● Setting a value
let dict[“key3”] = “value3”
![Page 161: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/161.jpg)
161
Exceptions
:try
: “ do something
:catch /ERROR/: “ fix something
:finally : “ Finish up
:endtry
![Page 162: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/162.jpg)
162
Plugins
● Plugins are automatically loaded with Vim starts
● Local Plugins
~/.vim/plugin/file.vim● Global Plugins
$VIMRUNTMIE/plugin/file.vim
![Page 163: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/163.jpg)
163
Special Plugins
● Syntax coloring files
$VIMRUNTIME/syntax/lang.vim● Indentation functions
$VIMRUNTIME/indent/lang.vim
![Page 164: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/164.jpg)
164
Autoloading Functions
Please don't autoloadUnless you really
really have to
![Page 165: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/165.jpg)
165
Autloading
1.Define your functions
:function! CallMe() ....2.Put them in the file:
~/.vim/autoload/file.vim3. Call the function using the magic call:
:call file#CallMe()
![Page 166: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/166.jpg)
166
Improvements Yet to be made
● All scripts can be improved. Here are some things we didn't do in the scripts for this class.
1. Use findfile() to locate the #include instead of going through the directory list one at a time.
2. Use expand('<cword>') to get the word under the cursor in our getter function.
![Page 167: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/167.jpg)
167
Getting Scripts
● The Vim site (http://www.vim.org) contains a link to a script library.
● Lots of scripts of varying quality are available
![Page 168: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/168.jpg)
168
Irony
● This class presented many many different ways of automatically generating #include lines.
● What way does the author use?
:ab #i #include● When #i is typed in Vim, #include will be
inserted.
![Page 169: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/169.jpg)
169
Finally: Remember
Vim is Charity-Ware
![Page 170: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/170.jpg)
170
Please Donate
ICCF Holland - helping children in Uganda
![Page 171: Downloaded - Steve Oualline, The Practical Programmer](https://reader031.vdocument.in/reader031/viewer/2022021008/62039d5ada24ad121e4b7516/html5/thumbnails/171.jpg)
171
Vital Information
1) Please fill out your evaulations.
Vim Class / Steve Ouallinewww.orielly.com/go/os07tuteval
2) Course Materials Can Be Downloaded from:
http://www.oualline.com/vim.talk
3) Donate. For Information, start Vim then enter the command:
:help uganda