Index: uspace/app/edit/edit.c
===================================================================
--- uspace/app/edit/edit.c	(revision 884b461aa760c6aa0cd7ec1724552d8b45cb1101)
+++ uspace/app/edit/edit.c	(revision 743e17bf54160e940eea1d5178f24fec565f5b9a)
@@ -72,4 +72,10 @@
 	/** Current position of the caret */
 	tag_t caret_pos;
+
+	/** 
+	 * Ideal column where the caret should try to get. This is used
+	 * for maintaining the same column during vertical movement.
+	 */
+	int ideal_column;
 } pane_t;
 
@@ -141,4 +147,5 @@
 	sheet_get_cell_pt(&doc.sh, &coord, dir_before, &pt);
 	sheet_place_tag(&doc.sh, &pt, &pane.caret_pos);
+	pane.ideal_column = coord.column;
 
 	if (argc == 2) {
@@ -605,4 +612,5 @@
 	coord_t coord;
 	int num_rows;
+	bool pure_vertical;
 
 	tag_get_pt(&pane.caret_pos, &pt);
@@ -617,4 +625,9 @@
 		if (coord.row > num_rows) coord.row = num_rows;
 	}
+
+	/* For purely vertical movement try attaining @c ideal_column. */
+	pure_vertical = (dcolumn == 0 && align_dir == dir_before);
+	if (pure_vertical)
+		coord.column = pane.ideal_column;
 
 	/*
@@ -626,4 +639,10 @@
 	sheet_place_tag(&doc.sh, &pt, &pane.caret_pos);
 
+	/* For non-vertical movement set the new value for @c ideal_column. */
+	if (!pure_vertical) {
+		spt_get_coord(&pt, &coord);
+		pane.ideal_column = coord.column;
+	}
+
 	caret_update();
 }
