Plan 9 from Bell Labs’s /usr/web/sources/patch/sam.html

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
 <HEAD>
   <TITLE> [9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam
   </TITLE>
   <LINK REL="Index" HREF="index.html" >
   <LINK REL="made" HREF="mailto:9fans%409fans.net?Subject=Re%3A%20%5B9fans%5D%20Chords%2C%20%5E%2C%20_%2C%20%5EB%20and%20scroll%20with%20mouse%20wheel%20in%20p9p%20sam&In-Reply-To=%3CCAK-yzPO5CikBL5vSw3OX04xZTcFHWCkasG1-PZ6COfczNP0W%3DA%40mail.gmail.com%3E">
   <META NAME="robots" CONTENT="index,nofollow">
   <style type="text/css">
       pre {
           white-space: pre-wrap;       /* css-2.1, curent FF, Opera, Safari */
           }
   </style>
   <META http-equiv="Content-Type" content="text/html; charset=us-ascii">
   <LINK REL="Previous"  HREF="035186.html">
   <LINK REL="Next"  HREF="035191.html">
 </HEAD>
 <BODY BGCOLOR="#ffffff">
   <H1>[9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam</H1>
    <B>Mark Lee Smith</B> 
    <A HREF="mailto:9fans%409fans.net?Subject=Re%3A%20%5B9fans%5D%20Chords%2C%20%5E%2C%20_%2C%20%5EB%20and%20scroll%20with%20mouse%20wheel%20in%20p9p%20sam&In-Reply-To=%3CCAK-yzPO5CikBL5vSw3OX04xZTcFHWCkasG1-PZ6COfczNP0W%3DA%40mail.gmail.com%3E"
       TITLE="[9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam">netytan at gmail.com
       </A><BR>
    <I>Fri May 27 20:57:00 UTC 2016</I>
    <P><UL>
        <LI>Previous message: <A HREF="035186.html">[9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam
</A></li>
        <LI>Next message: <A HREF="035191.html">[9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam
</A></li>
         <LI> <B>Messages sorted by:</B> 
              <a href="date.html#35190">[ date ]</a>
              <a href="thread.html#35190">[ thread ]</a>
              <a href="subject.html#35190">[ subject ]</a>
              <a href="author.html#35190">[ author ]</a>
         </LI>
       </UL>
    <HR>  
<!--beginarticle-->
<PRE>Thanks for sharing this! I'd already backported a few of the features, but
I hadn't yet got around to looking at the chording code etc. It's great to
have selection working! I'm not sure if I did something wrong (I've checked
the changes a few times) but scrolling only works &quot;sometimes&quot;, mostly it
seems to get stuck when scrolling back up? Can anyone confirm? In my
experience sam's scrolling seems to be pretty broken (at least in the
plan9port version) so it might not have anything to do with these changes.

All the best,

P.S. where does Kcmd come from? I've grepped the plan9port tree but I don't
see a definition?

On Fri, 27 May 2016 at 00:05 &lt;<A HREF="http://mail.9fans.net/listinfo/9fans">trebol55555 at yandex.ru</A>&gt; wrote:

&gt;<i> The 9front sam in
</I>&gt;<i>
</I>&gt;<i>         <A HREF="https://bitbucket.org/kremlin_/front9port">https://bitbucket.org/kremlin_/front9port</A>
</I>&gt;<i>         <A HREF="https://bitbucket.org/iru/sam9f-unix">https://bitbucket.org/iru/sam9f-unix</A>
</I>&gt;<i>
</I>&gt;<i> doesn't exchange the snarf buffer with X, and the pipe in /srv doesn't
</I>&gt;<i> work.
</I>&gt;<i>
</I>&gt;<i> This diff will makes the minimal changes to have those features of 9front
</I>&gt;<i> sam in the last p9p. The code fell off from the front.
</I>&gt;<i>
</I>&gt;<i> trebol.
</I>&gt;<i>
</I>&gt;<i>
</I>&gt;<i> diff -rpuN src/cmd/sam/cmd.c sam/cmd.c
</I>&gt;<i> --- src/cmd/sam/cmd.c   2016-04-18 19:07:22.000000000 +0100
</I>&gt;<i> +++ sam/cmd.c   2016-05-25 23:56:34.040909362 +0100
</I>&gt;<i> @@ -35,6 +35,8 @@ struct cmdtab cmdtab[]={
</I>&gt;<i>         '&gt;',    0,      0,      0,      0,      aDot,   0,      linex,
</I>&gt;<i> plan9_cmd,
</I>&gt;<i>         '&lt;',    0,      0,      0,      0,      aDot,   0,      linex,
</I>&gt;<i> plan9_cmd,
</I>&gt;<i>         '|',    0,      0,      0,      0,      aDot,   0,      linex,
</I>&gt;<i> plan9_cmd,
</I>&gt;<i> +       '^',    0,      0,      0,      0,      aDot,   0,      linex,
</I>&gt;<i> plan9_cmd,
</I>&gt;<i> +       '_',    0,      0,      0,      0,      aDot,   0,      linex,
</I>&gt;<i> plan9_cmd,
</I>&gt;<i>         '=',    0,      0,      0,      0,      aDot,   0,      linex,
</I>&gt;<i> eq_cmd,
</I>&gt;<i>         'c'|0x100,0,    0,      0,      0,      aNo,    0,      wordx,
</I>&gt;<i> cd_cmd,
</I>&gt;<i>         0,      0,      0,      0,      0,      0,      0,      0
</I>&gt;<i> @@ -76,7 +78,13 @@ inputc(void)
</I>&gt;<i>
</I>&gt;<i>      Again:
</I>&gt;<i>         nbuf = 0;
</I>&gt;<i> -       if(downloaded){
</I>&gt;<i> +       if(cmdbufpos &gt; cmdbuf.nc &amp;&amp; cmdbuf.nc &gt; 0){
</I>&gt;<i> +               cmdbufpos = 0;
</I>&gt;<i> +               bufreset(&amp;cmdbuf);
</I>&gt;<i> +       }
</I>&gt;<i> +       if(cmdbufpos &lt; cmdbuf.nc &amp;&amp; cmdbuf.nc &gt; 0)
</I>&gt;<i> +               bufread(&amp;cmdbuf, cmdbufpos++, &amp;r, 1);
</I>&gt;<i> +       else if(downloaded){
</I>&gt;<i>                 while(termoutp == terminp){
</I>&gt;<i>                         cmdupdate();
</I>&gt;<i>                         if(patset)
</I>&gt;<i> diff -rpuN src/cmd/sam/sam.h sam/sam.h
</I>&gt;<i> --- src/cmd/sam/sam.h   2016-04-18 19:07:22.000000000 +0100
</I>&gt;<i> +++ sam/sam.h   2016-05-25 23:45:05.652931784 +0100
</I>&gt;<i> @@ -369,6 +369,8 @@ extern int  quitok;
</I>&gt;<i>  extern Address addr;
</I>&gt;<i>  extern Buffer  snarfbuf;
</I>&gt;<i>  extern Buffer  plan9buf;
</I>&gt;<i> +extern Buffer  cmdbuf;
</I>&gt;<i> +extern int     cmdbufpos;
</I>&gt;<i>  extern List    file;
</I>&gt;<i>  extern List    tempfile;
</I>&gt;<i>  extern File    *cmd;
</I>&gt;<i> diff -rpuN src/cmd/sam/shell.c sam/shell.c
</I>&gt;<i> --- src/cmd/sam/shell.c 2016-04-18 19:07:22.000000000 +0100
</I>&gt;<i> +++ sam/shell.c 2016-05-25 23:46:25.262692361 +0100
</I>&gt;<i> @@ -6,6 +6,8 @@ extern  jmp_buf mainloop;
</I>&gt;<i>  char   errfile[64];
</I>&gt;<i>  String plan9cmd;       /* null terminated */
</I>&gt;<i>  Buffer plan9buf;
</I>&gt;<i> +Buffer cmdbuf;
</I>&gt;<i> +int    cmdbufpos;
</I>&gt;<i>  void   checkerrs(void);
</I>&gt;<i>
</I>&gt;<i>  void
</I>&gt;<i> @@ -40,7 +42,7 @@ plan9(File *f, int type, String *s, int
</I>&gt;<i>         }
</I>&gt;<i>         if(type!='!' &amp;&amp; pipe(pipe1)==-1)
</I>&gt;<i>                 error(Epipe);
</I>&gt;<i> -       if(type=='|')
</I>&gt;<i> +       if(type=='|' || type=='_')
</I>&gt;<i>                 snarf(f, addr.r.p1, addr.r.p2, &amp;plan9buf, 1);
</I>&gt;<i>         if((pid=fork()) == 0){
</I>&gt;<i>                 setname(f);
</I>&gt;<i> @@ -61,14 +63,14 @@ plan9(File *f, int type, String *s, int
</I>&gt;<i>                         }
</I>&gt;<i>                 }
</I>&gt;<i>                 if(type != '!') {
</I>&gt;<i> -                       if(type=='&lt;' || type=='|')
</I>&gt;<i> -                               dup(pipe1[1], 1);
</I>&gt;<i> -                       else if(type == '&gt;')
</I>&gt;<i> +                       if(type == '&gt;')
</I>&gt;<i>                                 dup(pipe1[0], 0);
</I>&gt;<i> +                       else
</I>&gt;<i> +                               dup(pipe1[1], 1);
</I>&gt;<i>                         close(pipe1[0]);
</I>&gt;<i>                         close(pipe1[1]);
</I>&gt;<i>                 }
</I>&gt;<i> -               if(type == '|'){
</I>&gt;<i> +               if(type == '|' || type == '_'){
</I>&gt;<i>                         if(pipe(pipe2) == -1)
</I>&gt;<i>                                 exits(&quot;pipe&quot;);
</I>&gt;<i>                         if((pid = fork())==0){
</I>&gt;<i> @@ -100,7 +102,7 @@ plan9(File *f, int type, String *s, int
</I>&gt;<i>                         close(pipe2[0]);
</I>&gt;<i>                         close(pipe2[1]);
</I>&gt;<i>                 }
</I>&gt;<i> -               if(type=='&lt;'){
</I>&gt;<i> +               if(type=='&lt;' || type=='^'){
</I>&gt;<i>                         close(0);       /* so it won't read from terminal
</I>&gt;<i> */
</I>&gt;<i>                         open(&quot;/dev/null&quot;, 0);
</I>&gt;<i>                 }
</I>&gt;<i> @@ -128,9 +130,14 @@ plan9(File *f, int type, String *s, int
</I>&gt;<i>                 writeio(f);
</I>&gt;<i>                 bpipeok = 0;
</I>&gt;<i>                 closeio((Posn)-1);
</I>&gt;<i> +       }else if(type == '^' || type == '_'){
</I>&gt;<i> +               int nulls;
</I>&gt;<i> +               close(pipe1[1]);
</I>&gt;<i> +               bufload(&amp;cmdbuf, cmdbufpos, pipe1[0], &amp;nulls);
</I>&gt;<i> +               close(pipe1[0]);
</I>&gt;<i>         }
</I>&gt;<i>         retcode = waitfor(pid);
</I>&gt;<i> -       if(type=='|' || type=='&lt;')
</I>&gt;<i> +       if(type=='|' || type=='&lt;' || type=='_' || type=='^')
</I>&gt;<i>                 if(retcode!=0)
</I>&gt;<i>                         warn(Wbadstatus);
</I>&gt;<i>         if(downloaded)
</I>&gt;<i> diff -rpuN src/cmd/samterm/main.c samterm/main.c
</I>&gt;<i> --- src/cmd/samterm/main.c      2016-04-18 19:07:22.000000000 +0100
</I>&gt;<i> +++ samterm/main.c      2016-05-26 16:12:12.452556184 +0100
</I>&gt;<i> @@ -23,11 +23,8 @@ long modified = 0;           /* strange lookahead
</I>&gt;<i>  char   hostlock = 1;
</I>&gt;<i>  char   hasunlocked = 0;
</I>&gt;<i>  int    maxtab = 8;
</I>&gt;<i> -int    chord;
</I>&gt;<i>  int    autoindent;
</I>&gt;<i>
</I>&gt;<i> -#define chording 0     /* code here for reference but it causes deadlocks
</I>&gt;<i> */
</I>&gt;<i> -
</I>&gt;<i>  void
</I>&gt;<i>  notifyf(void *a, char *msg)
</I>&gt;<i>  {
</I>&gt;<i> @@ -39,7 +36,7 @@ notifyf(void *a, char *msg)
</I>&gt;<i>  void
</I>&gt;<i>  threadmain(int argc, char *argv[])
</I>&gt;<i>  {
</I>&gt;<i> -       int i, got, scr, w;
</I>&gt;<i> +       int i, got, scr, chord, w;
</I>&gt;<i>         Text *t;
</I>&gt;<i>         Rectangle r;
</I>&gt;<i>         Flayer *nwhich;
</I>&gt;<i> @@ -85,6 +82,7 @@ threadmain(int argc, char *argv[])
</I>&gt;<i>
</I>&gt;<i>         got = 0;
</I>&gt;<i>         if(protodebug) print(&quot;loop\n&quot;);
</I>&gt;<i> +       chord = 0;
</I>&gt;<i>         for(;;got = waitforio()){
</I>&gt;<i>                 if(hasunlocked &amp;&amp; RESIZED())
</I>&gt;<i>                         resize();
</I>&gt;<i> @@ -108,19 +106,32 @@ threadmain(int argc, char *argv[])
</I>&gt;<i>                                 continue;
</I>&gt;<i>                         }
</I>&gt;<i>                         nwhich = flwhich(mousep-&gt;xy);
</I>&gt;<i> -                       scr = which &amp;&amp; ptinrect(mousep-&gt;xy, which-&gt;scroll);
</I>&gt;<i> +                       scr = which &amp;&amp; (ptinrect(mousep-&gt;xy,
</I>&gt;<i> which-&gt;scroll) ||
</I>&gt;<i> +                               mousep-&gt;buttons&amp;(8|16));
</I>&gt;<i>                         if(mousep-&gt;buttons)
</I>&gt;<i>                                 flushtyping(1);
</I>&gt;<i> -                       if(chording &amp;&amp; chord==1 &amp;&amp; !mousep-&gt;buttons)
</I>&gt;<i> +                       if((mousep-&gt;buttons&amp;1)==0)
</I>&gt;<i>                                 chord = 0;
</I>&gt;<i> -                       if(chording &amp;&amp; chord)
</I>&gt;<i> +                       if(chord &amp;&amp; which &amp;&amp; which==nwhich){
</I>&gt;<i>                                 chord |= mousep-&gt;buttons;
</I>&gt;<i> -                       else if(mousep-&gt;buttons&amp;1){
</I>&gt;<i> +                               t = (Text *)which-&gt;user1;
</I>&gt;<i> +                               if(!t-&gt;lock){
</I>&gt;<i> +                                       w = which-t-&gt;l;
</I>&gt;<i> +                                       if(chord&amp;2){
</I>&gt;<i> +                                               cut(t, w, 1, 1);
</I>&gt;<i> +                                               chord &amp;= ~2;
</I>&gt;<i> +                                       }
</I>&gt;<i> +                                       if(chord&amp;4){
</I>&gt;<i> +                                               paste(t, w);
</I>&gt;<i> +                                               chord &amp;= ~4;
</I>&gt;<i> +                                       }
</I>&gt;<i> +                               }
</I>&gt;<i> +                       }else if(mousep-&gt;buttons&amp;(1|8)){
</I>&gt;<i>                                 if(nwhich){
</I>&gt;<i>                                         if(nwhich!=which)
</I>&gt;<i>                                                 current(nwhich);
</I>&gt;<i>                                         else if(scr)
</I>&gt;<i> -                                               scroll(which, 1);
</I>&gt;<i> +                                               scroll(which,
</I>&gt;<i> (mousep-&gt;buttons&amp;8) ? 4 : 1);
</I>&gt;<i>                                         else{
</I>&gt;<i>                                                 t=(Text *)which-&gt;user1;
</I>&gt;<i>                                                 if(flselect(which)){
</I>&gt;<i> @@ -137,27 +148,14 @@ threadmain(int argc, char *argv[])
</I>&gt;<i>                                         scroll(which, 2);
</I>&gt;<i>                                 else
</I>&gt;<i>                                         menu2hit();
</I>&gt;<i> -                       }else if((mousep-&gt;buttons&amp;4)){
</I>&gt;<i> +                       }else if(mousep-&gt;buttons&amp;(4|16)){
</I>&gt;<i>                                 if(scr)
</I>&gt;<i> -                                       scroll(which, 3);
</I>&gt;<i> +                                       scroll(which, (mousep-&gt;buttons&amp;16)
</I>&gt;<i> ? 5 : 3);
</I>&gt;<i>                                 else
</I>&gt;<i>                                         menu3hit();
</I>&gt;<i>                         }
</I>&gt;<i>                         mouseunblock();
</I>&gt;<i>                 }
</I>&gt;<i> -               if(chording &amp;&amp; chord){
</I>&gt;<i> -                       t = (Text*)which-&gt;user1;
</I>&gt;<i> -                       if(!t-&gt;lock &amp;&amp; !hostlock){
</I>&gt;<i> -                               w = which-t-&gt;l;
</I>&gt;<i> -                               if(chord&amp;2){
</I>&gt;<i> -                                       cut(t, w, 1, 1);
</I>&gt;<i> -                                       chord &amp;= ~2;
</I>&gt;<i> -                               }else if(chord&amp;4){
</I>&gt;<i> -                                       paste(t, w);
</I>&gt;<i> -                                       chord &amp;= ~4;
</I>&gt;<i> -                               }
</I>&gt;<i> -                       }
</I>&gt;<i> -               }
</I>&gt;<i>         }
</I>&gt;<i>  }
</I>&gt;<i>
</I>&gt;<i> @@ -497,6 +495,7 @@ flushtyping(int clearesc)
</I>&gt;<i>  #define        CUT     (Kcmd+'x')
</I>&gt;<i>  #define        COPY    (Kcmd+'c')
</I>&gt;<i>  #define        PASTE   (Kcmd+'v')
</I>&gt;<i> +#define        Kstx    0x02
</I>&gt;<i>
</I>&gt;<i>  int
</I>&gt;<i>  nontypingkey(int c)
</I>&gt;<i> @@ -512,6 +511,7 @@ nontypingkey(int c)
</I>&gt;<i>         case PAGEUP:
</I>&gt;<i>         case RIGHTARROW:
</I>&gt;<i>         case SCROLLKEY:
</I>&gt;<i> +       case Kstx:
</I>&gt;<i>                 return 1;
</I>&gt;<i>         }
</I>&gt;<i>         if(c &gt;= Kcmd)
</I>&gt;<i> @@ -669,6 +669,15 @@ type(Flayer *l, int res)   /* what a blood
</I>&gt;<i>                                 }
</I>&gt;<i>                         }
</I>&gt;<i>                 }
</I>&gt;<i> +       }else if(c == Kstx){
</I>&gt;<i> +               t = &cmd;
</I>&gt;<i> +               for(l=t-&gt;l; l-&gt;textfn==0; l++)
</I>&gt;<i> +                       ;
</I>&gt;<i> +               current(l);
</I>&gt;<i> +               flushtyping(0);
</I>&gt;<i> +               a = t-&gt;rasp.nrunes;
</I>&gt;<i> +               flsetselect(l, a, a);
</I>&gt;<i> +               center(l, a);
</I>&gt;<i>         }else{
</I>&gt;<i>                 if(c==ESC &amp;&amp; typeesc&gt;=0){
</I>&gt;<i>                         l-&gt;p0 = typeesc;
</I>&gt;<i> diff -rpuN src/cmd/samterm/scroll.c samterm/scroll.c
</I>&gt;<i> --- src/cmd/samterm/scroll.c    2016-04-18 19:07:22.000000000 +0100
</I>&gt;<i> +++ samterm/scroll.c    2016-05-26 02:07:31.922977720 +0100
</I>&gt;<i> @@ -115,7 +115,7 @@ scroll(Flayer *l, int but)
</I>&gt;<i>         draw(scrback, Rect(0,0,Dx(l-&gt;scroll), Dy(l-&gt;scroll)), l-&gt;f.b, nil,
</I>&gt;<i> l-&gt;scroll.min);
</I>&gt;<i>         do{
</I>&gt;<i>                 oin = in;
</I>&gt;<i> -               in = abs(x-mousep-&gt;xy.x)&lt;=FLSCROLLWID(l)/2;
</I>&gt;<i> +               in = (but &gt; 3) || (but == 2) ||
</I>&gt;<i> abs(x-mousep-&gt;xy.x)&lt;=FLSCROLLWID(l)/2;
</I>&gt;<i>                 if(oin &amp;&amp; !in)
</I>&gt;<i>                         scrunmark(l, r);
</I>&gt;<i>                 if(in){
</I>&gt;<i> @@ -126,9 +126,7 @@ scroll(Flayer *l, int but)
</I>&gt;<i>                                 my = s.min.y;
</I>&gt;<i>                         if(my &gt;= s.max.y)
</I>&gt;<i>                                 my = s.max.y;
</I>&gt;<i> -                       if(!eqpt(mousep-&gt;xy, Pt(x, my)))
</I>&gt;<i> -                               moveto(mousectl, Pt(x, my));
</I>&gt;<i> -                       if(but == 1){
</I>&gt;<i> +                       if(but == 1 || but == 4){
</I>&gt;<i>                                 p0 = l-&gt;origin-frcharofpt(&amp;l-&gt;f,
</I>&gt;<i> Pt(s.max.x, my));
</I>&gt;<i>                                 rt = scrpos(l-&gt;scroll, p0, p0+l-&gt;f.nchars,
</I>&gt;<i> tot);
</I>&gt;<i>                                 y = rt.min.y;
</I>&gt;<i> @@ -136,7 +134,7 @@ scroll(Flayer *l, int but)
</I>&gt;<i>                                 y = my;
</I>&gt;<i>                                 if(y &gt; s.max.y-2)
</I>&gt;<i>                                         y = s.max.y-2;
</I>&gt;<i> -                       }else if(but == 3){
</I>&gt;<i> +                       }else if(but == 3 || but == 5){
</I>&gt;<i>                                 p0 = l-&gt;origin+frcharofpt(&amp;l-&gt;f,
</I>&gt;<i> Pt(s.max.x, my));
</I>&gt;<i>                                 rt = scrpos(l-&gt;scroll, p0, p0+l-&gt;f.nchars,
</I>&gt;<i> tot);
</I>&gt;<i>                                 y = rt.min.y;
</I>&gt;<i> @@ -147,19 +145,21 @@ scroll(Flayer *l, int but)
</I>&gt;<i>                                 scrmark(l, r);
</I>&gt;<i>                         }
</I>&gt;<i>                 }
</I>&gt;<i> -       }while(button(but));
</I>&gt;<i> +       }while(but &lt;= 3 &amp;&amp; button(but));
</I>&gt;<i>         if(in){
</I>&gt;<i>                 h = s.max.y-s.min.y;
</I>&gt;<i>                 scrunmark(l, r);
</I>&gt;<i>                 p0 = 0;
</I>&gt;<i> -               if(but == 1)
</I>&gt;<i> +               if(but == 1 || but == 4){
</I>&gt;<i> +                       but = 1;
</I>&gt;<i>                         p0 = (long)(my-s.min.y)/l-&gt;f.font-&gt;height+1;
</I>&gt;<i> -               else if(but == 2){
</I>&gt;<i> +               }else if(but == 2){
</I>&gt;<i>                         if(tot &gt; 1024L*1024L)
</I>&gt;<i>                                 p0 = ((tot&gt;&gt;10)*(y-s.min.y)/h)&lt;&lt;10;
</I>&gt;<i>                         else
</I>&gt;<i>                                 p0 = tot*(y-s.min.y)/h;
</I>&gt;<i> -               }else if(but == 3){
</I>&gt;<i> +               }else if(but == 3 || but == 5){
</I>&gt;<i> +                       but = 3;
</I>&gt;<i>                         p0 = l-&gt;origin+frcharofpt(&amp;l-&gt;f, Pt(s.max.x, my));
</I>&gt;<i>                         if(p0 &gt; tot)
</I>&gt;<i>                                 p0 = tot;
</I>&gt;<i>
</I>&gt;<i>
</I>&gt;<i>
</I>-------------- next part --------------
An HTML attachment was scrubbed...
URL: &lt;<A HREF="http://mail.9fans.net/private/9fans/attachments/20160527/75f53342/attachment-0001.html">http://mail.9fans.net/private/9fans/attachments/20160527/75f53342/attachment-0001.html</A>&gt;
</PRE>


<!--endarticle-->
    <HR>
    <P><UL>
        <!--threads-->
	<LI>Previous message: <A HREF="035186.html">[9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam
</A></li>
	<LI>Next message: <A HREF="035191.html">[9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam
</A></li>
         <LI> <B>Messages sorted by:</B> 
              <a href="date.html#35190">[ date ]</a>
              <a href="thread.html#35190">[ thread ]</a>
              <a href="subject.html#35190">[ subject ]</a>
              <a href="author.html#35190">[ author ]</a>
         </LI>
       </UL>

<hr>
<a href="http://mail.9fans.net/listinfo/9fans">More information about the 9fans
mailing list</a><br>
</body></html>

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].