1021-Emacs-like Editor

問題概要
Emacsのコマンドをシュミレートするプログラムを作る

考え方
書くだけ。
substr大活躍

実装(C++)

#include <string>
#include <vector>
#include <iostream>
using namespace std;
struct Editor : public vector<string>{
	int CurX;int CurY;
	string Buf;
	Editor(){CurX=0;CurY=0;Buf="";}
	vector<string>::iterator Iterator(int l){
		vector<string>::iterator it=begin();
		for(int i=0;i<l;i++)it++;
		return it;
	}
	void Show(){
		for(int i=0;i<size();i++){
			cout << at(i) << endl;
		}
	}
	void Cmd_a(){
		CurX=0;
	}
	void Cmd_e(){
		CurX=at(CurY).size();
	}
	void Cmd_p(){
		if(CurY!=0)CurY--;
		Cmd_a();
	}
	void Cmd_n(){
		if(CurY!=size()-1)CurY++;
		Cmd_a();
	}
	void Cmd_f(){
		if(CurX!=at(CurY).size()){
			CurX++;
		}else if(CurX==at(CurY).size()&&CurY!=size()-1){
			Cmd_n();
		}
	}
	void Cmd_b(){
		if(CurX!=0){
			CurX--;
		}else if(CurX==0&&CurY!=0){
			CurY--;
			Cmd_e();
		}

	}
	void Cmd_d(){
		if(CurX!=at(CurY).size()){
			(*this)[CurY]=at(CurY).substr(0,CurX)+at(CurY).substr(CurX+1);
		}else if(CurX==at(CurY).size()&&CurY!=size()-1){
			(*this)[CurY]+=at(CurY+1);
			erase(Iterator(CurY+1));
		}
	}
	void Cmd_k(){
		if(CurX==at(CurY).size()&&CurY!=size()-1){
			(*this)[CurY]+=at(CurY+1);
			erase(Iterator(CurY+1));
			Buf="\n";
		}else if(CurX!=at(CurY).size()){
			Buf=at(CurY).substr(CurX);
			(*this)[CurY]=at(CurY).substr(0,CurX);
		}
	}
	void Cmd_y(){
		if(Buf=="")return;
		if(Buf=="\n"){
			insert(Iterator(CurY+1),at(CurY).substr(CurX));
			(*this)[CurY]=at(CurY).substr(0,CurX);
			CurY++;CurX=0;
		}else{
			(*this)[CurY]=at(CurY).substr(0,CurX)+Buf+at(CurY).substr(CurX);
			CurX+=Buf.size();
		}
	}
	void Cmd(string cmd){
		if(cmd=="a"){
			Cmd_a();
		}
		if(cmd=="e"){
			Cmd_e();
		}
		if(cmd=="p"){
			Cmd_p();
		}
		if(cmd=="n"){
			Cmd_n();
		}
		if(cmd=="f"){
			Cmd_f();
		}
		if(cmd=="b"){
			Cmd_b();
		}
		if(cmd=="d"){
			Cmd_d();
		}
		if(cmd=="k"){
			Cmd_k();
		}
		if(cmd=="y"){
			Cmd_y();
		}
	}
};
int main(){
	string tmp;
	Editor ed;
	while(1){
		getline(cin,tmp);
		if(tmp=="END_OF_TEXT")break;
		ed.push_back(tmp);
	}
	while(1){
		getline(cin,tmp);
		if(tmp=="-")break;
		ed.Cmd(tmp);
	}
	ed.Show();
}