MPW Special Chars
Volume Number: | | 6
|
Issue Number: | | 7
|
Column Tag: | | MPW Notes
|
MPW Special Characters ![](img001.gif)
By Mark Andrews, Mountain View, CA
Using Special Characters In the Command Language
[Mark Andrews is the author of 15 computer books, including Atari Roots, Programming the Commodore 64 in Assembly Language, and Programming the Apple IIGS in Assembly Language and C. His newest book is Inside MPW, to be published this fall by Addison-Wesley. This article is an excerpt from Inside MPW.]
There are two ways to go about designing a computer language. You can construct it like a spoken language, so that it will be easy to learn and understand. Or you can design it using a more concise but less English-like model, so it will be faster, more efficient--and, all too often, quite difficult to master.
When the creators of MPW sat down to develop a shell language, they could have made it a lot more user-friendly. For instance, they could have used the word TOP instead of the character to represent the beginning of a file, the word BOTTOM instead of the symbol to represent the bottom, and the word SELECTION instead of § to represent the currently selected, or highlighted, text. That kind of approach would have made learning the MPW shell language a much less formidable task than it has turned out to be.
There would have been tradeoffs, of course. Once youve mastered the MPW command language, its much faster to type a command like : than it is to type something like FROM TOP TO BOTTOM SELECT ALL, which would be a possible alternative in a more English-like language. And a command interpreter can certainly parse three ASCII characters much faster than it could handle a long sequence of words in a more user-friendly language.
But thats really all quite academic. Like it or not, the MPW shell language is what weve got, and if you want to use MPW, theres no alternative but to learn the MPW command language.
Actually, MPW language uses two sets of special characters. One set is made up of the punctuation marks and other special symbols that are printed on the Macintosh keyboard. The other set comes from the Macintosh extended character set: the set of characters that you get when you press a key on your keyboard while holding the Option key down. And those extended characters can be a real headache when youre trying to master MPW. Not only do you have to learn how theyre used in the command language; since they dont appear on the keyboard, you also have to figure out--and then memorize--where to find them.
To make matters even more difficult, many special characters have more than one meaning in MPW; when they appear in one context, they mean one thing, and when theyre used in a different context, they often mean another.
The most notorious character with two meanings is undoubtedly the symbol (Option-D). When the character appears alone at the end of a line, MPW runs that line and the next line together, creating a single line. But when precedes the letter n, it acts as an escape character and generates a return.
Think about this for a moment, and youll realize that the character has two meanings that are exact opposites. Sometimes it deletes a return, and sometimes it creates one!
There are many other special characters that have more than one meaning in MPW. For example, an exclamation point means not in string and arithmetic operations, but stands for a line of text in certain editing operations. The character § sometimes stands for the current selection (either a block of highlighted text or the current position of the cursor), and sometimes stands for the name of a file. And so on.
One way to sort out the ambiguities in the special characters used by MPW would be to to list every meaning of every special character used in the MPW command language, and then to examine and resolve each ambiguity that you find. And thats just what has been done in Table 1 (except those used as arithmetic and logical operators/in menu commands/as number prefixes in arithmetic and logical operations), which appears at the end of this article. In addition to listing the meanings and categories of all special characters used in the MPW language, it shows how to type each character, describes the syntax in which each character is used, and provides an example showing how each character can be used in a command.
In compiling Table 1, I discovered that the MPW command language character set contains fourteen distinct kinds of characters. Since no breakdown of this kind had been published until I started working on Inside MPW, I took the liberty to draw up my own list of categories. From this research, these were the categories that emerged:
Whitespace characters
Command terminators
Wildcard characters
The escape character
The line-continuation character
The comment character #
Delimiters
The command substitution character
Filename generation operators
Selection expressions
Regular expression operators
Redirection operators
The number prefixes $, 0x, 0b, and 0 (not in Table 1)
Arithmetical and logical operators (not in Table 1)
Special characters used in makefiles
Whitespaces and Command Terminators
In MPW, a command is defined as a series of words and regular expressions separated by whitespaces and ending with a command terminator. There are only two whitespace characters in the MPW command language: Space and Tab. You can use either character to generate a space in an MPW command.
The most commonly used command terminator is the Return. Unless a return is followed immediately by the line continuation character , it always ends a command. Another command terminator that youll often see is the semicolon (;). By using a semicolon as a command terminator, you can type more than one command on a line.
The special-character combinations && and || are logical operators as well as command terminators. If you separate two commands with the characters &&, the second command will be executed only if the first command succeeds. Conversely, if you separate two commands with the characters ||, the second command will be executed only if the first command fails.
Selection Expressions
Selection expressions used in MPW include (Option 8), which represents the beginning of a file; (Option-5), which represents the end of a file; and § (Option-6) which represents the current selection. Another selection expression is the character (Option-J), which can be used to represent either the beginning or the end of a selection.
Delimiters
Many kinds of delimiters are used in the MPW command language. When you want to include a space or a special character in a string or an expression, you must enclose the command in single or double quotation marks.
If you use single quotes around an expression, every special character in the expression is interpreted literally, instead of being interpreted as a special character. If you use double quotes, all characters in the expression are taken literally except curly brackets ({...}), the backquote character (), and the escape character . If you want to use a shell variable as part of an expression, you must enclose the expression in single quotes, since variables in MPW are always delimited by curly brackets. And if the definition of a variable contains white spaces, then the curly brackets that enclose the variable must themselves be enclosed in quotes, like this: {MPW}.
If you want to use an apostrophe in a string, and dont want it be be interpreted as a single quote, you can put double quotes around the word containing the apostrophe. Or you can precede the apostrophe with the escape character .
The slash bar (/) and the backslash (\) are often used as delimiters with the commands, Find, Search, and Replace. When a string or expression delimited by slash bars (/.../) follows a Find command, Find searches in a forward direction. But when Find is followed by a string or expression enclosed in backslashes (\...\), the search goes in a backwards direction. Hence, to start at the beginning of a file and search for the beginning of the string charlie, you could execute the commands
Find ; Find /charlie/
But if you wanted to start at the end of a file and search backwards for end of the string charlie, you could execute the commands
Find ; Find \charlie\
One very interesting delimiter is the backquote character (). By placing a command between a pair backquote characters, you can pass its output to another command. For example, when you execute the command
Echo Files -t TEXT
the Files command compiles a list of files of the type TEXT, and passes the list to the Echo command, which then prints the list on the screen.
If there were enough space in this magazine, I could examine every special character used in MPW, and present interesting examples for each one--and, in Inside MPW, thats exactly what is done. Meanwhile, until the book comes out, take some time to study the examples in Table 1. Unless youre already an MPW wizard, chances are they can tell you a lot about how to use special characters in MPW.
AppleLink: D3001
TABLE 1: Special Characters Used in MPW
Chr Press Category Usage | Meaning | Example | Translation
|
|
# | # | Comment | #s | Characters between | # A comment | String following # is interpreted as a comment
|
| | | | # and terminator
|
| | | | are interpreted
|
| | | | as a comment
|
|
" | " | Delimiter | "s" | Delimits a string | Echo "{MPW}" >> | Echo the contents of the shell variable {MPW}
|
| | | | in which each | "{Target}" | to the target window
|
| | | | character is taken
|
| | | | literally, except
|
| | | | for , {}, and
|
|
' | ' | Delimiter | 's' | Delimits a string | Echo '{MPW}' >> | Echo the string "{MPW}" to the target window
|
| | | | in which all | "{Target}"
|
| | | | characters are
|
| | | | taken literally
|
|
( | ( | Delimiter | (p) | Delimits a group | Find /("*")+/ | Select a group of one or more asterisks
|
| | | | of characters that
|
| | | | form a pattern
|
|
) | ) | Delimiter | (p) | Delimits a group | Find /("*")+/ | Select a group of one or more asterisks
|
| | | | of characters that
|
| | | | form a pattern
|
|
/ | / | Delimiter | /r/ | Searches forward | Find /delta/ | Search forward and select the word "delta"
|
| | | | and selects regular
|
| | | | expression
|
|
» | Option-Shift-\
|
| | Delimiter | «n» | Delimits number | Find /[t]«2»/ | Select exactly two tabs
|
| | | | standing for number
|
| | | | of repetitions
|
|
» | Option-Shift-\
|
| | Delimiter | «n,» | Delimits number | Find /[t]«2,»/ | Select two or more tabs
|
| | | | standing for at
|
| | | | least n repetitions
|
|
» | Option-Shift-\
|
| | Delimiter | «n1,n2» | Delimits number | Find /[t]«2,4»/ | Select two to four tabs
|
| | | | standing for n to
|
| | | | n repetitions
|
|
« | Option-\
|
| | Delimiter | «n» | Delimits number | Find /[t]«2»/ | Select exactly two tabs
|
| | | | standing for number
|
| | | | of repetitions
|
|
« | Option-\
|
| | Delimiter | «n,» | Delimits number | Find /[t]«2,»/ | Select two or more tabs
|
| | | | standing for at
|
| | | | least n repetitions
|
|
« | Option-\
|
| | Delimiter | «n1,n2» | Delimits number | Find /[t]«2,4»/ | Select two to four tabs
|
| | | | standing for n to
|
| | | | n repetitions
|
|
[ | [ | Delimiter | [...] | Delimits a pattern | Find /[A-F]/ | Search for any character in the set A-F
|
|
\ | \ | Delimiter | \r\ | Searches backwards | Find \alpha\ | Search backwards and select the word "alpha"
|
| | | | and selects regular
|
| | | | expression
|
|
] | ] | Delimiter | [...] | Delimits a pattern | Find /[A-F]/ | Search for any character in the set A-F
|
|
` | ` | Delimiter | c1 `c2` Sends output of | Echo | Files command sends its output to Echo command,
|
| | | | command c2 to | `Files -t TEXT` | which prints the output on the screen
|
| | | | command c1 for
|
| | | | processing
|
|
{ | { | Delimiter | {v} | Delimits variable v | Echo "{MPW}" | Echoes contents of shell variable {MPW}
|
|
} | } | | Delimiter | {v} | Delimits variable v | Echo "{MPW}" | Echoes contents of shell variable {MPW}
|
|
| Option-D |
|
| | | Escape | n | Return | Echo n | Echo a return
|
|
| Option-D
|
| | | Escape | t | Tab | Echo n | Echo a tab
|
|
| Option-D
|
| | | Escape | f | Form feed | Echo n | Echo a form feed
|
|
| Option-D
|
| | | Escape | ¬ | Defeats the meaning | Echo ¬ | Output: ¬
|
| | | | | | of the special
|
| | | | | | character that
|
| | | | | | follows it
|
|
* | * | Filename op. | n* | Matches zero or | X* | Match zero or more occurrences of character X
|
| | | | | | more occurrences of
|
| | | | | | the preceding
|
| | | | | | character or
|
| | | | | | character list
|
|
+ | + | Filename op. | r+ | Matches one or more | X+ | Match one or more occurrences of character X
|
| | | | | | occurrences of the
|
| | | | | | preceding character
|
| | | | | | or characters
|
|
?* | ?* (same as )
|
| | Filename op. | ?* | Matches any number
|
| | | | ?*.c | Matc any filename with the extension ".c"
|
| | | | | | of any characters
|
| | | | | | in a filename
|
|
¬ | Option-L
|
| | Filename op. | [¬list] | Matches any
|
| | | | | | [¬A-F] | Match any character that is not in the set A-F
|
| | | | | | | character not in
|
| | | | | | | the list
|
|
» | Option-Shift-\ | Filename op. | «n» | Delimits number [X]«2» | Match two occurrences of the character X
|
| | | | | | | standing for number
|
| | | | | | | of repetitions
|
|
« | Option-\ | Filename op. | «n» | Delimits number | [X]«2» | Match two occurrences of the character X
|
| | | | | | standing for number
|
| | | | | | of repetitions
|
|
[ | [ | Filename op. | [...] | Delimits a pattern | [A-F] | Match any character in the set A-F
|
|
] | ] | Filename op. | [...] | Delimits a pattern | [A-F] | Match any character in the set A-F
|
|
| | Filename op. | | Matches any number | .c | Match any filename with the extension ".c"
|
| | | | | | of any characters
|
| | | | | | in a filename
|
|
| Option-D
|
| | Line cont. | l l | If stands alone | (First line:) | Output: How are you today?
|
| | | | | | at end of a line, | Echo How are
|
| | | | | | MPW joins line to | (Second line:)
|
| | | | | | next line, ignoring | you today?
|
| | | | | | return
|
|
" | " | Make | "s" | Delimits a str in | "{CLibraries}" | The C runtime libraries
|
| | | | | which each char | CRuntime.o
|
| | | | | is taken literally,
|
| | | | | except for , {},
|
| | | | | and
|
|
# | # | Make | #s | Characters between | ### Dependency | String following # is interpreted as a comment.
|
| | | | | # and terminator | rules ###
|
| | | | | are interpreted as
|
| | | | | a comment
|
|
' | ' | Make | 's' | Delimits a string | '{CLibraries}' | The C runtime libraries
|
| | | | | in which all | CRuntime.o
|
| | | | | characters are
|
| | | | | taken literally
|
|
| Option-D |
|
| Make | l l | If stands alone | (First line:) | Output: Sample Sample.p.o Sample.r
|
| | | | | | at end of a line, | Sample
|
| | | | | | MPW joins line to | Sample.p.o
|
| | | | | | next line, ignoring | (Second line:)
|
| | | | | | return | Sample.r
|
|
| Option-F |
|
| Make | f1 f1 | File f1 depends on | Sample.p.o | File Sample.p.o depends on file Sample.p
|
| Option-F |
|
| Make | f1 f1 | File f1 depends on | Sample | File Sample depends on file Sample.p.o, and
|
| | | | | | file f2, and f2 has | Sample.p.o | Sample p.o. has its own set of build commands
|
| | | | | | its own build cmds
|
|
< | < | Redirection | <f | Standard input i | Alert < Errors | Display an alert dialog containing the contents
|
| | | | | | | taken from | | of the file Errors
|
| | | | | | | filename f
|
|
> | > | Redirection | >f | Redirects standard | Echo "{Status}" | Write contents of shell variable {Status} to
|
| | | | | output, replacing | > Errors | file Errors, replacing its previous contents
|
| | | | | contents of file f
|
|
>> | >> | Redirection | >>f | Redirects standard | Echo "{Status}" | Append contents of shell variable {Status} to
|
| | | | | output, appending | >> Errors | the end of file Errors
|
| | | | | it to contents of
|
| | | | | file f
|
|
| Option-> |
|
| Redirection | f | Redirects | (Files .p ||) List filenames that end in ".p". Send diagno-
|
| | | | | | diagnostics, | Error | stics to file Errors, replacing its contents
|
| | | | | | replacing contents
|
| | | | | | of file f
|
|
| Option-> |
|
| Redirection | f | Redirects | (Files .p ||) | List filenames that end in ".p". Append
|
| | | | | diagnostics, | Errors | diagnostics to end of file Errors
|
| | | | | replacing contents
|
| | | | | of file f
|
|
| Option-W |
|
| Redirection | f | Redirects both | (Files .p ||) | List filenames ending in ".p". Send output,
|
| | | | | standard output and | Temp | diagnostics to file Temp, replacing its
|
| | | | | | diagnostics to | | | contents
|
| | | | | | file f
|
|
| Option-W |
|
| Redirection | f | Redirects both | (Files .p ||) | List filenames ending in ".p". Append
|
| | | | | standard output and | Temp | output and diagnostics to file Temp
|
| | | | | diagnostics to
|
| | | | | file f
|
|
!~ | !~ |
|
| Reg.expr.op. | "s1" !~ | True if s1 is not | Echo `Evaluate | Output: 1
|
| | | | | /s2/ | equal to s2 | "alpha" !~
|
| | | | | /beta/`
|
|
* | * |
|
| Reg.expr.op. | r* | Selects zero or | Find /('*')+ | Select a group of one or more asterisks
|
| | | | | | more occurrences of | '/'[rt ]*/ | followed by a slash bar and 0 or more white
|
| | | | | | regular expression | | spaces
|
|
+ | + | Reg.expr.op. | r+ | Selects one or more | Find /('*')+'/'/ | Select a group of one or more asterisks
|
| | | | | | occurrences of
|
| | | | | | regular expression
|
|
- | - |
|
| | Reg.expr.op. | c1-c2 Stands for range | Find | Select any word made up of upper- and
|
| | | | | | of characters | /[A-Za-z]+n/ | lower-case letters that appears at the end
|
| | | | | | between c1 and c2 | | of a line
|
|
=~ | =~ |
|
| | Reg.expr.op. | "s1" | True if s1 is equal | Echo `Evaluate | Output: 1
|
| | | | | =~ /s2/ | to s2 | "beta" =~
|
| | | | | /beta/`
|
|
: | Colon
|
| | Reg.expr.op. | s:s | All text between | Find : | Select (highlight) all text in file
|
| | | | | | (two selections)
|
|
|
| Option-5 |
|
| | Reg.expr.op. | cmd -c
|
| | | | | | (With command that | Replace -c | Replace string "123" with string "456" every
|
| | | | | | takes a -c option): | /123/ 456 | time it appears in target window
|
| | | | | | Repeats command to
|
| | | | | | end of file
|
|
| Option-5 | Reg.expr.op. | r
|
| | | | | | Selects regular | Find /arlie / | Select the letters "arlie" at the end of a line
|
| | | | | | expression at the
|
| | | | | | end of a line
|
|
| Option-8 | Reg.expr.op. | r
|
| | | | | | Selects regular | Find /ch/ | Select letters "ch" at the beginning of a line.
|
| | | | | | expression at the
|
| | | | | | beginning of a line
|
|
| Option-; | Reg.expr.op. | c
|
| | | | | | Executes "Commando" TileWindows | Invoke TileWindows Commando
|
| | | | | | command, invokes
|
| | | | | | Commando dialog
|
| | | | | | for command c
|
|
¬ | Option-L |
|
| | Reg.expr.op. | [¬list] | Any character not | Replace -c / | Replace all characters except A-Z, a-z, returns
|
| | | | | | | in the list | [¬A-Za-zn" "] | and spaces with asterisks
|
| | | | | | | / "*"
|
|
® | Option-R |
|
| | Reg.expr.op. | r®n | Tags regular | Replace /([a-z | Reverse the order of two words separated by one
|
| | | | | | expression with a | A-Z]+)®1[ ]+([ | or more spaces
|
| | | | | | number (range: 1-9) | a-zA-Z]+)®2/ |
|
| | | | | | '®2 ®1'
|
|
! | ! | Selection | !n | Selects the line | Find !3 | Select the third line after the current
|
| | | | | that is n lines | | selection
|
| | | | | after end of
|
| | | | | current selection
|
|
! | ! | Selection | r!n | Places insertion | Find /alpha/!3 | Place insertion point three characters after
|
| | | | | point n characters | | the word "alpha"
|
| | | | | after regular
|
| | | | | expression
|
|
¡ | Option-! |
|
| Selection | ¡n | Places insertion | Find ¡3 | Place insertion point three lines before start
|
| | | | | point n lines before | | of current selection
|
| | | | | start of current
|
| | | | | selection
|
|
| Option-5 |
|
| Selection | | End of file | Find | Place insertion point after last character in
|
| | | | | | file
|
|
§ | Option-6 |
|
| Selection | § | Current selection | Copy § | Copy the current selection (highlighted text)
|
| | | | | to the Clipboard
|
|
| Option-8 |
|
| Selection | | Beginning of file | Find | Place insertion point before first character in
|
| | | | | file
|
|
| Option-J |
|
| Selection | r | Places insertion | Find /charlie/ | Place insertion point before first character in
|
| | | | | point before first | | the word "charlie"
|
| | | | | char in regular
|
| | | | | expression
|
|
| Option-J |
|
| Selection | r | Places insertion | Find /charlie/ | Place insertion point after last character of
|
| | | | | point after last | | the word "charlie"
|
| | | | | character of
|
| | | | | regular expression
|
|
&& | && |
|
| Terminator | c1 && c2 Executes command c2 | Find /charlie/ | If string "charlie" is found, MPW echoes,
|
| | | | | if command c1 | && Echo Found! | "Found!"
|
| | | | | succeeds
|
|
; | ; |
|
| Terminator | c ; c | Treats commands o | Echo hello ; | Output: (First line:) Hello (Second line:)
|
| | | | | the same line as if Echo goodbye | Goodbye
|
| | | | | they were on
|
| | | | | different lines
|
|
Return |
|
| Separates | Terminator | c (r) | Ends command | Echo Hello(r) | Output: Hello
|
| commands
|
|
| | | |
|
| Terminator | c1 | c2 |
|
| | | | | Pipes output of | Files | Count -l | Files pipes a list of files to Count, which
|
| | | | | command c1 to | | prints the list on the screen
|
| | | | | input of c2
|
|
|| | || |
|
| Terminator | c1 || c2 | Executes command c2 | Find /zebra/ | Searches for string "zebra" and echoes "Sorry!"
|
| | | | | if command c1 fails | || Echo Sorry! | if search fails
|
|
Sp | Space |
|
| Whitespace | w w | Separates words | Echo Hello | Output: Hello
|
|
Tab | Tab |
|
| Whitespace | w w | Separates words | Echo Hello | Output: Hello
|
|
? | ? | Wildcard |
|
| | | | ? | Matches any single | Find /Bar?/ | Select any four-character word that begins with
|
| | | | | character in a | | "Bar"
|
| | | | | string
|
|
?* | ?* (same as )
|
| Wildcard | chars?* | Matches any number | Find /Mar?*/ | Select any word that begins with "Mar"
|
| | | | | of occurrences of
|
| | | | | any character
|
| | | | | (same as )
|
|
| Option-X | |
|
| Wildcard | | Matches any number | Find /Mar / | Select any word that begins with "Mar"
|
| | | | | of any characters
|
| | | | | in a string
|