ベストアンサー
まだ誰もVimを言っていないなんて信じられません。 Vim!
最初の学習曲線を乗り越えたら、これは、ありふれたプログラミングタスクを自動化するための素晴らしいツールです。今日以前に使用した例を紹介します。
コードベースのコンポーネント用に(ベースXMLクラスから継承された)XMLリーダークラスを作成していました。 .xmlは次のようになりました。
...
問題(既存のアーキテクチャのために)これらのフィールド値はすべて、コード内のSome\_XML\_Classのプライベートデータメンバーである必要がありました。つまり、 field-one を std :: stringm\_field\_oneに変換する意味のない作業をたくさんやろうとしていました。 、これらの各フィールドについて。
Vimの出番です。20分を殺す代わりに難しい方法です。上記のコードセクションを貼り付けて、マクロを記録しました。
^xistd::string m\_
この一連のvimコマンドは、次のことを行います。行の最初の文字に移動して削除します(「は削除されます)。挿入モードに入り、 std :: string m\_ をフィールド。次に、「-」の最初の出現を見つけて、「\_」に置き換えます。次に、単語 field\_N の末尾にジャンプし、追加モードに入り、セミコロンを追加して、カーソルを1つ右に移動します。これで、
std::string m\_field\_one;value="value1" />
が完了しましたが、まだ完了していません。次に、コマンドモードに入り、残りの行を削除して、次の行にジャンプします。
std::string m\_field\_one;
1行目は完全にフォーマットされており、カーソルは現在2行目にあることに注意してください。
魔法が入った場合の次の部分。このコマンドを実行する前に、「a」を登録するマクロの記録を開始しました。 。コマンド q に続いて a を使用します。したがって、次のように完全なコマンドを作成します(ここで、最後の q は、マクロの終了を示すために使用されます)。
qa^xistd::string m\_
ここで、Vimコマンドを使用してそのマクロを適切に呼び出す場合:
@a
マクロを再実行し、次の行を自動的にフォーマットします:
std::string m\_field\_one;
std::string m\_field\_two;
しかし、待ってください。同様の構造のN-2行がまだあります。この場合、Nが100に等しいと仮定しましょう。問題ありません。次のコマンドを入力するだけです。
98@a
これにより、上記のマクロがさらに98回実行され、コードの残りの部分が自動的にフォーマットされます。現在、次のようになっています:
std::string m\_field\_one;
std::string m\_field\_two;
std::string m\_field\_three;
...
std::string m\_field\_ninetynine
std::string m\_field\_onehundered;
すごい 。
* PS:これらのコマンドは、最初は異質で怖いように見えるかもしれませんが、Vimをプライマリエディターとして使用すると、第二の性質になります。サンプルマクロの作成には10秒かかり、時間を大幅に節約できました。
* PPS:サンプルコードはかなり馬鹿げていることは知っていますが、要点を説明するためだけに使用しました。ただし、現実の世界では、同様のケースに遭遇します。
回答
質問していただきありがとうございます。
最初は、このような目標に対して警告するためにここに来ました。タイトルについて…基本的に、今日は次の理由でテキストエディタを作成します。
- 非常に具体的なニーズがあります(ただし、この場合は、既存のベースから始める方がよいでしょう。非常に斬新なアイデアがない限り、ゼロから始める);
- または、プログラミングの興味深い演習としてそれを考えます。これは確かにあなたの目標です。
率直に言って、あなたが夢の編集者を数百人、数千人ではないにしても見つけることができない場合、あなたは非常にうるさいです!;-)
テキストエディタを最初から書くのは初心者にとっては少し気が遠くなるかもしれないと言いたくなりました。それは中級レベルのタスクだとしましょう。絶対的な初心者にとっては少し難しいですが、一度実行できます。
そうは言っても、私はまだ初心者のときに自分のテキストエディタを作成しました。大学を卒業したばかりで、Cで少しだけコーディングし、実際のプロジェクトはありませんでした。しかし、私はエディターとしてviしか持たないSCOUnixを搭載したPCを使用していました。そして、私は常に混乱している2つのモード(ナビゲーションとエディション)のためにそれを嫌います(入力を開始し、最初のiの後にのみテキストが表示されます…)。
そこで、Cursesをインターフェイスとして使用し、独自のデータ構造を作成して(おそらく非効率的ですが、当時は小さなファイルを処理していました)、Cでエディターのコーディングを始めました。
とても楽しかったし、たくさんのことを学びました。他のユーザーもそれを使い始めたとき、タブとスペースの混合など、いつも予期しないことをしていることに気づきました… 🙂
繰り返しになりますが、まったくの初心者の場合は、小さなプロジェクトから始めて、言語の基盤(ループ、配列など)、データ構造、テキストファイルの読み書き方法などについて学ぶ必要があります。
1つの言語についてアドバイスするのは難しいです… JVMベースのプロジェクトでは、おそらくJavaFXまたはSWTでCeylonを使用します。 「メタルに近い」プロジェクトの場合、私はRustを使用します(Rustでテキストエディターを作成するための開始プロジェクトがあり、有望なようです)が、他の人はC ++を使用することをお勧めします(初心者には圧倒されるかもしれません!)。より簡単な言語の場合、おそらくLuaが適しています(他の人はPythonを使用することをお勧めしますが、私はそれを使った経験がありません)。あるいは、Node.jsとElectronプラットフォームを備えたJavaScript、トレンドオプション…(Atom、Visual Studio Code、Bracketsはそれで書かれています。しかし、既存のJSコードエディターを使用しているため、これはほとんど「ゼロから」です。 )
一般的なアドバイス:最初にデータ構造を設計します(Scintillaプロジェクトで使用される2つの部分からなる戦略は優れています。Rustプロジェクトで使用されるロープは、もう少し高度です)、どのようにデータを操作します:文字、行、選択などを追加または削除する方法。
次にUIについて考えます。理想的には、2つ(データ処理とデータ表示)を分離します。このようにして、いつか基本ロジックをほとんどまたはまったく変更せずに、UIターゲットを変更できます(SwingからJavaFX、GTK +からQtなど)。移植性に優れています。