Received: from luna.worldonline.nl (luna.worldonline.nl [195.241.48.131])
by larissa.worldonline.nl (8.8.5/8.8.5) with ESMTP id AAA27161
for <
[email protected]>; Tue, 6 Jul 1999 00:45:07 +0200 (MET DST)
Received: from ulwar.pair.com (ulwar.pair.com [209.68.1.173])
by luna.worldonline.nl (8.8.5/8.8.5) with ESMTP id AAA02253
for <
[email protected]>; Tue, 6 Jul 1999 00:37:26 +0200 (MET DST)
Received: from foobar.math.fu-berlin.de (foobar.math.fu-berlin.de [160.45.45.151]) by ulwar.pair.com (8.9.1/8.6.12) with SMTP id SAA19696 for <
[email protected]>; Mon, 5 Jul 1999 18:37:18 -0400 (EDT)
X-Envelope-To: <
[email protected]>
Received: (qmail 11546 invoked by uid 200); 5 Jul 1999 22:37:37 -0000
Mailing-List: contact
[email protected]; run by ezmlm
Precedence: bulk
Delivered-To: mailing list
[email protected]
Received: (qmail 11515 invoked from network); 5 Jul 1999 22:37:36 -0000
Message-Id: <
[email protected]>
To: Johannes Zellner <
[email protected]>
Cc: vim development <
[email protected]>
Subject: patch 5.4n.5 (was: CursorHold & normal)
In-Reply-To: <Pine.LNX.4.10.9907051733440.29130-100000@krispc6.physik.uni-karlsruhe.de>
From: Bram Moolenaar <
[email protected]>
Date: Tue, 06 Jul 1999 00:45:42 +0200
Sender:
[email protected]
Content-type: text
Status: U
Johannes Zellner wrote:
> autocmd! CursorHold * normal j
>
> and vim will hang, at least untill you type an error. Just a note.
> As I had my fingers in CursorHold I might take a look into this evening.
Interesting problem. The CursorHold event is triggered while waiting for a
character, somewhere down from vgetc(). It then executes the ":normal"
command, which puts "j" in the input buffer and calls normal_cmd() to execute
it. normal_cmd() then calls vgetc() to get the command character, but since
vgetc() can't work recursively, this is redirected to get_keystroke(). Thus
the "j" in the input buffer is never consumed...
This is too tricky to fix now. This would probably require returning a
Cursor-hold key code from the input function and handling it at a higher
level. I don't want to do that now. Let's just forbid the use of ":normal"
here. The real solution can be done later (hopefully in a generic way, event
handling has become a bit messy...).
Patch 5.4n.5
Problem: When using ":normal" from a CursorHold autocommand Vim hangs. The
autocommand is executed down from vgetc(). Calling vgetc()
recursively to execute the command doesn't work then.
Solution: Forbid the use of ":normal" when vgetc_busy is set. Give an error
message when this happens.
Files: src/ex_docmd.c, runtime/doc/autocmd.txt
*** ../vim-5.4n/src/ex_docmd.c Sun Jul 4 20:35:46 1999
--- src/ex_docmd.c Mon Jul 5 22:11:18 1999
***************
*** 6961,6966 ****
--- 6961,6973 ----
EMSG("Recursive use of :normal too deep");
return;
}
+ /* Using ":normal" from a CursorHold autocommand event doesn't work,
+ * because vgetc() can't be used recursively. */
+ if (vgetc_busy)
+ {
+ EMSG("Cannot use :normal from event handler");
+ return;
+ }
++depth;
msg_scroll = FALSE; /* no msg scrolling in Normal mode */
restart_edit = 0; /* don't go to Insert mode */
*** ../vim-5.4n/runtime/doc/autocmd.txt Sun Jul 4 20:36:25 1999
--- runtime/doc/autocmd.txt Mon Jul 5 22:14:42 1999
***************
*** 1,4 ****
! *autocmd.txt* For Vim version 5.4n. Last change: 1999 Jul 03
VIM REFERENCE MANUAL by Bram Moolenaar
--- 1,4 ----
! *autocmd.txt* For Vim version 5.4n. Last change: 1999 Jul 05
VIM REFERENCE MANUAL by Bram Moolenaar
***************
*** 257,266 ****
until the user has pressed a key (i.e. doesn't
fire every 'updatetime' ms if you leave Vim to
make some coffee. :) See |CursorHold-example|
! for previewing tags. Note: In the future
! there will probably be another option to set
! the time. {only on Amiga, Unix, Win32, MSDOS
! and all GUI versions}
*BufEnter*
BufEnter After entering a buffer. Useful for setting
options for a file type. Also executed when
--- 257,269 ----
until the user has pressed a key (i.e. doesn't
fire every 'updatetime' ms if you leave Vim to
make some coffee. :) See |CursorHold-example|
! for previewing tags.
! Note: Interactive commands and ":normal"
! cannot be used for this event.
! Note: In the future there will probably be
! another option to set the time.
! {only on Amiga, Unix, Win32, MSDOS and all GUI
! versions}
*BufEnter*
BufEnter After entering a buffer. Useful for setting
options for a file type. Also executed when
--
Lose weight, NEVER Diet again with
The "Invisible Weight Loss Patch"
(spam e-mail)
--/-/---- Bram Moolenaar ----
[email protected] ----
[email protected] ---\-\--
\ \ www.vim.org/iccf www.moolenaar.net www.vim.org / /