Language: C++

#define _USE_MATH_DEFINES
#include <iostream>
#include <memory>
#include <memory.h>
#include <fstream>
#include <cmath>
#include <math.h>
#include <numeric>
#include <vector>
#include <stack>
#include <string>
#include <queue>
#include <sstream>
#include <cstdlib>
#include <cassert>
#include <cstdio>
#include <cstring>
#include <map>
#include <iomanip>
#include <list>
#include <cctype>
#include <algorithm>
#include <complex>
using namespace std;

typedef complex<double> xy_t;
typedef pair<xy_t, xy_t> line;
typedef long long ll;
typedef pair<int, int> P;
typedef pair<double, double> Pd;
typedef pair<int, P> PP;
typedef pair<int, PP> PPP;
const ll INF = 1LL << 50;
const double EPS = 1E-10;

#define rep(i, n) for(int i = 0; i < n; i++)

size_t tpos;
size_t lpos;

void do_a(const vector<string> &text){
	lpos = 0;
}

void do_e(const vector<string> &text){
	lpos = text[tpos].size();
}

void do_p(const vector<string> &text){
	lpos = 0;
	tpos = max(0, (int)tpos - 1);
}

void do_n(const vector<string> &text){
	lpos = 0;
	tpos = min((int)tpos + 1, (int)text.size() - 1);
}

void do_f(const vector<string> &text){
	if(lpos == text[tpos].size()){
		if((int)tpos < (int)text.size() - 1){
			lpos = 0;
			tpos++;
		}
	}else{
		lpos++;
	}
}

void do_b(const vector<string> &text){
	if(lpos != 0){
		lpos--;
	}else{
		if(tpos > 0){
			tpos--;
			lpos = text[tpos].size();
		}
	}
}

void do_d(vector<string> &text){
	if(lpos != text[tpos].size()){
		text[tpos].erase(lpos, 1);
	}else{
		if((int)tpos < (int)text.size() - 1){
			text[tpos]+=text[tpos+1];
			text.erase(text.begin() + tpos+1);
		}
	}
}

void do_k(vector<string> &text, string &buffer){
	if(lpos == text[tpos].size()){
		if((int)tpos < (int)text.size() - 1){
			buffer = "\n";
			do_d(text);
		}
	}else{
		buffer = string(text[tpos].begin() + lpos, text[tpos].end());
		text[tpos].erase(text[tpos].begin() + lpos, text[tpos].end());
	}else{
		buffer = "\n";
	}
}

void do_y(vector<string> &text, string &buffer){
	if(buffer != ""){
		if(buffer == "\n"){
			string a(text[tpos].begin() + lpos, text[tpos].end());
			text[tpos].erase(lpos);
			text.insert(text.begin() + tpos + 1, a);
			tpos++;
			lpos = 0;
		}else{
			if(lpos == text[tpos].size()){
				text[tpos] += buffer;
				lpos = text[tpos].size();
			}else{
				text[tpos].insert(text[tpos].begin() + lpos, buffer.begin(), buffer.end());
				lpos += buffer.size();
			}
		}
	}
}

void output(const vector<string> &text){
	rep(i, (int)text.size()) cout << text[i] << endl;
}

int main(){
	string line;
	vector<string> text;
	string buffer;
	while(cin >> line && line != "END_OF_TEXT"){
		text.push_back(line);
	}
	tpos = lpos = 0;
	char command;
	while(cin >> command && command != '-'){
		switch(command){
		case 'a':
			do_a(text);
			break;
		case 'e':
			do_e(text);
			break;
		case 'p':
			do_p(text);
			break;
		case 'n':
			do_n(text);
			break;
		case 'f':
			do_f(text);
			break;
		case 'b':
			do_b(text);
			break;
		case 'd':
			do_d(text);
			break;
		case 'k':
			do_k(text, buffer);
			break;
		case 'y':
			do_y(text, buffer);
			break;
		default:
			assert(false);
		}
		//output(text);
		//cout << tpos << " " << lpos << endl;
	}
	output(text);
	return 0;
}

Compiler output:
a.cc: In function 'void do_k(std::vector<std::__cxx11::basic_string<char> >&, std::string&)':
a.cc:101:10: error: 'else' without a previous 'if'
  101 |         }else{
      |          ^~~~