![](/file/12652/www.mactech.com.tar/www.mactech.com/sites/all/themes/custom_front/images/you_are_here_red.gif)
![](/file/12652/www.mactech.com.tar/www.mactech.com/sites/default/files/beta-site.gif)
|
Volume Number: 15 (1999)
Issue Number: 1
Column Tag: Tips & Tidbits
Jan 99 Tips
by Jeff Clites <online@mactech.com>
Autocompletion in MPW
One very useful feature of many Unix shells is that you only need to type the beginning of a command, hit tab, and it fills in the complete command. I was really missing this on MPW, especially with long command names such as UnobsoleteNameRevisions.
So here's a script that attempts to provide this feature in MPW, as well as possible. Bind it to Command-Tab (or whatever you want), then type "nam", hit Command-Tab, and watch it fill in "NameRevisions" for you.
Note: if nothing is selected, it will try to complete the last word on the current line. If you want to complete a word in the middle of a line, you'll have to select it.
If ":" is in your {Commands} variable, it will also consider all files in the current directory, as I have found no way to figure out whether a file is an MPW script or not. Actually, this may even be useful.
# get the current selection Set CurrentSelection "'Catenate "{Active}".§'" If "{CurrentSelection}" == "" # select the entire line we're on Find !0 "{Active}" # put the insertion point at the beginning of this line Find Δ§:Δ§ "{Active}" # remember line number, so we can restore it later Set CurrentLine 'Position -l "{Active}"' # select the last word on this line Find /[¬ ∂t∂n]+[ ∂t]*∞/ "{Active}" || (Beep; Exit 0) # if it isn't really on our current line, exit If 'Position -l "{Active}"' != {CurrentLine} Find {CurrentLine} "{Active}" Beep Exit 0 End Set CurrentSelection "'Catenate "{Active}".§'" # strip spaces from the end, if any If "{CurrentSelection}" =~ /([¬ ∂t]+)®1[ ∂t]*/ Set CurrentSelection "{®1}" End # can this happen at this point? If "{CurrentSelection}" == "" Beep Exit 0 End End # a list of matching command names Set CommandList "" # the number of matches found Set Matches 0 # first see if it's one of the built-in commands # (we really have to list them all here, sigh...) For i In ∂ AddMenu AddPane Adjust Alert Alias Align AuthorInfo ∂ Beep Begin Break Browser Catenate CheckIn CheckOut ∂ CheckOutDir Clear Close Confirm Continue Copy Cut Date ∂ Delete DeleteMenu DeleteNames DeletePane ∂ DeleteRevisions Directory Duplicate ∂ DuplicateNameRevisions Echo Eject Equal Erase Evaluate ∂ Execute Exists Exit Export Files Find Flush ∂ FlushAllVolumes For Format Help HideWindows If ∂ LockNameRevisions Loop Mark Markers ModifyReadOnly ∂ Monitors Mount MountProject Move MoveWindow ∂ NameRevisions New Newer NewFolder NewProject ∂ ObsoleteNameRevisions ObsoleteProjectorFile Open ∂ Parameters Paste PlaySound Position Project ProjectInfo ∂ Quit Quote Redo Rename RenameProjectorFile Replace ∂ Request ResolveAlias Revert RotatePanes RotateWindows ∂ RProj RShell Save SaveOnClose Set SetFile SetKey Shift ∂ ShowSelection ShowWindows Shutdown SizeWindow ∂ StackWindows Target TickCount TileWindows Unalias Undo ∂ Unexport UnlockNameRevisions Unmark Unmount ∂ UnmountProject UnobsoleteNameRevisions ∂ UnObsoleteProjectorFile Unset UnsetKey ∂ UpdateProjectorDatabase Version Volumes Which Windows ∂ ZoomWindow If "{i}" =~ /{CurrentSelection}≈/ Set CommandList "{CommandList} {i}" Evaluate Matches += 1 End End # now process every folder in the current {Commands} list For Folder in 'Which' For File In 'Files "{Folder}" -s' # append all matching names to our list of command names If "{File}" =~ /{CurrentSelection}≈/ Set CommandList "{{CommandList}} '{File}'" Evaluate Matches += 1 End End End # no matching names found If {Matches} == 0 Find /∞/ "{Active}" Exit 0 End # if more than one name was found, present a list # to choose from If {Matches} > 1 Set CommandList "'GetListItem -sort -s -c {CommandList}'" Exit 0 If "{CommandList}" == "" Else If "{CommandList}" =~ / (≈)®1/ # if only one name was found, it has a space at the # beginning; strip it. And remove any unnecessary # quoting. Set CommandList "'Quote {®1}'" End # replace the selection with the found (or chosen) name Echo -n "{CommandList} " > "{Active}".§ Find §Δ "{Active}"
Stefan Haller
stk@snafu.de
![](/file/12652/www.mactech.com.tar/www.mactech.com/sites/all/themes/custom_front/img/search_text.gif)
- SPREAD THE WORD:
- Slashdot
- Digg
- Del.icio.us
- Newsvine