From: Gerald Lai <[EMAIL PROTECTED]>
Subject: Re: Newbie problem: Beginners script pitfall
Date: Sun, 7 May 2006 12:08:46 -0700 (PDT)

Hi,

 thanks a lot for the help!
 I got the script running...nearly.
 In my opinion the help system of vim cann't help a newbie to find the
 things and answers s/he is looking for. 

 Often the problem is just the "context" I have to feed into the
 system to get help. What context ???

 Example:

                help script
  
 gives me an "Introduction"


            help scripts


 shows me, how to debug scripts and


           helpgrep scripts
       clist

 gives me 229 matches.

 As newbie...one is lost. A program of the complexity and power of vim
 deserves something more than grep. What's about an extra user_* file,
 which shows contexts (what the plural of context?) of certain topics
 and will combine tags in a contextual manner? As for my last
 question: How would a newbie guess correctly, that failing with "set
 history=100" has something to do with "set nocompatible", without
 knowing that in beforehand ?


 But this is another story.

 My current problem is:
 The script combines two consecutive lines of text, which consist of
 different contents. The second line will be deleted after the
 contents of both are processed.

 I want to run the script over an input of different length. The first
 line has to be skipped (it is the famous "#!/bin/zsh" :O).

 My problem here is, that the script does not stop corrrectly. As it
 modifies the length of the text while running, my attempts to pass
 a range to the script or to determine the range by the script
 itsself, which would be the better solotion, failed.

 In Emacs, there is the possibility to stop a looping macro/script
 automagically when it tries to access something beyond EOF.

 I found a hint for the abort() command, but 

   help abort

 said, that 

   This function causes abnormal program termination.

 despite the fact, that 

   help function

 states:

                        When the [abort] argument is added, the function will
                        abort as soon as an error is detected.

 . By the way: <C-]> on [abort] gives me

            "E426: tag not found [abort]

 .

 How can  I solve this problem?
 
 Thank you very much for any help in advance!
 mcc


> On Sun, 7 May 2006, Meino Christian Cramer wrote:
> 
> > Hi,
> [snip]
> 
> OK, if you're just starting out, before writing scripts, you would need
> to jump through a few hoops first. Please pardon me if you are already
> familiar with what I'm about to write. I'm just taking it from the top.
> 
> First, get familiar with the :help system of Vim. You will be using it a
> lot, so make sure you understand
> 
>    :help help-context
> 
> > It consists of foru lines:
> >
> > :normal gg
> > :normal %s/^[ ]*//g
> > :normal gg
> > :normal %s/[ ]*$//g
> >
> > Other versions I tried were:
> >
> > :normal gg
> > :normal %s/^[ ]*//g<CR>
> > :normal gg
> > :normal %s/[ ]*$//g<CR>
> >
> > and
> >
> > :normal gg
> > :normal :%s/^[ ]*//g<CR>
> > :normal gg
> > :normal :%s/[ ]*$//g<CR>
> 
> Then as Eric mentioned, you would need to get familiar with all the
> modes of Vim to really make it fly. For this, read this and commit to
> memory if possible:
> 
>    :help mode-switching
> 
> Commiting it to memory is as easy as trying it out to switch between
> modes. Don't bother memorizing, just try to use it daily.
> 
> One thing to remember when scripting in Vim is that you can always
> ___manually___ go through every script line. In the case of your 4
> lines, you would find that
> 
>    :normal gg
> 
> does its job. That is, start Vim, type ":normal gg" and hit Enter.
> 
> But when you try all of these
> 
>    :normal %s/^[ ]*//g
>    :normal %s/^[ ]*//g<CR>
>    :normal :%s/^[ ]*//g<CR>
> 
> and press Enter,
> 
> it just won't work. You'll know that the second line has problems. What
> would you do if you wanted to do a :substitute command while you were in
> Vim? I think you would do
> 
>    :%s/^[ ]*//g
> 
> and press Enter, just as you illustrated in your script (with the
> unnecessary <CR>). See how the :s command above matches the ":normal gg"
> command that worked? Place the :s command into your script then:
> 
>    :normal gg
>    :%s/^[ ]*//g
> 
> and now you have 2 working lines of script code.
> 
> > (Intention is to strip off all leading and trailing white space from
> > a file. It is an experiment, so I choose this basic task. May be
> > there is one command to achieve this, but as said...I used this as an
> > exercise.
> [snip]
> 
> To be really productive in Vim, you could learn more about Vim's regular
> expressions. Regexes allow you to do the "one command to achieve this"
> deal.
> 
> So, in your case of removing leading and trailing white space, this
> would do it:
> 
>    :%s/^\s\+\|\s\+$//g
> 
> Info on the regex elements I used can be found at
> 
>    :help /\s
>    :help /\+
>    :help /\|
> 
> Now I noticed that you did a couple of
> 
>    :normal gg
> 
> It's good that you're thinking in terms of the cursor position. It'll
> become useful later (in search ranges, see ":help :range"), but in your
> case, you are applying the :substitute command to all lines by
> specifying "%" in ":%s".
> 
> Hopefully, that's enough to get you started :)
> 
> HTH.
> --
> Gerald
> 

Reply via email to