はじめに
日本語プログラミング言語Mindの小技「カーソル位置設定」について説明したいと思います。
対象読者
日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方
この小技に関連するMind言語マニュアル
この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載はありせん。
PureMind-KIHON-and-DOSV\KIHONSET#2\SRCLIB\SCREEN.SRCからの移植です。
本機能(本記事)は、下記のバージョンに対応しています。Mind8のLinux版は非対応です。Win32コンソールAPIでVT(仮想ターミナル)モードを有効化したほかに、クックドモードも無効化しています。
対応バージョン
■Mind7 ■Mind8 ■Mind9
■Windows版 □Linux版
小技の解説
「カーソル位置設定」は日本語プログラミング言語Mind5.2の基本的なコンソールスクリーンの制御機能のひとつです。WindowsコマンドプロンプトでVT(仮想ターミナル)モードがサポートされたのはWindows10以降で、それ以前にリリースされているMind7、8は機種依存性をさけるために廃止されました。
また、昨今のWindowsターミナルは昔のDOS画面コンソールとは微妙に異なり、固定行数桁数でのコンソール画面としてアプリケーション実装用途もほとんどなくなっているのが現状です。このためMind9でも復活予定はありませんが、あくまで実装サンプルとして情報共有いたします。
本記事ではVTモードを有効化した後に、エスケープシーケンスによる下記のコンソール制御単語をサポートしてみます。(ただし、これらの単語はエスケープシーケンスを出力するだけではなく、複雑なロジックの実装を含んでいます。)
カーソル位置設定 (行位置、桁位置 → ・)
カーソル設定 (行位置、桁位置 → ・) ※カーソル位置設定の等価語
カーソル位置 (・ → 行位置、桁位置)
カーソル行位置 (・ → 行位置)
カーソル桁位置 (・ → 桁位置)
Mindプログラムソース
ライブラリ
※PureMind5.2互換コンソールライブラリ
※win32consoleapi.srcのVTモード有効化を実行してください。
※win32consoleapi2.srcのクックドモード無効化を実行してください。
※PureMind KIHONSET SCREEN.SRCのカーソル制御関連単語のみ
ローカル。
成功は 数値 1。
失敗は 数値 0。
一文字直接入力とは (・ → 文字)
コンソール1文字読込し
失敗に 等しい ならば 捨て 実行終わり つぎに。
キー入力有り?とは (・ → 真偽)
コンソール1文字読込し
失敗に 等しい ならば 捨て 実行終わり つぎに
※複写し ダブル表示し 改行し
(入力文字が) $$NULLに 等しい
ならば 偽をかえし
さもなければ 真をかえし
つぎに。
_変換値とは ワード変数。
_キー文字列を数値に変換しとは (文字 → 数値)
_変換値を クリアし
ここから
一文字直接入力し
複写したものが 数字?
でなければ
(文字を) 捨て
打ち切り
つぎに
(文字を) 0FHと ANDし
_変換値に 10を 掛け 加え _変換値に 入れ
繰り返し
_変換値を 返す。
_キーバッファは 文字列実体 長さ 40。
キーバッファを退避とは (・ → ・)
カウンタは ワード変数
カウンタを クリアし
_キーバッファを クリアし
ここから
※キー入力有り?
文字列入力有り?
ならば カウンタを クリアし
入力文字を _キーバッファに 一文字追加し
さもなければ
カウンタを 一つ増加し
カウンタが 4に 等しい
ならば 打ち切り
つぎに
つぎに
繰り返す。
キーバッファを復帰とは (・ → ・)
_キーバッファを 先行入力文字列に 追加すること。
_数値を文字に変換して表示とは (数値 → ・)
余り1は ワード変数
商1は ワード変数
10で 余りと商をとり 余り1と 商1に 入れ
商1が ゼロ以外
ならば 商1に '0'を 加え 一文字表示し
つぎに
余り1に '0'を 加え 一文字表示する。
グローバル。
カーソル位置とは (・ → 行位置、桁位置)
キーバッファを退避し
※※※※※※※※※※※※※※※※
"&ESC&[6n"を 表示し ※カーソル位置レポート要求
一文字直接入力し 捨て ※ESC を捨てる
一文字直接入力し 捨て ※[ を捨てる
_キー文字列を数値に変換し (→行位置) ※~; まで受信
_キー文字列を数値に変換し (→桁位置) ※~R まで受信
※※※※※※※※※※※※※※※※
キーバッファを復帰すること。
カーソル行位置とは (・ → 行位置)
カーソル位置をとり 捨ること。
カーソル桁位置とは (・ → 桁位置)
カーソル位置をとり (→行、桁) 二番目を捨てること。
カーソル位置設定とは (行位置、桁位置 → ・) 処理単語 NN XSW
行は ワード変数
桁は ワード変数
行と 桁に 入れ
"&ESC&["を 表示し
行を _数値を文字に変換して表示し
';'を 一文字表示し
桁を _数値を文字に変換して表示し
'H'を 一文字表示する。
カーソル設定は カーソル位置設定と 等価。
ローカル語を捨てる。
テスト用実行メイン
"win32consoleapi"を コンパイルする。
"win32consoleapi2"を コンパイルする。
"consolelib"を コンパイルする。
"consolelib2"を コンパイルする。
成功は 数値 1。
失敗は 数値 0。
コンソールモード設定するとは (・ → ・)
VTモードを有効化し
失敗に 等しい ならば 実行終わり つぎに
「VTモードを有効化しました。」を 一行表示し
クックドモードを無効化し
失敗に 等しい ならば 実行終わり つぎに
「クックドモードを無効化しました。」を 一行表示すること。
コンソールモード復帰するとは (・ → ・)
クックドモードを有効化し
「クックドモードを有効化しました。」を 一行表示し
VTモードを無効化し
「VTモードを無効化しました。」を 一行表示すること。
メインとは (・ → ・)
行位置は 変数
桁位置は 変数
コンソールモード設定し
画面クリアし
10と 10で カーソル位置設定し
カーソル行位置を 行位置に 入れ
カーソル桁位置を 桁位置に 入れ
「カーソル行位置」を 表示し 行位置を 数値表示し 改行し
「カーソル桁位置」を 表示し 桁位置を 数値表示し 改行し
コンソールモード復帰すること。
先に注意点をお伝えしておきますと、「カーソル位置」取得関連単語は動作しませんでした。そのため、上記ソースコードはコメントアウトしています。(コンパイル自体は通過しています。前回記事で実装した下位単語の「一文字直接入力」の動作が適合していないようです。)
2025/09/14 追記
「一文字直接入力」の動作は適合している模様で、「キー入力有?」を使っている「キーバッファを退避」の使用を一時的にオミットすることで、行位置、桁位置は見かけ上取得できるようになっています。
さらに「キーバッファを退避」が使用している「キー入力有?」を「文字列入力有?」で代替することで「キーバッファを退避」の実行を復活しても動作するようになりました。
コンパイル結果
ではコンパイルしてみます。下位ライブラリはfileを指定します。
Mind9
下図はMind9βです。
C:\developments\vscode\mind9>mind concursor file
日本語プログラミング言語 Mind Version 8.11 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> concursor.exe
Mind8
C:\developments\vscode\mind9>mind concursor file
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> concursor.exe
Mind7
C:\developments\vscode\mind9>mind concursor file
日本語プログラミング言語 Mind Version 7.5 for Windows
Copyright(C) 1985-2004 Scripts Lab. Inc.
Single user license. Serial No:********
コンパイル中 - 終了
Coping.. C:\mind7\bin\mindexec.exe -> concursor.exe
実行結果
つづいて実行してみます。
Mind8の結果です。記述は割愛していますがMind7/9βも同じです。
C:\developments\vscode\mind9>concursor
VTモードを有効化しました。
クックドモードを無効化しました。
クックドモードを有効化しました。
VTモードを無効化しました。
C:\developments\vscode\mind9>
いかがでしょうか?イメージつかみにくいかと思いますが、「クックドモード有効化しました。」の出力位置が「クックドモード無効化しました。」の出力行から10行下で、10桁目から開始となっていることから「カーソル位置設定」は動作したことがわかります。
「カーソル位置」取得系の単語は動作しませんでした。Win32ApiのReadConsoleWによる「一文字直接入力」の実装が適合していない模様です。これは機会を改めてリトライしてみます。
2025/09/14 追記
「カーソル位置」で使用されている「キーバッファを退避」の使用を一時的にオミットすることで、行位置、桁位置は見かけ上取得できるようになっています。
C:\developments\vscode\mind9>concursor
VTモードを有効化しました。
クックドモードを無効化しました。
カーソル行位置10
カーソル桁位置10
クックドモードを有効化しました。
VTモードを無効化しました。
C:\developments\vscode\mind9>
さらに「キーバッファを退避」が使用している「キー入力有?」を「文字列入力有?」で代替することで「キーバッファを退避」の実行を復活しても動作するようになりました。結果は上記と同じです。
参考情報
この小技「カーソル位置設定」を使った記述例の記事はまだありません。
おわりに
いかがでしたでしょうか?なにかの参考になれば幸いです。2025年は日本語プログラミング言語Mind生誕40周年です。
本記事シリーズのご紹介
本記事シリーズ「日本語プログラミング言語Mindの小技」は「日本語プログラミング言語Mind生誕40周年プロジェクト」の一環です。
興味を持たれた方は日本語プログラミング言語Mind公式サイトにアクセスすると、Mindコンパイラをダウンロードできますよ。
面白い!、楽しい、カンタン、難しいのも書ける!みんなでやってみよう