Patch 7.3.091

10 views
Skip to first unread message

Bram Moolenaar

unread,
Dec 30, 2010, 6:31:08 AM12/30/10
to vim...@googlegroups.com

Patch 7.3.091
Problem: "vim -w foo" writes special key codes for removed escape
sequences. (Josh Triplett)
Solution: Don't write K_IGNORE codes.
Files: src/getchar.c, src/misc1.c, src/term.c, src/vim.h


*** ../vim-7.3.090/src/getchar.c 2010-10-27 17:39:00.000000000 +0200
--- src/getchar.c 2010-12-30 12:16:36.000000000 +0100
***************
*** 1506,1514 ****
}
}

- #define KL_PART_KEY -1 /* keylen value for incomplete key-code */
- #define KL_PART_MAP -2 /* keylen value for incomplete mapping */
-
/*
* Get the next input character.
* Can return a special key or a multi-byte character.
--- 1506,1511 ----
***************
*** 2171,2177 ****
if (!timedout)
{
/* break at a partly match */
! keylen = KL_PART_MAP;
break;
}
}
--- 2168,2174 ----
if (!timedout)
{
/* break at a partly match */
! keylen = KEYLEN_PART_MAP;
break;
}
}
***************
*** 2192,2198 ****

/* If no partly match found, use the longest full
* match. */
! if (keylen != KL_PART_MAP)
{
mp = mp_match;
keylen = mp_match_len;
--- 2189,2195 ----

/* If no partly match found, use the longest full
* match. */
! if (keylen != KEYLEN_PART_MAP)
{
mp = mp_match;
keylen = mp_match_len;
***************
*** 2230,2236 ****
}
/* Need more chars for partly match. */
if (mlen == typebuf.tb_len)
! keylen = KL_PART_KEY;
else if (max_mlen < mlen)
/* no match, may have to check for termcode at
* next character */
--- 2227,2233 ----
}
/* Need more chars for partly match. */
if (mlen == typebuf.tb_len)
! keylen = KEYLEN_PART_KEY;
else if (max_mlen < mlen)
/* no match, may have to check for termcode at
* next character */
***************
*** 2238,2244 ****
}

if ((mp == NULL || max_mlen >= mp_match_len)
! && keylen != KL_PART_MAP)
{
int save_keylen = keylen;

--- 2235,2241 ----
}

if ((mp == NULL || max_mlen >= mp_match_len)
! && keylen != KEYLEN_PART_MAP)
{
int save_keylen = keylen;

***************
*** 2264,2271 ****
/* If no termcode matched but 'pastetoggle'
* matched partially it's like an incomplete key
* sequence. */
! if (keylen == 0 && save_keylen == KL_PART_KEY)
! keylen = KL_PART_KEY;

/*
* When getting a partial match, but the last
--- 2261,2268 ----
/* If no termcode matched but 'pastetoggle'
* matched partially it's like an incomplete key
* sequence. */
! if (keylen == 0 && save_keylen == KEYLEN_PART_KEY)
! keylen = KEYLEN_PART_KEY;

/*
* When getting a partial match, but the last
***************
*** 2302,2308 ****
continue;
}
if (*s == NUL) /* need more characters */
! keylen = KL_PART_KEY;
}
if (keylen >= 0)
#endif
--- 2299,2305 ----
continue;
}
if (*s == NUL) /* need more characters */
! keylen = KEYLEN_PART_KEY;
}
if (keylen >= 0)
#endif
***************
*** 2339,2345 ****
if (keylen > 0) /* full matching terminal code */
{
#if defined(FEAT_GUI) && defined(FEAT_MENU)
! if (typebuf.tb_buf[typebuf.tb_off] == K_SPECIAL
&& typebuf.tb_buf[typebuf.tb_off + 1]
== KS_MENU)
{
--- 2336,2343 ----
if (keylen > 0) /* full matching terminal code */
{
#if defined(FEAT_GUI) && defined(FEAT_MENU)
! if (typebuf.tb_len >= 2
! && typebuf.tb_buf[typebuf.tb_off] == K_SPECIAL
&& typebuf.tb_buf[typebuf.tb_off + 1]
== KS_MENU)
{
***************
*** 2381,2387 ****
/* Partial match: get some more characters. When a
* matching mapping was found use that one. */
if (mp == NULL || keylen < 0)
! keylen = KL_PART_KEY;
else
keylen = mp_match_len;
}
--- 2379,2385 ----
/* Partial match: get some more characters. When a
* matching mapping was found use that one. */
if (mp == NULL || keylen < 0)
! keylen = KEYLEN_PART_KEY;
else
keylen = mp_match_len;
}
***************
*** 2553,2559 ****
#endif
&& typebuf.tb_maplen == 0
&& (State & INSERT)
! && (p_timeout || (keylen == KL_PART_KEY && p_ttimeout))
&& (c = inchar(typebuf.tb_buf + typebuf.tb_off
+ typebuf.tb_len, 3, 25L,
typebuf.tb_change_cnt)) == 0)
--- 2551,2558 ----
#endif
&& typebuf.tb_maplen == 0
&& (State & INSERT)
! && (p_timeout
! || (keylen == KEYLEN_PART_KEY && p_ttimeout))
&& (c = inchar(typebuf.tb_buf + typebuf.tb_off
+ typebuf.tb_len, 3, 25L,
typebuf.tb_change_cnt)) == 0)
***************
*** 2783,2791 ****
? 0
: ((typebuf.tb_len == 0
|| !(p_timeout || (p_ttimeout
! && keylen == KL_PART_KEY)))
? -1L
! : ((keylen == KL_PART_KEY && p_ttm >= 0)
? p_ttm
: p_tm)), typebuf.tb_change_cnt);

--- 2782,2790 ----
? 0
: ((typebuf.tb_len == 0
|| !(p_timeout || (p_ttimeout
! && keylen == KEYLEN_PART_KEY)))
? -1L
! : ((keylen == KEYLEN_PART_KEY && p_ttm >= 0)
? p_ttm
: p_tm)), typebuf.tb_change_cnt);

*** ../vim-7.3.090/src/misc1.c 2010-12-02 16:01:23.000000000 +0100
--- src/misc1.c 2010-12-30 12:28:59.000000000 +0100
***************
*** 3114,3123 ****
&& (!p_ttimeout || waited * 100L < (p_ttm < 0 ? p_tm : p_ttm)))
continue;

! /* found a termcode: adjust length */
! if (n > 0)
len = n;
! if (len == 0) /* nothing typed yet */
continue;

/* Handle modifier and/or special key code. */
--- 3114,3124 ----
&& (!p_ttimeout || waited * 100L < (p_ttm < 0 ? p_tm : p_ttm)))
continue;

! if (n == KEYLEN_REMOVED) /* key code removed */
! continue;
! if (n > 0) /* found a termcode: adjust length */
len = n;
! if (len == 0) /* nothing typed yet */
continue;

/* Handle modifier and/or special key code. */
*** ../vim-7.3.090/src/term.c 2010-08-15 21:57:32.000000000 +0200
--- src/term.c 2010-12-30 12:14:48.000000000 +0100
***************
*** 3828,3833 ****
--- 3831,3837 ----
* Check from typebuf.tb_buf[typebuf.tb_off] to typebuf.tb_buf[typebuf.tb_off
* + max_offset].
* Return 0 for no match, -1 for partial match, > 0 for full match.
+ * Return KEYLEN_REMOVED when a key code was deleted.
* With a match, the match is removed, the replacement code is inserted in
* typebuf.tb_buf[] and the number of characters in typebuf.tb_buf[] is
* returned.
***************
*** 3845,3850 ****
--- 3849,3855 ----
int slen = 0; /* init for GCC */
int modslen;
int len;
+ int retval = 0;
int offset;
char_u key_name[2];
int modifiers;
***************
*** 4940,4945 ****
--- 4945,4957 ----
#endif
string[new_slen++] = key_name[1];
}
+ else if (new_slen == 0 && key_name[0] == KS_EXTRA
+ && key_name[1] == KE_IGNORE)
+ {
+ /* Do not put K_IGNORE into the buffer, do return KEYLEN_REMOVED
+ * to indicate what happened. */
+ retval = KEYLEN_REMOVED;
+ }
else
{
string[new_slen++] = K_SPECIAL;
***************
*** 4976,4982 ****
(size_t)(buflen - offset));
mch_memmove(buf + offset, string, (size_t)new_slen);
}
! return (len + extra + offset);
}

return 0; /* no match found */
--- 4988,4994 ----
(size_t)(buflen - offset));
mch_memmove(buf + offset, string, (size_t)new_slen);
}
! return retval == 0 ? (len + extra + offset) : retval;
}

return 0; /* no match found */
*** ../vim-7.3.090/src/vim.h 2010-12-17 20:23:56.000000000 +0100
--- src/vim.h 2010-12-30 12:06:45.000000000 +0100
***************
*** 2211,2214 ****
--- 2211,2218 ----
#define MSCR_LEFT -1
#define MSCR_RIGHT -2

+ #define KEYLEN_PART_KEY -1 /* keylen value for incomplete key-code */
+ #define KEYLEN_PART_MAP -2 /* keylen value for incomplete mapping */
+ #define KEYLEN_REMOVED 9999 /* keylen value for removed sequence */
+
#endif /* VIM__H */
*** ../vim-7.3.090/src/version.c 2010-12-30 11:41:05.000000000 +0100
--- src/version.c 2010-12-30 12:24:56.000000000 +0100
***************
*** 716,717 ****
--- 716,719 ----
{ /* Add new patch number below this line */
+ /**/
+ 91,
/**/

--
hundred-and-one symptoms of being an internet addict:
56. You leave the modem speaker on after connecting because you think it
sounds like the ocean wind...the perfect soundtrack for "surfing the net".

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

Ivan Krasilnikov

unread,
Mar 3, 2011, 1:26:47 AM3/3/11
to vim...@googlegroups.com, Bram Moolenaar
Hi, I'm observing the following bug under Ubuntu and FreeBSD, which
seems to have been introduced by this patch.

$ cd /tmp
$ seq 1 1000000 >file # bug happens with any sufficiently large file
$ echo 'set nocompatible foldmethod=marker lazyredraw' >vimrc
$ vim -u vimrc --noplugin file

vim doesn't display the file's contents until any key is pressed.

> --
> You received this message from the "vim_dev" 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
>

Kirill A. Shutemov

unread,
Mar 3, 2011, 1:37:58 AM3/3/11
to vim...@googlegroups.com, Bram Moolenaar
On Thu, Mar 03, 2011 at 09:26:47AM +0300, Ivan Krasilnikov wrote:
> Hi, I'm observing the following bug under Ubuntu and FreeBSD, which
> seems to have been introduced by this patch.
>
> $ cd /tmp
> $ seq 1 1000000 >file # bug happens with any sufficiently large file
> $ echo 'set nocompatible foldmethod=marker lazyredraw' >vimrc
> $ vim -u vimrc --noplugin file
>
> vim doesn't display the file's contents until any key is pressed.

It's in xterm with 256 colors support enabled, isn't it? I have the same
problem.

--
Kirill A. Shutemov

Ivan Krasilnikov

unread,
Mar 3, 2011, 2:26:08 AM3/3/11
to vim...@googlegroups.com, Bram Moolenaar
On Thu, Mar 3, 2011 at 09:37, Kirill A. Shutemov <kir...@shutemov.name> wrote:
> It's in xterm with 256 colors support enabled, isn't it? I have the same
> problem.

Right. It happens to me in Ubuntu's xterm, gnome-terminal, konsole, on
a FreeBSD machine via ssh in these terminal emulators. But it doesn't
happen when I start vim in Ubuntu's framebuffer console.

Bram Moolenaar

unread,
Mar 3, 2011, 8:27:14 AM3/3/11
to Ivan Krasilnikov, vim...@googlegroups.com

Ivan Krasilnikov wrote:

> Hi, I'm observing the following bug under Ubuntu and FreeBSD, which
> seems to have been introduced by this patch.
>
> $ cd /tmp
> $ seq 1 1000000 >file # bug happens with any sufficiently large file
> $ echo 'set nocompatible foldmethod=marker lazyredraw' >vimrc
> $ vim -u vimrc --noplugin file
>
> vim doesn't display the file's contents until any key is pressed.

I see it. It's caused by 'lazyredraw' postponing the redraw. I'll make
a patch for it.

--
ARTHUR: Bloody peasant!
DENNIS: Oh, what a give away. Did you hear that, did you hear that, eh?
That's what I'm on about -- did you see him repressing me, you saw it
didn't you?
The Quest for the Holy Grail (Monty Python)

Kirill A. Shutemov

unread,
Mar 3, 2011, 8:37:22 AM3/3/11
to vim...@googlegroups.com, Ivan Krasilnikov
On Thu, Mar 03, 2011 at 02:27:14PM +0100, Bram Moolenaar wrote:
>
> Ivan Krasilnikov wrote:
>
> > Hi, I'm observing the following bug under Ubuntu and FreeBSD, which
> > seems to have been introduced by this patch.
> >
> > $ cd /tmp
> > $ seq 1 1000000 >file # bug happens with any sufficiently large file
> > $ echo 'set nocompatible foldmethod=marker lazyredraw' >vimrc
> > $ vim -u vimrc --noplugin file
> >
> > vim doesn't display the file's contents until any key is pressed.
>
> I see it. It's caused by 'lazyredraw' postponing the redraw. I'll make
> a patch for it.

Are you sure? 'set nolazyredraw' doesn't help.

--
Kirill A. Shutemov

Bram Moolenaar

unread,
Mar 3, 2011, 9:38:35 AM3/3/11
to Kirill A. Shutemov, vim...@googlegroups.com, Ivan Krasilnikov

Ivan Krasilnikov wrote:

> > > Hi, I'm observing the following bug under Ubuntu and FreeBSD, which
> > > seems to have been introduced by this patch.
> > >
> > > $ cd /tmp
> > > $ seq 1 1000000 >file # bug happens with any sufficiently large file
> > > $ echo 'set nocompatible foldmethod=marker lazyredraw' >vimrc
> > > $ vim -u vimrc --noplugin file
> > >
> > > vim doesn't display the file's contents until any key is pressed.
> >
> > I see it. It's caused by 'lazyredraw' postponing the redraw. I'll make
> > a patch for it.
>
> Are you sure? 'set nolazyredraw' doesn't help.

It does for me. Anyway, try out the patch I just sent out.

--
"Hegel was right when he said that we learn from history that man can
never learn anything from history." (George Bernard Shaw)

Kirill A. Shutemov

unread,
Mar 3, 2011, 10:37:01 AM3/3/11
to Bram Moolenaar, vim...@googlegroups.com, Ivan Krasilnikov
On Thu, Mar 03, 2011 at 03:38:35PM +0100, Bram Moolenaar wrote:
>
> Ivan Krasilnikov wrote:
>
> > > > Hi, I'm observing the following bug under Ubuntu and FreeBSD, which
> > > > seems to have been introduced by this patch.
> > > >
> > > > $ cd /tmp
> > > > $ seq 1 1000000 >file # bug happens with any sufficiently large file
> > > > $ echo 'set nocompatible foldmethod=marker lazyredraw' >vimrc
> > > > $ vim -u vimrc --noplugin file
> > > >
> > > > vim doesn't display the file's contents until any key is pressed.
> > >
> > > I see it. It's caused by 'lazyredraw' postponing the redraw. I'll make
> > > a patch for it.
> >
> > Are you sure? 'set nolazyredraw' doesn't help.
>
> It does for me. Anyway, try out the patch I just sent out.

Yes, it fixes the issue. Thank you.

--
Kirill A. Shutemov

Reply all
Reply to author
Forward
0 new messages