LoginSignup
1
2

【C#】WPFで簡素なC言語用のエディタを作ってみる

Posted at

はじめに

WPFの学習の一環として,C言語プログラムのコンパイル・実行をボタンクリックで行えるような簡素なテキストエディタを作った.

Javaの学習に使った「JCPad」が,使い方もシンプルで簡単にコンパイル・実行ができてとても使いやすかった. そのため今回は,シンプルなうえ,ボタンクリックによってコンパイル・実行が簡単にできるような,gcc用のエディタを目指した.


JCPadはこちらから入手できます. フリーソフトです.


画面

editor.png

メニューバーの構成は,

  • File
    • 新規作成
    • 開く
    • 名前を付けて保存
    • 上書き保存
  • Edit
    • カット
    • コピー
    • ペースト
  • build
    • コンパイル
    • コンパイル&実行

ツールバーは,左から

  • 新規作成
  • 開く
  • 保存
  • コンパイル
  • コンパイル&実行

となっている.
行番号がふられているテキストボックスでファイルの編集を行い,コンパイルの標準出力・標準エラー出力は,下のテキストボックスに表示されるようになっている. 実行ボタンを押すとコマンドプロンプトが開き,実行結果が表示される.

今回,ファイルの編集を行うテキストボックスにはAvalonEditを利用した. シンタックスハイライトや行番号などの機能が搭載されているため,とても簡単に実装ができる.


ツールバーのアイコンはこちらのサイトを利用しました.
コンパイルのアイコンは自分で作ったので,異様にガビガビです.


課題

コンパイルのコマンドがいじれない

コンパイルプロセスの内容は以下のようになっている.

C#
// filePath: コンパイル対象のファイルのpathを表すstring型変数
string exeFileName = Path.ChangeExtension(filePath, ".exe");
ProcessStartInfo compileStartInfo = new ProcessStartInfo
{
    FileName = "gcc",
    Arguments = $"-finput-charset=UTF-8 -fexec-charset=UTF-8 \"{filePath}\" -o \"{exeFileName}\"",
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    UseShellExecute = false,
    CreateNoWindow = true
};

gcc -finput-charset=UTF-8 -fexec-charset=UTF-8 hoge.c -o hoge.exeというコマンドしか実行できない.
例えば,他ファイルの関数を使うようなプログラムや,MakeFileを使ったコンパイルを実行することはできない.

まだ,気づいていないだけでもっと問題があるかもしれないという不安を抱えたプログラムである.

括弧・引用符の補間が使いづらい

C#
private void EditorTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    string? insertText = null;

    if (e.Key == Key.D8 && (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
    {
        insertText = "()";
    }
    else if (e.Key == Key.D2 && (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
    {
        insertText = "\"\"";
    }
    else if (e.Key == Key.OemOpenBrackets)
    {
        insertText = "[]";
        if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
        {
            insertText = "{}";
        }
    }
    else if (e.Key == Key.D7 && (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
    {
        insertText = "\'\'";
    }

    if (insertText != null)
    {
        int selectionIndex = textEditor.CaretOffset;
        textEditor.Document.Insert(selectionIndex, insertText);
        textEditor.CaretOffset = selectionIndex + 1;
        e.Handled = true;
    }
}

ファイルの編集を行うテキストボックスEditorTextBoxのPreviewKeyDownイベントで,括弧・引用符の判定を行い,該当したら両側を挿入し,カーソルを間にもってくる処理が行われる.

改行を行わない場合,例えば,printf("hoge\n");と打つときは問題ない. しかし,改行を行いたいとき,例えば,

現実
カーソルを"|"で表す

int main(void)
{|}

↓ Enterで改行する

int main(void)
{
|}

このような場合は,改行を行った後に結局カーソルを上の行に戻して再び改行を行い,タブを入力する必要がある.

理想
int main(void)
{|}

↓ Enterで改行する

int main(void)
{
    |
}

VSCodeなどのように,Enterで改行をしたらすぐにコードを打ち始められるようにしたい.

感想

難しい.複数ファイルの同時編集や,置換機能など実装したい機能はもっとあったが,一気に実装しようもんなら確実に頭がパンクするだろう. 既存のソフトの凄さ・ありがたみを実感できた.

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2