From a7c9b117cb4a3333e222710f3b8982d295d664e4 Mon Sep 17 00:00:00 2001 From: Christophe Gouel Date: Thu, 14 Dec 2023 10:47:52 +0100 Subject: [PATCH 01/25] Improve autocompletion for dollar commands Now the autocompletion for dollar commands works for the 3 formats: with 1 $, with 2 $, and without $. --- command_files/commands_dollar.txt | 235 ------------- command_files/commands_mpsge.txt | 18 - command_files/extract_gams_symbols.sh | 11 +- gams-commands-dollar.txt | 470 +++++++++++++------------- gams-mode.el | 17 +- test_fontlocking.gms | 10 + 6 files changed, 262 insertions(+), 499 deletions(-) delete mode 100644 command_files/commands_dollar.txt delete mode 100644 command_files/commands_mpsge.txt create mode 100644 test_fontlocking.gms diff --git a/command_files/commands_dollar.txt b/command_files/commands_dollar.txt deleted file mode 100644 index ac0ed19..0000000 --- a/command_files/commands_dollar.txt +++ /dev/null @@ -1,235 +0,0 @@ -"$onExternalInput" -"$offExternalInput" -"$onExternalOutput" -"$offExternalOutput" -"$onIDCProtect" -"$offIDCProtect" -"$onImplicitAssign" -"$offImplicitAssign" -"$onMargin" -"$offMargin" -"$minCol" -"$maxCol" -"$comment" -"$dollar" -"$onDigit" -"$offDigit" -"$hidden" -"$onText" -"$offText" -"$onUpper" -"$offUpper" -"$single" -"$double" -"$lines" -"$title" -"$sTitle" -"$onSymList" -"$offSymList" -"$onUelList" -"$offUelList" -"$onSymXRef" -"$offSymXRef" -"$onUelXRef" -"$offUelXRef" -"$debug" -"$onDollar" -"$offDollar" -"$phantom" -"$version" -"$call" -"$callAsync" -"$callAsyncIC" -"$callAsyncNC" -"$callTool" -"$hiddenCall" -"$hiddenCallTool" -"$include" -"$onInclude" -"$offInclude" -"$sysInclude" -"$libInclude" -"$insert" -"$sysInsert" -"$libInsert" -"$batInclude" -"$onCmsIncl" -"$offCmsIncl" -"$funcLibIn" -"$goto" -"$label" -"$maxGoTo" -"$if" -"$ifI" -"$ifE" -"$shift" -"$onNestCom" -"$offNestCom" -"$onInline" -"$offInline" -"$inlineCom" -"$onEolCom" -"$offEolCom" -"$eolCom" -"$onMultiR" -"$onMulti" -"$offMulti" -"$onWarning" -"$offWarning" -"$onSparse" -"$offSparse" -"$stars" -"$onMixed" -"$offMixed" -"$onRecurse" -"$offRecurse" -"$onUni" -"$offUni" -"$onEps" -"$offEps" -"$onEpsToZero" -"$offEpsToZero" -"$onDelim" -"$offDelim" -"$onEmpty" -"$offEmpty" -"$onStrictSingleton" -"$offStrictSingleton" -"$onEnd" -"$offEnd" -"$onListing" -"$offListing" -"$error" -"$abort" -"$kill" -"$clear" -"$slice" -"$offLog" -"$onLog" -"$onTroll" -"$offTroll" -"$onOrder" -"$offOrder" -"$embeddedCode" -"$embeddedCodeS" -"$embeddedCodeV" -"$pauseEmbeddedCode" -"$continueEmbeddedCode" -"$continueEmbeddedCodeS" -"$continueEmbeddedCodeV" -"$endEmbeddedCode" -"$onEmbeddedCode" -"$onEmbeddedCodeS" -"$onEmbeddedCodeV" -"$offEmbeddedCode" -"$scratchFileName" -"$onCheckErrorLevel" -"$offCheckErrorLevel" -"$onFiltered" -"$offFiltered" -"$onSuffixDLVars" -"$offSuffixDLVars" -"$onSuffixAlgebraVars" -"$offSuffixAlgebraVars" -"$onFold" -"$offFold" -"$gdxIn" -"$gdxOut" -"$declareAndLoad" -"$gdxLoad" -"$gdxLoadAll" -"$gdxUnload" -"$load" -"$loadR" -"$loadM" -"$loadDc" -"$loadDcR" -"$loadDcM" -"$loadFiltered" -"$loadFilteredR" -"$loadFilteredM" -"$loadIdx" -"$unload" -"$setLocal" -"$setGlobal" -"$set" -"$evalLocal" -"$evalGlobal" -"$eval" -"$setEnv" -"$dropLocal" -"$dropGlobal" -"$drop" -"$dropEnv" -"$setArgs" -"$setNames" -"$splitOption" -"$setComps" -"$escape" -"$onGlobal" -"$offGlobal" -"$setDdList" -"$prefixPath" -"$show" -"$showFiles" -"$showMacros" -"$showVariables" -"$macro" -"$onMacro" -"$offMacro" -"$onDotL" -"$offDotL" -"$onExpand" -"$offExpand" -"$offLocal" -"$onLocal" -"$onDotScale" -"$offDotScale" -"$expose" -"$protect" -"$hide" -"$purge" -"$compress" -"$encrypt" -"$decompress" -"$run" -"$stop" -"$exit" -"$log" -"$echo" -"$echoN" -"$use205" -"$use225" -"$use999" -"$diff" -"$onEcho" -"$onEchoV" -"$onEchoS" -"$offEcho" -"$onPut" -"$onPutV" -"$onPutS" -"$offPut" -"$clearError" -"$clearErrors" -"$warning" -"$terminate" -"$remark" -"$onUndf" -"$offUndf" -"$onEmbedded" -"$offEmbedded" -"$onVerbatim" -"$offVerbatim" -"$ifThen" -"$ifThenI" -"$ifThenE" -"$elseIf" -"$elseIfI" -"$elseIfE" -"$else" -"$endIf" -"$eject" -"$onECImplicitLoad" -"$offECImplicitLoad" -"$save" diff --git a/command_files/commands_mpsge.txt b/command_files/commands_mpsge.txt deleted file mode 100644 index d9f98cb..0000000 --- a/command_files/commands_mpsge.txt +++ /dev/null @@ -1,18 +0,0 @@ -"$model:" -"$sectors:" -"$commodities:" -"$commodity:" -"$consumers:" -"$consumer:" -"$auxiliary:" -"$auxiliaries:" -"$prod:" -"$demand:" -"$constraint:" -"$report:" - - - - - - diff --git a/command_files/extract_gams_symbols.sh b/command_files/extract_gams_symbols.sh index 7c1c00c..121b7d0 100644 --- a/command_files/extract_gams_symbols.sh +++ b/command_files/extract_gams_symbols.sh @@ -44,10 +44,9 @@ do get_gams_commands ${tempfile} > ${tempfile/temp_/commands_} done -cp commands_dollar.txt ../gams-commands-dollar.txt - -# Add dollar sign for dollar control options -sed -i 's/"\([^"]*\)"/"$\1"/g' commands_dollar.txt +# Export dollar commands +sort commands_dollar.txt | uniq > ../gams-commands-dollar.txt +rm commands_dollar.txt # Add combined declations sed 's/"\([^"]*\)"/"\1 Variable"/g' commands_declaration_var.txt > commands_declaration2.txt @@ -64,7 +63,7 @@ done # Add missing commands echo -e "\"maximizing\"\\n\"minimizing\"" >> temp.txt -# Remove duplicates -sort temp.txt | uniq > gams_commands.txt +# Remove duplicates and export GAMS commands +sort temp.txt | uniq > ../gams-commands.txt rm temp*.txt diff --git a/gams-commands-dollar.txt b/gams-commands-dollar.txt index 706ea42..2525d6e 100644 --- a/gams-commands-dollar.txt +++ b/gams-commands-dollar.txt @@ -1,235 +1,235 @@ -"$abort" -"$batInclude" -"$call" -"$callAsync" -"$callAsyncIC" -"$callAsyncNC" -"$callTool" -"$clear" -"$clearError" -"$clearErrors" -"$comment" -"$compress" -"$continueEmbeddedCode" -"$continueEmbeddedCodeS" -"$continueEmbeddedCodeV" -"$debug" -"$declareAndLoad" -"$decompress" -"$diff" -"$dollar" -"$double" -"$drop" -"$dropEnv" -"$dropGlobal" -"$dropLocal" -"$echo" -"$echoN" -"$eject" -"$else" -"$elseIf" -"$elseIfE" -"$elseIfI" -"$embeddedCode" -"$embeddedCodeS" -"$embeddedCodeV" -"$encrypt" -"$endEmbeddedCode" -"$endIf" -"$eolCom" -"$error" -"$escape" -"$eval" -"$evalGlobal" -"$evalLocal" -"$exit" -"$expose" -"$funcLibIn" -"$gdxIn" -"$gdxLoad" -"$gdxLoadAll" -"$gdxOut" -"$gdxUnload" -"$goto" -"$hidden" -"$hiddenCall" -"$hiddenCallTool" -"$hide" -"$if" -"$ifE" -"$ifI" -"$ifThen" -"$ifThenE" -"$ifThenI" -"$include" -"$inlineCom" -"$insert" -"$kill" -"$label" -"$libInclude" -"$libInsert" -"$lines" -"$load" -"$loadDc" -"$loadDcM" -"$loadDcR" -"$loadFiltered" -"$loadFilteredM" -"$loadFilteredR" -"$loadIdx" -"$loadM" -"$loadR" -"$log" -"$macro" -"$maxCol" -"$maxGoTo" -"$minCol" -"$offCheckErrorLevel" -"$offCmsIncl" -"$offDelim" -"$offDigit" -"$offDollar" -"$offDotL" -"$offDotScale" -"$offECImplicitLoad" -"$offEcho" -"$offEmbedded" -"$offEmbeddedCode" -"$offEmpty" -"$offEnd" -"$offEolCom" -"$offEps" -"$offEpsToZero" -"$offExpand" -"$offExternalInput" -"$offExternalOutput" -"$offFiltered" -"$offFold" -"$offGlobal" -"$offIDCProtect" -"$offImplicitAssign" -"$offInclude" -"$offInline" -"$offListing" -"$offLocal" -"$offLog" -"$offMacro" -"$offMargin" -"$offMixed" -"$offMulti" -"$offNestCom" -"$offOrder" -"$offPut" -"$offRecurse" -"$offSparse" -"$offStrictSingleton" -"$offSuffixAlgebraVars" -"$offSuffixDLVars" -"$offSymList" -"$offSymXRef" -"$offText" -"$offTroll" -"$offUelList" -"$offUelXRef" -"$offUndf" -"$offUni" -"$offUpper" -"$offVerbatim" -"$offWarning" -"$onCheckErrorLevel" -"$onCmsIncl" -"$onDelim" -"$onDigit" -"$onDollar" -"$onDotL" -"$onDotScale" -"$onECImplicitLoad" -"$onEcho" -"$onEchoS" -"$onEchoV" -"$onEmbedded" -"$onEmbeddedCode" -"$onEmbeddedCodeS" -"$onEmbeddedCodeV" -"$onEmpty" -"$onEnd" -"$onEolCom" -"$onEps" -"$onEpsToZero" -"$onExpand" -"$onExternalInput" -"$onExternalOutput" -"$onFiltered" -"$onFold" -"$onGlobal" -"$onIDCProtect" -"$onImplicitAssign" -"$onInclude" -"$onInline" -"$onListing" -"$onLocal" -"$onLog" -"$onMacro" -"$onMargin" -"$onMixed" -"$onMulti" -"$onMultiR" -"$onNestCom" -"$onOrder" -"$onPut" -"$onPutS" -"$onPutV" -"$onRecurse" -"$onSparse" -"$onStrictSingleton" -"$onSuffixAlgebraVars" -"$onSuffixDLVars" -"$onSymList" -"$onSymXRef" -"$onText" -"$onTroll" -"$onUelList" -"$onUelXRef" -"$onUndf" -"$onUni" -"$onUpper" -"$onVerbatim" -"$onWarning" -"$pauseEmbeddedCode" -"$phantom" -"$prefixPath" -"$protect" -"$purge" -"$remark" -"$run" -"$sTitle" -"$save" -"$scratchFileName" -"$set" -"$setArgs" -"$setComps" -"$setDdList" -"$setEnv" -"$setGlobal" -"$setLocal" -"$setNames" -"$shift" -"$show" -"$showFiles" -"$showMacros" -"$showVariables" -"$single" -"$slice" -"$splitOption" -"$stars" -"$stop" -"$sysInclude" -"$sysInsert" -"$terminate" -"$title" -"$unload" -"$use205" -"$use225" -"$use999" -"$version" -"$warning" +"abort" +"batInclude" +"call" +"callAsync" +"callAsyncIC" +"callAsyncNC" +"callTool" +"clear" +"clearError" +"clearErrors" +"comment" +"compress" +"continueEmbeddedCode" +"continueEmbeddedCodeS" +"continueEmbeddedCodeV" +"debug" +"declareAndLoad" +"decompress" +"diff" +"dollar" +"double" +"drop" +"dropEnv" +"dropGlobal" +"dropLocal" +"echo" +"echoN" +"eject" +"else" +"elseIf" +"elseIfE" +"elseIfI" +"embeddedCode" +"embeddedCodeS" +"embeddedCodeV" +"encrypt" +"endEmbeddedCode" +"endIf" +"eolCom" +"error" +"escape" +"eval" +"evalGlobal" +"evalLocal" +"exit" +"expose" +"funcLibIn" +"gdxIn" +"gdxLoad" +"gdxLoadAll" +"gdxOut" +"gdxUnload" +"goto" +"hidden" +"hiddenCall" +"hiddenCallTool" +"hide" +"if" +"ifE" +"ifI" +"ifThen" +"ifThenE" +"ifThenI" +"include" +"inlineCom" +"insert" +"kill" +"label" +"libInclude" +"libInsert" +"lines" +"load" +"loadDc" +"loadDcM" +"loadDcR" +"loadFiltered" +"loadFilteredM" +"loadFilteredR" +"loadIdx" +"loadM" +"loadR" +"log" +"macro" +"maxCol" +"maxGoTo" +"minCol" +"offCheckErrorLevel" +"offCmsIncl" +"offDelim" +"offDigit" +"offDollar" +"offDotL" +"offDotScale" +"offECImplicitLoad" +"offEcho" +"offEmbedded" +"offEmbeddedCode" +"offEmpty" +"offEnd" +"offEolCom" +"offEps" +"offEpsToZero" +"offExpand" +"offExternalInput" +"offExternalOutput" +"offFiltered" +"offFold" +"offGlobal" +"offIDCProtect" +"offImplicitAssign" +"offInclude" +"offInline" +"offListing" +"offLocal" +"offLog" +"offMacro" +"offMargin" +"offMixed" +"offMulti" +"offNestCom" +"offOrder" +"offPut" +"offRecurse" +"offSparse" +"offStrictSingleton" +"offSuffixAlgebraVars" +"offSuffixDLVars" +"offSymList" +"offSymXRef" +"offText" +"offTroll" +"offUelList" +"offUelXRef" +"offUndf" +"offUni" +"offUpper" +"offVerbatim" +"offWarning" +"onCheckErrorLevel" +"onCmsIncl" +"onDelim" +"onDigit" +"onDollar" +"onDotL" +"onDotScale" +"onECImplicitLoad" +"onEcho" +"onEchoS" +"onEchoV" +"onEmbedded" +"onEmbeddedCode" +"onEmbeddedCodeS" +"onEmbeddedCodeV" +"onEmpty" +"onEnd" +"onEolCom" +"onEps" +"onEpsToZero" +"onExpand" +"onExternalInput" +"onExternalOutput" +"onFiltered" +"onFold" +"onGlobal" +"onIDCProtect" +"onImplicitAssign" +"onInclude" +"onInline" +"onListing" +"onLocal" +"onLog" +"onMacro" +"onMargin" +"onMixed" +"onMulti" +"onMultiR" +"onNestCom" +"onOrder" +"onPut" +"onPutS" +"onPutV" +"onRecurse" +"onSparse" +"onStrictSingleton" +"onSuffixAlgebraVars" +"onSuffixDLVars" +"onSymList" +"onSymXRef" +"onText" +"onTroll" +"onUelList" +"onUelXRef" +"onUndf" +"onUni" +"onUpper" +"onVerbatim" +"onWarning" +"pauseEmbeddedCode" +"phantom" +"prefixPath" +"protect" +"purge" +"remark" +"run" +"sTitle" +"save" +"scratchFileName" +"set" +"setArgs" +"setComps" +"setDdList" +"setEnv" +"setGlobal" +"setLocal" +"setNames" +"shift" +"show" +"showFiles" +"showMacros" +"showVariables" +"single" +"slice" +"splitOption" +"stars" +"stop" +"sysInclude" +"sysInsert" +"terminate" +"title" +"unload" +"use205" +"use225" +"use999" +"version" +"warning" diff --git a/gams-mode.el b/gams-mode.el index 2850b89..4cc66a2 100644 --- a/gams-mode.el +++ b/gams-mode.el @@ -989,6 +989,14 @@ grouping constructs." "Attach dollar to the beginning of the STRING." (concat "$" string)) +(defvar gams-commands-dollar-all + (append + gams-commands-dollar + (mapcar 'gams-attach-dollar-to-string gams-commands-dollar) + (mapcar 'gams-attach-dollar-to-string + (mapcar 'gams-attach-dollar-to-string gams-commands-dollar))) + "List of GAMS dollar commands under all formats") + (defvar gams-commands-mpsge (mapcar 'gams-attach-dollar-to-string gams-statement-mpsge) "List of GAMS MPSGE commands.") @@ -996,21 +1004,21 @@ grouping constructs." (defvar gams-commands-all (append gams-commands - gams-commands-dollar + gams-commands-dollar-all gams-commands-mpsge) "List of all GAMS commands including dollar control.") (defvar gams-commands-all-down (append (mapcar 'downcase gams-commands) - (mapcar 'downcase gams-commands-dollar) + (mapcar 'downcase gams-commands-dollar-all) (mapcar 'downcase gams-commands-mpsge)) "List of downcase GAMS commands inc. dollar control options for completion.") (defvar gams-commands-all-up (append (mapcar 'upcase gams-commands) - (mapcar 'upcase gams-commands-dollar) + (mapcar 'upcase gams-commands-dollar-all) (mapcar 'upcase gams-commands-mpsge)) "List of uppercase GAMS commands inc. dollar control options for completion.") @@ -1099,8 +1107,7 @@ If STRING contains only spaces, return null string." (defvar gams-dollar-regexp (gams-regexp-opt - (mapcar 'gams-remove-dollar-from-string gams-commands-dollar) - t) + gams-commands-dollar t) "Regular expression for dollar control") (defvar gams-statement-regexp-base-sub diff --git a/test_fontlocking.gms b/test_fontlocking.gms new file mode 100644 index 0000000..685cbc1 --- /dev/null +++ b/test_fontlocking.gms @@ -0,0 +1,10 @@ +$onDollar offDotL + + $$onDollar + +Positive Variables + a My text + b "My text with quotes" +; + + From e369cfa75680007c57bf622e974f91ab3ff937cb Mon Sep 17 00:00:00 2001 From: Christophe Gouel Date: Mon, 25 Dec 2023 17:14:49 +0100 Subject: [PATCH 02/25] Move model type to lower-case --- command_files/commands_model.txt | 30 +- command_files/extract_gams_symbols.sh | 2 +- command_files/gams_commands.txt | 693 -------------------------- gams-commands.txt | 30 +- test_fontlocking.gms | 20 + 5 files changed, 51 insertions(+), 724 deletions(-) delete mode 100644 command_files/gams_commands.txt diff --git a/command_files/commands_model.txt b/command_files/commands_model.txt index 1ec0c93..d929355 100644 --- a/command_files/commands_model.txt +++ b/command_files/commands_model.txt @@ -1,15 +1,15 @@ -"LP" -"MIP" -"RMIP" -"NLP" -"MCP" -"MPEC" -"RMPEC" -"CNS" -"DNLP" -"RMINLP" -"MINLP" -"QCP" -"MIQCP" -"RMIQCP" -"EMP" +"lp" +"mip" +"rmip" +"nlp" +"mcp" +"mpec" +"rmpec" +"cns" +"dnlp" +"rminlp" +"minlp" +"qcp" +"miqcp" +"rmiqcp" +"emp" diff --git a/command_files/extract_gams_symbols.sh b/command_files/extract_gams_symbols.sh index 121b7d0..16046cd 100644 --- a/command_files/extract_gams_symbols.sh +++ b/command_files/extract_gams_symbols.sh @@ -16,7 +16,7 @@ sed -n '/systemAttributes()/,/systemData()/p' temp_syntax.txt > temp_sys_attr.tx sed -n '/systemData()/,/systemCTConstText()/p' temp_syntax.txt > temp_sys_data.txt sed -n '/systemCTConstText()/,/systemCTConstants()/p' temp_syntax.txt > temp_sys_ct_text.txt sed -n '/systemCTConstants()/,/modelTypes()/p' temp_syntax.txt > temp_sys_ct_constants.txt -sed -n '/modelTypes()/,/options()/p' temp_syntax.txt > temp_model.txt +sed -n '/modelTypes()/,/options()/p' temp_syntax.txt | tr '[A-Z]' '[a-z]' > temp_model.txt sed -n '/options()/,/execute()/p' temp_syntax.txt > temp_options.txt sed -n '/execute()/,/keyExecute()/p' temp_syntax.txt > temp_execute.txt sed -n '/keyExecute()/,/keyOption()/p' temp_syntax.txt > temp_key_execute.txt diff --git a/command_files/gams_commands.txt b/command_files/gams_commands.txt deleted file mode 100644 index fe576c2..0000000 --- a/command_files/gams_commands.txt +++ /dev/null @@ -1,693 +0,0 @@ - -"$abort" -"$auxiliaries:" -"$auxiliary:" -"$batInclude" -"$call" -"$callAsync" -"$callAsyncIC" -"$callAsyncNC" -"$callTool" -"$clear" -"$clearError" -"$clearErrors" -"$comment" -"$commodities:" -"$commodity:" -"$compress" -"$constraint:" -"$consumer:" -"$consumers:" -"$continueEmbeddedCode" -"$continueEmbeddedCodeS" -"$continueEmbeddedCodeV" -"$debug" -"$declareAndLoad" -"$decompress" -"$demand:" -"$diff" -"$dollar" -"$double" -"$drop" -"$dropEnv" -"$dropGlobal" -"$dropLocal" -"$echo" -"$echoN" -"$eject" -"$else" -"$elseIf" -"$elseIfE" -"$elseIfI" -"$embeddedCode" -"$embeddedCodeS" -"$embeddedCodeV" -"$encrypt" -"$endEmbeddedCode" -"$endIf" -"$eolCom" -"$error" -"$escape" -"$eval" -"$evalGlobal" -"$evalLocal" -"$exit" -"$expose" -"$funcLibIn" -"$gdxIn" -"$gdxLoad" -"$gdxLoadAll" -"$gdxOut" -"$gdxUnload" -"$goto" -"$hidden" -"$hiddenCall" -"$hiddenCallTool" -"$hide" -"$if" -"$ifE" -"$ifI" -"$ifThen" -"$ifThenE" -"$ifThenI" -"$include" -"$inlineCom" -"$insert" -"$kill" -"$label" -"$libInclude" -"$libInsert" -"$lines" -"$load" -"$loadDc" -"$loadDcM" -"$loadDcR" -"$loadFiltered" -"$loadFilteredM" -"$loadFilteredR" -"$loadIdx" -"$loadM" -"$loadR" -"$log" -"$macro" -"$maxCol" -"$maxGoTo" -"$minCol" -"$model:" -"$offCheckErrorLevel" -"$offCmsIncl" -"$offDelim" -"$offDigit" -"$offDollar" -"$offDotL" -"$offDotScale" -"$offECImplicitLoad" -"$offEcho" -"$offEmbedded" -"$offEmbeddedCode" -"$offEmpty" -"$offEnd" -"$offEolCom" -"$offEps" -"$offEpsToZero" -"$offExpand" -"$offExternalInput" -"$offExternalOutput" -"$offFiltered" -"$offFold" -"$offGlobal" -"$offIDCProtect" -"$offImplicitAssign" -"$offInclude" -"$offInline" -"$offListing" -"$offLocal" -"$offLog" -"$offMacro" -"$offMargin" -"$offMixed" -"$offMulti" -"$offNestCom" -"$offOrder" -"$offPut" -"$offRecurse" -"$offSparse" -"$offStrictSingleton" -"$offSuffixAlgebraVars" -"$offSuffixDLVars" -"$offSymList" -"$offSymXRef" -"$offText" -"$offTroll" -"$offUelList" -"$offUelXRef" -"$offUndf" -"$offUni" -"$offUpper" -"$offVerbatim" -"$offWarning" -"$onCheckErrorLevel" -"$onCmsIncl" -"$onDelim" -"$onDigit" -"$onDollar" -"$onDotL" -"$onDotScale" -"$onECImplicitLoad" -"$onEcho" -"$onEchoS" -"$onEchoV" -"$onEmbedded" -"$onEmbeddedCode" -"$onEmbeddedCodeS" -"$onEmbeddedCodeV" -"$onEmpty" -"$onEnd" -"$onEolCom" -"$onEps" -"$onEpsToZero" -"$onExpand" -"$onExternalInput" -"$onExternalOutput" -"$onFiltered" -"$onFold" -"$onGlobal" -"$onIDCProtect" -"$onImplicitAssign" -"$onInclude" -"$onInline" -"$onListing" -"$onLocal" -"$onLog" -"$onMacro" -"$onMargin" -"$onMixed" -"$onMulti" -"$onMultiR" -"$onNestCom" -"$onOrder" -"$onPut" -"$onPutS" -"$onPutV" -"$onRecurse" -"$onSparse" -"$onStrictSingleton" -"$onSuffixAlgebraVars" -"$onSuffixDLVars" -"$onSymList" -"$onSymXRef" -"$onText" -"$onTroll" -"$onUelList" -"$onUelXRef" -"$onUndf" -"$onUni" -"$onUpper" -"$onVerbatim" -"$onWarning" -"$pauseEmbeddedCode" -"$phantom" -"$prefixPath" -"$prod:" -"$protect" -"$purge" -"$remark" -"$report:" -"$run" -"$sTitle" -"$save" -"$scratchFileName" -"$sectors:" -"$set" -"$setArgs" -"$setComps" -"$setDdList" -"$setEnv" -"$setGlobal" -"$setLocal" -"$setNames" -"$shift" -"$show" -"$showFiles" -"$showMacros" -"$showVariables" -"$single" -"$slice" -"$splitOption" -"$stars" -"$stop" -"$sysInclude" -"$sysInsert" -"$terminate" -"$title" -"$unload" -"$use205" -"$use225" -"$use999" -"$version" -"$warning" -"Acronym" -"Acronyms" -"Alias" -"AsyncSolLst" -"Beta" -"BetaReg" -"Binary Variable" -"Binary Variables" -"Binary" -"Binomial" -"Bratio" -"BuildCode" -"CNS" -"Centropy" -"CheckErrorLevel" -"ComputerName" -"DNLP" -"Date" -"Date1" -"Decimals" -"DirSep" -"DispWidth" -"DmpOpt" -"DmpSym" -"DmpUserSym" -"DomLim" -"DualCheck" -"ECImplicitLoad" -"EDist" -"EMP" -"Eject" -"Elapsed" -"EmbeddedHandle" -"Entropy" -"EpsToZero" -"Equation" -"Equations" -"ErrorLevel" -"FDDelta" -"FDOpt" -"FE" -"FN" -"FP" -"Fact" -"File" -"FileSys" -"Files" -"Filtered" -"ForLim" -"ForceError" -"ForceErrorCnt" -"Free Variable" -"Free Variables" -"Free" -"Function" -"Functions" -"GString" -"GUSSModelAttributes" -"Gamma" -"GammaReg" -"GamsRelease" -"GamsReleaseMaint" -"GamsVersion" -"GdxFileNameIn" -"GdxFileNameOut" -"Gmillisec" -"HandleCollect" -"HandleDelete" -"HandleStatus" -"HandleSubmit" -"HeapFree" -"HeapLimit" -"HeapSize" -"HoldFixedAsync" -"HostPlatform" -"IDCProtect" -"IFile" -"ILine" -"IfThen" -"IncLine" -"IncName" -"IncParent" -"IncParentL" -"IntVarUp" -"Integer Variable" -"Integer Variables" -"Integer" -"Integer1" -"Integer2" -"Integer3" -"Integer4" -"Integer5" -"IsAlphaBeta" -"IterLim" -"JobHandle" -"JobKill" -"JobStatus" -"JobTerminate" -"LP" -"LicenseFileName" -"LicenseLevel" -"LicenseStatus" -"LimCol" -"LimRow" -"Line" -"ListLine" -"LogBeta" -"LogGamma" -"Logit" -"MACAddress" -"MCP" -"MCPRHoldfx" -"MINLP" -"MIP" -"MIQCP" -"MPEC" -"MathLastEC" -"MathLastRC" -"MathOVal" -"MaxExecError" -"MaxGenericFiles" -"MaxInput" -"Measure" -"Memory" -"MemoryStat" -"Model" -"Models" -"NLP" -"NcpCM" -"NcpF" -"NcpVUpow" -"NcpVUsin" -"Negative Variable" -"Negative Variables" -"Negative" -"NonNegative Variable" -"NonNegative Variables" -"NonNegative" -"NullFile" -"NumCores" -"OFile" -"OPage" -"OptCA" -"OptCR" -"PFile" -"PI" -"Page" -"Parameter" -"Parameters" -"Platform" -"PlatformCode" -"Poly" -"Positive Variable" -"Positive Variables" -"Positive" -"PrLine" -"PrPage" -"Profile" -"ProfileTol" -"PutFileName" -"QCP" -"RDate" -"RFile" -"RMINLP" -"RMIP" -"RMIQCP" -"RMPEC" -"RTime" -"RandBinomial" -"RandLinear" -"RandTriangle" -"ReDirLog" -"Real1" -"Real2" -"Real3" -"Real4" -"Real5" -"Reform" -"Replace" -"ResLim" -"SFile" -"SOS1 Variable" -"SOS1 Variables" -"SOS1" -"SOS2 Variable" -"SOS2 Variables" -"SOS2" -"SString" -"SavePoint" -"Scalar" -"Scalars" -"Seed" -"SemiCont Variable" -"SemiCont Variables" -"SemiCont" -"SemiInt Variable" -"SemiInt Variables" -"SemiInt" -"Set" -"Sets" -"Sigmoid" -"SignPower" -"Singleton Set" -"Singleton Sets" -"Singleton" -"SolPrint" -"SolSlack" -"SolveLink" -"SolveOpt" -"Solver" -"SubSystems" -"Sys10" -"Sys11" -"Sys12" -"Sys15" -"Sys16" -"Sys17" -"Sys18" -"Sys19" -"SysOut" -"TClose" -"TComp" -"TExec" -"TStart" -"Tab" -"Table" -"Threads" -"ThreadsAsync" -"Time" -"TimeElapsed" -"Title" -"UniformInt" -"UserConfigDir" -"UserDataDir" -"UserName" -"Variable" -"Variables" -"VerID" -"Version" -"ZeroToEps" -"abort" -"abs" -"all" -"and" -"arccos" -"arcsin" -"arctan" -"arctan2" -"async" -"asyncIC" -"asyncNC" -"bool_and" -"bool_eqv" -"bool_imp" -"bool_not" -"bool_or" -"bool_xor" -"break" -"card" -"ceil" -"checkErrorLevel" -"continue" -"continueEmbeddedCode" -"continueEmbeddedCodeS" -"continueEmbeddedCodeV" -"cos" -"cosh" -"cvPower" -"display" -"div" -"div0" -"do" -"dollarOptions" -"else" -"elseif" -"embedded" -"embeddedCode" -"embeddedCodeS" -"embeddedCodeV" -"empty" -"endEmbeddedCode" -"endfor" -"endif" -"endloop" -"endwhile" -"eps" -"errorf" -"execerror" -"execseed" -"execute" -"execute_load" -"execute_loaddc" -"execute_loadhandle" -"execute_loadpoint" -"execute_unload" -"execute_unloaddi" -"execute_unloadidx" -"exp" -"floor" -"for" -"frac" -"gamsFunctions" -"gamsParameterSynonymMap" -"gamsParameterSynonyms" -"gamsParameters" -"gday" -"gdow" -"gdxUels" -"ghour" -"gleap" -"gminute" -"gmonth" -"gsecond" -"gyear" -"handleStatus" -"handleStatus.Ready" -"handleStatus.Unknown" -"if" -"inf" -"jdate" -"jnow" -"jstart" -"jtime" -"log" -"log10" -"log2" -"logic" -"loop" -"mapval" -"max" -"maximizing" -"min" -"minimizing" -"mod" -"modelStat" -"modelStat.Error No Solution" -"modelStat.Feasible Solution" -"modelStat.Infeasible - No Solution" -"modelStat.Intermediate Non-Integer" -"modelStat.Licensing Problem" -"modelStat.Locally Infeasible" -"modelStat.Optimal" -"modelStat.Solved Singular" -"modelStat.Solved Unique" -"modelStat.Unbounded" -"modelTypes" -"na" -"no" -"normal" -"not" -"option" -"options" -"or" -"ord" -"pauseEmbeddedCode" -"platformCode" -"platformCode.DEX" -"platformCode.WEX" -"platforms" -"power" -"powerSetLeft" -"powerSetRight" -"predefinedSymbols" -"prod" -"put" -"put_utilities" -"put_utility" -"putclear" -"putclose" -"putfmcl" -"puthd" -"putheader" -"putpage" -"puttitle" -"puttl" -"rPower" -"rel_eq" -"rel_ge" -"rel_gt" -"rel_le" -"rel_lt" -"rel_ne" -"repeat" -"round" -"sand" -"setConstants" -"sign" -"sin" -"sinh" -"sleep" -"slexp" -"sllog10" -"slrec" -"smax" -"smin" -"solPrint" -"solPrint.On" -"solPrint.Quiet" -"solPrint.Summary" -"solve" -"solveLink" -"solveLink.ASync Threads" -"solveLink.Async Simulate" -"solveLink.Call Module" -"solveLink.Chain Script" -"solveOpt" -"solveOpt.Clear" -"solveOpt.Replace" -"solveStat" -"solveStat.Capability Problems" -"solveStat.Iteration Interrupt" -"solveStat.Solve Processing Skipped" -"solveStat.Solver Failure" -"solveStat.Terminated By Solver" -"solveStat.User Interrupt" -"solverNames" -"solverPlatformMap" -"solverTypePlatformMap" -"sor" -"sqexp" -"sqlog10" -"sqr" -"sqrec" -"sqrt" -"strictSingleton" -"sum" -"sync" -"system" -"systemSuffixes" -"tan" -"tanh" -"then" -"timeclose" -"timecomp" -"timeexec" -"timestart" -"trunc" -"undf" -"uniform" -"until" -"us" -"vcPower" -"while" -"xor" -"yes" diff --git a/gams-commands.txt b/gams-commands.txt index 3bf4344..0b3960d 100644 --- a/gams-commands.txt +++ b/gams-commands.txt @@ -10,11 +10,9 @@ "Binomial" "Bratio" "BuildCode" -"CNS" "Centropy" "CheckErrorLevel" "ComputerName" -"DNLP" "Date" "Date1" "Decimals" @@ -27,7 +25,6 @@ "DualCheck" "ECImplicitLoad" "EDist" -"EMP" "Eject" "Elapsed" "EmbeddedHandle" @@ -96,7 +93,6 @@ "JobKill" "JobStatus" "JobTerminate" -"LP" "LicenseFileName" "LicenseLevel" "LicenseStatus" @@ -108,12 +104,7 @@ "LogGamma" "Logit" "MACAddress" -"MCP" "MCPRHoldfx" -"MINLP" -"MIP" -"MIQCP" -"MPEC" "MathLastEC" "MathLastRC" "MathOVal" @@ -125,7 +116,6 @@ "MemoryStat" "Model" "Models" -"NLP" "NcpCM" "NcpF" "NcpVUpow" @@ -158,13 +148,8 @@ "Profile" "ProfileTol" "PutFileName" -"QCP" "RDate" "RFile" -"RMINLP" -"RMIP" -"RMIQCP" -"RMPEC" "RTime" "RandBinomial" "RandLinear" @@ -259,6 +244,7 @@ "card" "ceil" "checkErrorLevel" +"cns" "continue" "continueEmbeddedCode" "continueEmbeddedCodeS" @@ -269,6 +255,7 @@ "display" "div" "div0" +"dnlp" "do" "dollarOptions" "else" @@ -277,6 +264,7 @@ "embeddedCode" "embeddedCodeS" "embeddedCodeV" +"emp" "empty" "endEmbeddedCode" "endfor" @@ -326,11 +314,16 @@ "log2" "logic" "loop" +"lp" "mapval" "max" "maximizing" +"mcp" "min" "minimizing" +"minlp" +"mip" +"miqcp" "mod" "modelStat" "modelStat.Error No Solution" @@ -344,7 +337,9 @@ "modelStat.Solved Unique" "modelStat.Unbounded" "modelTypes" +"mpec" "na" +"nlp" "no" "normal" "not" @@ -373,6 +368,7 @@ "putpage" "puttitle" "puttl" +"qcp" "rPower" "rel_eq" "rel_ge" @@ -381,6 +377,10 @@ "rel_lt" "rel_ne" "repeat" +"rminlp" +"rmip" +"rmiqcp" +"rmpec" "round" "sand" "setConstants" diff --git a/test_fontlocking.gms b/test_fontlocking.gms index 685cbc1..f36abb6 100644 --- a/test_fontlocking.gms +++ b/test_fontlocking.gms @@ -8,3 +8,23 @@ Positive Variables ; +$if %system.fileSys% == UNIX $abort This code works only on Windows. + +$ifThen.one x == y +display "it1"; +$elseIf.one a == a +display "it2"; +$ifThen.two c == c +display "it3"; +$endIf.two +$elseIf.one b == b +display "it4"; +$endIf.one + +$ifThen not %gams.logOption% == 3 +$ ifI %system.fileSys% == UNIX $set nullFile > /dev/null +$ ifI %system.fileSys% == MSNT $set nullFile > nul +$ if not set nullFile $abort %system.fileSys% not recognized +$else +$ set nullFile +$endIf From 91f6dbb629e32e5fb268250cd9aa4f327a7e5fa1 Mon Sep 17 00:00:00 2001 From: Christophe Gouel Date: Wed, 3 Jul 2024 12:43:17 +0200 Subject: [PATCH 03/25] Update GAMS commands to GAMS version 47.2.0 --- command_files/commands_sys_ct_constants.txt | 53 ++++---- command_files/commands_sys_ct_text.txt | 6 +- command_files/syntaxdata.h | 133 ++++++++++---------- gams-commands-dollar.txt | 1 + gams-commands.txt | 53 ++++---- 5 files changed, 126 insertions(+), 120 deletions(-) diff --git a/command_files/commands_sys_ct_constants.txt b/command_files/commands_sys_ct_constants.txt index 38945fa..105f500 100644 --- a/command_files/commands_sys_ct_constants.txt +++ b/command_files/commands_sys_ct_constants.txt @@ -1,29 +1,28 @@ -"solPrint.Summary" -"solPrint.Quiet" -"solPrint.On" -"handleStatus.Unknown" -"handleStatus.Ready" -"solveLink.Chain Script" -"solveLink.Call Module" -"solveLink.Async Simulate" -"solveLink.ASync Threads" -"solveOpt.Replace" -"solveOpt.Clear" -"solveStat.Iteration Interrupt" -"solveStat.Terminated By Solver" -"solveStat.Capability Problems" -"solveStat.User Interrupt" -"solveStat.Solver Failure" -"solveStat.Solve Processing Skipped" -"modelStat.Optimal" -"modelStat.Unbounded" -"modelStat.Locally Infeasible" -"modelStat.Feasible Solution" -"modelStat.Intermediate Non-Integer" -"modelStat.Licensing Problem" -"modelStat.Error No Solution" -"modelStat.Solved Unique" -"modelStat.Solved Singular" -"modelStat.Infeasible - No Solution" +"handleStatus.unknown" +"handleStatus.ready" +"modelStat.optimal" +"modelStat.unbounded" +"modelStat.locallyInfeasible" +"modelStat.feasibleSolution" +"modelStat.intermediateNonInteger" +"modelStat.licensingProblem" +"modelStat.errorNoSolution" +"modelStat.solvedUnique" +"modelStat.solvedSingular" +"modelStat.infeasibleNoSolution" "platformCode.DEX" "platformCode.WEX" +"solPrint.off" +"solPrint.silent" +"solveLink.callScript" +"solveLink.asyncGrid" +"solveLink.loadLibrary" +"solveLink.threadsSimulate" +"solveOpt.merge" +"solveStat.normalCompletion" +"solveStat.resourceInterrupt" +"solveStat.evaluationInterrupt" +"solveStat.licensingProblems" +"solveStat.setupFailure" +"solveStat.internalSolverFailure" +"solveStat.systemFailure" diff --git a/command_files/commands_sys_ct_text.txt b/command_files/commands_sys_ct_text.txt index 4efda37..a38296e 100644 --- a/command_files/commands_sys_ct_text.txt +++ b/command_files/commands_sys_ct_text.txt @@ -1,7 +1,7 @@ -"solPrint" "handleStatus" +"modelStat" +"platformCode" +"solPrint" "solveLink" "solveOpt" "solveStat" -"modelStat" -"platformCode" diff --git a/command_files/syntaxdata.h b/command_files/syntaxdata.h index f3787fb..3ecbb34 100644 --- a/command_files/syntaxdata.h +++ b/command_files/syntaxdata.h @@ -3,8 +3,8 @@ * * Generated by gamsoptions.py * - * Copyright (c) 2017-2023 GAMS Software GmbH - * Copyright (c) 2017-2023 GAMS Development Corp. + * Copyright (c) 2017-2024 GAMS Software GmbH + * Copyright (c) 2017-2024 GAMS Development Corp. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -43,6 +43,8 @@ class SyntaxData {"offExternalOutput", "External output off"}, {"onIDCProtect", "Protect external input symbols from being changed at execution time"}, {"offIDCProtect", "Allow to change external input symbols at execution time"}, + {"onImplicitAssign", "Suppress compilation errors 141 and implicitly assign symbol if symbol has not been assigned"}, + {"offImplicitAssign", "Trigger compilation error 141 if symbol has not been assigned"}, {"onMargin", "Margin marking on"}, {"offMargin", "Margin marking off"}, {"minCol", "Set left data margin"}, @@ -78,7 +80,9 @@ class SyntaxData {"callAsync", "Execute another program async (inherit console)"}, {"callAsyncIC", "Execute another program async (inherit console)"}, {"callAsyncNC", "Execute another program async (new console)"}, + {"callTool", "Execute a GAMS tool"}, {"hiddenCall", "Execute another program (hidden)"}, + {"hiddenCallTool", "Execute a GAMS tool (hidden)"}, {"include", "Include file from working directory"}, {"onInclude", "Include message on"}, {"offInclude", "Include message off"}, @@ -170,7 +174,9 @@ class SyntaxData {"offFold", "End a block that can be collapsed/folded in GAMS Studio"}, {"gdxIn", "Open GDX file for input"}, {"gdxOut", "Open GDX file for output"}, - {"gdxLoad", "Load symbols from specified GDX file"}, + {"declareAndLoad", "Declare and load all symbols from specified GDX file"}, + {"gdxLoad", "Load specified symbols from specified GDX file"}, + {"gdxLoadAll", "Load all symbols which are known to GAMS from specified GDX file"}, {"gdxUnload", "Unload symbols into specified GDX file"}, {"load", "Load symbols from previously opened GDX file"}, {"loadR", "Load symbols from previously opened GDX file - replace"}, @@ -266,6 +272,7 @@ class SyntaxData {"onECImplicitLoad", "Allow implicit loading from embedded code"}, {"offECImplicitLoad", "Do not allow implicit loading from embedded code"}, {"save", "Create save file from source compiled so far"}, + {"xsave", "Create compressed save file from source compiled so far"}, }; return list; } @@ -361,76 +368,74 @@ class SyntaxData static const QList> systemCTConstText() { static const QList> list = { - {"solPrint", "Solution report print"}, {"handleStatus", "Status of model instance"}, + {"modelStat", "Model status"}, + {"platformCode", "Platform Code"}, + {"solPrint", "Solution report print"}, {"solveLink", "Solver link option"}, {"solveOpt", "Multiple solve management"}, {"solveStat", "Solver status"}, - {"modelStat", "Model status"}, - {"platformCode", "Platform Code"}, }; return list; } static const QList> systemCTConstants() { static const QList> list = { - {"solPrint.Summary", 0}, - {"solPrint.Report", 1}, - {"solPrint.Quiet", 2}, - {"solPrint.Off", 0}, - {"solPrint.On", 1}, - {"solPrint.Silent", 2}, - {"handleStatus.Unknown", 0}, - {"handleStatus.Running", 1}, - {"handleStatus.Ready", 2}, - {"handleStatus.Failure", 3}, - {"solveLink.Chain Script", 0}, - {"solveLink.Call Script", 1}, - {"solveLink.Call Module", 2}, - {"solveLink.Async Grid", 3}, - {"solveLink.Async Simulate", 4}, - {"solveLink.Load Library", 5}, - {"solveLink.ASync Threads", 6}, - {"solveLink.Threads Simulate", 7}, - {"solveOpt.Replace", 0}, - {"solveOpt.Merge", 1}, - {"solveOpt.Clear", 2}, - {"solveStat.Normal Completion", 1}, - {"solveStat.Iteration Interrupt", 2}, - {"solveStat.Resource Interrupt", 3}, - {"solveStat.Terminated By Solver", 4}, - {"solveStat.Evaluation Interrupt", 5}, - {"solveStat.Capability Problems", 6}, - {"solveStat.Licensing Problems", 7}, - {"solveStat.User Interrupt", 8}, - {"solveStat.Setup Failure", 9}, - {"solveStat.Solver Failure", 10}, - {"solveStat.Internal Solver Failure", 11}, - {"solveStat.Solve Processing Skipped", 12}, - {"solveStat.System Failure", 13}, - {"modelStat.Optimal", 1}, - {"modelStat.Locally Optimal", 2}, - {"modelStat.Unbounded", 3}, - {"modelStat.Infeasible", 4}, - {"modelStat.Locally Infeasible", 5}, - {"modelStat.Intermediate Infeasible", 6}, - {"modelStat.Feasible Solution", 7}, - {"modelStat.Integer Solution", 8}, - {"modelStat.Intermediate Non-Integer", 9}, - {"modelStat.Integer Infeasible", 10}, - {"modelStat.Licensing Problem", 11}, - {"modelStat.Error Unknown", 12}, - {"modelStat.Error No Solution", 13}, - {"modelStat.No Solution Returned", 14}, - {"modelStat.Solved Unique", 15}, - {"modelStat.Solved", 16}, - {"modelStat.Solved Singular", 17}, - {"modelStat.Unbounded - No Solution", 18}, - {"modelStat.Infeasible - No Solution", 19}, - {"platformCode.Unknown", 0}, - {"platformCode.DEG", 1}, - {"platformCode.LEG", 2}, + {"handleStatus.unknown", 0}, + {"handleStatus.running", 1}, + {"handleStatus.ready", 2}, + {"handleStatus.failure", 3}, + {"modelStat.optimal", 1}, + {"modelStat.locallyOptimal", 2}, + {"modelStat.unbounded", 3}, + {"modelStat.infeasible", 4}, + {"modelStat.locallyInfeasible", 5}, + {"modelStat.intermediateInfeasible", 6}, + {"modelStat.feasibleSolution", 7}, + {"modelStat.integerSolution", 8}, + {"modelStat.intermediateNonInteger", 9}, + {"modelStat.integerInfeasible", 10}, + {"modelStat.licensingProblem", 11}, + {"modelStat.errorUnknown", 12}, + {"modelStat.errorNoSolution", 13}, + {"modelStat.noSolutionReturned", 14}, + {"modelStat.solvedUnique", 15}, + {"modelStat.solved", 16}, + {"modelStat.solvedSingular", 17}, + {"modelStat.unboundedNoSolution", 18}, + {"modelStat.infeasibleNoSolution", 19}, + {"platformCode.unknown", 0}, + {"platformCode.DEX", 1}, + {"platformCode.LEX", 2}, {"platformCode.WEX", 3}, + {"platformCode.DAX", 4}, + {"solPrint.off", 0}, + {"solPrint.on", 1}, + {"solPrint.silent", 2}, + {"solveLink.chainScript", 0}, + {"solveLink.callScript", 1}, + {"solveLink.callModule", 2}, + {"solveLink.asyncGrid", 3}, + {"solveLink.asyncSimulate", 4}, + {"solveLink.loadLibrary", 5}, + {"solveLink.aSyncThreads", 6}, + {"solveLink.threadsSimulate", 7}, + {"solveOpt.replace", 0}, + {"solveOpt.merge", 1}, + {"solveOpt.clear", 2}, + {"solveStat.normalCompletion", 1}, + {"solveStat.iterationInterrupt", 2}, + {"solveStat.resourceInterrupt", 3}, + {"solveStat.terminatedBySolver", 4}, + {"solveStat.evaluationInterrupt", 5}, + {"solveStat.capabilityProblems", 6}, + {"solveStat.licensingProblems", 7}, + {"solveStat.userInterrupt", 8}, + {"solveStat.setupFailure", 9}, + {"solveStat.solverFailure", 10}, + {"solveStat.internalSolverFailure", 11}, + {"solveStat.solveProcessingSkipped", 12}, + {"solveStat.systemFailure", 13}, }; return list; } @@ -473,6 +478,7 @@ class SyntaxData {"EpsToZero", "Treat eps as zero when unloading to GDX"}, {"FDDelta", "Step size for finite differences"}, {"FDOpt", "Options for finite differences"}, + {"Filtered", "Switch between filtered and domain-checked read from GDX"}, {"ForLim", "GAMS looping limit"}, {"gdxUels", "Unload labels or UELs to GDX either squeezed or full"}, {"HoldFixedAsync", "Allow HoldFixed for models solved asynchronously as well"}, @@ -500,6 +506,7 @@ class SyntaxData {"Real4", "Real communication cell N"}, {"Real5", "Real communication cell N"}, {"Reform", "Reformulation level"}, + {"Replace", "Switch between merge and replace when reading from GDX into non-empty symbol"}, {"ResLim", "Wall-clock time limit for solver"}, {"SavePoint", "Save solver point in GDX file"}, {"Seed", "Random number seed"}, @@ -519,7 +526,7 @@ class SyntaxData {"Sys18", "Use backward compatible (i.e. pre-GAMS 31) scheme for reading floating-point numbers"}, {"Sys19", "Disable permutation on Column Generation (aka execute this as pre-GAMS 36)"}, {"SysOut", "Solver Status file reporting option"}, - {"Threads", "Number of threads to be used by a solver"}, + {"Threads", "Number of processors to be used by a solver"}, {"ThreadsAsync", "Limit on number of threads to be used for asynchronous solves (solveLink=6)"}, {"ZeroToEps", "Treat zero as eps"}, }; diff --git a/gams-commands-dollar.txt b/gams-commands-dollar.txt index 2525d6e..cb61abe 100644 --- a/gams-commands-dollar.txt +++ b/gams-commands-dollar.txt @@ -233,3 +233,4 @@ "use999" "version" "warning" +"xsave" diff --git a/gams-commands.txt b/gams-commands.txt index 0b3960d..8c4b226 100644 --- a/gams-commands.txt +++ b/gams-commands.txt @@ -301,8 +301,8 @@ "gsecond" "gyear" "handleStatus" -"handleStatus.Ready" -"handleStatus.Unknown" +"handleStatus.ready" +"handleStatus.unknown" "if" "inf" "jdate" @@ -326,16 +326,16 @@ "miqcp" "mod" "modelStat" -"modelStat.Error No Solution" -"modelStat.Feasible Solution" -"modelStat.Infeasible - No Solution" -"modelStat.Intermediate Non-Integer" -"modelStat.Licensing Problem" -"modelStat.Locally Infeasible" -"modelStat.Optimal" -"modelStat.Solved Singular" -"modelStat.Solved Unique" -"modelStat.Unbounded" +"modelStat.errorNoSolution" +"modelStat.feasibleSolution" +"modelStat.infeasibleNoSolution" +"modelStat.intermediateNonInteger" +"modelStat.licensingProblem" +"modelStat.locallyInfeasible" +"modelStat.optimal" +"modelStat.solvedSingular" +"modelStat.solvedUnique" +"modelStat.unbounded" "modelTypes" "mpec" "na" @@ -394,25 +394,24 @@ "smax" "smin" "solPrint" -"solPrint.On" -"solPrint.Quiet" -"solPrint.Summary" +"solPrint.off" +"solPrint.silent" "solve" "solveLink" -"solveLink.ASync Threads" -"solveLink.Async Simulate" -"solveLink.Call Module" -"solveLink.Chain Script" +"solveLink.asyncGrid" +"solveLink.callScript" +"solveLink.loadLibrary" +"solveLink.threadsSimulate" "solveOpt" -"solveOpt.Clear" -"solveOpt.Replace" +"solveOpt.merge" "solveStat" -"solveStat.Capability Problems" -"solveStat.Iteration Interrupt" -"solveStat.Solve Processing Skipped" -"solveStat.Solver Failure" -"solveStat.Terminated By Solver" -"solveStat.User Interrupt" +"solveStat.evaluationInterrupt" +"solveStat.internalSolverFailure" +"solveStat.licensingProblems" +"solveStat.normalCompletion" +"solveStat.resourceInterrupt" +"solveStat.setupFailure" +"solveStat.systemFailure" "solverNames" "solverPlatformMap" "solverTypePlatformMap" From 01885228e48c9aeae6224303c4ad5a9f7f74de19 Mon Sep 17 00:00:00 2001 From: Christophe Gouel Date: Wed, 3 Jul 2024 12:45:44 +0200 Subject: [PATCH 04/25] Add dollar conditional expressions --- gams-mode.el | 66 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 5 deletions(-) diff --git a/gams-mode.el b/gams-mode.el index 4cc66a2..8c28cab 100644 --- a/gams-mode.el +++ b/gams-mode.el @@ -977,12 +977,68 @@ grouping constructs." nil) "List of GAMS commands for completion.") +(defvar gams-command-dollar-if + '("if" "ifE" "ifI" "ifThen" "ifThenE" "ifThenI" "elseIf" "elseIfE" "elseIfI") + "List of $if commands") + +(defvar gams-command-dollar-conditional + '("acrType" + "decla_OK" + "declared" + "defined" + "dExist" + "dimension" + "empty" + "equType" + "errorFree" + "errorLevel" + "exist" + "filType" + "funType" + "gamsVersion" + "gdxDimension" + "gdxEquType" + "gdxSetType" + "gdxParType" + "gdxSetType" + "gdxSymExist" + "gdxVarType" + "macType" + "modType" + "onState" + "parType" + "preType" + "putOpen" + "readable" + "set" + "setEnv" + "setGlobal" + "setLocal" + "setType" + "solver" + "uelExist" + "varType" + "warnings" + "xxxType") + "List of condition expressions from https://www.gams.com/latest/docs/UG_DollarControlOptions.html#UG_DollarControl_ConditionalCompilationSyntax") + +(defvar gams-command-dollar-extra + (let (combinations) + (dolist (item1 gams-command-dollar-if) + (dolist (item2 gams-command-dollar-conditional) + (push (concat item1 " " item2) combinations) + (push (concat item1 " not " item2) combinations))) + (nreverse combinations)) + "List of all possible combinations of $if commands and condition expressions, including 'not'.") + (defvar gams-commands-dollar - (or (gams-import-words-from-file - (expand-file-name - "gams-commands-dollar.txt" - (file-name-directory (or load-file-name default-directory)))) - nil) + (append + (or (gams-import-words-from-file + (expand-file-name + "gams-commands-dollar.txt" + (file-name-directory (or load-file-name default-directory)))) + nil) + gams-command-dollar-extra) "List of GAMS dollar commands.") (defun gams-attach-dollar-to-string (string) From 35c8bf52afbb09ef6447b9504a755a3643e25b65 Mon Sep 17 00:00:00 2001 From: ShiroTakeda Date: Mon, 8 Jul 2024 00:00:33 +0900 Subject: [PATCH 05/25] Slightly modified code. --- gams-mode.el | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/gams-mode.el b/gams-mode.el index c817e2d..8e8bc33 100644 --- a/gams-mode.el +++ b/gams-mode.el @@ -977,11 +977,11 @@ grouping constructs." nil) "List of GAMS commands for completion.") -(defvar gams-command-dollar-if +(defvar gams-commands-dollar-if '("if" "ifE" "ifI" "ifThen" "ifThenE" "ifThenI" "elseIf" "elseIfE" "elseIfI") "List of $if commands") -(defvar gams-command-dollar-conditional +(defvar gams-commands-dollar-conditional '("acrType" "decla_OK" "declared" @@ -1022,35 +1022,31 @@ grouping constructs." "xxxType") "List of condition expressions from https://www.gams.com/latest/docs/UG_DollarControlOptions.html#UG_DollarControl_ConditionalCompilationSyntax") -(defvar gams-command-dollar-extra +(defvar gams-commands-dollar-extra (let (combinations) - (dolist (item1 gams-command-dollar-if) - (dolist (item2 gams-command-dollar-conditional) + (dolist (item1 gams-commands-dollar-if) + (dolist (item2 gams-commands-dollar-conditional) (push (concat item1 " " item2) combinations) (push (concat item1 " not " item2) combinations))) (nreverse combinations)) "List of all possible combinations of $if commands and condition expressions, including 'not'.") -(defvar gams-commands-dollar +(defvar gams-commands-dollar-wo-dollar (append (or (gams-import-words-from-file (expand-file-name "gams-commands-dollar.txt" (file-name-directory (or load-file-name default-directory)))) nil) - gams-command-dollar-extra) - "List of GAMS dollar commands.") + gams-commands-dollar-extra) + "List of GAMS dollar commands without $.") (defun gams-attach-dollar-to-string (string) "Attach dollar to the beginning of the STRING." (concat "$" string)) -(defvar gams-commands-dollar-all - (append - gams-commands-dollar - (mapcar 'gams-attach-dollar-to-string gams-commands-dollar) - (mapcar 'gams-attach-dollar-to-string - (mapcar 'gams-attach-dollar-to-string gams-commands-dollar))) +(defvar gams-commands-dollar + (mapcar 'gams-attach-dollar-to-string gams-commands-dollar-wo-dollar) "List of GAMS dollar commands under all formats") (defvar gams-commands-mpsge @@ -1060,7 +1056,7 @@ grouping constructs." (defvar gams-commands-all (append gams-commands - gams-commands-dollar-all + gams-commands-dollar gams-commands-mpsge) "List of all GAMS commands including dollar control.") @@ -1156,8 +1152,7 @@ If STRING contains only spaces, return null string." (if num (substring string num) ""))) (defvar gams-dollar-regexp - (gams-regexp-opt - gams-commands-dollar t) + (gams-regexp-opt gams-commands-dollar-wo-dollar t) "Regular expression for dollar control") (defvar gams-statement-regexp-base-sub From fdd9364108bd9b864aa3bbfbdfb4da5fe3dd229d Mon Sep 17 00:00:00 2001 From: ShiroTakeda Date: Mon, 8 Jul 2024 00:03:58 +0900 Subject: [PATCH 06/25] Changed the version number. --- gams-mode.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gams-mode.el b/gams-mode.el index 8e8bc33..05bf0fc 100644 --- a/gams-mode.el +++ b/gams-mode.el @@ -4,7 +4,7 @@ ;; Maintainer: Shiro Takeda ;; Copyright (C) 2001-2023 Shiro Takeda ;; First Created: Sun Aug 19, 2001 12:48 PM -;; Version: 6.15 +;; Version: 6.16 ;; Package-Requires: ((emacs "24.3")) ;; Keywords: languages, tools, GAMS ;; URL: http://shirotakeda.org/en/gams/gams-mode/ @@ -74,7 +74,7 @@ ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defconst gams-mode-version "6.15" +(defconst gams-mode-version "6.16" "Version of GAMS mode.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; From 4689557e1d66f2e32009c8c30e6f885be40a7494 Mon Sep 17 00:00:00 2001 From: ShiroTakeda Date: Mon, 8 Jul 2024 00:15:34 +0900 Subject: [PATCH 07/25] Slightly modified configuration file. --- gams-setting-sample.el | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/gams-setting-sample.el b/gams-setting-sample.el index 5d61b17..db0ed7b 100644 --- a/gams-setting-sample.el +++ b/gams-setting-sample.el @@ -3,7 +3,7 @@ ;; First-written: <2001/08/13> ;; Author: Shiro Takeda ;; -;; This file is created for gams-mode.el version 6.10. +;; This file is created for gams-mode.el version 6.16. ;; ;; Copy and paste the content of this file into ;; "~/.emacs.d/init.el" file. @@ -270,11 +270,13 @@ ;; ;; Bind inserting GAMS statement to C-ca. ;; (define-key gams-mode-map "\C-ca" 'gams-insert-statement)) ;; )) + ;; (add-hook 'gams-lst-mode-hook ;; '(lambda () ;; ;; a = widen the window. ;; (define-key gams-lst-mode-map "a" 'gams-lst-kill-buffer) ;; )) + ;; (add-hook 'gams-ol-mode-hook ;; '(lambda () ;; (font-lock-mode t) @@ -291,6 +293,14 @@ ;; 'gams-lxi-mode-hook ;; '(lambda () (linum-mode -1))) +;;;; company-mode for GAMS mode +;; +;; If you want to use company-mode for GAMS mode add the following code: +;; +;; (add-hook 'gams-mode-hook +;; ;; Use company-mode +;; #'(lambda () (company-mode))) + ;;;; auto-complete mode for GAMS mode ;; From 7282e4da291d274c337557482d0e459131b10374 Mon Sep 17 00:00:00 2001 From: ShiroTakeda Date: Mon, 8 Jul 2024 00:20:04 +0900 Subject: [PATCH 08/25] Corrected URL and copyright notice. --- doc/refcard-gams.pdf | Bin 76098 -> 76282 bytes doc/refcard-gams.tex | 8 ++++---- gams-mode.el | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/refcard-gams.pdf b/doc/refcard-gams.pdf index 812bd3131a4f884e0a58d781179868303b797b92..6cbcd01d225aa86069f4a609561889bfb82a7eb2 100644 GIT binary patch delta 36153 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 +% Time-stamp: <2024-07-08 00:16:38 st> % This file is based on gnusref.tex distriubted with T-Gnus. Shiro Takeda % has modified it and created this file. @@ -26,9 +26,9 @@ % Two columns, footnote size. \twocolumn\footnotesize\pagestyle{empty} -\def\version{6.10} -\def\date{2022-05-12} -\def\year{2001--2023\ } +\def\version{6.16} +\def\date{2024-07-08} +\def\year{2001--2024\ } \def\author{Shiro Takeda \\{\tt https://shirotakeda.github.io/}} diff --git a/gams-mode.el b/gams-mode.el index 05bf0fc..7e95952 100644 --- a/gams-mode.el +++ b/gams-mode.el @@ -2,12 +2,12 @@ ;; Author: Shiro Takeda ;; Maintainer: Shiro Takeda -;; Copyright (C) 2001-2023 Shiro Takeda +;; Copyright (C) 2001-2024 Shiro Takeda ;; First Created: Sun Aug 19, 2001 12:48 PM ;; Version: 6.16 ;; Package-Requires: ((emacs "24.3")) ;; Keywords: languages, tools, GAMS -;; URL: http://shirotakeda.org/en/gams/gams-mode/ +;; URL: https://github.com/ShiroTakeda/gams-mode ;; This file is not part of any Emacs. @@ -31,8 +31,8 @@ ;; GAMS in Emacs (GAMS mode for Emacs). ;; To install and use this mode, you need to add some codes in init.el. For the -;; details, please see README.txt file available at -;; http://shirotakeda.org/en/gams/gams-mode/ +;; details, please see the following site +;; https://github.com/ShiroTakeda/gams-mode ;; ;; If you install this file from MLPA repository, gams-mode.el is downloaded ;; from GitHub . Please From 21e04b7f179a60bb2da8420cee3dfc10e3a9727b Mon Sep 17 00:00:00 2001 From: ShiroTakeda Date: Mon, 8 Jul 2024 00:20:29 +0900 Subject: [PATCH 09/25] Updated CHNAGELOG.md. --- CHANGELOG.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96f2be6..43e50c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,26 @@ Maintainer: Shiro Takeda Change logs of GAMS mode. ==================================================== +Version 6.16 +---------------------------------- + +* The new GAMS mode supports `company-mode` which is a text completion + framework for Emacs. If you want to use company-mode in GAMS mode, 1) + install company-mode by yourself, and 2) Please add the following code + to init.el + + (add-hook + 'gams-mode-hook + #'(lambda () (company-mode)) + ) + + Version 6.15 ---------------------------------- * In GAMS-SIL mode, $label command is now treated in the same way as $title command. - + Version 6.14 From 73b2e52c939c392fcf78a70c3d9e04af7f0ca8c6 Mon Sep 17 00:00:00 2001 From: ShiroTakeda Date: Wed, 10 Jul 2024 13:38:46 +0900 Subject: [PATCH 10/25] Updated the entire description in the `README.md` file. --- README.md | 591 ++++++++++++++++++++---------------------------------- 1 file changed, 220 insertions(+), 371 deletions(-) diff --git a/README.md b/README.md index e321b57..b1a2796 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,9 @@ Maintainer: Shiro Takeda GAMS-mode ============================================================ -This package offers the Emacs lisp program for using the numerical -software GAMS in Emacs (GAMS mode for Emacs). +This package offers the Emacs lisp program for using the numerical software GAMS in Emacs (GAMS mode for Emacs). -If you want to know how to install GAMS mode, read -[Installation](#installation) below. If you want to know the latest -changes added to GAMS mode, see [CHANGELOG.md](CHANGELOG.md) file. +If you want to know how to install GAMS mode, read [Installation](#installation) below. If you want to know the latest changes added to GAMS mode, see [CHANGELOG.md](CHANGELOG.md) file. ------------------------------------------------------------ @@ -34,28 +31,26 @@ changes added to GAMS mode, see [CHANGELOG.md](CHANGELOG.md) file. ## Introduction of GAMS mode for Emacs. -GAMS mode for Emacs offers an integrated and flexible environment for using GAMS in Emacs. +GAMS mode for Emacs offers an integrated and flexible environment for using GAMS within Emacs. This section presents a brief overview of what GAMS mode for Emacs is. Please read the section "Installation"' below for information about how to install GAMS mode. If you are upgrading from the previous version of GAMS mode, you can find the latest changes in [CHANGELOG.md](CHANGELOG.md) file. -You can obtain the latest version of this program at the website [GAMS mode for Emacs (https://github.com/ShiroTakeda/gams-mode/)](https://github.com/ShiroTakeda/gams-mode/). +You can obtain the latest version of this program from the website [GAMS mode for Emacs (https://github.com/ShiroTakeda/gams-mode/)](https://github.com/ShiroTakeda/gams-mode/). -1. When you use GAMS, you must do the following jobs: -2. Edit GAMS program file, -3. Call GAMS to execute the program, -4. Read the output file, -5. Debug the program, -6. Examine the numerical values in the output file, +When using GAMS, you need to perform the following tasks: -and so on... +1. Edit GAMS program files +2. Call GAMS to execute the program +3. Read the output file +4. Debug the program +5. Examine the numerical values in the output file -GAMS mode for Emacs offers various kinds of features which raise your -efficiency in all these jobs. +And more... + +GAMS mode for Emacs offers various features that increase your efficiency in all these tasks. + +GAMS mode for Emacs includes five major modes (I will skip the explanation of the Emacs terminology "major mode." If you are not familiar with this term, I recommend reading the introductory documentation for Emacs first): -GAMS mode for Emacs offers the following five major modes (I skip the -explanation of the Emacs terminology "major mode." If you cannot -understand the terminology, I recommend you to read the introductory -document of Emacs first). | Mode | Explanation | |:----------------------|:----------------------------------------------| @@ -69,113 +64,69 @@ Furthermore, the following features are included in each major mode. ## GAMS mode -This is the major mode for editing GAMS program file. +This is the major mode for editing GAMS program files. 1. Inserting GAMS statements and dollar control options. -2. Automatic registering of new statements and dollar control options. -3. Calling GAMS from Emacs -4. Syntax hilighting. +2. Automatic registration of new statements and dollar control options. +3. Calling GAMS from Emacs. +4. Syntax highlighting. 5. Handling templates of various programs (this is GAMS-TEMPLATE mode). -6. Automatic indent. +6. Automatic indentation. 7. Viewing GAMS program structure (GAMS-SIL mode). 8. Reading GAMS manual. -9. Extracting models from GAMS model library. +9. Extracting models from the GAMS model library. -I will explain each function in detail. +I will explain each function in detail: -By registering GAMS statements and dollar control options beforehand, (1) -enables you to insert them into the program file easily. You can insert -the long statements and dollar control options (that you are likely to -mistype) without typing them by yourself. +By registering GAMS statements and dollar control options beforehand, (1) enables you to insert them into the program file easily. You can insert long statements and dollar control options (that you are likely to mistype) without typing them yourself. -Although there are a lot of GAMS statements and dollar control options, -only a part of them is registered by default in GAMS mode. It is because -frequently used statements differ according to users, and because it is -desirable to exclude rarely used statements from candidates of input -function of (1). However, (2) enables you to register new statements and -dollar control options. You can easily add the commands that you -frequently use to the candidate for command inserting function of (1). +Although there are many GAMS statements and dollar control options, only a subset is registered by default in GAMS mode. This is because frequently used statements differ among users, and it is desirable to exclude rarely used statements from the input function candidates of (1). However, (2) enables you to register new statements and dollar control options. You can easily add the commands you frequently use to the candidate list for the command insertion function of (1). -(3) is the function to call GAMS directly from Emacs for executing the gms -file. +(3) is the function to call GAMS directly from Emacs to execute the GMS file. -Like GAMS Studio (or GAMSIDE), (4) provides the colorization of GAMS -program files according to GAMS syntax. +Like GAMS Studio (or GAMSIDE), (4) provides the colorization of GAMS program files according to GAMS syntax. -When editing GAMS program files, you may often use similar patterns -frequently. In that case, you may copy and paste the program repeatedly. -But it is undoubtedly more convenient if you can register frequently used -patterns and select them. Or, although the pattern is not frequently -used, it may be hard to remember it. Also in that case, it seems -convenient if you can use registered patterns. (5) offers you the feature -for registering various patterns easily. In addition to registering, you -can modify, delete, rename and re-order existing templates easily. +When editing GAMS program files, you may often use similar patterns frequently. In such cases, you may copy and paste the program repeatedly. However, it is undoubtedly more convenient if you can register frequently used patterns and select them. Or, although the pattern is not frequently used, it may be hard to remember. Also in that case, it seems convenient if you can use registered patterns. (5) offers you the feature for registering various patterns easily. In addition to registering, you can modify, delete, rename, and reorder existing templates easily. -Many people agree with the opinion that the proper indent is important for -writing programs that other people (or yourself) can read easily. But it -is quite tedious to insert spaces and TABs manually by yourself. In GAMS -mode, each line is automatically indented according to GAMS syntax (6). +Many people agree with the opinion that proper indentation is important for writing programs that others (or yourself) can read easily. However, it is quite tedious to insert spaces and TABs manually yourself. In GAMS mode, each line is automatically indented according to GAMS syntax (6). -When we write a GAMS program, we define many (sometimes hundreds of) -variables, equations, sets and parameters and it is difficult to remember -which identifier represents what. Feature (7) enables you to show the -list of all identifiers defined in a program and you can see the structure -of a program. - -In addition, you can call a manual viewer from Emacs (8) to read GAMS -manuals and you can view GAMS model library in Emacs (9). +When writing a GAMS program, we define many (sometimes hundreds of) variables, equations, sets, and parameters, and it is difficult to remember which identifier represents what. Feature (7) enables you to show the list of all identifiers defined in a program, allowing you to see the structure of the program. +Additionally, you can call a manual viewer from Emacs (8) to read GAMS manuals and view the GAMS model library in Emacs (9). ## GAMS-LST mode -This is the major mode for viewing the output file (i.e. LST file). +This is the major mode for viewing the output file (i.e., LST file). -1. Display the error place and its meaning. -2. Jump to the error place in the program file. -3. Jump to the various places in the LST file. +1. Display the error location and its meaning. +2. Jump to the error location in the program file. +3. Jump to various places in the LST file. 4. Color the content of the LST file. -5. Display the important items of the LST file (this is the GAMS-OUTLINE mode). +5. Display important items of the LST file (this is GAMS-OUTLINE mode). -In editing GAMS program, one of the most important job is debugging. Your -efficiency of writing program crucially depends on the efficiency of -debugging. (1) and (2) are the functions for that. +When editing GAMS programs, one of the most important tasks is debugging. Your efficiency in writing programs crucially depends on the efficiency of debugging. (1) and (2) are functions for that. -With (1) and (2), you can do the following jobs quickly with simple key -operation. +With (1) and (2), you can quickly perform the following tasks with simple key operations: -* Call GAMS and execute the program. -* Move to the LST file. -* Examine the place and meaning of errors. -* Go back to the error place in the program. +- Call GAMS and execute the program. +- Move to the LST file. +- Examine the location and meaning of errors. +- Go back to the error location in the program. -You can do similar things also in GAMSIDE, but, I think GAMS mode offers -the more convenient environment. +You can do similar tasks in GAMSIDE, but I believe GAMS mode offers a more convenient environment. -LST files often become quite large. In that case, it is hard to search -the output that you want to see. (3) provides you the feature for moving -to various important items (such as PARAMETER, SET, VAR, EQU) in the LST -file with simple key operation. +LST files often become quite large. In such cases, it is hard to search for the output you want to see. (3) provides you with the feature to move to various important items (such as PARAMETER, SET, VAR, EQU) in the LST file with simple key operations. Function (4) colors the content of LST files. -As pointed out above, the LST file is often very large and it is often -very difficult to find the numerical values you want to see. And it is -also difficult to compare the numerical values in two different parts of -the LST file. Although you may be able to resolve these problems by -defining parameters that display only relevant values, it is more -convenient if you can examine the content of the LST file in a simple way. +As pointed out above, the LST file is often very large, and it is often very difficult to find the numerical values you want to see. It is also difficult to compare the numerical values in two different parts of the LST file. Although you may resolve these problems by defining parameters that display only relevant values, it is more convenient if you can examine the content of the LST file in a simple way. -(5) provides the way for that. With this feature, you can easily view the -important elements (PARAMETER, VAR, EQU, etc.) in LST files. +(5) provides a way for that. With this feature, you can easily view the important elements (PARAMETER, VAR, EQU, etc.) in LST files. -You can see where the particular PARAMETER or VAR are and can see the -content of them. You can also compare the numerical values in a part of -the file with that in another part. You are able to know what this -function is like by looking at the screenshots placed at [the screenshots +You can see where the particular PARAMETER or VAR is and view its content. You can also compare the numerical values in one part of the file with those in another part. You can understand what this function is like by looking at the screenshots on [the screenshots page](https://www.flickr.com/search/?sort=date-taken-desc&safe_search=1&tags=gamsmode&user_id=144666886%40N07&view_all=1). -These are the simple explanation of this program. Of course, there are a -lot of other functions! +These are the basic explanations of this program. Of course, there are many other functions! Bug reports, requests, and suggestions are all welcome! @@ -193,47 +144,37 @@ See [screenshots page](https://www.flickr.com/search/?sort=date-taken-desc&safe_ First, I explain the files distributed in the package. -| Filename | Explanation | -|:---------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------| -| `README.md` | This file. First read this file. | -| [`gams-mode.el`](gams-mode.el) | This is the main lisp program. | -| [`sample_gams_code`](sample_gams_code) | This folder includes sample gms files. If you want to learn how to use GAMS mode, read gams-sample.gms file in this folder. | -| [`gams-setting-sample.el`](gams-setting-sample.el) | Sample file of settings in init.el file. | -| `gams-template.txt` | Sample file of templates. | -| [`CHANGELOG.md`](CHANGELOG.md) | Change log file that records history of changes. If you want to know changes and newly added functions, please read it. | -| [`BUGS_PROBLEMS.md`](BUGS_PROBLEMS.md) | Known bugs and problems. | -| [`doc`](doc) | Document folder which includes the reference card. | -| `lxi` | This folder includes files used to explain GAMS-LXI mode. | +| Filename | Explanation | +| :--------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | +| `README.md` | This file. Please read this first. | +| [`gams-mode.el`](gams-mode.el) | The main Lisp program. | +| [`sample_gams_code`](sample_gams_code) | This folder includes sample GMS files. To learn how to use GAMS mode, read the `gams-sample.gms` file in this folder. | +| [`gams-setting-sample.el`](gams-setting-sample.el) | Sample settings file for `init.el`. | +| `gams-template.txt` | Sample templates file. | +| [`CHANGELOG.md`](CHANGELOG.md) | Change log file recording the history of changes. To know about changes and newly added functions, please read it. | +| [`BUGS_PROBLEMS.md`](BUGS_PROBLEMS.md) | Known bugs and problems. | +| [`doc`](doc) | Document folder including the reference card. | +| `lxi` | This folder includes files used to explain GAMS-LXI mode. | -If you are well acquainted with Emacs, installation is straightforward. -Here, I explain the basic Emacs terminologies used below. But if you are -a novice user of Emacs, I recommend you to read the website http://www.gnu.org/software/emacs/manual/html_node/efaq-w32/index.html. +If you are well acquainted with Emacs, installation is straightforward. Here, I explain the basic Emacs terminologies used below. But if you are a novice user of Emacs, I recommend you to read the website [Emacs FAQ for Windows](http://www.gnu.org/software/emacs/manual/html_node/efaq-w32/index.html). + + `"~/"` -This is Unix terminology rather than Emacs'. This represents a user's HOME -directory. A user's HOME directory is the directory (folder) where his -configuration files are placed. If you are MS Windows, the default HOME -directory is set to "c:\Users\username\AppData\Roaming". If you want to -know to which directory your home directory is set, evaluate (getenv -"HOME") in the *scratch* buffer on Emacs. You can set your HOME directory -by the environmental variable HOME. +This is Unix terminology rather than Emacs'. It represents a user's HOME directory, where configuration files are placed. In MS Windows, the default HOME directory is set to `C:\Users\username\AppData\Roaming`. To find your home directory, evaluate `(getenv "HOME")` in the *scratch* buffer on Emacs. You can set your HOME directory using the environment variable HOME. `"~/.emacs.d/init.el"` or `"init.el"` -This is the configuration file that Emacs tries to read first when it is -started. You can change the behavior of Emacs by writing various settings -in this file. Note that this is the file that you must create by yourself -and there exists no "init.el" file by default (unless the administrator -has created it for you). +This is the configuration file that Emacs reads first when it starts. You can change Emacs' behavior by writing various settings in this file. Note that you must create this file yourself, as no "init.el" file exists by default (unless an administrator has created it for you). `non-nil` -In Emacs terminology, non-nil means anything other than nil, and values -such as 0, "a", or t all mean non-nil. But we usually use symbol t as -non-nil. So, when I say "set non-nil to x", set t to x (i.e. `(setq x t)`). +In Emacs terminology, non-nil means anything other than nil, including values such as 0, "a", or t. However, we usually use the symbol `t` as non-nil. So, when I say "set non-nil to x," set `t` to `x` (i.e., `(setq x t)`). + +In Emacs terminology, non-nil means anything other than nil, including values such as 0, "a", or t. However, we usually use the symbol `t` as non-nil. So, when I say "set non-nil to x," set `t` to `x` (i.e., `(setq x t)`). ------------------------------------------------------------ @@ -241,328 +182,236 @@ non-nil. So, when I say "set non-nil to x", set t to x (i.e. `(setq x t)`). ### Install from MELPA repository. -You can install GAMS mode (gams-mode.el) from MELPA repository. Type M-x -list-packages and select gams-mode. - -To use melpa, put the following code in your init.el file. - - (add-to-list 'package-archives - '("melpa" . "http://melpa.milkbox.net/packages/") t) - (add-to-list 'package-archives - '("melpa-stable" . "http://stable.melpa.org/packages/") t) - -If you want to use a stable version, use GAMS mode in melpa-stable. If -you want to use a developing version, use GAMS mode in melpa. - -Note that it installs only gams-mode.el file and does not install sample -files and explanatory files. So to use GAMS mode, you had better read -GAMS mode web site first. - -If the GAMS system folder is not included in PATH environemtal variable, -you need to set GAMS system folder to PATH or you need to set the full -path to gams.exe to the variable 'gams-process-command-name'. For example, -your gams.exe is placed at "c:/GAMS/win64/GAMS24.1/", then add the +You can install GAMS mode (`gams-mode.el`) from the MELPA repository. Type `M-x list-packages` and select gams-mode. + +To use MELPA, add the following code to your `init.el` file: + +```lisp +(add-to-list 'package-archives + '("melpa" . "http://melpa.milkbox.net/packages/") t) +(add-to-list 'package-archives + '("melpa-stable" . "http://stable.melpa.org/packages/") t) +``` + +If you want to use a stable version, use GAMS mode from melpa-stable. If you want to use a developing version, use GAMS mode from melpa. + +Note that it installs only the `gams-mode.el` file and does not install sample files or explanatory files. To use GAMS mode, you should first read the [GAMS mode website](https://github.com/ShiroTakeda/gams-mode/). + +If the GAMS system folder is not included in the PATH environment variable, you need to set the GAMS system folder to PATH or set the full path to `gams.exe` in the variable `gams-process-command-name`. For example, if your `gams.exe` is located at `C:/GAMS/win64/GAMS24.1/`, add the following line to `init.el`: + following line to init.el: - (setq gams-process-command-name "c:/GAMS/37/gams.exe") +```lisp +(setq gams-process-command-name "c:/GAMS/37/gams.exe") +``` + +Additionally, set `gams-system-directory` like this: -In addition, you had better set 'gams-system-directory' like - - (setq gams-system-directory "c:/GAMS/37/") - -If you want to color an Emacs buffer, add the followings, too. +```lisp +(setq gams-system-directory "c:/GAMS/37/") +``` - (require 'font-lock) - (global-font-lock-mode t) +If you want to enable syntax coloring in an Emacs buffer, add the following: -Basically, this is all you must set. With these settings, when you open a -file with extension "gms" ("lst"), GAMS mode (GAMS-LST mode) will -automatically start. Byte-compiling gams-mode.el may raise the speed of -GAMS mode (but you need not necessarily do it). +```lisp +(require 'font-lock) +(global-font-lock-mode t) +``` -There is a sample setting file ("gams-setting-sample.el") distributed with -this file. Please read it, too. +These settings are generally sufficient. With them, when you open a file with the extension "gms" ("lst"), GAMS mode (GAMS-LST mode) will start automatically. Byte-compiling `gams-mode.el` may improve the speed of GAMS mode (but it is not necessary). -If you want to use GAMS-TEMPLATE mode, you had better copy the sample -template file "gams-template.txt" in "~/.emacs.d/". This sample file -contains a lot of useful templates for writing gms files. +A sample settings file (`gams-setting-sample.el`) is distributed with this package. Please read it as well. -There are several lisp variables which decide the important behaviors of -GAMS and the GAMS mode. So, please read the customization part below, -too. +If you want to use GAMS-TEMPLATE mode, copy the sample template file `gams-template.txt` to `~/.emacs.d/`. This sample file contains many useful templates for writing GMS files. +There are several Lisp variables that determine the important behaviors of GAMS and GAMS mode. Please read the customization section below. -### Install manually +### Manual Installation -To install gams-mode.el manually, you need to follow the procedure below -(1 and 2 are not necessary when you install gams-mode.el by MELPA). +To install `gams-mode.el` manually, follow the procedure below (steps 1 and 2 are not necessary when installing `gams-mode.el` from MELPA). -1. Put "gams-mode.el" file into one of the directories listed in - `load-path`. You can see the contents of `load-path` by entering `M-x - customize-option load-path`. Or add the directory where - "gams-mode.el" is installed to `load-path` variable. For this, add - the following in your "~/.emacs.d/init.el" file: +1. Place the `gams-mode.el` file in one of the directories listed in `load-path`. You can see the contents of `load-path` by entering `M-x customize-option load-path`. Alternatively, add the directory where `gams-mode.el` is installed to the `load-path` variable. Add the following to your `~/.emacs.d/init.el` file: - (setq load-path - (cons "~/emacs.d/lisp/gams/" ;; Set the installed directory! - load-path)) + ```lisp + (setq load-path + (cons "~/emacs.d/lisp/gams/" ;; Set the installed directory! + load-path)) + ``` -2. Add the following into your "~/.emacs.d/init.el" startup file (after - load-path setting) +2. Add the following to your `~/.emacs.d/init.el` startup file (after setting `load-path`): - (require 'gams-mode) + ```lisp + (require 'gams-mode) + ``` -3. In addition, you had better set proper values to - `gams-process-command-name` and `gams-system-directory`. +Additionally, set proper values for `gams-process-command-name` and `gams-system-directory`. ------------------------------------------------------------ # Basic Usage -To learn how to use the GAMS mode, it is best to read "gams-sample.gms" -file. "gams-sample.gms" file enables you to acquire necessary skills in a -learning-by-doing way. +To learn how to use GAMS mode, it is best to read the `gams-sample.gms` file. The `gams-sample.gms` file enables you to acquire necessary skills in a learning-by-doing manner. -Here is the basic command listing. Try each command by yourself! You can -see basic keybindins also in refcard-gams.pdf. +Here is the basic command listing. Try each command by yourself! You can also see the basic keybindings in `refcard-gams.pdf`. ## GAMS mode: ---------- Key-binding Command explanation -| Key | Explanation | -|:--------------|:----------------------------------------------------| -| `C-c C-k` | Insert GAMS statement with completion. | -| `C-c C-d` | Insert GAMS dollar control option with completion. | -| `C-c C-.` | Show the identifier declaration part. | -| `C-c C-a` | Show the identifier list in the buffer. | -| `C-c C-w` | Open included file. | -| `C-c C-v` | Switch to the LST file and show errors if exist. | -| `C-c C-j` | Switch to the LST file. | -| `C-c C-t` | Evoke process menu. | -| `C-c C-s` | Start GAMS | -| `C-u C-c C-t` | Edit command and start GAMS. | -| `C-c C-e` | Insert templates (GAMS-TEMPLATE). | -| `C-c C-o` | Insert user defined comment template. | -| `C-l` | Recenter. | -| `C-c C-c` | Insert an ontext-offtext pair. | -| `C-c C-g` | Jump between ontext and offtext. | -| `C-c M-c` | (Un)comment an ontext-offtext pair. | -| `C-c M-g` | Remove an ontext-offtext pair. | -| `C-c C-m` | View GAMS pdf manuals. | -| `C-c C-f` | Change the level of font-lock (colorization) | -| `C-c C-;` | Insert inline comment. | -| `C-c M-;` | Insert end-of-line comment. | +| Keybinding | Command Explanation | +| :--------------- | :------------------------------------------------------- | +| `C-c C-k` | Insert GAMS statement with completion. | +| `C-c C-d` | Insert GAMS dollar control option with completion. | +| `C-c C-.` | Show the identifier declaration part. | +| `C-c C-a` | Show the identifier list in the buffer. | +| `C-c C-w` | Open included file. | +| `C-c C-v` | Switch to the LST file and show errors if they exist. | +| `C-c C-j` | Switch to the LST file. | +| `C-c C-t` | Evoke process menu. | +| `C-c C-s` | Start GAMS. | +| `C-u C-c C-t` | Edit command and start GAMS. | +| `C-c C-e` | Insert templates (GAMS-TEMPLATE). | +| `C-c C-o` | Insert user-defined comment template. | +| `C-l` | Recenter. | +| `C-c C-c` | Insert an ontext-offtext pair. | +| `C-c C-g` | Jump between ontext and offtext. | +| `C-c M-c` | (Un)comment an ontext-offtext pair. | +| `C-c M-g` | Remove an ontext-offtext pair. | +| `C-c C-m` | View GAMS PDF manuals. | +| `C-c C-f` | Change the level of font-lock (colorization). | +| `C-c C-;` | Insert inline comment. | +| `C-c M-;` | Insert end-of-line comment. | + ## GAMS-LST mode: -------------- -| Key | Explanation | -|:----------|:------------------------------------------------------------| -| `y` | Jump to the error and show its number and meaning. | -| `u` | Jump back to the error place in the program file. | -| `i` | Jump to the input (GMS) file. | -| `q` | Close the buffer. | -| `?` | Help. | -| `o` | Start the GAMS-OUTLINE mode. | - -| Key | Explanation | -|:----------|:------------------------------------------------------------| -| `s(S)` | Jump to the next (previous) SOLVE SUMMARY. | -| `r(R)` | Jump to the next (previous) REPORT SUMMARY. | -| `v(V)` | Jump to the next (previous) VAR entry. | -| `e(E)` | Jump to the next (previous) EQU entry. | -| `p(P)` | Jump to the next (previous) PARAMETER entry. | -| `L` | Jump to a line you specify. | -| `l` | Jump to a line. | - -| Key | Explanation | -|:----------|:------------------------------------------------------------| -| `SPACE` | Scroll up. | -| `DELETE` | Scroll down. | -| `1` | Wien the window. | -| `2` | Spit the window. | -| `m` | Moe frame. | -| `w` | Reize frame. | -| `z` | Moe a cursor to the other window. | - -d,f,g,h,j,k Keys for scrollings (see the help in GAMS-LST mode). +| Keybinding | Command explanation | +| :------------ | :---------------------------------------------------- | +| `y` | Jump to the error and show its number and meaning. | +| `u` | Jump back to the error place in the program file. | +| `i` | Jump to the input (GMS) file. | +| `q` | Close the buffer. | +| `?` | Help. | +| `o` | Start GAMS-OUTLINE mode. | +| `s(S)` | Jump to the next (previous) SOLVE SUMMARY. | +| `r(R)` | Jump to the next (previous) REPORT SUMMARY. | +| `v(V)` | Jump to the next (previous) VAR entry. | +| `e(E)` | Jump to the next (previous) EQU entry. | +| `p(P)` | Jump to the next (previous) PARAMETER entry. | +| `L` | Jump to a line you specify. | +| `l` | Jump to a line. | +| `SPACE` | Scroll up. | +| `DELETE` | Scroll down. | +| `1` | Wien the window. | +| `2` | Spit the window. | +| `m` | Moe frame. | +| `w` | Reize frame. | +| `z` | Moe a cursor to the other window. | +| `d,f,g,h,j,k` | Keys for scrollings (see the help in GAMS-LST mode). | For details, please see the help in both modes. -If you want to know how to use GAMS-TEMPLATE, please see the help in -GAMS-TEMPLATE mode, (start GAMS-TEMPLATE mode (C-cC-e) and push ? in the -*Template List* buffer). +If you want to know how to use GAMS-TEMPLATE, please see the help in GAMS-TEMPLATE mode. Start GAMS-TEMPLATE mode (`C-c C-e`) and press `?` in the Template List buffer. -If you want to use GAMS-OUTLINE mode, you had better see the sample GAMS -file "outline-sample.gms". Try to run GAMS on that file. And if you want -to know commands in GAMS-OUTLINE mode, please see the help in the -GAMS-OUTLINE mode, (start GAMS-OUTLINE mode [type o in the LST mode] and -push ? in the OUTLINE buffer). +If you want to use GAMS-OUTLINE mode, it is best to see the sample GAMS file `outline-sample.gms`. Try running GAMS on that file. To know the commands in GAMS-OUTLINE mode, please see the help in GAMS-OUTLINE mode. Start GAMS-OUTLINE mode (type `o` in LST mode) and press `?` in the OUTLINE buffer. ------------------------------------------------------------ # Customization -You can custumize the behavior of Emacs and GAMS mode by changing the -values of the following variables. Default value is given in [] - -You can change the value of these variables by adding in your -"~/.emacs.d/init.el", for example, - - (setq gams-process-command-name "c:/GAMS/37/gams.exe") - (setq gams-statement-upcase nil) - -Or you can use `customize` built in Emacs. Try M-x customize-groups -[ENTER] gams [ENTER.] - -Please read the sample file "gams-setting-sample.el", too. - -## Basic customizable variables in GAMS and GAMS-LST mode: - -`gams-process-command-name` ["gams"] - -"*GAMS program file name. If you do not include the GAMS system -directory in PATH environmental variable, you must set the full -path to GAMS program in this variable like c:/GAMS20.0/gams.exe." - - -`gams-process-command-option` ["ll=0 lo=3 pw=100 ps=9999"] - -"*Command line options passed to GAMS" - - -`gams-statement-file` ["~/.emacs.d/gams-statement.txt"] - -"*The name of the file in which user specific statements are -stored." - +You can customize the behavior of Emacs and GAMS mode by changing the values of the following variables. The default values are given in brackets [ ]. -`gams-fill-column` [80] +You can change the value of these variables by adding the following lines to your `~/.emacs.d/init.el` file. For example: -"*The column number used for fill-paragraph and auto-fill-mode." - +```lisp +(setq gams-process-command-name "c:/GAMS/37/gams.exe") +(setq gams-statement-upcase nil) +``` -`gams-recenter-font-lock` [t] +Or you can use the built-in Emacs customization interface. Try `M-x customize-group [ENTER] gams [ENTER]`. -"Non-nil means that font-lock-fontify buffer when recentering. If -your computer is slow, you may better set this to nil." +Please also read the sample file `gams-setting-sample.el`. +## Basic Customizable Variables in GAMS and GAMS-LST Mode: -`gams-file-extension` ['("gms")] +- `gams-process-command-name` ["gams"] + - *GAMS program file name. If the GAMS system directory is not included in the PATH environment variable, you must set the full path to the GAMS program in this variable, like `c:/GAMS20.0/gams.exe`. -"*List of gams program file extensions. If you open a file with an -extension included in this list, GAMS mode starts automatically. -It doen't matter whether upper case or lower case." - +- `gams-process-command-option` ["ll=0 lo=3 pw=100 ps=9999"] + - *Command line options passed to GAMS. -`gams-mode-hook ` [nil] +- `gams-statement-file` ["~/.emacs.d/gams-statement.txt"] + - *The name of the file in which user-specific statements are stored. -"*Hook run when gams-mode starts." +- `gams-fill-column` [80] + - *The column number used for `fill-paragraph` and `auto-fill-mode`. +- `gams-recenter-font-lock` [t] + - *Non-nil means that the buffer will be fontified when recentering. If your computer is slow, you may want to set this to nil. -`gams-mode-load-hook` [nil] +- `gams-file-extension` ['("gms")] + - *List of GAMS program file extensions. If you open a file with an extension included in this list, GAMS mode starts automatically. It doesn't matter whether the extension is in upper case or lower case. -"*List of functions to be called when gams-mode.el is loaded." +- `gams-mode-hook` [nil] + - *Hook run when GAMS mode starts. +- `gams-mode-load-hook` [nil] + - *List of functions to be called when `gams-mode.el` is loaded. -`gams-close-paren-always` [t] +- `gams-close-paren-always` [t] + - *Non-nil means that closing parentheses will always be inserted. -"*Non-nil means that close parenthesis." +- `gams-user-comment` + - *User-defined comment template. You can insert the comment template defined in this variable by executing `gams-insert-comment`. `%` in the string indicates the cursor place and will disappear after template insertion. Note: You cannot include double quotations and backslashes in this variable! +- `gams-system-directory` ["c:/GAMS/win64/24.7/"] + - *The GAMS system directory. -`gams-user-comment` +- `gams-inlinecom-symbol-start-default` ["/*"] + - *The default value for the inline comment start symbol. -"*User defined comment template. You can insert the comment template -defined in this variable by executing `gams-insert-comment`. % in the -string indicates the cursor place and will disappear after template -insertion. NB: You cannot include double quoatations and backslashes in -this variables!" +- `gams-inlinecom-symbol-end-default` ["*/"] + - *The default value for the inline comment end symbol. +- `gams-eolcom-symbol-default` ["#"] + - *The default value for the end-of-line comment symbol. -`gams-system-directory` ["c:/GAMS/win64/24.7/"] +## GAMS-TEMPLATE Mode: +- `gams-template-file` ["~/.emacs.d/gams-template.txt"] + - *The name of the file used to store templates. -"The GAMS system directory." +- `gams-save-template-change` [nil] + - *Nil means that the content of `gams-user-template-alist` will be saved into `gams-template-file` only when you quit Emacs. If non-nil, `gams-user-template-alist` is saved every time you make changes. If your Emacs often crashes, you may want to set this to non-nil. +## GAMS-OUTLINE Mode: +- `gams-ol-height` [15] + - *The height of the GAMS-OUTLINE buffer with one LST buffer. -`gams-inlinecom-symbol-start-default` ["/*"] +- `gams-ol-height-two` [8] + - *The height of the GAMS-OUTLINE buffer with two LST buffers. -"The default value for inline comment start symbol." +There are also other customizable variables, mainly keybindings and fonts. You can see a full list of customizable variables by executing: - -`gams-inlinecom-symbol-end-default` ["*/"] - -"The default value for inline comment end symbol." - - -`gams-eolcom-symbol-default` ["#"] - -"The default value for eol comment symbol." - - -## GAMS-TEMPLATE mode: - -`gams-template-file` ["~/.emacs.d/gams-template.txt"] - -"*The name of a file used to store templates." - - -`gams-save-template-change` [nil] - -"Nil means that save the content of `gams-user-template-alist` into -`gams-template-file` only when you quit Emacs. If non-nil, save -`gams-user-template-alist` every time you made changes. If your Emacs -often crashes, you may had better set it to non-nil." - - -## GAMS-OUTLINE mode: - -`gams-ol-height` [15] - -"*The height of the GAMS-OUTLINE buffer with one LST buffer." - - -`gams-ol-height-two` [8] - -"*The height of the GAMS-OUTLINE buffer with two LST buffers." - - -There are also other customizable variables, mainly keybindings and fonts. -You can see a full list of customizable variables by executing: - - M-x customize-groups [ENTER] - gams [ENTER] - - ------------------------------------------------------------- +``` +M-x customize-group [ENTER] +gams [ENTER] +``` # TODO: -See TODO file. - - ------------------------------------------------------------- +See the TODO file. # Miscellaneous -Bug reports, requests and suggestions are welcome! Write an email to me. -Shiro Takeda - - ------------------------------------------------------------- +Bug reports, requests, and suggestions are welcome! Please write an email to me: Shiro Takeda at . # Acknowledgments -To write the package GAMS mode, I have used a lot of excellent emacs lisp -codes written by other people. They include "YaTeX" (Yet Another LaTeX -mode), EPO (Editing Process Organizer), "RefTeX mode", `c-sig.el`, -`font-latex.el`, `lisp-mode.el`, and `indent.el` etc. In particular, I -would like to express acknowledgments to Yuuji Hirose who is the author of -YaTeX and EPO packages (they are available at -). He also have written other lots -of cool lisp programs. You will be happy if you visit to his web site :-) +To write the GAMS mode package, I have used a lot of excellent Emacs Lisp code written by other people. These include "YaTeX" (Yet Another LaTeX mode), EPO (Editing Process Organizer), "RefTeX mode", c-sig.el, font-latex.el, lisp-mode.el, and indent.el, among others. In particular, I would like to express my acknowledgments to Yuuji Hirose, the author of the YaTeX and EPO packages (available at http://www.gentei.org/~yuuji/software). He has also written many other cool Lisp programs. You will be happy if you visit his website :-) +