Command_MoveLine
This commit is contained in:
@@ -153,6 +153,56 @@ void Command_Move(View *view, int direction, bool ctrl = false, bool shift = fal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Command_MoveLine(View *view, int direction) {
|
||||||
|
Assert(direction == DIR_DOWN || direction == DIR_UP);
|
||||||
|
Scratch scratch;
|
||||||
|
|
||||||
|
struct XYPair {
|
||||||
|
XY front;
|
||||||
|
XY back;
|
||||||
|
};
|
||||||
|
|
||||||
|
Buffer *buffer = GetBuffer(view->active_buffer);
|
||||||
|
BeforeEdit(buffer, view->carets);
|
||||||
|
MergeCarets(view);
|
||||||
|
Array<XYPair> saved_xy = {scratch};
|
||||||
|
Array<Edit> edits = {scratch};
|
||||||
|
For(view->carets) {
|
||||||
|
Add(&saved_xy, {PosToXY(*buffer, GetFront(it)), PosToXY(*buffer, GetBack(it))});
|
||||||
|
Range lines_to_move_range = {GetFullLineStart(buffer, it.range.min), GetFullLineEnd(buffer, it.range.max)};
|
||||||
|
|
||||||
|
String16 string = GetString(*buffer, lines_to_move_range);
|
||||||
|
string = Copy(scratch, string);
|
||||||
|
AddEdit(&edits, lines_to_move_range, {});
|
||||||
|
|
||||||
|
// @todo: GetPrevLine, GetNextLine, GetNextFull
|
||||||
|
// GetPrevLineStart, GetNextLineEnd
|
||||||
|
if (direction == DIR_DOWN) {
|
||||||
|
Int next_line_start = lines_to_move_range.max;
|
||||||
|
Int next_line_end = GetFullLineEnd(buffer, next_line_start);
|
||||||
|
AddEdit(&edits, Rng(next_line_end), string);
|
||||||
|
} else {
|
||||||
|
Int prev_line_end = lines_to_move_range.min - 1;
|
||||||
|
Int prev_line_start = GetFullLineStart(buffer, prev_line_end);
|
||||||
|
AddEdit(&edits, Rng(prev_line_start), string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ApplyEdits(buffer, edits);
|
||||||
|
AfterEdit(buffer, &edits, &view->carets);
|
||||||
|
|
||||||
|
Int line_offset = direction == DIR_UP ? -1 : +1;
|
||||||
|
for (Int i = 0; i < saved_xy.len; i += 1) {
|
||||||
|
Caret &caret = view->carets[i];
|
||||||
|
XYPair &xypair = saved_xy[i];
|
||||||
|
xypair.front.line += line_offset;
|
||||||
|
xypair.back.line += line_offset;
|
||||||
|
Int front = XYToPos(*buffer, xypair.front);
|
||||||
|
Int back = XYToPos(*buffer, xypair.back);
|
||||||
|
|
||||||
|
caret = MakeCaret(front, back);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Command_Replace(View *view, String16 string) {
|
void Command_Replace(View *view, String16 string) {
|
||||||
Buffer *buffer = GetBuffer(view->active_buffer);
|
Buffer *buffer = GetBuffer(view->active_buffer);
|
||||||
Scratch scratch;
|
Scratch scratch;
|
||||||
@@ -540,6 +590,8 @@ void WindowCommand(Event event, Window *window, View *view) {
|
|||||||
Command_CreateCursorVertical(view, DIR_DOWN);
|
Command_CreateCursorVertical(view, DIR_DOWN);
|
||||||
} else if (CtrlShift(SDLK_DOWN)) {
|
} else if (CtrlShift(SDLK_DOWN)) {
|
||||||
Command_Move(view, DIR_DOWN, CTRL_PRESSED, SHIFT_PRESSED);
|
Command_Move(view, DIR_DOWN, CTRL_PRESSED, SHIFT_PRESSED);
|
||||||
|
} else if (Alt(SDLK_DOWN)) {
|
||||||
|
Command_MoveLine(view, DIR_DOWN);
|
||||||
} else if (Ctrl(SDLK_DOWN)) {
|
} else if (Ctrl(SDLK_DOWN)) {
|
||||||
Command_Move(view, DIR_DOWN, CTRL_PRESSED);
|
Command_Move(view, DIR_DOWN, CTRL_PRESSED);
|
||||||
} else if (Shift(SDLK_DOWN)) {
|
} else if (Shift(SDLK_DOWN)) {
|
||||||
@@ -554,6 +606,8 @@ void WindowCommand(Event event, Window *window, View *view) {
|
|||||||
Command_CreateCursorVertical(view, DIR_UP);
|
Command_CreateCursorVertical(view, DIR_UP);
|
||||||
} else if (CtrlShift(SDLK_UP)) {
|
} else if (CtrlShift(SDLK_UP)) {
|
||||||
Command_Move(view, DIR_UP, CTRL_PRESSED, SHIFT_PRESSED);
|
Command_Move(view, DIR_UP, CTRL_PRESSED, SHIFT_PRESSED);
|
||||||
|
} else if (Alt(SDLK_UP)) {
|
||||||
|
Command_MoveLine(view, DIR_UP);
|
||||||
} else if (Ctrl(SDLK_UP)) {
|
} else if (Ctrl(SDLK_UP)) {
|
||||||
Command_Move(view, DIR_UP, CTRL_PRESSED);
|
Command_Move(view, DIR_UP, CTRL_PRESSED);
|
||||||
} else if (Shift(SDLK_UP)) {
|
} else if (Shift(SDLK_UP)) {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
- we should be able to execute a buffer (even scratch
|
|
||||||
- search as a command to execute which is going to be in the title bar
|
- search as a command to execute which is going to be in the title bar
|
||||||
- each buffer needs a directory even the special ones: C:\a\b\c\+errors?
|
- each buffer needs a directory even the special ones: C:\a\b\c\+errors?
|
||||||
- open directories - resulting in buffer with dir listing and proper buffer name
|
- open directories - resulting in buffer with dir listing and proper buffer name
|
||||||
|
|||||||
Reference in New Issue
Block a user