diff --git a/include/eepp/ui/doc/textrange.hpp b/include/eepp/ui/doc/textrange.hpp index fe6b731c2..667c44aea 100644 --- a/include/eepp/ui/doc/textrange.hpp +++ b/include/eepp/ui/doc/textrange.hpp @@ -222,11 +222,21 @@ class EE_API TextRanges : public std::vector { if ( !mIsSorted ) sort(); - auto it = std::unique( begin(), end(), - []( const TextRange& a, const TextRange& b ) { return a == b; } ); - - bool merged = it != end(); - erase( it, end() ); + auto itUnique = std::unique( + begin(), end(), []( const TextRange& a, const TextRange& b ) { return a == b; } ); + + bool merged = itUnique != end(); + erase( itUnique, end() ); + + auto it = begin(); + while ( it != end() ) { + auto next = std::next( it ); + while ( next != end() && it != end() && next->contains( *it ) ) { + erase( it ); + it = std::prev( next ); + } + it = next; + } return merged; } diff --git a/src/eepp/ui/doc/languages/javascript.cpp b/src/eepp/ui/doc/languages/javascript.cpp index da1b0f9e6..28ee90bde 100644 --- a/src/eepp/ui/doc/languages/javascript.cpp +++ b/src/eepp/ui/doc/languages/javascript.cpp @@ -15,7 +15,7 @@ void addJavaScript() { { { "\"", "\"", "\\" }, "string" }, { { "'", "'", "\\" }, "string" }, { { "`", "`", "\\" }, "string" }, - { { "/[%+%-%*%^%!%=%&%|%?%:%;%,%(%[%{%<%>%\\].*%f[/]", + { { "/[%+%-%*%^%!%=%&%|%?%:%;%,%(%[%{%<%>%\\%\"].*%f[/]", "/[igmsuyd\n]?[igmsuyd\n]?[igmsuyd\n]?", "\\" }, "string" }, { { "0x[%da-fA-F]+" }, "number" }, diff --git a/src/eepp/ui/doc/textdocument.cpp b/src/eepp/ui/doc/textdocument.cpp index 8db0fd545..fbe2b19f1 100644 --- a/src/eepp/ui/doc/textdocument.cpp +++ b/src/eepp/ui/doc/textdocument.cpp @@ -1305,25 +1305,41 @@ size_t TextDocument::remove( const size_t& cursorIdx, TextRange range, mLines.emplace_back( String( "\n" ) ); if ( mSelection.size() > 1 ) { + auto ranNorm( originalRange.normalized() ); + Int64 lineRem = ranNorm.end().line() - ranNorm.start().line(); + size_t curIdx = 0; + + Int64 colRem = ranNorm.start().line() == ranNorm.end().line() + ? ranNorm.end().column() - ranNorm.start().column() + : ranNorm.end().column(); + for ( auto& sel : mSelection ) { + if ( curIdx == cursorIdx ) { + curIdx++; + continue; + } + auto selNorm( sel.normalized() ); - auto ranNorm( originalRange.normalized() ); - if ( selNorm.start().line() < ranNorm.end().line() ) + if ( selNorm.start().line() < ranNorm.end().line() ) { + curIdx++; continue; - Int64 lineRem = ranNorm.end().line() - ranNorm.start().line(); - Int64 colRem = 0; - if ( selNorm.end().line() == ranNorm.end().line() && - ranNorm.end().column() < selNorm.start().column() ) { - colRem = ranNorm.start().line() == ranNorm.end().line() - ? ranNorm.end().column() - ranNorm.start().column() - : ranNorm.end().column(); } - sel.start().setLine( sel.start().line() - lineRem ); - sel.start().setColumn( sel.start().column() - colRem ); - sel.end().setLine( sel.end().line() - lineRem ); - sel.end().setColumn( sel.end().column() - colRem ); + + if ( lineRem != 0 ) { + sel.start().setLine( sel.start().line() - lineRem ); + sel.end().setLine( sel.end().line() - lineRem ); + + sel.start().setColumn( ranNorm.start().column() + sel.start().column() - colRem ); + sel.end().setColumn( ranNorm.start().column() + sel.end().column() - colRem ); + } else if ( selNorm.end().line() == ranNorm.end().line() && + ranNorm.end().column() <= selNorm.start().column() ) { + sel.start().setColumn( sel.start().column() - colRem ); + sel.end().setColumn( sel.end().column() - colRem ); + } + sel = sanitizeRange( sel ); + curIdx++; } } diff --git a/src/modules/languages-syntax-highlighting/src/eepp/ui/doc/languages/jsx.cpp b/src/modules/languages-syntax-highlighting/src/eepp/ui/doc/languages/jsx.cpp index ba3e51c4a..fa7219073 100644 --- a/src/modules/languages-syntax-highlighting/src/eepp/ui/doc/languages/jsx.cpp +++ b/src/modules/languages-syntax-highlighting/src/eepp/ui/doc/languages/jsx.cpp @@ -14,7 +14,7 @@ void addJSX() { { { "\"", "\"", "\\" }, "string" }, { { "'", "'", "\\" }, "string" }, { { "`", "`", "\\" }, "string" }, - { { "/[%+%-%*%^%!%=%&%|%?%:%;%,%(%[%{%<%>%\\].*%f[/]", + { { "/[%+%-%*%^%!%=%&%|%?%:%;%,%(%[%{%<%>%\\%\"].*%f[/]", "/[igmsuyd\n]?[igmsuyd\n]?[igmsuyd\n]?", "\\" }, "string" }, { { "%f[^<]![%a_][%w%_%-]*" }, "keyword2" }, diff --git a/src/modules/languages-syntax-highlighting/src/eepp/ui/doc/languages/typescript.cpp b/src/modules/languages-syntax-highlighting/src/eepp/ui/doc/languages/typescript.cpp index 8fbc1a352..fd074c44b 100644 --- a/src/modules/languages-syntax-highlighting/src/eepp/ui/doc/languages/typescript.cpp +++ b/src/modules/languages-syntax-highlighting/src/eepp/ui/doc/languages/typescript.cpp @@ -15,7 +15,7 @@ void addTypeScript() { { { "\"", "\"", "\\" }, "string" }, { { "'", "'", "\\" }, "string" }, { { "`", "`", "\\" }, "string" }, - { { "/[%+%-%*%^%!%=%&%|%?%:%;%,%(%[%{%<%>%\\].*%f[/]", + { { "/[%+%-%*%^%!%=%&%|%?%:%;%,%(%[%{%<%>%\\%\"].*%f[/]", "/[igmsuyd\n]?[igmsuyd\n]?[igmsuyd\n]?", "\\" }, "string" }, { { "0x[%da-fA-F]+" }, "number" }, @@ -82,7 +82,7 @@ void addTypeScript() { { { "\"", "\"", "\\" }, "string" }, { { "'", "'", "\\" }, "string" }, { { "`", "`", "\\" }, "string" }, - { { "/[%+%-%*%^%!%=%&%|%?%:%;%,%(%[%{%<%>%\\].*%f[/]", + { { "/[%+%-%*%^%!%=%&%|%?%:%;%,%(%[%{%<%>%\\%\"].*%f[/]", "/[igmsuyd\n]?[igmsuyd\n]?[igmsuyd\n]?", "\\" }, "string" }, { { "%f[^<]![%a_][%w%_%-]*" }, "keyword2" }, diff --git a/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp b/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp index c9ac315a7..7aa123e6c 100644 --- a/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp @@ -306,7 +306,7 @@ void LSPClientServerManager::updateDirty() { { Lock l( mClientsMutex ); for ( auto& server : mClients ) { - if ( !server.second->hasDocuments() && + if ( server.second && !server.second->hasDocuments() && mLSPsToClose.find( server.first ) == mLSPsToClose.end() ) mLSPsToClose.insert( { server.first, std::make_unique() } ); } @@ -514,7 +514,7 @@ LSPClientServerManager::getLSPClientServers( const std::shared_ptr std::vector servers; Lock l( mClientsMutex ); for ( auto& server : mClients ) { - if ( server.second->hasDocument( doc.get() ) ) + if ( server.second && server.second->hasDocument( doc.get() ) ) servers.push_back( server.second.get() ); } return servers; @@ -524,7 +524,7 @@ std::vector LSPClientServerManager::getLSPClientServers( const std::vector servers; Lock l( mClientsMutex ); for ( auto& server : mClients ) { - if ( server.second->hasDocument( uri ) ) + if ( server.second && server.second->hasDocument( uri ) ) servers.push_back( server.second.get() ); } return servers; @@ -538,7 +538,7 @@ LSPClientServer* LSPClientServerManager::getOneLSPClientServer( const std::shared_ptr& doc ) { Lock l( mClientsMutex ); for ( auto& server : mClients ) { - if ( server.second->hasDocument( doc.get() ) ) + if ( server.second && server.second->hasDocument( doc.get() ) ) return server.second.get(); } return nullptr; @@ -547,7 +547,7 @@ LSPClientServerManager::getOneLSPClientServer( const std::shared_ptrhasDocument( uri ) ) + if ( server.second && server.second->hasDocument( uri ) ) return server.second.get(); } return nullptr; @@ -556,7 +556,7 @@ LSPClientServer* LSPClientServerManager::getOneLSPClientServer( const URI& uri ) LSPClientServer* LSPClientServerManager::getOneLSPClientServer( const std::string& language ) { Lock l( mClientsMutex ); for ( auto& server : mClients ) { - if ( server.second->supportsLanguage( language ) ) + if ( server.second && server.second->supportsLanguage( language ) ) return server.second.get(); } return nullptr;