On Tue 5-Dec-06 10:29pm -0600, Sibin P. Thomas wrote:

> While we are at the subject of tips for budding Vim
> scripters - I had created this mapping -->
>
> nmap com ^:if search('\/\*.*\*\/','c',line("."))!=0<CR>
> :.s/\/\*\(.*\)\*\//\1/g<CR> :else<CR>
> :.s/\(\s*\)\(.*\)\(\s*\)/\1\/\*\2\*\/\3/g<CR> :endif<CR> :noh<CR>
>
> this command basically toggles C-style commenting on a
> line i.e. if the line wasn't commented it comments out the
> entire line and vice-versa. I spent an intense hour of
> exploring the help pages and plenty of effort in trial and
> error before I could reach the 'Eureka' moment.

The first thing I would do is ask myself whether the
approach is adequate.  For example, how does it handle
common lines of code such as:

    /**/ a = b; /* comment */
    /**/ a = b;
         a = b; /* comment */

It converts them to:

    */ a = b; /* comment
     a = b;
         a = b;  comment 

Is that intended?

Also, will the user only want to work with one line at a
time or will a typical use be for a block of code?

Two other solutions would be to use (1) the preprocessor
'#if 0' start and '#endif' end, or (2) use the c99 '//'
(perhaps with a following character to identify code your
map has commented out.

> What I wanted to know is could the same functionality have
> been achieved by a better sequence of commands? Can an
> experienced 'vimmer' do better?

Without changing functionality of the provided code, you
could preserve both the command line (with <silent> and
:silent) and the '/' register (which also prevents the
visible flashing).  You don't need to escape '/' in the
first arg of search() and can avoid escaping them in the
:substitute commands if you use another separator.  The 'g'
flag doesn't appear to do anything in this context (for both
:substitute commands).

Finally, you code is apparently intended to be on one long
line.  Using continuation allows you to keep lines no longer
than 80 characters.  Here's a quick rewrite:

nmap <silent> com ^:let com_hold=@/
    \\|if search('/\*.*\*/','c',line("."))!=0
        \\|silent s#/\*\(.*\)\*/#\1#
    \\|else
        \\|silent s#\v(\s*)(.*)(\s*)#\1/\*\2\*/\3#
    \\|endif
    \\|let @/=com_hold\|unlet com_hold<CR>

-- 
Best regards,
Bill

Reply via email to