151
96

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

テキストエディタをフルスクラッチで書いてみた

Last updated at Posted at 2024-09-18

テキストエディタをフルスクラッチで書いてみた

完成品はこちらになります
https://github.com/sxclij/sxceditor2

それVimじゃねぇの?
これはもしかして、既存のテキストエディタを真似しただけで、本当にフルスクラッチで作ったわけじゃないんじゃないかと思い始めました。GitHub上にも数多くのVimクローンが散見されています。そこでC言語の力を借りて「本当にフルスクラッチで作ったテキストエディタ」を作ろうと思い立ちました。

とは言っても筆者は宗教上の理由によりmallocを使わない事にしているので今回の記事では一切動的メモリ確保はしません。しかし便利な世の中になった物で、mallocを一切使わなくてもテキストエディタが作れる様になりました。

本記事ではそんな「誰でも簡単にできるテキストエディタ開発」をやってみたいと思います。

1. プロジェクトの背景

なんでテキストエディタなんか作ったの?

正直、暇だったからです。でも、作ってみたら意外と面白かったんですよね。低レベルのシステムプログラミングとか、メモリ管理とか、普段あんまり考えないことを考えるハメになりました。

2. sxceditor2の特徴

sxceditor2には以下のような特徴があります:

  1. Vimっぽい操作感(でもVimじゃないよ!)
  2. ファイルの読み書きができる(嬉しいね!)
  3. hjklキーで移動(まるでゲームみたい)
  4. 見た目はシンプル(というか殺風景)
  5. mallocさん、さようなら
  6. グローバル変数?知らない子ですね
  7. Rustのマネっこエラーハンドリング
  8. 軽量で...ポータブル?(Linuxでしか動かないけど)

これらの特徴は、「簡単に作れて、なんとなく動く」という設計思想に基づいています。

3. 実装のポイント

3.1 データ構造

テキストの管理には、双方向リンクリストを使ってます。なんでって?だってリンクリスト、かっこよくないですか?

struct node {
    struct node* next;
    struct node* prev;
    char ch;
};

これで、テキストの挿入や削除が...まぁ、なんとかなります。

3.2 メモリ管理

mallocは使いません。なぜって?だって使いたくないんだもん。

#define nodes_capacity 65536

struct nodes {
    struct node data[nodes_capacity];
    struct node* passive[nodes_capacity];
    // 以下略
};

この設計により、メモリリークの心配はありません。その代わり、65536文字以上は編集できません。でも、そんなに長い文章書く人いるの?

3.3 モード管理

Vimっぽい操作を実現するため、以下のようにモードを管理しています:

enum mode {
    mode_normal,
    mode_insert,
    mode_cmd,
    mode_raw,
};

各モードに応じて入力を処理する関数を実装しました。正直、これ作るの結構大変でした。

3.4 エラーハンドリング

Rustにインスパイアされたエラーハンドリングを実装しました。でも、正直Rustよくわかってません。

enum result {
    ok = 0,
    err = 1,
};

これで、エラーの伝播が...まぁ、なんとなくできます。

3.5 ターミナル操作

ターミナルの制御には、termiosライブラリを使用しています。これ、マジで魔法です。

void term_init(struct term* term) {
    // 魔法の呪文
}

これで、キー入力を即座に処理できます。すごくね?

3.6 テキスト描画

テキストの描画は、ターミナルのエスケープシーケンスを使用しています。これ、覚えるの大変でした。

void draw_clear() {
    write(STDOUT_FILENO, "\x1b[2J", 4);
    write(STDOUT_FILENO, "\x1b[1;1H", 7);
}

この呪文で、画面がクリアされます。まるでマジックショーです。

4. 主要な機能の実装

4.1 ファイル操作

ファイルの読み込みと保存ができます。でも、バイナリファイルを開くと多分死にます。

4.2 テキスト編集

テキストの挿入と削除ができます。でも、長すぎる行を編集すると多分死にます。

5. 課題と今後の展望

sxceditor2は基本的な機能を持つテキストエディタですが、まだまだ改善の余地があります:

  1. シンタックスハイライト(無理)
  2. より洗練されたエラーハンドリング(無理)
  3. 大きなファイルの効率的な処理(無理)
  4. クロスプラットフォーム対応(絶対無理)

正直、これ以上の機能追加は諦めています。だって、もうコード読むのつらいんだもん。

6. 開発で学んだこと

  1. 低レベルのシステムプログラミングは難しい
  2. メモリ管理は難しい
  3. ユーザーインターフェース設計は難しい
  4. エラーハンドリングは難しい
  5. プログラミングは難しい

7. まとめ

テキストエディタをフルスクラッチで作ってみましたが、正直もうやりたくありません。でも、なんだかんだで勉強になりました。みなさんも挑戦してみてください。でも、本気で使えるテキストエディタが欲しかったら、既存のものを使ったほうがいいです。

このプロジェクトは、GitHub上で公開しています。興味のある方は、ぜひコントリビューションやフィードバックをお願いします!でも、PRは多分マージしません。だって、もうコード読むのつらいんだもん。

最後に、このプロジェクトを通じて、「簡単そうに見えるものも、実際に作ってみると意外と難しい」ということを学びました。でも、そんな苦労を味わえるのも、プログラミングの醍醐味かもしれません。

さぁ、みなさんも自分だけのテキストエディタを作ってみませんか?でも、本気でやるなら、まずはmallocの使い方から勉強したほうがいいかもしれません。

151
96
29

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
151
96

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?