私は何もすることがなかったので、テキストエディタを作りました.


他に何も残っていないときはどうしますか。フリークアウト.


そこで私は猛烈に何かを探していた.多分、私は新しいオープンソースプロジェクトを始めることができました(明らかに、私は私の半分の終わりを終えたものを完了するつもりではありません)、多分新しいプログラミング言語を学ぶかもしれません、多分私は最終的にSvelteを学ぶことができました.
言うまでもなく、私はanalysis paralysisでした.
しかし、それは私を襲った、私は最近問題が1つのテキストエディタに付着していた.私は、その速度のために崇高なのが好きでしたが、プラグイン支持の不足のため、それのためにそれを使うことができませんでした.私は大部分のプラグインをサポートするため、Visual Studioのコードを使用していますが、時にはそれは本当に遅くなることができます(おかげで電子)は、その大きな契約ではなく、何かを何度も迷惑な方法何かに遭遇する場合、それはあなたの神経になるでしょう.私もVim/NeovimとEmacsを試しました、そして、彼ら(またはその欠如)のための私の肖像はかなり等しいです.それで、あなたのvim対emacsの引数を使ってください.
だから、私は自分自身を構築し始めた、これは今のように見えるものです.

私は最初に電子を使うことを考えました.それは私が既に知っている技術において容易であるからです.しかし、それは最終的に逆生産的でないでしょうか?VSCodeコミュニティ全体が可能な限り最高の仕事をしています、そして、彼らがするより電子でより速いテキストエディタを作ることができる方法がありません.
それで、私の思考プロセスの多くの無関係なステップの後、私は錆でターミナルでテキストエディタを作成しに行きました.今、私はいくつかの天才は、このすべての薄い空気から、私は続いて
tutorial by Philipp Flenker私は以前に試みたが、Cであったので完了しなかったbased on a tutorialです.
あなたが最初からUIのものをたくさん構築しなければならないので、ターミナルのためのテキストエディタを構築することは超挑戦的です、そして、私は二度と決して許可のためにguisをとりません.

どうやってやるの?


まず、ターミナルウィンドウをクリアする必要があります.エスケープシーケンス\x1b[2Jを印刷する必要があることができます.

Escape sequences instruct the terminal to do various text formatting tasks, such as coloring text, moving the cursor around, and clearing parts of the screen.


リーディングキープレス


端末では、すべてのキーを押すキーです.これらのキーを押すと、それらの組み合わせをバインドする必要がある特定の機能を実行する必要があります.キーボードの各キーは別のバイトを指します.あなたは、ループを実行して、すべての入力を印刷することによって、それらをチェックアウトすることができます.Cでは、以下のようにします.
#include<stdio.h>

int main() {
  char c;
  while (1) {
    scanf(&c);
    printf(c);
  }
  return 0;
}
矢印キーを押すと、文字キーと文字キーを押すと、異なる出力バイトが生成されます.ここから、キープレスの処理は、入力をバイトに対してマッチングし、必要なアクションを実行するだけです.
私は、これらの小さい詳細を要約して、私の人生をより簡単にするtermionと呼ばれている(大きな)パッケージを使用しています.エディタからのいくつかの実際の錆コードです.
fn process_keypress(&mut self) -> Result<(), std::io::Error> {
        let pressed_key = Terminal::read_key()?;
        match pressed_key {
            Key::Ctrl('q') => self.quit(),
            },
            Key::Ctrl('f') => self.search(),
            Key::Ctrl('s') => self.save(),
            Key::Ctrl('h') => self.show_help(),
            Key::Char(c) => {
                // don't move cursor to the right if enter is pressed
                self.move_cursor(Key::Right);
                self.document.insert(&self.cursor_position, c);
            },
            Key::Delete => self.document.delete(&self.cursor_position),
            Key::Backspace => {
                // Backspace = going left and perform delete
                if self.cursor_position.x > 0 || self.cursor_position.y > 0 {
                    self.move_cursor(Key::Left);
                    self.document.delete(&self.cursor_position);
                }
            }
            Key::Up
            | Key::Down
            | Key::Left
            | Key::Right
            | Key::PageUp
            | Key::PageDown
            | Key::Home
            | Key::End => self.move_cursor(pressed_key),
            _ => (),
        }

        // ...

        Ok(())
    }
注:いくつかのコードは、この投稿のためのシンプルで読みやすくするために省略されている
あなたは、パッケージがどのようにバイトで働く必要がないKey sのために抽象化を提供するかを見ることができます.

ステータスバーの表示


私は、それがステータスバーを持つまで、テキストエディタが重大なテキストエディタでないと思います.私はもちろん、それはファイルを編集しながらいくつかの重要な情報を表示することによって良いユーザーエクスペリエンスを提供します.下のメッセージバーのヘルプメッセージやテキスト入力のような有用な情報を表示中にファイルを検索できます.

ロードマップ


私はエディタにいくつかの基本的な機能を構築することができましたが、私がそれが好きである多くの特徴があります:
構文ハイライトハイライト
  • 線番号
  • を表示する溝
  • マルチプルタブサポート
  • Autocomplete
  • ユーザー固有の設定
  • ヘルプミーアウト


    このプロジェクトの興味をあなたとあなたが助けたい場合、またはコードを見てみたい場合は、Github repo hereを訪問することができます.
    なぜ私はそれをループと呼びますか?よく、私はTales from The Loopを見ていて、もう一つの名前を考えることができませんでした.