diff -ru links-0.96/kbdbind.c links-0.96+editarea/kbdbind.c
--- links-0.96/kbdbind.c	Sat Sep  8 08:02:45 2001
+++ links-0.96+editarea/kbdbind.c	Sat Sep  8 08:02:21 2001
@@ -154,6 +154,7 @@
 		"document-info",
 		"down",
 		"download",
+		"edit",
 		"end",
 		"enter",
 		"file-menu",
@@ -358,6 +359,8 @@
 	{ ACT_DOWN, KBD_DOWN, 0 },
 	{ ACT_END, KBD_END, 0 },
 	{ ACT_END, 'E', KBD_CTRL },
+	{ ACT_EDIT, KBD_F4, 0 },
+	{ ACT_EDIT, 'T', KBD_CTRL },
 	{ ACT_COPY_CLIPBOARD, KBD_INS, KBD_CTRL },
 	{ ACT_COPY_CLIPBOARD, 'B', KBD_CTRL },
 	{ ACT_CUT_CLIPBOARD, 'X', KBD_CTRL },
diff -ru links-0.96/links.h links-0.96+editarea/links.h
--- links-0.96/links.h	Sat Sep  8 08:02:52 2001
+++ links-0.96+editarea/links.h	Sat Sep  8 07:59:17 2001
@@ -1713,6 +1713,9 @@
 
 /* view.c */
 
+extern int textarea_editor;
+void textarea_edit(int, struct terminal *, struct form_control *, struct form_state *);
+
 int can_open_in_new(struct terminal *);
 void open_in_new_window(struct terminal *, void (*)(struct terminal *, void (*)(struct terminal *, unsigned char *, unsigned char *), struct session *ses), struct session *);
 void send_open_in_new_xterm(struct terminal *term, void (*open_window)(struct terminal *term, unsigned char *, unsigned char *), struct session *ses);
@@ -2121,6 +2124,7 @@
 	ACT_DOCUMENT_INFO,
 	ACT_DOWN,
 	ACT_DOWNLOAD,
+	ACT_EDIT,
 	ACT_END,
 	ACT_ENTER,
 	ACT_FILE_MENU,
diff -ru links-0.96/terminal.c links-0.96+editarea/terminal.c
--- links-0.96/terminal.c	Tue Apr 17 17:51:49 2001
+++ links-0.96+editarea/terminal.c	Sat Sep  8 07:59:17 2001
@@ -698,6 +698,8 @@
 	set_handlers(term->fdin, (void (*)(void *))in_term, NULL, (void (*)(void *))destroy_terminal, term);
 	unblock_itrm(term->fdin);
 	redraw_terminal_cls(term);
+	if (textarea_editor)	/* XXX */
+		textarea_edit(1, NULL, NULL, NULL);
 }
 
 void exec_on_terminal(struct terminal *term, unsigned char *path, unsigned char *delete, int fg)
diff -ru links-0.96/view.c links-0.96+editarea/view.c
--- links-0.96/view.c	Sat Sep  8 08:02:52 2001
+++ links-0.96+editarea/view.c	Sat Sep  8 07:59:17 2001
@@ -1449,6 +1449,55 @@
 	return -1;
 }
 
+int textarea_editor = 0;
+
+void textarea_edit(int op, struct terminal *term_, struct form_control *form_, struct form_state *fs_)
+{
+	static int form_maxlength;
+	static struct form_state *fs;
+	static struct terminal *term;
+	static char *fn = NULL;
+	char *ed, *ex;
+	FILE *taf;
+	int flen;
+
+	if (form_) form_maxlength = form_->maxlength;
+	if (fs_) fs = fs_;
+	if (term_) term = term_;
+	
+	if (! fn) fn = tempnam(NULL, "linksarea");
+
+	if (! op) {
+		taf = fopen(fn, "w");
+		fwrite(fs->value, strlen(fs->value), 1, taf);
+		fclose(taf);
+					
+		ed = getenv("EDITOR");
+		if (! ed) ed = "vi";
+		ex = mem_alloc(strlen(ed) + strlen(fn) + 2);
+		sprintf(ex, "%s %s", ed, fn);
+		exec_on_terminal(term, ex, "", 1);
+		mem_free(ex);
+
+		textarea_editor = 1;
+		
+	} else {
+	  
+		taf = fopen(fn, "r+");
+		if (taf) {
+			fseek(taf, 0, SEEK_END); flen = ftell(taf); fseek(taf, 0, SEEK_SET);
+			if (flen <= form_maxlength) {
+				mem_free(fs->value);
+				fs->value = mem_alloc(flen + 1);
+				fread(fs->value, flen, 1, taf); fs->value[flen] = 0;
+				fs->state = flen;
+			}
+			fclose(taf);
+		}
+		textarea_editor = 0; fn = NULL;
+	}
+}
+
 int field_op(struct session *ses, struct f_data_c *f, struct link *l, struct event *ev, int rep)
 {
 	struct form_control *form = l->form;
@@ -1540,6 +1589,10 @@
 						mem_free(ln);
 					}
 				} else fs->state = strlen(fs->value);
+				break;
+			case ACT_EDIT:
+				if (form->type == FC_TEXTAREA && !form->ro)
+				  	textarea_edit(0, ses->term, form, fs);
 				break;
 			case ACT_COPY_CLIPBOARD:
 				set_clipboard_text(fs->value);
