Hello,

* On Sat, Jun 24, 2006 at 08:52:47AM +0800, Dr Bean <[EMAIL PROTECTED]> wrote:
> On Fri, 23 Jun 2006, [EMAIL PROTECTED] wrote:
> 
> > PPS: In lh-cpp.tar.gz, you will find many examples of use. The
> > patched, but not yet uploaded, version contains the following
> > context-aware mappings and abbreviations:
> 
> I'm looking forward to seeing those patches.

Done. I'll finish to play with svn latter.

> Your bracketing system is great.

Thanks ^^

> I wish I could only use the repeat "." command to save even
> more typing labor.

That's something I miss too. I'm not sure there is a workaround. We can
always play with recorded macros, or quick'n'dirty mappings.

> >   ...
> >   "--if    insert "if" statement                   {{{
> >     Inoreabbr <buffer> <silent> if <C-R>=Def_AbbrC('if ',
> >     \ '\<c-f\>if (!cursorhere!) {\n!mark!\n}!mark!')<cr>
> 
> [...]
> 'if' is what is expanded.

'if' is what is expanded within comment/string context.

> <C-R>= inserts the results of the Def_AbbrC function,
> which does some whitespace substitutions.

Def_AbbrC() does some other things like:
- adding \n before (,{ and after ),} according to options.
- removing markers/placeholder according to another option.

> [...]
> I don't know what the <c-f> does.

It forces to reindent the line where the cursor is, it works in
INSERT-mode.
I see I have hard-coded <c-f>. It is not the best solution as I should
have used what is defined after the `!' in 'cinkeys'.

> 
> >   "--,if    insert "if" statement
> >     " todo provide smappings
> >     vnoremap <buffer> <silent> <localleader>if
> >     \ <c-\><c-n>@=Surround('if (!cursorhere!) {', '}!mark!',
> >     \ 1, 1, '', 1, 'if ')<cr>
> 
> This allows you to highlight some text, type '\if' and
> hey presto, the text becomes the body of an if statement.

Indeed.
Surround() has also another responsibility. I wrote it before vim7
permit to distinguish between visual-mode mappings and select-mode
mappings. Surround() checks if the current selection is a
marker/placeholder. If so, it expands 'if' in insert-mode (which will
result in the activation of the previous `if' abbreviation), otherwise
it does its surrounding work.
It also accepts some other options regarding reindentation, ...

> [...]

Otherwise, your analysis of my examples are correct.


> One problem I have in using the mappings is in perl many of the
> conditional keywords can be used in 2 ways.  In a compound statement
> 'if' works just like in C. However it may also be used to modify a
> single statement, as in 'print "Hello, world" if 1'.
> 
> I need to work out how to make the mappings context-sensitive to
> this. Like expand 'if' only if it is the first word in the line.

May be, you can look into InsertIfNotAfter() that I define at the end
of ftplugin/cpp/cpp_set.vim (check the newly uploaded lh-cpp.tar.gz
tarball archive). I use it to define the abbreviation for `namespace'
and the mapping on <m-t>.

What you will need is to analyze the lines before the cursor. if the
`if' you are typing starts a new instruction, then you can expand 
`if (!cursorhere!) {\n!mark!\n}!mark!', otherwise just
`if (!cursorhere!);!mark!'.
checking for the previous non comment code can be a little tricky.

> I forgot there is quite a lot of documentation. I need to look at it
> more.

Feel free to ask for any precision.

-- 
Luc Hermitte
http://hermitte.free.fr/vim/

Reply via email to