3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

自作エディタをつくるAdvent Calendar 2016

Day 22

コンソールで動くエディタを作る(22日目) 範囲指定カーソル

Posted at

本稿は自作エディタをつくる Advent Calendar 2016の22日目です、レポジトリはこちら

カーソルを再び考える

13日目の制御文字コードに誤りがあったため修正しました。

末尾カーソル問題・空行カーソル(14日目・15日目)

14日目に積み残してあった、行にn文字あるとき、カーソル位置はn+1箇所ある問題を修正しました。

(例)
「|」が配置可能なカーソル位置、行にabcの3文字あるとすると
普通のエディタは|a|b|c|の4箇所に配置できる。
もしもカーソルを文字に色をつける形で実装している場合(コンソール上だとたいていそうなるはず)、
末尾の文字には色をつける文字がない

これの解決策として、末尾にカーソルがいるときは、色を付けために余計に空白文字をつけることにしました。

15日目にやった、空行にカーソルがおけるが空行には色をつける文字がない問題への対策と同様です。

範囲選択カーソル

コンソール以外で動く、普通のエディタでShift+十字キーを押すと、
範囲選択ができると思います。
これを実現するために、

typedef struct _cursor {
  unum position_x;
  unum position_y;
} cursor;

を単純な発想として

typedef struct _cursor {
  unum start_position_x;
  unum start_position_y;
  unum end_position_x;
  unum end_position_y;
} cursor;

に置き換えればいいのかな?と思ってやってみました。

実装時に気づいた、ハマりやすいポイントとして、

  • 普通のエディタの十字キー相当の操作はstartを動かし、Shift+十字キー相当の操作はendを動かす
  • 普通のエディタの十字キー相当の操作後は、startとendを同じ位置にする
  • endはstartより前に来るときがある(Shift+左キー等)
    • end > startのときにswapしてしまうと、どっちを操作していたかわからなくなってしまう
    • 今回は、表示用に使い捨てのstart <= endが必ず守られているカーソルを都度作成した

考えれば気づく話ではありますが、endはstartより前に来るときがあるんですね・・・。

ともあれカーソルだけは範囲指定できるようになったので、色々な機能をつけたりしたいです。

ついでにcursorを配列にしてsublimeやatom等にあるマルチカーソルを実現したかったのですが、
カーソルを増やすためには検索等の手段を用意しないと実用上意味がない気がしました。
まずはコピーペーストかな!

キーバインド問題(未解決)

13日目に悩んでいた問題ですが、macのターミナル + bash環境において

Option + LEFT = 取得できる
Option + RIGHT = 取得できる
Shift + LEFT = 取得できる
Shift + RIGHT = 取得できる

Shift + UP / DOWN = 判別不能(Shiftを押さない時と同じ文字コードになる)
Option + UP / DOWN = 判別不能(Optionを押さない時と同じ文字コードになる)
Cmd + UP / DOWN / LEFT / RIGHT = 測定不能(Macのスクリーン移動に操作を取られる)
Ctrl + UP / DOWN / LEFT / RIGHT = 測定不能(Macのスクリーン移動に操作を取られる)

となっていて、何かのキーと十字キーの組み合わせで4方向全て使えるキーがありません。
現時点では試しにOptionと左右キーの組み合わせのみ実装していますが、上下も当然押したい・・・。
筆者の趣味の問題として十字キー以外でのカーソル移動はやりたくないので、
いまのところの候補は、

  1. Optionと左右キーだけ範囲選択で、上下キーは常に範囲選択解除+上下移動の操作にする(現時点の実装)
  2. Optionと左右キーだけ範囲選択を開始できて、範囲選択中の上下キーは範囲選択状態を継続する。範囲選択状態解除は左右キー単体。
  3. 案1のOptionをShiftにしたもの
  4. 案2のOptionをShiftにしたもの
  5. Escキー単体押しで範囲選択になって、その状態でもう一度Escキーを押すと解除される。
  6. 案5のEscキーをCtrl+Dなど、組み合わせ系のショートカットキーにしたもの

なんとなく案2がいいのかなぁと思ってますが、
わかりにくいかもしれないな・・・と思ってます。
ご意見やアイデアがあれば教えてください(๑•́ω•̀)

最終行で下を押すとどうなるか(未解決)

現状で何も操作をしてないのですが、どうあるべきなのかがイマイチわからないです。

  1. 何もしないべきだ
  2. 改行を末尾に付け足すべきだ
  3. 改行を末尾に付け足すべきだが、末尾に1度空行を足したらそれ以上は何もしないべきだ
  4. ファイルを開いた時点で末尾が空行になるように編集するべきで、そうしたらこの問題も解決するはずだ
  5. ファイル末尾の行の、行末にカーソルを移動するべきだ

結局好みの問題なんでしょうけども、自分の好みすらわからないですね・・・。
どれがいいんだろう。なんか改行足したい気もするのですが、十字キーで改行増えるのは変な気もする。

今日のまとめ

  • 末尾カーソル問題を修正しました
  • カーソルだけは範囲選択できるようになりました
  • 未解決の問題が気になります、意見が欲しいです

65dfa30f3a941eac239736369c886193.gif

次はコピーペーストと、範囲指定カーソルの指定範囲を削除を実装したい!
そろそろ、エディタの名前も考えないとって気がしてきました。

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?