This patch makes sam's = cmd output what seems to me a more useful (plumbable) format: /full/path/to/file:addr , where addr is line(s) under = and rune(s) under =#. I don't really see how one even could depend on the original format (maybe some complicated sam -d script?) but am open to thoughts & opinions. umbraticus diff f84cf1e60427675514fb056cc1723e45da01e043 uncommitted --- a/sys/man/1/sam +++ b/sys/man/1/sam @@ -403,10 +403,10 @@ Set dot. .TP .B = -Print the line address and character address of the range. +Print the file name and line address of the range. .TP .B =# -Print just the character address of the range. +Print the file name and character address of the range. .PD .SS File commands .PD 0 --- a/sys/src/cmd/sam/sam.c +++ b/sys/src/cmd/sam/sam.c @@ -688,11 +688,25 @@ } void -printposn(File *f, int charsonly) +printposn(File *f, int chars) { Posn l1, l2; + char *s; - if(!charsonly){ + if(f->name.s[0]){ + getcurwd(); + s = Strtoc(&curwd); + dprint("%s", s); + free(s); + s = Strtoc(&f->name); + dprint("%s:", s); + free(s); + } + if(chars){ + dprint("#%lud", addr.r.p1); + if(addr.r.p2 != addr.r.p1) + dprint(",#%lud", addr.r.p2); + }else{ l1 = 1+nlcount(f, (Posn)0, addr.r.p1); l2 = l1+nlcount(f, addr.r.p1, addr.r.p2); /* check if addr ends with '\n' */ @@ -701,11 +715,7 @@ dprint("%lud", l1); if(l2 != l1) dprint(",%lud", l2); - dprint("; "); } - dprint("#%lud", addr.r.p1); - if(addr.r.p2 != addr.r.p1) - dprint(",#%lud", addr.r.p2); dprint("\n"); }
and of course I press send and immediately notice a mistake (ml is a lot more responsive lately!) better patch follows: diff f84cf1e60427675514fb056cc1723e45da01e043 uncommitted --- a/sys/man/1/sam +++ b/sys/man/1/sam @@ -403,10 +403,10 @@ Set dot. .TP .B = -Print the line address and character address of the range. +Print the file name and line address of the range. .TP .B =# -Print just the character address of the range. +Print the file name and character address of the range. .PD .SS File commands .PD 0 --- a/sys/src/cmd/sam/sam.c +++ b/sys/src/cmd/sam/sam.c @@ -688,11 +688,27 @@ } void -printposn(File *f, int charsonly) +printposn(File *f, int chars) { Posn l1, l2; + char *s; - if(!charsonly){ + if(f->name.s[0]){ + if(f->name.s[0]!='/'){ + getcurwd(); + s = Strtoc(&curwd); + dprint("%s", s); + free(s); + } + s = Strtoc(&f->name); + dprint("%s:", s); + free(s); + } + if(chars){ + dprint("#%lud", addr.r.p1); + if(addr.r.p2 != addr.r.p1) + dprint(",#%lud", addr.r.p2); + }else{ l1 = 1+nlcount(f, (Posn)0, addr.r.p1); l2 = l1+nlcount(f, addr.r.p1, addr.r.p2); /* check if addr ends with '\n' */ @@ -701,11 +717,7 @@ dprint("%lud", l1); if(l2 != l1) dprint(",%lud", l2); - dprint("; "); } - dprint("#%lud", addr.r.p1); - if(addr.r.p2 != addr.r.p1) - dprint(",#%lud", addr.r.p2); dprint("\n"); }
I wonder, at least it's possible to use in regexes, e.g. 2; #9/foo/ 3; #9/foo/ to search in line 2 or 3 (Although I use acme anyway :D)
Quoth umbraticus@prosimetrum.com:
> This patch makes sam's = cmd output what seems to me a more
> useful (plumbable) format: /full/path/to/file:addr , where
> addr is line(s) under = and rune(s) under =#. I don't
> really see how one even could depend on the original format
> (maybe some complicated sam -d script?) but am open to
> thoughts & opinions.
>
I like it. Most of the time, I use = to get some address
that I can point people at, and having it plumbable is
very nice for this.
The rest of the time, I use it for "bookmarking" where
I am, and just plumbing the output to select the address
will do for that.
I think the output format at the moment is an artifact
of sam predating the plumber, and changing it makes
sense to me.
great idea begs the question why no-one ever did this before. -Steve
Quoth umbraticus@prosimetrum.com:
> This patch makes sam's = cmd output what seems to me a more
> useful (plumbable) format: /full/path/to/file:addr , where
> addr is line(s) under = and rune(s) under =#. I don't
> really see how one even could depend on the original format
> (maybe some complicated sam -d script?) but am open to
> thoughts & opinions.
Hello,
Unless there are any late objections, I think that this should be
merged (the updated patch in a follow-up mail).
Cheers,
qwx
Pushed. Thanks! Cheers, qwx