Difference between revisions of "Using your own editor"
m (→Larger Program: Reworded the warning - it only overwrites the item.) |
|||
| (8 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
| + | There are two programs listed below, both of which accomplish similar goals. The first is the simplest to install, while the second is more powerful. Note that either may be altered to use your favourite editor, but that the second is much more closely tied to Vim. | ||
| + | |||
| + | ==Small Script== | ||
This little script was given to me by Tom Hoogenboom: | This little script was given to me by Tom Hoogenboom: | ||
| Line 17: | Line 20: | ||
* | * | ||
end | end | ||
| + | |||
| + | Note - this currently doesn't work when OpenQM is executed by xinetd under 2.6-6. | ||
| + | If you execute OpenQM from the command line it works ok. It appears that the I/O redirection | ||
| + | is somehow broken when OpenQM is executed as a server (accessed via telnet <hostname> <port>) | ||
| + | |||
| + | ==Larger Program== | ||
| + | [[Image:Qm-vim.png|thumb|right|Editing the VIM program in Vim]] | ||
| + | Written by Tom Potts. | ||
| + | |||
| + | This is a more sophisticated program with the beginnings of some extra usefulness. The syntax highlighting is naive, but useful; the dynamic-file editing is dangerous, but works okay, and it is robust enough to work with multifiles and Q-pointers. If enough people think this is worthwhile, I'll clean it up a bit and put it in the main repository. Oh, and there has to be a better way to do the 'itempath' stuff -- any ideas, anyone? | ||
| + | |||
| + | '''DISCLAIMER''': | ||
| + | If you use this program to edit an item in a dynamic file, it '''will''' overwrite it when you have finished editing. It is very unsafe, and I'm not happy about it, but if you use it carefully it should be okay. If you think of a neat way of avoiding this problem, please let me know! | ||
| + | |||
| + | ===Installation=== | ||
| + | Save this program in GPL.BP as 'ITEMPATH', and compile it. | ||
| + | <pre> | ||
| + | function itempath(item.id) | ||
| + | |||
| + | $catalogue global | ||
| + | |||
| + | path = "" | ||
| + | |||
| + | for i = 1 to len(item.id) | ||
| + | char = item.id[i,1] | ||
| + | begin case | ||
| + | case char = '"' | ||
| + | path := '%Q' | ||
| + | case char = '%' | ||
| + | path := '%P' | ||
| + | case char = '*' | ||
| + | path := '%A' | ||
| + | case char = '+' | ||
| + | path := '%V' | ||
| + | case char = ',' | ||
| + | path := '%C' | ||
| + | case char = '/' | ||
| + | path := '%S' | ||
| + | case char = ':' | ||
| + | path := '%X' | ||
| + | case char = ';' | ||
| + | path := '%Y' | ||
| + | case char = '<' | ||
| + | path := '%L' | ||
| + | case char = '=' | ||
| + | path := '%E' | ||
| + | case char = '>' | ||
| + | path := '%G' | ||
| + | case char = '?' | ||
| + | path := '%Z' | ||
| + | case char = '\' | ||
| + | path := '%B' | ||
| + | case 1 | ||
| + | path := char | ||
| + | end case | ||
| + | next i | ||
| + | |||
| + | return path | ||
| + | |||
| + | end | ||
| + | </pre> | ||
| + | Save this program in GPL.BP as 'VIM' and compile it. | ||
| + | <pre> | ||
| + | $include keys.h | ||
| + | $include syscom parser.h | ||
| + | |||
| + | $internal | ||
| + | $catalogue $VIM | ||
| + | |||
| + | equate vimfile to "$VIMFILE" | ||
| + | equate qmbasic.vim to "/usr/qmsys/qmbasic.vim" | ||
| + | |||
| + | equate filetype$unset to 0 | ||
| + | equate filetype$null to 1 | ||
| + | equate filetype$basic to 2 | ||
| + | equate filetype$paragraph to 3 | ||
| + | equate filetype$proc to 4 | ||
| + | |||
| + | deffun itempath(id) | ||
| + | |||
| + | filename = "" | ||
| + | filetype = filetype$unset | ||
| + | itemids = "" | ||
| + | |||
| + | *** Get variables | ||
| + | call !parser(parser$reset, 0, @sentence, 0) | ||
| + | call !parser(parser$get.token, token.type, string, keyword) ;* Verb | ||
| + | |||
| + | * Get the file (using mfile rather than get.token for multifiles) | ||
| + | call !parser(PARSER$MFILE, token.type, filename, keyword) | ||
| + | if filename = "" then | ||
| + | * prompted.for.file.name = @true | ||
| + | display sysmsg(6501) : ;* File name? | ||
| + | input filename | ||
| + | * filename = trimf(trimb(filename)) | ||
| + | * if filename = "" then goto exit.sed | ||
| + | if filename = "" then stop | ||
| + | end else | ||
| + | * prompted.for.file.name = @false | ||
| + | if keyword = KW$DICT then | ||
| + | * dict.flag = "DICT" | ||
| + | call !parser(PARSER$MFILE, token.type, filename, keyword) | ||
| + | filename = "DICT " : filename | ||
| + | end | ||
| + | end | ||
| + | |||
| + | *** Validate file | ||
| + | open filename to filevar else | ||
| + | filename = upcase(filename) | ||
| + | open filename to filevar else | ||
| + | crt "Could not open file." | ||
| + | stop | ||
| + | end | ||
| + | end | ||
| + | |||
| + | using.vimfile = @false | ||
| + | if fileinfo(filevar, FL$TYPE) # FL$TYPE.DIR then | ||
| + | open vimfile to vimfilevar then | ||
| + | using.vimfile = @true | ||
| + | end else | ||
| + | crt "vim can only act on directory files." | ||
| + | stop | ||
| + | end | ||
| + | end | ||
| + | |||
| + | if filetype = filetype$unset then | ||
| + | * If there exists a '.OUT' file... | ||
| + | open filename : ".OUT" to dummyfile then | ||
| + | filetype = filetype$basic | ||
| + | close dummyfile | ||
| + | end else | ||
| + | * ... | ||
| + | end | ||
| + | end | ||
| + | |||
| + | if (using.vimfile) then | ||
| + | path = fileinfo(vimfilevar, FL$PATH) | ||
| + | end else | ||
| + | path = fileinfo(filevar, FL$PATH) | ||
| + | end | ||
| + | |||
| + | *** Get the items to edit | ||
| + | loop | ||
| + | call !parser(parser$get.token, token.type, string, keyword) | ||
| + | until token.type = parser$end | ||
| + | * crt " ~" : string | ||
| + | itemids<-1> = string | ||
| + | repeat | ||
| + | |||
| + | command = "vim" | ||
| + | for i = 1 to dcount(itemids, @am) | ||
| + | read record from filevar, itemids<i> else | ||
| + | * We shouldn't really convert to uppercase. | ||
| + | * read record from filevar, upcase(itemids<i>) then | ||
| + | * itemids<i> = upcase(itemids<i>) | ||
| + | * end | ||
| + | end | ||
| + | if (using.vimfile) then | ||
| + | execute "copy from " : filename : " to " : vimfile : " " : itemids<i> : ", " : @userno : itemids<i> : " overwriting" capturing junk | ||
| + | item.path = itempath(@userno : itemids<i>) | ||
| + | end else | ||
| + | item.path = itempath(itemids<i>) | ||
| + | end | ||
| + | command := " " : path : "/" : item.path | ||
| + | next i | ||
| + | |||
| + | command = swap(command, "$", "\$") | ||
| + | command = swap(command, "&", "\&") | ||
| + | |||
| + | if filetype = filetype$basic then | ||
| + | command := " -S " : qmbasic.vim | ||
| + | end | ||
| + | |||
| + | os.execute command | ||
| + | |||
| + | if (using.vimfile) then | ||
| + | for i = 1 to dcount(itemids, @am) | ||
| + | execute "copy from " : vimfile : " to " : filename : " " : @userno : itemids<i> : ", " : itemids<i> : " overwriting deleting" capturing junk | ||
| + | next i | ||
| + | end | ||
| + | |||
| + | end | ||
| + | </pre> | ||
| + | To enable syntax highlighting, save this file as 'qmbasic.vim' in /usr/qmsys. | ||
| + | <pre> | ||
| + | syntax clear | ||
| + | |||
| + | syntax case ignore | ||
| + | |||
| + | "set autoindent | ||
| + | set tabstop=3 | ||
| + | set shiftwidth=3 | ||
| + | |||
| + | set nu | ||
| + | |||
| + | function GetQMBasicIndent() | ||
| + | let bob = getline(".") | ||
| + | if (match(bob, '\cthen *$') >= 0) | ||
| + | return indent(".") + 3 | ||
| + | endif | ||
| + | return -1 | ||
| + | endfunction | ||
| + | set indentexpr=GetQMBasicIndent() | ||
| + | set smartindent | ||
| + | |||
| + | setlocal iskeyword+=. | ||
| + | setlocal iskeyword+=$ | ||
| + | setlocal iskeyword+=@-@ | ||
| + | setlocal iskeyword+=! | ||
| + | |||
| + | "syn keyword qmbasicCompilerDir $catalogue $catalog | ||
| + | "syn keyword qmbasicCompilerDir $debug | ||
| + | "syn keyword qmbasicCompilerDir $define | ||
| + | "syn keyword qmbasicCompilerDir $execute | ||
| + | "syn keyword qmbasicCompilerDir $ifdef $ifndef | ||
| + | "syn keyword qmbasicCompilerDir $include | ||
| + | ""not sure whether this is a CompilerDir, or a Statement | ||
| + | "syn keyword qmbasicCompilerDir include | ||
| + | "syn keyword qmbasicCompilerDir $list | ||
| + | "syn keyword qmbasicCompilerDir $mode | ||
| + | "syn keyword qmbasicCompilerDir $nocase.strings | ||
| + | "syn keyword qmbasicCompilerDir $qmcall | ||
| + | |||
| + | syn region qmbasicCompilerDir start="^[ \t]*#" end="$" | ||
| + | syn region qmbasicCompilerDir start="^[ \t]*\$" end="$" | ||
| + | syn region qmbasicCompilerDir start="^[ \t]*include" end="$" | ||
| + | |||
| + | "syntax region qmbasicThenBlock start=/then$/ end=/end/ contains=qmbasicThenBlock contains=qmbasicElseBloc | ||
| + | "syntax region qmbasicElseBlock start=/else$/ end=/end/ contains=qmbasicThenBlock contains=qmbasicElseBlock | ||
| + | |||
| + | syn keyword qmbasicAtVar @am @fm @im @sm @svm @tm @vm | ||
| + | syn keyword qmbasicAtVar @true @false | ||
| + | syn keyword qmbasicAtVar @abort.code @abort.message | ||
| + | syn keyword qmbasicAtVar @ans @command @command.stack @crthigh @crtwide | ||
| + | syn keyword qmbasicAtVar @data.pending @date @day @ds @file.name | ||
| + | syn keyword qmbasicAtVar @hostname @id @ip.addr @itype.mode @level | ||
| + | syn keyword qmbasicAtVar @logname @lptrhigh @lptrwide @month @nb | ||
| + | syn keyword qmbasicAtVar @ni @option @parasentence @path @pib @pob | ||
| + | syn keyword qmbasicAtVar @qmsys @record @selected @sentence @sib @sob | ||
| + | syn keyword qmbasicAtVar @system.return.code @sys.bell @term.type @time | ||
| + | syn keyword qmbasicAtVar @transaction.id @transaction.level | ||
| + | syn keyword qmbasicAtVar @trigger.return.code @tty @user | ||
| + | syn keyword qmbasicAtVar @user0 @user1 @user2 @user4 @user4 | ||
| + | syn keyword qmbasicAtVar @userno @user.no @user.return.code | ||
| + | syn keyword qmbasicAtVar @voc @who @year @year4 | ||
| + | |||
| + | syn keyword qmbasicStatement abort aborte abortm | ||
| + | syn keyword qmbasicFunction abs abss | ||
| + | syn keyword qmbasicFunction accept.socket.connection | ||
| + | syn keyword qmbasicFunction acos asin atan | ||
| + | syn keyword qmbasicFunction alpha | ||
| + | syn keyword qmbasicFunction ands | ||
| + | syn keyword qmbasicFunction arg arg.count | ||
| + | syn keyword qmbasicFunction ascii | ||
| + | syn keyword qmbasicFunction assigned | ||
| + | "no, not quite right | ||
| + | syn keyword qmbasicStatement begin transaction | ||
| + | syn keyword qmBasicFunction bindkey | ||
| + | syn keyword qmBasicFunction bitand bitnot bitor bitxor | ||
| + | syn keyword qmBasicFunction bitset bitreset bittest | ||
| + | syn keyword qmbasicStatement break | ||
| + | syn keyword qmbasicStatement call enter | ||
| + | "important | ||
| + | syn keyword qmbasicStatement case | ||
| + | syn keyword qmbasicFunction catalogued() | ||
| + | "syn keyword qmbasicFunction cataloged() | ||
| + | syn keyword qmbasicFunction cats | ||
| + | syn keyword qmbasicStatement chain | ||
| + | syn keyword qmbasicFunction change swap | ||
| + | syn keyword qmbasicFunction char | ||
| + | syn keyword qmbasicStatement class | ||
| + | "not quite right | ||
| + | syn keyword qmbasicStatement clear clearcommon cleardata clearinput inputclear | ||
| + | syn keyword qmbasicStatement clearfile | ||
| + | syn keyword qmbasicStatement clear data | ||
| + | syn keyword qmbasicStatement clear input | ||
| + | syn keyword qmbasicStatement clearselect | ||
| + | syn keyword qmbasicStatement close closeseq close.socket | ||
| + | syn keyword qmbasicFunction col1 col2 | ||
| + | syn keyword qmbasicStatement commit | ||
| + | "a bit special | ||
| + | syn keyword qmbasicStatement common | ||
| + | syn keyword qmbasicFunction compare | ||
| + | syn keyword qmbasicFunction config | ||
| + | syn keyword qmbasicStatement continue | ||
| + | "Both of these! | ||
| + | syn keyword qmbasicStatement convert | ||
| + | "syn keyword qmbasicFunction convert | ||
| + | syn keyword qmbasicFunction cos sin tan | ||
| + | syn keyword qmbasicFunction count counts dcount | ||
| + | syn keyword qmbasicStatement create create.file | ||
| + | syn keyword qmbasicFunction create.server.socket | ||
| + | syn keyword qmbasicFunction crop | ||
| + | syn keyword qmbasicFunction csvdq | ||
| + | syn keyword qmbasicStatement data | ||
| + | syn keyword qmbasicFunction date | ||
| + | syn keyword qmbasicStatement debug | ||
| + | syn keyword qmbasicStatement deffun | ||
| + | syn keyword qmbasicStatement del | ||
| + | "again with the buggery | ||
| + | "syn keyword qmbasicFunction delete | ||
| + | syn keyword qmbasicStatement delete deleteu | ||
| + | syn keyword qmbasicStatement deletelist | ||
| + | syn keyword qmbasicStatement deleteseq | ||
| + | syn keyword qmbasicStatement dimension dim | ||
| + | syn keyword qmbasicFunction dir | ||
| + | syn keyword qmbasicStatement display crt | ||
| + | syn keyword qmbasicFunction div | ||
| + | syn keyword qmbasicFunction downcase upcase | ||
| + | syn keyword qmbasicFunction dparse dparse.csv | ||
| + | syn keyword qmbasicFunction dtx | ||
| + | syn keyword qmbasicFunction ebcdic | ||
| + | syn keyword qmbasicStatement echo | ||
| + | "a bit special | ||
| + | syn keyword qmbasicStatement end | ||
| + | syn keyword qmbasicFunction env | ||
| + | syn keyword qmbasicFunction eqs | ||
| + | syn keyword qmbasicStatement equate equ | ||
| + | syn keyword qmbasicStatement errmsg | ||
| + | syn keyword qmbasicStatement execute perform | ||
| + | syn keyword qmbasicStatement exit | ||
| + | syn keyword qmbasicFunction exp | ||
| + | syn keyword qmbasicFunction extract | ||
| + | syn keyword qmbasicFunction field fields | ||
| + | syn keyword qmbasicFunction fieldstore | ||
| + | syn keyword qmbasicStatement file | ||
| + | syn keyword qmbasicFunction fileinfo | ||
| + | syn keyword qmbasicStatement filelock fileunlock | ||
| + | syn keyword qmbasicStatement find findstr | ||
| + | syn keyword qmbasicStatement flush | ||
| + | syn keyword qmbasicFunction fmt fmts | ||
| + | syn keyword qmbasicFunction fold folds | ||
| + | syn keyword qmbasicStatement footing | ||
| + | syn keyword qmbasicStatement for next | ||
| + | syn keyword qmbasicStatement formlist | ||
| + | "special? | ||
| + | syn keyword qmbasicStatement function | ||
| + | syn keyword qmbasicFunction ges | ||
| + | syn keyword qmbasicStatement getlist | ||
| + | syn keyword qmbasicFunction get.messages | ||
| + | syn keyword qmbasicFunction getnls | ||
| + | syn keyword qmbasicFunction get.port.params | ||
| + | syn keyword qmbasicFunction getpu | ||
| + | syn keyword qmbasicFunction getrem | ||
| + | syn keyword qmbasicStatement gosub goto | ||
| + | syn keyword qmbasicFunction gts | ||
| + | syn keyword qmbasicStatement heading | ||
| + | syn keyword qmbasicStatement hush | ||
| + | syn keyword qmbasicFunction iconv iconvs | ||
| + | syn keyword qmbasicFunction idiv | ||
| + | "a bit special | ||
| + | syn keyword qmbasicStatement if | ||
| + | syn keyword qmbasicFunction ifs | ||
| + | syn keyword qmbasicStatement in | ||
| + | syn keyword qmbasicFunction index indexs | ||
| + | syn keyword qmbasicFunction indices | ||
| + | syn keyword qmbasicFunction inmat | ||
| + | "also input @ | ||
| + | syn keyword qmbasicStatement input | ||
| + | syn keyword qmbasicStatement inputcsv | ||
| + | syn keyword qmbasicStatement inputfield | ||
| + | syn keyword qmbasicStatement ins | ||
| + | syn keyword qmbasicFunction insert | ||
| + | syn keyword qmbasicFunction int | ||
| + | syn keyword qmbasicFunction itype | ||
| + | syn keyword qmbasicFunction keycode | ||
| + | syn keyword qmbasicStatement keyedit | ||
| + | syn keyword qmbasicStatement keyexit | ||
| + | syn keyword qmbasicFunction keyin keyinc keyinr | ||
| + | syn keyword qmbasicFunction keyready | ||
| + | syn keyword qmbasicStatement keytrap | ||
| + | syn keyword qmbasicFunction len lens | ||
| + | syn keyword qmbasicFunction les | ||
| + | syn keyword qmbasicFunction listindex | ||
| + | syn keyword qmbasicFunction ln | ||
| + | syn keyword qmbasicStatement local | ||
| + | "and again | ||
| + | syn keyword qmbasicStatement locate | ||
| + | "syn keyword qmbasicFunction locate | ||
| + | syn keyword qmbasicStatement lock | ||
| + | syn keyword qmbasicStatement logmsg | ||
| + | "special | ||
| + | syn keyword qmbasicStatement loop repeat | ||
| + | syn keyword qmbasicFunction lower | ||
| + | syn keyword qmbasicFunction lts | ||
| + | syn keyword qmbasicStatement mark.mapping | ||
| + | syn keyword qmbasicStatement mat matbuild matparse | ||
| + | syn keyword qmbasicStatement matread matreadl matreadu matreadcsv | ||
| + | syn keyword qmbasicStatement matwrite matwriteu | ||
| + | syn keyword qmbasicFunction matchfield | ||
| + | syn keyword qmbasicFunction max[imum] min[imum] | ||
| + | syn keyword qmbasicFunction mod mods | ||
| + | syn keyword qmbasicStatement nap | ||
| + | syn keyword qmbasicFunction neg negs | ||
| + | syn keyword qmbasicFunction nes | ||
| + | syn keyword qmbasicFunction nobuf | ||
| + | syn keyword qmbasicFunction not nots | ||
| + | syn keyword qmbasicStatement null | ||
| + | syn keyword qmbasicFunction num nums | ||
| + | syn keyword qmbasicFunction object | ||
| + | syn keyword qmbasicFunction objinfo | ||
| + | syn keyword qmbasicFunction oconv oconvs | ||
| + | "umm... | ||
| + | "syn keyword qmbasicStatement on gosub | ||
| + | "syn keyword qmbasicStatement on goto | ||
| + | syn keyword qmbasicStatement open openpath openseq | ||
| + | syn keyword qmbasicFunction open.socket | ||
| + | syn keyword qmbasicFunction ors | ||
| + | syn keyword qmbasicFunction os.error | ||
| + | syn keyword qmbasicStatement os.execute | ||
| + | syn keyword qmbasicFunction outerjoin | ||
| + | syn keyword qmbasicStatement page | ||
| + | syn keyword qmbasicStatement pause | ||
| + | syn keyword qmbasicStatement precision | ||
| + | syn keyword qmbasicStatement print printcsv | ||
| + | "a load of printer stuff | ||
| + | syn keyword qmbasicStatement printer | ||
| + | "This is even worse - it's a function AND a statement, but the function is depreciated | ||
| + | "syn keyword qmbasicFunction printer.setting | ||
| + | syn keyword qmbasicStatement printerr inputerr | ||
| + | syn keyword qmbasicStatement private | ||
| + | syn keyword qmbasicStatement procread procwrite | ||
| + | "special | ||
| + | syn keyword qmbasicStatement program | ||
| + | syn keyword qmbasicStatement prompt | ||
| + | syn keyword qmbasicStatement public | ||
| + | syn keyword qmbasicFunction pwr | ||
| + | syn keyword qmbasicFunction quote dquote | ||
| + | syn keyword qmbasicFunction raise | ||
| + | syn keyword qmbasicStatement randomize | ||
| + | syn keyword qmbasicFunction rdiv | ||
| + | syn keyword qmbasicStatement read readu readv readvl readvu | ||
| + | syn keyword qmbasicStatement readblk readcsv readseq | ||
| + | syn keyword qmbasicStatement readl | ||
| + | syn keyword qmbasicStatement readlist | ||
| + | "special? | ||
| + | syn keyword qmbasicStatement readnext | ||
| + | syn keyword qmbasicFunction recordlocked | ||
| + | syn keyword qmbasicStatement recordlockl recordlocku | ||
| + | syn keyword qmbasicStatement release | ||
| + | "more! | ||
| + | syn keyword qmbasicFunction rem | ||
| + | "syn keyword qmbasicStatement rem[ark] | ||
| + | "and again! | ||
| + | syn keyword qmbasicStatement remove | ||
| + | "syn keyword qmbasicFunction remove | ||
| + | syn keyword qmbasicFunction replace | ||
| + | syn keyword qmbasicStatement restore.screen | ||
| + | "special? | ||
| + | syn keyword qmbasicStatement return | ||
| + | syn keyword qmbasicFunction reuse | ||
| + | syn keyword qmbasicFunction rnd | ||
| + | syn keyword qmbasicStatement rollback | ||
| + | syn keyword qmbasicFunction save.screen | ||
| + | syn keyword qmbasicStatement savelist | ||
| + | syn keyword qmbasicStatement seek | ||
| + | syn keyword qmbasicStatement select selectn selectv selecte | ||
| + | syn keyword qmbasicStatement selectindex selectleft selectright | ||
| + | syn keyword qmbasicFunction selectinfo | ||
| + | syn keyword qmbasicFunction sentence | ||
| + | syn keyword qmbasicFunction seq | ||
| + | syn keyword qmbasicFunction server.addr | ||
| + | syn keyword qmbasicStatement set.arg | ||
| + | syn keyword qmbasicStatement set.exit.status | ||
| + | syn keyword qmbasicFunction set.port.params | ||
| + | syn keyword qmbasicFunction set.socket.mode | ||
| + | syn keyword qmbasicStatement setleft setright | ||
| + | syn keyword qmbasicStatement setnls | ||
| + | syn keyword qmbasicStatement setpu | ||
| + | syn keyword qmbasicStatement setrem | ||
| + | syn keyword qmbasicFunction shift | ||
| + | syn keyword qmbasicStatement sleep rqm | ||
| + | syn keyword qmbasicFunction socket.info | ||
| + | syn keyword qmbasicFunction soundex | ||
| + | syn keyword qmbasicFunction space | ||
| + | syn keyword qmbasicFunction spaces | ||
| + | syn keyword qmbasicFunction splice | ||
| + | syn keyword qmbasicFunction sqrt | ||
| + | syn keyword qmbasicFunction squote | ||
| + | syn keyword qmbasicStatement sselect | ||
| + | "another double | ||
| + | syn keyword qmbasicFunction status | ||
| + | "syn keyword qmbasicStatement status | ||
| + | syn keyword qmbasicStatement stop stope stopm | ||
| + | syn keyword qmbasicFunction str strs | ||
| + | "really a function? | ||
| + | syn keyword qmbasicFunction subr | ||
| + | "special | ||
| + | syn keyword qmbasicStatement subroutine | ||
| + | syn keyword qmbasicFunction substitute | ||
| + | syn keyword qmbasicFunction substrings | ||
| + | syn keyword qmbasicFunction sum summation swapcase system tan terminfo time timedata trans xlate rtrans trim trimb trimbs trimf trimfs trims ttyget unassigned upcase vslice | ||
| + | syn keyword qmbasicStatement tclread timeout ttyset unlock until wake weofseq write writeu writeblk writecsv writeseqf writev writevu | ||
| + | syn keyword qmbasicFunction write.socket xtd | ||
| + | "special | ||
| + | syn keyword qmbasicStatement while | ||
| + | "transaction | ||
| + | |||
| + | "general keywords | ||
| + | syn keyword qmbasicKeyword then else on off to and or from do | ||
| + | syn keyword qmbasicKeyword capturing returning rtnlist passlist setting | ||
| + | |||
| + | "syntax match qmbasicFunction // nextgroup= | ||
| + | |||
| + | "syntax match qmbasicLineContinue /~/ contained | ||
| + | |||
| + | syn region qmbasicString start=/"/ end=/"/ oneline | ||
| + | syn region qmbasicString start=/'/ end=/'/ oneline | ||
| + | syn region qmbasicString start=/\\/ end=/\\/ oneline | ||
| + | |||
| + | "syn region qmbasicComment start="^[ \t]*'" end="$" contains=basicTodo | ||
| + | syn region qmbasicComment start="REM " end="$" | ||
| + | syn region qmbasicComment start="REMARK " end="$" | ||
| + | "includes REMARK | ||
| + | syn region qmbasicComment start="^[ \t]*\*" end="$" | ||
| + | syn region qmbasicComment start="^[ \t]*!" end="$" | ||
| + | "This is a bit of a cheat | ||
| + | syn region qmbasicComment start=";[ \t]*\*" end="$" | ||
| + | syn region qmbasicComment start=";[ \t]*!" end="$" | ||
| + | |||
| + | "syn match qmbasicMathsOperator "[+*^=-]" | ||
| + | "syn match qmbasicMathsOperator "-\|=\|[:<>+\*^/\\]\|AND\|OR" | ||
| + | |||
| + | |||
| + | |||
| + | " Assign colours | ||
| + | command -nargs=+ HiLink hi def link <args> | ||
| + | |||
| + | HiLink qmbasicStatement Statement | ||
| + | HiLink qmbasicString String | ||
| + | HiLink qmbasicComment Comment | ||
| + | HiLink qmbasicFunction Function | ||
| + | HiLink qmbasicCompilerDir Special | ||
| + | HiLink qmbasicAtVar Identifier | ||
| + | HiLink qmbasicKeyword Statement | ||
| + | "temp: | ||
| + | "HiLink qmbasicMathsOperator String | ||
| + | |||
| + | delcommand HiLink | ||
| + | |||
| + | let b:current_syntax = "qmbasic" | ||
| + | </pre> | ||
| + | To enable editing of non-directory files (see the note above before enabling this), create a directory '$VIMFILE' in /usr/qmsys, and create the NEWVOC entry '$VIMFILE': | ||
| + | File - Vim temporary file | ||
| + | @QMSYS/$VIMFILE | ||
| + | Finally, save this entry as 'VIM' in NEWVOC | ||
| + | V | ||
| + | CA | ||
| + | $VIM | ||
| + | and then use UPDATE.ACCOUNT to copy it to your VOC. | ||
Latest revision as of 12:07, 1 May 2009
There are two programs listed below, both of which accomplish similar goals. The first is the simplest to install, while the second is more powerful. Note that either may be altered to use your favourite editor, but that the second is much more closely tied to Vim.
Small Script
This little script was given to me by Tom Hoogenboom:
To use your favorite editor, just change "leafpad" to "vi", "pico", etc.
Save the program below in your GPL.BP file and globally catalog it.
* 'nano' caller for system editor s = @sentence s = trim(s) convert ' ' to @am in s filename = s<2> itemname = s<3> * es = \sh nano \:@path:\/\:filename:\/\:itemname crt es execute es * end
Note - this currently doesn't work when OpenQM is executed by xinetd under 2.6-6. If you execute OpenQM from the command line it works ok. It appears that the I/O redirection is somehow broken when OpenQM is executed as a server (accessed via telnet <hostname> <port>)
Larger Program
Written by Tom Potts.
This is a more sophisticated program with the beginnings of some extra usefulness. The syntax highlighting is naive, but useful; the dynamic-file editing is dangerous, but works okay, and it is robust enough to work with multifiles and Q-pointers. If enough people think this is worthwhile, I'll clean it up a bit and put it in the main repository. Oh, and there has to be a better way to do the 'itempath' stuff -- any ideas, anyone?
DISCLAIMER: If you use this program to edit an item in a dynamic file, it will overwrite it when you have finished editing. It is very unsafe, and I'm not happy about it, but if you use it carefully it should be okay. If you think of a neat way of avoiding this problem, please let me know!
Installation
Save this program in GPL.BP as 'ITEMPATH', and compile it.
function itempath(item.id)
$catalogue global
path = ""
for i = 1 to len(item.id)
char = item.id[i,1]
begin case
case char = '"'
path := '%Q'
case char = '%'
path := '%P'
case char = '*'
path := '%A'
case char = '+'
path := '%V'
case char = ','
path := '%C'
case char = '/'
path := '%S'
case char = ':'
path := '%X'
case char = ';'
path := '%Y'
case char = '<'
path := '%L'
case char = '='
path := '%E'
case char = '>'
path := '%G'
case char = '?'
path := '%Z'
case char = '\'
path := '%B'
case 1
path := char
end case
next i
return path
end
Save this program in GPL.BP as 'VIM' and compile it.
$include keys.h
$include syscom parser.h
$internal
$catalogue $VIM
equate vimfile to "$VIMFILE"
equate qmbasic.vim to "/usr/qmsys/qmbasic.vim"
equate filetype$unset to 0
equate filetype$null to 1
equate filetype$basic to 2
equate filetype$paragraph to 3
equate filetype$proc to 4
deffun itempath(id)
filename = ""
filetype = filetype$unset
itemids = ""
*** Get variables
call !parser(parser$reset, 0, @sentence, 0)
call !parser(parser$get.token, token.type, string, keyword) ;* Verb
* Get the file (using mfile rather than get.token for multifiles)
call !parser(PARSER$MFILE, token.type, filename, keyword)
if filename = "" then
* prompted.for.file.name = @true
display sysmsg(6501) : ;* File name?
input filename
* filename = trimf(trimb(filename))
* if filename = "" then goto exit.sed
if filename = "" then stop
end else
* prompted.for.file.name = @false
if keyword = KW$DICT then
* dict.flag = "DICT"
call !parser(PARSER$MFILE, token.type, filename, keyword)
filename = "DICT " : filename
end
end
*** Validate file
open filename to filevar else
filename = upcase(filename)
open filename to filevar else
crt "Could not open file."
stop
end
end
using.vimfile = @false
if fileinfo(filevar, FL$TYPE) # FL$TYPE.DIR then
open vimfile to vimfilevar then
using.vimfile = @true
end else
crt "vim can only act on directory files."
stop
end
end
if filetype = filetype$unset then
* If there exists a '.OUT' file...
open filename : ".OUT" to dummyfile then
filetype = filetype$basic
close dummyfile
end else
* ...
end
end
if (using.vimfile) then
path = fileinfo(vimfilevar, FL$PATH)
end else
path = fileinfo(filevar, FL$PATH)
end
*** Get the items to edit
loop
call !parser(parser$get.token, token.type, string, keyword)
until token.type = parser$end
* crt " ~" : string
itemids<-1> = string
repeat
command = "vim"
for i = 1 to dcount(itemids, @am)
read record from filevar, itemids<i> else
* We shouldn't really convert to uppercase.
* read record from filevar, upcase(itemids<i>) then
* itemids<i> = upcase(itemids<i>)
* end
end
if (using.vimfile) then
execute "copy from " : filename : " to " : vimfile : " " : itemids<i> : ", " : @userno : itemids<i> : " overwriting" capturing junk
item.path = itempath(@userno : itemids<i>)
end else
item.path = itempath(itemids<i>)
end
command := " " : path : "/" : item.path
next i
command = swap(command, "$", "\$")
command = swap(command, "&", "\&")
if filetype = filetype$basic then
command := " -S " : qmbasic.vim
end
os.execute command
if (using.vimfile) then
for i = 1 to dcount(itemids, @am)
execute "copy from " : vimfile : " to " : filename : " " : @userno : itemids<i> : ", " : itemids<i> : " overwriting deleting" capturing junk
next i
end
end
To enable syntax highlighting, save this file as 'qmbasic.vim' in /usr/qmsys.
syntax clear
syntax case ignore
"set autoindent
set tabstop=3
set shiftwidth=3
set nu
function GetQMBasicIndent()
let bob = getline(".")
if (match(bob, '\cthen *$') >= 0)
return indent(".") + 3
endif
return -1
endfunction
set indentexpr=GetQMBasicIndent()
set smartindent
setlocal iskeyword+=.
setlocal iskeyword+=$
setlocal iskeyword+=@-@
setlocal iskeyword+=!
"syn keyword qmbasicCompilerDir $catalogue $catalog
"syn keyword qmbasicCompilerDir $debug
"syn keyword qmbasicCompilerDir $define
"syn keyword qmbasicCompilerDir $execute
"syn keyword qmbasicCompilerDir $ifdef $ifndef
"syn keyword qmbasicCompilerDir $include
""not sure whether this is a CompilerDir, or a Statement
"syn keyword qmbasicCompilerDir include
"syn keyword qmbasicCompilerDir $list
"syn keyword qmbasicCompilerDir $mode
"syn keyword qmbasicCompilerDir $nocase.strings
"syn keyword qmbasicCompilerDir $qmcall
syn region qmbasicCompilerDir start="^[ \t]*#" end="$"
syn region qmbasicCompilerDir start="^[ \t]*\$" end="$"
syn region qmbasicCompilerDir start="^[ \t]*include" end="$"
"syntax region qmbasicThenBlock start=/then$/ end=/end/ contains=qmbasicThenBlock contains=qmbasicElseBloc
"syntax region qmbasicElseBlock start=/else$/ end=/end/ contains=qmbasicThenBlock contains=qmbasicElseBlock
syn keyword qmbasicAtVar @am @fm @im @sm @svm @tm @vm
syn keyword qmbasicAtVar @true @false
syn keyword qmbasicAtVar @abort.code @abort.message
syn keyword qmbasicAtVar @ans @command @command.stack @crthigh @crtwide
syn keyword qmbasicAtVar @data.pending @date @day @ds @file.name
syn keyword qmbasicAtVar @hostname @id @ip.addr @itype.mode @level
syn keyword qmbasicAtVar @logname @lptrhigh @lptrwide @month @nb
syn keyword qmbasicAtVar @ni @option @parasentence @path @pib @pob
syn keyword qmbasicAtVar @qmsys @record @selected @sentence @sib @sob
syn keyword qmbasicAtVar @system.return.code @sys.bell @term.type @time
syn keyword qmbasicAtVar @transaction.id @transaction.level
syn keyword qmbasicAtVar @trigger.return.code @tty @user
syn keyword qmbasicAtVar @user0 @user1 @user2 @user4 @user4
syn keyword qmbasicAtVar @userno @user.no @user.return.code
syn keyword qmbasicAtVar @voc @who @year @year4
syn keyword qmbasicStatement abort aborte abortm
syn keyword qmbasicFunction abs abss
syn keyword qmbasicFunction accept.socket.connection
syn keyword qmbasicFunction acos asin atan
syn keyword qmbasicFunction alpha
syn keyword qmbasicFunction ands
syn keyword qmbasicFunction arg arg.count
syn keyword qmbasicFunction ascii
syn keyword qmbasicFunction assigned
"no, not quite right
syn keyword qmbasicStatement begin transaction
syn keyword qmBasicFunction bindkey
syn keyword qmBasicFunction bitand bitnot bitor bitxor
syn keyword qmBasicFunction bitset bitreset bittest
syn keyword qmbasicStatement break
syn keyword qmbasicStatement call enter
"important
syn keyword qmbasicStatement case
syn keyword qmbasicFunction catalogued()
"syn keyword qmbasicFunction cataloged()
syn keyword qmbasicFunction cats
syn keyword qmbasicStatement chain
syn keyword qmbasicFunction change swap
syn keyword qmbasicFunction char
syn keyword qmbasicStatement class
"not quite right
syn keyword qmbasicStatement clear clearcommon cleardata clearinput inputclear
syn keyword qmbasicStatement clearfile
syn keyword qmbasicStatement clear data
syn keyword qmbasicStatement clear input
syn keyword qmbasicStatement clearselect
syn keyword qmbasicStatement close closeseq close.socket
syn keyword qmbasicFunction col1 col2
syn keyword qmbasicStatement commit
"a bit special
syn keyword qmbasicStatement common
syn keyword qmbasicFunction compare
syn keyword qmbasicFunction config
syn keyword qmbasicStatement continue
"Both of these!
syn keyword qmbasicStatement convert
"syn keyword qmbasicFunction convert
syn keyword qmbasicFunction cos sin tan
syn keyword qmbasicFunction count counts dcount
syn keyword qmbasicStatement create create.file
syn keyword qmbasicFunction create.server.socket
syn keyword qmbasicFunction crop
syn keyword qmbasicFunction csvdq
syn keyword qmbasicStatement data
syn keyword qmbasicFunction date
syn keyword qmbasicStatement debug
syn keyword qmbasicStatement deffun
syn keyword qmbasicStatement del
"again with the buggery
"syn keyword qmbasicFunction delete
syn keyword qmbasicStatement delete deleteu
syn keyword qmbasicStatement deletelist
syn keyword qmbasicStatement deleteseq
syn keyword qmbasicStatement dimension dim
syn keyword qmbasicFunction dir
syn keyword qmbasicStatement display crt
syn keyword qmbasicFunction div
syn keyword qmbasicFunction downcase upcase
syn keyword qmbasicFunction dparse dparse.csv
syn keyword qmbasicFunction dtx
syn keyword qmbasicFunction ebcdic
syn keyword qmbasicStatement echo
"a bit special
syn keyword qmbasicStatement end
syn keyword qmbasicFunction env
syn keyword qmbasicFunction eqs
syn keyword qmbasicStatement equate equ
syn keyword qmbasicStatement errmsg
syn keyword qmbasicStatement execute perform
syn keyword qmbasicStatement exit
syn keyword qmbasicFunction exp
syn keyword qmbasicFunction extract
syn keyword qmbasicFunction field fields
syn keyword qmbasicFunction fieldstore
syn keyword qmbasicStatement file
syn keyword qmbasicFunction fileinfo
syn keyword qmbasicStatement filelock fileunlock
syn keyword qmbasicStatement find findstr
syn keyword qmbasicStatement flush
syn keyword qmbasicFunction fmt fmts
syn keyword qmbasicFunction fold folds
syn keyword qmbasicStatement footing
syn keyword qmbasicStatement for next
syn keyword qmbasicStatement formlist
"special?
syn keyword qmbasicStatement function
syn keyword qmbasicFunction ges
syn keyword qmbasicStatement getlist
syn keyword qmbasicFunction get.messages
syn keyword qmbasicFunction getnls
syn keyword qmbasicFunction get.port.params
syn keyword qmbasicFunction getpu
syn keyword qmbasicFunction getrem
syn keyword qmbasicStatement gosub goto
syn keyword qmbasicFunction gts
syn keyword qmbasicStatement heading
syn keyword qmbasicStatement hush
syn keyword qmbasicFunction iconv iconvs
syn keyword qmbasicFunction idiv
"a bit special
syn keyword qmbasicStatement if
syn keyword qmbasicFunction ifs
syn keyword qmbasicStatement in
syn keyword qmbasicFunction index indexs
syn keyword qmbasicFunction indices
syn keyword qmbasicFunction inmat
"also input @
syn keyword qmbasicStatement input
syn keyword qmbasicStatement inputcsv
syn keyword qmbasicStatement inputfield
syn keyword qmbasicStatement ins
syn keyword qmbasicFunction insert
syn keyword qmbasicFunction int
syn keyword qmbasicFunction itype
syn keyword qmbasicFunction keycode
syn keyword qmbasicStatement keyedit
syn keyword qmbasicStatement keyexit
syn keyword qmbasicFunction keyin keyinc keyinr
syn keyword qmbasicFunction keyready
syn keyword qmbasicStatement keytrap
syn keyword qmbasicFunction len lens
syn keyword qmbasicFunction les
syn keyword qmbasicFunction listindex
syn keyword qmbasicFunction ln
syn keyword qmbasicStatement local
"and again
syn keyword qmbasicStatement locate
"syn keyword qmbasicFunction locate
syn keyword qmbasicStatement lock
syn keyword qmbasicStatement logmsg
"special
syn keyword qmbasicStatement loop repeat
syn keyword qmbasicFunction lower
syn keyword qmbasicFunction lts
syn keyword qmbasicStatement mark.mapping
syn keyword qmbasicStatement mat matbuild matparse
syn keyword qmbasicStatement matread matreadl matreadu matreadcsv
syn keyword qmbasicStatement matwrite matwriteu
syn keyword qmbasicFunction matchfield
syn keyword qmbasicFunction max[imum] min[imum]
syn keyword qmbasicFunction mod mods
syn keyword qmbasicStatement nap
syn keyword qmbasicFunction neg negs
syn keyword qmbasicFunction nes
syn keyword qmbasicFunction nobuf
syn keyword qmbasicFunction not nots
syn keyword qmbasicStatement null
syn keyword qmbasicFunction num nums
syn keyword qmbasicFunction object
syn keyword qmbasicFunction objinfo
syn keyword qmbasicFunction oconv oconvs
"umm...
"syn keyword qmbasicStatement on gosub
"syn keyword qmbasicStatement on goto
syn keyword qmbasicStatement open openpath openseq
syn keyword qmbasicFunction open.socket
syn keyword qmbasicFunction ors
syn keyword qmbasicFunction os.error
syn keyword qmbasicStatement os.execute
syn keyword qmbasicFunction outerjoin
syn keyword qmbasicStatement page
syn keyword qmbasicStatement pause
syn keyword qmbasicStatement precision
syn keyword qmbasicStatement print printcsv
"a load of printer stuff
syn keyword qmbasicStatement printer
"This is even worse - it's a function AND a statement, but the function is depreciated
"syn keyword qmbasicFunction printer.setting
syn keyword qmbasicStatement printerr inputerr
syn keyword qmbasicStatement private
syn keyword qmbasicStatement procread procwrite
"special
syn keyword qmbasicStatement program
syn keyword qmbasicStatement prompt
syn keyword qmbasicStatement public
syn keyword qmbasicFunction pwr
syn keyword qmbasicFunction quote dquote
syn keyword qmbasicFunction raise
syn keyword qmbasicStatement randomize
syn keyword qmbasicFunction rdiv
syn keyword qmbasicStatement read readu readv readvl readvu
syn keyword qmbasicStatement readblk readcsv readseq
syn keyword qmbasicStatement readl
syn keyword qmbasicStatement readlist
"special?
syn keyword qmbasicStatement readnext
syn keyword qmbasicFunction recordlocked
syn keyword qmbasicStatement recordlockl recordlocku
syn keyword qmbasicStatement release
"more!
syn keyword qmbasicFunction rem
"syn keyword qmbasicStatement rem[ark]
"and again!
syn keyword qmbasicStatement remove
"syn keyword qmbasicFunction remove
syn keyword qmbasicFunction replace
syn keyword qmbasicStatement restore.screen
"special?
syn keyword qmbasicStatement return
syn keyword qmbasicFunction reuse
syn keyword qmbasicFunction rnd
syn keyword qmbasicStatement rollback
syn keyword qmbasicFunction save.screen
syn keyword qmbasicStatement savelist
syn keyword qmbasicStatement seek
syn keyword qmbasicStatement select selectn selectv selecte
syn keyword qmbasicStatement selectindex selectleft selectright
syn keyword qmbasicFunction selectinfo
syn keyword qmbasicFunction sentence
syn keyword qmbasicFunction seq
syn keyword qmbasicFunction server.addr
syn keyword qmbasicStatement set.arg
syn keyword qmbasicStatement set.exit.status
syn keyword qmbasicFunction set.port.params
syn keyword qmbasicFunction set.socket.mode
syn keyword qmbasicStatement setleft setright
syn keyword qmbasicStatement setnls
syn keyword qmbasicStatement setpu
syn keyword qmbasicStatement setrem
syn keyword qmbasicFunction shift
syn keyword qmbasicStatement sleep rqm
syn keyword qmbasicFunction socket.info
syn keyword qmbasicFunction soundex
syn keyword qmbasicFunction space
syn keyword qmbasicFunction spaces
syn keyword qmbasicFunction splice
syn keyword qmbasicFunction sqrt
syn keyword qmbasicFunction squote
syn keyword qmbasicStatement sselect
"another double
syn keyword qmbasicFunction status
"syn keyword qmbasicStatement status
syn keyword qmbasicStatement stop stope stopm
syn keyword qmbasicFunction str strs
"really a function?
syn keyword qmbasicFunction subr
"special
syn keyword qmbasicStatement subroutine
syn keyword qmbasicFunction substitute
syn keyword qmbasicFunction substrings
syn keyword qmbasicFunction sum summation swapcase system tan terminfo time timedata trans xlate rtrans trim trimb trimbs trimf trimfs trims ttyget unassigned upcase vslice
syn keyword qmbasicStatement tclread timeout ttyset unlock until wake weofseq write writeu writeblk writecsv writeseqf writev writevu
syn keyword qmbasicFunction write.socket xtd
"special
syn keyword qmbasicStatement while
"transaction
"general keywords
syn keyword qmbasicKeyword then else on off to and or from do
syn keyword qmbasicKeyword capturing returning rtnlist passlist setting
"syntax match qmbasicFunction // nextgroup=
"syntax match qmbasicLineContinue /~/ contained
syn region qmbasicString start=/"/ end=/"/ oneline
syn region qmbasicString start=/'/ end=/'/ oneline
syn region qmbasicString start=/\\/ end=/\\/ oneline
"syn region qmbasicComment start="^[ \t]*'" end="$" contains=basicTodo
syn region qmbasicComment start="REM " end="$"
syn region qmbasicComment start="REMARK " end="$"
"includes REMARK
syn region qmbasicComment start="^[ \t]*\*" end="$"
syn region qmbasicComment start="^[ \t]*!" end="$"
"This is a bit of a cheat
syn region qmbasicComment start=";[ \t]*\*" end="$"
syn region qmbasicComment start=";[ \t]*!" end="$"
"syn match qmbasicMathsOperator "[+*^=-]"
"syn match qmbasicMathsOperator "-\|=\|[:<>+\*^/\\]\|AND\|OR"
" Assign colours
command -nargs=+ HiLink hi def link <args>
HiLink qmbasicStatement Statement
HiLink qmbasicString String
HiLink qmbasicComment Comment
HiLink qmbasicFunction Function
HiLink qmbasicCompilerDir Special
HiLink qmbasicAtVar Identifier
HiLink qmbasicKeyword Statement
"temp:
"HiLink qmbasicMathsOperator String
delcommand HiLink
let b:current_syntax = "qmbasic"
To enable editing of non-directory files (see the note above before enabling this), create a directory '$VIMFILE' in /usr/qmsys, and create the NEWVOC entry '$VIMFILE':
File - Vim temporary file @QMSYS/$VIMFILE
Finally, save this entry as 'VIM' in NEWVOC
V CA $VIM
and then use UPDATE.ACCOUNT to copy it to your VOC.