上書き、挿入、とくれば削除も必要でしょう。削除機能を追加しましょう。
まずはキー入力の処理から。
// 削除
KeyCode::Delete => {
let index = cursor.index();
// 最後尾の場合は、カーソルを移動
if index == len.saturating_sub(1) {
cursor.move_to_left();
}
message.bin_data_mut().remove(index);
// データが1つの場合はゼロフィル
if len == 1 {
message.bin_data_mut().update(0, 0);
}
self.reset_input_buf(message);
}
KeyCode::Deleteのマッチパターンを追加しています。
カーソルの位置のデータを削除すればよいのですが、最後尾のデータの場合はカーソル位置がズレてしまうので一つ戻す処理を入れています。
また、データが一つのみの場合は削除するとデータが無くなってしまうので0でデータを書き込んでいます。
pub(crate) fn remove(&mut self, index: usize) {
self.buf.make_contiguous();
if self.buf.len() > 1 {
self.buf.remove(index);
self.buf.make_contiguous();
}
}
remove()の処理は単純です。
make_contiguous()の処理がイマイチ理解できておらず何度も呼び出しているのですが、実験して呼び出す回数を減らしていきたいと思います。
TOC
- 準備
- ターミナル入出力を試す
- ターミナル系crateを利用する
- 編集データと表示処理
- 画面制御
- 編集データへの入出力
- その他
GitHubにコードをアップロードしています。
コードのコメントに書かれているfirst_stepなどをcargoコマンドに渡すと実行できます。
# Example
$ cargo run --example first_step