diff --git a/src/text_editor/commands_window.cpp b/src/text_editor/commands_window.cpp index 817a548..2043d14 100644 --- a/src/text_editor/commands_window.cpp +++ b/src/text_editor/commands_window.cpp @@ -353,6 +353,34 @@ void Command_TrimTrailingWhitespace(View *view, bool dont_trim_lines_with_cursor view->update_scroll = false; } +void Command_ConvertLineEndings(View *view, bool dont_trim_lines_with_cursor) { + Scratch scratch; + Buffer *buffer = GetBuffer(view->active_buffer); + + BeforeEdit(buffer, view->carets); + MergeCarets(view); + + Array lines_to_skip_triming = {}; + if (dont_trim_lines_with_cursor) lines_to_skip_triming = GetSelectedLinesSorted(scratch, view); + + Array edits = {scratch}; + for (Int i = 0; i < buffer->line_starts.len; i += 1) { + Int range_index = FindRangeByPos(lines_to_skip_triming, i); + if (range_index != -1) continue; + + Range range = GetLineRangeWithoutNL(*buffer, i); + wchar_t cr = GetChar(buffer, range.max - 1); + wchar_t lf = GetChar(buffer, range.max); + if (cr == L'\r' && lf == L'\n') { + AddEdit(&edits, {range.max - 1, range.max}, L""); + } + } + + ApplyEdits(buffer, edits); + AfterEdit(buffer, &edits, &view->carets, !KILL_SELECTION); + view->update_scroll = false; +} + void Command_KillSelectedLines(View *view) { Scratch scratch; Buffer *buffer = GetBuffer(view->active_buffer); @@ -827,6 +855,7 @@ void WindowCommand(Event event, Window *window, View *view) { if (StyleTrimWhitespaceOnSave) { bool dont_trim_lines_with_cursor = true; Command_TrimTrailingWhitespace(view, dont_trim_lines_with_cursor); + Command_ConvertLineEndings(view, dont_trim_lines_with_cursor); } String16 string16 = GetString(*buffer);