summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAiden Storey <git@storey.dev>2024-01-12 00:32:13 -0500
committerAiden Storey <git@storey.dev>2024-05-02 22:57:34 -0400
commitb4c1634b52f619ca8987b67ecee2640310781aa7 (patch)
tree592faafc74fefb2dfb3e4a5ff4d8e63fb2e52513
parentd4f726f3ef21cef3e7936b2c9770cdac6478b8ee (diff)
downloadredot-engine-b4c1634b52f619ca8987b67ecee2640310781aa7.tar.gz
Implement trim_final_newlines functionality
-rw-r--r--doc/classes/EditorSettings.xml3
-rw-r--r--editor/code_editor.cpp25
-rw-r--r--editor/code_editor.h1
-rw-r--r--editor/editor_settings.cpp1
-rw-r--r--editor/plugins/script_editor_plugin.cpp18
-rw-r--r--editor/plugins/script_editor_plugin.h2
-rw-r--r--editor/plugins/script_text_editor.cpp9
-rw-r--r--editor/plugins/script_text_editor.h2
-rw-r--r--editor/plugins/shader_editor_plugin.cpp20
-rw-r--r--editor/plugins/text_editor.cpp8
-rw-r--r--editor/plugins/text_editor.h2
-rw-r--r--editor/plugins/text_shader_editor.cpp9
-rw-r--r--editor/plugins/text_shader_editor.h3
13 files changed, 99 insertions, 4 deletions
diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml
index 93a7b09fce..c161a66ad8 100644
--- a/doc/classes/EditorSettings.xml
+++ b/doc/classes/EditorSettings.xml
@@ -1012,6 +1012,9 @@
<member name="text_editor/behavior/files/restore_scripts_on_load" type="bool" setter="" getter="">
If [code]true[/code], reopens scripts that were opened in the last session when the editor is reopened on a given project.
</member>
+ <member name="text_editor/behavior/files/trim_final_newlines_on_save" type="bool" setter="" getter="">
+ If [code]true[/code], trims all empty newlines after the final newline when saving a script. Final newlines refer to the empty newlines found at the end of files. Since these serve no practical purpose, they can and should be removed to make version control diffs less noisy.
+ </member>
<member name="text_editor/behavior/files/trim_trailing_whitespace_on_save" type="bool" setter="" getter="">
If [code]true[/code], trims trailing whitespace when saving a script. Trailing whitespace refers to tab and space characters placed at the end of lines. Since these serve no practical purpose, they can and should be removed to make version control diffs less noisy.
</member>
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
index cfeb495690..1d47658266 100644
--- a/editor/code_editor.cpp
+++ b/editor/code_editor.cpp
@@ -1123,6 +1123,31 @@ void CodeTextEditor::trim_trailing_whitespace() {
}
}
+void CodeTextEditor::trim_final_newlines() {
+ int final_line = text_editor->get_line_count() - 1;
+ int check_line = final_line;
+
+ String line = text_editor->get_line(check_line);
+
+ while (line.is_empty() && check_line > -1) {
+ --check_line;
+
+ line = text_editor->get_line(check_line);
+ }
+
+ ++check_line;
+
+ if (check_line < final_line) {
+ text_editor->begin_complex_operation();
+
+ text_editor->remove_text(check_line, 0, final_line, 0);
+
+ text_editor->merge_overlapping_carets();
+ text_editor->end_complex_operation();
+ text_editor->queue_redraw();
+ }
+}
+
void CodeTextEditor::insert_final_newline() {
int final_line = text_editor->get_line_count() - 1;
String line = text_editor->get_line(final_line);
diff --git a/editor/code_editor.h b/editor/code_editor.h
index 75a2a68d58..af33a3fac8 100644
--- a/editor/code_editor.h
+++ b/editor/code_editor.h
@@ -224,6 +224,7 @@ protected:
public:
void trim_trailing_whitespace();
+ void trim_final_newlines();
void insert_final_newline();
enum CaseStyle {
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index 752b060513..dbc697e2b6 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -647,6 +647,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
// Behavior: Files
_initial_set("text_editor/behavior/files/trim_trailing_whitespace_on_save", false);
+ _initial_set("text_editor/behavior/files/trim_final_newlines_on_save", true);
_initial_set("text_editor/behavior/files/autosave_interval_secs", 0);
_initial_set("text_editor/behavior/files/restore_scripts_on_load", true);
_initial_set("text_editor/behavior/files/convert_indent_on_save", true);
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index c48af90622..459a93c449 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -1007,6 +1007,10 @@ void ScriptEditor::_resave_scripts(const String &p_str) {
se->trim_trailing_whitespace();
}
+ if (trim_final_newlines_on_save) {
+ se->trim_final_newlines();
+ }
+
se->insert_final_newline();
if (convert_indent_on_save) {
@@ -1387,6 +1391,10 @@ void ScriptEditor::_menu_option(int p_option) {
current->trim_trailing_whitespace();
}
+ if (trim_final_newlines_on_save) {
+ current->trim_final_newlines();
+ }
+
current->insert_final_newline();
if (convert_indent_on_save) {
@@ -2567,6 +2575,10 @@ void ScriptEditor::save_current_script() {
current->trim_trailing_whitespace();
}
+ if (trim_final_newlines_on_save) {
+ current->trim_final_newlines();
+ }
+
current->insert_final_newline();
if (convert_indent_on_save) {
@@ -2611,6 +2623,10 @@ void ScriptEditor::save_all_scripts() {
se->trim_trailing_whitespace();
}
+ if (trim_final_newlines_on_save) {
+ se->trim_final_newlines();
+ }
+
se->insert_final_newline();
if (!se->is_unsaved()) {
@@ -2848,6 +2864,7 @@ void ScriptEditor::_apply_editor_settings() {
}
trim_trailing_whitespace_on_save = EDITOR_GET("text_editor/behavior/files/trim_trailing_whitespace_on_save");
+ trim_final_newlines_on_save = EDITOR_GET("text_editor/behavior/files/trim_final_newlines_on_save");
convert_indent_on_save = EDITOR_GET("text_editor/behavior/files/convert_indent_on_save");
members_overview_enabled = EDITOR_GET("text_editor/script_list/show_members_overview");
@@ -4265,6 +4282,7 @@ ScriptEditor::ScriptEditor(WindowWrapper *p_wrapper) {
edit_pass = 0;
trim_trailing_whitespace_on_save = EDITOR_GET("text_editor/behavior/files/trim_trailing_whitespace_on_save");
+ trim_final_newlines_on_save = EDITOR_GET("text_editor/behavior/files/trim_final_newlines_on_save");
convert_indent_on_save = EDITOR_GET("text_editor/behavior/files/convert_indent_on_save");
ScriptServer::edit_request_func = _open_script_request;
diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h
index e6bb8f14a9..53af4c8dad 100644
--- a/editor/plugins/script_editor_plugin.h
+++ b/editor/plugins/script_editor_plugin.h
@@ -174,6 +174,7 @@ public:
virtual void set_executing_line(int p_line) = 0;
virtual void clear_executing_line() = 0;
virtual void trim_trailing_whitespace() = 0;
+ virtual void trim_final_newlines() = 0;
virtual void insert_final_newline() = 0;
virtual void convert_indent() = 0;
virtual void ensure_focus() = 0;
@@ -408,6 +409,7 @@ class ScriptEditor : public PanelContainer {
bool open_textfile_after_create = true;
bool trim_trailing_whitespace_on_save;
+ bool trim_final_newlines_on_save;
bool convert_indent_on_save;
bool external_editor_active;
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index 561edcf8bf..cf102eaa0f 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -431,6 +431,10 @@ void ScriptTextEditor::trim_trailing_whitespace() {
code_editor->trim_trailing_whitespace();
}
+void ScriptTextEditor::trim_final_newlines() {
+ code_editor->trim_final_newlines();
+}
+
void ScriptTextEditor::insert_final_newline() {
code_editor->insert_final_newline();
}
@@ -1427,6 +1431,9 @@ void ScriptTextEditor::_edit_option(int p_op) {
case EDIT_TRIM_TRAILING_WHITESAPCE: {
trim_trailing_whitespace();
} break;
+ case EDIT_TRIM_FINAL_NEWLINES: {
+ trim_final_newlines();
+ } break;
case EDIT_CONVERT_INDENT_TO_SPACES: {
code_editor->set_indent_using_spaces(true);
convert_indent();
@@ -2299,6 +2306,7 @@ void ScriptTextEditor::_enable_code_editor() {
edit_menu->get_popup()->add_separator();
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_completion_query"), EDIT_COMPLETE);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_trailing_whitespace"), EDIT_TRIM_TRAILING_WHITESAPCE);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_final_newlines"), EDIT_TRIM_FINAL_NEWLINES);
{
PopupMenu *sub_menu = memnew(PopupMenu);
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_spaces"), EDIT_CONVERT_INDENT_TO_SPACES);
@@ -2484,6 +2492,7 @@ void ScriptTextEditor::register_editor() {
ED_SHORTCUT("script_text_editor/evaluate_selection", TTR("Evaluate Selection"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::E);
ED_SHORTCUT("script_text_editor/toggle_word_wrap", TTR("Toggle Word Wrap"), KeyModifierMask::ALT | Key::Z);
ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::ALT | Key::T);
+ ED_SHORTCUT("script_text_editor/trim_final_newlines", TTR("Trim Final Newlines"), Key::NONE);
ED_SHORTCUT("script_text_editor/convert_indent_to_spaces", TTR("Convert Indent to Spaces"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::Y);
ED_SHORTCUT("script_text_editor/convert_indent_to_tabs", TTR("Convert Indent to Tabs"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::I);
ED_SHORTCUT("script_text_editor/auto_indent", TTR("Auto Indent"), KeyModifierMask::CMD_OR_CTRL | Key::I);
diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h
index de89fe458c..8c2ec1561b 100644
--- a/editor/plugins/script_text_editor.h
+++ b/editor/plugins/script_text_editor.h
@@ -118,6 +118,7 @@ class ScriptTextEditor : public ScriptEditorBase {
EDIT_COMPLETE,
EDIT_AUTO_INDENT,
EDIT_TRIM_TRAILING_WHITESAPCE,
+ EDIT_TRIM_FINAL_NEWLINES,
EDIT_CONVERT_INDENT_TO_SPACES,
EDIT_CONVERT_INDENT_TO_TABS,
EDIT_TOGGLE_COMMENT,
@@ -228,6 +229,7 @@ public:
virtual Variant get_navigation_state() override;
virtual void ensure_focus() override;
virtual void trim_trailing_whitespace() override;
+ virtual void trim_final_newlines() override;
virtual void insert_final_newline() override;
virtual void convert_indent() override;
virtual void tag_saved_version() override;
diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp
index 222d010a7a..a83f95f680 100644
--- a/editor/plugins/shader_editor_plugin.cpp
+++ b/editor/plugins/shader_editor_plugin.cpp
@@ -436,8 +436,14 @@ void ShaderEditorPlugin::_menu_item_pressed(int p_index) {
int index = shader_tabs->get_current_tab();
ERR_FAIL_INDEX(index, shader_tabs->get_tab_count());
TextShaderEditor *editor = edited_shaders[index].shader_editor;
- if (editor && editor->get_trim_trailing_whitespace_on_save()) {
- editor->trim_trailing_whitespace();
+ if (editor) {
+ if (editor->get_trim_trailing_whitespace_on_save()) {
+ editor->trim_trailing_whitespace();
+ }
+
+ if (editor->get_trim_final_newlines_on_save()) {
+ editor->trim_final_newlines();
+ }
}
if (edited_shaders[index].shader.is_valid()) {
EditorNode::get_singleton()->save_resource(edited_shaders[index].shader);
@@ -452,8 +458,14 @@ void ShaderEditorPlugin::_menu_item_pressed(int p_index) {
int index = shader_tabs->get_current_tab();
ERR_FAIL_INDEX(index, shader_tabs->get_tab_count());
TextShaderEditor *editor = edited_shaders[index].shader_editor;
- if (editor && editor->get_trim_trailing_whitespace_on_save()) {
- editor->trim_trailing_whitespace();
+ if (editor) {
+ if (editor->get_trim_trailing_whitespace_on_save()) {
+ editor->trim_trailing_whitespace();
+ }
+
+ if (editor->get_trim_final_newlines_on_save()) {
+ editor->trim_final_newlines();
+ }
}
String path;
if (edited_shaders[index].shader.is_valid()) {
diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp
index e19d9d933a..a4d70c6cbd 100644
--- a/editor/plugins/text_editor.cpp
+++ b/editor/plugins/text_editor.cpp
@@ -288,6 +288,10 @@ void TextEditor::trim_trailing_whitespace() {
code_editor->trim_trailing_whitespace();
}
+void TextEditor::trim_final_newlines() {
+ code_editor->trim_final_newlines();
+}
+
void TextEditor::insert_final_newline() {
code_editor->insert_final_newline();
}
@@ -414,6 +418,9 @@ void TextEditor::_edit_option(int p_op) {
case EDIT_TRIM_TRAILING_WHITESAPCE: {
trim_trailing_whitespace();
} break;
+ case EDIT_TRIM_FINAL_NEWLINES: {
+ trim_final_newlines();
+ } break;
case EDIT_CONVERT_INDENT_TO_SPACES: {
code_editor->set_indent_using_spaces(true);
convert_indent();
@@ -641,6 +648,7 @@ TextEditor::TextEditor() {
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/duplicate_lines"), EDIT_DUPLICATE_LINES);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_word_wrap"), EDIT_TOGGLE_WORD_WRAP);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_trailing_whitespace"), EDIT_TRIM_TRAILING_WHITESAPCE);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_final_newlines"), EDIT_TRIM_FINAL_NEWLINES);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_spaces"), EDIT_CONVERT_INDENT_TO_SPACES);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_tabs"), EDIT_CONVERT_INDENT_TO_TABS);
diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h
index 38fddc45df..268e5c32b4 100644
--- a/editor/plugins/text_editor.h
+++ b/editor/plugins/text_editor.h
@@ -63,6 +63,7 @@ private:
EDIT_PASTE,
EDIT_SELECT_ALL,
EDIT_TRIM_TRAILING_WHITESAPCE,
+ EDIT_TRIM_FINAL_NEWLINES,
EDIT_CONVERT_INDENT_TO_SPACES,
EDIT_CONVERT_INDENT_TO_TABS,
EDIT_MOVE_LINE_UP,
@@ -133,6 +134,7 @@ public:
virtual void set_executing_line(int p_line) override;
virtual void clear_executing_line() override;
virtual void trim_trailing_whitespace() override;
+ virtual void trim_final_newlines() override;
virtual void insert_final_newline() override;
virtual void convert_indent() override;
virtual void ensure_focus() override;
diff --git a/editor/plugins/text_shader_editor.cpp b/editor/plugins/text_shader_editor.cpp
index 83a1700306..dd34a6dd69 100644
--- a/editor/plugins/text_shader_editor.cpp
+++ b/editor/plugins/text_shader_editor.cpp
@@ -756,6 +756,7 @@ void TextShaderEditor::_apply_editor_settings() {
code_editor->update_editor_settings();
trim_trailing_whitespace_on_save = EDITOR_GET("text_editor/behavior/files/trim_trailing_whitespace_on_save");
+ trim_final_newlines_on_save = EDITOR_GET("text_editor/behavior/files/trim_final_newlines_on_save");
}
void TextShaderEditor::_show_warnings_panel(bool p_show) {
@@ -920,6 +921,10 @@ void TextShaderEditor::save_external_data(const String &p_str) {
trim_trailing_whitespace();
}
+ if (trim_final_newlines_on_save) {
+ trim_final_newlines();
+ }
+
apply_shaders();
Ref<Shader> edited_shader = code_editor->get_edited_shader();
@@ -946,6 +951,10 @@ void TextShaderEditor::trim_trailing_whitespace() {
code_editor->trim_trailing_whitespace();
}
+void TextShaderEditor::trim_final_newlines() {
+ code_editor->trim_final_newlines();
+}
+
void TextShaderEditor::validate_script() {
code_editor->_validate_script();
}
diff --git a/editor/plugins/text_shader_editor.h b/editor/plugins/text_shader_editor.h
index be16148744..483ef2b4f1 100644
--- a/editor/plugins/text_shader_editor.h
+++ b/editor/plugins/text_shader_editor.h
@@ -176,6 +176,7 @@ class TextShaderEditor : public MarginContainer {
uint32_t dependencies_version = 0xFFFFFFFF;
bool trim_trailing_whitespace_on_save;
+ bool trim_final_newlines_on_save;
protected:
void _notification(int p_what);
@@ -189,6 +190,7 @@ protected:
public:
bool was_compilation_successful() const { return compilation_success; }
bool get_trim_trailing_whitespace_on_save() const { return trim_trailing_whitespace_on_save; }
+ bool get_trim_final_newlines_on_save() const { return trim_final_newlines_on_save; }
void apply_shaders();
void ensure_select_current();
void edit(const Ref<Shader> &p_shader);
@@ -196,6 +198,7 @@ public:
void goto_line_selection(int p_line, int p_begin, int p_end);
void save_external_data(const String &p_str = "");
void trim_trailing_whitespace();
+ void trim_final_newlines();
void validate_script();
bool is_unsaved() const;
void tag_saved_version();