mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
73ea36569e
Fixes #122, #140. As reported in #122, `file:1:1` moves to the end of the file, and `file:1:2` fails with “address out of range”. I’ll use file:2:3 as an example so we can tell the line and column number apart. What’s happening is this: plumb/basic matches `2:3` using twocolonaddr (from plumb/fileaddr), then sets addr to `2-#1+#3` (the 1 is constant and was introduced because column numbers are 1-based). Acme interprets this in three steps: 1. find the range (q0, q1) that contains line 2 2. create the range (q2, q2) where q2 = q0 - 1 3. create the range (q3, q3) where q3 = q2 + 3 The second step has a branch where if q0 == 0 and 1 > 0 (remember that 1 is constant and comes form plumb/basic), q0 is set to the end of the file. This makes addressing things at the end of the file easier. The problem then is that if we select line 1, which starts at the beginning of the file, q0 is always 0 and the branch in step 2) will always be used. `1:1` is interpreted as `1-#1+#1` which starts at 0, wraps around to the end of the file, then moves 1 character backwards and then forwards again, ending at the end of the file. `1:2` is interpretes as `1-#1+#2` which starts at 0, wraps around to the end od the file, then moves 1 character backwards and tries moving 2 characters forwards beyond the end of the file, resulting in the out of range error. In #140 @rsc proposed transforming `:X:Y` into `:X-#0+#Y-#1` instead since that avoids wrapping around by not moving backwards at first. This change modifies `plumb/basic` to do that.
153 lines
4.3 KiB
Text
153 lines
4.3 KiB
Text
# these are generally in order from most specific to least,
|
|
# since first rule that fires wins.
|
|
|
|
include fileaddr
|
|
|
|
# declarations of ports without rules
|
|
plumb to seemail
|
|
plumb to showmail
|
|
|
|
# relative files as file: urls get made into absolute paths
|
|
type is text
|
|
data matches 'file:([.a-zA-Z¡-0-9_\-]([.a-zA-Z¡-0-9_/\-]*[a-zA-Z¡-0-9_/\-]))?'
|
|
arg isfile $1
|
|
data set file://$file
|
|
plumb to web
|
|
plumb start web $data
|
|
|
|
# urls go to web browser
|
|
type is text
|
|
data matches '(https?|ftp|file|gopher|mailto|news|nntp|telnet|wais|prospero)://[a-zA-Z0-9_@\-]+([.:][a-zA-Z0-9_@\-]+)*/?[a-zA-Z0-9_?,%#~&/\-+=]+([:.][a-zA-Z0-9_?,%#~&/\-+=]+)*'
|
|
plumb to web
|
|
plumb start web $0
|
|
|
|
# doc and rtf files go to wdoc2txt
|
|
type is text
|
|
data matches '[a-zA-Z¡-0-9_\-./]+'
|
|
data matches '([a-zA-Z¡-0-9_\-./]+)\.(doc|rtf)'
|
|
arg isfile $0
|
|
plumb to msword
|
|
plumb start wdoc2txt $file
|
|
|
|
# start rule for microsoft word documents without .doc suffix
|
|
type is text
|
|
dst is msword
|
|
plumb to msword
|
|
plumb start wdoc2txt $file
|
|
|
|
# image files go to page
|
|
type is text
|
|
data matches '[a-zA-Z¡-0-9_\-./@]+'
|
|
data matches '([a-zA-Z¡-0-9_\-./@]+)\.(jpe?g|JPE?G|gif|GIF|tiff?|TIFF?|ppm|bit|png|PNG)'
|
|
arg isfile $0
|
|
plumb to image
|
|
plumb start 9 page $file
|
|
|
|
# postscript/pdf/dvi go to page but not over the a plumb port
|
|
# the port is here for reference but is unused
|
|
type is text
|
|
data matches '[a-zA-Z¡-0-9_\-./@]+'
|
|
data matches '([a-zA-Z¡-0-9_\-./@]+)\.(ps|PS|eps|EPS|pdf|PDF|dvi|DVI)'
|
|
arg isfile $0
|
|
plumb to postscript
|
|
plumb start 9 page $file
|
|
|
|
# open office - s[xt][cdigmw], doc, xls, ppt
|
|
data matches '[a-zA-Z¡-0-9_\-./@]+'
|
|
data matches '([a-zA-Z¡-0-9_\-./@]+)\.([Ss][XxTt][CcDdIiGgMmWw]|[Dd][Oo][Cc]|[Xx][Ll][Ss]|[Pp][Pp][Tt])'
|
|
arg isfile $0
|
|
plumb to openoffice
|
|
plumb start openoffice $file
|
|
|
|
# existing files tagged by line number:columnumber or linenumber.columnumber, twice, go to editor
|
|
type is text
|
|
data matches '([.a-zA-Z¡-0-9_/\-@]*[a-zA-Z¡-0-9_/\-])':$twocolonaddr,$twocolonaddr
|
|
arg isfile $1
|
|
data set $file
|
|
attr add addr=$2-#0+#$3-#1,$4-#0+#$5-#1
|
|
plumb to edit
|
|
plumb client $editor
|
|
|
|
# existing files tagged by line number:columnumber or linenumber.columnumber, twice, go to editor
|
|
type is text
|
|
data matches '([.a-zA-Z¡-0-9_/\-@]*[a-zA-Z¡-0-9_/\-])':$twocolonaddr
|
|
arg isfile $1
|
|
data set $file
|
|
attr add addr=$2-#0+#$3-#1
|
|
plumb to edit
|
|
plumb client $editor
|
|
|
|
# existing files, possibly tagged by line number, go to editor
|
|
type is text
|
|
data matches '([.a-zA-Z¡-0-9_/\-@]*[a-zA-Z¡-0-9_/\-])('$addr')?'
|
|
arg isfile $1
|
|
data set $file
|
|
attr add addr=$3
|
|
plumb to edit
|
|
plumb client $editor
|
|
|
|
# .h files are looked up in /usr/include and passed to edit
|
|
type is text
|
|
data matches '([a-zA-Z¡-0-9/_\-]+\.h)('$addr')?'
|
|
arg isfile /usr/include/$1
|
|
data set $file
|
|
attr add addr=$3
|
|
plumb to edit
|
|
plumb client $editor
|
|
|
|
# .h files are looked up in /usr/local/include and passed to edit
|
|
type is text
|
|
data matches '([a-zA-Z¡-0-9/_\-]+\.h)('$addr')?'
|
|
arg isfile /usr/local/include/$1
|
|
data set $file
|
|
attr add addr=$3
|
|
plumb to edit
|
|
plumb client $editor
|
|
|
|
# .h files are looked up in $plan9/include and passed to edit
|
|
type is text
|
|
data matches '([a-zA-Z¡-0-9/_\-]+\.h)('$addr')?'
|
|
arg isfile $plan9/include/$1
|
|
data set $file
|
|
attr add addr=$3
|
|
plumb to edit
|
|
plumb client $editor
|
|
|
|
# .m files are looked up in /usr/inferno/module and passed to edit
|
|
type is text
|
|
data matches '([a-zA-Z¡-0-9/_\-]+\.m)('$addr')?'
|
|
arg isfile /usr/inferno/module/$1
|
|
data set $file
|
|
attr add addr=$3
|
|
plumb to edit
|
|
plumb client window $editor
|
|
|
|
# faces -> new mail window for message
|
|
type is text
|
|
data matches '[a-zA-Z¡-0-9_\-./]+'
|
|
data matches '/mail/fs/[a-zA-Z¡-0-9/]+/[0-9]+'
|
|
plumb to showmail
|
|
plumb start window -r 4 120 750 600 upas/nedmail -s $0
|
|
|
|
# email addresses get a new mail window
|
|
type is text
|
|
data matches '[a-zA-Z0-9_+.\-]+@[a-zA-Z0-9_+.\-]*'
|
|
plumb to sendmail
|
|
plumb start wmail $0
|
|
# plumb start window rc -c '''echo % mail '''$0'; mail '$0
|
|
|
|
# man index entries are synthesized
|
|
type is text
|
|
data matches '([a-zA-Z¡-0-9_\-./]+)\(([1-8])\)'
|
|
plumb start rc -c 'man '$2' '$1' >[2=1] | nobs | plumb -i -d edit -a ''action=showdata filename=/man/'$1'('$2')'''
|
|
|
|
# start rule for images without known suffixes
|
|
dst is image
|
|
arg isfile $data
|
|
plumb to image
|
|
plumb start 9 page $data
|
|
|
|
# start rule for postscript without known suffixes
|
|
dst is postscript
|
|
arg isfile $data
|
|
plumb start 9 page $data
|