On 21/11/11 12:22, porphyry5 wrote:
On Sun, Nov 20, 2011 at 1:25 PM, Gary Johnson-4 [via VIM]
<[hidden email] </user/SendEmail.jtp?type=node&node=5010270&i=0>> wrote:

 > On 2011-11-20, porphyry5 wrote:
 >> In a script, how can I get repeated searches always to begin at the
start
 >> of
 >> the buffer?
 >> If I precede the search with gg  or :cursor(1, 1) I get E492, with 1G I
 >> get
 >> E464.
 >>
 >> :map p$ ggdd:while @" != ""<CR>:b#<CR>:cursor (1, 1)<CR>:silent!
 >> /^R"<CR>0i$<Space><Esc>:b#<CR>dd:endwhile
 >
 > I haven't looked closely at your mapping, but to use a normal-mode
 > command such as gg in a script, that is, as an ex command, you must
 > precede it with ":normal", as
 >
 >     :normal gg
 >
 > Similarly, to use a function as an ex command, you must precede it
 > with ":call", as
 >
 >     :call cursor(1, 1)
 >
 > See
 >
 >     :help :normal
 >     :help :call
 >
 > Another way to move the cursor to the first line of the buffer is to
 > simply put the number 1 on a line by itself, or in a mapping like
 > yours, as ":1<CR>".
 >
 > HTH,
 > Gary
 >

It certainly does help, thank you, particularly with reference to
:help :normal, because it seems that sometimes a normal-mode command
works as-is, other times it doesn't. I originally wrote the script as

:map p$ ggdd:while @" != ""<CR>:b#<CR>gg:silent!
/^R"<CR>0i$<Space><Esc>:b#<CR>dd:endwhile

in which the first gg works, the second gg fails.

If you type

        :while @" != ""

followed by Return, you will notice that Vim does not go back to Normal mode: it presents you with a new, empty command-line already prefixed by a colon. This is because a :while statement cannot be executed as long as everything until and including the :endwhile isn't known. The :b# above is OK in this context (a second colon, or even a string of many colons, at the start of an ex-command, changes nothing), but the following gg is still interpreted in that "implicit command-line mode", and since there is no ":gg:silent" ex-command, you get an error. That error invalidates the whole "incomplete complex command" (started by :while not yet followed by :endwhile), Vim discards it, and I think the exception propagates (making Vim discard the whole mapping) until it is ready to read the next command at the keyboard.

OTOH, if you type

        :if 0

you will be presented by empty lines in the same way, and if you type nonsense in them, there will be no error. Further :if's, :while's, etc. will cause additional indentation, and when you come back to indent level zero with the _matching_ :endif (with no matching :else or :elseif) Vim will come back to Normal mode, do nothing, and still give no error for any intervening "nonsense line", because they were on the "false path" of the :if.

I find it less confusing, when typing at the command-line (not in a script) to type complex commands (:while, :if, etc.) all on one line until their :endwhile, :endif, etc., separating intervening commands with bars, and taking care that some commands take the | as part of their arguments: such commands (listed under :help :bar) need to be wrapped in :execute if they are to be part of such a set of concatenated commands other than at the end.

Doing it this way (on one line) allows me to come back if, before hitting <Enter>, I notice that I'm made a typo several bars before in the line.


Best regards,
Tony.
--
No animal should ever jump on the dining room furniture unless
absolutely certain he can hold his own in conversation.
                -- Fran Lebowitz

--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Reply via email to