sponsor Vim development Vim logo Vim Book Ad

basic Tip #141: Add your function heading with a keystroke

 tip karma   Rating 78/29, Viewed by 2290 

created:   October 18, 2001 22:36      complexity:   basic
author:   Mohit Kalra [email protected]      as of Vim:   5.7

Below is a tip that the C/C++ Newbies may find interesting and handy to use.  The following code will add a function heading and position your cursor just after Description so that one can document as one proceeds with code.

function FileHeading()
let s:line=line(".")
call setline(s:line,"/***************************************************")
call append(s:line,"* Description - ")
call append(s:line+1,"* Author -      Mohit Kalra")
call append(s:line+2,"* Date -        ".strftime("%b %d %Y"))
call append(s:line+3,"* *************************************************/")
unlet s:line
endfunction

imap <F4>  <esc>mz:execute FileHeading()<RET>`zjA

Where <esc> stands for ^V+ESC and <RET> for ^V+ENTER

 rate this tip  Life Changing Helpful Unfulfilling 

<<tip using embedded perl interpreter | Automatic function end commenting for C++ and Java >>

Additional Notes

indiaguru100 at yahoo.com, November 6, 2002 11:39
Hi:

What key has to be typed for this to be working. I am fairly new to this board.
imap <F4> mz:execute FileHeading()`zjA

The last 3 chars (zjA) is it typo ? or I have to include in file?

mohit kalra, November 8, 2002 6:23
to get this working type F4 in insert mode.  
the `zja is not a typo.  Observe that :
1.  mz is actually marking the first line that is inserted becoz of this macro.  That is, it remembers the position of /******
2.  `z actually takes the cursor to that marker.  
3.  j will take you one line below that marked line.
4.  A will put you in Append mode at the end of the line where the cursor is.
Effectively, you have a cursor that is in insert mode and is positioned right after "Description" so that you can type it then and there itself.  

HTH
Filip K., November 4, 2003 14:44
Very nice tip - it can be used generally everywhere you need some one-stroke-large-block-of-text-inserting. This includes all programming languages and much more.
I was wondering however if you can insert some block of text as a header for a newly created file? I am thinking about inserting a header like the one show in the tip every time I create a ".java" file.
appstate.edu, February 18, 2004 21:52
"I was wondering however if you can insert some block of text as a header for a newly created file?"

Put this in your .vimrc file

:autocmd BufNewFile,BufRead *.java <vim command that you want run>

I use it to read a stored program heading into my programs
:autocmd BufNewFile,BufRead *.C r ~/style/mainh

D
stuart.vim at smgsystems.co.uk, March 24, 2004 9:15
Is there any way to take input from the keyboard when creating these headers?

I have one set up for functions and classes and it would be great if it asked me for the function name when creating it.
andysailing at yahoo.com, October 26, 2004 7:35
Not sure if this is of use to you and I apologise since it's not the nicest or most elegant way of doing things, but a way to get text you type automatically inserted into code is by using a combination of command and functions.

here's one I wrote for a friend whose messing around with c# and getting bored of writing!:-

### put the following in you vimrc

command -nargs=+ CSprop :call Prop(<f-args>)

## function to do the business!

function Prop(return,property,name)
   normal o<Esc>
   let currline = line(".")
   call setline(currline, "public " . a:return . " " . a:property)
   normal o<Esc>
   let currline = currline + 1
   call setline(currline, "{")
   normal o<Esc>
   let currline = currline + 1
   call setline(currline, "\tget { return this." . a:name . "; }")
   normal o<Esc>
   let currline = currline + 1
   call setline(currline, "\tset { this." . a:name . " = value; }")
   normal o<Esc>
   let currline = currline + 1
   call setline(currline, "}")
endfunction

...so now, with that loaded in when you type the following command in VIM

:CSprop returnval propval nameval

the following text will be inserted in your script:-

public returnval propval
{
get { return this.nameval; }
set { this.nameval = value; }
}

hope that helps :)

Andy
haritha_gr at , January 27, 2005 12:05
when i use command similar to the one below to add stored header to my new program file, it works. However every time i reopen the file, the header is getting added, which is not i want.  What is going wrong here?

:autocmd BufNewFile,BufRead *.C r ~/style/mainh yahoo.com
r.connell at unb.ca, March 29, 2005 17:11
Remove BufRead
fpgabuilder-vim at yahoo.com, October 20, 2005 14:32
Can someone please help me with the errors that I see with Mohit's function? I get the following error when I use the script as is -

1. When I hit "F4" (one key) in insert mode I see the following line appear in the command mode -
:execute FileHeading()<RET>`zjA
2. Then the lines are added to the file but VIM complains that -
E121: Undefined variable: RET
E15: Invalid Expression: FileHeading()<RET>`zjA

TIA
-sanjay
Eco_15 at yahoo.com, November 12, 2005 6:38
Instead of using <RET> user <CR>
  -->imap <F4> <esc>mz:execute FileHeading()<CR>`zjA
Eco_15 at yahoo.com, November 12, 2005 6:38
Instead of using <RET> use <CR>
  -->imap <F4> <esc>mz:execute FileHeading()<CR>`zjA
If you have questions or remarks about this site, visit the vimonline development pages. Please use this site responsibly.
Questions about Vim should go to [email protected] after searching the archive. Help Bram help Uganda.
Sponsored by Web Concept Group Inc. SourceForge Logo