diff --git a/src/libs/utils/textfileformat.cpp b/src/libs/utils/textfileformat.cpp index ea682edae95..8b8a549c350 100644 --- a/src/libs/utils/textfileformat.cpp +++ b/src/libs/utils/textfileformat.cpp @@ -215,7 +215,9 @@ TextFileFormat::ReadResult readTextFile(const QString &fileName, const QTextCode return TextFileFormat::ReadMemoryAllocationError; } - *format = TextFileFormat::detect(data); + if (!data.isEmpty()) + *format = TextFileFormat::detect(data); + if (!format->codec) format->codec = defaultCodec ? defaultCodec : QTextCodec::codecForLocale(); diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h index 5da7df848d7..89cb41d98b7 100644 --- a/src/plugins/coreplugin/coreconstants.h +++ b/src/plugins/coreplugin/coreconstants.h @@ -213,6 +213,7 @@ const char SETTINGS_ID_TOOLS[] = "D.ExternalTools"; const char SETTINGS_ID_MIMETYPES[] = "E.MimeTypes"; const char SETTINGS_DEFAULTTEXTENCODING[] = "General/DefaultFileEncoding"; +const char SETTINGS_DEFAULT_LINE_TERMINATOR[] = "General/DefaultLineTerminator"; const char SETTINGS_THEME[] = "Core/CreatorTheme"; const char DEFAULT_THEME[] = "flat"; diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 6e30f53cebe..bae2df0e392 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -3167,6 +3167,15 @@ QTextCodec *EditorManager::defaultTextCodec() return QTextCodec::codecForLocale(); } +TextFileFormat::LineTerminationMode EditorManager::defaultLineEnding() +{ + QSettings *settings = ICore::settings(); + const int defaultLineTerminator = settings->value(Constants::SETTINGS_DEFAULT_LINE_TERMINATOR, + TextFileFormat::LineTerminationMode::NativeLineTerminator).toInt(); + + return static_cast(defaultLineTerminator); +} + void EditorManager::splitSideBySide() { EditorManagerPrivate::split(Qt::Horizontal); diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index 59da62356e8..6af8bc61691 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -30,6 +30,8 @@ #include "documentmodel.h" +#include "utils/textfileformat.h" + #include #include @@ -154,6 +156,8 @@ public: static QTextCodec *defaultTextCodec(); + static Utils::TextFileFormat::LineTerminationMode defaultLineEnding(); + static qint64 maxTextFileSize(); static void setWindowTitleAdditionHandler(WindowTitleHandler handler); diff --git a/src/plugins/coreplugin/generatedfile.cpp b/src/plugins/coreplugin/generatedfile.cpp index 1b661f6c80d..5d009087db3 100644 --- a/src/plugins/coreplugin/generatedfile.cpp +++ b/src/plugins/coreplugin/generatedfile.cpp @@ -162,6 +162,7 @@ bool GeneratedFile::write(QString *errorMessage) const Utils::TextFileFormat format; format.codec = EditorManager::defaultTextCodec(); + format.lineTerminationMode = EditorManager::defaultLineEnding(); return format.writeFile(m_d->path, contents(), errorMessage); } diff --git a/src/plugins/coreplugin/textdocument.cpp b/src/plugins/coreplugin/textdocument.cpp index d053464f1e3..ca1eacf57b0 100644 --- a/src/plugins/coreplugin/textdocument.cpp +++ b/src/plugins/coreplugin/textdocument.cpp @@ -59,6 +59,7 @@ BaseTextDocument::BaseTextDocument(QObject *parent) : IDocument(parent), d(new Internal::TextDocumentPrivate) { setCodec(Core::EditorManager::defaultTextCodec()); + setLineTerminationMode(Core::EditorManager::defaultLineEnding()); } BaseTextDocument::~BaseTextDocument() diff --git a/src/plugins/texteditor/behaviorsettingspage.cpp b/src/plugins/texteditor/behaviorsettingspage.cpp index 8fda3634e8a..bbe420a5bf6 100644 --- a/src/plugins/texteditor/behaviorsettingspage.cpp +++ b/src/plugins/texteditor/behaviorsettingspage.cpp @@ -196,6 +196,8 @@ void BehaviorSettingsPage::apply() if (s) { s->setValue(QLatin1String(Core::Constants::SETTINGS_DEFAULTTEXTENCODING), d->m_page->behaviorWidget->assignedCodecName()); + s->setValue(QLatin1String(Core::Constants::SETTINGS_DEFAULT_LINE_TERMINATOR), + d->m_page->behaviorWidget->assignedLineEnding()); } } @@ -217,6 +219,7 @@ void BehaviorSettingsPage::settingsToUI() d->m_page->behaviorWidget->setAssignedBehaviorSettings(d->m_behaviorSettings); d->m_page->behaviorWidget->setAssignedExtraEncodingSettings(d->m_extraEncodingSettings); d->m_page->behaviorWidget->setAssignedCodec(Core::EditorManager::defaultTextCodec()); + d->m_page->behaviorWidget->setAssignedLineEnding(Core::EditorManager::defaultLineEnding()); } void BehaviorSettingsPage::finish() diff --git a/src/plugins/texteditor/behaviorsettingswidget.cpp b/src/plugins/texteditor/behaviorsettingswidget.cpp index 85f9e222810..f5dc751eb6a 100644 --- a/src/plugins/texteditor/behaviorsettingswidget.cpp +++ b/src/plugins/texteditor/behaviorsettingswidget.cpp @@ -84,6 +84,8 @@ BehaviorSettingsWidget::BehaviorSettingsWidget(QWidget *parent) d->m_codecs.prepend(QTextCodec::codecForLocale()); } + d->m_ui.defaultLineEndings->addItems(ExtraEncodingSettings::lineTerminationModeNames()); + auto currentIndexChanged = QOverload::of(&QComboBox::currentIndexChanged); connect(d->m_ui.autoIndent, &QAbstractButton::toggled, this, &BehaviorSettingsWidget::slotTypingSettingsChanged); @@ -245,6 +247,16 @@ void BehaviorSettingsWidget::assignedExtraEncodingSettings( (ExtraEncodingSettings::Utf8BomSetting)d->m_ui.utf8BomBox->currentIndex(); } +void BehaviorSettingsWidget::setAssignedLineEnding(int lineEnding) +{ + d->m_ui.defaultLineEndings->setCurrentIndex(lineEnding); +} + +int BehaviorSettingsWidget::assignedLineEnding() const +{ + return d->m_ui.defaultLineEndings->currentIndex(); +} + TabSettingsWidget *BehaviorSettingsWidget::tabSettingsWidget() const { return d->m_ui.tabPreferencesWidget->tabSettingsWidget(); diff --git a/src/plugins/texteditor/behaviorsettingswidget.h b/src/plugins/texteditor/behaviorsettingswidget.h index 4cbb7709f34..83ffaf2680d 100644 --- a/src/plugins/texteditor/behaviorsettingswidget.h +++ b/src/plugins/texteditor/behaviorsettingswidget.h @@ -71,6 +71,9 @@ public: void setAssignedExtraEncodingSettings(const ExtraEncodingSettings &encodingSettings); void assignedExtraEncodingSettings(ExtraEncodingSettings *encodingSettings) const; + void setAssignedLineEnding(int lineEnding); + int assignedLineEnding() const; + TabSettingsWidget *tabSettingsWidget() const; signals: diff --git a/src/plugins/texteditor/behaviorsettingswidget.ui b/src/plugins/texteditor/behaviorsettingswidget.ui index a342858801b..c36bb9ae47b 100644 --- a/src/plugins/texteditor/behaviorsettingswidget.ui +++ b/src/plugins/texteditor/behaviorsettingswidget.ui @@ -7,7 +7,7 @@ 0 0 801 - 480 + 547 @@ -320,6 +320,16 @@ Specifies how backspace interacts with indentation. + + + + Default line endings: + + + + + +