On Wed, Sep 13, 2006 at 11:27:43AM +0300, Yakov Lerner wrote: > Nice. So simple. I have couple of comments. > Thank you :)
> 1. Don't you need to reset 'paste' back to 'nopaste' when
> high cps stops ?
>
There is a hastily coded version of the patch that does this, but I
don't like it. It seems hackier (most likely my fault), and stranger to
use. That is, as far as I know, inavoidable, since I have to wait until
at least one second after the paste ends and the user starts typing
before I can know to end the paste. I'm open to suggestions as to how
to do that better. I'll attach both patches this time.
> 2. It would be better if cps be settable, not hardcoded to 30.
> Maybe value of 'autopaste' can be made the cps boundary
> 'set autopaste=30', value 0 disables ?
>
Good idea. Fixed in this version.
> 3. Regarding line do_set(&sPaste, 0); I think typical vim style
> is to write do_set("paste", 0); then
> char_u sPaste[] = "paste";
> do_set(&sPaste, 0);
>
That's what I was doing before, but do_set appears to write to the first
argument. When I did do_set("paste", 0), it would segfault.
It appears that everywhere else in vim where do_set is used, a variable
is passed to it as well. If anyone knows a less hacky way to do that,
I'd be happy to use that instead.
Thanks again for your suggestions.
--
Ian Kilgore
`echo "[EMAIL PROTECTED]" | tr pzfwxt ikagno`
diff -cr vim70.orig/src/getchar.c vim70/src/getchar.c
*** vim70.orig/src/getchar.c 2006-09-12 21:56:14.000000000 -0400
--- vim70/src/getchar.c 2006-09-13 07:08:42.000000000 -0400
***************
*** 1495,1500 ****
--- 1495,1509 ----
int
vgetc()
{
+ static time_t last_call = 0;
+ static int cps = 0;
+ char_u sPaste[] = "paste"; // do_set writes to the first arguement.
+ time_t now;
+ if (p_apa)
+ now = time(NULL);
+
int c, c2;
#ifdef FEAT_MBYTE
int n;
***************
*** 1502,1507 ****
--- 1511,1535 ----
int i;
#endif
+ if (p_apa && !p_paste) {
+ if (last_call == now)
+ ++cps;
+ else
+ cps = 0;
+
+ if (cps >= p_apa) {
+ do_set(&sPaste, 0);
+ showmode();
+ }
+ last_call = now;
+ }
+
/*
* If a character was put back with vungetc, it was already processed.
* Return it directly.
diff -cr vim70.orig/src/option.c vim70/src/option.c
*** vim70.orig/src/option.c 2006-09-12 21:56:14.000000000 -0400
--- vim70/src/option.c 2006-09-13 07:08:06.000000000 -0400
***************
*** 529,534 ****
--- 529,537 ----
{"autoindent", "ai", P_BOOL|P_VI_DEF,
(char_u *)&p_ai, PV_AI,
{(char_u *)FALSE, (char_u *)0L}},
+ {"autopaste", "apa", P_NUM|P_VI_DEF,
+ (char_u *)&p_apa, PV_NONE,
+ {(char_u *)0L, (char_u *)0L}},
{"autoprint", "ap", P_BOOL|P_VI_DEF,
(char_u *)NULL, PV_NONE,
{(char_u *)FALSE, (char_u *)0L}},
diff -cr vim70.orig/src/option.h vim70/src/option.h
*** vim70.orig/src/option.h 2006-09-12 21:56:14.000000000 -0400
--- vim70/src/option.h 2006-09-12 21:54:23.000000000 -0400
***************
*** 312,317 ****
--- 312,318 ----
#if defined(FEAT_GUI) && defined(MACOS_X)
EXTERN int *p_antialias; /* 'antialias' */
#endif
+ EXTERN int p_apa; /* 'autopaste' */
EXTERN int p_ar; /* 'autoread' */
EXTERN int p_aw; /* 'autowrite' */
EXTERN int p_awa; /* 'autowriteall' */
diff -cr vim70.orig/src/getchar.c vim70/src/getchar.c
*** vim70.orig/src/getchar.c 2006-09-12 21:56:14.000000000 -0400
--- vim70/src/getchar.c 2006-09-13 07:08:42.000000000 -0400
***************
*** 1495,1500 ****
--- 1495,1509 ----
int
vgetc()
{
+ static time_t last_call = 0;
+ static int cps = 0;
+ static char autopasting = 0;
+ char_u sPaste[] = "paste"; // do_set writes to the first arguement.
+ char_u sNopaste[] = "nopaste";
+ time_t now;
+ if (p_apa)
+ now = time(NULL);
+
int c, c2;
#ifdef FEAT_MBYTE
int n;
***************
*** 1502,1507 ****
--- 1511,1535 ----
int i;
#endif
+ if (p_apa) {
+ if (last_call == now)
+ ++cps;
+ else
+ cps = 0;
+
+ if (cps >= p_apa && autopasting == 0 && !p_paste) {
+ autopasting = 1;
+ do_set(&sPaste, 0);
+ showmode();
+ }
+ if (cps < p_apa && autopasting == 1) {
+ do_set(&sNopaste, 0);
+ autopasting = 0;
+ showmode();
+ }
+ last_call = now;
+ }
+
/*
* If a character was put back with vungetc, it was already processed.
* Return it directly.
diff -cr vim70.orig/src/option.c vim70/src/option.c
*** vim70.orig/src/option.c 2006-09-12 21:56:14.000000000 -0400
--- vim70/src/option.c 2006-09-13 07:08:06.000000000 -0400
***************
*** 529,534 ****
--- 529,537 ----
{"autoindent", "ai", P_BOOL|P_VI_DEF,
(char_u *)&p_ai, PV_AI,
{(char_u *)FALSE, (char_u *)0L}},
+ {"autopaste", "apa", P_NUM|P_VI_DEF,
+ (char_u *)&p_apa, PV_NONE,
+ {(char_u *)0L, (char_u *)0L}},
{"autoprint", "ap", P_BOOL|P_VI_DEF,
(char_u *)NULL, PV_NONE,
{(char_u *)FALSE, (char_u *)0L}},
diff -cr vim70.orig/src/option.h vim70/src/option.h
*** vim70.orig/src/option.h 2006-09-12 21:56:14.000000000 -0400
--- vim70/src/option.h 2006-09-12 21:54:23.000000000 -0400
***************
*** 312,317 ****
--- 312,318 ----
#if defined(FEAT_GUI) && defined(MACOS_X)
EXTERN int *p_antialias; /* 'antialias' */
#endif
+ EXTERN int p_apa; /* 'autopaste' */
EXTERN int p_ar; /* 'autoread' */
EXTERN int p_aw; /* 'autowrite' */
EXTERN int p_awa; /* 'autowriteall' */
signature.asc
Description: Digital signature
