diff -Nru featherpad-0.12.1/ChangeLog featherpad-0.17.1/ChangeLog --- featherpad-0.12.1/ChangeLog 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/ChangeLog 2021-01-06 17:57:35.000000000 +0000 @@ -1,3 +1,104 @@ +V0.17.1 +--------- + * Removed the code for making the cursor busy after 1 second — cursor overriding isn't marked as thread-safe by Qt. + +V0.17.0 +--------- + * Consider the locale when showing line numbers and omit the group separator. + * Disable "Save with Encoding" with uneditable files. + * Fixed restoring of the current side-pane item after another item is closed by middle-clicking. + * Fixed a problem in closing side-pane items with filtering. + * Workarounds for Qt bugs in keyboard navigation inside a list view when some items are hidden. + * Made the warning bar more flexible by giving it a timeout, which can be 0 for permanent bars. + * Allow saving as root without a root instance when the user doesn't have the permission to write. Polkit's pkexec is used for gaining the root privileges. + * Distinguish Wayland from the lack of X11. + * Guarantee that the session dialog has focus after opening a session. + * Prevent killTimer() error warnings. + * Added LaTex to the recognized syntaxes. + * Workarounds for bugs in Qt's default printing. Qt can't handle dark color schemes and the reverse order with printing. Now, FeatherPad supports both. + * Do printing in a separate thread, so that, if it takes a long time, FeatherPad could still be used. + * Added simple support for gvfs' admin. + * Several fixes to Perl syntax highlighting. + +V0.16.0 +--------- + * Removed the redundant ampersand from the title of the replacement widget. + * Added a tooltip to shortcut editor. + * Fixed a small problem in highlighting of Yaml braces. + * Fixed the reattachment of the replacement dock to the top, which was disabled since "AllDockWidgetFeatures" became deprecated. + * Added the current line highlight color to Preferences → Syntax Colors (although it isn't a syntax color, it needs to be different for light and dark color schemes). + * Show the prompt label of Preference dialog when there is a change in the syntax colors. + * Added an item to tab context menu for opening containing folder. + * Made the warning bar disappear when clicked and removed its close button. + * Close the warning bar after 10 seconds if the user doesn't close it. + * Consider the current locale when sorting lines. + * More intuitive sorting of items in the side-pane and session dialog by treating dot as a separator. + * Removed the option for scroll jump workaround (because it wasn't FeatherPad's job). + * Added "To Start Case". + * Removed the 50-ms delay in text updating because, apparently, Qt's update requests are appropriate now. + * Focus the editor's view when the Escape key is pressed. + * Let the user disable the recent files feature by setting its number to zero. + * Added a "standalone" option to the command-line. It's especially useful when FeatherPad is chosen as the "git" editor. + +V0.15.0 +--------- + * Added optional selection highlighting (without interfering with search highlighting). + * Fixed a small bug in search highlighting with tab DND/detachment. + * Added simple Haxe highlighting (by using JS codes). + * Fixed multiline "<…/>" in JS. + * Disabled the RTL workaround when lines aren't wrapped. + * Don't clear replacement highlights when the window is minimized. + * Always truncate absurdly huge lines in uneditable documents. + * Fixed a problem in the state of the language button after toggling syntax highlighting. + * Fixed a rare case, where the text's format and highlight weren't updated. The fix also simplifies the code. + * Highlight only the first 1000 replacements if there are more. + * Added an item (to the Edit menu as well as the context menu) for converting all text tabs to spaces. + * Added an option to paste file paths instead of files (by default, FeatherPad opens pasted files). + +V0.14.2 +--------- + * Overrode Qt's default behavior with the Home key. + * Fixed a bug that allowed cutting of read-only texts. + * Don't mistake a (commented) Yaml note followed by a colon with a Yaml key. + * Considered the single quote in CSS values. + * Highlight JavaScript's hash-bang (don't mistake it with a regex). + * Updated the code for Qt 5.15. + +V0.14.1 +--------- + * Fixed a miscalculation in highlighting of multiline CSS values. + +V0.14.0 +--------- + * Handle relative file paths correctly when they contain no slash. + * Get the locale name by using Qt methods when guessing the encoding. + * Use more private member variables and also static local variables to speed up syntax highlighting, especially with HTML, XML, Bash and Perl. + * Use bold font before the first dot in JS property accessors. + * Highlight a JS regex at line start if the previous line ends with a single-line comment. + * Support JS template literals (and highlight them like single quotes). + * Considered a rare case of here-docs, where a delimiter is commented out but another valid delimiter comes after it. + * Fixed and improved CSS highlighting. + * Don't include an ending single quote in an URL pattern. + +V0.13.1 +--------- + * Don't preserve the last file's extension on saving a new tab. + +V0.13.0 +--------- + * Allow dash in URL schemes (as in "google-drive") and also some special characters (-,;!@*') in URLs. + * Support syntax color customization, with two separate settings for light and dark color schemes. + * Also added an option for the whitespace color value. + * Never use processEvents(); it makes single-instance apps prone to crash in rare cases. + * Consider the HTML ampersand valid in "&name;", "&number;" and "&hexadecimal;". + * Yet smarter Shift+Enter with alphabetical lists. + * Bypass medium focus stealing prevention. + * Fixed a problem in highlighting of multiline comments (with languages that have regex). + * Fixed highlighting of Markdown code blocks without language. + * Remember cursor's horizontal pixel position before Backspace/Enter and restore it after Down/Up. This feature was removed with Backspace due to a regression in Qt 5.14.1. + * Found and fixed a potential issue in translations (thanks to Masamichi Ito — ito32bit at GitHub). + * Don't read custom shortcuts and syntax colors from global config files because the user should be able to restore their default values. + V0.12.1 --------- * Removed "changelog" and "gtkrc" from the language menu (like "srt") while keeping their syntax highlighting. diff -Nru featherpad-0.12.1/debian/changelog featherpad-0.17.1/debian/changelog --- featherpad-0.12.1/debian/changelog 2020-03-23 06:13:56.000000000 +0000 +++ featherpad-0.17.1/debian/changelog 2021-01-10 16:32:02.000000000 +0000 @@ -1,8 +1,14 @@ -featherpad (0.12.1-1build1) focal; urgency=medium +featherpad (0.17.1-0~ppa1) focal; urgency=medium - * No-change rebuild for libgcc-s1 package name change. + * Sync with Debian. - -- Matthias Klose Mon, 23 Mar 2020 07:13:56 +0100 + -- Julien Lavergne Sun, 10 Jan 2021 17:32:02 +0100 + +featherpad (0.17.1-1) unstable; urgency=medium + + * New upstream release. + + -- Andrew Lee (李健秋) Thu, 07 Jan 2021 20:24:10 +0800 featherpad (0.12.1-1) unstable; urgency=medium diff -Nru featherpad-0.12.1/debian/control featherpad-0.17.1/debian/control --- featherpad-0.12.1/debian/control 2020-01-07 03:39:53.000000000 +0000 +++ featherpad-0.17.1/debian/control 2021-01-10 16:31:54.000000000 +0000 @@ -1,6 +1,7 @@ Source: featherpad Maintainer: LXQt Packaging Team -Uploaders: Alf Gaida +Uploaders: Alf Gaida , + Andrew Lee (李健秋) Section: editors Priority: optional Build-Depends: debhelper-compat (= 12), diff -Nru featherpad-0.12.1/debian/featherpad-l10n.install featherpad-0.17.1/debian/featherpad-l10n.install --- featherpad-0.12.1/debian/featherpad-l10n.install 2019-08-15 19:45:41.000000000 +0000 +++ featherpad-0.17.1/debian/featherpad-l10n.install 2021-01-10 16:31:54.000000000 +0000 @@ -1,2 +1,3 @@ -usr/share/featherpad/help_ja_JP +usr/share/featherpad/help_ja +usr/share/featherpad/help_pt_BR usr/share/featherpad/translations diff -Nru featherpad-0.12.1/featherpad/about.ui featherpad-0.17.1/featherpad/about.ui --- featherpad-0.12.1/featherpad/about.ui 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/about.ui 2021-01-06 17:57:35.000000000 +0000 @@ -97,11 +97,13 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Chinese (Simplified):</span> <a href="https://github.com/notname000">notname000 at GitHub</a>, <a href="https://github.com/theyearthewas">theyearthewas at GitHub</a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Bulgarian:</span> <a href="https://github.com/mkkDr2010">mkkDr2010 at GitHub</a></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Chinese (Simplified):</span> <a href="https://github.com/notname000">notname000 at GitHub</a>, <a href="https://github.com/theyearthewas">theyearthewas at GitHub</a>, <a href="https://github.com/greatyingzi">greatyingzi at GitHub</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Chinese (Traditional):</span> 林博仁(Buo-ren Lin) <a href="https://github.com/Lin-Buo-Ren">(Lin-Buo-Ren at GitHub)</a>, 張修銘 <a href="https://github.com/cges30901">(cges30901 at GitHub)</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Czech:</span> <a href="https://github.com/p-bo">p-bo at GitHub</a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Czech:</span> <a href="https://github.com/p-bo">p-bo at GitHub</a>, <a href="https://github.com/pafri">pafri at GitHub</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Danish:</span> <a href="https://github.com/scootergrisen">scootergrisen at GitHub</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> @@ -113,7 +115,11 @@ <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">German:</span> <a href="https://github.com/p8q">p8q at GitHub</a>, Alf Gaida <a href="https://github.com/agaida">(agaida at GitHub)</a>, Oliver Burkardt <a href="https://github.com/OliverBurkardt">(OliverBurkardt at GitHub)</a>, Florian Pigorsch (<a href="https://github.com/flopp">flopp at GitHub</a>)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Greek:</span> <a href="https://github.com/IoannisLM">IoannisLM at GitHub</a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Greek:</span> <a href="https://github.com/IoannisLM">IoannisLM at GitHub</a>, <a href="https://github.com/algorithm314">algorithm314 at GitHub</a>, Dimitrios Glentadakis <a href="https://github.com/dglent"><span;>(dglent at GitHub)</a></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hebrew:</span> Yaron Shahrabani <a href="https://github.com/yarons">(yarons at GitHub)</a>, <a href="https://github.com/omeritzics">omeritzics at GitHub</a></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hungarian:</span> <a href="https://github.com/zoli111">zoli111 at GitHub</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Indonesian:</span> Gema Aji Wardian <a href="https://github.com/nerdv2">(nerdv2 at GitHub)</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> @@ -121,25 +127,27 @@ <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Japanese:</span> <a href="https://github.com/FuRuYa7">FuRuYa7 at GitHub</a>, Masamichi Ito <a href="https://github.com/ito32bit">(ito32bit at GitHub)</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Korean:</span> Seok Hyun, Ga <a href="https://github.com/shga89">(shga89 at GitHub)</a></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Lithuanian:</span> <a href="https://github.com/welaq">welaq at GitHub</a> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Norwegian:</span> Hans Fredrik Nordhaug <a href="https://github.com/hansfn">(hansfn at GitHub)</a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Norwegian:</span> Hans Fredrik Nordhaug <a href="https://github.com/hansfn">(hansfn at GitHub)</a>, Einar Mostad <a href="https://github.com/EinarMostad">(EinarMostad at GitHub)</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Persian:</span> Novid Emami <a href="https://github.com/novid">(novid at GitHub)</a>, AatshG, Tsu Jan (author)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Polish:</span> Marcin Mikołajczak <a href="https://github.com/m4sk1n">(m4sk1n at GitHub)</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Portuguese:</span> Sérgio Marques <a href="https://github.com/smarquespt">(smarquespt at GitHub)</a>, Ruan O. Lima</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Portuguese:</span> Sérgio Marques <a href="https://github.com/smarquespt">(smarquespt at GitHub)</a>, Ruan O. Lima, Hugo Carvalho <a href="https://github.com/hugok79">(hugok79 at GitHub)</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Portuguese (Brazil):</span> <a href="https://github.com/eltonfabricio10">eltonfabricio10 at GitHub</a>, <a href="https://github.com/alexandrecoliveira">alexandrecoliveira at GitHub</a>, Ruan O. Lima</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Portuguese (Brazil):</span> <a href="https://github.com/eltonfabricio10">eltonfabricio10 at GitHub</a>, <a href="https://github.com/alexandrecoliveira">alexandrecoliveira at GitHub</a>, Ruan O. Lima, Erik Kierski <a href="https://github.com/erikferki">(erikferki at GitHub)</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Russian:</span> Vladimir Sharonin <a href="https://github.com/Survolog">(Survolog at GitHub)</a>, <a href="https://github.com/VaYurik">VaYurik at GitHub</a>, Pavel Shlyak <a href="https://github.com/shlyakpavel">(shlyakpavel at GitHub)</a>, Schwonder Reismus <a href="https://github.com/schw0reismus">(schw0reismus at GitHub)</a></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Russian:</span> Vladimir Sharonin <a href="https://github.com/Survolog">(Survolog at GitHub)</a>, <a href="https://github.com/VaYurik">VaYurik at GitHub</a>, Pavel Shlyak <a href="https://github.com/shlyakpavel">(shlyakpavel at GitHub)</a>, Schwonder Reismus <a href="https://github.com/schw0reismus">(schw0reismus at GitHub)</a>, Николай Смольянинов <a href="https://github.com/smolnp">(smolnp at GitHub)</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Slovak:</span> Paolo Vigoroso</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Spanish:</span> <a href="https://github.com/micrococo">micrococo at GitHub</a>, </span> Maximiliano Dvyhailo <a href="https://github.com/MaxiDvy"><span;>(MaxiDvy at GitHub)</span></a>, Robert Schneider</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Spanish:</span> <a href="https://github.com/micrococo">micrococo at GitHub</a>, Maximiliano Dvyhailo <a href="https://github.com/MaxiDvy"><span;>(MaxiDvy at GitHub)</a>, Robert Schneider, Adolfo Jayme-Barrientos <a href="https://github.com/fitojb">(fitojb at GitHub)</a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Turkish:</span> Abdullah Ramazanoğlu <a href="https://github.com/aramazano">(ramazano at GitHub)</a></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Turkish:</span> Abdullah Ramazanoğlu <a href="https://github.com/aramazano">(ramazano at GitHub)</a>, Dr. Ayhan YALÇINSOY <a href="https://github.com/ayhanyalcinsoy">(ayhanyalcinsoy at GitHub)</a>, Mehmet Akif <a href="https://github.com/madanadam">(madanadam at GitHub)</a></p></body></html> true diff -Nru featherpad-0.12.1/featherpad/brackets.cpp featherpad-0.17.1/featherpad/brackets.cpp --- featherpad-0.12.1/featherpad/brackets.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/brackets.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -24,9 +24,9 @@ void FPwin::matchBrackets() { - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; - TextEdit *textEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (index))->textEdit(); + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; + TextEdit *textEdit = tabPage->textEdit(); QTextCursor cur = textEdit->textCursor(); TextBlockData *data = static_cast(cur.block().userData()); if (!data) return; @@ -340,9 +340,9 @@ /*************************/ void FPwin::createSelection (int pos) { - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; - TextEdit *textEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (index))->textEdit(); + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; + TextEdit *textEdit = tabPage->textEdit(); QList es = textEdit->extraSelections(); diff -Nru featherpad-0.12.1/featherpad/CMakeLists.txt featherpad-0.17.1/featherpad/CMakeLists.txt --- featherpad-0.12.1/featherpad/CMakeLists.txt 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/CMakeLists.txt 2021-01-06 17:57:35.000000000 +0000 @@ -1,4 +1,4 @@ -set(QT_MINIMUM_VERSION "5.7.1") +set(QT_MINIMUM_VERSION "5.12.0") set(HUNSPELL_MINIMUM_VERSION "1.6") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") @@ -77,12 +77,14 @@ brackets.cpp syntax.cpp highlighter-sh.cpp + highlighter-css.cpp highlighter-html.cpp highlighter-patterns.cpp highlighter-regex.cpp highlighter-perl-regex.cpp vscrollbar.cpp loading.cpp + printing.cpp tabpage.cpp searchbar.cpp session.cpp @@ -114,7 +116,7 @@ qt5_add_translation(QM_FILES ${TS_FILES}) add_executable(featherpad ${featherpad_SRCS} ${featherpad_RESOURCES} ${EXTRA_HEADERS} ${DESKTOP_FILE} ${QM_FILES}) if(HAIKU) - install(FILES ${QM_FILES} DESTINATION "${CMAKE_INSTALL_PREFIX}") + install(FILES ${QM_FILES} DESTINATION "${CMAKE_INSTALL_PREFIX}/translations") elseif(APPLE) SET_SOURCE_FILES_PROPERTIES(${QM_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/translations) elseif(UNIX) diff -Nru featherpad-0.12.1/featherpad/config.cpp featherpad-0.17.1/featherpad/config.cpp --- featherpad-0.12.1/featherpad/config.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/config.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -18,7 +18,7 @@ */ #include "config.h" -#include +//#include #include namespace FeatherPad { @@ -56,9 +56,10 @@ nativeDialog_ (true), inertialScrolling_ (false), autoSave_ (false), - scrollJumpWorkaround_ (false), skipNonText_ (true), saveUnmodified_ (false), + selectionHighlighting_ (false), + pastePaths_ (false), closeWithLastTab_ (false), sharedSearchHistory_ (false), vLineDistance_ (-80), @@ -78,7 +79,9 @@ recentOpened_ (false), saveLastFilesList_ (false), cursorPosRetrieved_ (false), - spellCheckFromStart_ (false){} + spellCheckFromStart_ (false), + whiteSpaceValue_ (180), + curLineHighlight_ (-1) {} /*************************/ Config::~Config() {} /*************************/ @@ -234,9 +237,6 @@ if (qAbs (distance) >= 10 && qAbs (distance) < 1000) vLineDistance_ = distance; // -80 by default - if (settings.value ("scrollJumpWorkaround").toBool()) - scrollJumpWorkaround_ = true; // false by default - v = settings.value ("skipNonText"); if (v.isValid()) // true by default skipNonText_ = v.toBool(); @@ -244,6 +244,12 @@ if (settings.value ("saveUnmodified").toBool()) saveUnmodified_ = true; // false by default + if (settings.value ("selectionHighlighting").toBool()) + selectionHighlighting_ = true; // false by default + + if (settings.value ("pastePaths").toBool()) + pastePaths_ = true; // false by default + maxSHSize_ = qBound (1, settings.value ("maxSHSize", 2).toInt(), 10); /* don't let the dark bg be darker than #e6e6e6 */ @@ -265,7 +271,7 @@ if (settings.value ("removeTrailingSpaces").toBool()) removeTrailingSpaces_ = true; // false by default - recentFilesNumber_ = qBound (1, settings.value ("recentFilesNumber", 10).toInt(), 20); + recentFilesNumber_ = qBound (0, settings.value ("recentFilesNumber", 10).toInt(), 20); curRecentFilesNumber_ = recentFilesNumber_; // fixed recentFiles_ = settings.value ("recentFiles").toStringList(); recentFiles_.removeAll (""); @@ -286,6 +292,8 @@ spellCheckFromStart_ = settings.value ("spellCheckFromStart").toBool(); settings.endGroup(); + + readSyntaxColors(); } /*************************/ void Config::resetFont() @@ -296,10 +304,13 @@ /*************************/ void Config::readShortcuts() { - Settings settings ("featherpad", "fp"); + /* NOTE: We don't read the custom shortcuts from global config files + because we want the user to be able to restore their default values. */ + Settings tmp ("featherpad", "fp"); + Settings settings (tmp.fileName(), QSettings::NativeFormat); + settings.beginGroup ("shortcuts"); QStringList actions = settings.childKeys(); - for (int i = 0; i < actions.size(); ++i) { QVariant v = settings.value (actions.at (i)); @@ -329,6 +340,55 @@ return lastFiles; } /*************************/ +void Config::readSyntaxColors()// may be called multiple times +{ + setDfaultSyntaxColors(); + customSyntaxColors_.clear(); + + /* NOTE: We don't read the custom syntax colors from global config files + because we want the user to be able to restore their default values. */ + Settings tmp ("featherpad", darkColScheme_ ? "fp_dark_syntax_colors" : "fp_light_syntax_colors"); + Settings settingsColors (tmp.fileName(), QSettings::NativeFormat); + + settingsColors.beginGroup ("curLineHighlight"); + curLineHighlight_ = qBound (-1, settingsColors.value ("value", -1).toInt(), 255); + settingsColors.endGroup(); + if (curLineHighlight_ >= 0 + && (darkColScheme_ ? curLineHighlight_ > 70 + : curLineHighlight_ < 210)) + { + curLineHighlight_ = -1; + } + + + settingsColors.beginGroup ("whiteSpace"); + int ws = settingsColors.value ("value").toInt(); + settingsColors.endGroup(); + if (ws < getMinWhiteSpaceValue() || ws > getMaxWhiteSpaceValue()) + whiteSpaceValue_ = getDefaultWhiteSpaceValue(); + else + whiteSpaceValue_ = ws; + + const auto syntaxes = defaultLightSyntaxColors_.keys(); + QList l; + l << (darkColScheme_ ? QColor (Qt::white) : QColor (Qt::black)); + l << QColor (whiteSpaceValue_, whiteSpaceValue_, whiteSpaceValue_); + for (auto &syntax : syntaxes) + { + QColor col; + col.setNamedColor (settingsColors.value (syntax).toString()); + if (col.isValid()) + col.setAlpha (255); // only opaque custom colors + if (!col.isValid() || l.contains (col)) + { // an invalid or repeated color shows a corrupted configuration + customSyntaxColors_.clear(); + break; + } + l << col; + customSyntaxColors_.insert (syntax, col); + } +} +/*************************/ void Config::writeConfig() { Settings settings ("featherpad", "fp"); @@ -406,9 +466,10 @@ settings.setValue ("thickCursor", thickCursor_); settings.setValue ("inertialScrolling", inertialScrolling_); settings.setValue ("autoSave", autoSave_); - settings.setValue ("scrollJumpWorkaround", scrollJumpWorkaround_); settings.setValue ("skipNonText", skipNonText_); settings.setValue ("saveUnmodified", saveUnmodified_); + settings.setValue ("selectionHighlighting", selectionHighlighting_); + settings.setValue ("pastePaths", pastePaths_); settings.setValue ("maxSHSize", maxSHSize_); settings.setValue ("lightBgColorValue", lightBgColorValue_); @@ -425,7 +486,7 @@ while (recentFiles_.count() > recentFilesNumber_) // recentFilesNumber_ may have decreased recentFiles_.removeLast(); if (recentFiles_.isEmpty()) // don't save "@Invalid()" - settings.remove ("recentFiles"); + settings.setValue ("recentFiles", ""); else settings.setValue ("recentFiles", recentFiles_); settings.setValue ("recentOpened", recentOpened_); @@ -460,6 +521,8 @@ settings.endGroup(); writeCursorPos(); + + writeSyntaxColors(); } /*************************/ void Config::readCursorPos() @@ -502,12 +565,91 @@ } } /*************************/ +void Config::writeSyntaxColors() +{ + Settings settingsColors ("featherpad", darkColScheme_ ? "fp_dark_syntax_colors" : "fp_light_syntax_colors"); + + if (customSyntaxColors_.isEmpty()) + { // avoid redundant writing as far as possible + if (whiteSpaceValue_ != getDefaultWhiteSpaceValue() + || curLineHighlight_ != -1) + { + if (settingsColors.allKeys().size() > 2) + settingsColors.clear(); + } + else + { + settingsColors.clear(); + return; + } + } + else + { + QHash::const_iterator it = customSyntaxColors_.constBegin(); + while (it != customSyntaxColors_.constEnd()) + { + settingsColors.setValue (it.key(), it.value().name()); + ++it; + } + } + + /* NOTE: QSettings has a strange bug that makes it unreliable. If the config file can + have a subkey but has none, QSettings might empty the file when a new window is + opened. This happens when nothing is written to the config file by the code. It + should be related to some kind of cache because I've also seen cases, where a key + has been removed from the code but is created after reading the config file. Since + we write the settings on quitting, the bug has no effect under usual circumstances, + but if a crash happens or the system is shut down inappropriately, the settings + might be lost. So, we always add a subkey if there is color customization. */ + settingsColors.beginGroup ("whiteSpace"); + settingsColors.setValue ("value", whiteSpaceValue_); + settingsColors.endGroup(); + + settingsColors.beginGroup ("curLineHighlight"); + settingsColors.setValue ("value", curLineHighlight_); + settingsColors.endGroup(); +} +/*************************/ +void Config::setWhiteSpaceValue (int value) +{ + value = qBound (getMinWhiteSpaceValue(), value, getMaxWhiteSpaceValue()); + QList colors; + colors << (darkColScheme_ ? QColor (Qt::white) : QColor (Qt::black)); + if (!customSyntaxColors_.isEmpty()) + colors = customSyntaxColors_.values(); + else if (darkColScheme_) + colors = defaultDarkSyntaxColors_.values(); + else + colors = defaultLightSyntaxColors_.values(); + const int average = (getMinWhiteSpaceValue() + getMaxWhiteSpaceValue()) / 2; + QColor ws (value, value, value); + while (colors.contains (ws)) + { + int r = ws.red(); + if (value >= average) --r; + else ++r; + ws = QColor (r, r, r); + } + whiteSpaceValue_ = ws.red(); +} +/*************************/ +void Config::setCurLineHighlight (int value) +{ + if (value < getMinCurLineHighlight() || value > getMaxCurLineHighlight()) + curLineHighlight_ = -1; + else + curLineHighlight_ = value; +} +/*************************/ void Config::addRecentFile (const QString& file) { - recentFiles_.removeAll (file); - recentFiles_.prepend (file); - while (recentFiles_.count() > curRecentFilesNumber_) - recentFiles_.removeLast(); + if (curRecentFilesNumber_ > 0) + { + recentFiles_.removeAll (file); + recentFiles_.prepend (file); + while (recentFiles_.count() > curRecentFilesNumber_) + recentFiles_.removeLast(); + } } /*************************/ QString Config::validatedShortcut (const QVariant v, bool *isValid) @@ -545,5 +687,35 @@ *isValid = false; return QString(); } +/*************************/ +void Config::setDfaultSyntaxColors() +{ + if (defaultLightSyntaxColors_.isEmpty()) + { + defaultLightSyntaxColors_.insert ("function", QColor (Qt::blue)); + defaultLightSyntaxColors_.insert ("BuiltinFunction", QColor (Qt::magenta)); + defaultLightSyntaxColors_.insert ("comment", QColor (Qt::red)); + defaultLightSyntaxColors_.insert ("quote", QColor (Qt::darkGreen)); + defaultLightSyntaxColors_.insert ("type", QColor (Qt::darkMagenta)); + defaultLightSyntaxColors_.insert ("keyWord", QColor (Qt::darkBlue)); + defaultLightSyntaxColors_.insert ("number", QColor (160, 80, 0)); + defaultLightSyntaxColors_.insert ("regex", QColor (150, 0, 0)); + defaultLightSyntaxColors_.insert ("xmlElement", QColor (126, 0, 230)); + defaultLightSyntaxColors_.insert ("cssValue", QColor (0, 110, 110)); + defaultLightSyntaxColors_.insert ("other", QColor (100, 100, 0)); + + defaultDarkSyntaxColors_.insert ("function", QColor (85, 227, 255)); + defaultDarkSyntaxColors_.insert ("BuiltinFunction", QColor (Qt::magenta)); + defaultDarkSyntaxColors_.insert ("comment", QColor (255, 120, 120)); + defaultDarkSyntaxColors_.insert ("quote", QColor (Qt::green)); + defaultDarkSyntaxColors_.insert ("type", QColor (255, 153, 255)); + defaultDarkSyntaxColors_.insert ("keyWord", QColor (65, 154, 255)); + defaultDarkSyntaxColors_.insert ("number", QColor (255, 200, 0)); + defaultDarkSyntaxColors_.insert ("regex", QColor (255, 160, 0)); + defaultDarkSyntaxColors_.insert ("xmlElement", QColor (255, 255, 1)); + defaultDarkSyntaxColors_.insert ("cssValue", QColor (150, 255, 0)); + defaultDarkSyntaxColors_.insert ("other", QColor (Qt::yellow)); + } +} } diff -Nru featherpad-0.12.1/featherpad/config.h featherpad-0.17.1/featherpad/config.h --- featherpad-0.12.1/featherpad/config.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/config.h 2021-01-06 17:57:35.000000000 +0000 @@ -24,6 +24,7 @@ #include #include #include +#include namespace FeatherPad { @@ -34,6 +35,8 @@ public: Settings (const QString &organization, const QString &application = QString(), QObject *parent = nullptr) : QSettings (organization, application, parent) {} + Settings (const QString &fileName, QSettings::Format format, QObject *parent = nullptr) + : QSettings (fileName, format, parent) {} void setValue (const QString &key, const QVariant &v) { if (value (key) == v) @@ -328,13 +331,6 @@ maxSHSize_ = max; } - bool getScrollJumpWorkaround() const { - return scrollJumpWorkaround_; - } - void setScrollJumpWorkaround (bool workaround) { - scrollJumpWorkaround_ = workaround; - } - bool getSkipNonText() const { return skipNonText_; } @@ -483,6 +479,20 @@ saveUnmodified_ = save; } /*************************/ + bool getSelectionHighlighting() const { + return selectionHighlighting_; + } + void setSelectionHighlighting (bool enable) { + selectionHighlighting_ = enable; + } +/*************************/ + bool getPastePaths() const { + return pastePaths_; + } + void setPastePaths (bool pastPaths) { + pastePaths_ = pastPaths; + } +/*************************/ bool getCloseWithLastTab() const { return closeWithLastTab_; } @@ -510,11 +520,54 @@ void setSpellCheckFromStart (bool fromStart) { spellCheckFromStart_ = fromStart; } +/*************************/ + QHash lightSyntaxColors() const { + return defaultLightSyntaxColors_; + } + QHash darkSyntaxColors() const { + return defaultDarkSyntaxColors_; + } + + QHash customSyntaxColors() const { + return customSyntaxColors_; + } + void setCustomSyntaxColors (const QHash& colors) { + customSyntaxColors_ = colors; + } + + int getDefaultWhiteSpaceValue() const { + return darkColScheme_ ? 95 : 180; + } + int getMinWhiteSpaceValue() const { + return darkColScheme_ ? 50 : 130; + } + int getMaxWhiteSpaceValue() const { + return darkColScheme_ ? 140 : 230; + } + int getWhiteSpaceValue() const { + return whiteSpaceValue_; + } + void setWhiteSpaceValue (int value); + + int getCurLineHighlight() const { + return curLineHighlight_; + } + int getMinCurLineHighlight() const { + return darkColScheme_ ? 0 : 210; + } + int getMaxCurLineHighlight() const { + return darkColScheme_ ? 70 : 255; + } + void setCurLineHighlight (int value); + + void readSyntaxColors(); private: QString validatedShortcut (const QVariant v, bool *isValid); void readCursorPos(); void writeCursorPos(); + void setDfaultSyntaxColors(); + void writeSyntaxColors(); bool remSize_, remPos_, remSplitterPos_, noToolbar_, noMenubar_, @@ -534,9 +587,10 @@ nativeDialog_, inertialScrolling_, autoSave_, - scrollJumpWorkaround_, // Should a workaround for Qt5's "scroll jump" bug be applied? skipNonText_, saveUnmodified_, + selectionHighlighting_, + pastePaths_, closeWithLastTab_, sharedSearchHistory_; int vLineDistance_, @@ -553,7 +607,6 @@ int splitterPos_; QFont font_; QString executeCommand_; - int openRecentFiles_; bool recentOpened_; QStringList recentFiles_; bool saveLastFilesList_; @@ -568,6 +621,9 @@ QString dictPath_; bool spellCheckFromStart_; + + QHash defaultLightSyntaxColors_, defaultDarkSyntaxColors_, customSyntaxColors_; + int whiteSpaceValue_, curLineHighlight_; }; } diff -Nru featherpad-0.12.1/featherpad/data/featherpad.desktop featherpad-0.17.1/featherpad/data/featherpad.desktop --- featherpad-0.12.1/featherpad/data/featherpad.desktop 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/featherpad.desktop 2021-01-06 17:57:35.000000000 +0000 @@ -5,22 +5,26 @@ GenericName[da]=Tekstredigering GenericName[es]=Editor de texto GenericName[eo]=Tekst-Redaktilo +GenericName[hu]=Szövegszerkesztő GenericName[ja_JP]=テキストエディタ(Qt) GenericName[pl]=Edytor tekstu GenericName[pt]=Editor de texto +GenericName[ru]=Текстовый редактор GenericName[tr]=Metin Düzenleyici GenericName[zh_CN]=文本编辑器 -Comment=Lightweight Qt5 text editor -Comment[cs]=Nenáročný textový editor, založený na Qt5 -Comment[da]=Letvægts Qt5-tekstredigering -Comment[es]=Editor de texto ligero basado en Qt5 -Comment[eo]=Malpeza tekst-redaktilo bazita sur Qt5 -Comment[ja_JP]=軽量 Qt5 テキストエディタ -Comment[pl]=Lekki edytor tekstu oparty na Qt5 -Comment[pt]=Editor de texto em Qt5 -Comment[tr]=Hafif Qt5 tabanlı metin düzenleyici -Comment[zh_CN]=轻量级 Qt5 文本编辑器 -Exec=featherpad %F +Comment=Lightweight Qt text editor +Comment[cs]=Nenáročný textový editor, založený na Qt +Comment[da]=Letvægts Qt-tekstredigering +Comment[es]=Editor de texto ligero basado en Qt +Comment[eo]=Malpeza tekst-redaktilo bazita sur Qt +Comment[hu]=Gyors szövegszerkesztő Qt-ben +Comment[ja_JP]=軽量 Qt テキストエディタ +Comment[pl]=Lekki edytor tekstu oparty na Qt +Comment[pt]=Editor de texto leve baseado em Qt +Comment[ru]=Лёгкий текстовый редактор на Qt +Comment[tr]=Hafif Qt tabanlı metin düzenleyici +Comment[zh_CN]=轻量级 Qt 文本编辑器 +Exec=featherpad %U Icon=featherpad Terminal=false Type=Application @@ -28,10 +32,18 @@ Categories=Qt;Utility;TextEditor; X-KDE-StartupNotify=false; Keywords=Text;Editor;Plaintext; -Actions=new-window; +Actions=new-window;standalone-window; [Desktop Action new-window] Name=New Window Name[cs]=Nové okno Name[de]=Neues Fenster +Name[eo]=Nova Fenestro +Name[hu]=Új ablak +Name[pt]=Nova Janela Exec=featherpad --win + +[Desktop Action standalone-window] +Name=Standalone Window +Name[eo]=Memstara Fenestro +Exec=featherpad --standalone diff -Nru featherpad-0.12.1/featherpad/data/featherpad.svg featherpad-0.17.1/featherpad/data/featherpad.svg --- featherpad-0.12.1/featherpad/data/featherpad.svg 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/featherpad.svg 2021-01-06 17:57:35.000000000 +0000 @@ -1,49 +1,42 @@ - - + - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + - - - - - - - + + diff -Nru featherpad-0.12.1/featherpad/data/help featherpad-0.17.1/featherpad/data/help --- featherpad-0.12.1/featherpad/data/help 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/help 2021-01-06 17:57:35.000000000 +0000 @@ -1,3 +1,17 @@ +*************** +* General * +*************** + +FeatherPad is a single-instance application by default; all its windows share the same process, which will terminate only if all windows are closed. + +However, if FeatherPad is started with the command-line option "--standalone" or "-s", it will have a single window with a separate process, independently of other FeatherPad windows. + +Rarely, the standalone mode may be needed. For example, if you want to use FeatherPad as the "git" editor, you will need "featherpad -s" as the editor command because "git" does not work correctly with single-instance editors. + +The standalone mode is an exception to the window/tab managing rules that are explained in this document. + +Enter "featherpad --help" in a terminal emulator to see all command-line options. + ********************* * Drag-and-Drop * ********************* @@ -16,17 +30,19 @@ If there is more than one tab, each one will have a right-click menu for closing its right or left tabs. With more than one tab, it is also possible to detach the active tab by clicking the related item on the File menu or with Ctrl+T. -If a file is opened in a tab, the right-click menu of that tab will also contain two items for copying the name and path of the file. +If a file is opened in a tab, the right-click menu of that tab will also contain two items for copying the name and path of the file as well as an item for opening its containing folder with the default file manager. For users' comfort, double clicking on an empty area of the tab-bar creates a new tab. +There are (customizable) shortcuts for switching tabs in various ways (see the File menu) but Ctrl+Tab is not one of them because the Tab key is reserved for text editing (see Keyboard Shortcuts, near the end of this document). + *********************** * File Management * *********************** If there is a FeatherPad window on the current virtual desktop or viewport, so that more than half of its width as well as its height is visible, files will be opened as new tabs in it; otherwise, a new window will be created. Also, when the window on the current desktop/viewport has a modal dialog, another window is created. -In this way, FeatherPad is aware of virtual desktops under most Linux desktop environments. However, there are exceptions (like non-X11 environments or Enlightenment). +In this way, FeatherPad is aware of virtual desktops under most Linux desktop environments, although there are exceptions (like non-X11 environments or Enlightenment). Files are always opened after the active tab unless it is empty, in which case the first file will be opened in it. If a single file is opened, its tab will be activated but in the case of multiple files, the active tab will not change. @@ -48,34 +64,62 @@ The side-pane mode does not have features provided by tabs -- for example, tab drag-and-drop is missing from it -- and conversely -- for example, tabs are not sorted and cannot be filtered -- but the side-pane and tab modes can be used interchangeably through the Side-Pane menu-item or its shortcut and also by middle-clicking an empty space inside the tab-bar or side-pane. -******************************************* -* Encodings and Programming Languages * -******************************************* +The side-pane can be opened by its shortcut (Ctrl+Alt+P by default). If it is already open but does not have focus, the same shortcut focuses it and, if it has focus, the shortcut closes it. + +To return the focus to the editor's main view from the side-pane or anywhere else, press the Escape key. + +***************** +* Encodings * +***************** + +FeatherPad tries to guess encodings when opening files. Although it often guesses them right, there is no exact way for that. Therefore, there are some encodings in the Options menu. If you choose one, the text could be saved with it by using the item "Save with Encoding" on the File menu. By default, all texts are saved with UTF-8, which covers all alphabets. + +Usually, you do not need to worry about encodings; nowadays, UTF-8 is the standard and is used everywhere. -FeatherPad tries to guess encodings as well as programming languages (for syntax highlighting) when opening files. Although it often guesses encodings right, there is no exact way for that. Therefore, there are some encodings in the Options menu. If you choose one, the text could be saved with it by using the item "Save with Encoding" on the File menu. By default, all texts are saved with UTF-8. +***************************** +* Programming Languages * +***************************** -The programming language is detected based on the mime type or file name and its syntax will be highlighted if the syntax highlighting is enabled and supports the language in question. +The programming language of a file is detected based on its mime type or name and its syntax will be highlighted if the syntax highlighting is enabled and supports the language in question. -If the text has no programming language or its syntax is not supported, only its hyperlinks/URLs will be highlighted and it will be possible to open them by right clicking them and activating the related menu-item or by pressing the Control key, moving the cursor over them, and clicking them while the cursor is like a pointing hand. +If a text has no programming language or its syntax is not supported, only its hyperlinks/URLs will be highlighted and it will be possible to open them by right clicking them and activating the related menu-item or by pressing the Control key, moving the cursor over them, and clicking them while the cursor is like a pointing hand. -Also, there is an option in the Preferences dialog that, if enabled and checked, will add a language button to the status bar for overriding the original syntax or lack of it. Reloading a document restores its original syntax. +If the option "Preferences → Text → Support syntax override" is enabled and checked, a language button will be added to the status bar for overriding the original syntax or lack of it. Reloading a document restores its original syntax. -There are also options for showing whitespaces (spaces, line ends and the document end) and vertical position lines when syntax highlighting is enabled (by default or temporarily). +There are also options in the Preferences dialog for showing whitespaces (spaces, tabs), line and document ends, and vertical position lines when syntax highlighting is enabled (by default or temporarily). + +The colors of syntax highlighting can be customized in "Preferences → Syntax Colors". Each syntax color may have different meanings in different programming languages but only the most important meanings are mentioned. The color value of whitespaces can be changed in the same place. ******************************* * Searching and Replacing * ******************************* +In FeatherPad, searching and replacing are done by separate widgets for the user to be able to search one string and replace another. Moreover, a separate replacement widget removes the danger of an unintentional replacement. + To remove the yellow highlights after finishing a search, you could * Click on the 'Clear' icon of the search entry, or * Press Ctrl+K while the search entry has focus, or * Empty the search entry and press Enter or F3 in it, or -* Hide the search bar by focusing it and then, pressing Ctrl+F. +* Hide the search bar by focusing it (with Ctrl+F) and then, pressing Ctrl+F (again). Each search entry has a search history that can be shown as a popup list by clicking its arrow or by pressing Ctrl+Up/Down when it has focus. The topmost item shows the most recent searched text. When the entry has focus, up and down arrow keys can be used for selecting history items without showing the popup list. -The 'Replace' docked window respects the settings for 'Match Case', 'Whole Word' and 'Regular Expression' on the search bar (in the last case, the matching text should be a regular expression, while the replacing text is always an ordinary string). It can be detached from and reattached to the main window at top or bottom. To remove the green highlights after replacing text, you could either hide/close the 'Replace' docked window or do as in the case of removing yellow search highlights (without closing the dock). +The 'Replace' docked window respects the settings for 'Match Case', 'Whole Word' and 'Regular Expression' on the search bar (in the last case, the matching text should be a regular expression, while the replacing text is always an ordinary string). It can be detached from and reattached to the main window at top or bottom. To remove the green highlights after replacing text, you could either hide/close the 'Replace' docked window or do as in the case of removing yellow search highlights. + +The 'Replace' docked window is never shown without the search bar because the settings of the latter are needed by the former. + +Pressing the Escape key is the easiest way of focusing the editor's main view, without changing anything else. + +NOTE: The Escape key never clears the search/replacement entry because the user might want to resume searching/replacing later. To clear the search/replacement entry when it is focused, press Ctrl+K. + +****************************** +* Selection Highlighting * +****************************** + +If "Preferences → Text → Selection highlighting" is checked, all case-sensitive and whole matches of the selected text will be highlighted by a light blue color (or dark blue when the dark color scheme is used). The selected text does not need to be a whole string but the highlighted matches are always whole strings. + +The selection highlighting can be used for finding nearby whole strings quickly. It is separate from the (yellow) search highlighting and can be used besides it. *********************** * Going to A Line * @@ -103,10 +147,14 @@ The (selected multi-line) text can be tabbed by the Tab key and untabbed by Shift+Tab. -If Ctrl+Tab is used, the tabulation will be done by 4 spaces instead of a tab (or the number of spaces that is set by the user in the related option of the Preferences dialog). +If Ctrl+Tab is used, the tabulation will be done by 4 spaces instead of a tab (the number of spaces can be changed in the Preferences dialog). This is sometimes called "soft tab". + +In FeatherPad, "hard" and "soft" tabs are not mutually exclusive because some texts may need one and some the other. With Ctrl+Meta+Tab, the text will be tabbed by 2 spaces, while Shift+Meta+Tab is for 2-space untabbing as far as possible. +All text tabs of a document can be converted to spaces (soft tabs) by using the menu item "Text Tabs to Spaces" in the right-click menu or the "Edit" menu. This conversion is done based on the value of Preferences → Text → Text tab size, which is 4 by default. The document needs to be saved after the conversion. + ******************** * Auto-Bracket * ******************** @@ -150,8 +198,8 @@ Window: ********* +Escape Focus editor's main view without changing anything else F11 (Un-)Fullscreen -Ctrl+Shift+W Resize window to fixed size (700x500 by default but can be set in Preferences) Zooming: ********** @@ -171,12 +219,13 @@ Moving text cursor: ******************** -Up/Down Go to the same position in the previous/next wrapped line -Home Go to to the line start +Home Go to to the line start plus the indentation End Go to to the line end Ctrl+Home Go to to the text start Ctrl+End Go to to the text end +Right/Left Move the cursor one character to the right/left Ctrl+Right/Left Move the cursor one word to the right/left +Up/Down Go to the same position in the previous/next wrapped line Shift+Up/Down Go to the same position in the previous/next wrapped line while selecting text Meta+Up/Down Go to the same position in the previous/next (real) line Meta+Shift+Up/Down Go to the same position in the previous/next (real) line while selecting text @@ -184,14 +233,15 @@ Text tabulation: ***************** Tab Ordinary text tabulation (its length can be changed in Preferences) -Shift+Tab Backtab (the reverse of Tab) +Shift+Tab BackTab (the reverse of Tab) Ctrl+Tab 4-space text tabulation (can be changed in Preferences) Ctrl+Meta+Tab 2-space text tabulation -Shift+Meta+Tab 2-space Backtab, as far as possible +Shift+Meta+Tab 2-space BackTab, as far as possible Text editing: ************** Insert Toggle overwrite mode +Backspace Delete to the left of the text cursor Delete Delete to the right of the text cursor (the opposite of Backspace) Ctrl+K Delete to the end of the line (when the editor has focus) Ctrl+Shift+Up/Down Move the current line or selected lines upward/downward diff -Nru featherpad-0.12.1/featherpad/data/help_ja featherpad-0.17.1/featherpad/data/help_ja --- featherpad-0.12.1/featherpad/data/help_ja 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/help_ja 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,194 @@ +************************************** +* 便利なキーボードショートカット * +************************************** +Ctrl+H このヘルプを表示 +Ctrl+L 行番号の表示/非表示 +Ctrl+W 行番号の表示の切替 +Ctrl+I 自動インデントの切替 +Ctrl+Shift+H 構文のハイライトの表示/非表示の切替 +Ctrl+Shift+R 更新(ファイルの再読み込み) +Ctrl+J 行の移動 +Ctrl+Shift+J 行のテキストを選択(ジャンプバーが表示されます) +Ctrl+F 検索バーのフォーカス/非表示(フォーカスされた検索バーのみを隠す) +F3 前方向に検索(検索入力もできます) +F4 後方向に検索 +F5 ケースが一致 +F6 単語全体 +Ctrl+R 置換のためのドックを表示 +F8 前方向に置換 +F9 後方向に置換 +F10 すべて置換 +Ctrl+K エントリのテキストをフォーカスしているときにクリアする +Ctrl+Shift+P 設定 +Ctrl+Shift+D ステータスバーに文書の統計情報を表示 +Ctrl+Shift+Q タブを閉じる +Ctrl+Shift+V 日付と時間を貼り付け +Ctrl+T タブを分離する +Alt+Right 次のタブへ(RTLの場合はAlt+Left) +Alt+Left 前のタブへ(RTLの場合はAlt+Right) +Alt+Up 最後のタブへ +Alt+Down 最初のタブへ +F1 最後のアクティブなタブへ +Ctrl+P 印刷 +Ctrl+E 編集不可能な文書を編集する + +隠されたショートカット: +========================= +F11 全画面表示の切替 +Ctrl+Shift+W ウィンドウを固定サイズにします(既定値は700x500、設定で変更可能) +Ctrl+= 拡大ズーム(Ctrl+ +、またはCtrl+マウスホイール) +Ctrl+- 縮小ズーム(またはCtrl+マウスホイール) +Ctrl+0 ズームのリセット +Ctrl+E このファイルを実行します(設定で有効になっている場合のみ) +Ctrl+Alt+E 上記のプロセスを直ちに終了(強制終了) +Ctrl+K エディタにて、フォーカスされているときに行末まで削除 +Ctrl+Right/Left カーソルを左右に単語をひとつ移動 +Ctrl+Tab タブ入力で4個のスペースを入力(設定で変更可能) +Ctrl+Meta+Tab タブ入力で2個のスペースを入力 +Up/Down 前か/次の行の同じ位置に移動 +Shift+Up/Down 前か/次の行の同じ位置に移動しながら、テキストを選択 +Meta+Up/Down 前か/次の(リアルな)行の同じ位置に移動 +Meta+Shift+Up/Down 前か/次の(リアルな)行の同じ位置に移動しながら、テキストを選択 +Ctrl+Up/Down カーソルを動かすことなく、折り返し線で上下にスクロール +Ctrl+Shift+Up/Down 行を上下に移動する +Shift+Enter 例: コードコメントの簡単入力で現在行の文字以外のプレフィックスを含む改行を挿入 +Insert 上書きモードの切替 + +残りのショートカットは標準です。上の隠されたものを除くすべてのショートカットは、メニューやツールチップにありますし、その多くは設定の画面でカスタマイズできます。 + + +******************************** +* ドラッグ アンド ドロップ * +******************************** + +ファイルは、FeatherPadウィンドウに、ドラッグ アンド ドロップできます。 +そのときは、以前にアクティブなタブの後に、ドロップされたタブが表示されます。 + +また、タブをウィンドウからドラッグして、別のウィンドウまたはすべてのFeatherPadウィンドウの外にドロップすることもできます。この場合は、ドロップされたタブを含む新しいウィンドウが作成されます。 +つまり、タブは切り離されます。 + +************ +* タブ * +************ + +タブの並び替えや削除はマウスで行うことができます。 + +1つ以上のタブがある場合、それぞれのタブには右または左のタブを閉じるための右クリックメニューがあります。 複数のタブがある場合は、[ファイル]メニューの関連する項目をクリックするか、Ctrl+Tを押して、アクティブなタブを切り離すこともできます。 + +ファイルをタブで開くと、そのタブの右クリックメニューには、ファイルの名前とパスをコピーするための2つの項目が含まれます。 + +タブバーの空の領域をダブルクリックすると、使い勝手が良い、新しいタブが作成できます。 + +********************** +* ファイルの管理 * +********************** + +現在の仮想デスクトップまたはビューポートにFeatherPadウィンドウがあり、その幅と高さの半分以上が表示されている場合、ファイルは新しいタブとして開かれます。 それ以外の場合は、新しいウィンドウが作成されます。 +また、現在のデスクトップ/ビューポートのウィンドウにモーダルダイアログがある場合は、別のウィンドウが作成されます。 + +このように、FeatherPadはほとんどのLinuxデスクトップ環境下で仮想デスクトップを認識しています。 ただし、例外(Enlightenmentなど)があります。 + +ファイルは空でない限り、常にアクティブなタブの後に開かれます。この場合、最初のファイルが開かれます。 +1つのファイルを開くとそのタブは有効になりますが、複数のファイルの場合はアクティブなタブは変更されません。 + +ファイルが複数回開かれた場合、2番目(3番目)のインスタンスはデフォルトで編集不可能になり、デフォルトの色の設定か暗い色の設定かによって、明るい黄色または濃い赤色の背景が表示されます。 +編集可能にするには、ツールバーの「編集」ボタンまたは「編集」メニューをクリックします。 その後、これらの2つのボタンは再び消えます。 + +開いているファイルがシンボリックリンク(シンボリックリンク)の場合、そのタブのコンテキストメニューには、ターゲットパスをコピーして現在のウィンドウ内でターゲットを開くための2つの余分な項目があります。 + +設定の画面で対応するオプションが有効になっている場合、実行可能なスクリプトファイルはFeatherPadの内部から実行できます。 次に、必要に応じてツールバーとファイルメニューに「実行」ボタンが表示されます。 +ターミナルコマンドを使用してそれらを実行しないと、出力とエラーメッセージがポップアップダイアログで表示されます。 + +FeatherPadは、設定の画面で有効になっているオプションに応じて、最近変更された、または開いたファイルを記憶しています。 また、セッションの起動時に最後のウィンドウのファイルを開くこともできます。 +ただし、これにはさらに進んだセッションの管理があり、セッションを保存したり、保存したセッションをいつでも制限なしにリストアまたは削除するためのオプションをユーザに提供します。 + +******************************** +* セッションとサイドペイン * +******************************** + +セッションは、セッションの管理の画面を使用して保存して開くことができます。 前述のように、格納されたセッションの数に制限はありません。 各セッションは任意の名前を持つことができ、任意の数のファイルで構成されます。 セッションのすべてのファイルが現在のFeatherPadウィンドウで開き、カーソル位置が記憶されます。 + +FeatherPadにはサイドパネルを表示する機能があり、一時的にまたは起動時に有効にすることができます。 これは、ファイルリストがアルファベット順に整理され、フィルタリングされるため、セッションでの作業に最適です。 + +タブモードとは異なり、アクティブな文書が空である間にサイドペインを表示させておいて複数のファイルを開くと、アルファベット順に最初のファイルが表示されます。 各ペイン項目には右クリックメニューがあり、複数のページがある場合のさまざまなジョブのメニュー項目が含まれています。 アイテムは、中央ボタンをクリックすることで削除することもできます。 + +サイドペインを表示させたときは、タブによって提供される機能はありません。例えば、タブドラッグ&ドロップが欠けています。逆に、例えばタブはフィルタリングできません。 +サイドペインとタブモードは、サイドペインのメニュー項目またはそのショートカットを使用するか、または、タブバーまたはサイドペイン内の空のスペースを中央ボタンでクリックすることによって、同じように使用できます。 + +******************************************** +* エンコーディングとプログラミング言語 * +******************************************** + +FeatherPadは、ファイルを開くときにエンコーディングと、構文のハイライトをするためにプログラミング言語を推測します。 それはしばしばエンコーディングを正しく推測しますが、正確とは言えません。 +したがって、オプションメニューでいくつかのエンコーディングを指定できるようになっています。 いずれかを選択すると、ファイルメニューの[エンコードで保存]を使用してテキストを保存することができます。 +デフォルトでは、すべてのテキストがUTF-8で保存されます。 + +プログラミング言語は、MIMEタイプまたはファイル名に基づいて検出され、構文のハイライト(強調)表示が有効にされており、その言語をサポートしている場合、その構文がハイライト(強調)表示されます。 + +テキストにプログラミング言語の記述がないか、その構文がサポートされていない場合は、ハイパーリンク/ URLのみがハイライト表示されます。それらを右クリックして関連するメニュー項目を有効にするか、Controlキーを押してカーソルをその上に移動し、カーソルが「指差しの手」の形のときにクリックすることで、それらを開くことができます。 + +また、設定の画面には、チェックを付けて有効にすると、元の構文や不足を上書きするために、ステータスバーに言語ボタンが追加されるオプションがあります。 ドキュメントを再読込すると、元の構文が復元されます。 + +構文のハイライト表示を有効にする(デフォルトまたは一時的に)ときに、空白(空白、行の終わり、文書の終わり)と垂直位置の行を表示するオプションもあります。 + +****************** +* 検索と置換 * +****************** + +検索を終了した後の黄色のハイライトを削除するには、 + +*検索エントリの[クリア]アイコンをクリックするか、 +*検索項目にフォーカスがある間にCtrl+K を押すか、 +*検索項目を空にしてEnterまたはF3を押すか、 +*それに焦点を当てて検索バーを隠し、Ctrl+F を押します。 + +ウィンドウに表示された「置換」ドッグは、検索バーの「大文字と小文字の区別」と「全体の単語」の設定を尊重します。 これは、上部または下部のメインウィンドウから切り離して再接続することができます。 +テキストの置換後に緑色のハイライトを削除するには、ウィンドウに表示された「置換」ドックを非表示にするか/閉じるか、ドックを閉じずに黄色の検索ハイライトを削除する場合のようにする、いずれかの操作を行います。 + +**************** +* 行の移動 * +**************** + +行の移動バーは、ツールバーまたは[検索]メニューの項目をクリックすると表示されます。 行の移動の窓がアクティブな状態でEnterを押すと行の移動が行われます。 横のチェックボックスをオンにすると、テキストカーソルと指定された行の間のテキストがすべて選択されます。 + +********************** +* ステータスバー * +********************** + +ステータスバーは、開いているファイルに関する情報を表示するだけでなく、設定の画面で特定のプロパティが有効になっているときに他のウィジェットを含むこともできます。 +また、設定の画面で非表示にすることもできます。その場合は、ファイルメニューに「文書のプロパティ」という項目が一時的に表示されます。 + +**************************** +* ホイールでスクロール * +**************************** + +マウスホイールのスクロールを速くするには、スクロールバーにカーソルを置きます。 テキストビューの内側にある場合、ホイールスクロールの速度は正常になります。 さらに、Shiftキーを押すと、テキストがホイールごとに1行ずつスクロールします。 + +「慣性」スクロールは、「設定」ダイアログの「テキスト」セクションで有効にできます。カーソルがテキストビュー内にあるときは、ホイールスクロールで一種の慣性が生じます。 + +******************** +* テキストタブ * +******************** + +慣性スクロールは、設定の画面の[テキスト]セクションで有効にすることができます。 カーソルがテキストビューの内側にあるとき、ホイールスクロールで一種の慣性を作成します。 + +選択された複数行のテキストは、Tabキーでタブされ、Shift+Tabでタブから切り取ることができます。 +Ctrl+Tabを使用すると、タブの代わりに4つのスペース(または設定の画面の関連オプションでユーザーが設定したスペースの数)で表が作成されます。 +Ctrl+Meta+Tabを押すと、テキストは2つのスペースでタブされます。 + +インデントのためだけにテキストタブを使用し、スペースのそばでは決してテキストタブを使用しない方が良いでしょう。 それ以外だと、テキスト行に異なるフォントで異なる字下げが表示されることが起こります。 + +**************************************************** +* オートブラケット(自動でカッコを閉じる機能) * +**************************************************** + +設定の画面で「自動でカッコを閉じる」が有効になっている場合、左括弧、中括弧、角括弧または二重引用符が入力された場合は、右括弧、中括弧、角括弧または二重引用符がそれぞれ挿入され、カーソルが移動されます。それには、次の文字に、文字または数字がないことが条件です。 +二重引用符は括弧ではなく、左と右の記号が同じですが、これはこの中に含まれています。 + +また、テキストの一部が選択されている場合は、左括弧、中括弧などを入力すると、選択終了後に右括弧が追加され、括弧、中括弧などに囲まれます。 + +テキスト選択が括弧 "(...)"または中括弧 "{...}"で自動括弧で囲まれた後に、Enter または Returnが押されると、ユーザーの便宜のために、括弧で囲まれたテキストが左括弧の下の行に移動します。 + +同じことが、RTL(右から左)のテキストにも適用されますが、左右が逆になります。 + + diff -Nru featherpad-0.12.1/featherpad/data/help_ja_JP featherpad-0.17.1/featherpad/data/help_ja_JP --- featherpad-0.12.1/featherpad/data/help_ja_JP 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/help_ja_JP 1970-01-01 00:00:00.000000000 +0000 @@ -1,194 +0,0 @@ -************************************** -* 便利なキーボードショートカット * -************************************** -Ctrl+H このヘルプを表示 -Ctrl+L 行番号の表示/非表示 -Ctrl+W 行番号の表示の切替 -Ctrl+I 自動インデントの切替 -Ctrl+Shift+H 構文のハイライトの表示/非表示の切替 -Ctrl+Shift+R 更新(ファイルの再読み込み) -Ctrl+J 行の移動 -Ctrl+Shift+J 行のテキストを選択(ジャンプバーが表示されます) -Ctrl+F 検索バーのフォーカス/非表示(フォーカスされた検索バーのみを隠す) -F3 前方向に検索(検索入力もできます) -F4 後方向に検索 -F5 ケースが一致 -F6 単語全体 -Ctrl+R 置換のためのドックを表示 -F8 前方向に置換 -F9 後方向に置換 -F10 すべて置換 -Ctrl+K エントリのテキストをフォーカスしているときにクリアする -Ctrl+Shift+P 設定 -Ctrl+Shift+D ステータスバーに文書の統計情報を表示 -Ctrl+Shift+Q タブを閉じる -Ctrl+Shift+V 日付と時間を貼り付け -Ctrl+T タブを分離する -Alt+Right 次のタブへ(RTLの場合はAlt+Left) -Alt+Left 前のタブへ(RTLの場合はAlt+Right) -Alt+Up 最後のタブへ -Alt+Down 最初のタブへ -F1 最後のアクティブなタブへ -Ctrl+P 印刷 -Ctrl+E 編集不可能な文書を編集する - -隠されたショートカット: -========================= -F11 全画面表示の切替 -Ctrl+Shift+W ウィンドウを固定サイズにします(既定値は700x500、設定で変更可能) -Ctrl+= 拡大ズーム(Ctrl+ +、またはCtrl+マウスホイール) -Ctrl+- 縮小ズーム(またはCtrl+マウスホイール) -Ctrl+0 ズームのリセット -Ctrl+E このファイルを実行します(設定で有効になっている場合のみ) -Ctrl+Alt+E 上記のプロセスを直ちに終了(強制終了) -Ctrl+K エディタにて、フォーカスされているときに行末まで削除 -Ctrl+Right/Left カーソルを左右に単語をひとつ移動 -Ctrl+Tab タブ入力で4個のスペースを入力(設定で変更可能) -Ctrl+Meta+Tab タブ入力で2個のスペースを入力 -Up/Down 前か/次の行の同じ位置に移動 -Shift+Up/Down 前か/次の行の同じ位置に移動しながら、テキストを選択 -Meta+Up/Down 前か/次の(リアルな)行の同じ位置に移動 -Meta+Shift+Up/Down 前か/次の(リアルな)行の同じ位置に移動しながら、テキストを選択 -Ctrl+Up/Down カーソルを動かすことなく、折り返し線で上下にスクロール -Ctrl+Shift+Up/Down 行を上下に移動する -Shift+Enter 例: コードコメントの簡単入力で現在行の文字以外のプレフィックスを含む改行を挿入 -Insert 上書きモードの切替 - -残りのショートカットは標準です。上の隠されたものを除くすべてのショートカットは、メニューやツールチップにありますし、その多くは設定の画面でカスタマイズできます。 - - -******************************** -* ドラッグ アンド ドロップ * -******************************** - -ファイルは、FeatherPadウィンドウに、ドラッグ アンド ドロップできます。 -そのときは、以前にアクティブなタブの後に、ドロップされたタブが表示されます。 - -また、タブをウィンドウからドラッグして、別のウィンドウまたはすべてのFeatherPadウィンドウの外にドロップすることもできます。この場合は、ドロップされたタブを含む新しいウィンドウが作成されます。 -つまり、タブは切り離されます。 - -************ -* タブ * -************ - -タブの並び替えや削除はマウスで行うことができます。 - -1つ以上のタブがある場合、それぞれのタブには右または左のタブを閉じるための右クリックメニューがあります。 複数のタブがある場合は、[ファイル]メニューの関連する項目をクリックするか、Ctrl+Tを押して、アクティブなタブを切り離すこともできます。 - -ファイルをタブで開くと、そのタブの右クリックメニューには、ファイルの名前とパスをコピーするための2つの項目が含まれます。 - -タブバーの空の領域をダブルクリックすると、使い勝手が良い、新しいタブが作成できます。 - -********************** -* ファイルの管理 * -********************** - -現在の仮想デスクトップまたはビューポートにFeatherPadウィンドウがあり、その幅と高さの半分以上が表示されている場合、ファイルは新しいタブとして開かれます。 それ以外の場合は、新しいウィンドウが作成されます。 -また、現在のデスクトップ/ビューポートのウィンドウにモーダルダイアログがある場合は、別のウィンドウが作成されます。 - -このように、FeatherPadはほとんどのLinuxデスクトップ環境下で仮想デスクトップを認識しています。 ただし、例外(Enlightenmentなど)があります。 - -ファイルは空でない限り、常にアクティブなタブの後に開かれます。この場合、最初のファイルが開かれます。 -1つのファイルを開くとそのタブは有効になりますが、複数のファイルの場合はアクティブなタブは変更されません。 - -ファイルが複数回開かれた場合、2番目(3番目)のインスタンスはデフォルトで編集不可能になり、デフォルトの色の設定か暗い色の設定かによって、明るい黄色または濃い赤色の背景が表示されます。 -編集可能にするには、ツールバーの「編集」ボタンまたは「編集」メニューをクリックします。 その後、これらの2つのボタンは再び消えます。 - -開いているファイルがシンボリックリンク(シンボリックリンク)の場合、そのタブのコンテキストメニューには、ターゲットパスをコピーして現在のウィンドウ内でターゲットを開くための2つの余分な項目があります。 - -設定の画面で対応するオプションが有効になっている場合、実行可能なスクリプトファイルはFeatherPadの内部から実行できます。 次に、必要に応じてツールバーとファイルメニューに「実行」ボタンが表示されます。 -ターミナルコマンドを使用してそれらを実行しないと、出力とエラーメッセージがポップアップダイアログで表示されます。 - -FeatherPadは、設定の画面で有効になっているオプションに応じて、最近変更された、または開いたファイルを記憶しています。 また、セッションの起動時に最後のウィンドウのファイルを開くこともできます。 -ただし、これにはさらに進んだセッションの管理があり、セッションを保存したり、保存したセッションをいつでも制限なしにリストアまたは削除するためのオプションをユーザに提供します。 - -******************************** -* セッションとサイドペイン * -******************************** - -セッションは、セッションの管理の画面を使用して保存して開くことができます。 前述のように、格納されたセッションの数に制限はありません。 各セッションは任意の名前を持つことができ、任意の数のファイルで構成されます。 セッションのすべてのファイルが現在のFeatherPadウィンドウで開き、カーソル位置が記憶されます。 - -FeatherPadにはサイドパネルを表示する機能があり、一時的にまたは起動時に有効にすることができます。 これは、ファイルリストがアルファベット順に整理され、フィルタリングされるため、セッションでの作業に最適です。 - -タブモードとは異なり、アクティブな文書が空である間にサイドペインを表示させておいて複数のファイルを開くと、アルファベット順に最初のファイルが表示されます。 各ペイン項目には右クリックメニューがあり、複数のページがある場合のさまざまなジョブのメニュー項目が含まれています。 アイテムは、中央ボタンをクリックすることで削除することもできます。 - -サイドペインを表示させたときは、タブによって提供される機能はありません。例えば、タブドラッグ&ドロップが欠けています。逆に、例えばタブはフィルタリングできません。 -サイドペインとタブモードは、サイドペインのメニュー項目またはそのショートカットを使用するか、または、タブバーまたはサイドペイン内の空のスペースを中央ボタンでクリックすることによって、同じように使用できます。 - -******************************************** -* エンコーディングとプログラミング言語 * -******************************************** - -FeatherPadは、ファイルを開くときにエンコーディングと、構文のハイライトをするためにプログラミング言語を推測します。 それはしばしばエンコーディングを正しく推測しますが、正確とは言えません。 -したがって、オプションメニューでいくつかのエンコーディングを指定できるようになっています。 いずれかを選択すると、ファイルメニューの[エンコードで保存]を使用してテキストを保存することができます。 -デフォルトでは、すべてのテキストがUTF-8で保存されます。 - -プログラミング言語は、MIMEタイプまたはファイル名に基づいて検出され、構文のハイライト(強調)表示が有効にされており、その言語をサポートしている場合、その構文がハイライト(強調)表示されます。 - -テキストにプログラミング言語の記述がないか、その構文がサポートされていない場合は、ハイパーリンク/ URLのみがハイライト表示されます。それらを右クリックして関連するメニュー項目を有効にするか、Controlキーを押してカーソルをその上に移動し、カーソルが「指差しの手」の形のときにクリックすることで、それらを開くことができます。 - -また、設定の画面には、チェックを付けて有効にすると、元の構文や不足を上書きするために、ステータスバーに言語ボタンが追加されるオプションがあります。 ドキュメントを再読込すると、元の構文が復元されます。 - -構文のハイライト表示を有効にする(デフォルトまたは一時的に)ときに、空白(空白、行の終わり、文書の終わり)と垂直位置の行を表示するオプションもあります。 - -****************** -* 検索と置換 * -****************** - -検索を終了した後の黄色のハイライトを削除するには、 - -*検索エントリの[クリア]アイコンをクリックするか、 -*検索項目にフォーカスがある間にCtrl+K を押すか、 -*検索項目を空にしてEnterまたはF3を押すか、 -*それに焦点を当てて検索バーを隠し、Ctrl+F を押します。 - -ウィンドウに表示された「置換」ドッグは、検索バーの「大文字と小文字の区別」と「全体の単語」の設定を尊重します。 これは、上部または下部のメインウィンドウから切り離して再接続することができます。 -テキストの置換後に緑色のハイライトを削除するには、ウィンドウに表示された「置換」ドックを非表示にするか/閉じるか、ドックを閉じずに黄色の検索ハイライトを削除する場合のようにする、いずれかの操作を行います。 - -**************** -* 行の移動 * -**************** - -行の移動バーは、ツールバーまたは[検索]メニューの項目をクリックすると表示されます。 行の移動の窓がアクティブな状態でEnterを押すと行の移動が行われます。 横のチェックボックスをオンにすると、テキストカーソルと指定された行の間のテキストがすべて選択されます。 - -********************** -* ステータスバー * -********************** - -ステータスバーは、開いているファイルに関する情報を表示するだけでなく、設定の画面で特定のプロパティが有効になっているときに他のウィジェットを含むこともできます。 -また、設定の画面で非表示にすることもできます。その場合は、ファイルメニューに「文書のプロパティ」という項目が一時的に表示されます。 - -**************************** -* ホイールでスクロール * -**************************** - -マウスホイールのスクロールを速くするには、スクロールバーにカーソルを置きます。 テキストビューの内側にある場合、ホイールスクロールの速度は正常になります。 さらに、Shiftキーを押すと、テキストがホイールごとに1行ずつスクロールします。 - -「慣性」スクロールは、「設定」ダイアログの「テキスト」セクションで有効にできます。カーソルがテキストビュー内にあるときは、ホイールスクロールで一種の慣性が生じます。 - -******************** -* テキストタブ * -******************** - -慣性スクロールは、設定の画面の[テキスト]セクションで有効にすることができます。 カーソルがテキストビューの内側にあるとき、ホイールスクロールで一種の慣性を作成します。 - -選択された複数行のテキストは、Tabキーでタブされ、Shift+Tabでタブから切り取ることができます。 -Ctrl+Tabを使用すると、タブの代わりに4つのスペース(または設定の画面の関連オプションでユーザーが設定したスペースの数)で表が作成されます。 -Ctrl+Meta+Tabを押すと、テキストは2つのスペースでタブされます。 - -インデントのためだけにテキストタブを使用し、スペースのそばでは決してテキストタブを使用しない方が良いでしょう。 それ以外だと、テキスト行に異なるフォントで異なる字下げが表示されることが起こります。 - -**************************************************** -* オートブラケット(自動でカッコを閉じる機能) * -**************************************************** - -設定の画面で「自動でカッコを閉じる」が有効になっている場合、左括弧、中括弧、角括弧または二重引用符が入力された場合は、右括弧、中括弧、角括弧または二重引用符がそれぞれ挿入され、カーソルが移動されます。それには、次の文字に、文字または数字がないことが条件です。 -二重引用符は括弧ではなく、左と右の記号が同じですが、これはこの中に含まれています。 - -また、テキストの一部が選択されている場合は、左括弧、中括弧などを入力すると、選択終了後に右括弧が追加され、括弧、中括弧などに囲まれます。 - -テキスト選択が括弧 "(...)"または中括弧 "{...}"で自動括弧で囲まれた後に、Enter または Returnが押されると、ユーザーの便宜のために、括弧で囲まれたテキストが左括弧の下の行に移動します。 - -同じことが、RTL(右から左)のテキストにも適用されますが、左右が逆になります。 - - diff -Nru featherpad-0.12.1/featherpad/data/help_pt_BR featherpad-0.17.1/featherpad/data/help_pt_BR --- featherpad-0.12.1/featherpad/data/help_pt_BR 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/help_pt_BR 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,223 @@ +************************* +* Arrastar e soltar * +************************* + +Os arquivos podem ser arrastados e soltos nas janelas do FeatherPad. + +Além disso, as abas podem ser arrastadas de uma janela e soltas em outra janela ou fora de todas as janelas do FeatherPad. No primeiro caso, a aba solta aparecerá após a aba ativa anteriormente; no segundo caso, uma nova janela contendo a aba solta será criada, ou seja, a aba será desanexada. + +NOTA: Arrastar e soltar abas é habilitado apenas no X11 porque, pelo menos, Wayland tem um sério problema relacionado ao arrastar e soltar. + +************ +* Abas * +************ + +As abas podem ser reordenadas ou desanexadas com o mouse. + +Se houver mais de uma aba, cada uma terá um menu do botão direito para fechar suas abas direita ou esquerda. Com mais de uma aba, também é possível desanexar a aba ativa clicando no item relacionado no menu Arquivo ou com Ctrl+T. + +Se um arquivo for aberto em uma aba, o menu do botão direito dessa aba também conterá dois itens para copiar o nome e o caminho do arquivo. + +Para maior conforto dos usuários, clicar duas vezes em uma área vazia da barra de abas cria uma nova aba. + +********************************* +* Gerenciamento de arquivos * +********************************* + +Se houver uma janela FeatherPad na área de trabalho virtual ou viewport atual, de forma que mais da metade de sua largura e altura fiquem visíveis, os arquivos serão abertos como novas abas nela; caso contrário, uma nova janela será criada. Além disso, quando a janela na área de trabalho/viewport atual tem um diálogo modal, outra janela é criada. + +Dessa forma, o FeatherPad reconhece áreas de trabalho virtuais na maioria dos ambientes de desktop Linux. No entanto, existem exceções (como ambientes não X11 ou Enlightenment). + +Os arquivos são sempre abertos após a aba ativa, a menos que ela esteja vazia; nesse caso, o primeiro arquivo será aberto nela. Se um único arquivo for aberto, sua aba será ativada, mas no caso de vários arquivos, a aba ativa não será alterada. + +Se um arquivo for aberto várias vezes, sua segunda (terceira,...) instância não será editável por padrão e terá um fundo amarelo claro ou vermelho escuro, dependendo se o esquema de cores padrão ou escuro é usado. Para torná-lo editável, clique no botão 'Editar' recém-criado na barra de ferramentas ou no menu 'Editar'. Depois disso, esses dois botões desaparecerão novamente. + +Se o arquivo aberto for um link simbólico (symlink), o menu de contexto de sua aba terá dois itens extras para copiar seu caminho de destino e abrir seu destino dentro da janela atual. + +Arquivos de script executáveis ​​podem ser executados de dentro do FeatherPad se a opção correspondente estiver habilitada na caixa de diálogo Preferências. Em seguida, também um botão Executar aparecerá na barra de ferramentas e no menu Arquivo sempre que necessário. Se nenhum comando de terminal for usado para executá-los, sua saída e mensagens de erro serão mostradas por uma caixa de diálogo pop-up. + +O FeatherPad lembra os arquivos recentemente modificados ou abertos, dependendo da opção habilitada na caixa de diálogo Preferências. Ele também pode abrir os arquivos da última janela na inicialização de uma sessão. No entanto, possui um gerenciador de sessão mais avançado, que oferece ao usuário opções para salvar uma sessão e restaurar ou remover sessões salvas a qualquer momento e sem limite. + +**************************************** +* Sessões e modo de painel lateral * +**************************************** + +As sessões podem ser salvas e abertas usando a caixa de diálogo Gerenciador de Sessão. Conforme mencionado acima, não há limite para o número de sessões armazenadas. Cada sessão pode ter qualquer nome e consistir em qualquer número de arquivos. Todos os arquivos de uma sessão são abertos na janela atual do FeatherPad e suas posições de cursor são lembradas. + +O FeatherPad também tem um modo de painel lateral, que pode ser ativado temporariamente ou na inicialização. É mais adequado para trabalhar com sessões porque sua lista de arquivos é ordenada alfabeticamente e pode ser filtrada. Cada item do painel tem um menu ativado pelo botão direito, que contém itens de menu para vários trabalhos quando há mais de uma página. Os itens também podem ser removidos clicando com o botão do meio sem serem selecionados. + +O modo de painel lateral não tem recursos fornecidos por abas - por exemplo, a barra de abas de arrastar e soltar está ausente - e, inversamente, por exemplo, as abas não são classificadas e não podem ser filtradas - mas os modos de painel lateral e barra de abas podem ser usados ​​alternadamente por meio do item de menu Painel lateral ou seu atalho e também clicando com o botão do meio em um espaço vazio dentro da barra de abas ou painel lateral. + +******************** +* Codificações * +******************** + +O FeatherPad tenta adivinhar as codificações ao abrir arquivos. Embora muitas vezes os acerte, não existe uma maneira exata para isso. Portanto, existem algumas codificações no menu Opções. Se você escolher um, o texto pode ser salvo com ele usando o item "Salvar com Codificação" no menu Arquivo. Por padrão, todos os textos são salvos com UTF-8, que abrange todos os alfabetos. + +Normalmente, você não precisa se preocupar com as codificações; hoje em dia, UTF-8 é o padrão e é usado em qualquer lugar. + +********************************* +* Linguagens de programação * +********************************* + +A linguagem de programação de um arquivo é detectada com base em seu tipo ou nome do MIME e sua sintaxe será realçada se o realce de sintaxe estiver habilitado e for compatível com o idioma em questão. + +Se um texto não possui linguagem de programação ou sua sintaxe não é suportada, apenas seus hiperlinks/URLs serão destacados e será possível abri-los clicando com o botão direito sobre eles e ativando o item de menu relacionado ou pressionando a tecla Control, movendo o cursor sobre eles e clicando neles enquanto o cursor é como uma mão apontando. + +Se a opção "Preferências → Texto → Suporte a substituição de sintaxe" estiver habilitada e marcada, um botão de idioma será adicionado à barra de status para substituir a sintaxe original ou a falta dela. Recarregar um documento restaura sua sintaxe original. + +Também há opções na caixa de diálogo Preferências para mostrar espaços em branco (espaços, tabulações), extremidades de linha e documento e linhas de posição vertical quando o realce de sintaxe está habilitado (por padrão ou temporariamente). + +As cores de realce de sintaxe podem ser personalizadas em "Preferências → Cores de sintaxe". Cada cor de sintaxe pode ter significados diferentes em linguagens de programação diferentes, mas apenas os significados mais importantes são mencionados. O valor da cor dos espaços em branco pode ser alterado no mesmo lugar. + +********************************** +* Pesquisando e substituindo * +********************************** + +No FeatherPad, a pesquisa e a substituição são feitas por widgets separados para que o usuário possa pesquisar uma string e substituir por outra. Além disso, um widget de substituição separado remove o perigo de uma substituição não intencional. + +Para remover os destaques amarelos após terminar uma pesquisa, você pode + +* Clique no ícone 'Limpar' da entrada de pesquisa, ou +* Pressione Ctrl+K enquanto a entrada de pesquisa está em foco, ou +* Esvazie a entrada de pesquisa e pressione Enter ou F3 nela, ou +* Oculte a barra de pesquisa focalizando-a e pressionando Ctrl+F. + +Cada entrada de pesquisa possui um histórico de pesquisa que pode ser mostrado como uma lista pop-up clicando em sua seta ou pressionando Ctrl+Cima/Baixo quando estiver em foco. O item superior mostra o texto pesquisado mais recentemente. Quando a entrada está em foco, as teclas de seta para cima e para baixo podem ser usadas para selecionar os itens do histórico sem mostrar a lista pop-up. + +A janela encaixada 'Substituir' respeita as configurações para 'Corresponder maiúsculas e minúsculas', 'Palavra inteira' e 'Expressão regular' na barra de pesquisa (no último caso, o texto correspondente deve ser uma expressão regular, enquanto o texto de substituição é sempre um string comum). Ele pode ser desanexado e reconectado à janela principal na parte superior ou inferior. Para remover os realces verdes após substituir o texto, você pode ocultar/fechar a janela encaixada 'Substituir' ou fazer como no caso de remover realces de pesquisa amarelos (sem fechar o encaixe). + +*************************** +* Destaque de seleção * +*************************** + +Se "Preferências → Texto → Destaque de seleção" estiver marcado, todas as correspondências com distinção entre maiúsculas e minúsculas e todas as correspondências do texto selecionado serão destacadas por uma cor azul claro (ou azul escuro quando o esquema de cores escuro é usado). O texto selecionado não precisa ser uma string inteira, mas as correspondências destacadas são sempre strings inteiras. + +O realce de seleção pode ser usado para localizar strings inteiras próximas rapidamente. É separado do realce de pesquisa (amarelo) e pode ser usado ao lado dele. + +*************************** +* Indo para uma linha * +*************************** + +A barra de salto pode ser exibida clicando em seu item na barra de ferramentas ou no menu Pesquisar. O salto acontecerá após pressionar Enter enquanto a caixa de rotação Jump estiver ativa. Se a caixa de seleção ao lado dela estiver marcada, todo o texto entre o cursor de texto e a linha de destino será selecionado. + +*********************** +* Barra de status * +*********************** + +A barra de status não apenas mostra informações sobre o arquivo aberto, mas também pode conter outros widgets quando certas propriedades são ativadas na caixa de diálogo Preferências. Você também pode ocultá-lo na caixa de diálogo Preferências e, nesse caso, o item "Propriedades do documento" aparecerá no menu Arquivo e poderá exibi-lo temporariamente. + +*********************** +* Rolagem da roda * +*********************** + +Para uma rolagem rápida da roda do mouse, coloque o cursor na barra de rolagem. Se estiver dentro da visualização de texto, a velocidade de rolagem da roda será normal. Se, além disso, a tecla Shift for pressionada, o texto rolará uma linha por volta da roda. + +A rolagem "inercial" pode ser habilitada na seção Texto da caixa de diálogo Preferências. Isso cria uma espécie de inércia com rolagem de roda quando o cursor está dentro da janela de texto. + +************************** +* Tabulação de texto * +************************** + +O texto (de várias linhas selecionado) pode ser tabulado pela tecla Tab e destabulado por Shift+Tab. + +Se Ctrl+Tab for usado, a tabulação será feita por 4 espaços em vez de uma tabulação (o número de espaços pode ser alterado na caixa de diálogo Preferências). Isso às vezes é chamado de "Tabulação flexível". + +No FeatherPad, as tabulações "fixa" e "flexível" não são mutuamente exclusivas porque alguns textos podem precisar de uma e de outra. + +Com Ctrl+Meta+Tab, o texto será tabulado em 2 espaços, enquanto Shift+Meta+Tab é para destabular 2 espaços o máximo possível. + +Todas as tabulações de texto de um documento podem ser convertidas em espaços (tabs flexíveis) usando o item de menu "Tabulações de texto para espaços" no menu do botão direito ou no menu "Editar". Essa conversão é feita com base no valor de Preferências → Texto → Tamanho da tabulação de Texto, que é 4 por padrão. O documento precisa ser salvo após a conversão. + +*************************** +* Colchete Automático * +*************************** + +Com o "Colchete Automático" habilitado nas Preferências, se um parêntese esquerdo, chave, colchete ou aspas duplas forem digitados, um parêntese direito, chave, colchete ou aspas duplas serão respectivamente inseridos depois dele e o cursor será movido entre eles, desde que o próximo caractere não seja uma letra ou número. (Embora aspas duplas não sejam um colchete e tenham sinais idênticos à esquerda e à direita, estão incluídas aqui.) + +Além disso, se qualquer parte do texto for selecionada do início ao fim, digitar um parêntese esquerdo, colchete, etc. adicionará um direito após o final da seleção, de modo que a seleção será colocada entre parênteses, colchetes, etc. + +Para conveniência do usuário, se Enter/Return for pressionado após uma seleção de texto ser automaticamente colocada entre parênteses "(...)" ou chaves "{...}", o texto entre chaves será colocado abaixo da chave esquerda e acima do direto. + +O mesmo vale para textos RTL (da direita para a esquerda), mas com a direita e a esquerda invertidas. + +***************************** +* Reticências e Em Dash * +***************************** + +Com a opção correspondente habilitada em Preferências e nas devidas circunstâncias, um ponto triplo é substituído por reticências e um hífen duplo por um travessão (travessão longo) enquanto o usuário está digitando. + +As circunstâncias adequadas dependem da tecla pressionada e, talvez, do que vem antes desses personagens. Por exemplo, no caso de um período triplo, a tecla Espaço ou Enter/Return deve ser pressionada e o período triplo não deve seguir um ponto. Os hifens duplos não são substituídos nas linguagens de programação porque podem ter significados especiais. + +Algumas outras strings também podem ser substituídas apropriadamente em linguagens de não programação, por exemplo, "->" e "> =". + +******************************* +* Verificação ortográfica * +******************************* + +Para correção ortográfica, um dicionário Hunspell deve ser adicionado primeiro a Preferências → Texto → Caminho do dicionário Hunspell (um dicionário Hunspell tem o sufixo ".dic" e deve ser acompanhado por um arquivo afixo com o sufixo ".aff"). A verificação ortográfica pode ser feita por F2, mas o atalho pode ser personalizado. + +Se "Ignorar tudo" for clicado, todas as ocorrências da palavra serão ignoradas durante a verificação atual. Se você souber que a palavra está correta, clique em "Adicionar ao dicionário" e ela será salva para todos os cheques. Se "Corrigir tudo" for clicado, outras instâncias da palavra serão corrigidas da mesma maneira quando alcançadas durante a verificação atual. + +************************** +* Atalhos do teclado * +************************** + +Para alterar um atalho personalizável, clique duas vezes nele e pressione o atalho escolhido dentro do editor de atalhos da caixa de diálogo Preferências. Para limpar um atalho, use uma tecla modificadora (como Shift). Para cancelar, pressione a tecla Esc antes que o atalho perca o foco. + +Todos os atalhos, exceto os extras abaixo, podem ser encontrados em menus ou como dicas de ferramentas e muitos deles podem ser personalizados na caixa de diálogo Preferências. + +Atalhos extras úteis (ocultos): +===================================== + +Janela: +********* +F11 Tela Cheia (desfazer) +Ctrl+Shift+W Redimensionar janela para tamanho fixo (700x500 por padrão, mas pode ser definido em Preferências) + +Zoom: +******* +Ctrl+= Ampliar (também Ctrl++ ou Ctrl + roda do mouse) +Ctrl+- Diminuir zoom (também Ctrl + roda do mouse) +Ctrl+0 Redefinir zoom + +Executando um processo: +************************* +Ctrl+E Executar o arquivo executável aberto nesta aba (somente se habilitado em Preferências) +Ctrl+Alt+E Sair (matar) o processo acima imediatamente + +Rolando: +*********** +Shift+roda do mouse Rolar para cima/para baixo em uma linha delimitada com a roda do mouse +Ctrl+Up/Down Rolar para cima/para baixo em uma linha quebrada sem mover o cursor de texto + +Movendo o cursor do texto: +**************************** +Home Ir para o início da linha mais identação +End Ir para o fim da linha +Ctrl+Home Ir para o início do texto +Ctrl+End Ir para o final do texto +Direita/Esquerda Move o cursor um caractere para a direita/esquerda +Ctrl+Direita/Esquerda Move o cursor uma palavra para a direita/esquerda +Cima/Baixo Ir para a mesma posição na linha quebrada anterior/seguinte +Shift+Cima/Baixo Ir para a mesma posição na linha quebrada anterior/seguinte enquanto seleciona o texto +Meta+Cima/Baixo Ir para a mesma posição na linha anterior/próxima (real) +Meta+Shift+Cima/Baixo Ir para a mesma posição na linha anterior/próxima (real) enquanto seleciona o texto + +Tabulação de texto: +********************* +Tab Tabulação de texto comum (seu comprimento pode ser alterado em Preferências) +Shift+Tab Tabulação Reversa (o reverso de Tab) +Ctrl+Tab Tabulação de texto com 4 espaços (pode ser alterado em Preferências) +Ctrl+Meta+Tab Tabulação de texto com 2 espaços +Shift+Meta+Tab Tabulação Reversa com 2 espaços, na medida do possível + +Edição de texto: +****************** +Insert Alternar modo de substituição +Backspace Excluir à esquerda do cursor de texto +Delete Excluir à direita do cursor de texto (o oposto de Backspace) +Ctrl+K Excluir até o final da linha (quando o editor está em foco) +Ctrl+Shift+Cima/Baixo Mover a linha atual ou as linhas selecionadas para cima/baixo +Shift+Enter Inserir nova linha com o prefixo não-letra da linha atual + (para escrever comentários de código ou listas facilmente, por exemplo) diff -Nru featherpad-0.12.1/featherpad/data/icons/featherpad.svg featherpad-0.17.1/featherpad/data/icons/featherpad.svg --- featherpad-0.12.1/featherpad/data/icons/featherpad.svg 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/icons/featherpad.svg 2021-01-06 17:57:35.000000000 +0000 @@ -1,49 +1,42 @@ - - + - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + - - - - - - - + + diff -Nru featherpad-0.12.1/featherpad/data/icons/window-close.svg featherpad-0.17.1/featherpad/data/icons/window-close.svg --- featherpad-0.12.1/featherpad/data/icons/window-close.svg 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/icons/window-close.svg 2021-01-06 17:57:35.000000000 +0000 @@ -1,8 +1,10 @@ - - - - - - - + + + + + diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_ar_DZ.ts featherpad-0.17.1/featherpad/data/translations/featherpad_ar_DZ.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_ar_DZ.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_ar_DZ.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled @@ -53,514 +55,525 @@ - + &Edit - + &Options - - - + + + Encoding - + &Search - - + + &Help - + Find: - + To be replaced - + Replace with: - + Replacing text - + &New - + New tab - + Ctrl+N - + &Open - + Open a file - + Ctrl+O - - + + &Save - + Save the current tab - + Ctrl+S - + &Undo - + Undo - + Ctrl+Z - + &Redo - + Redo - + Ctrl+Shift+Z - + Reload - + Ctrl+Shift+R - + &Find - + Ctrl+F - + Show/hide replacement dock - + Ctrl+R - + Save &As - + Ctrl+Shift+S - + &Print - + Ctrl+P - + Documen&t Properties - + Ctrl+Shift+D - + &Close - + Ctrl+Shift+Q - + &Quit - + Ctrl+Q - + &Cut - + Ctrl+X - + C&opy - + Ctrl+C - + &Paste - + Ctrl+V - + &Delete - + &Select All - + Ctrl+A - + &Font - + &Line Numbers - + Ctrl+L - + &Wrap Lines - + Ctrl+W - + &Auto-Indentation - + Ctrl+I - + &Syntax Highlighting - + Ctrl+Shift+H - + &Preferences - + Ctrl+Shift+P - + Ctrl+H - + &About - + Enforce UTF-8 - + Save with &Encoding - + &Jump to - + Show/hide jump bar - + Ctrl+J - + Edit text - + Ctrl+Shift+E - + &Run - + Ctrl+E - + &Clear - + Clear the list of recently modified files - + Save/Restore Session - + Sa&ve/Restore Session - + Ctrl+M - + Side-Pane - + Ctrl+Alt+P - + Paste Date and Time - + Ctrl+Shift+V - + To Upper Case - + Ctrl+Shift+U - + To Lower Case - + Ctrl+Shift+L + To Start Case + + + + + Last Active Tab - + F1 - - + + Sort Lines - - + + Sort Lines Reversely - + Check Spelling - + F2 - - + + Save All Files - - + + User Dictionary - + + Text Tabs to Spaces + + + + &Detach Tab - + Ctrl+T - + Close Ne&xt Tabs - + Close &Previous Tabs - + Ne&xt Tab - + Previous Ta&b - + Execute - + Close &All Tabs @@ -570,612 +583,663 @@ - + &Encoding - + &Unicode - + &Western European - + &East European - + Ea&st Asian - - + + - - Rep&lacement + + Replacement - + Focus/hide search bar - + &Replace - + Windows Arabic (&CP1256) - + &Other - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) - + Cyrillic (&KOI8-U) - + Cyrillic (&ISO-8859-5) - + &Chinese (BIG5) - + Chinese (&GB18030) - + &Japanese (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) - + Ja&panese (CP932) - + Japa&nese (EUC-JP) - + &Korean (CP949) - + K&orean (CP1361) - + Korean (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs - + &Copy File Name - + Copy File &Path - + Alt+Right - + Alt+Left - + &First Tab - + Alt+Down - + &Last Tab - + Alt+Up - + Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) - + Next - + Previous - + Replace all - + &Recently Opened - + Close - + Save changes? - + Please attend to that window or just close its dialog! - + The document has been modified. - + &Discard changes - + &Cancel - + &No to all - - + + Unsaved - - - - - - - - - + + + + + + + + + Lines - - - + + + Sel. Chars - - - + + + Words - + Another process is running in this tab! - + Script File - + Another FeatherPad window has a modal dialog! - - + + Position: - - - + + + Normal - - - + + + The file does not exist. - + Open Link - + Copy Link - + Only one process is allowed per tab. - + Script Output - + Clear - + FeatherPad does not open files larger than 100 MiB. - + Non-text file(s) not opened! - + See Preferences → Files → Do not permit opening of non-text files - + Some file(s) could not be opened! - + You may not have the permission to read. - + Uneditable file(s)! - + Non-text files or files with huge lines cannot be edited. - + A previous crash detected! - + Preferably, close all FeatherPad windows and start again! - + Root Instance - - - + + + All Files (*) - + All Files (*);;.%1 Files (*.%1) - + Open file... - + .%1 Files (*.%1);;All Files (*) - - + + Save as... - + Keep encoding and save as... - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes - + No - + Cancel - + Do you want to use <b>MS Windows</b> end-of-lines? - + This may be good for readability under MS Windows. - + + + + Cannot be saved! - - - + + + + + Help - - - - - - - + + + + + + + Syntax - + Huge file(s) not opened! - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! - - + + Please be careful about reloading or saving this document! - + + Printing in progress... + + + + Print Document - - + + Printing completed. + + + + + %1 Pages - - + + Copy Target Path - - + + Open Target Here - + + + Open Containing Folder + + + + You need to add a Hunspell dictionary. - - - + + + See Preferences → Text → Spell Checking! - + The Hunspell dictionary does not exist. - + The Hunspell dictionary is not accompanied by an affix file. - - - + + + No misspelling in document. - - - + + + No misspelling from text cursor. - + Spell Checking - + Some files cannot be saved! - + Translators - + A lightweight, tabbed, plain-text editor - - based on Qt5 + + based on Qt - + Author - + aka. - - + + About FeatherPad - + No Replacement - + One Replacement - + %Ln Replacements @@ -1187,7 +1251,12 @@ - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. @@ -1498,72 +1567,83 @@ - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > - + This creates a menu button on the status bar for changing the syntax. - + Support syntax override - + Show spaces, tabs and tab lines when the syntax is highlighted. - + Show whitespaces - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). - + Show vertical lines starting from this position: - + Also show line and document ends - + Date and time format: - + Some text editors cannot open a document whose last line is not empty. - + Ensure an empty last line on saving - + Remove trailing spaces on saving - + Inertial scrolling with mouse wheel @@ -1623,7 +1703,7 @@ - + Help @@ -1671,37 +1751,26 @@ - + Highlight s&yntax by default - + Dark c&olor scheme - + Background color value: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - - - - - Workaround for &Qt5's scroll jump bug - - - This only includes executable files written in script languages like Shell and Python. @@ -1714,13 +1783,13 @@ - + Needs window reopening to take effect. - - + + The color value of the background. 255 means white while 0 means black. @@ -1747,8 +1816,8 @@ - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1758,22 +1827,22 @@ - + Text tab size: - + spaces - + Thick text cursor - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? @@ -1798,7 +1867,7 @@ - + Add dictionary... @@ -1860,119 +1929,240 @@ - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts - + Action - + Shortcut - + Restore default shortcuts. - + + + Default - + + Syntax Colors + + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + Close - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + + + + + files - - + + file - - + + Warning: Ambiguous shortcut detected! - + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + Application restart is needed for changes to take effect. - + Window reopening is needed for changes to take effect. - + &Recently Opened - + Recently &Modified - + The typed shortcut was reserved. - + Hunspell Dictionary Files (*.dic) + + + + Select Syntax Color + + FeatherPad::SearchBar - - + + Search... - + Match Case - + Whole Word - + Regular Expression - + Search with regex... - + Next - + Previous @@ -2041,7 +2231,7 @@ - + &Yes @@ -2081,42 +2271,42 @@ - + Nothing saved.<br>No file was opened. - + No file exists or can be opened. - + Not all files exist or can be opened. - + &OK - + Do you really want to remove all saved sessions? - + Do you really want to remove the selected sessions? - + Do you really want to remove the selected session? - + A session with the same name exists.<br>Do you want to overwrite it? @@ -2124,7 +2314,7 @@ FeatherPad::SidePane - + Filter... @@ -2170,18 +2360,9 @@ FeatherPad::TextEdit - + Double click to center current line - - FeatherPad::WarningBar - - - - Close - - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_bg.ts featherpad-0.17.1/featherpad/data/translations/featherpad_bg.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_bg.ts 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_bg.ts 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,2429 @@ + + + + + FeatherPad::AboutDialog + + + License + Лиценз + + + + FeatherPad::FPwin + + + + + + + + + + + + + + Untitled + Неозаглавен + + + + Go to line: + Отиване до ред: + + + + Select text from cursor to this line +(Ctrl+Shift+J) + Избиране текст от курсора до този ред +(Ctrl+Shift+J) + + + + Select Text + Селектиране на текст + + + + Ctrl+Shift+J + Ctrl+Shift+J + + + + &File + &Файл + + + + + &Edit + &Редактиране + + + + &Options + &Опции + + + + + + Encoding + Кодиране + + + + &Search + &Търсене + + + + + &Help + &Помощ + + + + Find: + Търсене: + + + + To be replaced + Текст за заместване + + + + Replace with: + Заместване с: + + + + Replacing text + Заместващ текст + + + + &New + &Нов + + + + New tab + Нов Раздел + + + + Ctrl+N + Ctrl+N + + + + &Open + &Отваряне + + + + Open a file + Отваряне на файл + + + + Ctrl+O + Ctrl+O + + + + + &Save + &Запазване + + + + Save the current tab + Запазване на текущия раздел + + + + Ctrl+S + Ctrl+S + + + + &Undo + &Отмяна + + + + Undo + Отмяна + + + + Ctrl+Z + Ctrl+Z + + + + &Redo + &Повтаряне + + + + Redo + Повтаряне + + + + Ctrl+Shift+Z + Ctrl+Shift+Z + + + + + Reload + Презареждане + + + + Ctrl+Shift+R + Ctrl+Shift+R + + + + &Find + &Търсене + + + + Ctrl+F + Ctrl+F + + + + Show/hide replacement dock + Показване/Скриване на прозореца за търсене + + + + Ctrl+R + Ctrl+R + + + + Save &As + Запазване &като + + + + Ctrl+Shift+S + Ctrl+Shift+S + + + + &Print + Пр&интиране + + + + Ctrl+P + Ctrl+P + + + + Documen&t Properties + Свойства на &Документа + + + + Ctrl+Shift+D + Ctrl+Shift+D + + + + &Close + За&тваряне + + + + Ctrl+Shift+Q + Ctrl+Shift+Q + + + + &Quit + &Излизане + + + + Ctrl+Q + Ctrl+Q + + + + &Cut + Из&рязване + + + + Ctrl+X + Ctrl+X + + + + C&opy + &Копиране + + + + Ctrl+C + Ctrl+C + + + + &Paste + &Поставяне + + + + Ctrl+V + Ctrl+V + + + + &Delete + &Изтриване + + + + &Select All + Избиране на &Всичко + + + + Ctrl+A + Ctrl+A + + + + &Font + &Шрифт + + + + &Line Numbers + &Номериране на редовете + + + + Ctrl+L + Ctrl+L + + + + &Wrap Lines + &Пренасяне на редовете + + + + Ctrl+W + Ctrl+W + + + + &Auto-Indentation + &Автоматичен отстъп + + + + Ctrl+I + Ctrl+I + + + + &Syntax Highlighting + &Синтактично подчертаване + + + + Ctrl+Shift+H + Ctrl+Shift+H + + + + &Preferences + &Предпочитания + + + + Ctrl+Shift+P + Ctrl+Shift+P + + + + Ctrl+H + Ctrl+H + + + + &About + &Относно + + + + Enforce UTF-8 + Налагане на UTF-8 + + + + Save with &Encoding + Запаз&ване с кодирането + + + + &Jump to + &Отиване на + + + + Show/hide jump bar + Показване/Скриване на прозореца за навигация + + + + Ctrl+J + Ctrl+J + + + + Edit text + Редактиране на текст + + + + Ctrl+Shift+E + Ctrl+Shift+E + + + + &Run + Изп&ълняване + + + + Ctrl+E + Ctrl+E + + + + &Clear + &Изчистване + + + + Clear the list of recently modified files + Изчистване на списъка с последно променени файлове + + + + Save/Restore Session + Запазване/Възстановяване на сесия + + + + Sa&ve/Restore Session + Запазване/Възстановяване на сеси&я + + + + Ctrl+M + Ctrl+M + + + + Side-Pane + Страничен панел + + + + Ctrl+Alt+P + Ctrl+Alt+P + + + + Paste Date and Time + Поставяне на Дата и Час + + + + Ctrl+Shift+V + Ctrl+Shift+V + + + + + To Upper Case + Главни букви + + + + Ctrl+Shift+U + Ctrl+Shift+U + + + + + To Lower Case + Малки букви + + + + Ctrl+Shift+L + Ctrl+Shift+L + + + + + To Start Case + Главна първа буква + + + + + Last Active Tab + Последен активен раздел + + + + F1 + F1 + + + + + Sort Lines + Сортиране на редове + + + + + Sort Lines Reversely + Обратно сортиране на редове + + + + Check Spelling + Проверка на правопис + + + + F2 + F2 + + + + + Save All Files + Запазване на всички файлове + + + + + User Dictionary + Потребителски речници + + + + Text Tabs to Spaces + Промяна на табулатори в интервали + + + + &Detach Tab + Отдел&яне на Раздел + + + + Ctrl+T + Ctrl+T + + + + Close Ne&xt Tabs + Затваряне на &следващия раздел + + + + Close &Previous Tabs + Затваряне на &предишния раздел + + + + Ne&xt Tab + Следващ раздел + + + + Previous Ta&b + Предишен раздел + + + + Execute + Изпълняване + + + + Close &All Tabs + Зат&варяне на всички раздели + + + + Recently &Modified + Последно про&меняни + + + + &Encoding + К&одиране + + + + &Unicode + &Unicode + + + + &Western European + &Western European + + + + &East European + &East European + + + + Ea&st Asian + Ea&st Asian + + + + + + + Replacement + Заместване + + + + Focus/hide search bar + Фокусиране/Скриване на прозореца за търсене + + + + &Replace + &Заместване + + + + Windows Arabic (&CP1256) + Windows Arabic (&CP1256) + + + + &Other + &Други + + + + &UTF-8 + &UTF-8 + + + + UTF-&16 + UTF-&16 + + + + &ISO-8859-1 + &ISO-8859-1 + + + + &Windows-1252 + &Windows-1252 + + + + &Cyrillic (CP1251) + &Cyrillic (CP1251) + + + + Cyrillic (&KOI8-U) + Cyrillic (&KOI8-U) + + + + Cyrillic (&ISO-8859-5) + Cyrillic (&ISO-8859-5) + + + + &Chinese (BIG5) + &Chinese (BIG5) + + + + Chinese (&GB18030) + Chinese (&GB18030) + + + + &Japanese (ISO-2022-JP) + &Japanese (ISO-2022-JP) + + + + Japanese (&ISO-2022-JP-2) + Japanese (&ISO-2022-JP-2) + + + + Japanese (ISO-&2022-KR) + Japanese (ISO-&2022-KR) + + + + Ja&panese (CP932) + Ja&panese (CP932) + + + + Japa&nese (EUC-JP) + Japa&nese (EUC-JP) + + + + &Korean (CP949) + &Korean (CP949) + + + + K&orean (CP1361) + K&orean (CP1361) + + + + Korean (&EUC-KR) + Korean (&EUC-KR) + + + + ISO-&8859-15 + ISO-&8859-15 + + + + Close &Other Tabs + Затваряне на &другите раздели + + + + &Copy File Name + Копиране име на &файл + + + + Copy File &Path + Копиране п&ът на файл + + + + Alt+Right + Alt+Right + + + + Alt+Left + Alt+Left + + + + &First Tab + Н&ачален раздел + + + + Alt+Down + Alt+Down + + + + &Last Tab + Посл&еден раздел + + + + Alt+Up + Alt+Up + + + + Menu + Меню + + + + Calculate number of words +(For huge texts, this may be CPU-intensive.) + Калкулиране на броя на думите + + + + Next + Следващ + + + + Previous + Предишен + + + + Replace all + Заместване на всички + + + + &Recently Opened + Последно отва&ряни + + + + Close + Затваряне + + + + Save changes? + Да се запазят ли промените? + + + + Please attend to that window or just close its dialog! + Моля, посетете този прозорец или просто затворете диалога му! + + + + The document has been modified. + Документът беше модифициран. + + + + &Discard changes + &Отхвърляне на промените + + + + &Cancel + О&тказ + + + + &No to all + &Не за всички + + + + + Unsaved + Незапазен + + + + + + + + + + + + Lines + Редове + + + + + + Sel. Chars + Изб. Символ + + + + + + Words + Думи + + + + Another process is running in this tab! + В този раздел се изпълнява друг процес! + + + + Script File + Скрипт + + + + Another FeatherPad window has a modal dialog! + Друг FeatherPad прозорец има модален диалог! + + + + + Position: + Позиция: + + + + + + Normal + Нормална + + + + + + The file does not exist. + Файлът не съществува. + + + + Open Link + Отваряне на връзка + + + + Copy Link + Копиране на връзка + + + + Only one process is allowed per tab. + На един раздел е разрешен само един процес. + + + + Script Output + Изход на скрипта + + + + Clear + Изчистване + + + + FeatherPad does not open files larger than 100 MiB. + FeatherPad не отваря файлове, по-големи от 100 MiB. + + + + Non-text file(s) not opened! + Нетекстов файл не се отвори! + + + + See Preferences → Files → Do not permit opening of non-text files + Виж Предпочитания →Файлове → Не се разрешава отваряне на нетекстови файлове + + + + Some file(s) could not be opened! + Някои файлове не можаха да бъдат отворени! + + + + You may not have the permission to read. + Може да нямате разрешение за четене. + + + + Uneditable file(s)! + Файл, неподлежащ на редактиране! + + + + Non-text files or files with huge lines cannot be edited. + Нетекстови файлове или файлове с огромни редове не могат да се редактират. + + + + A previous crash detected! + Предишен срив е засечен! + + + + Preferably, close all FeatherPad windows and start again! + Препоръчително е да се затворят всички прозорци на FeatherPad и да се започне отначало! + + + + Root Instance + Изпълняване като администратор + + + + + + All Files (*) + Всички файлове (*) + + + + All Files (*);;.%1 Files (*.%1) + Всички файлове (*);;.%1 Файлове (*.%1) + + + + Open file... + Отваряне на файл... + + + + .%1 Files (*.%1);;All Files (*) + .%1 Файлове (*.%1);;Всички файлове (*) + + + + + Save as... + Запазване като... + + + + Keep encoding and save as... + Запазване с кодирането като... + + + + Saving as root. + Запазване като администратор. + + + + Waiting for authentication... + Изчаква се удостоверяване ... + + + + "pkexec" is not found. Please install Polkit! + "pkexec" не е намерен. Моля инсталирайте Polkit! + + + + Yes + Да + + + + No + Не + + + + Cancel + Отказ + + + + Do you want to use <b>MS Windows</b> end-of-lines? + Искате ли да използвате <b>MS Windows</b> край на ред? + + + + This may be good for readability under MS Windows. + Това може да е по-добре за четене под MS Windows. + + + + + + + Cannot be saved! + Не може да бъде запазено! + + + + + + + + Help + Помощ + + + + + + + + + + Syntax + Синтаксис + + + + Huge file(s) not opened! + Голям по размер файл не се отвори! + + + + Text tabs are converted to spaces. + Текстовите табулатори се конвертираха в интервали. + + + + The selected text was too long. + Селектираният текст беше твърде дълъг. + + + + It is not fully processed. + Той не е напълно обработен. + + + + + This file has been modified elsewhere or in another way! + Този файл е модифициран другаде или по друг начин! + + + + + Please be careful about reloading or saving this document! + Моля, бъдете внимателни при презареждането или запазването на този документ! + + + + Printing in progress... + В процес на принтиране... + + + + Print Document + Принтиране на документ + + + + Printing completed. + Принтирането е завършено. + + + + + %1 Pages + %1 Страници + + + + + Copy Target Path + Копиране път на целта + + + + + Open Target Here + Отваряне на целта тук + + + + + Open Containing Folder + Отваряне на съдържащата папка + + + + You need to add a Hunspell dictionary. + Необходимо е добавяне на Hunspell речник. + + + + + + See Preferences → Text → Spell Checking! + Виж Предпочитания →Текст→ Проверка на правописа! + + + + The Hunspell dictionary does not exist. + Hunspell речник не е наличен. + + + + The Hunspell dictionary is not accompanied by an affix file. + Hunspell речникът няма придружаващ affix файл. + + + + + + No misspelling in document. + Не са открити правописни грешки в документа. + + + + + + No misspelling from text cursor. + Не са открити правописни грешки от текстовия курсор. + + + + Spell Checking + Проверка на правопис + + + + Some files cannot be saved! + Някои файлове не могат да се запазят! + + + + Translators + Преводачи + + + + A lightweight, tabbed, plain-text editor + Лек и икономичен на ресурси редактор на обикновен текст с възможност за обработка на множество файлове в раздели + + + + based on Qt + базиран на Qt + + + + Author + Автор + + + + aka. + aka. + + + + + About FeatherPad + Относно FeatherPad + + + + No Replacement + Без заместване + + + + One Replacement + Едно заместване + + + + %Ln Replacements + + %Ln заместване + %Ln замествания + + + + + The first 1000 replacements are highlighted. + Първите 1000 замествания са подчертани. + + + + The size limit for syntax highlighting is exceeded. + Превишен е размерът на лимита за подчертаване на синтаксиса. + + + + FeatherPad::FileDialog + + + Ctrl+H + Toggle showing hidden files + Ctrl+H + + + + Alt+. + Toggle showing hidden files + Alt+. + + + + FeatherPad::FontDialog + + + Select Font + Избиране на шрифт + + + + Programming Fonts + Програмни шрифтове + + + + + Font: + Шрифт: + + + + Size: + Размер: + + + + Weight: + Плътност: + + + + Normal + Нормален + + + + Medium + Среден + + + + Bold + Получер + + + + Black + Свръхтъмен + + + + Italic + Курсивен + + + + Preview + Предварителен изглед + + + + FeatherPad::LineEdit + + + Clear text (Ctrl+K) + Изчистване на текст (Ctrl+K) + + + + FeatherPad::PrefDialog + + + Preferences + Предпочитания + + + + Window + Прозорец + + + + Window Settings + Настройки на прозореца + + + + Remember window &size on closing + Запомняне на &размера на прозореца при затваряне + + + + + + + Window frame is excluded. + Рамката на прозореца се изключва. + + + + Start with this size: + Стартиране с този размер: + + + + + px + px + + + + × + × + + + + Enforcing a window position is not recommended +and may not work with some window managers. + Не се препоръчва налагане на позиция на прозореца, +защото може да не работи добре с някои мениджъри на прозорци. + + + + Remember window &position on closing + Запомняне на &позицията на прозореца при затваряне + + + + Most suitable with sessions +but without tab functionality. + Най-подходящ със сесии +но без изглед в раздели. + + + + Uncheck for 1/5 of the width. + Премахни избора на опцията за 1/5 от ширината. + + + + Remember splitter position + Запомняне на позицията на разделителя + + + + Do not show &toolbar + Без показване на лентата с &инструменти + + + + If the menubar is hidden, +a menu button appears on the toolbar. + Ако лентата с менюта е скрита, +на лентата с инструменти се появява бутон за меню. + + + + Do not show &menubar + Без показване на лентата с &менюта + + + + Hide search &bar by default + &Скриване на лентата за търсене по подразбиране + + + + By default, each search entry +has a separate search history. + По подразбиране всеки запис за търсене +има отделна история на търсенията. + + + + Use a shared search history + Използване на споделена история на търсенето + + + + Always show st&atus bar + Показване на &лентата на състоянието винаги + + + + Show cursor position on status bar + Показване позицията на курсора в лентата на състоянието + + + + + Will take effect after closing this dialog. + Ефектът ще настъпи след затварянето на този диалог. + + + + Tab position: + Позиция на лентата на разделите : + + + + North + Север + + + + South + Юг + + + + West + Запад + + + + East + Изток + + + + This means that, for LTR, Alt+Right goes to the first tab +after the last tab is activated, and the same for Alt+Left. + +Tab navigation with mouse wheel is not affected. + Това означава, че с Alt + Right се преминава към първия раздел +след активиране на последния раздел и същото важи и за Alt + Left. + +Навигацията в раздела със скрола на мишката не е засегната. + + + + Tab navigation wraps &around + Прев&ъртане на отворените раздели с клавиатурата + + + + Close window on closing its last tab + Затваряне на прозореца при затваряне на последния раздел + + + + By default, if a FeatherPad window exists on the +current desktop, files will be opened in its tabs. + +However, some desktop environments may not +report that they have multiple desktops. + По подразбиране, ако прозорец FeatherPad съществува на +текущия работен плот, файловете ще бъдат отворени в неговите раздели. + +Някои работни среди обаче може да не +съобщават, че имат множество работни плотове. + + + + Always open in separate windows + Отваряне на новите файлове винаги в нов прозорец + + + + If this is checked, the file dialog provided by the current +desktop environment will be used instead of the Qt file dialog. + +Some desktop environments, like KDE and LXQt, provide files dialogs. + Ако това е отметнато, файловият диалог , предоставен от текущата +работната среда ще се използва вместо файловия диалог на Qt. + +Някои среди на работния плот, като KDE и LXQt, предоставят собствени диалогови прозорци за файлове. + + + + Native file dialog + Нативен файлов диалог + + + + Uncheck for Monospace. + При отмяна на селецията ще се използва Monospace. + + + + Remember &font + Запомняне на &шрифт + + + + This covers parentheses, braces, brackets and quotes. + Това обхваща скоби, фигурни скоби, квадратни скоби и кавички. + + + + Auto-&bracket + &Автоматизиране на скобите + + + + By default, a triple period is replaced with an ellipsis +and a double hyphen with a long dash while typing, +under proper circumstances. + Задава по подразбиране, докато пишете при подходящи обстоятелства, +многоточието да се заменя с елипса и двойното тире с дълго тире. + + + + Replace triple periods and double hyphens while typing + Заменяне на многоточието с елипса и двойното тире с дълго тире + + + + Highlight case-sensitive and whole matches +of the selected text. + Подчертаване на съвпаденията по регистър и цяла дума на избрания текст. + + + + Selection highlighting + Подчертаване на селекцията при търсене + + + + Never highlight syntax for files > + Никога да не подчертава синтаксисът за следните файлове > + + + + This creates a menu button on the +status bar for changing the syntax. + Това създава бутон за меню на +лентата на състоянието за промяна на синтаксиса. + + + + Support syntax override + Поддръжка на заместване на синтаксиса + + + + Show spaces, tabs and tab lines +when the syntax is highlighted. + Показване на интервали, табулатори и линии, +когато е подчертан синтаксисът. + + + + Show whitespaces + Показване на интервалите + + + + + The vertical position lines will be drawn only if +the editor font has a fixed pitch (like Monospace). + Линиите на вертикалното положение ще бъдат показвани, само ако +шрифтът на редактора е от тип фиксиран (като Monospace). + + + + Show vertical lines starting from this position: + Показване на линиите на вертикално положение от тази позиция: + + + + Also show line and document ends + Показване на края на ред и документ + + + + Date and time format: + Формат на дата и час: + + + + Some text editors cannot open a document +whose last line is not empty. + Някои текстови редактори не могат да отворят документ, +чийто последен ред не е празен. + + + + Ensure an empty last line on saving + Поставяне на празен последен ред при запазване + + + + Remove trailing spaces on saving + Премахване на крайните интервали при запазване + + + + Inertial scrolling with mouse wheel + Инерционно превъртане с колелцето на мишката + + + + Files + Файлове + + + + File Management + Обработка на файлове + + + + Start with files of last window + Стартиране с файловете от последния прозорец + + + + + This can be any starting command with +arguments, for example, "xterm -hold" +for running the process in XTerm. + +If the command is left empty, the file +will be executed directly. + +If the script is not run in a terminal +emulator, the output and error messages +will be shown by a popup dialog. + Това може да бъде всяка стартираща команда с +аргументи, например "xterm -hold" +за стартиране на процеса в XTerm. + +Ако командата остане празна, файлът +ще бъде изпълнен директно. + +Ако скриптът не се изпълнява в терминал, +изходните съобщения и съобщенията за грешки +ще се показват от изскачащ диалогов прозорец. + + + + Start with this command: + Стартиране с тази команда: + + + + Command + Arguments + Команда + Аргументи + + + + Show recentl&y modified files + Показване на последно про&меняни файлове + + + + Show recentl&y opened files + Показване на последно &отваряни файлове + + + + Save changes to opened files every: + Запазване на промените на отворените файлове всеки: + + + + Help + Помощ + + + + Start with side-pane mode + Стартиране със страничен панел + + + + If this is checked, not only you will lose the informative +tooltip and context menu of a single tab but you could not +merge a single tabbed window into another one by tab drag- +and-drop either. + Ако това е отметнато, вие не само ще загубите информативната +подсказка и контекстно меню на отделен раздел, но също няма да можете +да обединявате прозорец с единичен раздел с друг прозорец чрез влачене на раздела. + + + + &Do not show a single tab + &Скриване на лентата на раздела при единичен раздел + + + + Text + Текст + + + + Text Editor + Текстов редактор + + + + &Wrap lines by default + &Прехвърляне на редовете по подразбиране + + + + Auto-&indent by default + Автоматично прилагане на отстъп + + + + Always show line &numbers + Показване на &номера на редовете винаги + + + + Highlight s&yntax by default + Под&чертаване на синтаксиса по подразбиране + + + + Dark c&olor scheme + Т&ъмна цвeтна схема + + + + Background color value: + Стойност на фоновия цвят: + + + + MiB + MiB + + + + This only includes executable files written +in script languages like Shell and Python. + +If it is checked and the opened file is +executable, the file will be executed by clicking +the Run button, that appears on the toolbar/filemenu +when needed, or by its shortcut Ctrl+E. Then, the +process could be killed by Ctrl+Alt+E. + Това включва само изпълними файлове, написани +на скриптови езици като Shell и Python. + +Ако опцията е избрана и отвореният файл е +изпълним, файлът ще бъде изпълнен чрез щракване на +бутона Изпълняване, който се появява в лентата с инструменти / менюто на файла +когато е необходимо, или чрез комбинацията Ctrl + E. Тогава +процесът може да бъде прекратен с Ctrl + Alt + E. + + + + Needs window reopening to take effect. + Необходимо е повторно отваряне на прозореца, за да влезе в сила. + + + + + The color value of the background. +255 means white while 0 means black. + +For the light background, it can be +between 230 and 255; for the dark +background, between 0 and 50. + +Needs window reopening to take effect. + Цветовата стойност на фона. +255 означава бяло, докато 0 означава черно. + +За светъл фон може да бъде +между 230 и 255; за тъмен +фон, между 0 и 50. + +Нуждае се от повторно отваряне на прозореца, за да влезе в сила. + + + + Run executable scripts + Изпълняване на изпълними скриптове + + + + + The maximum number of recently modified or +opened files FeatherPad shows. The default +is 10. + +Needs application restart to take effect. + Максималният брой наскоро модифицирани или +отваряни файлове, които FeatherPad показва. +По подразбиране е 10. +Изисква рестартиране на приложението, за да влезе в сила. + + + + + Used for pasting the date and time. + +Takes effect after closing this dialog. + +Leave empty for: +MMM dd, yyyy, hh:mm:ss + Използва се за поставяне на датата и часа. + +Влиза в сила след затваряне на този диалогов прозорец. + +Оставете празно за: +MMM dd, гггг, hh: mm: ss + + + + Text tab size: + Размер на текста в лентата на раздели: + + + + spaces + интервали + + + + Thick text cursor + Плътен текстов курсор + + + + Should the mouse wheel scrolling be inertial +if the cursor is inside the text view? + Ако курсорът е вътре в текстовия изглед, +трябва ли превъртането на колелцето на мишката да бъде инерционно? + + + + Spell Checking + Проверка на правопис + + + + + A Hunspell dictionary has a name that ends with ".dic" +and should be alongside an affix file with the same +name but ending with ".aff". + Речникът на Hunspell има име с разширение ".dic" +и трябва да бъде заедно с прикрепен файл със същото +име, но с разширение ".aff". + + + + Hunspell dictionary path: + Път до Hunspell речник: + + + + + Add dictionary... + Добавяне на речник... + + + + If this is unchecked, spell checking +will be started from the document start. + Ако това не е отметнато, проверка на правописа +ще стартира от началото на документа. + + + + Start spell checking from text cursor + Започване на проверката на правописа от текстовия курсор + + + + Number of recent files: + Брой на наскоро обработвани файлове: + + + + Only if their number is not greater than 50. + Само ако броят им не е по-голям от 50. + + + + + Only for files that exist and can be saved. + Само за файлове, които съществуват и могат да бъдат запазени. + + + + min + min + + + + If this is checked, the Save button/menu-item could +be used also when the opened file is not modified. + +This can be useful under certain circumstances, +e.g. for changing the time stamp or removing the +trailing spaces of a text file. + Ако това е отметнато, бутонът / елементът от менюто Запазване може +да се използва, и когато отвореният файл не е модифициран. + +Това може да бъде полезно при определени обстоятелства, +напр. за промяна на времевия печат или премахване на +крайни интервали от текстов файл. + + + + Allow saving unmodified files + Разрешаване запазването на немодифицирани файлове + + + + Show a warning instead. + Показване на предупреждение вместо това. + + + + Do not permit opening of non-text files + Отваряне на нетекстови файлове не е позволено + + + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + По подразбиране, когато файловете се копират, те ще +да бъдат отворени, ако се поставят в FeatherPad. + + + + Paste paths instead of files + Поставяне на пътя вместо файлове + + + + Shortcuts + Клавишни комбинации + + + + Action + Действие + + + + Shortcut + Комбинация + + + + Restore default shortcuts. + Възстановяване на комбинациите по подразбиране. + + + + + + Default + По подразбиране + + + + Syntax Colors + Цветове на синтаксис + + + + Element + Елемент + + + + Text Color + Цвят на текста + + + + Whitespace color value: + Стойност на цвета за бялото работно пространство: + + + + + Has effect only if line numbers are shown. + Има ефекта само, ако са показани номерата на редовете. + + + + Current line highlight value: + Стойност на подчертаване на текущ ред: + + + + Restore default syntax colors. + Възстановяване на цветовете на синтаксис по подразбиране. + + + + Close + Затваряне + + + + Press a modifier key to clear a shortcut +in the editing mode. + Натиснете модифициращ клавиш, за да изчистите комбинацията +в режим на редактиране. + + + + Double click a color to change it. + Двойно кликване на цвят за промяна. + + + + + files + файла + + + + + file + файл + + + + + Warning: Ambiguous shortcut detected! + Предупреждение: Повтарящи се комбинации са засечени! + + + + Functions, URLs,… + Функции, URLs,… + + + + Built-in Functions + Вградени функции + + + + Comments + Коментари + + + + Quotations + Цитати + + + + Types + Типове + + + + Key Words + Ключови думи + + + + Numbers + Числа + + + + Regular Expressions, Code Blocks,… + Регулярни изрази, кодови блокове,… + + + + Document Blocks, XML/HTML Elements,… + Блокове на документи, XML / HTML елементи,… + + + + Markdown Headings, CSS Values,… + Markdown заглавия, CSS стойности,… + + + + Extra Elements + Допълнителни елементи + + + + Application restart is needed for changes to take effect. + Изисква рестартиране на приложението, за да има ефект на промените. + + + + Window reopening is needed for changes to take effect. + Необходимо е повторно отваряне на прозореца, за да влезе в сила. + + + + &Recently Opened + Последно отва&ряни + + + + Recently &Modified + Последно про&меняни + + + + The typed shortcut was reserved. + Типът на комбинацията беше запазен. + + + + Hunspell Dictionary Files (*.dic) + Файлове на Hunspell речник (*.dic) + + + + + Select Syntax Color + Избиране цветове на синтаксис + + + + FeatherPad::SearchBar + + + + Search... + Търсене... + + + + Match Case + Зачитане на регистъра + + + + Whole Word + Цяла дума + + + + Regular Expression + Регулярен израз + + + + Search with regex... + Търсене с рег.изр... + + + + Next + Следващ + + + + Previous + Предишен + + + + FeatherPad::SessionDialog + + + Session Manager + Мениджър на сесия + + + + + &Remove + &Премахване + + + + <b>Save/Restore Session</b> + <b>Запазване/Възстановяване на сесия</b> + + + + Filter... + Филтър... + + + + Open the selected session(s). + Отваряне на избраните сесии. + + + + + &Open + &Отваряне + + + + + Del + Del + + + + + Ctrl+Del + Ctrl+Del + + + + By default, all files that are opened in all +windows will be included in the saved session. + По подразбиране всички файлове във всички +прозорци ще бъдат включени в запазената сесия. + + + + Save only from this &window + Запазване само от този &прозорец + + + + <b>Warning</b> + <b>Предупреждение</b> + + + + + &Yes + &Да + + + + &No + &Не + + + + Re&name + Преимен&уване + + + + Remove &All + &Премахване на всички + + + + &Close + За&тваряне + + + + Save the current session under the given title. + Запазване на текущата сесия със зададеното заглавие. + + + + &Save + &Запазване + + + + Type a name to save session + Въведете име за запазване на сесията + + + + Nothing saved.<br>No file was opened. + Нищо не беше запазено.<br>Никакъв файл не беше отворен. + + + + No file exists or can be opened. + Никакъв файл не съществува и не може да бъде отворен. + + + + Not all files exist or can be opened. + Не всички файлове съществуват и могат да бъдат отворени. + + + + &OK + &OK + + + + Do you really want to remove all saved sessions? + Наистина ли искате да премахнете всички запазени сесии? + + + + Do you really want to remove the selected sessions? + Наистина ли искате да премахнете избраните сесии? + + + + Do you really want to remove the selected session? + Наистина ли искате да премахнете избраната сесия? + + + + A session with the same name exists.<br>Do you want to overwrite it? + Съществува сесия със същото име.<br>Искате ли да я презапишете? + + + + FeatherPad::SidePane + + + Filter... + Филтър... + + + + FeatherPad::SpellDialog + + + Unknown word: + Непозната дума: + + + + Add To Dictionary + Добавяне към речника + + + + Replace with: + Заместване с: + + + + Correct Once + Еднократна корекция + + + + Correct All + Корекция на всички + + + + Ignore Once + Еднократно игнориране + + + + Ignore All + Игнориране на всички + + + + FeatherPad::TextEdit + + + Double click to center current line + Щракнете двукратно, за да центрирате текущия ред + + + diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_cs.ts featherpad-0.17.1/featherpad/data/translations/featherpad_cs.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_cs.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_cs.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Licence @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Bez názvu @@ -54,514 +56,525 @@ - + &Edit &Upravit - + &Options M&ožnosti - - - + + + Encoding Znaková sada - + &Search &Hledat - - + + &Help &Nápověda - + Find: Najít: - + To be replaced Co má být nahrazeno - + Replace with: Čím nahradit: - + Replacing text Text je nahrazován - + &New &Nové - + New tab Nový panel - + Ctrl+N - + &Open &Otevřít - + Open a file Otevřít soubor - + Ctrl+O - - + + &Save &Uložit - + Save the current tab Uložit stávající panel - + Ctrl+S - + &Undo &Zpět - + Undo Zpět - + Ctrl+Z - + &Redo &Zopakovat - + Redo Zopakovat - + Ctrl+Shift+Z - + Reload Načíst znovu - + Ctrl+Shift+R - + &Find &Najít - + Ctrl+F - + Show/hide replacement dock Zobrazit/skrýt dok nahrazení - + Ctrl+R - + Save &As Uložit j&ako - + Ctrl+Shift+S - + &Print &Tisk - + Ctrl+P - + Documen&t Properties Vlastnosti dokumen&tu - + Ctrl+Shift+D - + &Close &Zavřít - + Ctrl+Shift+Q - + &Quit &Ukončit - + Ctrl+Q - + &Cut &Vyjmout - + Ctrl+X - + C&opy Zk&opírovat - + Ctrl+C - + &Paste &Vložit - + Ctrl+V - + &Delete &Smazat - + &Select All &Vybrat vše - + Ctrl+A - + &Font &Písmo - + &Line Numbers Čís&la řádků - + Ctrl+L - + &Wrap Lines &Zalamovat řádky - + Ctrl+W - + &Auto-Indentation &Automatické odsazování - + Ctrl+I - + &Syntax Highlighting Zvýrazňování &syntaxe - + Ctrl+Shift+H - + &Preferences &Předvolby - + Ctrl+Shift+P - + Ctrl+H - + &About O &aplikaci - + Enforce UTF-8 Vynutit UTF-8 - + Save with &Encoding Uložit s&e znakovou sadou - + &Jump to &Přeskočit na - + Show/hide jump bar Zobrazit/skrýt pruh poskočení - + Ctrl+J - + Edit text Upravit text - + Ctrl+Shift+E - + &Run &Spustit - + Ctrl+E - + &Clear &Vyčistit - + Clear the list of recently modified files Vyčistit seznam nedávnou změněných souborů - + Save/Restore Session Uložit/obnovit sezení - + Sa&ve/Restore Session Uložit/obnovit &relaci - + Ctrl+M - + Side-Pane Boční podokno - + Ctrl+Alt+P - + Paste Date and Time Vložit datum a čas - + Ctrl+Shift+V - + To Upper Case Na velká písmena - + Ctrl+Shift+U - + To Lower Case Na malá písmena - + Ctrl+Shift+L + To Start Case + Po úvodní velikost + + + + Last Active Tab Minule aktivní panel - + F1 - - + + Sort Lines Seřadit řádky - - + + Sort Lines Reversely Seřadit řádky pozpátku - + Check Spelling Zkontrolovat pravopis - + F2 F2 - - + + Save All Files Uložit všechny soubory - - + + User Dictionary Uživatelský slovník - + + Text Tabs to Spaces + Tabulátory textu na mezery + + + &Detach Tab O&dpojit panel - + Ctrl+T - + Close Ne&xt Tabs &Zavřít panely napravo - + Close &Previous Tabs Zavřít &panely nalevo - + Ne&xt Tab &Následující panel - + Previous Ta&b &Předchozí panel - + Execute Vykonat - + Close &All Tabs Z&avřít všechny panely @@ -571,613 +584,664 @@ Nedávno z&měněné - + &Encoding &Znaková sada - + &Unicode &Univerzální kódování - + &Western European &Západoevropské - + &East European &Východoevropské - + Ea&st Asian Východoa&sijské - - + + - - Rep&lacement - &Nahrazení + + Replacement + Nahrazení - + Focus/hide search bar Zaměřit/skrýt pruh hledání - + &Replace Nah&radit - + Windows Arabic (&CP1256) Windows arabské (&CP1256) - + &Other &Ostatní - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) &Cyrilice (CP1251) - + Cyrillic (&KOI8-U) Cyrilice (&KOI8-U) - + Cyrillic (&ISO-8859-5) Cyrilice (&ISO-8859-5) - + &Chinese (BIG5) čí&nština (BIG5) - + Chinese (&GB18030) čínština (&GB18030) - + &Japanese (ISO-2022-JP) &japonština (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) japonština (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) japonština (ISO-&2022-KR) - + Ja&panese (CP932) ja&ponština (CP932) - + Japa&nese (EUC-JP) japo&nština (EUC-JP) - + &Korean (CP949) &korejština (CP949) - + K&orean (CP1361) k&orejština (CP1361) - + Korean (&EUC-KR) korejština (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs Zavřít &ostatní panely - + &Copy File Name &zkopírovat název souboru - + Copy File &Path Zkopírovat &popis umístění souboru - + Alt+Right Alt+šipka doprava - + Alt+Left Alt+šipka vlevo - + &First Tab &První panel - + Alt+Down Alt+šipka dolů - + &Last Tab &Poslední panel - + Alt+Up Alt+šipka nahoru - + Menu Nabídka - + Calculate number of words (For huge texts, this may be CPU-intensive.) Spočítat počet slov (V případě rozsáhlých textů toto může způsobit vysoké vytížení procesoru.) - + Next Další - + Previous Předchozí - + Replace all Nahradit vše - + &Recently Opened &Nedávno otevřeno - + Close Zavřít - + Save changes? Uložit změny? - + Please attend to that window or just close its dialog! Přejděte prosím do tohoto okna nebo zavřete jeho dialog! - + The document has been modified. Dokument byl změněn. - + &Discard changes &Zahodit změny - + &Cancel - &Storno + &Zrušit - + &No to all &Ne všemu - - + + Unsaved Neuloženo - - - - - - - - - + + + + + + + + + Lines Řádky - - - + + + Sel. Chars Vybr. znaky - - - + + + Words Slova - + Another process is running in this tab! V tomto panelu je spuštěný jiný proces! - + Script File Soubor se skriptem - + Another FeatherPad window has a modal dialog! Jiné okno FeatherPad má modální dialog! - - + + Position: Pozice: - - - + + + Normal Normální - - - + + + The file does not exist. Soubor neexistuje. - + Open Link Otevřít odkaz - + Copy Link Zkopírovat odkaz - + Only one process is allowed per tab. V rámci jednoho panelu může být pouze jeden proces. - + Script Output Výstup ze skriptu - + Clear Vyčistit - + FeatherPad does not open files larger than 100 MiB. FeatherPad neotevírá soubory větší než 100 MiB. - + Non-text file(s) not opened! - + Soubory, neobsahující text, neotevřeny! - + See Preferences → Files → Do not permit opening of non-text files - + Viz předvolby → Soubory → Neumožňovat otevírat jiné, než textové soubory - + Some file(s) could not be opened! Některé soubory se nepodařilo otevřít! - + You may not have the permission to read. Může být, že nemáte oprávnění k jejich čtení. - + Uneditable file(s)! Soubory, které nelze upravovat! - + Non-text files or files with huge lines cannot be edited. Netextové soubory nebo takové, které obsahují opravdu dlouhé řádky není možné upravovat. - + A previous crash detected! Zjištěn předchozí pád! - + Preferably, close all FeatherPad windows and start again! Nejlépe bude zavřít všechna okna s FeatherPad a spustit znovu! - + Root Instance Instance uživatele správce systému (root) - - - + + + All Files (*) Všechny soubory (*) - + All Files (*);;.%1 Files (*.%1) Všechny soubory (*);;.%1 Soubory (*.%1) - + Open file... Otevřít soubor… - + .%1 Files (*.%1);;All Files (*) .%1 soubory (*.%1);;Všechny soubory (*) - - + + Save as... Uložit jako… - + Keep encoding and save as... Ponechat znakovou sadu a uložit jako… - + + Saving as root. + Ukládání s právy správce systému. + + + + Waiting for authentication... + Čekání na ověření se… + + + + "pkexec" is not found. Please install Polkit! + „pkexec“ nenalezeno. Nainstalujte Polkit! + + + Yes Ano - + No Ne - + Cancel - Storno + Zrušit - + Do you want to use <b>MS Windows</b> end-of-lines? Opravdu chcete použít konce řádků jako v <b>MS Windows</b>? - + This may be good for readability under MS Windows. To může být užitečné pro čitelnost v MS Windows. - + + + + Cannot be saved! Není možné uložit! - - - + + + + + Help Nápověda - - - - - - - + + + + + + + Syntax Syntaxe - + Huge file(s) not opened! Obrovské soubor neotevřeny! - - + + Text tabs are converted to spaces. + Tabulátory jsou převedeny na mezery. + + + + The selected text was too long. + Označený text je příliš dlouhý. + + + + It is not fully processed. + Není zcela zpracováno. + + + + This file has been modified elsewhere or in another way! Tento soubor byl změněn z jiné aplikace či jinak! - - + + Please be careful about reloading or saving this document! Buďte opatrní při opětovném načítání nebo ukládání tohoto dokumentu! - + + Printing in progress... + Tiskne se… + + + Print Document Vytisknout dokument - - + + Printing completed. + Tisk dokončen. + + + + %1 Pages %1 stránek - - + + Copy Target Path Zkopírovat cílový popis umístění - - + + Open Target Here Otevřít cíl zde - + + + Open Containing Folder + Otevřít složku, ve které se nachází + + + You need to add a Hunspell dictionary. Je třeba přidat Hunspell slovník. - - - + + + See Preferences → Text → Spell Checking! Viz předvolby → Text → Kontrola pravopisu! - + The Hunspell dictionary does not exist. Hunspell slovník neexistuje. - + The Hunspell dictionary is not accompanied by an affix file. Hunspell slovník není doprovázen affix souborem. - - - + + + No misspelling in document. V dokumentu nejsou žádné překlepy. - - - + + + No misspelling from text cursor. Žádné překlepy od pozice kurzoru. - + Spell Checking Kontrola pravopisu - + Some files cannot be saved! Některé soubory se nepodařilo uložit! - + Translators Překladatelé - + A lightweight, tabbed, plain-text editor Nenáročný editor neformátovaného textu s panely - - based on Qt5 - založeno na Qt5 + + based on Qt + založeno na Qt - + Author Autor - + aka. alias - - + + About FeatherPad O aplikaci FeatherPad - + No Replacement Žádné nahrazení - + One Replacement Jedno nahrazení - + %Ln Replacements %Ln nahrazení @@ -1186,7 +1250,12 @@ - + + The first 1000 replacements are highlighted. + Je zvýrazněno prvních 1000 nahrazení. + + + The size limit for syntax highlighting is exceeded. Překročen limit velikosti pro zvýrazňování syntaxe. @@ -1515,76 +1584,88 @@ Nahrazovat při psaní tři tečky a dva spojovníky - + + Highlight case-sensitive and whole matches +of the selected text. + Zvýraznit shody ve velikosti písmen a úplné shody +označeného textu. + + + + Selection highlighting + Zvýrazňování výběru + + + Never highlight syntax for files > Nikdy nezvýrazňovat syntaxi pro soubory > - + This creates a menu button on the status bar for changing the syntax. Toto vytvoří tlačítko nabídky ve stavové liště pro změnu syntaxe. - + Support syntax override Podporovat přebití syntaxe - + Show spaces, tabs and tab lines when the syntax is highlighted. Při zvýrazňování syntaxe zobrazovat mezery, tabulátory a tab čáry. - + Show whitespaces Zobrazovat prázdné znaky - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). Čáry svislé pozice budou vykreslovány pouze pokud písmo editoru má pevné pitch (jako Monospace). - + Show vertical lines starting from this position: Zobrazit svislé čáry od této pozice: - + Also show line and document ends Také zobrazovat konce čáry a dokumentu - + Date and time format: Formát data a času: - + Some text editors cannot open a document whose last line is not empty. Některé textové editory nedovedou otevřít dokument, jehož poslední řádek není prázdný. - + Ensure an empty last line on saving Při ukládání zajistit, že bude (přidán) poslední prázdný řádek - + Remove trailing spaces on saving Při ukládání odebrat mezery na konci - + Inertial scrolling with mouse wheel Inerciální posouvání kolečkem myši @@ -1653,7 +1734,7 @@ Uložit změny v otevřených souborech každých: - + Help Nápověda @@ -1704,39 +1785,26 @@ &Vždy zobrazovat čísla řádků - + Highlight s&yntax by default Zvýrazňovat s&yntaxi už ve výchozím stavu - + Dark c&olor scheme Tmavý m&otiv vzhledu - + Background color value: Barevná hodnota pozadí: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - Toto není úplná oprava, ale -zabraňuje otravným poskočením -při posouvání. - - - - Workaround for &Qt5's scroll jump bug - Obejití problému s poskakujícím posouváním v &Qt5 - - This only includes executable files written in script languages like Shell and Python. @@ -1750,19 +1818,19 @@ ve skriptovacích jazycích jako Shell a Python. Pokud je zaškrtnuto a otevřený soubor je spustitelný, -pak bude kliknutím na tlačítko (které se dle potřeby +pak bude spuštěn klepnutím na tlačítko (které se dle potřeby objeví v liště nástrojů/soubor) nebo klávesovou zkratkou Ctrl+E. Vynutit ukončení procesu je možné pomocí Ctrl+Alt+E. - + Needs window reopening to take effect. Aby se projevilo, je třeba okno zavřít a znovu otevřít. - - + + The color value of the background. 255 means white while 0 means black. @@ -1800,8 +1868,8 @@ Změna se projeví až po restartu aplikace. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1816,22 +1884,22 @@ MMM dd, rrrr, hh:mm:ss - + Text tab size: Velikost panelu s textem: - + spaces mezery - + Thick text cursor Tlustý textový kurzor - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? Pokud se kurzor nachází v textovém pohledu, @@ -1859,7 +1927,7 @@ - + Add dictionary... Přidat slovník… @@ -1928,119 +1996,242 @@ Nepovolit otevírání netextových souborů - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + Ve výchozím stavu, když jsou soubory kopírovány +budou otevřeny pokud byly vloženy do FeatherPad. + + + + Paste paths instead of files + Vkládat popisy umístění namísto souborů + + + Shortcuts Klávesové zkratky - + Action Akce - + Shortcut Klávesová zkratka - + Restore default shortcuts. Obnovit výchozí zkratky. - + + + Default Výchozí - + + Syntax Colors + Barvy syntaxe + + + + Element + Prvek + + + + Text Color + Barva textu + + + + Whitespace color value: + Hodnota barvy prázdného znaku: + + + + + Has effect only if line numbers are shown. + Má efekt pouze pokud jsou zobrazeny čísla řádků. + + + + Current line highlight value: + Stávající hodnota zvýraznění řádku: + + + + Restore default syntax colors. + Vrátit barvy syntaxe na výchozí hodnoty. + + + Close Zavřít - - + + Press a modifier key to clear a shortcut +in the editing mode. + Pro vyčištění zkratky stiskněte klávesu +modifikátor v režimu úpravy. + + + + Double click a color to change it. + Barvu změníte dvojklepnutím na ni. + + + + files soubory - - + + file soubor - - + + Warning: Ambiguous shortcut detected! Varování: zjištěna opakující se zkratka! - + + Functions, URLs,… + Funkce, URL adresy, … + + + + Built-in Functions + Vestavěné funkce + + + + Comments + Komentáře + + + + Quotations + Citace + + + + Types + Typy + + + + Key Words + Klíčová slova + + + + Numbers + Číslice + + + + Regular Expressions, Code Blocks,… + Regulární výrazy, bloky kódu, … + + + + Document Blocks, XML/HTML Elements,… + Bloky dokumentu, XML/HTML prvky, … + + + + Markdown Headings, CSS Values,… + Záhlaví markdown, CSS hodnoty, … + + + + Extra Elements + Další prvky + + + Application restart is needed for changes to take effect. Aby se změny projevily, je třeba aplikaci restartovat. - + Window reopening is needed for changes to take effect. Aby se změny projevily, je třeba okno zavřít a otevřít znovu. - + &Recently Opened &Nedávno otevřené - + Recently &Modified Nedávno z&měněné - + The typed shortcut was reserved. Zadaná klávesová zkratka je vyhrazena pro něco jiného. - + Hunspell Dictionary Files (*.dic) Soubory hunspell slovníků (*.dic) + + + + Select Syntax Color + Vybrat barvu syntaxe + FeatherPad::SearchBar - - + + Search... Hledat… - + Match Case Rozlišovat malá/VELKÁ písmena - + Whole Word Celé slovo - + Regular Expression Regulární výraz - + Search with regex... Hledat pomocí regulárního výrazu… - + Next Další - + Previous Předchozí @@ -2110,7 +2301,7 @@ - + &Yes &Ano @@ -2150,42 +2341,42 @@ Zadejte název pro uložení relace - + Nothing saved.<br>No file was opened. Nic neuloženo.<br>Nebyl otevřený žádný soubor. - + No file exists or can be opened. Neexistuje žádný soubor nebo nemůže být otevřen. - + Not all files exist or can be opened. Ne všechny soubory existují nebo nemohou být otevřeny. - + &OK - + Do you really want to remove all saved sessions? Opravdu chcete odebrat veškeré uložené relace? - + Do you really want to remove the selected sessions? Opravdu chcete odebrat veškeré označené relace? - + Do you really want to remove the selected session? Opravdu chcete označené relace odebrat? - + A session with the same name exists.<br>Do you want to overwrite it? Relace s tímto názvem už existuje.<br>Chcete ji přepsat? @@ -2193,7 +2384,7 @@ FeatherPad::SidePane - + Filter... Filtrovat… @@ -2239,18 +2430,9 @@ FeatherPad::TextEdit - + Double click to center current line - Dvojklikem stávající řádek vystředíte - - - - FeatherPad::WarningBar - - - - Close - Zavřít + Dvojklepnutím stávající řádek vystředíte diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_cy.ts featherpad-0.17.1/featherpad/data/translations/featherpad_cy.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_cy.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_cy.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled @@ -53,514 +55,525 @@ - + &Edit - + &Options - - - + + + Encoding - + &Search - - + + &Help - + Find: - + To be replaced - + Replace with: - + Replacing text - + &New - + New tab - + Ctrl+N - + &Open - + Open a file - + Ctrl+O - - + + &Save - + Save the current tab - + Ctrl+S - + &Undo - + Undo - + Ctrl+Z - + &Redo - + Redo - + Ctrl+Shift+Z - + Reload - + Ctrl+Shift+R - + &Find - + Ctrl+F - + Show/hide replacement dock - + Ctrl+R - + Save &As - + Ctrl+Shift+S - + &Print - + Ctrl+P - + Documen&t Properties - + Ctrl+Shift+D - + &Close - + Ctrl+Shift+Q - + &Quit - + Ctrl+Q - + &Cut - + Ctrl+X - + C&opy - + Ctrl+C - + &Paste - + Ctrl+V - + &Delete - + &Select All - + Ctrl+A - + &Font - + &Line Numbers - + Ctrl+L - + &Wrap Lines - + Ctrl+W - + &Auto-Indentation - + Ctrl+I - + &Syntax Highlighting - + Ctrl+Shift+H - + &Preferences - + Ctrl+Shift+P - + Ctrl+H - + &About - + Enforce UTF-8 - + Save with &Encoding - + &Jump to - + Show/hide jump bar - + Ctrl+J - + Edit text - + Ctrl+Shift+E - + &Run - + Ctrl+E - + &Clear - + Clear the list of recently modified files - + Save/Restore Session - + Sa&ve/Restore Session - + Ctrl+M - + Side-Pane - + Ctrl+Alt+P - + Paste Date and Time - + Ctrl+Shift+V - + To Upper Case - + Ctrl+Shift+U - + To Lower Case - + Ctrl+Shift+L + To Start Case + + + + + Last Active Tab - + F1 - - + + Sort Lines - - + + Sort Lines Reversely - + Check Spelling - + F2 - - + + Save All Files - - + + User Dictionary - + + Text Tabs to Spaces + + + + &Detach Tab - + Ctrl+T - + Close Ne&xt Tabs - + Close &Previous Tabs - + Ne&xt Tab - + Previous Ta&b - + Execute - + Close &All Tabs @@ -570,612 +583,663 @@ - + &Encoding - + &Unicode - + &Western European - + &East European - + Ea&st Asian - - + + - - Rep&lacement + + Replacement - + Focus/hide search bar - + &Replace - + Windows Arabic (&CP1256) - + &Other - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) - + Cyrillic (&KOI8-U) - + Cyrillic (&ISO-8859-5) - + &Chinese (BIG5) - + Chinese (&GB18030) - + &Japanese (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) - + Ja&panese (CP932) - + Japa&nese (EUC-JP) - + &Korean (CP949) - + K&orean (CP1361) - + Korean (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs - + &Copy File Name - + Copy File &Path - + Alt+Right - + Alt+Left - + &First Tab - + Alt+Down - + &Last Tab - + Alt+Up - + Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) - + Next - + Previous - + Replace all - + &Recently Opened - + Close - + Save changes? - + Please attend to that window or just close its dialog! - + The document has been modified. - + &Discard changes - + &Cancel - + &No to all - - + + Unsaved - - - - - - - - - + + + + + + + + + Lines - - - + + + Sel. Chars - - - + + + Words - + Another process is running in this tab! - + Script File - + Another FeatherPad window has a modal dialog! - - + + Position: - - - + + + Normal - - - + + + The file does not exist. - + Open Link - + Copy Link - + Only one process is allowed per tab. - + Script Output - + Clear - + FeatherPad does not open files larger than 100 MiB. - + Non-text file(s) not opened! - + See Preferences → Files → Do not permit opening of non-text files - + Some file(s) could not be opened! - + You may not have the permission to read. - + Uneditable file(s)! - + Non-text files or files with huge lines cannot be edited. - + A previous crash detected! - + Preferably, close all FeatherPad windows and start again! - + Root Instance - - - + + + All Files (*) - + All Files (*);;.%1 Files (*.%1) - + Open file... - + .%1 Files (*.%1);;All Files (*) - - + + Save as... - + Keep encoding and save as... - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes - + No - + Cancel - + Do you want to use <b>MS Windows</b> end-of-lines? - + This may be good for readability under MS Windows. - + + + + Cannot be saved! - - - + + + + + Help - - - - - - - + + + + + + + Syntax - + Huge file(s) not opened! - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! - - + + Please be careful about reloading or saving this document! - + + Printing in progress... + + + + Print Document - - + + Printing completed. + + + + + %1 Pages - - + + Copy Target Path - - + + Open Target Here - + + + Open Containing Folder + + + + You need to add a Hunspell dictionary. - - - + + + See Preferences → Text → Spell Checking! - + The Hunspell dictionary does not exist. - + The Hunspell dictionary is not accompanied by an affix file. - - - + + + No misspelling in document. - - - + + + No misspelling from text cursor. - + Spell Checking - + Some files cannot be saved! - + Translators - + A lightweight, tabbed, plain-text editor - - based on Qt5 + + based on Qt - + Author - + aka. - - + + About FeatherPad - + No Replacement - + One Replacement - + %Ln Replacements @@ -1186,7 +1250,12 @@ - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. @@ -1497,72 +1566,83 @@ - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > - + This creates a menu button on the status bar for changing the syntax. - + Support syntax override - + Show spaces, tabs and tab lines when the syntax is highlighted. - + Show whitespaces - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). - + Show vertical lines starting from this position: - + Also show line and document ends - + Date and time format: - + Some text editors cannot open a document whose last line is not empty. - + Ensure an empty last line on saving - + Remove trailing spaces on saving - + Inertial scrolling with mouse wheel @@ -1622,7 +1702,7 @@ - + Help @@ -1670,37 +1750,26 @@ - + Highlight s&yntax by default - + Dark c&olor scheme - + Background color value: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - - - - - Workaround for &Qt5's scroll jump bug - - - This only includes executable files written in script languages like Shell and Python. @@ -1713,13 +1782,13 @@ - + Needs window reopening to take effect. - - + + The color value of the background. 255 means white while 0 means black. @@ -1746,8 +1815,8 @@ - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1757,22 +1826,22 @@ - + Text tab size: - + spaces - + Thick text cursor - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? @@ -1797,7 +1866,7 @@ - + Add dictionary... @@ -1859,119 +1928,240 @@ - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts - + Action - + Shortcut - + Restore default shortcuts. - + + + Default - + + Syntax Colors + + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + Close - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + + + + + files - - + + file - - + + Warning: Ambiguous shortcut detected! - + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + Application restart is needed for changes to take effect. - + Window reopening is needed for changes to take effect. - + &Recently Opened - + Recently &Modified - + The typed shortcut was reserved. - + Hunspell Dictionary Files (*.dic) + + + + Select Syntax Color + + FeatherPad::SearchBar - - + + Search... - + Match Case - + Whole Word - + Regular Expression - + Search with regex... - + Next - + Previous @@ -2040,7 +2230,7 @@ - + &Yes @@ -2080,42 +2270,42 @@ - + Nothing saved.<br>No file was opened. - + No file exists or can be opened. - + Not all files exist or can be opened. - + &OK - + Do you really want to remove all saved sessions? - + Do you really want to remove the selected sessions? - + Do you really want to remove the selected session? - + A session with the same name exists.<br>Do you want to overwrite it? @@ -2123,7 +2313,7 @@ FeatherPad::SidePane - + Filter... @@ -2169,18 +2359,9 @@ FeatherPad::TextEdit - + Double click to center current line - - FeatherPad::WarningBar - - - - Close - - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_da.ts featherpad-0.17.1/featherpad/data/translations/featherpad_da.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_da.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_da.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Licens @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Unavngivet @@ -54,514 +56,525 @@ - + &Edit &Rediger - + &Options &Valgmuligheder - - - + + + Encoding Kodning - + &Search &Søg - - + + &Help &Hjælp - + Find: Find: - + To be replaced Som skal erstattes - + Replace with: Erstat med: - + Replacing text Erstatter tekst - + &New &Nyt - + New tab Nyt faneblad - + Ctrl+N Ctrl+N - + &Open &Åbn - + Open a file Åbn en fil - + Ctrl+O Ctrl+O - - + + &Save &Gem - + Save the current tab Gem det nuværende faneblad - + Ctrl+S Ctrl+S - + &Undo &Fortryd - + Undo Fortryd - + Ctrl+Z Ctrl+Z - + &Redo &Omgør - + Redo Omgør - + Ctrl+Shift+Z Ctrl+Skift+Z - + Reload Genindlæs - + Ctrl+Shift+R Ctrl+Skift+R - + &Find &Find - + Ctrl+F Ctrl+F - + Show/hide replacement dock Vis/skjul erstatningsdok - + Ctrl+R Ctrl+R - + Save &As Gem &som - + Ctrl+Shift+S Ctrl+Skift+S - + &Print &Udskriv - + Ctrl+P Ctrl+P - + Documen&t Properties Dokument&egenskaber - + Ctrl+Shift+D Ctrl+Skift+D - + &Close &Luk - + Ctrl+Shift+Q Ctrl+Skift+Q - + &Quit &Afslut - + Ctrl+Q Ctrl+Q - + &Cut &Klip - + Ctrl+X Ctrl+X - + C&opy &Kopiér - + Ctrl+C Ctrl+C - + &Paste &Indsæt - + Ctrl+V Ctrl+V - + &Delete &Slet - + &Select All &Vælg alt - + Ctrl+A Ctrl+A - + &Font &Skrifttype - + &Line Numbers &Linjenumre - + Ctrl+L Ctrl+L - + &Wrap Lines &Ombryd linjer - + Ctrl+W Ctrl+W - + &Auto-Indentation &Automatisk indrykning - + Ctrl+I Ctrl+I - + &Syntax Highlighting &Syntaksfremhævning - + Ctrl+Shift+H Ctrl+Skift+H - + &Preferences &Præferencer - + Ctrl+Shift+P Ctrl+Skift+P - + Ctrl+H Ctrl+H - + &About &Om - + Enforce UTF-8 Tving UTF-8 - + Save with &Encoding Gem med &kodning - + &Jump to &Hop til - + Show/hide jump bar Vis/skjul hoplinje - + Ctrl+J Ctrl+J - + Edit text Rediger tekst - + Ctrl+Shift+E Ctrl+Skift+E - + &Run &Kør - + Ctrl+E Ctrl+E - + &Clear &Ryd - + Clear the list of recently modified files Ryd listen over seneste ændrede filer - + Save/Restore Session Gem/gendan session - + Sa&ve/Restore Session &Gem/gendan session - + Ctrl+M Ctrl+M - + Side-Pane Siderude - + Ctrl+Alt+P Ctrl+Alt+P - + Paste Date and Time Indsæt dato og klokkeslæt - + Ctrl+Shift+V Ctrl+Skift+V - + To Upper Case Store bogstaver - + Ctrl+Shift+U Ctrl+Skift+U - + To Lower Case Til små bogstaver - + Ctrl+Shift+L Ctrl+Skift+L + To Start Case + Til stort begyndelsesbogstav + + + + Last Active Tab Sidste aktive faneblad - + F1 F1 - - + + Sort Lines Sortér linjer - - + + Sort Lines Reversely Sortér linjer rekursivt - + Check Spelling Stavekontrol - + F2 F2 - - + + Save All Files Gem alle filer - - + + User Dictionary Brugerordbog - + + Text Tabs to Spaces + Tekstens tabulatorer til mellemrum + + + &Detach Tab &Løsriv faneblad - + Ctrl+T Ctrl+T - + Close Ne&xt Tabs Luk &næste faneblade - + Close &Previous Tabs Luk &forrige faneblade - + Ne&xt Tab &Næste faneblad - + Previous Ta&b &Forrige faneblad - + Execute Eksekver - + Close &All Tabs Luk &alle faneblade @@ -571,613 +584,664 @@ Seneste &ændrede - + &Encoding &Kodning - + &Unicode &Unicode - + &Western European &Vesteuropæisk - + &East European &Østeuropæisk - + Ea&st Asian &Østasiatisk - - + + - - Rep&lacement - &Erstatning + + Replacement + Erstatning - + Focus/hide search bar Fokuser/skjul søgelinje - + &Replace &Erstat - + Windows Arabic (&CP1256) Windows arabisk (&CP1256) - + &Other &Andet - + &UTF-8 &UTF-8 - + UTF-&16 UTF-&16 - + &ISO-8859-1 &ISO-8859-1 - + &Windows-1252 &Windows-1252 - + &Cyrillic (CP1251) &Kyrillisk (CP1251) - + Cyrillic (&KOI8-U) Kyrillisk (&KOI8-U) - + Cyrillic (&ISO-8859-5) Kyrillisk (&ISO-8859-5) - + &Chinese (BIG5) &Kinesisk (BIG5) - + Chinese (&GB18030) Kinesisk (&GB18030) - + &Japanese (ISO-2022-JP) &Japansk (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Japansk (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Japansk (ISO-&2022-KR) - + Ja&panese (CP932) Ja&pansk (CP932) - + Japa&nese (EUC-JP) Japa&nsk (EUC-JP) - + &Korean (CP949) &Koreansk (CP949) - + K&orean (CP1361) K&oreansk (CP1361) - + Korean (&EUC-KR) Koreansk (&EUC-KR) - + ISO-&8859-15 ISO-&8859-15 - + Close &Other Tabs Luk &andre faneblade - + &Copy File Name &Kopiér filnavn - + Copy File &Path Kopiér fil&sti - + Alt+Right Alt+Højre - + Alt+Left Alt+Venstre - + &First Tab &Første faneblad - + Alt+Down Alt+Ned - + &Last Tab &Sidste faneblad - + Alt+Up Alt+Op - + Menu Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) Udregn antal ord -(dette kan være CPU-intensivt, når der er meget tekst). +(dette kan være CPU-intensivt, når der er meget tekst.) - + Next Næste - + Previous Forrige - + Replace all Erstat alle - + &Recently Opened &Seneste åbnede - + Close Luk - + Save changes? Gem ændringer? - + Please attend to that window or just close its dialog! Tag dig venligst at det vindue eller luk dets dialog! - + The document has been modified. Dokumentet er blevet ændret. - + &Discard changes &Forkast ændringer - + &Cancel &Annuller - + &No to all &Nej til alle - - + + Unsaved Ugemt - - - - - - - - - + + + + + + + + + Lines Linjer - - - + + + Sel. Chars Vælg tegn - - - + + + Words Ord - + Another process is running in this tab! En anden proces kører i dette faneblad! - + Script File Script-fil - + Another FeatherPad window has a modal dialog! Et andet FeatherPad-vindue har en modal dialog! - - + + Position: Placering: - - - + + + Normal Normal - - - + + + The file does not exist. Filen findes ikke. - + Open Link Åbn link - + Copy Link Kopiér link - + Only one process is allowed per tab. Kun en proces pr. faneblad er tilladt. - + Script Output Script-output - + Clear Ryd - + FeatherPad does not open files larger than 100 MiB. FeatherPad åbner ikke filer større end 100 MiB. - + Non-text file(s) not opened! - + Fil(er) som ikke er tekst blev ikke åbnet! - + See Preferences → Files → Do not permit opening of non-text files - + Se Præferencer → Filer → Tillad ikke åbning af filer som ikke er tekst - + Some file(s) could not be opened! Nogle fil(er) kunne ikke åbnes! - + You may not have the permission to read. Du har måske ikke tilladelsen til at læse. - + Uneditable file(s)! Ikke-redigerbar fil(er)! - + Non-text files or files with huge lines cannot be edited. Filer som ikke er tekst, eller filer med kæmpe linjer kan ikke redigeres. - + A previous crash detected! Et tidligere nedbrud er registreret! - + Preferably, close all FeatherPad windows and start again! Luk helst alle FeatherPad-vinduer og start igen! - + Root Instance Root-instans - - - + + + All Files (*) Alle filer (*) - + All Files (*);;.%1 Files (*.%1) Alle filer (*);;.%1 filer (*.%1) - + Open file... Åbn fil... - + .%1 Files (*.%1);;All Files (*) .%1 filer (*.%1);;Alle filer (*) - - + + Save as... Gem som... - + Keep encoding and save as... Bevar kodning og gem som... - + + Saving as root. + Gemmer som root. + + + + Waiting for authentication... + Venter på godkendelse ... + + + + "pkexec" is not found. Please install Polkit! + "pkexec" blev ikke fundet. Installer venligst Polkit! + + + Yes Ja - + No Nej - + Cancel Annuller - + Do you want to use <b>MS Windows</b> end-of-lines? Vil du bruge <b>MS Windows</b>-linjeskift? - + This may be good for readability under MS Windows. Det kan være godt for læsbarheden i MS Windows. - + + + + Cannot be saved! Kan ikke gemmes! - - - + + + + + Help Hjælp - - - - - - - + + + + + + + Syntax Syntaks - + Huge file(s) not opened! Kæmpe fil(er) ikke åbnet! - - + + Text tabs are converted to spaces. + Tekstens tabulatorer konverteres til mellemrum. + + + + The selected text was too long. + Den valgte tekst er for lang. + + + + It is not fully processed. + Den er ikke behandlet færdigt. + + + + This file has been modified elsewhere or in another way! Filen er blevet ændret et andet sted eller på en anden måde! - - + + Please be careful about reloading or saving this document! Pas venligst på med at genindlæse eller gemme dokumentet! - + + Printing in progress... + Igangværende udskrivning ... + + + Print Document Udskriv dokument - - + + Printing completed. + Udskrivning udført. + + + + %1 Pages %1 sider - - + + Copy Target Path Kopiér målsti - - + + Open Target Here Åbn mål her - + + + Open Containing Folder + Åbn indeholdende mappe + + + You need to add a Hunspell dictionary. Du skal tilføje en Hunspell-orgbog. - - - + + + See Preferences → Text → Spell Checking! Se Præferencer → Tekst → Stavekontrol! - + The Hunspell dictionary does not exist. Hunspell-ordbogen findes ikke. - + The Hunspell dictionary is not accompanied by an affix file. Der medfølger ikke en affix-fil til Hunspell-ordbogen. - - - + + + No misspelling in document. Ingen stavefejl i dokumentet. - - - + + + No misspelling from text cursor. Ingen stavefejl fra tekstmarkøren. - + Spell Checking Stavekontrol - + Some files cannot be saved! Nogle filer kan ikke gemmes! - + Translators Oversættere - + A lightweight, tabbed, plain-text editor Et letvægts tekstredigeringsprogram med faneblade - - based on Qt5 - baseret på Qt5 + + based on Qt + baseret på Qt - + Author Forfatter - + aka. også kendt som - - + + About FeatherPad Om FeatherPad - + No Replacement Ingen erstatning - + One Replacement En erstatning - + %Ln Replacements %Ln erstatning @@ -1185,7 +1249,12 @@ - + + The first 1000 replacements are highlighted. + De første 1000 erstatninger er fremhævet. + + + The size limit for syntax highlighting is exceeded. Størrelsesbegrænsningen for syntaksfremhævning er oversteget. @@ -1512,76 +1581,88 @@ Erstat tredobbelte punktummer og dobbelte bindestrenger mens der skrives - + + Highlight case-sensitive and whole matches +of the selected text. + Fremhæv versalfølsomme og hele resultater +i den valgte tekst. + + + + Selection highlighting + Fremhævning af markering + + + Never highlight syntax for files > Fremhæv aldrig syntaks for filer > - + This creates a menu button on the status bar for changing the syntax. Det opretter en menuknap på statuslinjen til at skifte syntaksen. - + Support syntax override Understøt tilsidesættelse af syntaks - + Show spaces, tabs and tab lines when the syntax is highlighted. Vis mellemrum, tabulatorer og linjeskift når syntaksen er fremhævet. - + Show whitespaces Vis blanktegn - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). De lodrette placeringslinjer tegnes ku hvis editorens skrifttype har en fast tegnbredde (såsom Monospace). - + Show vertical lines starting from this position: Vis lodrette linjer startende fra denne placering: - + Also show line and document ends Vis også linje- og dokumentslutninger - + Date and time format: Dato- og klokkeslætformat: - + Some text editors cannot open a document whose last line is not empty. Nogle tekstredigeringsprogrammer kan ikke åbne et dokument hvor den sidste linje ikke er tom. - + Ensure an empty last line on saving Sørg for en tom linje til sidst når der gemmes - + Remove trailing spaces on saving Fjern efterstillede mellemrum når der gemmes - + Inertial scrolling with mouse wheel Inertisk rulning med musehjul @@ -1650,7 +1731,7 @@ Gem ændringer til åbnede filer hver: - + Help Hjælp @@ -1701,38 +1782,26 @@ Vis altid &linjenumre - + Highlight s&yntax by default Fremhæv &syntaks som standard - + Dark c&olor scheme Mørkt &farveskema - + Background color value: Baggrundens farveværdi: - + MiB MiB - - This is not a complete fix but -prevents annoying scroll jumps. - Dette er ikke en fuldstændig rette men -det forhindre irriterende rullehop. - - - - Workaround for &Qt5's scroll jump bug - Ret &Qt5's rullehop-fejl - - This only includes executable files written in script languages like Shell and Python. @@ -1752,13 +1821,13 @@ processen dræbes med Ctrl+Alt+E. - + Needs window reopening to take effect. Vinduet skal genåbnes før det træder i kraft. - - + + The color value of the background. 255 means white while 0 means black. @@ -1796,8 +1865,8 @@ Programmet skal genstartes før ændringerne træder i kraft. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1812,22 +1881,22 @@ MMM dd, åååå, tt:mm:ss - + Text tab size: Tabulatorstørrelse for tekst: - + spaces mellemrum - + Thick text cursor Fed tekstmarkør - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? Skal musehjulets rulning være inertisk @@ -1855,7 +1924,7 @@ - + Add dictionary... Tilføj ordbog ... @@ -1920,122 +1989,245 @@ Do not permit opening of non-text files - Tilladt ikke åbning af filer som ikke er tekstfiler + Tillad ikke åbning af filer som ikke er tekst + + + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + Som standard når filer kopieres, så +åbnes de hvis indsættes i FeatherPad. + + + + Paste paths instead of files + Indsæt stier frem for filer - + Shortcuts Genveje - + Action Handling - + Shortcut Genvej - + Restore default shortcuts. Gendan standardgenveje. - + + + Default Standard - + + Syntax Colors + Syntaksfarver + + + + Element + Element + + + + Text Color + Tekstfarve + + + + Whitespace color value: + Farveværdi for blanktegn: + + + + + Has effect only if line numbers are shown. + Bruges kun hvis der vises linjenumre. + + + + Current line highlight value: + Fremhævningsværdi for nuværende linje: + + + + Restore default syntax colors. + Gendan standardsyntaksfarver. + + + Close Luk - - + + Press a modifier key to clear a shortcut +in the editing mode. + Tryk på en ændringstast for at rydde en genvej +i redigeringstilstanden. + + + + Double click a color to change it. + Dobbeltklik på en farve for at ændre den. + + + + files filer - - + + file fil - - + + Warning: Ambiguous shortcut detected! Advarsel: Tvetydig genvej registreret! - + + Functions, URLs,… + Funktioner, URL'er … + + + + Built-in Functions + Indbyggede funktioner + + + + Comments + Kommentarer + + + + Quotations + Citater + + + + Types + Typer + + + + Key Words + Nøgleord + + + + Numbers + Tal + + + + Regular Expressions, Code Blocks,… + Regulære udtryk, kodeblokke … + + + + Document Blocks, XML/HTML Elements,… + Dokumentblokke, XML-/HTML-elementer … + + + + Markdown Headings, CSS Values,… + Markdown-headings, CSS-værdier … + + + + Extra Elements + Ekstra elementer + + + Application restart is needed for changes to take effect. Programmet skal genstartes før ændringerne træder i kraft. - + Window reopening is needed for changes to take effect. Vinduet skal genåbnes før ændringerne træder i kraft. - + &Recently Opened &Seneste åbnede - + Recently &Modified Seneste &ændrede - + The typed shortcut was reserved. Den indtastede genvej var reserveret. - + Hunspell Dictionary Files (*.dic) Hunspell-ordbogsfiler (*.dic) + + + + Select Syntax Color + Vælg syntaksfarve + FeatherPad::SearchBar - - + + Search... Søg... - + Match Case Forskel på store og små bogstaver - + Whole Word Hele ord - + Regular Expression Regulære udtryk - + Search with regex... Søg med regulære udtryk... - + Next Næste - + Previous Forrige @@ -2105,7 +2297,7 @@ - + &Yes &Ja @@ -2145,42 +2337,42 @@ Indtast et navn for at gemme sessionen - + Nothing saved.<br>No file was opened. Intet blev gemt.<br>Ingen fil var åbnet. - + No file exists or can be opened. Der findes ingen fil eller den kan ikke åbnes. - + Not all files exist or can be opened. Alle filerne findes ikke eller kan ikke åbnes. - + &OK &OK - + Do you really want to remove all saved sessions? Vil du virkelig fjerne alle gemte sessioner? - + Do you really want to remove the selected sessions? Vil du virkelig fjerne de valgte sessioner? - + Do you really want to remove the selected session? Vil du virkelig fjerne den valgte session? - + A session with the same name exists.<br>Do you want to overwrite it? Der findes allerede en session med det navn.<br>Vil du overskrive den? @@ -2188,7 +2380,7 @@ FeatherPad::SidePane - + Filter... Filter... @@ -2234,18 +2426,9 @@ FeatherPad::TextEdit - + Double click to center current line Dobbeltklik for at centrere nuværende linje - - FeatherPad::WarningBar - - - - Close - Luk - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_de.ts featherpad-0.17.1/featherpad/data/translations/featherpad_de.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_de.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_de.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Lizenz @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Unbenannt @@ -54,514 +56,525 @@ - + &Edit &Bearbeiten - + &Options &Optionen - - - + + + Encoding Kodierung - + &Search &Suchen - - + + &Help &Hilfe - + Find: Suchen: - + To be replaced Zu ersetzen - + Replace with: Ersetzen mit: - + Replacing text Ersetze Text - + &New &Neu - + New tab Neue Registerkarte - + Ctrl+N Strg+N - + &Open &Öffnen - + Open a file Datei öffnen - + Ctrl+O Strg+O - - + + &Save &Speichern - + Save the current tab Aktuelle Registerkarte speichern - + Ctrl+S Strg+S - + &Undo &Rückgängig - + Undo Rückgängig - + Ctrl+Z Strg+Z - + &Redo &Wiederholen - + Redo Wiederholen - + Ctrl+Shift+Z Strg+Umschalt+Z - + Reload Neu laden - + Ctrl+Shift+R Strg+Umschalt+R - + &Find &Suchen - + Ctrl+F Strg+F - + Show/hide replacement dock Dock zum Ersetzen ein/ausblenden - + Ctrl+R Strg+R - + Save &As Speichern &unter - + Ctrl+Shift+S Strg+Umschalt+S - + &Print &Drucken - + Ctrl+P Strg+P - + Documen&t Properties &Dokument Eigenschaften - + Ctrl+Shift+D Strg+Umschalt+D - + &Close &Schließen - + Ctrl+Shift+Q Strg+Umschalt+Q - + &Quit &Beenden - + Ctrl+Q Strg+Q - + &Cut &Auschneiden - + Ctrl+X Strg+X - + C&opy &Kopieren - + Ctrl+C Strg+C - + &Paste &Einfügen - + Ctrl+V Strg+V - + &Delete &Löschen - + &Select All Alles a&uswählen - + Ctrl+A Strg+A - + &Font &Schriftart - + &Line Numbers Zei&lennummern - + Ctrl+L Strg+L - + &Wrap Lines &Zeilenumbruch - + Ctrl+W Strg+W - + &Auto-Indentation &Auto-Einrückung - + Ctrl+I Strg+I - + &Syntax Highlighting Syntax-&Hervorhebung - + Ctrl+Shift+H Strg+Umschalt+H - + &Preferences &Einstellungen - + Ctrl+Shift+P Strg+Umschalt+P - + Ctrl+H Strg+H - + &About &Über - + Enforce UTF-8 Erzwinge UTF-8 - + Save with &Encoding Speichern mit &Kodierung - + &Jump to Springe &zu - + Show/hide jump bar Zeige/Verstecke Sprungleiste aus - + Ctrl+J Strg+J - + Edit text Text bearbeiten - + Ctrl+Shift+E Strg+Umschalt+E - + &Run &Starte - + Ctrl+E Strg+E - + &Clear &Zurücksetzen - + Clear the list of recently modified files Liste der kürzlich bearbeiteten Dateien zurücksetzen - + Save/Restore Session Sitzung Speichern/Wiederherstellen - + Sa&ve/Restore Session Sit&zung Speichern/Wiederherstellen - + Ctrl+M Strg+M - + Side-Pane S&eitenleiste - + Ctrl+Alt+P Strg+Alt+P - + Paste Date and Time Datum und Uhrzeit einfügen - + Ctrl+Shift+V Strg+Umschalt+V - + To Upper Case Zu Großbuchstaben - + Ctrl+Shift+U Strg+Umschalt+U - + To Lower Case Umwandeln in Kleinbuchstaben - + Ctrl+Shift+L Strg+Umschalt+L + To Start Case + + + + + Last Active Tab Letzte aktive Registerkarte - + F1 F1 - - + + Sort Lines Sortiere Zeilen - - + + Sort Lines Reversely Sortierreihenfolge umkehren - + Check Spelling Rechtschreibprüfung - + F2 F2 - - + + Save All Files Alle Dateien speichern - - + + User Dictionary Benutzerwörterbuch - + + Text Tabs to Spaces + Text-Tabulatoren zu Leerzeichen + + + &Detach Tab &Registerkarte abtrennen - + Ctrl+T Strg+T - + Close Ne&xt Tabs &Nächsten Tabs schließen - + Close &Previous Tabs Vorherigen Tabs &schließen - + Ne&xt Tab &Nächste Registerkarte - + Previous Ta&b &Vorherige Registekarte - + Execute Ausführen - + Close &All Tabs &Alle Tabs schliessen @@ -571,613 +584,664 @@ Kürzlich &bearbeitet - + &Encoding &Kodierung - + &Unicode &Unicode - + &Western European &Westeuropäisch - + &East European &Osteuropäisch - + Ea&st Asian Ost&asiatisch - - + + - - Rep&lacement - &Ersatz + + Replacement + Ersatz - + Focus/hide search bar Suchleiste fokussieren/verstecken - + &Replace &Ersetzen - + Windows Arabic (&CP1256) Windows Arabisch (&CP1256) - + &Other A&ndere - + &UTF-8 &UTF-8 - + UTF-&16 UTF-&16 - + &ISO-8859-1 &ISO-8859-1 - + &Windows-1252 &Windows-1252 - + &Cyrillic (CP1251) &Kyrillisch (CP1251) - + Cyrillic (&KOI8-U) Kyrillisch (&KOI8-U) - + Cyrillic (&ISO-8859-5) Kyrillisch (&ISO-8859-5) - + &Chinese (BIG5) &Chinesisch (BIG5) - + Chinese (&GB18030) Chinesisch (&GB18030) - + &Japanese (ISO-2022-JP) &Japanisch (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Japanisch (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Japanisch (ISO-&2022-KR) - + Ja&panese (CP932) Ja&panisch (CP932) - + Japa&nese (EUC-JP) Japa&nisch (EUC-JP) - + &Korean (CP949) &Koreanisch (CP949) - + K&orean (CP1361) K&oreanisch (CP1361) - + Korean (&EUC-KR) Koreanisch (&EUC-KR) - + ISO-&8859-15 ISO-&8859-15 - + Close &Other Tabs &Andere Tabs schließen - + &Copy File Name &Kopiere Dateinamen - + Copy File &Path Kopiere Datei&pfad - + Alt+Right Alt+Rechts - + Alt+Left Alt+Links - + &First Tab &Erste Registerkarte - + Alt+Down Alt+Runter - + &Last Tab &Letzte Registerkarte - + Alt+Up Alt+Hoch - + Menu Menü - + Calculate number of words (For huge texts, this may be CPU-intensive.) Berechne Anzahl der Worte (Für große Texte kann das CPU-intensiv sein.) - + Next Nächste - + Previous Vorherige - + Replace all Alles ersetzen - + &Recently Opened &Kürzlich geöffnet - + Close Schließen - + Save changes? Änderungen speichern? - + Please attend to that window or just close its dialog! Bitte dieses Fenster beachten oder Dialog schließen! - + The document has been modified. Das Dokument wurde verändert. - + &Discard changes Änderungen &verwerfen - + &Cancel &Abbrechen - + &No to all &Nein zu Allem - - + + Unsaved Nicht gespeichert - - - - - - - - - + + + + + + + + + Lines Zeilen - - - + + + Sel. Chars Markierte Zeichen - - - + + + Words Worte - + Another process is running in this tab! Ein weiterer Prozess läuft in dieser Registerkarte! - + Script File Skript - + Another FeatherPad window has a modal dialog! Ein anderes FeatherPad-Fenster hat einen modalen Dialog! - - + + Position: Position: - - - + + + Normal Normal - - - + + + The file does not exist. Die Datei existiert nicht. - + Open Link Link öffnen - + Copy Link Link kopieren - + Only one process is allowed per tab. Nur ein Prozess pro Registerkarte erlaubt. - + Script Output Ausgabe des Skripts - + Clear Zurücksetzen - + FeatherPad does not open files larger than 100 MiB. FeatherPad öffnet keine Dateien die grösser sind als 100MiB. - + Non-text file(s) not opened! Nicht-Text-Datei(en) nicht geöffnet! - + See Preferences → Files → Do not permit opening of non-text files Siehe Einstellungen → Dateien → Öffnen von Nicht-Text-Dateien nicht zulassen - + Some file(s) could not be opened! Einige Datei(en) konnte(n) nicht geöffnet werden! - + You may not have the permission to read. Möglicherweise keine Leseberechtigung. - + Uneditable file(s)! Unbearbeitbare(n) Datei(en)! - + Non-text files or files with huge lines cannot be edited. Nicht-Text Dateien oder Dateien mit sehr langen Zeilen können nicht bearbeitet werden. - + A previous crash detected! Einen vorherigen Absturz wurde erkannt! - + Preferably, close all FeatherPad windows and start again! Bitte alle FeatherPad-Fenster schliessen und neu starten! - + Root Instance - Wurzelinstanz + Instanz mit Administratorrechten - - - + + + All Files (*) Alle Dateien (*) - + All Files (*);;.%1 Files (*.%1) Alle Dateien (*);;.%1 Dateien (*.%1) - + Open file... Öffne Datei... - + .%1 Files (*.%1);;All Files (*) .%1 Dateien (*.%1);;Alle Dateien (*) - - + + Save as... Speichern unter... - + Keep encoding and save as... Kodierung behalten und speichern als... - + + Saving as root. + Als root speichern. + + + + Waiting for authentication... + Warten auf Authentifizierung ... + + + + "pkexec" is not found. Please install Polkit! + + + + Yes Ja - + No Nein - + Cancel Abbrechen - + Do you want to use <b>MS Windows</b> end-of-lines? Sollen <b>MS Windows</b> Zeilenenden benutzt werden? - + This may be good for readability under MS Windows. Das könnte für die Lesbarkeit unter MS Windows gut sein. - + + + + Cannot be saved! Konnte nicht gespeichert werden! - - - + + + + + Help Hilfe - - - - - - - + + + + + + + Syntax Syntax - + Huge file(s) not opened! Große Datei(en) nicht geöffnet! - - + + Text tabs are converted to spaces. + Text-Tabulatoren werden in Leerzeichen umgewandelt. + + + + The selected text was too long. + Der ausgewählte Text war zu lang. + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! Diese Datei wurde anderswo oder in einer anderen Weise verändert! - - + + Please be careful about reloading or saving this document! Vorsicht beim Aktualisieren oder Speichern dieses Dokumentes! - + + Printing in progress... + Druckvorgang läuft ... + + + Print Document Dokument drucken - - + + Printing completed. + Druckvorgang abgeschlossen. + + + + %1 Pages %1 Seiten - - + + Copy Target Path Zielpfad kopieren - - + + Open Target Here Ziel hier öffnen - + + + Open Containing Folder + Enthaltenden Ordner öffnen + + + You need to add a Hunspell dictionary. Sie müssen ein Hunspell-Wörterbuch hinzufügen. - - - + + + See Preferences → Text → Spell Checking! Siehe Einstellungen → Text → Rechtschreibprüfung! - + The Hunspell dictionary does not exist. Das Hunspell-Wörterbuch existiert nicht. - + The Hunspell dictionary is not accompanied by an affix file. Das Hunspell-Wörterbuch wird nicht von einer Zusatzdatei begleitet. - - - + + + No misspelling in document. Keine Rechtschreibfehler im Dokument. - - - + + + No misspelling from text cursor. Keine Rechtschreibfehler vom Textcursor. - + Spell Checking Rechtschreibprüfung - + Some files cannot be saved! Einige Dateien können nicht gespeichert werden! - + Translators Übersetzer - + A lightweight, tabbed, plain-text editor Ein leichtgewichtiger Texteditor - - based on Qt5 - basierend auf Qt5 + + based on Qt + basierend auf Qt - + Author Autor - + aka. aka. - - + + About FeatherPad Über FeatherPad - + No Replacement Keine Ersetzung - + One Replacement Eine Ersetzung - + %Ln Replacements %Ln Ersetzung @@ -1185,7 +1249,12 @@ - + + The first 1000 replacements are highlighted. + Die ersten 1000 Ersetzungen sind hervorgehoben. + + + The size limit for syntax highlighting is exceeded. Das Größenlimit für die Syntaxhervorhebung ist überschritten. @@ -1514,76 +1583,87 @@ Ersetzen Sie beim Tippen dreifache Punkte und doppelte Bindestriche - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > Keine Syntax-Hervorhebung für Dateien > - + This creates a menu button on the status bar for changing the syntax. Erstelle einen Menü Knopf auf der Statusleiste zum Ändern der Syntax. - + Support syntax override Freie Wahl der Syntax-Hervorhebung - + Show spaces, tabs and tab lines when the syntax is highlighted. Anzeigen von Leerzeichen, Tabulatoren und Einrückungslinien wenn die Syntax-Erweiterung aktiv ist. - + Show whitespaces Zeige Leerzeichen, Tabulatoren und Einrückungslinien - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). Die vertikalen Positionslinien werden nur mit Editor-Schriftarten mit einem festen Abstand (wie Monospace) gezeichnet. - + Show vertical lines starting from this position: Anzeigen von vertikalen Linien ab dieser Position: - + Also show line and document ends Auch Zeilen- und Dokumentende anzeigen - + Date and time format: Datum- und Zeitformat: - + Some text editors cannot open a document whose last line is not empty. Manchet Texteditoren können keine Dokumente öffnen, deren letzte Zeile nicht leer ist. - + Ensure an empty last line on saving Leerzeile am Textende bei Speicherung garantieren - + Remove trailing spaces on saving Entfernen von nachgestellten Leerzeichen beim Speichern - + Inertial scrolling with mouse wheel Träge Abrollfunktion mit Mausrad @@ -1616,10 +1696,10 @@ emulator, the output and error messages will be shown by a popup dialog. Das kann ein beliebiger Startbefehl mit -Argumenten sein, zum Beispiel; "xterm -hold" +Argumenten sein, zum Beispiel; "xterm -hold" um den Prozess in XTerm laufen zu lassen. -Wenn der Befehlt leer gelassen wird, wird die Datei +Wenn der Befehl leer gelassen wird, wird die Datei direkt ausgeführt. Wenn das Script nicht in einem Terminalemulator @@ -1652,7 +1732,7 @@ Änderungen geöffneter Dateien speichern alle: - + Help Hilfe @@ -1703,38 +1783,26 @@ Immer &Zeilennummern anzeigen - + Highlight s&yntax by default Automatische &Syntax-Hervorhebung - + Dark c&olor scheme Dunkles &Farbschema - + Background color value: Hintergrundfarbe Wert: - + MiB MiB - - This is not a complete fix but -prevents annoying scroll jumps. - Das ist keine vollständige Reparatur aber -es verhindert störende Sprünge beim Scrollen. - - - - Workaround for &Qt5's scroll jump bug - Umgehung für &Qt5's Scroll Sprung Fehler - - This only includes executable files written in script languages like Shell and Python. @@ -1755,13 +1823,13 @@ Der Prozess kann mit Strg+Alt+E beendet werden. - + Needs window reopening to take effect. Neustart des Fensters notwendig, um wirksam zu werden. - - + + The color value of the background. 255 means white while 0 means black. @@ -1797,8 +1865,8 @@ Standard ist 10. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1813,22 +1881,22 @@ MMM dd, yyyy, hh:mm:ss - + Text tab size: Tabulatorgröße: - + spaces Leerzeichen - + Thick text cursor Fetter Textcursor - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? Sollte die Abrollfunktion des Mausrads träge sein, @@ -1856,7 +1924,7 @@ - + Add dictionary... Wörterbuch &hinzufügen ... @@ -1925,119 +1993,240 @@ Öffnen von Nicht-Text-Dateien nicht zulassen - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts Tastatur-Kurzbefehle - + Action Aktion - + Shortcut Tastatur-Kurzbefehl - + Restore default shortcuts. Ursprüngliche Kurzbefehle wiederherstellen. - + + + Default Standard - + + Syntax Colors + + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + Close Schließen - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + + + + + files Dateien - - + + file Datei - - + + Warning: Ambiguous shortcut detected! Warnung: Mehrdeutiger Tastatur-Kurzbefehl erkannt! - + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + Application restart is needed for changes to take effect. Neustart der Anwendung, notwendig um wirksam zu werden. - + Window reopening is needed for changes to take effect. Neustart des Fensters notwendig, um wirksam zu werden. - + &Recently Opened &Kürzlich geöffnete - + Recently &Modified Kürzlich &bearbeitete - + The typed shortcut was reserved. Der eingegebene Tastatur-Kurzbefehl war reserviert. - + Hunspell Dictionary Files (*.dic) - Hunspell Wörterbuchdateien (*.dic) + Hunspell-Wörterbuchdateien (*.dic) + + + + + Select Syntax Color + Syntaxfarbe auswählen FeatherPad::SearchBar - - + + Search... Suchen... - + Match Case Groß-/Kleinschreibung beachten - + Whole Word Ganzes Worte - + Regular Expression Regulärer Ausdruck - + Search with regex... Suche mit Regex ... - + Next Nächste - + Previous Vorherige @@ -2063,7 +2252,7 @@ Filter... - Filter... + Filter ... @@ -2107,7 +2296,7 @@ - + &Yes &Ja @@ -2147,42 +2336,42 @@ Namen eingeben, um Sitzung zu speichern - + Nothing saved.<br>No file was opened. Nichts gespeichert.<b>Keine Datei wurde geöffnet. - + No file exists or can be opened. - Die Datei existiert nicht oder kann nicht geöffnet werden. + Die Datei existiert nicht oder kann nicht geöffnet werden. - + Not all files exist or can be opened. Nicht alle Dateien existieren oder konnten geöffnet werden. - + &OK &OK - + Do you really want to remove all saved sessions? Sollen wirklich alle gespeicherten Sitzungen entfernt werden? - + Do you really want to remove the selected sessions? Sollen die gewählten Sitzungen wirklich entfernt werden? - + Do you really want to remove the selected session? Soll die gewählte Sitzung wirklich entfernt werden? - + A session with the same name exists.<br>Do you want to overwrite it? Eine Sitzung mit dem selben Namen ist vorhanden.<br>Soll sie überschrieben werden? @@ -2190,9 +2379,9 @@ FeatherPad::SidePane - + Filter... - Filter... + Filter ... @@ -2220,7 +2409,7 @@ Correct All - Alle ändern + Alle korrigieren @@ -2230,24 +2419,15 @@ Ignore All - Immer ignorieren + Alle ignorieren FeatherPad::TextEdit - + Double click to center current line - Doppel-Klick um die aktuelle Zeile zu zentreieren - - - - FeatherPad::WarningBar - - - - Close - Schließen + Doppel-Klick um die aktuelle Zeile zu zentrieren diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_el.ts featherpad-0.17.1/featherpad/data/translations/featherpad_el.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_el.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_el.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,24 +4,26 @@ FeatherPad::AboutDialog - + License - Άδεια + Άδεια χρήσης FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Χωρίς τίτλο @@ -54,1129 +56,1191 @@ - + &Edit &Επεξεργασία - + &Options Ε&πιλογές - - - + + + Encoding Κωδικοποίηση - + &Search Ανα&ζήτηση - - + + &Help &Βοήθεια - + Find: Αναζήτηση: - + To be replaced Να αντικατασταθεί - + Replace with: Αντικατάσταση με: - + Replacing text Κείμενο αντικατάστασης - + &New &Νέο - + New tab Νέα καρτέλα - + Ctrl+N Ctrl+N - + &Open Άνοι&γμα - + Open a file Άνοιγμα αρχείου - + Ctrl+O Ctrl+O - - + + &Save Α&ποθήκευση - + Save the current tab Αποθήκευση καρτέλας - + Ctrl+S Ctrl+S - + &Undo Α&ναίρεση - + Undo Αναίρεση - + Ctrl+Z Ctrl+Z - + &Redo &Επανάληψη - + Redo Επανάληψη - + Ctrl+Shift+Z Ctrl+Shift+Z - + Reload Επαναφόρτωση - + Ctrl+Shift+R Ctrl+Shift+R - + &Find Α&ναζήτηση - + Ctrl+F Ctrl+F - + Show/hide replacement dock Εμφάνιση/Απόκρυψη μπάρας αντικατάστασης - + Ctrl+R Ctrl+R - + Save &As Αποθήκευση &ως - + Ctrl+Shift+S Ctrl+Shift+S - + &Print Εκ&τύπωση - + Ctrl+P Ctrl+P - + Documen&t Properties Ι&διότητες εγγράφου - + Ctrl+Shift+D Ctrl+Shift+D - + &Close Κ&λείσιμο - + Ctrl+Shift+Q Ctrl+Shift+Q - + &Quit Έ&ξοδος - + Ctrl+Q Ctrl+Q - + &Cut Α&ποκοπή - + Ctrl+X Ctrl+X - + C&opy Αν&τιγραφή - + Ctrl+C Ctrl+C - + &Paste Επικό&λληση - + Ctrl+V Ctrl+V - + &Delete &Διαγραφή - + &Select All Επιλ&ογή όλων - + Ctrl+A Ctrl+A - + &Font &Γραμματοσειρά - + &Line Numbers Αρι&θμοί γραμμών - + Ctrl+L Ctrl+L - + &Wrap Lines Α&ναδίπλωση γραμμών - + Ctrl+W Ctrl+W - + &Auto-Indentation Αυτόματες εσο&χές - + Ctrl+I Ctrl+I - + &Syntax Highlighting Επισήμανση σύντα&ξης - + Ctrl+Shift+H Ctrl+Shift+H - + &Preferences &Προτιμήσεις - + Ctrl+Shift+P Ctrl+Shift+P - + Ctrl+H Ctrl+H - + &About &Περί - + Enforce UTF-8 Επιβολή εφαρμογής UTF-8 - + Save with &Encoding Αποθήκευση με κω&δικοποίηση - + &Jump to Μετά&βαση - + Show/hide jump bar Εμφάνιση/Απόκρυψη μπάρας μετάβασης - + Ctrl+J Ctrl+J - + Edit text Επεξεργασία κειμένου - + Ctrl+Shift+E Ctrl+Shift+E - + &Run Εκτέ&λεση - + Ctrl+E Ctrl+E - + &Clear - + Κα&θαρισμός - + Clear the list of recently modified files - + Καθάρισε τη λίστα των πρόσφατων τροποποιημένων αρχείων - + Save/Restore Session - + Αποθήκευση/Ανάκτηση Συνεδρίας - + Sa&ve/Restore Session - + Απο&θήκευση/επαναφορά συνεδρίας - + Ctrl+M - + Ctrl+M - + Side-Pane - + Πλευρικός πίνακας - + Ctrl+Alt+P - + Ctrl+Alt+P - + Paste Date and Time - + Επικόλληση ημερομηνίας και ώρας - + Ctrl+Shift+V - + Ctrl+Shift+V - + To Upper Case - + Σε κεφαλαία - + Ctrl+Shift+U - + Ctrl+Shift+U - + To Lower Case - + Σε μικρά - + Ctrl+Shift+L - + Ctrl+Shift+L - Last Active Tab + To Start Case - + + + Last Active Tab + Τελευταία ενεργή καρτέλα + + + F1 - + F1 - - + + Sort Lines - + Ταξινόμηση γραμμών - - + + Sort Lines Reversely - + Ταξινόμηση γραμμών ανάστροφα - + Check Spelling - + Έλεγχος ορθογραφίας - + F2 - + F2 - - + + Save All Files - + Αποθήκευση όλων των αρχείων - - + + User Dictionary - + Λεξικό χρήστη - - &Detach Tab - + + Text Tabs to Spaces + Στηλοθέτες κειμένου σε διαστήματα + &Detach Tab + &Αποκόλληση καρτέλας + + + Ctrl+T - + Ctrl+T - + Close Ne&xt Tabs - + Κλείσιμο των &επόμενων καρτελών - + Close &Previous Tabs - + Κλείσιμο των &προηγούμενων καρτελών - + Ne&xt Tab - + Επό&μενη καρτέλα - + Previous Ta&b - + Προη&γούμενη καρτέλα - + Execute - + Εκτέλεση - + Close &All Tabs - + Κλείσιμο ό&λων των καρτελών Recently &Modified - + Πρόσφατα &τροποποιημένων - + &Encoding - + &Κωδικοποίηση - + &Unicode - + &Unicode - + &Western European - + &Δυτικής Ευρώπης - + &East European - + &Ανατολικής Ευρώπης - + Ea&st Asian - + Ανατολικής Α&σίας - - + + - - Rep&lacement - + + Replacement + Αντικατάσταση - + Focus/hide search bar - + Εστίαση/απόκρυψη ράβδου αναζήτησης - + &Replace - + &Αντικατάσταση - + Windows Arabic (&CP1256) - + Αραβικά Windows (&CP1256) - + &Other - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) - + Cyrillic (&KOI8-U) - + Cyrillic (&ISO-8859-5) - + &Chinese (BIG5) - + Chinese (&GB18030) - + &Japanese (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) - + Ja&panese (CP932) - + Japa&nese (EUC-JP) - + &Korean (CP949) - + K&orean (CP1361) - + Korean (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs - + &Copy File Name - + Copy File &Path - + Alt+Right - + Alt+Left - + &First Tab - + Alt+Down - + &Last Tab - + Alt+Up - + Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) - + Next - + Previous - + Replace all - + &Recently Opened - + Close - + Κλείσιμο - + Save changes? - + Please attend to that window or just close its dialog! - + The document has been modified. - + &Discard changes - + &Cancel - + &No to all - - + + Unsaved - - - - - - - - - + + + + + + + + + Lines - - - + + + Sel. Chars - - - + + + Words - + Another process is running in this tab! - + Script File - + Another FeatherPad window has a modal dialog! - - + + Position: - - - + + + Normal - - - + + + The file does not exist. - + Open Link - + Copy Link - + Only one process is allowed per tab. - + Script Output - + Clear - + FeatherPad does not open files larger than 100 MiB. - + Non-text file(s) not opened! - + See Preferences → Files → Do not permit opening of non-text files - + Some file(s) could not be opened! - + You may not have the permission to read. - + Uneditable file(s)! - + Non-text files or files with huge lines cannot be edited. - + A previous crash detected! - + Preferably, close all FeatherPad windows and start again! - + Root Instance - - - + + + All Files (*) - + All Files (*);;.%1 Files (*.%1) - + Open file... - + .%1 Files (*.%1);;All Files (*) - - + + Save as... - + Keep encoding and save as... - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes - + No - + Cancel - + Do you want to use <b>MS Windows</b> end-of-lines? - + This may be good for readability under MS Windows. - + + + + Cannot be saved! - - - + + + + + Help - - - - - - - + + + + + + + Syntax - + Huge file(s) not opened! - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! - - + + Please be careful about reloading or saving this document! - + + Printing in progress... + + + + Print Document - - + + Printing completed. + + + + + %1 Pages - - + + Copy Target Path - - + + Open Target Here - + + + Open Containing Folder + + + + You need to add a Hunspell dictionary. - - - + + + See Preferences → Text → Spell Checking! - + The Hunspell dictionary does not exist. - + The Hunspell dictionary is not accompanied by an affix file. - - - + + + No misspelling in document. - - - + + + No misspelling from text cursor. - + Spell Checking - + Some files cannot be saved! - + Translators - + A lightweight, tabbed, plain-text editor - - based on Qt5 + + based on Qt - + Author - + aka. - - + + About FeatherPad - + No Replacement - + One Replacement - + %Ln Replacements @@ -1184,7 +1248,12 @@ - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. @@ -1495,72 +1564,83 @@ - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > - + This creates a menu button on the status bar for changing the syntax. - + Support syntax override - + Show spaces, tabs and tab lines when the syntax is highlighted. - + Show whitespaces - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). - + Show vertical lines starting from this position: - + Also show line and document ends - + Date and time format: - + Some text editors cannot open a document whose last line is not empty. - + Ensure an empty last line on saving - + Remove trailing spaces on saving - + Inertial scrolling with mouse wheel @@ -1620,7 +1700,7 @@ - + Help @@ -1668,37 +1748,26 @@ - + Highlight s&yntax by default - + Dark c&olor scheme - + Background color value: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - - - - - Workaround for &Qt5's scroll jump bug - - - This only includes executable files written in script languages like Shell and Python. @@ -1711,13 +1780,13 @@ - + Needs window reopening to take effect. - - + + The color value of the background. 255 means white while 0 means black. @@ -1744,8 +1813,8 @@ - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1755,22 +1824,22 @@ - + Text tab size: - + spaces - + Thick text cursor - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? @@ -1795,7 +1864,7 @@ - + Add dictionary... @@ -1857,119 +1926,240 @@ - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts - + Action - + Shortcut - + Restore default shortcuts. - + + + Default - + + Syntax Colors + + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + Close + Κλείσιμο + + + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. - - + + files - - + + file - - + + Warning: Ambiguous shortcut detected! - + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + Application restart is needed for changes to take effect. - + Window reopening is needed for changes to take effect. - + &Recently Opened - + Recently &Modified - + Πρόσφατα &τροποποιημένων - + The typed shortcut was reserved. - + Hunspell Dictionary Files (*.dic) + + + + Select Syntax Color + + FeatherPad::SearchBar - - + + Search... - + Match Case - + Whole Word - + Regular Expression - + Search with regex... - + Next - + Previous @@ -2038,7 +2228,7 @@ - + &Yes @@ -2078,42 +2268,42 @@ - + Nothing saved.<br>No file was opened. - + No file exists or can be opened. - + Not all files exist or can be opened. - + &OK - + Do you really want to remove all saved sessions? - + Do you really want to remove the selected sessions? - + Do you really want to remove the selected session? - + A session with the same name exists.<br>Do you want to overwrite it? @@ -2121,7 +2311,7 @@ FeatherPad::SidePane - + Filter... @@ -2167,18 +2357,9 @@ FeatherPad::TextEdit - + Double click to center current line - - FeatherPad::WarningBar - - - - Close - - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_eo.ts featherpad-0.17.1/featherpad/data/translations/featherpad_eo.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_eo.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_eo.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Licenco @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Sentitola @@ -54,514 +56,525 @@ - + &Edit R&edakti - + &Options A&gordoj - - - + + + Encoding Kodiĝo - + &Search &Serĉi - - + + &Help &Helpo - + Find: Trovu: - + To be replaced Anstataŭigota teksto - + Replace with: Anstataŭigu per: - + Replacing text Anstataŭiganta teksto - + &New &Nova - + New tab Nova folio - + Ctrl+N - + &Open &Malfermi - + Open a file Malfermi dosieron - + Ctrl+O - - + + &Save Kon&servi - + Save the current tab Konservi nunan folion - + Ctrl+S - + &Undo Malfar&u - + Undo Malfaru - + Ctrl+Z - + &Redo Refa&ru - + Redo Refaru - + Ctrl+Shift+Z - + Reload Reŝarĝi - + Ctrl+Shift+R - + &Find &Trovi - + Ctrl+F - + Show/hide replacement dock Kaŝi/malkaŝi la dokon de anstataŭigo - + Ctrl+R - + Save &As Konser&vi Kiel - + Ctrl+Shift+S - + &Print &Presi - + Ctrl+P - + Documen&t Properties Eco&j - + Ctrl+Shift+D - + &Close &Fermi - + Ctrl+Shift+Q - + &Quit Forl&asi - + Ctrl+Q - + &Cut &Tranĉu - + Ctrl+X - + C&opy &Kopiu - + Ctrl+C - + &Paste Algl&uu - + Ctrl+V - + &Delete &Forviŝu - + &Select All Elektu &Ĉion - + Ctrl+A - + &Font &Tiparo - + &Line Numbers &Lini-Numeroj - + Ctrl+L - + &Wrap Lines Ĉirkaŭ&fermi Liniojn - + Ctrl+W - + &Auto-Indentation &Mem-Alinei - + Ctrl+I - + &Syntax Highlighting Marki &Sintakson - + Ctrl+Shift+H - + &Preferences A&gordoj - + Ctrl+Shift+P - + Ctrl+H - + &About &Pri - + Enforce UTF-8 Efikigu UTF-8 - + Save with &Encoding Konsevi Kodigant&e - + &Jump to &Salti al - + Show/hide jump bar Kaŝi/malkaŝi la saltobreton - + Ctrl+J - + Edit text Radakti tekston - + Ctrl+Shift+E - + &Run Ek&zekvi - + Ctrl+E - + &Clear &Viŝi - + Clear the list of recently modified files Viŝu la liston de lastatempe modifitaj dosieroj - + Save/Restore Session Konservi/Restaŭri Sesion - + Sa&ve/Restore Session K&onservi/Restaŭri Sesion - + Ctrl+M - + Side-Pane Flankpanelo - + Ctrl+Alt+P - + Paste Date and Time Algluu la Daton kaj Tempon - + Ctrl+Shift+V - + To Upper Case Majuskligo - + Ctrl+Shift+U - + To Lower Case Minuskligo - + Ctrl+Shift+L + To Start Case + Komencuskligo + + + + Last Active Tab Folio Laste Aktiva - + F1 - - + + Sort Lines - Ordigu Liniojn + Ordigi Liniojn - - + + Sort Lines Reversely - Ordigu Liniojn Inverse + Ordigi Liniojn Inverse - + Check Spelling Kontroli Literumadon - + F2 - - + + Save All Files Konservi Ĉiujn Dosierojn - - + + User Dictionary Vortaro de Uzanto - + + Text Tabs to Spaces + Konverti Tabojn al Spacetoj + + + &Detach Tab &Deŝiri Folion - + Ctrl+T - + Close Ne&xt Tabs Fermu la &Sekvajn Foliojn - + Close &Previous Tabs Fermu la &Antaŭajn Foliojn - + Ne&xt Tab Folio Se&kva - + Previous Ta&b Folio An&taŭa - + Execute Ekzekvi - + Close &All Tabs Fermu Ĉ&iujn Foliojn @@ -571,613 +584,664 @@ Lastatempe Mod&ifitaj - + &Encoding &Kodiĝo - + &Unicode &Unikoda - + &Western European &Okcident-Eŭropa - + &East European Orient-&Eŭropa - + Ea&st Asian O&rient-Asia - - + + - - Rep&lacement - An&stataŭigo + + Replacement + Anstataŭigo - + Focus/hide search bar Enfokusigi/malkaŝi la serĉ-breton - + &Replace &Anstataŭigi - + Windows Arabic (&CP1256) &Vindozo-Araba (CP1256) - + &Other &Alia - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 &Vindozo-1252 - + &Cyrillic (CP1251) &Cirila (CP1251) - + Cyrillic (&KOI8-U) Cirila (&KOI8-U) - + Cyrillic (&ISO-8859-5) Cirila (&ISO-8859-5) - + &Chinese (BIG5) Ĉina (BIG&5) - + Chinese (&GB18030) Chinese (&GB18030) - + &Japanese (ISO-2022-JP) &Japana (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Japana (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Japana (ISO-&2022-KR) - + Ja&panese (CP932) Ja&pana (CP932) - + Japa&nese (EUC-JP) Japa&na (EUC-JP) - + &Korean (CP949) &Korea (CP949) - + K&orean (CP1361) K&orea (CP1361) - + Korean (&EUC-KR) Korea (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs Fermu la A&liajn Foliojn - + &Copy File Name &Kopiu la Dosiernomon - + Copy File &Path Kopiu la Dosier&padon - + Alt+Right - + Alt+Left - + &First Tab Folio &Unua - + Alt+Down - + &Last Tab Folio &Lasta - + Alt+Up - + Menu Menuo - + Calculate number of words (For huge texts, this may be CPU-intensive.) Kalkulu vortnombron (Por grandegaj tekstoj, ĉi tio eblas esti CPU-intensiva.) - + Next Sekva - + Previous Antaŭa - + Replace all Anstataŭigu ĉion - + &Recently Opened Lastatempe Malfermita&j - + Please attend to that window or just close its dialog! Bonvole prizorgu tiun fenestron aŭ nur fermu ĝian dialogon! - + Close Fermi - - + + Position: Pozicio: - - - + + + Normal Normala - - - + + + The file does not exist. La dosiero ne ekzitas. - + &Discard changes &Preterlasi ŝanĝojn - + &Cancel &Rezigni - + &No to all &Ne al ĉio - - + + Unsaved Nekonservita - - - + + + Sel. Chars Elekt. Signoj - + Open Link Malfermu la Ligilon - + Copy Link Kopiu la Ligilon - + Another process is running in this tab! Alia procezo estas plenumata en ĉi tiu folio! - + Only one process is allowed per tab. Nur unu procezo estas permesita po folio. - + Script Output Eligo de la Skripto - + Clear Viŝi - + FeatherPad does not open files larger than 100 MiB. FeatherPad ne malfermas dosierojn pli grandajn ol 100 MiB. - + Non-text file(s) not opened! Neteksta(j) dosiero(j) ne malfermita(j)! - + See Preferences → Files → Do not permit opening of non-text files Vidu Agordoj → Dosieroj → Malpermesu malfermi netekstajn dosierojn - + Some file(s) could not be opened! Iu(j) dosiero(j) ne povis esti malfermita(j)! - + You may not have the permission to read. Vi eble ne havas la permeson por legi. - + Uneditable file(s)! Neredaktebla(j) dosiero(j)! - + Non-text files or files with huge lines cannot be edited. Netekstaj dosieroj aŭ tiuj kun longegaj linioj ne redakteblas. - + A previous crash detected! Antaŭa kraŝo detektita! - + Preferably, close all FeatherPad windows and start again! Prefere fermu ĉiujn fenestrojn de FeatherPad kaj komencu denove! - + Root Instance Radika Instanco - - - + + + All Files (*) Ĉiuj Dosieroj (*) - + All Files (*);;.%1 Files (*.%1) Ĉiuj Dosieroj (*);;.%1-Dosieroj (*.%1) - + Open file... Malfermi dosieron... - - + + Save as... Konservi kiel... - + Keep encoding and save as... Teni la kodiĝon kaj konservi kiel... - + + Saving as root. + Konservi kiel la radiko. + + + + Waiting for authentication... + Atendi aŭtentigon... + + + + "pkexec" is not found. Please install Polkit! + "pkexec" ne estas trovita. Bonvole instalu Polkit! + + + Yes Jes - + No Ne - + Cancel Rezigni - - + + Text tabs are converted to spaces. + La taboj estas konvertitaj al spacetoj. + + + + The selected text was too long. + La elektita teksto estis tro longa. + + + + It is not fully processed. + Ĝi ne estas tute prilaborita. + + + + This file has been modified elsewhere or in another way! Ĉi tiu dosiero estas modifita aliloke aŭ alimaniere! - - + + Please be careful about reloading or saving this document! Bonvole zorgu pri ĝia reŝarĝado aŭ konservado! - - + + Printing in progress... + Presante... + + + + Printing completed. + La presado plenumiĝis. + + + + %1 Pages %1 Paĝoj - - + + Copy Target Path Kopiu la Celpadon - - + + Open Target Here Malfermu la Celon Ĉi Tie - + + + Open Containing Folder + Malfermu la Enhavan Dosierujon + + + You need to add a Hunspell dictionary. Vi bezonas Hunspell-vortaron. - - - + + + See Preferences → Text → Spell Checking! Vidu Agordoj → Texto → Literumada Kontrolo! - + The Hunspell dictionary does not exist. La Hunspell-vortaro ne ĉeestas. - + The Hunspell dictionary is not accompanied by an affix file. La Hunspell-vortaro ne estas kune kun afiksa dosiero. - - - + + + No misspelling in document. Neniu misliterumo ĉeestas en la dokumento. - - - + + + No misspelling from text cursor. Neniu misliterumo ĉeestas ekde la kursoro. - + Spell Checking Literumada Kontrolo - + Some files cannot be saved! Ne eblas konservi iujn dosierojn! - + Translators Tradukintoj - + A lightweight, tabbed, plain-text editor Malpeza, foliigita tekst-redaktilo - - based on Qt5 - bazita sur Qt5 + + based on Qt + bazita sur Qt - + Author Verkinto - + aka. akk. - - - + + + + + Help Helpo - - - - - - - - - + + + + + + + + + Lines Linioj - + Another FeatherPad window has a modal dialog! Alia fenestro havas modalan dialogon! - + Save changes? Konservi la ŝanĝojn? - + The document has been modified. La dokumento estas modifita. - - - + + + Words Vortoj - + Script File Skripta Dosiero - + Huge file(s) not opened! Grandega(j) dosiero(j) ne malfermita(j)! - + .%1 Files (*.%1);;All Files (*) .%1-Dosieroj (*.%1);;Ĉiuj Dosieroj (*) - + Do you want to use <b>MS Windows</b> end-of-lines? Ĉu vi volas uzi <b>MS Vindozajn</b> lini-finaĵojn? - + This may be good for readability under MS Windows. Povas esti bone por legindeco ĉe MS-Vindozo. - + + + + Cannot be saved! Ne eblas konservi! - - - - - - - + + + + + + + Syntax Sintakso - + Print Document Presi Dokumenton - - + + About FeatherPad Pri FeatherPad - + No Replacement Neniu Anstataŭigo - + One Replacement Unu Anstataŭigo - + %Ln Replacements %Ln Anstataŭigo @@ -1185,7 +1249,12 @@ - + + The first 1000 replacements are highlighted. + La unuaj 1000 anstataŭigoj estas markitaj. + + + The size limit for syntax highlighting is exceeded. La grandeca limo por la sintaks-markado estas transpasita. @@ -1514,76 +1583,88 @@ Anstataŭigu la trioblan punkton kaj duoblan streketon dum tajpado - + + Highlight case-sensitive and whole matches +of the selected text. + Marki la usklecivajn kaj tutajn kongruojn +de la elektita teksto. + + + + Selection highlighting + Marku la elektitan tekston + + + Never highlight syntax for files > Ne marku la sintakson por dosieroj > - + This creates a menu button on the status bar for changing the syntax. Ĉi tio estigas menubutonon sur la statusbreto por ŝanĝi la sintakson. - + Support syntax override Ebligu ŝanĝi la sintakson - + Show spaces, tabs and tab lines when the syntax is highlighted. - Montru spacojn, tabojn, kaj tabliniojn + Montru spacetojn, tabojn, kaj tabliniojn kiam la sintakso estas markita. - + Show whitespaces Montru la blankspacojn - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). La vertikalaj poziciaj linioj estus desegnitaj nur se la redaktila tiparo havus fiksitan larĝon (kiel Monospace). - + Show vertical lines starting from this position: Montru vertikalajn liniojn komence de ĉ tiu pozicio: - + Also show line and document ends Ankaŭ montru la liniajn kaj dokumentan finojn - + Date and time format: Datoprezento: - + Some text editors cannot open a document whose last line is not empty. Iuj tekst-redaktiloj ne povas malfermi dokumenton, kies fina linio ne estas malplena. - + Ensure an empty last line on saving Garantiu finan linion malplenan konservante - + Remove trailing spaces on saving Forviŝu la vostajn spacetojn konservante - + Inertial scrolling with mouse wheel Inercia rulumado per la musrado @@ -1652,7 +1733,7 @@ Konservu la ŝanĝojn al la malfermitaj dosieroj ĉiun: - + Help Helpo @@ -1703,38 +1784,26 @@ Ĉiam vidigu la lini-numero&jn - + Highlight s&yntax by default Marku la sin&takson defaŭlte - + Dark c&olor scheme Malluma kolo&rskemo - + Background color value: La kolorvaloro de la fono: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - Ĉi tio ne estas kompleta solvo sed detenas -ĝenantajn saltojn komence de rulumado. - - - - Workaround for &Qt5's scroll jump bug - Proviza korekto por la ruluma salto ĉe &Qt5 - - This only includes executable files written in script languages like Shell and Python. @@ -1754,13 +1823,13 @@ ĉesigita per la fulmoklavo Ctrl+Alt+E. - + Needs window reopening to take effect. Remalfermado de la fenestro necesas. - - + + The color value of the background. 255 means white while 0 means black. @@ -1798,8 +1867,8 @@ Restartigo de la aplikaĵo necesas. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1814,22 +1883,22 @@ MMM dd, yyyy, hh:mm:ss - + Text tab size: La grando de tabopaŝo: - + spaces - spacoj + spacetoj - + Thick text cursor Dika kursoro - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? Ĉu la musrada rulumado estu inercia kiam @@ -1857,7 +1926,7 @@ - + Add dictionary... Aldoni vortaron... @@ -1924,119 +1993,242 @@ Malpermesu malfermi netekstajn dosierojn - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + Defaŭlte, kiam dosieroj estas kopiitaj, ili estus +malfermitaj se ili estus algluitaj en FeatherPad. + + + + Paste paths instead of files + Algluu dosierpadojn anstataŭ dosierojn + + + Shortcuts Fulmoklavoj - + Action Ago - + Shortcut Fulmoklavo - + Restore default shortcuts. Restaŭri defaŭltajn fulmoklavojn. - + + + Default Defaŭlto - + + Syntax Colors + Sintaksaj Koloroj + + + + Element + Elemento + + + + Text Color + Text-Koloro + + + + Whitespace color value: + Kolorvaloro de blankspacoj: + + + + + Has effect only if line numbers are shown. + Ĉi tio efikas nur kiam lini-numeroj estas montritaj. + + + + Current line highlight value: + Kolorvaloro de aktiva linio: + + + + Restore default syntax colors. + Restaŭri defaŭltajn sintaks-kolorojn. + + + Close Fermi - - + + Press a modifier key to clear a shortcut +in the editing mode. + Premu modifan klavon por forigi fulmoklavon +en la redakta reĝimo. + + + + Double click a color to change it. + Duoble klaku koloron por ŝanĝi ĝin. + + + + files dosieroj - - + + file dosiero - - + + Warning: Ambiguous shortcut detected! Averto: Ambigua fulmoklavo estas detektita! - + + Functions, URLs,… + Funkcioj, URL-oj,… + + + + Built-in Functions + Funkcioj enkonstruitaj + + + + Comments + Komentoj + + + + Quotations + Citoj + + + + Types + Tipoj + + + + Key Words + Ĉefvortoj + + + + Numbers + Numeroj + + + + Regular Expressions, Code Blocks,… + Regulaj esprimoj, kodblokoj,… + + + + Document Blocks, XML/HTML Elements,… + Dokumentaj blokoj, XML/HTML-elementoj,… + + + + Markdown Headings, CSS Values,… + Titoloj de Markdown, CSS-valoroj,… + + + + Extra Elements + Ekstraj elementoj + + + Application restart is needed for changes to take effect. Restartigo de la aplikaĵo necesas por ke la ŝanĝoj efektiviĝu. - + Window reopening is needed for changes to take effect. Remalfermado de la fenestro necesas por ke la ŝanĝoj efektiviĝu. - + &Recently Opened Lastatempe Malfermita&j - + Recently &Modified Lastatempe Mod&ifitaj - + The typed shortcut was reserved. La fulmoklavo tajpita estis rezervita. - + Hunspell Dictionary Files (*.dic) Hunspell-Vortaraj Dosieroj (*.dic) + + + + Select Syntax Color + Elekti Sintaks-Koloron + FeatherPad::SearchBar - - + + Search... Serĉu... - + Match Case Uskleciva - + Whole Word Tuta Vorto - + Regular Expression Regula Esprimo - + Search with regex... Serĉu per regula esprimo... - + Next Sekva - + Previous Antaŭa @@ -2106,7 +2298,7 @@ - + &Yes &Jes @@ -2146,42 +2338,42 @@ Tajpu nomon por konservi sesion - + Nothing saved.<br>No file was opened. Nenio estas konservita.<br>Neniu dosiero estis malfermita. - + No file exists or can be opened. Neniu dosiero ekzistas aŭ poveas esti malfermita. - + Not all files exist or can be opened. Ne ĉiuj dosieroj ekzistas aŭ povas esti malfermitaj. - + &OK &Bone - + Do you really want to remove all saved sessions? Ĉu vi vere volas forviŝi ĉiujn konservitajn sesiojn? - + Do you really want to remove the selected sessions? Ĉu vi vere volas forviŝi la elektitajn sesiojn? - + Do you really want to remove the selected session? Ĉu vi vere volas forviŝi la elektitan sesion? - + A session with the same name exists.<br>Do you want to overwrite it? Samnama sesio ĉeestas.<br>Ĉu vi volas anstataŭigi ĝin? @@ -2189,7 +2381,7 @@ FeatherPad::SidePane - + Filter... Filtru... @@ -2235,18 +2427,9 @@ FeatherPad::TextEdit - + Double click to center current line Duoble klaku por centrigi la aktivan linion - - FeatherPad::WarningBar - - - - Close - Fermi - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_es.ts featherpad-0.17.1/featherpad/data/translations/featherpad_es.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_es.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_es.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Licencia @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Sin título @@ -54,514 +56,525 @@ - + &Edit &Editar - + &Options &Opciones - - - + + + Encoding Codificación - + &Search Bu&scar - - + + &Help &Ayuda - + Find: Buscar: - + To be replaced A sustituir - + Replace with: Sustituir por: - + Replacing text Texto de sustitución - + &New &Nuevo - + New tab Nueva pestaña vacía - + Ctrl+N Ctrl+N - + &Open &Abrir - + Open a file Abrir un archivo - + Ctrl+O Ctrl+O - - + + &Save &Guardar - + Save the current tab Guarda la pestaña actual - + Ctrl+S Ctrl+S - + &Undo &Deshacer - + Undo Deshacer - + Ctrl+Z Ctrl+Z - + &Redo &Rehacer - + Redo Rehacer - + Ctrl+Shift+Z Ctrl+Mayús+Z - + Reload Volver a cargar el archivo - + Ctrl+Shift+R Ctrl+Mayús+R - + &Find &Buscar - + Ctrl+F Ctrl+F - + Show/hide replacement dock Muestra/Oculta el panel de sustituciones - + Ctrl+R Ctrl+R - + Save &As G&uardar como - + Ctrl+Shift+S Ctrl+Mayús+S - + &Print Im&primir - + Ctrl+P Ctrl+P - + Documen&t Properties Propiedades del documen&to - + Ctrl+Shift+D Ctrl+Mayús+D - + &Close &Cerrar - + Ctrl+Shift+Q Ctrl+Mayús+Q - + &Quit &Salir - + Ctrl+Q Ctrl+Q - + &Cut &Cortar - + Ctrl+X Ctrl+X - + C&opy C&opiar - + Ctrl+C Ctrl+C - + &Paste &Pegar - + Ctrl+V Ctrl+V - + &Delete &Borrar - + &Select All &Seleccionar todo - + Ctrl+A Ctrl+A - + &Font &Tipo de letra - + &Line Numbers Números de &línea - + Ctrl+L Ctrl+L - + &Wrap Lines &Ajustar el texto al tamaño de la ventana - + Ctrl+W Ctrl+W - + &Auto-Indentation S&angría automática - + Ctrl+I Ctrl+I - + &Syntax Highlighting Re&saltado de sintaxis - + Ctrl+Shift+H Ctrl+Mayús+H - + &Preferences &Preferencias - + Ctrl+Shift+P Ctrl+Mayús+P - + Ctrl+H Ctrl+H - + &About &Acerca de - + Enforce UTF-8 Forzar UTF-8 - + Save with &Encoding Guardar con codificación - + &Jump to &Saltar a - + Show/hide jump bar Mostrar/Ocultar la barra de salto - + Ctrl+J Ctrl+J - + Edit text Editar el texto - + Ctrl+Shift+E Ctrl+Mayús+E - + &Run Ejecuta&r - + Ctrl+E Ctrl+E - + &Clear &Limpiar - + Clear the list of recently modified files Borrar la lista de archivos modificados recientemente - + Save/Restore Session Guardar/Restaurar la sesión - + Sa&ve/Restore Session &Guardar/Restaurar la sesión - + Ctrl+M Ctrl+M - + Side-Pane Panel lateral - + Ctrl+Alt+P Ctrl+Alt+P - + Paste Date and Time Pegar la fecha y hora actual - + Ctrl+Shift+V Ctrl+Mayús+V - + To Upper Case Cambiar a mayúsculas el texto seleccionado - + Ctrl+Shift+U Ctrl+Mayús+U - + To Lower Case Cambiar a minúsculas el texto seleccionado - + Ctrl+Shift+L Ctrl+Mayús+L + To Start Case + + + + + Last Active Tab Última pestaña activa - + F1 F1 - - + + Sort Lines Ordenar líneas - - + + Sort Lines Reversely Ordenar líneas de forma inversa - + Check Spelling Revisar ortografía - + F2 F2 - - + + Save All Files Guardar todos los archivos - - + + User Dictionary Diccionario de usuario - + + Text Tabs to Spaces + + + + &Detach Tab &Desprender la pestaña - + Ctrl+T Ctrl+T - + Close Ne&xt Tabs Cerrar las pestañas siguientes - + Close &Previous Tabs Cerrar las &pestañas anteriores - + Ne&xt Tab Pestaña siguiente - + Previous Ta&b &Pestaña anterior - + Execute Ejecutar - + Close &All Tabs Cerrar tod&as las pestañas @@ -571,613 +584,664 @@ &Modificados recientemente - + &Encoding Codificación - + &Unicode &Unicode - + &Western European Europeo occidental - + &East European Europeo oriental - + Ea&st Asian Asiático oriental - - + + - - Rep&lacement + + Replacement Sustitución - + Focus/hide search bar Muestra/Oculta la barra de búsqueda - + &Replace &Sustituir - + Windows Arabic (&CP1256) Arábico de Windows (CP1256) - + &Other &Otra - + &UTF-8 &UTF-8 - + UTF-&16 UTF-&16 - + &ISO-8859-1 &ISO-8849-1 - + &Windows-1252 &Windows-1252 - + &Cyrillic (CP1251) &Cirílico (CP1251) - + Cyrillic (&KOI8-U) Cirílico (&KOI8-U) - + Cyrillic (&ISO-8859-5) Cirílico (&ISO-8859-5) - + &Chinese (BIG5) &Chino (BIG5) - + Chinese (&GB18030) Chino (&GB18030) - + &Japanese (ISO-2022-JP) &Japonés (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Japonés (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Japonés (ISO-&2022-KR) - + Ja&panese (CP932) Ja&ponés (CP932) - + Japa&nese (EUC-JP) Japonés (EUC-JP) - + &Korean (CP949) Coreano (CP949) - + K&orean (CP1361) Coreano (CP1361) - + Korean (&EUC-KR) Coreano (&EUC-KR) - + ISO-&8859-15 ISO-&8859-15 - + Close &Other Tabs Cerrar las &otras pestañas - + &Copy File Name &Copiar el nombre del archivo - + Copy File &Path Copiar la ruta del archivo - + Alt+Right Alt+Derecha - + Alt+Left Alt+Izquierda - + &First Tab Primera pestaña - + Alt+Down Alt+Abajo - + &Last Tab Ú&ltima pestaña - + Alt+Up Alt+Arriba - + Menu Menú - + Calculate number of words (For huge texts, this may be CPU-intensive.) Calcular el número de palabras (Para textos muy grandes, puede usar la CPU intensivamente) - + Next Siguiente - + Previous Anterior - + Replace all Sustituir todo - + &Recently Opened Abie&rtos recientemente - + Close Cerrar - + Save changes? ¿Guardar los cambios? - + Please attend to that window or just close its dialog! ¡Por favor preste atención a esa ventana o ciérrala! - + The document has been modified. El documento ha sido modificado. - + &Discard changes &Descartar los cambios - + &Cancel &Cancelar - + &No to all &No a todo - - + + Unsaved Sin guardar - - - - - - - - - + + + + + + + + + Lines Líneas - - - + + + Sel. Chars Caracteres Sleccionados - - - + + + Words Palabras - + Another process is running in this tab! ¡Otro proceso está ejecutando en esta pestaña! - + Script File Archivo de script - + Another FeatherPad window has a modal dialog! ¡Hay una ventana adicional abierta en otra ventana de FeatherPad! - - + + Position: Posición: - - - + + + Normal Normal - - - + + + The file does not exist. El archivo no existe. - + Open Link Abrir enlace - + Copy Link Copiar enlace - + Only one process is allowed per tab. Solo se permite un proceso por pestaña. - + Script Output Salida del script - + Clear Limpiar - + FeatherPad does not open files larger than 100 MiB. FeatherPad no abre archivos de más de 100 MiB. - + Non-text file(s) not opened! - + No se abren archivos que no son de texto! - + See Preferences → Files → Do not permit opening of non-text files - + Vea Preferencias ▸ Archivos ▸ No permitir apertura de archivos que no sean de texto - + Some file(s) could not be opened! ¡No se puede abrir uno o más archivos! - + You may not have the permission to read. Puede que no tenga permisos de escritura. - + Uneditable file(s)! ¡Archivos no editables! - + Non-text files or files with huge lines cannot be edited. Los archivos que no sean de texto o tengan líneas muy grandes no se pueden editar. - + A previous crash detected! ¡Se ha detectado que la aplicación tuvo un cierre inesperado! - + Preferably, close all FeatherPad windows and start again! ¡Es preferible cerrar todas las ventanas de FeatherPad y empezar de nuevo! - + Root Instance Permisos de administrador activados - - - + + + All Files (*) Todos los archivos (*) - + All Files (*);;.%1 Files (*.%1) Todos los archivos (*);;.%1 Archivos (*.%1) - + Open file... Abrir archivo... - + .%1 Files (*.%1);;All Files (*) .%1 Archivos (*.%1);;Todos los archivos (*) - - + + Save as... Guardar como... - + Keep encoding and save as... Mantener la codificación y guardar como... - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes - + No No - + Cancel Cancelar - + Do you want to use <b>MS Windows</b> end-of-lines? ¿Quiere usar el fin de línea usado en <b>MS Windows</b>? - + This may be good for readability under MS Windows. Esto podría ser bueno para la legibilidad en MS Windows. - + + + + Cannot be saved! ¡No se puede guardar! - - - + + + + + Help Ayuda - - - - - - - + + + + + + + Syntax Sintaxis - + Huge file(s) not opened! ¡Uno o más archivos son demasiado grandes y no se han abierto! - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! ¡El archivo ha sido modificado externamente o de alguna otra forma! - - + + Please be careful about reloading or saving this document! ¡Por favor tenga cuidado al recargar o guardar este documento! - + + Printing in progress... + + + + Print Document Imprimir el documento - - + + Printing completed. + + + + + %1 Pages %1 Páginas - - + + Copy Target Path Copiar la ruta de destino - - + + Open Target Here Abrir el destino aquí - + + + Open Containing Folder + + + + You need to add a Hunspell dictionary. Necesitas añadir un diccionario en formato Hunspell. - - - + + + See Preferences → Text → Spell Checking! ¡Seleccione: Preferencias → Texto → Revisión Ortográfica! - + The Hunspell dictionary does not exist. El diccionario en formato Hunspell no existe. - + The Hunspell dictionary is not accompanied by an affix file. El diccionario en formato Hunspell no está acompañado de un archivo affix. - - - + + + No misspelling in document. No se encontraron errores de ortografía en este documento. - - - + + + No misspelling from text cursor. No se encontraron errores de ortografía en la selección del cursor. - + Spell Checking Revisión Ortográfica - + Some files cannot be saved! - ¡Algunos archivos no se pueden guardar! + ¡Algunos archivos no pueden guardarse! - + Translators Traductores - + A lightweight, tabbed, plain-text editor Un editor de texto simple, ligero y con pestañas - - based on Qt5 - basado en Qt5 + + based on Qt + basado en Qt - + Author Autor - + aka. alias - - + + About FeatherPad Acerca de FeatherPad - + No Replacement No se encontró ninguna coincidencia con la búsqueda - + One Replacement Una sustitución - + %Ln Replacements Se ha sustituido %Ln palabra o caracter @@ -1185,7 +1249,12 @@ - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. Se ha superado el límite permitido para utilizar el resaltado de sintaxis. @@ -1516,24 +1585,35 @@ Reemplazar los tres puntos seguidos y dos guiones seguidos mientras se escribe - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > Nunca resaltar la sintaxis en archivos mayores a: - + This creates a menu button on the status bar for changing the syntax. Si se activa esta opción se creara un botón de menú en la barra de estado para poder cambiar la sintaxis. - + Support syntax override Permitir el cambio de sintaxis - + Show spaces, tabs and tab lines when the syntax is highlighted. Si activa esta opción, cuando la sintaxis esté @@ -1541,13 +1621,13 @@ los espacios, tabulaciones y líneas de tabulación. - + Show whitespaces Poder ver y distinguir los espacios en blanco - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). Las líneas verticales se repetiran al volver a alcanzar @@ -1556,39 +1636,39 @@ si el tipo de fuente utilizado es de ancho fijo. - + Show vertical lines starting from this position: Mostrar líneas verticales a partir de esta posición: - + Also show line and document ends Mostrar símbolos en los saltos de linea y el final del documento - + Date and time format: Formato de la fecha y hora: - + Some text editors cannot open a document whose last line is not empty. Algunos editores de texto no pueden abrir un documento cuya última línea no esté vacía. - + Ensure an empty last line on saving Asegurarse de dejar una última línea vacía al guardar - + Remove trailing spaces on saving Borrar los espacios al final de las líneas al guardar - + Inertial scrolling with mouse wheel Desplazamiento inercial con la rueda del ratón @@ -1654,7 +1734,7 @@ Guardar los cambios en los archivos abiertos cada: - + Help Ayuda @@ -1705,38 +1785,26 @@ Mostrar siempre los n&úmeros de línea - + Highlight s&yntax by default Activar el resaltado de sintaxis - + Dark c&olor scheme Utilizar un esquema de c&olor oscuro - + Background color value: Valor del color de fondo: - + MiB MiB - - This is not a complete fix but -prevents annoying scroll jumps. - No es un arreglo definitivo, pero evita los -molestos saltos durante el desplazamiento. - - - - Workaround for &Qt5's scroll jump bug - Solución temporal al error de &Qt5 que genera saltos durante el desplazamiento - - This only includes executable files written in script languages like Shell and Python. @@ -1757,13 +1825,13 @@ El proceso ejecutado podra ser finalizado con Ctrl+Alt+E. - + Needs window reopening to take effect. Los cambios tendrán efecto después de reiniciar la aplicación. - - + + The color value of the background. 255 means white while 0 means black. @@ -1803,8 +1871,8 @@ Los cambios tendrán efecto después de reiniciar la aplicación. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1821,22 +1889,22 @@ MMM dd, aaaa, hh:mm:ss - + Text tab size: Tamaño del texto en la pestaña: - + spaces espacios - + Thick text cursor Cursor de texto grueso - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? ¿Debe ser inercial el desplazamiento con la rueda @@ -1864,7 +1932,7 @@ - + Add dictionary... Agregar un diccionario... @@ -1930,122 +1998,243 @@ Do not permit opening of non-text files - No permitir abrir archivos que no sean de texto + No permitir apertura de archivos que no sean de texto - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts Atajos - + Action Acción - + Shortcut Atajo - + Restore default shortcuts. Restaurar atajos predeterminados. - + + + Default Predeterminado - + + Syntax Colors + Colores de sintaxis + + + + Element + Elemento + + + + Text Color + Color de texto + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + Restaurar colores de sintaxis predeterminados. + + + Close Cerrar - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + Pulse dos veces en un color para cambiarlo. + + + + files archivos - - + + file archivo - - + + Warning: Ambiguous shortcut detected! Advertencia: ¡Se detectó un atajo que podría ser problemático! - + + Functions, URLs,… + Funciones, URL, … + + + + Built-in Functions + Funciones integradas + + + + Comments + Comentarios + + + + Quotations + Citas + + + + Types + Tipos + + + + Key Words + Palabras clave + + + + Numbers + Números + + + + Regular Expressions, Code Blocks,… + Expresiones regulares, bloques de código, … + + + + Document Blocks, XML/HTML Elements,… + Bloques de documentos, elementos XML/HTML, … + + + + Markdown Headings, CSS Values,… + Títulos de Markdown, valores de CSS, … + + + + Extra Elements + Elementos adicionales + + + Application restart is needed for changes to take effect. Es necesario reiniciar la aplicación para que los cambios tengan efecto. - + Window reopening is needed for changes to take effect. Los cambios tendrán efecto después de reiniciar la aplicación. - + &Recently Opened Abiertos &recientemente - + Recently &Modified &Modificados recientemente - + The typed shortcut was reserved. El atajo escrito esta reservado. - + Hunspell Dictionary Files (*.dic) Archivos de diccionario en formato Hunspell (*.dic) + + + + Select Syntax Color + Seleccionar color de sintaxis + FeatherPad::SearchBar - - + + Search... Buscar... - + Match Case - Tener en cuenta mayúsculas y minúsculas + Distinguir mayúsculas de minúsculas - + Whole Word Palabra completa - + Regular Expression Expresión regular - + Search with regex... Buscar con expresiones regulares... - + Next Siguiente - + Previous Anterior @@ -2115,7 +2304,7 @@ - + &Yes @@ -2155,42 +2344,42 @@ Escriba un nombre para guardar la sesión - + Nothing saved.<br>No file was opened. No se ha guardado nada.<br>Ningún archivo fue abierto. - + No file exists or can be opened. No existe ningún archivo o no pueden abrirse. - + Not all files exist or can be opened. No todos los archivos existen o no todos pueden abrirse. - + &OK Aceptar - + Do you really want to remove all saved sessions? ¿Esta seguro de eliminar todas las sesiones guardadas? - + Do you really want to remove the selected sessions? ¿Esta seguro de eliminar las sesiones seleccionadas? - + Do you really want to remove the selected session? ¿Esta seguro de eliminar la sesión seleccionada? - + A session with the same name exists.<br>Do you want to overwrite it? Ya existe una sesión con el mismo nombe.<br>¿Desea sobrescribirla? @@ -2198,7 +2387,7 @@ FeatherPad::SidePane - + Filter... Filtrar... @@ -2244,18 +2433,9 @@ FeatherPad::TextEdit - + Double click to center current line Haga doble clic para centrar la línea actual - - FeatherPad::WarningBar - - - - Close - Cerrar - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_fa.ts featherpad-0.17.1/featherpad/data/translations/featherpad_fa.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_fa.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_fa.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License گواهی @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled بی‌نام @@ -54,514 +56,525 @@ - + &Edit ويرايش - + &Options گزينه‌ها - - - + + + Encoding کدگذاری - + &Search جستجو - - + + &Help راهنما - + Find: يافتن: - + To be replaced جايگزين شود - + Replace with: جايگزينی با: - + Replacing text متن جايگزين - + &New جديد - + New tab برگه‌ی جديد - + Ctrl+N Ctrl+N - + &Open بازکردن - + Open a file بازکردن فايل - + Ctrl+O Ctrl+O - - + + &Save ذخيره‌سازی - + Save the current tab ذخيره‌سازی برگه جاری - + Ctrl+S Ctrl+S - + &Undo بازگشت - + Undo بازگشت - + Ctrl+Z Ctrl+Z - + &Redo تکرار - + Redo تکرار - + Ctrl+Shift+Z Ctrl+Shift+Z - + Reload بارگيری مجدد - + Ctrl+Shift+R Ctrl+Shift+R - + &Find يافتن - + Ctrl+F Ctrl+F - + Show/hide replacement dock آشکار يا پنهان کردن قسمت جايگزينی - + Ctrl+R Ctrl+R - + Save &As ذخيره‌سازی به عنوان - + Ctrl+Shift+S Ctrl+Shift+S - + &Print چاپ - + Ctrl+P Ctrl+P - + Documen&t Properties ويژگی‌های سند - + Ctrl+Shift+D Ctrl+Shift+D - + &Close بستن - + Ctrl+Shift+Q Ctrl+Shift+Q - + &Quit خروج - + Ctrl+Q Ctrl+Q - + &Cut بريدن - + Ctrl+X Ctrl+X - + C&opy رونوشت - + Ctrl+C Ctrl+C - + &Paste چسباندن - + Ctrl+V Ctrl+V - + &Delete حذف - + &Select All انتخاب همه - + Ctrl+A Ctrl+A - + &Font قلم - + &Line Numbers شماره خط - + Ctrl+L Ctrl+L - + &Wrap Lines - قالب‌بندی خطوط + قالب‌بندی خطها - + Ctrl+W Ctrl+W - + &Auto-Indentation دندانه‌گذاری خودکار - + Ctrl+I Ctrl+I - + &Syntax Highlighting رنگ‌آميری نگارش - + Ctrl+Shift+H Ctrl+Shift+H - + &Preferences تنظيمات - + Ctrl+Shift+P Ctrl+Shift+P - + Ctrl+H Ctrl+H - + &About درباره - + Enforce UTF-8 اجبار استفاده از UTF-8 - + Save with &Encoding ذخيره‌سازی با کدگذاری - + &Jump to پرش به - + Show/hide jump bar آشکار يا پنهان کردن نوار پرش - + Ctrl+J Ctrl+J - + Edit text ويرايش متن - + Ctrl+Shift+E Ctrl+Shift+E - + &Run اجرا - + Ctrl+E Ctrl+E - + &Clear پاکسازی - + Clear the list of recently modified files پاکسازی فهرست فايل‌های تازه‌تغييريافته - + Save/Restore Session ذخيره يا بازنشانی نشست - + Sa&ve/Restore Session ذخيره يا بازنشانی نشست - + Ctrl+M Ctrl+M - + Side-Pane صفحه کناری - + Ctrl+Alt+P Ctrl+Alt+P - + Paste Date and Time چسباندن تاريخ و زمان - + Ctrl+Shift+V Ctrl+Shift+V - + To Upper Case تبديل به حروف بزرگ - + Ctrl+Shift+U Ctrl+Shift+U - + To Lower Case تبديل به حروف کوچک - + Ctrl+Shift+L Ctrl+Shift+L + To Start Case + حروف بزرگ در آغاز واژه‌ها + + + + Last Active Tab آخرين برگه فعال - + F1 F1 - - + + Sort Lines - مرتب‌سازی خطوط + مرتب‌سازی خطها - - + + Sort Lines Reversely - مرتب‌سازی برعکس خطوط + مرتب‌سازی برعکس خطها - + Check Spelling بررسی تلفظ - + F2 F2 - - + + Save All Files ذخيره‌سازی همه فايل‌ها - - + + User Dictionary لغتنامه‌ی کاربر - + + Text Tabs to Spaces + تبديل تب به فاصله + + + &Detach Tab جداسازی برگه - + Ctrl+T Ctrl+T - + Close Ne&xt Tabs بستن برگه‌های بعدی - + Close &Previous Tabs بستن برگه‌های قبلی - + Ne&xt Tab برگه بعدی - + Previous Ta&b برگه قبلی - + Execute اجرا کردن - + Close &All Tabs بستن همه برگه‌ها @@ -571,620 +584,676 @@ تاره تغييريافته - + &Encoding کدگذاری - + &Unicode يونيکد - + &Western European غرب اروپا - + &East European شرق اروپا - + Ea&st Asian شرق آسيا - - + + - - Rep&lacement + + Replacement جايگذاری - + Focus/hide search bar آشکار يا پنهان کردن نوار جستجو - + &Replace جايگزينی - + Windows Arabic (&CP1256) عربی ويندوز (&CP1256) - + &Other ديگر - + &UTF-8 &UTF-8 - + UTF-&16 UTF-&16 - + &ISO-8859-1 &ISO-8859-1 - + &Windows-1252 &ويندوز-1252 - + &Cyrillic (CP1251) &سايريليک (CP1251) - + Cyrillic (&KOI8-U) سايريليک (&KOI8-U) - + Cyrillic (&ISO-8859-5) سايريليک (&ISO-8859-5) - + &Chinese (BIG5) &چينی (BIG5) - + Chinese (&GB18030) چينی (&GB18030) - + &Japanese (ISO-2022-JP) &ژاپنی (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) ژاپنی (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) ژاپنی (ISO-&2022-KR) - + Ja&panese (CP932) ژاپنی (CP932) - + Japa&nese (EUC-JP) ژاپنی (EUC-JP) - + &Korean (CP949) &کره‌ای (CP949) - + K&orean (CP1361) کره‌ای (CP1361) - + Korean (&EUC-KR) کره‌ای (&EUC-KR) - + ISO-&8859-15 ISO-&8859-15 - + Close &Other Tabs بستن ساير برگه‌ها - + &Copy File Name رونوشت از نام فايل - + Copy File &Path رونوشت از مسير فايل - + Alt+Right Alt+راست - + Alt+Left Alt+چپ - + &First Tab اولين برگه - + Alt+Down Alt+پايين - + &Last Tab آخرين برگه - + Alt+Up Alt+بالا - + Menu منو - + Calculate number of words (For huge texts, this may be CPU-intensive.) محاسبه تعداد واژگان (برای متنهای بزرگ، اين عمليات سنگين خواهد بود.) - + Next بعدی - + Previous قبلی - + Replace all جايگزينی همه - + &Recently Opened تازه باز شده - + Close بستن - + Save changes? ذخيره‌سازی تغييرات؟ - + Please attend to that window or just close its dialog! لطفا به آن پنجره رجوع کنيد يا ديالوگ آن را ببنديد! - + The document has been modified. سند تغيير يافته است. - + &Discard changes ناديده گرفتن تغييرات - + &Cancel لغو - + &No to all نه به همه - - + + Unsaved ذخيره نشده - - - - - - - - - + + + + + + + + + Lines خطها - - - + + + Sel. Chars حروف انتخاب‌شده - - - + + + Words واژه‌ها - + Another process is running in this tab! فرآيند ديگری در اين برگه اجرا می‌شود! - + Script File فايل اسکريپت - + Another FeatherPad window has a modal dialog! يک پنجره FeatherPad ديگر ديالوگ محاوره‌ای دارد! - - + + Position: موقعيت: - - - + + + Normal عادی - - - + + + The file does not exist. فايل موجود نيست. - + Open Link بازکردن پيوند - + Copy Link رونوشت از پيوند - + Only one process is allowed per tab. تنها يک فرآيند برای هر برگه مجاز است. - + Script Output خروجی اسکريپت - + Clear پاکسازی - + FeatherPad does not open files larger than 100 MiB. FeatherPad فايل‌های بزرگ‌تر از ۱۰۰ مگابايت را باز نمی‌کند. - + Non-text file(s) not opened! فايل(های) غير متنی باز نشد! - + See Preferences → Files → Do not permit opening of non-text files تگاه کنيد به تنظيمات ← فايل‌ها ← اجازه‌ی باز کردن فايل‌های غير متنی داده نشود - + Some file(s) could not be opened! برخی از فايل‌(ها) نمی‌توانند باز شوند! - + You may not have the permission to read. شايد مجوز خواندن نداشته باشيد. - + Uneditable file(s)! - فايل(ها) ويرايش‌ناپذير! + فايل(های) ويرايش‌ناپذير! - + Non-text files or files with huge lines cannot be edited. - فايل‌های غير متنی يا فايل‌هايی با خطوط بسيار زياد ويرايش‌ناپذيرند. + فايل‌های غير متنی يا فايل‌هايی با خطهای بسيار زياد ويرايش‌ناپذيرند. - + A previous crash detected! خطای قبلی تشخيص داده شد! - + Preferably, close all FeatherPad windows and start again! ترجيحا همه پنجره‌های FeatherPad را ببنديد و دوباره آغاز کنيد! - + Root Instance نمونه‌ی ريشه - - - + + + All Files (*) همه فايل‌‌ها (*) - + All Files (*);;.%1 Files (*.%1) همه فايل‌ها (*)؛؛.%1 فايل (*.%1) - + Open file... بازکردن فايل... - + .%1 Files (*.%1);;All Files (*) .%1 فايل (*.%1)؛؛همه فايل‌ها (*) - - + + Save as... ذخيره‌سازی به عنوان... - + Keep encoding and save as... حفظ کدگذاری و ذخيره‌سازی به عنوان... - + + Saving as root. + ذخيره‌سازی به عنوان ريشه. + + + + Waiting for authentication... + در انتظار هويت‌سنجی... + + + + "pkexec" is not found. Please install Polkit! + فايل اجرايی pkexec يافت نشد. لطفا Polkit را نصب کنيد! + + + Yes آری - + No نه - + Cancel لغو - + Do you want to use <b>MS Windows</b> end-of-lines? - آيا می‌خواهيد از انتهای خطوط <b>ويندوز مايکروسافت</b> استفاده کنيد؟ + آيا می‌خواهيد از انتهای خطهای <b>ويندوز مايکروسافت</b> استفاده کنيد؟ - + This may be good for readability under MS Windows. اين کار می‌تواند به خوانايی بيشتر تحت ويندوز کمک کند. - + + + + Cannot be saved! قابل ذخيره‌سازی نيست! - - - + + + + + Help راهنما - - - - - - - + + + + + + + Syntax نگارش - + Huge file(s) not opened! فايل(های) بسياربزرگ باز نشد! - - + + Text tabs are converted to spaces. + همه‌ی تب‌ها به فاصله تبديل شدند. + + + + The selected text was too long. + متن انتخاب‌شده بيش از اندازه طولانی بود. + + + + It is not fully processed. + همه‌ی آن پردازش نشده است. + + + + This file has been modified elsewhere or in another way! اين فايل در جايی ديگر يا به شيوه‌ای ديگر تغييريافته است! - - + + Please be careful about reloading or saving this document! لطفا در بارگيری يا ذخيره‌سازی اين سند دقت کنيد! - + + Printing in progress... + در حال چاپ کردن... + + + Print Document چاپ سند - - + + Printing completed. + چاپ انجام شد. + + + + %1 Pages %1 صفحه - - + + Copy Target Path رونوشت از مسير مقصد - - + + Open Target Here بازکردن مقصد در اينجا - + + + Open Containing Folder + بازکردن پوشه‌ی فايل + + + You need to add a Hunspell dictionary. نياز به افزودن لغتنامه Hunspell داريد. - - - + + + See Preferences → Text → Spell Checking! تنظيمات ← متن ← بررسی تلفظ را مشاهده کنيد! - + The Hunspell dictionary does not exist. لغتنامه Hunspell وجود ندارد. - + The Hunspell dictionary is not accompanied by an affix file. لغتنامه Hunspell شامل فايل ضميمه نيست. - - - + + + No misspelling in document. تلفظ اشتباهی در سند وجود ندارد. - - - + + + No misspelling from text cursor. تلفظ اشتباهی با شروع از نشانگر متنی وجود ندارد. - + Spell Checking بررسی تلفظ - + Some files cannot be saved! برخی از فايل‌ها قابل ذخيره‌سازی نيستند! - + Translators مترجمان - + A lightweight, tabbed, plain-text editor يک ويرايشگر سبک و برگه‌دار برای متن ساده - - based on Qt5 - بر پايه‌ی Qt5 + + based on Qt + بر پايه‌ی Qt - + Author نگارنده - + aka. aka. - - + + About FeatherPad درباره‌ی FeatherPad - + No Replacement بدون جايگذاری - + One Replacement يک جايگذاری - + %Ln Replacements %Ln جايگذاری - + + The first 1000 replacements are highlighted. + تنها ۱۰۰۰ جايگزينی نخست رنگی شده‌اند. + + + The size limit for syntax highlighting is exceeded. فراتر از محدوديت اندازه برای رنگ‌آميزی نگارش. @@ -1506,72 +1575,84 @@ جايگزينی سه نقطه و دو خط تيره هنگام نوشتن - + + Highlight case-sensitive and whole matches +of the selected text. + رنگی کردن همه‌ی نمونه‌های متن انتخاب‌شده +با در نظر داشتن حروف کوچک و بزرگ و تمام واژه. + + + + Selection highlighting + برجسته‌سازی متن انتخاب‌شده + + + Never highlight syntax for files > برای اين فايل‌ها رنگ‌آميزی نگارش صورت نگيرد > - + This creates a menu button on the status bar for changing the syntax. - يک دکمه منو در نوار وضعيت برای تغيير نگارش ايجاد می‌کند. + يک دکمه‌ی منو در نوار وضعيت برای تغيير نگارش ايجاد می‌شود. - + Support syntax override - امکان بازنويسی نگارش + امکان تغيير نگارش - + Show spaces, tabs and tab lines when the syntax is highlighted. - هنگام رنگ‌آميزی نگارش، فاصله، تب و خطوط تب نمايش داده شوند. + هنگام رنگ‌آميزی نگارش، فاصله، تب و خطهای عمودی تب نمايش داده شوند. - + Show whitespaces نمايش فضاهای خالی - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). - خطوط عمودی موقعيت فقط در صورت ثابت بودن عرض قلم ويرايشگر رسم خواهند شد (مانند Monospace). + خطهای عمودی موقعيت فقط در صورت ثابت بودن عرض قلم ويرايشگر رسم خواهند شد (مانند Monospace). - + Show vertical lines starting from this position: - نمايش خطوط عمودی که از اين موقعيت شروع می‌شوند: + نمايش خطهای عمودی که از اين موقعيت شروع می‌شوند: - + Also show line and document ends همچنين نمايش پايان هر خط و کل سند - + Date and time format: قالب تاريخ و زمان: - + Some text editors cannot open a document whose last line is not empty. برخی از ويرايشگر‌های متن نمی‌توانند سندی را که با يک خط خالی تمام نشود باز کنند. - + Ensure an empty last line on saving اطمينان از وجود خط پايانی خالی هنگام ذخيره‌سازی - + Remove trailing spaces on saving حذف فاصله‌های انتهايی هنگام ذخيره‌سازی - + Inertial scrolling with mouse wheel پيمايش اينرسی با استفاده از چرخ ماوس @@ -1605,9 +1686,9 @@ will be shown by a popup dialog. اين می‌تواند هر دستوری همراه با شناسه باشد، مانند "xterm -hold" که فرآيند را در XTerm اجرا می‌کند. -اگر دستور خالی باشد، فايل به صورت مستقيم اجرا خواهد شد. +در صورت نبود دستور، فايل به صورت مستقيم اجرا می‌شود. -اگر اسکريپت در يک محيط ترمينال اجرا نشود، خروجی و خطای آن درون يک ديالوگ محاوره‌ای نمايش داده می‌شوند. +اگر اسکريپت در ترمينال اجرا نشود، خروجی و خطای آن درون يک پنجره‌ی جداگانه نمايش داده می‌شوند. @@ -1635,7 +1716,7 @@ ذخيره‌سازی تغييرات فايل‌های باز در هر: - + Help راهنما @@ -1672,7 +1753,7 @@ &Wrap lines by default - قالب‌بندی خطوط به صورت پيشفرض + قالب‌بندی خطها به صورت پيشفرض @@ -1685,37 +1766,26 @@ نمايش هميشگی شماره خط - + Highlight s&yntax by default رنگ‌آميزی نگارش به صورت پيشفرض - + Dark c&olor scheme طرح رنگ تيره - + Background color value: مقدار رنگ پسزمينه: - + MiB مگابايت - - This is not a complete fix but -prevents annoying scroll jumps. - اين يک راهکار موقت است که از پرش‌های آزاردهنده پيشگيری می‌کند. - - - - Workaround for &Qt5's scroll jump bug - راهکار برای باگ پرشی Qt5 - - This only includes executable files written in script languages like Shell and Python. @@ -1732,13 +1802,13 @@ سپس، می‌توان فرآيند را توسط Ctrl+Alt+E نابود کرد. - + Needs window reopening to take effect. نيازمند بازگشايی پنجره است. - - + + The color value of the background. 255 means white while 0 means black. @@ -1775,8 +1845,8 @@ نيازمند شروع مجدد برنامه است. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1790,22 +1860,22 @@ برای MMM dd, yyyy, hh:mm:ss خالی بگذاريد - + Text tab size: اندازه تَب متن: - + spaces فاصله - + Thick text cursor نشانگر ضخيم متنی - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? اگر نشانگر داخل متن باشد، آيا پيمايش با ماوس بايد حالت اينرسی داشته باشد؟ @@ -1830,7 +1900,7 @@ - + Add dictionary... افزودن لغتنامه... @@ -1896,119 +1966,242 @@ اجازه‌ی باز کردن فايل‌های غير متنی داده نشود - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + به طور پيشفرض، اگر از فايلی رونوشت گرفته شود، +هنگام چسباندن در ويرايشگر باز می‌شود. + + + + Paste paths instead of files + چسباندن مسير فايل به جای فايل + + + Shortcuts ميانبرها - + Action اقدام - + Shortcut ميانبر - + Restore default shortcuts. بازنشانی ميانبرهای پيشفرض. - + + + Default پيشفرض - + + Syntax Colors + رنگ‌آميری نگارش + + + + Element + عنصر + + + + Text Color + رنگ متن + + + + Whitespace color value: + مقدار رنگ فضاهای خالی: + + + + + Has effect only if line numbers are shown. + تنها اگر شماره‌ی خطها نشان داده شود. + + + + Current line highlight value: + مقدار رنگ خط جاری: + + + + Restore default syntax colors. + بازنشانی رنگ‌آميری نگارش. + + + Close بستن - - + + Press a modifier key to clear a shortcut +in the editing mode. + برای پاک کردن ميانبر، يک کليد اصلاح‌گر را +در حالت ويرايش فشار دهيد. + + + + Double click a color to change it. + برای تغيير رنگ، دو بار روی آن کليک کنيد. + + + + files - فايل‌ها + فايل - - + + file فايل - - + + Warning: Ambiguous shortcut detected! هشدار: ميانبری مبهم تشخيض داده شد! - + + Functions, URLs,… + تابعها، URLها،… + + + + Built-in Functions + تابعهای پيشفرض + + + + Comments + توضيحات درون کد + + + + Quotations + نقل قولها + + + + Types + گونه‌ها + + + + Key Words + واژه‌های کليدی + + + + Numbers + عددها + + + + Regular Expressions, Code Blocks,… + عبارتهای منظم، بخشهای ويژه‌ی گنجاندن کد،… + + + + Document Blocks, XML/HTML Elements,… + بخشهای ويژه‌ی گنجاندن سند، عنصرهای XML/HTML،… + + + + Markdown Headings, CSS Values,… + عنوانهای Markdown، مقدارهای CSS،… + + + + Extra Elements + عنصرهای اضافی + + + Application restart is needed for changes to take effect. شروع مجدد برنامه برای اعمال تغييرات لازم است. - + Window reopening is needed for changes to take effect. بازگشايی پنجره‌ها برای اعمال تغييرات لازم است. - + &Recently Opened تازه بازشده - + Recently &Modified تازه تغييريافته - + The typed shortcut was reserved. اين ميانبر برای کار ديگری کنار گذاشته شده است. - + Hunspell Dictionary Files (*.dic) فايل‌های لغتنامه Hunspell (*.dic) + + + + Select Syntax Color + انتخاب رنگ‌آميری نگارش + FeatherPad::SearchBar - - + + Search... جستجو... - + Match Case سازگار با بزرگی و کوچکی حروف - + Whole Word تمام واژه - + Regular Expression عبارت منظم - + Search with regex... جستجو با عبارت منظم... - + Next بعدی - + Previous قبلی @@ -2077,7 +2270,7 @@ - + &Yes آری @@ -2117,42 +2310,42 @@ برای ذخيره‌سازی نشست نامی را وارد کنيد - + Nothing saved.<br>No file was opened. ذخيره‌سازی صورت نگرفت.<br>فايلی باز نشده است. - + No file exists or can be opened. فايلی موجود يا قابل بازکردن نيست. - + Not all files exist or can be opened. همه فايل‌ها موجود يا قابل بازکردن نيستند. - + &OK تاييد - + Do you really want to remove all saved sessions? آيا از حذف همه نشست‌های ذخيره‌شده اطمينان داريد؟ - + Do you really want to remove the selected sessions? آيا از حذف نشست‌های انتخابی اطمينان داريد؟ - + Do you really want to remove the selected session? آيا از حذف نشست انتخابی اطمينان داريد؟ - + A session with the same name exists.<br>Do you want to overwrite it? يک نشست با همين نام وجود دارد.<br>می‌خواهيد آن را بازنويسی کنيد؟ @@ -2160,7 +2353,7 @@ FeatherPad::SidePane - + Filter... فيلتر... @@ -2206,18 +2399,9 @@ FeatherPad::TextEdit - + Double click to center current line کليک دوگانه برای نشان دادن خط جاری - - FeatherPad::WarningBar - - - - Close - بستن - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_fi.ts featherpad-0.17.1/featherpad/data/translations/featherpad_fi.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_fi.ts 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_fi.ts 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,2364 @@ + + + + + FeatherPad::AboutDialog + + + License + + + + + FeatherPad::FPwin + + + + + + + + + + + + + + Untitled + + + + + Go to line: + + + + + Select text from cursor to this line +(Ctrl+Shift+J) + + + + + Select Text + + + + + Ctrl+Shift+J + + + + + &File + + + + + + &Edit + + + + + &Options + + + + + + + Encoding + + + + + &Search + + + + + + &Help + + + + + Find: + + + + + To be replaced + + + + + Replace with: + + + + + Replacing text + + + + + &New + + + + + New tab + + + + + Ctrl+N + + + + + &Open + + + + + Open a file + + + + + Ctrl+O + + + + + + &Save + + + + + Save the current tab + + + + + Ctrl+S + + + + + &Undo + + + + + Undo + + + + + Ctrl+Z + + + + + &Redo + + + + + Redo + + + + + Ctrl+Shift+Z + + + + + + Reload + + + + + Ctrl+Shift+R + + + + + &Find + + + + + Ctrl+F + + + + + Show/hide replacement dock + + + + + Ctrl+R + + + + + Save &As + + + + + Ctrl+Shift+S + + + + + &Print + + + + + Ctrl+P + + + + + Documen&t Properties + + + + + Ctrl+Shift+D + + + + + &Close + + + + + Ctrl+Shift+Q + + + + + &Quit + + + + + Ctrl+Q + + + + + &Cut + + + + + Ctrl+X + + + + + C&opy + + + + + Ctrl+C + + + + + &Paste + + + + + Ctrl+V + + + + + &Delete + + + + + &Select All + + + + + Ctrl+A + + + + + &Font + + + + + &Line Numbers + + + + + Ctrl+L + + + + + &Wrap Lines + + + + + Ctrl+W + + + + + &Auto-Indentation + + + + + Ctrl+I + + + + + &Syntax Highlighting + + + + + Ctrl+Shift+H + + + + + &Preferences + + + + + Ctrl+Shift+P + + + + + Ctrl+H + + + + + &About + + + + + Enforce UTF-8 + + + + + Save with &Encoding + + + + + &Jump to + + + + + Show/hide jump bar + + + + + Ctrl+J + + + + + Edit text + + + + + Ctrl+Shift+E + + + + + &Run + + + + + Ctrl+E + + + + + &Clear + + + + + Clear the list of recently modified files + + + + + Save/Restore Session + + + + + Sa&ve/Restore Session + + + + + Ctrl+M + + + + + Side-Pane + + + + + Ctrl+Alt+P + + + + + Paste Date and Time + + + + + Ctrl+Shift+V + + + + + + To Upper Case + + + + + Ctrl+Shift+U + + + + + + To Lower Case + + + + + Ctrl+Shift+L + + + + + + To Start Case + + + + + + Last Active Tab + + + + + F1 + + + + + + Sort Lines + + + + + + Sort Lines Reversely + + + + + Check Spelling + + + + + F2 + + + + + + Save All Files + + + + + + User Dictionary + + + + + Text Tabs to Spaces + + + + + &Detach Tab + + + + + Ctrl+T + + + + + Close Ne&xt Tabs + + + + + Close &Previous Tabs + + + + + Ne&xt Tab + + + + + Previous Ta&b + + + + + Execute + + + + + Close &All Tabs + + + + + Recently &Modified + + + + + &Encoding + + + + + &Unicode + + + + + &Western European + + + + + &East European + + + + + Ea&st Asian + + + + + + + + Replacement + + + + + Focus/hide search bar + + + + + &Replace + + + + + Windows Arabic (&CP1256) + + + + + &Other + + + + + &UTF-8 + + + + + UTF-&16 + + + + + &ISO-8859-1 + + + + + &Windows-1252 + + + + + &Cyrillic (CP1251) + + + + + Cyrillic (&KOI8-U) + + + + + Cyrillic (&ISO-8859-5) + + + + + &Chinese (BIG5) + + + + + Chinese (&GB18030) + + + + + &Japanese (ISO-2022-JP) + + + + + Japanese (&ISO-2022-JP-2) + + + + + Japanese (ISO-&2022-KR) + + + + + Ja&panese (CP932) + + + + + Japa&nese (EUC-JP) + + + + + &Korean (CP949) + + + + + K&orean (CP1361) + + + + + Korean (&EUC-KR) + + + + + ISO-&8859-15 + + + + + Close &Other Tabs + + + + + &Copy File Name + + + + + Copy File &Path + + + + + Alt+Right + + + + + Alt+Left + + + + + &First Tab + + + + + Alt+Down + + + + + &Last Tab + + + + + Alt+Up + + + + + Menu + + + + + Calculate number of words +(For huge texts, this may be CPU-intensive.) + + + + + Next + + + + + Previous + + + + + Replace all + + + + + &Recently Opened + + + + + Close + + + + + Save changes? + + + + + Please attend to that window or just close its dialog! + + + + + The document has been modified. + + + + + &Discard changes + + + + + &Cancel + + + + + &No to all + + + + + + Unsaved + + + + + + + + + + + + + Lines + + + + + + + Sel. Chars + + + + + + + Words + + + + + Another process is running in this tab! + + + + + Script File + + + + + Another FeatherPad window has a modal dialog! + + + + + + Position: + + + + + + + Normal + + + + + + + The file does not exist. + + + + + Open Link + + + + + Copy Link + + + + + Only one process is allowed per tab. + + + + + Script Output + + + + + Clear + + + + + FeatherPad does not open files larger than 100 MiB. + + + + + Non-text file(s) not opened! + + + + + See Preferences → Files → Do not permit opening of non-text files + + + + + Some file(s) could not be opened! + + + + + You may not have the permission to read. + + + + + Uneditable file(s)! + + + + + Non-text files or files with huge lines cannot be edited. + + + + + A previous crash detected! + + + + + Preferably, close all FeatherPad windows and start again! + + + + + Root Instance + + + + + + + All Files (*) + + + + + All Files (*);;.%1 Files (*.%1) + + + + + Open file... + + + + + .%1 Files (*.%1);;All Files (*) + + + + + + Save as... + + + + + Keep encoding and save as... + + + + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + + Yes + + + + + No + + + + + Cancel + + + + + Do you want to use <b>MS Windows</b> end-of-lines? + + + + + This may be good for readability under MS Windows. + + + + + + + + Cannot be saved! + + + + + + + + + Help + + + + + + + + + + + Syntax + + + + + Huge file(s) not opened! + + + + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + + This file has been modified elsewhere or in another way! + + + + + + Please be careful about reloading or saving this document! + + + + + Printing in progress... + + + + + Print Document + + + + + Printing completed. + + + + + + %1 Pages + + + + + + Copy Target Path + + + + + + Open Target Here + + + + + + Open Containing Folder + + + + + You need to add a Hunspell dictionary. + + + + + + + See Preferences → Text → Spell Checking! + + + + + The Hunspell dictionary does not exist. + + + + + The Hunspell dictionary is not accompanied by an affix file. + + + + + + + No misspelling in document. + + + + + + + No misspelling from text cursor. + + + + + Spell Checking + + + + + Some files cannot be saved! + + + + + Translators + + + + + A lightweight, tabbed, plain-text editor + + + + + based on Qt + + + + + Author + + + + + aka. + + + + + + About FeatherPad + + + + + No Replacement + + + + + One Replacement + + + + + %Ln Replacements + + + + + + + + The first 1000 replacements are highlighted. + + + + + The size limit for syntax highlighting is exceeded. + + + + + FeatherPad::FileDialog + + + Ctrl+H + Toggle showing hidden files + + + + + Alt+. + Toggle showing hidden files + + + + + FeatherPad::FontDialog + + + Select Font + + + + + Programming Fonts + + + + + + Font: + + + + + Size: + + + + + Weight: + + + + + Normal + + + + + Medium + + + + + Bold + + + + + Black + + + + + Italic + + + + + Preview + + + + + FeatherPad::LineEdit + + + Clear text (Ctrl+K) + + + + + FeatherPad::PrefDialog + + + Preferences + + + + + Window + + + + + Window Settings + + + + + Remember window &size on closing + + + + + + + + Window frame is excluded. + + + + + Start with this size: + + + + + + px + + + + + × + + + + + Enforcing a window position is not recommended +and may not work with some window managers. + + + + + Remember window &position on closing + + + + + Most suitable with sessions +but without tab functionality. + + + + + Uncheck for 1/5 of the width. + + + + + Remember splitter position + + + + + Do not show &toolbar + + + + + If the menubar is hidden, +a menu button appears on the toolbar. + + + + + Do not show &menubar + + + + + Hide search &bar by default + + + + + By default, each search entry +has a separate search history. + + + + + Use a shared search history + + + + + Always show st&atus bar + + + + + Show cursor position on status bar + + + + + + Will take effect after closing this dialog. + + + + + Tab position: + + + + + North + + + + + South + + + + + West + + + + + East + + + + + This means that, for LTR, Alt+Right goes to the first tab +after the last tab is activated, and the same for Alt+Left. + +Tab navigation with mouse wheel is not affected. + + + + + Tab navigation wraps &around + + + + + Close window on closing its last tab + + + + + By default, if a FeatherPad window exists on the +current desktop, files will be opened in its tabs. + +However, some desktop environments may not +report that they have multiple desktops. + + + + + Always open in separate windows + + + + + If this is checked, the file dialog provided by the current +desktop environment will be used instead of the Qt file dialog. + +Some desktop environments, like KDE and LXQt, provide files dialogs. + + + + + Native file dialog + + + + + Uncheck for Monospace. + + + + + Remember &font + + + + + This covers parentheses, braces, brackets and quotes. + + + + + Auto-&bracket + + + + + By default, a triple period is replaced with an ellipsis +and a double hyphen with a long dash while typing, +under proper circumstances. + + + + + Replace triple periods and double hyphens while typing + + + + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + + Never highlight syntax for files > + + + + + This creates a menu button on the +status bar for changing the syntax. + + + + + Support syntax override + + + + + Show spaces, tabs and tab lines +when the syntax is highlighted. + + + + + Show whitespaces + + + + + + The vertical position lines will be drawn only if +the editor font has a fixed pitch (like Monospace). + + + + + Show vertical lines starting from this position: + + + + + Also show line and document ends + + + + + Date and time format: + + + + + Some text editors cannot open a document +whose last line is not empty. + + + + + Ensure an empty last line on saving + + + + + Remove trailing spaces on saving + + + + + Inertial scrolling with mouse wheel + + + + + Files + + + + + File Management + + + + + Start with files of last window + + + + + + This can be any starting command with +arguments, for example, "xterm -hold" +for running the process in XTerm. + +If the command is left empty, the file +will be executed directly. + +If the script is not run in a terminal +emulator, the output and error messages +will be shown by a popup dialog. + + + + + Start with this command: + + + + + Command + Arguments + + + + + Show recentl&y modified files + + + + + Show recentl&y opened files + + + + + Save changes to opened files every: + + + + + Help + + + + + Start with side-pane mode + + + + + If this is checked, not only you will lose the informative +tooltip and context menu of a single tab but you could not +merge a single tabbed window into another one by tab drag- +and-drop either. + + + + + &Do not show a single tab + + + + + Text + + + + + Text Editor + + + + + &Wrap lines by default + + + + + Auto-&indent by default + + + + + Always show line &numbers + + + + + Highlight s&yntax by default + + + + + Dark c&olor scheme + + + + + Background color value: + + + + + MiB + + + + + This only includes executable files written +in script languages like Shell and Python. + +If it is checked and the opened file is +executable, the file will be executed by clicking +the Run button, that appears on the toolbar/filemenu +when needed, or by its shortcut Ctrl+E. Then, the +process could be killed by Ctrl+Alt+E. + + + + + Needs window reopening to take effect. + + + + + + The color value of the background. +255 means white while 0 means black. + +For the light background, it can be +between 230 and 255; for the dark +background, between 0 and 50. + +Needs window reopening to take effect. + + + + + Run executable scripts + + + + + + The maximum number of recently modified or +opened files FeatherPad shows. The default +is 10. + +Needs application restart to take effect. + + + + + + Used for pasting the date and time. + +Takes effect after closing this dialog. + +Leave empty for: +MMM dd, yyyy, hh:mm:ss + + + + + Text tab size: + + + + + spaces + + + + + Thick text cursor + + + + + Should the mouse wheel scrolling be inertial +if the cursor is inside the text view? + + + + + Spell Checking + + + + + + A Hunspell dictionary has a name that ends with ".dic" +and should be alongside an affix file with the same +name but ending with ".aff". + + + + + Hunspell dictionary path: + + + + + + Add dictionary... + + + + + If this is unchecked, spell checking +will be started from the document start. + + + + + Start spell checking from text cursor + + + + + Number of recent files: + + + + + Only if their number is not greater than 50. + + + + + + Only for files that exist and can be saved. + + + + + min + + + + + If this is checked, the Save button/menu-item could +be used also when the opened file is not modified. + +This can be useful under certain circumstances, +e.g. for changing the time stamp or removing the +trailing spaces of a text file. + + + + + Allow saving unmodified files + + + + + Show a warning instead. + + + + + Do not permit opening of non-text files + + + + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + + Shortcuts + + + + + Action + + + + + Shortcut + + + + + Restore default shortcuts. + + + + + + + Default + + + + + Syntax Colors + + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + + Close + + + + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + + + + + + files + + + + + + file + + + + + + Warning: Ambiguous shortcut detected! + + + + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + + Application restart is needed for changes to take effect. + + + + + Window reopening is needed for changes to take effect. + + + + + &Recently Opened + + + + + Recently &Modified + + + + + The typed shortcut was reserved. + + + + + Hunspell Dictionary Files (*.dic) + + + + + + Select Syntax Color + + + + + FeatherPad::SearchBar + + + + Search... + + + + + Match Case + + + + + Whole Word + + + + + Regular Expression + + + + + Search with regex... + + + + + Next + + + + + Previous + + + + + FeatherPad::SessionDialog + + + Session Manager + + + + + + &Remove + + + + + <b>Save/Restore Session</b> + + + + + Filter... + + + + + Open the selected session(s). + + + + + + &Open + + + + + + Del + + + + + + Ctrl+Del + + + + + By default, all files that are opened in all +windows will be included in the saved session. + + + + + Save only from this &window + + + + + <b>Warning</b> + + + + + + &Yes + + + + + &No + + + + + Re&name + + + + + Remove &All + + + + + &Close + + + + + Save the current session under the given title. + + + + + &Save + + + + + Type a name to save session + + + + + Nothing saved.<br>No file was opened. + + + + + No file exists or can be opened. + + + + + Not all files exist or can be opened. + + + + + &OK + + + + + Do you really want to remove all saved sessions? + + + + + Do you really want to remove the selected sessions? + + + + + Do you really want to remove the selected session? + + + + + A session with the same name exists.<br>Do you want to overwrite it? + + + + + FeatherPad::SidePane + + + Filter... + + + + + FeatherPad::SpellDialog + + + Unknown word: + + + + + Add To Dictionary + + + + + Replace with: + + + + + Correct Once + + + + + Correct All + + + + + Ignore Once + + + + + Ignore All + + + + + FeatherPad::TextEdit + + + Double click to center current line + + + + diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_fr.ts featherpad-0.17.1/featherpad/data/translations/featherpad_fr.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_fr.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_fr.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Licence @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Sans titre @@ -49,519 +51,530 @@ - + &Edit &Éditer - + &Options &Options - - - + + + Encoding Encodage - + &Search &Chercher - - + + &Help &Aide - + Find: Trouver : - + To be replaced À remplacer - + Replace with: Remplacer par : - + Replacing text Texte de remplacement - + &New &Nouveau - + New tab Nouvel onglet - + Ctrl+N - + &Open &Ouvrir - + Open a file Ouvrir un fichier - + Ctrl+O - - + + &Save &Enregistrer - + Save the current tab Enregistrer l'onglet actif - + Ctrl+S - + &Undo &Annuler - + Undo Annuler - + Ctrl+Z - + &Redo &Recommencer - + Redo Recommencer - + Ctrl+Shift+Z Ctrl+MAJ+Z - + Reload Recharger - + Ctrl+Shift+R Ctrl+MAJ+R - + &Find &Trouver - + Ctrl+F - + Show/hide replacement dock Afficher/masquer la fenêtre de remplacement - + Ctrl+R - + Save &As Enregistrer s&ous - + Ctrl+Shift+S Ctrl+MAJ+S - + &Print &Imprimer - + Ctrl+P - + Documen&t Properties &Propriétés du document - + Ctrl+Shift+D Ctrl+MAJ+D - + &Close &Fermer - + Ctrl+Shift+Q Ctrl+MAJ+Q - + &Quit &Quitter - + Ctrl+Q - + &Cut &Couper - + Ctrl+X - + C&opy C&opier - + Ctrl+C - + &Paste Col&ler - + Ctrl+V - + &Delete &Effacer - + &Select All &Tout sélectionner - + Ctrl+A - + &Font P&olice - + &Line Numbers &Numéros de ligne - + Ctrl+L - + &Wrap Lines &Retour à la ligne - + Ctrl+W - + &Auto-Indentation &Indentation automatique - + Ctrl+I - + &Syntax Highlighting &Coloration syntaxique - + Ctrl+Shift+H Ctrl+MAJ+H - + &Preferences &Préférences - + Ctrl+Shift+P Ctrl+MAJ+P - + Ctrl+H - + &About À &propos - + Enforce UTF-8 Forcer UTF-8 - + Save with &Encoding Enregistrer avec l'en&codage - + &Jump to &Aller à - + Show/hide jump bar Afficher/masquer la barre de saut - + Ctrl+J - + Edit text Éditer le texte - + Ctrl+Shift+E Ctrl+MAJ+E - + Alt+Down Alt+Bas - + &Run &Lancer - + Ctrl+E - + &Clear &Vider - + Clear the list of recently modified files Vider la liste des fichiers modifiés récemment - + Save/Restore Session Enregistrer/Restaurer une session - + Sa&ve/Restore Session En&registrer/Restaurer une session - + Ctrl+M - + Side-Pane Panneau latéral - + Ctrl+Alt+P - + Paste Date and Time Coller la date et l'heure - + Ctrl+Shift+V Ctrl+MAJ+V - + To Upper Case Mettre en majuscule - + Ctrl+Shift+U Ctrl+MAJ+U - + To Lower Case Mettre en minuscule - + Ctrl+Shift+L Ctrl+MAJ+L + To Start Case + + + + + Last Active Tab Dernier Onglet Actif - + F1 F1 - - + + Sort Lines Trier les lignes - - + + Sort Lines Reversely Trier les lignes dans le sens inverse - + Check Spelling Vérifier l'orthographe - + F2 F2 - - + + Save All Files Sauvegarder tous les fichiers - - + + User Dictionary Dictionnaire de l'utilisateur - + + Text Tabs to Spaces + + + + &Detach Tab &Détacher un onglet - + Ctrl+T - + Close Ne&xt Tabs Fermer les onglets &suivants - + Close &Previous Tabs Fermer les onglets &précédents - + Ne&xt Tab Onglet &suivant - + Previous Ta&b Onglet &précédent - + Execute Exécuter - + Close &All Tabs Fermer &tous les onglets @@ -576,608 +589,659 @@ Récemment &modifié - + &Encoding &Encodage - + &Unicode - + &Western European Europe &Occidentale - + &East European &Europe de l'Est - + Ea&st Asian &Asie de l'Est - - + + - - Rep&lacement - Remp&lacement + + Replacement + Remplacement - + Focus/hide search bar Mettre en évidence/masquer la barre de recherche - + &Replace &Remplacer - + Windows Arabic (&CP1256) Arabe Windows (&CP1256) - + &Other Au&tre - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) &Cyrillique (CP1251) - + Cyrillic (&KOI8-U) Cyrillique (&KOI8-U) - + Cyrillic (&ISO-8859-5) Cyrillique (&ISO-8859-5) - + &Chinese (BIG5) &Chinois (BIG5) - + Chinese (&GB18030) Chinois (&GB18030) - + &Japanese (ISO-2022-JP) &Japonais (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Japonais (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Japonais (ISO-&2022-KR) - + Ja&panese (CP932) Ja&ponais (CP932) - + Japa&nese (EUC-JP) Japo&nais (EUC-JP) - + &Korean (CP949) &Coréen (CP949) - + K&orean (CP1361) C&oréen (CP1361) - + Korean (&EUC-KR) Coréen (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs Fermer les &autres onglets - + &Copy File Name &Copier le nom du fichier - + Copy File &Path Copier le chemin du &fichier - + Alt+Right Alt+Droite - + Alt+Left Alt+Gauche - + &First Tab P&remier onglet - + &Last Tab Dernier on&glet - + Alt+Up Alt+Haut - + Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) Calculer le nombre de mots (Pour les textes volumineux, peut fortement solliciter le processeur.) - + Next Suivant - + Previous Précédent - + Replace all Tout remplacer - + &Recently Opened &Ouvert récemment - + Close Fermer - + Save changes? Enregistrer les changements ? - + Please attend to that window or just close its dialog! Veuillez vous occuper de cette fenêtre ou fermez simplement la boîte de dialogue ! - + &Discard changes Annuler les &modifications - + &Cancel &Annuler - + &No to all &Non à tout - - + + Unsaved Non sauvegardé - - - - - - - - - + + + + + + + + + Lines Lignes - - - + + + Sel. Chars Nb carac. sél. - - - + + + Words Mots - + Another process is running in this tab! Un autre processus a été lancé dans cet onglet ! - + Script File Fichier de script - + Another FeatherPad window has a modal dialog! Une autre fenêtre de FeatherPad a une boite de dialogue modale ! - - + + Position: Position : - - - + + + Normal Normal - - - + + + The file does not exist. Le fichier n'existe pas. - + The document has been modified. Le document a été modifié. - + Open Link Ouvrir le lien - + Copy Link Copier le lien - + Only one process is allowed per tab. Un seul processus est autorisé par onglet. - + Script Output Résultats du script - + Clear Vider - + Non-text file(s) not opened! - + Les fichiers non texte ne sont pas ouverts! - + See Preferences → Files → Do not permit opening of non-text files - + Voir Préférences → Fichiers → Ne pas autoriser l'ouverture de fichiers non texte - + Some file(s) could not be opened! Certains fichiers n'ont pas pu être ouverts ! - + You may not have the permission to read. Vous n'avez par les droits en lecture. - + Uneditable file(s)! Fichier(s) non modifiable(s) ! - + Non-text files or files with huge lines cannot be edited. Les fichiers non textuels ou contenant de trop grandes lignes ne peuvent pas être modifiés. - + Root Instance Instance root - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Cancel Annuler - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + Le texte sélectionné était trop long. + + + + It is not fully processed. + Ce n'est pas entièrement traité. + + + + This file has been modified elsewhere or in another way! Ce fichier a été modifié ailleurs et par un autre moyen ! - - + + Please be careful about reloading or saving this document! Soyez prudent lors du chargement ou de l'enregistrement de ce document ! - - + + Printing in progress... + + + + + Printing completed. + + + + + %1 Pages %1 Pages - - + + Copy Target Path Copier le chemin de la cible - - + + Open Target Here Ouvrir ici la cible - + + + Open Containing Folder + Ouvrir dossier contenant + + + You need to add a Hunspell dictionary. Vous devez ajouter un dictionnaire Hunspell. - - - + + + See Preferences → Text → Spell Checking! Voir Préférences → Texte → Vérification de l'orthographe ! - + The Hunspell dictionary does not exist. Le dictionnaire Hunspell n'existe pas. - + The Hunspell dictionary is not accompanied by an affix file. Le dictionnaire Hunspell n'est pas accompagné de son fichier affixe. - - - + + + No misspelling in document. Pas de fautes d'orthographes dans le document. - - - + + + No misspelling from text cursor. Pas de fautes d'orthographe depuis le curseur. - + Spell Checking Vérification de l'orthographe - + Some files cannot be saved! Un ou plusieurs fichiers ne peuvent pas être sauvegardé(s) ! - + Translators Traducteurs - + A lightweight, tabbed, plain-text editor Un éditeur de texte simple, léger, à onglets - + aka. alias - + FeatherPad does not open files larger than 100 MiB. FeatherPad ne peut pas ouvrir les fichiers de plus de 100 Mio. - + A previous crash detected! Plantage antérieur détecté ! - + Preferably, close all FeatherPad windows and start again! Si possible, fermez toutes les fenêtres de FeatherPad et redémarrer ! - - - + + + All Files (*) Tous les fichiers (*) - + All Files (*);;.%1 Files (*.%1) Tous les fichiers (*);;.%1 Fichiers (*.%1) - + Open file... Ouvrir fichier... - + .%1 Files (*.%1);;All Files (*) .%1 Fichiers (*.%1);;Tous les fichiers (*) - - + + Save as... Enregistrer sous... - + Keep encoding and save as... Conserver l'encodage et enregistrer sous... - + Yes Oui - + No Non - + Do you want to use <b>MS Windows</b> end-of-lines? Voulez-vous utiliser les fins de ligne <b>MS Windows</b> ? - + This may be good for readability under MS Windows. Peut être bénéfique pour la lisibilité sous MS Windows. - + + + + Cannot be saved! Sauvegarde impossible ! - - - + + + + + Help Aide - - - - - - - + + + + + + + Syntax Syntaxe - + Huge file(s) not opened! Fichier(s) volumineux non ouvert(s) ! - + Print Document Imprimer le document - - based on Qt5 - basé sur Qt5 + + based on Qt + basé sur Qt - + Author Auteur - - + + About FeatherPad À propos de FeatherPad - + No Replacement Aucun remplacement - + One Replacement Un remplacement - + %Ln Replacements %Ln remplacement @@ -1185,7 +1249,12 @@ - + + The first 1000 replacements are highlighted. + Les 1000 premiers remplacements sont surlignés. + + + The size limit for syntax highlighting is exceeded. La limite accordée à la coloration syntaxique a été atteinte. @@ -1515,76 +1584,88 @@ Remplacer trois points et traits d'union doubles en cours d'écriture - + + Highlight case-sensitive and whole matches +of the selected text. + Mettez en évidence les correspondances sensibles à la casse et entières +du texte sélectionné. + + + + Selection highlighting + Mettre en évidence la sélection + + + Never highlight syntax for files > Pas de coloration syntaxique pour les fichiers > - + This creates a menu button on the status bar for changing the syntax. Affichera une bouton sur la barre d'état pour permettre la modification de la syntaxe. - + Support syntax override Support de la modification syntaxique - + Show spaces, tabs and tab lines when the syntax is highlighted. Afficher les espaces, les tabulations et lignes de tabulation quand la syntaxe est colorée. - + Show whitespaces Afficher les espaces blancs - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). Les lignes de position verticale s'afficheront uniquement si la police a une taille constante (comme Monospace). - + Show vertical lines starting from this position: Afficher des lignes verticales depuis cette position : - + Also show line and document ends Afficher également la fin de ligne et de document - + Date and time format: Format de la date et de l'heure : - + Some text editors cannot open a document whose last line is not empty. Certains éditeurs de texte ne peuvent ouvrir un document dont la dernière ligne n'est pas vide. - + Ensure an empty last line on saving Conserver une dernière ligne vide lors de l'enregistrement - + Remove trailing spaces on saving Supprimer les espaces de fin à l'enregistrement - + Inertial scrolling with mouse wheel Défilement inertiel de la roulette de la souris @@ -1653,7 +1734,7 @@ Enregistrer les modifications des fichiers ouverts toutes les : - + Help Aide @@ -1704,38 +1785,26 @@ Toujours afficher les &numéros de ligne - + Highlight s&yntax by default Coloration s&yntaxique par défaut - + Dark c&olor scheme Jeu de c&ouleur sombre - + Background color value: Valeur de la couleur d'arrière-plan: - + MiB Mio - - This is not a complete fix but -prevents annoying scroll jumps. - Ce n'est pas un correctif parfait mais -il empêche les sauts de défilement énervants. - - - - Workaround for &Qt5's scroll jump bug - Solution au bug du saut de défilement de &Qt5 - - This only includes executable files written in script languages like Shell and Python. @@ -1755,13 +1824,13 @@ Par la suite, le processus pourra être arrêté avec Ctrl+Alt+E. - + Needs window reopening to take effect. Nécessite la réouverture de la fenêtre pour être activé. - - + + The color value of the background. 255 means white while 0 means black. @@ -1798,8 +1867,8 @@ Nécessite le redémarrage de l'application pour être activé. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1814,22 +1883,22 @@ MMM jj, aaaa, hh:mm:ss - + Text tab size: Taille du texte des onglets : - + spaces espaces - + Thick text cursor Curseur de texte épais - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? Le défilement de la roulette de la souris @@ -1846,7 +1915,9 @@ A Hunspell dictionary has a name that ends with ".dic" and should be alongside an affix file with the same name but ending with ".aff". - + Un dictionnaire Hunspell a un nom qui se termine par ".dic" +et devrait être à côté d'un fichier d'affixe avec le même +nom mais se terminant par ".aff". @@ -1855,7 +1926,7 @@ - + Add dictionary... Ajouter un dictionnaire... @@ -1863,7 +1934,8 @@ If this is unchecked, spell checking will be started from the document start. - + Si cette case n'est pas cochée, la vérification orthographique +démarrera au début du document. @@ -1922,119 +1994,242 @@ Ne pas permettre l'ouverture de fichier n'étant pas de type texte - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + Par défaut, lorsque les fichiers sont copiés, ils +seront ouverts s'ils sont collés dans FeatherPad. + + + + Paste paths instead of files + Coller le chemin plutôt que le fichier + + + Shortcuts Raccourcis - + Action - + Shortcut Raccourci - + Restore default shortcuts. Rétablir les raccourcis par défaut. - + + + Default Défaut - + + Syntax Colors + Couleurs de la syntaxe + + + + Element + Élément + + + + Text Color + Couleur du texte + + + + Whitespace color value: + Valeur de couleur des espaces blancs : + + + + + Has effect only if line numbers are shown. + N'a d'effet que si les numéros de ligne sont affichés. + + + + Current line highlight value: + Valeur de surbrillance de la ligne actuelle : + + + + Restore default syntax colors. + Restaurez les couleurs de syntaxe par défaut. + + + Close Fermer - - + + Press a modifier key to clear a shortcut +in the editing mode. + Appuyez sur une touche de modification pour effacer un raccourci +en mode édition. + + + + Double click a color to change it. + Double-cliquer sur une couleur pour la modifier. + + + + files fichiers - - + + file fichier - - + + Warning: Ambiguous shortcut detected! Attention: raccourci ambigu détecté ! - + + Functions, URLs,… + Fonctions, URL,… + + + + Built-in Functions + Fonctions intégrées + + + + Comments + Commenter + + + + Quotations + Citations + + + + Types + Types + + + + Key Words + Mots clés + + + + Numbers + Nombres + + + + Regular Expressions, Code Blocks,… + Expressions régulières, blocs de code,… + + + + Document Blocks, XML/HTML Elements,… + Blocs de document, éléments XML/HTML,… + + + + Markdown Headings, CSS Values,… + Noter les en-têtes, les valeurs CSS,… + + + + Extra Elements + Éléments supplémentaires + + + Application restart is needed for changes to take effect. Le redémarrage de l'application est nécessaire pour valider les changements. - + Window reopening is needed for changes to take effect. La réouverture de la fenêtre est nécessaire pour valider les changements. - + &Recently Opened &Récemment ouvert - + Recently &Modified Récemment &Modifié - + The typed shortcut was reserved. Le raccourci entré est déjà réservé. - + Hunspell Dictionary Files (*.dic) Fichier(s) de dictionnaire(s) Hunspell (*.dic) + + + + Select Syntax Color + Sélectionnez la couleur de la syntaxe + FeatherPad::SearchBar - - + + Search... Rechercher... - + Match Case Respecter la casse - + Whole Word Mot entier - + Regular Expression Expression régulière - + Search with regex... Rechercher avec regex... - + Next Suivant - + Previous Précédent @@ -2104,7 +2299,7 @@ - + &Yes &Oui @@ -2144,42 +2339,42 @@ Entrer un nom pour enregistrer une session - + Nothing saved.<br>No file was opened. Aucune sauvegarde.<br>Aucun fichier n'a été ouvert. - + No file exists or can be opened. Aucun fichier existant ou pouvant être ouvert. - + Not all files exist or can be opened. Certains fichiers n'existent pas ou ne peuvent être ouverts. - + &OK O&K - + Do you really want to remove all saved sessions? Souhaitez-vous vraiment supprimer toutes les sessions sauvegardées ? - + Do you really want to remove the selected sessions? Souhaitez-vous vraiment supprimer les sessions sélectionnées ? - + Do you really want to remove the selected session? Souhaitez-vous vraiment supprimer la session sélectionnée ? - + A session with the same name exists.<br>Do you want to overwrite it? Il existe une session ayant le même nom.<br>Souhaitez-vous l'écraser ? @@ -2187,7 +2382,7 @@ FeatherPad::SidePane - + Filter... Filtrer... @@ -2233,18 +2428,9 @@ FeatherPad::TextEdit - + Double click to center current line Double clic pour centrer la ligne utilisée - - FeatherPad::WarningBar - - - - Close - Fermer - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_he.ts featherpad-0.17.1/featherpad/data/translations/featherpad_he.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_he.ts 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_he.ts 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,2431 @@ + + + + + FeatherPad::AboutDialog + + + License + רישיון + + + + FeatherPad::FPwin + + + + + + + + + + + + + + Untitled + ללא שם + + + + Go to line: + מעבר לשורה: + + + + Select text from cursor to this line +(Ctrl+Shift+J) + לבחור את הטקסט מהסמן לשורה הזאת +(Ctrl+Shift+J) + + + + Select Text + בחירת טקסט + + + + Ctrl+Shift+J + Ctrl+Shift+J + + + + &File + &קובץ + + + + + &Edit + &עריכה + + + + &Options + &אפשרויות + + + + + + Encoding + קידוד + + + + &Search + &חיפוש + + + + + &Help + &עזרה + + + + Find: + מציאת: + + + + To be replaced + להחלפה + + + + Replace with: + החלפה עם: + + + + Replacing text + טקסט מחליף + + + + &New + &חדש + + + + New tab + לשונית חדשה + + + + Ctrl+N + Ctrl+N + + + + &Open + &פתיחה + + + + Open a file + פתיחת קובץ + + + + Ctrl+O + Ctrl+O + + + + + &Save + &שמירה + + + + Save the current tab + שמירת הלשונית הנוכחית + + + + Ctrl+S + Ctrl+S + + + + &Undo + &ביטול פעולה + + + + Undo + ביטול פעולה + + + + Ctrl+Z + Ctrl+Z + + + + &Redo + &שחזור פעולה + + + + Redo + שחזור פעולה + + + + Ctrl+Shift+Z + Ctrl+Shift+Z + + + + + Reload + טעינה מחדש + + + + Ctrl+Shift+R + Ctrl+Shift+R + + + + &Find + &איתור + + + + Ctrl+F + Ctrl+F + + + + Show/hide replacement dock + הצגת/הסתרת מעגן החלפה + + + + Ctrl+R + Ctrl+R + + + + Save &As + שמירה ב&שם + + + + Ctrl+Shift+S + Ctrl+Shift+S + + + + &Print + ה&דפסה + + + + Ctrl+P + Ctrl+P + + + + Documen&t Properties + מ&אפייני המסמך + + + + Ctrl+Shift+D + Ctrl+Shift+D + + + + &Close + &סגירה + + + + Ctrl+Shift+Q + Ctrl+Shift+Q + + + + &Quit + &יציאה + + + + Ctrl+Q + Ctrl+Q + + + + &Cut + &גזירה + + + + Ctrl+X + Ctrl+X + + + + C&opy + הע&תקה + + + + Ctrl+C + Ctrl+C + + + + &Paste + &הדבקה + + + + Ctrl+V + Ctrl+V + + + + &Delete + &מחיקה + + + + &Select All + לבחור ה&כול + + + + Ctrl+A + Ctrl+A + + + + &Font + &גופן + + + + &Line Numbers + מ&ספרי שורות + + + + Ctrl+L + Ctrl+L + + + + &Wrap Lines + &גלישת שורות + + + + Ctrl+W + Ctrl+W + + + + &Auto-Indentation + ה&זחה אוטומטית + + + + Ctrl+I + Ctrl+I + + + + &Syntax Highlighting + ה&דגשת תחביר + + + + Ctrl+Shift+H + Ctrl+Shift+H + + + + &Preferences + ה&עדפות + + + + Ctrl+Shift+P + Ctrl+Shift+P + + + + Ctrl+H + Ctrl+H + + + + &About + על &אודות + + + + Enforce UTF-8 + אילוץ UTF-8 + + + + Save with &Encoding + שמירה עם &קידוד + + + + &Jump to + ק&פיצה אל + + + + Show/hide jump bar + הצגת/הסתרת לוח קפיצה + + + + Ctrl+J + Ctrl+J + + + + Edit text + עריכת טקסט + + + + Ctrl+Shift+E + Ctrl+Shift+E + + + + &Run + ה&רצה + + + + Ctrl+E + Ctrl+E + + + + &Clear + &פינוי + + + + Clear the list of recently modified files + לפנות את רשימת הקבצים שנערכו לאחרונה + + + + Save/Restore Session + שמירת/שחזור הפעלה + + + + Sa&ve/Restore Session + &שמירת/שחזור הפעלה + + + + Ctrl+M + Ctrl+M + + + + Side-Pane + לוח צד + + + + Ctrl+Alt+P + Ctrl+Alt+P + + + + Paste Date and Time + הדבקת התאריך והשעה + + + + Ctrl+Shift+V + Ctrl+Shift+V + + + + + To Upper Case + לאותיות גדולות + + + + Ctrl+Shift+U + Ctrl+Shift+U + + + + + To Lower Case + לאותיות קטנות + + + + Ctrl+Shift+L + Ctrl+Shift+L + + + + + To Start Case + לגודל התחלתי + + + + + Last Active Tab + הלשונית הפעילה האחרונה + + + + F1 + F1 + + + + + Sort Lines + סידור לעשות + + + + + Sort Lines Reversely + סידור שורות הפוך + + + + Check Spelling + בדיקת איות + + + + F2 + F2 + + + + + Save All Files + לשמור את כל הקבצים + + + + + User Dictionary + מילון משתמש + + + + Text Tabs to Spaces + טאבים בטקסט לרווחים + + + + &Detach Tab + ה&פרדת לשונית + + + + Ctrl+T + Ctrl+T + + + + Close Ne&xt Tabs + סגירת הלשוניות ה&באות + + + + Close &Previous Tabs + סגירת הלשוניות ה&קודמות + + + + Ne&xt Tab + הלשונית הב&אה + + + + Previous Ta&b + הלשונית הקו&דמת + + + + Execute + הפעלה + + + + Close &All Tabs + סגירת &כל הלשוניות + + + + Recently &Modified + נ&ערכו לאחרונה + + + + &Encoding + &קידוד + + + + &Unicode + יו&ניקוד + + + + &Western European + מ&ערב אירופי + + + + &East European + מ&זרח אירופי + + + + Ea&st Asian + מז&רח אסיאתי + + + + + + + Replacement + החלפה + + + + Focus/hide search bar + התמקדות/הסתרת סרגל חיפוש + + + + &Replace + &החלפה + + + + Windows Arabic (&CP1256) + ער&בית ב־Windows‏ (CP1256) + + + + &Other + &אחר + + + + &UTF-8 + &UTF-8 + + + + UTF-&16 + UTF-&16 + + + + &ISO-8859-1 + &ISO-8859-1 + + + + &Windows-1252 + &Windows-1252 + + + + &Cyrillic (CP1251) + &קירילי (CP1251) + + + + Cyrillic (&KOI8-U) + קירילי (&KOI8-U) + + + + Cyrillic (&ISO-8859-5) + קירילי (&ISO-8859-5) + + + + &Chinese (BIG5) + &סיני (BIG5) + + + + Chinese (&GB18030) + סיני (&GB18030) + + + + &Japanese (ISO-2022-JP) + &יפני (ISO-2022-JP) + + + + Japanese (&ISO-2022-JP-2) + יפני (&ISO-2022-JP-2) + + + + Japanese (ISO-&2022-KR) + יפני (ISO-&2022-KR) + + + + Ja&panese (CP932) + יפני (CP932) + + + + Japa&nese (EUC-JP) + יפ&ני (EUC-JP) + + + + &Korean (CP949) + &קוריאני (CP949) + + + + K&orean (CP1361) + ק&וריאני (CP1361) + + + + Korean (&EUC-KR) + קוריאני (&EUC-KR) + + + + ISO-&8859-15 + ISO-&8859-15 + + + + Close &Other Tabs + סגירת הלשוניות הא&חרות + + + + &Copy File Name + ה&עתקת שם קובץ + + + + Copy File &Path + העתקת ה&נתיב לקובץ + + + + Alt+Right + Alt+ימינה + + + + Alt+Left + Alt+שמאלה + + + + &First Tab + הלשונית הר&אשונה + + + + Alt+Down + Alt+למטה + + + + &Last Tab + לשונית א&חרונה + + + + Alt+Up + Alt+למעלה + + + + Menu + תפריט + + + + Calculate number of words +(For huge texts, this may be CPU-intensive.) + לחשב מספר מילים +(לקטעי טקסט ארוכים, עלול לחנוק את המעבד.) + + + + Next + הבא + + + + Previous + הקודם + + + + Replace all + להחליף הכול + + + + &Recently Opened + נפתחו ל&אחרונה + + + + Close + סגירה + + + + Save changes? + לשמור שינויים? + + + + Please attend to that window or just close its dialog! + נא להתייחס לחלון הזה או פשוט לסגור את תיבת הדו־שיח שלו! + + + + The document has been modified. + המסמך נערך. + + + + &Discard changes + הת&עלמות מהשינויים + + + + &Cancel + &ביטול + + + + &No to all + לא לה&כול + + + + + Unsaved + לא נשמר + + + + + + + + + + + + Lines + שורות + + + + + + Sel. Chars + תווים נבחרים + + + + + + Words + מילים + + + + Another process is running in this tab! + תהליך אחר פועל בלשונית הזו! + + + + Script File + קובץ סקריפט + + + + Another FeatherPad window has a modal dialog! + בחלון אחר של FeatherPad נפתחה תיבת דו־שיח חוסמת! + + + + + Position: + מיקום: + + + + + + Normal + רגיל + + + + + + The file does not exist. + קובץ זה אינו קיים. + + + + Open Link + פתיחת קישור + + + + Copy Link + העתקת קישור + + + + Only one process is allowed per tab. + מותר רק תהליך אחד לכל לשונית. + + + + Script Output + פלט סקריפט + + + + Clear + פינוי + + + + FeatherPad does not open files larger than 100 MiB. + FeatherPad אינו פותח קבצים בגודל של מעל ‎100 MiB. + + + + Non-text file(s) not opened! + קבצים שאינם טקסט לא נפתחו! + + + + See Preferences → Files → Do not permit opening of non-text files + יש לעיין בהעדפות ← קבצים ← לא להרשות פתיחת קבצים שאינם טקסט + + + + Some file(s) could not be opened! + לא ניתן לפתוח מספר קבצים! + + + + You may not have the permission to read. + ייתכן ואין לך הרשאה לקריאה. + + + + Uneditable file(s)! + קבצים שאינם פתוחים לעריכה! + + + + Non-text files or files with huge lines cannot be edited. + אי אפשר לערוך קבצים שאינם טקסט או קבצים עם שורות ארוכות במיוחד. + + + + A previous crash detected! + זוהתה התרסקות קודמת! + + + + Preferably, close all FeatherPad windows and start again! + עדיף לסגור את החלונות של FeatherPad ולהתחיל שוב! + + + + Root Instance + עותק משתמש על + + + + + + All Files (*) + כל הקבצים (*) + + + + All Files (*);;.%1 Files (*.%1) + כל הקבצים (*);;קובצי ‎.%1 ‏(‎*.%1) + + + + Open file... + פתיחת קובץ… + + + + .%1 Files (*.%1);;All Files (*) + קובצי ‎.%1‏ (‎*.%1);;כל הקבצים (*) + + + + + Save as... + שמירה בשם… + + + + Keep encoding and save as... + לשמר את הקידוד ולשמור בשם… + + + + Saving as root. + מתבצעת שמירה כמשתמש על. + + + + Waiting for authentication... + בהמתנה לאימות… + + + + "pkexec" is not found. Please install Polkit! + „pkexec” לא נמצא. נא להתקין את Polkit! + + + + Yes + כן + + + + No + לא + + + + Cancel + ביטול + + + + Do you want to use <b>MS Windows</b> end-of-lines? + להשתמש בסיומות שורה בסגנון <b>MS Windows</b>? + + + + This may be good for readability under MS Windows. + עשוי להקל על הקריאה עם MS Windows. + + + + + + + Cannot be saved! + אי אפשר לשמור! + + + + + + + + Help + עזרה + + + + + + + + + + Syntax + תחביר + + + + Huge file(s) not opened! + קובצי ענק לא נפתחו! + + + + Text tabs are converted to spaces. + טאבים בטקסט מומרים לרווחים. + + + + The selected text was too long. + הטקסט הנבחר היה ארוך מדי. + + + + It is not fully processed. + הוא לא עובד במלואו. + + + + + This file has been modified elsewhere or in another way! + הקובץ נערך במקום אחר או בדרך אחרת! + + + + + Please be careful about reloading or saving this document! + נא להיזהר ברענון או שמירת המסמך הזה! + + + + Printing in progress... + מתבצעת הדפסה… + + + + Print Document + הדפסת המסמך + + + + Printing completed. + + + + + + %1 Pages + %1 דפים + + + + + Copy Target Path + העתקת נתיב היעד + + + + + Open Target Here + לפתוח את היעד כאן + + + + + Open Containing Folder + לפתוח את התיקייה המכילה + + + + You need to add a Hunspell dictionary. + עליך להוסיף מילון Hunspell. + + + + + + See Preferences → Text → Spell Checking! + מוטב לגשת אל העדפות ← טקסט ← בדיקת איות! + + + + The Hunspell dictionary does not exist. + מילון Hunspell לא קיים. + + + + The Hunspell dictionary is not accompanied by an affix file. + מילון ה־Hunspell לא מלווה בקובץ מוספית. + + + + + + No misspelling in document. + אין שגיאות איות במסמך. + + + + + + No misspelling from text cursor. + אין שגיאות איות בסמן הטקסט. + + + + Spell Checking + בדיקת איות + + + + Some files cannot be saved! + לא ניתן לשמור חלק מהקבצים! + + + + Translators + מתרגמים + + + + A lightweight, tabbed, plain-text editor + עורך טקסט פשוט, קליל ומסודר בלשוניות + + + + based on Qt + מבוסס על Qt + + + + Author + יוצר + + + + aka. + ידוע גם בתור + + + + + About FeatherPad + על אודות FeatherPad + + + + No Replacement + אין החלפה + + + + One Replacement + החלפה אחת + + + + %Ln Replacements + + החלפה אחת + %Ln החלפות + + + + + The first 1000 replacements are highlighted. + 1000 ההחלפות הראשונות מודגשות. + + + + The size limit for syntax highlighting is exceeded. + חרגת ממגבלת גודל הדגשת התחביר. + + + + FeatherPad::FileDialog + + + Ctrl+H + Toggle showing hidden files + Ctrl+H + + + + Alt+. + Toggle showing hidden files + Alt+.‎ + + + + FeatherPad::FontDialog + + + Select Font + בחירת גופן + + + + Programming Fonts + גופני פיתוח + + + + + Font: + גופן: + + + + Size: + גודל: + + + + Weight: + משקל: + + + + Normal + רגיל + + + + Medium + בינוני + + + + Bold + עבה + + + + Black + עבה מאוד + + + + Italic + נטוי + + + + Preview + תצוגה מקדימה + + + + FeatherPad::LineEdit + + + Clear text (Ctrl+K) + לפנות את הטקסט (Ctrl+K) + + + + FeatherPad::PrefDialog + + + Preferences + העדפות + + + + Window + חלון + + + + Window Settings + הגדרות חלון + + + + Remember window &size on closing + לשמור את &גודל החלון עם הסגירה + + + + + + + Window frame is excluded. + מסגרת החלון לא כלולה. + + + + Start with this size: + להתחיל בגודל הזה: + + + + + px + פיקסלים + + + + × + × + + + + Enforcing a window position is not recommended +and may not work with some window managers. + לא מומלץ לקבע מיקום חלון וזה גם עלול +לא לעבוד בחלק ממנהלי החלונות. + + + + Remember window &position on closing + ל&זכור את מיקום החלון בעתה סגירה + + + + Most suitable with sessions +but without tab functionality. + הכי מתאים להפעלות אבל +בלי תכונות דפדוף בלשוניות. + + + + Uncheck for 1/5 of the width. + לבטל סימון בשביל 1/5 מהרוחב. + + + + Remember splitter position + לזכור את מיקום המפריד + + + + Do not show &toolbar + לא להציג &סרגל כלים + + + + If the menubar is hidden, +a menu button appears on the toolbar. + אם סרגל התפריטים מוסתר, +מופיע כפתור תפריט על סרגל הכלים. + + + + Do not show &menubar + לא להציג את &סרגל התפריטים + + + + Hide search &bar by default + להסתיר את סרגל החיפוש כ&בררת מחדל + + + + By default, each search entry +has a separate search history. + כבררת מחדל, לכל רשומת חיפוש +יש היסטוריית חיפוש נפרדת. + + + + Use a shared search history + להשתמש בהיסטוריית חיפוש שיתופית + + + + Always show st&atus bar + תמיד להציג סרגל מ&צב + + + + Show cursor position on status bar + להציג את מיקום הסמן בסרגל המצב + + + + + Will take effect after closing this dialog. + השינוי יחול לאחר סגירת תיבת הדו־שיח. + + + + Tab position: + מיקום הלשוניות: + + + + North + צפון + + + + South + דרום + + + + West + מערב + + + + East + מזרח + + + + This means that, for LTR, Alt+Right goes to the first tab +after the last tab is activated, and the same for Alt+Left. + +Tab navigation with mouse wheel is not affected. + משמעות הדבר היא ש־Alt+שמאלה יקפיץ ללשונית הראשונה +לאחר הפעלת הלשונית האחרונה ואותו דבר ל־Alt+ימינה. + +ניווט בלשוניות עם גלגלת העכבר לא ישתנה. + + + + Tab navigation wraps &around + ניווט בין לשוניות &גולש בחזרה + + + + Close window on closing its last tab + לסגור את החלון עם סגירת הלשונית האחרונה בו + + + + By default, if a FeatherPad window exists on the +current desktop, files will be opened in its tabs. + +However, some desktop environments may not +report that they have multiple desktops. + כבררת מחדל, אם קיים חלון FeatherPad בשולחן +העבודה הנוכחי, הקבצים ייפתחו אצלו בלשוניות. + +עם זאת, חלק מסביבות שולחן העבודה עשויות +שלא לדווח שהן מחזיקות מספר שולחנות עבודה. + + + + Always open in separate windows + תמיד לפתוח בחלונות נפרדים + + + + If this is checked, the file dialog provided by the current +desktop environment will be used instead of the Qt file dialog. + +Some desktop environments, like KDE and LXQt, provide files dialogs. + אם אפשרות זו מסומנת, תיבת דו־שיח הקובץ שמסופקת על ידי סביבת +שולחן העבודה הנוכחית תהיה בשימוש במקום תיבת הדו־שיח של Qt. + +חלק מסביבות העבודה כגון KDE ו־LXQt מספקות תיבות דו שיח לבחירת קבצים. + + + + Native file dialog + תיבת דו־שיח קבצים טבעית + + + + Uncheck for Monospace. + לבטל סימון לרוחב אחיד. + + + + Remember &font + ל&זכור את הגופן + + + + This covers parentheses, braces, brackets and quotes. + כולל סוגריים רגילים, מסולסלים, מרובעים וציטטות. + + + + Auto-&bracket + &סגירה אוטומטית + + + + By default, a triple period is replaced with an ellipsis +and a double hyphen with a long dash while typing, +under proper circumstances. + כבררת מחדל, שלוש נקודות יוחלפו בסימן השמטה +ומינוס כפול יוחלף במינוס ארוך בזמן ההקלדה, +תחת תנאים מתאימים. + + + + Replace triple periods and double hyphens while typing + החלפת שלוש נקודות ומינוסים כפולים בזמן ההקלדה + + + + Highlight case-sensitive and whole matches +of the selected text. + להדגיש התאמות תלויות רישיות ומלאות +של הטקסט הנבחר. + + + + Selection highlighting + הדגשת בחירה + + + + Never highlight syntax for files > + אף פעם לא להדגיש תחביר לקבצים > + + + + This creates a menu button on the +status bar for changing the syntax. + יוצר כפתור תפריט בסרגל +המצב לשינוי התחביר. + + + + Support syntax override + תמיכה בדריסת תחביר + + + + Show spaces, tabs and tab lines +when the syntax is highlighted. + להציג רווחים, טאבים ושורות טאב +כאשר מופעלת הדגשת תחביר. + + + + Show whitespaces + להציג רווחים + + + + + The vertical position lines will be drawn only if +the editor font has a fixed pitch (like Monospace). + קווי המיקום האנכי יצוירו רק עם אותיות גופן העורך הן +באותו הרוחב (כגון רוחב אחיד). + + + + Show vertical lines starting from this position: + להציג שורות אנכיות החל מהמיקום הזה: + + + + Also show line and document ends + להציג גם סיומות שורה ומסמך + + + + Date and time format: + תצורת תאריך ושעה: + + + + Some text editors cannot open a document +whose last line is not empty. + חלק מעורכי הטקסט לא יכולים לפתוח +מסמך שהשורה האחרונה שלו אינה ריקה. + + + + Ensure an empty last line on saving + לוודא שיש שורה ריקה בסוף עם השמירה + + + + Remove trailing spaces on saving + להסיר רווח מהסוף בעת שמירה + + + + Inertial scrolling with mouse wheel + גלילה מתמידה עם גלגלת העכבר + + + + Files + קבצים + + + + File Management + ניהול קבצים + + + + Start with files of last window + התחלה עם הקבצים של החלון האחרון + + + + + This can be any starting command with +arguments, for example, "xterm -hold" +for running the process in XTerm. + +If the command is left empty, the file +will be executed directly. + +If the script is not run in a terminal +emulator, the output and error messages +will be shown by a popup dialog. + זאת יכולה להיות כל פקודת הפעלה עם +משתנים, למשל, „xterm -hold” להרצת +התהליך בתוך XTerm. + +אם הפקודה נשארת ריקה, הקובץ יופעל +ישירות. + +אם הסקריפט לא מופעל בהדמיית מסוף, +הפלט והודעות השגיאה יופיעו בחלונית +דו־שיח קופצת. + + + + Start with this command: + להתחיל עם הפקודה שלהלן: + + + + Command + Arguments + פקודה + ארגומנטים + + + + Show recentl&y modified files + להציג את הקבצים שנערכו ל&אחרונה + + + + Show recentl&y opened files + להציג קבצים שנפתחו ל&אחרונה + + + + Save changes to opened files every: + שמירת השינויים בקבצים הפתוחים בכול: + + + + Help + עזרה + + + + Start with side-pane mode + להתחיל במצב סרגל צד + + + + If this is checked, not only you will lose the informative +tooltip and context menu of a single tab but you could not +merge a single tabbed window into another one by tab drag- +and-drop either. + אם אפשרות זו מסומנת, לא רק שהעצות המפורטות ותפריט +ההקשר ללשונית יחידה ילכו לאיבוד אך גם לא יתאפשר לך +למזג חלון אחד עם לשוניות לתוך חלון אחר בגרירה והשלכה. + + + + &Do not show a single tab + &לא להציג לשונית יחידה + + + + Text + טקסט + + + + Text Editor + עורך טקסט + + + + &Wrap lines by default + &גלישת שורות כבררת מחדל + + + + Auto-&indent by default + לה&זיח אוטומטית כבררת מחדל + + + + Always show line &numbers + תמיד להציג מ&ספרי שורות + + + + Highlight s&yntax by default + ה&דגשת תחביר כבררת מחדל + + + + Dark c&olor scheme + ערכת &צבעים כהה + + + + Background color value: + ערך צבע רקע: + + + + MiB + MiB + + + + This only includes executable files written +in script languages like Shell and Python. + +If it is checked and the opened file is +executable, the file will be executed by clicking +the Run button, that appears on the toolbar/filemenu +when needed, or by its shortcut Ctrl+E. Then, the +process could be killed by Ctrl+Alt+E. + כולל רק קובצי הפעלה שנכתבו בשפות סקריפטים כגון +Shell ו־Python. + +אם האפשרות מסומנת וניתן להפעיל את הקובץ שנפתח, +הקובץ יופעל בלחיצה על כפתור ההרצה שמופיע בסרגל +הכלים/תפריט הקובץ בעת הצורך או עם קיצור הדרך +Ctrl+E. לאחר מכן, ניתן להרוד את התהליך בעזרת +Ctrl+Alt+E. + + + + Needs window reopening to take effect. + פתיחת החלון מחדש נחוצה בשביל הכנסת השינויים לתוקף. + + + + + The color value of the background. +255 means white while 0 means black. + +For the light background, it can be +between 230 and 255; for the dark +background, between 0 and 50. + +Needs window reopening to take effect. + ערך הצבע של הרקע. +255 זה לבן בעוד 0 זה שחור. + +לרקע בהיר, זה יכול להיות בין 230 +ל־255, לרקע כהה בין 0 ל־50. + +יש לפתוח את החלון מחדש כדי להחיל את +השינויים. + + + + Run executable scripts + הרצת סקריפטים שניתן להריץ + + + + + The maximum number of recently modified or +opened files FeatherPad shows. The default +is 10. + +Needs application restart to take effect. + הכמות המרבית של קבצים שנערכו או נפתחו לאחרונה +ש־FeatherPad מציג. בררת המחדל היא 10. + +צריך להפעיל את היישומון מחדש כדי שהשינויים +ייכנסו לתוקף. + + + + + Used for pasting the date and time. + +Takes effect after closing this dialog. + +Leave empty for: +MMM dd, yyyy, hh:mm:ss + משמש להדבקת התאריך והשעה. + +חל לאחר סגירת תיבת הדו־שיח. + +יש להשאיר ריק כדי לקבל: +MMM dd, yyyy, hh:mm:ss + + + + Text tab size: + גודל טאב טקסט: + + + + spaces + רווחים + + + + Thick text cursor + סמן טקסט עבה + + + + Should the mouse wheel scrolling be inertial +if the cursor is inside the text view? + האם גלילת העכבר צריכה להיות מתמדת +אם הסמן בתוך תצוגת הטקסט? + + + + Spell Checking + בדיקת איות + + + + + A Hunspell dictionary has a name that ends with ".dic" +and should be alongside an affix file with the same +name but ending with ".aff". + שם של מילון Hunspell מסתיים ב־ „‎.dic” ואמור להיות לצד +קובץ מוספית עם אותו השם אך עם הסיומת „‎.aff”. + + + + Hunspell dictionary path: + נתיב מילון Hunspell: + + + + + Add dictionary... + הוספת מילון… + + + + If this is unchecked, spell checking +will be started from the document start. + אם האפשרות הזאת אינה מסומנת, בדיקת איות +תחל עם פתיחת המסמך. + + + + Start spell checking from text cursor + להתחיל בדיקת איות מסמן הטקסט + + + + Number of recent files: + מספר הקבצים האחרונים: + + + + Only if their number is not greater than 50. + רק אם המספר שלהם אינו עולה על 50. + + + + + Only for files that exist and can be saved. + רק עבור קבצים שקיימים וניתן לשמור אותם. + + + + min + דקות + + + + If this is checked, the Save button/menu-item could +be used also when the opened file is not modified. + +This can be useful under certain circumstances, +e.g. for changing the time stamp or removing the +trailing spaces of a text file. + אם אפשרות זו מסומנת, הכפתור/הפריט בתפריט שמירה +יכול לשמש גם כאשר הקבצים שנפתחו לא נערכו. + +עשוי להיות שימושי במקרים מסוימים, למשל לטובת שינוי +חותמת הזמן או הסרת הרווחים ההתחלתיים בקובץ טקסט. + + + + Allow saving unmodified files + לאפשר שמירת קבצים שלא השתנו + + + + Show a warning instead. + להציג אזהרה במקום. + + + + Do not permit opening of non-text files + לא לאפשר פתיחת קבצים שאינם טקסט + + + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + כברירת המחדל, כאשר קבצים יועתקו, הם +ייפתחו אם הם יודבקו לתוך FeatherPad. + + + + Paste paths instead of files + הדבקת נתיבים במקום קבצים + + + + Shortcuts + קיצורים + + + + Action + פעולה + + + + Shortcut + קיצור + + + + Restore default shortcuts. + שחזור קיצורי ברירת המחדל. + + + + + + Default + ברירת מחדל + + + + Syntax Colors + צבעי תחביר + + + + Element + אלמנט + + + + Text Color + צבע הטקסט + + + + Whitespace color value: + ערך צבע רווח: + + + + + Has effect only if line numbers are shown. + תקף רק אם מופיעים מספרי שורות. + + + + Current line highlight value: + ערך הדגשת השורה הנוכחית: + + + + Restore default syntax colors. + שחזור צבעי התחביר כבררת מחדל. + + + + Close + סגירה + + + + Press a modifier key to clear a shortcut +in the editing mode. + יש ללחוץ על מקש החלפה כדי לפנות קיצור דרך +במצב העריכה. + + + + Double click a color to change it. + יש ללחוץ על צבע לחיצה כפולה כדי לשנות אותו. + + + + + files + קבצים + + + + + file + קובץ + + + + + Warning: Ambiguous shortcut detected! + אזהרה: התגלה קיצור דרך דו־משמעי! + + + + Functions, URLs,… + פונקציות, כתובות, … + + + + Built-in Functions + פונקציות מובנות + + + + Comments + הערות + + + + Quotations + ציטוטים + + + + Types + סוגים + + + + Key Words + מילות מפתח + + + + Numbers + מספרים + + + + Regular Expressions, Code Blocks,… + ביטויים רגולריים, מקטעי קוד, … + + + + Document Blocks, XML/HTML Elements,… + מקטעי מסמך, רכיבי XML/HTML, … + + + + Markdown Headings, CSS Values,… + כותרות Markdown, ערכי CSS, … + + + + Extra Elements + אלמנטים נוספים + + + + Application restart is needed for changes to take effect. + הפעלת היישום מחדש נחוצה כדי להכניס השינויים לתוקף. + + + + Window reopening is needed for changes to take effect. + פתיחת החלון מחדש נחוצה כדי להכניס את השינויים לתוקף. + + + + &Recently Opened + נפתחו ל&אחרונה + + + + Recently &Modified + נ&ערכו לאחרונה + + + + The typed shortcut was reserved. + קיצור הדרך שהוקלד נשמר. + + + + Hunspell Dictionary Files (*.dic) + קובצי מילון Hunspell‏ (‎*.dic) + + + + + Select Syntax Color + בחירת צבע תחביר + + + + FeatherPad::SearchBar + + + + Search... + חיפוש... + + + + Match Case + התאמת רישיות + + + + Whole Word + מילה שלמה + + + + Regular Expression + ביטוי רגולרי + + + + Search with regex... + חיפוש עם ביטוי רגולרי… + + + + Next + אחורה + + + + Previous + אחורה + + + + FeatherPad::SessionDialog + + + Session Manager + מנהל הפעלות + + + + + &Remove + &הסרה + + + + <b>Save/Restore Session</b> + <b>שמירת/שחזור הפעלה</b> + + + + Filter... + סינון… + + + + Open the selected session(s). + פתיחת ההפעלות הנבחרות. + + + + + &Open + &פתיחה + + + + + Del + Del + + + + + Ctrl+Del + Ctrl+Del + + + + By default, all files that are opened in all +windows will be included in the saved session. + כבררת המחדל כל הקבצים שפתוחים בכל +החלונות יכללו בהפעלה השמורה. + + + + Save only from this &window + שמירה רק מה&חלון הזה + + + + <b>Warning</b> + <b>אזהרה</b> + + + + + &Yes + &כן + + + + &No + &לא + + + + Re&name + שינוי &שם + + + + Remove &All + להסיר &הכול + + + + &Close + &סגירה + + + + Save the current session under the given title. + שמירת ההפעלה הנוכחית תחת השם הנתון. + + + + &Save + &שמירה + + + + Type a name to save session + נא לתת שם להפעלה + + + + Nothing saved.<br>No file was opened. + לא נבחר דבר.<br>לא נפתחו קבצים כלל. + + + + No file exists or can be opened. + אין קובץ קיים או ניתן לפתיחה. + + + + Not all files exist or can be opened. + לא כל הקבצים קיימים או ניתנים לפתיחה. + + + + &OK + &אישור + + + + Do you really want to remove all saved sessions? + האם אכן ברצונך להסיר את כל ההפעלות השמורות? + + + + Do you really want to remove the selected sessions? + האם אכן ברצונך להסיר את ההפעלות הנבחרות? + + + + Do you really want to remove the selected session? + האם אכן ברצונך להסיר את ההפעלה שנבחרה? + + + + A session with the same name exists.<br>Do you want to overwrite it? + קיימת הפעלה עם שם זהה.<br>האם ברצונך לדרוס אותה? + + + + FeatherPad::SidePane + + + Filter... + סינון… + + + + FeatherPad::SpellDialog + + + Unknown word: + מילה לא מוכרת: + + + + Add To Dictionary + הוספה למילון + + + + Replace with: + להחליף עם: + + + + Correct Once + לתקן פעם אחת + + + + Correct All + לתקן הכול + + + + Ignore Once + להתעלם פעם אחת + + + + Ignore All + התעלמות מהכול + + + + FeatherPad::TextEdit + + + Double click to center current line + לחיצה כפולה ממרכזת את השורה הנוכחית + + + diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_hu.ts featherpad-0.17.1/featherpad/data/translations/featherpad_hu.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_hu.ts 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_hu.ts 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,2430 @@ + + + + + FeatherPad::AboutDialog + + + License + Licenc + + + + FeatherPad::FPwin + + + + + + + + + + + + + + Untitled + Névtelen + + + + Go to line: + Ugrás sorra: + + + + Select text from cursor to this line +(Ctrl+Shift+J) + Szöveg kijelölése a kurzortól eddig a sorig +(Ctrl+Shift+J) + + + + Select Text + Szöveg kijelölése + + + + Ctrl+Shift+J + Ctrl+Shift+J + + + + &File + &Fájl + + + + + &Edit + S&zerkesztés + + + + &Options + &Beállítások + + + + + + Encoding + Kódolás + + + + &Search + &Keresés + + + + + &Help + &Súgó + + + + Find: + Ezt: + + + + To be replaced + lecserélni + + + + Replace with: + Erre: + + + + Replacing text + a szövegre + + + + &New + Ú&j + + + + New tab + Új lap + + + + Ctrl+N + Ctrl+N + + + + &Open + &Megnyitás + + + + Open a file + Fájl megnyitása + + + + Ctrl+O + Ctrl+O + + + + + &Save + Menté&s + + + + Save the current tab + Aktuális lap mentése + + + + Ctrl+S + Ctrl+S + + + + &Undo + &Visszavonás + + + + Undo + Visszavonás + + + + Ctrl+Z + Ctrl+Z + + + + &Redo + &Mégis + + + + Redo + Mégis + + + + Ctrl+Shift+Z + Ctrl+Shift+Z + + + + + Reload + Újratöltés + + + + Ctrl+Shift+R + Ctrl+Shift+R + + + + &Find + &Keresés + + + + Ctrl+F + Ctrl+F + + + + Show/hide replacement dock + Csere panel megjelenítése/elrejtése + + + + Ctrl+R + Ctrl+R + + + + Save &As + Me&ntés másként + + + + Ctrl+Shift+S + Ctrl+Shift+S + + + + &Print + N&yomtatás + + + + Ctrl+P + Ctrl+P + + + + Documen&t Properties + Dokument&umtulajdonságok + + + + Ctrl+Shift+D + Ctrl+Shift+D + + + + &Close + &Bezárás + + + + Ctrl+Shift+Q + Ctrl+Shift+Q + + + + &Quit + K&ilépés + + + + Ctrl+Q + Ctrl+Q + + + + &Cut + &Kivágás + + + + Ctrl+X + Ctrl+X + + + + C&opy + Má&solás + + + + Ctrl+C + Ctrl+C + + + + &Paste + &Beillesztés + + + + Ctrl+V + Ctrl+V + + + + &Delete + &Törlés + + + + &Select All + Össz&es kijelölése + + + + Ctrl+A + Ctrl+A + + + + &Font + &Betűtípus + + + + &Line Numbers + &Sorszámok + + + + Ctrl+L + Ctrl+L + + + + &Wrap Lines + Sortö&rés + + + + Ctrl+W + Ctrl+W + + + + &Auto-Indentation + &Automatikus behúzás + + + + Ctrl+I + Ctrl+I + + + + &Syntax Highlighting + Szinta&xiskiemelés + + + + Ctrl+Shift+H + Ctrl+Shift+H + + + + &Preferences + Beá&llítások + + + + Ctrl+Shift+P + Ctrl+Shift+P + + + + Ctrl+H + Ctrl+H + + + + &About + &Névjegy + + + + Enforce UTF-8 + UTF-8 kényszerítése + + + + Save with &Encoding + Mentés kó&dolással + + + + &Jump to + &Ugrás + + + + Show/hide jump bar + Ugrás panel megjelenítése/elrejtése + + + + Ctrl+J + Ctrl+J + + + + Edit text + Szöveg szerkesztése + + + + Ctrl+Shift+E + Ctrl+Shift+E + + + + &Run + &Futtatás + + + + Ctrl+E + Ctrl+E + + + + &Clear + &Tisztítás + + + + Clear the list of recently modified files + Nemrég módosított fájlok listájának törlése + + + + Save/Restore Session + Munkamenet mentése/betöltése + + + + Sa&ve/Restore Session + Munk&amenet mentése/visszaállítása + + + + Ctrl+M + Ctrl+M + + + + Side-Pane + Oldalsáv + + + + Ctrl+Alt+P + Ctrl+Alt+P + + + + Paste Date and Time + Dátum és idő beillesztése + + + + Ctrl+Shift+V + Ctrl+Shift+V + + + + + To Upper Case + Nagybetűssé + + + + Ctrl+Shift+U + Ctrl+Shift+U + + + + + To Lower Case + Kisbetűssé + + + + Ctrl+Shift+L + Ctrl+Shift+L + + + + + To Start Case + A szó első betűje nagybetű + + + + + Last Active Tab + Utolsó aktív lap + + + + F1 + F1 + + + + + Sort Lines + Sorok rendezése + + + + + Sort Lines Reversely + Sorok rendezése fordítva + + + + Check Spelling + Helyesírás-ellenőrzés + + + + F2 + F2 + + + + + Save All Files + Minden fájl mentése + + + + + User Dictionary + Felhasználói szótár + + + + Text Tabs to Spaces + Behúzások átalakítása szóközökké + + + + &Detach Tab + Lap le&választása + + + + Ctrl+T + Ctrl+T + + + + Close Ne&xt Tabs + Következő lapok be&zárása + + + + Close &Previous Tabs + Előző lapok &bezárása + + + + Ne&xt Tab + &Következő lap + + + + Previous Ta&b + &Előző lap + + + + Execute + Futtatás + + + + Close &All Tabs + Ö&sszes lap bezárása + + + + Recently &Modified + Nem&rég módosított + + + + &Encoding + &Kódolás + + + + &Unicode + &Unicode + + + + &Western European + &Nyugat-Európai + + + + &East European + &Kelet-Európai + + + + Ea&st Asian + K&elet-Ázsiai + + + + + + + Replacement + Csere + + + + Focus/hide search bar + Ugrás a keresősávra/keresősáv elrejtése + + + + &Replace + &Csere + + + + Windows Arabic (&CP1256) + Windows Arab (&CP1256) + + + + &Other + &Egyéb + + + + &UTF-8 + &UTF-8 + + + + UTF-&16 + UTF-&16 + + + + &ISO-8859-1 + &ISO-8859-1 + + + + &Windows-1252 + &Windows-1252 + + + + &Cyrillic (CP1251) + &Cirill (CP1251) + + + + Cyrillic (&KOI8-U) + Cirill (&KOI8-U) + + + + Cyrillic (&ISO-8859-5) + Cirill (&ISO-8859-5) + + + + &Chinese (BIG5) + &Kínai (BIG5) + + + + Chinese (&GB18030) + Kínai (&GB18030) + + + + &Japanese (ISO-2022-JP) + &Japán (ISO-2022-JP) + + + + Japanese (&ISO-2022-JP-2) + Japán (&ISO-2022-JP-2) + + + + Japanese (ISO-&2022-KR) + Japán (ISO-&2022-KR) + + + + Ja&panese (CP932) + Ja&pán (CP932) + + + + Japa&nese (EUC-JP) + Japá&n (EUC-JP) + + + + &Korean (CP949) + Ko&reai (CP949) + + + + K&orean (CP1361) + K&oreai (CP1361) + + + + Korean (&EUC-KR) + Koreai (&EUC-KR) + + + + ISO-&8859-15 + ISO-&8859-15 + + + + Close &Other Tabs + &Többi lap bezárása + + + + &Copy File Name + &Fájlnév másolása + + + + Copy File &Path + Fájl &útvonalának másolása + + + + Alt+Right + Alt+Jobb + + + + Alt+Left + Alt+Bal + + + + &First Tab + Első la&p + + + + Alt+Down + Alt+Le + + + + &Last Tab + Utolsó &lap + + + + Alt+Up + Alt+Fel + + + + Menu + Menü + + + + Calculate number of words +(For huge texts, this may be CPU-intensive.) + Szavak számának kiszámítása +(Óriási szövegeknél ez processzor-igényes lehet.) + + + + Next + Következő + + + + Previous + Előző + + + + Replace all + Összes cseréje + + + + &Recently Opened + Nem&rég megnyitott + + + + Close + Bezárás + + + + Save changes? + Menti a változtatásokat? + + + + Please attend to that window or just close its dialog! + Látogasson el arra az ablakra, vagy csak zárja be a párbeszédablakát! + + + + The document has been modified. + A dokumentum módosult. + + + + &Discard changes + &Elvetés + + + + &Cancel + &Mégse + + + + &No to all + &Nem az összeset + + + + + Unsaved + Nincs mentve + + + + + + + + + + + + Lines + Sorok + + + + + + Sel. Chars + Kijelölt karakterek + + + + + + Words + Szavak + + + + Another process is running in this tab! + Egy másik folyamat már fut ezen a lapon! + + + + Script File + Parancsfájl + + + + Another FeatherPad window has a modal dialog! + Egy másik FeatherPad ablaknak már van egy párbeszédablaka! + + + + + Position: + Helyzet: + + + + + + Normal + Normál + + + + + + The file does not exist. + A fájl nem létezik. + + + + Open Link + Link megnyitása + + + + Copy Link + Link másolása + + + + Only one process is allowed per tab. + Laponként csak egy folyamat megengedett. + + + + Script Output + Szkriptkimenet + + + + Clear + Tisztítás + + + + FeatherPad does not open files larger than 100 MiB. + A FeatherPad nem tud 100 MiB-nál nagyobb fájlokat megnyitni. + + + + Non-text file(s) not opened! + A nem szöveges fájlok nem lettek megnyitva! + + + + See Preferences → Files → Do not permit opening of non-text files + Lásd: Beállítások → Fájlok → Nem szöveges fájlok megnyitásának letiltása + + + + Some file(s) could not be opened! + Néhány fájlt nem lehet megnyitni! + + + + You may not have the permission to read. + Lehet, hogy nincs engedélye az olvasásra. + + + + Uneditable file(s)! + Nem szerkeszthető fájl(ok)! + + + + Non-text files or files with huge lines cannot be edited. + A nem szöveges fájlok vagy a hatalmas sorokkal rendelkező fájlok nem szerkeszthetők. + + + + A previous crash detected! + Korábbi összeomlás észlelve! + + + + Preferably, close all FeatherPad windows and start again! + Lehetőleg zárja be az összes FeatherPad ablakot, és indítsa újra! + + + + Root Instance + Root példány + + + + + + All Files (*) + Minden fájl (*) + + + + All Files (*);;.%1 Files (*.%1) + Minden fájl (*);;.%1 Fájlok (*.%1) + + + + Open file... + Fájl megnyitása... + + + + .%1 Files (*.%1);;All Files (*) + %1 Fájlok (*.%1);;Minden fájl (*) + + + + + Save as... + Mentés másként... + + + + Keep encoding and save as... + Kódolás megtartása és mentés másként... + + + + Saving as root. + Mentés rootként. + + + + Waiting for authentication... + Várakozás hitelesítésre... + + + + "pkexec" is not found. Please install Polkit! + A "pkexec" nem található. Telepítse a Polkit programot! + + + + Yes + Igen + + + + No + Nem + + + + Cancel + Mégse + + + + Do you want to use <b>MS Windows</b> end-of-lines? + Biztos <b>MS Windows</b> sorvégeket akar használni? + + + + This may be good for readability under MS Windows. + Ez jó lehet, ha MS Windowson is meg szeretné nyitni. + + + + + + + Cannot be saved! + Nem menthető! + + + + + + + + Help + Súgó + + + + + + + + + + Syntax + Szintaxis + + + + Huge file(s) not opened! + A nagy fájl(ok) nem lett(ek) megnyitva! + + + + Text tabs are converted to spaces. + A behúzások átalakítva szóközökké. + + + + The selected text was too long. + A kijelölt szöveg túl hosszú volt. + + + + It is not fully processed. + Nincs teljesen feldolgozva. + + + + + This file has been modified elsewhere or in another way! + Ezt a fájlt máshol vagy máshogyan módosították! + + + + + Please be careful about reloading or saving this document! + Legyen óvatos a dokumentum újratöltésével vagy mentésével kapcsolatban! + + + + Printing in progress... + Nyomtatás folyamatban... + + + + Print Document + Dokumentum nyomtatása + + + + Printing completed. + A nyomtatás kész. + + + + + %1 Pages + %1 lap + + + + + Copy Target Path + Cél útvonalának másolása + + + + + Open Target Here + Cél megnyitása itt + + + + + Open Containing Folder + Tartalmazó mappa megnyitása + + + + You need to add a Hunspell dictionary. + Fel kell vennie egy Hunspell szótárt. + + + + + + See Preferences → Text → Spell Checking! + Lásd: Beállítások → Szöveg → Helyesírás-ellenőrzés! + + + + The Hunspell dictionary does not exist. + A Hunspell szótár nem létezik. + + + + The Hunspell dictionary is not accompanied by an affix file. + A Hunspell szótárhoz nem kapcsolódik affix fájl. + + + + + + No misspelling in document. + Nincs helyesírási hiba a dokumentumban. + + + + + + No misspelling from text cursor. + Nincs helyesírási hiba a kijelölt szövegben. + + + + Spell Checking + Helyesírás-ellenőrzés + + + + Some files cannot be saved! + Néhány fájlt nem lehet menteni! + + + + Translators + Fordítók + + + + A lightweight, tabbed, plain-text editor + Egy könnyed, lapokkal ellátott, egyszerű szövegszerkesztő + + + + based on Qt + amely a Qt-n alapul + + + + Author + Szerző + + + + aka. + más néven + + + + + About FeatherPad + FeatherPad névjegye + + + + No Replacement + Nincs csere + + + + One Replacement + Egy csere + + + + %Ln Replacements + + %Ln csere + + + + + The first 1000 replacements are highlighted. + Az első 1000 csere van kiemelve. + + + + The size limit for syntax highlighting is exceeded. + A szintaxiskiemelés méretkorlátja túllépve. + + + + FeatherPad::FileDialog + + + Ctrl+H + Toggle showing hidden files + Ctrl+H + + + + Alt+. + Toggle showing hidden files + Alt+. + + + + FeatherPad::FontDialog + + + Select Font + Betűtípus kiválasztása + + + + Programming Fonts + Betűtípusok programozáshoz + + + + + Font: + Betűtípus: + + + + Size: + Méret: + + + + Weight: + Vastagság: + + + + Normal + Normál + + + + Medium + Közepes + + + + Bold + Félkövér + + + + Black + Kövér + + + + Italic + Dőlt + + + + Preview + Előnézet + + + + FeatherPad::LineEdit + + + Clear text (Ctrl+K) + Szöveg törlése (Ctrl+K) + + + + FeatherPad::PrefDialog + + + Preferences + Beállítások + + + + Window + Ablak + + + + Window Settings + Ablakbeállítások + + + + Remember window &size on closing + Ablakméret megjegyzé&se bezáráskor + + + + + + + Window frame is excluded. + Az ablakkeret nincs hozzá számolva. + + + + Start with this size: + Indulás ezzel a mérettel: + + + + + px + px + + + + × + × + + + + Enforcing a window position is not recommended +and may not work with some window managers. + Az ablakpozíció kényszerítése nem ajánlott, +és lehet, hogy néhány ablakkezelővel nem működik együtt. + + + + Remember window &position on closing + Ablak&pozíció megjegyzése bezáráskor + + + + Most suitable with sessions +but without tab functionality. + Legalkalmasabb munkamenetekkel +de lapfunkciók nélkül. + + + + Uncheck for 1/5 of the width. + Ne jelölje be, ha a szélesség 1/5-ét szeretné. + + + + Remember splitter position + Elválasztó helyzetének megjegyzése + + + + Do not show &toolbar + Eszköz&tár elrejtése + + + + If the menubar is hidden, +a menu button appears on the toolbar. + Ha a menüsor rejtett, +a menü gomb megjelenik az eszköztáron. + + + + Do not show &menubar + &Menüsor elrejtése + + + + Hide search &bar by default + K&eresősáv elrejtése alapértelmezetten + + + + By default, each search entry +has a separate search history. + Alapértelmezetten minden keresésnek +külön keresési előzményei vannak. + + + + Use a shared search history + Megosztott keresési előzmények használata + + + + Always show st&atus bar + Áll&apotsor megjelenítése mindig + + + + Show cursor position on status bar + Egérpozíció megjelenítése az állapotsoron + + + + + Will take effect after closing this dialog. + A párbeszédpanel bezárása után lép érvénybe. + + + + Tab position: + Lapok helyzete: + + + + North + Fent + + + + South + Lent + + + + West + Balra + + + + East + Jobbra + + + + This means that, for LTR, Alt+Right goes to the first tab +after the last tab is activated, and the same for Alt+Left. + +Tab navigation with mouse wheel is not affected. + Ez azt jelenti, hogy az utolsó lap esetén az Alt+Jobbra az első lapra lép +az utolsó lap után, és ugyanez igaz fordítva is. + +A lapok egérkerékkel történő váltását ez nem érinti. + + + + Tab navigation wraps &around + Lapok körbejárás&a + + + + Close window on closing its last tab + Ablak bezárása az utolsó lap bezárásakor + + + + By default, if a FeatherPad window exists on the +current desktop, files will be opened in its tabs. + +However, some desktop environments may not +report that they have multiple desktops. + Alapértelmezés szerint, ha van egy FeatherPad ablak a +az aktuális asztalon, a fájlok a lapjain lesznek megnyitva. + +Néhány asztali környezet azonban nem +jelenti, hogy több asztaluk van. + + + + Always open in separate windows + Mindig külön ablakban nyissa meg + + + + If this is checked, the file dialog provided by the current +desktop environment will be used instead of the Qt file dialog. + +Some desktop environments, like KDE and LXQt, provide files dialogs. + Ha ez be van jelölve, akkor a Qt fájl-párbeszédpanel helyett az +aktuális asztali környezet által biztosított fájl-párbeszédpanel kerül felhasználásra. + +Néhány asztali környezet, például a KDE és az LXQt, biztosít fájl-párbeszédpanelt. + + + + Native file dialog + Alapértelmezett fájl-párbeszédpanel + + + + Uncheck for Monospace. + Ne jelölje be, ha a Monospace-t szeretné. + + + + Remember &font + Be&tűtípus megjegyzése + + + + This covers parentheses, braces, brackets and quotes. + Ez bezárja a zárójeleket, és az idézőjeleket. + + + + Auto-&bracket + A&utomatikus zárójelkiegészítés + + + + By default, a triple period is replaced with an ellipsis +and a double hyphen with a long dash while typing, +under proper circumstances. + Alapértelmezés szerint a három pont helyébe hármaspont kerül +és a dupla kötőjelet hosszú kötőjel váltja fel gépelés közben, +a megfelelő körülmények között. + + + + Replace triple periods and double hyphens while typing + Három pont és a dupla kötőjel lecserélése gépelés közben + + + + Highlight case-sensitive and whole matches +of the selected text. + A kijelölt szöveg nagybetűérzékeny és teljes +egyezéseinek kiemelése. + + + + Selection highlighting + Kijelölés kiemelése + + + + Never highlight syntax for files > + Ne legyen kiemelés azoknál a fájloknál, amelyek nagyobbak mint + + + + This creates a menu button on the +status bar for changing the syntax. + Ez létrehoz egy menügombot az +állapotsoron a szintaxis megváltoztatásához. + + + + Support syntax override + Szintaxisfelülbírálás támogatása + + + + Show spaces, tabs and tab lines +when the syntax is highlighted. + Szóközök, behúzások, behúzásvonalak megjelenítése +amikor a szintaxiskiemelés be van kapcsolva. + + + + Show whitespaces + Szóközök, behúzások megjelenítése + + + + + The vertical position lines will be drawn only if +the editor font has a fixed pitch (like Monospace). + A függőleges vonalakat csak akkor lehet megjeleníteni, ha +a betűtípus rögzített szélességű (pl. Monospace). + + + + Show vertical lines starting from this position: + Függőleges vonalak megjelenítése innentől: + + + + Also show line and document ends + Sorvégek és dokumentumvég megjelenítése + + + + Date and time format: + Dátum és idő formátuma: + + + + Some text editors cannot open a document +whose last line is not empty. + Néhány szövegszerkesztő nem tud megnyitni olyan dokumentumot +amelynek az utolsó sora nem üres. + + + + Ensure an empty last line on saving + Az utolsó sor üres legyen mentéskor + + + + Remove trailing spaces on saving + Sorvégi szóközök eltávolítása mentéskor + + + + Inertial scrolling with mouse wheel + Tehetetlenségi görgetés egérkerékkel + + + + Files + Fájlok + + + + File Management + Fájlkezelés + + + + Start with files of last window + Indulás az utolsó ablak fájljaival + + + + + This can be any starting command with +arguments, for example, "xterm -hold" +for running the process in XTerm. + +If the command is left empty, the file +will be executed directly. + +If the script is not run in a terminal +emulator, the output and error messages +will be shown by a popup dialog. + Ez bármilyen parancs lehet bármilyen +kapcsolóval, például az "xterm -hold" +a folyamatot az XTermben futtatja. + +Ha nincs parancs, közvetlenül a fájl +lesz futtatva. + +Ha a szkript nem terminálban fut, +a kimenet és a hibaüzenetek egy +felugró ablakban lesznek megjelenítve. + + + + Start with this command: + Indítás ezzel a paranccsal: + + + + Command + Arguments + Parancs és kapcsolók + + + + Show recentl&y modified files + Nemré&g módosított fájlok megjelenítése + + + + Show recentl&y opened files + Ne&mrég megnyitott fájlok megjelenítése + + + + Save changes to opened files every: + Módosítások mentése minden: + + + + Help + Segítség + + + + Start with side-pane mode + Indulás oldalsávval + + + + If this is checked, not only you will lose the informative +tooltip and context menu of a single tab but you could not +merge a single tabbed window into another one by tab drag- +and-drop either. + Ha ez be van jelölve, egy lapnál nem lehet elérni a lap menüjét, +és nem lehet a lapot áttenni másik ablakba. + + + + &Do not show a single tab + Eg&y lapnál lapsáv elrejtése + + + + Text + Szöveg + + + + Text Editor + Szövegszerkesztő + + + + &Wrap lines by default + &Sortörés alapértelmezetten + + + + Auto-&indent by default + Automat&ikus behúzás alapértelmezetten + + + + Always show line &numbers + Sorszámok megjele&nítése mindig + + + + Highlight s&yntax by default + Szinta&xiskiemelés alapértelmezetten + + + + Dark c&olor scheme + Sö&tét téma + + + + Background color value: + Háttérszín értéke: + + + + MiB + MiB + + + + This only includes executable files written +in script languages like Shell and Python. + +If it is checked and the opened file is +executable, the file will be executed by clicking +the Run button, that appears on the toolbar/filemenu +when needed, or by its shortcut Ctrl+E. Then, the +process could be killed by Ctrl+Alt+E. + Ez csak a futtatható fájlokkal működik, +mint például a Shell vagy a Python. + +Ha ez be van jelölve, és a megnyitott fájl futtatható, +a fájlt futtatni lehet a Futtatás gombra kattitva, +amely megjelenik az eszköztáron, a fájl menüben, +Illetve a Ctrl+E billentyűkombináció is használható +erre a célra. A folyamatot pedig a Ctrl+Shift+E +megnyomásával lehet megszakítani. + + + + Needs window reopening to take effect. + Az érvényesítéshez újra meg kell nyitni az ablakot. + + + + + The color value of the background. +255 means white while 0 means black. + +For the light background, it can be +between 230 and 255; for the dark +background, between 0 and 50. + +Needs window reopening to take effect. + A háttérszín értéke. +255 a fehér, 0 pedig a fekete. + +A világos háttérnél ez lehet +230 és 255 között; a sötét +háttér esetén 0 és 50 között. + +Az érvényesítéshez újra meg kell nyitni az ablakot. + + + + Run executable scripts + Futtatható szkriptek futtatása + + + + + The maximum number of recently modified or +opened files FeatherPad shows. The default +is 10. + +Needs application restart to take effect. + A nemrég módosított vagy megnyitott fájlok maximális száma +amit FeatherPad mutat. Az alapértelmezett +10. + +Az érvényesítéshez újra kell indítani az alkalmazást. + + + + + Used for pasting the date and time. + +Takes effect after closing this dialog. + +Leave empty for: +MMM dd, yyyy, hh:mm:ss + A dátum és az idő beillesztésére szolgál. + +A párbeszédpanel bezárása után lép érvénybe. + +Hagyja üresen ha ezt szeretné: +MMM dd, yyyy, hh:mm:ss + + + + Text tab size: + Behúzásméret: + + + + spaces + szóköz + + + + Thick text cursor + Vastag szövegkurzor + + + + Should the mouse wheel scrolling be inertial +if the cursor is inside the text view? + Az egérgörgetés fokozatosan lassuljon, +ha a szöveg felett görget? + + + + Spell Checking + Helyesírás-ellenőrzés + + + + + A Hunspell dictionary has a name that ends with ".dic" +and should be alongside an affix file with the same +name but ending with ".aff". + A Hunspell szótárfájlnak ".dic"-re kell végződnie +és kell mellette lennie egy affix fájlnak aminek ugyanaz a neve +csak ".aff"-ra végződik. + + + + Hunspell dictionary path: + A Hunspell szótár útvonala: + + + + + Add dictionary... + Szótár hozzáadása... + + + + If this is unchecked, spell checking +will be started from the document start. + Ha ez nincs bejelölve, a helyesírás-ellenőrzés +a dokumentum kezdetétől indul. + + + + Start spell checking from text cursor + Helyesírás-ellenőrzés a szövegkurzortól + + + + Number of recent files: + A legutóbbi fájlok száma: + + + + Only if their number is not greater than 50. + Csak, ha a számuk nem több 50-nél. + + + + + Only for files that exist and can be saved. + Csak létező és menthető fájlok esetén. + + + + min + percben + + + + If this is checked, the Save button/menu-item could +be used also when the opened file is not modified. + +This can be useful under certain circumstances, +e.g. for changing the time stamp or removing the +trailing spaces of a text file. + Ha ez be van jelölve, a Mentés gomb/menüelem +akkor is használható marad, ha a megnyitott fájl nem lett módosítva. + +Ez néhány körülmény között hasznos lehet: pl. az időbélyeg megváltoztatásához, vagy a záró szóközök levágásához. + + + + Allow saving unmodified files + Nem módosított fájlok mentésének engedélyezése + + + + Show a warning instead. + Ehelyett jelenjen meg egy figyelmeztetés. + + + + Do not permit opening of non-text files + Nem szöveges fájlok megnyitásának letiltása + + + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + Alapértelmezés szerint a fájlok másoláskor +megnyílnak, ha be vannak illesztve a FeatherPadbe. + + + + Paste paths instead of files + Útvonalak beillesztése fájlok helyett + + + + Shortcuts + Gyorsbillentyűk + + + + Action + Művelet + + + + Shortcut + Kombináció + + + + Restore default shortcuts. + Alapértelmezett kombinációk visszaállítása. + + + + + + Default + Alapértelmezett + + + + Syntax Colors + Kiemelőszínek + + + + Element + Elem + + + + Text Color + Szövegszín + + + + Whitespace color value: + Nem látható karakterek színértéke: + + + + + Has effect only if line numbers are shown. + Csak akkor van hatása, ha a sorszámok meg vannak jelenítve. + + + + Current line highlight value: + Aktuális sor kiemelésének értéke: + + + + Restore default syntax colors. + Alapértelmezett kiemelőszínek visszaállítása. + + + + Close + Bezárás + + + + Press a modifier key to clear a shortcut +in the editing mode. + Nyomjon egy módosítóbillentyűt, hogy +törölje a kombinációt. + + + + Double click a color to change it. + Dupla kattintás a színre a módosításhoz. + + + + + files + fájl + + + + + file + fájl + + + + + Warning: Ambiguous shortcut detected! + Figyelmeztetés: Nem egyértelmű gyorsbillentyű található! + + + + Functions, URLs,… + Függvények, hivatkozások… + + + + Built-in Functions + Beépített függvények + + + + Comments + Megjegyzések + + + + Quotations + Idézőjelek + + + + Types + Típusok + + + + Key Words + Kulcsszavak + + + + Numbers + Számok + + + + Regular Expressions, Code Blocks,… + Reguláris kifejezések, kódblokkok… + + + + Document Blocks, XML/HTML Elements,… + Dokumentumblokkok, XML/HTML elemek… + + + + Markdown Headings, CSS Values,… + Markdown címsorok, CSS értékek… + + + + Extra Elements + Extra elemek + + + + Application restart is needed for changes to take effect. + Az érvényesítéshez újra kell indítania az alkalmazást. + + + + Window reopening is needed for changes to take effect. + Az érvényesítéshez újra meg kell nyitni az ablakot. + + + + &Recently Opened + Nem&rég megnyitott + + + + Recently &Modified + Nem&rég módosított + + + + The typed shortcut was reserved. + A beírt gyorsbillentyű foglalt. + + + + Hunspell Dictionary Files (*.dic) + Hunspell szótárfájlok (*.dic) + + + + + Select Syntax Color + Kiemelőszín kiválasztása + + + + FeatherPad::SearchBar + + + + Search... + Keresés... + + + + Match Case + Nagybetűérzékeny + + + + Whole Word + Teljes szó + + + + Regular Expression + Reguláris kifejezés + + + + Search with regex... + Keresés reguláris kifejezéssel... + + + + Next + Következő + + + + Previous + Előző + + + + FeatherPad::SessionDialog + + + Session Manager + Munkamenet-kezelő + + + + + &Remove + &Törlés + + + + <b>Save/Restore Session</b> + <b>Munkamenet mentése/betöltése</b> + + + + Filter... + Keresés... + + + + Open the selected session(s). + Kiválasztott munkamenet(ek) megnyitása. + + + + + &Open + &Megnyitás + + + + + Del + Del + + + + + Ctrl+Del + Ctrl+Del + + + + By default, all files that are opened in all +windows will be included in the saved session. + Alapértelmezés szerint az összes ablakban megnyitott +összes fájl el lesz mentve a munkamenetbe. + + + + Save only from this &window + Mentés csak ebből az a&blakból + + + + <b>Warning</b> + <b>Figyelmeztetés</b> + + + + + &Yes + &Igen + + + + &No + &Nem + + + + Re&name + Á&tnevezés + + + + Remove &All + Ö&sszes törlése + + + + &Close + &Bezárás + + + + Save the current session under the given title. + Munkamenet mentése a megadott név alatt. + + + + &Save + &Mentés + + + + Type a name to save session + Adjon nevet a munkamenetnek + + + + Nothing saved.<br>No file was opened. + Nem lehet menteni.<br>Nincs megnyitott fájl. + + + + No file exists or can be opened. + Nem létezik a fájl, vagy nem nyitható meg. + + + + Not all files exist or can be opened. + Nem minden fájl létezik, vagy nyitható meg. + + + + &OK + &OK + + + + Do you really want to remove all saved sessions? + Biztosan törölni szeretné az összes munkamenetet? + + + + Do you really want to remove the selected sessions? + Biztosan törölni szeretné a kijelölt munkameneteket? + + + + Do you really want to remove the selected session? + Biztosan törölni szeretné a kijelölt munkamenetet? + + + + A session with the same name exists.<br>Do you want to overwrite it? + Létezik egy azonos nevű munkamenet.<br>Felülírja? + + + + FeatherPad::SidePane + + + Filter... + Szűrő... + + + + FeatherPad::SpellDialog + + + Unknown word: + Ismeretlen szó: + + + + Add To Dictionary + Hozzáadás szótárhoz + + + + Replace with: + Csere ezzel: + + + + Correct Once + Javítás egyszer + + + + Correct All + Összes javítása + + + + Ignore Once + Mellőzés egyszer + + + + Ignore All + Összes mellőzése + + + + FeatherPad::TextEdit + + + Double click to center current line + Dupla kattintás, hogy a legutóbbi sor középre kerüljön + + + diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_id.ts featherpad-0.17.1/featherpad/data/translations/featherpad_id.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_id.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_id.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Lisensi @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Tanpa Judul @@ -54,514 +56,525 @@ - + &Edit Sunting - + &Options - - - + + + Encoding - + &Search Cari - - + + &Help - + Find: Cari: - + To be replaced - + Replace with: - + Replacing text - + &New - + New tab - + Ctrl+N - + &Open - + Open a file - + Ctrl+O - - + + &Save - + Save the current tab - + Ctrl+S - + &Undo - + Undo - + Ctrl+Z - + &Redo - + Redo - + Ctrl+Shift+Z - + Reload - + Ctrl+Shift+R - + &Find - + Ctrl+F - + Show/hide replacement dock - + Ctrl+R - + Save &As - + Ctrl+Shift+S - + &Print - + Ctrl+P - + Documen&t Properties - + Ctrl+Shift+D - + &Close - + Ctrl+Shift+Q - + &Quit - + Ctrl+Q - + &Cut - + Ctrl+X - + C&opy - + Ctrl+C - + &Paste - + Ctrl+V - + &Delete - + &Select All - + Ctrl+A - + &Font - + &Line Numbers - + Ctrl+L - + &Wrap Lines - + Ctrl+W - + &Auto-Indentation - + Ctrl+I - + &Syntax Highlighting - + Ctrl+Shift+H - + &Preferences - + Ctrl+Shift+P - + Ctrl+H - + &About - + Enforce UTF-8 - + Save with &Encoding - + &Jump to - + Show/hide jump bar - + Ctrl+J - + Edit text - + Ctrl+Shift+E - + &Run - + Ctrl+E - + &Clear - + Clear the list of recently modified files - + Save/Restore Session - + Sa&ve/Restore Session - + Ctrl+M - + Side-Pane - + Ctrl+Alt+P - + Paste Date and Time - + Ctrl+Shift+V - + To Upper Case - + Ctrl+Shift+U - + To Lower Case - + Ctrl+Shift+L + To Start Case + + + + + Last Active Tab - + F1 - - + + Sort Lines - - + + Sort Lines Reversely - + Check Spelling Periksa Ejaan - + F2 F2 - - + + Save All Files Simpan semua File - - + + User Dictionary - + + Text Tabs to Spaces + + + + &Detach Tab - + Ctrl+T - + Close Ne&xt Tabs - + Close &Previous Tabs - + Ne&xt Tab - + Previous Ta&b - + Execute - + Close &All Tabs @@ -571,619 +584,675 @@ - + &Encoding - + &Unicode - + &Western European - + &East European - + Ea&st Asian - - + + - - Rep&lacement + + Replacement - + Focus/hide search bar - + &Replace - + Windows Arabic (&CP1256) - + &Other - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) - + Cyrillic (&KOI8-U) - + Cyrillic (&ISO-8859-5) - + &Chinese (BIG5) - + Chinese (&GB18030) - + &Japanese (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) - + Ja&panese (CP932) - + Japa&nese (EUC-JP) - + &Korean (CP949) - + K&orean (CP1361) - + Korean (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs - + &Copy File Name - + Copy File &Path - + Alt+Right - + Alt+Left - + &First Tab - + Alt+Down - + &Last Tab - + Alt+Up - + Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) - + Next - + Previous - + Replace all - + &Recently Opened - + Close - + Save changes? - + Please attend to that window or just close its dialog! - + The document has been modified. - + &Discard changes - + &Cancel - + &No to all - - + + Unsaved - - - - - - - - - + + + + + + + + + Lines - - - + + + Sel. Chars - - - + + + Words - + Another process is running in this tab! - + Script File - + Another FeatherPad window has a modal dialog! - - + + Position: - - - + + + Normal - - - + + + The file does not exist. - + Open Link Buka Tautan - + Copy Link Salin Tautan - + Only one process is allowed per tab. - + Script Output - + Clear - + FeatherPad does not open files larger than 100 MiB. - + Non-text file(s) not opened! - + See Preferences → Files → Do not permit opening of non-text files - + Some file(s) could not be opened! - + You may not have the permission to read. - + Uneditable file(s)! - + Non-text files or files with huge lines cannot be edited. - + A previous crash detected! - + Preferably, close all FeatherPad windows and start again! - + Root Instance - - - + + + All Files (*) - + All Files (*);;.%1 Files (*.%1) - + Open file... - + .%1 Files (*.%1);;All Files (*) - - + + Save as... - + Keep encoding and save as... - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes - + No - + Cancel - + Do you want to use <b>MS Windows</b> end-of-lines? - + This may be good for readability under MS Windows. - + + + + Cannot be saved! - - - + + + + + Help - - - - - - - + + + + + + + Syntax - + Huge file(s) not opened! - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! - - + + Please be careful about reloading or saving this document! - + + Printing in progress... + + + + Print Document - - + + Printing completed. + + + + + %1 Pages - - + + Copy Target Path - - + + Open Target Here - + + + Open Containing Folder + + + + You need to add a Hunspell dictionary. Anda perlu menambahkan kamus Hunspell. - - - + + + See Preferences → Text → Spell Checking! Lihat Pengaturan → Teks → Pengecekan Ejaan! - + The Hunspell dictionary does not exist. Kamus Hunspell tidak ditemukan. - + The Hunspell dictionary is not accompanied by an affix file. Kamus Hunspell tidak disertai dengan file affix. - - - + + + No misspelling in document. Tidak ada kesalahan ejaan dalam dokumen. - - - + + + No misspelling from text cursor. Tidak ada kesalahan ejaan dalam kursor teks. - + Spell Checking Pemeriksaan Ejaan - + Some files cannot be saved! Beberapa file tidak dapat disimpan! - + Translators - + A lightweight, tabbed, plain-text editor - - based on Qt5 + + based on Qt - + Author - + aka. - - + + About FeatherPad - + No Replacement - + One Replacement - + %Ln Replacements - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. @@ -1497,72 +1566,83 @@ Tukar tiga titik dan dua tanda hubung selagi mengetik - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > - + This creates a menu button on the status bar for changing the syntax. - + Support syntax override - + Show spaces, tabs and tab lines when the syntax is highlighted. - + Show whitespaces - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). - + Show vertical lines starting from this position: - + Also show line and document ends - + Date and time format: - + Some text editors cannot open a document whose last line is not empty. - + Ensure an empty last line on saving - + Remove trailing spaces on saving - + Inertial scrolling with mouse wheel @@ -1622,7 +1702,7 @@ - + Help @@ -1670,37 +1750,26 @@ - + Highlight s&yntax by default - + Dark c&olor scheme - + Background color value: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - - - - - Workaround for &Qt5's scroll jump bug - - - This only includes executable files written in script languages like Shell and Python. @@ -1713,13 +1782,13 @@ - + Needs window reopening to take effect. - - + + The color value of the background. 255 means white while 0 means black. @@ -1746,8 +1815,8 @@ - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1757,22 +1826,22 @@ - + Text tab size: - + spaces - + Thick text cursor - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? @@ -1799,7 +1868,7 @@ - + Add dictionary... Tambah kamus... @@ -1862,119 +1931,240 @@ - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts - + Action - + Shortcut - + Restore default shortcuts. - + + + Default - + + Syntax Colors + + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + Close - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + + + + + files - - + + file - - + + Warning: Ambiguous shortcut detected! - + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + Application restart is needed for changes to take effect. - + Window reopening is needed for changes to take effect. - + &Recently Opened - + Recently &Modified - + The typed shortcut was reserved. - + Hunspell Dictionary Files (*.dic) Files kamus Hunspell (*.dic) + + + + Select Syntax Color + + FeatherPad::SearchBar - - + + Search... - + Match Case - + Whole Word - + Regular Expression Regular Expression - + Search with regex... Cari dengan regex... - + Next - + Previous @@ -2043,7 +2233,7 @@ - + &Yes @@ -2083,42 +2273,42 @@ - + Nothing saved.<br>No file was opened. - + No file exists or can be opened. - + Not all files exist or can be opened. - + &OK - + Do you really want to remove all saved sessions? - + Do you really want to remove the selected sessions? - + Do you really want to remove the selected session? - + A session with the same name exists.<br>Do you want to overwrite it? @@ -2126,7 +2316,7 @@ FeatherPad::SidePane - + Filter... @@ -2172,18 +2362,9 @@ FeatherPad::TextEdit - + Double click to center current line - - FeatherPad::WarningBar - - - - Close - - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_it.ts featherpad-0.17.1/featherpad/data/translations/featherpad_it.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_it.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_it.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Licenza @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Senza nome @@ -54,514 +56,525 @@ - + &Edit &Modifica - + &Options &Opzioni - - - + + + Encoding Codifica - + &Search &Cerca - - + + &Help &Aiuto - + Find: Trova: - + To be replaced Da sostituire - + Replace with: Sostituire con: - + Replacing text Sostituisci testo - + &New &Nuovo - + New tab Nuova scheda - + Ctrl+N - + &Open &Apri - + Open a file Apri un file - + Ctrl+O - - + + &Save &Salva - + Save the current tab Salva la scheda attuale - + Ctrl+S - + &Undo &Annulla - + Undo Annulla - + Ctrl+Z - + &Redo &Rifai - + Redo Rifai - + Ctrl+Shift+Z - + Reload Ricarica - + Ctrl+Shift+R - + &Find &Trova - + Ctrl+F - + Show/hide replacement dock Mostra/nascondi barra di sostituzione - + Ctrl+R - + Save &As Salva con &nome - + Ctrl+Shift+S - + &Print &Stampa - + Ctrl+P - + Documen&t Properties Proprietà del &documento - + Ctrl+Shift+D - + &Close &Chiudi - + Ctrl+Shift+Q - + &Quit &Esci - + Ctrl+Q - + &Cut &Taglia - + Ctrl+X - + C&opy C&opia - + Ctrl+C - + &Paste &Incolla - + Ctrl+V - + &Delete &Cancella - + &Select All &Seleziona tutto - + Ctrl+A - + &Font &Caratteri - + &Line Numbers &Numeri di riga - + Ctrl+L - + &Wrap Lines Manda a capo le righe - + Ctrl+W - + &Auto-Indentation &Rientro automatico - + Ctrl+I - + &Syntax Highlighting &Evidenziazione sintassi - + Ctrl+Shift+H - + &Preferences &Preferenze - + Ctrl+Shift+P - + Ctrl+H - + &About &Informazioni - + Enforce UTF-8 Imponi UTF-8 - + Save with &Encoding Salva con &codifica - + &Jump to &Salta a - + Show/hide jump bar Mostra/nascondi barra di salto - + Ctrl+J - + Edit text Modifica testo - + Ctrl+Shift+E - + &Run &Esegui - + Ctrl+E - + &Clear &Pulisci - + Clear the list of recently modified files Cancella l'elenco dei file modificati di recente - + Save/Restore Session Salva/Ripristina sessione - + Sa&ve/Restore Session Sa&lva/Ripristina sessione - + Ctrl+M - + Side-Pane Pannello laterale - + Ctrl+Alt+P - + Paste Date and Time Incolla data e ora - + Ctrl+Shift+V - + To Upper Case In lettere maiuscole - + Ctrl+Shift+U - + To Lower Case In lettere minuscole - + Ctrl+Shift+L + To Start Case + + + + + Last Active Tab Ultima scheda attiva - + F1 - - + + Sort Lines Ordina righe - - + + Sort Lines Reversely Inverti ordinamento righe - + Check Spelling - + Controllo ortografico - + F2 - - + + Save All Files - + Salva tutti file - - + + User Dictionary - + Dizionario utente - + + Text Tabs to Spaces + Sostituisci Tab con spazi + + + &Detach Tab &Separa scheda - + Ctrl+T - + Close Ne&xt Tabs Chiudi schede a &destra - + Close &Previous Tabs Chiudi schede a &sinistra - + Ne&xt Tab Scheda &prossima - + Previous Ta&b Scheda prece&dente - + Execute Esegui - + Close &All Tabs Chiude &tutte le schede @@ -571,613 +584,664 @@ Modificati &recentemente - + &Encoding &Codifica - + &Unicode - + &Western European &Europa occidentale - + &East European Europa &orientale - + Ea&st Asian Est &asiatico - - + + - - Rep&lacement - &Sostituzione + + Replacement + Sostituzione - + Focus/hide search bar Mostra/nascondi barra di ricerca - + &Replace &Sostituisci - + Windows Arabic (&CP1256) - + &Other &Altro - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) - + Cyrillic (&KOI8-U) - + Cyrillic (&ISO-8859-5) Cirillico (&ISO-8859-5) - + &Chinese (BIG5) - + Chinese (&GB18030) Cinese (&GB18030) - + &Japanese (ISO-2022-JP) &Giapponese (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Giapponese (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Giapponese (ISO-&2022-KR) - + Ja&panese (CP932) Gia&pponese (CP932) - + Japa&nese (EUC-JP) Giappo&nese (EUC-JP) - + &Korean (CP949) &Coreano (CP949) - + K&orean (CP1361) &Coreano (CP1361) - + Korean (&EUC-KR) Coreano (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs Chiudi le &altre schede - + &Copy File Name &Copia nome file - + Copy File &Path &Copia percorso - + Alt+Right Alt+Destra - + Alt+Left Alt+Sinistra - + &First Tab &Prima scheda - + Alt+Down Alt+Giù - + &Last Tab &Ultima scheda - + Alt+Up Alt+Su - + Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) Calcola il numero di parole (per testi enormi, questo potrebbe richiedere un uso intensivo della CPU.) - + Next Prossimo - + Previous Precedente - + Replace all Sostituire tutte - + &Recently Opened File &recenti - + Close Chiudi - + Save changes? Salvare le modifiche? - + Please attend to that window or just close its dialog! Per favore porre attenzione a questa finestra o chiudere il dialogo! - + The document has been modified. Il documento è stato modificato. - + &Discard changes Scarta le &modifiche - + &Cancel &Annulla - + &No to all &No a tutti - - + + Unsaved Non salvato - - - - - - - - - + + + + + + + + + Lines Righe - - - + + + Sel. Chars Caratteri selezionati - - - + + + Words Parole - + Another process is running in this tab! Un altro processo è in esecuzione in questa scheda! - + Script File - + Another FeatherPad window has a modal dialog! Un altra finestra di FeatherPad ha una finestra di dialogo modale! - - + + Position: Posizione: - - - + + + Normal Normale - - - + + + The file does not exist. Il file non esiste. - + Open Link Apri il collegamento - + Copy Link Copia il collegamento - + Only one process is allowed per tab. È consentito un solo processo per scheda. - + Script Output Risultato dello script - + Clear Pulisci - + FeatherPad does not open files larger than 100 MiB. FeatherPad non apre file più grandi di 100 MiB. - + Non-text file(s) not opened! - + Non aperto un file non di testo! - + See Preferences → Files → Do not permit opening of non-text files - + Vedi Preferenze → File → Non permettere l'apertura di file non di testo - + Some file(s) could not be opened! Alcuni file non possono essere aperti! - + You may not have the permission to read. Potrebbero mancare i permessi di lettura. - + Uneditable file(s)! File non modificabili! - + Non-text files or files with huge lines cannot be edited. Non è possibile modificare file non di testo o file enormi. - + A previous crash detected! Rilevato un crash precedente! - + Preferably, close all FeatherPad windows and start again! Preferibilmente, chiudi tutte le finestre di FeatherPad e ricomincia! - + Root Instance Instanza Root - - - + + + All Files (*) Tutti i file (*) - + All Files (*);;.%1 Files (*.%1) Tutti i file (*) ;;.% 1 file (*.% 1) - + Open file... Apri file... - + .%1 Files (*.%1);;All Files (*) .% 1 File (*.% 1) ;; Tutti i file (*) - - + + Save as... Salva con nome... - + Keep encoding and save as... Mantieni codifica e salva come ... - + + Saving as root. + Salvando come amministratore. + + + + Waiting for authentication... + In attesa di autenticazione... + + + + "pkexec" is not found. Please install Polkit! + Non è stato trovato "pkexec". Per favore installare Polkit! + + + Yes - + No - + Cancel Cancella - + Do you want to use <b>MS Windows</b> end-of-lines? Vuoi utilizzare fine riga <b>MS Windows</b>? - + This may be good for readability under MS Windows. Questo può essere buono per la leggibilità sotto MS Windows. - + + + + Cannot be saved! Impossibile salvare! - - - + + + + + Help Aiuto - - - - - - - + + + + + + + Syntax Sintassi - + Huge file(s) not opened! File enormi non aperti! - - + + Text tabs are converted to spaces. + I tab sono stati sostituiti da spazi. + + + + The selected text was too long. + Il testo selezionato era troppo lungo. + + + + It is not fully processed. + Non è processato completamente. + + + + This file has been modified elsewhere or in another way! Questo file è stato modificato altrove o in altro modo! - - + + Please be careful about reloading or saving this document! Si prega di fare attenzione a ricaricare o salvare questo documento! - + + Printing in progress... + Stampa in corso... + + + Print Document Stampa Documento - - + + Printing completed. + Stampa completata. + + + + %1 Pages %1 pagine - - + + Copy Target Path Copia percorso di destinazione - - + + Open Target Here Apri percorso di destinazione - - You need to add a Hunspell dictionary. + + + Open Containing Folder - - - + + You need to add a Hunspell dictionary. + Neccessità di un dizionario Hunspell. + + + + + See Preferences → Text → Spell Checking! - + Vedi → Preferenze → Testo → Controllo ortografico! - + The Hunspell dictionary does not exist. - + Il dizionario Hunspell non esiste. - + The Hunspell dictionary is not accompanied by an affix file. - + Il dizionario Hunspell non è affiancato da un file affix. - - - + + + No misspelling in document. - + Nessun sbaglio ortografico nel documento. - - - + + + No misspelling from text cursor. - + Nessun sbaglio ortografico dalla posizione del cursore. - + Spell Checking - + Controllo ortografico - + Some files cannot be saved! - + Alcuni file non si possono salvare! - + Translators Traduttori - + A lightweight, tabbed, plain-text editor Un editor di testo leggero a schede - - based on Qt5 - basato su Qt5 + + based on Qt + basato su Qt - + Author - + aka. - - + + About FeatherPad Informazioni su FeatherPad - + No Replacement Nessuna sostituzione - + One Replacement Una sostituzione - + %Ln Replacements %Ln Sostituzione @@ -1185,7 +1249,12 @@ - + + The first 1000 replacements are highlighted. + Le prime 1000 sostituzioni sono evidenziate. + + + The size limit for syntax highlighting is exceeded. Il limite di dimensione per l'evidenziazione della sintassi è stato superato. @@ -1210,58 +1279,58 @@ Select Font - + Seleziona carattere Programming Fonts - + Caratteri di programmazione Font: - + Carattere: Size: - + Dimensione: Weight: - + Peso: Normal - Normale + Normale Medium - + Media Bold - + Grassetto Black - + Nero Italic - + Corsivo Preview - + Anteprima @@ -1514,76 +1583,87 @@ Sostituisci tre punti e doppi trattini durante la scrittura - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + Evidenzia selezione + + + Never highlight syntax for files > - Non evidenziare mai la sintassi per i file&gt; + Non evidenziare mai la sintassi per i file > - + This creates a menu button on the status bar for changing the syntax. Ciò crea un pulsante di menu sulla barra di stato per la modifica della sintassi. - + Support syntax override Permetti scelta dell'evidenziazione della sintassi - + Show spaces, tabs and tab lines when the syntax is highlighted. Mostra spazi, tabulazioni e righe di tabulazioni quando la sintassi è evidenziata. - + Show whitespaces Mostra gli spazi bianchi - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). Le linee di posizione verticali verranno disegnate solo se il font dell&#39;editor è di larghezza fissa (come Monospace). - + Show vertical lines starting from this position: Mostra le linee verticali a partire da questa posizione: - + Also show line and document ends Mostra anche la fine della riga e del documento - + Date and time format: Formato data e ora: - + Some text editors cannot open a document whose last line is not empty. Alcuni editor di testo non possono aprire un documento la cui ultima riga non è vuota. - + Ensure an empty last line on saving - Imponi un&#39;ultima riga vuota al salvataggio + Imponi un ultima riga vuota al salvataggio - + Remove trailing spaces on saving Rimuovi gli spazi fine di riga al momento del salvataggio - + Inertial scrolling with mouse wheel Scorrimento lento con rotellina del mouse @@ -1652,7 +1732,7 @@ Salva le modifiche ai file aperti ogni: - + Help Aiuto @@ -1703,39 +1783,26 @@ Mostra sempre la &numerazione delle righe - + Highlight s&yntax by default Evidenzia sintassi per impostazione predefinita - + Dark c&olor scheme Schema di colore &scuro - + Background color value: Valore del colore di sfondo: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - Questa non è una soluzione completa -ma impedisce fastidiosi salti nello scorrimento. - - - - Workaround for &Qt5's scroll jump bug - Soluzione alternativa per il bug di -scorrimento di &Qt5 - - This only includes executable files written in script languages like Shell and Python. @@ -1755,13 +1822,13 @@ Di seguito il processo può essere fermato con Ctrl+Alt+E. - + Needs window reopening to take effect. Ha bisogno di riapertura della finestra per avere effetto. - - + + The color value of the background. 255 means white while 0 means black. @@ -1798,8 +1865,8 @@ Riavviare FeatherPad per avere effetto. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1814,22 +1881,22 @@ MMM gg, aaaa, hh: mm: ss - + Text tab size: Dimensione testo della scheda: - + spaces spazi - + Thick text cursor Cursore del testo spesso - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? Deve essere lento lo scorrimento della rotellina @@ -1839,7 +1906,7 @@ Spell Checking - + Controllo ortografico @@ -1847,29 +1914,32 @@ A Hunspell dictionary has a name that ends with ".dic" and should be alongside an affix file with the same name but ending with ".aff". - + Un dizionario Hunspell ha un nome che termina con ".dic" +e dovrebbe essere accompagnato da un affix con lo stesso +nome ma che termina con ".aff". Hunspell dictionary path: - + Percorso al dizionario Hunspell: - + Add dictionary... - + Aggiungi dizionario... If this is unchecked, spell checking will be started from the document start. - + Se non spuntato, il controllo ortografico +parte dall'inizio del documento. Start spell checking from text cursor - + Inizia controllo ortografico dalla posizione del cursore @@ -1919,122 +1989,244 @@ Do not permit opening of non-text files - Non consentire l&#39;apertura di file non di testo + Non consentire l'apertura di file non di testo + + + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + - + + Paste paths instead of files + Incolla percorsi invece di file + + + Shortcuts Scorciatoie - + Action Azione - + Shortcut Scorciatoia - + Restore default shortcuts. Ripristina scorciatoie predefinite. - + + + Default Predefinito - + + Syntax Colors + Colori sintassi + + + + Element + Elemento + + + + Text Color + Colore testo + + + + Whitespace color value: + Valore del colore spazio bianco: + + + + + Has effect only if line numbers are shown. + Ha effetto solo se attiva la visualizzazione numero righe. + + + + Current line highlight value: + + + + + Restore default syntax colors. + Reimposta colori sintassi predefiniti. + + + Close Chiudi - - + + Press a modifier key to clear a shortcut +in the editing mode. + Premere un tasto modificatore +per rimuovere una scorciatoia. + + + + Double click a color to change it. + Doppio clic su un colore per modificarlo. + + + + files File - - + + file File - - + + Warning: Ambiguous shortcut detected! Attenzione: rilevata una scorciatoia ambigua! - + + Functions, URLs,… + Funzioni, URL,… + + + + Built-in Functions + Funzioni integrate + + + + Comments + Commenti + + + + Quotations + Citazioni + + + + Types + Tipi + + + + Key Words + Parole chiavi + + + + Numbers + Numeri + + + + Regular Expressions, Code Blocks,… + Espressioni regolari, Blocchi di codice,… + + + + Document Blocks, XML/HTML Elements,… + Document Blocks, XML/Elementi HTML,… + + + + Markdown Headings, CSS Values,… + Testate Markdown, Valori CSS,… + + + + Extra Elements + Elementi extra + + + Application restart is needed for changes to take effect. E' necessario il riavvio dell'applicazione per attivare le modifiche. - + Window reopening is needed for changes to take effect. La riapertura della finestra è necessaria perché le modifiche abbiano effetto. - + &Recently Opened Modificati &recentemente - + Recently &Modified Modificati &recentemente - + The typed shortcut was reserved. La scorciatoia inserita è già in uso. - + Hunspell Dictionary Files (*.dic) - + File dizionario Hunspell (*.dic) + + + + + Select Syntax Color + Selezione colore sintassi FeatherPad::SearchBar - - + + Search... Cerca… - + Match Case Distingui Maiuscole/minuscole - + Whole Word Parola intera - + Regular Expression Espressione regolare (regex) - + Search with regex... Cerca con regex… - + Next Prossimo - + Previous Precedente @@ -2105,7 +2297,7 @@ - + &Yes &Sì @@ -2145,42 +2337,42 @@ Digita un nome per salvare la sessione - + Nothing saved.<br>No file was opened. Salvato niente. <br> Nessun file è stato aperto. - + No file exists or can be opened. Nessun file esiste o può essere aperto. - + Not all files exist or can be opened. Non tutti i file esistono o possono essere aperti. - + &OK - + Do you really want to remove all saved sessions? Vuoi veramente rimuovere tutte le sessioni salvate? - + Do you really want to remove the selected sessions? Vuoi veramente rimuovere le sessioni selezionate? - + Do you really want to remove the selected session? Vuoi veramente rimuovere la sessione selezionata? - + A session with the same name exists.<br>Do you want to overwrite it? Esiste una sessione con lo stesso nome. <br> Vuoi sovrascriverla? @@ -2188,7 +2380,7 @@ FeatherPad::SidePane - + Filter... Filtra... @@ -2198,54 +2390,45 @@ Unknown word: - + Parola sconosciuta: Add To Dictionary - + Aggiungi al dizionario Replace with: - Sostituire con: + Sostituire con: Correct Once - + Correggi una volta Correct All - + Correggi tutti Ignore Once - + Ignora una volta Ignore All - + Ignora tutti FeatherPad::TextEdit - + Double click to center current line Fare doppio clic per centrare la linea corrente - - FeatherPad::WarningBar - - - - Close - Chiudi - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_ja_JP.ts featherpad-0.17.1/featherpad/data/translations/featherpad_ja_JP.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_ja_JP.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_ja_JP.ts 1970-01-01 00:00:00.000000000 +0000 @@ -1,2249 +0,0 @@ - - - - - FeatherPad::AboutDialog - - - License - ライセンス - - - - FeatherPad::FPwin - - - Go to line: - 指定行へ移動: - - - - Select text from cursor to this line -(Ctrl+Shift+J) - カーソル位置からこの行までのテキストを選択 -(Ctrl+Shift+J) - - - - Select Text - テキストを選択 - - - - Ctrl+Shift+J - Ctrl+Shift+J - - - - &File - ファイル(&F) - - - - Recently &Modified - 最近更新したファイル(&M) - - - - - &Edit - 編集(&E) - - - - &Options - オプション(&O) - - - - &Encoding - エンコーディング(&E) - - - - &Unicode - ユニコード(&U) - - - - &Western European - 西ヨーロッパ(&W) - - - - &East European - 東ヨーロッパ(&E) - - - - Ea&st Asian - 東アジア(&S) - - - - &Search - 検索(&S) - - - - - &Help - ヘルプ(&H) - - - - - - - Rep&lacement - 置換(&L) - - - - Find: - 検索する文字列: - - - - To be replaced - どの文字列を置換するのか - - - - Replace with: - 置換する文字列: - - - - Replacing text - どの文字列に置換するのか - - - - &New - 新規作成(&N) - - - - New tab - 新しいタブ - - - - Ctrl+N - Ctrl+N - - - - &Open - 開く(&O) - - - - Open a file - ファイルを開く - - - - Ctrl+O - Ctrl+O - - - - - &Save - 保存(&S) - - - - Save the current tab - 現在のタブを保存 - - - - Ctrl+S - Ctrl+S - - - - &Undo - 元に戻す(&U) - - - - Undo - 元に戻す - - - - Ctrl+Z - Ctrl+Z - - - - &Redo - やり直し(&R) - - - - Redo - やり直し - - - - Ctrl+Shift+Z - Ctrl+Shift+Z - - - - - Reload - 再読み込み - - - - Ctrl+Shift+R - Ctrl+Shift+R - - - - &Find - 検索(&F) - - - - Focus/hide search bar - 検索バーの表示/非表示 - - - - Ctrl+F - Ctrl+F - - - - &Replace - 置換(&R) - - - - Show/hide replacement dock - 置換バーの表示/非表示 - - - - Ctrl+R - Ctrl+R - - - - Save &As - 名前を付けて保存(&A) - - - - Ctrl+Shift+S - Ctrl+Shift+S - - - - &Print - 印刷(&P) - - - - Ctrl+P - Ctrl+P - - - - Documen&t Properties - 文書のプロパティ(&T) - - - - Ctrl+Shift+D - Ctrl+Shift+D - - - - &Close - 閉じる(&C) - - - - Ctrl+Shift+Q - Ctrl+Shift+Q - - - - &Quit - 終了(&Q) - - - - Ctrl+Q - Ctrl+Q - - - - &Cut - 切り取り(&C) - - - - Ctrl+X - Ctrl+X - - - - C&opy - コピー(&O) - - - - Ctrl+C - Ctrl+C - - - - &Paste - 貼り付け(&P) - - - - Ctrl+V - Ctrl+V - - - - &Delete - 削除(&D) - - - - &Select All - すべて選択(&S) - - - - Ctrl+A - Ctrl+A - - - - &Font - フォント(&F) - - - - &Line Numbers - 行番号の表示(&L) - - - - Ctrl+L - Ctrl+L - - - - &Wrap Lines - 行の折り返し(&W) - - - - Ctrl+W - Ctrl+W - - - - &Auto-Indentation - 自動インデント(&A) - - - - Ctrl+I - Ctrl+I - - - - &Syntax Highlighting - 構文のハイライト表示(&S) - - - - Ctrl+Shift+H - Ctrl+Shift+H - - - - &Preferences - 設定(&P) - - - - Ctrl+Shift+P - Ctrl+Shift+P - - - - Ctrl+H - Ctrl+H - - - - &About - FeatherPad について(&A) - - - - Windows Arabic (&CP1256) - Windows アラビア文字 (CP1256)(&C) - - - - &Other - その他(&O) - - - - Enforce UTF-8 - UTF-8 を強制 - - - - &UTF-8 - UTF-8(&U) - - - - UTF-&16 - UTF-16(&1) - - - - &ISO-8859-1 - ISO-8859-1(&I) - - - - &Windows-1252 - Windows-1252(&W) - - - - &Cyrillic (CP1251) - キリル文字 (CP1251)(&C) - - - - Cyrillic (&KOI8-U) - キリル文字 (KOI8-U)(&K) - - - - Cyrillic (&ISO-8859-5) - キリル文字 (ISO-8859-5)(&I) - - - - &Chinese (BIG5) - 中国語 (BIG5)(&C) - - - - Chinese (&GB18030) - 中国語 (GB18030)(&G) - - - - &Japanese (ISO-2022-JP) - 日本語 (ISO-2022-JP)(&J) - - - - Japanese (&ISO-2022-JP-2) - 日本語 (ISO-2022-JP-2)(&I) - - - - Japanese (ISO-&2022-KR) - 日本語 (ISO-2022-KR)(&2) - - - - Ja&panese (CP932) - 日本語 (CP932)(&P) - - - - Japa&nese (EUC-JP) - 日本語 (EUC-JP)(&N) - - - - &Korean (CP949) - 韓国語 (CP949)(&K) - - - - K&orean (CP1361) - 韓国語 (CP1361)(&O) - - - - Korean (&EUC-KR) - 韓国語 (EUC-KR)(&E) - - - - Save with &Encoding - エンコードして保存(&E) - - - - &Jump to - 指定行へ移動(&J) - - - - Show/hide jump bar - 指定行へ移動バーの表示/非表示 - - - - Ctrl+J - Ctrl+J - - - - Edit text - テキストを編集 - - - - Ctrl+Shift+E - Ctrl+Shift+E - - - - &Detach Tab - タブを分離(&D) - - - - Ctrl+T - Ctrl+T - - - - ISO-&8859-15 - ISO-8859-15(&8) - - - - Close Ne&xt Tabs - 次のタブを閉じる(&X) - - - - Close &Previous Tabs - 前のタブを閉じる(&P) - - - - Close &All Tabs - すべてのタブを閉じる(&A) - - - - Close &Other Tabs - 他のタブを閉じる(&O) - - - - &Copy File Name - ファイル名をコピー(&C) - - - - Copy File &Path - ファイルパスをコピー(&P) - - - - Ne&xt Tab - 次のタブへ(&X) - - - - Alt+Right - Alt+Right - - - - Previous Ta&b - 前のタブへ(&B) - - - - Alt+Left - Alt+Left - - - - &First Tab - 最初のタブへ(&F) - - - - Alt+Down - Alt+Down - - - - &Last Tab - 最後のタブへ(&L) - - - - Alt+Up - Alt+Up - - - - Menu - メニュー - - - - &Run - 実行(&R) - - - - Execute - 実行する - - - - Ctrl+E - Ctrl+E - - - - &Clear - 消去(&C) - - - - Clear the list of recently modified files - 最近更新したファイル一覧を消去 - - - - Save/Restore Session - セッションの保存/復元 - - - - Sa&ve/Restore Session - セッションの保存/復元(&V) - - - - Ctrl+M - Ctrl+M - - - - Side-Pane - サイドペインの表示/非表示 - - - - Ctrl+Alt+P - Ctrl+Alt+P - - - - Paste Date and Time - 日付と時刻を貼り付け - - - - Ctrl+Shift+V - Ctrl+Shift+V - - - - - To Upper Case - 大文字にする - - - - Ctrl+Shift+U - Ctrl+Shift+U - - - - - To Lower Case - 小文字にする - - - - Ctrl+Shift+L - Ctrl+Shift+L - - - - - Last Active Tab - 前回のアクティブなタブへ - - - - F1 - F1 - - - - - Sort Lines - 行を並べ替える - - - - - Sort Lines Reversely - 行を逆順に並べ替える - - - - Check Spelling - スペルチェック - - - - F2 - F2 - - - - - Save All Files - すべてのファイルを保存 - - - - - User Dictionary - ユーザー辞書 - - - - Calculate number of words -(For huge texts, this may be CPU-intensive.) - 単語数を数える -(巨大なテキストでは CPU 負荷が高くなります) - - - - Next - 次へ - - - - Previous - 前へ - - - - Replace all - すべて置換 - - - - - - Help - ヘルプ - - - - - - - - - - - - - Untitled - 無題 - - - - &Recently Opened - 最近開いたファイル(&R) - - - - - Position: - 桁位置: - - - - - - Normal - ノーマル - - - - Another FeatherPad window has a modal dialog! - 別の FeatherPad ウィンドウにモーダルダイアログがあります! - - - - Please attend to that window or just close its dialog! - そのウィンドウに移動したり、ダイアログを閉じてください! - - - - Save changes? - 変更内容を保存しますか? - - - - - - The file does not exist. - ファイルは存在しません。 - - - - The document has been modified. - 文書が更新されました。 - - - - &Discard changes - 変更の破棄(&D) - - - - &Cancel - キャンセル(&C) - - - - &No to all - すべて無視(&N) - - - - - Unsaved - 未保存 - - - - - - Encoding - エンコーディング - - - - - - - - - - - - Lines - 全行数 - - - - - - Sel. Chars - 選択文字数 - - - - - - Words - 単語数 - - - - Open Link - リンクを開く - - - - Copy Link - リンクをコピー - - - - Another process is running in this tab! - このタブで別のプロセスが実行中です! - - - - Only one process is allowed per tab. - タブごとに許可されるプロセスは1つだけです。 - - - - Script Output - スクリプトの出力 - - - - Script File - スクリプトファイル - - - - Close - 閉じる - - - - Clear - 消去 - - - - Huge file(s) not opened! - 大きすぎるファイルは開けません! - - - - FeatherPad does not open files larger than 100 MiB. - FeatherPad は 100 MiB 以上のファイルを開けません。 - - - - Non-text file(s) not opened! - テキスト以外のファイルは開けません! - - - - See Preferences → Files → Do not permit opening of non-text files - 次の設定を確認してください: 設定 → ファイル → テキスト以外のファイルを開くことを許可しない - - - - Some file(s) could not be opened! - 一部のファイルを開くことができませんでした! - - - - You may not have the permission to read. - おそらく読み取り権限がありません。 - - - - Uneditable file(s)! - 編集できないファイルです! - - - - Non-text files or files with huge lines cannot be edited. - テキスト形式ではないファイルや大きすぎるファイルは編集できません。 - - - - A previous crash detected! - 以前のクラッシュを検出しました! - - - - Preferably, close all FeatherPad windows and start again! - 可能でしたら、FeatherPad のウィンドウをすべて閉じて起動し直してください! - - - - Root Instance - Root 権限のインスタンス - - - - - - All Files (*) - すべてのファイル(*) - - - - All Files (*);;.%1 Files (*.%1) - すべてのファイル(*);;.%1 ファイル (*.%1) - - - - Open file... - ファイルを開く... - - - - .%1 Files (*.%1);;All Files (*) - .%1 ファイル (*.%1);;すべてのファイル (*) - - - - - Save as... - 名前を付けて保存... - - - - Keep encoding and save as... - エンコードして保存... - - - - Yes - はい - - - - No - いいえ - - - - Cancel - キャンセル - - - - Do you want to use <b>MS Windows</b> end-of-lines? - <b>MS Windows</b> の改行コード (CR LF) を使いますか? - - - - This may be good for readability under MS Windows. - これにより、MS Windows で文章が読みやすくなります。 - - - - - - - - - - Syntax - 構文 - - - - Cannot be saved! - 保存できません! - - - - - This file has been modified elsewhere or in another way! - このファイルは他の場所で更新されています! - - - - - Please be careful about reloading or saving this document! - この文書の再読み込みや保存には注意してください! - - - - Print Document - 文書の印刷 - - - - - %1 Pages - %1 ページ - - - - - Copy Target Path - 対象のパスをコピー - - - - - Open Target Here - 対象をここで開く - - - - You need to add a Hunspell dictionary. - Hunspell 辞書を追加してください。 - - - - - - See Preferences → Text → Spell Checking! - 設定 → テキスト → スペルチェック を参照してください! - - - - The Hunspell dictionary does not exist. - Hunspell 辞書が存在しません。 - - - - The Hunspell dictionary is not accompanied by an affix file. - Hunspell 辞書に付属ファイルがありません。 - - - - - - No misspelling in document. - 文書にスペルミスはありません。 - - - - - - No misspelling from text cursor. - テキストのカーソル位置から、スペルミスはありません。 - - - - Spell Checking - スペルチェック - - - - Some files cannot be saved! - いくつかのファイルは保存できませんでした! - - - - A lightweight, tabbed, plain-text editor - 軽量なタブ機能付きのプレーンテキストエディター - - - - based on Qt5 - Qt5 ベース - - - - Author - 作者 - - - - aka. - aka. - - - - - About FeatherPad - FeatherPad について - - - - Translators - 翻訳 - - - - No Replacement - 置換なし - - - - One Replacement - 1 個置換 - - - - %Ln Replacements - - %Ln 個置換 - - - - - The size limit for syntax highlighting is exceeded. - 構文のハイライト表示のサイズ制限を超えています。 - - - - FeatherPad::FileDialog - - - Ctrl+H - Toggle showing hidden files - Ctrl+H - - - - Alt+. - Toggle showing hidden files - Alt+. - - - - FeatherPad::FontDialog - - - Select Font - フォントを選択 - - - - Programming Fonts - プログラミング用フォント - - - - - Font: - フォント: - - - - Size: - サイズ: - - - - Weight: - ウェイト: - - - - Normal - ノーマル - - - - Medium - ミディアム - - - - Bold - ボールド - - - - Black - ブラック - - - - Italic - 斜体 - - - - Preview - プレビュー - - - - FeatherPad::LineEdit - - - Clear text (Ctrl+K) - テキストの消去 (Ctrl+K) - - - - FeatherPad::PrefDialog - - - Preferences - 設定 - - - - Window - ウィンドウ - - - - Window Settings - ウィンドウの設定 - - - - Remember window &size on closing - 閉じる時にウィンドウのサイズを記憶する(&S) - - - - - - - Window frame is excluded. - ウィンドウ枠は除外します。 - - - - Start with this size: - このサイズで起動: - - - - - px - ピクセル - - - - × - × - - - - Enforcing a window position is not recommended -and may not work with some window managers. - ウィンドウの位置を指定することは推奨されません。 -一部のウィンドウマネージャーでは動作しない可能性があります。 - - - - Remember window &position on closing - 閉じる時にウィンドウの位置を記憶する(&P) - - - - Most suitable with sessions -but without tab functionality. - セッションには最適ですが、 -タブ機能はありません。 - - - - Start with side-pane mode - サイドペインモードで起動する - - - - Uncheck for 1/5 of the width. - チェックしないときは、幅は1/5になります。 - - - - Remember splitter position - 分割位置を記憶する - - - - Do not show &toolbar - ツールバーを表示しない(&T) - - - - If the menubar is hidden, -a menu button appears on the toolbar. - メニューバーが非表示の場合、 -ツールバーにメニューボタンが表示されます。 - - - - Do not show &menubar - メニューバーを表示しない(&M) - - - - Hide search &bar by default - デフォルトで検索バーを表示しない(&B) - - - - By default, each search entry -has a separate search history. - デフォルトでは、各検索エントリーには -個別の検索履歴があります。 - - - - Use a shared search history - 検索履歴を共有する - - - - Always show st&atus bar - 常にステータスバーを表示する(&A) - - - - Show cursor position on status bar - ステータスバーにカーソル位置を表示する - - - - - Will take effect after closing this dialog. - このダイアログを閉じた後に有効になります。 - - - - Tab position: - タブの位置: - - - - North - - - - - South - - - - - West - - - - - East - - - - - This means that, for LTR, Alt+Right goes to the first tab -after the last tab is activated, and the same for Alt+Left. - -Tab navigation with mouse wheel is not affected. - 最後のタブを表示している状態で Alt+Right を押すと最初のタブに移動し、 -最初のタブを表示している状態で Alt+Left を押すと最後のタブに移動します。 - -マウスホイールを使用したタブナビゲーションには影響しません。 - - - - Tab navigation wraps &around - タブのナビゲーションを折り返す(&A) - - - - If this is checked, not only you will lose the informative -tooltip and context menu of a single tab but you could not -merge a single tabbed window into another one by tab drag- -and-drop either. - これがチェックされている場合、タブ情報ツールチップや -コンテキストメニューが表示されなくなり、タブが一つだ -けのウィンドウを他のタブ付きウィンドウにドラッグアン -ドドロップしてマージすることができなくなります。 - - - - &Do not show a single tab - タブが単一の時は表示しない(&D) - - - - Close window on closing its last tab - 最後のタブを閉じる時にウィンドウも閉じる - - - - By default, if a FeatherPad window exists on the -current desktop, files will be opened in its tabs. - -However, some desktop environments may not -report that they have multiple desktops. - デフォルトでは、FeatherPad のウィンドウがデスクトップに -存在する場合、そのウィンドウのタブでファイルを開きます。 - -ただし、デスクトップ環境によっては複数の (仮想) デスクトッ -プがあることを確認できない場合があります。 - - - - Always open in separate windows - 常に別のウィンドウで開く - - - - If this is checked, the file dialog provided by the current -desktop environment will be used instead of the Qt file dialog. - -Some desktop environments, like KDE and LXQt, provide files dialogs. - これがチェックされている場合、Qt のファイルダイアログの代わりに、 -現在のデスクトップ環境のファイルダイアログを使用します。 - -KDE や LXQt のようなデスクトップ環境は、独自のファイルダイアログを提供します。 - - - - Native file dialog - 本来のファイルダイアログ - - - - Text - テキスト - - - - Text Editor - テキストエディター - - - - Uncheck for Monospace. - チェックしない時は Monospace になります。 - - - - Remember &font - フォントを記憶する(&F) - - - - &Wrap lines by default - デフォルトで行を折り返す(&W) - - - - Auto-&indent by default - デフォルトで自動的にインデントする(&I) - - - - This covers parentheses, braces, brackets and quotes. - これは、カッコ、中括弧、角括弧、および引用符を扱います。 - - - - Auto-&bracket - 自動でカッコを閉じる(&B) - - - - By default, a triple period is replaced with an ellipsis -and a double hyphen with a long dash while typing, -under proper circumstances. - デフォルトでは、適切な状況下での入力中に、 -3連続ピリオド (...) を3点リーダー (…) に、 -2連続ハイフン (--) を長いダッシュ (—) に置き換えます。 - - - - Replace triple periods and double hyphens while typing - 入力中に3連続ピリオドと2連続ハイフンを置換する - - - - Always show line &numbers - 常に行番号を表示する(&N) - - - - Highlight s&yntax by default - デフォルトで構文をハイライト表示する(&Y) - - - - This creates a menu button on the -status bar for changing the syntax. - これにより、 -ステータスバーに構文を変更するための -メニューボタンが作成されます。 - - - - Support syntax override - 構文の上書きをサポートする - - - - Never highlight syntax for files > - 構文をハイライト表示しないファイルの上限 - - - - MiB - MiB - - - - Show spaces, tabs and tab lines -when the syntax is highlighted. - 構文がハイライト表示されている時、 -スペース、タブ、インデントを表示します。 - - - - Show whitespaces - 空白マークを表示する - - - - Also show line and document ends - 行末と文書の末尾を示すマークを表示する - - - - - The vertical position lines will be drawn only if -the editor font has a fixed pitch (like Monospace). - 垂直位置線は、エディターのフォントが等幅フォント -(Monospace など) の場合にのみ表示されます。 - - - - Show vertical lines starting from this position: - この位置から垂直線を表示: - - - - Needs window reopening to take effect. - 有効にするにはウィンドウを開き直す必要があります。 - - - - Dark c&olor scheme - 暗い色のスキームを使う(&O) - - - - - The color value of the background. -255 means white while 0 means black. - -For the light background, it can be -between 230 and 255; for the dark -background, between 0 and 50. - -Needs window reopening to take effect. - 背景色の値です。 -255は白、0は黒になります。 - -明るい背景は、230~255の範囲で、230が目にやさしいと思います。 -暗い背景は、0〜50の範囲で、50が目にやさしいと思います。 - -反映させるには、ウィンドウを開き直す必要があります。 - - - - Background color value: - 背景色の値: - - - - - Used for pasting the date and time. - -Takes effect after closing this dialog. - -Leave empty for: -MMM dd, yyyy, hh:mm:ss - 日付と時刻を貼り付ける時の形式です。 -このダイアログを閉じると有効になります。 - -空のままにすると次のようになります: -MMM dd, yyyy, hh:mm:ss - -日本人向けの参考例: -yyyy-MM-dd hh:mm - - - - Date and time format: - 日付と時刻の形式: - - - - Text tab size: - タブ文字のサイズ: - - - - spaces - 個のスペース - - - - Some text editors cannot open a document -whose last line is not empty. - 一部のテキストエディターは最後の行が -空でない文書を開けません。 - - - - Ensure an empty last line on saving - 保存時に最後の行が空かどうかを確認する - - - - Remove trailing spaces on saving - 保存時に末尾のスペースを削除する - - - - Thick text cursor - テキストカーソルを太くする - - - - Should the mouse wheel scrolling be inertial -if the cursor is inside the text view? - カーソルがテキストビュー内にある場合に、 -マウスホイールで慣性スクロールを使いますか? - - - - Inertial scrolling with mouse wheel - マウスホイールでの慣性スクロールを使う - - - - This is not a complete fix but -prevents annoying scroll jumps. - これは完全に修正はできませんが、 -厄介なスクロールジャンプを抑えます。 - - - - Workaround for &Qt5's scroll jump bug - Qt5 のスクロールジャンプの不具合を回避する(&Q) - - - - Spell Checking - スペルチェック - - - - - A Hunspell dictionary has a name that ends with ".dic" -and should be alongside an affix file with the same -name but ending with ".aff". - Hunspell 辞書は、".dic" で終わる名前と -".aff" で終わる同じ名前の付属ファイルを -一緒にする必要があります。 - - - - Hunspell dictionary path: - Hunspell 辞書のパス: - - - - - Add dictionary... - 辞書を追加... - - - - If this is unchecked, spell checking -will be started from the document start. - これがチェックされていない場合、 -文書の先頭からスペルチェックを行います。 - - - - Start spell checking from text cursor - テキストカーソル位置からスペルチェックを開始する - - - - Files - ファイル - - - - File Management - ファイル管理 - - - - - The maximum number of recently modified or -opened files FeatherPad shows. The default -is 10. - -Needs application restart to take effect. - FeatherPad に表示する、最近更新したファイル -または最近開いたファイルの最大数です。 -既定値は 10 です。 - -有効にするには、アプリケーションの再起動が必要です。 - - - - Number of recent files: - 記憶しておく最近のファイルの数: - - - - Show recentl&y modified files - 最近更新したファイルを表示する(&Y) - - - - Show recentl&y opened files - 最近開いたファイルを表示する(&Y) - - - - Only if their number is not greater than 50. - その数が50を超えない場合のみ。 - - - - Start with files of last window - 最後のウィンドウのファイルを開いて起動する - - - - This only includes executable files written -in script languages like Shell and Python. - -If it is checked and the opened file is -executable, the file will be executed by clicking -the Run button, that appears on the toolbar/filemenu -when needed, or by its shortcut Ctrl+E. Then, the -process could be killed by Ctrl+Alt+E. - 実行可能なファイルは、シェルや Python のようなスクリプト -言語で書かれたファイルです。 - -これがチェックされ、開いているファイルが実行可能な時、 -ツールバー/ファイルメニューに表示される [実行] ボタンを押 -すか、ショートカット Ctrl+E を押すと実行できます。また、 -Ctrl+Alt+E でプロセスを終了できます。 - - - - Run executable scripts - 実行可能なスクリプトを実行する - - - - - This can be any starting command with -arguments, for example, "xterm -hold" -for running the process in XTerm. - -If the command is left empty, the file -will be executed directly. - -If the script is not run in a terminal -emulator, the output and error messages -will be shown by a popup dialog. - これは実行したいコマンドと、その引数です。 -例えば、XTerm 内でプロセスを実行するには "xterm -hold" のように指定します。 - -コマンドを空のままにすると、ファイルを直接実行します。 - -スクリプトが端末エミュレーターで実行されていない場合、 -出力やエラーメッセージはポップアップダイアログで表示します。 - - - - Start with this command: - 次のコマンドで開始: - - - - Command + Arguments - コマンド + 引数 - - - - - Only for files that exist and can be saved. - 実在し保存可能なファイルのみ。 - - - - Save changes to opened files every: - 開いているファイルの変更を指定間隔で保存: - - - - min - - - - - If this is checked, the Save button/menu-item could -be used also when the opened file is not modified. - -This can be useful under certain circumstances, -e.g. for changing the time stamp or removing the -trailing spaces of a text file. - これがチェックされている場合、開いているファイルを -変更していない場合でも、保存ボタン/メニュー項目を -使用できます。 - -これは例えば、ファイルのタイムスタンプを更新したい -場合や、テキストファイルの末尾のスペースを削除した -い場合といった、特定の条件下で役立ちます。 - - - - Allow saving unmodified files - 未更新ファイルの保存を許可する - - - - Show a warning instead. - 代わりに警告を表示します。 - - - - Do not permit opening of non-text files - テキスト以外のファイルを開くことを許可しない - - - - Shortcuts - ショートカット - - - - Action - 動作 - - - - Shortcut - ショートカット - - - - Restore default shortcuts. - ショートカットを初期設定に戻します。 - - - - Default - 既定値 - - - - Help - ヘルプ - - - - Close - 閉じる - - - - - files - ファイル - - - - - file - ファイル - - - - - Warning: Ambiguous shortcut detected! - 警告: 不正なショートカットを検出しました! - - - - Application restart is needed for changes to take effect. - 変更を有効にするには、アプリケーションの再起動が必要です。 - - - - Window reopening is needed for changes to take effect. - 変更を有効にするには、ウィンドウを開き直す必要があります。 - - - - &Recently Opened - 最近開いたファイル(&R) - - - - Recently &Modified - 最近更新したファイル(&M) - - - - The typed shortcut was reserved. - 入力したショートカットは予約済みでした。 - - - - Hunspell Dictionary Files (*.dic) - Hunspell 辞書ファイル (*.dic) - - - - FeatherPad::SearchBar - - - - Search... - 検索... - - - - Next - 次へ - - - - Previous - 前へ - - - - Match Case - 大文字・小文字の区別 - - - - Whole Word - 単語全体 - - - - Regular Expression - 正規表現 - - - - Search with regex... - 正規表現で検索... - - - - FeatherPad::SessionDialog - - - Session Manager - セッションの管理 - - - - <b>Save/Restore Session</b> - <b>セッションの保存/復元</b> - - - - Filter... - 絞り込み... - - - - Open the selected session(s). - 選択したセッションを開きます。 - - - - - &Open - 開く(&O) - - - - - Del - Delete - - - - - &Remove - 削除(&R) - - - - - Ctrl+Del - Ctrl+Delete - - - - Remove &All - すべて削除(&A) - - - - Save the current session under the given title. - 現在のセッションを指定したタイトルで保存します。 - - - - &Save - 保存(&S) - - - - Type a name to save session - セッションを保存する名前を入力してください - - - - By default, all files that are opened in all -windows will be included in the saved session. - デフォルトでは、すべてのウィンドウで開いたすべてのファイルが、 -保存されるセッションに含まれます。 - - - - Save only from this &window - このウィンドウからのみ保存する(&W) - - - - <b>Warning</b> - <b>警告</b> - - - - - &Yes - はい(&Y) - - - - &No - いいえ(&N) - - - - &Close - 閉じる(&C) - - - - Re&name - 名前を変更(&N) - - - - Nothing saved.<br>No file was opened. - 保存しません。<br>ファイルを開いていません。 - - - - No file exists or can be opened. - ファイルが存在しないか、開くことができません。 - - - - Not all files exist or can be opened. - すべてのファイルが存在しない、または開くことができません。 - - - - &OK - OK(&O) - - - - Do you really want to remove all saved sessions? - 本当に保存したすべてのセッションを削除しますか? - - - - Do you really want to remove the selected sessions? - 本当に選択したセッションを削除しますか? - - - - Do you really want to remove the selected session? - 本当に選択したセッションを削除しますか? - - - - A session with the same name exists.<br>Do you want to overwrite it? - 同じ名前のセッションが存在します。<br>上書きしますか? - - - - FeatherPad::SidePane - - - Filter... - 絞り込み... - - - - FeatherPad::SpellDialog - - - Unknown word: - 未知の単語: - - - - Add To Dictionary - 辞書に追加 - - - - Replace with: - 置換する文字列: - - - - Correct Once - 1つ置換 - - - - Correct All - すべて置換 - - - - Ignore Once - 1つ無視 - - - - Ignore All - すべて無視 - - - - FeatherPad::TextEdit - - - Double click to center current line - ダブルクリックすると現在の行を中央に表示します - - - - FeatherPad::WarningBar - - - - Close - 閉じる - - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_ja.ts featherpad-0.17.1/featherpad/data/translations/featherpad_ja.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_ja.ts 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_ja.ts 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,2431 @@ + + + + + FeatherPad::AboutDialog + + + License + ライセンス + + + + FeatherPad::FPwin + + + Go to line: + 指定行へ移動: + + + + Select text from cursor to this line +(Ctrl+Shift+J) + カーソル位置からこの行までのテキストを選択 +(Ctrl+Shift+J) + + + + Select Text + テキストを選択 + + + + Ctrl+Shift+J + Ctrl+Shift+J + + + + &File + ファイル(&F) + + + + Recently &Modified + 最近更新したファイル(&M) + + + + + &Edit + 編集(&E) + + + + &Options + オプション(&O) + + + + &Encoding + エンコーディング(&E) + + + + &Unicode + ユニコード(&U) + + + + &Western European + 西ヨーロッパ(&W) + + + + &East European + 東ヨーロッパ(&E) + + + + Ea&st Asian + 東アジア(&S) + + + + &Search + 検索(&S) + + + + + &Help + ヘルプ(&H) + + + + + + + Replacement + 置換 + + + + Find: + 検索する文字列: + + + + To be replaced + どの文字列を置換するのか + + + + Replace with: + 置換する文字列: + + + + Replacing text + どの文字列に置換するのか + + + + &New + 新規作成(&N) + + + + New tab + 新しいタブ + + + + Ctrl+N + Ctrl+N + + + + &Open + 開く(&O) + + + + Open a file + ファイルを開く + + + + Ctrl+O + Ctrl+O + + + + + &Save + 保存(&S) + + + + Save the current tab + 現在のタブを保存 + + + + Ctrl+S + Ctrl+S + + + + &Undo + 元に戻す(&U) + + + + Undo + 元に戻す + + + + Ctrl+Z + Ctrl+Z + + + + &Redo + やり直し(&R) + + + + Redo + やり直し + + + + Ctrl+Shift+Z + Ctrl+Shift+Z + + + + + Reload + 再読み込み + + + + Ctrl+Shift+R + Ctrl+Shift+R + + + + &Find + 検索(&F) + + + + Focus/hide search bar + 検索バーの表示/非表示 + + + + Ctrl+F + Ctrl+F + + + + &Replace + 置換(&R) + + + + Show/hide replacement dock + 置換バーの表示/非表示 + + + + Ctrl+R + Ctrl+R + + + + Save &As + 名前を付けて保存(&A) + + + + Ctrl+Shift+S + Ctrl+Shift+S + + + + &Print + 印刷(&P) + + + + Ctrl+P + Ctrl+P + + + + Documen&t Properties + 文書のプロパティ(&T) + + + + Ctrl+Shift+D + Ctrl+Shift+D + + + + &Close + 閉じる(&C) + + + + Ctrl+Shift+Q + Ctrl+Shift+Q + + + + &Quit + 終了(&Q) + + + + Ctrl+Q + Ctrl+Q + + + + &Cut + 切り取り(&C) + + + + Ctrl+X + Ctrl+X + + + + C&opy + コピー(&O) + + + + Ctrl+C + Ctrl+C + + + + &Paste + 貼り付け(&P) + + + + Ctrl+V + Ctrl+V + + + + &Delete + 削除(&D) + + + + &Select All + すべて選択(&S) + + + + Ctrl+A + Ctrl+A + + + + &Font + フォント(&F) + + + + &Line Numbers + 行番号の表示(&L) + + + + Ctrl+L + Ctrl+L + + + + &Wrap Lines + 行の折り返し(&W) + + + + Ctrl+W + Ctrl+W + + + + &Auto-Indentation + 自動インデント(&A) + + + + Ctrl+I + Ctrl+I + + + + &Syntax Highlighting + 構文のハイライト表示(&S) + + + + Ctrl+Shift+H + Ctrl+Shift+H + + + + &Preferences + 設定(&P) + + + + Ctrl+Shift+P + Ctrl+Shift+P + + + + Ctrl+H + Ctrl+H + + + + &About + FeatherPad について(&A) + + + + Windows Arabic (&CP1256) + Windows アラビア文字 (CP1256)(&C) + + + + &Other + その他(&O) + + + + Enforce UTF-8 + UTF-8 を強制 + + + + &UTF-8 + UTF-8(&U) + + + + UTF-&16 + UTF-16(&1) + + + + &ISO-8859-1 + ISO-8859-1(&I) + + + + &Windows-1252 + Windows-1252(&W) + + + + &Cyrillic (CP1251) + キリル文字 (CP1251)(&C) + + + + Cyrillic (&KOI8-U) + キリル文字 (KOI8-U)(&K) + + + + Cyrillic (&ISO-8859-5) + キリル文字 (ISO-8859-5)(&I) + + + + &Chinese (BIG5) + 中国語 (BIG5)(&C) + + + + Chinese (&GB18030) + 中国語 (GB18030)(&G) + + + + &Japanese (ISO-2022-JP) + 日本語 (ISO-2022-JP)(&J) + + + + Japanese (&ISO-2022-JP-2) + 日本語 (ISO-2022-JP-2)(&I) + + + + Japanese (ISO-&2022-KR) + 日本語 (ISO-2022-KR)(&2) + + + + Ja&panese (CP932) + 日本語 (CP932)(&P) + + + + Japa&nese (EUC-JP) + 日本語 (EUC-JP)(&N) + + + + &Korean (CP949) + 韓国語 (CP949)(&K) + + + + K&orean (CP1361) + 韓国語 (CP1361)(&O) + + + + Korean (&EUC-KR) + 韓国語 (EUC-KR)(&E) + + + + Save with &Encoding + エンコードして保存(&E) + + + + &Jump to + 指定行へ移動(&J) + + + + Show/hide jump bar + 指定行へ移動バーの表示/非表示 + + + + Ctrl+J + Ctrl+J + + + + Edit text + テキストを編集 + + + + Ctrl+Shift+E + Ctrl+Shift+E + + + + &Detach Tab + タブを分離(&D) + + + + Ctrl+T + Ctrl+T + + + + ISO-&8859-15 + ISO-8859-15(&8) + + + + Close Ne&xt Tabs + 次のタブを閉じる(&X) + + + + Close &Previous Tabs + 前のタブを閉じる(&P) + + + + Close &All Tabs + すべてのタブを閉じる(&A) + + + + Close &Other Tabs + 他のタブを閉じる(&O) + + + + &Copy File Name + ファイル名をコピー(&C) + + + + Copy File &Path + ファイルパスをコピー(&P) + + + + Ne&xt Tab + 次のタブへ(&X) + + + + Alt+Right + Alt+Right + + + + Previous Ta&b + 前のタブへ(&B) + + + + Alt+Left + Alt+Left + + + + &First Tab + 最初のタブへ(&F) + + + + Alt+Down + Alt+Down + + + + &Last Tab + 最後のタブへ(&L) + + + + Alt+Up + Alt+Up + + + + Menu + メニュー + + + + &Run + 実行(&R) + + + + Execute + 実行する + + + + Ctrl+E + Ctrl+E + + + + &Clear + 消去(&C) + + + + Clear the list of recently modified files + 最近更新したファイル一覧を消去 + + + + Save/Restore Session + セッションの保存/復元 + + + + Sa&ve/Restore Session + セッションの保存/復元(&V) + + + + Ctrl+M + Ctrl+M + + + + Side-Pane + サイドペインの表示/非表示 + + + + Ctrl+Alt+P + Ctrl+Alt+P + + + + Paste Date and Time + 日付と時刻を貼り付け + + + + Ctrl+Shift+V + Ctrl+Shift+V + + + + + To Upper Case + 大文字にする + + + + Ctrl+Shift+U + Ctrl+Shift+U + + + + + To Lower Case + 小文字にする + + + + Ctrl+Shift+L + Ctrl+Shift+L + + + + + To Start Case + 大文字で始める + + + + + Last Active Tab + 前回のアクティブなタブへ + + + + F1 + F1 + + + + + Sort Lines + 行を並べ替える + + + + + Sort Lines Reversely + 行を逆順に並べ替える + + + + Check Spelling + スペルチェック + + + + F2 + F2 + + + + + Save All Files + すべてのファイルを保存 + + + + + User Dictionary + ユーザー辞書 + + + + Text Tabs to Spaces + テキストのタブをスペースに + + + + Calculate number of words +(For huge texts, this may be CPU-intensive.) + 単語数を数える +(巨大なテキストでは CPU 負荷が高くなります) + + + + Next + 次へ + + + + Previous + 前へ + + + + Replace all + すべて置換 + + + + + + + + Help + ヘルプ + + + + + + + + + + + + + + + Untitled + 無題 + + + + &Recently Opened + 最近開いたファイル(&R) + + + + + Position: + 桁位置: + + + + + + Normal + ノーマル + + + + Another FeatherPad window has a modal dialog! + 別の FeatherPad ウィンドウにモーダルダイアログがあります! + + + + Please attend to that window or just close its dialog! + そのウィンドウに移動したり、ダイアログを閉じてください! + + + + Save changes? + 変更内容を保存しますか? + + + + + + The file does not exist. + ファイルは存在しません。 + + + + The document has been modified. + 文書が変更されています。 + + + + &Discard changes + 変更の破棄(&D) + + + + &Cancel + キャンセル(&C) + + + + &No to all + すべて無視(&N) + + + + + Unsaved + 未保存 + + + + + + Encoding + エンコーディング + + + + + + + + + + + + Lines + 全行数 + + + + + + Sel. Chars + 選択文字数 + + + + + + Words + 単語数 + + + + Open Link + リンクを開く + + + + Copy Link + リンクをコピー + + + + Another process is running in this tab! + このタブで別のプロセスが実行中です! + + + + Only one process is allowed per tab. + タブごとに許可されるプロセスは1つだけです。 + + + + Script Output + スクリプトの出力 + + + + Script File + スクリプトファイル + + + + Close + 閉じる + + + + Clear + 消去 + + + + Huge file(s) not opened! + 大きすぎるファイルは開けません! + + + + FeatherPad does not open files larger than 100 MiB. + FeatherPad は 100 MiB 以上のファイルを開けません。 + + + + Non-text file(s) not opened! + テキスト以外のファイルは開けません! + + + + See Preferences → Files → Do not permit opening of non-text files + 次の設定を確認してください: 設定 → ファイル → テキスト以外のファイルを開くことを許可しない + + + + Some file(s) could not be opened! + 一部のファイルを開くことができませんでした! + + + + You may not have the permission to read. + おそらく読み取り権限がありません。 + + + + Uneditable file(s)! + 編集できないファイルです! + + + + Non-text files or files with huge lines cannot be edited. + テキスト形式ではないファイルや大きすぎるファイルは編集できません。 + + + + A previous crash detected! + 以前のクラッシュを検出しました! + + + + Preferably, close all FeatherPad windows and start again! + 可能でしたら、FeatherPad のウィンドウをすべて閉じて起動し直してください! + + + + Root Instance + Root 権限のインスタンス + + + + + + All Files (*) + すべてのファイル(*) + + + + All Files (*);;.%1 Files (*.%1) + すべてのファイル(*);;.%1 ファイル (*.%1) + + + + Open file... + ファイルを開く... + + + + .%1 Files (*.%1);;All Files (*) + .%1 ファイル (*.%1);;すべてのファイル (*) + + + + + Save as... + 名前を付けて保存... + + + + Keep encoding and save as... + エンコードして保存... + + + + Saving as root. + root として保存します。 + + + + Waiting for authentication... + 認証を待っています... + + + + "pkexec" is not found. Please install Polkit! + "pkexec" が見つかりません。Polkit をインストールして下さい! + + + + Yes + はい + + + + No + いいえ + + + + Cancel + キャンセル + + + + Do you want to use <b>MS Windows</b> end-of-lines? + <b>MS Windows</b> の改行コード (CR LF) を使いますか? + + + + This may be good for readability under MS Windows. + これにより、MS Windows で文章が読みやすくなります。 + + + + + + + + + + Syntax + 構文 + + + + + + + Cannot be saved! + 保存できません! + + + + Text tabs are converted to spaces. + テキストのタブはスペースに変換されます。 + + + + The selected text was too long. + 選択したテキストが長すぎます。 + + + + It is not fully processed. + 完全には処理されていません。 + + + + + This file has been modified elsewhere or in another way! + このファイルは他の場所で更新されています! + + + + + Please be careful about reloading or saving this document! + この文書の再読み込みや保存には注意してください! + + + + Printing in progress... + 印刷中です... + + + + Print Document + 文書の印刷 + + + + Printing completed. + 印刷が完了しました。 + + + + + %1 Pages + %1 ページ + + + + + Copy Target Path + 対象のパスをコピー + + + + + Open Target Here + 対象をここで開く + + + + + Open Containing Folder + このファイルのあるフォルダを開く + + + + You need to add a Hunspell dictionary. + Hunspell 辞書を追加してください。 + + + + + + See Preferences → Text → Spell Checking! + 設定 → テキスト → スペルチェック を参照してください! + + + + The Hunspell dictionary does not exist. + Hunspell 辞書が存在しません。 + + + + The Hunspell dictionary is not accompanied by an affix file. + Hunspell 辞書に付属ファイルがありません。 + + + + + + No misspelling in document. + 文書にスペルミスはありません。 + + + + + + No misspelling from text cursor. + テキストのカーソル位置から、スペルミスはありません。 + + + + Spell Checking + スペルチェック + + + + Some files cannot be saved! + いくつかのファイルは保存できませんでした! + + + + A lightweight, tabbed, plain-text editor + 軽量なタブ機能付きのプレーンテキストエディター + + + + based on Qt + Qt ベース + + + + Author + 作者 + + + + aka. + aka. + + + + + About FeatherPad + FeatherPad について + + + + Translators + 翻訳 + + + + No Replacement + 置換なし + + + + One Replacement + 1 個置換 + + + + %Ln Replacements + + %Ln 個置換 + + + + + The first 1000 replacements are highlighted. + 最初の1000個の置換がハイライトされます。 + + + + The size limit for syntax highlighting is exceeded. + 構文のハイライト表示のサイズ制限を超えています。 + + + + FeatherPad::FileDialog + + + Ctrl+H + Toggle showing hidden files + Ctrl+H + + + + Alt+. + Toggle showing hidden files + Alt+. + + + + FeatherPad::FontDialog + + + Select Font + フォントを選択 + + + + Programming Fonts + プログラミング用フォント + + + + + Font: + フォント: + + + + Size: + サイズ: + + + + Weight: + ウェイト: + + + + Normal + ノーマル + + + + Medium + ミディアム + + + + Bold + ボールド + + + + Black + ブラック + + + + Italic + 斜体 + + + + Preview + プレビュー + + + + FeatherPad::LineEdit + + + Clear text (Ctrl+K) + テキストの消去 (Ctrl+K) + + + + FeatherPad::PrefDialog + + + Preferences + 設定 + + + + Window + ウィンドウ + + + + Window Settings + ウィンドウの設定 + + + + Remember window &size on closing + 閉じる時にウィンドウのサイズを記憶する(&S) + + + + + + + Window frame is excluded. + ウィンドウ枠は除外します。 + + + + Start with this size: + このサイズで起動: + + + + + px + ピクセル + + + + × + × + + + + Enforcing a window position is not recommended +and may not work with some window managers. + ウィンドウの位置を指定することは推奨されません。 +一部のウィンドウマネージャーでは動作しない可能性があります。 + + + + Remember window &position on closing + 閉じる時にウィンドウの位置を記憶する(&P) + + + + Most suitable with sessions +but without tab functionality. + セッションには最適ですが、 +タブ機能はありません。 + + + + Start with side-pane mode + サイドペインモードで起動する + + + + Uncheck for 1/5 of the width. + チェックしないときは、幅は1/5になります。 + + + + Remember splitter position + 分割位置を記憶する + + + + Do not show &toolbar + ツールバーを表示しない(&T) + + + + If the menubar is hidden, +a menu button appears on the toolbar. + メニューバーが非表示の場合、 +ツールバーにメニューボタンが表示されます。 + + + + Do not show &menubar + メニューバーを表示しない(&M) + + + + Hide search &bar by default + デフォルトで検索バーを表示しない(&B) + + + + By default, each search entry +has a separate search history. + デフォルトでは、各検索エントリーには +個別の検索履歴があります。 + + + + Use a shared search history + 検索履歴を共有する + + + + Always show st&atus bar + 常にステータスバーを表示する(&A) + + + + Show cursor position on status bar + ステータスバーにカーソル位置を表示する + + + + + Will take effect after closing this dialog. + このダイアログを閉じた後に有効になります。 + + + + Tab position: + タブの位置: + + + + North + + + + + South + + + + + West + + + + + East + + + + + This means that, for LTR, Alt+Right goes to the first tab +after the last tab is activated, and the same for Alt+Left. + +Tab navigation with mouse wheel is not affected. + 最後のタブを表示している状態で Alt+Right を押すと最初のタブに移動し、 +最初のタブを表示している状態で Alt+Left を押すと最後のタブに移動します。 + +マウスホイールを使用したタブナビゲーションには影響しません。 + + + + Tab navigation wraps &around + タブのナビゲーションを折り返す(&A) + + + + If this is checked, not only you will lose the informative +tooltip and context menu of a single tab but you could not +merge a single tabbed window into another one by tab drag- +and-drop either. + これがチェックされている場合、タブ情報ツールチップや +コンテキストメニューが表示されなくなり、タブが一つだ +けのウィンドウを他のタブ付きウィンドウにドラッグアン +ドドロップしてマージすることができなくなります。 + + + + &Do not show a single tab + タブが単一の時は表示しない(&D) + + + + Close window on closing its last tab + 最後のタブを閉じる時にウィンドウも閉じる + + + + By default, if a FeatherPad window exists on the +current desktop, files will be opened in its tabs. + +However, some desktop environments may not +report that they have multiple desktops. + デフォルトでは、FeatherPad のウィンドウがデスクトップに +存在する場合、そのウィンドウのタブでファイルを開きます。 + +ただし、デスクトップ環境によっては複数の (仮想) デスクトッ +プがあることを確認できない場合があります。 + + + + Always open in separate windows + 常に別のウィンドウで開く + + + + If this is checked, the file dialog provided by the current +desktop environment will be used instead of the Qt file dialog. + +Some desktop environments, like KDE and LXQt, provide files dialogs. + これがチェックされている場合、Qt のファイルダイアログの代わりに、 +現在のデスクトップ環境のファイルダイアログを使用します。 + +KDE や LXQt のようなデスクトップ環境は、独自のファイルダイアログを提供します。 + + + + Native file dialog + 本来のファイルダイアログ + + + + Text + テキスト + + + + Text Editor + テキストエディター + + + + Uncheck for Monospace. + チェックしない時は Monospace になります。 + + + + Remember &font + フォントを記憶する(&F) + + + + &Wrap lines by default + デフォルトで行を折り返す(&W) + + + + Auto-&indent by default + デフォルトで自動的にインデントする(&I) + + + + This covers parentheses, braces, brackets and quotes. + これは、カッコ、中括弧、角括弧、および引用符を扱います。 + + + + Auto-&bracket + 自動でカッコを閉じる(&B) + + + + By default, a triple period is replaced with an ellipsis +and a double hyphen with a long dash while typing, +under proper circumstances. + デフォルトでは、適切な状況下での入力中に、 +3連続ピリオド (...) を3点リーダー (…) に、 +2連続ハイフン (--) を長いダッシュ (—) に置き換えます。 + + + + Replace triple periods and double hyphens while typing + 入力中に3連続ピリオドと2連続ハイフンを置換する + + + + Always show line &numbers + 常に行番号を表示する(&N) + + + + Highlight case-sensitive and whole matches +of the selected text. + 選択したテキストの大文字小文字を区別して完全一致をハイライトします。 + + + + Selection highlighting + 選択ハイライト表示する + + + + Highlight s&yntax by default + デフォルトで構文をハイライト表示する(&Y) + + + + This creates a menu button on the +status bar for changing the syntax. + これにより、 +ステータスバーに構文を変更するための +メニューボタンが作成されます。 + + + + Support syntax override + 構文の上書きをサポートする + + + + Never highlight syntax for files > + 構文をハイライト表示しないファイルの上限 + + + + MiB + MiB + + + + Show spaces, tabs and tab lines +when the syntax is highlighted. + 構文がハイライト表示されている時、 +スペース、タブ、インデントを表示します。 + + + + Show whitespaces + 空白マークを表示する + + + + Also show line and document ends + 行末と文書の末尾を示すマークを表示する + + + + + The vertical position lines will be drawn only if +the editor font has a fixed pitch (like Monospace). + 垂直位置線は、エディターのフォントが等幅フォント +(Monospace など) の場合にのみ表示されます。 + + + + Show vertical lines starting from this position: + この位置から垂直線を表示: + + + + Needs window reopening to take effect. + 有効にするにはウィンドウを開き直す必要があります。 + + + + Dark c&olor scheme + 暗い色のスキームを使う(&O) + + + + + The color value of the background. +255 means white while 0 means black. + +For the light background, it can be +between 230 and 255; for the dark +background, between 0 and 50. + +Needs window reopening to take effect. + 背景色の値です。 +255は白、0は黒になります。 + +明るい背景は、230~255の範囲で、230が目にやさしいと思います。 +暗い背景は、0〜50の範囲で、50が目にやさしいと思います。 + +反映させるには、ウィンドウを開き直す必要があります。 + + + + Background color value: + 背景色の値: + + + + + Used for pasting the date and time. + +Takes effect after closing this dialog. + +Leave empty for: +MMM dd, yyyy, hh:mm:ss + 日付と時刻を貼り付ける時の形式です。 +このダイアログを閉じると有効になります。 + +空のままにすると次のようになります: +MMM dd, yyyy, hh:mm:ss + +日本人向けの参考例: +yyyy-MM-dd hh:mm + + + + Date and time format: + 日付と時刻の形式: + + + + Text tab size: + タブ文字のサイズ: + + + + spaces + 個のスペース + + + + Some text editors cannot open a document +whose last line is not empty. + 一部のテキストエディターは最後の行が +空でない文書を開けません。 + + + + Ensure an empty last line on saving + 保存時に最後の行が空かどうかを確認する + + + + Remove trailing spaces on saving + 保存時に末尾のスペースを削除する + + + + Thick text cursor + テキストカーソルを太くする + + + + Should the mouse wheel scrolling be inertial +if the cursor is inside the text view? + カーソルがテキストビュー内にある場合に、 +マウスホイールで慣性スクロールを使いますか? + + + + Inertial scrolling with mouse wheel + マウスホイールでの慣性スクロールを使う + + + + Spell Checking + スペルチェック + + + + + A Hunspell dictionary has a name that ends with ".dic" +and should be alongside an affix file with the same +name but ending with ".aff". + Hunspell 辞書は、".dic" で終わる名前と +".aff" で終わる同じ名前の付属ファイルを +一緒にする必要があります。 + + + + Hunspell dictionary path: + Hunspell 辞書のパス: + + + + + Add dictionary... + 辞書を追加... + + + + If this is unchecked, spell checking +will be started from the document start. + これがチェックされていない場合、 +文書の先頭からスペルチェックを行います。 + + + + Start spell checking from text cursor + テキストカーソル位置からスペルチェックを開始する + + + + Files + ファイル + + + + File Management + ファイル管理 + + + + + The maximum number of recently modified or +opened files FeatherPad shows. The default +is 10. + +Needs application restart to take effect. + FeatherPad に表示する、最近更新したファイル +または最近開いたファイルの最大数です。 +既定値は 10 です。 + +有効にするには、アプリケーションの再起動が必要です。 + + + + Number of recent files: + 記憶しておく最近のファイルの数: + + + + Show recentl&y modified files + 最近更新したファイルを表示する(&Y) + + + + Show recentl&y opened files + 最近開いたファイルを表示する(&Y) + + + + Only if their number is not greater than 50. + その数が50を超えない場合のみ。 + + + + Start with files of last window + 最後のウィンドウのファイルを開いて起動する + + + + This only includes executable files written +in script languages like Shell and Python. + +If it is checked and the opened file is +executable, the file will be executed by clicking +the Run button, that appears on the toolbar/filemenu +when needed, or by its shortcut Ctrl+E. Then, the +process could be killed by Ctrl+Alt+E. + 実行可能なファイルは、シェルや Python のようなスクリプト +言語で書かれたファイルです。 + +これがチェックされ、開いているファイルが実行可能な時、 +ツールバー/ファイルメニューに表示される [実行] ボタンを押 +すか、ショートカット Ctrl+E を押すと実行できます。また、 +Ctrl+Alt+E でプロセスを終了できます。 + + + + Run executable scripts + 実行可能なスクリプトを実行する + + + + + This can be any starting command with +arguments, for example, "xterm -hold" +for running the process in XTerm. + +If the command is left empty, the file +will be executed directly. + +If the script is not run in a terminal +emulator, the output and error messages +will be shown by a popup dialog. + これは実行したいコマンドと、その引数です。 +例えば、XTerm 内でプロセスを実行するには "xterm -hold" のように指定します。 + +コマンドを空のままにすると、ファイルを直接実行します。 + +スクリプトが端末エミュレーターで実行されていない場合、 +出力やエラーメッセージはポップアップダイアログで表示します。 + + + + Start with this command: + 次のコマンドで開始: + + + + Command + Arguments + コマンド + 引数 + + + + + Only for files that exist and can be saved. + 実在し保存可能なファイルのみ。 + + + + Save changes to opened files every: + 開いているファイルの変更を指定間隔で保存: + + + + min + + + + + If this is checked, the Save button/menu-item could +be used also when the opened file is not modified. + +This can be useful under certain circumstances, +e.g. for changing the time stamp or removing the +trailing spaces of a text file. + これがチェックされている場合、開いているファイルを +変更していない場合でも、保存ボタン/メニュー項目を +使用できます。 + +これは例えば、ファイルのタイムスタンプを更新したい +場合や、テキストファイルの末尾のスペースを削除した +い場合といった、特定の条件下で役立ちます。 + + + + Allow saving unmodified files + 未更新ファイルの保存を許可する + + + + Show a warning instead. + 代わりに警告を表示します。 + + + + Do not permit opening of non-text files + テキスト以外のファイルを開くことを許可しない + + + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + デフォルトでは、ファイルをコピーして、 +FeatherPad に貼り付ける場合はそのファイルを開きます。 + + + + Paste paths instead of files + ファイルではなくパスを貼り付ける + + + + Shortcuts + ショートカット + + + + Action + 動作 + + + + Shortcut + ショートカット + + + + Restore default shortcuts. + ショートカットを初期設定に戻します。 + + + + + + Default + 既定値 + + + + Syntax Colors + 構文の色 + + + + Element + 要素 + + + + Text Color + 文字の色 + + + + Whitespace color value: + ホワイトスペースの色の値: + + + + + Has effect only if line numbers are shown. + 行番号が表示されている場合のみ効果があります。 + + + + Current line highlight value: + 現在行の強調表示の値: + + + + Restore default syntax colors. + 構文の色を初期設定に戻します。 + + + + Help + ヘルプ + + + + Close + 閉じる + + + + Press a modifier key to clear a shortcut +in the editing mode. + ショートカットをクリアするには、編集モードで +修飾キー(訳注: Alt,Ctrl,Shift のみ)を押します。 + + + + Double click a color to change it. + 変更する色をダブルクリックしてください。 + + + + + files + ファイル + + + + + file + ファイル + + + + + Warning: Ambiguous shortcut detected! + 警告: 不正なショートカットを検出しました! + + + + Functions, URLs,… + 関数, URL, … + + + + Built-in Functions + 組み込み関数 + + + + Comments + コメント + + + + Quotations + 引用 + + + + Types + タイプ + + + + Key Words + キーワード + + + + Numbers + 数値 + + + + Regular Expressions, Code Blocks,… + 正規表現, コードブロック,… + + + + Document Blocks, XML/HTML Elements,… + 文書ブロック, XML/HTML 要素,… + + + + Markdown Headings, CSS Values,… + マークダウンの見出し, CSS の値,… + + + + Extra Elements + その他の要素 + + + + Application restart is needed for changes to take effect. + 変更を有効にするには、アプリケーションの再起動が必要です。 + + + + Window reopening is needed for changes to take effect. + 変更を有効にするには、ウィンドウを開き直す必要があります。 + + + + &Recently Opened + 最近開いたファイル(&R) + + + + Recently &Modified + 最近更新したファイル(&M) + + + + The typed shortcut was reserved. + 入力したショートカットは予約済みでした。 + + + + Hunspell Dictionary Files (*.dic) + Hunspell 辞書ファイル (*.dic) + + + + + Select Syntax Color + 構文の色を選択 + + + + FeatherPad::SearchBar + + + + Search... + 検索... + + + + Next + 次へ + + + + Previous + 前へ + + + + Match Case + 大文字・小文字の区別 + + + + Whole Word + 単語全体 + + + + Regular Expression + 正規表現 + + + + Search with regex... + 正規表現で検索... + + + + FeatherPad::SessionDialog + + + Session Manager + セッションの管理 + + + + <b>Save/Restore Session</b> + <b>セッションの保存/復元</b> + + + + Filter... + 絞り込み... + + + + Open the selected session(s). + 選択したセッションを開きます。 + + + + + &Open + 開く(&O) + + + + + Del + Delete + + + + + &Remove + 削除(&R) + + + + + Ctrl+Del + Ctrl+Delete + + + + Remove &All + すべて削除(&A) + + + + Save the current session under the given title. + 現在のセッションを指定したタイトルで保存します。 + + + + &Save + 保存(&S) + + + + Type a name to save session + セッションを保存する名前を入力してください + + + + By default, all files that are opened in all +windows will be included in the saved session. + デフォルトでは、すべてのウィンドウで開いたすべてのファイルが、 +保存されるセッションに含まれます。 + + + + Save only from this &window + このウィンドウからのみ保存する(&W) + + + + <b>Warning</b> + <b>警告</b> + + + + + &Yes + はい(&Y) + + + + &No + いいえ(&N) + + + + &Close + 閉じる(&C) + + + + Re&name + 名前を変更(&N) + + + + Nothing saved.<br>No file was opened. + 保存しません。<br>ファイルを開いていません。 + + + + No file exists or can be opened. + ファイルが存在しないか、開くことができません。 + + + + Not all files exist or can be opened. + すべてのファイルが存在しない、または開くことができません。 + + + + &OK + OK(&O) + + + + Do you really want to remove all saved sessions? + 本当に保存したすべてのセッションを削除しますか? + + + + Do you really want to remove the selected sessions? + 本当に選択したセッションを削除しますか? + + + + Do you really want to remove the selected session? + 本当に選択したセッションを削除しますか? + + + + A session with the same name exists.<br>Do you want to overwrite it? + 同じ名前のセッションが存在します。<br>上書きしますか? + + + + FeatherPad::SidePane + + + Filter... + 絞り込み... + + + + FeatherPad::SpellDialog + + + Unknown word: + 未知の単語: + + + + Add To Dictionary + 辞書に追加 + + + + Replace with: + 置換する文字列: + + + + Correct Once + 1つ置換 + + + + Correct All + すべて置換 + + + + Ignore Once + 1つ無視 + + + + Ignore All + すべて無視 + + + + FeatherPad::TextEdit + + + Double click to center current line + ダブルクリックすると現在の行を中央に表示します + + + diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_ko.ts featherpad-0.17.1/featherpad/data/translations/featherpad_ko.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_ko.ts 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_ko.ts 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,2370 @@ + + + + + FeatherPad::AboutDialog + + + License + 라이센스 + + + + FeatherPad::FPwin + + + + + + + + + + + + + + Untitled + 제목 없음 + + + + Go to line: + 이동할 줄 번호: + + + + Select text from cursor to this line +(Ctrl+Shift+J) + 커서가 위치한 줄을 선택 +(Ctrl+Shift+J) + + + + Select Text + 텍스트 선택 + + + + Ctrl+Shift+J + Ctrl+Shift+J + + + + &File + 파일(&F) + + + + + &Edit + 편집(&E) + + + + &Options + 옵션(&O) + + + + + + Encoding + 인코딩 + + + + &Search + 검색(&S) + + + + + &Help + 도움말(&H) + + + + Find: + 찾을 내용: + + + + To be replaced + 앞으로 바뀔 내용 + + + + Replace with: + 바꿀 내용: + + + + Replacing text + 대체할 텍스트 + + + + &New + 새로 만들기(&N) + + + + New tab + 새 탭 + + + + Ctrl+N + Ctrl+N + + + + &Open + 열기(&O) + + + + Open a file + 파일 열기 + + + + Ctrl+O + Ctrl+O + + + + + &Save + 저장(&S) + + + + Save the current tab + 현재 탭 저장 + + + + Ctrl+S + Ctrl+S + + + + &Undo + 실행 취소(&U) + + + + Undo + 실행 취소 + + + + Ctrl+Z + Ctrl+Z + + + + &Redo + 다시 실행(&R) + + + + Redo + 다시 실행 + + + + Ctrl+Shift+Z + Ctrl+Shift+Z + + + + + Reload + 다시 불러오기 + + + + Ctrl+Shift+R + + + + + &Find + 찾기(&F) + + + + Ctrl+F + + + + + Show/hide replacement dock + 바꾸기 도크를 보이기/숨기기 + + + + Ctrl+R + + + + + Save &As + 다른 이름으로 저장(&A) + + + + Ctrl+Shift+S + + + + + &Print + 인쇄(&P) + + + + Ctrl+P + + + + + Documen&t Properties + 문서 속성(&T) + + + + Ctrl+Shift+D + + + + + &Close + 닫기(&C) + + + + Ctrl+Shift+Q + + + + + &Quit + 종료(&Q) + + + + Ctrl+Q + + + + + &Cut + 자르기(&C) + + + + Ctrl+X + + + + + C&opy + 복사(&C) + + + + Ctrl+C + + + + + &Paste + 붙여넣기(&P) + + + + Ctrl+V + + + + + &Delete + 삭제(&D) + + + + &Select All + 모두 선택(&S) + + + + Ctrl+A + + + + + &Font + 글꼴(&F) + + + + &Line Numbers + 줄 번호(&L) + + + + Ctrl+L + + + + + &Wrap Lines + 자동 줄 바꿈(&W) + + + + Ctrl+W + + + + + &Auto-Indentation + 자동 들여쓰기(&A) + + + + Ctrl+I + + + + + &Syntax Highlighting + 문법 강조(&S) + + + + Ctrl+Shift+H + + + + + &Preferences + 속성(&P) + + + + Ctrl+Shift+P + + + + + Ctrl+H + + + + + &About + 정보(&A) + + + + Enforce UTF-8 + UTF-8 강제 + + + + Save with &Encoding + 인코딩으로 저장(&E) + + + + &Jump to + 줄 이동(&J) + + + + Show/hide jump bar + 줄 이동 바 보이기/숨기기 + + + + Ctrl+J + + + + + Edit text + 텍스트 편집 + + + + Ctrl+Shift+E + + + + + &Run + 실행(&R) + + + + Ctrl+E + + + + + &Clear + 지우기 + + + + Clear the list of recently modified files + 최근 변경된 파일 목록 지우기 + + + + Save/Restore Session + 세션 저장/복원 + + + + Sa&ve/Restore Session + 세션 저장/복원(&V) + + + + Ctrl+M + + + + + Side-Pane + + + + + Ctrl+Alt+P + + + + + Paste Date and Time + 날짜/시간 붙여넣기 + + + + Ctrl+Shift+V + + + + + + To Upper Case + 대문자로 바꾸기 + + + + Ctrl+Shift+U + + + + + + To Lower Case + 소문자로 바꾸기 + + + + Ctrl+Shift+L + + + + + + To Start Case + + + + + + Last Active Tab + 마지막 활성 탭 + + + + F1 + + + + + + Sort Lines + 줄 정렬 + + + + + Sort Lines Reversely + 역순으로 줄 정렬 + + + + Check Spelling + 맞춤법 확인 + + + + F2 + + + + + + Save All Files + 모든 파일 저장 + + + + + User Dictionary + 사용자 사전 + + + + Text Tabs to Spaces + + + + + &Detach Tab + 탭 분리(&D) + + + + Ctrl+T + + + + + Close Ne&xt Tabs + 다음 탭 닫기(&X) + + + + Close &Previous Tabs + 이전 탭 닫기(&P) + + + + Ne&xt Tab + 다음 탭(&X) + + + + Previous Ta&b + 이전 탭(&B) + + + + Execute + 실행 + + + + Close &All Tabs + 모든 탭 닫기(&A) + + + + Recently &Modified + 최근 수정(&M) + + + + &Encoding + 인코딩(&E) + + + + &Unicode + 유니코드(&U) + + + + &Western European + 서유럽(&W) + + + + &East European + 동유럽(&E) + + + + Ea&st Asian + 동아시아(&S) + + + + + + + Replacement + 바꾸기 + + + + Focus/hide search bar + 검색 바 강조/숨기기 + + + + &Replace + 바꾸기(&R) + + + + Windows Arabic (&CP1256) + + + + + &Other + 기타(&O) + + + + &UTF-8 + + + + + UTF-&16 + + + + + &ISO-8859-1 + + + + + &Windows-1252 + + + + + &Cyrillic (CP1251) + + + + + Cyrillic (&KOI8-U) + + + + + Cyrillic (&ISO-8859-5) + + + + + &Chinese (BIG5) + + + + + Chinese (&GB18030) + + + + + &Japanese (ISO-2022-JP) + + + + + Japanese (&ISO-2022-JP-2) + + + + + Japanese (ISO-&2022-KR) + + + + + Ja&panese (CP932) + + + + + Japa&nese (EUC-JP) + + + + + &Korean (CP949) + + + + + K&orean (CP1361) + + + + + Korean (&EUC-KR) + + + + + ISO-&8859-15 + + + + + Close &Other Tabs + 다른 탭 닫기(&O) + + + + &Copy File Name + 파일 이름 복사(&C) + + + + Copy File &Path + 파일 경로 복사(&P) + + + + Alt+Right + + + + + Alt+Left + + + + + &First Tab + 첫 번째 탭(&F) + + + + Alt+Down + + + + + &Last Tab + 마지막 탭(&L) + + + + Alt+Up + + + + + Menu + 메뉴 + + + + Calculate number of words +(For huge texts, this may be CPU-intensive.) + 단어 수 계산 +(텍스트 양이 많을 경우 CPU에 부하가 걸릴 수 있습니다.) + + + + Next + 다음 + + + + Previous + 이전 + + + + Replace all + 모두 바꾸기 + + + + &Recently Opened + 최근 열어본 파일(&R) + + + + Close + 닫기 + + + + Save changes? + 변경된 내용을 저장하시겠습니까? + + + + Please attend to that window or just close its dialog! + 해당 창을 확인하거나 대화 상자를 닫으십시오! + + + + The document has been modified. + 이 문서는 변경됩니다. + + + + &Discard changes + 변경 사항을 취소(&D) + + + + &Cancel + 취소(&C) + + + + &No to all + + + + + + Unsaved + 저장 안 됨 + + + + + + + + + + + + Lines + + + + + + + Sel. Chars + 선택된 문자수 + + + + + + Words + 단어 + + + + Another process is running in this tab! + 다른 프로세스가 이 탭에 실행 중입니다! + + + + Script File + 스크립트 파일 + + + + Another FeatherPad window has a modal dialog! + 다른 FeatherPad 윈도우에 대화 상자가 열려있습니다! + + + + + Position: + 위치: + + + + + + Normal + 일반 + + + + + + The file does not exist. + 파일이 존재하지 않습니다. + + + + Open Link + 링크 열 + + + + Copy Link + 링크 복사 + + + + Only one process is allowed per tab. + 한 탭에 하나의 프로세스만 허용됩니다. + + + + Script Output + 스크립트 출력 + + + + Clear + 지우기 + + + + FeatherPad does not open files larger than 100 MiB. + FeatherPad는 100 MiB 이상의 파일을 열 수 없습니다. + + + + Non-text file(s) not opened! + 텍스트가 아닌 파일은 열 수 없습니다! + + + + See Preferences → Files → Do not permit opening of non-text files + 속성 → 파일 → 텍스트가 아닌 파일을 열지 않기 항목을 확인하세요 + + + + Some file(s) could not be opened! + 일부 파일이 열리지 않았습니다! + + + + You may not have the permission to read. + 파일을 읽을 수 있는 권한이 없습니다. + + + + Uneditable file(s)! + 수정할 수 없는 파일입니다! + + + + Non-text files or files with huge lines cannot be edited. + 텍스트 파일이 아니거나 긴 줄을 포함하는 파일은 편집할 수 없습니다. + + + + A previous crash detected! + 이전의 충돌이 감지되었습니다! + + + + Preferably, close all FeatherPad windows and start again! + 모든 FeatherPad 윈도우를 닫고 다시 시작할 것을 권장합니다! + + + + Root Instance + + + + + + + All Files (*) + 모든 파일 (*) + + + + All Files (*);;.%1 Files (*.%1) + 모든 파일 (*);.%1 파일 (*.%1) + + + + Open file... + 파일 열기... + + + + .%1 Files (*.%1);;All Files (*) + .%1 파일 (*.%1);;모든 파일 (*) + + + + + Save as... + 다른 이름으로 저장... + + + + Keep encoding and save as... + 인코딩을 유지하고 다른 이름으로 저장... + + + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + + Yes + + + + + No + 아니오 + + + + Cancel + 취소 + + + + Do you want to use <b>MS Windows</b> end-of-lines? + <b>MS Windows</b>의 EOL(end-of-lines)를 사용하시겠습니까? + + + + This may be good for readability under MS Windows. + MS Windows에서의 가독성이 더 높아질 것입니다. + + + + + + + Cannot be saved! + 저장되지 않음! + + + + + + + + Help + 도움말 + + + + + + + + + + Syntax + 문법 + + + + Huge file(s) not opened! + 양이 많은 파일은 열 수 없습니다! + + + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + + This file has been modified elsewhere or in another way! + 이 파일은 다른 곳이나 다른 방법으로 수정되었습니다! + + + + + Please be careful about reloading or saving this document! + 이 문서를 다시 불러오거나 저장합니다! + + + + Printing in progress... + + + + + Print Document + 인쇄 문서 + + + + Printing completed. + + + + + + %1 Pages + %1 페이지 + + + + + Copy Target Path + 복사 대상 경로 + + + + + Open Target Here + 이 경로에 열기 + + + + + Open Containing Folder + + + + + You need to add a Hunspell dictionary. + + + + + + + See Preferences → Text → Spell Checking! + 속성 → 텍스트 → 맞춤법 검사를 확인하세요! + + + + The Hunspell dictionary does not exist. + + + + + The Hunspell dictionary is not accompanied by an affix file. + + + + + + + No misspelling in document. + 이 문서에 잘못된 표현이 없습니다. + + + + + + No misspelling from text cursor. + 이 커서의 위치에 잘못된 표현이 없습니다. + + + + Spell Checking + 맞춤법 검사 + + + + Some files cannot be saved! + 일부 파일이 저장되지 않았습니다! + + + + Translators + 번역 + + + + A lightweight, tabbed, plain-text editor + 가볍고, 탭이 있는 텍스트 에디터 + + + + based on Qt + Qt 기반 + + + + Author + 저자 + + + + aka. + + + + + + About FeatherPad + FeatherPad 정보 + + + + No Replacement + 바꾸지 않기 + + + + One Replacement + 이번 한 번만 바꾸기 + + + + %Ln Replacements + + %Ln회 바꾸기 + + + + + The first 1000 replacements are highlighted. + + + + + The size limit for syntax highlighting is exceeded. + + + + + FeatherPad::FileDialog + + + Ctrl+H + Toggle showing hidden files + 숨겨진 파일 표시 전환 + + + + + Alt+. + Toggle showing hidden files + 숨겨진 파일 표시 전환 + + + + + FeatherPad::FontDialog + + + Select Font + 글꼴 선택 + + + + Programming Fonts + 프로그래밍 글꼴 + + + + + Font: + 글꼴: + + + + Size: + 크기: + + + + Weight: + 스타일: + + + + Normal + 보통 + + + + Medium + 중간 + + + + Bold + 굵게 + + + + Black + 검정 + + + + Italic + 이탤릭 + + + + Preview + 미리보기 + + + + FeatherPad::LineEdit + + + Clear text (Ctrl+K) + 텍스트 지우기 (Ctrl+K) + + + + FeatherPad::PrefDialog + + + Preferences + 속성 + + + + Window + 윈도우 + + + + Window Settings + 윈도우 설정 + + + + Remember window &size on closing + + + + + + + + Window frame is excluded. + + + + + Start with this size: + + + + + + px + + + + + × + + + + + Enforcing a window position is not recommended +and may not work with some window managers. + + + + + Remember window &position on closing + + + + + Most suitable with sessions +but without tab functionality. + + + + + Uncheck for 1/5 of the width. + + + + + Remember splitter position + + + + + Do not show &toolbar + 도구바를 표시하지 않음(&T) + + + + If the menubar is hidden, +a menu button appears on the toolbar. + + + + + Do not show &menubar + 메뉴바를 표시하지 않음(&M) + + + + Hide search &bar by default + + + + + By default, each search entry +has a separate search history. + + + + + Use a shared search history + + + + + Always show st&atus bar + + + + + Show cursor position on status bar + + + + + + Will take effect after closing this dialog. + + + + + Tab position: + + + + + North + + + + + South + + + + + West + + + + + East + + + + + This means that, for LTR, Alt+Right goes to the first tab +after the last tab is activated, and the same for Alt+Left. + +Tab navigation with mouse wheel is not affected. + + + + + Tab navigation wraps &around + + + + + Close window on closing its last tab + + + + + By default, if a FeatherPad window exists on the +current desktop, files will be opened in its tabs. + +However, some desktop environments may not +report that they have multiple desktops. + + + + + Always open in separate windows + + + + + If this is checked, the file dialog provided by the current +desktop environment will be used instead of the Qt file dialog. + +Some desktop environments, like KDE and LXQt, provide files dialogs. + + + + + Native file dialog + + + + + Uncheck for Monospace. + + + + + Remember &font + + + + + This covers parentheses, braces, brackets and quotes. + + + + + Auto-&bracket + + + + + By default, a triple period is replaced with an ellipsis +and a double hyphen with a long dash while typing, +under proper circumstances. + + + + + Replace triple periods and double hyphens while typing + + + + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + + Never highlight syntax for files > + + + + + This creates a menu button on the +status bar for changing the syntax. + + + + + Support syntax override + + + + + Show spaces, tabs and tab lines +when the syntax is highlighted. + + + + + Show whitespaces + + + + + + The vertical position lines will be drawn only if +the editor font has a fixed pitch (like Monospace). + + + + + Show vertical lines starting from this position: + + + + + Also show line and document ends + + + + + Date and time format: + + + + + Some text editors cannot open a document +whose last line is not empty. + + + + + Ensure an empty last line on saving + + + + + Remove trailing spaces on saving + + + + + Inertial scrolling with mouse wheel + + + + + Files + 파일 + + + + File Management + 파일 관리 + + + + Start with files of last window + + + + + + This can be any starting command with +arguments, for example, "xterm -hold" +for running the process in XTerm. + +If the command is left empty, the file +will be executed directly. + +If the script is not run in a terminal +emulator, the output and error messages +will be shown by a popup dialog. + + + + + Start with this command: + 이 명령으로 시작: + + + + Command + Arguments + 명령 + 인수 + + + + Show recentl&y modified files + 최근 수정된 파일 표시하기(&Y) + + + + Show recentl&y opened files + 최근 열어본 파일 보기(&Y) + + + + Save changes to opened files every: + 열려 있는 파일을 자동으로 저장: + + + + Help + 도움말 + + + + Start with side-pane mode + + + + + If this is checked, not only you will lose the informative +tooltip and context menu of a single tab but you could not +merge a single tabbed window into another one by tab drag- +and-drop either. + + + + + &Do not show a single tab + + + + + Text + 텍스트 + + + + Text Editor + 텍스트 편집기 + + + + &Wrap lines by default + + + + + Auto-&indent by default + + + + + Always show line &numbers + + + + + Highlight s&yntax by default + + + + + Dark c&olor scheme + + + + + Background color value: + + + + + MiB + + + + + This only includes executable files written +in script languages like Shell and Python. + +If it is checked and the opened file is +executable, the file will be executed by clicking +the Run button, that appears on the toolbar/filemenu +when needed, or by its shortcut Ctrl+E. Then, the +process could be killed by Ctrl+Alt+E. + + + + + Needs window reopening to take effect. + + + + + + The color value of the background. +255 means white while 0 means black. + +For the light background, it can be +between 230 and 255; for the dark +background, between 0 and 50. + +Needs window reopening to take effect. + + + + + Run executable scripts + + + + + + The maximum number of recently modified or +opened files FeatherPad shows. The default +is 10. + +Needs application restart to take effect. + + + + + + Used for pasting the date and time. + +Takes effect after closing this dialog. + +Leave empty for: +MMM dd, yyyy, hh:mm:ss + + + + + Text tab size: + + + + + spaces + + + + + Thick text cursor + + + + + Should the mouse wheel scrolling be inertial +if the cursor is inside the text view? + + + + + Spell Checking + 맞춤법 검사 + + + + + A Hunspell dictionary has a name that ends with ".dic" +and should be alongside an affix file with the same +name but ending with ".aff". + + + + + Hunspell dictionary path: + + + + + + Add dictionary... + 사전에 추가... + + + + If this is unchecked, spell checking +will be started from the document start. + + + + + Start spell checking from text cursor + + + + + Number of recent files: + + + + + Only if their number is not greater than 50. + + + + + + Only for files that exist and can be saved. + + + + + min + + + + + If this is checked, the Save button/menu-item could +be used also when the opened file is not modified. + +This can be useful under certain circumstances, +e.g. for changing the time stamp or removing the +trailing spaces of a text file. + + + + + Allow saving unmodified files + + + + + Show a warning instead. + + + + + Do not permit opening of non-text files + 텍스트가 아닌 파일을 열지 않기 + + + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + + Shortcuts + 바로가기 + + + + Action + + + + + Shortcut + 바로가기 + + + + Restore default shortcuts. + 기본 바로가기 복원. + + + + + + Default + 기본값 + + + + Syntax Colors + 문법 색상 + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + + Close + 닫기 + + + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + 색을 더블 클릭하여 변경. + + + + + files + 파일 + + + + + file + + + + + + Warning: Ambiguous shortcut detected! + + + + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + 정규식, 코드블록, … + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + + Application restart is needed for changes to take effect. + + + + + Window reopening is needed for changes to take effect. + + + + + &Recently Opened + 최근 열어본 파일(&R) + + + + Recently &Modified + 최근 수정(&M) + + + + The typed shortcut was reserved. + + + + + Hunspell Dictionary Files (*.dic) + + + + + + Select Syntax Color + + + + + FeatherPad::SearchBar + + + + Search... + 검색... + + + + Match Case + 대/소문자 구분 + + + + Whole Word + 전체 단어 + + + + Regular Expression + 정규식 + + + + Search with regex... + 정규식을 포함하여 검색... + + + + Next + 다음 + + + + Previous + 이전 + + + + FeatherPad::SessionDialog + + + Session Manager + 세션 매니저 + + + + + &Remove + 삭제(&R) + + + + <b>Save/Restore Session</b> + <b>세션 저장/복원</b> + + + + Filter... + 필터... + + + + Open the selected session(s). + 선택된 세션 열기. + + + + + &Open + 열기(&O) + + + + + Del + + + + + + Ctrl+Del + + + + + By default, all files that are opened in all +windows will be included in the saved session. + + + + + Save only from this &window + 이 윈도우에만 적용(&W) + + + + <b>Warning</b> + <b>경고</b> + + + + + &Yes + 예(&Y) + + + + &No + 아니오(&N) + + + + Re&name + 이름 바꾸기(&N) + + + + Remove &All + 모두 삭제(&A) + + + + &Close + 닫기(&C) + + + + Save the current session under the given title. + + + + + &Save + 저장(*&S) + + + + Type a name to save session + 저장할 세션의 이름을 입력하세요 + + + + Nothing saved.<br>No file was opened. + + + + + No file exists or can be opened. + + + + + Not all files exist or can be opened. + + + + + &OK + 확인(&O) + + + + Do you really want to remove all saved sessions? + 모든 저장된 세션을 지우겠습니까? + + + + Do you really want to remove the selected sessions? + 선택된 세션을 지우겠습니까? + + + + Do you really want to remove the selected session? + 선택된 세션을 지우겠습니까? + + + + A session with the same name exists.<br>Do you want to overwrite it? + 같은 세션 이름이 존재합니다.<br>덮어 쓰시겠습니까? + + + + FeatherPad::SidePane + + + Filter... + 필터... + + + + FeatherPad::SpellDialog + + + Unknown word: + 알 수 없는 단어: + + + + Add To Dictionary + 디렉토리에 추가 + + + + Replace with: + 대체할 단어: + + + + Correct Once + 직역을 하기 보단, 관습적으로 이용하는 표현(한글 2020 참조)을 사용하였습니다. + 바꾸기 + + + + Correct All + 직역을 하기 보단, 관습적으로 이용하는 표현(한글 2020 참조)을 사용하였습니다. + 모두 바꾸기 + + + + Ignore Once + 지나가기 + + + + Ignore All + 모두 지나가기 + + + + FeatherPad::TextEdit + + + Double click to center current line + 정확한 표현인지 의심됨. + 현재 줄을 가운데로 이동하기 위해 더블 클릭 + + + diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_lt.ts featherpad-0.17.1/featherpad/data/translations/featherpad_lt.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_lt.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_lt.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Licencija @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Be pavadinimo @@ -54,514 +56,525 @@ - + &Edit &Taisa - + &Options &Parinktys - - - + + + Encoding Koduotė - + &Search Pa&ieška - - + + &Help Ži&nynas - + Find: Rasti: - + To be replaced Bus pakeista - + Replace with: Kuo pakeisti: - + Replacing text Tekstas, kuriuo keičiama - + &New &Naujas - + New tab Nauja kortelė - + Ctrl+N Ctrl(Vald)+N - + &Open &Atverti - + Open a file Atverti failą - + Ctrl+O Ctrl(Vald)+O - - + + &Save Į&rašyti - + Save the current tab Įrašyti esamą kortelę - + Ctrl+S Ctrl(Vald)+S - + &Undo A&tšaukti - + Undo Atšaukti - + Ctrl+Z Ctrl(Vald)+Z - + &Redo &Grąžinti - + Redo Grąžinti - + Ctrl+Shift+Z Ctrl(Vald)+Shift(Lyg2)+Z - + Reload Įkelti iš naujo - + Ctrl+Shift+R Ctrl(Vald)+Shift(Lyg2)+R - + &Find &Rasti - + Ctrl+F Ctrl(Vald)+F - + Show/hide replacement dock Rodyti/slėpti pakeitimų doką - + Ctrl+R Ctrl(Vald)+R - + Save &As Įrašyti ka&ip - + Ctrl+Shift+S Ctrl(Vald)+Shift(Lyg2)+S - + &Print S&pausdinti - + Ctrl+P Ctrl(Vald)+P - + Documen&t Properties Dokumen&to savybės - + Ctrl+Shift+D Ctrl(Vald)+Shift(Lyg2)+D - + &Close &Užverti - + Ctrl+Shift+Q Ctrl(Vald)+Shift(Lyg2)+Q - + &Quit &Išeiti - + Ctrl+Q Ctrl(Vald)+Q - + &Cut Iš&kirpti - + Ctrl+X Ctrl(Vald)+X - + C&opy K&opijuoti - + Ctrl+C Ctrl(Vald)+C - + &Paste Į&dėti - + Ctrl+V Ctrl(Vald)+V - + &Delete Iš&trinti - + &Select All Ž&ymėti viską - + Ctrl+A Ctrl(Vald)+A - + &Font Šri&ftas - + &Line Numbers Ei&lučių numeriai - + Ctrl+L Ctrl(Vald)+L - + &Wrap Lines Skai&dyti eilutes - + Ctrl+W Ctrl(Vald)+W - + &Auto-Indentation &Automatinė įtrauka - + Ctrl+I Ctrl(Vald)+I - + &Syntax Highlighting &Sintaksės paryškinimas - + Ctrl+Shift+H Ctrl(Vald)+Shift(Lyg2)+H - + &Preferences &Nuostatos - + Ctrl+Shift+P Ctrl(Vald)+Shift(Lyg2)+P - + Ctrl+H Ctrl(Vald)+H - + &About &Apie - + Enforce UTF-8 Priverstinai naudoti UTF-8 - + Save with &Encoding Įrašyti su koduot&e - + &Jump to &Peršokti į - + Show/hide jump bar Rodyti/slėpti peršokimo juostą - + Ctrl+J Ctrl(Vald)+J - + Edit text Redaguoti tekstą - + Ctrl+Shift+E Ctrl(Vald)+Shift(Lyg2)+E - + &Run &Vykdyti - + Ctrl+E Ctrl(Vald)+E - + &Clear Iš&valyti - + Clear the list of recently modified files Išvalyti paskiausiai modifikuotų failų sąrašą - + Save/Restore Session Įrašyti/Atkurti seansą - + Sa&ve/Restore Session Įraš&yti/Atkurti seansą - + Ctrl+M Ctrl(Vald)+M - + Side-Pane Šoninis polangis - + Ctrl+Alt+P Ctrl(Vald)+Alt+P - + Paste Date and Time Įdėti datą ir laiką - + Ctrl+Shift+V Ctrl(Vald)+Shift(Lyg2)+V - + To Upper Case Paversti didžiosiomis - + Ctrl+Shift+U Ctrl(Vald)+Shift(Lyg2)+U - + To Lower Case Paversti mažosiomis - + Ctrl+Shift+L Ctrl(Vald)+Shift(Lyg2)+L + To Start Case + Paversti pirmąsias žodžių raides didžiosiomis + + + + Last Active Tab Paskutinė aktyvi kortelė - + F1 F1 - - + + Sort Lines Rikiuoti eilutes - - + + Sort Lines Reversely Rikiuoti eilutes atvirkščiai - + Check Spelling Tikrinti rašybą - + F2 F2 - - + + Save All Files Įrašyti visus failus - - + + User Dictionary Naudotojo žodynas - + + Text Tabs to Spaces + Paversti tabuliavimo ženklus tarpais + + + &Detach Tab At&skirti kortelę - + Ctrl+T Ctrl(Vald)+T - + Close Ne&xt Tabs Užverti ki&tas korteles - + Close &Previous Tabs Užverti ankstes&nes korteles - + Ne&xt Tab &Kita kortelė - + Previous Ta&b Ankst&esnė kortelė - + Execute Vykdyti - + Close &All Tabs Užverti &visas korteles @@ -571,613 +584,664 @@ Paskiausiai &modifikuoti - + &Encoding &Koduotė - + &Unicode &Unikodas - + &Western European &Vakarų Europos - + &East European &Rytų Europos - + Ea&st Asian R&ytų Azijos - - + + - - Rep&lacement - Pa&keitimas + + Replacement + Pakeitimas - + Focus/hide search bar Fokusuoti/slėpti paieškos juostą - + &Replace &Pakeisti - + Windows Arabic (&CP1256) Windows Arabų (&CP1256) - + &Other K&ita - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) &Kirilica (CP1251) - + Cyrillic (&KOI8-U) Kirilica (&KOI8-U) - + Cyrillic (&ISO-8859-5) Kirilica (&ISO-8859-5) - + &Chinese (BIG5) Ki&nų (BIG5) - + Chinese (&GB18030) Kinų (&GB18030) - + &Japanese (ISO-2022-JP) &Japonų (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Japonų (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Japonų (ISO-&2022-KR) - + Ja&panese (CP932) Ja&ponų (CP932) - + Japa&nese (EUC-JP) Japo&nų (EUC-JP) - + &Korean (CP949) K&orėjiečių (CP949) - + K&orean (CP1361) Ko&rėjiečių (CP1361) - + Korean (&EUC-KR) Korėjiečių (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs Užverti ki&tas korteles - + &Copy File Name &Kopijuoti failo pavadinimą - + Copy File &Path Kopijuoti failo &kelią - + Alt+Right Alt+Dešinėn - + Alt+Left Alt+Kairėn - + &First Tab &Pirma kortelė - + Alt+Down Alt+Žemyn - + &Last Tab Paskuti&nė kortelė - + Alt+Up Alt+Aukštyn - + Menu Meniu - + Calculate number of words (For huge texts, this may be CPU-intensive.) Skaičiuoti žodžių skaičių (Dideliuose tekstuose tai gali naudoti daug procesoriaus išteklių.) - + Next Kitas - + Previous Ankstesnis - + Replace all Pakeisti visus - + &Recently Opened &Paskiausiai atverti - + Close Užverti - + Save changes? Įrašyti pakeitimus? - + Please attend to that window or just close its dialog! Apsilankykite tame lange arba, tiesiog, užverkite jo dialogą! - + The document has been modified. Dokumentas buvo modifikuotas. - + &Discard changes Atmesti &pakeitimus - + &Cancel &Atsisakyti - + &No to all &Visiems ne - - + + Unsaved Neįrašytas - - - - - - - - - + + + + + + + + + Lines Eilutės - - - + + + Sel. Chars Paž. simbolių - - - + + + Words Žodžiai - + Another process is running in this tab! Šioje kortelėje yra vykdomas kitas procesas! - + Script File Scenarijaus failas - + Another FeatherPad window has a modal dialog! Kitame FeatherPad lange yra modalinis dialogas! - - + + Position: - - - + + + Normal - - - + + + The file does not exist. Failo nėra. - + Open Link Atverti nuorodą - + Copy Link Kopijuoti nuorodą - + Only one process is allowed per tab. Kiekvienai kortelei leidžiama tik po vieną procesą. - + Script Output Scenarijaus išvestis - + Clear Išvalyti - + FeatherPad does not open files larger than 100 MiB. FeatherPad neatveria failų, didesnių nei 100 MiB. - + Non-text file(s) not opened! - + Netekstiniai failai neatveriami! - + See Preferences → Files → Do not permit opening of non-text files - + Žiūrėkite Nuostatos → Failai → Neleisti atverti netekstinius failus - + Some file(s) could not be opened! Kai kurių failų nepavyko atverti! - + You may not have the permission to read. Gali būti, kad neturite skaitymo teisių. - + Uneditable file(s)! Neredaguojami failai! - + Non-text files or files with huge lines cannot be edited. Netekstiniai failai ar failai su daug eilučių negali būti redaguojami. - + A previous crash detected! Aptikta ankstesnė strigtis! - + Preferably, close all FeatherPad windows and start again! Pageidaujama, kad užvertumėte visus FeatherPad langus ir pradėtumėte iš naujo! - + Root Instance Šaknies egzempliorius - - - + + + All Files (*) Visi failai (*) - + All Files (*);;.%1 Files (*.%1) Visi failai (*);;.%1 failai (*.%1) - + Open file... Atverti failą... - + .%1 Files (*.%1);;All Files (*) .%1 failai (*.%1);;Visi failai (*) - - + + Save as... Įrašyti kaip... - + Keep encoding and save as... Išsaugoti koduotę ir įrašyti kaip... - + + Saving as root. + Įrašoma pagrindinio naudotojo (root) teisėmis. + + + + Waiting for authentication... + Laukiama tapatybės nustatymo... + + + + "pkexec" is not found. Please install Polkit! + „pkexec“ nerasta. Įsidiekite Polkit! + + + Yes Taip - + No Ne - + Cancel Atsisakyti - + Do you want to use <b>MS Windows</b> end-of-lines? Ar norite naudoti <b>MS Windows</b> eilučių pabaigas? - + This may be good for readability under MS Windows. Tai gali praversti skaitomumui, naudojant MS Windows. - + + + + Cannot be saved! Nepavyksta įrašyti! - - - + + + + + Help Žinynas - - - - - - - + + + + + + + Syntax Sintaksė - + Huge file(s) not opened! Didžiulis failas(-ai) neatverti! - - + + Text tabs are converted to spaces. + Tabuliavimo ženklai yra paversti tarpais. + + + + The selected text was too long. + Pažymėtas tekstas buvo per ilgas. + + + + It is not fully processed. + Jis nėra pilnai apdorotas. + + + + This file has been modified elsewhere or in another way! Šis failas buvo modifikuotas kitur arba kitokiu būdu! - - + + Please be careful about reloading or saving this document! Elkitės atsargiai įkeldami šį dokumentą iš naujo ar jį įrašydami! - + + Printing in progress... + Vyksta spausdinimas... + + + Print Document Spausdinti dokumentą - - + + Printing completed. + + + + + %1 Pages %1 puslapiai - - + + Copy Target Path Kopijuoti paskirties kelią - - + + Open Target Here Atverti paskirtį čia - + + + Open Containing Folder + Atverti vidinį aplanką + + + You need to add a Hunspell dictionary. Turite pridėti Hunspell žodyną. - - - + + + See Preferences → Text → Spell Checking! Žiūrėkite Nuostatos → Tekstas → Rašybos tikrinimas! - + The Hunspell dictionary does not exist. Hunspell žodyno nėra. - + The Hunspell dictionary is not accompanied by an affix file. Hunspell žodynas nėra lydimas pridedamo failo. - - - + + + No misspelling in document. Dokumente nėra rašymo su klaidomis. - - - + + + No misspelling from text cursor. Pradedant nuo teksto žymeklio nėra rašymo su klaidomis. - + Spell Checking Rašybos tikrinimas - + Some files cannot be saved! Kai kurių failų nepavyksta įrašyti! - + Translators Vertėjai - + A lightweight, tabbed, plain-text editor Supaprastintas, palaikantis korteles, grynųjų tekstų redaktorius - - based on Qt5 - pagrįstas Qt5 + + based on Qt + pagrįstas Qt - + Author Autorius - + aka. dar žinomas kaip - - + + About FeatherPad Apie FeatherPad - + No Replacement Jokių pakeitimų - + One Replacement Vienas pakeitimas - + %Ln Replacements %Ln pakeitimas @@ -1186,7 +1250,12 @@ - + + The first 1000 replacements are highlighted. + Pirmieji 1000 pakeitimų yra paryškinti. + + + The size limit for syntax highlighting is exceeded. Viršyta sintaksės paryškinimo dydžio riba. @@ -1513,76 +1582,87 @@ Rašant, pakeisti trys taškus ir dvigubus brūkšnelius - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > Niekada neparyškinti sintaksės failams, kurie > - + This creates a menu button on the status bar for changing the syntax. Tai būsenos juostoje sukuria meniu mygtuką, skirtą keisti sintaksę. - + Support syntax override Palaikyti sintaksės nustelbimą - + Show spaces, tabs and tab lines when the syntax is highlighted. Paryškinus sintaksę, rodyti tarpus, tabuliavimus ir tabuliavimo eilutes. - + Show whitespaces Rodyti tarpus - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). Vertikalių pozicijų eilutės bus nubrėžtos tik tuomet, jei redaktoriaus šriftas yra fiksuoto dydžio (pvz., Lygiaplotis). - + Show vertical lines starting from this position: Rodyti vertikalias eilutes pradedant nuo šios pozicijos: - + Also show line and document ends Taip pat rodyti eilučių ir dokumentų pabaigas - + Date and time format: Datos ir laiko formatas: - + Some text editors cannot open a document whose last line is not empty. Kai kurie tekstų redaktoriai negali atverti dokumentus, kuriuose paskutinė eilutė nėra tuščia. - + Ensure an empty last line on saving Įrašant, užtikrinti kad paskutinė eilutė būtų tuščia - + Remove trailing spaces on saving Įrašant, šalinti galinius tarpus - + Inertial scrolling with mouse wheel Inercinis slinkimas pelės ratuku @@ -1651,7 +1731,7 @@ Įrašyti pakeitimus atvertiems failams kas: - + Help Žinynas @@ -1701,38 +1781,26 @@ Visada rodyti eilučių &numerius - + Highlight s&yntax by default Pagal numatymą, paryškinti s&intaksę - + Dark c&olor scheme Tamsių s&palvų schema - + Background color value: Foninės spalvos reikšmė: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - Tai nėra pilnas pataisymas, tačiau -neleidžia erzinančių slinkimo peršokimų. - - - - Workaround for &Qt5's scroll jump bug - &Qt5 slinkimo peršokimų problemos apėjimas - - This only includes executable files written in script languages like Shell and Python. @@ -1753,13 +1821,13 @@ paspaudus Ctrl(Vald)+Alt+E. - + Needs window reopening to take effect. Tam, kad įsigaliotų, reikia atverti langą iš naujo. - - + + The color value of the background. 255 means white while 0 means black. @@ -1796,8 +1864,8 @@ Tam, kad įsigaliotų, reikia paleisti programą iš naujo. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1812,22 +1880,22 @@ mmm dd, MMMM, vv:mm:ss - + Text tab size: Teksto tabuliavimo dydis: - + spaces tarpai - + Thick text cursor Storas teksto žymeklis - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? Ar pelės ratuko slinkimas turėtų būti inercinis, @@ -1855,7 +1923,7 @@ - + Add dictionary... Pridėti žodyną... @@ -1924,119 +1992,240 @@ Neleisti atverti netekstinius failus - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts Spartieji klavišai - + Action Veiksmas - + Shortcut Spartusis klavišas - + Restore default shortcuts. Atkurti numatytuosius sparčiuosius klavišus. - + + + Default Numatytieji - + + Syntax Colors + Sintaksės spalvos + + + + Element + Elementas + + + + Text Color + Teksto spalva + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + Atkurti numatytąsias sintaksės spalvas. + + + Close Užverti - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + Spustelėkite du kartus ant spalvos norėdami ją pakeisti. + + + + files failų - - + + file failas - - + + Warning: Ambiguous shortcut detected! Įspėjimas: Aptiktas dviprasmiškas spartusis klavišas! - + + Functions, URLs,… + Funkcijos, URL,… + + + + Built-in Functions + Įtaisytosios funkcijos + + + + Comments + Komentarai + + + + Quotations + Citatos + + + + Types + Tipai + + + + Key Words + Raktažodžiai + + + + Numbers + Skaičiai + + + + Regular Expressions, Code Blocks,… + Reguliarieji reiškiniai, kodo blokai,… + + + + Document Blocks, XML/HTML Elements,… + Dokumento blokai, XML/HTML elementai,… + + + + Markdown Headings, CSS Values,… + Ženklinimo antraštės, CSS reikšmės,… + + + + Extra Elements + Papildomi elementai + + + Application restart is needed for changes to take effect. Tam, kad įsigaliotų pakeitimai, reikia paleisti programą iš naujo. - + Window reopening is needed for changes to take effect. Tam, kad įsigaliotų pakeitimai, reikia langą atverti iš naujo. - + &Recently Opened Pas&kiausiai atverti - + Recently &Modified Paskiausiai &modifikuoti - + The typed shortcut was reserved. Įrašytas spartusis klavišas buvo rezervuotas. - + Hunspell Dictionary Files (*.dic) Hunspell žodyno failai (*.dic) + + + + Select Syntax Color + Pasirinkti sintaksės spalvą + FeatherPad::SearchBar - - + + Search... Ieškoti... - + Match Case Skirti raidžių dydį - + Whole Word Visas žodis - + Regular Expression Reguliarusis reiškinys - + Search with regex... Ieškoti naudojant reguliarųjį reiškinį... - + Next Kitas - + Previous Ankstesnis @@ -2106,7 +2295,7 @@ - + &Yes &Taip @@ -2146,42 +2335,42 @@ Įrašykite pavadinimą, norėdami įrašyti seansą - + Nothing saved.<br>No file was opened. Nieko neįrašyta.<br>Nebuvo atvertas joks failas. - + No file exists or can be opened. Negali būti atvertas arba nėra jokio failo. - + Not all files exist or can be opened. Ne visi failai yra arba gali būti atverti. - + &OK &Gerai - + Do you really want to remove all saved sessions? Ar tikrai norite pašalinti visus įrašytus seansus? - + Do you really want to remove the selected sessions? Ar tikrai norite pašalinti pasirinktus seansus? - + Do you really want to remove the selected session? Ar tikrai norite pašalinti pasirinktą seansą? - + A session with the same name exists.<br>Do you want to overwrite it? Seansas tokiu pačiu pavadinimu jau yra.<br>Ar norite jį perrašyti? @@ -2189,7 +2378,7 @@ FeatherPad::SidePane - + Filter... Filtruoti... @@ -2235,18 +2424,9 @@ FeatherPad::TextEdit - + Double click to center current line Spustelėkite du kartus, norėdami centruoti esamą eilutę - - FeatherPad::WarningBar - - - - Close - Užverti - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_nb_NO.ts featherpad-0.17.1/featherpad/data/translations/featherpad_nb_NO.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_nb_NO.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_nb_NO.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Lisens @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Uten tittel @@ -54,514 +56,525 @@ - + &Edit &Rediger - + &Options &Valg - - - + + + Encoding Koding - + &Search &Søk - - + + &Help &Hjelp - + Find: Finn: - + To be replaced Som skal erstattes - + Replace with: Erstatt med: - + Replacing text Erstatter tekst - + &New &Ny - + New tab Ny fane - + Ctrl+N Ctrl+N - + &Open &Åpne - + Open a file Åpne en fil - + Ctrl+O Ctrl+O - - + + &Save &Lagre - + Save the current tab Lagre den gjeldende fanen - + Ctrl+S Ctrl+S - + &Undo &Angre - + Undo Angre - + Ctrl+Z Ctrl+Z - + &Redo &Omgjør - + Redo Omgjør - + Ctrl+Shift+Z Ctrl+Shift+Z - + Reload Last inn på nytt - + Ctrl+Shift+R Ctrl+Shift+R - + &Find &Finn - + Ctrl+F Ctrl+F - + Show/hide replacement dock Vis/skjul erstatningsdokk - + Ctrl+R Ctrl+R - + Save &As Lagre &som - + Ctrl+Shift+S Ctrl+Shift+S - + &Print &Skriv ut - + Ctrl+P Ctrl+P - + Documen&t Properties Dokument&egenskaper - + Ctrl+Shift+D Ctrl+Shift+D - + &Close &Lukk - + Ctrl+Shift+Q Ctrl+Shift+Q - + &Quit &Avslutt - + Ctrl+Q Ctrl+Q - + &Cut &Klipp ut - + Ctrl+X Ctrl+X - + C&opy &Kopier - + Ctrl+C Ctrl+C - + &Paste Lim &inn - + Ctrl+V Ctrl+V - + &Delete &Slett - + &Select All &Velg alt - + Ctrl+A Ctrl+A - + &Font &Skrift - + &Line Numbers &Linjenumre - + Ctrl+L Ctrl+L - + &Wrap Lines &Bryt linjer - + Ctrl+W Ctrl+W - + &Auto-Indentation &Automatisk innrykk - + Ctrl+I Ctrl+I - + &Syntax Highlighting &Syntaksmerking - + Ctrl+Shift+H Ctrl+Shift+H - + &Preferences &Innstillinger - + Ctrl+Shift+P Ctrl+Shift+P - + Ctrl+H Ctrl+H - + &About &Om - + Enforce UTF-8 Tving UTF-8 - + Save with &Encoding Lagre med &koding - + &Jump to &Hopp til - + Show/hide jump bar Vis/skjul hopplinje - + Ctrl+J Ctrl+J - + Edit text Rediger tekst - + Ctrl+Shift+E Ctrl+Shift+E - + &Run &Kjør - + Ctrl+E Ctrl+E - + &Clear &Tøm - + Clear the list of recently modified files Tøm listen over nylig endrede filer - + Save/Restore Session Lagre/gjenopprett økt - + Sa&ve/Restore Session Lagre/gjenopprett &økt - + Ctrl+M Ctrl+M - + Side-Pane Sidepanel - + Ctrl+Alt+P Ctrl+Alt+P - + Paste Date and Time Lim inn dato og klokkeslett - + Ctrl+Shift+V Ctrl+Shift+V - + To Upper Case Til store bokstaver - + Ctrl+Shift+U Ctrl+Shift+U - + To Lower Case Til små bokstaver - + Ctrl+Shift+L Ctrl+Shift+L + To Start Case + + + + + Last Active Tab Siste aktive fane - + F1 F1 - - + + Sort Lines Sorter linjer - - + + Sort Lines Reversely Sorter linjer rekursivt - + Check Spelling Stavekontroll - + F2 F2 - - + + Save All Files Lagre alle filer - - + + User Dictionary Brukerordbok - + + Text Tabs to Spaces + + + + &Detach Tab &Løsne fane - + Ctrl+T Ctrl+T - + Close Ne&xt Tabs Lukk de &neste fanene - + Close &Previous Tabs Lukk de &forrige fanene - + Ne&xt Tab &Neste fane - + Previous Ta&b &Forrige fane - + Execute Utfør - + Close &All Tabs Lukk &alle faner @@ -571,613 +584,664 @@ Nylig &endret - + &Encoding &Koding - + &Unicode &Unicode - + &Western European &Vesteuropeisk - + &East European &Østeuropeisk - + Ea&st Asian &Østasiatisk - - + + - - Rep&lacement - &Erstatning + + Replacement + Erstatning - + Focus/hide search bar Fokuser/skjul søkelinje - + &Replace &Erstatt - + Windows Arabic (&CP1256) Windows Arabisk (&CP1256) - + &Other &Annet - + &UTF-8 &UTF-8 - + UTF-&16 UTF-&16 - + &ISO-8859-1 &ISO-8859-1 - + &Windows-1252 &Windows-1252 - + &Cyrillic (CP1251) &Kyrillisk (CP1251) - + Cyrillic (&KOI8-U) Kyrillisk (&KOI8-U) - + Cyrillic (&ISO-8859-5) Kyrillisk (&ISO-8859-5) - + &Chinese (BIG5) &Kinesisk (BIG5) - + Chinese (&GB18030) Kinesisk (&GB18030) - + &Japanese (ISO-2022-JP) &Japansk (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Japansk (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Japansk (ISO-&2022-KR) - + Ja&panese (CP932) Ja&pansk (CP932) - + Japa&nese (EUC-JP) Japa&nsk (EUC-JP) - + &Korean (CP949) &Koreansk (CP949) - + K&orean (CP1361) K&oreansk (CP1361) - + Korean (&EUC-KR) Koreansk (&EUC-KR) - + ISO-&8859-15 ISO-&8859-15 - + Close &Other Tabs Lukk &andre faner - + &Copy File Name &Kopier filnavn - + Copy File &Path Kopier fil&sti - + Alt+Right Alt+Pil høyre - + Alt+Left Alt+Pil venstre - + &First Tab &Første fane - + Alt+Down Alt+Pil ned - + &Last Tab &Siste fane - + Alt+Up Alt+Pil opp - + Menu Meny - + Calculate number of words (For huge texts, this may be CPU-intensive.) Regn ut antall ord (Dette kan være CPU-intensivt hvis teksten er lang.) - + Next Neste - + Previous Forrige - + Replace all Erstatt alle - + &Recently Opened &Nylig åpnede - + Close Lukk - + Save changes? Lagre endringer? - + Please attend to that window or just close its dialog! Ta deg av det vinduet eller lukk dets dialog! - + The document has been modified. Dokumentet er endret. - + &Discard changes &Forkast endringer - + &Cancel &Avbryt - + &No to all &Nei til alle - - + + Unsaved Ikke lagret - - - - - - - - - + + + + + + + + + Lines Linjer - - - + + + Sel. Chars Velg tegn - - - + + + Words Ord - + Another process is running in this tab! En annen prosess kjører i denne fanen! - + Script File Skriptfil - + Another FeatherPad window has a modal dialog! Et annet FeatherPad-vindu har en modal dialog! - - + + Position: Plassering: - - - + + + Normal Normal - - - + + + The file does not exist. Filen fins ikke. - + Open Link Åpne lenke - + Copy Link Kopier lenke - + Only one process is allowed per tab. Kun en prosess per fane er tillatt. - + Script Output Resultat fra skript - + Clear Tøm - + FeatherPad does not open files larger than 100 MiB. FeatherPad åpner ikke filer større enn 100 MiB. - + Non-text file(s) not opened! Filer som ikke er tekstfiler åpnes ikke! - + See Preferences → Files → Do not permit opening of non-text files Se Innstillinger → Filer → Ikke tillat åpning av filer som ikke er tekstfiler - + Some file(s) could not be opened! Noen filer kunne ikke åpnes! - + You may not have the permission to read. Du har kanskje ikke tillatelsen til å lese. - + Uneditable file(s)! Ikke-redigerbar fil! - + Non-text files or files with huge lines cannot be edited. Filer som ikke er tekst eller filer med veldig lange linjer kan ikke redigeres. - + A previous crash detected! En tidligere krasj detektert! - + Preferably, close all FeatherPad windows and start again! Lukk helst alle FeatherPad-vinduer og start igjen! - + Root Instance Root-instans - - - + + + All Files (*) Alle filer (*) - + All Files (*);;.%1 Files (*.%1) Alle filer (*);;.%1 filer (*.%1) - + Open file... Åpne fil... - + .%1 Files (*.%1);;All Files (*) .%1 filer (*.%1);;Alle filer (*) - - + + Save as... Lagre som... - + Keep encoding and save as... Bevar koding og lagre som... - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes Ja - + No Nei - + Cancel Avbryt - + Do you want to use <b>MS Windows</b> end-of-lines? Vil du bruke <b>MS Windows</b>-linjeskift? - + This may be good for readability under MS Windows. Det kan være bra for lesbarheten i MS Windows. - + + + + Cannot be saved! Klarte ikke lagre! - - - + + + + + Help Hjelp - - - - - - - + + + + + + + Syntax Syntaks - + Huge file(s) not opened! Kjempestore filer ikke åpnet! - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! Filen er endret et annet sted eller på en annen måte! - - + + Please be careful about reloading or saving this document! Vær forsiktig med å laste inn på nytt eller lagre dette dokumentet! - + + Printing in progress... + + + + Print Document Skriv ut dokument - - + + Printing completed. + + + + + %1 Pages %1 sider - - + + Copy Target Path Kopier målsti - - + + Open Target Here Åpne mål her - + + + Open Containing Folder + + + + You need to add a Hunspell dictionary. Du må legge til en Hunspell-ordbok. - - - + + + See Preferences → Text → Spell Checking! - Se Innstillinger → Tekst → Stavekontroll + Se Innstillinger → Tekst → Stavekontroll! - + The Hunspell dictionary does not exist. Hunspell-ordboken fins ikke. - + The Hunspell dictionary is not accompanied by an affix file. Det følger ikke med en affix-fil til Hunspell-ordboken. - - - + + + No misspelling in document. Ingen stavefeil i dokumentet. - - - + + + No misspelling from text cursor. Ingen stavefeil fra tekstmarkøren. - + Spell Checking Stavekontroll - + Some files cannot be saved! Noen filer kan ikke lagres! - + Translators Oversettere - + A lightweight, tabbed, plain-text editor Et lettvekts, fanebasert, tekstprogram - - based on Qt5 - basert på Qt5 + + based on Qt + basert på Qt - + Author Opphavsmann - + aka. også kjent som - - + + About FeatherPad Om FeatherPad - + No Replacement Ingen erstatning - + One Replacement En erstatning - + %Ln Replacements %Ln erstatning @@ -1185,7 +1249,12 @@ - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. Størrelsesbegrensningen for syntaksmerking er oversteget. @@ -1503,7 +1572,7 @@ and a double hyphen with a long dash while typing, under proper circumstances. Som standard erstattes trippel punktum med ellipse -og dobbel bindestrek med lang tankestrek +og dobbel bindestrek med lang tankestrek mens man skriver, under de rette omstendigheter. @@ -1512,76 +1581,87 @@ Erstatt triple punktum og doble bindestreker mens man skriver - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > Merk aldri syntaks for filer > - + This creates a menu button on the status bar for changing the syntax. Dette oppretter en menyknapp på statuslinjen for å skifte syntaksen. - + Support syntax override Støtt overstyring av syntaks - + Show spaces, tabs and tab lines when the syntax is highlighted. Vis mellomrom, tabulatorer og tabulatorlinjer når syntaksmerking er aktivert. - + Show whitespaces Vis blanktegn - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). De loddrette plasseringslinjene tegnes kun hvis editorens skrift har fast tegnbredde (som Monospace). - + Show vertical lines starting from this position: Vis loddrette linjer startende fra denne plasseringen: - + Also show line and document ends Vis også linje- og dokumentslutt - + Date and time format: Dato- og klokkeslettformat: - + Some text editors cannot open a document whose last line is not empty. Noen tekstprogram kan ikke åpne et dokument hvor den siste linje ikke er tom. - + Ensure an empty last line on saving Sørg for en tom siste linje under lagring - + Remove trailing spaces on saving Fjern avsluttende mellomrom under lagring - + Inertial scrolling with mouse wheel Inertial scrolling med musehjul @@ -1650,7 +1730,7 @@ Lagre endringer til åpnede filer hver: - + Help Hjelp @@ -1666,8 +1746,8 @@ merge a single tabbed window into another one by tab drag- and-drop either. Hvis dette er krysset av, vil du ikke bare miste informative -hjelpebobler og lokalmenyen på en enkelt fane, men du vil -heller ikke kunne samle et enkelt vindu med faner med et +hjelpebobler og lokalmenyen på en enkelt fane, men du vil +heller ikke kunne samle et enkelt vindu med faner med et annet ved å dra og slippe et av dem. @@ -1701,38 +1781,26 @@ Vis alltid &linjenumre - + Highlight s&yntax by default &Syntaksmerking som standard - + Dark c&olor scheme &Mørkt fargeskjema - + Background color value: Bakgrunnens fargeverdi: - + MiB MiB - - This is not a complete fix but -prevents annoying scroll jumps. - Dette er ikke en fullstendig fiks men -det forhindrer irriterende scrollehopp. - - - - Workaround for &Qt5's scroll jump bug - Rette opp &Qt5s scrollehopp-feil - - This only includes executable files written in script languages like Shell and Python. @@ -1748,17 +1816,17 @@ Hvis den er krysset av og den åpnede fil er kjørbar, så vil filen bli kjørt når der klikkes på Kjør-knappen, som vises på verktøylinjen/filmenyen -når det er nødvendig, eller med dens snarvei Ctrl+E. +når det er nødvendig, eller med dens snarvei Ctrl+E. Prosessen drepes med Ctrl+Alt+E. - + Needs window reopening to take effect. Krever at vindu åpnes på nytt før det trer i kraft. - - + + The color value of the background. 255 means white while 0 means black. @@ -1788,14 +1856,14 @@ is 10. Needs application restart to take effect. - Det maksimale antallet nylige endrede eller åpnede filer + Det maksimale antallet nylige endrede eller åpnede filer som FeatherPad viser. Standarden er 10. Krever omstart av programmet før endringene trer i kraft. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1810,22 +1878,22 @@ MMM dd, åååå, tt:mm:ss - + Text tab size: Tabulatorstørrelse for tekst: - + spaces mellomrom - + Thick text cursor Tykk tekstmarkør - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? Skal musehjulets scrolling være inertial @@ -1853,7 +1921,7 @@ - + Add dictionary... Legg til ordbok ... @@ -1902,7 +1970,7 @@ også brukes når den åpnede filen ikke er endret. Det kan være nyttig under bestemte omstendigheter, -f.eks. for å endre tidsstemplet eller fjerne avsluttende +f.eks. for å endre tidsstemplet eller fjerne avsluttende mellomrom i en tekstfil. @@ -1921,119 +1989,240 @@ Ikke tillat åpning av filer som ikke er tekstfiler - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts Snarveier - + Action Handling - + Shortcut Snarvei - + Restore default shortcuts. Gjenopprett standard snarveier. - + + + Default Standard - + + Syntax Colors + Syntaksfarger + + + + Element + Element + + + + Text Color + Tekstfarge + + + + Whitespace color value: + Fargeverdi for hvitt: + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + Gjenopprett standard syntaksfarger. + + + Close Lukk - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + Dobbeltklikk på en farge for å forandre den. + + + + files filer - - + + file fil - - + + Warning: Ambiguous shortcut detected! Advarsel: Tvetydig snarvei detektert! - + + Functions, URLs,… + Funksjoner, URLer … + + + + Built-in Functions + Innebygde funksjoner + + + + Comments + Kommentarer + + + + Quotations + Sitater + + + + Types + Typer + + + + Key Words + Nøkkelord + + + + Numbers + Tall + + + + Regular Expressions, Code Blocks,… + Regelmessige uttrykk (Regex), kodeblokker … + + + + Document Blocks, XML/HTML Elements,… + Dokumentblokker, XML/HTML-elementer … + + + + Markdown Headings, CSS Values,… + Markdown-overskrifter, CSS-verdier … + + + + Extra Elements + Ekstra elementer + + + Application restart is needed for changes to take effect. Programmet må startes på nytt før endringene trer i kraft. - + Window reopening is needed for changes to take effect. Vinduet må åpnes på nytt før endringene trer i kraft. - + &Recently Opened &Nylig åpnede - + Recently &Modified Nylig &endrede - + The typed shortcut was reserved. Den inntastede snarveien er reservert. - + Hunspell Dictionary Files (*.dic) Hunspell-ordboksfiler (*.dic) + + + + Select Syntax Color + Velg syntaksfarge + FeatherPad::SearchBar - - + + Search... Søk... - + Match Case Forskjell på store og små bokstaver - + Whole Word Hele ord - + Regular Expression Regulære uttrykk - + Search with regex... Søk med regulære uttrykk... - + Next Neste - + Previous Forrige @@ -2088,7 +2277,7 @@ By default, all files that are opened in all windows will be included in the saved session. - Som standard inkluderes alle filer som er åpne + Som standard inkluderes alle filer som er åpne i alle vinduer, i den lagrede økten. @@ -2103,7 +2292,7 @@ - + &Yes &Ja @@ -2143,42 +2332,42 @@ Skriv inn et navn for å lagre økten - + Nothing saved.<br>No file was opened. Ingenting lagret.<br>Ingen fil var åpnet. - + No file exists or can be opened. Ingen fil fins eller kan bli åpnet. - + Not all files exist or can be opened. Ikke alle filer fins eller kan bli åpnet. - + &OK &OK - + Do you really want to remove all saved sessions? Vil du virkelig fjerne alle lagrede økter? - + Do you really want to remove the selected sessions? Vil du virkelig fjerne de valgte øktene? - + Do you really want to remove the selected session? Vil du virkelig fjerne den valgte økten? - + A session with the same name exists.<br>Do you want to overwrite it? En økt med det samme navnet fins.<br>Vil du overskrive den? @@ -2186,7 +2375,7 @@ FeatherPad::SidePane - + Filter... Filter... @@ -2232,18 +2421,9 @@ FeatherPad::TextEdit - + Double click to center current line Dobbeltklikk for å midtstille gjeldende linje - - FeatherPad::WarningBar - - - - Close - Lukk - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_nl.ts featherpad-0.17.1/featherpad/data/translations/featherpad_nl.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_nl.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_nl.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Licentie @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Naamloos @@ -54,514 +56,525 @@ - + &Edit Be&werken - + &Options &Opties - - - + + + Encoding Tekencodering - + &Search &Zoeken - - + + &Help &Help - + Find: Zoeken: - + To be replaced Te vervangen - + Replace with: Vervangen door: - + Replacing text Bezig met vervangen van tekst - + &New &Nieuw - + New tab Nieuw tabblad - + Ctrl+N - + &Open &Openen - + Open a file Open een bestand - + Ctrl+O - - + + &Save &Opslaan - + Save the current tab Huidig tabblad opslaan - + Ctrl+S - + &Undo &Ongedaan maken - + Undo Ongedaan maken - + Ctrl+Z - + &Redo &Opnieuw - + Redo Opnieuw - + Ctrl+Shift+Z - + Reload Herladen - + Ctrl+Shift+R - + &Find &Zoeken - + Ctrl+F - + Show/hide replacement dock Vervangpaneel tonen/verbergen - + Ctrl+R - + Save &As Opslaan &als - + Ctrl+Shift+S - + &Print &Afdrukken - + Ctrl+P - + Documen&t Properties Documen&teigenschappen - + Ctrl+Shift+D - + &Close &Sluiten - + Ctrl+Shift+Q - + &Quit &Afsluiten - + Ctrl+Q - + &Cut &Knippen - + Ctrl+X - + C&opy K&opiëren - + Ctrl+C - + &Paste &Plakken - + Ctrl+V - + &Delete &Verwijderen - + &Select All &Alles selecteren - + Ctrl+A - + &Font &Lettertype - + &Line Numbers &Regelnummers - + Ctrl+L - + &Wrap Lines &Regels omslaan - + Ctrl+W - + &Auto-Indentation &Automatisch inspringen - + Ctrl+I - + &Syntax Highlighting &Syntaxmarkering - + Ctrl+Shift+H - + &Preferences &Voorkeuren - + Ctrl+Shift+P - + Ctrl+H - + &About &Over - + Enforce UTF-8 UTF-8 afdwingen - + Save with &Encoding Opslaan met &tekenreeks - + &Jump to &Springen naar - + Show/hide jump bar Snelspringbalk tonen/verbergen - + Ctrl+J - + Edit text Tekst bewerken - + Ctrl+Shift+E - + &Run &Uitvoeren - + Ctrl+E - + &Clear &Wissen - + Clear the list of recently modified files Wis de lijst met recent bewerkte bestanden - + Save/Restore Session Sessie opslaan/herstellen - + Sa&ve/Restore Session &Sessie opslaan/herstellen - + Ctrl+M - + Side-Pane Zijpaneel - + Ctrl+Alt+P - + Paste Date and Time Datum en tijd invoegen - + Ctrl+Shift+V - + To Upper Case Omzetten naar hoofdletters - + Ctrl+Shift+U - + To Lower Case Omzetten naar kleine letters - + Ctrl+Shift+L + To Start Case + + + + + Last Active Tab Laatst actieve tabblad - + F1 - - + + Sort Lines Regels rangschikken - - + + Sort Lines Reversely Regels omgekeerd rangschikken - + Check Spelling Spelling controleren - + F2 - - + + Save All Files Alle bestanden opslaan - - + + User Dictionary Gebruikerswoordenboek - + + Text Tabs to Spaces + + + + &Detach Tab &Tabblad losmaken - + Ctrl+T - + Close Ne&xt Tabs &Volgende tabbladen sluiten - + Close &Previous Tabs Vorige &tabbladen sluiten - + Ne&xt Tab &Volgend tabblad - + Previous Ta&b &Vorig tabblad - + Execute Uitvoeren - + Close &All Tabs &Alle tabbladen sluiten @@ -571,613 +584,664 @@ Recent &bewerkt - + &Encoding &Tekenreeks - + &Unicode - + &Western European &West-Europees - + &East European &Oost-Europees - + Ea&st Asian &Oost-Aziatisch - - + + - - Rep&lacement - &Vervanging + + Replacement + Vervanging - + Focus/hide search bar Zoekbalk focussen/verbergen - + &Replace &Vervangen - + Windows Arabic (&CP1256) Windows Arabisch (&CP1256) - + &Other &Overig - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) &Cyrillisch (CP1251) - + Cyrillic (&KOI8-U) Cyrillisch (&KOI8-U) - + Cyrillic (&ISO-8859-5) Cyrillisch (&ISO-8859-5) - + &Chinese (BIG5) &Chinees (BIG5) - + Chinese (&GB18030) Chinees (&GB18030) - + &Japanese (ISO-2022-JP) &Japans (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Japans (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Japans (ISO-&2022-KR) - + Ja&panese (CP932) &Japans (CP932) - + Japa&nese (EUC-JP) &Japans (EUC-JP) - + &Korean (CP949) &Koreaans (CP949) - + K&orean (CP1361) &Koreaans (CP1361) - + Korean (&EUC-KR) Koreaans (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs &Andere tabbladen sluiten - + &Copy File Name &Bestandsnaam kopiëren - + Copy File &Path &Bestandspad kopiëren - + Alt+Right Alt+pijltje rechts - + Alt+Left Alt+pijltje links - + &First Tab &Eerste tabblad - + Alt+Down Alt+pijltje omlaag - + &Last Tab &Laatste tabblad - + Alt+Up Alt+pijltje omhoog - + Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) Bereken het aantal woorden (bij grote teksten kan dit de processor zwaar belasten) - + Next Volgende - + Previous Vorige - + Replace all Alles vervangen - + &Recently Opened &Recent geopend - + Close Sluiten - + Save changes? Wijzigingen opslaan? - + Please attend to that window or just close its dialog! Kies een optie in dat venster of sluit het! - + The document has been modified. Het document is bewerkt. - + &Discard changes Wijzigingen &verwerpen - + &Cancel &Annuleren - + &No to all &Nee op alles - - + + Unsaved Niet-opgeslagen - - - - - - - - - + + + + + + + + + Lines Regels - - - + + + Sel. Chars Tekens - - - + + + Words Woorden - + Another process is running in this tab! Er is al een proces actief op dit tabblad! - + Script File Scriptbestand - + Another FeatherPad window has a modal dialog! Een ander FeatherPad-venster bevat een modaal dialoogvenster! - - + + Position: Positie: - - - + + + Normal Normaal - - - + + + The file does not exist. Het bestand bestaat niet. - + Open Link Link openen - + Copy Link Link kopiëren - + Only one process is allowed per tab. Er is slechts één proces per tabblad toegestaan. - + Script Output Scriptuitvoer - + Clear Wissen - + FeatherPad does not open files larger than 100 MiB. FeatherPad kan geen bestanden openen die groter zijn dan 100 MiB. - + Non-text file(s) not opened! - + See Preferences → Files → Do not permit opening of non-text files - + Some file(s) could not be opened! Een of meerdere bestanden kunnen niet worden geopend! - + You may not have the permission to read. Je hebt mogelijk heb geen leestoegang. - + Uneditable file(s)! Bestand(en) is/zijn onbewerkbaar! - + Non-text files or files with huge lines cannot be edited. Bestanden die geen tekstbestanden zijn of een enorm aantal regels bevatten kunnen niet worden bewerkt. - + A previous crash detected! Eerdere crash gedetecteerd! - + Preferably, close all FeatherPad windows and start again! Sluit, bij voorkeur, alle FeatherPad-vensters en start opnieuw! - + Root Instance Root-instantie - - - + + + All Files (*) Alle bestanden (*) - + All Files (*);;.%1 Files (*.%1) Alle bestanden (*);;.%1-bestanden (*.%1) - + Open file... Bestand openen... - + .%1 Files (*.%1);;All Files (*) .%1-bestanden (*.%1);;Alle bestanden (*) - - + + Save as... Opslaan als... - + Keep encoding and save as... Tekenreeks behouden en opslaan als... - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes Ja - + No Nee - + Cancel Annuleren - + Do you want to use <b>MS Windows</b> end-of-lines? Wil je <b>MS Windows</b>-compatibele regeleindes gebruiken? - + This may be good for readability under MS Windows. Dit kan helpen bij de leesbaarheid op MS Windows. - + + + + Cannot be saved! Kan niet worden opgeslagen! - - - + + + + + Help Hulp - - - - - - - + + + + + + + Syntax Syntaxis - + Huge file(s) not opened! Enorm(e) bestand(en) niet geopend! - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! Dit bestand is elders of anders bewerkt! - - + + Please be careful about reloading or saving this document! Wees voorzichtig met het herladen of opslaan van dit document! - + + Printing in progress... + + + + Print Document Document afdrukken - - + + Printing completed. + + + + + %1 Pages %1 pagina's - - + + Copy Target Path Doelpad kopiëren - - + + Open Target Here Doel hier openen - + + + Open Containing Folder + + + + You need to add a Hunspell dictionary. Voeg een Hunpell-woordenboek toe. - - - + + + See Preferences → Text → Spell Checking! Zie Voorkeuren → Tekst → Spellingcontrole! - + The Hunspell dictionary does not exist. Dit Hunspell-woordenboek is niet aanwezig. - + The Hunspell dictionary is not accompanied by an affix file. Dit Hunspell-woordenboek is niet voorzien van een affix-bestand. - - - + + + No misspelling in document. Geen spelfouten aangetroffen. - - - + + + No misspelling from text cursor. Geen spelfouten aangetroffen vanaf de cursorpositie. - + Spell Checking Spellingcontrole - + Some files cannot be saved! Enkele bestanden kunnen niet worden opgeslagen! - + Translators Vertalers - + A lightweight, tabbed, plain-text editor Een lichtgewicht platte tekst-bewerker met tabbladen - - based on Qt5 - gebouwd met Qt5 + + based on Qt + gebouwd met Qt - + Author Maker - + aka. ook bekend als - - + + About FeatherPad Over FeatherPad - + No Replacement Geen vervanging - + One Replacement Eén vervanging - + %Ln Replacements %Ln vervanging @@ -1185,7 +1249,12 @@ - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. Het groottelimiet voor syntaxmarkering is overschreden. @@ -1513,76 +1582,87 @@ Drie puntjes en dubbele streepjes vervangen tijdens het typen - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > Geen syntaxmarkering voor bestanden > - + This creates a menu button on the status bar for changing the syntax. Dit plaatst een menuknop op de statusbalk waarmee de syntax kan worden gewijzigd. - + Support syntax override Syntax kan worden gewijzigd - + Show spaces, tabs and tab lines when the syntax is highlighted. Toon spaties, tabs en tabregels bij het markeren van de syntax. - + Show whitespaces Witruimte tonen - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). De verticale positielijnen worden alleen getoond als het lettertype een vastgezet lettertype is (zoals Monospace). - + Show vertical lines starting from this position: Verticale lijnen tonen vanaf deze positie: - + Also show line and document ends Ook regel- en documenteindes tonen - + Date and time format: Datum- en tijdopmaak: - + Some text editors cannot open a document whose last line is not empty. Sommige tekstbewerker kunnen geen document openen dat geen lege regel bevat aan het einde. - + Ensure an empty last line on saving Lege regel aan einde invoegen bij opslaan - + Remove trailing spaces on saving Achterliggende spaties verwijderen bij opslaan - + Inertial scrolling with mouse wheel Bewegingsloos scroll met muiswiel @@ -1651,7 +1731,7 @@ Wijzigingen aan geopende bestanden opslaan, elke: - + Help Hulp @@ -1702,38 +1782,26 @@ Altijd regel&nummers tonen - + Highlight s&yntax by default S&yntax standaard markeren - + Dark c&olor scheme D&onker thema - + Background color value: Waarde van achtergrondkleur: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - Dit is geen volledige oplossing, -maar voorkomt vervelende scroll-verspringingen. - - - - Workaround for &Qt5's scroll jump bug - Omzeiling voor &Qt5's scroll-verspringbug - - This only includes executable files written in script languages like Shell and Python. @@ -1753,13 +1821,13 @@ afgebroken via Ctrl+Alt+E. - + Needs window reopening to take effect. Herstart FeatherPad om de instelling toe te passen. - - + + The color value of the background. 255 means white while 0 means black. @@ -1797,8 +1865,8 @@ Herstart FeatherPad om de wijziging toe te passen. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1813,22 +1881,22 @@ MMM dd, yyyy, hh:mm:ss - + Text tab size: Grootte van tekst op tabblad: - + spaces spaties - + Thick text cursor Dikke tekstcursor - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? Moet het scrollen bewegingsloos zijn als de @@ -1856,7 +1924,7 @@ - + Add dictionary... Woordenboek toevoegen... @@ -1924,119 +1992,240 @@ Openen van niet-tekstbestanden niet toestaan - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts Sneltoetsen - + Action Actie - + Shortcut Sneltoets - + Restore default shortcuts. Standaardsneltoetsen herstellen. - + + + Default Standaard - + + Syntax Colors + + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + Close Sluiten - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + + + + + files bestanden - - + + file bestand - - + + Warning: Ambiguous shortcut detected! Waarschuwing: dubbelzinnige sneltoets gedetecteerd! - + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + Application restart is needed for changes to take effect. Herstart FeatherPad om de wijzigingen toe te passen. - + Window reopening is needed for changes to take effect. Herstart FeatherPad om de wijzigingen toe te passen. - + &Recently Opened &Recent geopend - + Recently &Modified Recent &bewerkt - + The typed shortcut was reserved. De ingevoerde sneltoets is gereserveerd. - + Hunspell Dictionary Files (*.dic) Hunspell-woordenboekbestanden (*.dic) + + + + Select Syntax Color + + FeatherPad::SearchBar - - + + Search... Zoeken... - + Match Case Hoofdlettergebruik moet overeenkomen - + Whole Word Geheel woord - + Regular Expression Reguliere expressie - + Search with regex... Zoeken met regex... - + Next Volgende - + Previous Vorige @@ -2106,7 +2295,7 @@ - + &Yes &Ja @@ -2146,42 +2335,42 @@ Voer een naam in voor de sessie - + Nothing saved.<br>No file was opened. Niks opgeslagen.<br>Er is geen bestand geopend. - + No file exists or can be opened. Er is geen bestand aanwezig of er kan niks worden geopend. - + Not all files exist or can be opened. Niet alle bestanden zijn aanwezig of kunnen worden geopend. - + &OK &Oké - + Do you really want to remove all saved sessions? Weet je zeker dat je alle opgeslagen sessie wilt verwijderen? - + Do you really want to remove the selected sessions? Weet je zeker dat je de geselecteerde sessies wilt verwijderen? - + Do you really want to remove the selected session? Weet je zeker dat je de geselecteerde sessie wilt verwijderen? - + A session with the same name exists.<br>Do you want to overwrite it? Er bestaat al een sessie met deze naam.<br>Wil je deze overschrijven? @@ -2189,7 +2378,7 @@ FeatherPad::SidePane - + Filter... Filteren... @@ -2235,18 +2424,9 @@ FeatherPad::TextEdit - + Double click to center current line Dubbelklik om de huidige regel te centreren - - FeatherPad::WarningBar - - - - Close - Sluiten - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_pl.ts featherpad-0.17.1/featherpad/data/translations/featherpad_pl.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_pl.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_pl.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Licencja @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Bez tytułu @@ -54,514 +56,525 @@ - + &Edit &Edycja - + &Options &Opcje - - - + + + Encoding Kodowanie - + &Search &Szukaj - - + + &Help Po&moc - + Find: Szukaj: - + To be replaced Do zastąpienia - + Replace with: Zastąp na: - + Replacing text Zastępowanie tekstu - + &New &Nowy - + New tab Nowa karta - + Ctrl+N Ctrl+N - + &Open &Otwórz - + Open a file Otwórz plik - + Ctrl+O Ctrl+O - - + + &Save &Zapisz - + Save the current tab Zapisz obecną kartę - + Ctrl+S Ctrl+S - + &Undo &Cofnij - + Undo Cofnij - + Ctrl+Z Ctrl+Z - + &Redo &Ponów - + Redo Ponów - + Ctrl+Shift+Z Ctrl+Shift+Z - + Reload Przeładuj - + Ctrl+Shift+R Ctrl+Shift+R - + &Find &Szukaj - + Ctrl+F Ctrl+F - + Show/hide replacement dock Pokaż/ukryj dok zastępowania - + Ctrl+R Ctrl+R - + Save &As Z&apisz jako - + Ctrl+Shift+S Ctrl+Shift+S - + &Print &Drukuj - + Ctrl+P Ctrl+P - + Documen&t Properties Właściwości dokumen&tu - + Ctrl+Shift+D Ctrl+Shift+D - + &Close Zam&knij - + Ctrl+Shift+Q Ctrl+Shift+Q - + &Quit &Wyjdź - + Ctrl+Q Ctrl+Q - + &Cut &Wytnij - + Ctrl+X Ctrl+X - + C&opy K&opiuj - + Ctrl+C Ctrl+C - + &Paste W&klej - + Ctrl+V Ctrl+V - + &Delete &Usuń - + &Select All Zaznacz w&szystko - + Ctrl+A Ctrl+A - + &Font &Czcionka - + &Line Numbers &Numerowanie wierszy - + Ctrl+L Ctrl+L - + &Wrap Lines Za&wijanie wierszy - + Ctrl+W Ctrl+W - + &Auto-Indentation &Automatyczne wcięcia - + Ctrl+I Ctrl+I - + &Syntax Highlighting Podświetlanie &składni - + Ctrl+Shift+H Ctrl+Shift+H - + &Preferences &Preferencje - + Ctrl+Shift+P Ctrl+Shift+P - + Ctrl+H Ctrl+H - + &About O progr&amie - + Enforce UTF-8 Wymuś UTF-8 - + Save with &Encoding Zapisz z kodowani&em - + &Jump to Prze&jdź do - + Show/hide jump bar Pokaż/ukryj pasek przechodzenia do linii - + Ctrl+J Ctrl+J - + Edit text Edytuj tekst - + Ctrl+Shift+E Ctrl+Shift+E - + &Run U&ruchom - + Ctrl+E Ctrl+E - + &Clear Wy&czyść - + Clear the list of recently modified files Wyczyść listę ostatnio modyfikowanych plików - + Save/Restore Session Zapisz/przywróć sesję - + Sa&ve/Restore Session Zapisz/przy&wróć sesję - + Ctrl+M Ctrl+M - + Side-Pane Panel boczny - + Ctrl+Alt+P Ctrl+Alt+P - + Paste Date and Time Wklej datę i czas - + Ctrl+Shift+V Ctrl+Shift+V - + To Upper Case Przekształć na wielkie litery - + Ctrl+Shift+U Ctrl+Shift+U - + To Lower Case Przekształć na małe litery - + Ctrl+Shift+L Ctrl+Shift+L + To Start Case + + + + + Last Active Tab Ostatnia aktywna karta - + F1 F1 - - + + Sort Lines Sortuj wiersze - - + + Sort Lines Reversely Sortuj wiersze w odwróconej kolejności - + Check Spelling Sprawdzaj pisownię - + F2 F2 - - + + Save All Files Zapisz wszystkie pliki - - + + User Dictionary - + + Text Tabs to Spaces + + + + &Detach Tab O&dłącz kartę - + Ctrl+T Ctrl+T - + Close Ne&xt Tabs Zamknij nas&tępne karty - + Close &Previous Tabs Zamknij &poprzednie karty - + Ne&xt Tab &Następna karta - + Previous Ta&b Poprze&dnia karta - + Execute Wykonaj - + Close &All Tabs Z&amknij wszystkie karty @@ -571,613 +584,664 @@ Ostatnio z&modyfikowane - + &Encoding Kodowani&e - + &Unicode &Unicode - + &Western European &Zachodnioeuropejskie - + &East European Wschodnio&europejskie - + Ea&st Asian W&schodnioazjatyckie - - + + - - Rep&lacement - &Zastąpienie + + Replacement + Zastąpienie - + Focus/hide search bar Pokaż/ukryj pasek wyszukiwania - + &Replace &Zastąp - + Windows Arabic (&CP1256) Windows Arabic (&CP1256) - + &Other &Inne - + &UTF-8 &UTF-8 - + UTF-&16 UTF-&16 - + &ISO-8859-1 &ISO-8859-1 - + &Windows-1252 &Windows-1252 - + &Cyrillic (CP1251) &Cyrylica (CP1251) - + Cyrillic (&KOI8-U) Cyrylica (&KOI8-U) - + Cyrillic (&ISO-8859-5) Cyrylica (&ISO-8859-5) - + &Chinese (BIG5) &Chińskie (BIG5) - + Chinese (&GB18030) Chińskie (&GB18030) - + &Japanese (ISO-2022-JP) &Japońskie (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Japońskie (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Japońskie (ISO-&2022-KR) - + Ja&panese (CP932) Ja&pońskie (CP932) - + Japa&nese (EUC-JP) Japoń&skie (EUC-JP) - + &Korean (CP949) &Koreańskie (CP949) - + K&orean (CP1361) K&oreańskie (CP1361) - + Korean (&EUC-KR) Koreańskie (&EUC-KR) - + ISO-&8859-15 ISO-&8859-15 - + Close &Other Tabs Zamknij p&ozostałe karty - + &Copy File Name &Kopiuj nazwę pliku - + Copy File &Path Ko&piuj ścieżkę do pliku - + Alt+Right Alt+Strzałka w prawo - + Alt+Left Alt+Strzałka w lewo - + &First Tab Pier&wsza karta - + Alt+Down Alt+Strzałka w dół - + &Last Tab &Ostatnia karta - + Alt+Up Alt+Strzałka w górę - + Menu Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) Oblicz liczbę wyrazów (może obciążyć procesor w wypadku większych tekstów) - + Next Następne - + Previous Poprzednie - + Replace all Zastąp wszystko - + &Recently Opened Ostatnio otwie&rane - + Close Zamknij - + Save changes? Zapisać zmiany? - + Please attend to that window or just close its dialog! Przejdź do tego okna lub zamknij jego dialog! - + The document has been modified. Dokument został zmodyfikowany. - + &Discard changes &Odrzuć zmiany - + &Cancel &Anuluj - + &No to all &Nie dla wszystkich - - + + Unsaved Niezapisane - - - - - - - - - + + + + + + + + + Lines Wiersze - - - + + + Sel. Chars Zaznaczone znaki - - - + + + Words Wyrazy - + Another process is running in this tab! Inny proces jest uruchomiony w tej karcie! - + Script File Plik skryptu - + Another FeatherPad window has a modal dialog! Inne okno FeatherPad wyświetliło dialogowe okno modalne! - - + + Position: Położenie: - - - + + + Normal Normalne - - - + + + The file does not exist. Plik nie istnieje. - + Open Link Otwórz odnośnik - + Copy Link Kopiuj odnośnik - + Only one process is allowed per tab. Tylko jeden proces może być aktywny w karcie. - + Script Output Wynik skryptu - + Clear Wyczyść - + FeatherPad does not open files larger than 100 MiB. FeatherPad nie otworzy plików większych niż 500 MB. - + Non-text file(s) not opened! - + See Preferences → Files → Do not permit opening of non-text files - + Some file(s) could not be opened! Nie udało się otworzyć niektórych plików! - + You may not have the permission to read. Nie masz uprawnień pozwalających na odczyt pliku. - + Uneditable file(s)! Plik(i) nie do edycji! - + Non-text files or files with huge lines cannot be edited. Pliki nietekstowe lub zawierające długie wiersze nie mogą być edytowane. - + A previous crash detected! Wykryto wcześniejsze zatrzymanie aplikacji! - + Preferably, close all FeatherPad windows and start again! Zalecane jest zamknięcie wszystkich okien FeatherPad i ponowne uruchomienie programu! - + Root Instance Główna instancja - - - + + + All Files (*) Wszystkie pliki (*) - + All Files (*);;.%1 Files (*.%1) Wszystkie pliki (*);;.Pliki %1 (*.%1) - + Open file... Otwórz plik… - + .%1 Files (*.%1);;All Files (*) Pliki .%1 (*.%1);;Wszystkie pliki (*) - - + + Save as... Zapisz jako… - + Keep encoding and save as... Zachowaj kodowanie i zapisz jako… - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes Tak - + No Nie - + Cancel Anuluj - + Do you want to use <b>MS Windows</b> end-of-lines? Czy chcesz uźyć znaków końca wierszu systemu <b>MS Windows</b>? - + This may be good for readability under MS Windows. Może to poprawić czytelność pod MS Windows. - + + + + Cannot be saved! Nie udało się zapisać! - - - + + + + + Help Pomoc - - - - - - - + + + + + + + Syntax Składnia - + Huge file(s) not opened! Nie można otwierać dużych plików! - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! Plik został zmodyfikowany z użyciem innego programu! - - + + Please be careful about reloading or saving this document! Zachowaj ostrożność odświeżając lub zapisując ten plik! - + + Printing in progress... + + + + Print Document Wydrukuj dokument - - + + Printing completed. + + + + + %1 Pages %1 strony - - + + Copy Target Path Kopiuj ścieżkę docelową - - + + Open Target Here Otwórz cel tutaj - + + + Open Containing Folder + + + + You need to add a Hunspell dictionary. Musisz dodać słownik Hunspell. - - - + + + See Preferences → Text → Spell Checking! Patrz: Preferencje → Tekst → Sprawdzanie pisowni - + The Hunspell dictionary does not exist. Słownik Hunspell nie istnieje. - + The Hunspell dictionary is not accompanied by an affix file. - - - + + + No misspelling in document. Brak błędów w pisowni w dokumencie. - - - + + + No misspelling from text cursor. Brak błędów w pisowni od kursora tekstu. - + Spell Checking Sprawdzanie pisowni - + Some files cannot be saved! Niektóre pliki nie mogły zostać zapisane! - + Translators Tłumacze - + A lightweight, tabbed, plain-text editor Lekki edytor tekstu niesformatowanego z zakładkami - - based on Qt5 - oparty na Qt5 + + based on Qt + oparty na Qt - + Author Autor - + aka. aka. - - + + About FeatherPad O FeatherPad - + No Replacement Bez zamiennika - + One Replacement Jeden zamiennik - + %Ln Replacements %Ln zamiennik @@ -1186,7 +1250,12 @@ - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. Limit rozmiaru dla podświetlania składni został przekroczony. @@ -1507,76 +1576,87 @@ - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > Nigdy nie podświetlaj składni w plikach > - + This creates a menu button on the status bar for changing the syntax. Dodaje to przycisk menu w pasku stanu pozwalający na zmianę składni. - + Support syntax override Obsługuj zastępowanie składni - + Show spaces, tabs and tab lines when the syntax is highlighted. Pokazuje spacje, tabulatory itp. jeżeli składnia jest podświetlana. - + Show whitespaces Wyróżniaj białe znaki - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). Pionowa linia będzie wyświetlana tylko, jeżeli używasz czcionki o stałej szerokości znaków. - + Show vertical lines starting from this position: Wyświetlaj pionowe linie przy pozycji: - + Also show line and document ends Pokazuj także koniec dokumentów i wierszy - + Date and time format: Format daty i godziny: - + Some text editors cannot open a document whose last line is not empty. Niektóre edytory tekstu nie otworzą dokumentu jeżeli ostatni wiersz nie jest pusty. - + Ensure an empty last line on saving Sprawdzaj obecność pustego wiersza podczas zapisywania - + Remove trailing spaces on saving Usuwaj spacje na końcu przy zapisywaniu - + Inertial scrolling with mouse wheel Inercyjne przewijanie kółkiem myszy @@ -1646,7 +1726,7 @@ Zapisuj zmiany w otwieranych plikach co: - + Help Pomoc @@ -1696,38 +1776,26 @@ Zawsze &numeruj wiersze - + Highlight s&yntax by default Podświetaj składnię dom&yślnie - + Dark c&olor scheme Ciemny zestaw k&olorów - + Background color value: Wartość koloru tła: - + MiB MiB - - This is not a complete fix but -prevents annoying scroll jumps. - Nie jest to w pełni działająca poprawka, -ale zapobiega irytującemu przeskakiwaniu przy przewijaniu. - - - - Workaround for &Qt5's scroll jump bug - Obejdź błąd przeskakiwania przy przewijaniu w &Qt5 - - This only includes executable files written in script languages like Shell and Python. @@ -1746,13 +1814,13 @@ Proces może zostać zakończony skrótem Ctrl+Alt+E. - + Needs window reopening to take effect. Wymaga ponownego otwarcia okna, aby uzyskać efekt. - - + + The color value of the background. 255 means white while 0 means black. @@ -1791,8 +1859,8 @@ Restart jest wymagany, aby uzyskać efekt. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1807,22 +1875,22 @@ MMM dd, rrrr, gg:mm:ss - + Text tab size: Rozmiar wcięć: - + spaces spacje - + Thick text cursor Grubszy wskaźnik tekstu - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? @@ -1847,7 +1915,7 @@ - + Add dictionary... @@ -1914,119 +1982,240 @@ Nie pozwalaj na otwieranie plików nietekstowych - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts Skróty - + Action Działanie - + Shortcut Skrót - + Restore default shortcuts. Przywróć domyślne skróty. - + + + Default Domyślne - + + Syntax Colors + + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + Close Zamknij - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + + + + + files pliki - - + + file plik - - + + Warning: Ambiguous shortcut detected! Ostrzeżenie: Wykryto niejednoznaczny skrót! - + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + Application restart is needed for changes to take effect. Restart aplikacji jest wymagany, aby uzyskać efekt. - + Window reopening is needed for changes to take effect. Ponowne otwarcie okna jest wymagane, aby uzyskać efekt. - + &Recently Opened Ostatnio otwie&rane - + Recently &Modified Ostatnio &modyfikowane - + The typed shortcut was reserved. Wprowadzony skrót został zarejestrowany. - + Hunspell Dictionary Files (*.dic) + + + + Select Syntax Color + + FeatherPad::SearchBar - - + + Search... Szukaj… - + Match Case Uwzględniaj wielkość znaków - + Whole Word Cały wyraz - + Regular Expression Wyrażenie regularne - + Search with regex... Wyszukaj wyrażeniem regularnym... - + Next Następne - + Previous Poprzednie @@ -2096,7 +2285,7 @@ - + &Yes &Tak @@ -2136,42 +2325,42 @@ Wprowadź nazwę zapisywanej sesji - + Nothing saved.<br>No file was opened. Nie zapisano niczego.<br>Nie zapisano żadnego pliku. - + No file exists or can be opened. Plik nie istnieje lub nie może zostać otworzony. - + Not all files exist or can be opened. Niektóre pliki nie istnieją lub nie udało się ich otworzyć. - + &OK &OK - + Do you really want to remove all saved sessions? Czy na pewno chcesz usunąć wszystkie zapisane sesje? - + Do you really want to remove the selected sessions? Czy na pewno chcesz usunąć wszystkie zaznaczone sesje? - + Do you really want to remove the selected session? Czy na pewno chcesz usunąć zaznaczoną sesję? - + A session with the same name exists.<br>Do you want to overwrite it? Sesja o tej nazwie istnieje.<br>Czy chcesz ją zastąpić? @@ -2179,7 +2368,7 @@ FeatherPad::SidePane - + Filter... Filtruj… @@ -2225,18 +2414,9 @@ FeatherPad::TextEdit - + Double click to center current line Naciśnij dwukrotnie, aby wyśrodkować obecny wiersz - - FeatherPad::WarningBar - - - - Close - Zamknij - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_pt_BR.ts featherpad-0.17.1/featherpad/data/translations/featherpad_pt_BR.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_pt_BR.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_pt_BR.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Licença @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Sem título @@ -54,514 +56,525 @@ - + &Edit &Editar - + &Options &Opções - - - + + + Encoding Codificação - + &Search - &Pesquisar + &Pesquisa - - + + &Help - &Ajuda + A&juda - + Find: - Encontrar: + Pesquisar: - + To be replaced Para ser substituído - + Replace with: Substituir com: - + Replacing text - Substituir texto + Texto substituível - + &New &Novo - + New tab Nova aba - + Ctrl+N - + &Open &Abrir - + Open a file Abrir um arquivo - + Ctrl+O - - + + &Save &Salvar - + Save the current tab Salvar a aba atual - + Ctrl+S - + &Undo &Desfazer - + Undo Desfazer - + Ctrl+Z - + &Redo &Refazer - + Redo Refazer - + Ctrl+Shift+Z - + Reload Recarregar - + Ctrl+Shift+R - + &Find - &Encontrar + P&esquisar - + Ctrl+F - + Show/hide replacement dock Exibir/ocultar painel de substituição - + Ctrl+R - + Save &As Salvar &Como - + Ctrl+Shift+S - + &Print &Imprimir - + Ctrl+P - + Documen&t Properties Propriedades do Documen&to - + Ctrl+Shift+D - + &Close &Fechar - + Ctrl+Shift+Q - + &Quit &Sair - + Ctrl+Q - + &Cut &Recortar - + Ctrl+X - + C&opy C&opiar - + Ctrl+C - + &Paste &Colar - + Ctrl+V - + &Delete &Excluir - + &Select All &Selecionar Todos - + Ctrl+A - + &Font &Fonte - + &Line Numbers &Números de linha - + Ctrl+L - + &Wrap Lines &Linhas de Quebra Automática - + Ctrl+W - + &Auto-Indentation &Indentação Automática - + Ctrl+I - + &Syntax Highlighting - &Realce de Sintaxe + &Destaque de Sintaxe - + Ctrl+Shift+H - + &Preferences &Preferências - + Ctrl+Shift+P - + Ctrl+H - + &About &Sobre - + Enforce UTF-8 Aplicar UTF-8 - + Save with &Encoding Salvar com &Codificação - + &Jump to - &Saltar para + &Pular para - + Show/hide jump bar Exibir/ocultar barra de salto - + Ctrl+J - + Edit text Editar texto - + Ctrl+Shift+E - + &Run &Executar - + Ctrl+E - + &Clear &Limpar - + Clear the list of recently modified files Limpar lista de arquivos modificados recentemente - + Save/Restore Session Salvar/Restaurar Sessão - + Sa&ve/Restore Session Sa&lvar/Restaurar Sessão - + Ctrl+M - + Side-Pane Painel Lateral - + Ctrl+Alt+P - + Paste Date and Time Colar Data e Hora - + Ctrl+Shift+V - + To Upper Case - Para Maiúsculas + Para MAIÚSCULAS - + Ctrl+Shift+U - + To Lower Case - Para Minúsculas + Para minúsculas - + Ctrl+Shift+L + To Start Case + Para Primeira Letra Em Maiúscula + + + + Last Active Tab Última Aba Ativa - + F1 - - + + Sort Lines Ordenar Linhas - - + + Sort Lines Reversely Ordenar Linhas Reversamente - + Check Spelling Verificar Ortografia - + F2 F2 - - + + Save All Files Salvar Todos os Arquivos - - + + User Dictionary Dicionário do Usuário - + + Text Tabs to Spaces + Tabulações de Texto para Espaços + + + &Detach Tab &Separador - + Ctrl+T - + Close Ne&xt Tabs Fechar Pró&ximas Abas - + Close &Previous Tabs - Fechar Abas &Anteriores + Fechar Abas &Anteriores - + Ne&xt Tab Pró&xima Aba - + Previous Ta&b A&ba Anterior - + Execute Executar - + Close &All Tabs Fechar &Todas Abas @@ -571,613 +584,664 @@ Recentemente &Modificado - + &Encoding &Codificação - + &Unicode - + &Western European &Europeu Ocidental - + &East European &Leste Europeu - + Ea&st Asian Le&ste Asiático - - + + - - Rep&lacement - Subs&tituição + + Replacement + Substituição - + Focus/hide search bar Foco/ocultar barra de pesquisa - + &Replace &Substituir - + Windows Arabic (&CP1256) Windows Árabe (&CP1256) - + &Other &Outros - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) &Cirílico (CP1251) - + Cyrillic (&KOI8-U) Cirílico (&KOI8-U) - + Cyrillic (&ISO-8859-5) Cirílico (&ISO-8859-5) - + &Chinese (BIG5) &Chinês (BIG5) - + Chinese (&GB18030) Chinês (&GB18030) - + &Japanese (ISO-2022-JP) &Japonês (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Japonês (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Japonês (ISO-&2022-KR) - + Ja&panese (CP932) Ja&ponês (CP932) - + Japa&nese (EUC-JP) Japo&nês (EUC-JP) - + &Korean (CP949) &Coreano (CP949) - + K&orean (CP1361) C&oreano (CP1361) - + Korean (&EUC-KR) Coreano (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs Fechar &Outras Abas - + &Copy File Name &Copiar Nome do Arquivo - + Copy File &Path Copiar &Caminho do Arquivo - + Alt+Right Alt+Direita - + Alt+Left Alt+Esquerda - + &First Tab &Primeira Aba - + Alt+Down - + &Last Tab &Última Aba - + Alt+Up - + Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) Calcular número de palavras (Para textos enormes, isso pode ser intensivo para a CPU.) - + Next Próximo - + Previous Anterior - + Replace all Substituir todos - + &Recently Opened &Recentemente Aberto - + Close Fechar - + Save changes? Salvar alterações? - + Please attend to that window or just close its dialog! Por favor, atenda essa janela ou apenas feche a caixa de diálogo! - + The document has been modified. O documento foi modificado. - + &Discard changes &Descartar alterações - + &Cancel &Cancelar - + &No to all &Não para todos - - + + Unsaved Não salvo - - - - - - - - - + + + + + + + + + Lines Linhas - - - + + + Sel. Chars Sel. Caracteres - - - + + + Words Palavras - + Another process is running in this tab! Outro processo está sendo executado nesta aba! - + Script File Arquivo de Script - + Another FeatherPad window has a modal dialog! Outra janela do FeatherPad tem uma caixa de diálogo! - - + + Position: Posição: - - - + + + Normal - - - + + + The file does not exist. O arquivo não existe. - + Open Link Abrir Link - + Copy Link Copiar Link - + Only one process is allowed per tab. Apenas um processo é permitido por aba. - + Script Output Saída de Script - + Clear Limpar - + FeatherPad does not open files larger than 100 MiB. O FeatherPad não abre arquivos maiores que 100 MiB. - + Non-text file(s) not opened! - + Arquivo(s) sem texto não foram abertos! - + See Preferences → Files → Do not permit opening of non-text files - + Veja em Preferências → Arquivos → Não permitir a abertura de arquivos que não forem de texto - + Some file(s) could not be opened! Alguns arquivos não puderam ser abertos! - + You may not have the permission to read. Você pode não ter permissão para ler. - + Uneditable file(s)! Arquivos não editáveis! - + Non-text files or files with huge lines cannot be edited. Arquivos não-texto ou arquivos com linhas enormes não podem ser editados. - + A previous crash detected! Um conflito anterior detectado! - + Preferably, close all FeatherPad windows and start again! De preferência, feche todas as janelas do FeatherPad e inicie novamente! - + Root Instance Instância Root - - - + + + All Files (*) Todos os Arquivos (*) - + All Files (*);;.%1 Files (*.%1) Todos os Arquivos (*);;.%1 Arquivos (*.%1) - + Open file... Abrir arquivo... - + .%1 Files (*.%1);;All Files (*) .%1 Arquivos (*.%1);;Todos os Arquivos (*) - - + + Save as... Salvar como... - + Keep encoding and save as... Manter codificação e salvar como... - + + Saving as root. + Salvando como root. + + + + Waiting for authentication... + Aguardando autenticação... + + + + "pkexec" is not found. Please install Polkit! + "pkexec" não foi encontrado. Por favor, instale o Polkit! + + + Yes Sim - + No Não - + Cancel Cancelar - + Do you want to use <b>MS Windows</b> end-of-lines? Você quer usar fim de linha <b>MS Windows</b>? - + This may be good for readability under MS Windows. Isso pode ser bom para a legibilidade no MS Windows. - + + + + Cannot be saved! Não pode ser salvo! - - - + + + + + Help Ajuda - - - - - - - + + + + + + + Syntax Sintaxe - + Huge file(s) not opened! Arquivo(s) enorme(s) não aberto! - - + + Text tabs are converted to spaces. + As tabulações de texto são convertidas em espaços. + + + + The selected text was too long. + O texto selecionado era muito longo. + + + + It is not fully processed. + Não foi totalmente processado. + + + + This file has been modified elsewhere or in another way! Este arquivo foi modificado em outro lugar ou de outro jeito! - - + + Please be careful about reloading or saving this document! Por favor, tenha cuidado ao recarregar ou salvar este documento! - + + Printing in progress... + Impressão em andamento... + + + Print Document Imprimir Documento - - + + Printing completed. + + + + + %1 Pages %1 Páginas - - + + Copy Target Path Copiar caminho de destino - - + + Open Target Here Abrir Destino Aqui - + + + Open Containing Folder + Abrir Pasta de Conteúdo + + + You need to add a Hunspell dictionary. Você precisa adicionar um dicionário Hunspell. - - - + + + See Preferences → Text → Spell Checking! Veja Preferências → Texto → Verificação ortográfica! - + The Hunspell dictionary does not exist. O dicionário Hunspell não existe. - + The Hunspell dictionary is not accompanied by an affix file. O dicionário Hunspell não está acompanhado por um arquivo de afixação. - - - + + + No misspelling in document. Nenhum erro de ortografia no documento. - - - + + + No misspelling from text cursor. Nenhum erro ortográfico no cursor de texto. - + Spell Checking Verificação ortográfica - + Some files cannot be saved! Alguns arquivos não puderam ser salvos! - + Translators Tradutores - + A lightweight, tabbed, plain-text editor Um editor de texto simples, leve e com abas - - based on Qt5 - Baseado em Qt5 + + based on Qt + Baseado em Qt - + Author Autor - + aka. - - + + About FeatherPad Sobre FeatherPad - + No Replacement Nenhuma substituição - + One Replacement Uma substituição - + %Ln Replacements %Ln substituição @@ -1185,7 +1249,12 @@ - + + The first 1000 replacements are highlighted. + As primeiras 1000 substituições são destacadas. + + + The size limit for syntax highlighting is exceeded. O limite de tamanho para realce de sintaxe é excedido. @@ -1512,74 +1581,86 @@ Substituir períodos triplos e duplos hifens enquanto digita - + + Highlight case-sensitive and whole matches +of the selected text. + Destaque as correspondências com distinção entre +maiúsculas e minúsculas e inteiras do texto selecionado. + + + + Selection highlighting + Destaque de seleção + + + Never highlight syntax for files > Nunca realce a sintaxe para arquivos > - + This creates a menu button on the status bar for changing the syntax. Isso cria um botão de menu na barra de status para alterar a sintaxe. - + Support syntax override Suporte a substituição de sintaxe - + Show spaces, tabs and tab lines when the syntax is highlighted. Exibir espaços, tabulações e linhas de tabulação quando a sintaxe estiver realçada. - + Show whitespaces Exibir espaços em branco - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). As linhas de posição vertical serão desenhadas somente se a fonte do editor tiver um passo fixo (como o Monospace). - + Show vertical lines starting from this position: Exibir linhas verticais iniciando nessa posição: - + Also show line and document ends Também exibir fim de linha e documento - + Date and time format: Formato de data e hora: - + Some text editors cannot open a document whose last line is not empty. Alguns editores de texto não podem abrir um documento cuja última linha não esteja vazia. - + Ensure an empty last line on saving Deixe a última linha vazia ao salvar - + Remove trailing spaces on saving Remover espaços à direita ao salvar - + Inertial scrolling with mouse wheel Rolagem inercial com roda do mouse @@ -1648,7 +1729,7 @@ Salvar alterações em arquivos abertos a cada: - + Help Ajuda @@ -1699,38 +1780,26 @@ Sempre exibir &números de linha - + Highlight s&yntax by default Realçar sinta&xe por padrão - + Dark c&olor scheme Esquema de c&or Dark - + Background color value: Valor da cor de fundo: - + MiB MB - - This is not a complete fix but -prevents annoying scroll jumps. - Esta não é uma correção completa, -mas evita saltos de rolagem irritantes. - - - - Workaround for &Qt5's scroll jump bug - Solução para o bug de rolagem do &Qt5's - - This only includes executable files written in script languages like Shell and Python. @@ -1740,24 +1809,23 @@ the Run button, that appears on the toolbar/filemenu when needed, or by its shortcut Ctrl+E. Then, the process could be killed by Ctrl+Alt+E. - Isso inclui apenas arquivos executáveis escritos -em linguagens de script, como Shell e Python. + Isto inclui apenas arquivos executáveis escritos +em linguagens de script como Shell e Python. -Se estiver marcado e o arquivo aberto for -executável, o arquivo será executado clicando -no botão Executar, que aparece no menu arquivo -da barra de ferramentas quando necessário, -ou pelo atalho Ctrl+E. Então, o processo pode -ser interrompido por Ctrl+Alt+E. +Se a opção estiver marcada e o arquivo aberto é +executável, ele será executado clicando no +botão Rodar, que aparece na barra de ferramentas/menu +arquivos quando necessário, ou pelo atalho Ctrl+E. Do +mesmo modo, o processo poderia ser morto por Ctrl+Alt+E. - + Needs window reopening to take effect. Necessário reabrir a janela para entrar em vigor. - - + + The color value of the background. 255 means white while 0 means black. @@ -1794,8 +1862,8 @@ Necessita de reinicialização do aplicativo para entrar em vigor. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1804,28 +1872,28 @@ MMM dd, yyyy, hh:mm:ss Usado para colar a data e hora. -Entra em vigor depois de fechar este diálogo. +Entrará em vigor depois de fechar este diálogo. Deixar em branco para: DD de MM de AAAA | hh:mm:ss - + Text tab size: Tamanho da guia de texto: - + spaces espaços - + Thick text cursor Cursor de texto espesso - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? A rolagem do mouse deve ser inercial @@ -1853,7 +1921,7 @@ - + Add dictionary... Adicionar dicionário... @@ -1872,7 +1940,7 @@ Number of recent files: - + Número de arquivos recentes: @@ -1921,119 +1989,242 @@ Não permitir abertura de arquivos não-texto - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + Por padrão, quando os arquivos são copiados, +eles serão abertos se forem colados no FeatherPad. + + + + Paste paths instead of files + Colar endereços em vez de arquivos + + + Shortcuts Atalhos - + Action - + Ação - + Shortcut Atalho - + Restore default shortcuts. Restaurar atalhos padrão. - + + + Default - + Padrão + + + + Syntax Colors + Cores de Sintaxe + + + + Element + Elemento + + + + Text Color + Cor do Texto + + + + Whitespace color value: + Valor da cor do espaço em branco: + + + + + Has effect only if line numbers are shown. + Tem efeito apenas se os números de linha estão sendo exibidos. + + + + Current line highlight value: + Valor de destaque da linha atual: + + + + Restore default syntax colors. + Restaurar o padrão de cores de sintaxe. - + Close Fechar - - + + Press a modifier key to clear a shortcut +in the editing mode. + Pressione uma tecla modificadora para +limpar um atalho no modo de edição. + + + + Double click a color to change it. + Dê um clique duplo em uma cor para mudá-la. + + + + files - + arquivos - - + + file - + arquivo - - + + Warning: Ambiguous shortcut detected! Atenção: Atalho ambíguo detectado! - + + Functions, URLs,… + Funções, URLs,… + + + + Built-in Functions + Funções Embutidas + + + + Comments + Comentários + + + + Quotations + Citações + + + + Types + Tipos + + + + Key Words + Palavras-chave + + + + Numbers + Números + + + + Regular Expressions, Code Blocks,… + Expressões Regulares, Blocos de Código,… + + + + Document Blocks, XML/HTML Elements,… + Blocos de Documento, Elementos XML/HTML,… + + + + Markdown Headings, CSS Values,… + Cabeçalhos de Markdown, Valores CSS,… + + + + Extra Elements + Elementos Extras + + + Application restart is needed for changes to take effect. A reinicialização do aplicativo é necessária para que as alterações entrem em vigor. - + Window reopening is needed for changes to take effect. A reabertura da janela é necessária para que as alterações entrem em vigor. - + &Recently Opened &Recentemente Aberto - + Recently &Modified Recentemente &Modificado - + The typed shortcut was reserved. O atalho digitado foi reservado. - + Hunspell Dictionary Files (*.dic) - Arquivos de Dicionário Hunspell (*.dic) + Arquivos de Dicionário Hunspell (*.dic) + + + + + Select Syntax Color + Selecionar Cor de Sintaxe FeatherPad::SearchBar - - + + Search... Pesquisar... - + Match Case Caso de compatibilidade - + Whole Word Palavra inteira - + Regular Expression Expressão Regular - + Search with regex... Pesquisar com regex... - + Next Próximo - + Previous Anterior @@ -2103,7 +2294,7 @@ - + &Yes &Sim @@ -2143,42 +2334,42 @@ Digite um nome para salvar a sessão - + Nothing saved.<br>No file was opened. Nada salvo.<br>Nenhum arquivo foi aberto. - + No file exists or can be opened. Nenhum arquivo existe ou pode ser aberto. - + Not all files exist or can be opened. Nem todos os arquivos existem ou podem ser abertos. - + &OK - + Do you really want to remove all saved sessions? Você realmente quer remover todas as sessões salvas? - + Do you really want to remove the selected sessions? Você realmente quer remover as sessões selecionadas? - + Do you really want to remove the selected session? Você realmente quer remover a sessão selecionada? - + A session with the same name exists.<br>Do you want to overwrite it? Uma sessão com o mesmo nome existe.<br>Você deseja sobrescrever? @@ -2186,7 +2377,7 @@ FeatherPad::SidePane - + Filter... Filtrar... @@ -2232,18 +2423,9 @@ FeatherPad::TextEdit - + Double click to center current line Clique duas vezes para centralizar a linha atual - - FeatherPad::WarningBar - - - - Close - Fechar - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_pt_PT.ts featherpad-0.17.1/featherpad/data/translations/featherpad_pt_PT.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_pt_PT.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_pt_PT.ts 1970-01-01 00:00:00.000000000 +0000 @@ -1,2195 +0,0 @@ - - - - - FeatherPad::AboutDialog - - - License - Licença - - - - FeatherPad::FPwin - - - - - - - - - - - - Untitled - Sem título - - - - Go to line: - Ir para a linha: - - - - Select text from cursor to this line -(Ctrl+Shift+J) - Selecionar texto desde o cursor até à linha -(Ctrl+Shift+J) - - - - Select Text - Selecionar texto - - - - Ctrl+Shift+J - - - - - &File - &Ficheiro - - - - - &Edit - &Editar - - - - &Options - &Opções - - - - - - Encoding - Codificação - - - - &Search - Pe&squisa - - - - - &Help - Aj&uda - - - - Find: - Localizar: - - - - To be replaced - Para substituição - - - - Replace with: - Substituir por: - - - - Replacing text - Substituição de texto - - - - &New - &Novo - - - - New tab - Novo separador - - - - Ctrl+N - - - - - &Open - &Abrir - - - - Open a file - Abrir um ficheiro - - - - Ctrl+O - - - - - - &Save - &Guardar - - - - Save the current tab - Guarda o separador atual - - - - Ctrl+S - - - - - &Undo - &Desfazer - - - - Undo - Desfazer - - - - Ctrl+Z - - - - - &Redo - &Refazer - - - - Redo - Refazer - - - - Ctrl+Shift+Z - - - - - - Reload - Recarregar - - - - Ctrl+Shift+R - - - - - &Find - &Localizar - - - - Ctrl+F - - - - - Show/hide replacement dock - Mostrar/ocultar doca de substituição - - - - Ctrl+R - - - - - Save &As - Gu&ardar como - - - - Ctrl+Shift+S - - - - - &Print - Im&primir - - - - Ctrl+P - - - - - Documen&t Properties - Propriedades do documen&to - - - - Ctrl+Shift+D - - - - - &Close - Fe&char - - - - Ctrl+Shift+Q - - - - - &Quit - &Sair - - - - Ctrl+Q - - - - - &Cut - &Cortar - - - - Ctrl+X - - - - - C&opy - C&opiar - - - - Ctrl+C - - - - - &Paste - Co&lar - - - - Ctrl+V - - - - - &Delete - Apa&gar - - - - &Select All - &Selecionar tudo - - - - Ctrl+A - - - - - &Font - &Fonte - - - - &Line Numbers - Número de &linha - - - - Ctrl+L - - - - - &Wrap Lines - &Moldar linhas - - - - Ctrl+W - - - - - &Auto-Indentation - &Avanço automático - - - - Ctrl+I - - - - - &Syntax Highlighting - Destaque de &sintaxe - - - - Ctrl+Shift+H - - - - - &Preferences - &Preferências - - - - Ctrl+Shift+P - - - - - Ctrl+H - - - - - &About - &Acerca - - - - Enforce UTF-8 - Impor UTF-8 - - - - Save with &Encoding - Guardar com &codificação - - - - &Jump to - &Ir para - - - - Show/hide jump bar - Mostrar/ocultar barra 'Ir para' - - - - Ctrl+J - - - - - Edit text - Editar texto - - - - Ctrl+Shift+E - - - - - &Run - Executa&r - - - - Ctrl+E - - - - - &Clear - &Limpar - - - - Clear the list of recently modified files - Limpar lista de ficheiros modificados - - - - Save/Restore Session - Guardar/restaurar sessão - - - - Sa&ve/Restore Session - Guar&dar/restaurar sessão - - - - Ctrl+M - - - - - Side-Pane - Painel lateral - - - - Ctrl+Alt+P - - - - - Paste Date and Time - Colar data e hora - - - - Ctrl+Shift+V - - - - - - To Upper Case - Para maiúsculas - - - - Ctrl+Shift+U - - - - - - To Lower Case - Para minúsculas - - - - Ctrl+Shift+L - - - - - - Last Active Tab - Último separador ativo - - - - F1 - - - - - - Sort Lines - Ordenar linhas - - - - - Sort Lines Reversely - Ordenar linhas por ordem inversa - - - - Check Spelling - Verificar ortografia - - - - F2 - - - - - - Save All Files - Guardar todos os ficheiros - - - - - User Dictionary - - - - - &Detach Tab - &Destacar separador - - - - Ctrl+T - - - - - Close Ne&xt Tabs - Fechar separadores seg&uintes - - - - Close &Previous Tabs - Fechar se&paradores anteriores - - - - Ne&xt Tab - Separador seg&uinte - - - - Previous Ta&b - Separador a&nterior - - - - Execute - Executar - - - - Close &All Tabs - Fech&ar todos os separadores - - - - Recently &Modified - &Modificados recentemente - - - - &Encoding - &Codificação - - - - &Unicode - - - - - &Western European - Europa &ocidental - - - - &East European - &Europa oriental - - - - Ea&st Asian - Á&sia oriental - - - - - - - Rep&lacement - Su&bstituição - - - - Focus/hide search bar - Focar/ocultar barra de pesquisa - - - - &Replace - Substitui&r - - - - Windows Arabic (&CP1256) - Árabe Windows (&CP1256) - - - - &Other - &Outra - - - - &UTF-8 - - - - - UTF-&16 - - - - - &ISO-8859-1 - - - - - &Windows-1252 - - - - - &Cyrillic (CP1251) - &Cirílico (CP1251) - - - - Cyrillic (&KOI8-U) - Cirílico (&KOI8-U) - - - - Cyrillic (&ISO-8859-5) - Cirílico (&ISO-8859-5) - - - - &Chinese (BIG5) - &Chinês (BIG5) - - - - Chinese (&GB18030) - Chinês (&GB18030) - - - - &Japanese (ISO-2022-JP) - &Japonês (ISO-2022-JP) - - - - Japanese (&ISO-2022-JP-2) - Japonês (&ISO-2022-JP-2) - - - - Japanese (ISO-&2022-KR) - Japonês (ISO-&2022-KR) - - - - Ja&panese (CP932) - Ja&ponês (CP932) - - - - Japa&nese (EUC-JP) - Japo&nês (EUC-JP) - - - - &Korean (CP949) - &Coreano (CP949) - - - - K&orean (CP1361) - C&oreano (CP1361) - - - - Korean (&EUC-KR) - Coreano (&EUC-KR) - - - - ISO-&8859-15 - - - - - Close &Other Tabs - Fechar &outros separadores - - - - &Copy File Name - &Copiar nome do ficheiro - - - - Copy File &Path - Co&piar caminho do ficheiro - - - - Alt+Right - - - - - Alt+Left - - - - - &First Tab - Pr&imeiro separador - - - - Alt+Down - - - - - &Last Tab - Úl&timo separador - - - - Alt+Up - - - - - Menu - - - - - Calculate number of words -(For huge texts, this may be CPU-intensive.) - Calcular número de palavras -(para textos extensos, pode consumir muito CPU) - - - - Next - Seguinte - - - - Previous - Anterior - - - - Replace all - Substituir tudo - - - - &Recently Opened - Abertos &recentemente - - - - Close - Fechar - - - - Save changes? - Guardar alterações? - - - - Please attend to that window or just close its dialog! - Aceda à janela ou feche este diálogo! - - - - The document has been modified. - O documento foi modificado. - - - - &Discard changes - &Rejeitar alterações - - - - &Cancel - &Cancelar - - - - &No to all - &Não a tudo - - - - - Unsaved - Não guardado - - - - - - - - - - - - Lines - Linhas - - - - - - Sel. Chars - Caracteres selecionados - - - - - - Words - Palavras - - - - Another process is running in this tab! - Já está a ser executado um processo neste separador! - - - - Script File - Ficheiro script - - - - Another FeatherPad window has a modal dialog! - Já existe uma janela do featherpad com um diálogo modal! - - - - - Position: - Posição: - - - - - - Normal - - - - - - - The file does not exist. - O ficheiro não existe. - - - - Open Link - Abrir ligação - - - - Copy Link - Copiar ligação - - - - Only one process is allowed per tab. - Apenas é permitido um processo por separador. - - - - Script Output - Destino do script - - - - Clear - Limpar - - - - FeatherPad does not open files larger than 100 MiB. - Não é possível abrir ficheiros com tamanho superior a 100 Mib. - - - - Non-text file(s) not opened! - - - - - See Preferences → Files → Do not permit opening of non-text files - - - - - Some file(s) could not be opened! - Não foi possível abrir alguns ficheiros! - - - - You may not have the permission to read. - Pode ser que você não tenha permissão de leitura. - - - - Uneditable file(s)! - O(s) ficheiro (s) não podem ser editados! - - - - Non-text files or files with huge lines cannot be edited. - Ficheiros que não sejam de texto ou que tenham linhas enormes não podem ser editados. - - - - A previous crash detected! - Ocorreu um erro! - - - - Preferably, close all FeatherPad windows and start again! - Preferencialmente, feche todas as janelas e reinicie a aplicação! - - - - Root Instance - Instância raiz - - - - - - All Files (*) - Todos os ficheiros (*) - - - - All Files (*);;.%1 Files (*.%1) - Todos os ficheiros (*);; Ficheiros .%1 (*.%1) - - - - Open file... - Abrir ficheiro... - - - - .%1 Files (*.%1);;All Files (*) - Ficheiros .%1 (*.%1);; Todos os ficheiros (*) - - - - - Save as... - Guardar como... - - - - Keep encoding and save as... - Manter codificação e guardar como... - - - - Yes - Sim - - - - No - Não - - - - Cancel - Cancelar - - - - Do you want to use <b>MS Windows</b> end-of-lines? - Deseja utilizar o fim de linhas ao estilo <b>MS Windows</b>? - - - - This may be good for readability under MS Windows. - Esta opção é a correta para ler ficheiros em sistemas Windows. - - - - Cannot be saved! - Não pode ser guardado! - - - - - - Help - Ajuda - - - - - - - - - - Syntax - Sintaxe - - - - Huge file(s) not opened! - O(s) ficheiro(s) muito grandes não conseguem ser abertos! - - - - - This file has been modified elsewhere or in another way! - Este ficheiro foi modificado em outro lugar ou de outra maneira! - - - - - Please be careful about reloading or saving this document! - Tenha muito cuidado a recarregar ou guardar este documento! - - - - Print Document - Imprimir documento - - - - - %1 Pages - %1 Páginas - - - - - Copy Target Path - Copiar caminho do destino - - - - - Open Target Here - Abrir destino aqui - - - - You need to add a Hunspell dictionary. - Tem que adicionar um dicionário Hunspell. - - - - - - See Preferences → Text → Spell Checking! - Consulte Preferências → Texto → Verificação ortográfica! - - - - The Hunspell dictionary does not exist. - O dicionário Hunspell não existe. - - - - The Hunspell dictionary is not accompanied by an affix file. - O dicionário Hunspell não está acompanhado por um ficheiro 'affix'. - - - - - - No misspelling in document. - Não existem erros ortográficos. - - - - - - No misspelling from text cursor. - Nenhum erro ortográfico a partir do cursor de texto. - - - - Spell Checking - Verificação ortográfica - - - - Some files cannot be saved! - Não foi possível guardar todos os ficheiros! - - - - Translators - Tradutores - - - - A lightweight, tabbed, plain-text editor - Um editor de ficheiros poderoso - - - - based on Qt5 - baseado em Qt5 - - - - Author - Autor - - - - aka. - - - - - - About FeatherPad - Acerca de Featherpad - - - - No Replacement - Sem substituição - - - - One Replacement - Uma substituição - - - - %Ln Replacements - - %Ln substituição - %Ln substituições - - - - - The size limit for syntax highlighting is exceeded. - Excedeu o limite de tamanho para o destaque de sintaxe. - - - - FeatherPad::FileDialog - - - Ctrl+H - Toggle showing hidden files - - - - - Alt+. - Toggle showing hidden files - - - - - FeatherPad::FontDialog - - - Select Font - Selecionar tipo de letra - - - - Programming Fonts - Tipo de letra para programação - - - - - Font: - Tipo de letra: - - - - Size: - Tamanho: - - - - Weight: - Espessura: - - - - Normal - Normal - - - - Medium - Média - - - - Bold - Negrito - - - - Black - Preto - - - - Italic - Itálico - - - - Preview - Pré-visualizar - - - - FeatherPad::LineEdit - - - Clear text (Ctrl+K) - Limpar texto (Ctrl+K) - - - - FeatherPad::PrefDialog - - - Preferences - Preferências - - - - Window - Janela - - - - Window Settings - Definições de janelas - - - - Remember window &size on closing - Memorizar po&sição das janelas - - - - - - - Window frame is excluded. - A moldura é excluída. - - - - Start with this size: - Iniciar com este tamanho: - - - - - px - - - - - × - - - - - Enforcing a window position is not recommended -and may not work with some window managers. - Não deve forçar a posição de janelas e esta opção -pode não funcionar com todos os gestores de janelas. - - - - Remember window &position on closing - Memorizar &posição da janela ao fechar - - - - Most suitable with sessions -but without tab functionality. - Adequado para sessões mas -não pode utilizar separadores. - - - - Uncheck for 1/5 of the width. - Desmarque para 1/5 da largura. - - - - Remember splitter position - Memorizar posição do separador - - - - Do not show &toolbar - Não mos&trar barra de ferramentas - - - - If the menubar is hidden, -a menu button appears on the toolbar. - Se ocultar a barra de menu, aparecerá -um botão de menu na barra de ferramentas. - - - - Do not show &menubar - Não &mostrar barra de menu - - - - Hide search &bar by default - Por definição, ocultar &barra de pesquisa - - - - By default, each search entry -has a separate search history. - Por definição, cada entrada pesquisada -tem um histórico de pesquisa distinto. - - - - Use a shared search history - Utilizar histórico de pesquisa partilhado - - - - Always show st&atus bar - Mostr&ar sempre a barra de estado - - - - Show cursor position on status bar - Mostrar posição do cursor na barra de estado - - - - - Will take effect after closing this dialog. - A alteração será aplicada depois de fechar este diálogo. - - - - Tab position: - Posição do separador: - - - - North - Norte - - - - South - Sul - - - - West - Oeste - - - - East - Este - - - - This means that, for LTR, Alt+Right goes to the first tab -after the last tab is activated, and the same for Alt+Left. - -Tab navigation with mouse wheel is not affected. - - - - - Tab navigation wraps &around - - - - - Close window on closing its last tab - Fechar janela ao fechar o último separador - - - - By default, if a FeatherPad window exists on the -current desktop, files will be opened in its tabs. - -However, some desktop environments may not -report that they have multiple desktops. - - - - - Always open in separate windows - Abrir sempre em janelas distintas - - - - If this is checked, the file dialog provided by the current -desktop environment will be used instead of the Qt file dialog. - -Some desktop environments, like KDE and LXQt, provide files dialogs. - - - - - Native file dialog - Caixa de diálogo nativa - - - - Uncheck for Monospace. - Desmarque para usar letra mono-espaçada. - - - - Remember &font - Memori&zar tipo de letra - - - - This covers parentheses, braces, brackets and quotes. - Abrange parênteses, chaves, chavetas e aspas. - - - - Auto-&bracket - - - - - By default, a triple period is replaced with an ellipsis -and a double hyphen with a long dash while typing, -under proper circumstances. - - - - - Replace triple periods and double hyphens while typing - - - - - Never highlight syntax for files > - Não destacar sintaxe para ficheiros > - - - - This creates a menu button on the -status bar for changing the syntax. - Isto cria um botão de menu na barra -de estado para alterar a sintaxe. - - - - Support syntax override - - - - - Show spaces, tabs and tab lines -when the syntax is highlighted. - - - - - Show whitespaces - Mostrar espaços vazios - - - - - The vertical position lines will be drawn only if -the editor font has a fixed pitch (like Monospace). - - - - - Show vertical lines starting from this position: - Mostrar linhas verticais com início nesta posição: - - - - Also show line and document ends - - - - - Date and time format: - Formato de data e hora: - - - - Some text editors cannot open a document -whose last line is not empty. - Alguns editores de texto não conseguem abrir -um ficheiro se não existir uma linha vazia no fim. - - - - Ensure an empty last line on saving - Certifique-se de que deixa uma linha vazia - - - - Remove trailing spaces on saving - - - - - Inertial scrolling with mouse wheel - - - - - Files - Ficheiros - - - - File Management - Gestão de ficheiros - - - - Start with files of last window - Iniciar com os ficheiros da última janela - - - - - This can be any starting command with -arguments, for example, "xterm -hold" -for running the process in XTerm. - -If the command is left empty, the file -will be executed directly. - -If the script is not run in a terminal -emulator, the output and error messages -will be shown by a popup dialog. - - - - - Start with this command: - Iniciar com este comando: - - - - Command + Arguments - Comando + argumentos - - - - Show recentl&y modified files - Mostrar ficheiros modificados &recentemente - - - - Show recentl&y opened files - Mostrar ficheiros abertos &recentemente - - - - Save changes to opened files every: - Guardar alterações a cada: - - - - Help - Ajuda - - - - Start with side-pane mode - - - - - If this is checked, not only you will lose the informative -tooltip and context menu of a single tab but you could not -merge a single tabbed window into another one by tab drag- -and-drop either. - - - - - &Do not show a single tab - Ocultar separa&dor se apenas existir um aberto - - - - Text - Texto - - - - Text Editor - Editor de texto - - - - &Wrap lines by default - &Quebrar linhas por padrão - - - - Auto-&indent by default - Avanço automát&ico por padrão - - - - Always show line &numbers - Mostrar sempre o &número da linha - - - - Highlight s&yntax by default - Por definição, destacar s&intaxe - - - - Dark c&olor scheme - Esquema escur&o - - - - Background color value: - Valor da cor de fundo: - - - - MiB - - - - - This is not a complete fix but -prevents annoying scroll jumps. - - - - - Workaround for &Qt5's scroll jump bug - - - - - This only includes executable files written -in script languages like Shell and Python. - -If it is checked and the opened file is -executable, the file will be executed by clicking -the Run button, that appears on the toolbar/filemenu -when needed, or by its shortcut Ctrl+E. Then, the -process could be killed by Ctrl+Alt+E. - - - - - Needs window reopening to take effect. - Precisa reabrir a janela para entrar em vigor. - - - - - The color value of the background. -255 means white while 0 means black. - -For the light background, it can be -between 230 and 255; for the dark -background, between 0 and 50. - -Needs window reopening to take effect. - - - - - Run executable scripts - Executar scripts executáveis - - - - - The maximum number of recently modified or -opened files FeatherPad shows. The default -is 10. - -Needs application restart to take effect. - - - - - - Used for pasting the date and time. - -Takes effect after closing this dialog. - -Leave empty for: -MMM dd, yyyy, hh:mm:ss - - - - - Text tab size: - Tamanho da guia de texto: - - - - spaces - espaços - - - - Thick text cursor - - - - - Should the mouse wheel scrolling be inertial -if the cursor is inside the text view? - - - - - Spell Checking - Verificação Ortográfica - - - - - A Hunspell dictionary has a name that ends with ".dic" -and should be alongside an affix file with the same -name but ending with ".aff". - Um dicionário Hunspell tem um nome que termina com ".dic" -e deve estar ao lado de um arquivo de afixação com o mesmo -nome, mas terminando com ".aff". - - - - Hunspell dictionary path: - Diretório do dicionário Hunspell: - - - - - Add dictionary... - Adicionar um dicionário... - - - - If this is unchecked, spell checking -will be started from the document start. - Caso estiver desmarcado, a verificação ortográfica -será iniciada a partir do início do documento. - - - - Start spell checking from text cursor - Iniciar verificação ortográfica a partir do cursor de texto - - - - Number of recent files: - Número de ficheiros recentes: - - - - Only if their number is not greater than 50. - - - - - - Only for files that exist and can be saved. - - - - - min - - - - - If this is checked, the Save button/menu-item could -be used also when the opened file is not modified. - -This can be useful under certain circumstances, -e.g. for changing the time stamp or removing the -trailing spaces of a text file. - - - - - Allow saving unmodified files - Permitir guardar ficheiros não modificados - - - - Show a warning instead. - Mostrar antes um aviso. - - - - Do not permit opening of non-text files - Não permitir a abertura de arquivos que não sejam de texto - - - - Shortcuts - Atalhos - - - - Action - Ação - - - - Shortcut - Atalho - - - - Restore default shortcuts. - Restaurar atalhos padrão. - - - - Default - Padrão - - - - Close - Fechar - - - - - files - ficheiros - - - - - file - ficheiro - - - - - Warning: Ambiguous shortcut detected! - Aviso: detetado um atalho ambíguo! - - - - Application restart is needed for changes to take effect. - Tem que reiniciar a aplicação para aplicar as alterações. - - - - Window reopening is needed for changes to take effect. - Tem que reabrir esta janela para aplicar as alterações. - - - - &Recently Opened - Abertos &recentemente - - - - Recently &Modified - &Modificados recentemente - - - - The typed shortcut was reserved. - O atalho introduzido já está reservado. - - - - Hunspell Dictionary Files (*.dic) - Arquivos do Dicionário Hunspell (* .dic) - - - - FeatherPad::SearchBar - - - - Search... - Pesquisa... - - - - Match Case - Diferenciar maiúsculas/minúsculas - - - - Whole Word - - - - - Regular Expression - Expressão regular - - - - Search with regex... - Pesquisar com regex... - - - - Next - Seguinte - - - - Previous - Anterior - - - - FeatherPad::SessionDialog - - - Session Manager - Gestor de sessões - - - - - &Remove - &Remover - - - - <b>Save/Restore Session</b> - <b>Guardar/restaurar sessão</b> - - - - Filter... - Filtrar... - - - - Open the selected session(s). - Abrir a sessão selecionada. - - - - - &Open - &Abrir - - - - - Del - - - - - - Ctrl+Del - - - - - By default, all files that are opened in all -windows will be included in the saved session. - Por definição, todos os ficheiros que estejam -abertos serão incluídos na sessão guardada. - - - - Save only from this &window - Guardar apenas para esta &janela - - - - <b>Warning</b> - <b>Aviso</b> - - - - - &Yes - &Sim - - - - &No - &Não - - - - Re&name - Re&nomear - - - - Remove &All - Remover &tudo - - - - &Close - Fe&char - - - - Save the current session under the given title. - Guardar a sessão atual introduzindo um nome. - - - - &Save - &Guardar - - - - Type a name to save session - Introduza o nome para a sessão - - - - Nothing saved.<br>No file was opened. - Nada foi guardado.<br>Nenhum ficheiro aberto. - - - - No file exists or can be opened. - O ficheiro não existe ou não pôde ser aberto. - - - - Not all files exist or can be opened. - Nem todos os ficheiros existem ou não puderam ser abertos. - - - - &OK - - - - - Do you really want to remove all saved sessions? - Tem a certeza de que deseja remover todas as sessões guardadas? - - - - Do you really want to remove the selected sessions? - Tem a certeza de que deseja remover as sessões selecionadas? - - - - Do you really want to remove the selected session? - Tem a certeza de que deseja remover a sessão selecionada? - - - - A session with the same name exists.<br>Do you want to overwrite it? - Já existe uma sessão com este nome.<br>Deseja proceder à sua substituição? - - - - FeatherPad::SidePane - - - Filter... - Filtrar... - - - - FeatherPad::SpellDialog - - - Unknown word: - Palavra desconhecida: - - - - Add To Dictionary - Adicionar ao Dicionário - - - - Replace with: - Substituir por: - - - - Correct Once - Corrigir Uma - - - - Correct All - Corrigir Todas - - - - Ignore Once - Ignore Uma - - - - Ignore All - Ignore Todas - - - - FeatherPad::TextEdit - - - Double click to center current line - Duplo clique para centrar a linha atual - - - - FeatherPad::WarningBar - - - - Close - Fechar - - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_pt.ts featherpad-0.17.1/featherpad/data/translations/featherpad_pt.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_pt.ts 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_pt.ts 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,2433 @@ + + + + + FeatherPad::AboutDialog + + + License + Licença + + + + FeatherPad::FPwin + + + + + + + + + + + + + + Untitled + Sem título + + + + Go to line: + Ir para a linha: + + + + Select text from cursor to this line +(Ctrl+Shift+J) + Selecionar texto desde o cursor até à linha +(Ctrl+Shift+J) + + + + Select Text + Selecionar texto + + + + Ctrl+Shift+J + Ctrl+Shift+J + + + + &File + &Ficheiro + + + + + &Edit + &Editar + + + + &Options + &Opções + + + + + + Encoding + Codificação + + + + &Search + Pe&squisa + + + + + &Help + Aj&uda + + + + Find: + Localizar: + + + + To be replaced + Para substituição + + + + Replace with: + Substituir por: + + + + Replacing text + Substituição de texto + + + + &New + &Novo + + + + New tab + Novo separador + + + + Ctrl+N + Ctrl+N + + + + &Open + &Abrir + + + + Open a file + Abrir um ficheiro + + + + Ctrl+O + Ctrl+O + + + + + &Save + &Guardar + + + + Save the current tab + Guarda o separador atual + + + + Ctrl+S + Ctrl+S + + + + &Undo + &Desfazer + + + + Undo + Desfazer + + + + Ctrl+Z + Ctrl+Z + + + + &Redo + &Refazer + + + + Redo + Refazer + + + + Ctrl+Shift+Z + Ctrl+Shift+Z + + + + + Reload + Recarregar + + + + Ctrl+Shift+R + Ctrl+Shift+R + + + + &Find + &Localizar + + + + Ctrl+F + Ctrl+F + + + + Show/hide replacement dock + Mostrar/ocultar doca de substituição + + + + Ctrl+R + Ctrl+R + + + + Save &As + Gu&ardar como + + + + Ctrl+Shift+S + Ctrl+Shift+S + + + + &Print + Im&primir + + + + Ctrl+P + Ctrl+P + + + + Documen&t Properties + Propriedades do documen&to + + + + Ctrl+Shift+D + Ctrl+Shift+D + + + + &Close + Fe&char + + + + Ctrl+Shift+Q + Ctrl+Shift+Q + + + + &Quit + &Sair + + + + Ctrl+Q + Ctrl+Q + + + + &Cut + &Cortar + + + + Ctrl+X + Ctrl+X + + + + C&opy + C&opiar + + + + Ctrl+C + Ctrl+C + + + + &Paste + Co&lar + + + + Ctrl+V + Ctrl+V + + + + &Delete + Apa&gar + + + + &Select All + &Selecionar tudo + + + + Ctrl+A + Ctrl+A + + + + &Font + &Fonte + + + + &Line Numbers + Número de &linha + + + + Ctrl+L + Ctrl+L + + + + &Wrap Lines + &Moldar linhas + + + + Ctrl+W + Ctrl+W + + + + &Auto-Indentation + &Avanço automático + + + + Ctrl+I + Ctrl+I + + + + &Syntax Highlighting + Destaque de &sintaxe + + + + Ctrl+Shift+H + Ctrl+Shift+H + + + + &Preferences + &Preferências + + + + Ctrl+Shift+P + Ctrl+Shift+P + + + + Ctrl+H + Ctrl+H + + + + &About + &Acerca + + + + Enforce UTF-8 + Impor UTF-8 + + + + Save with &Encoding + Guardar com &codificação + + + + &Jump to + &Ir para + + + + Show/hide jump bar + Mostrar/ocultar barra 'Ir para' + + + + Ctrl+J + Ctrl+J + + + + Edit text + Editar texto + + + + Ctrl+Shift+E + Ctrl+Shift+E + + + + &Run + Executa&r + + + + Ctrl+E + Ctrl+E + + + + &Clear + &Limpar + + + + Clear the list of recently modified files + Limpar lista de ficheiros modificados + + + + Save/Restore Session + Guardar/restaurar sessão + + + + Sa&ve/Restore Session + Guar&dar/restaurar sessão + + + + Ctrl+M + Ctrl+M + + + + Side-Pane + Painel lateral + + + + Ctrl+Alt+P + Ctrl+Alt+P + + + + Paste Date and Time + Colar data e hora + + + + Ctrl+Shift+V + Ctrl+Shift+V + + + + + To Upper Case + Para maiúsculas + + + + Ctrl+Shift+U + Ctrl+Shift+U + + + + + To Lower Case + Para minúsculas + + + + Ctrl+Shift+L + Ctrl+Shift+L + + + + + To Start Case + Para iniciar em maiúscula + + + + + Last Active Tab + Último separador ativo + + + + F1 + F1 + + + + + Sort Lines + Ordenar linhas + + + + + Sort Lines Reversely + Ordenar linhas por ordem inversa + + + + Check Spelling + Verificar ortografia + + + + F2 + F2 + + + + + Save All Files + Guardar todos os ficheiros + + + + + User Dictionary + Dicionário do utilizador + + + + Text Tabs to Spaces + Separadores de texto para os espaços + + + + &Detach Tab + &Destacar separador + + + + Ctrl+T + Ctrl+T + + + + Close Ne&xt Tabs + Fechar separadores seg&uintes + + + + Close &Previous Tabs + Fechar se&paradores anteriores + + + + Ne&xt Tab + Separador seg&uinte + + + + Previous Ta&b + Separador a&nterior + + + + Execute + Executar + + + + Close &All Tabs + Fech&ar todos os separadores + + + + Recently &Modified + &Modificados recentemente + + + + &Encoding + &Codificação + + + + &Unicode + &Unicode + + + + &Western European + Europa &ocidental + + + + &East European + &Europa oriental + + + + Ea&st Asian + Á&sia oriental + + + + + + + Replacement + Substituição + + + + Focus/hide search bar + Focar/ocultar barra de pesquisa + + + + &Replace + Substitui&r + + + + Windows Arabic (&CP1256) + Árabe Windows (&CP1256) + + + + &Other + &Outra + + + + &UTF-8 + &UTF-8 + + + + UTF-&16 + UTF-&16 + + + + &ISO-8859-1 + &ISO-8859-1 + + + + &Windows-1252 + &Windows-1252 + + + + &Cyrillic (CP1251) + &Cirílico (CP1251) + + + + Cyrillic (&KOI8-U) + Cirílico (&KOI8-U) + + + + Cyrillic (&ISO-8859-5) + Cirílico (&ISO-8859-5) + + + + &Chinese (BIG5) + &Chinês (BIG5) + + + + Chinese (&GB18030) + Chinês (&GB18030) + + + + &Japanese (ISO-2022-JP) + &Japonês (ISO-2022-JP) + + + + Japanese (&ISO-2022-JP-2) + Japonês (&ISO-2022-JP-2) + + + + Japanese (ISO-&2022-KR) + Japonês (ISO-&2022-KR) + + + + Ja&panese (CP932) + Ja&ponês (CP932) + + + + Japa&nese (EUC-JP) + Japo&nês (EUC-JP) + + + + &Korean (CP949) + &Coreano (CP949) + + + + K&orean (CP1361) + C&oreano (CP1361) + + + + Korean (&EUC-KR) + Coreano (&EUC-KR) + + + + ISO-&8859-15 + ISO-&8859-15 + + + + Close &Other Tabs + Fechar &outros separadores + + + + &Copy File Name + &Copiar nome do ficheiro + + + + Copy File &Path + Co&piar caminho do ficheiro + + + + Alt+Right + Alt+Right + + + + Alt+Left + Alt+Esquerda + + + + &First Tab + Pr&imeiro separador + + + + Alt+Down + Alt+Down + + + + &Last Tab + Úl&timo separador + + + + Alt+Up + Alt+Up + + + + Menu + Menu + + + + Calculate number of words +(For huge texts, this may be CPU-intensive.) + Calcular número de palavras +(para textos extensos, pode consumir muito CPU) + + + + Next + Seguinte + + + + Previous + Anterior + + + + Replace all + Substituir tudo + + + + &Recently Opened + Abertos &recentemente + + + + Close + Fechar + + + + Save changes? + Guardar alterações? + + + + Please attend to that window or just close its dialog! + Aceda à janela ou feche este diálogo! + + + + The document has been modified. + O documento foi modificado. + + + + &Discard changes + &Rejeitar alterações + + + + &Cancel + &Cancelar + + + + &No to all + &Não a tudo + + + + + Unsaved + Não guardado + + + + + + + + + + + + Lines + Linhas + + + + + + Sel. Chars + Caracteres selecionados + + + + + + Words + Palavras + + + + Another process is running in this tab! + Já está a ser executado um processo neste separador! + + + + Script File + Ficheiro script + + + + Another FeatherPad window has a modal dialog! + Já existe uma janela do featherpad com um diálogo modal! + + + + + Position: + Posição: + + + + + + Normal + Normal + + + + + + The file does not exist. + O ficheiro não existe. + + + + Open Link + Abrir ligação + + + + Copy Link + Copiar ligação + + + + Only one process is allowed per tab. + Apenas é permitido um processo por separador. + + + + Script Output + Destino do script + + + + Clear + Limpar + + + + FeatherPad does not open files larger than 100 MiB. + Não é possível abrir ficheiros com tamanho superior a 100 Mib. + + + + Non-text file(s) not opened! + Ficheiro(s) não textual(ais) não aberto(s)! + + + + See Preferences → Files → Do not permit opening of non-text files + Ver Preferências → Ficheiros → Não permitir a abertura de ficheiros que não sejam de texto + + + + Some file(s) could not be opened! + Não foi possível abrir alguns ficheiros! + + + + You may not have the permission to read. + Pode ser que você não tenha permissão de leitura. + + + + Uneditable file(s)! + O(s) ficheiro (s) não podem ser editados! + + + + Non-text files or files with huge lines cannot be edited. + Ficheiros que não sejam de texto ou que tenham linhas enormes não podem ser editados. + + + + A previous crash detected! + Ocorreu um erro! + + + + Preferably, close all FeatherPad windows and start again! + Preferencialmente, feche todas as janelas e reinicie a aplicação! + + + + Root Instance + Instância root + + + + + + All Files (*) + Todos os ficheiros (*) + + + + All Files (*);;.%1 Files (*.%1) + Todos os ficheiros (*);; Ficheiros .%1 (*.%1) + + + + Open file... + Abrir ficheiro... + + + + .%1 Files (*.%1);;All Files (*) + Ficheiros .%1 (*.%1);; Todos os ficheiros (*) + + + + + Save as... + Guardar como... + + + + Keep encoding and save as... + Manter codificação e guardar como... + + + + Saving as root. + Guardar como root. + + + + Waiting for authentication... + À espera de autenticação... + + + + "pkexec" is not found. Please install Polkit! + "pkexec" não foi encontrado. Instale o Polkit! + + + + Yes + Sim + + + + No + Não + + + + Cancel + Cancelar + + + + Do you want to use <b>MS Windows</b> end-of-lines? + Deseja utilizar o fim de linhas ao estilo <b>MS Windows</b>? + + + + This may be good for readability under MS Windows. + Esta opção é a correta para ler ficheiros em sistemas Windows. + + + + + + + Cannot be saved! + Não pode ser guardado! + + + + + + + + Help + Ajuda + + + + + + + + + + Syntax + Sintaxe + + + + Huge file(s) not opened! + O(s) ficheiro(s) muito grandes não conseguem ser abertos! + + + + Text tabs are converted to spaces. + Os separadores de texto são convertidas em espaços. + + + + The selected text was too long. + O texto selecionado era muito comprido. + + + + It is not fully processed. + Não foi totalmente processado. + + + + + This file has been modified elsewhere or in another way! + Este ficheiro foi modificado em outro lugar ou de outra maneira! + + + + + Please be careful about reloading or saving this document! + Tenha muito cuidado a recarregar ou guardar este documento! + + + + Printing in progress... + Impressão em andamento... + + + + Print Document + Imprimir documento + + + + Printing completed. + Impressão concluída. + + + + + %1 Pages + %1 Páginas + + + + + Copy Target Path + Copiar caminho do destino + + + + + Open Target Here + Abrir destino aqui + + + + + Open Containing Folder + Abrir pasta de conteúdo + + + + You need to add a Hunspell dictionary. + Tem que adicionar um dicionário Hunspell. + + + + + + See Preferences → Text → Spell Checking! + Consulte Preferências → Texto → Verificação ortográfica! + + + + The Hunspell dictionary does not exist. + O dicionário Hunspell não existe. + + + + The Hunspell dictionary is not accompanied by an affix file. + O dicionário Hunspell não está acompanhado por um ficheiro 'affix'. + + + + + + No misspelling in document. + Não existem erros ortográficos. + + + + + + No misspelling from text cursor. + Nenhum erro ortográfico a partir do cursor de texto. + + + + Spell Checking + Verificação ortográfica + + + + Some files cannot be saved! + Não foi possível guardar todos os ficheiros! + + + + Translators + Tradutores + + + + A lightweight, tabbed, plain-text editor + Um editor de ficheiros poderoso + + + + based on Qt + baseado em Qt + + + + Author + Autor + + + + aka. + aka. + + + + + About FeatherPad + Acerca de Featherpad + + + + No Replacement + Sem substituição + + + + One Replacement + Uma substituição + + + + %Ln Replacements + + %Ln substituição + %Ln substituições + + + + + The first 1000 replacements are highlighted. + As primeiras 1000 substituições são destacadas. + + + + The size limit for syntax highlighting is exceeded. + Excedeu o limite de tamanho para o destaque de sintaxe. + + + + FeatherPad::FileDialog + + + Ctrl+H + Toggle showing hidden files + Ctrl+H + + + + Alt+. + Toggle showing hidden files + Alt+. + + + + FeatherPad::FontDialog + + + Select Font + Selecionar tipo de letra + + + + Programming Fonts + Tipo de letra para programação + + + + + Font: + Tipo de letra: + + + + Size: + Tamanho: + + + + Weight: + Espessura: + + + + Normal + Normal + + + + Medium + Média + + + + Bold + Negrito + + + + Black + Preto + + + + Italic + Itálico + + + + Preview + Pré-visualizar + + + + FeatherPad::LineEdit + + + Clear text (Ctrl+K) + Limpar texto (Ctrl+K) + + + + FeatherPad::PrefDialog + + + Preferences + Preferências + + + + Window + Janela + + + + Window Settings + Definições de janelas + + + + Remember window &size on closing + Memorizar po&sição das janelas + + + + + + + Window frame is excluded. + A moldura é excluída. + + + + Start with this size: + Iniciar com este tamanho: + + + + + px + px + + + + × + × + + + + Enforcing a window position is not recommended +and may not work with some window managers. + Não é recomendada a imposição de uma posição de janela +e pode não funcionar com alguns gestores de janelas. + + + + Remember window &position on closing + Memorizar &posição da janela ao fechar + + + + Most suitable with sessions +but without tab functionality. + Adequado para sessões mas +não pode utilizar separadores. + + + + Uncheck for 1/5 of the width. + Desmarque para 1/5 da largura. + + + + Remember splitter position + Memorizar posição do separador + + + + Do not show &toolbar + Não mos&trar barra de ferramentas + + + + If the menubar is hidden, +a menu button appears on the toolbar. + Se ocultar a barra de menu, aparecerá +um botão de menu na barra de ferramentas. + + + + Do not show &menubar + Não &mostrar barra de menu + + + + Hide search &bar by default + Por definição, ocultar &barra de pesquisa + + + + By default, each search entry +has a separate search history. + Por definição, cada entrada pesquisada +tem um histórico de pesquisa distinto. + + + + Use a shared search history + Utilizar histórico de pesquisa partilhado + + + + Always show st&atus bar + Mostr&ar sempre a barra de estado + + + + Show cursor position on status bar + Mostrar posição do cursor na barra de estado + + + + + Will take effect after closing this dialog. + A alteração será aplicada depois de fechar este diálogo. + + + + Tab position: + Posição do separador: + + + + North + Norte + + + + South + Sul + + + + West + Oeste + + + + East + Este + + + + This means that, for LTR, Alt+Right goes to the first tab +after the last tab is activated, and the same for Alt+Left. + +Tab navigation with mouse wheel is not affected. + Isso significa que, para LTR, Alt+Direita vai para o primeiro separador +depois que o último separador é ativado e o mesmo para Alt+Esquerda. + +A navegação de separadores com a roda do rato não é afetada. + + + + Tab navigation wraps &around + A navegação por &separadores envolve + + + + Close window on closing its last tab + Fechar janela ao fechar o último separador + + + + By default, if a FeatherPad window exists on the +current desktop, files will be opened in its tabs. + +However, some desktop environments may not +report that they have multiple desktops. + Por padrão, se houver uma janela do FeatherPad na +área de trabalho atual, os ficheiros serão abertos em separadores. + +No entanto, alguns ambientes de trabalho podem não +relatar que possuem várias áreas de trabalho. + + + + Always open in separate windows + Abrir sempre em janelas distintas + + + + If this is checked, the file dialog provided by the current +desktop environment will be used instead of the Qt file dialog. + +Some desktop environments, like KDE and LXQt, provide files dialogs. + Se esta opção estiver marcada, a caixa de diálogo de ficheiro fornecida pelo ambiente de trabalho atual +será usada em vez da caixa de diálogo do ficheiro Qt. + +Alguns ambientes de trabalho, como o KDE e o LXQt, fornecem caixas de diálogo de ficheiros. + + + + Native file dialog + Caixa de diálogo nativa + + + + Uncheck for Monospace. + Desmarque para usar letra mono-espaçada. + + + + Remember &font + Memori&zar tipo de letra + + + + This covers parentheses, braces, brackets and quotes. + Abrange parênteses, chaves, chavetas e aspas. + + + + Auto-&bracket + &Parênteses automático + + + + By default, a triple period is replaced with an ellipsis +and a double hyphen with a long dash while typing, +under proper circumstances. + Por padrão, um ponto triplo é substituído por reticências +e um hífen duplo com um traço longo durante a escrita, +sob circunstâncias adequadas. + + + + Replace triple periods and double hyphens while typing + Substitua pontos triplos e hifens duplos ao escrever + + + + Highlight case-sensitive and whole matches +of the selected text. + Destaque maiúsculas e minúsculas e todas as correspondências +do texto selecionado. + + + + Selection highlighting + Destaque de seleção + + + + Never highlight syntax for files > + Não destacar sintaxe para ficheiros > + + + + This creates a menu button on the +status bar for changing the syntax. + Isto cria um botão de menu na barra +de estado para alterar a sintaxe. + + + + Support syntax override + Suportar substituição de sintaxe + + + + Show spaces, tabs and tab lines +when the syntax is highlighted. + Mostrar espaços, separadores e linhas de +separadores quando a sintaxe é realçada. + + + + Show whitespaces + Mostrar espaços vazios + + + + + The vertical position lines will be drawn only if +the editor font has a fixed pitch (like Monospace). + As linhas de posição vertical só serão desenhadas se +a fonte do editor tem um tom fixo (como Monospace). + + + + Show vertical lines starting from this position: + Mostrar linhas verticais com início nesta posição: + + + + Also show line and document ends + Também mostra as extremidades da linha e do documento + + + + Date and time format: + Formato de data e hora: + + + + Some text editors cannot open a document +whose last line is not empty. + Alguns editores de texto não conseguem abrir +um ficheiro se não existir uma linha vazia no fim. + + + + Ensure an empty last line on saving + Certifique-se de que deixa uma linha vazia + + + + Remove trailing spaces on saving + Remover espaços à direita ao guardar + + + + Inertial scrolling with mouse wheel + Inercial com roda do rato + + + + Files + Ficheiros + + + + File Management + Gestão de ficheiros + + + + Start with files of last window + Iniciar com os ficheiros da última janela + + + + + This can be any starting command with +arguments, for example, "xterm -hold" +for running the process in XTerm. + +If the command is left empty, the file +will be executed directly. + +If the script is not run in a terminal +emulator, the output and error messages +will be shown by a popup dialog. + Isto pode ser qualquer comando inicial com +argumentos, por exemplo, "xterm -hold" +para executar o processo no XTerm. + +Se o comando for deixado vazio, o ficheiro +será executado diretamente. + +Se o script não for executado num emulador +de terminal, as mensagens de saída e de erro +serão apresentadas por uma janela. + + + + Start with this command: + Iniciar com este comando: + + + + Command + Arguments + Comando + argumentos + + + + Show recentl&y modified files + Mostrar ficheiros modificados &recentemente + + + + Show recentl&y opened files + Mostrar ficheiros abertos &recentemente + + + + Save changes to opened files every: + Guardar alterações a cada: + + + + Help + Ajuda + + + + Start with side-pane mode + Iniciar com o modo de painel lateral + + + + If this is checked, not only you will lose the informative +tooltip and context menu of a single tab but you could not +merge a single tabbed window into another one by tab drag- +and-drop either. + Se isto estiver marcado, não apenas perderá a dica de +ferramenta informativa e o menu de contexto de um único separador, +mas também não conseguirá unir uma única janela com separadores +em outro, arrastando e soltando o separador. + + + + &Do not show a single tab + Ocultar separa&dor se apenas existir um aberto + + + + Text + Texto + + + + Text Editor + Editor de texto + + + + &Wrap lines by default + &Quebrar linhas por padrão + + + + Auto-&indent by default + Avanço automát&ico por padrão + + + + Always show line &numbers + Mostrar sempre o &número da linha + + + + Highlight s&yntax by default + Por definição, destacar s&intaxe + + + + Dark c&olor scheme + Esquema escur&o + + + + Background color value: + Valor da cor de fundo: + + + + MiB + MiB + + + + This only includes executable files written +in script languages like Shell and Python. + +If it is checked and the opened file is +executable, the file will be executed by clicking +the Run button, that appears on the toolbar/filemenu +when needed, or by its shortcut Ctrl+E. Then, the +process could be killed by Ctrl+Alt+E. + Isto inclui apenas ficheiros executáveis escritos +em linguagens de script como Shell e Python. + +Se a opção estiver marcada e o ficheiro aberto é +executável, o mesmo será executado ao clicar no +botão Executar, que aparece na barra de ferramentas/menu +de ficheiros quando necessário, ou pelo atalho Ctrl+E. Do +mesmo modo, o processo poderia ser terminado por Ctrl+Alt+E. + + + + Needs window reopening to take effect. + Precisa reabrir a janela para entrar em vigor. + + + + + The color value of the background. +255 means white while 0 means black. + +For the light background, it can be +between 230 and 255; for the dark +background, between 0 and 50. + +Needs window reopening to take effect. + O valor da cor do fundo. +255 significa branco, enquanto 0 significa preto. + +Para o fundo claro, pode ser entre 230 e 255; +para o fundo escuro, entre 0 e 50. + +Necessário reabrir a janela para entrar em vigor. + + + + Run executable scripts + Executar scripts executáveis + + + + + The maximum number of recently modified or +opened files FeatherPad shows. The default +is 10. + +Needs application restart to take effect. + O número máximo de ficheirosos recentemente +modificados ou abertos apresentados pelo FeatherPad. +O padrão é 10. + +Necessita de reiniciar a aplicação para entrar em vigor. + + + + + Used for pasting the date and time. + +Takes effect after closing this dialog. + +Leave empty for: +MMM dd, yyyy, hh:mm:ss + Usado para colar a data e hora. + +Entrará em vigor depois de fechar este diálogo. + +Deixar em branco para: +dd, MMM, aaaa, hh:mm:ss + + + + Text tab size: + Tamanho da guia de texto: + + + + spaces + espaços + + + + Thick text cursor + Cursor de texto espesso + + + + Should the mouse wheel scrolling be inertial +if the cursor is inside the text view? + A roda do rato deve ser inercial +se o cursor estiver dentro da visualização de texto? + + + + Spell Checking + Verificação Ortográfica + + + + + A Hunspell dictionary has a name that ends with ".dic" +and should be alongside an affix file with the same +name but ending with ".aff". + Um dicionário Hunspell tem um nome que termina com ".dic" +e deve estar ao lado de um arquivo de afixação com o mesmo +nome, mas terminando com ".aff". + + + + Hunspell dictionary path: + Diretório do dicionário Hunspell: + + + + + Add dictionary... + Adicionar um dicionário... + + + + If this is unchecked, spell checking +will be started from the document start. + Caso estiver desmarcado, a verificação ortográfica +será iniciada a partir do início do documento. + + + + Start spell checking from text cursor + Iniciar verificação ortográfica a partir do cursor de texto + + + + Number of recent files: + Número de ficheiros recentes: + + + + Only if their number is not greater than 50. + Apenas se o seu número não for superior a 50. + + + + + Only for files that exist and can be saved. + Apenas para ficheiros que existem e que podem ser guardados. + + + + min + min + + + + If this is checked, the Save button/menu-item could +be used also when the opened file is not modified. + +This can be useful under certain circumstances, +e.g. for changing the time stamp or removing the +trailing spaces of a text file. + Se estiver marcado, o botão/item de menu Guardar pode +ser usado também quando o ficheiro aberto não for modificado. + +Isso pode ser útil em certas circunstâncias, +p. ex. para alterar o carimbo de data/hora ou remover o +espaços à direita de um ficheiro de texto. + + + + Allow saving unmodified files + Permitir guardar ficheiros não modificados + + + + Show a warning instead. + Mostrar antes um aviso. + + + + Do not permit opening of non-text files + Não permitir a abertura de arquivos que não sejam de texto + + + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + Por padrão, quando os ficheiros são copiados, +eles serão abertos se forem colados no FeatherPad. + + + + Paste paths instead of files + Colar endereços em vez de ficheiros + + + + Shortcuts + Atalhos + + + + Action + Ação + + + + Shortcut + Atalho + + + + Restore default shortcuts. + Restaurar atalhos padrão. + + + + + + Default + Padrão + + + + Syntax Colors + Cores de sintaxe + + + + Element + Elemento + + + + Text Color + Cor do texto + + + + Whitespace color value: + Valor da cor do espaço em branco: + + + + + Has effect only if line numbers are shown. + Tem efeito apenas se os números de linha forem mostrados. + + + + Current line highlight value: + Valor de destaque da linha atual: + + + + Restore default syntax colors. + Restaurar as cores de sintaxe predefinidas. + + + + Close + Fechar + + + + Press a modifier key to clear a shortcut +in the editing mode. + Prima uma tecla modificadora para limpar um atalho +no modo de edição. + + + + Double click a color to change it. + Faça duplo clique numa cor para a alterar. + + + + + files + ficheiros + + + + + file + ficheiro + + + + + Warning: Ambiguous shortcut detected! + Aviso: detetado um atalho ambíguo! + + + + Functions, URLs,… + Funcões, URLs,… + + + + Built-in Functions + Funções integradas + + + + Comments + Comentários + + + + Quotations + Citações + + + + Types + Tipos + + + + Key Words + Palavras chave + + + + Numbers + Números + + + + Regular Expressions, Code Blocks,… + Expressões regulares, Blocos de código,… + + + + Document Blocks, XML/HTML Elements,… + Blocos de documento, Elementos XML/HTML,… + + + + Markdown Headings, CSS Values,… + Cabeçalhos de Markdown, Valores CSS,… + + + + Extra Elements + Elementos extra + + + + Application restart is needed for changes to take effect. + Tem que reiniciar a aplicação para aplicar as alterações. + + + + Window reopening is needed for changes to take effect. + Tem que reabrir esta janela para aplicar as alterações. + + + + &Recently Opened + Abertos &recentemente + + + + Recently &Modified + &Modificados recentemente + + + + The typed shortcut was reserved. + O atalho introduzido já está reservado. + + + + Hunspell Dictionary Files (*.dic) + Arquivos do Dicionário Hunspell (* .dic) + + + + + Select Syntax Color + Selecione a cor da sintaxe + + + + FeatherPad::SearchBar + + + + Search... + Pesquisa... + + + + Match Case + Diferenciar maiúsculas/minúsculas + + + + Whole Word + Palavra inteira + + + + Regular Expression + Expressão regular + + + + Search with regex... + Pesquisar com regex... + + + + Next + Seguinte + + + + Previous + Anterior + + + + FeatherPad::SessionDialog + + + Session Manager + Gestor de sessões + + + + + &Remove + &Remover + + + + <b>Save/Restore Session</b> + <b>Guardar/restaurar sessão</b> + + + + Filter... + Filtrar... + + + + Open the selected session(s). + Abrir a sessão selecionada. + + + + + &Open + &Abrir + + + + + Del + Del + + + + + Ctrl+Del + Ctrl+Del + + + + By default, all files that are opened in all +windows will be included in the saved session. + Por definição, todos os ficheiros que estejam +abertos serão incluídos na sessão guardada. + + + + Save only from this &window + Guardar apenas para esta &janela + + + + <b>Warning</b> + <b>Aviso</b> + + + + + &Yes + &Sim + + + + &No + &Não + + + + Re&name + Re&nomear + + + + Remove &All + Remover &tudo + + + + &Close + Fe&char + + + + Save the current session under the given title. + Guardar a sessão atual introduzindo um nome. + + + + &Save + &Guardar + + + + Type a name to save session + Introduza o nome para a sessão + + + + Nothing saved.<br>No file was opened. + Nada foi guardado.<br>Nenhum ficheiro aberto. + + + + No file exists or can be opened. + O ficheiro não existe ou não pôde ser aberto. + + + + Not all files exist or can be opened. + Nem todos os ficheiros existem ou podem ser abertos. + + + + &OK + &Aceitar + + + + Do you really want to remove all saved sessions? + Tem a certeza de que deseja remover todas as sessões guardadas? + + + + Do you really want to remove the selected sessions? + Tem a certeza de que deseja remover as sessões selecionadas? + + + + Do you really want to remove the selected session? + Tem a certeza de que deseja remover a sessão selecionada? + + + + A session with the same name exists.<br>Do you want to overwrite it? + Já existe uma sessão com este nome.<br>Deseja proceder à sua substituição? + + + + FeatherPad::SidePane + + + Filter... + Filtrar... + + + + FeatherPad::SpellDialog + + + Unknown word: + Palavra desconhecida: + + + + Add To Dictionary + Adicionar ao Dicionário + + + + Replace with: + Substituir por: + + + + Correct Once + Corrigir Uma + + + + Correct All + Corrigir Todas + + + + Ignore Once + Ignore Uma + + + + Ignore All + Ignore Todas + + + + FeatherPad::TextEdit + + + Double click to center current line + Duplo clique para centrar a linha atual + + + diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_ru.ts featherpad-0.17.1/featherpad/data/translations/featherpad_ru.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_ru.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_ru.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Лицензия @@ -12,18 +12,20 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled - Без названия + Безымянный @@ -34,18 +36,18 @@ Select text from cursor to this line (Ctrl+Shift+J) - Выберите текст от курсора до этой строки + Выделит текст от курсора до этой строки (Ctrl+Shift+J) Select Text - Выберите текст + Выделить текст Ctrl+Shift+J - + Ctrl+Shift+J @@ -55,1129 +57,1191 @@ Recently &Modified - &Недавно изменённый + &Недавно изменённые - + &Edit - &Редактировать + &Правка - + &Options - &Настройки + &Параметры - - - + + + Encoding Кодировка - + &Search - &Поиск + По&иск - - + + &Help &Справка - - + + - - Rep&lacement - &Замена + + Replacement + Замена - + Find: Найти: - + To be replaced Подлежит замене - + Replace with: Заменить на: - + Replacing text - Замена текста + Заменяющий текст - + &New &Новый - + New tab Новая вкладка - + Ctrl+N - + Ctrl+N - + &Open &Открыть - + Open a file Открыть файл - + Ctrl+O - + Ctrl+O - - + + &Save &Сохранить - + Save the current tab - Сохранить + Сохранить текущую вкладку - + Ctrl+S - + Ctrl+S - + &Undo &Отменить - + Undo Отменить - + Ctrl+Z - + Ctrl+Z - + &Redo - &Вернуть + &Повторить - + Redo - Вернуть + Повторить - + Ctrl+Shift+Z - + Ctrl+Shift+Z - + Reload - Перезагрузить + Обновить - + Ctrl+Shift+R - + Ctrl+Shift+R - + &Find &Найти - + Ctrl+F - + Ctrl+F - + Show/hide replacement dock Показать/скрыть панель замены - + Ctrl+R - + Ctrl+R - + Sa&ve/Restore Session &Сохранить/Восстановить сеанс - + Ctrl+Shift+S - + Ctrl+Shift+S - + &Print &Печать - + Ctrl+P - + Ctrl+P - + Ctrl+Shift+D - + Ctrl+Shift+D - + &Close &Закрыть - + Ctrl+Shift+Q - + Ctrl+Shift+Q - + &Quit - &Выход + В&ыйти - + Ctrl+Q - + Ctrl+Q - + &Cut - &Вырезать + Выре&зать - + Ctrl+X - + Ctrl+X - + Ctrl+C - + Ctrl+C - + &Paste - &Вставить + Вст&авить - + Ctrl+V - + Ctrl+V - + &Delete &Удалить - + &Select All - &Выделить всё + В&ыделить всё - + Ctrl+A - + Ctrl+A - + &Font &Шрифт - + &Line Numbers &Номер строки - + Ctrl+L - + Ctrl+L - + &Wrap Lines - &Знаки переноса + &Переносить строки - + Ctrl+W - + Ctrl+W - + &Auto-Indentation - &Авто-отступ + &Автоматический отступ - + Ctrl+I - + Ctrl+I - + &Syntax Highlighting - &Подсветка синтаксиса + &Подсвечивать синтаксис - + Ctrl+Shift+H - + Ctrl+Shift+H - + &Preferences - &Параметры + &Настройки - + Ctrl+Shift+P - + Ctrl+Shift+P - + Ctrl+H - + Ctrl+H - + &About &О программе - + Windows Arabic (&CP1256) - Windows Arabic (&CP1256) + Windows Арабская (&CP1256) - + Enforce UTF-8 Кодировка UTF-8 - + &Jump to - &На строку + &Перейти к - + Show/hide jump bar Показать/скрыть панель перехода - + Ctrl+J - + Ctrl+J - + Edit text - Редактировать текст + Править текст - + Ctrl+Shift+E - + Ctrl+Shift+E - + ISO-&8859-15 - + ISO-&8859-15 - + Close Ne&xt Tabs &Закрыть следующие вкладки - + Close &Previous Tabs &Закрыть предыдущие вкладки - + Close &All Tabs &Закрыть все вкладки - + Close &Other Tabs &Закрыть другие вкладки - + Copy File &Path - &Путь к файлу копии + &Путь к копии файла - + Ne&xt Tab &Следующая вкладка - + Previous Ta&b &Предыдущая вкладка - + &Run &Запустить - + Ctrl+E - + Ctrl+E - + &Clear &Очистить - + Clear the list of recently modified files Очистить список недавно изменённых файлов - + Save/Restore Session Сохранить/Восстановить сеанс - + Ctrl+M - + Ctrl+M - + Side-Pane Боковая панель - + Ctrl+Alt+P - + Ctrl+Alt+P - + Paste Date and Time Вставить дату и время - + Ctrl+Shift+V - + Ctrl+Shift+V - + To Upper Case В верхний регистр - + Ctrl+Shift+U - + Ctrl+Shift+U - + To Lower Case В нижний регистр - + Ctrl+Shift+L - + Ctrl+Shift+L + To Start Case + + + + + Last Active Tab Последняя активная вкладка - + F1 F1 - - + + Sort Lines Сортировать строки - - + + Sort Lines Reversely Сортировать строки в обратном порядке - + Check Spelling - Проверить правописание + Проверить орфографию - + F2 F2 - - + + Save All Files Сохранить всё - - + + User Dictionary + Пользовательский словарь + + + + Text Tabs to Spaces - + &Detach Tab &Вставить вкладку - + Ea&st Asian - Восточноазиатские + Восточно&азиатская - + Save &As &Сохранить как - + Documen&t Properties &Свойства документа - + C&opy &Копировать - + UTF-&16 - + UTF-&16 - + Cyrillic (&KOI8-U) Кириллица (&KOI8-U) - + Cyrillic (&ISO-8859-5) Кириллица (&ISO-8859-5) - + Chinese (&GB18030) Китайская (&GB18030) - + Japanese (&ISO-2022-JP-2) Японская (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Японская (ISO-&2022-KR) - + Japa&nese (EUC-JP) - Японская (EUC-JP) + &Японская (EUC-JP) - + K&orean (CP1361) К&орейская (CP1361) - + Korean (&EUC-KR) Корейская (&EUC-KR) - + Save with &Encoding Сохранить в &кодировке - + Ctrl+T - + Ctrl+T - + Execute Запустить - + &Encoding &Кодировка - + &Unicode - &Unicode + &Юникод - + &Western European - &Western European + &Западноевропейская - + &East European - &East European + &Восточноевропейская - + Focus/hide search bar - Фокусировка/скрыть панель поиска + Сфокусировать/скрыть панель поиска - + &Replace - &Замена + &Заменить - + &Other &Другая - + &UTF-8 - + &UTF-8 - + &ISO-8859-1 - + &ISO-8859-1 - + &Windows-1252 - + &Windows-1252 - + &Cyrillic (CP1251) &Кириллица (CP1251) - + &Chinese (BIG5) - &Chinese (BIG5) + &Китайская (BIG5) - + &Japanese (ISO-2022-JP) &Японская (ISO-2022-JP) - + Ja&panese (CP932) - Японская (CP932) + &Японская (CP932) - + &Korean (CP949) - &Korean (CP949) + &Корейская (CP949) - + &Copy File Name &Копировать имя файла - + Alt+Right - + Alt+Вправо - + Alt+Left - + Alt+Влево - + &First Tab &Первая вкладка - + Alt+Down - + Alt+Вниз - + &Last Tab &Последняя вкладка - + Alt+Up - + Alt+Вверх - + Menu Меню - + Calculate number of words (For huge texts, this may be CPU-intensive.) Подсчитать количество слов (для огромных текстов возрастёт нагрузка на ЦПУ) - + Next Следующий - + Previous Предыдущий - + Replace all - Заменить все + Заменить всё - + &Recently Opened - &Недавно открытый + &Недавно открытые - + Close Закрыть - - + + Position: - Позиция: + Положение: - - - + + + Normal - Нормальный + Нормальный - + Please attend to that window or just close its dialog! - Пожалуйста, зайдите в это окно или просто закройте диалог! + Зайдите в это окно или просто закройте его диалог! - - - + + + The file does not exist. Файл не существует. - + &Discard changes - Отменить изменения + &Отклонить изменения - + &Cancel - Отменить + О&тменить - + &No to all - Не ко всем + &Не ко всем - - + + Unsaved Несохранённый - - - + + + Sel. Chars Выделенные символы - + Open Link Открыть ссылку - + Copy Link - Копировать сссылку + Копировать ссылку - + Another process is running in this tab! - Другой процесс работает на этой вкладке! + В этой вкладке запущен ещё один процесс! - + Only one process is allowed per tab. - Только один процесс разрешён на вкладку. + На одну вкладку допускается только один процесс. - + Script Output - Вывод скрипта + Вывод сценария - + Clear Очистить - + Huge file(s) not opened! - Большой файл не открыт! + Большой файл не был открыт! - + FeatherPad does not open files larger than 100 MiB. - FeatherPad не позволяет открывать файлы размером более 100 МБ. + FeatherPad не открывает файлы размером более 100 МиБ. - + Non-text file(s) not opened! - + Файлы, отличные от текстовых не могут быть открыты! - + See Preferences → Files → Do not permit opening of non-text files - + См. Настройки → Файл → Запретить открытие файлов, отличных от текстовых - + Some file(s) could not be opened! Некоторые файлы не могут быть открыты! - + You may not have the permission to read. - Возможно, не хватает прав для доступа. + Возможно, недостаточно прав для доступа. - + Uneditable file(s)! Недоступный(-ые) для редактирования файл(-ы)! - + Non-text files or files with huge lines cannot be edited. Файлы, отличные от текстовых, а также с очень длинными строками, недоступны для редактирования. - + A previous crash detected! - Обнаружен крах программы! + Обнаружен предыдущий сбой! - + Preferably, close all FeatherPad windows and start again! Лучше закрыть все окна FeatherPad и запустить программу снова! - + Root Instance Запущено от имени администратора - - - + + + All Files (*) Все файлы (*) - + All Files (*);;.%1 Files (*.%1) Все файлы (*);;.%1-файлы (*.%1) - + Open file... Открыть файл... - - + + Save as... Сохранить как... - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes Да - + No Нет - + Cancel - Отменить + Отмена - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! Файл был изменён внешней программой! - - + + Please be careful about reloading or saving this document! - Пожалуйста, будте осторожны при перезагрузке или сохранении документа! + Будьте осторожны при перезагрузке или сохранении этого документа! - - + + Printing in progress... + + + + + Printing completed. + + + + + %1 Pages %1 страниц - - + + Copy Target Path - + Копировать целевой путь - - + + Open Target Here + Открыть цель здесь + + + + + Open Containing Folder - + You need to add a Hunspell dictionary. Вам нужно добавить словарь Hunspell. - - - + + + See Preferences → Text → Spell Checking! - Смотрите Настройки → Текст → Проверка правописания! + См. Настройки → Текст → Проверка орфографии! - + The Hunspell dictionary does not exist. - + Словарь Hunspell не найден. - + The Hunspell dictionary is not accompanied by an affix file. - + Словарь Hunspell не сопровождается файлом аффикса. - - - + + + No misspelling in document. В документе нет орфографических ошибок. - - - + + + No misspelling from text cursor. - + Нет текста для поверки орфографии от курсора. - + Spell Checking - Проверка правописания + Проверка орфографии - + Some files cannot be saved! Файлы не могут быть сохранены! - + Translators Переводчики - + A lightweight, tabbed, plain-text editor - Лёгкий, с вкладками, текстовый редактор + Легковесный текстовый редактор со вкладками - - based on Qt5 - на основе Qt5 + + based on Qt + основан на Qt - + Author Автор - + aka. aka. - - - + + + + + Help Справка - - - - - - - - - + + + + + + + + + Lines Строки - + Another FeatherPad window has a modal dialog! Другое окно FeatherPad имеет модальный диалог! - + Save changes? Сохранить изменения? - + The document has been modified. Документ был изменён. - - - + + + Words Слова - + Script File Файл сценария - + .%1 Files (*.%1);;All Files (*) .%1 Файлы (*.%1);;Все файлы (*) - + Keep encoding and save as... Оставить кодировку и сохранить как... - + Do you want to use <b>MS Windows</b> end-of-lines? - Вы хотите использовать <b>MS Windows</b> конец строк? + Хотите использовать конец строки <b>MS Windows</b>? - + This may be good for readability under MS Windows. - Это может быть полезно для удобочитаемости под MS Windows. + Это может быть полезно для удобства чтения под MS Windows. - + + + + Cannot be saved! Не удаётся сохранить! - - - - - - - + + + + + + + Syntax Синтаксис - + Print Document Печать документа - - + + About FeatherPad О FeatherPad - + No Replacement - Нет замены + Без замены - + One Replacement Одна замена - + %Ln Replacements %Ln замена @@ -1186,7 +1250,12 @@ - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. Превышен предельный размер для подсветки синтаксиса. @@ -1197,13 +1266,13 @@ Ctrl+H Toggle showing hidden files - Переключить отображение скрытых файлов + Ctrl+H Alt+. Toggle showing hidden files - Переключить отображение скрытых файлов + Alt+. @@ -1232,37 +1301,37 @@ Weight: - Начертания: + Начертание: Normal - Нормальный + Нормальное Medium - Полужирный + Полужирное Bold - Жирный + Жирное Black - + Очень жирное Italic - Курсивный + Курсив Preview - Пример + Просмотр @@ -1270,7 +1339,7 @@ Clear text (Ctrl+K) - Очистить текст (Ctrl+K) + Удалить текст (Ctrl+K) @@ -1278,7 +1347,7 @@ Preferences - Предпочтения + Настройки @@ -1301,41 +1370,42 @@ Start with this size: - Запуск с этого размера: + Начать с данного размера: px - + пикс × - + × Enforcing a window position is not recommended and may not work with some window managers. - Установка позиции окна не рекомендуется -и может не работать с некоторыми оконными менеджерами. + Установка положения окна не рекомендуется и может +не работать с некоторыми оконными менеджерами. Remember window &position on closing - Запомнить &расположение окна при закрытии + Запомнить &положение окна при закрытии Most suitable with sessions but without tab functionality. - + Наиболее подходит для сессий, +но без вкладок. Uncheck for 1/5 of the width. - + Снимите флажок для 1/5 ширины. @@ -1346,24 +1416,25 @@ If the menubar is hidden, a menu button appears on the toolbar. - Если панель меню скрыта, -на панели инструментов появляется кнопка меню. + При скрытии панели меню, кнопка меню +появится на панели инструментов. By default, each search entry has a separate search history. - + По умолчанию каждая поисковая +запись имеет отдельную историю поиска. Use a shared search history - + Использовать общую историю поиска Show cursor position on status bar - Отображать позицию курсора в строке состояния + Показ позиции курсора в строке состояния @@ -1374,7 +1445,7 @@ Tab position: - Позиция табуляции: + Положение вкладок: @@ -1402,10 +1473,11 @@ after the last tab is activated, and the same for Alt+Left. Tab navigation with mouse wheel is not affected. - Подразумевается, что сочетание Alt+Right перекинет -на крайнюю левую вкладку с крайней правой, и наоборот для Alt+Left. + Подразумевается, что комбинация Alt+Вправо переведёт +на крайнюю левую вкладку с крайней правой, и наоборот +для Alt+Влево. -На навигацию колесом мыши не повлияет. +На навигацию колёсиком мыши не повлияет. @@ -1437,8 +1509,8 @@ desktop environment will be used instead of the Qt file dialog. Some desktop environments, like KDE and LXQt, provide files dialogs. - Если выбрано, будет запущен диалог выбора файла, предоставленный текущим -окружением рабочего стола вместо диалога выбора файлов Qt. + Если выбрано, будет запущен диалог выбора файла, предоставленный +текущим окружением рабочего стола вместо диалога выбора файлов Qt. Некоторые окружения, такие как KDE и LXQt предоставляют собственные диалоги. @@ -1460,107 +1532,122 @@ Auto-&bracket - Автозакрытие скобки + &Автоматическое закрытие скобок By default, a triple period is replaced with an ellipsis and a double hyphen with a long dash while typing, under proper circumstances. - По умолчанию, во время набора текста три точки -заменяются на многоточие, а два дефиса – на тире + По умолчанию, во время ввода текста три точки +заменяются на многоточие, а два дефиса — на тире в нужном контексте. Replace triple periods and double hyphens while typing - Заменять три точки и два дефиса во время набора текста + Заменять три точки и два дефиса при вводе текста + + + + Highlight case-sensitive and whole matches +of the selected text. + - + + Selection highlighting + + + + This creates a menu button on the status bar for changing the syntax. - + Действие создаст кнопку меню в строке +состояния для изменения синтаксиса. - + Support syntax override Поддержка установки синтаксиса - + Show spaces, tabs and tab lines when the syntax is highlighted. - + Показать пробелы, вкладки и строки +вкладок, при выделенном синтаксисе. - + Show whitespaces - Отображать пробелы + Показ пробелов - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). - + Вертикальные полосы будут нарисованы только +в том случае, если шрифт редактора имеет +фиксированную высоту (например, Monospace). - + Show vertical lines starting from this position: - Отображать вертикальные полосы начиная с позиции: + Показ вертикальных полос начиная с позиции: - + Also show line and document ends - + Показ строки в конце документа - + Date and time format: Формат даты и времени: - + Text tab size: - + Размер шрифта: - + spaces - + пробела (-ов) - + Some text editors cannot open a document whose last line is not empty. - Некоторые текстовые редакторы не могут открыть документ, -последняя строка которого не пуста. + Не все текстовые редакторы смогут открыть +документ, последняя строка в котором не пуста. - + Ensure an empty last line on saving - Убедитесь, что пустая последняя строка при сохранении + При сохранении проверять, что последняя срока остаётся пустой - + Remove trailing spaces on saving - + Удалять завершающие пробелы при сохранении - + Thick text cursor - + Широкий курсор текста - + Inertial scrolling with mouse wheel - Инерционная прокрутка колесом мыши + Инерционная прокрутка колёсиком мыши Spell Checking - Проверка правописания + Проверка орфографии @@ -1568,7 +1655,9 @@ A Hunspell dictionary has a name that ends with ".dic" and should be alongside an affix file with the same name but ending with ".aff". - + Словарь Hunspell имеет имя, которое оканчивается на «.dic», +он должен находиться рядом с аффиксным файлом с тем же +именем, но оканчивающимся на «.aff». @@ -1577,20 +1666,21 @@ - + Add dictionary... - Добавить словарь… + Добавить словарь... If this is unchecked, spell checking will be started from the document start. - + Если этот флажок снят, проверка +орфографии начнётся с начала документа. Start spell checking from text cursor - + Начинать проверку орфографии от курсора @@ -1605,7 +1695,7 @@ Start with files of last window - + Начинать с файлов последнего окна @@ -1650,7 +1740,7 @@ min - + мин @@ -1660,12 +1750,16 @@ This can be useful under certain circumstances, e.g. for changing the time stamp or removing the trailing spaces of a text file. - + Если флажок установлен, кнопка/пункт меню «Сохранить» может также +использоваться, даже если в открытый файл не были внесены изменения. + +Это может быть полезно при определённых обстоятельствах, +например для изменения отметки времени или удаления пробелов. Allow saving unmodified files - Разрешить сохранение неизмененных файлов + Разрешить сохранение неизменённых файлов @@ -1675,42 +1769,91 @@ Do not permit opening of non-text files - Не позволять открытие файлов, отличных от текстовых + Запретить открытие файлов, отличных от текстовых - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts - Сочетания клавиш + Комбинации клавиш - + Action Действие - + Shortcut - Сочетание клавиш + Комбинация клавиш - + Restore default shortcuts. - Восстановить сочетания клавиш по умолчанию. + Восстановить комбинации клавиш по умолчанию. - + + + Default По умолчанию - + + Syntax Colors + Цвета синтаксиса + + + + Element + Элемент + + + + Text Color + Цвет текста + + + + Whitespace color value: + Значение цвета пробелов: + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + Восстановить цвета синтаксиса по умолчанию. + + + Help Справка Remember window &size on closing - &Запомнить размер окна при закрытии + Запомнить &размер окна при закрытии @@ -1720,12 +1863,12 @@ Do not show &toolbar - &Не показывать панель инструментов + Скрыть панель &инструментов Do not show &menubar - &Не показывать панель меню + Скрыть &панель меню @@ -1749,8 +1892,8 @@ merge a single tabbed window into another one by tab drag- and-drop either. Если этот флажок установлен, пропадут не только -подсказки и контекстное меню вкладки, -но и нельзя будет объединить одно окно с вкладками с другим +подсказки и контекстное меню вкладки, но и нельзя +будет объединить одно окно с вкладками с другим с помощью перетаскивания вкладки. @@ -1776,24 +1919,17 @@ &Wrap lines by default - &Выделение линий по умолчанию + &Выделять строки по умолчанию - + Background color value: Значение цвета фона: - + MiB - - - - - This is not a complete fix but -prevents annoying scroll jumps. - Это не полное исправление, -но предотвращает раздражающие скачки прокрутки. + МиБ @@ -1805,23 +1941,23 @@ the Run button, that appears on the toolbar/filemenu when needed, or by its shortcut Ctrl+E. Then, the process could be killed by Ctrl+Alt+E. - Это включает только исполняемые файлы, -написанные на языках сценариев, таких как Shell и Python. + Это включает только исполняемые файлы, написанные +на языках сценариев, таких как Shell и Python. -Если это отмечено, и открытый файл исполняемый, то он будет запущен -нажатием кнопки «Запустить», которая появляется на -панели инструментов в меню файла, когда потребуется, -или комбинацией Ctrl+E. -Затем процесс можно завершить на Ctrl+Alt+E. +Если это отмечено, и открытый файл исполняемый, то он будет +запущен нажатием кнопки «Запустить», которая появляется на +панели инструментов в меню файла, когда потребуется, или +комбинацией Ctrl+E. +Затем процесс можно завершить нажатием Ctrl+Alt+E. - + Needs window reopening to take effect. Требуется ещё раз открыть окно. - - + + The color value of the background. 255 means white while 0 means black. @@ -1830,18 +1966,19 @@ background, between 0 and 50. Needs window reopening to take effect. - Значение цвета фона. -255 означает белый, а 0 означает чёрный. + Значение цвета фона. 255 означает +белый, а 0 означает чёрный. -Для светлого фона оно может быть между 230 и 255; -Для тёмного фона - от 0 до 50. +Для светлого фона оно может быть +между 230 и 255; для тёмного фона + - от 0 до 50. Требуется ещё раз открыть окно. Run executable scripts - Запуск исполняемых скриптов + Запускать исполняемые сценарии @@ -1860,7 +1997,7 @@ Auto-&indent by default - &Автоотступ по умолчанию + &Автоматический отступ по умолчанию @@ -1868,46 +2005,42 @@ &Всегда показывать номера строк - + Highlight s&yntax by default - &Выделить синтаксис по умолчанию + &Выделять синтаксис по умолчанию - + Never highlight syntax for files > - Никогда не выделять синтаксис для файлов > + Не выделять синтаксис для файлов > - + Dark c&olor scheme &Тёмная цветовая схема - - + + Used for pasting the date and time. Takes effect after closing this dialog. Leave empty for: MMM dd, yyyy, hh:mm:ss - Используется для вставки даты и -времени. -Вступает в силу после закрытия этого -диалога. + Используется для вставки даты и времени. + +Вступит в силу после закрытия этого диалога. + Оставить пустым для: МММ дд, гггг, чч:мм:сс - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? - - - - - Workaround for &Qt5's scroll jump bug - &Устранение дёрганья при прокрутке на Qt5 + Должна ли прокрутка колёсика мыши быть инерционной, +при расположении курсора внутри текстового поля? @@ -1917,12 +2050,12 @@ Show recentl&y modified files - &Показать недавно изменённые файлы + &Показывать недавно изменённые файлы Show recentl&y opened files - &Показать недавно открытые файлы + &Показывать недавно открытые файлы @@ -1932,97 +2065,169 @@ Save changes to opened files every: - Сохранять изменения в открытых файлах каждые: + Интервал автосохранения открытых файлов: - + Close Закрыть - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + Дважды щёлкните по цвету для его изменения. + + + + files файлы - - + + file файл - - + + Warning: Ambiguous shortcut detected! - + Внимание: обнаружена неоднозначная комбинация! - + + Functions, URLs,… + Функции, URLs,… + + + + Built-in Functions + Встроенные функции + + + + Comments + Комментарии + + + + Quotations + Цитаты + + + + Types + Типы + + + + Key Words + Ключевые слова + + + + Numbers + Числа + + + + Regular Expressions, Code Blocks,… + Регулярные выражения, блоки кода,… + + + + Document Blocks, XML/HTML Elements,… + Блоки документов, элементы XML/HTML,… + + + + Markdown Headings, CSS Values,… + Заголовки Headings, CSS Значения,… + + + + Extra Elements + Дополнительные элементы + + + Application restart is needed for changes to take effect. - Чтобы изменения вступили в силу, необходим перезапуск приложения. + Для вступления изменений в силу, необходим перезапуск приложения. - + Window reopening is needed for changes to take effect. - Для того, чтобы изменения вступили в силу, требуется повторное открытие окна. + Для вступления изменений в силу, требуется повторное открытие окна. - + &Recently Opened &Недавно открытые - + Recently &Modified &Недавно изменённые - + The typed shortcut was reserved. - Введённое сочетание клавиш занято. + Введённая комбинация клавиш уже используется. - + Hunspell Dictionary Files (*.dic) Файлы словаря Hunspell (*.dic) + + + + Select Syntax Color + Выбор цвета синтаксиса + FeatherPad::SearchBar - - + + Search... Поиск... - + Match Case - Учитывать регистр + С учётом регистра - + Whole Word - Целое слово + Слово целиком - + Regular Expression Регулярное выражение - + Search with regex... - Искать с помощью регулярных выражений… + Искать с помощью регулярных выражений... - + Next Следующий - + Previous Предыдущий @@ -2065,29 +2270,30 @@ Del - + Del Ctrl+Del - + Ctrl+Del Remove &All - &Убрать все + &Удалить всё By default, all files that are opened in all windows will be included in the saved session. - + По умолчанию все файлы, которые открываются +во всех окнах, будут включены в сохранённый сеанс. Save only from this &window - Сохранить только из этого &окна + Сохранять только из этого &окна @@ -2096,7 +2302,7 @@ - + &Yes &Да @@ -2108,7 +2314,7 @@ Re&name - &Переименовать + Пере&именовать @@ -2131,50 +2337,50 @@ Введите имя для сохранения сеанса - + Nothing saved.<br>No file was opened. Ничего не сохранено.<br>Файл не был открыт. - + No file exists or can be opened. Файл не существует или не может быть открыт. - + Not all files exist or can be opened. Не все файлы существуют или могут быть открыты. - + &OK &OK - + Do you really want to remove all saved sessions? - Вы действительно хотите удалить все сохраненные сеансы? + Вы действительно хотите удалить все сохранённые сеансы? - + Do you really want to remove the selected sessions? Вы действительно хотите удалить выбранные сеансы? - + Do you really want to remove the selected session? Вы действительно хотите удалить выбранный сеанс? - + A session with the same name exists.<br>Do you want to overwrite it? - Существует сессия с тем же именем.<br>Вы хотите перезаписать её? + Сессия с тем же именем уже существует.<br>Хотите перезаписать её? FeatherPad::SidePane - + Filter... Фильтр... @@ -2220,18 +2426,9 @@ FeatherPad::TextEdit - + Double click to center current line - - - - - FeatherPad::WarningBar - - - - Close - Закрыть + Двойной щелчок по центру текущей строки diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_sk_SK.ts featherpad-0.17.1/featherpad/data/translations/featherpad_sk_SK.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_sk_SK.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_sk_SK.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Licencia @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled Bez mena @@ -53,514 +55,525 @@ - + &Edit &Upraviť - + &Options - - - + + + Encoding Kódovanie - + &Search &Hľadať - - + + &Help - + Find: Nájsť: - + To be replaced K nahradeniu - + Replace with: Nahradiť s: - + Replacing text Nahradiť text - + &New - + New tab - + Ctrl+N - + &Open - + Open a file - + Ctrl+O - - + + &Save &Uložiť - + Save the current tab - + Ctrl+S - + &Undo &Späť - + Undo Späť - + Ctrl+Z - + &Redo &Opakovať - + Redo Opakovať - + Ctrl+Shift+Z - + Reload Znovu načítať - + Ctrl+Shift+R - + &Find &Nájsť - + Ctrl+F - + Show/hide replacement dock - + Ctrl+R - + Save &As &Uložiť ako - + Ctrl+Shift+S - + &Print &Vytlačiť - + Ctrl+P - + Documen&t Properties &Vlastnosti dokumentu - + Ctrl+Shift+D - + &Close &Zatvoriť - + Ctrl+Shift+Q - + &Quit &Ukončiť - + Ctrl+Q - + &Cut &Vystrihnúť - + Ctrl+X - + C&opy &Kopírovať - + Ctrl+C - + &Paste &Prilepiť - + Ctrl+V - + &Delete - + &Select All &Vybrať všetko - + Ctrl+A - + &Font - + &Line Numbers &Číslo riadku - + Ctrl+L - + &Wrap Lines - + Ctrl+W - + &Auto-Indentation - + Ctrl+I - + &Syntax Highlighting - + Ctrl+Shift+H - + &Preferences &Nastavenia - + Ctrl+Shift+P - + Ctrl+H - + &About &O programe - + Enforce UTF-8 - + Save with &Encoding &Uložiť s kódovaním - + &Jump to &Preskočiť na - + Show/hide jump bar - + Ctrl+J - + Edit text Upraviť text - + Ctrl+Shift+E - + &Run &Spustiť - + Ctrl+E - + &Clear &Vyčistiť - + Clear the list of recently modified files Vymazať zoznam nedávno upravených súborov - + Save/Restore Session Uložiť/obnoviť sedenie - + Sa&ve/Restore Session &Uložiť/obnoviť sedenie - + Ctrl+M - + Side-Pane Bočný panel - + Ctrl+Alt+P - + Paste Date and Time Vložiť dátum a čas - + Ctrl+Shift+V - + To Upper Case Veľkými písmenami - + Ctrl+Shift+U - + To Lower Case Malými písmenami - + Ctrl+Shift+L + To Start Case + + + + + Last Active Tab - + F1 - - + + Sort Lines Triediť riadky - - + + Sort Lines Reversely - + Check Spelling Skontrolovať pravopis - + F2 F2 - - + + Save All Files - - + + User Dictionary - + + Text Tabs to Spaces + + + + &Detach Tab - + Ctrl+T - + Close Ne&xt Tabs - + Close &Previous Tabs Zatvoriť kartu vľavo - + Ne&xt Tab - + Previous Ta&b &Predošlá karta - + Execute Vykonať - + Close &All Tabs @@ -570,612 +583,663 @@ &Nedávno upravené - + &Encoding &Kódovanie - + &Unicode - + &Western European - + &East European - + Ea&st Asian &Východná Ázia - - + + - - Rep&lacement - &Nahradiť + + Replacement + Nahradiť - + Focus/hide search bar Zobraziť/skryť panel vyhľadávania - + &Replace &Nahradiť - + Windows Arabic (&CP1256) - + &Other - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) - + Cyrillic (&KOI8-U) - + Cyrillic (&ISO-8859-5) - + &Chinese (BIG5) - + Chinese (&GB18030) - + &Japanese (ISO-2022-JP) &Japonské (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) Japonské (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Japonské (ISO-&2022-KR) - + Ja&panese (CP932) &Japonské (CP932) - + Japa&nese (EUC-JP) &Japonské (EUC-JP) - + &Korean (CP949) - + K&orean (CP1361) &Kórejské (CP1361) - + Korean (&EUC-KR) Kórejské (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs - + &Copy File Name &Kopírovať názov súboru - + Copy File &Path - + Alt+Right - + Alt+Left - + &First Tab - + Alt+Down - + &Last Tab - + Alt+Up - + Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) - + Next Ďalší - + Previous Predošlý - + Replace all Nahradiť všetko - + &Recently Opened &Nedávno otvorené - + Close Zatvoriť - + Save changes? Uložiť zmeny? - + Please attend to that window or just close its dialog! - + The document has been modified. Dokument bol upravený. - + &Discard changes &Zahodiť zmeny - + &Cancel &Prerušiť - + &No to all &Nie všetkým - - + + Unsaved Neuložené - - - - - - - - - + + + + + + + + + Lines Riadky - - - + + + Sel. Chars Vybraté znaky - - - + + + Words Slová - + Another process is running in this tab! - + Script File - + Another FeatherPad window has a modal dialog! - - + + Position: - - - + + + Normal - - - + + + The file does not exist. Súbor neexistuje. - + Open Link Otvoriť link - + Copy Link - + Only one process is allowed per tab. - + Script Output - + Clear Vyčistiť - + FeatherPad does not open files larger than 100 MiB. - + Non-text file(s) not opened! - + See Preferences → Files → Do not permit opening of non-text files - + Some file(s) could not be opened! Niektoré súbory sa nedá otvoriť! - + You may not have the permission to read. Pravdepodobne chýba povolenie k čítaniu. - + Uneditable file(s)! Súbro nemôže byť upravovaný! - + Non-text files or files with huge lines cannot be edited. Nie je možné upravovať súbor, dlhé riadky nemôžu byť upravované. - + A previous crash detected! Bolo zistené predošlé zlyhanie! - + Preferably, close all FeatherPad windows and start again! - + Root Instance Inštancia Root - - - + + + All Files (*) Všetky súbory (*) - + All Files (*);;.%1 Files (*.%1) Všetky súbory (*);;.%1 Súbory (*.%1) - + Open file... - + .%1 Files (*.%1);;All Files (*) .%1 Súbory (*.%1);;Všetky súbory (*) - - + + Save as... Uložiť ako... - + Keep encoding and save as... - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes Áno - + No - + Cancel Prerušiť - + Do you want to use <b>MS Windows</b> end-of-lines? - + This may be good for readability under MS Windows. - + + + + Cannot be saved! Nedá sa uložiť! - - - + + + + + Help - - - - - - - + + + + + + + Syntax - + Huge file(s) not opened! Neotvorené veľké súbory! - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! - - + + Please be careful about reloading or saving this document! - + + Printing in progress... + + + + Print Document Vytlačiť dokument - - + + Printing completed. + + + + + %1 Pages - - + + Copy Target Path - - + + Open Target Here - + + + Open Containing Folder + + + + You need to add a Hunspell dictionary. - - - + + + See Preferences → Text → Spell Checking! Viď predvoľby → Text → Kontrola pravopisu! - + The Hunspell dictionary does not exist. Slovník hunspell neexistuje. - + The Hunspell dictionary is not accompanied by an affix file. - - - + + + No misspelling in document. V dokumente nebol nájdený žiaden preklep. - - - + + + No misspelling from text cursor. Žiaden preklep od textového kurzoru. - + Spell Checking Kontrola pravopisu - + Some files cannot be saved! - + Translators Prekladatelia - + A lightweight, tabbed, plain-text editor - - based on Qt5 - Založené na Qt5 + + based on Qt + Založené na Qt - + Author - + aka. - - + + About FeatherPad O FeatherPad - + No Replacement Žiadna náhrada - + One Replacement Jedno nahradenie - + %Ln Replacements @@ -1184,7 +1248,12 @@ - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. @@ -1495,72 +1564,83 @@ - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > - + This creates a menu button on the status bar for changing the syntax. - + Support syntax override - + Show spaces, tabs and tab lines when the syntax is highlighted. - + Show whitespaces - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). - + Show vertical lines starting from this position: - + Also show line and document ends - + Date and time format: - + Some text editors cannot open a document whose last line is not empty. - + Ensure an empty last line on saving - + Remove trailing spaces on saving - + Inertial scrolling with mouse wheel @@ -1620,7 +1700,7 @@ - + Help @@ -1668,37 +1748,26 @@ - + Highlight s&yntax by default - + Dark c&olor scheme - + Background color value: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - - - - - Workaround for &Qt5's scroll jump bug - - - This only includes executable files written in script languages like Shell and Python. @@ -1711,13 +1780,13 @@ - + Needs window reopening to take effect. - - + + The color value of the background. 255 means white while 0 means black. @@ -1744,8 +1813,8 @@ - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1755,22 +1824,22 @@ - + Text tab size: - + spaces - + Thick text cursor - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? @@ -1795,7 +1864,7 @@ - + Add dictionary... Pridať slovník... @@ -1857,119 +1926,240 @@ - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts - + Action - + Shortcut - + Restore default shortcuts. - + + + Default - + + Syntax Colors + + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + Close - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + + + + + files - - + + file - - + + Warning: Ambiguous shortcut detected! - + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + Application restart is needed for changes to take effect. - + Window reopening is needed for changes to take effect. - + &Recently Opened - + Recently &Modified - + The typed shortcut was reserved. - + Hunspell Dictionary Files (*.dic) Súbor slovníka hunspell (*.dic) + + + + Select Syntax Color + + FeatherPad::SearchBar - - + + Search... - + Match Case - + Whole Word - + Regular Expression - + Search with regex... - + Next - + Previous @@ -2038,7 +2228,7 @@ - + &Yes @@ -2078,42 +2268,42 @@ - + Nothing saved.<br>No file was opened. - + No file exists or can be opened. - + Not all files exist or can be opened. - + &OK - + Do you really want to remove all saved sessions? - + Do you really want to remove the selected sessions? - + Do you really want to remove the selected session? - + A session with the same name exists.<br>Do you want to overwrite it? @@ -2121,7 +2311,7 @@ FeatherPad::SidePane - + Filter... @@ -2167,18 +2357,9 @@ FeatherPad::TextEdit - + Double click to center current line - - FeatherPad::WarningBar - - - - Close - - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_tr.ts featherpad-0.17.1/featherpad/data/translations/featherpad_tr.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_tr.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_tr.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License Lisans @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled İsimsiz @@ -54,520 +56,531 @@ - + &Edit Düz&enle - + &Options &Seçenekler - - - + + + Encoding Reminder: Should really have been "Karakter Kodlama", but trimmed due to space constraints on status bar. Kodlama - + &Search &Arama - - + + &Help &Yardım - + Find: Bul: - + To be replaced Değiştirilecek olan metin - + Replace with: Değiştir: - + Replacing text Yerine konulacak metin - + &New &Yeni - + New tab Yeni sekme - + Ctrl+N - + &Open &Aç - + Open a file Dosya aç - + Ctrl+O - - + + &Save &Kaydet - + Save the current tab Mevcut sekmeyi kaydet - + Ctrl+S - + &Undo &Geri Al - + Undo İşlemi Geri Al - + Ctrl+Z - + &Redo &Tekrarla - + Redo İşlemi Tekrarla - + Ctrl+Shift+Z - + Reload Reminder: Used in both File menu and in the toolbar as a button tip. Therefore, no accelerator used for this message, since it would be seen as plain "&" in the tooltip. Dosyayı Tekrar Yükle - + Ctrl+Shift+R - + &Find &Bul - + Ctrl+F - + Show/hide replacement dock Değiştirme panelini göster/gizle - + Ctrl+R - + Save &As &Farklı Kaydet - + Ctrl+Shift+S - + &Print &Yazdır - + Ctrl+P - + Documen&t Properties Belge &Özellikleri - + Ctrl+Shift+D - + &Close &Kapat - + Ctrl+Shift+Q - + &Quit &Çık - + Ctrl+Q - + &Cut K&es - + Ctrl+X - + C&opy K&opyala - + Ctrl+C - + &Paste &Yapıştır - + Ctrl+V - + &Delete &Sil - + &Select All Tü&münü Seç - + Ctrl+A - + &Font &Yazı Tipi - + &Line Numbers Satır &Numaraları - + Ctrl+L - + &Wrap Lines Satırları &Sar - + Ctrl+W - + &Auto-Indentation Otomatik &Girintile - + Ctrl+I - + &Syntax Highlighting &Sözdizimi Vurgulama - + Ctrl+Shift+H - + &Preferences &Tercihler - + Ctrl+Shift+P - + Ctrl+H - + &About &Hakkında - + Enforce UTF-8 RAPOR 8: Seems to be unused UTF-8'e Zorla - + Save with &Encoding Reminder: Shorthand for "Karakter Kodlamayla Kaydet" - trimmed due to menu width considerations. Kodla&mayla Kaydet - + &Jump to Satıra &Git - + Show/hide jump bar Satıra git çubuğunu göster/gizle - + Ctrl+J - + Edit text Metni düzenle - + Ctrl+Shift+E - + &Run Çalı&ştır - + Ctrl+E - + &Clear &Temizle - + Clear the list of recently modified files RAPOR 4 : As the same message would apparently be used for both recently opened and modified files, I have changed the term "recently modified files" to "recent documents" (stole from libreoffice) Son belgeler listesini temizle - + Save/Restore Session Oturumu Kaydet/Yükle - + Sa&ve/Restore Session RAPOR 1 : Message seems to be unused. &Oturumu Kaydet / Yükle - + Ctrl+M - + Side-Pane Yan Panel - + Ctrl+Alt+P - + Paste Date and Time Tarih ve Zamanı Yapıştır - + Ctrl+Shift+V - + To Upper Case Büyük Harfe Çevir - + Ctrl+Shift+U - + To Lower Case Küçük Harfe Çevir - + Ctrl+Shift+L + To Start Case + Başlatmak İçin + + + + Last Active Tab Son Aktif Sekme - + F1 F1 - - + + Sort Lines Satırları Sırala - - + + Sort Lines Reversely Satırları Tersten Sırala - + Check Spelling - + İmla Denetimi Yap - + F2 F2 - - + + Save All Files - + Tüm Dosyaları Kaydet - - + + User Dictionary - + Kullanıcı Sözlüğü + + + + Text Tabs to Spaces + Boşluklara Metin Sekmeleri - + &Detach Tab Sekmeyi Ayı&r - + Ctrl+T - + Close Ne&xt Tabs &Sonraki Sekmeleri Kapat - + Close &Previous Tabs &Önceki Sekmeleri Kapat - + Ne&xt Tab So&nraki Sekme - + Previous Ta&b &Önceki Sekme - + Execute Çalıştır - + Close &All Tabs Tüm Sekmeleri &Kapat @@ -577,621 +590,671 @@ Son &Değiştirilenler - + &Encoding Karakter &Kodlama - + &Unicode &Unikod - + &Western European &Batı Avrupa - + &East European &Doğu Avrupa - + Ea&st Asian Uzakdoğu &Asya - - + + - - Rep&lacement - RAPOR 2 : No need/use for accelerator. + + Replacement Metin Değiştirme - + Focus/hide search bar Arama çubuğunu göster/gizle - + &Replace &Değiştir - + Windows Arabic (&CP1256) Windows Arapçası (&CP1256) - + &Other &Diğer - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) Kiril (&CP1251) - + Cyrillic (&KOI8-U) Kiril (&KOI8-U) - + Cyrillic (&ISO-8859-5) Kiril (&ISO-8859-5) - + &Chinese (BIG5) &Çince (BIG5) - + Chinese (&GB18030) Çince (&GB18030) - + &Japanese (ISO-2022-JP) &Japonca (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) J&aponca (ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) Ja&ponca (ISO-2022-KR) - + Ja&panese (CP932) Jap&onca (CP932) - + Japa&nese (EUC-JP) Japo&nca (EUC-JP) - + &Korean (CP949) &Korece (CP949) - + K&orean (CP1361) Ko&rece (CP1361) - + Korean (&EUC-KR) Korece (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs Di&ğer Sekmeleri Kapat - + &Copy File Name Dosya İsmini &Kopyala - + Copy File &Path Dosya &Yolunu Kopyala - + Alt+Right Alt+Sağ - + Alt+Left Alt+Sol - + &First Tab İ&lk Sekme - + Alt+Down Alt+Aşağı - + &Last Tab Son Sekm&e - + Alt+Up Alt+Yukarı - + Menu Menü - + Calculate number of words (For huge texts, this may be CPU-intensive.) Kelime sayısını hesapla (Devasa dosyalarda işlemciyi yorabilir.) - + Next Sonraki - + Previous Önceki - + Replace all Hepsini değiştir - + &Recently Opened RAPOR 3 : Only used at initial launch (if recent file criterium is "recently opened"). After changing the criterium from "recently opened" to "recently modified", and then again back to "recently opened" in the Preferences dialog, then this message is never used again. Instead, duplicate of this message in the PrefDialog is used from then on. &Son Açılan Belgeler - + Close Kapat - + Save changes? Değişiklikler kaydedilsin mi? - + Please attend to that window or just close its dialog! Lütfen o pencereyle ilgilenin, en azından o diyaloğu kapatın! - + The document has been modified. Belge değiştirildi. - + &Discard changes Kaydetme - + &Cancel İptal - + &No to all Hepsine &Hayır - - + + Unsaved Kaydedilmedi - - - - - - - - - + + + + + + + + + Lines Satır - - - + + + Sel. Chars Seçim - - - + + + Words Kelime - + Another process is running in this tab! Bu sekmede başka bir süreç çalışıyor! - + Script File Betik Dosyası - + Another FeatherPad window has a modal dialog! Başka FeatherPad penceresinde cevap bekleyen bir diyalog var! - - + + Position: Konum: - - - + + + Normal - - - + + + The file does not exist. Böyle bir dosya yok. - + Open Link Bağlantıyı Aç - + Copy Link Bağlantıyı Kopyala - + Only one process is allowed per tab. Bir sekmede birden fazla süreç çalışamaz. - + Script Output Betik Çıktısı - + Clear Temizle - + FeatherPad does not open files larger than 100 MiB. FeatherPad 100 MB'den büyük dosyaları açmaz. - + Non-text file(s) not opened! - + Metin olmayan dosya(lar) açılmadı! - + See Preferences → Files → Do not permit opening of non-text files - + Tercihler → Dosyalar → Metin olmayan dosyaların açılmasına izin verme bölümüne bakın - + Some file(s) could not be opened! Bazı dosya(lar) açılamadı! - + You may not have the permission to read. Dosyayı okuma yetkiniz olmayabilir. - + Uneditable file(s)! Düzenlenemeyen dosya(lar)! - + Non-text files or files with huge lines cannot be edited. Metin olmayan dosyalar veya aşırı uzun satırlar içeren dosyalar düzenlenemezler. - + A previous crash detected! Evvelki çökme tespit edildi! - + Preferably, close all FeatherPad windows and start again! Tercihen, tüm FeatherPad pencerelerini kapatıp tekrar başlatın! - + Root Instance Yetkili Kullanıcı - - - + + + All Files (*) Tüm Dosyalar (*) - + All Files (*);;.%1 Files (*.%1) Reminder: %1 refers to file type as in ".txt files (*.txt)" Tüm Dosyalar (*);;.%1 Dosyaları (*.%1) - + Open file... Dosya aç... - + .%1 Files (*.%1);;All Files (*) Reminder: %1 refers to file type as in ".txt files (*.txt)" .%1 Dosyaları (*.%1);;Tüm Dosyalar (*) - - + + Save as... Farklı Kaydet... - + Keep encoding and save as... Karakter kodlamayı koruyarak farklı kaydet... - + + Saving as root. + Yönetici olarak kaydediliyor. + + + + Waiting for authentication... + Kimlik doğrulama için bekleniyor... + + + + "pkexec" is not found. Please install Polkit! + "pkexec" bulunamadı. Lütfen Polkit'i kurun! + + + Yes Evet - + No Hayır - + Cancel İptal - + Do you want to use <b>MS Windows</b> end-of-lines? <b>MS Windows</b> satır sonlandırmasını kullanmak istiyor musunuz? - + This may be good for readability under MS Windows. MS Windows'da okunabilirlik açısından iyi olabilir. - + + + + Cannot be saved! Kaydedilemiyor! - - - + + + + + Help Yardım - - - - - - - + + + + + + + Syntax Sözdizimi - + Huge file(s) not opened! Aşırı büyük dosya(lar) açılmadı! - - + + Text tabs are converted to spaces. + Metin sekmeleri boşluklara dönüştürülür. + + + + The selected text was too long. + Seçili metin çok uzundu. + + + + It is not fully processed. + Tam olarak işlenmemiş. + + + + This file has been modified elsewhere or in another way! Bu dosya başka bir yerde veya başka surette değiştirilmiş! - - + + Please be careful about reloading or saving this document! Lütfen bu dosyayı tekrar yüklerken veya kaydederken dikkatli olun! - + + Printing in progress... + Yazdırma devam ediyor ... + + + Print Document Belgeyi Yazdır - - + + Printing completed. + + + + + %1 Pages %1 Sayfa - - + + Copy Target Path Hedef Yolunu Kopyala - - + + Open Target Here Hedefi Buraya Aç - + + + Open Containing Folder + Dosyayı içeren dizini açın + + + You need to add a Hunspell dictionary. - + Hunspell sözlüğü eklemeniz gerekiyor. - - - + + + See Preferences → Text → Spell Checking! - + Tercihler → Metin → İmla Denetimi'ne bakın! - + The Hunspell dictionary does not exist. - + Hunspell sözlüğü mevcut değil. - + The Hunspell dictionary is not accompanied by an affix file. - + Hunspell sözlüğüne bir ek dosyası eşlik etmez. - - - + + + No misspelling in document. - + Belgede yazım hatası yok. - - - + + + No misspelling from text cursor. - + Metin imlecinden yanlış yazım yok. - + Spell Checking - + İmla Denetimi - + Some files cannot be saved! - + Bazı dosyalar kaydedilemez! - + Translators Çevirmenler - + A lightweight, tabbed, plain-text editor RAPOR 7: Please see the other comment. Hafif, sekmeli, düz metin düzenleyici - - based on Qt5 + + based on Qt RAPOR 7: Either has to be put at the start or mid-sentence as part of the features, or has to be added to the end as an afterthought. Because of such things, I suggest this and the preceding message be merged in a single compound sentence. - Qt5 tabanlı + Qt tabanlı - + Author Yazar - + aka. Reminder: Lesser alternatives: "yani" (that is) ; "rumuz" (nick) ; "veya" (or) nam-ı diğer, - - + + About FeatherPad FeatherPad Hakkında - + No Replacement Reminder: Literally "Zero Replacement" (in English "no" negates the expression, whereas in Turkish it should (also) be negated at the verb. Since the verb will either be non-existent or fixed as positive, then "zero replacement [done]" is the only acceptable wording left in Turkish, AFAIK.) Sıfır Değişiklik - + One Replacement Bir Değişiklik - + %Ln Replacements Reminder: Must be singular for enumerated items as in "7 file" but NOT "7 files" @@ -1199,7 +1262,12 @@ - + + The first 1000 replacements are highlighted. + İlk 1000 değiştirme vurgulanmıştır. + + + The size limit for syntax highlighting is exceeded. Sözdizimi vurgulaması için boyut sınırı aşıldı. @@ -1226,58 +1294,58 @@ Select Font - + Yazıtipi Seç Programming Fonts - + Programlama Yazıtipleri Font: - + Yazıtipi: Size: - + Boyut: Weight: - + Ağırlık: Normal - + Normal Medium - + Orta Bold - + Koyu Black - + Siyah Italic - + Yatık Preview - + Önizleme @@ -1338,7 +1406,8 @@ Enforcing a window position is not recommended and may not work with some window managers. - Bir pencere pozisyonunu uygulama önerilmez ve bazı pencere yöneticileriyle çalışmayabilir. + Bir pencere konumunu zorlamak önerilmez +ve bazı pencere yöneticileriyle çalışmayabilir. @@ -1388,12 +1457,13 @@ By default, each search entry has a separate search history. - + Varsayılan olarak, her arama girişi +ayrı bir arama geçmişine sahiptir. Use a shared search history - + Paylaşılan bir arama geçmişi kullanın @@ -1517,85 +1587,99 @@ By default, a triple period is replaced with an ellipsis and a double hyphen with a long dash while typing, under proper circumstances. - + Varsayılan olarak, uygun koşullar altında, yazarken +üçlü nokta üç nokta ve çift kısa çizgi ile uzun bir +çizgi ile değiştirilir. Replace triple periods and double hyphens while typing - + Yazarken üçlü noktaları ve çift kısa çizgileri değiştir + + + + Highlight case-sensitive and whole matches +of the selected text. + Seçili metnin büyük/küçük harfe duyarlı + ve tam eşleşmelerini vurgulayın. + + + + Selection highlighting + Seçim vurgulama - + Never highlight syntax for files > Reminder: MA in caps to stress negation (has double/conflicting meanings) Bundan büyük dosyalarda sözdizimini vurgulama - + This creates a menu button on the status bar for changing the syntax. Sözdizimini değiştirme için durum çubuğunda menü düğmesi oluşturur. - + Support syntax override &Farklı sözdizimi seçme imkanı - + Show spaces, tabs and tab lines when the syntax is highlighted. Sentaks vurgulanırken, boşlukları, sekmeleri ve sekme çizgilerini göster. - + Show whitespaces Boşlukları ve sekmeleri göster - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). Düşey çizgiler sadece sabit genişlikte yazı tipi (Monospace gibi) kullanılıyorsa çizilir. - + Show vertical lines starting from this position: RAPOR 5 : Translated as "Show vertical lines with this spacing" as it seemed more appropriate. Bu aralıklarla düşey &çizgi göster: - + Also show line and document ends &Satır ve belge sonlarını da göster - + Date and time format: Tarih ve zaman biçimi: - + Some text editors cannot open a document whose last line is not empty. Bazı metin düzenleyiciler, son satırı boş olmayan belgeleri açamazlar. - + Ensure an empty last line on saving Kaydederken sonda boş satır olduğundan emin olun - + Remove trailing spaces on saving Kaydederken en sondaki bo&şlukları kırp - + Inertial scrolling with mouse wheel Fare tekeriyle &ataletli kaydırma yap @@ -1663,7 +1747,7 @@ Dosyaları &otomatik kaydetme aralığı: - + Help Yardım @@ -1714,38 +1798,26 @@ Daima satır &numaralarını göster - + Highlight s&yntax by default Öntanımlı olarak sentaksı &vurgula - + Dark c&olor scheme Koyu renk &tarzı - + Background color value: Arkaplan renk değeri: - + MiB MB - - This is not a complete fix but -prevents annoying scroll jumps. - Hakiki bir çözüm olmasa da rahatsız -edici kaydırma atlamalarını engeller. - - - - Workaround for &Qt5's scroll jump bug - &Qt5'in atlamalı kaydırmasına geçici çözüm - - This only includes executable files written in script languages like Shell and Python. @@ -1764,13 +1836,13 @@ Bilahare, program Ctrl+Alt+E ile sonlandırılabilir. - + Needs window reopening to take effect. Yeni pencere açıldığında etkinleşir. - - + + The color value of the background. 255 means white while 0 means black. @@ -1806,8 +1878,8 @@ Uygulama tekrar başlatılınca etkinleşir. - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1825,22 +1897,22 @@ hh=saat ; mm=dakika ; ss=saniye - + Text tab size: Metin sekme genişliği: - + spaces boşluk - + Thick text cursor Kalın metin imleci - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? İmleç metin alanındaysa, fare tekeriyle @@ -1849,7 +1921,7 @@ Spell Checking - + İmla Denetimi @@ -1857,29 +1929,32 @@ A Hunspell dictionary has a name that ends with ".dic" and should be alongside an affix file with the same name but ending with ".aff". - + Hunspell sözlüğünün ".dic" ile biten bir eki vardır +ve aynı ada sahip ancak ".aff" ile biten bir ek +dosyası da yanında yer almalıdır. Hunspell dictionary path: - + Hunspell sözlük yolu: - + Add dictionary... - + Sözlük ekle... If this is unchecked, spell checking will be started from the document start. - + Bu işaretlenmemişse, yazım denetimi + belge başlangıcından başlayacaktır. Start spell checking from text cursor - + İmla denetimini metin imlecinden başlat @@ -1932,120 +2007,243 @@ Metin olmayan dosyaları açma - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + Varsayılan olarak, dosyalar kopyalandığında +FeatherPad'e yapıştırılırsa açılabilir. + + + + Paste paths instead of files + Dosyalar yerine yolları yapıştırın + + + Shortcuts &Kısayollar - + Action İşlem - + Shortcut Kısayol - + Restore default shortcuts. Öntanımlı kısayolları geri yükle. - + + + Default Öntanımlı - + + Syntax Colors + Sözdizimi Renkleri + + + + Element + Öge + + + + Text Color + Metin Rengi + + + + Whitespace color value: + Boşluk rengi değeri: + + + + + Has effect only if line numbers are shown. + Yalnızca satır numaraları gösteriliyorsa etkilidir. + + + + Current line highlight value: + Mevcut satır vurgulama değeri: + + + + Restore default syntax colors. + Varsayılan sözdizimi renklerini geri yükleyin. + + + Close Kapat - - + + Press a modifier key to clear a shortcut +in the editing mode. + Düzenleme modunda bir kısayolu +temizlemek için değiştirici tuşa basın. + + + + Double click a color to change it. + Değiştirmek için bir renge çift tıklayın. + + + + files Reminder: Enumerated items are used in singular (e.g. "7 file" instead of "7 files"). dosya - - + + file dosya - - + + Warning: Ambiguous shortcut detected! Uyarı: Muğlak kısayol tespit edildi! - + + Functions, URLs,… + İşlevler, URL'ler,… + + + + Built-in Functions + Yerleşik İşlevler + + + + Comments + Yorumlar + + + + Quotations + Alıntılar + + + + Types + Türler + + + + Key Words + Anahtar Kelimeler + + + + Numbers + Rakamlar + + + + Regular Expressions, Code Blocks,… + Düzenli İfadeler, Kod Blokları,… + + + + Document Blocks, XML/HTML Elements,… + Belge Blokları, XML / HTML Öğeleri,… + + + + Markdown Headings, CSS Values,… + Markdown Başlıkları, CSS Değerleri,… + + + + Extra Elements + Ekstra Elemanlar + + + Application restart is needed for changes to take effect. Uygulama tekrar başlatılınca değişiklikler etkinleşir. - + Window reopening is needed for changes to take effect. Değişikliklerin etkinleşmesi için yeni pencere açılmalıdır. - + &Recently Opened &Son Açılanlar - + Recently &Modified &Son Değiştirilenler - + The typed shortcut was reserved. Girilen kısayol tahsisli (kullanılamaz). - + Hunspell Dictionary Files (*.dic) - + Hunspell Sözlük Dosyaları (* .dic) + + + + + Select Syntax Color + Sözdizimi Rengini Seçin FeatherPad::SearchBar - - + + Search... Ara... - + Match Case Büyük/Küçük Duyarlı - + Whole Word Tam Kelime - + Regular Expression - + Düzenli İfadeler - + Search with regex... - + regex ile ara ... - + Next Sonraki - + Previous Evvelki @@ -2115,7 +2313,7 @@ - + &Yes &Evet @@ -2155,42 +2353,42 @@ Oturuma bir isim verin - + Nothing saved.<br>No file was opened. Kaydedilmedi.<br>Açık dosya yok. - + No file exists or can be opened. Dosya yok veya açılamıyor. - + Not all files exist or can be opened. Bazı dosya(lar) yok veya açılamıyor. - + &OK &Tamam - + Do you really want to remove all saved sessions? Tüm kayıtlı oturumları silmek istediğinizden emin misiniz? - + Do you really want to remove the selected sessions? Seçilen oturumları silmek istediğinizden emin misiniz? - + Do you really want to remove the selected session? Seçilen oturumu silmek istediğinizden emin misiniz? - + A session with the same name exists.<br>Do you want to overwrite it? Bu isimde bir oturum zaten var.<br>Üzerine yazmak ister misiniz? @@ -2198,7 +2396,7 @@ FeatherPad::SidePane - + Filter... Süzgeç... @@ -2208,54 +2406,45 @@ Unknown word: - + Bilinmeyen kelime: Add To Dictionary - + Sözlüğe Ekle Replace with: - Değiştir: + Değiştir: Correct Once - + Bir Kez Düzelt Correct All - + Tümünü Düzelt Ignore Once - + Bir Kez Yoksay Ignore All - + Hepsini Yoksay FeatherPad::TextEdit - + Double click to center current line Bulunulan satırı ortalamak için çift tıklayın - - FeatherPad::WarningBar - - - - Close - Kapat - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad.ts featherpad-0.17.1/featherpad/data/translations/featherpad.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled @@ -53,514 +55,525 @@ - + &Edit - + &Options - - - + + + Encoding - + &Search - - + + &Help - + Find: - + To be replaced - + Replace with: - + Replacing text - + &New - + New tab - + Ctrl+N - + &Open - + Open a file - + Ctrl+O - - + + &Save - + Save the current tab - + Ctrl+S - + &Undo - + Undo - + Ctrl+Z - + &Redo - + Redo - + Ctrl+Shift+Z - + Reload - + Ctrl+Shift+R - + &Find - + Ctrl+F - + Show/hide replacement dock - + Ctrl+R - + Save &As - + Ctrl+Shift+S - + &Print - + Ctrl+P - + Documen&t Properties - + Ctrl+Shift+D - + &Close - + Ctrl+Shift+Q - + &Quit - + Ctrl+Q - + &Cut - + Ctrl+X - + C&opy - + Ctrl+C - + &Paste - + Ctrl+V - + &Delete - + &Select All - + Ctrl+A - + &Font - + &Line Numbers - + Ctrl+L - + &Wrap Lines - + Ctrl+W - + &Auto-Indentation - + Ctrl+I - + &Syntax Highlighting - + Ctrl+Shift+H - + &Preferences - + Ctrl+Shift+P - + Ctrl+H - + &About - + Enforce UTF-8 - + Save with &Encoding - + &Jump to - + Show/hide jump bar - + Ctrl+J - + Edit text - + Ctrl+Shift+E - + &Run - + Ctrl+E - + &Clear - + Clear the list of recently modified files - + Save/Restore Session - + Sa&ve/Restore Session - + Ctrl+M - + Side-Pane - + Ctrl+Alt+P - + Paste Date and Time - + Ctrl+Shift+V - + To Upper Case - + Ctrl+Shift+U - + To Lower Case - + Ctrl+Shift+L + To Start Case + + + + + Last Active Tab - + F1 - - + + Sort Lines - - + + Sort Lines Reversely - + Check Spelling - + F2 - - + + Save All Files - - + + User Dictionary - - &Detach Tab + + Text Tabs to Spaces + &Detach Tab + + + + Ctrl+T - + Close Ne&xt Tabs - + Close &Previous Tabs - + Ne&xt Tab - + Previous Ta&b - + Execute - + Close &All Tabs @@ -570,619 +583,675 @@ - + &Encoding - + &Unicode - + &Western European - + &East European - + Ea&st Asian - - + + - - Rep&lacement + + Replacement - + Focus/hide search bar - + &Replace - + Windows Arabic (&CP1256) - + &Other - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) - + Cyrillic (&KOI8-U) - + Cyrillic (&ISO-8859-5) - + &Chinese (BIG5) - + Chinese (&GB18030) - + &Japanese (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) - + Ja&panese (CP932) - + Japa&nese (EUC-JP) - + &Korean (CP949) - + K&orean (CP1361) - + Korean (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs - + &Copy File Name - + Copy File &Path - + Alt+Right - + Alt+Left - + &First Tab - + Alt+Down - + &Last Tab - + Alt+Up - + Menu - + Calculate number of words (For huge texts, this may be CPU-intensive.) - + Next - + Previous - + Replace all - + &Recently Opened - + Close - + Save changes? - + Please attend to that window or just close its dialog! - + The document has been modified. - + &Discard changes - + &Cancel - + &No to all - - + + Unsaved - - - - - - - - - + + + + + + + + + Lines - - - + + + Sel. Chars - - - + + + Words - + Another process is running in this tab! - + Script File - + Another FeatherPad window has a modal dialog! - - + + Position: - - - + + + Normal - - - + + + The file does not exist. - + Open Link - + Copy Link - + Only one process is allowed per tab. - + Script Output - + Clear - + FeatherPad does not open files larger than 100 MiB. - + Non-text file(s) not opened! - + See Preferences → Files → Do not permit opening of non-text files - + Some file(s) could not be opened! - + You may not have the permission to read. - + Uneditable file(s)! - + Non-text files or files with huge lines cannot be edited. - + A previous crash detected! - + Preferably, close all FeatherPad windows and start again! - + Root Instance - - - + + + All Files (*) - + All Files (*);;.%1 Files (*.%1) - + Open file... - + .%1 Files (*.%1);;All Files (*) - - + + Save as... - + Keep encoding and save as... - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes - + No - + Cancel - + Do you want to use <b>MS Windows</b> end-of-lines? - + This may be good for readability under MS Windows. - + + + + Cannot be saved! - - - + + + + + Help - - - - - - - + + + + + + + Syntax - + Huge file(s) not opened! - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! - - + + Please be careful about reloading or saving this document! - + + Printing in progress... + + + + Print Document - - + + Printing completed. + + + + + %1 Pages - - + + Copy Target Path - - + + Open Target Here - + + + Open Containing Folder + + + + You need to add a Hunspell dictionary. - - - + + + See Preferences → Text → Spell Checking! - + The Hunspell dictionary does not exist. - + The Hunspell dictionary is not accompanied by an affix file. - - - + + + No misspelling in document. - - - + + + No misspelling from text cursor. - + Spell Checking - + Some files cannot be saved! - + Translators - + A lightweight, tabbed, plain-text editor - - based on Qt5 + + based on Qt - + Author - + aka. - - + + About FeatherPad - + No Replacement - + One Replacement - + %Ln Replacements - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. @@ -1493,72 +1562,83 @@ - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > - + This creates a menu button on the status bar for changing the syntax. - + Support syntax override - + Show spaces, tabs and tab lines when the syntax is highlighted. - + Show whitespaces - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). - + Show vertical lines starting from this position: - + Also show line and document ends - + Date and time format: - + Some text editors cannot open a document whose last line is not empty. - + Ensure an empty last line on saving - + Remove trailing spaces on saving - + Inertial scrolling with mouse wheel @@ -1618,7 +1698,7 @@ - + Help @@ -1666,37 +1746,26 @@ - + Highlight s&yntax by default - + Dark c&olor scheme - + Background color value: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - - - - - Workaround for &Qt5's scroll jump bug - - - This only includes executable files written in script languages like Shell and Python. @@ -1709,13 +1778,13 @@ - + Needs window reopening to take effect. - - + + The color value of the background. 255 means white while 0 means black. @@ -1742,8 +1811,8 @@ - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1753,22 +1822,22 @@ - + Text tab size: - + spaces - + Thick text cursor - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? @@ -1793,7 +1862,7 @@ - + Add dictionary... @@ -1855,119 +1924,240 @@ - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts - + Action - + Shortcut - + Restore default shortcuts. - + + + Default - + + Syntax Colors + + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + Close - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + + + + + files - - + + file - - + + Warning: Ambiguous shortcut detected! - + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + Application restart is needed for changes to take effect. - + Window reopening is needed for changes to take effect. - + &Recently Opened - + Recently &Modified - + The typed shortcut was reserved. - + Hunspell Dictionary Files (*.dic) + + + + Select Syntax Color + + FeatherPad::SearchBar - - + + Search... - + Match Case - + Whole Word - + Regular Expression - + Search with regex... - + Next - + Previous @@ -2036,7 +2226,7 @@ - + &Yes @@ -2076,42 +2266,42 @@ - + Nothing saved.<br>No file was opened. - + No file exists or can be opened. - + Not all files exist or can be opened. - + &OK - + Do you really want to remove all saved sessions? - + Do you really want to remove the selected sessions? - + Do you really want to remove the selected session? - + A session with the same name exists.<br>Do you want to overwrite it? @@ -2119,7 +2309,7 @@ FeatherPad::SidePane - + Filter... @@ -2165,18 +2355,9 @@ FeatherPad::TextEdit - + Double click to center current line - - FeatherPad::WarningBar - - - - Close - - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_zh_CN.ts featherpad-0.17.1/featherpad/data/translations/featherpad_zh_CN.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_zh_CN.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_zh_CN.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License 许可 @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled 无标题 @@ -54,514 +56,525 @@ - + &Edit 编辑(&E) - + &Options 选项(&O) - - - + + + Encoding 编码 - + &Search 搜索(&S) - - + + &Help 帮助(&H) - + Find: 查找: - + To be replaced 要替换的文本 - + Replace with: 替换为: - + Replacing text 替换文本 - + &New 新建(&N) - + New tab 新建标签 - + Ctrl+N - + &Open 打开(&O) - + Open a file 打开文件 - + Ctrl+O - - + + &Save 保存(&S) - + Save the current tab 保存当前标签 - + Ctrl+S - + &Undo 撤销(&U) - + Undo 撤销 - + Ctrl+Z - + &Redo 重做(&R) - + Redo 重做 - + Ctrl+Shift+Z - + Reload 刷新 - + Ctrl+Shift+R - + &Find 查找(&F) - + Ctrl+F - + Show/hide replacement dock 显示/隐藏替换工具栏 - + Ctrl+R - + Save &As 另存为(&A) - + Ctrl+Shift+S - + &Print 打印(&P) - + Ctrl+P - + Documen&t Properties 文档属性(&T) - + Ctrl+Shift+D - + &Close 关闭(&C) - + Ctrl+Shift+Q - + &Quit 退出(&Q) - + Ctrl+Q - + &Cut 剪切(&C) - + Ctrl+X - + C&opy 复制(&O) - + Ctrl+C - + &Paste 粘贴(&P) - + Ctrl+V - + &Delete 删除(&D) - + &Select All 全选(&S) - + Ctrl+A - + &Font 字体(&F) - + &Line Numbers 行数(&L) - + Ctrl+L - + &Wrap Lines 自动换行(&W) - + Ctrl+W - + &Auto-Indentation 自动缩进(&A) - + Ctrl+I - + &Syntax Highlighting 语法高亮(&S) - + Ctrl+Shift+H - + &Preferences 首选项(&P) - + Ctrl+Shift+P - + Ctrl+H - + &About 关于(&A) - + Enforce UTF-8 强制使用 UTF-8 - + Save with &Encoding 保存为编码(&E) - + &Jump to 跳转至(&J) - + Show/hide jump bar 显示/隐藏跳转栏 - + Ctrl+J - + Edit text 编辑文本 - + Ctrl+Shift+E - + &Run 运行(&R) - + Ctrl+E - + &Clear 清除(&C) - + Clear the list of recently modified files 清除最近更改的文件 - + Save/Restore Session 保存/恢复会话 - + Sa&ve/Restore Session 保存/恢复会话(&V) - + Ctrl+M - + Side-Pane 侧边栏 - + Ctrl+Alt+P - + Paste Date and Time 粘贴日期与时间 - + Ctrl+Shift+V - + To Upper Case 转换为大写 - + Ctrl+Shift+U - + To Lower Case 转换为小写 - + Ctrl+Shift+L + To Start Case + 到开始选项 + + + + Last Active Tab 最后激活的标签页 - + F1 F1 - - + + Sort Lines 行排序 - - + + Sort Lines Reversely 反向排序 - + Check Spelling 拼写检查 - + F2 F2 - - + + Save All Files 保存所有文件 - - + + User Dictionary 用户词典 - + + Text Tabs to Spaces + 文本选项到空格 + + + &Detach Tab 分离标签(&D) - + Ctrl+T - + Close Ne&xt Tabs 关闭右侧标签(&X) - + Close &Previous Tabs 关闭左侧标签(&P) - + Ne&xt Tab 下一个标签(&X) - + Previous Ta&b 上一个标签(&B) - + Execute 执行 - + Close &All Tabs 关闭所有标签(&A) @@ -571,620 +584,676 @@ 最近更改的文件(&M) - + &Encoding 编码(&E) - + &Unicode - + &Western European 西欧(&W) - + &East European 东欧(&E) - + Ea&st Asian 东亚(&S) - - + + - - Rep&lacement - 替换(&L) + + Replacement + 替换 - + Focus/hide search bar 显示/隐藏搜索栏 - + &Replace 替换(&R) - + Windows Arabic (&CP1256) Windows 阿拉伯语(&CP1256) - + &Other 其它(&O) - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) 西里尔文(CP1251)(&C) - + Cyrillic (&KOI8-U) 西里尔文(&KOI8-U) - + Cyrillic (&ISO-8859-5) 西里尔文(&ISO-8859-5) - + &Chinese (BIG5) 繁体中文(大五码)(&C) - + Chinese (&GB18030) 简体中文(&GB18030) - + &Japanese (ISO-2022-JP) 日文(ISO-2022-JP)(&J) - + Japanese (&ISO-2022-JP-2) 日文(&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) 日文(ISO-&2022-KR) - + Ja&panese (CP932) 日文(CP932)(&P) - + Japa&nese (EUC-JP) 日文(EUC-JP)(&N) - + &Korean (CP949) 韩文(CP949)(&K) - + K&orean (CP1361) 韩文(CP1361)(&O) - + Korean (&EUC-KR) 韩文(&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs 关闭其它标签(&O) - + &Copy File Name 复制文件名(&C) - + Copy File &Path 复制文件路径(&P) - + Alt+Right Alt+右方向键 - + Alt+Left Alt+左方向键 - + &First Tab 第一个标签(&F) - + Alt+Down Alt+下方向键 - + &Last Tab 最后一个标签(&L) - + Alt+Up Alt+上方向键 - + Menu 菜单 - + Calculate number of words (For huge texts, this may be CPU-intensive.) 统计字数 (对于大量文本,这可能导致 CPU 缓慢。) - + Next 下一个 - + Previous 上一个 - + Replace all 替换所有 - + &Recently Opened 最近打开的文件(&R) - + Close 关闭 - + Save changes? 是否保存更改? - + Please attend to that window or just close its dialog! 请转到那个窗口或关闭其对话框! - + The document has been modified. 文档已更改。 - + &Discard changes 抛弃更改(&D) - + &Cancel 取消(&C) - + &No to all 全不(&N) - - + + Unsaved 未保存 - - - - - - - - - + + + + + + + + + Lines - - - + + + Sel. Chars 选区 - - - + + + Words - + Another process is running in this tab! 另外的进程正在此标签内运行! - + Script File 脚本文件 - + Another FeatherPad window has a modal dialog! 另外的 FeatherPad 窗口弹出了对话框! - - + + Position: 位置: - - - + + + Normal 常规 - - - + + + The file does not exist. 该文件不存在。 - + Open Link 打开链接 - + Copy Link 复制链接 - + Only one process is allowed per tab. 每个标签只允许一个进程。 - + Script Output 脚本输出 - + Clear 清除 - + FeatherPad does not open files larger than 100 MiB. FeatherPad 不能打开大于 100 MiB 的文件。 - + Non-text file(s) not opened! - + 空文本文件没有打开! - + See Preferences → Files → Do not permit opening of non-text files - + 查看 属性 → 文件 → 不允许打开空的文本文件 - + Some file(s) could not be opened! 无法打开某些文件! - + You may not have the permission to read. 您可能没有读取权限。 - + Uneditable file(s)! 文件不可编辑! - + Non-text files or files with huge lines cannot be edited. 无法编辑非文本文件或行数太多的文件。 - + A previous crash detected! 检测到前次崩溃! - + Preferably, close all FeatherPad windows and start again! 建议关闭所有 FeatherPad 窗口并重新启动本程序! - + Root Instance 根实例 - - - + + + All Files (*) 所有文件(*) - + All Files (*);;.%1 Files (*.%1) 所有文件(*);;.%1文件(*.%1) - + Open file... 打开文件... - + .%1 Files (*.%1);;All Files (*) .%1文件(*.%1);;所有文件(*) - - + + Save as... 另存为... - + Keep encoding and save as... 保持编码并另存为... - + + Saving as root. + 以root的方式保存。 + + + + Waiting for authentication... + 等待授权… + + + + "pkexec" is not found. Please install Polkit! + "pkexec" 没有找到。请安装 Polkit! + + + Yes - + No - + Cancel 取消 - + Do you want to use <b>MS Windows</b> end-of-lines? 您是否想使用 <b>Windows</b> 结束行? - + This may be good for readability under MS Windows. 这可能使之适合在 Windows 下阅读。 - + + + + Cannot be saved! 无法保存! - - - + + + + + Help 帮助 - - - - - - - + + + + + + + Syntax 语法 - + Huge file(s) not opened! 未打开大文件! - - + + Text tabs are converted to spaces. + 文本选项被转换成空格。 + + + + The selected text was too long. + 选择的文本太长。 + + + + It is not fully processed. + 还未处理完毕。 + + + + This file has been modified elsewhere or in another way! 此文件已在他处或以其他方式被修改! - - + + Please be careful about reloading or saving this document! 请小心刷新或保存此文档! - + + Printing in progress... + 正在打印... + + + Print Document 打印文档 - - + + Printing completed. + 打印完成。 + + + + %1 Pages %1 页 - - + + Copy Target Path 复制目标路径 - - + + Open Target Here 在此打开目标 - + + + Open Containing Folder + 打开包含文件夹 + + + You need to add a Hunspell dictionary. 你需要添加一个Hunspell字典。 - - - + + + See Preferences → Text → Spell Checking! 请参阅首选项→文本→拼写检查! - + The Hunspell dictionary does not exist. Hunspell字典不存在。 - + The Hunspell dictionary is not accompanied by an affix file. Hunspell字典没有附带词缀文件。 - - - + + + No misspelling in document. 文档中没有拼写错误。 - - - + + + No misspelling from text cursor. 文本光标没有拼写错误。 - + Spell Checking 拼写检查 - + Some files cannot be saved! - 某些文件无法保存 + 某些文件无法保存! - + Translators 转换器 - + A lightweight, tabbed, plain-text editor 轻量级标签式纯文本编辑器 - - based on Qt5 - 基于 Qt5 + + based on Qt + 基于 Qt - + Author 作者 - + aka. - - + + About FeatherPad 关于 FeatherPad - + No Replacement 无替换 - + One Replacement 一次替换 - + %Ln Replacements %Ln 次替换 - + + The first 1000 replacements are highlighted. + 前1000个替换项高亮。 + + + The size limit for syntax highlighting is exceeded. 超出了语法突出显示的大小限制。 @@ -1220,17 +1289,17 @@ Font: - 字体 + 字体: Size: - 大小 + 大小: Weight: - 粗细 + 粗细: @@ -1505,72 +1574,84 @@ 键入时替换三重句点和双连字符 - + + Highlight case-sensitive and whole matches +of the selected text. + 高亮区分大小写并整体匹配 +所选文本中。 + + + + Selection highlighting + 高亮选中 + + + Never highlight syntax for files > 禁用语法高亮于文件大小 > - + This creates a menu button on the status bar for changing the syntax. 如勾选,则将在状态栏上创建一个按钮,用于更改语法。 - + Support syntax override 支持语法重写 - + Show spaces, tabs and tab lines when the syntax is highlighted. 语法高亮时显示空格、缩进与缩进行。 - + Show whitespaces 用语法高亮显示空格 - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). 垂直位置行只会在编辑器字体点数固定时绘制。 - + Show vertical lines starting from this position: 显示从此位置开始的竖行: - + Also show line and document ends 也显示行与文档结尾 - + Date and time format: 日期与时间格式: - + Some text editors cannot open a document whose last line is not empty. 某些文本编辑器只能打开最后一行为空的文档。 - + Ensure an empty last line on saving 确保保存时在文档末尾留下一行空白 - + Remove trailing spaces on saving 保存时移除结尾空白 - + Inertial scrolling with mouse wheel 鼠标滚论滚动时带惯性 @@ -1634,7 +1715,7 @@ 自动保存时间间隔: - + Help 帮助 @@ -1683,37 +1764,26 @@ 总是显示行数(&N) - + Highlight s&yntax by default 默认语法高亮(&Y) - + Dark c&olor scheme 暗色主题(&O) - + Background color value: 背景颜色值: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - 此修复并不完善,但避免了烦人的滚动跳转。 - - - - Workaround for &Qt5's scroll jump bug - 修复 &Qt5 滚动时跳转错误 - - This only includes executable files written in script languages like Shell and Python. @@ -1732,13 +1802,13 @@ Ctrl+Alt+E 结束脚本运行。 - + Needs window reopening to take effect. 需要重新开启窗口以生效。 - - + + The color value of the background. 255 means white while 0 means black. @@ -1771,8 +1841,8 @@ 需要重新启动应用程序以生效。 - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1783,22 +1853,22 @@ 默认格式为:MMM dd, yyyy, hh:mm:ss - + Text tab size: 文本tab缩进: - + spaces 空格 - + Thick text cursor 文本光标 - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? 如光标在文本视图内,鼠标滚轮滚动是否应带惯性? @@ -1825,7 +1895,7 @@ - + Add dictionary... 添加词典...... @@ -1893,119 +1963,240 @@ 不允许打开非文本文件 - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + 一般情况下,被复制的文件粘贴进 FeatherPad ,这些文件会被打开。 + + + + Paste paths instead of files + 粘贴路径而不是文件 + + + Shortcuts 快捷方式 - + Action 动作 - + Shortcut 快捷方式 - + Restore default shortcuts. 恢复默认快捷方式。 - + + + Default 默认 - + + Syntax Colors + 语法颜色 + + + + Element + 元素 + + + + Text Color + 文本颜色 + + + + Whitespace color value: + 空格颜色值: + + + + + Has effect only if line numbers are shown. + 仅在显示行号时有效。 + + + + Current line highlight value: + 当前行高亮值: + + + + Restore default syntax colors. + 恢复默认语法颜色。 + + + Close 关闭 - - + + Press a modifier key to clear a shortcut +in the editing mode. + 在编辑模式下,按修饰键清除快捷方式。 + + + + Double click a color to change it. + 双击一个颜色来修改它。 + + + + files 文件 - - + + file 文件 - - + + Warning: Ambiguous shortcut detected! 警告:检测到不明确的快捷方式! - + + Functions, URLs,… + 方法,链接,… + + + + Built-in Functions + 内建功能 + + + + Comments + 评论 + + + + Quotations + 报价单 + + + + Types + 类型 + + + + Key Words + 关键字 + + + + Numbers + 数字 + + + + Regular Expressions, Code Blocks,… + 正则表达式,代码块等… + + + + Document Blocks, XML/HTML Elements,… + 文档块,XML / HTML元素,… + + + + Markdown Headings, CSS Values,… + Markdown 标题, CSS 值,… + + + + Extra Elements + 扩展元素 + + + Application restart is needed for changes to take effect. 需要重新启动应用程序以使更改生效。 - + Window reopening is needed for changes to take effect. 需要重新开启窗口以生效。 - + &Recently Opened 最近打开的文件(&R) - + Recently &Modified 最近更改的文件(&M) - + The typed shortcut was reserved. 输入的快捷方式已被保留。 - + Hunspell Dictionary Files (*.dic) Hunspell字典文件(* .dic) + + + + Select Syntax Color + 选中的语法颜色 + FeatherPad::SearchBar - - + + Search... 搜索... - + Match Case 区分大小写 - + Whole Word 全字匹配 - + Regular Expression 正则表达式 - + Search with regex... 用正则表达式搜索... - + Next 下一个 - + Previous 上一个 @@ -2075,7 +2266,7 @@ - + &Yes 是(&Y) @@ -2115,42 +2306,42 @@ 输入名称以保存会话 - + Nothing saved.<br>No file was opened. 未保存任何文件。<br>未打开任何文件。 - + No file exists or can be opened. 没有可以打开的文件。 - + Not all files exist or can be opened. 某些文件不存在或无法打开。 - + &OK 确定(&O) - + Do you really want to remove all saved sessions? 您确定要移除所有已保存的会话吗? - + Do you really want to remove the selected sessions? 您确定要移除选中的会话吗? - + Do you really want to remove the selected session? 您确定要移除选中的会话吗? - + A session with the same name exists.<br>Do you want to overwrite it? 已有同名会话。<br>是否覆盖? @@ -2158,7 +2349,7 @@ FeatherPad::SidePane - + Filter... 过滤器... @@ -2204,18 +2395,9 @@ FeatherPad::TextEdit - + Double click to center current line 双击以居中当前行 - - FeatherPad::WarningBar - - - - Close - 关闭 - - diff -Nru featherpad-0.12.1/featherpad/data/translations/featherpad_zh_TW.ts featherpad-0.17.1/featherpad/data/translations/featherpad_zh_TW.ts --- featherpad-0.12.1/featherpad/data/translations/featherpad_zh_TW.ts 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/data/translations/featherpad_zh_TW.ts 2021-01-06 17:57:35.000000000 +0000 @@ -4,7 +4,7 @@ FeatherPad::AboutDialog - + License 授權條款 @@ -12,16 +12,18 @@ FeatherPad::FPwin - - - - - - - - - - + + + + + + + + + + + + Untitled 未命名 @@ -54,514 +56,525 @@ - + &Edit 編輯(&E) - + &Options 選項(&O) - - - + + + Encoding 字元編碼 - + &Search 搜尋(&S) - - + + &Help 尋求幫助(&H) - + Find: 尋找: - + To be replaced 要取代的文字 - + Replace with: 取代為: - + Replacing text 取代文字 - + &New 新建(&N) - + New tab 新分頁 - + Ctrl+N - + &Open 開啟(&O) - + Open a file 開啟檔案 - + Ctrl+O - - + + &Save 儲存(&S) - + Save the current tab 儲存目前的分頁 - + Ctrl+S - + &Undo 復原(&U) - + Undo 復原 - + Ctrl+Z - + &Redo 重做(&R) - + Redo 重做 - + Ctrl+Shift+Z - + Reload 重新載入 - + Ctrl+Shift+R - + &Find 尋找(&F) - + Ctrl+F - + Show/hide replacement dock - + Ctrl+R - + Save &As 儲存為(&A) - + Ctrl+Shift+S - + &Print 列印(&P) - + Ctrl+P - + Documen&t Properties 文件屬性(&T) - + Ctrl+Shift+D - + &Close 關閉(&C) - + Ctrl+Shift+Q - + &Quit 退出(&Q) - + Ctrl+Q - + &Cut 剪下(&C) - + Ctrl+X - + C&opy 複製(&O) - + Ctrl+C - + &Paste 貼上(&P) - + Ctrl+V - + &Delete 刪除(&D) - + &Select All 全選(&S) - + Ctrl+A - + &Font 字型(&F) - + &Line Numbers 列號(&L) - + Ctrl+L - + &Wrap Lines 自動換列(&W) - + Ctrl+W - + &Auto-Indentation 自動縮排(&A) - + Ctrl+I - + &Syntax Highlighting 語法標示(&S) - + Ctrl+Shift+H - + &Preferences 偏好設定(&P) - + Ctrl+Shift+P - + Ctrl+H - + &About 關於(&A) - + Enforce UTF-8 強制 UTF-8 - + Save with &Encoding 使用編碼儲存(&E) - + &Jump to 跳到(&J) - + Show/hide jump bar - + Ctrl+J - + Edit text 編輯文字 - + Ctrl+Shift+E - + &Run 執行(&R) - + Ctrl+E - + &Clear 清除(&C) - + Clear the list of recently modified files 清除最近修改的檔案清單 - + Save/Restore Session 儲存/還原工作階段 - + Sa&ve/Restore Session 儲存/還原工作階段(&V) - + Ctrl+M - + Side-Pane 側邊窗格 - + Ctrl+Alt+P - + Paste Date and Time 貼上日期和時間 - + Ctrl+Shift+V - + To Upper Case 轉換為大寫 - + Ctrl+Shift+U - + To Lower Case 轉換為小寫 - + Ctrl+Shift+L + To Start Case + + + + + Last Active Tab 上次使用的分頁 - + F1 - - + + Sort Lines 排序列 - - + + Sort Lines Reversely 反向排序列 - + Check Spelling 檢查拼字 - + F2 - - + + Save All Files 儲存所有檔案 - - + + User Dictionary - + + Text Tabs to Spaces + + + + &Detach Tab 分離分頁(&D) - + Ctrl+T - + Close Ne&xt Tabs 關閉下一個分頁(&X) - + Close &Previous Tabs 關閉上一個分頁(&P) - + Ne&xt Tab 下一個分頁(&X) - + Previous Ta&b 上一個分頁(&B) - + Execute 執行 - + Close &All Tabs 關閉所有分頁(&A) @@ -571,620 +584,676 @@ 最近修改(&M) - + &Encoding 編碼(&E) - + &Unicode - + &Western European - + &East European - + Ea&st Asian - - + + - - Rep&lacement - 取代(&L) + + Replacement + 取代 - + Focus/hide search bar - + &Replace 取代(&R) - + Windows Arabic (&CP1256) - + &Other 其他(&O) - + &UTF-8 - + UTF-&16 - + &ISO-8859-1 - + &Windows-1252 - + &Cyrillic (CP1251) - + Cyrillic (&KOI8-U) - + Cyrillic (&ISO-8859-5) - + &Chinese (BIG5) - + Chinese (&GB18030) - + &Japanese (ISO-2022-JP) - + Japanese (&ISO-2022-JP-2) - + Japanese (ISO-&2022-KR) - + Ja&panese (CP932) - + Japa&nese (EUC-JP) - + &Korean (CP949) - + K&orean (CP1361) - + Korean (&EUC-KR) - + ISO-&8859-15 - + Close &Other Tabs 關閉其他分頁(&O) - + &Copy File Name 複製檔案名稱(&C) - + Copy File &Path 複製檔案路徑(&P) - + Alt+Right Alt+右 - + Alt+Left Alt+左 - + &First Tab 第一個分頁(&F) - + Alt+Down - + &Last Tab 最後一個分頁(&L) - + Alt+Up Alt+上 - + Menu 選單 - + Calculate number of words (For huge texts, this may be CPU-intensive.) 計算字數 (如果文字量大,這可能需要大量 CPU。) - + Next 下一個 - + Previous 上一個 - + Replace all 全部取代 - + &Recently Opened 最近開啟(&R) - + Close 關閉 - + Save changes? 要儲存變更嗎? - + Please attend to that window or just close its dialog! - + The document has been modified. 文件已修改。 - + &Discard changes 捨棄變更(&D) - + &Cancel 取消(&C) - + &No to all 全部皆否(&N) - - + + Unsaved 未儲存 - - - - - - - - - + + + + + + + + + Lines - - - + + + Sel. Chars 選取字元 - - - + + + Words 文字 - + Another process is running in this tab! 在這個分頁中有另一個程序正在執行! - + Script File 腳本檔案 - + Another FeatherPad window has a modal dialog! - - + + Position: 位置: - - - + + + Normal 正常 - - - + + + The file does not exist. 檔案不存在。 - + Open Link 開啟連結 - + Copy Link 複製連結 - + Only one process is allowed per tab. 一個分頁只允許一個程序。 - + Script Output 腳本輸出 - + Clear 清除 - + FeatherPad does not open files larger than 100 MiB. FeatherPad 無法開啟大於 100 MiB 的檔案。 - + Non-text file(s) not opened! - + See Preferences → Files → Do not permit opening of non-text files - + Some file(s) could not be opened! 無法開啟一些檔案! - + You may not have the permission to read. 您可能沒有讀取權限。 - + Uneditable file(s)! 無法編輯的檔案! - + Non-text files or files with huge lines cannot be edited. 無法編輯非文字檔案或具有長列的檔案。 - + A previous crash detected! 偵測到之前當機! - + Preferably, close all FeatherPad windows and start again! - + Root Instance - - - + + + All Files (*) 所有檔案 (*) - + All Files (*);;.%1 Files (*.%1) 所有檔案 (*);;.%1 檔案 (*.%1) - + Open file... 開啟檔案... - + .%1 Files (*.%1);;All Files (*) .%1 檔案 (*.%1);;所有檔案 (*) - - + + Save as... 儲存為... - + Keep encoding and save as... 保持編碼並儲存為... - + + Saving as root. + + + + + Waiting for authentication... + + + + + "pkexec" is not found. Please install Polkit! + + + + Yes - + No - + Cancel 取消 - + Do you want to use <b>MS Windows</b> end-of-lines? 您要使用 <b>MS Windows</b> 行尾嗎? - + This may be good for readability under MS Windows. - + + + + Cannot be saved! 無法儲存! - - - + + + + + Help 說明 - - - - - - - + + + + + + + Syntax 語法 - + Huge file(s) not opened! 未開啟大檔案! - - + + Text tabs are converted to spaces. + + + + + The selected text was too long. + + + + + It is not fully processed. + + + + + This file has been modified elsewhere or in another way! 這個檔案已在其他地方或以另一種方式修改! - - + + Please be careful about reloading or saving this document! 在重新載入或儲存這個文件時請小心! - + + Printing in progress... + + + + Print Document 列印文件 - - + + Printing completed. + + + + + %1 Pages %1 頁 - - + + Copy Target Path 複製目標路徑 - - + + Open Target Here 在這裡開啟目標 - + + + Open Containing Folder + + + + You need to add a Hunspell dictionary. 您需要加入 Hunspell 字典。 - - - + + + See Preferences → Text → Spell Checking! 檢視偏好設定 → 文字 → 拼字檢查! - + The Hunspell dictionary does not exist. Hunspell 字典不存在。 - + The Hunspell dictionary is not accompanied by an affix file. - - - + + + No misspelling in document. 文件中沒有拼字錯誤。 - - - + + + No misspelling from text cursor. - + Spell Checking 拼字檢查 - + Some files cannot be saved! 無法儲存一些檔案! - + Translators 譯者 - + A lightweight, tabbed, plain-text editor 輕量、具有分頁、純文字編輯器 - - based on Qt5 - 基於 Qt5 + + based on Qt + 基於 Qt - + Author 作者 - + aka. - - + + About FeatherPad 關於 FeatherPad - + No Replacement 沒有取代 - + One Replacement 一個取代 - + %Ln Replacements %Ln 個取代 - + + The first 1000 replacements are highlighted. + + + + The size limit for syntax highlighting is exceeded. 超過語法標示的大小限制。 @@ -1497,72 +1566,83 @@ - + + Highlight case-sensitive and whole matches +of the selected text. + + + + + Selection highlighting + + + + Never highlight syntax for files > - + This creates a menu button on the status bar for changing the syntax. - + Support syntax override 支援語法覆蓋 - + Show spaces, tabs and tab lines when the syntax is highlighted. - + Show whitespaces 顯示空格 - + The vertical position lines will be drawn only if the editor font has a fixed pitch (like Monospace). - + Show vertical lines starting from this position: - + Also show line and document ends - + Date and time format: 日期和時間格式: - + Some text editors cannot open a document whose last line is not empty. - + Ensure an empty last line on saving - + Remove trailing spaces on saving - + Inertial scrolling with mouse wheel @@ -1622,7 +1702,7 @@ 儲存開啟檔案的變更每: - + Help 說明 @@ -1670,37 +1750,26 @@ 總是顯示列號(&N) - + Highlight s&yntax by default - + Dark c&olor scheme 暗色配色方案(&O) - + Background color value: 背景顏色值: - + MiB - - This is not a complete fix but -prevents annoying scroll jumps. - - - - - Workaround for &Qt5's scroll jump bug - - - This only includes executable files written in script languages like Shell and Python. @@ -1713,13 +1782,13 @@ - + Needs window reopening to take effect. 需要重新開啟視窗才能生效。 - - + + The color value of the background. 255 means white while 0 means black. @@ -1746,8 +1815,8 @@ - - + + Used for pasting the date and time. Takes effect after closing this dialog. @@ -1757,22 +1826,22 @@ - + Text tab size: 文字 tab 大小 - + spaces 空格 - + Thick text cursor - + Should the mouse wheel scrolling be inertial if the cursor is inside the text view? @@ -1797,7 +1866,7 @@ - + Add dictionary... 加入字典... @@ -1859,119 +1928,240 @@ 不允許開啟非文字檔案 - + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + + + Paste paths instead of files + + + + Shortcuts 快速鍵 - + Action 動作 - + Shortcut 快速鍵 - + Restore default shortcuts. 還原預設快速鍵。 - + + + Default 預設值 - + + Syntax Colors + + + + + Element + + + + + Text Color + + + + + Whitespace color value: + + + + + + Has effect only if line numbers are shown. + + + + + Current line highlight value: + + + + + Restore default syntax colors. + + + + Close 關閉 - - + + Press a modifier key to clear a shortcut +in the editing mode. + + + + + Double click a color to change it. + + + + + files 檔案 - - + + file 檔案 - - + + Warning: Ambiguous shortcut detected! - + + Functions, URLs,… + + + + + Built-in Functions + + + + + Comments + + + + + Quotations + + + + + Types + + + + + Key Words + + + + + Numbers + + + + + Regular Expressions, Code Blocks,… + + + + + Document Blocks, XML/HTML Elements,… + + + + + Markdown Headings, CSS Values,… + + + + + Extra Elements + + + + Application restart is needed for changes to take effect. - + Window reopening is needed for changes to take effect. - + &Recently Opened 最近開啟(&R) - + Recently &Modified 最近修改(&M) - + The typed shortcut was reserved. - + Hunspell Dictionary Files (*.dic) Hunspell 字典檔 (*.dic) + + + + Select Syntax Color + + FeatherPad::SearchBar - - + + Search... 搜尋... - + Match Case 符合大小寫 - + Whole Word 整個文字 - + Regular Expression - + Search with regex... - + Next - + Previous @@ -2040,7 +2230,7 @@ - + &Yes @@ -2080,42 +2270,42 @@ - + Nothing saved.<br>No file was opened. - + No file exists or can be opened. - + Not all files exist or can be opened. - + &OK - + Do you really want to remove all saved sessions? - + Do you really want to remove the selected sessions? - + Do you really want to remove the selected session? - + A session with the same name exists.<br>Do you want to overwrite it? @@ -2123,7 +2313,7 @@ FeatherPad::SidePane - + Filter... 過濾器... @@ -2169,18 +2359,9 @@ FeatherPad::TextEdit - + Double click to center current line - - FeatherPad::WarningBar - - - - Close - 關閉 - - diff -Nru featherpad-0.12.1/featherpad/encoding.cpp featherpad-0.17.1/featherpad/encoding.cpp --- featherpad-0.12.1/featherpad/encoding.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/encoding.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2019 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -25,8 +25,8 @@ * Homepage: http://tarot.freeshell.org/leafpad/ */ - -#include // getenv +#include +#include // getenv (not used but, maybe, for *BSD) #include // CODESET, nl_langinfo #include // uint8_t, uint32_t #include // needed by FreeBSD for setlocale @@ -119,33 +119,33 @@ static unsigned int getLocaleNum() { static unsigned int code = 0; // for me - std::string env; - const char *lcAll = getenv ("LC_ALL"); - const char *lang = getenv ("LANG"); - int j = 1; - - if (lcAll) - env = lcAll; - if (env.empty() && lang != NULL) - /* if there's no value for all locales, - get the native language, e.g. en_US.utf8*/ - env = lang; - if (!env.empty() && env.length() >= 2) - while (code == 0 && j < TOTAL_NUM) + QStringList langs (QLocale::system().uiLanguages()); + if (!langs.isEmpty()) + { + QString lang = langs.first().replace ('-', '_'); + if (lang.length() >= 2) { - for (int i = 0; i < MAX_COUNTRY_NUM; i++) + std::string env = lang.toStdString(); + if (!env.empty() && env.length() >= 2) { - if (countryTable[j][i].empty()) - break; - if (env.compare (0, countryTable[j][i].length(), countryTable[j][i]) == 0) + int j = 1; + while (code == 0 && j < TOTAL_NUM) { - code = j; - break; + for (int i = 0; i < MAX_COUNTRY_NUM; i++) + { + if (countryTable[j][i].empty()) + break; + if (env.compare (0, countryTable[j][i].length(), countryTable[j][i]) == 0) + { + code = j; + break; + } + } + j++; } } - j++; } - + } return code; } /*************************/ @@ -166,8 +166,10 @@ while (c != '\0') { if (c >= 0x41 && c <= 0x7A) + { /* ordinary Latin letters */ xl ++; + } else if (c >= 0x80 && c <= 0x9F) { noniso = true; @@ -177,15 +179,19 @@ /* Arabic or Cyrillic letters */ xac ++; if (c >= 0xC0 && c <= 0xCF) + { /* Cyrillic capital letters */ xcC++; + } else if (c >= 0xD0 && c <= 0xDF) { /* Cyrillic capital letters again */ xcC1++; if (c == 0xDE || c == 0xDF) + { /* not used in ISO-8859-15 (Icelandic or German) */ noniso15 = true; + } } else if (c >= 0xE0) { @@ -195,11 +201,15 @@ if (c == 0xE0 || c == 0xE2 || (c >= 0xE7 && c <= 0xEB) || c == 0xEE || c == 0xEF || c == 0xF4 || c == 0xF9 || c == 0xFB || c == 0xFC) + { xcna ++; + } /* Arabic LAM to HEH */ else if (c == 0xE1 || c == 0xE3 || c == 0xE4 || c == 0xE5 || c == 0xE6) + { xa++; + } } } c = *text++; @@ -219,7 +229,7 @@ charset = "ISO-8859-1"; else if (xcC + xcC1 < xcS && xcna > 0) { - if (noniso || noniso15) // FIXME: this is very inefficient + if ((noniso || noniso15) && xcC > 0) // FIXME: this is very inefficient charset = "CP1251"; // Cyrillic-1251 else charset = "ISO-8859-15"; @@ -260,10 +270,14 @@ if (c == 0xE0 || c == 0xE2 || (c >= 0xE7 && c <= 0xEB) || c == 0xEE || c == 0xEF || c == 0xF4 || c == 0xF9 || c == 0xFB || c == 0xFC) + { xcna ++; + } else if (c == 0xE1 || c == 0xE3 || c == 0xE4 || c == 0xE5 || c == 0xE6) + { xa++; + } } } c = *text++; @@ -425,7 +439,9 @@ else if (c == 0x52 || c == 0x72 || c == 0x92 || (c > 0x9D && c < 0xA1) || c == 0xB2 || (c > 0xBD && c < 0xC1) || c == 0xD2 || (c > 0xDD && c < 0xE1) || c == 0xF2 || c == 0xFE) + { charset = "CP949"; + } } else if (c >= 0xA1 && c <= 0xC6) { @@ -439,7 +455,9 @@ charset = "CP949"; else if (c == 0xB2 || (c > 0xBD && c < 0xC1) || c == 0xD2 || (c > 0xDD && c < 0xE1) || c == 0xF2 || c == 0xFE) + { nonjohab = true; + } } } else if (c > 0xC6 && c <= 0xD3) diff -Nru featherpad-0.12.1/featherpad/featherpad.pro featherpad-0.17.1/featherpad/featherpad.pro --- featherpad-0.12.1/featherpad/featherpad.pro 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/featherpad.pro 2021-01-06 17:57:35.000000000 +0000 @@ -1,3 +1,9 @@ +lessThan(QT_MAJOR_VERSION, 6) { + lessThan(QT_MINOR_VERSION, 12) { + error("FeatherPad needs at least Qt 5.12.0") + } +} + QT += core gui \ widgets \ printsupport \ @@ -30,12 +36,14 @@ brackets.cpp \ syntax.cpp \ highlighter-sh.cpp \ + highlighter-css.cpp \ highlighter-html.cpp \ highlighter-patterns.cpp \ highlighter-regex.cpp \ highlighter-perl-regex.cpp \ vscrollbar.cpp \ loading.cpp \ + printing.cpp \ tabpage.cpp \ searchbar.cpp \ session.cpp \ @@ -58,6 +66,7 @@ config.h \ pref.h \ loading.h \ + printing.h \ messagebox.h \ tabpage.h \ searchbar.h \ diff -Nru featherpad-0.12.1/featherpad/find.cpp featherpad-0.17.1/featherpad/find.cpp --- featherpad-0.12.1/featherpad/find.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/find.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -24,390 +24,15 @@ namespace FeatherPad { /* This order is preserved everywhere for selections: - current line -> replacement -> found matches -> bracket matches */ + current line -> replacement -> found matches -> selection highlights -> bracket matches */ -/************************************************************************ - ***** Qt's backward search has some bugs. Therefore, we do our own ***** - ***** backward search by using the following two static functions. ***** - ************************************************************************/ -static bool findBackwardInBlock (const QTextBlock &block, const QString &str, int offset, - QTextCursor &cursor, QTextDocument::FindFlags flags) -{ - Qt::CaseSensitivity cs = !(flags & QTextDocument::FindCaseSensitively) - ? Qt::CaseInsensitive : Qt::CaseSensitive; - - QString text = block.text(); - text.replace (QChar::Nbsp, QLatin1Char (' ')); - - /* WARNING: QString::lastIndexOf() returns -1 if the position, from which the - backward search is done, is the position of the block's last cursor. - The following workaround compensates for this illogical behavior. */ - if (offset > 0 && offset == text.length()) - -- offset; - - int idx = -1; - while (offset >= 0 && offset <= text.length()) - { - idx = text.lastIndexOf (str, offset, cs); - if (idx == -1) - return false; - if (flags & QTextDocument::FindWholeWords) - { - const int start = idx; - const int end = start + str.length(); - if ((start != 0 && text.at (start - 1).isLetterOrNumber()) - || (end != text.length() && text.at (end).isLetterOrNumber())) - { // if this is not a whole word, continue the backward search - offset = idx - 1; - idx = -1; - continue; - } - } - cursor.setPosition (block.position() + idx); - cursor.setPosition (cursor.position() + str.length(), QTextCursor::KeepAnchor); - return true; - } - return false; -} - -static bool findBackward (const QTextDocument *txtdoc, const QString &str, - QTextCursor &cursor, QTextDocument::FindFlags flags) -{ - if (!str.isEmpty() && !cursor.isNull()) - { - int pos = cursor.anchor() - - str.size(); // we don't want a match with the cursor inside it - if (pos >= 0) - { - QTextBlock block = txtdoc->findBlock (pos); - int blockOffset = pos - block.position(); - while (block.isValid()) - { - if (findBackwardInBlock (block, str, blockOffset, cursor, flags)) - return true; - block = block.previous(); - blockOffset = block.length() - 1; // newline is included in QTextBlock::length() - } - } - } - cursor = QTextCursor(); - return false; -} -/*************************/ -// This method extends the searchable strings to those with line breaks. -// It also corrects the behavior of Qt's backward search and can set an -// end limit to the forward search. -QTextCursor FPwin::finding (const QString& str, const QTextCursor& start, QTextDocument::FindFlags flags, - bool isRegex, const int end) const -{ - /* let's be consistent first */ - if (ui->tabWidget->currentIndex() == -1 || str.isEmpty()) - return QTextCursor(); // null cursor - - QTextDocument *txtdoc = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()) - ->textEdit()->document(); - QTextCursor res = start; - if (isRegex) // multiline matches aren't supported - { - QRegularExpression regexp (str, (flags & QTextDocument::FindCaseSensitively) - ? QRegularExpression::NoPatternOption - : QRegularExpression::CaseInsensitiveOption); - if (!regexp.isValid()) - return QTextCursor(); - QTextCursor cursor = start; - QRegularExpressionMatch match; - if (!(flags & QTextDocument::FindBackward)) - { - cursor.setPosition (qMax (cursor.anchor(), cursor.position())); // as with ordinary search - while (!cursor.atEnd()) - { - if (!cursor.atBlockEnd()) // otherwise, it'll be returned with ".*" - { - if (end > 0 && cursor.anchor() > end) - break; - int indx = cursor.block().text().indexOf (regexp, cursor.positionInBlock(), &match); - if (indx > -1) - { - if (match.capturedLength() == 0) // no empty match (with "\w*", for example) - { - cursor.setPosition (cursor.position() + 1); - continue; - } - if (end > 0 && indx + cursor.block().position() > end) - break; - res.setPosition (indx + cursor.block().position()); - res.setPosition (res.position() + match.capturedLength(), QTextCursor::KeepAnchor); - return res; - } - } - if (!cursor.movePosition (QTextCursor::NextBlock)) - break; - } - } - else // with a backward search, the block/doc start should also be checked - { - cursor.setPosition (cursor.anchor()); // as with ordinary search - while (true) - { - const int bp = cursor.block().position(); - int indx = cursor.block().text().lastIndexOf (regexp, cursor.position() - bp, &match); - if (indx > -1) - { - if (match.capturedLength() == 0 // no empty match - /* the match start should be before the search start */ - || bp + indx == start.anchor()) - { - if (cursor.atBlockStart()) - { - if (!cursor.movePosition (QTextCursor::PreviousBlock)) - break; - cursor.movePosition (QTextCursor::EndOfBlock); - } - else - cursor.setPosition (cursor.position() - 1); - continue; - } - res.setPosition (indx + bp); - res.setPosition (res.position() + match.capturedLength(), QTextCursor::KeepAnchor); - return res; - } - if (!cursor.movePosition (QTextCursor::PreviousBlock)) - break; - cursor.movePosition (QTextCursor::EndOfBlock); - } - } - return QTextCursor(); - } - else if (str.contains ('\n')) - { - QTextCursor cursor = start; - QTextCursor found; - QStringList sl = str.split ("\n"); - int i = 0; - Qt::CaseSensitivity cs = !(flags & QTextDocument::FindCaseSensitively) - ? Qt::CaseInsensitive : Qt::CaseSensitive; - QString subStr; - if (!(flags & QTextDocument::FindBackward)) - { - /* this loop searches for the consecutive - occurrences of newline separated strings */ - while (i < sl.count()) - { - if (i == 0) // the first string - { - subStr = sl.at (0); - /* when the first string is empty... */ - if (subStr.isEmpty()) - { - /* ... search anew from the next block */ - cursor.movePosition (QTextCursor::EndOfBlock); - if (end > 0 && cursor.anchor() > end) - return QTextCursor(); - res.setPosition (cursor.position()); - if (!cursor.movePosition (QTextCursor::NextBlock)) - return QTextCursor(); - ++i; - } - else - { - if ((found = txtdoc->find (subStr, cursor, flags)).isNull()) - return QTextCursor(); - if (end > 0 && found.anchor() > end) - return QTextCursor(); - cursor.setPosition (found.position()); - /* if the match doesn't end the block... */ - while (!cursor.atBlockEnd()) - { - /* ... move the cursor to right and search until a match is found */ - cursor.movePosition (QTextCursor::EndOfBlock); - cursor.setPosition (cursor.position() - subStr.length()); - if ((found = txtdoc->find (subStr, cursor, flags)).isNull()) - return QTextCursor(); - if (end > 0 && found.anchor() > end) - return QTextCursor(); - cursor.setPosition (found.position()); - } - - res.setPosition (found.anchor()); - if (!cursor.movePosition (QTextCursor::NextBlock)) - return QTextCursor(); - ++i; - } - } - else if (i != sl.count() - 1) // middle strings - { - /* when the next block's test isn't the next string... */ - if (QString::compare (cursor.block().text(), sl.at (i), cs) != 0) - { - /* ... reset the loop cautiously */ - cursor.setPosition (res.position()); - if (!cursor.movePosition (QTextCursor::NextBlock)) - return QTextCursor(); - i = 0; - continue; - } - - if (!cursor.movePosition (QTextCursor::NextBlock)) - return QTextCursor(); - ++i; - } - else // the last string (i == sl.count() - 1) - { - subStr = sl.at (i); - if (subStr.isEmpty()) break; - if (!(flags & QTextDocument::FindWholeWords)) - { - /* when the last string doesn't start the next block... */ - if (!cursor.block().text().startsWith (subStr, cs)) - { - /* ... reset the loop cautiously */ - cursor.setPosition (res.position()); - if (!cursor.movePosition (QTextCursor::NextBlock)) - return QTextCursor(); - i = 0; - continue; - } - cursor.setPosition (cursor.anchor() + subStr.count()); - break; - } - else - { - if ((found = txtdoc->find (subStr, cursor, flags)).isNull() - || found.anchor() != cursor.position()) - { - cursor.setPosition (res.position()); - if (!cursor.movePosition (QTextCursor::NextBlock)) - return QTextCursor(); - i = 0; - continue; - } - cursor.setPosition (found.position()); - break; - } - } - } - res.setPosition (cursor.position(), QTextCursor::KeepAnchor); - } - else // backward search - { - cursor.setPosition (cursor.anchor()); - int endPos = cursor.position(); - while (i < sl.count()) - { - if (i == 0) // the last string - { - subStr = sl.at (sl.count() - 1); - if (subStr.isEmpty()) - { - cursor.movePosition (QTextCursor::StartOfBlock); - endPos = cursor.position(); - if (!cursor.movePosition (QTextCursor::PreviousBlock)) - return QTextCursor(); - cursor.movePosition (QTextCursor::EndOfBlock); - ++i; - } - else - { - if (!findBackward (txtdoc, subStr, cursor, flags)) - return QTextCursor(); - /* if the match doesn't start the block... */ - while (cursor.anchor() > cursor.block().position()) - { - /* ... move the cursor to left and search backward until a match is found */ - cursor.setPosition (cursor.block().position() + subStr.count()); - if (!findBackward (txtdoc, subStr, cursor, flags)) - return QTextCursor(); - } - - endPos = cursor.position(); - if (!cursor.movePosition (QTextCursor::PreviousBlock)) - return QTextCursor(); - cursor.movePosition (QTextCursor::EndOfBlock); - ++i; - } - } - else if (i != sl.count() - 1) // the middle strings - { - if (QString::compare (cursor.block().text(), sl.at (sl.count() - i - 1), cs) != 0) - { // reset the loop if the block text doesn't match - cursor.setPosition (endPos); - if (!cursor.movePosition (QTextCursor::PreviousBlock)) - return QTextCursor(); - cursor.movePosition (QTextCursor::EndOfBlock); - i = 0; - continue; - } - - if (!cursor.movePosition (QTextCursor::PreviousBlock)) - return QTextCursor(); - cursor.movePosition (QTextCursor::EndOfBlock); - ++i; - } - else // the first string - { - subStr = sl.at (0); - if (subStr.isEmpty()) break; - if (!(flags & QTextDocument::FindWholeWords)) - { - /* when the first string doesn't end the previous block... */ - if (!cursor.block().text().endsWith (subStr, cs)) - { - /* ... reset the loop */ - cursor.setPosition (endPos); - if (!cursor.movePosition (QTextCursor::PreviousBlock)) - return QTextCursor(); - cursor.movePosition (QTextCursor::EndOfBlock); - i = 0; - continue; - } - cursor.setPosition (cursor.anchor() - subStr.count()); - break; - } - else - { - found = cursor; // block end - if (!findBackward (txtdoc, subStr, found, flags) - || found.position() != cursor.position()) - { - cursor.setPosition (endPos); - if (!cursor.movePosition (QTextCursor::PreviousBlock)) - return QTextCursor(); - cursor.movePosition (QTextCursor::EndOfBlock); - i = 0; - continue; - } - cursor.setPosition (found.anchor()); - break; - } - } - } - res.setPosition (cursor.anchor()); - res.setPosition (endPos, QTextCursor::KeepAnchor); - } - } - else // there's no line break - { - if (!(flags & QTextDocument::FindBackward)) - { - res = txtdoc->find (str, start, flags); - if (end > 0 && res.anchor() > end) - return QTextCursor(); - } - else - findBackward (txtdoc, str, res, flags); - } - - return res; -} -/*************************/ void FPwin::find (bool forward) { if (!isReady()) return; - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; - TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); TextEdit *textEdit = tabPage->textEdit(); QString txt = tabPage->searchEntry(); bool newSrch = false; @@ -418,7 +43,7 @@ } disconnect (textEdit, &TextEdit::resized, this, &FPwin::hlight); - disconnect (textEdit, &TextEdit::updateRect, this, &FPwin::hlighting); + disconnect (textEdit, &TextEdit::updateRect, this, &FPwin::hlight); disconnect (textEdit, &QPlainTextEdit::textChanged, this, &FPwin::hlight); if (txt.isEmpty()) @@ -428,6 +53,7 @@ textEdit->setGreenSel (es); // not needed if (ui->actionLineNumbers->isChecked() || ui->spinBox->isVisible()) es.prepend (textEdit->currentLineSelection()); + es.append (textEdit->getBlueSel()); es.append (textEdit->getRedSel()); textEdit->setExtraSelections (es); return; @@ -438,7 +64,7 @@ if (!forward) newFlags = searchFlags | QTextDocument::FindBackward; QTextCursor start = textEdit->textCursor(); - QTextCursor found = finding (txt, start, newFlags, tabPage->matchRegex()); + QTextCursor found = textEdit->finding (txt, start, newFlags, tabPage->matchRegex()); if (found.isNull()) { @@ -446,7 +72,7 @@ start.movePosition (QTextCursor::End, QTextCursor::MoveAnchor); else start.movePosition (QTextCursor::Start, QTextCursor::MoveAnchor); - found = finding (txt, start, newFlags, tabPage->matchRegex()); + found = textEdit->finding (txt, start, newFlags, tabPage->matchRegex()); } if (!found.isNull()) @@ -455,23 +81,26 @@ /* this is needed for selectionChanged() to be emitted */ if (newSrch) textEdit->setTextCursor (start); start.setPosition (found.position(), QTextCursor::KeepAnchor); + textEdit->skipSelectionHighlighting(); textEdit->setTextCursor (start); } /* matches highlights should come here, after the text area is scrolled and even when no match is found (it may be added later) */ hlight(); connect (textEdit, &QPlainTextEdit::textChanged, this, &FPwin::hlight); - connect (textEdit, &TextEdit::updateRect, this, &FPwin::hlighting); + connect (textEdit, &TextEdit::updateRect, this, &FPwin::hlight); connect (textEdit, &TextEdit::resized, this, &FPwin::hlight); } /*************************/ // Highlight found matches in the visible part of the text. void FPwin::hlight() const { - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + /* When FeatherPad's window is being closed, it's possible that, in a moment, + the current index is positive but the current widget is null. So, the latter + should be checked, not the former. */ + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; - TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); TextEdit *textEdit = tabPage->textEdit(); const QString txt = textEdit->getSearchedText(); @@ -495,11 +124,8 @@ start.setPosition (startPos); else start.setPosition (0); - int w = textEdit->geometry().width(); - int h = textEdit->geometry().height(); - /* get the visible text to check if - the search string is inside it */ - Point = QPoint (w, h); + /* get the visible text to check if the search string is inside it */ + Point = QPoint (textEdit->geometry().width(), textEdit->geometry().height()); QTextCursor end = textEdit->cursorForPosition (Point); int endLimit = end.anchor(); int endPos = end.position() + (!tabPage->matchRegex() ? txt.length() : 0); @@ -512,7 +138,7 @@ Qt::CaseSensitivity cs = tabPage->matchCase() ? Qt::CaseSensitive : Qt::CaseInsensitive; if (tabPage->matchRegex() || str.contains (txt, cs)) // don't waste time if the searched text isn't visible { - while (!(found = finding (txt, start, searchFlags, tabPage->matchRegex(), endLimit)).isNull()) + while (!(found = textEdit->finding (txt, start, searchFlags, tabPage->matchRegex(), endLimit)).isNull()) { QTextEdit::ExtraSelection extra; extra.format.setBackground (color); @@ -526,25 +152,21 @@ so that it always comes first when it exists */ if (ui->actionLineNumbers->isChecked() || ui->spinBox->isVisible()) es.prepend (textEdit->currentLineSelection()); - /* append red highlights */ + /* append blue and red highlights */ + es.append (textEdit->getBlueSel()); es.append (textEdit->getRedSel()); textEdit->setExtraSelections (es); } /*************************/ -void FPwin::hlighting (const QRect&, int dy) const -{ - if (dy) hlight(); -} -/*************************/ void FPwin::searchFlagChanged() { if (!isReady()) return; - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; /* deselect text for consistency */ - TextEdit *textEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (index))->textEdit(); + TextEdit *textEdit = tabPage->textEdit(); QTextCursor start = textEdit->textCursor(); if (start.hasSelection()) { @@ -559,10 +181,13 @@ { TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); QTextDocument::FindFlags searchFlags = QTextDocument::FindFlags(); - if (tabPage->matchWhole()) - searchFlags = QTextDocument::FindWholeWords; - if (tabPage->matchCase()) - searchFlags |= QTextDocument::FindCaseSensitively; + if (tabPage != nullptr) + { + if (tabPage->matchWhole()) + searchFlags = QTextDocument::FindWholeWords; + if (tabPage->matchCase()) + searchFlags |= QTextDocument::FindCaseSensitively; + } return searchFlags; } diff -Nru featherpad-0.12.1/featherpad/fp.ui featherpad-0.17.1/featherpad/fp.ui --- featherpad-0.12.1/featherpad/fp.ui 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/fp.ui 2021-01-06 17:57:35.000000000 +0000 @@ -200,8 +200,11 @@ + + + @@ -330,13 +333,13 @@ Qt::PreventContextMenu - QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable + QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable Qt::BottomDockWidgetArea|Qt::TopDockWidgetArea - Rep&lacement + Replacement 8 @@ -1149,6 +1152,14 @@ Ctrl+Shift+L + + + To Start Case + + + To Start Case + + false @@ -1203,6 +1214,11 @@ User Dictionary + + + Text Tabs to Spaces + + diff -Nru featherpad-0.12.1/featherpad/fpwin.cpp featherpad-0.17.1/featherpad/fpwin.cpp --- featherpad-0.12.1/featherpad/fpwin.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/fpwin.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2019 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -29,13 +29,14 @@ #include "session.h" #include "fontDialog.h" #include "loading.h" +#include "printing.h" #include "warningbar.h" #include "svgicons.h" #include #include -//#include -//#include +#include +#include #include #include #include // std::ofstream @@ -44,33 +45,29 @@ #include #include #include +#include #include #include +#include #ifdef HAS_X11 #include "x11.h" #endif -namespace FeatherPad { - -void BusyMaker::waiting() { - QTimer::singleShot (timeout, this, &BusyMaker::makeBusy); -} - -void BusyMaker::makeBusy() { - if (QGuiApplication::overrideCursor() == nullptr) - QGuiApplication::setOverrideCursor (QCursor (Qt::WaitCursor)); - emit finished(); -} +#define MAX_LAST_WIN_FILES 50 +namespace FeatherPad { -FPwin::FPwin (QWidget *parent):QMainWindow (parent), dummyWidget (nullptr), ui (new Ui::FPwin) +FPwin::FPwin (QWidget *parent, bool standalone):QMainWindow (parent), dummyWidget (nullptr), ui (new Ui::FPwin) { ui->setupUi (this); + standalone_ = standalone; + + locked_ = false; + closePreviousPages_ = false; loadingProcesses_ = 0; rightClicked_ = -1; - busyThread_ = nullptr; autoSaver_ = nullptr; autoSaverRemainingTime_ = -1; @@ -139,6 +136,8 @@ } /* exceptions */ defaultShortcuts_.insert (ui->actionSaveAllFiles, QKeySequence()); + defaultShortcuts_.insert (ui->actionSoftTab, QKeySequence()); + defaultShortcuts_.insert (ui->actionStartCase, QKeySequence()); defaultShortcuts_.insert (ui->actionUserDict, QKeySequence()); defaultShortcuts_.insert (ui->actionFont, QKeySequence()); @@ -185,9 +184,13 @@ ui->actionUTF_8->setChecked (true); ui->actionOther->setDisabled (true); - /* see TabBar::mouseMoveEvent() for the reason of this: */ - if (!static_cast(qApp)->isX11()) + if (standalone_ + /* since Wayland has a serious issue related to QDrag that interferes with + dropping tabs outside all windows, we don't enable tab DND without X11 */ + || !static_cast(qApp)->isX11()) + { ui->tabWidget->noTabDND(); + } connect (ui->actionNew, &QAction::triggered, this, &FPwin::newTab); connect (ui->tabWidget->tabBar(), &TabBar::addEmptyTab, this, &FPwin::newTab); @@ -195,25 +198,27 @@ connect (ui->actionRightTab, &QAction::triggered, this, &FPwin::nextTab); connect (ui->actionLeftTab, &QAction::triggered, this, &FPwin::previousTab); connect (ui->actionLastActiveTab, &QAction::triggered, this, &FPwin::lastActiveTab); - connect (ui->actionClose, &QAction::triggered, this, &FPwin::closeTab); + connect (ui->actionClose, &QAction::triggered, this, &FPwin::closePage); connect (ui->tabWidget, &QTabWidget::tabCloseRequested, this, &FPwin::closeTabAtIndex); connect (ui->actionOpen, &QAction::triggered, this, &FPwin::fileOpen); connect (ui->actionReload, &QAction::triggered, this, &FPwin::reload); connect (aGroup_, &QActionGroup::triggered, this, &FPwin::enforceEncoding); - connect (ui->actionSave, &QAction::triggered, [=]{saveFile (false);}); + connect (ui->actionSave, &QAction::triggered, this, [=]{saveFile (false);}); connect (ui->actionSaveAs, &QAction::triggered, this, [=]{saveFile (false);}); - connect (ui->actionSaveAllFiles, &QAction::triggered, this, [=]{saveAllFiles (true);}); connect (ui->actionSaveCodec, &QAction::triggered, this, [=]{saveFile (false);}); + connect (ui->actionSaveAllFiles, &QAction::triggered, this, [=]{saveAllFiles (true);}); connect (ui->actionCut, &QAction::triggered, this, &FPwin::cutText); connect (ui->actionCopy, &QAction::triggered, this, &FPwin::copyText); connect (ui->actionPaste, &QAction::triggered, this, &FPwin::pasteText); + connect (ui->actionSoftTab, &QAction::triggered, this, &FPwin::toSoftTabs); connect (ui->actionDate, &QAction::triggered, this, &FPwin::insertDate); connect (ui->actionDelete, &QAction::triggered, this, &FPwin::deleteText); connect (ui->actionSelectAll, &QAction::triggered, this, &FPwin::selectAllText); connect (ui->actionUpperCase, &QAction::triggered, this, &FPwin::upperCase); connect (ui->actionLowerCase, &QAction::triggered, this, &FPwin::lowerCase); + connect (ui->actionStartCase, &QAction::triggered, this, &FPwin::startCase); /* because sort line actions don't have shortcuts, their state can be set when their menu is going to be shown */ @@ -241,10 +246,10 @@ connect (ui->tabWidget->tabBar(), &QWidget::customContextMenuRequested, this, &FPwin::tabContextMenu); connect (ui->actionCopyName, &QAction::triggered, this, &FPwin::copyTabFileName); connect (ui->actionCopyPath, &QAction::triggered, this, &FPwin::copyTabFilePath); - connect (ui->actionCloseAll, &QAction::triggered, this, &FPwin::closeAllTabs); - connect (ui->actionCloseRight, &QAction::triggered, this, &FPwin::closeNextTabs); - connect (ui->actionCloseLeft, &QAction::triggered, this, &FPwin::closePreviousTabs); - connect (ui->actionCloseOther, &QAction::triggered, this, &FPwin::closeOtherTabs); + connect (ui->actionCloseAll, &QAction::triggered, this, &FPwin::closeAllPages); + connect (ui->actionCloseRight, &QAction::triggered, this, &FPwin::closeNextPages); + connect (ui->actionCloseLeft, &QAction::triggered, this, &FPwin::closePreviousPages); + connect (ui->actionCloseOther, &QAction::triggered, this, &FPwin::closeOtherPages); connect (ui->actionFont, &QAction::triggered, this, &FPwin::fontDialog); @@ -277,7 +282,7 @@ connect (this, &FPwin::finishedLoading, [this] { if (sidePane_) - sidePane_->listWidget()->scrollToItem (sidePane_->listWidget()->currentItem()); + sidePane_->listWidget()->scrollToCurrentItem(); }); ui->actionSidePane->setAutoRepeat (false); // don't let UI change too rapidly connect (ui->actionSidePane, &QAction::triggered, [this] {toggleSidePane();}); @@ -305,9 +310,10 @@ connect (zoomzero, &QShortcut::activated, this, &FPwin::zoomZero); QShortcut *fullscreen = new QShortcut (QKeySequence (Qt::Key_F11), this); - QShortcut *defaultsize = new QShortcut (QKeySequence (Qt::CTRL + Qt::SHIFT + Qt::Key_W), this); connect (fullscreen, &QShortcut::activated, [this] {setWindowState (windowState() ^ Qt::WindowFullScreen);}); - connect (defaultsize, &QShortcut::activated, this, &FPwin::defaultSize); + + QShortcut *focusView = new QShortcut (QKeySequence (Qt::Key_Escape), this); + connect (focusView, &QShortcut::activated, this, &FPwin::focusView); /* this workaround, for the RTL bug in QPlainTextEdit, isn't needed because a better workaround is included in textedit.cpp */ @@ -334,11 +340,12 @@ /*************************/ void FPwin::closeEvent (QCloseEvent *event) { - bool keep = closeTabs (-1, -1, true); + bool keep = locked_ || closePages (-1, -1, true); if (keep) { event->ignore(); - lastWinFilesCur_.clear(); // just a precaution; it's done at closeTabs() + if (!locked_) + lastWinFilesCur_.clear(); // just a precaution; it's done at closePages() } else { @@ -375,7 +382,7 @@ sizes << sp * mult << (100 - sp) * mult; ui->splitter->setSizes (sizes); connect (sidePane_->listWidget(), &QWidget::customContextMenuRequested, this, &FPwin::listContextMenu); - connect (sidePane_->listWidget(), &QListWidget::currentItemChanged, this, &FPwin::changeTab); + connect (sidePane_->listWidget(), &ListWidget::currentItemUpdated, this, &FPwin::changeTab); connect (sidePane_->listWidget(), &ListWidget::closeSidePane, this, &FPwin::toggleSidePane); connect (sidePane_->listWidget(), &ListWidget::closeItem, [this](QListWidgetItem* item) { if (!sideItems_.isEmpty()) @@ -409,15 +416,15 @@ if (tabPage->textEdit()->document()->isModified()) fname.append ("*"); fname.replace ("\n", " "); - QListWidgetItem *lwi = new QListWidgetItem (isLink ? QIcon (":icons/link.svg") : QIcon(), - fname, lw); + ListWidgetItem *lwi = new ListWidgetItem (isLink ? QIcon (":icons/link.svg") : QIcon(), + fname, lw); lwi->setToolTip (ui->tabWidget->tabToolTip (i)); sideItems_.insert (lwi, tabPage); lw->addItem (lwi); if (i == curIndex) lw->setCurrentItem (lwi); } - sidePane_->listWidget()->scrollTo (sidePane_->listWidget()->currentIndex()); + sidePane_->listWidget()->scrollToCurrentItem(); updateShortcuts (false); } @@ -548,17 +555,22 @@ if (config.getRecentOpened()) ui->menuOpenRecently->setTitle (tr ("&Recently Opened")); int recentNumber = config.getCurRecentFilesNumber(); - QAction* recentAction = nullptr; - for (int i = 0; i < recentNumber; ++i) + if (recentNumber <= 0) + ui->menuOpenRecently->setEnabled (false); + else { - recentAction = new QAction (this); - recentAction->setVisible (false); - connect (recentAction, &QAction::triggered, this, &FPwin::newTabFromRecent); - ui->menuOpenRecently->addAction (recentAction); - } - ui->menuOpenRecently->addAction (ui->actionClearRecent); - connect (ui->menuOpenRecently, &QMenu::aboutToShow, this, &FPwin::updateRecenMenu); - connect (ui->actionClearRecent, &QAction::triggered, this, &FPwin::clearRecentMenu); + QAction* recentAction = nullptr; + for (int i = 0; i < recentNumber; ++i) + { + recentAction = new QAction (this); + recentAction->setVisible (false); + connect (recentAction, &QAction::triggered, this, &FPwin::newTabFromRecent); + ui->menuOpenRecently->addAction (recentAction); + } + ui->menuOpenRecently->addAction (ui->actionClearRecent); + connect (ui->menuOpenRecently, &QMenu::aboutToShow, this, &FPwin::updateRecenMenu); + connect (ui->actionClearRecent, &QAction::triggered, this, &FPwin::clearRecentMenu); + } ui->actionSave->setEnabled (config.getSaveUnmodified()); // newTab() will be called after this @@ -583,7 +595,7 @@ ui->actionReload->setIcon (symbolicIcon::icon (":icons/view-refresh.svg")); ui->actionFind->setIcon (symbolicIcon::icon (":icons/edit-find.svg")); ui->actionReplace->setIcon (symbolicIcon::icon (":icons/edit-find-replace.svg")); - ui->actionClose->setIcon (QIcon (":icons/window-close.svg")); + ui->actionClose->setIcon (symbolicIcon::icon (":icons/window-close.svg")); ui->actionQuit->setIcon (symbolicIcon::icon (":icons/application-exit.svg")); ui->actionFont->setIcon (symbolicIcon::icon (":icons/preferences-desktop-font.svg")); ui->actionPreferences->setIcon (symbolicIcon::icon (":icons/preferences-system.svg")); @@ -636,10 +648,10 @@ /* search and replacement */ << QKeySequence (Qt::Key_F3).toString() << QKeySequence (Qt::Key_F4).toString() << QKeySequence (Qt::Key_F5).toString() << QKeySequence (Qt::Key_F6).toString() << QKeySequence (Qt::Key_F7).toString() << QKeySequence (Qt::Key_F8).toString() << QKeySequence (Qt::Key_F9).toString() << QKeySequence (Qt::Key_F10).toString() - << QKeySequence (Qt::Key_F11).toString() << QKeySequence (Qt::CTRL + Qt::SHIFT + Qt::Key_W).toString() + << QKeySequence (Qt::Key_F11).toString() << QKeySequence (Qt::CTRL + Qt::Key_Equal).toString() << QKeySequence (Qt::CTRL + Qt::Key_Plus).toString() << QKeySequence (Qt::CTRL + Qt::Key_Minus).toString() << QKeySequence (Qt::CTRL + Qt::Key_0).toString() // zooming - << QKeySequence (Qt::CTRL + Qt::ALT +Qt::Key_E).toString() // exiting a process + << QKeySequence (Qt::CTRL + Qt::ALT + Qt::Key_E).toString() // exiting a process << QKeySequence (Qt::SHIFT + Qt::Key_Enter).toString() << QKeySequence (Qt::SHIFT + Qt::Key_Return).toString() << QKeySequence (Qt::CTRL + Qt::Key_Tab).toString() << QKeySequence (Qt::CTRL + Qt::META + Qt::Key_Tab).toString() // text tabulation << QKeySequence (Qt::CTRL + Qt::SHIFT + Qt::Key_J).toString() // select text on jumping (not an action) << QKeySequence (Qt::CTRL + Qt::Key_K).toString(); // used by LineEdit as well as QPlainTextEdit @@ -679,11 +691,12 @@ { // no "url" for the language button langList << "c" << "cmake" << "config" << "cpp" << "css" << "dart" << "deb" << "desktop" << "diff" << "fountain" - << "html" << "javascript" << "log" << "lua" << "m3u" - << "markdown" << "makefile" << "perl" << "php" << "python" - << "qmake" << "qml" << "reST" << "ruby" << "scss" - << "sh" << "troff" << "theme" << "xml" << "yaml"; - langList.sort(); + << "html" << "javascript" << "LaTeX" << "log" << "lua" + << "m3u" << "markdown" << "makefile" << "perl" << "php" + << "python" << "qmake" << "qml" << "reST" << "ruby" + << "scss" << "sh" << "troff" << "theme" << "xml" + << "yaml"; + langList.sort (Qt::CaseInsensitive); } QToolButton *langButton = ui->statusBar->findChild("langButton"); @@ -817,8 +830,7 @@ QList dialogs = win->findChildren(); for (int j = 0; j < dialogs.count(); ++j) { - if (dialogs.at (j)->objectName() != "processDialog" - && dialogs.at (j)->objectName() != "sessionDialog") + if (dialogs.at (j)->isModal()) { res = true; break; @@ -830,14 +842,15 @@ if (res) { showWarningBar ("
" + tr ("Another FeatherPad window has a modal dialog!") + "
" - + "
" + tr ("Please attend to that window or just close its dialog!") + "
"); + + "
" + tr ("Please attend to that window or just close its dialog!") + "
", + 15); } return res; } /*************************/ void FPwin::updateGUIForSingleTab (bool single) { - ui->actionDetachTab->setEnabled (!single); + ui->actionDetachTab->setEnabled (!single && !standalone_); ui->actionRightTab->setEnabled (!single); ui->actionLeftTab->setEnabled (!single); ui->actionLastTab->setEnabled (!single); @@ -846,7 +859,8 @@ /*************************/ void FPwin::deleteTabPage (int tabIndex, bool saveToList, bool closeWithLastTab) { - TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (tabIndex)); + TabPage *tabPage = qobject_cast(ui->tabWidget->widget (tabIndex)); + if (tabPage == nullptr) return; if (sidePane_ && !sideItems_.isEmpty()) { if (QListWidgetItem *wi = sideItems_.key (tabPage)) @@ -869,6 +883,8 @@ it is better to disconnect contentsChange() here to prevent a crash */ disconnect (textEdit, &QPlainTextEdit::textChanged, this, &FPwin::hlight); disconnect (textEdit->document(), &QTextDocument::contentsChange, this, &FPwin::updateWordInfo); + if (config.getSelectionHighlighting()) + disconnect (textEdit->document(), &QTextDocument::contentsChange, textEdit, &TextEdit::onContentsChange); syntaxHighlighting (textEdit, false); ui->tabWidget->removeTab (tabIndex); delete tabPage; tabPage = nullptr; @@ -882,9 +898,13 @@ // If both "first" and "last" are negative, all tabs will be closed. // The case, when they're both greater than -1, is covered but not used anywhere. // Tabs/rows are always closed from right/bottom to left/top. -bool FPwin::closeTabs (int first, int last, bool saveFilesList) +bool FPwin::closePages (int first, int last, bool saveFilesList) { - if (!isReady()) return true; + if (!isReady()) + { + closePreviousPages_ = false; + return true; + } pauseAutoSaving (true); @@ -894,13 +914,13 @@ if (hasSideList) { int cur = sidePane_->listWidget()->currentRow(); - if (!(first < cur && (cur < last || last == -1))) + if (!(first < cur && (cur < last || last < 0))) curItem = sidePane_->listWidget()->currentItem(); } else { int cur = ui->tabWidget->currentIndex(); - if (!(first < cur && (cur < last || last == -1))) + if (!(first < cur && (cur < last || last < 0))) curPage = qobject_cast(ui->tabWidget->currentWidget()); } bool keep = false; @@ -909,7 +929,7 @@ bool closing (saveFilesList); // saveFilesList is true only with closing while (state == SAVED && ui->tabWidget->count() > 0) { - waitToMakeBusy(); + makeBusy(); if (last == 0) break; // no tab on the left if (last < 0) // close from the end @@ -921,14 +941,14 @@ break; int tabIndex = hasSideList ? ui->tabWidget->indexOf (sideItems_.value (sidePane_->listWidget()->item (index))) : index; - if (first == index - 1) // only one tab to be closed - state = savePrompt (tabIndex, false); + if (first == index - 1 && !closePreviousPages_) // only one tab to be closed + state = savePrompt (tabIndex, false, first, last, closing); else - state = savePrompt (tabIndex, true); // with a "No to all" button + state = savePrompt (tabIndex, true, first, last, closing); // with a "No to all" button switch (state) { case SAVED: // close this tab and go to the next one on the left keep = false; - if (lastWinFilesCur_.size() >= 50) // never remember more than 50 files + if (lastWinFilesCur_.size() >= MAX_LAST_WIN_FILES) // never remember more than 50 files saveFilesList = false; deleteTabPage (tabIndex, saveFilesList, !closing); @@ -948,14 +968,15 @@ break; case UNDECIDED: // stop quitting (cancel or can't save) keep = true; - lastWinFilesCur_.clear(); + if (!locked_) + lastWinFilesCur_.clear(); break; - case DISCARDED: // no to all: close all tabs (and quit) + case DISCARDED: // no to all: close all tabs (and, probably, quit) keep = false; while (index > first) { if (last == 0) break; - if (lastWinFilesCur_.size() >= 50) + if (lastWinFilesCur_.size() >= MAX_LAST_WIN_FILES) saveFilesList = false; deleteTabPage (tabIndex, saveFilesList, !closing); @@ -968,16 +989,45 @@ } tabIndex = hasSideList ? ui->tabWidget->indexOf (sideItems_.value (sidePane_->listWidget()->item (index))) : index; + } + count = ui->tabWidget->count(); + if (count == 0) + { + ui->actionReload->setDisabled (true); + ui->actionSave->setDisabled (true); + enableWidgets (false); + } + else if (count == 1) + updateGUIForSingleTab (true); - count = ui->tabWidget->count(); - if (count == 0) + if (closePreviousPages_) + { // continue closing previous pages without prompt + closePreviousPages_ = false; + if (first > 0) { - ui->actionReload->setDisabled (true); - ui->actionSave->setDisabled (true); - enableWidgets (false); + index = first - 1; + while (index > -1) + { + tabIndex = hasSideList ? ui->tabWidget->indexOf (sideItems_.value (sidePane_->listWidget()->item (index))) + : index; + if (lastWinFilesCur_.size() >= MAX_LAST_WIN_FILES) + saveFilesList = false; + deleteTabPage (tabIndex, saveFilesList, !closing); + --index; + } + count = ui->tabWidget->count(); + if (count == 0) // impossible + { + ui->actionReload->setDisabled (true); + ui->actionSave->setDisabled (true); + enableWidgets (false); + } + else if (count == 1) // always true + updateGUIForSingleTab (true); } - else if (count == 1) - updateGUIForSingleTab (true); + unbusy(); + pauseAutoSaving (false); + return false; } break; default: @@ -992,6 +1042,11 @@ ui->tabWidget->setCurrentWidget (curPage); else if (curItem) sidePane_->listWidget()->setCurrentItem (curItem); + if (closePreviousPages_) + { // continue closing previous pages + closePreviousPages_ = false; + return closePages (-1, first); + } } pauseAutoSaving (false); @@ -1002,52 +1057,60 @@ void FPwin::copyTabFileName() { if (rightClicked_ < 0) return; - TabPage *tabPage; + TabPage *tabPage = nullptr; if (sidePane_) tabPage = sideItems_.value (sidePane_->listWidget()->item (rightClicked_)); else tabPage = qobject_cast(ui->tabWidget->widget (rightClicked_)); - QString fname = tabPage->textEdit()->getFileName(); - QApplication::clipboard()->setText (fname.section ('/', -1)); + if (tabPage) + { + QString fname = tabPage->textEdit()->getFileName(); + QApplication::clipboard()->setText (fname.section ('/', -1)); + } } /*************************/ void FPwin::copyTabFilePath() { if (rightClicked_ < 0) return; - TabPage *tabPage; + TabPage *tabPage = nullptr; if (sidePane_) tabPage = sideItems_.value (sidePane_->listWidget()->item (rightClicked_)); else tabPage = qobject_cast(ui->tabWidget->widget (rightClicked_)); - QString str = tabPage->textEdit()->getFileName(); - if (!str.isEmpty()) - QApplication::clipboard()->setText (str); + if (tabPage) + { + QString str = tabPage->textEdit()->getFileName(); + if (!str.isEmpty()) + QApplication::clipboard()->setText (str); + } } /*************************/ -void FPwin::closeAllTabs() +void FPwin::closeAllPages() { - closeTabs (-1, -1); + closePages (-1, -1); } /*************************/ -void FPwin::closeNextTabs() +void FPwin::closeNextPages() { - closeTabs (rightClicked_, -1); + closePages (rightClicked_, -1); } /*************************/ -void FPwin::closePreviousTabs() +void FPwin::closePreviousPages() { - closeTabs (-1, rightClicked_); + closePages (-1, rightClicked_); } /*************************/ -void FPwin::closeOtherTabs() +void FPwin::closeOtherPages() { - if (!closeTabs (rightClicked_, -1)) - closeTabs (-1, rightClicked_); + /* NOTE: Because saving as root is possible, we can't close the previous pages + here. They will be closed by closePages() or saveAsRoot() if needed. */ + closePreviousPages_ = true; + closePages (rightClicked_, -1); } /*************************/ void FPwin::dragEnterEvent (QDragEnterEvent *event) { - if (findChildren().count() > 0) + if (locked_ || findChildren().count() > 0) return; if (event->mimeData()->hasUrls()) event->acceptProposedAction(); @@ -1061,6 +1124,7 @@ /*************************/ void FPwin::dropEvent (QDropEvent *event) { + if (locked_) return; if (event->mimeData()->hasFormat ("application/featherpad-tab")) dropTab (QString::fromUtf8 (event->mimeData()->data ("application/featherpad-tab").constData())); else @@ -1068,11 +1132,18 @@ const QList urlList = event->mimeData()->urls(); bool multiple (urlList.count() > 1 || isLoading()); for (const QUrl &url : urlList) - newTabFromName (url.adjusted (QUrl::NormalizePathSegments) // KDE may give a double slash - .toLocalFile(), - 0, - 0, - multiple); + { + QString file; + QString scheme = url.scheme(); + if (scheme == "admin") // gvfs' "admin:///" + file = url.adjusted (QUrl::NormalizePathSegments).path(); + else if (scheme == "file" || scheme.isEmpty()) + file = url.adjusted (QUrl::NormalizePathSegments) // KDE may give a double slash + .toLocalFile(); + else + continue; + newTabFromName (file, 0, 0, multiple); + } } event->acceptProposedAction(); @@ -1081,17 +1152,28 @@ // This method checks if there's any text that isn't saved under a tab and, // if there is, it activates the tab and shows an appropriate prompt dialog. // "tabIndex" is always the tab index and not the item row (in the side-pane). -FPwin::DOCSTATE FPwin::savePrompt (int tabIndex, bool noToAll) + +// The other variables are only for saveAsRoot(): "first and "last" determine +// the range of indexes/rows that should be closed and "curItem"/"curPage" is +// the item/tab that should be made current in side-pane/tab-bar again. +FPwin::DOCSTATE FPwin::savePrompt (int tabIndex, bool noToAll, + int first, int last, bool closingWindow, + QListWidgetItem *curItem, TabPage *curPage) { DOCSTATE state = SAVED; TabPage *tabPage = qobject_cast(ui->tabWidget->widget (tabIndex)); + if (tabPage == nullptr) return state; TextEdit *textEdit = tabPage->textEdit(); QString fname = textEdit->getFileName(); bool isRemoved (!fname.isEmpty() && !QFile::exists (fname)); // don't check QFileInfo (fname).isFile() if (textEdit->document()->isModified() || isRemoved) { - unbusy(); // made busy at closeTabs() - if (hasAnotherDialog()) return UNDECIDED; // cancel + unbusy(); // made busy at closePages() + if (hasAnotherDialog()) + { // cancel + closePreviousPages_ = false; + return UNDECIDED; + } if (tabIndex != ui->tabWidget->currentIndex()) { // switch to the page that needs attention @@ -1132,13 +1214,18 @@ y() + height()/2 - msgBox.height()/ 2);*/ switch (msgBox.exec()) { case QMessageBox::Save: - if (!saveFile (true)) + if (!saveFile (true, first, last, closingWindow, curItem, curPage)) + { state = UNDECIDED; + /* NOTE: closePreviousPages_ is set to false by saveFile() if there is no + root saving; otherwise, it's set by saveAsRoot() appropriately. */ + } break; case QMessageBox::Discard: break; case QMessageBox::Cancel: state = UNDECIDED; + closePreviousPages_ = false; break; case QMessageBox::NoToAll: state = DISCARDED; @@ -1179,8 +1266,8 @@ ui->actionClose->setEnabled (enable); ui->actionSaveAs->setEnabled (enable); ui->actionSaveAllFiles->setEnabled (enable); - ui->menuEncoding->setEnabled (enable); ui->actionSaveCodec->setEnabled (enable); + ui->menuEncoding->setEnabled (enable); ui->actionFont->setEnabled (enable); ui->actionDoc->setEnabled (enable); ui->actionPrint->setEnabled (enable); @@ -1196,11 +1283,13 @@ ui->actionCut->setEnabled (false); ui->actionCopy->setEnabled (false); ui->actionPaste->setEnabled (false); + ui->actionSoftTab->setEnabled (false); ui->actionDate->setEnabled (false); ui->actionDelete->setEnabled (false); ui->actionUpperCase->setEnabled (false); ui->actionLowerCase->setEnabled (false); + ui->actionStartCase->setEnabled (false); } } /*************************/ @@ -1289,10 +1378,12 @@ tabPage->setSearchModel (singleton->searchModel()); TextEdit *textEdit = tabPage->textEdit(); connect (textEdit, &QWidget::customContextMenuRequested, this, &FPwin::editorContextMenu); + textEdit->setSelectionHighlighting (config.getSelectionHighlighting()); + textEdit->setPastePaths (config.getPastePaths()); textEdit->setAutoReplace (config.getAutoReplace()); textEdit->setAutoBracket (config.getAutoBracket()); - textEdit->setScrollJumpWorkaround (config.getScrollJumpWorkaround()); textEdit->setTtextTab (config.getTextTabSize()); + textEdit->setCurLineHighlight (config.getCurLineHighlight()); textEdit->setEditorFont (config.getFont()); textEdit->setInertialScrolling (config.getInertialScrolling()); textEdit->setDateFormat (config.getDateFormat()); @@ -1357,6 +1448,7 @@ connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionCopy, &QAction::setEnabled); connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionUpperCase, &QAction::setEnabled); connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionLowerCase, &QAction::setEnabled); + connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionStartCase, &QAction::setEnabled); connect (textEdit, &TextEdit::fileDropped, this, &FPwin::newTabFromName); connect (textEdit, &TextEdit::zoomedOut, this, &FPwin::reformat); @@ -1373,7 +1465,7 @@ if (sidePane_) { ListWidget *lw = sidePane_->listWidget(); - QListWidgetItem *lwi = new QListWidgetItem (tr ("Untitled"), lw); + ListWidgetItem *lwi = new ListWidgetItem (tr ("Untitled"), lw); lwi->setToolTip (tr ("Unsaved")); sideItems_.insert (lwi, tabPage); lw->addItem (lwi); @@ -1390,18 +1482,17 @@ textEdit->setFocus(); } - /* this isn't enough for unshading under all WMs */ - /*if (isMinimized()) - setWindowState (windowState() & (~Qt::WindowMinimized | Qt::WindowActive));*/ -#ifdef HAS_X11 - if (static_cast(qApp)->isX11() && isWindowShaded (winId())) - unshadeWindow (winId()); -#endif if (setCurrent) + stealFocus(); + else if (isMinimized()) + setWindowState ((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); +#ifdef HAS_X11 + else if (static_cast(qApp)->isX11()) { - raise(); - activateWindow(); + if (isWindowShaded (winId())) + unshadeWindow (winId()); } +#endif return tabPage; } @@ -1431,7 +1522,7 @@ txt = txt.split ('\t').first(); if (!txt.isEmpty()) thisAction->setText(txt); - /* correct the slots of copy and cut actions */ + /* correct the slots of some actions */ if (thisAction->objectName() == "edit-copy") { disconnect (thisAction, &QAction::triggered, nullptr, nullptr); @@ -1442,6 +1533,26 @@ disconnect (thisAction, &QAction::triggered, nullptr, nullptr); connect (thisAction, &QAction::triggered, textEdit, &TextEdit::cut); } + else if (thisAction->objectName() == "edit-paste") + { + disconnect (thisAction, &QAction::triggered, nullptr, nullptr); + connect (thisAction, &QAction::triggered, textEdit, &TextEdit::paste); + } + else if (thisAction->objectName() == "edit-undo") + { + disconnect (thisAction, &QAction::triggered, nullptr, nullptr); + connect (thisAction, &QAction::triggered, textEdit, &TextEdit::undo); + } + else if (thisAction->objectName() == "edit-redo") + { + disconnect (thisAction, &QAction::triggered, nullptr, nullptr); + connect (thisAction, &QAction::triggered, textEdit, &TextEdit::redo); + } + else if (thisAction->objectName() == "select-all") + { + disconnect (thisAction, &QAction::triggered, nullptr, nullptr); + connect (thisAction, &QAction::triggered, textEdit, &TextEdit::selectAll); + } } QString str = textEdit->getUrl (textEdit->textCursor().position()); if (!str.isEmpty()) @@ -1471,10 +1582,13 @@ } if (!textEdit->isReadOnly()) { + menu->addAction (ui->actionSoftTab); + menu->addSeparator(); if (textEdit->textCursor().hasSelection()) { menu->addAction (ui->actionUpperCase); menu->addAction (ui->actionLowerCase); + menu->addAction (ui->actionStartCase); if (textEdit->textCursor().selectedText().contains (QChar (QChar::ParagraphSeparator))) { menu->addSeparator(); @@ -1505,11 +1619,7 @@ QList actions = ui->menuOpenRecently->actions(); int recentSize = recentFiles.count(); QFontMetrics metrics (ui->menuOpenRecently->font()); -#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0)) int w = 150 * metrics.horizontalAdvance (' '); -#else - int w = 150 * metrics.width (' '); -#endif for (int i = 0; i < recentNumber; ++i) { if (i < recentSize) @@ -1537,9 +1647,10 @@ /*************************/ void FPwin::reformat (TextEdit *textEdit) { - formatTextRect (textEdit->rect()); // in "syntax.cpp" + formatTextRect(); // in "syntax.cpp" if (!textEdit->getSearchedText().isEmpty()) hlight(); // in "find.cpp" + textEdit->selectionHlight(); } /*************************/ void FPwin::zoomIn() @@ -1580,11 +1691,11 @@ widget to guarantee resizing under all DEs */ /*Qt::WindowFlags flags = windowFlags(); setParent (dummyWidget, Qt::SubWindow);*/ - hide(); + //hide(); resize (s); /*if (parent() != nullptr) setParent (nullptr, flags);*/ - QTimer::singleShot (0, this, &FPwin::show); + //QTimer::singleShot (0, this, &FPwin::show); } /*************************/ /*void FPwin::align() @@ -1608,16 +1719,22 @@ } }*/ /*************************/ +void FPwin::focusView() +{ + if (TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget())) + { + if (!tabPage->hasPopup()) + tabPage->textEdit()->setFocus(); + } +} +/*************************/ void FPwin::executeProcess() { QList dialogs = findChildren(); for (int i = 0; i < dialogs.count(); ++i) { - if (dialogs.at (i)->objectName() != "processDialog" - && dialogs.at (i)->objectName() != "sessionDialog") - { + if (dialogs.at (i)->isModal()) return; // shortcut may work when there's a modal dialog - } } closeWarningBar(); @@ -1629,7 +1746,8 @@ if (tabPage->findChild(QString(), Qt::FindDirectChildrenOnly)) { showWarningBar ("
" + tr ("Another process is running in this tab!") + "
" - + "
" + tr ("Only one process is allowed per tab.") + "
"); + + "
" + tr ("Only one process is allowed per tab.") + "
", + 15); return; } @@ -1642,20 +1760,39 @@ QProcess *process = new QProcess (tabPage); process->setObjectName (fName); // to put it into the message dialog - connect(process, &QProcess::readyReadStandardOutput,this, &FPwin::displayOutput); - connect(process, &QProcess::readyReadStandardError,this, &FPwin::displayError); + connect (process, &QProcess::readyReadStandardOutput,this, &FPwin::displayOutput); + connect (process, &QProcess::readyReadStandardError,this, &FPwin::displayError); QString command = config.getExecuteCommand(); +#if (QT_VERSION >= QT_VERSION_CHECK(5,15,0)) + /* Qt 5.15 has made things more complex and, at the same time, better: + on the one hand, we should see if there is a command argument; on the + other hand, we don't need to worry about spaces and quotes in file names. */ + if (!command.isEmpty()) + { + QStringList commandParts = QProcess::splitCommand (command); + if (!commandParts.isEmpty()) + { + command = commandParts.takeAt (0); // there may be arguments + process->start (command, QStringList() << commandParts << fName); + } + else + process->start (fName, QStringList()); + } + else + process->start (fName, QStringList()); +#else if (!command.isEmpty()) command += " "; fName.replace ("\"", "\"\"\""); // literal quotes in the command are shown by triple quotes process->start (command + "\"" + fName + "\""); +#endif /* old-fashioned: connect(process, static_cast(&QProcess::finished),... */ - connect(process, QOverload::of(&QProcess::finished), - [=](int /*exitCode*/, QProcess::ExitStatus /*exitStatus*/){ process->deleteLater(); }); + connect (process, QOverload::of(&QProcess::finished), + [=](int /*exitCode*/, QProcess::ExitStatus /*exitStatus*/) {process->deleteLater();}); } } /*************************/ -bool FPwin::isScriptLang (const QString& lang) +bool FPwin::isScriptLang (const QString& lang) const { return (lang == "sh" || lang == "python" || lang == "ruby" || lang == "lua" @@ -1706,12 +1843,12 @@ QTextCursor cur = tEdit->textCursor(); cur.movePosition (QTextCursor::End); tEdit->setTextCursor (cur); + stealFocus (msgDlg); } } else { msgDlg = new QDialog (qobject_cast(process->parent())); - msgDlg->setObjectName ("processDialog"); msgDlg->setWindowTitle (tr ("Script Output")); msgDlg->setSizeGripEnabled (true); QGridLayout *grid = new QGridLayout; @@ -1755,37 +1892,48 @@ /*************************/ // This closes either the current page or the right-clicked side-pane item but // never the right-clicked tab because the tab context menu has no closing item. -void FPwin::closeTab() +void FPwin::closePage() { if (!isReady()) return; pauseAutoSaving (true); QListWidgetItem *curItem = nullptr; - int index = -1; + int tabIndex = -1; + int index = -1; // tab index or side-pane row if (sidePane_ && rightClicked_ >= 0) // close the right-clicked item { - index = ui->tabWidget->indexOf (sideItems_.value (sidePane_->listWidget()->item (rightClicked_))); - if (index != ui->tabWidget->currentIndex()) + index = rightClicked_; + tabIndex = ui->tabWidget->indexOf (sideItems_.value (sidePane_->listWidget()->item (rightClicked_))); + if (tabIndex != ui->tabWidget->currentIndex()) curItem = sidePane_->listWidget()->currentItem(); } else // close the current page { - index = ui->tabWidget->currentIndex(); - if (index == -1) // not needed + tabIndex = ui->tabWidget->currentIndex(); + if (tabIndex == -1) // not needed { pauseAutoSaving (false); return; } + index = tabIndex; // may need to be converted to the side-pane row + if (sidePane_ && !sideItems_.isEmpty()) + { + if (TabPage *tabPage = qobject_cast(ui->tabWidget->widget (tabIndex))) + { + if (QListWidgetItem *wi = sideItems_.key (tabPage)) + index = sidePane_->listWidget()->row (wi); + } + } } - if (savePrompt (index, false) != SAVED) + if (savePrompt (tabIndex, false, index - 1, index + 1, false, curItem) != SAVED) { pauseAutoSaving (false); return; } - deleteTabPage (index); + deleteTabPage (tabIndex); int count = ui->tabWidget->count(); if (count == 0) { @@ -1808,21 +1956,36 @@ pauseAutoSaving (false); } /*************************/ -void FPwin::closeTabAtIndex (int index) +void FPwin::closeTabAtIndex (int tabIndex) { pauseAutoSaving (true); TabPage *curPage = nullptr; - if (index != ui->tabWidget->currentIndex()) - curPage = qobject_cast(ui->tabWidget->currentWidget()); - if (savePrompt (index, false) != SAVED) + QListWidgetItem *curItem = nullptr; + if (tabIndex != ui->tabWidget->currentIndex()) + { + if (sidePane_) + curItem = sidePane_->listWidget()->currentItem(); + else + curPage = qobject_cast(ui->tabWidget->currentWidget()); + } + int index = tabIndex; // may need to be converted to the side-pane row + if (sidePane_ && !sideItems_.isEmpty()) + { + if (TabPage *tabPage = qobject_cast(ui->tabWidget->widget (tabIndex))) + { + if (QListWidgetItem *wi = sideItems_.key (tabPage)) + index = sidePane_->listWidget()->row (wi); + } + } + if (savePrompt (tabIndex, false, index - 1, index + 1, false, curItem, curPage) != SAVED) { pauseAutoSaving (false); return; } closeWarningBar(); - deleteTabPage (index); + deleteTabPage (tabIndex); int count = ui->tabWidget->count(); if (count == 0) { @@ -1835,8 +1998,11 @@ if (count == 1) updateGUIForSingleTab (true); - if (curPage) // restore the current page + /* restore the current page/item */ + if (curPage) ui->tabWidget->setCurrentWidget (curPage); + else if (curItem) + sidePane_->listWidget()->setCurrentItem (curItem); if (TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget())) tabPage->textEdit()->setFocus(); @@ -1870,13 +2036,6 @@ shownName.replace ("\n", " "); // no multi-line tab text } - shownName.replace ("&", "&&"); // single ampersand is for mnemonic - ui->tabWidget->setTabText (index, shownName); - if (isLink) - ui->tabWidget->setTabIcon (index, QIcon (":icons/link.svg")); - else - ui->tabWidget->setTabIcon (index, QIcon()); - if (sidePane_ && !sideItems_.isEmpty()) { if (QListWidgetItem *wi = sideItems_.key (qobject_cast(ui->tabWidget->widget (index)))) @@ -1888,6 +2047,14 @@ wi->setIcon (QIcon()); } } + + shownName.replace ("&", "&&"); // single ampersand is for tab mnemonic + shownName.replace ('\t', ' '); + ui->tabWidget->setTabText (index, shownName); + if (isLink) + ui->tabWidget->setTabIcon (index, QIcon (":icons/link.svg")); + else + ui->tabWidget->setTabIcon (index, QIcon()); } /*************************/ void FPwin::enableSaving (bool modified) @@ -1901,9 +2068,9 @@ if (inactiveTabModified_) return; int index = ui->tabWidget->currentIndex(); - - QString fname = qobject_cast< TabPage *>(ui->tabWidget->widget (index)) - ->textEdit()->getFileName(); + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); + if (tabPage == nullptr) return; + QString fname = tabPage->textEdit()->getFileName(); QString shownName; if (fname.isEmpty()) { @@ -1917,45 +2084,29 @@ + (fname.contains ("/") ? fname : QFileInfo (fname).absolutePath() + "/" + fname)); } - if (modified) - shownName.prepend ("*"); shownName.replace ("\n", " "); - shownName.replace ("&", "&&"); - ui->tabWidget->setTabText (index, shownName); - - if (sidePane_) + if (sidePane_ && !sideItems_.isEmpty()) { - if (modified) - { - shownName.remove (0, 1); - shownName.append ("*"); - } - sidePane_->listWidget()->currentItem()->setText (shownName); + if (QListWidgetItem *wi = sideItems_.key (tabPage)) + wi->setText (modified ? shownName + "*" : shownName); } + + if (modified) + shownName.prepend ("*"); + shownName.replace ("&", "&&"); + shownName.replace ('\t', ' '); + ui->tabWidget->setTabText (index, shownName); } /*************************/ -void FPwin::waitToMakeBusy() +void FPwin::makeBusy() { - if (QGuiApplication::overrideCursor() != nullptr || busyThread_ != nullptr) - return; - busyThread_ = new QThread; - BusyMaker *makeBusy = new BusyMaker(); - makeBusy->moveToThread (busyThread_); - connect (busyThread_, &QThread::started, makeBusy, &BusyMaker::waiting); - connect (busyThread_, &QThread::finished, busyThread_, &QObject::deleteLater); - connect (busyThread_, &QThread::finished, makeBusy, &QObject::deleteLater); - connect (makeBusy, &BusyMaker::finished, busyThread_, &QThread::quit); - busyThread_->start(); + if (QGuiApplication::overrideCursor() == nullptr) + QGuiApplication::setOverrideCursor (QCursor (Qt::WaitCursor)); } /*************************/ void FPwin::unbusy() { - if (busyThread_ && !busyThread_->isFinished()) - { - busyThread_->quit(); - busyThread_->wait(); - } if (QGuiApplication::overrideCursor() != nullptr) QGuiApplication::restoreOverrideCursor(); } @@ -1976,7 +2127,7 @@ connect (thread, &Loading::finished, thread, &QObject::deleteLater); thread->start(); - waitToMakeBusy(); + makeBusy(); ui->tabWidget->tabBar()->lockTabs (true); updateShortcuts (true, false); } @@ -2003,8 +2154,8 @@ updateShortcuts (false, false); closeWarningBar(); emit finishedLoading(); - QCoreApplication::processEvents(); // see the end of this function - unbusy(); + QTimer::singleShot (0, this, &FPwin::unbusy); + stealFocus(); } return; } @@ -2014,14 +2165,15 @@ /* only for the side-pane mode */ static bool scrollToFirstItem (false); - static TabPage *firstPage = nullptr; + static QListWidgetItem *firstItem = nullptr; TextEdit *textEdit; - TabPage *tabPage; + TabPage *tabPage = nullptr; if (ui->tabWidget->currentIndex() == -1) tabPage = createEmptyTab (!multiple, false); else tabPage = qobject_cast(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; textEdit = tabPage->textEdit(); bool openInCurrentTab (true); @@ -2039,14 +2191,6 @@ { if (sidePane_ && !reload && !enforceEncod) // an unused empty tab scrollToFirstItem = true; - /*if (isMinimized()) - setWindowState (windowState() & (~Qt::WindowMinimized | Qt::WindowActive));*/ -#ifdef HAS_X11 - if (static_cast(qApp)->isX11() && isWindowShaded (winId())) - unshadeWindow (winId()); -#endif - raise(); - activateWindow(); } textEdit->setSaveCursor (restoreCursor == 1); @@ -2062,14 +2206,6 @@ QFileInfo fInfo (fileName); - if (scrollToFirstItem - && (!firstPage - || firstPage->textEdit()->getFileName().section ('/', -1). - compare (fInfo.fileName(), Qt::CaseInsensitive) > 0)) - { - firstPage = tabPage; - } - /* this workaround, for the RTL bug in QPlainTextEdit, isn't needed because a better workaround is included in textedit.cpp */ /*QTextOption opt = textEdit->document()->defaultTextOption(); @@ -2094,6 +2230,7 @@ int scrollbarValue = -1; if (reload) { + textEdit->forgetTxtCurHPos(); pos = textEdit->textCursor().position(); anchor = textEdit->textCursor().anchor(); if (QScrollBar *scrollbar = textEdit->verticalScrollBar()) @@ -2114,7 +2251,7 @@ if (reload) { QTextCursor cur = textEdit->textCursor(); - cur.movePosition (QTextCursor::End, QTextCursor::MoveAnchor); + cur.movePosition (QTextCursor::End); int curPos = cur.position(); if (anchor <= curPos && pos <= curPos) { @@ -2132,7 +2269,7 @@ if (cursorPos.contains (fileName)) { QTextCursor cur = textEdit->textCursor(); - cur.movePosition (QTextCursor::End, QTextCursor::MoveAnchor); + cur.movePosition (QTextCursor::End); int pos = qMin (qMax (cursorPos.value (fileName, 0).toInt(), 0), cur.position()); cur.setPosition (pos); QTimer::singleShot (0, textEdit, [textEdit, cur]() { @@ -2200,17 +2337,23 @@ if (!tip.endsWith ("/")) tip += "/"; QFontMetrics metrics (QToolTip::font()); QString elidedTip = "

" -#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0)) + metrics.elidedText (tip, Qt::ElideMiddle, 200 * metrics.horizontalAdvance (' ')) -#else - + metrics.elidedText (tip, Qt::ElideMiddle, 200 * metrics.width (' ')) -#endif + "

"; ui->tabWidget->setTabToolTip (ui->tabWidget->indexOf (tabPage), elidedTip); if (!sideItems_.isEmpty()) { if (QListWidgetItem *wi = sideItems_.key (tabPage)) + { wi->setToolTip (elidedTip); + if (scrollToFirstItem + && (!firstItem + /* consult the natural sorting of ListWidgetItem */ + || *(static_cast(wi)) + < *(static_cast(firstItem)))) + { + firstItem = wi; + } + } } if (uneditable || alreadyOpen (tabPage)) @@ -2243,13 +2386,18 @@ if (!uneditable) ui->actionEdit->setVisible (true); else + { ui->actionSaveAs->setDisabled (true); + ui->actionSaveCodec->setDisabled (true); + } ui->actionCut->setDisabled (true); ui->actionPaste->setDisabled (true); + ui->actionSoftTab->setDisabled (true); ui->actionDate->setDisabled (true); ui->actionDelete->setDisabled (true); ui->actionUpperCase->setDisabled (true); ui->actionLowerCase->setDisabled (true); + ui->actionStartCase->setDisabled (true); if (config.getSaveUnmodified()) ui->actionSave->setDisabled (true); } @@ -2257,6 +2405,7 @@ disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionDelete, &QAction::setEnabled); disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionUpperCase, &QAction::setEnabled); disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionLowerCase, &QAction::setEnabled); + disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionStartCase, &QAction::setEnabled); } else if (textEdit->isReadOnly()) QTimer::singleShot (0, this, &FPwin::makeEditable); @@ -2307,21 +2456,18 @@ }); } /* select the first item (sidePane_ exists) */ - else if (firstPage && !sideItems_.isEmpty()) - { - if (QListWidgetItem *wi = sideItems_.key (firstPage)) - sidePane_->listWidget()->setCurrentItem (wi); - } + else if (firstItem) + sidePane_->listWidget()->setCurrentItem (firstItem); /* reset the static variables */ scrollToFirstItem = false; - firstPage = nullptr; + firstItem = nullptr; closeWarningBar (true); // here the closing animation won't be interrupted emit finishedLoading(); /* remove the busy cursor only after all events are processed (e.g., highlighting the syntax of a huge text may take a while) */ - QCoreApplication::processEvents(); - unbusy(); + QTimer::singleShot (0, this, &FPwin::unbusy); + stealFocus(); } } /*************************/ @@ -2344,7 +2490,8 @@ disconnect (this, &FPwin::finishedLoading, this, &FPwin::onOpeninNonTextFiles); QTimer::singleShot (0, this, [=]() { showWarningBar ("
" + tr ("Non-text file(s) not opened!") + "
\n" - + "
" + tr ("See Preferences → Files → Do not permit opening of non-text files") + "
"); + + "
" + tr ("See Preferences → Files → Do not permit opening of non-text files") + "
", + 20); }); } /*************************/ @@ -2382,54 +2529,63 @@ }); } /*************************/ -void FPwin::showWarningBar (const QString& message, bool startupBar) +void FPwin::showWarningBar (const QString& message, int timeout, bool startupBar) { - /* don't show the warning bar when there's a modal dialog */ - QList dialogs = findChildren(); - for (int i = 0; i < dialogs.count(); ++i) + /* don't show this warning bar if the window is locked at this moment */ + if (locked_) return; + if (timeout > 0) { - if (dialogs.at (i)->objectName() != "processDialog" - && dialogs.at (i)->objectName() != "sessionDialog") + /* don't show the temporary warning bar when there's a modal dialog */ + QList dialogs = findChildren(); + for (int i = 0; i < dialogs.count(); ++i) { - return; + if (dialogs.at (i)->isModal()) + return; } } + + TabPage *tabPage = qobject_cast(ui->tabWidget->currentWidget()); + /* don't close and show the same warning bar */ if (WarningBar *prevBar = ui->tabWidget->findChild()) { if (!prevBar->isClosing() && prevBar->getMessage() == message) + { + prevBar->setTimeout (timeout); + if (tabPage && timeout > 0) + { // close the bar when the text is scrolled + disconnect (tabPage->textEdit(), &QPlainTextEdit::updateRequest, prevBar, &WarningBar::closeBarOnScrolling); + connect (tabPage->textEdit(), &QPlainTextEdit::updateRequest, prevBar, &WarningBar::closeBarOnScrolling); + } return; + } } int vOffset = 0; - TabPage *tabPage = qobject_cast(ui->tabWidget->currentWidget()); if (tabPage) vOffset = tabPage->height() - tabPage->textEdit()->height(); - WarningBar *bar = new WarningBar (message, vOffset, ui->tabWidget); + WarningBar *bar = new WarningBar (message, vOffset, timeout, ui->tabWidget); if (startupBar) bar->setObjectName ("startupBar"); /* close the bar when the text is scrolled */ - if (tabPage) - { - connect (tabPage->textEdit(), &QPlainTextEdit::updateRequest, bar, [=](const QRect&, int dy) { - if (dy != 0) - closeWarningBar(); - }); - } + if (tabPage && timeout > 0) + connect (tabPage->textEdit(), &QPlainTextEdit::updateRequest, bar, &WarningBar::closeBarOnScrolling); } /*************************/ void FPwin::showCrashWarning() { QTimer::singleShot (0, this, [=]() { showWarningBar ("
" + tr ("A previous crash detected!") + "
" - + "
" + tr ("Preferably, close all FeatherPad windows and start again!") + "
", true); + + "
" + tr ("Preferably, close all FeatherPad windows and start again!") + "
", + 10, true); }); } /*************************/ void FPwin::showRootWarning() { QTimer::singleShot (0, this, [=]() { - showWarningBar ("
" + tr ("Root Instance") + "
", true); + showWarningBar ("
" + tr ("Root Instance") + "
", + 10, true); }); } /*************************/ @@ -2573,15 +2729,17 @@ because encoding has no keyboard shortcut or tool button */ int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); + if (tabPage == nullptr) return; - TextEdit *textEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (index))->textEdit(); + TextEdit *textEdit = tabPage->textEdit(); QString fname = textEdit->getFileName(); if (!fname.isEmpty()) { if (savePrompt (index, false) != SAVED) { // back to the previous encoding - encodingToCheck (textEdit->getEncoding()); + if (!locked_) + encodingToCheck (textEdit->getEncoding()); return; } /* if the file is removed, close its tab to open a new one */ @@ -2617,11 +2775,12 @@ if (isLoading()) return; int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); + if (tabPage == nullptr) return; if (savePrompt (index, false) != SAVED) return; - TextEdit *textEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (index))->textEdit(); + TextEdit *textEdit = tabPage->textEdit(); QString fname = textEdit->getFileName(); /* if the file is removed, close its tab to open a new one */ if (!QFile::exists (fname)) @@ -2645,21 +2804,31 @@ return i; } /*************************/ -// This is for both "Save" and "Save As" -bool FPwin::saveFile (bool keepSyntax) +// This is for both "Save" and "Save As". +// See savePrompt() for the meanings of "first" and its following variables. +bool FPwin::saveFile (bool keepSyntax, + int first, int last, bool closingWindow, + QListWidgetItem *curItem, TabPage *curPage) { - if (!isReady()) return false; + if (!isReady()) + { + closePreviousPages_ = false; + return false; + } int index = ui->tabWidget->currentIndex(); - if (index == -1) return false; - TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); + if (tabPage == nullptr) + { + closePreviousPages_ = false; + return false; + } TextEdit *textEdit = tabPage->textEdit(); QString fname = textEdit->getFileName(); - if (fname.isEmpty()) fname = lastFile_; QString filter = tr ("All Files (*)"); - if (!fname.isEmpty() - && QFileInfo (fname).fileName().contains ('.')) + if (fname.isEmpty()) + fname = lastFile_; + else if (QFileInfo (fname).fileName().contains ('.')) { /* if relevant, do filtering to prevent disastrous overwritings */ filter = tr (".%1 Files (*.%1);;All Files (*)").arg (fname.section ('.', -1, -1)); @@ -2705,7 +2874,11 @@ && QObject::sender() != ui->actionSaveAs && QObject::sender() != ui->actionSaveCodec) { - if (hasAnotherDialog()) return false; + if (hasAnotherDialog()) + { + closePreviousPages_ = false; + return false; + } updateShortcuts (true); FileDialog dialog (this, config.getNativeDialog()); dialog.setAcceptMode (QFileDialog::AcceptSave); @@ -2723,12 +2896,14 @@ if (fname.isEmpty() || QFileInfo (fname).isDir()) { updateShortcuts (false); + closePreviousPages_ = false; return false; } } else { updateShortcuts (false); + closePreviousPages_ = false; return false; } updateShortcuts (false); @@ -2737,7 +2912,11 @@ if (QObject::sender() == ui->actionSaveAs) { - if (hasAnotherDialog()) return false; + if (hasAnotherDialog()) + { + closePreviousPages_ = false; + return false; + } updateShortcuts (true); FileDialog dialog (this, config.getNativeDialog()); dialog.setAcceptMode (QFileDialog::AcceptSave); @@ -2755,19 +2934,25 @@ if (fname.isEmpty() || QFileInfo (fname).isDir()) { updateShortcuts (false); + closePreviousPages_ = false; return false; } } else { updateShortcuts (false); + closePreviousPages_ = false; return false; } updateShortcuts (false); } else if (QObject::sender() == ui->actionSaveCodec) { - if (hasAnotherDialog()) return false; + if (hasAnotherDialog()) + { + closePreviousPages_ = false; + return false; + } updateShortcuts (true); FileDialog dialog (this, config.getNativeDialog()); dialog.setAcceptMode (QFileDialog::AcceptSave); @@ -2785,12 +2970,14 @@ if (fname.isEmpty() || QFileInfo (fname).isDir()) { updateShortcuts (false); + closePreviousPages_ = false; return false; } } else { updateShortcuts (false); + closePreviousPages_ = false; return false; } updateShortcuts (false); @@ -2800,7 +2987,7 @@ { /* using text blocks directly is the fastest and lightest way of removing trailing spaces */ - waitToMakeBusy(); + makeBusy(); QTextBlock block = textEdit->document()->firstBlock(); QTextCursor tmpCur = textEdit->textCursor(); tmpCur.beginEditBlock(); @@ -2834,11 +3021,16 @@ /* now, try to write */ QTextDocumentWriter writer (fname, "plaintext"); bool success = false; + bool MSWinLineEnd = false; if (QObject::sender() == ui->actionSaveCodec) { QString encoding = checkToEncoding(); - if (hasAnotherDialog()) return false; + if (hasAnotherDialog()) + { + closePreviousPages_ = false; + return false; + } updateShortcuts (true); MessageBox msgBox (this); msgBox.setIcon (QMessageBox::Question); @@ -2850,6 +3042,7 @@ msgBox.changeButtonText (QMessageBox::Cancel, tr ("Cancel")); msgBox.setText ("
" + tr ("Do you want to use MS Windows end-of-lines?") + "
"); msgBox.setInformativeText ("
" + tr ("This may be good for readability under MS Windows.") + "
"); + msgBox.setDefaultButton (QMessageBox::No); msgBox.setWindowModality (Qt::WindowModal); QString contents; size_t ln; @@ -2858,10 +3051,11 @@ const char *txt; switch (msgBox.exec()) { case QMessageBox::Yes: + MSWinLineEnd = true; contents = textEdit->document()->toPlainText(); contents.replace ("\n", "\r\n"); ln = static_cast(contents.length()); // for fwrite(); - codec = QTextCodec::codecForName (checkToEncoding().toUtf8()); + codec = QTextCodec::codecForName (encoding.toUtf8()); encodedString = codec->fromUnicode (contents); txt = encodedString.constData(); if (encoding != "UTF-16") @@ -2881,7 +3075,7 @@ file = fopen (fname.toUtf8().constData(), "wb"); if (file != nullptr) { - /* this worked correctly as I far as I tested */ + /* this worked correctly as far as I tested */ fwrite (txt , 2 , ln + 1 , file); fclose (file); success = true; @@ -2893,10 +3087,13 @@ break; default: updateShortcuts (false); + closePreviousPages_ = false; return false; } updateShortcuts (false); } + else + encodingToCheck ("UTF-8"); // UTF-8 is the default encoding with saving if (!success) success = writer.write (textEdit->document()); @@ -2914,11 +3111,7 @@ if (!tip.endsWith ("/")) tip += "/"; QFontMetrics metrics (QToolTip::font()); QString elidedTip = "

" -#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0)) + metrics.elidedText (tip, Qt::ElideMiddle, 200 * metrics.horizontalAdvance (' ')) -#else - + metrics.elidedText (tip, Qt::ElideMiddle, 200 * metrics.width (' ')) -#endif + "

"; ui->tabWidget->setTabToolTip (index, elidedTip); if (!sideItems_.isEmpty()) @@ -2928,82 +3121,359 @@ } lastFile_ = fname; config.addRecentFile (lastFile_); - if (!keepSyntax) - { // uninstall and reinstall the syntax highlgihter if the programming language is changed - QString prevLan = textEdit->getProg(); - setProgLang (textEdit); - if (prevLan != textEdit->getProg()) + + /* if this isn't about deleting after saving, correct the + encoding (set it to UTF-8) if needed, as in enforceEncoding() */ + if ((index <= first || (index >= last && last >= 0)) + && textEdit->getEncoding() != checkToEncoding()) + { + loadText (fname, true, true, + 0, 0, + textEdit->isUneditable(), false); + } + else if (!keepSyntax) + reloadSyntaxHighlighter (textEdit); + } + else + { + /* when every attempt at saving fails, try to save as root */ + if (QFile::exists (fname)) + { + if (!QFileInfo (fname).permission (QFile::WriteUser)) { - if (config.getShowLangSelector() && config.getSyntaxByDefault()) - { - if (textEdit->getLang() == textEdit->getProg()) - textEdit->setLang (QString()); // not enforced because it's the real syntax - updateLangBtn (textEdit); - } + saveAsRoot (fname, tabPage, first, last, closingWindow, curItem, curPage, MSWinLineEnd); + return false; // the probable saving will be done with a dealy + } + } + /* check the containing folder (which is guaranteed to exist) */ + else if (!QFileInfo (fname.section ("/", 0, -2)).permission (QFile::WriteUser)) + { + saveAsRoot (fname, tabPage, first, last, closingWindow, curItem, curPage, MSWinLineEnd); + return false; + } - if (ui->statusBar->isVisible() - && textEdit->getWordNumber() != -1) - { // we want to change the statusbar text below - disconnect (textEdit->document(), &QTextDocument::contentsChange, this, &FPwin::updateWordInfo); - } + closePreviousPages_ = false; + /* NOTE: Is it possible to reach this? + It was needed before saveAsRoot() was added. */ + QString error = writer.device()->errorString(); + QTimer::singleShot (0, this, [this, error]() { + showWarningBar ("
" + tr ("Cannot be saved!") + "
\n" + + "
" + error + "
", + 15); + }); + } - if (textEdit->getLang().isEmpty()) - { // restart the syntax highlighting only when the language isn't forced - syntaxHighlighting (textEdit, false); - if (ui->actionSyntax->isChecked()) - syntaxHighlighting (textEdit); - } + if (success && textEdit->isReadOnly() && !alreadyOpen (tabPage)) + QTimer::singleShot (0, this, &FPwin::makeEditable); - if (ui->statusBar->isVisible()) - { // correct the statusbar text just by replacing the old syntax info - QLabel *statusLabel = ui->statusBar->findChild("statusLabel"); - QString str = statusLabel->text(); - QString syntaxStr = tr ("Syntax"); - int i = str.indexOf (syntaxStr); - if (i == -1) // there was no real language before saving (prevLan was "url") + return success; +} +/*************************/ +// Here, "first" and "last" are as in closePages(). "curItem"/"curPage" is the +// item/tab that should be made current in side-pane/tab-bar again, after saving +// and closing. "MSWinLineEnd" shows whether MS Windows end-of-lines are used. +void FPwin::saveAsRoot (const QString& fileName, TabPage *tabPage, + int first, int last, bool closingWindow, + QListWidgetItem *curItem, TabPage *curPage, + bool MSWinLineEnd) +{ + QString temp = QStandardPaths::writableLocation (QStandardPaths::TempLocation); + if (temp.isEmpty()) return; // impossible + const QString curTime = QDateTime::currentDateTime().toString ("yyyyMMddhhmmsszzz"); + QString fname = temp + "/" + "featherpad-" + curTime; + TextEdit *textEdit = tabPage->textEdit(); + QTextDocumentWriter writer (fname, "plaintext"); + bool success = false; + if (QObject::sender() == ui->actionSaveCodec) + { + QString encoding = checkToEncoding(); + if (MSWinLineEnd) + { + QString contents =textEdit->document()->toPlainText(); + contents.replace ("\n", "\r\n"); + size_t ln = static_cast(contents.length()); + QTextCodec *codec = QTextCodec::codecForName (encoding.toUtf8()); + QByteArray encodedString = codec->fromUnicode (contents); + const char *txt = encodedString.constData(); + if (encoding != "UTF-16") + { + std::ofstream file; + file.open (fname.toUtf8().constData()); + if (file.is_open()) + { + file << txt; + file.close(); + success = true; + } + } + else + { + FILE * file; + file = fopen (fname.toUtf8().constData(), "wb"); + if (file != nullptr) + { + fwrite (txt , 2 , ln + 1 , file); + fclose (file); + success = true; + } + } + } + else + writer.setCodec (QTextCodec::codecForName (encoding.toUtf8())); + } + else + encodingToCheck ("UTF-8"); + if (!success) + success = writer.write (textEdit->document()); + + if (success) + { // use "pkexec" to copy the temporary file to the target file + showWarningBar ("
" + tr ("Saving as root.") + "
\n" + + "
" + tr ("Waiting for authentication...") + "
", + 0); + lockWindow (tabPage, true); // wait until the following process is finished + QProcess *fileProcess = new QProcess (this); + connect (fileProcess, QOverload::of(&QProcess::finished), textEdit, + [=](int exitCode, QProcess::ExitStatus exitStatus) { + lockWindow (tabPage, false); + QFile::remove (fname); + if (exitStatus != QProcess::NormalExit || exitCode != 0) + { + lastWinFilesCur_.clear(); // wasn't cleared at closeEvent() + closePreviousPages_ = false; + fileProcess->setReadChannel (QProcess::StandardError); + QString error = fileProcess->readAllStandardError(); + showWarningBar ("
" + tr ("Cannot be saved!") + "
\n" + + "
" + error + "
", + 15); + } + else + { + closeWarningBar(); + QFileInfo fInfo (fileName); + int tabIndex = ui->tabWidget->currentIndex(); + /* because the closing range isn't necessarily about tab indexes, + "index" will be set again below if the side pane is visible */ + int index = tabIndex; + + textEdit->document()->setModified (false); + textEdit->setFileName (fileName); + textEdit->setSize (fInfo.size()); + textEdit->setLastModified (fInfo.lastModified()); + ui->actionReload->setDisabled (false); + setTitle (fileName); + QString tip (fInfo.absolutePath()); + if (!tip.endsWith ("/")) tip += "/"; + QFontMetrics metrics (QToolTip::font()); + QString elidedTip = "

" + + metrics.elidedText (tip, Qt::ElideMiddle, 200 * metrics.horizontalAdvance (' ')) + + "

"; + ui->tabWidget->setTabToolTip (tabIndex, elidedTip); + if (sidePane_ && !sideItems_.isEmpty()) + { + if (QListWidgetItem *wi = sideItems_.key (tabPage)) { - QString lineStr = "   " + tr ("Lines"); - int j = str.indexOf (lineStr); - syntaxStr = "   " + tr ("Syntax") + QString (": %1") - .arg (textEdit->getProg()); - str.insert (j, syntaxStr); + wi->setToolTip (elidedTip); + index = sidePane_->listWidget()->row (wi); + } + else index = -1; // never happens + } + lastFile_ = fileName; + Config& config = static_cast(qApp)->getConfig(); + config.addRecentFile (lastFile_); + + if (index > first && (index < last || last < 0)) + { + /* close this tab, as in closeTabAtIndex() */ + deleteTabPage (tabIndex, + closingWindow && (lastWinFilesCur_.size() >= MAX_LAST_WIN_FILES ? false : true), + !closingWindow); + int count = ui->tabWidget->count(); + if (count == 0) + { + ui->actionReload->setDisabled (true); + ui->actionSave->setDisabled (true); + enableWidgets (false); } else { - if (textEdit->getProg() == "url") // there's no real language after saving - { - syntaxStr = "   " + tr ("Syntax"); - QString lineStr = "   " + tr ("Lines"); - int j = str.indexOf (syntaxStr); - int k = str.indexOf (lineStr); - str.remove (j, k - j); - } - else // the language is changed by saving - { - QString lineStr = "   " + tr ("Lines"); - int j = str.indexOf (lineStr); - int offset = syntaxStr.count() + 9; // size of ": " - str.replace (i + offset, j - i - offset, textEdit->getProg()); + if (count == 1) + updateGUIForSingleTab (true); + + /* restore the current page/item */ + if (curItem && sidePane_) + sidePane_->listWidget()->setCurrentItem (curItem); + else if (curPage && !sidePane_) + ui->tabWidget->setCurrentWidget (curPage); + + if (TabPage *curTabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget())) + curTabPage->textEdit()->setFocus(); + } + if (closingWindow) close(); + else + { + if (closePreviousPages_ && last < 0 && index == first + 1) + { // continue closing previous pages + closePreviousPages_ = false; + closePages (-1, first); } + else + closePages (first, last - 1); } - statusLabel->setText (str); - if (textEdit->getWordNumber() != -1) - connect (textEdit->document(), &QTextDocument::contentsChange, this, &FPwin::updateWordInfo); + } + else if (textEdit->getEncoding() != checkToEncoding()) + { // correct the encoding + lastWinFilesCur_.clear(); // just a precaution + closePreviousPages_ = false; + loadText (fileName, true, true, + 0, 0, + textEdit->isUneditable(), false); + } + else + { + /* the tab is neither closed not reloaded; + update its highlighting if needed */ + lastWinFilesCur_.clear(); + closePreviousPages_ = false; + reloadSyntaxHighlighter (textEdit); } } + fileProcess->deleteLater(); + }); + + fileProcess->start ("pkexec", QStringList() << "--disable-internal-agent" << "cp" << fname << fileName); + if (!fileProcess->waitForStarted()) + { + lockWindow (tabPage, false); + QFile::remove (fname); + lastWinFilesCur_.clear(); + closePreviousPages_ = false; + showWarningBar ("
" + tr ("Cannot be saved!") + "
\n" + + "
" + tr ("\"pkexec\" is not found. Please install Polkit!") + "
", + 15); + fileProcess->deleteLater(); + return; } } else { - QString str = writer.device()->errorString(); + lastWinFilesCur_.clear(); + closePreviousPages_ = false; + QString error = writer.device()->errorString(); showWarningBar ("
" + tr ("Cannot be saved!") + "
\n" - + "
" + QString ("
%1.
").arg (str) + "
"); + + "
" + error + "
", + 15); } if (success && textEdit->isReadOnly() && !alreadyOpen (tabPage)) QTimer::singleShot (0, this, &FPwin::makeEditable); +} +/*************************/ +void FPwin::reloadSyntaxHighlighter (TextEdit *textEdit) +{ // uninstall and reinstall the syntax highlgihter if the programming language is changed + QString prevLan = textEdit->getProg(); + setProgLang (textEdit); + if (prevLan == textEdit->getProg()) + return; - return success; + Config config = static_cast(qApp)->getConfig(); + if (config.getShowLangSelector() && config.getSyntaxByDefault()) + { + if (textEdit->getLang() == textEdit->getProg()) + textEdit->setLang (QString()); // not enforced because it's the real syntax + updateLangBtn (textEdit); + } + + if (ui->statusBar->isVisible() + && textEdit->getWordNumber() != -1) + { // we want to change the statusbar text below + disconnect (textEdit->document(), &QTextDocument::contentsChange, this, &FPwin::updateWordInfo); + } + + if (textEdit->getLang().isEmpty()) + { // restart the syntax highlighting only when the language isn't forced + syntaxHighlighting (textEdit, false); + if (ui->actionSyntax->isChecked()) + syntaxHighlighting (textEdit); + } + + if (ui->statusBar->isVisible()) + { // correct the statusbar text just by replacing the old syntax info + QLabel *statusLabel = ui->statusBar->findChild("statusLabel"); + QString str = statusLabel->text(); + QString syntaxStr = tr ("Syntax"); + int i = str.indexOf (syntaxStr); + if (i == -1) // there was no real language before saving (prevLan was "url") + { + QString lineStr = "   " + tr ("Lines"); + int j = str.indexOf (lineStr); + syntaxStr = "   " + tr ("Syntax") + QString (": %1") + .arg (textEdit->getProg()); + str.insert (j, syntaxStr); + } + else + { + if (textEdit->getProg() == "url") // there's no real language after saving + { + syntaxStr = "   " + tr ("Syntax"); + QString lineStr = "   " + tr ("Lines"); + int j = str.indexOf (syntaxStr); + int k = str.indexOf (lineStr); + str.remove (j, k - j); + } + else // the language is changed by saving + { + QString lineStr = "
   " + tr ("Lines"); + int j = str.indexOf (lineStr); + int offset = syntaxStr.count() + 9; // size of ": " + str.replace (i + offset, j - i - offset, textEdit->getProg()); + } + } + statusLabel->setText (str); + if (textEdit->getWordNumber() != -1) + connect (textEdit->document(), &QTextDocument::contentsChange, this, &FPwin::updateWordInfo); + } +} +/*************************/ +void FPwin::lockWindow (TabPage *tabPage, bool lock) +{ + locked_ = lock; + if (lock) + { + pauseAutoSaving (true); + /* close Session Manager */ + QList dialogs = findChildren(); + for (int i = 0; i < dialogs.count(); ++i) + { + if (dialogs.at (i)->objectName() == "sessionDialog") + { + dialogs.at (i)->close(); + break; + } + } + } + ui->menuBar->setEnabled (!lock); + const auto allMenus = ui->menuBar->findChildren(); + for (const auto &thisMenu : allMenus) + { + const auto menuActions = thisMenu->actions(); + for (const auto &menuAction : menuActions) + menuAction->blockSignals (lock); + } + ui->tabWidget->tabBar()->blockSignals (lock); + ui->tabWidget->tabBar()->lockTabs (lock); + tabPage->lockPage (lock); + ui->dockReplace->setEnabled (!lock); + ui->statusBar->setEnabled (!lock); + ui->spinBox->setEnabled (!lock); + ui->checkBox->setEnabled (!lock); + if (sidePane_) + sidePane_->lockPane (lock); + if (!lock) + { + tabPage->textEdit()->setFocus(); + pauseAutoSaving (false); + } } /*************************/ void FPwin::cutText() @@ -3024,6 +3494,21 @@ tabPage->textEdit()->paste(); } /*************************/ +void FPwin::toSoftTabs() +{ + if (TabPage *tabPage = qobject_cast(ui->tabWidget->currentWidget())) + { + makeBusy(); + bool res = tabPage->textEdit()->toSoftTabs(); + unbusy(); + if (res) + { + removeGreenSel(); + showWarningBar ("
" + tr ("Text tabs are converted to spaces.") + "
"); + } + } +} +/*************************/ void FPwin::insertDate() { if (TabPage *tabPage = qobject_cast(ui->tabWidget->currentWidget())) @@ -3078,6 +3563,61 @@ } } /*************************/ +void FPwin::startCase() +{ + if (TabPage *tabPage = qobject_cast(ui->tabWidget->currentWidget())) + { + TextEdit *textEdit = tabPage->textEdit(); + if (!textEdit->isReadOnly()) + { + bool showWarning = false; + QTextCursor cur = textEdit->textCursor(); + int start = qMin (cur.anchor(), cur.position()); + int end = qMax (cur.anchor(), cur.position()); + if (end > start + 50000) + { + showWarning = true; + end = start + 50000; + } + + cur.setPosition (start); + QString blockText = cur.block().text(); + int blockPos = cur.block().position(); + while (start > blockPos && !blockText.at (start - blockPos - 1).isSpace()) + -- start; + + cur.setPosition (end); + blockText = cur.block().text(); + blockPos = cur.block().position(); + while (end < blockPos + blockText.size() && !blockText.at (end - blockPos).isSpace()) + ++ end; + + cur.setPosition (start); + cur.setPosition (end, QTextCursor::KeepAnchor); + QString str = textEdit->locale().toLower (cur.selectedText()); + + start = 0; + QRegularExpressionMatch match; + /* QTextCursor::selectedText() uses "U+2029" instead of "\n" */ + while ((start = str.indexOf (QRegularExpression ("[^\\s\\.\\x{2029}]+"), start, &match)) > -1) + { + str.replace (start, 1, str.at (start).toUpper()); + start += match.capturedLength(); + } + + cur.beginEditBlock(); + textEdit->setTextCursor (cur); + textEdit->insertPlainText (str); + textEdit->ensureCursorVisible(); + cur.endEditBlock(); + + if (showWarning) + showWarningBar ("
" + tr ("The selected text was too long.") + "
\n" + + "
" + tr ("It is not fully processed.") + "
"); + } + } +} +/*************************/ void FPwin::enableSortLines() { if (TabPage *tabPage = qobject_cast(ui->tabWidget->currentWidget())) @@ -3105,10 +3645,10 @@ { if (!isReady()) return; - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; - TextEdit *textEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (index))->textEdit(); + TextEdit *textEdit = tabPage->textEdit(); bool textIsSelected = textEdit->textCursor().hasSelection(); textEdit->setReadOnly (false); @@ -3130,28 +3670,27 @@ ui->actionEdit->setVisible (false); ui->actionPaste->setEnabled (true); + ui->actionSoftTab->setEnabled (true); ui->actionDate->setEnabled (true); ui->actionCopy->setEnabled (textIsSelected); ui->actionCut->setEnabled (textIsSelected); ui->actionDelete->setEnabled (textIsSelected); ui->actionUpperCase->setEnabled (textIsSelected); ui->actionLowerCase->setEnabled (textIsSelected); + ui->actionStartCase->setEnabled (textIsSelected); connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionCut, &QAction::setEnabled); connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionDelete, &QAction::setEnabled); connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionUpperCase, &QAction::setEnabled); connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionLowerCase, &QAction::setEnabled); + connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionStartCase, &QAction::setEnabled); if (config.getSaveUnmodified()) ui->actionSave->setEnabled (true); } /*************************/ void FPwin::undoing() { - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; - - TextEdit *textEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (index))->textEdit(); - textEdit->removeGreenHighlights(); // always remove replacing highlights before undoing - textEdit->undo(); + if (TabPage *tabPage = qobject_cast(ui->tabWidget->currentWidget())) + tabPage->textEdit()->undo(); } /*************************/ void FPwin::redoing() @@ -3160,9 +3699,10 @@ tabPage->textEdit()->redo(); } /*************************/ -void FPwin::changeTab (QListWidgetItem *current, QListWidgetItem* /*previous*/) +void FPwin::changeTab (QListWidgetItem *current) { if (!sidePane_ || sideItems_.isEmpty()) return; + /* "current" is never null; see the c-tor of ListWidget in "sidepane.cpp" */ ui->tabWidget->setCurrentWidget (sideItems_.value (current)); } /*************************/ @@ -3181,14 +3721,14 @@ // Called with a timeout after tab switching (changes the window title, sets action states, etc.) void FPwin::tabSwitch (int index) { - if (index == -1) + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); + if (tabPage == nullptr) { setWindowTitle ("FeatherPad[*]"); setWindowModified (false); return; } - TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); TextEdit *textEdit = tabPage->textEdit(); if (!tabPage->isSearchBarVisible() && !sidePane_) textEdit->setFocus(); @@ -3213,7 +3753,8 @@ onOpeningNonexistent(); else if (textEdit->getLastModified() != info.lastModified()) showWarningBar ("
" + tr ("This file has been modified elsewhere or in another way!") + "
\n" - + "
" + tr ("Please be careful about reloading or saving this document!") + "
"); + + "
" + tr ("Please be careful about reloading or saving this document!") + "
", + 15); } if (modified) shownName.prepend ("*"); @@ -3243,13 +3784,16 @@ { ui->actionEdit->setVisible (false); ui->actionSaveAs->setEnabled (true); + ui->actionSaveCodec->setEnabled (true); } else { ui->actionEdit->setVisible (readOnly && !textEdit->isUneditable()); ui->actionSaveAs->setEnabled (!textEdit->isUneditable()); + ui->actionSaveCodec->setEnabled (!textEdit->isUneditable()); } ui->actionPaste->setEnabled (!readOnly); + ui->actionSoftTab->setEnabled (!readOnly); ui->actionDate->setEnabled (!readOnly); bool textIsSelected = textEdit->textCursor().hasSelection(); ui->actionCopy->setEnabled (textIsSelected); @@ -3257,6 +3801,7 @@ ui->actionDelete->setEnabled (!readOnly && textIsSelected); ui->actionUpperCase->setEnabled (!readOnly && textIsSelected); ui->actionLowerCase->setEnabled (!readOnly && textIsSelected); + ui->actionStartCase->setEnabled (!readOnly && textIsSelected); if (isScriptLang (textEdit->getProg()) && info.isExecutable()) ui->actionRun->setVisible (config.getExecuteScripts()); @@ -3300,7 +3845,7 @@ if (!title.isEmpty()) ui->dockReplace->setWindowTitle (title); else - ui->dockReplace->setWindowTitle (tr ("Rep&lacement")); + ui->dockReplace->setWindowTitle (tr ("Replacement")); } else textEdit->setReplaceTitle (QString()); @@ -3310,13 +3855,13 @@ { if (isLoading()) return; - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; if (hasAnotherDialog()) return; updateShortcuts (true); - TextEdit *textEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (index))->textEdit(); + TextEdit *textEdit = tabPage->textEdit(); QFont currentFont = textEdit->getDefaultFont(); FontDialog fd (currentFont, this); @@ -3400,7 +3945,8 @@ } else if (textEdit->getLastModified() != QFileInfo (fname).lastModified()) showWarningBar ("
" + tr ("This file has been modified elsewhere or in another way!") + "
\n" - + "
" + tr ("Please be careful about reloading or saving this document!") + "
"); + + "
" + tr ("Please be careful about reloading or saving this document!") + "
", + 15); } } } @@ -3411,10 +3957,9 @@ { if (!isReady()) return; - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; - TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); bool isFocused = tabPage->isSearchBarVisible() && tabPage->searchBarHasFocus(); if (!isFocused) @@ -3439,6 +3984,7 @@ textEdit->setGreenSel (es); // not needed if (ui->actionLineNumbers->isChecked() || ui->spinBox->isVisible()) es.prepend (textEdit->currentLineSelection()); + es.append (textEdit->getBlueSel()); es.append (textEdit->getRedSel()); textEdit->setExtraSelections (es); /* ... and empty all search entries */ @@ -3591,7 +4137,7 @@ ui->actionCyrillic_ISO_8859_5->setChecked (true); else if (encoding == "BIG5") ui->actionChinese_BIG5->setChecked (true); - else if (encoding == "B18030") + else if (encoding == "GB18030") ui->actionChinese_GB18030->setChecked (true); else if (encoding == "ISO-2022-JP") ui->actionJapanese_ISO_2022_JP->setChecked (true); @@ -3641,7 +4187,7 @@ else if (ui->actionChinese_BIG5->isChecked()) encoding = "BIG5"; else if (ui->actionChinese_GB18030->isChecked()) - encoding = "B18030"; + encoding = "GB18030"; else if (ui->actionJapanese_ISO_2022_JP->isChecked()) encoding = "ISO-2022-JP"; else if (ui->actionJapanese_ISO_2022_JP_2->isChecked()) @@ -3682,11 +4228,10 @@ return; } - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; - statusMsgWithLineCount (qobject_cast< TabPage *>(ui->tabWidget->widget (index)) - ->textEdit()->document()->blockCount()); + statusMsgWithLineCount (tabPage->textEdit()->document()->blockCount()); for (int i = 0; i < ui->tabWidget->count(); ++i) { TextEdit *thisTextEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (i))->textEdit(); @@ -3758,7 +4303,7 @@ if (!posLabel) return; TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); - if (!tabPage) return; + if (tabPage == nullptr) return; int pos = tabPage->textEdit()->textCursor().positionInBlock(); QString charN; @@ -3796,7 +4341,7 @@ if (!langButton) return; TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); - if (!tabPage) return; + if (tabPage == nullptr) return; TextEdit *textEdit = tabPage->textEdit(); QString lang = action->text(); @@ -3819,9 +4364,9 @@ if (ui->actionSyntax->isChecked()) { syntaxHighlighting (textEdit, false); - waitToMakeBusy(); // it may take a while with huge texts + makeBusy(); // it may take a while with huge texts syntaxHighlighting (textEdit, true, lang); - QTimer::singleShot (0, this, [this]() {unbusy();}); + QTimer::singleShot (0, this, &FPwin::unbusy); } } /*************************/ @@ -3829,9 +4374,9 @@ { QToolButton *wordButton = ui->statusBar->findChild("wordButton"); if (!wordButton) return; - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; - TextEdit *textEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (index))->textEdit(); + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; + TextEdit *textEdit = tabPage->textEdit(); /* ensure that the signal comes from the active tab (when the info is going to be removed) */ if (qobject_cast(QObject::sender()) && QObject::sender() != textEdit->document()) return; @@ -3843,7 +4388,11 @@ if (words == -1) { words = textEdit->toPlainText() +#if (QT_VERSION >= QT_VERSION_CHECK(5,15,0)) + .split (QRegularExpression ("(\\s|\\n|\\r)+"), Qt::SkipEmptyParts) +#else .split (QRegularExpression ("(\\s|\\n|\\r)+"), QString::SkipEmptyParts) +#endif .count(); textEdit->setWordNumber (words); } @@ -3865,19 +4414,21 @@ /*************************/ void FPwin::filePrint() { - if (isLoading()) return; + if (isLoading() || hasAnotherDialog()) + return; - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; - if (hasAnotherDialog()) return; - updateShortcuts (true); + showWarningBar ("
" + tr ("Printing in progress...") + "
", + 0); + lockWindow (tabPage, true); - TextEdit *textEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (index))->textEdit(); + TextEdit *textEdit = tabPage->textEdit(); /* complete the syntax highlighting when printing because the whole document may not be highlighted */ - waitToMakeBusy(); + makeBusy(); if (Highlighter *highlighter = qobject_cast< Highlighter *>(textEdit->getHighlighter())) { QTextCursor start = textEdit->textCursor(); @@ -3896,9 +4447,7 @@ block = block.next(); } } - QTimer::singleShot (0, this, [this]() {unbusy();}); // wait for the dialog too - - QPrinter printer (QPrinter::HighResolution); + QTimer::singleShot (0, this, &FPwin::unbusy); // wait for the dialog too /* choose an appropriate name and directory */ QString fileName = textEdit->getFileName(); @@ -3907,24 +4456,37 @@ QDir dir = QDir::home(); fileName= dir.filePath (tr ("Untitled")); } - if (printer.outputFormat() == QPrinter::PdfFormat) - printer.setOutputFileName (fileName.append (".pdf")); - /*else if (printer.outputFormat() == QPrinter::PostScriptFormat) - printer.setOutputFileName (fileName.append (".ps"));*/ + fileName.append (".pdf"); + + bool Use96Dpi = QCoreApplication::instance()->testAttribute (Qt::AA_Use96Dpi); + QScreen *screen = QGuiApplication::primaryScreen(); + qreal sourceDpiX = Use96Dpi ? 96 : screen ? screen->logicalDotsPerInchX() : 100; + qreal sourceDpiY = Use96Dpi ? 96 : screen ? screen->logicalDotsPerInchY() : 100; + Printing *thread = new Printing (textEdit->document(), + fileName, + textEdit->getTextPrintColor(), + textEdit->getDarkValue(), + sourceDpiX, + sourceDpiY); - QPrintDialog dlg (&printer, this); + QPrintDialog dlg (thread->printer(), this); dlg.setWindowModality (Qt::WindowModal); - if (textEdit->textCursor().hasSelection()) - dlg.setOption (QAbstractPrintDialog::PrintSelection); dlg.setWindowTitle (tr ("Print Document")); if (dlg.exec() == QDialog::Accepted) { - waitToMakeBusy(); - textEdit->print (&printer); - QTimer::singleShot (0, this, [this]() {unbusy();}); + connect (thread, &Loading::finished, thread, &QObject::deleteLater); + connect (thread, &Loading::finished, tabPage, [this, tabPage] { + lockWindow (tabPage, false); + showWarningBar ("
" + tr ("Printing completed.") + "
"); + }); + thread->start(); + } + else + { + delete thread; + lockWindow (tabPage, false); + closeWarningBar(); } - - updateShortcuts (false); } /*************************/ void FPwin::nextTab() @@ -3937,6 +4499,14 @@ if (sidePane_) { int curRow = sidePane_->listWidget()->currentRow(); + if (curRow < 0 && !sideItems_.isEmpty()) + { + if (TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index))) + { + if (QListWidgetItem *wi = sideItems_.key (tabPage)) + curRow = sidePane_->listWidget()->row (wi); + } + } if (curRow == sidePane_->listWidget()->count() - 1) { if (static_cast(qApp)->getConfig().getTabWrapAround()) @@ -3964,6 +4534,14 @@ if (sidePane_) { int curRow = sidePane_->listWidget()->currentRow(); + if (curRow < 0 && !sideItems_.isEmpty()) + { + if (TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index))) + { + if (QListWidgetItem *wi = sideItems_.key (tabPage)) + curRow = sidePane_->listWidget()->row (wi); + } + } if (curRow == 0) { if (static_cast(qApp)->getConfig().getTabWrapAround()) @@ -4039,7 +4617,8 @@ index = ui->tabWidget->indexOf (sideItems_.value (sidePane_->listWidget()->item (rightClicked_))); else index = ui->tabWidget->currentIndex(); - if (index == -1 || ui->tabWidget->count() == 1) + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); + if (tabPage == nullptr || ui->tabWidget->count() == 1) { ui->tabWidget->tabBar()->finishMouseMoveEvent(); return; @@ -4073,10 +4652,10 @@ statusCurPos = true; } - TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); TextEdit *textEdit = tabPage->textEdit(); - disconnect (textEdit, &TextEdit::updateRect, this, &FPwin::hlighting); + disconnect (textEdit, &TextEdit::resized, this, &FPwin::hlight); + disconnect (textEdit, &TextEdit::updateRect, this, &FPwin::hlight); disconnect (textEdit, &QPlainTextEdit::textChanged, this, &FPwin::hlight); if (status) { @@ -4089,14 +4668,15 @@ disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionDelete, &QAction::setEnabled); disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionUpperCase, &QAction::setEnabled); disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionLowerCase, &QAction::setEnabled); + disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionStartCase, &QAction::setEnabled); disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionCopy, &QAction::setEnabled); disconnect (textEdit, &QWidget::customContextMenuRequested, this, &FPwin::editorContextMenu); disconnect (textEdit, &TextEdit::zoomedOut, this, &FPwin::reformat); disconnect (textEdit, &TextEdit::fileDropped, this, &FPwin::newTabFromName); disconnect (textEdit, &TextEdit::updateBracketMatching, this, &FPwin::matchBrackets); disconnect (textEdit, &QPlainTextEdit::blockCountChanged, this, &FPwin::formatOnBlockChange); - disconnect (textEdit, &TextEdit::updateRect, this, &FPwin::formatVisibleText); - disconnect (textEdit, &TextEdit::resized, this, &FPwin::formatOnResizing); + disconnect (textEdit, &TextEdit::updateRect, this, &FPwin::formatTextRect); + disconnect (textEdit, &TextEdit::resized, this, &FPwin::formatTextRect); disconnect (textEdit->document(), &QTextDocument::contentsChange, this, &FPwin::updateWordInfo); disconnect (textEdit->document(), &QTextDocument::contentsChange, this, &FPwin::formatOnTextChange); @@ -4148,13 +4728,21 @@ if (dropTarget->sidePane_) { ListWidget *lw = dropTarget->sidePane_->listWidget(); - if (textEdit->document()->isModified()) + QString fname = textEdit->getFileName(); + if (fname.isEmpty()) { - tabText.remove (0, 1); - tabText.append ("*"); + if (textEdit->getProg() == "help") + fname = "** " + tr ("Help") + " **"; + else + fname = tr ("Untitled"); } - QListWidgetItem *lwi = new QListWidgetItem (isLink ? QIcon (":icons/link.svg") : QIcon(), - tabText, lw); + else + fname = fname.section ('/', -1); + if (textEdit->document()->isModified()) + fname.append ("*"); + fname.replace ("\n", " "); + ListWidgetItem *lwi = new ListWidgetItem (isLink ? QIcon (":icons/link.svg") : QIcon(), + fname, lw); lw->setToolTip (tooltip); dropTarget->sideItems_.insert (lwi, tabPage); lw->addItem (lwi); @@ -4191,7 +4779,8 @@ if (!textEdit->getSearchedText().isEmpty()) { connect (textEdit, &QPlainTextEdit::textChanged, dropTarget, &FPwin::hlight); - connect (textEdit, &TextEdit::updateRect, dropTarget, &FPwin::hlighting); + connect (textEdit, &TextEdit::updateRect, dropTarget, &FPwin::hlight); + connect (textEdit, &TextEdit::resized, dropTarget, &FPwin::hlight); /* restore yellow highlights, which will automatically set the current line highlight if needed because the spin button and line number menuitem are set above */ @@ -4248,6 +4837,7 @@ connect (textEdit, &QPlainTextEdit::copyAvailable, dropTarget->ui->actionDelete, &QAction::setEnabled); connect (textEdit, &QPlainTextEdit::copyAvailable, dropTarget->ui->actionUpperCase, &QAction::setEnabled); connect (textEdit, &QPlainTextEdit::copyAvailable, dropTarget->ui->actionLowerCase, &QAction::setEnabled); + connect (textEdit, &QPlainTextEdit::copyAvailable, dropTarget->ui->actionStartCase, &QAction::setEnabled); } connect (textEdit, &TextEdit::fileDropped, dropTarget, &FPwin::newTabFromName); connect (textEdit, &TextEdit::zoomedOut, dropTarget, &FPwin::reformat); @@ -4255,13 +4845,16 @@ textEdit->setFocus(); - dropTarget->raise(); - dropTarget->activateWindow(); + dropTarget->stealFocus(); } /*************************/ void FPwin::dropTab (const QString& str) { +#if (QT_VERSION >= QT_VERSION_CHECK(5,15,0)) + QStringList list = str.split ("+", Qt::SkipEmptyParts); +#else QStringList list = str.split ("+", QString::SkipEmptyParts); +#endif if (list.count() != 2) { ui->tabWidget->tabBar()->finishMouseMoveEvent(); @@ -4306,9 +4899,15 @@ ln = true; TabPage *tabPage = qobject_cast< TabPage *>(dragSource->ui->tabWidget->widget (index)); + if (tabPage == nullptr) + { + ui->tabWidget->tabBar()->finishMouseMoveEvent(); + return; + } TextEdit *textEdit = tabPage->textEdit(); - disconnect (textEdit, &TextEdit::updateRect, dragSource, &FPwin::hlighting); + disconnect (textEdit, &TextEdit::resized, dragSource, &FPwin::hlight); + disconnect (textEdit, &TextEdit::updateRect, dragSource, &FPwin::hlight); disconnect (textEdit, &QPlainTextEdit::textChanged, dragSource, &FPwin::hlight); if (dragSource->ui->statusBar->isVisible()) { @@ -4321,14 +4920,15 @@ disconnect (textEdit, &QPlainTextEdit::copyAvailable, dragSource->ui->actionDelete, &QAction::setEnabled); disconnect (textEdit, &QPlainTextEdit::copyAvailable, dragSource->ui->actionUpperCase, &QAction::setEnabled); disconnect (textEdit, &QPlainTextEdit::copyAvailable, dragSource->ui->actionLowerCase, &QAction::setEnabled); + disconnect (textEdit, &QPlainTextEdit::copyAvailable, dragSource->ui->actionStartCase, &QAction::setEnabled); disconnect (textEdit, &QPlainTextEdit::copyAvailable, dragSource->ui->actionCopy, &QAction::setEnabled); disconnect (textEdit, &QWidget::customContextMenuRequested, dragSource, &FPwin::editorContextMenu); disconnect (textEdit, &TextEdit::zoomedOut, dragSource, &FPwin::reformat); disconnect (textEdit, &TextEdit::fileDropped, dragSource, &FPwin::newTabFromName); disconnect (textEdit, &TextEdit::updateBracketMatching, dragSource, &FPwin::matchBrackets); disconnect (textEdit, &QPlainTextEdit::blockCountChanged, dragSource, &FPwin::formatOnBlockChange); - disconnect (textEdit, &TextEdit::updateRect, dragSource, &FPwin::formatVisibleText); - disconnect (textEdit, &TextEdit::resized, dragSource, &FPwin::formatOnResizing); + disconnect (textEdit, &TextEdit::updateRect, dragSource, &FPwin::formatTextRect); + disconnect (textEdit, &TextEdit::resized, dragSource, &FPwin::formatTextRect); disconnect (textEdit->document(), &QTextDocument::contentsChange, dragSource, &FPwin::updateWordInfo); disconnect (textEdit->document(), &QTextDocument::contentsChange, dragSource, &FPwin::formatOnTextChange); @@ -4388,13 +4988,21 @@ if (sidePane_) { ListWidget *lw = sidePane_->listWidget(); - if (textEdit->document()->isModified()) + QString fname = textEdit->getFileName(); + if (fname.isEmpty()) { - tabText.remove (0, 1); - tabText.append ("*"); + if (textEdit->getProg() == "help") + fname = "** " + tr ("Help") + " **"; + else + fname = tr ("Untitled"); } - QListWidgetItem *lwi = new QListWidgetItem (isLink ? QIcon (":icons/link.svg") : QIcon(), - tabText, lw); + else + fname = fname.section ('/', -1); + if (textEdit->document()->isModified()) + fname.append ("*"); + fname.replace ("\n", " "); + ListWidgetItem *lwi = new ListWidgetItem (isLink ? QIcon (":icons/link.svg") : QIcon(), + fname, lw); lw->setToolTip (tooltip); sideItems_.insert (lwi, tabPage); lw->addItem (lwi); @@ -4416,9 +5024,9 @@ /* reload buttons, syntax highlighting, jump bar, line numbers */ if (ui->actionSyntax->isChecked()) { - waitToMakeBusy(); // it may take a while with huge texts + makeBusy(); // it may take a while with huge texts syntaxHighlighting (textEdit, true, textEdit->getLang()); - QTimer::singleShot (0, this, [this]() {unbusy();}); + QTimer::singleShot (0, this, &FPwin::unbusy); } else if (!ui->actionSyntax->isChecked() && textEdit->getHighlighter()) { // there's no connction to the drag target yet @@ -4437,7 +5045,8 @@ if (!textEdit->getSearchedText().isEmpty()) { connect (textEdit, &QPlainTextEdit::textChanged, this, &FPwin::hlight); - connect (textEdit, &TextEdit::updateRect, this, &FPwin::hlighting); + connect (textEdit, &TextEdit::updateRect, this, &FPwin::hlight); + connect (textEdit, &TextEdit::resized, this, &FPwin::hlight); /* restore yellow highlights, which will automatically set the current line highlight if needed because the spin button and line number menuitem are set above */ @@ -4482,6 +5091,7 @@ connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionDelete, &QAction::setEnabled); connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionUpperCase, &QAction::setEnabled); connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionLowerCase, &QAction::setEnabled); + connect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionStartCase, &QAction::setEnabled); } connect (textEdit, &TextEdit::fileDropped, this, &FPwin::newTabFromName); connect (textEdit, &TextEdit::zoomedOut, this, &FPwin::reformat); @@ -4489,8 +5099,7 @@ textEdit->setFocus(); - raise(); - activateWindow(); + stealFocus(); if (count == 0) QTimer::singleShot (0, dragSource, &QWidget::close); @@ -4511,6 +5120,7 @@ { QWidgetAction *labelAction = new QWidgetAction (&menu); QLabel *label = new QLabel ("
" + tr ("%1 Pages").arg (tabNum) + "
"); + label->setMargin (4); labelAction->setDefaultWidget (label); menu.addAction (labelAction); menu.addSeparator(); @@ -4537,11 +5147,11 @@ { menu.addSeparator(); QAction *action = menu.addAction (QIcon (":icons/link.svg"), tr ("Copy Target Path")); - connect (action, &QAction::triggered, action, [info] { + connect (action, &QAction::triggered, [info] { QApplication::clipboard()->setText (info.symLinkTarget()); }); action = menu.addAction (QIcon (":icons/link.svg"), tr ("Open Target Here")); - connect (action, &QAction::triggered, action, [this, info] { + connect (action, &QAction::triggered, this, [this, info] { QString targetName = info.symLinkTarget(); for (int i = 0; i < ui->tabWidget->count(); ++i) { @@ -4555,6 +5165,16 @@ newTabFromName (targetName, 0, 0); }); } + if (QFile::exists (fname)) + { + menu.addSeparator(); + QAction *action = menu.addAction (symbolicIcon::icon (":icons/document-open.svg"), tr ("Open Containing Folder")); + connect (action, &QAction::triggered, this, [fname] { + QString folder = fname.section ("/", 0, -2); + if (!QProcess::startDetached ("gio", QStringList() << "open" << folder)) + QDesktopServices::openUrl (QUrl::fromLocalFile (folder)); + }); + } } if (showMenu) // we don't want an empty menu menu.exec (tbar->mapToGlobal (p)); @@ -4563,7 +5183,7 @@ /*************************/ void FPwin::listContextMenu (const QPoint& p) { - if (!sidePane_ || sideItems_.isEmpty()) + if (!sidePane_ || sideItems_.isEmpty() || locked_) return; ListWidget *lw = sidePane_->listWidget(); @@ -4579,6 +5199,7 @@ { QWidgetAction *labelAction = new QWidgetAction (&menu); QLabel *label = new QLabel ("
" + tr ("%1 Pages").arg (lw->count()) + "
"); + label->setMargin (4); labelAction->setDefaultWidget (label); menu.insertAction (ui->actionClose, labelAction); menu.insertSeparator (ui->actionClose); @@ -4594,8 +5215,11 @@ menu.addAction (ui->actionCloseOther); } menu.addAction (ui->actionCloseAll); - menu.addSeparator(); - menu.addAction (ui->actionDetachTab); + if (!standalone_) + { + menu.addSeparator(); + menu.addAction (ui->actionDetachTab); + } } if (!fname.isEmpty()) { @@ -4607,11 +5231,11 @@ { menu.addSeparator(); QAction *action = menu.addAction (QIcon (":icons/link.svg"), tr ("Copy Target Path")); - connect (action, &QAction::triggered, action, [info] { + connect (action, &QAction::triggered, [info] { QApplication::clipboard()->setText (info.symLinkTarget()); }); action = menu.addAction (QIcon (":icons/link.svg"), tr ("Open Target Here")); - connect (action, &QAction::triggered, action, [this, info] { + connect (action, &QAction::triggered, this, [this, info] { QString targetName = info.symLinkTarget(); for (int i = 0; i < ui->tabWidget->count(); ++i) { @@ -4626,6 +5250,16 @@ newTabFromName (targetName, 0, 0); }); } + if (QFile::exists (fname)) + { + menu.addSeparator(); + QAction *action = menu.addAction (symbolicIcon::icon (":icons/document-open.svg"), tr ("Open Containing Folder")); + connect (action, &QAction::triggered, this, [fname] { + QString folder = fname.section ("/", 0, -2); + if (!QProcess::startDetached ("gio", QStringList() << "open" << folder)) + QDesktopServices::openUrl (QUrl::fromLocalFile (folder)); + }); + } } menu.exec (lw->viewport()->mapToGlobal (p)); rightClicked_ = -1; // reset @@ -4729,13 +5363,15 @@ if (dictPath.isEmpty()) { showWarningBar ("
" + tr ("You need to add a Hunspell dictionary.") + "
" - + "
" + tr ("See Preferences → Text → Spell Checking!") + "
"); + + "
" + tr ("See Preferences → Text → Spell Checking!") + "
", + 20); return; } if (!QFile::exists (dictPath)) { showWarningBar ("
" + tr ("The Hunspell dictionary does not exist.") + "
" - + "
" + tr ("See Preferences → Text → Spell Checking!") + "
"); + + "
" + tr ("See Preferences → Text → Spell Checking!") + "
", + 20); return; } if (dictPath.endsWith (".dic")) @@ -4744,7 +5380,8 @@ if (!QFile::exists (affixFile)) { showWarningBar ("
" + tr ("The Hunspell dictionary is not accompanied by an affix file.") + "
" - + "
" + tr ("See Preferences → Text → Spell Checking!") + "
"); + + "
" + tr ("See Preferences → Text → Spell Checking!") + "
", + 20); return; } QString confPath = QStandardPaths::writableLocation (QStandardPaths::ConfigLocation); @@ -4807,6 +5444,7 @@ word = cur.selectedText(); } } + textEdit->skipSelectionHighlighting(); textEdit->setTextCursor (cur); textEdit->ensureCursorVisible(); @@ -4847,6 +5485,7 @@ cur.setPosition (cur.position()); if (cur.atEnd()) { + textEdit->skipSelectionHighlighting(); textEdit->setTextCursor (cur); textEdit->ensureCursorVisible(); dlg.close(); @@ -4861,6 +5500,7 @@ cur.setPosition (cur.anchor()); if (!cur.movePosition (QTextCursor::NextCharacter)) { + textEdit->skipSelectionHighlighting(); textEdit->setTextCursor (cur); textEdit->ensureCursorVisible(); dlg.close(); @@ -4881,6 +5521,7 @@ cur.setPosition (cur.position()); if (cur.atEnd()) { + textEdit->skipSelectionHighlighting(); textEdit->setTextCursor (cur); textEdit->ensureCursorVisible(); dlg.close(); @@ -4894,6 +5535,7 @@ cur.setPosition (cur.anchor()); if (!cur.movePosition (QTextCursor::NextCharacter)) { + textEdit->skipSelectionHighlighting(); textEdit->setTextCursor (cur); textEdit->ensureCursorVisible(); dlg.close(); @@ -4903,6 +5545,7 @@ word = cur.selectedText(); } } + textEdit->skipSelectionHighlighting(); textEdit->setTextCursor (cur); textEdit->ensureCursorVisible(); dlg.checkWord (word); @@ -4938,13 +5581,12 @@ FPsingleton *singleton = static_cast(qApp); for (int i = 0; i < singleton->Wins.count(); ++i) { - QList dialogs = singleton->Wins.at (i)->findChildren(); - for (int j = 0; j < dialogs.count(); ++j) + const auto dialogs = singleton->Wins.at (i)->findChildren(); + for (const auto &dialog : dialogs) { - if (dialogs.at (j)->objectName() == "sessionDialog") + if (dialog->objectName() == "sessionDialog") { - dialogs.at (j)->raise(); - dialogs.at (j)->activateWindow(); + stealFocus (dialog); return; } } @@ -4965,10 +5607,13 @@ if (!autoSaver_) return; if (pause) { - autoSaverPause_.start(); - autoSaverRemainingTime_ = autoSaver_->remainingTime(); + if (!autoSaverPause_.isValid()) // don't start it again + { + autoSaverPause_.start(); + autoSaverRemainingTime_ = autoSaver_->remainingTime(); + } } - else if (autoSaverPause_.isValid()) + else if (!locked_ && autoSaverPause_.isValid()) { if (autoSaverPause_.hasExpired (autoSaverRemainingTime_)) { @@ -5033,7 +5678,7 @@ /* make changes to the document if needed */ if (config.getRemoveTrailingSpaces() && thisTextEdit->getProg() != "diff") { - waitToMakeBusy(); + makeBusy(); QTextBlock block = thisTextEdit->document()->firstBlock(); QTextCursor tmpCur = thisTextEdit->textCursor(); tmpCur.beginEditBlock(); @@ -5153,7 +5798,11 @@ class AboutDialog : public QDialog { public: +#if (QT_VERSION >= QT_VERSION_CHECK(5,15,0)) + explicit AboutDialog (QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()) : QDialog (parent, f) { +#else explicit AboutDialog (QWidget* parent = nullptr, Qt::WindowFlags f = nullptr) : QDialog (parent, f) { +#endif aboutUi.setupUi (this); aboutUi.textLabel->setOpenExternalLinks (true); } @@ -5181,7 +5830,7 @@ dialog.setMainIcon (FPIcon); dialog.settMainTitle (QString ("
%1 %2

").arg (qApp->applicationName()).arg (qApp->applicationVersion())); dialog.setMainText ("
" + tr ("A lightweight, tabbed, plain-text editor") + "
\n
" - + tr ("based on Qt5") + "

" + + tr ("based on Qt") + "

" + tr ("Author")+": Pedram Pourang (" + tr ("aka.") + " Tsu Jan)

"); dialog.setTabTexts (tr ("About FeatherPad"), tr ("Translators")); @@ -5232,6 +5881,18 @@ QString helpPath (QStringLiteral (DATADIR) + "/featherpad/help_" + lang); #endif + if (!QFile::exists (helpPath) && !langs.isEmpty()) + { // shouldn't be needed + lang = langs.first().split (QLatin1Char ('_')).first(); +#if defined(Q_OS_HAIKU) + helpPath = QStringLiteral (DATADIR) + "/help_" + lang; +#elif defined(Q_OS_MAC) + helpPath = qApp->applicationDirPath() + QStringLiteral ("/../Resources/") + "/help_" + lang; +#else + helpPath = QStringLiteral (DATADIR) + "/featherpad/help_" + lang; +#endif + } + if (!QFile::exists (helpPath)) { #if defined(Q_OS_HAIKU) @@ -5281,14 +5942,17 @@ "background-color: rgb(0, 60, 110);}"); ui->actionCut->setDisabled (true); ui->actionPaste->setDisabled (true); + ui->actionSoftTab->setDisabled (true); ui->actionDate->setDisabled (true); ui->actionDelete->setDisabled (true); ui->actionUpperCase->setDisabled (true); ui->actionLowerCase->setDisabled (true); + ui->actionStartCase->setDisabled (true); disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionCut, &QAction::setEnabled); disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionDelete, &QAction::setEnabled); disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionUpperCase, &QAction::setEnabled); disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionLowerCase, &QAction::setEnabled); + disconnect (textEdit, &QPlainTextEdit::copyAvailable, ui->actionStartCase, &QAction::setEnabled); index = ui->tabWidget->currentIndex(); textEdit->setEncoding ("UTF-8"); @@ -5310,10 +5974,51 @@ ui->tabWidget->setTabToolTip (index, title); if (sidePane_) { - QListWidgetItem *cur = sidePane_->listWidget()->currentItem(); - cur->setText (title); - cur->setToolTip (title); + if (QListWidgetItem *cur = sidePane_->listWidget()->currentItem()) + { + cur->setText (title); + cur->setToolTip (title); + } } } +/*************************/ +void FPwin::stealFocus (QWidget *w) +{ + if (w->isMinimized()) + w->setWindowState ((w->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); +#ifdef HAS_X11 + else if (static_cast(qApp)->isX11()) + { + if (isWindowShaded (w->winId())) + unshadeWindow (w->winId()); + } +#endif + + raise(); + /* WARNING: Under Wayland, this warning is shown by qtwayland -> qwaylandwindow.cpp + -> QWaylandWindow::requestActivateWindow(): + "Wayland does not support QWindow::requestActivate()" */ + if (!static_cast(qApp)->isWayland()) + { + w->activateWindow(); + QTimer::singleShot (0, w, [w]() { + if (QWindow *win = w->windowHandle()) + win->requestActivate(); + }); + } +} +/*************************/ +void FPwin::stealFocus() +{ + /* if there is a (sessions) dialog, let it keep the focus */ + const auto dialogs = findChildren(); + if (!dialogs.isEmpty()) + { + stealFocus (dialogs.at (0)); + return; + } + + stealFocus (this); +} } diff -Nru featherpad-0.12.1/featherpad/fpwin.h featherpad-0.17.1/featherpad/fpwin.h --- featherpad-0.12.1/featherpad/fpwin.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/fpwin.h 2021-01-06 17:57:35.000000000 +0000 @@ -35,39 +35,18 @@ class FPwin; } -class BusyMaker : public QObject { - Q_OBJECT - -public: - BusyMaker(){} - ~BusyMaker(){} - -public slots: - void waiting(); - -private slots : - void makeBusy(); - -signals: - void finished(); - -private: - static const int timeout = 1000; -}; - - // A FeatherPad window. class FPwin : public QMainWindow { Q_OBJECT public: - explicit FPwin (QWidget *parent = nullptr); + explicit FPwin (QWidget *parent = nullptr, bool standalone = false); ~FPwin(); - bool isScriptLang (const QString& lang); + bool isScriptLang (const QString& lang) const; - bool isLoading() { + bool isLoading() const { return (loadingProcesses_ > 0); } bool isReady() { @@ -79,10 +58,14 @@ return false; } - bool hasSidePane()const { + bool hasSidePane() const { return (sidePane_ != nullptr); } + bool isLocked() const { + return locked_; + } + void addCursorPosLabel(); void addRemoveLangBtn (bool add); @@ -119,25 +102,27 @@ void newTabFromRecent(); void clearRecentMenu(); void updateRecenMenu(); - void closeTab(); - void closeTabAtIndex (int index); + void closePage(); + void closeTabAtIndex (int tabIndex); void copyTabFileName(); void copyTabFilePath(); - void closeAllTabs(); - void closeNextTabs(); - void closePreviousTabs(); - void closeOtherTabs(); + void closeAllPages(); + void closeNextPages(); + void closePreviousPages(); + void closeOtherPages(); void fileOpen(); void reload(); void enforceEncoding (QAction*); void cutText(); void copyText(); void pasteText(); + void toSoftTabs(); void insertDate(); void deleteText(); void selectAllText(); void upperCase(); void lowerCase(); + void startCase(); void enableSortLines(); void sortLines(); void makeEditable(); @@ -148,15 +133,13 @@ void fontDialog(); void find (bool forward); void hlight() const; - void hlighting (const QRect&, int dy) const; void searchFlagChanged(); void showHideSearch(); void showLN (bool checked); void toggleSyntaxHighlighting(); void formatOnBlockChange (int) const; void formatOnTextChange (int, int charsRemoved, int charsAdded) const; - void formatVisibleText (const QRect &rect, int dy) const; - void formatOnResizing() const; + void formatTextRect() const; void toggleWrapping(); void toggleIndent(); void replace(); @@ -173,6 +156,7 @@ void zoomOut(); void zoomZero(); void defaultSize(); + void focusView(); //void align(); void manageSessions(); void executeProcess(); @@ -190,7 +174,7 @@ void tabContextMenu (const QPoint& p); void listContextMenu (const QPoint& p); void editorContextMenu (const QPoint& p); - void changeTab (QListWidgetItem *current, QListWidgetItem*); + void changeTab (QListWidgetItem *current); void toggleSidePane(); void prefDialog(); void checkSpelling(); @@ -211,6 +195,7 @@ void autoSave(); void pauseAutoSaving (bool pause); void enforceLang (QAction *action); + void unbusy(); public: QWidget *dummyWidget; // Bypasses KDE's demand for a new window. @@ -231,11 +216,21 @@ bool enforceUneditable = false, bool multiple = false); bool alreadyOpen (TabPage *tabPage) const; void setTitle (const QString& fileName, int tabIndex = -1); - DOCSTATE savePrompt (int tabIndex, bool noToAll); - bool saveFile (bool keepSyntax); + DOCSTATE savePrompt (int tabIndex, bool noToAll, + int first = 0, int last = 0, bool closingWindow = false, + QListWidgetItem *curItem = nullptr, TabPage *curPage = nullptr); + bool saveFile (bool keepSyntax, + int first = 0, int last = 0, bool closingWindow = false, + QListWidgetItem *curItem = nullptr, TabPage *curPage = nullptr); + void saveAsRoot (const QString& fileName, TabPage *tabPage, + int first, int last, bool closingWindow, + QListWidgetItem *curItem, TabPage *curPage, + bool MSWinLineEnd); + void reloadSyntaxHighlighter (TextEdit *textEdit); + void lockWindow (TabPage *tabPage, bool lock); void saveAllFiles (bool showWarning); void closeEvent (QCloseEvent *event); - bool closeTabs (int first, int last, bool saveFilesList = false); + bool closePages (int first, int last, bool saveFilesList = false); void dragEnterEvent (QDragEnterEvent *event); void dropEvent (QDropEvent *event); void dropTab (const QString& str); @@ -244,9 +239,6 @@ QTextDocument::FindFlags getSearchFlags() const; void enableWidgets (bool enable) const; void updateShortcuts (bool disable, bool page = true); - QTextCursor finding (const QString& str, const QTextCursor& start, - QTextDocument::FindFlags flags = QTextDocument::FindFlags(), - bool isRegex = false, const int end = 0) const; void setProgLang (TextEdit *textEdit); void syntaxHighlighting (TextEdit *textEdit, bool highlight = true, const QString& lang = QString()); void encodingToCheck (const QString& encoding); @@ -259,16 +251,16 @@ bool matchLeftBracket (QTextBlock currentBlock, int index, int numRightBrackets); bool matchRightBracket (QTextBlock currentBlock, int index, int numLeftBrackets); void createSelection (int pos); - void formatTextRect (QRect rect) const; void removeGreenSel(); - void waitToMakeBusy(); - void unbusy(); + void makeBusy(); void displayMessage (bool error); - void showWarningBar (const QString& message, bool startupBar = false); + void showWarningBar (const QString& message, int timeout = 10, bool startupBar = false); void closeWarningBar (bool keepOnStartup = false); void disconnectLambda(); void updateLangBtn (TextEdit *textEdit); void updateGUIForSingleTab (bool single); + void stealFocus (QWidget *w); + void stealFocus(); QActionGroup *aGroup_; QString lastFile_; // The last opened or saved file (for file dialogs). @@ -276,7 +268,6 @@ QString txtReplace_; // The replacing text. int rightClicked_; // The index/row of the right-clicked tab/item. int loadingProcesses_; // The number of loading processes (used to prevent early closing). - QPointer busyThread_; // Used to wait one second for making the cursor busy. QMetaObject::Connection lambdaConnection_; // Captures a lambda connection to disconnect it later. SidePane *sidePane_; QHash sideItems_; // For fast tab switching. @@ -287,6 +278,11 @@ QTimer *autoSaver_; QElapsedTimer autoSaverPause_; int autoSaverRemainingTime_; + // Needed with saving as root: + bool locked_; + bool closePreviousPages_; + // Only used internally: + bool standalone_; }; } diff -Nru featherpad-0.12.1/featherpad/highlighter.cpp featherpad-0.17.1/featherpad/highlighter.cpp --- featherpad-0.12.1/featherpad/highlighter.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/highlighter.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2019 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -24,9 +24,9 @@ namespace FeatherPad { -/* NOTE: It is supposed that a URL does not end with punctuation marks, parentheses or brackets. */ -static const QRegularExpression urlPattern ("[A-Za-z0-9_]+://((?!"|>|<)[A-Za-z0-9_.+/\\?\\=~&%#\\-:\\(\\)\\[\\]])+(?= QT_VERSION_CHECK(5,14,0)) +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) // To work around a nasty bug in Qt 5.14.0 static QColor overlayColor (const QColor& bgCol, const QColor& overlayCol) { @@ -207,7 +207,10 @@ Highlighter::Highlighter (QTextDocument *parent, const QString& lang, const QTextCursor &start, const QTextCursor &end, bool darkColorScheme, - bool showWhiteSpace, bool showEndings) : QSyntaxHighlighter (parent) + bool showWhiteSpace, + bool showEndings, + int whitespaceValue, + const QHash &syntaxColors) : QSyntaxHighlighter (parent) { if (lang.isEmpty()) return; @@ -233,51 +236,148 @@ progLan = lang; quoteMark.setPattern ("\""); // the standard quote mark (always a single character) + mixedQuoteMark.setPattern ("\"|\'"); + /* includes Perl's backquote operator and JavaScript's template literal */ + mixedQuoteBackquote.setPattern ("\"|\'|`"); HighlightingRule rule; - QColor Faded, translucent; - if (!darkColorScheme) - { - mainFormat.setForeground (Qt::black); - neutralFormat.setForeground (QColor (1, 1, 1)); - Blue = Qt::blue; - DarkBlue = Qt::darkBlue; - Red = Qt::red; - DarkRed = QColor (150, 0, 0); - Verda = QColor (0, 110, 110); - DarkGreen = Qt::darkGreen; - DarkMagenta = Qt::darkMagenta; - Violet = QColor (126, 0, 230); // #7e00e6 - Brown = QColor (160, 80, 0); - DarkYellow = QColor (100, 100, 0); // Qt::darkYellow is (180, 180, 0) - Faded = QColor (180, 180, 180); - translucent = QColor (0, 0, 0, 190); -#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0)) - translucent = overlayColor (QColor (245, 245, 245), translucent); + + QColor Faded (whitespaceValue, whitespaceValue, whitespaceValue); + QColor TextColor, neutralColor, translucent; + if (syntaxColors.size() == 11) + { + /* NOTE: All 11 + 1 colors should be valid, opaque and different from each other + but we don't check them here because "FeatherPad::Config" gets them so. */ + Blue = syntaxColors.value ("function"); + Magenta = syntaxColors.value ("BuiltinFunction"); + Red = syntaxColors.value ("comment"); + DarkGreen = syntaxColors.value ("quote"); + DarkMagenta = syntaxColors.value ("type"); + DarkBlue = syntaxColors.value ("keyWord"); + Brown = syntaxColors.value ("number"); + DarkRed = syntaxColors.value ("regex"); + Violet = syntaxColors.value ("xmlElement"); + Verda = syntaxColors.value ("cssValue"); + DarkYellow = syntaxColors.value ("other"); + + QList colors; + colors << Blue << Magenta << Red << DarkGreen << DarkMagenta << DarkBlue << Brown << DarkRed << Violet << Verda << DarkYellow << Faded; + + /* extra colors */ + if (!darkColorScheme) + { + TextColor = QColor (Qt::black); + neutralColor = QColor (1, 1, 1); + translucent = QColor (0, 0, 0, 190); // for huge lines +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) + translucent = overlayColor (QColor (245, 245, 245), translucent); #endif - } - else - { - mainFormat.setForeground (Qt::white); - neutralFormat.setForeground (QColor (254, 254, 254)); - Blue = QColor (85, 227, 255); - DarkBlue = QColor (65, 154, 255); - Red = QColor (255, 120, 120); - DarkRed = QColor (255, 160, 0); - Verda = QColor (150, 255, 0); - DarkGreen = Qt::green; - DarkMagenta = QColor (255, 153, 255); - Violet = QColor (255, 255, 0); // == DarkYellow == Qt::yellow - Brown = QColor (255, 200, 0); - DarkYellow = Qt::yellow; - Faded = QColor (95, 95, 95); - translucent = QColor (255, 255, 255, 190); -#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0)) - translucent = overlayColor (QColor (10, 10, 10), translucent); + } + else + { + TextColor = QColor (Qt::white); + neutralColor = QColor (254, 254, 254); + translucent = QColor (255, 255, 255, 190); +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) + translucent = overlayColor (QColor (10, 10, 10), translucent); +#endif + } + + int i = 0; + while (colors.contains (TextColor)) + { + ++i; + if (!darkColorScheme) + TextColor = QColor (i, i, i); + else + TextColor = QColor (255 - i, 255 - i, 255 - i); + } + colors << TextColor; + + while (colors.contains (neutralColor)) + { + ++i; + if (!darkColorScheme) + neutralColor = QColor (i, i, i); + else + neutralColor = QColor (255 - i, 255 - i, 255 - i); + } + colors << neutralColor; + +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) + i = 0; + int tr = translucent.red(); + while (colors.contains (translucent)) + { + ++i; + if (!darkColorScheme) + translucent = QColor (tr + i, tr + i, tr + i); + else + translucent = QColor (tr - i, tr - i, tr - i); + } + colors << translucent; +#endif + + DarkGreenAlt = DarkGreen.lighter (101); + if (DarkGreenAlt == DarkGreen) + { + DarkGreenAlt = QColor (DarkGreen.red() > 127 ? DarkGreen.red() - 1 : DarkGreen.red() + 1, + DarkGreen.green() > 127 ? DarkGreen.green() - 1 : DarkGreen.green() + 1, + DarkGreen.blue() > 127 ? DarkGreen.blue() - 1 : DarkGreen.blue() + 1); + } + while (colors.contains (DarkGreenAlt)) + { + DarkGreenAlt = QColor (DarkGreen.red() > 127 ? DarkGreenAlt.red() - 1 : DarkGreenAlt.red() + 1, + DarkGreen.green() > 127 ? DarkGreenAlt.green() - 1 : DarkGreenAlt.green() + 1, + DarkGreen.blue() > 127 ? DarkGreenAlt.blue() - 1 : DarkGreenAlt.blue() + 1); + } + } + else // built-in colors (this block is never reached but is kept for the sake of consistency) + { + if (!darkColorScheme) + { + TextColor = QColor (Qt::black); + neutralColor = QColor (1, 1, 1); + Blue = QColor (Qt::blue); + DarkBlue = QColor (Qt::darkBlue); + Red = QColor (Qt::red); + DarkRed = QColor (150, 0, 0); + Verda = QColor (0, 110, 110); + DarkGreen = QColor (Qt::darkGreen); + DarkMagenta = QColor (Qt::darkMagenta); + Violet = QColor (126, 0, 230); // #7e00e6 + Brown = QColor (160, 80, 0); + DarkYellow = QColor (100, 100, 0); // Qt::darkYellow is (180, 180, 0) + translucent = QColor (0, 0, 0, 190); +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) + translucent = overlayColor (QColor (245, 245, 245), translucent); +#endif + } + else + { + TextColor = QColor (Qt::white); + neutralColor = QColor (254, 254, 254); + Blue = QColor (85, 227, 255); + DarkBlue = QColor (65, 154, 255); + Red = QColor (255, 120, 120); + DarkRed = QColor (255, 160, 0); + Verda = QColor (150, 255, 0); + DarkGreen = QColor (Qt::green); + DarkMagenta = QColor (255, 153, 255); + Violet = QColor (255, 255, 0); // == DarkYellow == Qt::yellow + Brown = QColor (255, 200, 0); + DarkYellow = QColor (Qt::yellow); + translucent = QColor (255, 255, 255, 190); +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) + translucent = overlayColor (QColor (10, 10, 10), translucent); #endif + } + Magenta = QColor (Qt::magenta); + DarkGreenAlt = DarkGreen.lighter (101); // almost identical } - DarkGreenAlt = DarkGreen.lighter (101); // almost identical + mainFormat.setForeground (TextColor); + neutralFormat.setForeground (neutralColor); whiteSpaceFormat.setForeground (Faded); translucentFormat.setForeground (translucent); translucentFormat.setFontItalic (true); @@ -292,9 +392,9 @@ quoteEndExpression.setPattern ("([^\"'])\"");*/ regexFormat.setForeground (DarkRed); - /************* - * Functions * - *************/ + /************************* + * Functions and Numbers * + *************************/ /* there may be javascript inside html */ QString Lang = progLan == "html" ? "javascript" : progLan; @@ -312,6 +412,12 @@ rule.format = ft; highlightingRules.append (rule); + /* POSIX signals */ + ft.setForeground (DarkYellow); + rule.pattern.setPattern ("\\b(SIGABRT|SIGIOT|SIGALRM|SIGVTALRM|SIGPROF|SIGBUS|SIGCHLD|SIGCONT|SIGFPE|SIGHUP|SIGILL|SIGINT|SIGKILL|SIGPIPE|SIGPOLL|SIGRTMIN|SIGRTMAX|SIGQUIT|SIGSEGV|SIGSTOP|SIGSYS|SIGTERM|SIGTSTP|SIGTTIN|SIGTTOU|SIGTRAP|SIGURG|SIGUSR1|SIGUSR2|SIGXCPU|SIGXFSZ|SIGWINCH)(?!(\\.|-|@|#|\\$))\\b"); + rule.format = ft; + highlightingRules.append (rule); + ft.setFontItalic (true); ft.setForeground (Blue); /* before parentheses... */ @@ -329,7 +435,7 @@ else if (progLan == "python") { // built-in functions ft.setFontWeight (QFont::Bold); - ft.setForeground (Qt::magenta); + ft.setForeground (Magenta); rule.pattern.setPattern ("\\b(abs|add|all|append|any|as_integer_ratio|ascii|basestring|bin|bit_length|bool|bytearray|bytes|callable|c\\.conjugate|capitalize|center|chr|classmethod|clear|cmp|compile|complex|count|critical|debug|decode|delattr|dict|difference_update|dir|discard|divmod|encode|endswith|enumerate|error|eval|expandtabs|exception|exec|execfile|extend|file|filter|find|float|format|fromhex|fromkeys|frozenset|get|getattr|globals|hasattr|hash|has_key|help|hex|id|index|info|input|insert|int|intersection_update|isalnum|isalpha|isdecimal|isdigit|isinstance|islower|isnumeric|isspace|issubclass|istitle|items|iter|iteritems|iterkeys|itervalues|isupper|is_integer|join|keys|len|list|ljust|locals|log|long|lower|lstrip|map|max|memoryview|min|next|object|oct|open|ord|partition|pop|popitem|pow|print|property|range|raw_input|read|reduce|reload|remove|replace|repr|reverse|reversed|rfind|rindex|rjust|rpartition|round|rsplit|rstrip|run|seek|set|setattr|slice|sort|sorted|split|splitlines|staticmethod|startswith|str|strip|sum|super|symmetric_difference_update|swapcase|title|translate|tuple|type|unichr|unicode|update|upper|values|vars|viewitems|viewkeys|viewvalues|warning|write|xrange|zip|zfill|(__(abs|add|and|cmp|coerce|complex|contains|delattr|delete|delitem|delslice|div|divmod|enter|eq|exit|float|floordiv|ge|get|getattr|getattribute|getitem|getslice|gt|hex|iadd|iand|idiv|ifloordiv|ilshift|invert|imod|import|imul|init|instancecheck|index|int|ior|ipow|irshift|isub|iter|itruediv|ixor|le|len|long|lshift|lt|missing|mod|mul|neg|nonzero|oct|or|pos|pow|radd|rand|rdiv|rdivmod|reversed|rfloordiv|rlshift|rmod|rmul|ror|rpow|rshift|rsub|rrshift|rtruediv|rxor|set|setattr|setitem|setslice|sub|subclasses|subclasscheck|truediv|unicode|xor)__))(?=\\s*\\()"); rule.format = ft; highlightingRules.append (rule); @@ -339,13 +445,15 @@ { QTextCharFormat ft; - /* before dot (might be overridden by keywords) */ + /* before dot but not after it (might be overridden by keywords) */ ft.setForeground (Blue); - rule.pattern.setPattern ("(?|>)"); + QTextCharFormat xmlElementFormat; xmlElementFormat.setFontWeight (QFont::Bold); xmlElementFormat.setForeground (Violet); @@ -600,11 +764,32 @@ { /* # is the sh comment sign when it doesn't follow a character */ if (progLan == "sh" || progLan == "makefile" || progLan == "cmake") + { rule.pattern.setPattern ("(?<=^|\\s|;)#.*"); - else if (progLan == "perl") // $# isn't a comment - rule.pattern.setPattern ("(?\\s\\d{2}:\\d{2}:\\d{2},\\d{3}$"); + srtFormat.setFontWeight (QFont::Bold); + rule.pattern.setPattern ("^\\s*\\d{2}:\\d{2}:\\d{2},\\d{3}\\s+-->\\s+\\d{2}:\\d{2}:\\d{2},\\d{3}\\s*$"); rule.format = srtFormat; highlightingRules.append (rule); @@ -747,23 +948,29 @@ rule.format = srtFormat; highlightingRules.append (rule); - /* mm */ - srtFormat.setForeground (DarkGreenAlt); - rule.pattern.setPattern ("\\d{2}(?=:\\d{2},\\d{3}\\s-->\\s\\d{2}:\\d{2}:\\d{2},\\d{3}$)|\\d{2}(?=:\\d{2},\\d{3}$)"); + /* hh */ + srtFormat.setForeground (Blue); + rule.pattern.setPattern ("^\\s*\\d{2}(?=:\\d{2}:\\d{2},\\d{3}\\s+-->\\s+\\d{2}:\\d{2}:\\d{2},\\d{3}\\s*$)"); rule.format = srtFormat; highlightingRules.append (rule); + rule.pattern.setPattern ("^\\s*\\d{2}:\\d{2}:\\d{2},\\d{3}\\s+-->\\s+\\K\\d{2}(?=:\\d{2}:\\d{2},\\d{3}\\s*$)"); + highlightingRules.append (rule); - /* hh */ - srtFormat.setForeground (Blue); - rule.pattern.setPattern ("^\\d{2}(?=:\\d{2}:\\d{2},\\d{3}\\s-->\\s\\d{2}:\\d{2}:\\d{2},\\d{3}$)|\\s\\d{2}(?=:\\d{2}:\\d{2},\\d{3}$)"); + /* mm */ + srtFormat.setForeground (DarkGreenAlt); + rule.pattern.setPattern ("^\\s*\\d{2}:\\K\\d{2}(?=:\\d{2},\\d{3}\\s+-->\\s+\\d{2}:\\d{2}:\\d{2},\\d{3}\\s*$)"); rule.format = srtFormat; highlightingRules.append (rule); + rule.pattern.setPattern ("^\\s*\\d{2}:\\d{2}:\\d{2},\\d{3}\\s+-->\\s+\\d{2}:\\K\\d{2}(?=:\\d{2},\\d{3}\\s*$)"); + highlightingRules.append (rule); /* ss */ srtFormat.setForeground (Brown); - rule.pattern.setPattern ("\\d{2}(?=,\\d{3}\\s-->\\s\\d{2}:\\d{2}:\\d{2},\\d{3}$)|\\d{2}(?=,\\d{3}$)"); + rule.pattern.setPattern ("^\\s*\\d{2}:\\d{2}:\\K\\d{2}(?=,\\d{3}\\s+-->\\s+\\d{2}:\\d{2}:\\d{2},\\d{3}\\s*$)"); rule.format = srtFormat; highlightingRules.append (rule); + rule.pattern.setPattern ("^\\s*\\d{2}:\\d{2}:\\d{2},\\d{3}\\s+-->\\s+\\d{2}:\\d{2}:\\K\\d{2}(?=,\\d{3}\\s*$)"); + highlightingRules.append (rule); } else if (progLan == "desktop" || progLan == "config" || progLan == "theme") { @@ -773,7 +980,7 @@ desktopFormat.setFontWeight (QFont::Bold); desktopFormat.setFontItalic (true); /* color values */ - rule.pattern.setPattern ("#([A-Fa-f0-9]{3}){0,2}(?![A-Za-z0-9_]+)|#([A-Fa-f0-9]{3}){2}[A-Fa-f0-9]{2}(?![A-Za-z0-9_]+)"); + rule.pattern.setPattern ("#([A-Fa-f0-9]{3}){1,2}(?![A-Za-z0-9_]+)|#([A-Fa-f0-9]{3}){2}[A-Fa-f0-9]{2}(?![A-Za-z0-9_]+)"); rule.format = desktopFormat; highlightingRules.append (rule); desktopFormat.setFontItalic (false); @@ -896,7 +1103,7 @@ gtkrcFormat.setFontWeight (QFont::Bold); /* color value format (#xyz) */ /*gtkrcFormat.setForeground (DarkGreenAlt); - rule.pattern.setPattern ("#([A-Fa-f0-9]{3}){0,2}(?![A-Za-z0-9_]+)|#([A-Fa-f0-9]{3}){2}[A-Fa-f0-9]{2}(?![A-Za-z0-9_]+)"); + rule.pattern.setPattern ("#([A-Fa-f0-9]{3}){1,2}(?![A-Za-z0-9_]+)|#([A-Fa-f0-9]{3}){2}[A-Fa-f0-9]{2}(?![A-Za-z0-9_]+)"); rule.format = gtkrcFormat; highlightingRules.append (rule);*/ @@ -1100,22 +1307,23 @@ /* after "," */ plFormat.setFontWeight (QFont::Normal); plFormat.setForeground (DarkRed); - rule.pattern.setPattern ("^#EXTINF\\s*:\\s*-*\\d+\\s*,.*|^#EXTINF\\s*:\\s*,.*"); + rule.pattern.setPattern ("^#EXTINF\\s*:[^,]*,\\K.*"); // "^#EXTINF\\s*:\\s*-*\\d+\\s*,.*|^#EXTINF\\s*:\\s*,.*" rule.format = plFormat; highlightingRules.append (rule); /* before "," and after "EXTINF:" */ plFormat.setForeground (DarkYellow); - rule.pattern.setPattern ("^#EXTINF\\s*:\\s*-*\\d+\\b"); + rule.pattern.setPattern ("^#EXTINF\\s*:\\s*\\K-*\\d+\\b"); // "^#EXTINF\\s*:\\s*-*\\d+\\b" rule.format = plFormat; highlightingRules.append (rule); - plFormat = neutralFormat; + /*plFormat = neutralFormat; rule.pattern.setPattern ("^#EXTINF\\s*:"); rule.format = plFormat; - highlightingRules.append (rule); + highlightingRules.append (rule);*/ plFormat.setForeground (DarkGreen); + plFormat.setFontWeight (QFont::Bold); rule.pattern.setPattern ("^#EXTINF\\b"); rule.format = plFormat; highlightingRules.append (rule); @@ -1142,7 +1350,7 @@ /* colors */ scssFormat.setForeground (Verda); scssFormat.setFontWeight (QFont::Bold); - rule.pattern.setPattern ("#([A-Fa-f0-9]{3}){0,2}(?![A-Za-z0-9_]+)|#([A-Fa-f0-9]{3}){2}[A-Fa-f0-9]{2}(?![A-Za-z0-9_]+)"); + rule.pattern.setPattern ("#([A-Fa-f0-9]{3}){1,2}(?![A-Za-z0-9_]+)|#([A-Fa-f0-9]{3}){2}[A-Fa-f0-9]{2}(?![A-Za-z0-9_]+)"); rule.format = scssFormat; highlightingRules.append (rule); @@ -1215,7 +1423,9 @@ else if (progLan == "lua") rule.pattern.setPattern ("--(?!\\[).*"); else if (progLan == "troff") - rule.pattern.setPattern ("\\\\\"|\\.\\s*\\\\\""); + rule.pattern.setPattern ("\\\\\"|\\\\#|\\.\\s*\\\\\""); + else if (progLan == "LaTeX") + rule.pattern.setPattern ("%.*"); if (!rule.pattern.pattern().isEmpty()) { rule.format = commentFormat; @@ -1241,11 +1451,23 @@ commentStartExpression.setPattern ("\"\"\"|\'\'\'"); commentEndExpression = commentStartExpression; } - else if (progLan == "xml" || progLan == "html") + else if (progLan == "xml") { commentStartExpression.setPattern (""); } + else if (progLan == "html") + { + htmlCommetStart.setPattern (""); + + /* CSS and JS inside HTML (see htmlCSSHighlighter and htmlJavascript) */ + htmlSubcommetStart.setPattern ("/\\*"); + htmlSubcommetEnd.setPattern ("\\*/"); + + commentStartExpression = htmlCommetStart; + commentEndExpression = htmlCommetEnd; + } else if (progLan == "perl") { commentStartExpression.setPattern ("^=[A-Za-z0-9_]+($|\\s+)"); @@ -1416,17 +1638,14 @@ { QRegularExpressionMatch match; QRegularExpression delimPart ("<<\\s*"); - QRegularExpressionMatch match1; - QRegularExpression delimPart1; + if (text.lastIndexOf (delimPart, pos, &match) == pos - match.capturedLength()) + return true; if (progLan == "perl") // space is allowed - delimPart1.setPattern ("<<(?:\\s*)(\'[A-Za-z0-9_\\s]+)|<<(?:\\s*)(\"[A-Za-z0-9_\\s]+)|<<(?:\\s*)(`[A-Za-z0-9_\\s]+)"); + delimPart.setPattern ("<<(?:\\s*)(\'[A-Za-z0-9_\\s]+)|<<(?:\\s*)(\"[A-Za-z0-9_\\s]+)|<<(?:\\s*)(`[A-Za-z0-9_\\s]+)"); else - delimPart1.setPattern ("<<(?:\\s*)(\'[A-Za-z0-9_]+)|<<(?:\\s*)(\"[A-Za-z0-9_]+)"); - if (text.lastIndexOf (delimPart, pos, &match) == pos - match.capturedLength() - || text.lastIndexOf (delimPart1, pos, &match1) == pos - match1.capturedLength()) - { + delimPart.setPattern ("<<(?:\\s*)(\'[A-Za-z0-9_]+)|<<(?:\\s*)(\"[A-Za-z0-9_]+)"); + if (text.lastIndexOf (delimPart, pos, &match) == pos - match.capturedLength()) return true; - } } /* escaped start quotes are just for Bash, Perl, markdown and yaml */ @@ -1482,6 +1701,7 @@ || progLan == "python" || progLan == "perl" || progLan == "dart" + || progLan == "lua" /* markdown is an exception */ || progLan == "markdown" /* however, in Bash, single quote can be escaped only at start */ @@ -1502,30 +1722,17 @@ bool skipCommandSign) { if (progLan == "perl") return isPerlQuoted (text, index); + if (progLan == "javascript" || progLan == "qml") + return isJSQuoted (text, index); if (index < 0) return false; int pos = -1; - /* with regex, the text will be formatted below to know whether - the regex start sign is quoted (-> isEscapedRegex) */ - bool hasRegex (progLan == "javascript" || progLan == "qml"); - if (hasRegex) - { - if (format (index) == quoteFormat || format (index) == altQuoteFormat) - return true; - if (TextBlockData *data = static_cast(currentBlock().userData())) - { - pos = data->lastFormattedQuote() - 1; - if (index <= pos) return false; - } - } - bool res = false; int N; bool mixedQuotes = false; - if (hasRegex - || progLan == "c" || progLan == "cpp" + if (progLan == "c" || progLan == "cpp" || progLan == "python" || progLan == "sh" || progLan == "makefile" || progLan == "cmake" || progLan == "lua" @@ -1537,7 +1744,7 @@ } QRegularExpression quoteExpression; if (mixedQuotes) - quoteExpression.setPattern ("\"|\'"); + quoteExpression = mixedQuoteMark; else quoteExpression = quoteMark; if (pos == -1) @@ -1598,10 +1805,7 @@ while ((nxtPos = text.indexOf (quoteExpression, pos + 1)) >= 0) { /* skip formatted comments */ - if (format (nxtPos) == commentFormat - || (N % 2 == 0 && hasRegex - && (isMLCommented (text, nxtPos, commentState) - || isMLCommented (text, nxtPos, htmlJavaCommentState)))) + if (format (nxtPos) == commentFormat || format (nxtPos) == urlFormat) { pos = nxtPos; continue; @@ -1610,33 +1814,15 @@ ++N; if ((N % 2 == 0 // an escaped end quote... && isEscapedQuote (text, nxtPos, false)) - || (N % 2 != 0 // ... or an escaped start quote Bash - && (isEscapedQuote (text, nxtPos, true, skipCommandSign) || isInsideRegex (text, nxtPos)))) + || (N % 2 != 0 // ... or an escaped start quote Bash... + && (isEscapedQuote (text, nxtPos, true, skipCommandSign) + || isInsideRegex (text, nxtPos)))) // ... or a start quote inside regex { - if (res && hasRegex) - { // -> isEscapedRegex() - pos = qMax (pos, 0); - if (text.at (nxtPos) == quoteMark.pattern().at (0)) - setFormat (pos, nxtPos - pos + 1, quoteFormat); - else - setFormat (pos, nxtPos - pos + 1, altQuoteFormat); - } --N; pos = nxtPos; continue; } - if (N % 2 == 0 && hasRegex) - { // -> isEscapedRegex() - if (TextBlockData *data = static_cast(currentBlock().userData())) - data->insertLastFormattedQuote (nxtPos + 1); - pos = qMax (pos, 0); - if (text.at (nxtPos) == quoteMark.pattern().at (0)) - setFormat (pos, nxtPos - pos + 1, quoteFormat); - else - setFormat (pos, nxtPos - pos + 1, altQuoteFormat); - } - if (index < nxtPos) { if (N % 2 == 0) res = true; @@ -1658,7 +1844,7 @@ quoteExpression.setPattern ("\'"); } else - quoteExpression.setPattern ("\"|\'"); + quoteExpression = mixedQuoteMark; } pos = nxtPos; } @@ -1684,7 +1870,7 @@ bool res = false; int N; - QRegularExpression quoteExpression ("\"|\'|`"); + QRegularExpression quoteExpression = mixedQuoteBackquote; if (pos == -1) { int prevState = previousBlockState(); @@ -1719,7 +1905,7 @@ while ((nxtPos = text.indexOf (quoteExpression, pos + 1)) >= 0) { /* skip formatted comments */ - if (format (nxtPos) == commentFormat + if (format (nxtPos) == commentFormat || format (nxtPos) == urlFormat || (N % 2 == 0 && isMLCommented (text, nxtPos, commentState))) { pos = nxtPos; @@ -1777,7 +1963,122 @@ quoteExpression.setPattern ("`"); } else - quoteExpression.setPattern ("\"|\'"); + quoteExpression = mixedQuoteBackquote; + pos = nxtPos; + } + + return res; +} +/*************************/ +// JS has a separate method to support backquotes (template literals). +// Also see multiLineJSlQuote(). +bool Highlighter::isJSQuoted (const QString &text, const int index) +{ + if (index < 0) return false; + + int pos = -1; + + /* with regex, the text will be formatted below to know whether + the regex start sign is quoted (-> isEscapedRegex) */ + if (format (index) == quoteFormat || format (index) == altQuoteFormat) + return true; + if (TextBlockData *data = static_cast(currentBlock().userData())) + { + pos = data->lastFormattedQuote() - 1; + if (index <= pos) return false; + } + + bool res = false; + int N; + QRegularExpression quoteExpression = mixedQuoteBackquote; + if (pos == -1) + { + int prevState = previousBlockState(); + if (prevState != doubleQuoteState + && prevState != singleQuoteState + && prevState != JS_templateLiteralState) + { + N = 0; + } + else + { + N = 1; + res = true; + if (prevState == doubleQuoteState) + quoteExpression = quoteMark; + else if (prevState == singleQuoteState) + quoteExpression.setPattern ("\'"); + else + quoteExpression.setPattern ("`"); + } + } + else N = 0; // a new search from the last position + + int nxtPos; + while ((nxtPos = text.indexOf (quoteExpression, pos + 1)) >= 0) + { + /* skip formatted comments */ + if (format (nxtPos) == commentFormat || format (nxtPos) == urlFormat + || (N % 2 == 0 + && (isMLCommented (text, nxtPos, commentState) + || isMLCommented (text, nxtPos, htmlJavaCommentState)))) + { + pos = nxtPos; + continue; + } + + ++N; + if ((N % 2 == 0 // an escaped end quote... + && isEscapedQuote (text, nxtPos, false)) + || (N % 2 != 0 // ... or a start quote inside regex (JS has no escaped start quote) + && isInsideRegex (text, nxtPos))) + { + if (res) + { // -> isEscapedRegex() + pos = qMax (pos, 0); + if (text.at (nxtPos) == quoteMark.pattern().at (0)) + setFormat (pos, nxtPos - pos + 1, quoteFormat); + else + setFormat (pos, nxtPos - pos + 1, altQuoteFormat); + } + --N; + pos = nxtPos; + continue; + } + + if (N % 2 == 0) + { // -> isEscapedRegex() + if (TextBlockData *data = static_cast(currentBlock().userData())) + data->insertLastFormattedQuote (nxtPos + 1); + pos = qMax (pos, 0); + if (text.at (nxtPos) == quoteMark.pattern().at (0)) + setFormat (pos, nxtPos - pos + 1, quoteFormat); + else + setFormat (pos, nxtPos - pos + 1, altQuoteFormat); + } + + if (index < nxtPos) + { + if (N % 2 == 0) res = true; + else res = false; + break; + } + + /* "pos" might be negative next time */ + if (N % 2 == 0) res = false; + else res = true; + + if (N % 2 != 0) + { // each quote neutralizes the other until it's closed + if (text.at (nxtPos) == quoteMark.pattern().at (0)) + quoteExpression = quoteMark; + else if (text.at (nxtPos) == '\'') + quoteExpression.setPattern ("\'"); + else + quoteExpression.setPattern ("`"); + } + else + quoteExpression = mixedQuoteBackquote; pos = nxtPos; } @@ -1824,10 +2125,13 @@ while ((pos = text.indexOf (commentExpression, pos + 1, &commentMatch)) >= 0) { - /* skip formatted quotations */ + /* skip formatted quotations and regex */ QTextCharFormat fi = format (pos); - if (fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat) + if (fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat + || fi == regexFormat) // see multiLineRegex() for the reason + { continue; + } ++N; @@ -1862,11 +2166,6 @@ { if (progLan != "python") return; - QTextCharFormat noteFormat; - noteFormat.setFontWeight (QFont::Bold); - noteFormat.setFontItalic (true); - noteFormat.setForeground (DarkRed); - /* we reset the block state because this method is also called during the multiline quotation formatting after clearing formats */ setCurrentBlockState (-1); @@ -1883,13 +2182,14 @@ QTextCharFormat fi = format (index); while ((index > 0 && isQuoted (text, index - 1)) // because two quotes may follow an end quote + || (index == 0 && (prevState == doubleQuoteState || prevState == singleQuoteState)) || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat) // not needed { index = text.indexOf (commentStartExpression, index + 3); fi = format (index); } - if (format (index) == commentFormat) - return; + if (format (index) == commentFormat || format (index) == urlFormat) + return; // inside a single-line comment /* if the comment start is found... */ if (index >= indx) @@ -1994,252 +2294,20 @@ index = text.indexOf (commentStartExpression, index + quoteLength); QTextCharFormat fi = format (index); while ((index > 0 && isQuoted (text, index - 1)) + || (index == 0 && (prevState == doubleQuoteState || prevState == singleQuoteState)) || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat) { index = text.indexOf (commentStartExpression, index + 3); fi = format (index); } - if (format (index) == commentFormat) + if (format (index) == commentFormat || format (index) == urlFormat) return; } } /*************************/ -// This should come before multiline comments highlighting. -int Highlighter::cssHighlighter (const QString &text, bool mainFormatting, const int start) +void Highlighter::singleLineComment (const QString &text, const int start) { - if (progLan != "css") return -1; - - int cssIndx = -1; - /* CSS can have huge lines, which will take - a lot of CPU time if they're formatted completely. */ - /*bool hugeText (text.length() > 50000); - if (hugeText) - mainFormatting = false;*/ - - /************************** - * (Multiline) CSS Blocks * - **************************/ - - QRegularExpressionMatch cssStartMatch; - QRegularExpression cssStartExpression ("\\{"); - QRegularExpressionMatch cssEndtMatch; - QRegularExpression cssEndExpression ("\\}"); - QRegularExpressionMatch numMatch; - QRegularExpression numExpression ("(-|\\+){0,1}\\b\\d*\\.{0,1}\\d+"); - int index = start; - - QTextCharFormat cssValueFormat; - cssValueFormat.setFontItalic (true); - cssValueFormat.setForeground (Verda); - - QTextCharFormat numFormat; - numFormat.setFontItalic (true); - numFormat.setForeground (Brown); - - /*QTextCharFormat cssErrorFormat; - cssErrorFormat.setFontUnderline (true); - cssErrorFormat.setForeground (Red);*/ - - int prevState = previousBlockState(); - if (index > 0 - || (prevState != cssBlockState - && prevState != commentInCssState - && prevState != cssValueState)) - { - index = text.indexOf (cssStartExpression, index, &cssStartMatch); - if (index >= 0) cssIndx = index; - } - - while (index >= 0) - { - /*if (hugeText) - setFormat (index, text.length() - index, translucentFormat);*/ - int endIndex; - /* when the css block starts in the previous line - and the search for its end has just begun... */ - if ((prevState == cssBlockState - || prevState == commentInCssState - || prevState == cssValueState) // subset of cssBlockState - && index == 0) - /* ... search for its end from the line start */ - endIndex = text.indexOf (cssEndExpression, 0, &cssEndtMatch); - else - endIndex = text.indexOf (cssEndExpression, - index + cssStartMatch.capturedLength(), - &cssEndtMatch); - - int cssLength; - if (endIndex == -1) - { - endIndex = text.length() - 1; - setCurrentBlockState (cssBlockState); - cssLength = text.length() - index; - } - else - cssLength = endIndex - index - + cssEndtMatch.capturedLength(); - - if (mainFormatting) - { - /* at first, we suppose all syntax is wrong */ - QRegularExpressionMatch match; - QRegularExpression expression ("[^\\{\\}\\s]+"); - int indxTmp = text.indexOf (expression, index, &match); - while (isQuoted (text, indxTmp)) - indxTmp = text.indexOf (expression, indxTmp + 1, &match); - while (indxTmp >= 0 && indxTmp < endIndex) - { - setFormat (indxTmp, match.capturedLength(), neutralFormat); - indxTmp = text.indexOf (expression, indxTmp + match.capturedLength(), &match); - } - - /* css attribute format (before :...;) */ - QTextCharFormat cssAttFormat; - cssAttFormat.setFontItalic (true); - cssAttFormat.setForeground (Blue); - expression.setPattern ("[A-Za-z0-9_\\-]+(?=\\s*(?= 0 && indxTmp < endIndex) - { - setFormat (indxTmp, match.capturedLength(), cssAttFormat); - indxTmp = text.indexOf (expression, indxTmp + match.capturedLength(), &match); - } - } - - index = text.indexOf (cssStartExpression, index + cssLength, &cssStartMatch); - } - - /************************** - * (Multiline) CSS Values * - **************************/ - - cssStartExpression.setPattern ("(? 0) - { - index = text.indexOf (cssStartExpression, start, &cssStartMatch); - if (index > -1) - { - while (format (index) != neutralFormat) - { - index = text.indexOf (cssStartExpression, index + 1, &cssStartMatch); - if (index == -1) break; - } - } - } - - while (index >= 0) - { - int endIndex; - int startMatch = 0; - if (prevState == cssValueState - && index == 0) - endIndex = text.indexOf (cssEndExpression, 0, &cssEndtMatch); - else - { - startMatch = cssStartMatch.capturedLength(); - endIndex = text.indexOf (cssEndExpression, - index + startMatch, - &cssEndtMatch); - } - - int cssLength; - if (endIndex == -1) - { - setCurrentBlockState (cssValueState); - cssLength = text.length() - index; - } - else - cssLength = endIndex - index - + cssEndtMatch.capturedLength(); - if (mainFormatting) - { - /* css value format */ - setFormat (index, cssLength, cssValueFormat); - - /* numbers in css values */ - int nIndex = text.indexOf (numExpression, index + startMatch, &numMatch); - while (nIndex > -1 - && nIndex + numMatch.capturedLength() <= index + cssLength) - { - setFormat (nIndex, numMatch.capturedLength(), numFormat); - nIndex = text.indexOf (numExpression, nIndex + numMatch.capturedLength(), &numMatch); - } - - setFormat (index, startMatch, mainFormat); - if (endIndex > -1) - setFormat (endIndex, 1, mainFormat); - } - - index = text.indexOf (cssStartExpression, index + cssLength, &cssStartMatch); - if (index > -1) - { - if (!mainFormatting) break; // there's no neutralFormat - while (format (index) != neutralFormat) - { - index = text.indexOf (cssStartExpression, index + 1, &cssStartMatch); - if (index == -1) break; - } - } - } - - if (mainFormatting) - { - /* color value format (#xyz, #abcdef, #abcdefxy) */ - QTextCharFormat cssColorFormat; - - cssColorFormat.setForeground (Verda); - cssColorFormat.setFontWeight (QFont::Bold); - cssColorFormat.setFontItalic (true); - QRegularExpressionMatch match; - // previously: "#\\b([A-Za-z0-9]{3}){0,4}(?![A-Za-z0-9_]+)" - QRegularExpression expression ("#([A-Fa-f0-9]{3}){0,2}(?![A-Za-z0-9_]+)|#([A-Fa-f0-9]{3}){2}[A-Fa-f0-9]{2}(?![A-Za-z0-9_]+)"); - int indxTmp = text.indexOf (expression, start, &match); - while (isQuoted (text, indxTmp)) - indxTmp = text.indexOf (expression, indxTmp + 1, &match); - while (indxTmp >= 0) - { - if (/*format (indxTmp) == cssValueFormat // should be a value - &&*/ format (indxTmp) != neutralFormat) // not an error - { - setFormat (indxTmp, match.capturedLength(), cssColorFormat); - } - indxTmp = text.indexOf (expression, indxTmp + match.capturedLength(), &match); - } - - /* definitions (starting with @) */ - QTextCharFormat cssDefinitionFormat; - cssDefinitionFormat.setForeground (Brown); - expression.setPattern ("^\\s*@[A-Za-z-]+\\s+|;\\s*@[A-Za-z-]+\\s+"); - indxTmp = text.indexOf (expression, start, &match); - while (isQuoted (text, indxTmp)) - indxTmp = text.indexOf (expression, indxTmp + 1, &match); - while (indxTmp >= 0) - { - int length = match.capturedLength(); - if (format (indxTmp) != cssValueFormat - && format (indxTmp) != neutralFormat) - { - if (text.at (indxTmp) == ';') - { - ++indxTmp; - --length; - } - setFormat (indxTmp, length, cssDefinitionFormat); - } - indxTmp = text.indexOf (expression, indxTmp + length, &match); - } - } - - return cssIndx; -} -/*************************/ -void Highlighter::singleLineComment (const QString &text, const int start) -{ - for (const HighlightingRule &rule : qAsConst (highlightingRules)) + for (const HighlightingRule &rule : qAsConst (highlightingRules)) { if (rule.format == commentFormat) { @@ -2251,7 +2319,10 @@ startIndex = text.indexOf (rule.pattern, startIndex); /* skip quoted comments (and, automatically, those inside multiline python comments) */ while (startIndex > -1 - && (isQuoted (text, startIndex) || isInsideRegex (text, startIndex))) + && (isQuoted (text, startIndex) || isInsideRegex (text, startIndex) + /* with troff and LaTeX, the comment sign may be escaped */ + || ((progLan == "troff" || progLan == "LaTeX") + && isEscapedChar(text, startIndex)))) { startIndex = text.indexOf (rule.pattern, startIndex + 1); } @@ -2263,10 +2334,6 @@ /* also format urls and email addresses inside the comment */ QString str = text.mid (startIndex, l - startIndex); - QTextCharFormat noteFormat; - noteFormat.setFontWeight (QFont::Bold); - noteFormat.setFontItalic (true); - noteFormat.setForeground (DarkRed); int pIndex = 0; QRegularExpressionMatch urlMatch; while ((pIndex = str.indexOf (urlPattern, pIndex, &urlMatch)) > -1) @@ -2282,13 +2349,19 @@ setFormat (pIndex + startIndex, urlMatch.capturedLength(), noteFormat); pIndex += urlMatch.capturedLength(); } - /* take care of next-line comments with languages, for which - no highlighting function is called after singleLineComment() - and before the main formatting in highlightBlock() - (only c and c++ for now) */ - if ((progLan == "c" || progLan == "cpp") - && text.endsWith (QLatin1Char('\\'))) + + if (progLan == "javascript" || progLan == "qml") + { + /* see NOTE of isEscapedRegex() and also the end of multiLineRegex() */ + setCurrentBlockState (regexExtraState); + } + else if ((progLan == "c" || progLan == "cpp") + && text.endsWith (QLatin1Char('\\'))) { + /* Take care of next-line comments with languages, for which + no highlighting function is called after singleLineComment() + and before the main formatting in highlightBlock() + (only c and c++ for now). */ setCurrentBlockState (nextLineCommentState); } } @@ -2298,7 +2371,7 @@ } /*************************/ void Highlighter::multiLineComment (const QString &text, - const int index, const int cssIndx, + const int index, const QRegularExpression &commentStartExp, const QRegularExpression &commentEndExp, const int commState, const QTextCharFormat &comFormat) @@ -2312,19 +2385,15 @@ a lot of CPU time if they're formatted completely. */ //bool hugeText = ((progLan == "css" || progLan == "scss" ) && text.length() > 50000); - bool commentBeforeBrace = false; // in css, not as: "{... int startIndex = index; - QTextCharFormat noteFormat; - noteFormat.setFontWeight (QFont::Bold); - noteFormat.setFontItalic (true); - noteFormat.setForeground (DarkRed); QRegularExpressionMatch startMatch; QRegularExpressionMatch endMatch; - if ((prevState != commState - && prevState != commentInCssState) - || startIndex > 0) + if (startIndex > 0 + || (prevState != commState + && prevState != commentInCssBlockState + && prevState != commentInCssValueState)) { startIndex = text.indexOf (commentStartExp, startIndex, &startMatch); /* skip single-line comments */ @@ -2337,8 +2406,6 @@ startIndex = text.indexOf (commentStartExp, startIndex + 1, &startMatch); fi = format (startIndex); } - if (startIndex >= 0 && startIndex < cssIndx) - commentBeforeBrace = true; /* special handling for markdown */ if (progLan == "markdown" && startIndex > 0) @@ -2359,16 +2426,16 @@ } /* no comment start sign inside footnotes, images or links */ QRegularExpressionMatch mMatch; - QRegularExpression mExp ("\\[\\^[^\\]]+\\]" - "|" - "\\!\\[[^\\]\\^]*\\]\\s*" - "(\\(\\s*[^\\)\\(\\s]+(\\s+\\\".*\\\")*\\s*\\)|\\s*\\[[^\\]]*\\])" - "|" - "\\[[^\\]\\^]*\\]\\s*\\[[^\\]\\s]*\\]" - "|" - "\\[[^\\]\\^]*\\]\\s*\\(\\s*[^\\)\\(\\s]+(\\s+\\\".*\\\")*\\s*\\)" - "|" - "\\[[^\\]\\^]*\\]:\\s+\\s*[^\\)\\(\\s]+(\\s+\\\".*\\\")*"); + static const QRegularExpression mExp ("\\[\\^[^\\]]+\\]" + "|" + "\\!\\[[^\\]\\^]*\\]\\s*" + "(\\(\\s*[^\\)\\(\\s]+(\\s+\\\".*\\\")*\\s*\\)|\\s*\\[[^\\]]*\\])" + "|" + "\\[[^\\]\\^]*\\]\\s*\\[[^\\]\\s]*\\]" + "|" + "\\[[^\\]\\^]*\\]\\s*\\(\\s*[^\\)\\(\\s]+(\\s+\\\".*\\\")*\\s*\\)" + "|" + "\\[[^\\]\\^]*\\]:\\s+\\s*[^\\)\\(\\s]+(\\s+\\\".*\\\")*"); int mStart = text.indexOf (mExp, 0, &mMatch); while (mStart >= 0 && mStart < startIndex) { @@ -2390,7 +2457,8 @@ /* when the comment start is in the prvious line and the search for the comment end has just begun... */ if ((prevState == commState - || prevState == commentInCssState) + || prevState == commentInCssBlockState + || prevState == commentInCssValueState) && startIndex == 0) /* ... search for the comment end from the line start */ endIndex = text.indexOf (commentEndExp, 0, &endMatch); @@ -2411,11 +2479,11 @@ } /* if there's a comment end ... */ - if (/*!hugeText && */endIndex >= 0 && progLan != "xml") + if (/*!hugeText && */endIndex >= 0 && progLan != "xml" && progLan != "html") { /* ... clear the comment format from there to reformat later as a single-line comment sign may have been commented out now */ - badIndex = endIndex + 1; + badIndex = endIndex + endMatch.capturedLength(); for (int i = badIndex; i < text.length(); ++i) { if (format (i) == commentFormat || format (i) == urlFormat) @@ -2426,28 +2494,23 @@ int commentLength; if (endIndex == -1) { - if ((currentBlockState() != cssBlockState - && currentBlockState() != cssValueState) - || commentBeforeBrace) + if (currentBlockState() != cssBlockState + && currentBlockState() != cssValueState) { setCurrentBlockState (commState); } else - setCurrentBlockState (commentInCssState); + { // CSS + if (currentBlockState() == cssValueState) + setCurrentBlockState (commentInCssValueState); + else + setCurrentBlockState (commentInCssBlockState); + } commentLength = text.length() - startIndex; } else - { - if (/*!hugeText && */cssIndx >= startIndex && cssIndx < endIndex) - { - /* if '{' is inside the comment, - this isn't a CSS block */ - setCurrentBlockState (-1); - setFormat (endIndex + 1, text.length() - endIndex - 1, neutralFormat); - } commentLength = endIndex - startIndex + endMatch.capturedLength(); - } //if (!hugeText) //{ setFormat (startIndex, commentLength, comFormat); @@ -2559,6 +2622,11 @@ multiLinePerlQuote (text); return false; } + if (progLan == "javascript" || progLan == "qml") + { + multiLineJSlQuote (text, start, comState); + return false; + } //-------------------- /* these are only for C++11 raw string literals, whose pattern is R"(\bR"([^(]*)\(.*(?=\)\1"))" */ @@ -2583,7 +2651,6 @@ int index = start; bool mixedQuotes = false; if (progLan == "c" || progLan == "cpp" - || progLan == "javascript" || progLan == "qml" || progLan == "python" /*|| progLan == "sh"*/ // bash uses SH_MultiLineQuote() || progLan == "makefile" || progLan == "cmake" @@ -2596,7 +2663,7 @@ QRegularExpressionMatch quoteMatch; QRegularExpression quoteExpression; if (mixedQuotes) - quoteExpression.setPattern ("\"|\'"); + quoteExpression = mixedQuoteMark; else quoteExpression = quoteMark; int quote = doubleQuoteState; @@ -2611,7 +2678,7 @@ /* skip escaped start quotes and all comments */ while (isEscapedQuote (text, index, true) || isInsideRegex (text, index) - || isMLCommented (text, index, comState)) // multiline + || isMLCommented (text, index, comState)) { index = text.indexOf (quoteExpression, index + 1); } @@ -2679,7 +2746,7 @@ while (index >= 0) { /* if the search is continued... */ - if (quoteExpression.pattern() == "\"|\'") + if (quoteExpression == mixedQuoteMark) { /* ... distinguish between double and single quotes again because the quote mark may have changed */ @@ -2733,8 +2800,7 @@ bool isQuotation = true; if (endIndex == -1) { - if (progLan == "c" || progLan == "cpp" - || progLan == "javascript" || progLan == "qml") + if (progLan == "c" || progLan == "cpp") { /* In c and cpp, multiline double quotes need backslash and there's no multiline single quote. Moreover, In C++11, @@ -2742,7 +2808,7 @@ if (quoteExpression.pattern() == "\'" || (quoteExpression == quoteMark && delimStr.isEmpty() && !textEndsWithBackSlash (text))) { - endIndex = text.size() + 1; // quoteMatch.capturedLength() is 1 here + endIndex = text.length(); } } else if (progLan == "markdown") @@ -2782,7 +2848,7 @@ } else quoteLength = endIndex - index - + quoteMatch.capturedLength(); // 1 + + quoteMatch.capturedLength(); // 1 or 0 (open quotation without ending backslash) if (isQuotation) { setFormat (index, quoteLength, quoteExpression == quoteMark ? quoteFormat @@ -2802,7 +2868,7 @@ /* the next quote may be different */ if (mixedQuotes) - quoteExpression.setPattern ("\"|\'"); + quoteExpression = mixedQuoteMark; index = text.indexOf (quoteExpression, index + quoteLength); /* skip escaped start quotes and all comments */ @@ -2840,7 +2906,7 @@ { int index = 0; QRegularExpressionMatch quoteMatch; - QRegularExpression quoteExpression ("\"|\'|`"); + QRegularExpression quoteExpression = mixedQuoteBackquote; int quote = doubleQuoteState; /* find the start quote */ @@ -2899,7 +2965,7 @@ while (index >= 0) { /* if the search is continued... */ - if (quoteExpression.pattern() == "\"|\'|`") + if (quoteExpression == mixedQuoteBackquote) { /* ... distinguish between the three kinds of quote again because the quote mark may have changed */ @@ -2961,7 +3027,7 @@ } /* the next quote may be different */ - quoteExpression.setPattern ("\"|\'|`"); + quoteExpression = mixedQuoteBackquote; index = text.indexOf (quoteExpression, index + quoteLength); /* skip escaped start quotes and all comments */ @@ -2972,6 +3038,152 @@ } } /*************************/ +// JS multiline quote highlighting comes here to support backquotes (template literals). +// Also see isJSQuoted(). +void Highlighter::multiLineJSlQuote (const QString &text, const int start, int comState) +{ + int index = start; + QRegularExpressionMatch quoteMatch; + QRegularExpression quoteExpression = mixedQuoteBackquote; + int quote = doubleQuoteState; + + /* find the start quote */ + int prevState = previousBlockState(); + if ((prevState != doubleQuoteState + && prevState != singleQuoteState + && prevState != JS_templateLiteralState) + || index > 0) + { + index = text.indexOf (quoteExpression, index); + /* skip escaped start quotes and all comments */ + while (isEscapedQuote (text, index, true) + || isInsideRegex (text, index) + || isMLCommented (text, index, comState)) + { + index = text.indexOf (quoteExpression, index + 1); + } + while (format (index) == commentFormat || format (index) == urlFormat) // single-line + index = text.indexOf (quoteExpression, index + 1); + + /* if the start quote is found... */ + if (index >= 0) + { + /* ... distinguish between double and single quotes */ + if (text.at (index) == quoteMark.pattern().at (0)) + { + quoteExpression = quoteMark; + quote = doubleQuoteState; + } + else if (text.at (index) == '\'') + { + quoteExpression.setPattern ("\'"); + quote = singleQuoteState; + } + else + { + quoteExpression.setPattern ("`"); + quote = JS_templateLiteralState; + } + } + } + else // but if we're inside a quotation... + { + /* ... distinguish between the two quote kinds + by checking the previous line */ + quote = prevState; + if (quote == doubleQuoteState) + quoteExpression = quoteMark; + else if (quote == singleQuoteState) + quoteExpression.setPattern ("\'"); + else + quoteExpression.setPattern ("`"); + } + + while (index >= 0) + { + /* if the search is continued... */ + if (quoteExpression == mixedQuoteBackquote) + { + /* ... distinguish between double and single quotes + again because the quote mark may have changed */ + if (text.at (index) == quoteMark.pattern().at (0)) + { + quoteExpression = quoteMark; + quote = doubleQuoteState; + } + else if (text.at (index) == '\'') + { + quoteExpression.setPattern ("\'"); + quote = singleQuoteState; + } + else + { + quoteExpression.setPattern ("`"); + quote = JS_templateLiteralState; + } + } + + int endIndex; + /* if there's no start quote ... */ + if (index == 0 + && (prevState == doubleQuoteState || prevState == singleQuoteState + || prevState == JS_templateLiteralState)) + { + /* ... search for the end quote from the line start */ + endIndex = text.indexOf (quoteExpression, 0, "eMatch); + } + else // otherwise, search from the start quote + endIndex = text.indexOf (quoteExpression, index + 1, "eMatch); + + /* check if the quote is escaped */ + while (isEscapedQuote (text, endIndex, false)) + endIndex = text.indexOf (quoteExpression, endIndex + 1, "eMatch); + + int quoteLength; + if (endIndex == -1) + { + /* In JS, multiline double and single quotes need backslash. */ + if ((quoteExpression.pattern() == "\'" || quoteExpression == quoteMark) + && !textEndsWithBackSlash (text)) + { // see NOTE of isEscapedRegex() and also the end of multiLineRegex() + setCurrentBlockState (regexExtraState); + } + else + setCurrentBlockState (quote); + quoteLength = text.length() - index; + } + else + quoteLength = endIndex - index + + quoteMatch.capturedLength(); // 1 + + setFormat (index, quoteLength, quoteExpression == quoteMark ? quoteFormat + : altQuoteFormat); + + QString str = text.mid (index, quoteLength); + int urlIndex = 0; + QRegularExpressionMatch urlMatch; + while ((urlIndex = str.indexOf (urlPattern, urlIndex, &urlMatch)) > -1) + { + setFormat (urlIndex + index, urlMatch.capturedLength(), urlInsideQuoteFormat); + urlIndex += urlMatch.capturedLength(); + } + + /* the next quote may be different */ + quoteExpression = mixedQuoteBackquote; + index = text.indexOf (quoteExpression, index + quoteLength); + + /* skip escaped start quotes and all comments */ + while (isEscapedQuote (text, index, true) + || isInsideRegex (text, index) + || isMLCommented (text, index, comState, endIndex + 1)) + { + index = text.indexOf (quoteExpression, index + 1); + } + while (format (index) == commentFormat || format (index) == urlFormat) + index = text.indexOf (quoteExpression, index + 1); + } +} +/*************************/ // Generalized form of setFormat(), where "oldFormat" shouldn't be reformatted. void Highlighter::setFormatWithoutOverwrite (int start, int count, @@ -3016,12 +3228,12 @@ void Highlighter::xmlQuotes (const QString &text) { int index = 0; - /* mixed quotes aren't really needed here - but they're harmless and easy to handle */ + /* mixed quotes aren't really needed here but they're harmless and easy to handle */ + static const QRegularExpression xmlMixedQuote ("\"|"|\'"); + static const QRegularExpression doubleQuote ("\"|""); + static const QRegularExpression virtualQuote ("""); QRegularExpressionMatch quoteMatch; - QRegularExpression quoteExpression ("\"|"|\'"); - QRegularExpression doubleQuote ("\"|""); - QRegularExpression virtualQuote ("""); + QRegularExpression quoteExpression = xmlMixedQuote; int quote = doubleQuoteState; /* find the start quote */ @@ -3072,7 +3284,7 @@ while (index >= 0) { /* if the search is continued... */ - if (quoteExpression.pattern() == "\"|"|\'") + if (quoteExpression == xmlMixedQuote) { /* ... distinguish between double, virtual and single quotes again because the quote mark may have changed */ @@ -3109,7 +3321,7 @@ /* tolerate a mismatch between `"` and `"` as far as possible but show the error by formatting `>` or `>` */ QRegularExpressionMatch match; - int closing = text.indexOf (QRegularExpression ("(>|>)"), index, &match); + int closing = text.indexOf (xmlGt, index, &match); if (closing > -1) endIndex = closing + match.capturedLength(); } @@ -3137,7 +3349,7 @@ } /* the next quote may be different */ - quoteExpression.setPattern ("\"|"|\'"); + quoteExpression = xmlMixedQuote; index = text.indexOf (quoteExpression, index + quoteLength); while (isMLCommented (text, index, commentState, endIndex + quoteMatch.capturedLength()) @@ -3152,105 +3364,119 @@ // (Open quotes aren't taken into account when they happen after the start delimiter.) bool Highlighter::isHereDocument (const QString &text) { + /*if (progLan != "sh" && progLan != "makefile" && progLan != "cmake" + && progLan != "perl" && progLan != "ruby") + { + return false; + // "<<([A-Za-z0-9_]+)|<<(\'[A-Za-z0-9_]+\')|<<(\"[A-Za-z0-9_]+\")" + }*/ + QTextBlock prevBlock = currentBlock().previous(); - TextBlockData *prevData = nullptr; - if (prevBlock.isValid()) - prevData = static_cast(prevBlock.userData()); + int prevState = previousBlockState(); QTextCharFormat blockFormat; blockFormat.setForeground (Violet); QTextCharFormat delimFormat = blockFormat; delimFormat.setFontWeight (QFont::Bold); QString delimStr; - /* Kate uses something like "<<(?:\\s*)([\\\\]{0,1}[^\\s]+)" */ - QRegularExpression delim; - if (progLan == "sh" || progLan == "makefile" || progLan == "cmake") // "<<-" can be used instead of "<<" - delim.setPattern ("<<-?(?:\\s*)(\\\\{0,1}[A-Za-z0-9_]+)|<<-?(?:\\s*)(\'[A-Za-z0-9_]+\')|<<-?(?:\\s*)(\"[A-Za-z0-9_]+\")"); - /*else if (progLan == "perl") // without space after "<<" and with ";" at the end - delim.setPattern ("<<([A-Za-z0-9_]+)(?:;)|<<(\'[A-Za-z0-9_]+\')(?:;)|<<(\"[A-Za-z0-9_]+\")(?:;)");*/ - else if (progLan == "perl") // can contain spaces inside quote marks or backquotes and usually has ";" at the end - delim.setPattern ("<<([A-Za-z0-9_]+)(?:;{0,1})|<<(?:\\s*)(\'[A-Za-z0-9_\\s]+\')(?:;{0,1})|<<(?:\\s*)(\"[A-Za-z0-9_\\s]+\")(?:;{0,1})|<<(?:\\s*)(`[A-Za-z0-9_\\s]+`)(?:;{0,1})"); - else if (progLan == "ruby") - delim.setPattern ("<<(?:-|~){0,1}([A-Za-z0-9_]+)|<<(\'[A-Za-z0-9_]+\')|<<(\"[A-Za-z0-9_]+\")"); - else // FIXME: No language. - delim.setPattern ("<<([A-Za-z0-9_]+)|<<(\'[A-Za-z0-9_]+\')|<<(\"[A-Za-z0-9_]+\")"); - QRegularExpression comment; - if (progLan == "sh" || progLan == "makefile" || progLan == "cmake") - comment.setPattern ("^#.*|\\s+#.*"); - else - comment.setPattern ("#.*"); - int insideCommentPos = text.indexOf (comment); - int pos = 0; /* format the start delimiter */ - QRegularExpressionMatch match; - int prevState = previousBlockState(); - if ((!prevBlock.isValid() - || (prevState >= 0 && prevState < endState)) - && (pos = text.indexOf (delim, 0, &match)) >= 0 - && !isQuoted (text, pos, true) // escaping start double quote before "$(" - /* the whole line isn't commented out */ - && (insideCommentPos == -1 || pos < insideCommentPos - || isQuoted (text, insideCommentPos, true))) + if (!prevBlock.isValid() + || (prevState >= 0 && prevState < endState)) { - int i = 1; - while ((delimStr = match.captured (i)).isEmpty() && i <= 3) + int pos = 0; + QRegularExpressionMatch match; + while ((pos = text.indexOf (hereDocDelimiter, pos, &match)) >= 0 + && (isQuoted (text, pos, progLan == "sh") // escaping start double quote before "$(" + || (progLan == "perl" && isInsideRegex (text, pos)))) + { - ++i; - delimStr = match.captured (i); + pos += match.capturedLength(); } - - if (progLan == "perl") + if (pos >= 0) { - bool ok; - delimStr.toInt (&ok, 10); - if (ok) - delimStr = QString(); // don't mistake shift-left operator with here-doc delimiter - else if (delimStr.contains ('`')) // Perl's delimiter can have backquotes - delimStr = delimStr.split ('`').at (1); - } - - if (!delimStr.isEmpty()) - { - /* remove quotes */ - if (delimStr.contains ('\'')) - delimStr = delimStr.split ('\'').at (1); - if (delimStr.contains ('\"')) - delimStr = delimStr.split ('\"').at (1); - /* remove the start backslash if it exists */ - if (QString (delimStr.at (0)) == "\\") - delimStr = delimStr.remove (0, 1); - } - - if (!delimStr.isEmpty()) - { - int n = static_cast(qHash (delimStr)); - int state = 2 * (n + (n >= 0 ? endState/2 + 1 : 0)); // always an even number but maybe negative - if (isQuoted (text, pos, false)) - { // to know whether a double quote is added/removed before "$(" in the current line - state > 0 ? state += 2 : state -= 2; - } - if (prevState == doubleQuoteState || prevState == SH_DoubleQuoteState) - { // to know whether a double quote is added/removed before "$(" in a previous line - state > 0 ? state += 4 : state -= 4; // not 2 -> not to be canceled above - } - setCurrentBlockState (state); - setFormat (text.indexOf (delimStr, pos), - delimStr.length(), - delimFormat); + int insideCommentPos; + if (progLan == "sh") + { + static const QRegularExpression commentSH ("^#.*|\\s+#.*"); + insideCommentPos = text.indexOf (commentSH); + } + else + { + static const QRegularExpression commentOthers ("#.*"); + insideCommentPos = text.indexOf (commentOthers); + } + if (insideCommentPos == -1 || pos < insideCommentPos + || isQuoted (text, insideCommentPos, progLan == "sh") + || (progLan == "perl" && isInsideRegex (text, insideCommentPos))) + { // the delimiter isn't (single-)commented out + int i = 1; + while ((delimStr = match.captured (i)).isEmpty() && i <= 3) + { + ++i; + delimStr = match.captured (i); + } - TextBlockData *data = static_cast(currentBlock().userData()); - if (!data) return false; - data->insertInfo (delimStr); - setCurrentBlockUserData (data); + if (progLan == "perl") + { + bool ok; + delimStr.toInt (&ok, 10); + if (ok) + delimStr = QString(); // don't mistake shift-left operator with here-doc delimiter + else if (delimStr.contains ('`')) // Perl's delimiter can have backquotes + delimStr = delimStr.split ('`').at (1); + } - return false; + if (!delimStr.isEmpty()) + { + /* remove quotes */ + if (delimStr.contains ('\'')) + delimStr = delimStr.split ('\'').at (1); + if (delimStr.contains ('\"')) + delimStr = delimStr.split ('\"').at (1); + /* remove the start backslash if it exists */ + if (QString (delimStr.at (0)) == "\\") + delimStr = delimStr.remove (0, 1); + } + + if (!delimStr.isEmpty()) + { + int n = static_cast(qHash (delimStr)); + int state = 2 * (n + (n >= 0 ? endState/2 + 1 : 0)); // always an even number but maybe negative + if (progLan == "sh") + { + if (isQuoted (text, pos, false)) + { // to know whether a double quote is added/removed before "$(" in the current line + state > 0 ? state += 2 : state -= 2; + } + if (prevState == doubleQuoteState || prevState == SH_DoubleQuoteState) + { // to know whether a double quote is added/removed before "$(" in a previous line + state > 0 ? state += 4 : state -= 4; // not 2 -> not to be canceled above + } + } + setCurrentBlockState (state); + setFormat (text.indexOf (delimStr, pos), + delimStr.length(), + delimFormat); + + TextBlockData *data = static_cast(currentBlock().userData()); + if (!data) return false; + data->insertInfo (delimStr); + setCurrentBlockUserData (data); + + return false; + } + } } } if (prevState >= endState || prevState < -1) { + TextBlockData *prevData = nullptr; + if (prevBlock.isValid()) + prevData = static_cast(prevBlock.userData()); if (!prevData) return false; + delimStr = prevData->labelInfo(); int l = 0; if (progLan == "perl" || progLan == "ruby") @@ -3394,7 +3620,8 @@ } } - int endIndex = text.indexOf (endRegex, 0, &endMatch); + int endIndex = !isBlockQuote && prevState != state ? // the start of a code block can be ``` + -1 : text.indexOf (endRegex, 0, &endMatch); int L; if (endIndex == -1) { @@ -3425,10 +3652,6 @@ } /* format note patterns too */ pIndex = 0; - QTextCharFormat noteFormat; - noteFormat.setFontWeight (QFont::Bold); - noteFormat.setFontItalic (true); - noteFormat.setForeground (DarkRed); while ((pIndex = str.indexOf (notePattern, pIndex, &urlMatch)) > -1) { if (format (pIndex) != urlFormat) @@ -3456,13 +3679,13 @@ It also seems that five successive asterisks are ignored at start. */ QRegularExpressionMatch italicMatch; - const QRegularExpression italicExp ("(?)-?\\s*$"); + static const QRegularExpression blockStartExp ("^[^#]*\\s+\\K(\\||>)-?\\s*$"); int index = text.indexOf (blockStartExp, 0, &match); if (index >= 0) { @@ -3964,9 +4186,9 @@ static const QRegularExpression lyricRegex ("^\\s*~"); /* notes */ - multiLineComment (text, 0, -1, leftNoteBracket, QRegularExpression ("^ ?$|\\]\\]"), markdownBlockQuoteState, altQuoteFormat); + multiLineComment (text, 0, leftNoteBracket, QRegularExpression ("^ ?$|\\]\\]"), markdownBlockQuoteState, altQuoteFormat); /* boneyards (like a multi-line comment -- skips altQuoteFormat in notes with commentStartExpression) */ - multiLineComment (text, 0, -1, commentStartExpression, commentEndExpression, commentState, commentFormat); + multiLineComment (text, 0, commentStartExpression, commentEndExpression, commentState, commentFormat); QTextBlock prevBlock = currentBlock().previous(); QTextBlock nxtBlock = currentBlock().next(); @@ -4204,6 +4426,129 @@ } } /*************************/ +void Highlighter::latexFormula (const QString &text) +{ + int index = 0; + QString exp; + TextBlockData *data = static_cast(currentBlock().userData()); + static const QRegularExpression latexFormulaStart ("\\${2}|\\$|\\\\\\(|\\\\\\["); + QRegularExpressionMatch startMatch; + QRegularExpression endExp; + QRegularExpressionMatch endMatch; + + QTextBlock prevBlock = currentBlock().previous(); + if (prevBlock.isValid()) + { + if (TextBlockData *prevData = static_cast(prevBlock.userData())) + exp = prevData->labelInfo(); + } + + if (exp.isEmpty()) + { + index = text.indexOf (latexFormulaStart, index, &startMatch); + while (isEscapedChar (text, index)) + index = text.indexOf (latexFormulaStart, index + 1, &startMatch); + /* skip single-line comments */ + if (format (index) == commentFormat || format (index) == urlFormat) + index = -1; + } + + while (index >= 0) + { + int badIndex = -1; + int endIndex; + + if (!exp.isEmpty() && index == 0) + { + endExp.setPattern (exp); + endIndex = text.indexOf (endExp, 0, &endMatch); + } + else + { + if (startMatch.capturedLength() == 1) + endExp.setPattern ("\\$"); + else + { + if (text.at (index + 1) == '$') + endExp.setPattern ("\\${2}"); + else if (text.at (index + 1) == '(') + endExp.setPattern ("\\\\\\)"); + else + endExp.setPattern ("\\\\\\]"); + } + endIndex = text.indexOf (endExp, + index + startMatch.capturedLength(), + &endMatch); + } + + while (isEscapedChar (text, endIndex)) + endIndex = text.indexOf (endExp, endIndex + 1, &endMatch); + + /* if the formula ends ... */ + if (endIndex >= 0) + { + /* ... clear the comment format from there to reformat later + because "%" may be inside a formula now */ + badIndex = endIndex + endMatch.capturedLength(); + for (int i = badIndex; i < text.length(); ++i) + { + if (format (i) == commentFormat || format (i) == urlFormat) + setFormat (i, 1, neutralFormat); + } + } + + int formulaLength; + if (endIndex == -1) + { + if (data) + data->insertInfo (endExp.pattern()); + formulaLength = text.length() - index; + } + else + formulaLength = endIndex - index + + endMatch.capturedLength(); + + setFormat (index, formulaLength, codeBlockFormat); + + /* reformat the single-line comment from here if the format was cleared before */ + if (badIndex >= 0) + { + for (const HighlightingRule &rule : qAsConst (highlightingRules)) + { + if (rule.format == commentFormat) + { + int INDX = text.indexOf (rule.pattern, badIndex); + if (INDX >= 0) + setFormat (INDX, text.length() - INDX, commentFormat); + /* URLs and notes were cleared too */ + QString str = text.mid (INDX, text.length() - INDX); + int pIndex = 0; + QRegularExpressionMatch urlMatch; + while ((pIndex = str.indexOf (urlPattern, pIndex, &urlMatch)) > -1) + { + setFormat (pIndex + INDX, urlMatch.capturedLength(), urlFormat); + pIndex += urlMatch.capturedLength(); + } + pIndex = 0; + while ((pIndex = str.indexOf (notePattern, pIndex, &urlMatch)) > -1) + { + if (format (pIndex + INDX) != urlFormat) + setFormat (pIndex + INDX, urlMatch.capturedLength(), noteFormat); + pIndex += urlMatch.capturedLength(); + } + break; + } + } + } + + index = text.indexOf (latexFormulaStart, index + formulaLength, &startMatch); + while (isEscapedChar (text, index)) + index = text.indexOf (latexFormulaStart, index + 1, &startMatch); + if (format (index) == commentFormat || format (index) == urlFormat) + index = -1; + } +} +/*************************/ // Start syntax highlighting! void Highlighter::highlightBlock (const QString &text) { @@ -4225,9 +4570,9 @@ } bool rehighlightNextBlock = false; - int oldOpenNests = 0; QSet oldOpenQuotes; // to be used in SH_CmndSubstVar() (and perl) + int oldOpenNests = 0; QSet oldOpenQuotes; // to be used in SH_CmndSubstVar() (and perl and css) bool oldProperty = false; // to be used with yaml, markdown and perl - QString oldLabel; // to be used with yaml and perl + QString oldLabel; // to be used with yaml, perl and LaTeX if (TextBlockData *oldData = static_cast(currentBlockUserData())) { oldOpenNests = oldData->openNests(); @@ -4246,6 +4591,7 @@ if (txtL > 10000) { setFormat (0, txtL, translucentFormat); + data->setHighlighted(); // completely highlighted return; } @@ -4256,6 +4602,38 @@ if (progLan == "sh" || progLan == "makefile" || progLan == "cmake" || progLan == "perl" || progLan == "ruby") { + /* first, handle "__DATA__" in perl */ + if (progLan == "perl") + { + QRegularExpressionMatch match; + if (previousBlockState() == updateState // only used below to distinguish "__DATA__" + || (previousBlockState() <= 0 + && text.indexOf (QRegularExpression("^\\s*__(DATA|END)__"), 0, &match) == 0)) + { + if (match.capturedLength() > 0) + { + QTextCharFormat dataFormat = neutralFormat; + dataFormat.setFontWeight (QFont::Bold); + setFormat (0, match.capturedLength(), dataFormat); + } + for (const HighlightingRule &rule : qAsConst (highlightingRules)) + { + if (rule.format == whiteSpaceFormat) + { + index = text.indexOf (rule.pattern, 0, &match); + while (index >= 0) + { + setFormat (index, match.capturedLength(), rule.format); + index = text.indexOf (rule.pattern, index + match.capturedLength(), &match); + } + break; + } + } + setCurrentBlockState (updateState); // completely highlighted + data->setHighlighted(); + return; + } + } if (isHereDocument (text)) { data->setHighlighted(); // completely highlighted @@ -4306,43 +4684,49 @@ /******************************* * XML Quotations and Comments * *******************************/ - if (progLan == "xml") { /* value is handled as a kind of comment */ - multiLineComment (text, 0, -1, QRegularExpression ("(>|>)"), QRegularExpression ("(<|<)"), xmlValueState, neutralFormat); + multiLineComment (text, 0, xmlGt, xmlLt, xmlValueState, neutralFormat); /* multiline quotes as signs of errors in the xml doc */ xmlQuotes (text); } - /************************** - * (Multiline) Quotations * - **************************/ + /****************** + * LaTeX Formulae * + ******************/ + else if (progLan == "LaTeX") + { + latexFormula (text); + if (data->labelInfo() != oldLabel) + rehighlightNextBlock = true; + } + /***************************************** + * (Multiline) Quotations as well as CSS * + *****************************************/ else if (progLan == "sh") // bash has its own method SH_MultiLineQuote (text); + else if (progLan == "css") + { // quotes and urls are highlighted by cssHighlighter() inside CSS values + cssHighlighter (text, mainFormatting); + rehighlightNextBlock |= (data->openNests() != oldOpenNests); + } else if (progLan != "diff" && progLan != "log" && progLan != "desktop" && progLan != "config" && progLan != "theme" && progLan != "changelog" && progLan != "url" && progLan != "srt" && progLan != "html" && progLan != "deb" && progLan != "m3u" - && progLan != "reST" + && progLan != "reST" && progLan != "troff" && progLan != "yaml") // yaml will be formated separately { rehighlightNextBlock |= multiLineQuote (text); } - /******* - * CSS * - *******/ - - /* helps seeing if a comment destroys a css block */ - int cssIndx = cssHighlighter (text, mainFormatting); - /********************** * Multiline Comments * **********************/ if (!commentStartExpression.pattern().isEmpty() && progLan != "python") - multiLineComment (text, 0, cssIndx, commentStartExpression, commentEndExpression, commentState, commentFormat); + multiLineComment (text, 0, commentStartExpression, commentEndExpression, commentState, commentFormat); /* only javascript, qml and perl */ multiLineRegex (text, 0); @@ -4356,6 +4740,7 @@ if (progLan == "yaml") { + bool isCodeBlock = previousBlockState() == codeBlockState; bool braces (true); int openNests = 0; QTextBlock prevBlock = currentBlock().previous(); @@ -4366,6 +4751,16 @@ openNests = prevData->openNests(); if (openNests != 0) // braces take priority over brackets braces = !prevData->getProperty(); + + if (isCodeBlock) + { + QString spaces = prevData->labelInfo(); + if (!spaces.startsWith ("i")) + spaces = QString(); + else + spaces.remove (0, 1); + isCodeBlock = text.startsWith (spaces + " "); + } } } if (text.indexOf (QRegularExpression("^---")) == 0) // pass the data @@ -4376,7 +4771,7 @@ } else // format braces and brackets before formatting multi-line quotes { - if (previousBlockState() != codeBlockState || text.indexOf (QRegularExpression ("^\\S")) == 0) + if (!isCodeBlock) { if (braces) { @@ -4406,7 +4801,7 @@ rehighlightNextBlock |= multiLineQuote (text); } - /* yaml Main Formatting */ + /* yaml Main Formatting */ if (mainFormatting) { data->setHighlighted(); @@ -4427,7 +4822,8 @@ fi = format (index); while (index >= 0 && (fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat - || fi == commentFormat || fi == urlFormat)) + || fi == commentFormat || fi == urlFormat + || fi == noteFormat)) // because of Yaml keys (as in "# TODO:...") { index = text.indexOf (rule.pattern, index + 1, &match); fi = format (index); @@ -4522,7 +4918,7 @@ fi = format (index); while (index >= 0 && (fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat - || fi == commentFormat || fi == urlFormat)) + || fi == commentFormat || fi == urlFormat || fi == noteFormat)) { index = text.indexOf (rule.pattern, index + 1, &match); fi = format (index); @@ -4583,10 +4979,13 @@ } /* the ``` code block shouldn't be formatted inside a comment or block quote */ if (prevState != commentState && prevState != markdownBlockQuoteState) + { + static const QRegularExpression codeStartRegex ("^ {0,3}\\K(`{3,}(?!`)|~{3,}(?!~))"); rehighlightNextBlock |= markdownMultiLine (text, oldLabel, - QRegularExpression ("^ {0,3}\\K(`{3,}(?!`)|~{3,}(?!~))"), + codeStartRegex, QRegularExpression(), codeBlockState, codeBlockFormat); + } if (currentBlockState() != markdownBlockQuoteState && currentBlockState() != codeBlockState) { @@ -4618,7 +5017,7 @@ } /* code block with indentation */ - QRegularExpression codeRegex ("^( {4,}|\\s*\\t+\\s*).*"); + static const QRegularExpression codeRegex ("^( {4,}|\\s*\\t+\\s*).*"); index = text.indexOf (codeRegex, 0, &match); fi = format (index); while (index >= 0 @@ -4739,15 +5138,31 @@ * reST Code and Comment Blocks * ********************************/ QTextBlock prevBlock = currentBlock().previous(); + static const QRegularExpression codeBlockStart1 ("^\\.{2} code-block::"); + static const QRegularExpression codeBlockStart2 ("^(?!\\s*\\.{2}\\s+).*::$"); + static const QRegularExpression restComment ("^\\s*\\.{2}" + "(?!(" + /* not a label or substitution (".. _X:" or ".. |X| Y::") */ + " _[\\w\\s\\-+]*:(?!\\S)" + "|" + " \\|[\\w\\s]+\\|\\s+\\w+::(?!\\S)" + "|" + /* not a footnote (".. [#X]") */ + " (\\[(\\w|\\s|-|\\+|\\*)+\\]|\\[#(\\w|\\s|-|\\+)*\\])\\s+" + "|" + /* not ".. X::" */ + " (\\w|-)+::(?!\\S)" + "))" + "\\s+.*"); /* definitely, the start of a code block */ - if (text.indexOf (QRegularExpression ("^\\.{2} code-block::"), 0, &match) == 0) + if (text.indexOf (codeBlockStart1, 0, &match) == 0) { // also overwrites commentFormat /* the ".. code-block::" part will be formatted later */ setFormat (match.capturedLength(), text.count() - match.capturedLength(), codeBlockFormat); setCurrentBlockState (codeBlockState); } /* perhaps the start of a code block */ - else if (text.indexOf (QRegularExpression ("^(?!\\s*\\.{2}).*::$")) == 0) + else if (text.indexOf (codeBlockStart2) == 0) { bool isCommented (false); if (previousBlockState() >= endState || previousBlockState() < -1) @@ -4778,20 +5193,7 @@ } } /* perhaps a comment */ - else if (text.indexOf (QRegularExpression ("^\\s*\\.{2}" - "(?!(" - /* not a label or substitution (".. _X:" or ".. |X| Y::") */ - " _[\\w\\s\\-+]*:(?!\\S)" - "|" - " \\|[\\w\\s]+\\|\\s+\\w+::(?!\\S)" - "|" - /* not a footnote (".. [#X]") */ - " (\\[(\\w|\\s|-|\\+|\\*)+\\]|\\[#(\\w|\\s|-|\\+)*\\])\\s+" - "|" - /* not ".. X::" */ - " (\\w|-)+::(?!\\S)" - "))" - "\\s+.*")) == 0) + else if (text.indexOf (restComment) == 0) { bool isCodeLine (false); QString prevLabel; @@ -4924,6 +5326,8 @@ htmlBrackets (text); htmlCSSHighlighter (text); htmlJavascript (text); + /* also consider quotes and URLs inside CSS values */ + rehighlightNextBlock |= (data->openNests() != oldOpenNests); /* go to braces matching */ } diff -Nru featherpad-0.12.1/featherpad/highlighter-css.cpp featherpad-0.17.1/featherpad/highlighter-css.cpp --- featherpad-0.12.1/featherpad/highlighter-css.cpp 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/highlighter-css.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,728 @@ +/* + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2020 + * + * FeatherPad is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * FeatherPad is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + * + * @license GPL-3.0+ + */ + +#include "highlighter.h" + +namespace FeatherPad { + +/* NOTE: Comments can be everywhere, inside and outside CSS blocks/values, + but a start comment sign may be escaped by a quotation or URL inside + a CSS value. Therefore, to know whether a position is commented out, + we need to know whether it is inside a value or not and, for that, + we have to divide the text line to regions of CSS values. */ + +static inline int getSectionStart (const int pos, const QList ®ions, bool *isInsideRegion) +{ + if (regions.isEmpty() + || regions.contains (pos) + || pos < regions.first()) + { + *isInsideRegion = false; + return 0; + } + for (int i = 0; i < regions.size() - 1; ++i) + { + if (pos > regions.at (i) && pos < regions.at (i + 1)) + { + *isInsideRegion = (i % 2 == 0); + return regions.at (i); + } + } + *isInsideRegion = (regions.size() % 2 != 0); + return regions.last(); +} + +bool Highlighter::isCSSCommented (const QString &text, + const QList &valueRegions, + const int index, + int prevQuote, + bool prevUrl) +{ + if (index < 0) return false; + + bool insideValue; + int start = getSectionStart (index, valueRegions, &insideValue); + + bool res = false; + int pos = - 1; + int N; + QRegularExpression commentExpression; + int prevState = previousBlockState(); + if (start > 0 + || (prevState != commentState + && prevState != commentInCssBlockState + && prevState != commentInCssValueState)) + { + N = 0; + pos = start - 1; + commentExpression = commentStartExpression; + } + else + { + N = 1; + res = true; + commentExpression = commentEndExpression; + } + + while ((pos = text.indexOf (commentExpression, pos + 1)) >= 0) + { + /* skip formatted quotations and URLs (in values) */ + if (format (pos) == quoteFormat || format (pos) == altQuoteFormat) + continue; + + ++N; + if (pos >= index) + { + if (N % 2 == 0) res = true; + else res = false; + break; + } + + if (N % 2 != 0) // a start comment... + { + /* ... inside an attribute selector... */ + if ((!insideValue && isInsideAttrSelector (text, start, pos)) + /* ... or inside a quotation or URL */ + || (insideValue // quotations and URLs exist only inside values + && (isQuotedInCSSValue (text, start, pos, prevQuote, prevUrl) > 0 + || isInsideCSSValueUrl (text, start, pos, prevQuote, prevUrl)))) + { + --N; + continue; + } + + commentExpression = commentEndExpression; + res = true; + } + else + { + commentExpression = commentStartExpression; + res = false; + } + } + + return res; +} +/*************************/ +// Also formats quotations. +int Highlighter::isQuotedInCSSValue (const QString &text, + const int valueStart, + const int index, + int prevQuote, + bool prevUrl) +{ + if (index < 0 || valueStart < 0 || index < valueStart) + return 0; + //if (format (index) == quoteFormat) + //return ?; + if (format (index) == altQuoteFormat) + return 0; + + int res; // 1 for single quote, 2 for double quote + int N; + QRegularExpression quoteExpression; + if (prevQuote > 0 && valueStart == 0) + { + if (prevQuote == 1) + { + res = 1; + quoteExpression.setPattern ("\'"); + } + else + { + res = 2; + quoteExpression = quoteMark; + } + N = 1; + } + else + { + quoteExpression = mixedQuoteMark; + res = 0; + N = 0; + } + int pos = valueStart - 1; + int start = 0; + int nxtPos; + while ((nxtPos = text.indexOf (quoteExpression, pos + 1)) >= 0) + { + ++N; + if (nxtPos >= index) + { + if (N % 2 == 0) + { + if (text.at (nxtPos) == quoteMark.pattern().at (0)) + res = 2; + else + res = 1; + setFormat (start, nxtPos - start + 1, quoteFormat); + } + else res = 0; + break; + } + + if (N % 2 != 0) + { + /* a start quote inside a comment or value URL */ + if (isCSSCommented (text, QList() << valueStart, nxtPos, prevQuote, prevUrl) + || isInsideCSSValueUrl (text, valueStart, nxtPos, prevQuote, prevUrl)) + { + --N; + pos = nxtPos; + continue; + } + + if (text.at (nxtPos) == quoteMark.pattern().at (0)) + res = 2; + else + res = 1; + start = nxtPos; + } + else + { + res = 0; + setFormat (start, nxtPos - start + 1, quoteFormat); + } + + /* determine the next quotation mark */ + if (N % 2 != 0) + { + if (text.at (nxtPos) == quoteMark.pattern().at (0)) + quoteExpression = quoteMark; + else + quoteExpression.setPattern ("\'"); + } + else + quoteExpression = mixedQuoteMark; + + pos = nxtPos; + } + if (nxtPos == -1 && N % 2 != 0) + setFormat (start, text.length() - start, quoteFormat); + + return res; +} +/*************************/ +/* FIXME: This is temporary solution for url("...") and url('...') + and only works with whole URLs in a line. */ +static inline bool isWholeCSSdUrl (const QString &text, const int start, int &length) +{ + int indx = start + 4; // "url(" + while (indx < start + length && text.at (indx).isSpace()) + ++ indx; + if (indx < start + length) + { + if (text.at (indx) == '\'') + { + int end = text.indexOf ('\'', indx + 1); + if (end == -1) return false; + if (end >= start + length) + { + end = text.indexOf (')', end + 1); + if (end == -1) return false; + length = end - start + 1; + } + } + else if (text.at (indx) == '\"') + { + int end = text.indexOf ('\"', indx + 1); + if (end == -1) return false; + if (end >= start + length) + { + end = text.indexOf (')', end + 1); + if (end == -1) return false; + length = end - start + 1; + } + } + } + return true; +} + +// Also formats URLs. +bool Highlighter::isInsideCSSValueUrl (const QString &text, + const int valueStart, + const int index, + int prevQuote, + bool prevUrl) +{ + if (index < 0 || valueStart < 0 || index < valueStart) + return false; + if (format (index) == altQuoteFormat) + return true; + if (format (index) == quoteFormat) + return false; + + int indx; + if (valueStart == 0 && prevUrl) // prevQuote is 0 + { + /* format the first URL completely */ + indx = text.indexOf (QRegularExpression ("\\)")); + int endIndx; + if (indx == -1) endIndx = text.length(); + else endIndx = indx + 1; + setFormat (0, endIndx, altQuoteFormat); + + if (indx == -1 || indx >= index) + return true; + return isInsideCSSValueUrl (text, indx + 1, index); + } + + /* format whole URLs up to index */ + QRegularExpressionMatch match; + static const QRegularExpression cssUrl ("\\burl\\([^\\)]*\\)"); + int urlIndx = text.indexOf (cssUrl, valueStart, &match); + while (urlIndx < index + && (isCSSCommented (text, QList() << valueStart, urlIndx, prevQuote, prevUrl) + || isQuotedInCSSValue (text, valueStart, urlIndx, prevQuote, prevUrl) > 0)) + { + urlIndx = text.indexOf (cssUrl, urlIndx + 1, &match); + } + int L; + while (urlIndx > -1 && urlIndx < index) + { + L = match.capturedLength(); + if (!isWholeCSSdUrl (text, urlIndx, L)) + { + setFormat (urlIndx, text.length() - urlIndx, altQuoteFormat); + return true; + } + setFormat (urlIndx, L, altQuoteFormat); + if (urlIndx + L > index) + return true; + if (urlIndx + L == index) + return false; + urlIndx = text.indexOf (cssUrl, urlIndx + L, &match); + while (urlIndx < index + && (isCSSCommented (text, QList() << valueStart, urlIndx, prevQuote, prevUrl) + || isQuotedInCSSValue (text, valueStart, urlIndx, prevQuote, prevUrl) > 0)) + { + urlIndx = text.indexOf (cssUrl, urlIndx + 1, &match); + } + } + + static const QRegularExpression cssOpenUrl ("\\burl\\([^\\)]*$"); + const QString txt = text.left (index); + indx = txt.indexOf (cssOpenUrl, valueStart); + while (isCSSCommented (text, QList() << valueStart, indx, prevQuote, prevUrl) + || isQuotedInCSSValue (text, valueStart, indx, prevQuote, prevUrl) > 0) + { + indx = txt.indexOf (cssOpenUrl, indx + 1); + } + if (indx == -1) return false; + + /* also, format this URL completely if it's open */ + if (text.indexOf (')', indx) == -1) + setFormat (indx, text.length() - indx, altQuoteFormat); + + return true; +} +/*************************/ +// This formats attribute selectors with "quoteFormat" to skip start +// comment sings in multiLineComment(). +// It is supposed that the section between "start" and "pos" is +// outside all values (because values can't contain attribute selectors). +void Highlighter::formatAttrSelectors (const QString &text, const int start , const int pos) +{ + if (pos <= start) return; + static const QRegularExpression attrSelector ("\\[[^\\]]*(?=\\]|$)"); + QRegularExpressionMatch match; + int indx = start; + while ((indx = text.indexOf (attrSelector, indx, &match)) > -1 && indx <= pos) + { + if (format (indx+1) == quoteFormat) // a precaution (shouldn't be needed) + return; + while (isCSSCommented (text, QList() << start << start, indx)) + indx = text.indexOf (attrSelector, indx + 1, &match); + if (indx == -1) break; + setFormat (indx + 1, match.capturedLength() - 1, quoteFormat); + indx += match.capturedLength(); + } +} +/*************************/ +// Multi-line attribute selectors aren't considered. +// It is supposed that the section between "start" and "pos" is +// outside all values (because values can't contain attribute selectors). +bool Highlighter::isInsideAttrSelector (const QString &text, const int start, const int pos) +{ + if (pos <= start) return false; + if (format (pos) == quoteFormat) return true; + static const QRegularExpression attrSelectorStart ("\\[[^\\]]*$"); + int indx = text.left (pos).indexOf (attrSelectorStart, start); + if (indx > -1 && !isCSSCommented (text, QList() << start << start, indx)) + return true; + return false; +} +/*************************/ +// This should come before multiline comments highlighting. +// It also highlights quotes and URLs inside CSS values. +void Highlighter::cssHighlighter (const QString &text, bool mainFormatting, const int start) +{ + /* NOTE: Since we need to know whether the previous value had an open quote or an + open URL, we use the "OpenNests" variable to not add another one just for + this case. Although it isn't intended for such a case, it can be safely + used with values "1", "2" and "3" because it isn't used anywhere else + with CSS or HTML. The next block will be rehighlighted at highlightBlock() + (after "cssHighlighter (text, mainFormatting);") if it's changed. */ + + /************************** + * (Multiline) CSS Blocks * + **************************/ + + QRegularExpressionMatch cssStartMatch; + QRegularExpression cssStartExpression ("\\{"); + QRegularExpressionMatch cssEndtMatch; + QRegularExpression cssEndExpression ("\\}"); + + static const QRegularExpression cssValueStartExp ("(? valueRegions; + + QTextCharFormat cssValueFormat; + cssValueFormat.setFontItalic (true); + cssValueFormat.setForeground (Verda); + + + int prevQuote = 0; + bool prevUrl = false; + QTextBlock prevBlock = currentBlock().previous(); + if (prevBlock.isValid()) + { + if (TextBlockData *prevData = static_cast(prevBlock.userData())) + { + if (prevData->openNests() == 1) + prevQuote = 1; // single quote + else if (prevData->openNests() == 2) + prevQuote = 2; // double quote + else if (prevData->openNests() == 3) + prevUrl = true; + } + } + + int prevState = previousBlockState(); + if (blockStartIndex > 0 + || (prevState != cssBlockState + && prevState != cssValueState + && prevState != commentInCssBlockState + && prevState != commentInCssValueState)) + { + blockStartIndex = text.indexOf (cssStartExpression, start, &cssStartMatch); + while (isCSSCommented (text, QList() << start << start, blockStartIndex) + || isInsideAttrSelector (text, start, blockStartIndex)) + { + blockStartIndex = text.indexOf (cssStartExpression, blockStartIndex + 1, &cssStartMatch); + } + if (blockStartIndex == -1) + formatAttrSelectors (text, start, text.length()); + } + + while (blockStartIndex >= 0) + { + formatAttrSelectors (text, blockEndIndex, blockStartIndex); + + int realBlockStart; + /* when the css block starts in the previous line + and the search for its end has just begun... */ + if ((prevState == cssBlockState + || prevState == cssValueState // subset of cssBlockState + || prevState == commentInCssBlockState + || prevState == commentInCssValueState) + && blockStartIndex == 0) + { + /* ... search for its end from the line start */ + realBlockStart = 0; + } + else + realBlockStart = blockStartIndex + cssStartMatch.capturedLength(); + blockEndIndex = text.indexOf (cssEndExpression, realBlockStart, &cssEndtMatch); + + if (blockEndIndex == -1) + { + /* temporarily, to find value regions and format + their quotes and URLs in the following loop */ + blockEndIndex = text.length(); + } + + /* see if the end brace should be skipped after + finding CSS value regions up to this point */ + QList regions; + valueStartIndex = realBlockStart; + QRegularExpressionMatch match; + if (realBlockStart > 0 + || (valueStartIndex == 0 + && prevState != cssValueState + && prevState != commentInCssValueState)) + { + valueStartIndex = text.indexOf (cssValueStartExp, realBlockStart, &match); + while (isCSSCommented (text, QList() << realBlockStart << realBlockStart, valueStartIndex) + || isInsideAttrSelector (text, realBlockStart, valueStartIndex)) + { + valueStartIndex = text.indexOf (cssValueStartExp, valueStartIndex + 1, &match); + } + if (valueStartIndex > -1 && valueStartIndex <= blockEndIndex) + formatAttrSelectors (text, realBlockStart, valueStartIndex); + } + while (blockEndIndex > -1) + { + while (valueStartIndex > -1 && valueStartIndex <= blockEndIndex) + { + /************************** + * (Multiline) CSS Values * + **************************/ + + valueStartIndex += match.capturedLength(); + regions << valueStartIndex; + if (valueStartIndex == 0 + && (prevState == cssValueState + || prevState == commentInCssValueState)) + { // first loop + valueEndIndex = text.indexOf (cssValueEndExp, 0, &cssEndtMatch); + while (valueEndIndex > -1 + && (isCSSCommented (text, QList() << 0, valueEndIndex, prevQuote, prevUrl) + || isQuotedInCSSValue (text, 0, valueEndIndex, prevQuote, prevUrl) > 0 + || isInsideCSSValueUrl (text, 0, valueEndIndex, prevQuote, prevUrl))) + { + valueEndIndex = text.indexOf (cssValueEndExp, valueEndIndex + cssEndtMatch.capturedLength(), &cssEndtMatch); + } + } + else + { + valueEndIndex = text.indexOf (cssValueEndExp, valueStartIndex, &cssEndtMatch); + while (valueEndIndex > -1 + && (isCSSCommented (text, QList() << valueStartIndex, valueEndIndex) + || isQuotedInCSSValue (text, valueStartIndex, valueEndIndex) > 0 + || isInsideCSSValueUrl (text, valueStartIndex, valueEndIndex))) + { + valueEndIndex = text.indexOf (cssValueEndExp, valueEndIndex + cssEndtMatch.capturedLength(), &cssEndtMatch); + } + } + + if (valueEndIndex > -1) + { + regions << valueEndIndex; + valueStartIndex = text.indexOf (cssValueStartExp, valueEndIndex + cssEndtMatch.capturedLength(), &match); + while (isCSSCommented (text, QList() << valueEndIndex << valueEndIndex, valueStartIndex) + || isInsideAttrSelector (text, valueEndIndex, valueStartIndex)) + { + valueStartIndex = text.indexOf (cssValueStartExp, valueStartIndex + 1, &match); + } + if (valueStartIndex > -1 && valueStartIndex <= blockEndIndex) + formatAttrSelectors (text, valueEndIndex, valueStartIndex); + } + else + { + int q = isQuotedInCSSValue (text, valueStartIndex, text.length(), prevQuote, prevUrl); + if (q > 0) + { + if (TextBlockData *data = static_cast(currentBlock().userData())) + data->insertNestInfo (q); + } + else if (isInsideCSSValueUrl (text, valueStartIndex, text.length(), prevQuote, prevUrl)) + { + if (TextBlockData *data = static_cast(currentBlock().userData())) + data->insertNestInfo (3); + } + valueStartIndex = -1; // exit the loop + } + } + + if (blockEndIndex == text.length()) + { // value regions are found and their quotes and URLs are formatted + blockEndIndex = -1; + break; + } + if (regions.size() % 2 != 0 // quoted or inside a URL + || (!regions.isEmpty() && (regions.last() > blockEndIndex + 1 // quoted or inside a URL + || isCSSCommented (text, regions, blockEndIndex, prevQuote, prevUrl + || isInsideAttrSelector (text, regions.last(), blockEndIndex)))) + || (regions.isEmpty() && (isCSSCommented (text, QList() << realBlockStart << realBlockStart, blockEndIndex) + || isInsideAttrSelector (text, realBlockStart, blockEndIndex)))) + { + blockEndIndex = text.indexOf (cssEndExpression, blockEndIndex + 1, &cssEndtMatch); + if (blockEndIndex == -1 && valueStartIndex > -1) + blockEndIndex = text.length(); // to find the remaining value regions and format their quotes and URLs + } + else break; + } + + if (mainFormatting) + valueRegions << regions; + + int cssLength; + if (blockEndIndex == -1) + { + blockEndIndex = text.length(); + if (regions.size() % 2 != 0) + setCurrentBlockState (cssValueState); + else + setCurrentBlockState (cssBlockState); + cssLength = text.length() - blockStartIndex; + } + else + { + cssLength = blockEndIndex - blockStartIndex + + cssEndtMatch.capturedLength(); + } + + if (regions.isEmpty()) + formatAttrSelectors (text, realBlockStart, blockEndIndex); + else if (regions.size() % 2 == 0) + formatAttrSelectors (text, regions.last(), blockEndIndex); + + /* at first, we suppose all syntax is wrong (but comment + start signs have "quoteFormat" inside attribute selectors) */ + setFormatWithoutOverwrite (realBlockStart, blockEndIndex - realBlockStart, neutralFormat, quoteFormat); + + if (mainFormatting) + { + /* css property format (before :...;) */ + QTextCharFormat cssPropFormat; + cssPropFormat.setFontItalic (true); + cssPropFormat.setForeground (Blue); + static const QRegularExpression cssProp ("[A-Za-z0-9_\\-]+(?=\\s*(?= 0 && indxTmp < blockEndIndex) + { + setFormat (indxTmp, match.capturedLength(), cssPropFormat); + indxTmp = text.indexOf (cssProp, indxTmp + match.capturedLength(), &match); + while (format (indxTmp) == quoteFormat || format (indxTmp) == altQuoteFormat) + indxTmp = text.indexOf (cssProp, indxTmp + match.capturedLength(), &match); + } + } + + blockStartIndex = text.indexOf (cssStartExpression, blockStartIndex + cssLength, &cssStartMatch); + while (isCSSCommented (text, QList() << blockEndIndex << blockEndIndex, blockStartIndex) + || isInsideAttrSelector (text, blockEndIndex, blockStartIndex)) + { + blockStartIndex = text.indexOf (cssStartExpression, blockStartIndex + 1, &cssStartMatch); + } + + if (blockStartIndex == -1) + formatAttrSelectors (text, blockEndIndex, text.length()); + } + + /******************* + * Main Formatting * + *******************/ + + if (mainFormatting) + { + for (int i = 0; i < valueRegions.size(); ++i) + { + int cssLength; + if (i % 2 != 0) + { + valueStartIndex = valueRegions.at (i - 1); + cssLength = valueRegions.at (i) - valueRegions.at (i - 1); + } + else + { + if (i == valueRegions.size() - 1) + { + valueStartIndex = valueRegions.at (i); + cssLength = text.length() - valueRegions.at (i); + } + else continue; + } + + /* css value format (skips altQuoteFormat too) */ + setFormatWithoutOverwrite (valueStartIndex, cssLength, cssValueFormat, quoteFormat); + + /* numbers in css values */ + QTextCharFormat numFormat; + numFormat.setFontItalic (true); + numFormat.setForeground (Brown); + QRegularExpressionMatch numMatch; + QRegularExpression numExpression ("(-|\\+){0,1}\\b\\d*\\.{0,1}\\d+"); + int nIndex = text.indexOf (numExpression, valueStartIndex, &numMatch); + while (format (nIndex) == quoteFormat || format (nIndex) == altQuoteFormat) + nIndex = text.indexOf (numExpression, nIndex + numMatch.capturedLength(), &numMatch); + while (nIndex > -1 + && nIndex + numMatch.capturedLength() <= valueStartIndex + cssLength) + { + setFormat (nIndex, numMatch.capturedLength(), numFormat); + nIndex = text.indexOf (numExpression, nIndex + numMatch.capturedLength(), &numMatch); + while (format (nIndex) == quoteFormat || format (nIndex) == altQuoteFormat) + nIndex = text.indexOf (numExpression, nIndex + numMatch.capturedLength(), &numMatch); + } + } + + /* color value format (#xyz, #abcdef, #abcdefxy) */ + QTextCharFormat cssColorFormat; + cssColorFormat.setForeground (Verda); + cssColorFormat.setFontWeight (QFont::Bold); + cssColorFormat.setFontItalic (true); + QRegularExpressionMatch match; + // previously: "#\\b([A-Za-z0-9]{3}){0,4}(?![A-Za-z0-9_]+)" + static const QRegularExpression colorValue ("#([A-Fa-f0-9]{3}){1,2}(?![A-Za-z0-9_]+)|#([A-Fa-f0-9]{3}){2}[A-Fa-f0-9]{2}(?![A-Za-z0-9_]+)"); + int indxTmp = text.indexOf (colorValue, start, &match); + while (format (indxTmp) == neutralFormat // an error + || format (indxTmp) == quoteFormat || format (indxTmp) == altQuoteFormat + || isCSSCommented (text, valueRegions, indxTmp)) + { + indxTmp = text.indexOf (colorValue, indxTmp + match.capturedLength(), &match); + } + while (indxTmp >= 0) + { + setFormat (indxTmp, match.capturedLength(), cssColorFormat); + indxTmp = text.indexOf (colorValue, indxTmp + match.capturedLength(), &match); + while (format (indxTmp) == neutralFormat + || format (indxTmp) == quoteFormat || format (indxTmp) == altQuoteFormat + || isCSSCommented (text, valueRegions, indxTmp)) + { + indxTmp = text.indexOf (colorValue, indxTmp + match.capturedLength(), &match); + } + } + + /* definitions (starting with @) */ + QTextCharFormat cssDefinitionFormat; + cssDefinitionFormat.setForeground (Brown); + static const QRegularExpression cssDef ("(@[\\w-]+\\b)([^;]*(;|$))"); + indxTmp = text.indexOf (cssDef, start, &match); + while (format (indxTmp) == neutralFormat // an error + || format (indxTmp) == cssValueFormat // inside a value + || format (indxTmp) == quoteFormat || format (indxTmp) == altQuoteFormat + || isCSSCommented (text, valueRegions, indxTmp)) + { + indxTmp = text.indexOf (cssDef, indxTmp + match.capturedLength (1), &match); + } + while (indxTmp >= 0) + { + setFormat (indxTmp, match.capturedLength (1), cssDefinitionFormat); + indxTmp = text.indexOf (cssDef, indxTmp + match.capturedLength(), &match); + while (format (indxTmp) == neutralFormat + || format (indxTmp) == cssValueFormat + || format (indxTmp) == quoteFormat || format (indxTmp) == altQuoteFormat + || isCSSCommented (text, valueRegions, indxTmp)) + { + indxTmp = text.indexOf (cssDef, indxTmp + match.capturedLength (1), &match); + } + } + } +} + +} diff -Nru featherpad-0.12.1/featherpad/highlighter.h featherpad-0.17.1/featherpad/highlighter.h --- featherpad-0.12.1/featherpad/highlighter.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/highlighter.h 2021-01-06 17:57:35.000000000 +0000 @@ -109,7 +109,10 @@ Highlighter (QTextDocument *parent, const QString& lang, const QTextCursor &start, const QTextCursor &end, bool darkColorScheme, - bool showWhiteSpace = false, bool showEndings = false); + bool showWhiteSpace, + bool showEndings, + int whitespaceValue, + const QHash &syntaxColors = QHash()); ~Highlighter(); void setLimit (const QTextCursor &start, const QTextCursor &end) { @@ -129,6 +132,7 @@ bool isQuoted (const QString &text, const int index, bool skipCommandSign = false); bool isPerlQuoted (const QString &text, const int index); + bool isJSQuoted (const QString &text, const int index); bool isMLCommented (const QString &text, const int index, int comState = commentState, const int start = 0); bool isHereDocument (const QString &text); @@ -136,10 +140,27 @@ void htmlCSSHighlighter (const QString &text, const int start = 0); void htmlBrackets (const QString &text, const int start = 0); void htmlJavascript (const QString &text); - int cssHighlighter (const QString &text, bool mainFormatting, const int start = 0); + bool isCSSCommented (const QString &text, + const QList &valueRegions, + const int index, + int prevQuote = 0, + bool prevUrl = false); + int isQuotedInCSSValue (const QString &text, + const int valueStart, + const int index, + int prevQuote = 0, + bool prevUrl = false); + bool isInsideCSSValueUrl (const QString &text, + const int valueStart, + const int index, + int prevQuote = 0, + bool prevUrl = false); + void formatAttrSelectors (const QString &text, const int start, const int pos); + bool isInsideAttrSelector (const QString &text, const int pos, const int start); + void cssHighlighter(const QString &text, bool mainFormatting, const int start = 0); void singleLineComment (const QString &text, const int start); void multiLineComment (const QString &text, - const int index, const int cssIndx, + const int index, const QRegularExpression &commentStartExp, const QRegularExpression &commentEndExp, const int commState, const QTextCharFormat &comFormat); @@ -148,6 +169,7 @@ const int start = 0, int comState = commentState); void multiLinePerlQuote(const QString &text); + void multiLineJSlQuote (const QString &text, const int start, int comState); void xmlQuotes (const QString &text); void setFormatWithoutOverwrite (int start, int count, @@ -176,7 +198,8 @@ bool isEscapedRegex (const QString &text, const int pos); bool isEscapedPerlRegex (const QString &text, const int pos); - bool isEscapedRegexEndSign (const QString &text, const int start, const int pos) const; + bool isEscapedRegexEndSign (const QString &text, const int start, const int pos, + bool ignoreClasses = false) const; bool isInsideRegex (const QString &text, const int index); bool isInsidePerlRegex (const QString &text, const int index); void multiLineRegex (const QString &text, const int index); @@ -194,6 +217,8 @@ bool isFountainLineBlank (const QTextBlock &block); void highlightFountainBlock (const QString &text); + void latexFormula (const QString &text); + struct HighlightingRule { QRegularExpression pattern; @@ -201,13 +226,19 @@ }; QVector highlightingRules; + QRegularExpression hereDocDelimiter; + /* Multiline comments: */ QRegularExpression commentStartExpression; QRegularExpression commentEndExpression; + QRegularExpression htmlCommetStart, htmlCommetEnd; + QRegularExpression htmlSubcommetStart, htmlSubcommetEnd; // For CSS and JS inside HTML + QTextCharFormat mainFormat; // The format before highlighting. QTextCharFormat neutralFormat; // When a color near that of mainFormat is needed. QTextCharFormat commentFormat; + QTextCharFormat noteFormat; QTextCharFormat quoteFormat; // Usually for double quote. QTextCharFormat altQuoteFormat; // Usually for single quote. QTextCharFormat urlInsideQuoteFormat; @@ -221,12 +252,16 @@ /* Programming language: */ QString progLan; - QRegularExpression quoteMark; - QColor Blue, DarkBlue, Red, DarkRed, Verda, DarkGreen, DarkGreenAlt, DarkMagenta, Violet, Brown, DarkYellow; + QRegularExpression quoteMark, mixedQuoteMark, mixedQuoteBackquote; + QRegularExpression xmlLt, xmlGt; + QColor Blue, DarkBlue, Red, DarkRed, Verda, DarkGreen, DarkGreenAlt, Magenta, DarkMagenta, Violet, Brown, DarkYellow; /* The start and end cursors of the visible text: */ QTextCursor startCursor, endCursor; + static const QRegularExpression urlPattern; + static const QRegularExpression notePattern; + /* Block states: */ enum { @@ -256,10 +291,14 @@ /* Markdown and reStructuredText */ codeBlockState, + /* JavaScript template literals */ + JS_templateLiteralState, + /* Regex inside JavaScript, QML and Perl: */ regexSearchState, // search and replace (only in Perl) regexState, - regexEndState, // the line ends with a JS regex (+ spaces) + regexExtraState, /* JS: The line ends with a JS regex (+ spaces); or + Perl: A Perl quoting operator isn't complete. */ /* HTML: */ htmlBracketState, @@ -273,13 +312,14 @@ /* CSS: */ cssBlockState, - commentInCssState, + commentInCssBlockState, + commentInCssValueState, cssValueState, /* Used to update the format of the next line (as in JavaScript): */ updateState, - endState // 28 + endState // 30 /* For here-docs, state >= endState or state < -1. */ }; diff -Nru featherpad-0.12.1/featherpad/highlighter-html.cpp featherpad-0.17.1/featherpad/highlighter-html.cpp --- featherpad-0.12.1/featherpad/highlighter-html.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/highlighter-html.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2019 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -33,10 +33,10 @@ int braIndex = start; int indx = 0; QRegularExpressionMatch startMatch; - QRegularExpression braStartExp ("<(?!\\!)/{0,1}[A-Za-z0-9_\\-]+"); + static const QRegularExpression braStartExp ("<(?!\\!)/{0,1}[A-Za-z0-9_\\-]+"); QRegularExpressionMatch endMatch; - QRegularExpression braEndExp (">"); - QRegularExpression styleExp ("<(style|STYLE)$|<(style|STYLE)\\s+[^>]*"); + static const QRegularExpression braEndExp (">"); + static const QRegularExpression styleExp ("<(style|STYLE)$|<(style|STYLE)\\s+[^>]*"); bool isStyle (false); QTextCharFormat htmlBraFormat; htmlBraFormat.setFontWeight (QFont::Bold); @@ -127,7 +127,7 @@ int quoteIndex = braIndex; QRegularExpressionMatch quoteMatch; - QRegularExpression quoteExpression ("\"|\'"); + QRegularExpression quoteExpression = mixedQuoteMark; int quote = doubleQuoteState; /* find the start quote */ @@ -171,7 +171,7 @@ while (quoteIndex >= braIndex && quoteIndex <= endLimit) { /* if the search is continued... */ - if (quoteExpression.pattern() == "\"|\'") + if (quoteExpression == mixedQuoteMark) { /* ... distinguish between double and single quotes again because the quote mark may have changed */ @@ -229,7 +229,7 @@ : altQuoteFormat); /* the next quote may be different */ - quoteExpression.setPattern ("\"|\'"); + quoteExpression = mixedQuoteMark; quoteIndex = text.indexOf (quoteExpression, quoteIndex + quoteLength); } @@ -243,7 +243,7 @@ htmlAttributeFormat.setFontItalic (true); htmlAttributeFormat.setForeground (Brown); QRegularExpressionMatch attMatch; - QRegularExpression attExp ("[A-Za-z0-9_\\-]+(?=\\s*\\=)"); + static const QRegularExpression attExp ("[A-Za-z0-9_\\-]+(?=\\s*\\=)"); int attIndex = text.indexOf (attExp, braIndex, &attMatch); QTextCharFormat fi = format (attIndex); while (fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat) @@ -316,6 +316,8 @@ QTextCharFormat encodedFormat; encodedFormat.setForeground (DarkMagenta); encodedFormat.setFontItalic (true); + QTextCharFormat specialFormat = encodedFormat; + specialFormat.setFontWeight (QFont::Bold); index = text.indexOf (ampersand, start); while (index >= 0 && format (index) != mainFormat) @@ -324,14 +326,34 @@ { QString str = text.mid (index, 6); if (str == " ") - setFormat (index, 6, encodedFormat); + { + setFormat (index, 6, specialFormat); + index = text.indexOf (ampersand, index + 6); + } else if (str.startsWith("&")) - setFormat (index, 5, encodedFormat); + { + setFormat (index, 5, specialFormat); + index = text.indexOf (ampersand, index + 5); + } else if (str.startsWith ("<") || str.startsWith (">")) - setFormat (index, 4, encodedFormat); + { + setFormat (index, 4, specialFormat); + index = text.indexOf (ampersand, index + 4); + } else - setFormat (index, 1, errorFormat); - index = text.indexOf (ampersand, index + 1); + { + str = text.mid (index); + if (str.indexOf(QRegularExpression("^&(#[0-9]+|[a-zA-Z]+[a-zA-Z0-9_:\\.\\-]*|#[xX][0-9a-fA-F]+);"), 0, &match) > -1) + { // accept "&name;", "&number;" and "&hexadecimal;" but format them differently + setFormat (index, match.capturedLength(), encodedFormat); + index = text.indexOf (ampersand, index + match.capturedLength()); + } + else + { + setFormat (index, 1, errorFormat); + index = text.indexOf (ampersand, index + 1); + } + } while (index >= 0 && format (index) != mainFormat) index = text.indexOf (ampersand, index + 1); } @@ -349,15 +371,15 @@ int cssIndex = start; QRegularExpressionMatch startMatch; - QRegularExpression cssStartExp ("<(style|STYLE)>|<(style|STYLE)\\s+[^>]*>"); + static const QRegularExpression cssStartExp ("<(style|STYLE)>|<(style|STYLE)\\s+[^>]*>"); QRegularExpressionMatch endMatch; - QRegularExpression cssEndExp (""); + static const QRegularExpression cssEndExp (""); QRegularExpressionMatch braMatch; - QRegularExpression braEndExp (">"); + static const QRegularExpression braEndExp (">"); /* switch to css temporarily */ - commentStartExpression.setPattern ("/\\*"); - commentEndExpression.setPattern ("\\*/"); + commentStartExpression = htmlSubcommetStart; + commentEndExpression = htmlSubcommetEnd; progLan = "css"; bool wasCSS (false); @@ -379,7 +401,7 @@ cssIndex = text.indexOf (cssStartExp, start, &startMatch); fi = format (cssIndex); while (cssIndex >= 0 - && (fi == commentFormat + && (fi == commentFormat || fi == urlFormat || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat)) { cssIndex = text.indexOf (cssStartExp, cssIndex + startMatch.capturedLength(), &startMatch); @@ -416,10 +438,9 @@ setCurrentBlockState (0); /* ... and apply the css formats */ - multiLineQuote (text, cssIndex + matched, htmlCSSCommentState); - int cssIndx = cssHighlighter (text, mainFormatting, cssIndex + matched); + cssHighlighter (text, mainFormatting, cssIndex + matched); multiLineComment (text, - cssIndex + matched, cssIndx, + cssIndex + matched, commentStartExpression, commentEndExpression, htmlCSSCommentState, commentFormat); @@ -479,7 +500,11 @@ setFormat (cssEndIndex, text.length() - cssEndIndex, mainFormat); setCurrentBlockState (0); progLan = "html"; + commentStartExpression = htmlCommetStart; + commentEndExpression = htmlCommetEnd; htmlBrackets (text, cssEndIndex); + commentStartExpression = htmlSubcommetStart; + commentEndExpression = htmlSubcommetEnd; progLan = "css"; } @@ -497,8 +522,8 @@ /* revert to html */ progLan = "html"; - commentStartExpression.setPattern (""); + commentStartExpression = htmlCommetStart; + commentEndExpression = htmlCommetEnd; } /*************************/ void Highlighter::htmlJavascript (const QString &text) @@ -509,13 +534,13 @@ QRegularExpressionMatch startMatch; //QRegularExpression javaStartExp ("<(script|SCRIPT)\\s+[^<>]*(((language|LANGUAGE)\\s*\\=\\s*\"\\s*)|((TYPE|type)\\s*\\=\\s*\"\\s*(TEXT|text)/))(JavaScript|javascript)\\s*\"[^<>]*>"); - QRegularExpression javaStartExp ("<(script|SCRIPT)\\s*>|<(script|SCRIPT)\\s+[^<>]*>"); + static const QRegularExpression javaStartExp ("<(script|SCRIPT)\\s*>|<(script|SCRIPT)\\s+[^<>]*>"); QRegularExpressionMatch endMatch; - QRegularExpression javaEndExp (""); + static const QRegularExpression javaEndExp (""); /* switch to javascript temporarily */ - commentStartExpression.setPattern ("/\\*"); - commentEndExpression.setPattern ("\\*/"); + commentStartExpression = htmlSubcommetStart; + commentEndExpression = htmlSubcommetEnd; progLan = "javascript"; bool wasJavascript (false); @@ -558,13 +583,39 @@ /* ... and apply the javascript formats */ singleLineComment (text, javaIndex + matched); - multiLineQuote (text, javaIndex + matched, htmlJavaCommentState); - multiLineComment (text, - javaIndex + matched, -1, - commentStartExpression, commentEndExpression, - htmlJavaCommentState, - commentFormat); - multiLineRegex (text, javaIndex + matched); + /* javascript single-line comment doesn't comment out + the end of a javascript block inside HTML */ + int tmpIndx = -1; + if (currentBlockState() == regexExtraState) + { + tmpIndx = javaIndex + matched; + while (tmpIndx < text.length() && format (tmpIndx) != commentFormat) + ++ tmpIndx; + tmpIndx = text.indexOf (javaEndExp, tmpIndx); + } + if (tmpIndx > -1) + { + setCurrentBlockState (0); + setFormat (tmpIndx, text.length() - tmpIndx, mainFormat); + QString txt = text.left (tmpIndx); + multiLineQuote (txt, javaIndex + matched, htmlJavaCommentState); + multiLineComment (txt, + javaIndex + matched, + commentStartExpression, commentEndExpression, + htmlJavaCommentState, + commentFormat); + multiLineRegex (txt, javaIndex + matched); + } + else + { + multiLineQuote (text, javaIndex + matched, htmlJavaCommentState); + multiLineComment (text, + javaIndex + matched, + commentStartExpression, commentEndExpression, + htmlJavaCommentState, + commentFormat); + multiLineRegex (text, javaIndex + matched); + } if (mainFormatting) { for (const HighlightingRule &rule : qAsConst (highlightingRules)) @@ -648,8 +699,12 @@ setFormat (javaEndIndex, text.length() - javaEndIndex, mainFormat); setCurrentBlockState (0); progLan = "html"; + commentStartExpression = htmlCommetStart; + commentEndExpression = htmlCommetEnd; htmlBrackets (text, javaEndIndex); htmlCSSHighlighter (text, javaEndIndex); + commentStartExpression = htmlSubcommetStart; + commentEndExpression = htmlSubcommetEnd; progLan = "javascript"; } @@ -666,8 +721,8 @@ /* revert to html */ progLan = "html"; - commentStartExpression.setPattern (""); + commentStartExpression = htmlCommetStart; + commentEndExpression = htmlCommetEnd; } } diff -Nru featherpad-0.12.1/featherpad/highlighter-patterns.cpp featherpad-0.17.1/featherpad/highlighter-patterns.cpp --- featherpad-0.12.1/featherpad/highlighter-patterns.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/highlighter-patterns.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -45,20 +45,18 @@ } else if (lang == "sh" || lang == "makefile" || lang == "cmake") // the characters "(", ";" and "&" will be reformatted after this { - keywordPatterns << "((^\\s*|[\\(\\);&`\\|{}]+\\s*)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(alias|bg|bind|break|builtin)(?!(\\.|-|@|#|\\$))\\b" - << "((^\\s*|[\\(\\);&`\\|{}]+\\s*)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(caller|case|command|compgen|complete|continue)(?!(\\.|-|@|#|\\$))\\b" - << "((^\\s*|[\\(\\);&`\\|{}]+\\s*)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(declare|default|dirs|disown|do|done)(?!(\\.|-|@|#|\\$))\\b" - << "((^\\s*|[\\(\\);&`\\|{}]+\\s*)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(echo|enable|esac|eval|exec|exit|export)(?!(\\.|-|@|#|\\$))\\b" - << "(^\\s*|[\\(\\);&`\\|{}]+\\s*)(elif|elseif|else)(?!(\\.|-|@|#|\\$))\\b" - << "\\bfalse(?!(\\.|-|@|#|\\$))\\b" - << "((^\\s*|[\\(\\);&`\\|{}]+\\s*)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(fg|fi|for|foreach|getopts|hash|help|history)(?!(\\.|-|@|#|\\$))\\b" - << "((^\\s*|[\\(\\);&`\\|{}]+\\s*)((then|else|done|esac)\\s+)*)if(?!(\\.|-|@|#|\\$))\\b" << "\\bin(?!(\\.|-|@|#|\\$))\\b" - << "((^\\s*|[\\(\\);&`\\|{}]+\\s*)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(jobs|let|local|logout|popd|printf|pushd|read|readonly|return)(?!(\\.|-|@|#|\\$))\\b" - << "((^\\s*|[\\(\\);&`\\|{}]+\\s*)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(select|seq|set|shift|shopt|source|suspend|test|times|trap|type|typeset)(?!(\\.|-|@|#|\\$))\\b" - << "(^\\s*|[\\(\\);&`\\|{}]+\\s*)then(?!(\\.|-|@|#|\\$))\\b" << "\\btrue(?!(\\.|-|@|#|\\$))\\b" - << "((^\\s*|[\\(\\);&`\\|{}]+\\s*)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(umask|unalias|unset|until|wait|while)(?!(\\.|-|@|#|\\$))\\b"; + keywordPatterns << "((^\\s*|[\\(\\);&`\\|{}!=^]+\\s*|(?<=~|\\.)+\\s+)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(alias|bg|bind|break|builtin)(?!(\\.|-|@|#|\\$))\\b" + << "((^\\s*|[\\(\\);&`\\|{}!=^]+\\s*|(?<=~|\\.)+\\s+)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(caller|case|command|compgen|complete|continue)(?!(\\.|-|@|#|\\$))\\b" + << "((^\\s*|[\\(\\);&`\\|{}!=^]+\\s*|(?<=~|\\.)+\\s+)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(declare|default|dirs|disown|do|done)(?!(\\.|-|@|#|\\$))\\b" + << "((^\\s*|[\\(\\);&`\\|{}!=^]+\\s*|(?<=~|\\.)+\\s+)((if|then|elif|elseif|else|fi|while|do|done|esac)\\s+)*)(echo|elif|elseif|else|enable|esac|eval|exec|exit|export)(?!(\\.|-|@|#|\\$))\\b" + << "\\b(?)\\b" // special meanings (the => operator is excluded) - << "\\b(? + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2019-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -21,6 +21,17 @@ namespace FeatherPad { +/* NOTE: We deal with four kinds of regex structures: + + 1. Simple, single structures, like /.../ or q|...|; + 2. Single structures with braces, like {...} or q{...}; + 3. Simple replacing operators like s/.../.../; and + 4. Replacing with braces, like s{...}...{...} + + We cheat and include "q", "qq", "qw", "qx" and "qr" here to have a simpler code. + Moreover, the => operator is excluded. */ +static const QRegularExpression rExp ("/|\\b(?)[^\\w\\}\\)\\]>\\s]"); + // This is only for the start. bool Highlighter::isEscapedPerlRegex (const QString &text, const int pos) { @@ -61,9 +72,13 @@ { QChar ch = text.at (i); if (format (i) != regexFormat && (ch.isLetterOrNumber() || ch == '_' - || ch == ')' || ch == ']' || ch == '}' - || ch == '#'|| ch == '$'|| ch == '@')) - { // a regex isn't escaped if it follows a Perl keyword + || ch == ')' || ch == ']' || ch == '}' || ch == '#' + || (i == pos - 1 && (ch == '$' || ch == '@')) + /* after an escaped start quote */ + || (i > 0 && (ch == '\"' || ch == '\'' || ch == '`') + && format (i) != quoteFormat && format (i) != altQuoteFormat))) + { + /* a regex isn't escaped if it follows a Perl keyword */ if (perlKeys.pattern().isEmpty()) perlKeys.setPattern (keywords (progLan).join ('|')); int len = qMin (12, i + 1); @@ -72,6 +87,15 @@ QRegularExpressionMatch keyMatch; if ((j = str.lastIndexOf (perlKeys, -1, &keyMatch)) > -1 && j + keyMatch.capturedLength() == len) return false; + /* check the flags too */ + if (ch.isLetter()) + { + static const QString flags ("sgimx"); + while (i > 0 && flags.contains (text.at (i))) + -- i; + if (format (i) == regexFormat) + return false; + } return true; } } @@ -100,14 +124,21 @@ } } QChar endBrace = pattern.at (pattern.size() - 1); - QChar startBrace = endBrace == ')' ? '(' : endBrace == '}' ? '{' - : endBrace == ']' ? '[' : '<'; + QChar startBrace = endBrace == ')' ? '(' + : endBrace == '}' ? '{' + : endBrace == ']' ? '[' + : '<'; const int L = text.length(); while (N > 0 && i < L) { QChar c = text.at (i); - if (c == endBrace) -- N; - else if (c == startBrace) ++ N; + if (c == endBrace) + { + if (!isEscapedChar (text, i)) + -- N; + } + else if (c == startBrace && !isEscapedChar (text, i)) + ++ N; ++ i; } if (N == 0) @@ -180,42 +211,58 @@ if (index <= pos) return false; } - /* NOTE: We cheat and include "q", "qq", "qw", "qx" and "qr" here to have a simpler code. - Moreover, the => operator is excluded. */ - QString rPattern ("/|\\b(?)[^\\w\\}\\)\\]>\\s]"); - QRegularExpression exp; bool res = false; - bool searchedToReplace = false; + bool searchedToReplace = false; // inside the first part of a replacement operator? + bool replacing = false; // inside the second part of a replacement operator? + bool isQuotingOperator = false; int N; if (pos == -1) { - if (previousBlockState() != regexState && previousBlockState() != regexSearchState) + if (previousBlockState() != regexState + && previousBlockState() != regexExtraState + && previousBlockState() != regexSearchState) { - exp.setPattern (rPattern); + exp = rExp; N = 0; } else { QString delimStr; + bool between = false; // between search and replacement, like s(...)HERE(...) + bool ro = false; // a replacement operator? QTextBlock prevBlock = currentBlock().previous(); if (prevBlock.isValid()) { if (TextBlockData *prevData = static_cast(prevBlock.userData())) + { delimStr = prevData->labelInfo(); + if (delimStr.startsWith("r")) + { + ro = true; + delimStr.remove (0, 1); + } + else if (delimStr.startsWith("b")) + { + between = true; + ro = true; + delimStr.remove (0, 1); + } + } } - if (previousBlockState() == regexState) + if (delimStr.size() != 1) return false; // impossible + if (previousBlockState() == regexState + || previousBlockState() == regexExtraState) { N = 1; - if (delimStr.isEmpty()) - exp.setPattern ("/"); - else + + if (previousBlockState() == regexState) { - QString sb = startBrace (delimStr); - if (!sb.isEmpty()) + if (between) { - pos = text.indexOf (QRegularExpression ("\\" + sb), 0); + /* find the start of the replacement part */ + pos = text.indexOf (QRegularExpression ("\\" + delimStr), 0); if (pos > -1) setFormat (0, pos + 1, regexFormat); else @@ -223,58 +270,82 @@ setFormat (0, text.length(), regexFormat); return true; } - exp.setPattern ("\\" + delimStr); + replacing = true; } else { - exp.setPattern ("\\" + getEndDelimiter (delimStr)); pos = -2; // to know that the search in continued from the previous line + if (ro) replacing = true; } } + else + { + pos = -2; + isQuotingOperator = true; + } } else// if (previousBlockState() == regexSearchState) // for "s" and "tr" { N = 0; searchedToReplace = true; - exp.setPattern ("\\" + getEndDelimiter (delimStr)); } + exp.setPattern ("\\" + getEndDelimiter (delimStr)); res = true; } } else // a new search from the last position { - exp.setPattern (rPattern); + exp = rExp; N = 0; } + int startPos = -1; int nxtPos, capturedLength; while ((nxtPos = findDelimiter (text, pos + 1, exp, capturedLength)) >= 0) { /* skip formatted comments and quotes */ QTextCharFormat fi = format (nxtPos); - if (N % 2 == 0 - && (fi == commentFormat || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat)) + if (N % 2 == 0) { - pos = nxtPos +capturedLength - 1; - continue; + isQuotingOperator = false; + if (fi == commentFormat || fi == urlFormat + || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat) + { + pos = nxtPos; // don't add capturedLength because "/" might match later + continue; + } + if (!searchedToReplace) + { + isQuotingOperator = (text.at (nxtPos) == 'q' + && (capturedLength < 2 || text.at (nxtPos + 1) != 'r')); + startPos = nxtPos + capturedLength; + } } ++N; if (N % 2 == 0 - ? isEscapedRegexEndSign (text, qMax (0, pos + 1), nxtPos) // an escaped end sign + ? isEscapedRegexEndSign (text, + startPos < 0 ? qMax (0, pos + 1) : startPos, + nxtPos, + replacing || isQuotingOperator) // an escaped end delimiter : (capturedLength > 1 - ? isEscapedPerlRegex (text, nxtPos) // an escaped start sign - : (isEscapedRegexEndSign (text, qMax (0, pos + 1), nxtPos) // an escaped middle sign - || (exp.pattern() == rPattern - && isEscapedPerlRegex (text, nxtPos))))) // an escaped start slash + ? isEscapedPerlRegex (text, nxtPos) // an escaped start sign + : (searchedToReplace + ? isEscapedRegexEndSign (text, + startPos < 0 ? qMax (0, pos + 1) : startPos, + nxtPos) // an escaped middle delimiter + : isEscapedPerlRegex (text, nxtPos)))) // an escaped start slash { if (res) { pos = qMax (pos, 0); setFormat (pos, nxtPos - pos + capturedLength, regexFormat); } + if (N % 2 != 0 && capturedLength > 1) + pos = nxtPos; // don't add capturedLength because "/" might match later + else + pos = nxtPos + capturedLength - 1; --N; - pos = nxtPos + capturedLength - 1; continue; } @@ -301,11 +372,18 @@ // otherwise, the formatting should continue until the replacement is done } + if (searchedToReplace) + { + searchedToReplace = false; + replacing = true; + } + else + replacing = false; + /* NOTE: We should set "res" below because "pos" might be negative next time. */ - searchedToReplace = false; if (N % 2 == 0) { - exp.setPattern (rPattern); + exp = rExp; res = false; } else @@ -325,8 +403,9 @@ QString d (QString (text.at (nxtPos))); exp.setPattern ("\\" + d); QString sb = startBrace (d); - if (!sb.isEmpty()) + if (!sb.isEmpty()) // between search and replacement { + /* find the start of the replacement part */ pos = text.indexOf (QRegularExpression ("\\" + sb), nxtPos + 1); if (pos > -1) { @@ -339,6 +418,7 @@ return true; } } + // otherwise, the start delimiter of a simple operator has been found } } @@ -352,94 +432,117 @@ { int startIndex = 0; QRegularExpressionMatch startMatch; - /* NOTE: "q", "qq", "qw", "qx" and "qr" are intentionally included here. */ - QRegularExpression startExp ("/|\\b(?)[^\\w\\}\\)\\]>\\s]"); QRegularExpressionMatch endMatch; QRegularExpression endExp; QTextCharFormat fi; QString delimStr; + bool isQuotingOperator = false; + bool ro = false; // a replacement operator? + bool replacing = false; // inside the second part of a replacement operator? + + QTextCharFormat flagFormat; + flagFormat.setFontWeight (QFont::Bold); + flagFormat.setForeground (Magenta); int prevState = previousBlockState(); - if (prevState == regexState || prevState == regexSearchState) + if (prevState == regexState + || prevState == regexExtraState + || prevState == regexSearchState) { + bool between = false; // between search and replacement, like s(...)HERE(...) QTextBlock prevBlock = currentBlock().previous(); if (prevBlock.isValid()) { if (TextBlockData *prevData = static_cast(prevBlock.userData())) + { delimStr = prevData->labelInfo(); + if (delimStr.startsWith("r")) + { + ro = true; + delimStr.remove (0, 1); + } + else if (delimStr.startsWith("b")) + { + between = true; + ro = true; + delimStr.remove (0, 1); + } + } } + if (delimStr.size() != 1) return; // impossible if (prevState == regexState) { - QString sb = startBrace (delimStr); - if (!sb.isEmpty()) + if (between) { - startIndex = text.indexOf (QRegularExpression ("\\" + sb), 0, &startMatch); + /* find the start of the replacement part */ + startIndex = text.indexOf (QRegularExpression ("\\" + delimStr), 0, &startMatch); // never escaped if (startIndex == -1) { setCurrentBlockState (regexState); setFormat (0, text.length(), regexFormat); - static_cast(currentBlock().userData())->insertInfo (delimStr); + /* the prefix "b" distinguishes this state */ + static_cast(currentBlock().userData())->insertInfo ("b" + delimStr); return; } setFormat (0, startIndex + startMatch.capturedLength(), regexFormat); - delimStr = sb; + replacing = true; } + else if (ro) + replacing = true; } + else if (prevState == regexExtraState) + isQuotingOperator = true; } else { - startIndex = text.indexOf (startExp, startIndex, &startMatch); + startIndex = text.indexOf (rExp, startIndex, &startMatch); /* skip comments and quotations (all formatted to this point) */ fi = format (startIndex); while (startIndex >= 0 && (isEscapedPerlRegex (text, startIndex) - || fi == commentFormat + || fi == commentFormat || fi == urlFormat || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat)) { - startIndex = text.indexOf (startExp, startIndex + startMatch.capturedLength(), &startMatch); + /* search from the next position, without considering + the captured length, because "/" might match later */ + startIndex = text.indexOf (rExp, startIndex + 1, &startMatch); fi = format (startIndex); } - if (startIndex >= 0 && startMatch.capturedLength() > 1) + if (startIndex >= 0) + { delimStr = QString (text.at (startIndex + startMatch.capturedLength() - 1)); + if (startMatch.capturedLength() > 1) + { + if (text.at (startIndex) == 'q' && text.at (startIndex + 1) != 'r') + isQuotingOperator = true; + else if (text.at (startIndex) == 's' || text.at (startIndex) == 't' || text.at (startIndex) == 'y') + ro = true; + /* use flagFormat for operators too */ + setFormat (startIndex, startMatch.capturedLength() - 1, flagFormat); + } + } } while (startIndex >= 0) { + /* continued from the previous line? */ bool continued (startIndex == 0 - && (prevState == regexState || prevState == regexSearchState)); - if (continued) - { - if (prevState == regexState) - { - if (delimStr.isEmpty()) - endExp.setPattern ("/"); - else - endExp.setPattern ("\\" + getEndDelimiter (delimStr)); - } - else - endExp.setPattern ("\\" + getEndDelimiter (delimStr)); - } - else - { - if (delimStr.isEmpty()) - endExp.setPattern ("/"); - else - endExp.setPattern ("\\" + getEndDelimiter (delimStr)); - } + && (prevState == regexState + || prevState == regexExtraState + || prevState == regexSearchState)); + endExp.setPattern ("\\" + getEndDelimiter (delimStr)); int endLength; int endIndex = findDelimiter (text, continued ? -1 // to know that the search is continued from the previous line : startIndex + startMatch.capturedLength(), - endExp, endLength); + endExp, + endLength); int indx = continued ? 0 : startIndex + startMatch.capturedLength(); - while (isEscapedRegexEndSign (text, indx, endIndex)) - { - indx = endIndex + 1; - endIndex = findDelimiter (text, indx, endExp, endLength); - } + while (isEscapedRegexEndSign (text, indx, endIndex, replacing || isQuotingOperator)) + endIndex = findDelimiter (text, endIndex + 1, endExp, endLength); int len; int keywordLength = qMax (startMatch.capturedLength() - 1, 0); @@ -447,27 +550,21 @@ { if (!continued) { - if (startMatch.capturedLength() > 1 - && (text.at (startIndex) == 's' || text.at (startIndex) == 't' || text.at (startIndex) == 'y')) - { + if (ro && !replacing) setCurrentBlockState (regexSearchState); - } else - setCurrentBlockState (regexState); - static_cast(currentBlock().userData())->insertInfo (delimStr); + setCurrentBlockState (isQuotingOperator ? regexExtraState : regexState); } else setCurrentBlockState (prevState); - if (!delimStr.isEmpty()) - { - static_cast(currentBlock().userData())->insertInfo (delimStr); - /* NOTE: The next block will be rehighlighted at highlightBlock() - (-> multiLineRegex (text, 0);) if the delimiter is changed. */ - } + static_cast(currentBlock().userData())->insertInfo (ro ? "r" + delimStr : delimStr); + /* NOTE: The next block will be rehighlighted at highlightBlock() + (-> multiLineRegex (text, 0);) if the delimiter is changed. */ + len = text.length() - startIndex; } - else + else // endIndex is found { len = endIndex - startIndex + endLength; @@ -475,78 +572,96 @@ { if (prevState == regexSearchState) { + replacing = true; setFormat (startIndex + keywordLength, len - keywordLength, regexFormat); QString ed = getEndDelimiter (delimStr); if (ed != delimStr) // regex replacement with braces { + /* find the start of the replacement part */ startIndex = text.indexOf (QRegularExpression ("\\" + delimStr), endIndex + 1, &startMatch); if (startIndex == -1) - { + { // the line ends between search and replacement setFormat (endIndex + 1, text.length() - endIndex - 1, regexFormat); setCurrentBlockState (regexState); - static_cast(currentBlock().userData())->insertInfo (ed); + /* the prefix "b" distinguishes this state */ + static_cast(currentBlock().userData())->insertInfo ("b" + delimStr); return; } setFormat (endIndex + 1, startIndex + startMatch.capturedLength() - endIndex - 1, regexFormat); } else { - if (endIndex == text.length() - 1) - break; startMatch = QRegularExpressionMatch(); startIndex = endIndex + 1; } continue; } + // otherwise, the end delimiter of a simple operator or replacement part has been found } else { - if (startMatch.capturedLength() > 1 - && (text.at (startIndex) == 's' || text.at (startIndex) == 't' || text.at (startIndex) == 'y')) + if (ro && !replacing) { + replacing = true; setFormat (startIndex + keywordLength, len - keywordLength, regexFormat); QString ed = getEndDelimiter (delimStr); if (ed != delimStr) // regex replacement with braces { + /* find the start of the replacement part */ startIndex = text.indexOf (QRegularExpression ("\\" + delimStr), endIndex + 1, &startMatch); if (startIndex == -1) - { + { // the line ends between search and replacement setFormat (endIndex + 1, text.length() - endIndex - 1, regexFormat); setCurrentBlockState (regexState); - static_cast(currentBlock().userData())->insertInfo (ed); + /* the prefix "b" distinguishes this state */ + static_cast(currentBlock().userData())->insertInfo ("b" + delimStr); return; } setFormat (endIndex + 1, startIndex + startMatch.capturedLength() - endIndex - 1, regexFormat); } - else + else // regex replacement with a middle delimiter { - if (endIndex == text.length() - 1) - break; startMatch = QRegularExpressionMatch(); startIndex = endIndex + 1; } continue; } + // otherwise, the end delimiter of a simple operator or replacement part has been found } } setFormat (startIndex + keywordLength, len - keywordLength, regexFormat); - startIndex = text.indexOf (startExp, startIndex + len, &startMatch); - + /* format flags too */ + if (text.mid (startIndex + len).indexOf (QRegularExpression ("^[sgimx]+"), 0, &startMatch) == 0) + setFormat (startIndex + len, startMatch.capturedLength(), flagFormat); + + /* start searching for a new regex (operator) */ + isQuotingOperator = false; + ro = false; + replacing = false; + startIndex = text.indexOf (rExp, startIndex + len, &startMatch); /* skip comments and quotations again */ fi = format (startIndex); while (startIndex >= 0 && (isEscapedPerlRegex (text, startIndex) - || fi == commentFormat + || fi == commentFormat || fi == urlFormat || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat)) { - startIndex = text.indexOf (startExp, startIndex + startMatch.capturedLength(), &startMatch); + startIndex = text.indexOf (rExp, startIndex + 1, &startMatch); fi = format (startIndex); } - if (startIndex >= 0 && startMatch.capturedLength() > 1) + if (startIndex >= 0) + { delimStr = QString (text.at (startIndex + startMatch.capturedLength() - 1)); - else - delimStr = QString(); + if (startMatch.capturedLength() > 1) + { + if (text.at (startIndex) == 'q' && text.at (startIndex + 1) != 'r') + isQuotingOperator = true; + else if (text.at (startIndex) == 's' || text.at (startIndex) == 't' || text.at (startIndex) == 'y') + ro = true; + setFormat (startIndex, startMatch.capturedLength() - 1, flagFormat); + } + } } } diff -Nru featherpad-0.12.1/featherpad/highlighter-regex.cpp featherpad-0.17.1/featherpad/highlighter-regex.cpp --- featherpad-0.12.1/featherpad/highlighter-regex.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/highlighter-regex.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2018-2019 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2018-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -42,7 +42,8 @@ return true; } - /* escape "<.../>", "" and the single-line comment sign ("//") */ + /* escape "<.../>", "" and the single-line comment sign ("//") + FIXME: In this way and with what follows, "/>/g" isn't highlighted. */ if ((text.length() > pos + 1 && ((progLan == "javascript" && text.at (pos + 1) == '>') || text.at (pos + 1) == '/')) || (pos > 0 && progLan == "javascript" && text.at (pos - 1) == '<')) @@ -56,14 +57,23 @@ int i = pos - 1; while (i >= 0 && (text.at (i) == ' ' || text.at (i) == '\t')) --i; - if (i == -1) - { // examine the previous line(s) + if (i == -1) // examine the previous line(s) + { + /* NOTE: regexExtraState is already applied to: + 1) Single-line comments; + 2) Lines ending with single/double quotations + but without end quote; and + 3) Lines ending with regex plus spaces. */ QTextBlock prev = currentBlock().previous(); if (!prev.isValid()) return false; QString txt = prev.text(); QRegularExpression nonSpace ("[^\\s]+"); while (txt.indexOf (nonSpace, 0) == -1) { + if (prev.userState() == regexExtraState) + { // a quoted line with only witespaces (backslashed mutil-line quote) + return false; + } prev.setUserState (updateState); // update the next line if this one changes prev = prev.previous(); if (!prev.isValid()) return false; @@ -76,13 +86,24 @@ --last; ch = txt.at (last); } - if (prev.userState() == regexEndState) - return false; // a regex isn't escaped if it follows another one + if (prev.userState() == regexExtraState) + { + /* a regex isn't escaped if it follows another one, + a single-line comment or a quotation (without an end quote) */ + return false; + } else { prev.setUserState (updateState); // update the next line if this one changes - if (ch.isLetterOrNumber() || ch == '_' - || ch == ')' || ch == ']') // as with Kate + if (ch.isNumber() || ch == '_' + /* as with Kate */ + || ch == ')' || ch == ']' || ch == '$' || ch == '\"' || ch == '\'' || ch == '`' + /* also skip "/>" */ + || (last > 0 && ch == '>' && txt.at (last - 1) == '/' && progLan == "javascript")) + { + return true; + } + if (ch.isLetter()) { // a regex isn't escaped if it follows a JavaScript keyword if (progLan == "javascript") { @@ -97,35 +118,55 @@ int len = qMin (12, last + 1); QString str = txt.mid (last - len + 1, len); int j; - if ((j = str.lastIndexOf (progLan == "javascript" ? jsKeys : qmlKeys, -1, &keyMatch)) > -1 && j + keyMatch.capturedLength() == len) + if ((j = str.lastIndexOf (progLan == "javascript" ? jsKeys : qmlKeys, -1, &keyMatch)) > -1 + && j + keyMatch.capturedLength() == len) + { return false; + } return true; } } } else - { + { // a regex isn't escaped if it follows another one or a JavaScript keyword + if (format (i) == regexFormat) + return false; QChar ch = text.at (i); - if (format (i) != regexFormat && (ch.isLetterOrNumber() || ch == '_' - || ch == ')' || ch == ']')) // as with Kate - { // a regex isn't escaped if it follows another one or a JavaScript keyword + if (/* as with Kate */ + ch == ')' || ch == ']' || ch == '$' || ch == '\"' || ch == '\'' || ch == '`' + /* also skip "/>" */ + || (i > 0 && ch == '>' && text.at (i - 1) == '/' && progLan == "javascript")) + { + return true; + } + if (ch.isLetterOrNumber() || ch == '_') + { int j; - if ((j = text.lastIndexOf (QRegularExpression("/\\w+"), i + 1, &keyMatch)) > -1 && j + keyMatch.capturedLength() == i + 1) - return false; - if (progLan == "javascript") + if ((j = text.lastIndexOf (QRegularExpression("/\\w+"), i + 1, &keyMatch)) > -1 + && j + keyMatch.capturedLength() == i + 1 && format (j) == regexFormat) { - if (jsKeys.pattern().isEmpty()) - jsKeys.setPattern (keywords (progLan).join ('|')); + return false; } - else + if (ch.isLetter()) { - if (qmlKeys.pattern().isEmpty()) - qmlKeys.setPattern (keywords (progLan).join ('|')); + if (progLan == "javascript") + { + if (jsKeys.pattern().isEmpty()) + jsKeys.setPattern (keywords (progLan).join ('|')); + } + else + { + if (qmlKeys.pattern().isEmpty()) + qmlKeys.setPattern (keywords (progLan).join ('|')); + } + int len = qMin (12, i + 1); + QString str = text.mid (i - len + 1, len); + if ((j = str.lastIndexOf (progLan == "javascript" ? jsKeys : qmlKeys, -1, &keyMatch)) > -1 + && j + keyMatch.capturedLength() == len) + { + return false; + } } - int len = qMin (12, i + 1); - QString str = text.mid (i - len + 1, len); - if ((j = str.lastIndexOf (progLan == "javascript" ? jsKeys : qmlKeys, -1, &keyMatch)) > -1 && j + keyMatch.capturedLength() == len) - return false; return true; } } @@ -133,20 +174,25 @@ return false; } /*************************/ -// May be used for middle signs (e.g., "/") too. -bool Highlighter::isEscapedRegexEndSign (const QString &text, const int start, const int pos) const { +// May be used for middle signs (e.g., "/") too. FIXME: Multi-line classes aren't supported. +bool Highlighter::isEscapedRegexEndSign (const QString &text, const int start, const int pos, + bool ignoreClasses) const +{ if (pos < 1) return false; if (isEscapedChar (text, pos)) return true; - /* check if it's inside a class */ - int i = pos - 1; - while (i >= start) + if (!ignoreClasses) { - if (text.at (i) == ']' && !isEscapedChar (text, i)) - return false; - if (text.at (i) == '[' && !isEscapedChar (text, i)) - return true; - --i; + /* check if it's inside a class */ + int i = pos - 1; + while (i >= start) + { + if (text.at (i) == ']' && !isEscapedChar (text, i)) + return false; + if (text.at (i) == '[' && !isEscapedChar (text, i)) + return true; + --i; + } } return false; } @@ -202,7 +248,8 @@ /* skip formatted comments and quotes */ QTextCharFormat fi = format (nxtPos); if (N % 2 == 0 - && (fi == commentFormat || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat)) + && (fi == commentFormat || fi == urlFormat + || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat)) { pos = nxtPos; continue; @@ -266,6 +313,14 @@ if (progLan != "javascript" && progLan != "qml") return; + int prevState = previousBlockState(); + + if (index == 0 && prevState == -1 && text.startsWith ("#!")) + { // a special case at the start of the first line (hash-bang) + setFormat (0, text.length(), commentFormat); + return; + } + int startIndex = index; QRegularExpressionMatch startMatch; QRegularExpression startExp ("/"); @@ -273,7 +328,6 @@ QRegularExpression endExp ("/[A-Za-z0-9_]*"); QTextCharFormat fi; - int prevState = previousBlockState(); if (prevState != regexState || startIndex > 0) { startIndex = text.indexOf (startExp, startIndex, &startMatch); @@ -281,7 +335,7 @@ fi = format (startIndex); while (startIndex >= 0 && (isEscapedRegex (text, startIndex) - || fi == commentFormat + || fi == commentFormat || fi == urlFormat || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat)) { startIndex = text.indexOf (startExp, startIndex + 1, &startMatch); @@ -307,11 +361,9 @@ } while (isEscapedRegexEndSign (text, indx, endIndex)) - { - indx = endIndex + 1; - endIndex = text.indexOf (endExp, indx, &endMatch); - } + endIndex = text.indexOf (endExp, endIndex + 1, &endMatch); + int badIndex = -1; int len; if (endIndex == -1) { @@ -322,16 +374,34 @@ { len = endIndex - startIndex + endMatch.capturedLength(); + /* a multi-line comment start sign may have become invalid */ + if (!commentStartExpression.pattern().isEmpty()) + { + QRegularExpression commentExp ("^" + commentStartExpression.pattern()); + if (text.mid (endIndex).indexOf (commentExp) == 0) + { + badIndex = endIndex + endMatch.capturedLength(); + setFormat (badIndex, text.length() - badIndex, neutralFormat); + setCurrentBlockState (0); // restore the neutral state + } + } } setFormat (startIndex, len, regexFormat); startIndex = text.indexOf (startExp, startIndex + len, &startMatch); + if (badIndex >= 0) + { // reformat from here, as in highlightBlock() + singleLineComment (text, badIndex); + multiLineQuote (text, badIndex); // always returns false + multiLineComment (text, badIndex, commentStartExpression, commentEndExpression, commentState, commentFormat); + } + /* skip comments and quotations again */ fi = format (startIndex); while (startIndex >= 0 && (isEscapedRegex (text, startIndex) - || fi == commentFormat + || fi == commentFormat || fi == urlFormat || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat)) { startIndex = text.indexOf (startExp, startIndex + 1, &startMatch); @@ -341,7 +411,8 @@ /* If this line ends with a regex plus spaces, give it a special state to decide about the probable regex of its following line - and also for that line to be updated when this state is toggled. */ + and also for that line to be updated when this state is toggled. + See isEscapedRegex(). */ if (currentBlockState() == 0 && !text.isEmpty()) { int last = text.length() - 1; @@ -353,7 +424,7 @@ ch = text.at (last); } if (format (last) == regexFormat) - setCurrentBlockState (regexEndState); + setCurrentBlockState (regexExtraState); } } diff -Nru featherpad-0.12.1/featherpad/highlighter-sh.cpp featherpad-0.17.1/featherpad/highlighter-sh.cpp --- featherpad-0.12.1/featherpad/highlighter-sh.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/highlighter-sh.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -24,11 +24,9 @@ // multi/single-line quote highlighting for bash. void Highlighter::SH_MultiLineQuote (const QString &text) { - static const QRegularExpression urlPattern ("[A-Za-z0-9_]+://[A-Za-z0-9_.+/\\?\\=~&%#\\-:]+|[A-Za-z0-9_.\\-]+@[A-Za-z0-9_\\-]+\\.[A-Za-z0-9.]+"); - int index = 0; QRegularExpressionMatch quoteMatch; - QRegularExpression quoteExpression ("\"|\'"); + QRegularExpression quoteExpression = mixedQuoteMark; int initialState = currentBlockState(); int prevState = previousBlockState(); @@ -50,8 +48,11 @@ int hereDocDelimPos = -1; if (!curData->labelInfo().isEmpty()) // the label is delimStr { - QRegularExpression delim ("<<(?:\\s*)(\\\\{0,1}[A-Za-z0-9_]+)|<<(?:\\s*)(\'[A-Za-z0-9_]+\')|<<(?:\\s*)(\"[A-Za-z0-9_]+\")"); - hereDocDelimPos = text.indexOf (delim); + hereDocDelimPos = text.indexOf (hereDocDelimiter); + while (hereDocDelimPos > -1 && isQuoted (text, hereDocDelimPos, true)) + { // see isHereDocument() + hereDocDelimPos = text.indexOf (hereDocDelimiter, hereDocDelimPos + 2); + } } /* find the start quote */ @@ -89,7 +90,7 @@ while (index >= 0) { /* if the search is continued... */ - if (quoteExpression.pattern() == "\"|\'") + if (quoteExpression == mixedQuoteMark) { /* ... distinguish between double and single quotes again because the quote mark may have changed */ @@ -150,7 +151,7 @@ } /* the next quote may be different */ - quoteExpression.setPattern ("\"|\'"); + quoteExpression = mixedQuoteMark; index = text.indexOf (quoteExpression, index + quoteLength); /* skip escaped start quotes and all comments */ @@ -171,6 +172,7 @@ QTextCharFormat fi = format (pos); return (fi == neutralFormat // not needed || fi == commentFormat + || fi == urlFormat || fi == quoteFormat || fi == altQuoteFormat || fi == urlInsideQuoteFormat); @@ -193,8 +195,8 @@ ++ indx; if (indx == text.length()) break; - QString c = text.at (indx); - if (c == "\'") + const QChar c = text.at (indx); + if (c == '\'') { if (comment) { @@ -231,7 +233,7 @@ } } } - else if (c == "\"") + else if (c == '\"') { if (comment) setFormat (indx, 1, commentFormat); @@ -242,7 +244,7 @@ } ++ indx; } - else if (c == "$") // may start a new code block + else if (c == '$') // may start a new code block { if (comment) { @@ -271,7 +273,7 @@ } } } - else if (c == "(") + else if (c == '(') { if (doubleQuoted) setFormat (indx, 1, quoteFormat); @@ -286,7 +288,7 @@ } ++ indx; } - else if (c == ")") // may end a code block + else if (c == ')') // may end a code block { if (doubleQuoted) setFormat (indx, 1, quoteFormat); @@ -316,7 +318,7 @@ } ++ indx; } - else if (c == "#") // may be comment sign + else if (c == '#') // may be comment sign { if (comment) setFormat (indx, 1, commentFormat); @@ -437,7 +439,8 @@ { if (N == 0) { // search for the first code block (after the previous one is closed) - int start = text.indexOf (QRegularExpression ("\\$\\("), indx); + static const QRegularExpression codeBlockStart ("\\$\\("); + int start = text.indexOf (codeBlockStart, indx); if (start == -1 || format (start) == commentFormat) goto FINISH; else diff -Nru featherpad-0.12.1/featherpad/lineedit.cpp featherpad-0.17.1/featherpad/lineedit.cpp --- featherpad-0.12.1/featherpad/lineedit.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/lineedit.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -59,7 +59,7 @@ if (event->key() == Qt::Key_K) { clear(); - returnPressed(); // for clearing found matches highlighting + emit returnPressed(); // for clearing found matches highlighting } } QLineEdit::keyPressEvent (event); diff -Nru featherpad-0.12.1/featherpad/loading.cpp featherpad-0.17.1/featherpad/loading.cpp --- featherpad-0.12.1/featherpad/loading.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/loading.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2019 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -68,15 +68,23 @@ QByteArray data; char c; qint64 charSize = sizeof (char); // 1 + int num = 0; if (enforced) { // no need to check for the null character here while (file.read (&c, charSize) > 0) - data.append (c); + { + if (c == '\n' || c == '\r') + num = 0; + if (num < 500004) // a multiple of 4 (for UTF-16/32) + data.append (c); + else + forceUneditable_ = true; + ++num; + } } else { unsigned char C[4]; - int num = 0; /* checking 4 bytes is enough to guess whether the encoding is UTF-16 or UTF-32 */ while (num < 4 && file.read (&c, charSize) > 0) @@ -111,7 +119,7 @@ /* reading may still be possible */ if (charset_.isEmpty() && !hasNull) { - int num = 0; + num = 5; // 4 characters are already read while (file.read (&c, charSize) > 0) { if (c == '\0') @@ -147,8 +155,17 @@ emit completed (QString(), QString(), "UTF-8"); return; } + num = 0; while (file.read (&c, charSize) > 0) - data.append (c); + { + if (c == '\n' || c == '\r') + num = 0; + if (num < 500004) // a multiple of 4 (for UTF-16/32) + data.append (c); + else + forceUneditable_ = true; + ++num; + } } } } @@ -170,7 +187,7 @@ charset_ = detectCharset (data); } - QTextCodec *codec = QTextCodec::codecForName (charset_.toUtf8()); // or charset.toStdString().c_str() + QTextCodec *codec = QTextCodec::codecForName (charset_.toUtf8()); // or charset_.toStdString().c_str() if (!codec) // prevent any chance of crash if there's a bug { charset_ = "UTF-8"; diff -Nru featherpad-0.12.1/featherpad/main.cpp featherpad-0.17.1/featherpad/main.cpp --- featherpad-0.12.1/featherpad/main.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/main.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2019 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -17,6 +17,7 @@ * @license GPL-3.0+ */ +#include #include "singleton.h" #ifdef HAS_X11 @@ -26,7 +27,6 @@ #include #include #include -#include void handleQuitSignals (const std::vector& quitSignals) { @@ -43,35 +43,49 @@ int main (int argc, char **argv) { const QString name = "FeatherPad"; - const QString version = "0.12.1"; + const QString version = "0.17.1"; const QString option = QString::fromUtf8 (argv[1]); if (option == "--help" || option == "-h") { QTextStream out (stdout); - out << "FeatherPad - Lightweight Qt5 text editor\n"\ - "Usage:\n featherpad [option] [file1 file2 ...]\n"\ - "Or:\n fpad [option] [file1 file2 ...]\n\n"\ + out << "FeatherPad - Lightweight Qt text editor\n"\ + "Usage:\n featherpad [option(s)] [file1 file2 ...]\n"\ + "Or:\n fpad [option(s)] [file1 file2 ...]\n\n"\ "Options:\n\n"\ - "--help or -h Show this help and exit.\n"\ - "--version or -v Show version information and exit.\n"\ - "--win or -w Open file(s) in a new window.\n"\ - "+ Place cursor at document end.\n"\ - "+ Place cursor at start of line L (L starts from 1).\n"\ - "+,

Place cursor at position P of line L (P starts from 0\n"\ - " but a negative value means line end).\n"\ + "--help or -h Show this help and exit.\n"\ + "--version or -v Show version information and exit.\n"\ + "--standalone or -s Start a standalone process of FeatherPad.\n"\ + "--win or -w Open file(s) in a new window.\n"\ + "+ Place cursor at document end.\n"\ + "+ Place cursor at start of line L (L starts from 1).\n"\ + "+,

Place cursor at position P of line L (P starts from 0\n"\ + " but a negative value means line end).\n"\ "\nNOTE1: means number X without brackets.\n"\ - "NOTE2: --win or -w can come before or after cursor option, with a space\n"\ - " in between." << endl; + "NOTE2: --standalone or -s can only be the first option. If it exists,\n"\ + " --win or -w will be ignored because a standalone process always\n"\ + " has its separate, single window.\n"\ + "NOTE3: --win or -w can come before or after cursor option, with a space\n"\ + " in between." +#if (QT_VERSION >= QT_VERSION_CHECK(5,15,0)) + << Qt::endl; +#else + << endl; +#endif return 0; } else if (option == "--version" || option == "-v") { QTextStream out (stdout); - out << name << " " << version << endl; + out << name << " " << version +#if (QT_VERSION >= QT_VERSION_CHECK(5,15,0)) + << Qt::endl; +#else + << endl; +#endif return 0; } - FeatherPad::FPsingleton singleton (argc, argv); + FeatherPad::FPsingleton singleton (argc, argv, option == "--standalone" || option == "-s"); singleton.setApplicationName (name); singleton.setApplicationVersion (version); @@ -86,10 +100,10 @@ QTranslator qtTranslator; if (!qtTranslator.load ("qt_" + lang, QLibraryInfo::location (QLibraryInfo::TranslationsPath))) - { // not needed; doesn't happen + { // shouldn't be needed if (!langs.isEmpty()) { - lang = langs.first().split (QLatin1Char ('-')).first(); + lang = langs.first().split (QLatin1Char ('_')).first(); qtTranslator.load ("qt_" + lang, QLibraryInfo::location (QLibraryInfo::TranslationsPath)); } } @@ -97,7 +111,7 @@ QTranslator FPTranslator; #if defined(Q_OS_HAIKU) - FPTranslator.load ("featherpad_" + lang, "/translations"); + FPTranslator.load ("featherpad_" + lang, QStringLiteral (DATADIR) + "/../translations"); #elif defined(Q_OS_MAC) FPTranslator.load ("featherpad_" + lang, singleton.applicationDirPath() + QStringLiteral ("/../Resources/translations/")); #else @@ -113,18 +127,11 @@ #endif info.setNum (d); info += "\n\r"; // a string that can't be used in file names + info += QDir::currentPath(); + info += "\n\r"; for (int i = 1; i < argc; ++i) { - QString str = QString::fromUtf8 (argv[i]); - if (str.contains ("/")) - { - if (str.startsWith ("file://")) - str = QUrl (str).toLocalFile(); - /* always an absolute path (works around KDE's double slash bug too) */ - QFileInfo fInfo (str); - str = fInfo.absoluteFilePath(); - } - info += str; + info += QString::fromUtf8 (argv[i]); if (i < argc - 1) info += "\n\r"; } diff -Nru featherpad-0.12.1/featherpad/messagebox.h featherpad-0.17.1/featherpad/messagebox.h --- featherpad-0.12.1/featherpad/messagebox.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/messagebox.h 2021-01-06 17:57:35.000000000 +0000 @@ -32,11 +32,11 @@ class MessageBox : public QMessageBox { Q_OBJECT public: - MessageBox (QWidget *parent = Q_NULLPTR) : QMessageBox (parent) {} + MessageBox (QWidget *parent = nullptr) : QMessageBox (parent) {} MessageBox (Icon icon, const QString &title, const QString &text, StandardButtons buttons = NoButton, - QWidget *parent = Q_NULLPTR, + QWidget *parent = nullptr, Qt::WindowFlags f = Qt::Dialog/* | Qt::MSWindowsFixedSizeDialogHint*/) : QMessageBox (icon, title, text, buttons, parent, f) {} void changeButtonText (QMessageBox::StandardButton btn, const QString &text) { @@ -58,11 +58,7 @@ t.replace ("
", "\n"); QStringList l = t.split ('\n'); // deal with newlines for (int i = 0; i < l.size(); i++) -#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0)) tw = qMax (tw, QFontMetrics (font()).horizontalAdvance (l[i])); -#else - tw = qMax (tw, QFontMetrics (font()).width (l[i])); -#endif lo->setColumnMinimumWidth (lo->columnCount() - 1, tw + 10); } diff -Nru featherpad-0.12.1/featherpad/pref.cpp featherpad-0.17.1/featherpad/pref.cpp --- featherpad-0.12.1/featherpad/pref.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/pref.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -29,6 +29,7 @@ #include #include #include +#include namespace FeatherPad { @@ -40,14 +41,16 @@ void FPKeySequenceEdit::keyPressEvent (QKeyEvent *event) { // also a workaround for a Qt bug that makes Meta a non-modifier clear(); // no multiple shortcuts - /* don't create a shortcut without modifier because - this is a text editor but make exceptions for Fx keys */ int k = event->key(); - if ((k < Qt::Key_F1 || k > Qt::Key_F35) - && (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::KeypadModifier)) + if ((event->modifiers() != Qt::NoModifier && event->modifiers() != Qt::KeypadModifier)) { - return; + if (k == Qt::Key_Super_L || k == Qt::Key_Super_R) + return; } + /* don't create a shortcut without modifier because + this is a text editor but make exceptions for Fx keys */ + else if (k < Qt::Key_F1 || k > Qt::Key_F35) + return; QKeySequenceEdit::keyPressEvent (event); } /*************************/ @@ -62,16 +65,23 @@ /*************************/ bool Delegate::eventFilter (QObject *object, QEvent *event) { - QWidget *editor = qobject_cast(object); + FPKeySequenceEdit *editor = qobject_cast(object); if (editor && event->type() == QEvent::KeyPress) { - int k = static_cast(event)->key(); + QKeyEvent *ke = static_cast(event); + int k = ke->key(); if (k == Qt::Key_Return || k == Qt::Key_Enter) { emit QAbstractItemDelegate::commitData (editor); emit QAbstractItemDelegate::closeEditor (editor); return true; } + /* treat Tab and Backtab like other keys */ + if (k == Qt::Key_Tab || k == Qt::Key_Backtab) + { + editor->pressKey (ke); + return true; + } } return QStyledItemDelegate::eventFilter (object, event); } @@ -82,6 +92,7 @@ ui->setupUi (this); parent_ = parent; setWindowModality (Qt::WindowModal); + ui->promptLabel->setStyleSheet ("QLabel {background-color: #7d0000; color: white; border-radius: 3px; margin: 2px; padding: 5px;}"); ui->promptLabel->hide(); promptTimer_ = nullptr; @@ -90,6 +101,13 @@ ui->tableWidget->horizontalHeader()->setSectionResizeMode (QHeaderView::Stretch); ui->tableWidget->horizontalHeader()->setSectionsClickable (true); ui->tableWidget->sortByColumn (0, Qt::AscendingOrder); + ui->tableWidget->setToolTip (tr ("Press a modifier key to clear a shortcut\nin the editing mode.")); + + ui->syntaxTableWidget->horizontalHeader()->setSectionResizeMode (0, QHeaderView::Stretch); + ui->syntaxTableWidget->horizontalHeader()->setSectionResizeMode (1, QHeaderView::ResizeToContents); + ui->syntaxTableWidget->horizontalHeader()->setSectionsClickable (false); + ui->syntaxTableWidget->sortByColumn (0, Qt::AscendingOrder); + ui->syntaxTableWidget->setToolTip (tr ("Double click a color to change it.")); Config config = static_cast(qApp)->getConfig(); darkBg_ = config.getDarkColScheme(); @@ -102,6 +120,10 @@ textTabSize_ = config.getTextTabSize(); saveUnmodified_ = config.getSaveUnmodified(); sharedSearchHistory_ = config.getSharedSearchHistory(); + selHighlighting_ = config.getSelectionHighlighting(); + pastePaths_ = config.getPastePaths(); + whiteSpaceValue_ = config.getWhiteSpaceValue(); + curLineHighlight_ = config.getCurLineHighlight(); /************** *** Window *** @@ -235,6 +257,8 @@ ui->thickCursorBox->setChecked (config.getThickCursor()); + ui->selHighlightBox->setChecked (selHighlighting_); + ui->dateEdit->setText (config.getDateFormat()); ui->lastLineBox->setChecked (config.getAppendEmptyLine()); @@ -243,12 +267,11 @@ ui->trailingSpacesBox->setChecked (config.getRemoveTrailingSpaces()); connect (ui->trailingSpacesBox, &QCheckBox::stateChanged, this, &PrefDialog::prefRemoveTrailingSpaces); - ui->scrollBox->setChecked (config.getScrollJumpWorkaround()); - connect (ui->scrollBox, &QCheckBox::stateChanged, this, &PrefDialog::prefScrollJumpWorkaround); - ui->skipNonTextBox->setChecked (config.getSkipNonText()); connect (ui->skipNonTextBox, &QCheckBox::stateChanged, this, &PrefDialog::prefSkipNontext); + ui->pastePathsBox->setChecked (pastePaths_); + ui->spinBox->setValue (config.getMaxSHSize()); connect (ui->spinBox, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::prefMaxSHSize); @@ -276,7 +299,7 @@ connect (ui->commandEdit, &QLineEdit::textEdited, this, &PrefDialog::prefCommand); ui->recentSpin->setValue (config.getRecentFilesNumber()); - ui->recentSpin->setSuffix(" " + (ui->recentSpin->value() > 1 ? tr ("files") : tr ("file"))); + ui->recentSpin->setSuffix (" " + (ui->recentSpin->value() > 1 ? tr ("files") : tr ("file"))); connect (ui->recentSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::prefRecentFilesNumber); ui->lastFilesBox->setChecked (config.getSaveLastFilesList()); @@ -306,7 +329,7 @@ { const QString name = iter.key()->objectName(); DEFAULT_SHORTCUTS.insert (name, iter.value().toString()); - OBJECT_NAMES.insert (iter.key()->text().remove ("&"), name); + OBJECT_NAMES.insert (iter.key()->text().remove (QRegularExpression ("\\s*\\(&[a-zA-Z0-9]\\)\\s*")).remove ("&"), name); ++ iter; } } @@ -355,6 +378,88 @@ connect (ui->defaultButton, &QAbstractButton::clicked, this, &PrefDialog::restoreDefaultShortcuts); ui->defaultButton->setDisabled (ca.isEmpty()); + /********************* + *** Syntax Colors *** + *********************/ + + static QHash syntaxNames; + if (syntaxNames.isEmpty()) + { // it's a shame that QObject::tr() doesn't work in FeatherPad::Config + syntaxNames.insert ("function", tr ("Functions, URLs,…")); + syntaxNames.insert ("BuiltinFunction", tr ("Built-in Functions")); + syntaxNames.insert ("comment", tr ("Comments")); + syntaxNames.insert ("quote", tr ("Quotations")); + syntaxNames.insert ("type", tr ("Types")); + syntaxNames.insert ("keyWord", tr ("Key Words")); + syntaxNames.insert ("number", tr ("Numbers")); + syntaxNames.insert ("regex", tr ("Regular Expressions, Code Blocks,…")); + syntaxNames.insert ("xmlElement", tr ("Document Blocks, XML/HTML Elements,…")); + syntaxNames.insert ("cssValue", tr ("Markdown Headings, CSS Values,…")); + syntaxNames.insert ("other", tr ("Extra Elements")); + } + + ui->syntaxTableWidget->setSortingEnabled (false); + origSyntaxColors_ = !config.customSyntaxColors().isEmpty() + ? config.customSyntaxColors() + : config.getDarkColScheme() ? config.darkSyntaxColors() + : config.lightSyntaxColors(); + ui->syntaxTableWidget->setRowCount (origSyntaxColors_.size()); + index = 0; + QHash::const_iterator sIter = origSyntaxColors_.constBegin(); + while (sIter != origSyntaxColors_.constEnd()) + { + QTableWidgetItem *item = new QTableWidgetItem (syntaxNames.value (sIter.key())); + item->setData (Qt::UserRole, sIter.key()); // remember syntax independently of translations + item->setFlags (item->flags() & ~Qt::ItemIsEditable & ~Qt::ItemIsSelectable); + ui->syntaxTableWidget->setItem (index, 0, item); + + QWidget *container = new QWidget(); + QHBoxLayout *layout = new QHBoxLayout (container); + layout->setAlignment (Qt::AlignCenter); + layout->setContentsMargins (3, 3, 3, 3); + QLabel *label = new QLabel(); + label->setMinimumWidth (100); + label->setSizePolicy (QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + QColor col = sIter.value(); + label->setStyleSheet (QString ("QLabel {background-color: rgb(%1, %2, %3);}") + .arg (col.red()).arg (col.green()).arg (col.blue())); + layout->addWidget (label); + container->setLayout (layout); + ui->syntaxTableWidget->setCellWidget(index, 1, container); + ++ sIter; + ++ index; + } + ui->syntaxTableWidget->setSortingEnabled (true); + ui->syntaxTableWidget->setCurrentCell (0, 1); + connect (ui->syntaxTableWidget, &QTableWidget::cellDoubleClicked, this, &PrefDialog::changeSyntaxColor); + ui->whiteSpaceSpin->setMinimum (config.getMinWhiteSpaceValue()); + ui->whiteSpaceSpin->setMaximum (config.getMaxWhiteSpaceValue()); + ui->whiteSpaceSpin->setValue (whiteSpaceValue_); + connect (ui->whiteSpaceSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::changeWhitespaceValue); + connect (ui->defaultSyntaxButton, &QAbstractButton::clicked, this, &PrefDialog::restoreDefaultSyntaxColors); + ui->defaultSyntaxButton->setDisabled (config.customSyntaxColors().isEmpty() + && whiteSpaceValue_ == config.getDefaultWhiteSpaceValue() + && curLineHighlight_ == -1); + /* also, context menus for changing syntax colors */ + ui->syntaxTableWidget->setContextMenuPolicy (Qt::CustomContextMenu); + connect (ui->syntaxTableWidget, &QWidget::customContextMenuRequested, [this] (const QPoint& p) { + QModelIndex index = ui->syntaxTableWidget->indexAt (p); + if (!index.isValid() || index.column() != 1) return; + QMenu menu; + QAction *action = menu.addAction (tr ("Select Syntax Color")); + connect (action, &QAction::triggered, this, [this, index] { + changeSyntaxColor (index.row(), 1); + }); + menu.exec (ui->syntaxTableWidget->viewport()->mapToGlobal (p)); + }); + + /* this isn't about syntax but comes here because + it has different values for light and dark color schemes */ + ui->curLineSpin->setMinimum (config.getMinCurLineHighlight() - 1); // for the special text + ui->curLineSpin->setMaximum (config.getMaxCurLineHighlight()); + ui->curLineSpin->setValue (curLineHighlight_); + connect (ui->curLineSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::changeCurLineHighlight); + /************* *** Other *** *************/ @@ -414,6 +519,8 @@ prefTextTab(); prefSaveUnmodified(); prefThickCursor(); + prefSelHighlight(); + prefPastePaths(); Config& config = static_cast(qApp)->getConfig(); config.setPrefSize (size()); @@ -422,12 +529,10 @@ /*************************/ void PrefDialog::showPrompt (const QString& str, bool temporary) { - static const QString style ("QLabel {background-color: #7d0000; color: white; border-radius: 3px; margin: 2px; padding: 5px;}"); Config config = static_cast(qApp)->getConfig(); if (!str.isEmpty()) { // show the provided message ui->promptLabel->setText ("" + str + ""); - ui->promptLabel->setStyleSheet (style); if (temporary) // show it temporarily { if (!promptTimer_) @@ -439,12 +544,11 @@ && ui->tabWidget->currentIndex() == 3) // Shortcuts page { // show the previous message if it exists ui->promptLabel->setText (prevtMsg_); - ui->promptLabel->setStyleSheet (style); } else showPrompt(); }); } - promptTimer_->start (3300); + promptTimer_->start (5000); } else prevtMsg_ = "" + str + ""; @@ -453,7 +557,6 @@ || sharedSearchHistory_ != config.getSharedSearchHistory()) { ui->promptLabel->setText ("" + tr ("Application restart is needed for changes to take effect.") + ""); - ui->promptLabel->setStyleSheet (style); } else if (darkBg_ != config.getDarkColScheme() || (darkBg_ && darkColValue_ != config.getDarkBgColorValue()) @@ -462,23 +565,27 @@ || showEndings_ != config.getShowEndings() || textTabSize_ != config.getTextTabSize() || (vLineDistance_ * config.getVLineDistance() < 0 - || (vLineDistance_ > 0 && vLineDistance_ != config.getVLineDistance()))) + || (vLineDistance_ > 0 && vLineDistance_ != config.getVLineDistance())) + || whiteSpaceValue_ != config.getWhiteSpaceValue() + || curLineHighlight_ != config.getCurLineHighlight() + || origSyntaxColors_ != (!config.customSyntaxColors().isEmpty() + ? config.customSyntaxColors() + : config.getDarkColScheme() + ? config.darkSyntaxColors() + : config.lightSyntaxColors())) { ui->promptLabel->setText ("" + tr ("Window reopening is needed for changes to take effect.") + ""); - ui->promptLabel->setStyleSheet (style); } else { if (prevtMsg_.isEmpty()) // clear prompt { ui->promptLabel->clear(); - ui->promptLabel->setStyleSheet ("QLabel {margin: 2px; padding: 5px;}"); + ui->promptLabel->hide(); + return; } else // show the previous message - { ui->promptLabel->setText (prevtMsg_); - ui->promptLabel->setStyleSheet (style); - } } ui->promptLabel->show(); } @@ -754,7 +861,7 @@ for (int j = 0; j < count; ++j) { qobject_cast< TabPage *>(singleton->Wins.at (i)->ui->tabWidget->widget (j)) - ->textEdit()->setAutoBracket (true); + ->textEdit()->setAutoBracket (true); } } } @@ -770,7 +877,7 @@ for (int j = 0; j < count; ++j) { qobject_cast< TabPage *>(singleton->Wins.at (i)->ui->tabWidget->widget (j)) - ->textEdit()->setAutoBracket (false); + ->textEdit()->setAutoBracket (false); } } } @@ -792,7 +899,7 @@ for (int j = 0; j < count; ++j) { qobject_cast< TabPage *>(singleton->Wins.at (i)->ui->tabWidget->widget (j)) - ->textEdit()->setAutoReplace (true); + ->textEdit()->setAutoReplace (true); } } } @@ -808,7 +915,7 @@ for (int j = 0; j < count; ++j) { qobject_cast< TabPage *>(singleton->Wins.at (i)->ui->tabWidget->widget (j)) - ->textEdit()->setAutoReplace (false); + ->textEdit()->setAutoReplace (false); } } } @@ -881,7 +988,7 @@ for (int j = 0; j < count; ++j) { qobject_cast< TabPage *>(singleton->Wins.at (i)->ui->tabWidget->widget (j)) - ->textEdit()->setDateFormat (format); + ->textEdit()->setDateFormat (format); } } } @@ -937,6 +1044,9 @@ void PrefDialog::prefDarkColScheme (int checked) { Config& config = static_cast(qApp)->getConfig(); + + prefCustomSyntaxColors_.clear(); // forget customized syntax colors + disconnect (ui->colorValueSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::prefColValue); if (checked == Qt::Checked) { @@ -954,7 +1064,65 @@ } connect (ui->colorValueSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::prefColValue); + /* There are different syntax color settings for light and dark color schemes. + So, the syntax colors should be read again. */ + config.readSyntaxColors(); + + /* these values should be reset before the prompt is shown */ + whiteSpaceValue_ = config.getWhiteSpaceValue(); + curLineHighlight_ = config.getCurLineHighlight(); + origSyntaxColors_ = !config.customSyntaxColors().isEmpty() + ? config.customSyntaxColors() + : config.getDarkColScheme() ? config.darkSyntaxColors() + : config.lightSyntaxColors(); showPrompt(); + + /* update the state of default button */ + ui->defaultSyntaxButton->setEnabled (!config.customSyntaxColors().isEmpty() + || config.getWhiteSpaceValue() != config.getDefaultWhiteSpaceValue() + || config.getCurLineHighlight() != -1); + /* update row colors */ + for (int i = 0; i < ui->syntaxTableWidget->rowCount(); ++i) + { + if (QTableWidgetItem *item = ui->syntaxTableWidget->item (i, 0)) + { + QString syntax = item->data (Qt::UserRole).toString(); + QColor col; + if (!config.customSyntaxColors().isEmpty()) // customization was done before + col = config.customSyntaxColors().value (syntax); + else // no custom syntax color + { + if (config.getDarkColScheme()) + col = config.darkSyntaxColors().value (syntax); + else + col = config.lightSyntaxColors().value (syntax); + } + if (const auto cw = ui->syntaxTableWidget->cellWidget (i, 1)) + { + if (cw->layout()) + { + if (const auto label = qobject_cast(cw->layout()->itemAt (0)->widget())) + { + label->setStyleSheet (QString ("QLabel {background-color: rgb(%1, %2, %3);}") + .arg (col.red()).arg (col.green()).arg (col.blue())); + } + } + } + } + } + /* update whiteSpace spin box */ + disconnect (ui->whiteSpaceSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::changeWhitespaceValue); + ui->whiteSpaceSpin->setMinimum (config.getMinWhiteSpaceValue()); + ui->whiteSpaceSpin->setMaximum (config.getMaxWhiteSpaceValue()); + ui->whiteSpaceSpin->setValue (config.getWhiteSpaceValue()); + connect (ui->whiteSpaceSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::changeWhitespaceValue); + + /* also, update current line spin box */ + disconnect (ui->curLineSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::changeCurLineHighlight); + ui->curLineSpin->setMinimum (config.getMinCurLineHighlight() - 1); + ui->curLineSpin->setMaximum (config.getMaxCurLineHighlight()); + ui->curLineSpin->setValue (config.getCurLineHighlight()); + connect (ui->curLineSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::changeCurLineHighlight); } /*************************/ void PrefDialog::prefColValue (int value) @@ -988,6 +1156,44 @@ } } /*************************/ +void PrefDialog::prefSelHighlight() +{ + bool selHighlighting = ui->selHighlightBox->isChecked(); + if (selHighlighting == selHighlighting_) + return; + FPsingleton *singleton = static_cast(qApp); + Config& config = singleton->getConfig(); + config.setSelectionHighlighting (selHighlighting); + for (int i = 0; i < singleton->Wins.count(); ++i) + { + int count = singleton->Wins.at (i)->ui->tabWidget->count(); + for (int j = 0; j < count; ++j) + { + qobject_cast< TabPage *>(singleton->Wins.at (i)->ui->tabWidget->widget (j)) + ->textEdit()->setSelectionHighlighting (selHighlighting); + } + } +} +/*************************/ +void PrefDialog::prefPastePaths() +{ + bool pastePaths = ui->pastePathsBox->isChecked(); + if (pastePaths == pastePaths_) + return; + FPsingleton *singleton = static_cast(qApp); + Config& config = singleton->getConfig(); + config.setPastePaths (pastePaths); + for (int i = 0; i < singleton->Wins.count(); ++i) + { + int count = singleton->Wins.at (i)->ui->tabWidget->count(); + for (int j = 0; j < count; ++j) + { + qobject_cast< TabPage *>(singleton->Wins.at (i)->ui->tabWidget->widget (j)) + ->textEdit()->setPastePaths (pastePaths); + } + } +} +/*************************/ void PrefDialog::prefAppendEmptyLine (int checked) { FPsingleton *singleton = static_cast(qApp); @@ -1008,38 +1214,6 @@ config.setRemoveTrailingSpaces (false); } /*************************/ -void PrefDialog::prefScrollJumpWorkaround (int checked) -{ - FPsingleton *singleton = static_cast(qApp); - Config& config = singleton->getConfig(); - if (checked == Qt::Checked) - { - config.setScrollJumpWorkaround (true); - for (int i = 0; i < singleton->Wins.count(); ++i) - { - int count = singleton->Wins.at (i)->ui->tabWidget->count(); - for (int j = 0; j < count; ++j) - { - qobject_cast< TabPage *>(singleton->Wins.at (i)->ui->tabWidget->widget (j)) - ->textEdit()->setScrollJumpWorkaround (true); - } - } - } - else if (checked == Qt::Unchecked) - { - config.setScrollJumpWorkaround (false); - for (int i = 0; i < singleton->Wins.count(); ++i) - { - int count = singleton->Wins.at (i)->ui->tabWidget->count(); - for (int j = 0; j < count; ++j) - { - qobject_cast< TabPage *>(singleton->Wins.at (i)->ui->tabWidget->widget (j)) - ->textEdit()->setScrollJumpWorkaround (false); - } - } - } -} -/*************************/ void PrefDialog::prefSkipNontext (int checked) { Config& config = static_cast(qApp)->getConfig(); @@ -1495,5 +1669,137 @@ } } } +/*************************/ +void PrefDialog::restoreDefaultSyntaxColors() +{ + prefCustomSyntaxColors_.clear(); + ui->defaultSyntaxButton->setDisabled (true); + Config& config = static_cast(qApp)->getConfig(); + config.setCustomSyntaxColors (prefCustomSyntaxColors_); + config.setWhiteSpaceValue (config.getDefaultWhiteSpaceValue()); + config.setCurLineHighlight (-1); + /* update row colors */ + for (int i = 0; i < ui->syntaxTableWidget->rowCount(); ++i) + { + if (QTableWidgetItem *item = ui->syntaxTableWidget->item (i, 0)) + { + QString syntax = item->data (Qt::UserRole).toString(); + QColor col; + if (config.getDarkColScheme()) + col = config.darkSyntaxColors().value (syntax); + else + col = config.lightSyntaxColors().value (syntax); + if (const auto cw = ui->syntaxTableWidget->cellWidget (i, 1)) + { + if (cw->layout()) + { + if (const auto label = qobject_cast(cw->layout()->itemAt (0)->widget())) + { + label->setStyleSheet (QString ("QLabel {background-color: rgb(%1, %2, %3);}") + .arg (col.red()).arg (col.green()).arg (col.blue())); + } + } + } + } + } + /* update whiteSpace value */ + disconnect (ui->whiteSpaceSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::changeWhitespaceValue); + ui->whiteSpaceSpin->setValue (config.getWhiteSpaceValue()); + connect (ui->whiteSpaceSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::changeWhitespaceValue); + + /* also, update current line bg value */ + disconnect (ui->curLineSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::changeCurLineHighlight); + ui->curLineSpin->setValue (config.getMinCurLineHighlight() - 1); + connect (ui->curLineSpin, QOverload::of(&QSpinBox::valueChanged), this, &PrefDialog::changeCurLineHighlight); + + showPrompt(); +} +/*************************/ +void PrefDialog::changeSyntaxColor (int row, int column) +{ + if (column != 1) return; + if (const auto cw = ui->syntaxTableWidget->cellWidget (row, column)) + { + if (cw->layout()) + { + if (const auto label = qobject_cast(cw->layout()->itemAt (0)->widget())) + { + QColor prevColor = label->palette().color (QPalette::Window); + QColor color = QColorDialog::getColor (prevColor, + this, + tr ("Select Syntax Color")); + if (color.isValid() && color != prevColor) + { + Config& config = static_cast(qApp)->getConfig(); + if (QTableWidgetItem *item = ui->syntaxTableWidget->item (row, 0)) + { + QString syntax = item->data (Qt::UserRole).toString(); + + if (prefCustomSyntaxColors_.isEmpty()) // first customization in Preferences + { + if (!config.customSyntaxColors().isEmpty()) + prefCustomSyntaxColors_ = config.customSyntaxColors(); + else if (config.getDarkColScheme()) + prefCustomSyntaxColors_ = config.darkSyntaxColors(); + else + prefCustomSyntaxColors_ = config.lightSyntaxColors(); + } + prefCustomSyntaxColors_.remove (syntax); // will be added correctly below + auto colors = prefCustomSyntaxColors_.values(); + int ws = config.getWhiteSpaceValue(); + colors << QColor (ws, ws, ws); + colors << (config.getDarkColScheme() ? QColor (Qt::white) : QColor (Qt::black)); + /* modify the color if it already exists */ + int r = color.red(); int g = color.green(); int b = color.blue(); + while (colors.contains (color)) + { + color = QColor (r > 127 ? color.red() - 1 : color.red() + 1, + g > 127 ? color.green() - 1 : color.green() + 1, + b > 127 ? color.blue() - 1 : color.blue() + 1); + } + prefCustomSyntaxColors_.insert (syntax, color); + /* also, set the row color */ + label->setStyleSheet (QString ("QLabel {background-color: rgb(%1, %2, %3);}") + .arg (color.red()).arg (color.green()).arg (color.blue())); + } + + /* apply customization immediately for the user to be able to check it in a new window */ + if (prefCustomSyntaxColors_ == + (config.getDarkColScheme() ? config.darkSyntaxColors() + : config.lightSyntaxColors())) // no customization + { + prefCustomSyntaxColors_.clear(); + ui->defaultSyntaxButton->setEnabled (config.getWhiteSpaceValue() != config.getDefaultWhiteSpaceValue() + || config.getCurLineHighlight() != -1); + } + else + ui->defaultSyntaxButton->setEnabled (true); + config.setCustomSyntaxColors (prefCustomSyntaxColors_); + showPrompt(); + } + } + } + } +} +/*************************/ +void PrefDialog::changeWhitespaceValue (int value) +{ + Config& config = static_cast(qApp)->getConfig(); + config.setWhiteSpaceValue (value); // takes care of repeated colors + ui->defaultSyntaxButton->setEnabled (!config.customSyntaxColors().isEmpty() + || config.getWhiteSpaceValue() != config.getDefaultWhiteSpaceValue() + || config.getCurLineHighlight() != -1); + showPrompt(); +} +/*************************/ +void PrefDialog::changeCurLineHighlight (int value) +{ + Config& config = static_cast(qApp)->getConfig(); + config.setCurLineHighlight (value); + ui->defaultSyntaxButton->setEnabled (!config.customSyntaxColors().isEmpty() + || config.getWhiteSpaceValue() != config.getDefaultWhiteSpaceValue() + || config.getCurLineHighlight() != -1); + showPrompt(); +} } diff -Nru featherpad-0.12.1/featherpad/prefDialog.ui featherpad-0.17.1/featherpad/prefDialog.ui --- featherpad-0.12.1/featherpad/prefDialog.ui 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/prefDialog.ui 2021-01-06 17:57:35.000000000 +0000 @@ -504,6 +504,17 @@ + + + Highlight case-sensitive and whole matches +of the selected text. + + + Selection highlighting + + + + Highlight s&yntax by default @@ -854,17 +865,6 @@ - - - This is not a complete fix but -prevents annoying scroll jumps. - - - Workaround for &Qt5's scroll jump bug - - - - Spell Checking @@ -984,7 +984,7 @@ Needs application restart to take effect. - 1 + 0 20 @@ -1223,6 +1223,17 @@ + + + By default, when files are copied, they will +be opened if they are pasted into FeatherPad. + + + Paste paths instead of files + + + + Qt::Vertical @@ -1287,6 +1298,116 @@ + + + + + Syntax Colors + + + + + + true + + + QAbstractItemView::SingleSelection + + + false + + + + Element + + + + + Text Color + + + + + + + + 5 + + + + + Whitespace color value: + + + + + + + + + + Qt::Horizontal + + + + 5 + 5 + + + + + + + + + + 5 + + + + + Has effect only if line numbers are shown. + + + Current line highlight value: + + + + + + + Has effect only if line numbers are shown. + + + Default + + + + + + + Qt::Horizontal + + + + 5 + 5 + + + + + + + + + + Restore default syntax colors. + + + Default + + + diff -Nru featherpad-0.12.1/featherpad/pref.h featherpad-0.17.1/featherpad/pref.h --- featherpad-0.12.1/featherpad/pref.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/pref.h 2021-01-06 17:57:35.000000000 +0000 @@ -35,6 +35,11 @@ public: FPKeySequenceEdit (QWidget *parent = nullptr); + /* to be used with Tab and Backtab */ + void pressKey (QKeyEvent *event) { + QKeySequenceEdit::keyPressEvent (event); + } + protected: virtual void keyPressEvent (QKeyEvent *event); }; @@ -90,10 +95,8 @@ void prefEndings (int checked); void prefDarkColScheme (int checked); void prefColValue (int value); - void prefThickCursor(); void prefAppendEmptyLine (int checked); void prefRemoveTrailingSpaces (int checked); - void prefScrollJumpWorkaround (int checked); void prefSkipNontext (int checked); void prefTabWrapAround (int checked); void prefHideSingleTab (int checked); @@ -118,6 +121,10 @@ void prefCloseWithLastTab (int checked); void addDict(); void prefSpellCheck (int checked); + void changeSyntaxColor (int row, int column); + void changeWhitespaceValue (int value); + void restoreDefaultSyntaxColors(); + void changeCurLineHighlight (int value); private: void closeEvent (QCloseEvent *event); @@ -126,15 +133,20 @@ void prefApplyAutoSave(); void prefApplySyntax(); void prefApplyDateFormat(); + void prefThickCursor(); + void prefSelHighlight(); + void prefPastePaths(); void showPrompt (const QString& str = QString(), bool temporary = false); Ui::PrefDialog *ui; QWidget * parent_; - bool darkBg_, showWhiteSpace_, showEndings_, saveUnmodified_, sharedSearchHistory_; - int vLineDistance_, darkColValue_, lightColValue_, recentNumber_, textTabSize_; + bool darkBg_, showWhiteSpace_, showEndings_, saveUnmodified_, sharedSearchHistory_, selHighlighting_, pastePaths_; + int vLineDistance_, darkColValue_, lightColValue_, recentNumber_, textTabSize_, whiteSpaceValue_, curLineHighlight_; QHash shortcuts_, newShortcuts_; QString prevtMsg_; QTimer *promptTimer_; + QHash prefCustomSyntaxColors_; // customization in Preferences + QHash origSyntaxColors_; // to know if a syntax color is really changed }; } diff -Nru featherpad-0.12.1/featherpad/printing.cpp featherpad-0.17.1/featherpad/printing.cpp --- featherpad-0.12.1/featherpad/printing.cpp 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/printing.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,186 @@ +/* + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2020 + * + * FeatherPad is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * FeatherPad is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + * + * @license GPL-3.0+ + */ + +#include "printing.h" +#include +#include +#include + +namespace FeatherPad { + +Printing::Printing (QTextDocument *document, const QString &fileName, + const QColor &textColor, int darkValue, + qreal sourceDpiX, qreal sourceDpiY) +{ + textColor_ = textColor; + sourceDpiX_ = sourceDpiX; + sourceDpiY_ = sourceDpiY; + + if (darkValue > -1) + darkColor_ = QColor (darkValue, darkValue, darkValue); + + printer_ = new QPrinter (QPrinter::HighResolution); + if (printer_->outputFormat() == QPrinter::PdfFormat) + printer_->setOutputFileName (fileName); + + /************************ + * Cloning the Document * + ***********************/ + + /* clone the document */ + document_ = document->clone(); + /* ensure that there's a layout + (QTextDocument::documentLayout will create the standard layout if there's none) */ + (void)document_->documentLayout(); + /* copy the original formats, considering the dark background */ + for (QTextBlock srcBlock = document->firstBlock(), dstBlock = document_->firstBlock(); + srcBlock.isValid() && dstBlock.isValid(); + srcBlock = srcBlock.next(), dstBlock = dstBlock.next()) + { + QVector formatList = srcBlock.layout()->formats(); + if (darkValue > -1) + { + for (int i = formatList.count() - 1; i >= 0; --i) + { + QTextCharFormat &format = formatList[i].format; + format.setBackground (darkColor_); + } + } + dstBlock.layout()->setFormats (formatList); + } +} +/*************************/ +Printing::~Printing() +{ + delete document_; + delete printer_; +} +/*************************/ +#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0)) +static void printPage (int index, QPainter *painter, const QTextDocument *doc, + const QRectF &body, const QPointF &pageNumberPos, + const QColor &textColor, const QColor &darkColor) +{ + painter->save(); + painter->translate (body.left(), body.top() - (index - 1) * body.height()); + QRectF view (0, (index - 1) * body.height(), body.width(), body.height()); + + QAbstractTextDocumentLayout *layout = doc->documentLayout(); + QAbstractTextDocumentLayout::PaintContext ctx; + + painter->setClipRect (view); + + if (darkColor.isValid()) // make the page dark with the dark scheme + painter->fillRect (view, darkColor); + + ctx.clip = view; + /* with syntax highlighting, this is the color of + line/document ends because the ordinary text is formatted */ + ctx.palette.setColor (QPalette::Text, textColor); + layout->draw (painter, ctx); + + if (!pageNumberPos.isNull()) + { + if (darkColor.isValid()) + painter->setPen (Qt::white); + painter->setClipping (false); + painter->setFont (QFont (doc->defaultFont())); + const QString pageString = QString::number (index); + + painter->drawText(qRound (pageNumberPos.x() - painter->fontMetrics().horizontalAdvance (pageString)), + qRound (pageNumberPos.y() + view.top()), + pageString); + } + + painter->restore(); +} +#endif + +// Control printing to make it work fine with the dark color scheme and also +// to enable printing in the reverse order. This is adapted from "QTextDocument::print". +void Printing::run() +{ +#if (QT_VERSION < QT_VERSION_CHECK(5,14,0)) + document_->print (printer_); +#else + QPainter p (printer_); + if (!p.isActive()) return; + + if (printer_->pageLayout().paintRectPixels (printer_->resolution()).isEmpty()) + return; + + QAbstractTextDocumentLayout *layout = document_->documentLayout(); + layout->setPaintDevice (p.device()); + + const qreal dpiScaleX = static_cast(printer_->logicalDpiX()) / sourceDpiX_; + const qreal dpiScaleY = static_cast(printer_->logicalDpiY()) / sourceDpiY_; + + const int horizontalMargin = static_cast((2/2.54) * sourceDpiX_); + const int verticalMargin = static_cast((2/2.54) * sourceDpiY_); + QTextFrameFormat fmt = document_->rootFrame()->frameFormat(); + fmt.setLeftMargin (horizontalMargin); + fmt.setRightMargin (horizontalMargin); + fmt.setTopMargin (verticalMargin); + fmt.setBottomMargin (verticalMargin); + document_->rootFrame()->setFrameFormat (fmt); + + const int dpiy = p.device()->logicalDpiY(); + QRectF body (0, 0, printer_->width(), printer_->height()); + QPointF pageNumberPos (body.width() - horizontalMargin * dpiScaleX, + body.height() - verticalMargin * dpiScaleY + + QFontMetrics (document_->defaultFont(), p.device()).ascent() + + 5 * dpiy / 72.0); + document_->setPageSize (body.size()); + + int fromPage = printer_->fromPage(); + int toPage = printer_->toPage(); + + if (fromPage == 0 && toPage == 0) + { + fromPage = 1; + toPage = document_->pageCount(); + } + + fromPage = qMax (1, fromPage); + toPage = qMin (document_->pageCount(), toPage); + + if (toPage < fromPage) return; + + bool reverse (printer_->pageOrder() == QPrinter::LastPageFirst); + int page = reverse ? toPage : fromPage; + while (true) + { + printPage (page, &p, document_, body, pageNumberPos, textColor_, darkColor_); + if (reverse) + { + if (page == fromPage) break; + --page; + } + else + { + if (page == toPage) break; + ++page; + } + if (!printer_->newPage()) + return; + } +#endif +} + +} diff -Nru featherpad-0.12.1/featherpad/printing.h featherpad-0.17.1/featherpad/printing.h --- featherpad-0.12.1/featherpad/printing.h 1970-01-01 00:00:00.000000000 +0000 +++ featherpad-0.17.1/featherpad/printing.h 2021-01-06 17:57:35.000000000 +0000 @@ -0,0 +1,56 @@ +/* + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2020 + * + * FeatherPad is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * FeatherPad is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + * + * @license GPL-3.0+ + */ + +#ifndef PRINTING_H +#define PRINTING_H + +#include +#include +#include +#include + +namespace FeatherPad { + +class Printing : public QThread { + Q_OBJECT + +public: + Printing (QTextDocument *document, const QString &fileName, + const QColor &textColor, int darkValue, + qreal sourceDpiX, qreal sourceDpiY); + ~Printing(); + + QPrinter* printer() const { + return printer_; + } + +private: + void run(); + + QTextDocument *document_; + QPrinter *printer_; + QColor textColor_; + QColor darkColor_; + qreal sourceDpiX_; + qreal sourceDpiY_; +}; + +} + +#endif // PRINTING_H diff -Nru featherpad-0.12.1/featherpad/replace.cpp featherpad-0.17.1/featherpad/replace.cpp --- featherpad-0.12.1/featherpad/replace.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/replace.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -25,7 +25,7 @@ void FPwin::removeGreenSel() { /* remove green highlights, considering the selection order, namely, - current line -> replacement -> found matches -> bracket matches */ + current line -> replacement -> found matches -> selection highlights -> bracket matches */ int count = ui->tabWidget->count(); for (int i = 0; i < count; ++i) { @@ -59,7 +59,7 @@ int count = ui->tabWidget->count(); for (int i = 0; i < count; ++i) // replace dock needs searchbar qobject_cast< TabPage *>(ui->tabWidget->widget (i))->setSearchBarVisible (true); - ui->dockReplace->setWindowTitle (tr ("Rep&lacement")); + ui->dockReplace->setWindowTitle (tr ("Replacement")); ui->dockReplace->setVisible (true); ui->dockReplace->raise(); ui->dockReplace->activateWindow(); @@ -77,7 +77,7 @@ // for a moment and then visible again. void FPwin::closeReplaceDock (bool visible) { - if (visible) return; + if (visible || isMinimized()) return; txtReplace_.clear(); removeGreenSel(); @@ -104,15 +104,14 @@ { if (!isReady()) return; - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; - TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); TextEdit *textEdit = tabPage->textEdit(); if (textEdit->isReadOnly()) return; textEdit->setReplaceTitle (QString()); - ui->dockReplace->setWindowTitle (tr ("Rep&lacement")); + ui->dockReplace->setWindowTitle (tr ("Replacement")); QString txtFind = ui->lineEditFind->text(); if (txtFind.isEmpty()) return; @@ -121,38 +120,28 @@ if (txtReplace_ != ui->lineEditReplace->text()) { txtReplace_ = ui->lineEditReplace->text(); - removeGreenSel(); + textEdit->setGreenSel (QList()); } bool lineNumShown (ui->actionLineNumbers->isChecked() || ui->spinBox->isVisible()); - /* remember all previous (yellow and) green highlights */ - QList es = textEdit->extraSelections(); - int n = textEdit->getRedSel().count(); - while (n > 0 && !es.isEmpty()) - { - es.removeLast(); - --n; - } - if (!es.isEmpty() && lineNumShown) - es.removeFirst(); - QTextDocument::FindFlags searchFlags = getSearchFlags(); QTextCursor start = textEdit->textCursor(); QTextCursor tmp = start; QTextCursor found; if (QObject::sender() == ui->toolButtonNext) - found = finding (txtFind, start, searchFlags, tabPage->matchRegex()); + found = textEdit->finding (txtFind, start, searchFlags, tabPage->matchRegex()); else// if (QObject::sender() == ui->toolButtonPrv) - found = finding (txtFind, start, searchFlags | QTextDocument::FindBackward, tabPage->matchRegex()); + found = textEdit->finding (txtFind, start, searchFlags | QTextDocument::FindBackward, tabPage->matchRegex()); QColor color = QColor (textEdit->hasDarkScheme() ? Qt::darkGreen : Qt::green); int pos; - QList gsel = textEdit->getGreenSel(); + QList es = textEdit->getGreenSel(); if (!found.isNull()) { start.setPosition (found.anchor()); pos = found.anchor(); start.setPosition (found.position(), QTextCursor::KeepAnchor); + textEdit->skipSelectionHighlighting(); textEdit->setTextCursor (start); textEdit->insertPlainText (txtReplace_); @@ -162,8 +151,7 @@ QTextEdit::ExtraSelection extra; extra.format.setBackground (color); extra.cursor = tmp; - es.prepend (extra); - gsel.append (extra); + es.append (extra); if (QObject::sender() != ui->toolButtonNext) { @@ -174,13 +162,14 @@ textEdit->setTextCursor (start); } } - textEdit->setGreenSel (gsel); + textEdit->setGreenSel (es); if (lineNumShown) es.prepend (textEdit->currentLineSelection()); - /* append red highlights */ + /* append blue and red highlights */ + es.append (textEdit->getBlueSel()); es.append (textEdit->getRedSel()); textEdit->setExtraSelections (es); - /* yellow highlights may need correction */ + /* add yellow highlights (perhaps with corrections) */ hlight(); } /*************************/ @@ -188,10 +177,9 @@ { if (!isReady()) return; - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; + TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget()); + if (tabPage == nullptr) return; - TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->widget (index)); TextEdit *textEdit = tabPage->textEdit(); if (textEdit->isReadOnly()) return; @@ -202,48 +190,53 @@ if (txtReplace_ != ui->lineEditReplace->text()) { txtReplace_ = ui->lineEditReplace->text(); - removeGreenSel(); + textEdit->setGreenSel (QList()); } QTextDocument::FindFlags searchFlags = getSearchFlags(); QTextCursor orig = textEdit->textCursor(); - QTextCursor start = orig; + orig.setPosition (orig.anchor()); + textEdit->setTextCursor (orig); QColor color = QColor (textEdit->hasDarkScheme() ? Qt::darkGreen : Qt::green); int pos; QTextCursor found; + QTextCursor start = orig; start.beginEditBlock(); start.setPosition (0); QTextCursor tmp = start; - QList gsel = textEdit->getGreenSel(); - QList es; + QList es = textEdit->getGreenSel(); int count = 0; - while (!(found = finding (txtFind, start, searchFlags, tabPage->matchRegex())).isNull()) + QTextEdit::ExtraSelection extra; + extra.format.setBackground (color); + + makeBusy(); + while (!(found = textEdit->finding (txtFind, start, searchFlags, tabPage->matchRegex())).isNull()) { start.setPosition (found.anchor()); pos = found.anchor(); start.setPosition (found.position(), QTextCursor::KeepAnchor); start.insertText (txtReplace_); - tmp.setPosition (pos); - tmp.setPosition (start.position(), QTextCursor::KeepAnchor); + if (count < 1000) + { + tmp.setPosition (pos); + tmp.setPosition (start.position(), QTextCursor::KeepAnchor); + extra.cursor = tmp; + es.append (extra); + } start.setPosition (start.position()); - QTextEdit::ExtraSelection extra; - extra.format.setBackground (color); - extra.cursor = tmp; - es.prepend (extra); - gsel.append (extra); ++count; } - textEdit->setGreenSel (gsel); + unbusy(); + + textEdit->setGreenSel (es); start.endEditBlock(); if ((ui->actionLineNumbers->isChecked() || ui->spinBox->isVisible())) es.prepend (textEdit->currentLineSelection()); + es.append (textEdit->getBlueSel()); es.append (textEdit->getRedSel()); textEdit->setExtraSelections (es); hlight(); - /* restore the original cursor without selection */ - orig.setPosition (orig.anchor()); - textEdit->setTextCursor (orig); QString title; if (count == 0) @@ -254,6 +247,8 @@ title = tr("%Ln Replacements", "", count); ui->dockReplace->setWindowTitle (title); textEdit->setReplaceTitle (title); + if (count > 1000 && !txtReplace_.isEmpty()) + showWarningBar ("

" + tr ("The first 1000 replacements are highlighted.") + "
"); } } diff -Nru featherpad-0.12.1/featherpad/searchbar.cpp featherpad-0.17.1/featherpad/searchbar.cpp --- featherpad-0.12.1/featherpad/searchbar.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/searchbar.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -18,8 +18,8 @@ */ #include -#include #include +#include #include "searchbar.h" #include "svgicons.h" @@ -27,6 +27,46 @@ static const int MAX_ROW_COUNT = 40; +void ComboBox::keyPressEvent (QKeyEvent *event) +{ + if (!(event->modifiers() & Qt::ControlModifier)) + { + if (event->key() == Qt::Key_Up) + { + emit moveInHistory (true); + event->accept(); + return; + } + if (event->key() == Qt::Key_Down) + { + emit moveInHistory (false); + event->accept(); + return; + } + } + QComboBox::keyPressEvent (event); +} +/*************************/ +bool ComboBox::hasPopup() const +{ + return hasPopup_; +} +/*************************/ +void ComboBox::showPopup() +{ + hasPopup_ = true; + QComboBox::showPopup(); +} +/*************************/ +void ComboBox::hidePopup() +{ + QComboBox::hidePopup(); + /* wait for the popup to be closed */ + QTimer::singleShot (0, this, [this]() { + hasPopup_ = false; + }); +} +/*************************/ SearchBar::SearchBar(QWidget *parent, const QList &shortcuts, Qt::WindowFlags f) @@ -206,7 +246,7 @@ lineEdit_->selectAll(); } /*************************/ -bool SearchBar::lineEditHasFocus() +bool SearchBar::lineEditHasFocus() const { return lineEdit_->hasFocus(); } @@ -248,6 +288,11 @@ return button_regex_->isChecked(); } /*************************/ +bool SearchBar::hasPopup() const +{ + return combo_->hasPopup(); +} +/*************************/ // Used only in a workaround (-> FPwin::updateShortcuts()) void SearchBar::updateShortcuts (bool disable) { diff -Nru featherpad-0.12.1/featherpad/searchbar.h featherpad-0.17.1/featherpad/searchbar.h --- featherpad-0.12.1/featherpad/searchbar.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/searchbar.h 2021-01-06 17:57:35.000000000 +0000 @@ -21,7 +21,7 @@ #define SEARCHBAR_H #include -#include +#include #include #include #include "lineedit.h" @@ -32,31 +32,22 @@ { Q_OBJECT public: - ComboBox (QWidget *parent = nullptr) : QComboBox (parent) {} + ComboBox (QWidget *parent = nullptr) : + QComboBox (parent), hasPopup_ (false) {} ~ComboBox() {} + bool hasPopup() const; + void showPopup() override; + void hidePopup() override; + signals: void moveInHistory (bool up); protected: - virtual void keyPressEvent (QKeyEvent *event) { - if (!(event->modifiers() & Qt::ControlModifier)) - { - if (event->key() == Qt::Key_Up) - { - emit moveInHistory (true); - event->accept(); - return; - } - if (event->key() == Qt::Key_Down) - { - emit moveInHistory (false); - event->accept(); - return; - } - } - QComboBox::keyPressEvent (event); - } + void keyPressEvent (QKeyEvent *event) override; + +private: + bool hasPopup_; }; class SearchBar : public QFrame @@ -69,7 +60,7 @@ void setSearchModel (QStandardItemModel *model); void focusLineEdit(); - bool lineEditHasFocus(); + bool lineEditHasFocus() const; QString searchEntry() const; void clearSearchEntry(); @@ -77,6 +68,8 @@ bool matchWhole() const; bool matchRegex() const; + bool hasPopup() const; + void updateShortcuts (bool disable); signals: diff -Nru featherpad-0.12.1/featherpad/session.cpp featherpad-0.17.1/featherpad/session.cpp --- featherpad-0.12.1/featherpad/session.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/session.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2019 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -49,7 +49,12 @@ settings.endGroup(); if (allItems_.count() > 0) { - ui->listWidget->addItems (allItems_); + /* use ListWidgetItem to add items with a natural sorting */ + for (const auto &irem : qAsConst (allItems_)) + { + ListWidgetItem *lwi = new ListWidgetItem (irem, ui->listWidget); + ui->listWidget->addItem (lwi); + } ui->listWidget->setCurrentRow (0); QTimer::singleShot (0, ui->listWidget, QOverload<>::of(&QWidget::setFocus)); } @@ -220,7 +225,10 @@ allItems_.removeDuplicates(); QRegularExpression exp (ui->filterLineEdit->text(), QRegularExpression::CaseInsensitiveOption); if (allItems_.filter (exp).contains (ui->lineEdit->text())) - ui->listWidget->addItem (ui->lineEdit->text()); + { + ListWidgetItem *lwi = new ListWidgetItem (ui->lineEdit->text(), ui->listWidget); + ui->listWidget->addItem (lwi); + } onEmptinessChanged (false); QSettings settings ("featherpad", "fp"); settings.beginGroup ("sessions"); @@ -263,27 +271,17 @@ 0, // irrelevant multiple); } - if (broken == files.count()) - showPrompt (tr ("No file exists or can be opened.")); - else + if (broken > 0) { - /* return the focus to the dialog */ - connect (win, &FPwin::finishedLoading, this, &SessionDialog::activate); - if (broken > 0) + if (broken == files.count()) + showPrompt (tr ("No file exists or can be opened.")); + else showPrompt (tr ("Not all files exist or can be opened.")); } } } } /*************************/ -void SessionDialog::activate() -{ - if (FPwin *win = static_cast(parent_)) - disconnect (win, &FPwin::finishedLoading, this, &SessionDialog::activate); - raise(); - activateWindow(); -} -/*************************/ // These slots are called for processes to have time to be completed, // especially for the returnPressed signal of the line-edit to be emiited. void SessionDialog::showMainPage() @@ -511,8 +509,12 @@ /* then, clear the current list and add the filtered one */ ui->listWidget->clear(); QRegularExpression exp (ui->filterLineEdit->text(), QRegularExpression::CaseInsensitiveOption); - QStringList filtered = allItems_.filter (exp); - ui->listWidget->addItems (filtered); + const QStringList filtered = allItems_.filter (exp); + for (const auto &irem : filtered) + { + ListWidgetItem *lwi = new ListWidgetItem (irem, ui->listWidget); + ui->listWidget->addItem (lwi); + } /* finally, restore the selection as far as possible */ if (filtered.count() == 1) ui->listWidget->setCurrentRow (0); diff -Nru featherpad-0.12.1/featherpad/session.h featherpad-0.17.1/featherpad/session.h --- featherpad-0.12.1/featherpad/session.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/session.h 2021-01-06 17:57:35.000000000 +0000 @@ -49,7 +49,6 @@ void closePrompt(); void removeSelected(); void removeAll(); - void activate(); void showMainPage(); void showPromptPage(); void renameSession(); diff -Nru featherpad-0.12.1/featherpad/sidepane.cpp featherpad-0.17.1/featherpad/sidepane.cpp --- featherpad-0.12.1/featherpad/sidepane.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/sidepane.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2017 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2017-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -20,11 +20,69 @@ #include #include #include +#include #include "sidepane.h" namespace FeatherPad { -// See "qabstractitemview.cpp". +bool ListWidgetItem::operator<(const QListWidgetItem &other) const { + /* treat dot as a separator for a natural sorting */ + const QString txt1 = text(); + const QString txt2 = other.text(); + int start1 = 0, start2 = 0; + for (;;) + { + int end1 = txt1.indexOf (QLatin1Char ('.'), start1); + int end2 = txt2.indexOf (QLatin1Char ('.'), start2); + int comp = collator_.compare (txt1.mid(start1, end1 - start1), + txt2.mid(start2, end2 - start2)); + if (comp != 0) + return comp < 0; + if (end1 == -1 || end2 == -1) + return end1 < end2; + start1 = end1 + 1; + start2 = end2 + 1; + } +} +/*************************/ +ListWidget::ListWidget (QWidget *parent) : QListWidget (parent) +{ + setAutoScroll (false); // Qt's autoscrolling has bugs; see ListWidget::scrollToCurrentItem() + setMouseTracking (true); // for instant tooltips + locked_ = false; + + /* try to have a current item as far as possible and announce it */ + connect (this, &QListWidget::currentItemChanged, [this] (QListWidgetItem *current, QListWidgetItem *previous) { + if (current == previous) return; + if (current == nullptr) + { + if (count() == 0) return; + if (previous != nullptr) + { + int prevRow = row (previous); + if (prevRow < count() - 1) + setCurrentRow (prevRow + 1); + else if (prevRow != 0) + setCurrentRow (0); + } + else setCurrentRow (0); + } + else + { + emit currentItemUpdated (current); + scrollToCurrentItem(); + /* this is sometimes needed because, with filtering, Qt may give the + focus to a hidden item (which is fine) but select a visible one */ + QTimer::singleShot (0, this, [this]() { + auto index = currentIndex(); + if (index.isValid()) + selectionModel()->select (index, QItemSelectionModel::ClearAndSelect); + }); + } + }); +} +/*************************/ +// To prevent deselection by Ctrl + left click; see "qabstractitemview.cpp". QItemSelectionModel::SelectionFlags ListWidget::selectionCommand (const QModelIndex &index, const QEvent *event) const { Qt::KeyboardModifiers keyModifiers = Qt::NoModifier; @@ -49,11 +107,38 @@ return QListWidget::selectionCommand (index, event); } /*************************/ +// QListView::scrollTo() doesn't work fine because it doesn't +// consider the current scrollbar, after some items are hidden. +void ListWidget::scrollToCurrentItem() +{ + QModelIndex index = currentIndex(); + if (!index.isValid()) return; + const QRect rect = visualRect (index); + const QRect area = viewport()->rect(); + if (area.contains (rect)) return; + + bool above (rect.top() < area.top()); + bool below (rect.bottom() > area.bottom()); + + int verticalValue = verticalScrollBar()->value(); + QRect r = rect.adjusted (-spacing(), -spacing(), spacing(), spacing()); + if (above) + verticalValue += r.top(); + else if (below) + verticalValue += qMin (r.top(), r.bottom() - area.height() + 1); + verticalScrollBar()->setValue (verticalValue); +} +/*************************/ void ListWidget::mousePressEvent (QMouseEvent *event) { + if (locked_) + { + event->ignore(); + return; + } if (selectionMode() == QAbstractItemView::SingleSelection) { - if (event->button() == Qt::MidButton) + if (event->button() == Qt::MiddleButton) { QModelIndex index = indexAt (event->pos()); if (QListWidgetItem *item = itemFromIndex (index)) // index is checked for its validity in QListWidget::itemFromIndex() @@ -117,6 +202,8 @@ else item->setHidden (true); }); + + lw_->installEventFilter (this); } /*************************/ SidePane::~SidePane() @@ -129,6 +216,22 @@ } } /*************************/ +bool SidePane::eventFilter (QObject *watched, QEvent *event) +{ + if (watched == lw_ && event->type() == QEvent::KeyPress) + { // when a text is typed inside the list, type it inside the filter line-edit too + if (QKeyEvent *ke = static_cast(event)) + { + if (ke->key() < Qt::Key_Home || ke->key() > Qt::Key_PageDown) + { + le_->pressKey (ke); + return true; // don't change the selection + } + } + } + return QWidget::eventFilter (watched, event); +} +/*************************/ void SidePane::filter (const QString&/*text*/) { if (!filterTimer_) @@ -145,15 +248,15 @@ // for their correspondence with tab pages. void SidePane::reallyApplyFilter() { - for (int i = 0; i < lw_->count(); ++i) - { + for (int i = lw_->count() - 1; i >= 0; --i) + { // from end to start for the scrollbar to have a correct position QListWidgetItem *wi = lw_->item (i); if (wi->text().contains (le_->text(), Qt::CaseInsensitive)) wi->setHidden (false); else wi->setHidden (true); } - lw_->scrollToItem (lw_->currentItem()); + lw_->scrollToCurrentItem(); } /*************************/ void SidePane::onRowsInserted (int start, int end) @@ -164,5 +267,11 @@ lw_->item (i)->setHidden (true); } } +/*************************/ +void SidePane::lockPane (bool lock) +{ + lw_ ->lockListWidget (lock); + le_->setEnabled (!lock); +} } diff -Nru featherpad-0.12.1/featherpad/sidepane.h featherpad-0.17.1/featherpad/sidepane.h --- featherpad-0.12.1/featherpad/sidepane.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/sidepane.h 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2017 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2017-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -22,35 +22,61 @@ #include #include +#include #include #include "lineedit.h" namespace FeatherPad { -/* In the single-selection mode, we don't want Ctrl + left click to - deselect an item or an item to be selected with the middle click. */ +/* For having control over sorting. */ +class ListWidgetItem : public QListWidgetItem +{ +public: + ListWidgetItem (const QIcon &icon, const QString &text, QListWidget *parent = nullptr, int type = QListWidgetItem::Type) : + QListWidgetItem (icon, text, parent, type) { + collator_.setNumericMode (true); + } + ListWidgetItem (const QString &text, QListWidget *parent = nullptr, int type = QListWidgetItem::Type) : + QListWidgetItem (text, parent, type) { + collator_.setNumericMode (true); + } + + bool operator<(const QListWidgetItem &other) const override; + +private: + QCollator collator_; +}; + class ListWidget : public QListWidget { Q_OBJECT public: - ListWidget (QWidget *parent = nullptr) : QListWidget (parent) { - setMouseTracking (true); // for instant tooltips - } + ListWidget (QWidget *parent = nullptr); QListWidgetItem *getItemFromIndex (const QModelIndex &index) const; + void scrollToCurrentItem(); + + void lockListWidget (bool lock) { + locked_ = lock; + } + signals: void closeItem (QListWidgetItem *item); void closeSidePane(); + void currentItemUpdated (QListWidgetItem *current); void rowsAreInserted (int start, int end); protected: - virtual QItemSelectionModel::SelectionFlags selectionCommand (const QModelIndex &index, const QEvent *event = nullptr) const; - virtual void mousePressEvent (QMouseEvent *event); - virtual void mouseMoveEvent (QMouseEvent *event); // for instant tooltips + QItemSelectionModel::SelectionFlags selectionCommand (const QModelIndex &index, const QEvent *event = nullptr) const override; + void mousePressEvent (QMouseEvent *event) override; + void mouseMoveEvent (QMouseEvent *event) override; // for instant tooltips protected slots: - virtual void rowsInserted (const QModelIndex &parent, int start, int end); + void rowsInserted (const QModelIndex &parent, int start, int end) override; + +private: + bool locked_; }; class SidePane : public QWidget @@ -64,6 +90,11 @@ return lw_; } + void lockPane (bool lock); + +protected: + bool eventFilter (QObject *watched, QEvent *event); + private slots: void filter (const QString&); void reallyApplyFilter(); diff -Nru featherpad-0.12.1/featherpad/singleton.cpp featherpad-0.17.1/featherpad/singleton.cpp --- featherpad-0.12.1/featherpad/singleton.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/singleton.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2019 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -17,6 +17,7 @@ * @license GPL-3.0+ */ +#include #include #include #include @@ -24,16 +25,10 @@ #include #include -#if defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_HURD +#if defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_NETBSD || defined Q_OS_HURD #include // for geteuid() #endif -#ifdef HAS_X11 -#if defined Q_WS_X11 || defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_HURD -#include -#endif -#endif - #include "singleton.h" #ifdef HAS_X11 @@ -42,19 +37,20 @@ namespace FeatherPad { -FPsingleton::FPsingleton (int &argc, char **argv) : QApplication (argc, argv) +FPsingleton::FPsingleton (int &argc, char **argv, bool standalone) : QApplication (argc, argv) { #ifdef HAS_X11 - // For now, the lack of x11 is seen as wayland. -#if defined Q_WS_X11 || defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_HURD - isX11_ = QX11Info::isPlatformX11(); -#else - isX11_ = false; -#endif // defined Q_WS_X11... + isX11_ = (QString::compare (QGuiApplication::platformName(), "xcb", Qt::CaseInsensitive) == 0); #else isX11_ = false; -#endif // HAS_X11 +#endif + + if (isX11_) + isWayland_ = false; + else + isWayland_ = (QString::compare (QGuiApplication::platformName(), "wayland", Qt::CaseInsensitive) == 0); + standalone_ = standalone; socketFailure_ = false; config_.readConfig(); lastFiles_ = config_.getLastFiles(); @@ -63,6 +59,13 @@ else searchModel_ = nullptr; + if (standalone) + { + lockFile_ = nullptr; + localServer_ = nullptr; + return; + } + /* Instead of QSharedMemory, a lock file is used for creating a single instance because QSharedMemory not only would be unsafe with a crash but also might persist without a crash and even after being attached and detached, resulting in an unchangeable state. */ @@ -75,12 +78,12 @@ if (lockFile_->tryLock()) { // create a local server and listen to incoming messages from other instances - localServer = new QLocalServer (this); - connect (localServer, &QLocalServer::newConnection, this, &FPsingleton::receiveMessage); - if (!localServer->listen (uniqueKey_)) + localServer_ = new QLocalServer (this); + connect (localServer_, &QLocalServer::newConnection, this, &FPsingleton::receiveMessage); + if (!localServer_->listen (uniqueKey_)) { - if (localServer->removeServer (uniqueKey_)) - localServer->listen (uniqueKey_); + if (localServer_->removeServer (uniqueKey_)) + localServer_->listen (uniqueKey_); else qDebug ("Unable to remove server instance (from a previous crash)."); } @@ -88,7 +91,7 @@ else { delete lockFile_; lockFile_ = nullptr; - localServer = nullptr; + localServer_ = nullptr; } } /*************************/ @@ -110,13 +113,13 @@ /*************************/ void FPsingleton::receiveMessage() { - QLocalSocket *localSocket = localServer->nextPendingConnection(); + QLocalSocket *localSocket = localServer_->nextPendingConnection(); if (!localSocket) { qDebug ("Unable to find local socket."); return; } - if (!localSocket->waitForReadyRead (timeout)) + if (!localSocket->waitForReadyRead (timeout_)) { qDebug ("%s", (const char *) localSocket->errorString().toLatin1()); return; @@ -128,23 +131,26 @@ } /*************************/ // A new instance will be started only if this function returns false. -bool FPsingleton::sendMessage (const QString &message) +bool FPsingleton::sendMessage (const QString& message) { - if (localServer != nullptr) // no other instance was running + if (standalone_ // it's standalone or... + || localServer_ != nullptr) // ... no other instance was running + { return false; + } QLocalSocket localSocket (this); localSocket.connectToServer (uniqueKey_, QIODevice::WriteOnly); /* NOTE: If "QStandardPaths::TempLocation" isn't on RAM, the socket may not be ready yet. So, we retry a few times to make sure this isn't about a crash. */ int waiting = 0; - while (waiting < 5 && !localSocket.waitForConnected (timeout)) + while (waiting < 5 && !localSocket.waitForConnected (timeout_)) { QThread::msleep(500); localSocket.connectToServer (uniqueKey_, QIODevice::WriteOnly); ++ waiting; } - if (waiting == 5 && !localSocket.waitForConnected (timeout)) + if (waiting == 5 && !localSocket.waitForConnected (timeout_)) { socketFailure_ = true; qDebug ("%s", (const char *) localSocket.errorString().toLatin1()); @@ -152,7 +158,7 @@ } localSocket.write (message.toUtf8()); - if (!localSocket.waitForBytesWritten (timeout)) + if (!localSocket.waitForBytesWritten (timeout_)) { socketFailure_ = true; qDebug ("%s", (const char *) localSocket.errorString().toLatin1()); @@ -207,20 +213,30 @@ /*************************/ QStringList FPsingleton::processInfo (const QString& message, long &desktop, int& lineNum, int& posInLine, - bool *newWin) + bool *newWindow) { desktop = -1; lineNum = 0; // no cursor placing posInLine = 0; QStringList sl = message.split ("\n\r"); // "\n\r" was used as the splitter - if (sl.count() < 2) // impossible because "\n\r" is appended to desktop number + if (sl.count() < 3) // impossible because "\n\r" is appended to desktop number plus current directory { - *newWin = true; + *newWindow = true; return QStringList(); } - *newWin = false; desktop = sl.at (0).toInt(); sl.removeFirst(); + QDir curDir (sl.at (0)); + sl.removeFirst(); + if (standalone_) + { + *newWindow = true; + sl.removeFirst(); // "--standalone" is always the first optionn + if (sl.isEmpty()) + return QStringList(); + } + else + *newWindow = false; bool hasCurInfo = cursorInfo (sl.at (0), lineNum, posInLine); if (hasCurInfo) { @@ -229,7 +245,7 @@ { // check if the second option is --win/-w if (sl.at (0) == "--win" || sl.at (0) == "-w") { - *newWin = true; + *newWindow = true; sl.removeFirst(); } } @@ -237,7 +253,7 @@ // check if the first option is --win/-w else if (sl.at (0) == "--win" || sl.at (0) == "-w") { - *newWin = true; + *newWindow = true; sl.removeFirst(); if (!sl.isEmpty()) hasCurInfo = cursorInfo (sl.at (0), lineNum, posInLine); @@ -245,14 +261,27 @@ sl.removeFirst(); } - if (sl.isEmpty()) + /* always return absolute clean paths (works around KDE's double slash bug too) */ + QStringList filesList; + for (const auto &path : qAsConst (sl)) { - if (hasCurInfo) - qDebug ("FeatherPad: File path/name is missing."); + if (!path.isEmpty()) // no empty path/name + { + QString realPath = path; + QString scheme = QUrl (realPath).scheme(); + if (scheme == "file") + realPath = QUrl (realPath).toLocalFile(); + else if (scheme == "admin") // gvfs' "admin:///" + realPath = QUrl (realPath).path(); + else if (!scheme.isEmpty()) + continue; + realPath = curDir.absoluteFilePath (realPath); // also works with absolute paths outside curDir + filesList << QDir::cleanPath (realPath); + } } - else if (sl.count() == 1 && sl.at (0).isEmpty()) - sl.clear(); // no empty path/name - return sl; + if (filesList.isEmpty() && hasCurInfo) + qDebug ("FeatherPad: File path/name is missing."); + return filesList; } /*************************/ void FPsingleton::firstWin (const QString& message) @@ -263,7 +292,7 @@ const QStringList filesList = processInfo (message, d, lineNum, posInLine, &openNewWin); if (config_.getOpenInWindows() && !filesList.isEmpty()) { - for (auto file : filesList) + for (const auto &file : filesList) newWin (QStringList() << file, lineNum, posInLine); } else @@ -274,11 +303,11 @@ FPwin* FPsingleton::newWin (const QStringList& filesList, int lineNum, int posInLine) { - FPwin *fp = new FPwin; + FPwin *fp = new FPwin (nullptr, standalone_); fp->show(); if (socketFailure_) fp->showCrashWarning(); -#if defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_HURD +#if defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_NETBSD || defined Q_OS_HURD else if (geteuid() == 0) fp->showRootWarning(); #endif @@ -325,8 +354,9 @@ sr = pScreen->virtualGeometry(); for (int i = 0; i < Wins.count(); ++i) { + FPwin *thisWin = Wins.at (i); #ifdef HAS_X11 - WId id = Wins.at (i)->winId(); + WId id = thisWin->winId(); long whichDesktop = -1; if (isX11_) whichDesktop = onWhichDesktop (id); @@ -334,50 +364,50 @@ /* if the command is issued from where a FeatherPad window exists and if that window isn't minimized and doesn't have a modal dialog... */ - if (!isX11_ // always open a new tab on wayland + if (!isX11_ // always open a new tab if we aren't on x11 #ifdef HAS_X11 || ((whichDesktop == d /* if a window is created a moment ago, it should be on the current desktop but may not report that yet */ || whichDesktop == -1) - && (!Wins.at (i)->isMinimized() || isWindowShaded (id))) + && (!thisWin->isMinimized() || isWindowShaded (id))) #endif ) { - bool hasDialog = false; - QList dialogs = Wins.at (i)->findChildren(); - for (int j = 0; j < dialogs.count(); ++j) + bool hasDialog = thisWin->isLocked(); + if (!hasDialog) { - if (dialogs.at (j)->objectName() != "processDialog" - && dialogs.at (j)->objectName() != "sessionDialog") + QList dialogs = thisWin->findChildren(); + for (int j = 0; j < dialogs.count(); ++j) { - hasDialog = true; - break; + if (dialogs.at (j)->isModal()) + { + hasDialog = true; + break; + } } } if (hasDialog) continue; /* consider viewports too, so that if more than half of the width as well as the height of the window is inside the current viewport (of the current desktop), open a new tab */ - QRect g = Wins.at (i)->geometry(); - if (g.x() + g.width()/2 >= sr.left() && g.x() + g.width()/2 < sr.left() + sr.width() - && g.y() + g.height()/2 >= sr.top() && g.y() + g.height()/2 < sr.top() + sr.height()) + if (sr.contains (thisWin->geometry().center())) { if (d >= 0) // it may be -1 for some DEs that don't support _NET_CURRENT_DESKTOP { /* first, pretend to KDE that a new window is created (without this, the next new window would open on a wrong desktop) */ - Wins.at (i)->dummyWidget->showMinimized(); - QTimer::singleShot (0, Wins.at (i)->dummyWidget, &QWidget::close); + thisWin->dummyWidget->showMinimized(); + QTimer::singleShot (0, thisWin->dummyWidget, &QWidget::close); } /* and then, open tab(s) in the current FeatherPad window... */ if (filesList.isEmpty()) - Wins.at (i)->newTab(); + thisWin->newTab(); else { - bool multiple (filesList.count() > 1 || Wins.at (i)->isLoading()); + bool multiple (filesList.count() > 1 || thisWin->isLoading()); for (int j = 0; j < filesList.count(); ++j) - Wins.at (i)->newTabFromName (filesList.at (j), lineNum, posInLine, multiple); + thisWin->newTabFromName (filesList.at (j), lineNum, posInLine, multiple); } found = true; break; @@ -390,7 +420,7 @@ /* ... otherwise, open a new window */ if (config_.getOpenInWindows() && !filesList.isEmpty()) { - for (auto file : filesList) + for (const auto &file : filesList) newWin (QStringList() << file, lineNum, posInLine); } else diff -Nru featherpad-0.12.1/featherpad/singleton.h featherpad-0.17.1/featherpad/singleton.h --- featherpad-0.12.1/featherpad/singleton.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/singleton.h 2021-01-06 17:57:35.000000000 +0000 @@ -33,10 +33,10 @@ { Q_OBJECT public: - FPsingleton (int &argc, char **argv); + FPsingleton (int &argc, char **argv, bool standalone); ~FPsingleton(); - bool sendMessage (const QString &message); + bool sendMessage (const QString& message); void firstWin(const QString& message); FPwin* newWin (const QStringList &filesList = QStringList(), int lineNum = 0, int posInLine = 0); @@ -50,6 +50,9 @@ bool isX11() const { return isX11_; } + bool isWayland() const { + return isWayland_; + } QStandardItemModel *searchModel() const { return searchModel_; } @@ -60,23 +63,26 @@ void quitting(); signals: - void messageReceived (QString message); + void messageReceived (const QString& message); private: - bool cursorInfo(const QString &commndOpt, int& lineNum, int& posInLine); + bool cursorInfo (const QString& commndOpt, int& lineNum, int& posInLine); QStringList processInfo (const QString& message, long &desktop, int& lineNum, int& posInLine, - bool *newWin); + bool *newWindow); QString uniqueKey_; QLockFile *lockFile_; - QLocalServer *localServer; - static const int timeout = 1000; + QLocalServer *localServer_; + static const int timeout_ = 1000; Config config_; QStringList lastFiles_; bool isX11_; + bool isWayland_; bool socketFailure_; QStandardItemModel *searchModel_; // The common search history if any. + + bool standalone_; // Whether this is a standalone instance. }; } diff -Nru featherpad-0.12.1/featherpad/spellChecker.cpp featherpad-0.17.1/featherpad/spellChecker.cpp --- featherpad-0.12.1/featherpad/spellChecker.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/spellChecker.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -21,7 +21,6 @@ #include #include -#include #include #include @@ -85,7 +84,7 @@ { const std::vector strSuggestions = hunspell_->suggest (word.toStdString()); QStringList suggestions; - for (auto str : strSuggestions) + for (const auto &str : strSuggestions) suggestions << QString::fromStdString (str); return suggestions; } diff -Nru featherpad-0.12.1/featherpad/spellChecker.h featherpad-0.17.1/featherpad/spellChecker.h --- featherpad-0.12.1/featherpad/spellChecker.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/spellChecker.h 2021-01-06 17:57:35.000000000 +0000 @@ -22,6 +22,7 @@ #include #include +#include class Hunspell; diff -Nru featherpad-0.12.1/featherpad/syntax.cpp featherpad-0.17.1/featherpad/syntax.cpp --- featherpad-0.12.1/featherpad/syntax.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/syntax.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -38,7 +38,7 @@ bool enableSH = ui->actionSyntax->isChecked(); if (enableSH) - waitToMakeBusy(); // it may take a while with huge texts + makeBusy(); // it may take a while with huge texts for (int i = 0; i < count; ++i) { @@ -46,14 +46,11 @@ syntaxHighlighting (textEdit, enableSH, textEdit->getLang()); } - if (QToolButton *langButton = ui->statusBar->findChild("langButton")) - langButton->setEnabled (enableSH); + if (TabPage *tabPage = qobject_cast< TabPage *>(ui->tabWidget->currentWidget())) + updateLangBtn (tabPage->textEdit()); if (enableSH) - { - QCoreApplication::processEvents(); - unbusy(); - } + QTimer::singleShot (0, this, &FPwin::unbusy); } /*************************/ // Never returns an empty string; falls back to "url". @@ -97,6 +94,8 @@ progLan = "qmake"; else if (fname.endsWith (".tr") || fname.endsWith (".t") || fname.endsWith (".roff")) progLan = "troff"; + else if (fname.endsWith (".tex") || fname.endsWith (".ltx") || fname.endsWith (".latex") || fname.endsWith (".lyx")) + progLan = "LaTeX"; else if (fname.endsWith (".xml", Qt::CaseInsensitive) || fname.endsWith (".svg", Qt::CaseInsensitive) || fname.endsWith (".qrc") || fname.endsWith (".meta4", Qt::CaseInsensitive) || fname.endsWith (".metalink", Qt::CaseInsensitive) /*|| fname.endsWith (".ui")*/ || fname.endsWith (".rdf") || fname.endsWith (".docbook") || fname.endsWith (".fnx") @@ -112,10 +111,11 @@ else if (fname.endsWith (".kvconfig") || fname.endsWith (".service") || fname.endsWith (".mount") || fname.endsWith (".timer") // systemd related || baseName == "sources.list" || baseName == "sources.list.save" - || baseName == "mimeinfo.cache" || baseName == "mimeapps.list" || baseName.endsWith ("-mimeapps.list") + || baseName == "mimeinfo.cache" || baseName == "defaults.list" + || baseName == "mimeapps.list" || baseName.endsWith ("-mimeapps.list") || fname.endsWith (".pls", Qt::CaseInsensitive)) progLan = "config"; - else if (fname.endsWith (".js")) + else if (fname.endsWith (".js") || fname.endsWith (".hx")) progLan = "javascript"; else if (fname.endsWith (".qml")) progLan = "qml"; @@ -197,6 +197,8 @@ progLan = "qmake"; else if (mime == "text/troff") progLan = "troff"; + else if (mime == "text/x-tex" || mime == "application/x-lyx") + progLan = "LaTeX"; else if (mime == "application/xml" || mime == "image/svg+xml" || mime == "application/x-designer" || mime == "application/metalink4+xml" || mime == "application/metalink+xml" || mime == "application/x-gtk-builder" || mime == "text/rdf+xml" || mime == "application/rdf+xml" @@ -289,19 +291,27 @@ Highlighter *highlighter = new Highlighter (textEdit->document(), progLan, start, end, textEdit->hasDarkScheme(), config.getShowWhiteSpace(), - config.getShowEndings()); + config.getShowEndings(), + config.getWhiteSpaceValue(), + config.customSyntaxColors().isEmpty() + ? textEdit->hasDarkScheme() ? config.darkSyntaxColors() + : config.lightSyntaxColors() + : config.customSyntaxColors()); textEdit->setHighlighter (highlighter); } /* if the highlighter is created just now, it's necessary to wait until the text is completely loaded */ QTimer::singleShot (0, textEdit, [this, textEdit]() { if (textEdit->isVisible()) + { + formatTextRect(); // the text may be scrolled immediately after syntax highlighting (when reloading) matchBrackets(); // in case the cursor is beside a bracket when the text is loaded + } connect (textEdit, &TextEdit::updateBracketMatching, this, &FPwin::matchBrackets); /* visible text may change on block removal */ connect (textEdit, &QPlainTextEdit::blockCountChanged, this, &FPwin::formatOnBlockChange); - connect (textEdit, &TextEdit::updateRect, this, &FPwin::formatVisibleText); - connect (textEdit, &TextEdit::resized, this, &FPwin::formatOnResizing); + connect (textEdit, &TextEdit::updateRect, this, &FPwin::formatTextRect); + connect (textEdit, &TextEdit::resized, this, &FPwin::formatTextRect); /* this is needed when the whole visible text is pasted */ connect (textEdit->document(), &QTextDocument::contentsChange, this, &FPwin::formatOnTextChange); }); @@ -309,8 +319,8 @@ else if (Highlighter *highlighter = qobject_cast< Highlighter *>(textEdit->getHighlighter())) { disconnect (textEdit->document(), &QTextDocument::contentsChange, this, &FPwin::formatOnTextChange); - disconnect (textEdit, &TextEdit::resized, this, &FPwin::formatOnResizing); - disconnect (textEdit, &TextEdit::updateRect, this, &FPwin::formatVisibleText); + disconnect (textEdit, &TextEdit::resized, this, &FPwin::formatTextRect); + disconnect (textEdit, &TextEdit::updateRect, this, &FPwin::formatTextRect); disconnect (textEdit, &QPlainTextEdit::blockCountChanged, this, &FPwin::formatOnBlockChange); disconnect (textEdit, &TextEdit::updateBracketMatching, this, &FPwin::matchBrackets); @@ -339,32 +349,19 @@ { /* wait until the document's layout manager is notified about the change; otherwise, the end cursor might be out of range in formatTextRect() */ - QTimer::singleShot (0, this, &FPwin::formatOnResizing); + QTimer::singleShot (0, this, &FPwin::formatTextRect); } } /*************************/ void FPwin::formatOnBlockChange (int/* newBlockCount*/) const { - formatOnResizing(); -} -/*************************/ -void FPwin::formatVisibleText (const QRect &rect, int dy) const -{ - if (dy == 0) return; - formatTextRect (rect); -} -/*************************/ -void FPwin::formatOnResizing() const -{ - int index = ui->tabWidget->currentIndex(); - if (index == -1) return; - - TextEdit *textEdit = qobject_cast< TabPage *>(ui->tabWidget->widget (index))->textEdit(); - formatTextRect (textEdit->rect()); + formatTextRect(); } /*************************/ -void FPwin::formatTextRect (QRect rect) const +void FPwin::formatTextRect() const { + /* It's supposed that this function is called for the current tab. + That isn't always the case and won't do any harm if it isn't. */ if (TabPage *tabPage = qobject_cast(ui->tabWidget->currentWidget())) { TextEdit *textEdit = tabPage->textEdit(); @@ -373,7 +370,7 @@ QPoint Point (0, 0); QTextCursor start = textEdit->cursorForPosition (Point); - Point = QPoint (rect.width(), rect.height()); + Point = QPoint (textEdit->width(), textEdit->height()); QTextCursor end = textEdit->cursorForPosition (Point); highlighter->setLimit (start, end); diff -Nru featherpad-0.12.1/featherpad/tabbar.cpp featherpad-0.17.1/featherpad/tabbar.cpp --- featherpad-0.12.1/featherpad/tabbar.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/tabbar.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -34,14 +34,14 @@ setMouseTracking (true); setElideMode (Qt::ElideMiddle); // works with minimumTabSizeHint() hideSingle_ = false; - lock_ = false; + locked_ = false; dragStarted_ = false; // not needed noTabDND_ = false; } /*************************/ void TabBar::mousePressEvent (QMouseEvent *event) { - if (lock_) + if (locked_) { event->ignore(); return; @@ -61,7 +61,7 @@ void TabBar::mouseReleaseEvent (QMouseEvent *event) { QTabBar::mouseReleaseEvent (event); - if (event->button() == Qt::MidButton) + if (event->button() == Qt::MiddleButton) { int index = tabAt (event->pos()); if (index > -1) @@ -79,8 +79,6 @@ dragStarted_ = true; } - /* since Wayland has a serious issue related to QDrag that interferes with - dropping tabs outside all windows, we don't enable tab DND without X11 */ if (!noTabDND_ && (event->buttons() & Qt::LeftButton) && dragStarted_ @@ -125,7 +123,7 @@ } else { - QTabBar::mouseMoveEvent(event); + QTabBar::mouseMoveEvent (event); int index = tabAt (event->pos()); if (index > -1) QToolTip::showText (event->globalPos(), tabToolTip (index)); @@ -149,7 +147,7 @@ /*************************/ void TabBar::wheelEvent (QWheelEvent *event) { - if (!lock_) + if (!locked_) QTabBar::wheelEvent (event); else event->ignore(); diff -Nru featherpad-0.12.1/featherpad/tabbar.h featherpad-0.17.1/featherpad/tabbar.h --- featherpad-0.12.1/featherpad/tabbar.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/tabbar.h 2021-01-06 17:57:35.000000000 +0000 @@ -41,7 +41,7 @@ } void lockTabs (bool lock) { - lock_ = lock; + locked_ = lock; } void noTabDND() { @@ -55,21 +55,21 @@ protected: /* from qtabbar.cpp */ - virtual void mousePressEvent (QMouseEvent *event); - virtual void mouseReleaseEvent (QMouseEvent *event); - virtual void mouseMoveEvent (QMouseEvent *event); - virtual bool event (QEvent *event); - virtual void wheelEvent (QWheelEvent *event); - virtual QSize tabSizeHint(int index) const; - virtual QSize minimumTabSizeHint (int index) const; - void tabRemoved (int); - void tabInserted (int); + void mousePressEvent (QMouseEvent *event) override; + void mouseReleaseEvent (QMouseEvent *event) override; + void mouseMoveEvent (QMouseEvent *event) override; + bool event (QEvent *event) override; + void wheelEvent (QWheelEvent *event) override; + QSize tabSizeHint (int index) const override; + QSize minimumTabSizeHint (int index) const override; + void tabRemoved (int index) override; + void tabInserted (int index) override; private: QPoint dragStartPosition_; bool dragStarted_; bool hideSingle_; - bool lock_; + bool locked_; bool noTabDND_; }; diff -Nru featherpad-0.12.1/featherpad/tabpage.cpp featherpad-0.17.1/featherpad/tabpage.cpp --- featherpad-0.12.1/featherpad/tabpage.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/tabpage.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -56,7 +56,7 @@ searchBar_->focusLineEdit(); } /*************************/ -bool TabPage::searchBarHasFocus() +bool TabPage::searchBarHasFocus() const { return searchBar_->lineEditHasFocus(); } @@ -86,9 +86,20 @@ return searchBar_->matchRegex(); } /*************************/ +bool TabPage::hasPopup() const +{ + return searchBar_->hasPopup(); +} +/*************************/ void TabPage::updateShortcuts (bool disable) { searchBar_->updateShortcuts (disable); } +/*************************/ +void TabPage::lockPage (bool lock) +{ + searchBar_->setEnabled (!lock); + textEdit_->setEnabled (!lock); +} } diff -Nru featherpad-0.12.1/featherpad/tabpage.h featherpad-0.17.1/featherpad/tabpage.h --- featherpad-0.12.1/featherpad/tabpage.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/tabpage.h 2021-01-06 17:57:35.000000000 +0000 @@ -45,7 +45,7 @@ void setSearchBarVisible (bool visible); bool isSearchBarVisible() const; void focusSearchBar(); - bool searchBarHasFocus(); + bool searchBarHasFocus() const; QString searchEntry() const; void clearSearchEntry(); @@ -54,8 +54,12 @@ bool matchWhole() const; bool matchRegex() const; + bool hasPopup() const; + void updateShortcuts (bool disable); + void lockPage (bool lock); + signals: void find (bool forward); void searchFlagChanged(); diff -Nru featherpad-0.12.1/featherpad/textedit.cpp featherpad-0.17.1/featherpad/textedit.cpp --- featherpad-0.12.1/featherpad/textedit.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/textedit.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -36,21 +36,47 @@ namespace FeatherPad { +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) +// To work around a nasty bug in Qt 5.14.0 +static QColor overlayColor (const QColor& bgCol, const QColor& overlayCol) +{ + if (!overlayCol.isValid()) return QColor(0,0,0); + if (!bgCol.isValid()) return overlayCol; + + qreal a1 = overlayCol.alphaF(); + if (a1 == 1.0) return overlayCol; + qreal a0 = bgCol.alphaF(); + qreal a = (1.0 - a1) * a0 + a1; + + QColor res; + res.setAlphaF(a); + res.setRedF (((1.0 - a1) * a0 * bgCol.redF() + a1 * overlayCol.redF()) / a); + res.setGreenF (((1.0 - a1) * a0 *bgCol.greenF() + a1 * overlayCol.greenF()) / a); + res.setBlueF (((1.0 - a1) * a0 * bgCol.blueF() + a1 * overlayCol.blueF()) / a); + + return res; +} +#endif + TextEdit::TextEdit (QWidget *parent, int bgColorValue) : QPlainTextEdit (parent) { - prevAnchor = prevPos = -1; - autoIndentation = true; - autoReplace = true; - autoBracket = false; - scrollJumpWorkaround = false; - drawIndetLines = false; + prevAnchor_ = prevPos_ = -1; + widestDigit_ = 0; + autoIndentation_ = true; + autoReplace_ = true; + autoBracket_ = false; + drawIndetLines_ = false; saveCursor_ = false; + pastePaths_ = false; vLineDistance_ = 0; matchedBrackets_ = false; inertialScrolling_ = false; scrollTimer_ = nullptr; + keepTxtCurHPos_ = false; + txtCurHPos_ = -1; + prog_ = "url"; // the default language textTab_ = " "; // the default text tab is four spaces @@ -66,10 +92,7 @@ bgColorValue = 230; if (bgColorValue < 230) { - darkValue = bgColorValue; - /* a quadratic equation for bgColorValue -> opacity: 0 -> 20, 27 -> 8, 50 -> 2 */ - int opacity = qBound (1, qRound (static_cast(bgColorValue * (19 * bgColorValue - 2813)) / static_cast(5175)) + 20, 30); - lineHColor = QColor (255, 255, 255, opacity); + darkValue_ = bgColorValue; viewport()->setStyleSheet (QString (".QWidget {" "color: white;" "background-color: rgb(%1, %1, %1);}") @@ -91,11 +114,14 @@ setPalette (p); } } + /* Use alpha in paintEvent to gray out the paragraph separators and + document terminators. The real text will be formatted by the highlgihter. */ + separatorColor_ = Qt::white; + separatorColor_.setAlpha (90 - qRound (3 * static_cast(darkValue_) / 5)); } else { - darkValue = -1; - lineHColor = QColor (0, 0, 0, 4); + darkValue_ = -1; viewport()->setStyleSheet (QString (".QWidget {" "color: black;" "background-color: rgb(%1, %1, %1);}") @@ -117,12 +143,20 @@ setPalette (p); } } + separatorColor_ = Qt::black; + separatorColor_.setAlpha (2 * qRound (static_cast(bgColorValue) / 5) - 32); } - bgColorValue_ = bgColorValue; + setCurLineHighlight (-1); + +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) + separatorColor_ = overlayColor (QColor (bgColorValue, bgColorValue, bgColorValue), separatorColor_); +#endif - resizeTimerId = 0; - updateTimerId = 0; - Dy = 0; + resizeTimerId_ = 0; + selectionTimerId_ = 0; + selectionHighlighting_ = false; + highlightThisSelection_ = true; + removeSelectionHighlights_ = false; size_ = 0; wordNumber_ = -1; // not calculated yet encoding_= "UTF-8"; @@ -134,27 +168,46 @@ VScrollBar *vScrollBar = new VScrollBar; setVerticalScrollBar (vScrollBar); -#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0)) +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) /* a (temporary) workaround for Qt's horizontal scrollbar bug */ HScrollBar *hScrollBar = new HScrollBar; setHorizontalScrollBar (hScrollBar); #endif - lineNumberArea = new LineNumberArea (this); - lineNumberArea->setToolTip (tr ("Double click to center current line")); - lineNumberArea->hide(); - lineNumberArea->installEventFilter (this); + lineNumberArea_ = new LineNumberArea (this); + lineNumberArea_->setToolTip (tr ("Double click to center current line")); + lineNumberArea_->hide(); + lineNumberArea_->installEventFilter (this); connect (this, &QPlainTextEdit::updateRequest, this, &TextEdit::onUpdateRequesting); - connect (this, &QPlainTextEdit::cursorPositionChanged, this, &TextEdit::updateBracketMatching); + connect (this, &QPlainTextEdit::cursorPositionChanged, [this] { + if (!keepTxtCurHPos_) + txtCurHPos_ = -1; // forget the last cursor position if it shouldn't be remembered + emit updateBracketMatching(); + }); connect (this, &QPlainTextEdit::selectionChanged, this, &TextEdit::onSelectionChanged); setContextMenuPolicy (Qt::CustomContextMenu); } /*************************/ +void TextEdit::setCurLineHighlight (int value) +{ + if (value >= 0 && value <= 255) + lineHColor_ = QColor (value, value, value); + else if (darkValue_ == -1) + lineHColor_ = QColor (0, 0, 0, 4); + else + { + /* a quadratic equation for darkValue_ -> opacity: 0 -> 20, 27 -> 8, 50 -> 2 */ + int opacity = qBound (1, qRound (static_cast(darkValue_ * (19 * darkValue_ - 2813)) / static_cast(5175)) + 20, 30); + lineHColor_ = QColor (255, 255, 255, opacity); + + } +} +/*************************/ bool TextEdit::eventFilter (QObject *watched, QEvent *event) { - if (watched == lineNumberArea && event->type() == QEvent::Wheel) + if (watched == lineNumberArea_ && event->type() == QEvent::Wheel) { if (QWheelEvent *we = static_cast(event)) { @@ -175,13 +228,7 @@ /* we want consistent tabs */ QFontMetricsF metrics (f); QTextOption opt = document()->defaultTextOption(); -#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0)) opt.setTabStopDistance (metrics.horizontalAdvance (textTab_)); -#elif (QT_VERSION >= QT_VERSION_CHECK(5,10,0)) - opt.setTabStopDistance (metrics.width (textTab_)); -#else - opt.setTabStop (metrics.width (textTab_)); -#endif document()->setDefaultTextOption (opt); /* the line number is bold only for the current line */ @@ -189,25 +236,21 @@ if (f.bold()) { F.setBold (false); - lineNumberArea->setFont (F); + lineNumberArea_->setFont (F); } else - lineNumberArea->setFont (f); + lineNumberArea_->setFont (f); /* find the widest digit (used in calculating line number area width)*/ F.setBold (true); // it's bold for the current line - widestDigit = 0; + widestDigit_ = 0; int maxW = 0; for (int i = 0; i < 10; ++i) { -#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0)) - int w = QFontMetrics (F).horizontalAdvance (QString::number (i)); -#else - int w = QFontMetrics (F).width (QString::number (i)); -#endif + int w = QFontMetrics (F).horizontalAdvance (locale().toString (i)); if (w > maxW) { maxW = w; - widestDigit = i; + widestDigit_ = i; } } } @@ -220,14 +263,14 @@ scrollTimer_->stop(); delete scrollTimer_; } - delete lineNumberArea; + delete lineNumberArea_; } /*************************/ void TextEdit::showLineNumbers (bool show) { if (show) { - lineNumberArea->show(); + lineNumberArea_->show(); connect (this, &QPlainTextEdit::blockCountChanged, this, &TextEdit::updateLineNumberAreaWidth); connect (this, &QPlainTextEdit::updateRequest, this, &TextEdit::updateLineNumberArea); connect (this, &QPlainTextEdit::cursorPositionChanged, this, &TextEdit::highlightCurrentLine); @@ -241,20 +284,20 @@ disconnect (this, &QPlainTextEdit::updateRequest, this, &TextEdit::updateLineNumberArea); disconnect (this, &QPlainTextEdit::cursorPositionChanged, this, &TextEdit::highlightCurrentLine); - lineNumberArea->hide(); + lineNumberArea_->hide(); setViewportMargins (0, 0, 0, 0); QList es = extraSelections(); - if (!es.isEmpty() && !currentLine.cursor.isNull()) + if (!es.isEmpty() && !currentLine_.cursor.isNull()) es.removeFirst(); setExtraSelections (es); - currentLine.cursor = QTextCursor(); // nullify currentLine - lastCurrentLine = QRect(); + currentLine_.cursor = QTextCursor(); // nullify currentLine_ + lastCurrentLine_ = QRect(); } } /*************************/ int TextEdit::lineNumberAreaWidth() { - QString digit = QString::number (widestDigit); + QString digit = locale().toString (widestDigit_); QString num = digit; int max = qMax (1, blockCount()); while (max >= 10) @@ -264,11 +307,7 @@ } QFont f = font(); f.setBold (true); -#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0)) return (6 + QFontMetrics (f).horizontalAdvance (num)); // 6 = 3 + 3 (-> lineNumberAreaPaintEvent) -#else - return (6 + QFontMetrics (f).width (num)); -#endif } /*************************/ void TextEdit::updateLineNumberAreaWidth (int /* newBlockCount */) @@ -282,13 +321,13 @@ void TextEdit::updateLineNumberArea (const QRect &rect, int dy) { if (dy) - lineNumberArea->scroll (0, dy); + lineNumberArea_->scroll (0, dy); else { /* since the current line number is distinguished from other numbers, its rectangle should be updated also when the line is wrapped */ - if (lastCurrentLine.isValid()) - lineNumberArea->update (0, lastCurrentLine.y(), lineNumberArea->width(), lastCurrentLine.height()); + if (lastCurrentLine_.isValid()) + lineNumberArea_->update (0, lastCurrentLine_.y(), lineNumberArea_->width(), lastCurrentLine_.height()); QRect totalRect; QTextCursor cur = cursorForPosition (rect.center()); if (rect.contains (cursorRect (cur).center())) @@ -298,7 +337,7 @@ } else totalRect = rect; - lineNumberArea->update (0, totalRect.y(), lineNumberArea->width(), totalRect.height()); + lineNumberArea_->update (0, totalRect.y(), lineNumberArea_->width(), totalRect.height()); } if (rect.contains (viewport()->rect())) @@ -342,29 +381,13 @@ return str; } /*************************/ -void TextEdit::removeGreenHighlights() -{ - setGreenSel (QList()); - if (getSearchedText().isEmpty()) // FPwin::hlight() won't be called - { - QList es; - es.prepend (currentLineSelection()); - es.append (getRedSel()); - setExtraSelections (es); - } -} -/*************************/ // Finds the (remaining) spaces that should be inserted with Ctrl+Tab. QString TextEdit::remainingSpaces (const QString& spaceTab, const QTextCursor& cursor) const { QTextCursor tmp = cursor; QString txt = cursor.block().text().left (cursor.positionInBlock()); QFontMetricsF fm = QFontMetricsF (document()->defaultFont()); -#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0)) qreal spaceL = fm.horizontalAdvance (" "); -#else - qreal spaceL = fm.width (" "); -#endif int n = 0, i = 0; while ((i = txt.indexOf("\t", i)) != -1) { // find tab widths in terms of spaces @@ -401,11 +424,7 @@ QString txt = blockText.left (indx); QFontMetricsF fm = QFontMetricsF (document()->defaultFont()); -#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0)) qreal spaceL = fm.horizontalAdvance (" "); -#else - qreal spaceL = fm.width (" "); -#endif int n = 0, i = 0; while ((i = txt.indexOf("\t", i)) != -1) { // find tab widths in terms of spaces @@ -454,7 +473,9 @@ void TextEdit::keyPressEvent (QKeyEvent *event) { - /* workarounds for copy/cut -- see TextEdit::copy()/cut() */ + keepTxtCurHPos_ = false; + + /* workarounds for copy/cut/... -- see TextEdit::copy()/cut()/... */ if (event == QKeySequence::Copy) { copy(); @@ -463,7 +484,41 @@ } if (event == QKeySequence::Cut) { - cut(); + if (!isReadOnly()) + cut(); + event->accept(); + return; + } + if (event == QKeySequence::Paste) + { + if (!isReadOnly()) + paste(); + event->accept(); + return; + } + if (event == QKeySequence::SelectAll) + { + selectAll(); + event->accept(); + return; + } + if (event == QKeySequence::Undo) + { + /* QWidgetTextControl::undo() callls ensureCursorVisible() even when there's nothing to undo. + Users may press Ctrl+Z just to know whether a document is in its original state and + a scroll jump can confuse them when there's nothing to undo. Also see "TextEdit::undo()". */ + if (!isReadOnly() && document()->isUndoAvailable()) + undo(); + event->accept(); + return; + } + if (event == QKeySequence::Redo) + { + /* QWidgetTextControl::redo() calls ensureCursorVisible() even when there's nothing to redo. + That may cause a scroll jump, which can be confusing when nothing else has happened. + Also see "TextEdit::redo()". */ + if (!isReadOnly() && document()->isRedoAvailable()) + redo(); event->accept(); return; } @@ -486,33 +541,11 @@ return; } } - /* handle undoing */ - else if (!isReadOnly() && event->key() == Qt::Key_Z) - { - /* QWidgetTextControl::undo() callls ensureCursorVisible() even when there's nothing to undo. - Users may press Ctrl+Z just to know whether a document is in its original state and - a scroll jump can confuse them when there's nothing to undo. */ - if (!document()->isUndoAvailable()) - { - event->accept(); - return; - } - /* always remove replacing highlights before undoing */ - removeGreenHighlights(); - } } if (event->key() != Qt::Key_Control) // another modifier/key is pressed { if (highlighter_) viewport()->setCursor (Qt::IBeamCursor); - /* QWidgetTextControl::redo() calls ensureCursorVisible() even when there's nothing to redo. - That may cause a scroll jump, which can be confusing when nothing else has happened. */ - if (!isReadOnly() && (event->modifiers() & Qt::ShiftModifier) && event->key() == Qt::Key_Z - && !document()->isRedoAvailable()) - { - event->accept(); - return; - } } } @@ -522,12 +555,31 @@ return; } - if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) + if (event->key() == Qt::Key_Backspace) { + keepTxtCurHPos_ = true; + if (txtCurHPos_ < 0) + { + QTextCursor startCur = textCursor(); + startCur.movePosition (QTextCursor::StartOfLine); + txtCurHPos_ = qAbs (cursorRect().left() - cursorRect (startCur).left()); // is negative for RTL + } + + } + else if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) + { + keepTxtCurHPos_ = true; + if (txtCurHPos_ < 0) + { + QTextCursor startCur = textCursor(); + startCur.movePosition (QTextCursor::StartOfLine); + txtCurHPos_ = qAbs (cursorRect().left() - cursorRect (startCur).left()); + } + QTextCursor cur = textCursor(); QString selTxt = cur.selectedText(); - if (autoReplace && selTxt.isEmpty()) + if (autoReplace_ && selTxt.isEmpty()) { const int p = cur.positionInBlock(); if (p > 1) @@ -608,22 +660,27 @@ /* still check if a letter or number follows */ if (i < curBlockPos) { - if (blockText.at (i).isLetter()) + QChar c = blockText.at (i); + if (c.isLetter()) { if (i + 1 < curBlockPos && !prefix.isEmpty() && !prefix.at (prefix.size() - 1).isSpace() && blockText.at (i + 1).isSpace()) { // non-letter and non-space character -> singlle letter -> space prefix = blockText.left (i + 2); + QChar cc = QChar (c.unicode() + 1); + if (cc.isLetter()) prefix.replace (c, cc); } else if (i + 2 < curBlockPos && !blockText.at (i + 1).isLetterOrNumber() && !blockText.at (i + 1).isSpace() && blockText.at (i + 2).isSpace()) { // singlle letter -> non-letter and non-space character -> space prefix = blockText.left (i + 3); + QChar cc = QChar (c.unicode() + 1); + if (cc.isLetter()) prefix.replace (c, cc); } } - else if (blockText.at (i).isNumber()) + else if (c.isNumber()) { // making lists with numbers QString num; while (i < curBlockPos) @@ -638,18 +695,20 @@ { if (!num.isEmpty()) { + QLocale l = locale(); + l.setNumberOptions (QLocale::OmitGroupSeparator); QChar ch = blockText.at (i); if (ch.isSpace()) { // non-letter and non-space character -> number -> space if (!prefix.isEmpty() && !prefix.at (prefix.size() - 1).isSpace()) - num = locale().toString (locale().toInt (num) + 1) + ch; + num = l.toString (locale().toInt (num) + 1) + ch; else num = QString(); } else if (i + 1 < curBlockPos && !ch.isLetterOrNumber() && !ch.isSpace() && blockText.at (i + 1).isSpace()) { // number -> non-letter and non-space character -> space - num = locale().toString (locale().toInt (num) + 1) + ch + blockText.at (i + 1); + num = l.toString (locale().toInt (num) + 1) + ch + blockText.at (i + 1); } else num = QString(); } @@ -664,13 +723,13 @@ else { /* find the indentation */ - if (autoIndentation) + if (autoIndentation_) indent = computeIndentation (cur); /* check whether a bracketed text is selected so that the cursor position is at its start */ QTextCursor anchorCur = cur; anchorCur.setPosition (cur.anchor()); - if (autoBracket + if (autoBracket_ && cur.position() == cur.selectionStart() && !cur.atBlockStart() && !anchorCur.atBlockEnd()) { @@ -686,7 +745,7 @@ } } - if (withShift || autoIndentation || isBracketed) + if (withShift || autoIndentation_ || isBracketed) { cur.beginEditBlock(); /* first press Enter normally... */ @@ -743,7 +802,7 @@ || event->key() == Qt::Key_BracketLeft || event->key() == Qt::Key_QuoteDbl) { - if (autoBracket) + if (autoBracket_) { QTextCursor cursor = textCursor(); bool autoB (false); @@ -795,6 +854,7 @@ cursor.setPosition (anch + 1, QTextCursor::MoveAnchor); cursor.setPosition (pos + 1, QTextCursor::KeepAnchor); cursor.endEditBlock(); + highlightThisSelection_ = false; /* WARNING: Why does putting "setTextCursor()" before "endEditBlock()" cause a crash with huge lines? Most probably, a Qt bug. */ setTextCursor (cursor); @@ -833,34 +893,6 @@ } else if (event->key() == Qt::Key_Down || event->key() == Qt::Key_Up) { - /*if (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::ShiftModifier) - { - // NOTE: This reverses a Qt feature with Down/Up after Backspace/Enter and is commented out - QTextCursor cursor = textCursor(); - if (!cursor.hasSelection()) - { // go to the same position in the next/previous line - int hPos = cursorRect().center().x(); - QTextCursor::MoveMode mode = (event->modifiers() == Qt::ShiftModifier - ? QTextCursor::KeepAnchor - : QTextCursor::MoveAnchor); - cursor.movePosition (event->key() == Qt::Key_Down - ? QTextCursor::EndOfLine - : QTextCursor::StartOfLine, - mode); - if (cursor.movePosition (event->key() == Qt::Key_Down - ? QTextCursor::NextCharacter - : QTextCursor::PreviousCharacter, - mode)) - { // next/previous line or block - cursor.movePosition (QTextCursor::StartOfLine, mode); - cursor.setPosition (cursorForPosition (QPoint (hPos, cursorRect(cursor).center().y())).position(), mode); - } - setTextCursor (cursor); - ensureCursorVisible(); - event->accept(); - return; - } - }*/ if (event->modifiers() == Qt::ControlModifier) { if (QScrollBar* vbar = verticalScrollBar()) @@ -870,29 +902,6 @@ return; } } - else if (event->modifiers() == Qt::MetaModifier || event->modifiers() == (Qt::ShiftModifier | Qt::MetaModifier)) - { // go to the same position in the next/previous block - QTextCursor cursor = textCursor(); - int hPos = cursorRect().center().x(); - QTextCursor::MoveMode mode = ((event->modifiers() & Qt::ShiftModifier) - ? QTextCursor::KeepAnchor - : QTextCursor::MoveAnchor); - cursor.movePosition (event->key() == Qt::Key_Down - ? QTextCursor::EndOfBlock - : QTextCursor::StartOfBlock, - mode); - if (cursor.movePosition (event->key() == Qt::Key_Down - ? QTextCursor::NextBlock - : QTextCursor::PreviousBlock, - mode)) - { - cursor.setPosition (cursorForPosition (QPoint (hPos, cursorRect(cursor).center().y())).position(), mode); - } - setTextCursor (cursor); - ensureCursorVisible(); - event->accept(); - return; - } else if (event->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier)) { // move the line(s) QTextCursor cursor = textCursor(); @@ -907,6 +916,7 @@ if (event->key() == Qt::Key_Down) { + highlightThisSelection_ = false; cursor.beginEditBlock(); cursor.setPosition (qMin (anch, pos)); cursor.movePosition (QTextCursor::StartOfBlock); @@ -942,6 +952,7 @@ } else { + highlightThisSelection_ = false; cursor.beginEditBlock(); cursor.setPosition (qMax (anch, pos)); cursor.movePosition (QTextCursor::EndOfBlock); @@ -977,6 +988,69 @@ else cursor.endEditBlock(); } } + else if (event->modifiers() == Qt::NoModifier + || (!(event->modifiers() & Qt::AltModifier) + && ((event->modifiers() & Qt::ShiftModifier) + || (event->modifiers() & Qt::MetaModifier) + || (event->modifiers() & Qt::KeypadModifier)))) + { + /* NOTE: This also includes a useful Qt feature with Down/Up after Backspace/Enter. + The feature was removed with Backspace due to a regression in Qt 5.14.1. */ + keepTxtCurHPos_ = true; + QTextCursor cursor = textCursor(); + int hPos; + if (txtCurHPos_ >= 0) + hPos = txtCurHPos_; + else + { + QTextCursor startCur = cursor; + startCur.movePosition (QTextCursor::StartOfLine); + hPos = qAbs (cursorRect().left() - cursorRect (startCur).left()); // is negative for RTL + txtCurHPos_ = hPos; + } + QTextCursor::MoveMode mode = ((event->modifiers() & Qt::ShiftModifier) + ? QTextCursor::KeepAnchor + : QTextCursor::MoveAnchor); + if ((event->modifiers() & Qt::MetaModifier)) + { // try to restore the cursor pixel position between blocks + cursor.movePosition (event->key() == Qt::Key_Down + ? QTextCursor::EndOfBlock + : QTextCursor::StartOfBlock, + mode); + if (cursor.movePosition (event->key() == Qt::Key_Down + ? QTextCursor::NextBlock + : QTextCursor::PreviousBlock, + mode)) + { + setTextCursor (cursor); // WARNING: This is needed because of a Qt bug. + bool rtl (cursor.block().text().isRightToLeft()); + QPoint cc = cursorRect (cursor).center(); + cursor.setPosition (cursorForPosition (QPoint (cc.x() + (rtl ? -1 : 1) * hPos, cc.y())).position(), mode); + } + } + else + { // try to restore the cursor pixel position between lines + cursor.movePosition (event->key() == Qt::Key_Down + ? QTextCursor::EndOfLine + : QTextCursor::StartOfLine, + mode); + if (cursor.movePosition (event->key() == Qt::Key_Down + ? QTextCursor::NextCharacter + : QTextCursor::PreviousCharacter, + mode)) + { // next/previous line or block + cursor.movePosition (QTextCursor::StartOfLine, mode); + setTextCursor (cursor); // WARNING: This is needed because of a Qt bug. + bool rtl (cursor.block().text().isRightToLeft()); + QPoint cc = cursorRect (cursor).center(); + cursor.setPosition (cursorForPosition (QPoint (cc.x() + (rtl ? -1 : 1) * hPos, cc.y())).position(), mode); + } + } + setTextCursor (cursor); + ensureCursorVisible(); + event->accept(); + return; + } } else if (event->key() == Qt::Key_Tab) { @@ -984,6 +1058,7 @@ int newLines = cursor.selectedText().count (QChar (QChar::ParagraphSeparator)); if (newLines > 0) { + highlightThisSelection_ = false; cursor.beginEditBlock(); cursor.setPosition (qMin (cursor.anchor(), cursor.position())); // go to the first block cursor.movePosition (QTextCursor::StartOfBlock); @@ -1006,6 +1081,7 @@ break; // not needed } cursor.endEditBlock(); + ensureCursorVisible(); event->accept(); return; } @@ -1015,6 +1091,7 @@ tmp.setPosition (qMin (tmp.anchor(), tmp.position())); cursor.insertText (remainingSpaces (event->modifiers() & Qt::MetaModifier ? " " : textTab_, tmp)); + ensureCursorVisible(); event->accept(); return; } @@ -1024,6 +1101,7 @@ QTextCursor cursor = textCursor(); int newLines = cursor.selectedText().count (QChar (QChar::ParagraphSeparator)); cursor.setPosition (qMin (cursor.anchor(), cursor.position())); + highlightThisSelection_ = false; cursor.beginEditBlock(); cursor.movePosition (QTextCursor::StartOfBlock); for (int i = 0; i <= newLines; ++i) @@ -1041,6 +1119,7 @@ break; // not needed } cursor.endEditBlock(); + ensureCursorVisible(); /* otherwise, do nothing with SHIFT+TAB */ event->accept(); @@ -1066,7 +1145,7 @@ } else if (event->key() == Qt::Key_Space) { - if (autoReplace && event->modifiers() == Qt::NoModifier) + if (autoReplace_ && event->modifiers() == Qt::NoModifier) { QTextCursor cur = textCursor(); if (!cur.hasSelection()) @@ -1126,6 +1205,31 @@ } } } + else if (event->key() == Qt::Key_Home) + { + if (!(event->modifiers() & Qt::ControlModifier)) + { // Qt's default behavior isn't acceptable + QTextCursor cur = textCursor(); + int p = cur.positionInBlock(); + int indx = 0; + QRegularExpressionMatch match; + if (cur.block().text().indexOf (QRegularExpression ("^\\s+"), 0, &match) > -1) + indx = match.capturedLength(); + if (p > 0) + { + if (p <= indx) p = 0; + else p = indx; + } + else p = indx; + cur.setPosition (p + cur.block().position(), + event->modifiers() & Qt::ShiftModifier ? QTextCursor::KeepAnchor + : QTextCursor::MoveAnchor); + setTextCursor (cur); + ensureCursorVisible(); + event->accept(); + return; + } + } QPlainTextEdit::keyPressEvent (event); } @@ -1143,11 +1247,87 @@ QTextCursor cursor = textCursor(); if (cursor.hasSelection()) { + keepTxtCurHPos_ = false; + txtCurHPos_ = -1; QApplication::clipboard()->setText (cursor.selection().toPlainText()); cursor.removeSelectedText(); } } /*************************/ +// These methods are overridden to forget the horizontal position of the text cursor and... +void TextEdit::undo() +{ + /* always remove replacing highlights before undoing */ + setGreenSel (QList()); + if (getSearchedText().isEmpty()) // FPwin::hlight() won't be called + { + QList es; + es.prepend (currentLineSelection()); + es.append (blueSel_); + es.append (redSel_); + setExtraSelections (es); + } + + keepTxtCurHPos_ = false; + txtCurHPos_ = -1; + QPlainTextEdit::undo(); + + /* because of a bug in Qt, "QPlainTextEdit::selectionChanged()" + may not be emitted after undoing */ + removeSelectionHighlights_ = true; + selectionHlight(); +} +void TextEdit::redo() +{ + keepTxtCurHPos_ = false; + txtCurHPos_ = -1; + QPlainTextEdit::redo(); + + removeSelectionHighlights_ = true; + selectionHlight(); +} +void TextEdit::paste() +{ + keepTxtCurHPos_ = false; // txtCurHPos_ isn't reset because there may be nothing to paste + if (pastePaths_) + { + if (const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData()) + { + const QList urls = mimeData->urls(); + if (!urls.isEmpty()) + { + bool multiple (urls.size() > 1); + QTextCursor cur = textCursor(); + cur.beginEditBlock(); + for (const auto &thisUrl : urls) + { + /* encode spaces of non-local paths to have a good highlighting + but remove the schemes of local paths */ + cur.insertText (thisUrl.isLocalFile() ? thisUrl.toLocalFile() + : thisUrl.toString(QUrl::EncodeSpaces)); + if (multiple) + cur.insertText ("\n"); + } + cur.endEditBlock(); + return; + } + } + } + QPlainTextEdit::paste(); +} +void TextEdit::selectAll() +{ + keepTxtCurHPos_ = false; + txtCurHPos_ = -1; // Qt bug: cursorPositionChanged() isn't emitted with selectAll() + QPlainTextEdit::selectAll(); +} +void TextEdit::insertPlainText (const QString &text) +{ + keepTxtCurHPos_ = false; + txtCurHPos_ = -1; + QPlainTextEdit::insertPlainText (text); +} +/*************************/ void TextEdit::keyReleaseEvent (QKeyEvent *event) { /* deal with hyperlinks */ @@ -1158,99 +1338,86 @@ /*************************/ void TextEdit::wheelEvent (QWheelEvent *event) { - if (scrollJumpWorkaround && event->angleDelta().manhattanLength() > 240) - event->ignore(); // a workaround for Qt5's scroll jump bug - else + if (event->modifiers() & Qt::ControlModifier) { - if (event->modifiers() & Qt::ControlModifier) - { - float delta = event->angleDelta().y() / 120.f; - zooming (delta); - return; - } + float delta = event->angleDelta().y() / 120.f; + zooming (delta); + return; + } -#if (QT_VERSION >= QT_VERSION_CHECK(5,12,0)) - bool horizontal (event->angleDelta().x() != 0); + bool horizontal (event->angleDelta().x() != 0); + if (event->modifiers() & Qt::ShiftModifier) + { // line-by-line scrolling when Shift is pressed + int delta = horizontal + ? event->angleDelta().x() : event->angleDelta().y(); +#if (QT_VERSION >= QT_VERSION_CHECK(5,15,0)) + QWheelEvent e (event->position(), + event->globalPosition(), #else - bool horizontal (event->orientation() == Qt::Horizontal); + QWheelEvent e (event->posF(), + event->globalPosF(), #endif - if (event->modifiers() & Qt::ShiftModifier) - { // line-by-line scrolling when Shift is pressed - int delta = horizontal - ? event->angleDelta().x() : event->angleDelta().y(); -#if (QT_VERSION >= QT_VERSION_CHECK(5,12,0)) - QWheelEvent e (event->posF(), - event->globalPosF(), - event->pixelDelta(), -#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0)) - horizontal - ? QPoint (delta / QApplication::wheelScrollLines(), 0) - : QPoint (0, delta / QApplication::wheelScrollLines()), + event->pixelDelta(), +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) + horizontal + ? QPoint (delta / QApplication::wheelScrollLines(), 0) + : QPoint (0, delta / QApplication::wheelScrollLines()), #else - QPoint (0, delta / QApplication::wheelScrollLines()), + QPoint (0, delta / QApplication::wheelScrollLines()), #endif - event->buttons(), - Qt::NoModifier, - event->phase(), - false, - event->source()); -#else - QWheelEvent e (event->posF(), - event->globalPosF(), - delta / QApplication::wheelScrollLines(), - event->buttons(), - Qt::NoModifier, - Qt::Vertical); -#endif - QCoreApplication::sendEvent (horizontal - ? horizontalScrollBar() - : verticalScrollBar(), &e); - return; - } + event->buttons(), + Qt::NoModifier, + event->phase(), + false, + event->source()); + QCoreApplication::sendEvent (horizontal + ? horizontalScrollBar() + : verticalScrollBar(), &e); + return; + } - /* inertial scrolling */ - if (inertialScrolling_ - && event->spontaneous() - && !horizontal - && event->source() == Qt::MouseEventNotSynthesized) - { - if (QScrollBar* vbar = verticalScrollBar()) - { - /* always set the initial speed to 3 lines per wheel turn */ - int delta = event->angleDelta().y() * 3 / QApplication::wheelScrollLines(); - if((delta > 0 && vbar->value() == vbar->minimum()) - || (delta < 0 && vbar->value() == vbar->maximum())) - { - return; // the scrollbar can't move - } - /* find the number of wheel events in 500 ms - and set the scroll frames per second accordingly */ - static QList wheelEvents; - wheelEvents << QDateTime::currentMSecsSinceEpoch(); - while (wheelEvents.last() - wheelEvents.first() > 500) - wheelEvents.removeFirst(); - int fps = qMax (SCROLL_FRAMES_PER_SEC / wheelEvents.size(), 5); - - /* set the data for inertial scrolling */ - scrollData data; - data.delta = delta; - data.totalSteps = data.leftSteps = fps * SCROLL_DURATION / 1000; - queuedScrollSteps_.append (data); - if (!scrollTimer_) - { - scrollTimer_ = new QTimer(); - scrollTimer_->setTimerType (Qt::PreciseTimer); - connect (scrollTimer_, &QTimer::timeout, this, &TextEdit::scrollWithInertia); - } - scrollTimer_->start (1000 / SCROLL_FRAMES_PER_SEC); - return; + /* inertial scrolling */ + if (inertialScrolling_ + && event->spontaneous() + && !horizontal + && event->source() == Qt::MouseEventNotSynthesized) + { + if (QScrollBar* vbar = verticalScrollBar()) + { + /* always set the initial speed to 3 lines per wheel turn */ + int delta = event->angleDelta().y() * 3 / QApplication::wheelScrollLines(); + if((delta > 0 && vbar->value() == vbar->minimum()) + || (delta < 0 && vbar->value() == vbar->maximum())) + { + return; // the scrollbar can't move + } + /* find the number of wheel events in 500 ms + and set the scroll frames per second accordingly */ + static QList wheelEvents; + wheelEvents << QDateTime::currentMSecsSinceEpoch(); + while (wheelEvents.last() - wheelEvents.first() > 500) + wheelEvents.removeFirst(); + int fps = qMax (SCROLL_FRAMES_PER_SEC / wheelEvents.size(), 5); + + /* set the data for inertial scrolling */ + scrollData data; + data.delta = delta; + data.totalSteps = data.leftSteps = fps * SCROLL_DURATION / 1000; + queuedScrollSteps_.append (data); + if (!scrollTimer_) + { + scrollTimer_ = new QTimer(); + scrollTimer_->setTimerType (Qt::PreciseTimer); + connect (scrollTimer_, &QTimer::timeout, this, &TextEdit::scrollWithInertia); } + scrollTimer_->start (1000 / SCROLL_FRAMES_PER_SEC); + return; } - - /* proceed as in QPlainTextEdit::wheelEvent() */ - QAbstractScrollArea::wheelEvent (event); - updateMicroFocus(); } + + /* proceed as in QPlainTextEdit::wheelEvent() */ + QAbstractScrollArea::wheelEvent (event); + updateMicroFocus(); } /*************************/ void TextEdit::scrollWithInertia() @@ -1277,7 +1444,6 @@ else break; } -#if (QT_VERSION >= QT_VERSION_CHECK(5,12,0)) QWheelEvent e (QPointF(), QPointF(), QPoint(), @@ -1286,67 +1452,43 @@ Qt::NoModifier, Qt::NoScrollPhase, false); -#else - QWheelEvent e (QPointF(), - QPointF(), - totalDelta, - Qt::NoButton, - Qt::NoModifier, - Qt::Vertical); -#endif QCoreApplication::sendEvent (verticalScrollBar(), &e); - /* update text selection if the left mouse button is pressed (-> QPlainTextEdit::timerEvent) */ - if (QApplication::mouseButtons() & Qt::LeftButton) - { - const QPoint globalPos = QCursor::pos(); - QPoint pos = viewport()->mapFromGlobal (globalPos); - QMouseEvent ev (QEvent::MouseMove, pos, viewport()->mapTo (viewport()->topLevelWidget(), pos), globalPos, - Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); - mouseMoveEvent (&ev); - } - if (queuedScrollSteps_.empty()) scrollTimer_->stop(); } /*************************/ -void TextEdit::resizeEvent (QResizeEvent *e) +void TextEdit::resizeEvent (QResizeEvent *event) { - QPlainTextEdit::resizeEvent (e); + QPlainTextEdit::resizeEvent (event); QRect cr = contentsRect(); - lineNumberArea->setGeometry (QRect (QApplication::layoutDirection() == Qt::RightToLeft ? cr.width() - lineNumberAreaWidth() : cr.left(), - cr.top(), lineNumberAreaWidth(), cr.height())); + lineNumberArea_->setGeometry (QRect (QApplication::layoutDirection() == Qt::RightToLeft ? cr.width() - lineNumberAreaWidth() : cr.left(), + cr.top(), lineNumberAreaWidth(), cr.height())); - if (resizeTimerId) + if (resizeTimerId_) { - killTimer (resizeTimerId); - resizeTimerId = 0; + killTimer (resizeTimerId_); + resizeTimerId_ = 0; } - resizeTimerId = startTimer (UPDATE_INTERVAL); + resizeTimerId_ = startTimer (UPDATE_INTERVAL); } /*************************/ -void TextEdit::timerEvent (QTimerEvent *e) +void TextEdit::timerEvent (QTimerEvent *event) { - QPlainTextEdit::timerEvent (e); + QPlainTextEdit::timerEvent (event); - if (e->timerId() == resizeTimerId) + if (event->timerId() == resizeTimerId_) { - killTimer (e->timerId()); - resizeTimerId = 0; + killTimer (event->timerId()); + resizeTimerId_ = 0; emit resized(); } - else if (e->timerId() == updateTimerId) + else if (event->timerId() == selectionTimerId_) { - killTimer (e->timerId()); - updateTimerId = 0; - /* we use TextEdit's rect because the last rect that - updateRequest() provides after 50ms may be null */ - emit updateRect (rect(), Dy); - /* the text-edit may have been invisible before and so, - FPwin::matchBrackets() may have not be called for it */ - if (!matchedBrackets_ && isVisible()) - emit updateBracketMatching(); + killTimer (event->timerId()); + selectionTimerId_ = 0; + selectionHlight(); } } /******************************************************* @@ -1371,28 +1513,6 @@ p->restore(); } -#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0)) -// To work around a nasty bug in Qt 5.14.0 -static QColor overlayColor (const QColor& bgCol, const QColor& overlayCol) -{ - if (!overlayCol.isValid()) return QColor(0,0,0); - if (!bgCol.isValid()) return overlayCol; - - qreal a1 = overlayCol.alphaF(); - if (a1 == 1.0) return overlayCol; - qreal a0 = bgCol.alphaF(); - qreal a = (1.0 - a1) * a0 + a1; - - QColor res; - res.setAlphaF(a); - res.setRedF (((1.0 - a1) * a0 * bgCol.redF() + a1 * overlayCol.redF()) / a); - res.setGreenF (((1.0 - a1) * a0 *bgCol.greenF() + a1 * overlayCol.greenF()) / a); - res.setBlueF (((1.0 - a1) * a0 * bgCol.blueF() + a1 * overlayCol.blueF()) / a); - - return res; -} -#endif - // Exactly like QPlainTextEdit::paintEvent(), // except for setting layout text option for RTL // and drawing vertical indentation lines (if needed). @@ -1435,7 +1555,8 @@ QTextOption opt = document()->defaultTextOption(); if (rtl) { - opt.setAlignment (Qt::AlignRight); + if (lineWrapMode() == QPlainTextEdit::WidgetWidth) + opt.setAlignment (Qt::AlignRight); // doesn't work without wrapping opt.setTextDirection (Qt::RightToLeft); layout->setTextOption (opt); } @@ -1449,7 +1570,7 @@ fillBackground (&painter, contentsRect, bg); } - if (opt.flags() & QTextOption::ShowLineAndParagraphSeparators) + if (lineNumberArea_->isVisible() && (opt.flags() & QTextOption::ShowLineAndParagraphSeparators)) { /* "QTextFormat::FullWidthSelection" isn't respected when new-lines are shown. This is a workaround. */ @@ -1457,9 +1578,9 @@ contentsRect.setWidth (qMax (r.width(), maximumWidth)); if (contentsRect.contains (cursorRect().center())) { - contentsRect.setTop (cursorRect().top() - 1); - contentsRect.setBottom (cursorRect().bottom() + 1); - fillBackground (&painter, contentsRect, lineHColor); + contentsRect.setTop (cursorRect().top()); + contentsRect.setBottom (cursorRect().bottom()); + fillBackground (&painter, contentsRect, lineHColor_); } } @@ -1508,7 +1629,7 @@ QTextLayout::FormatRange o; o.start = context.cursorPosition - blpos; o.length = 1; - if (darkValue > -1) + if (darkValue_ > -1) { o.format.setForeground (Qt::black); o.format.setBackground (Qt::white); @@ -1537,23 +1658,7 @@ if (opt.flags() & QTextOption::ShowLineAndParagraphSeparators) { painter.save(); - /* Use alpha with the painter to gray out the paragraph separators and - document terminators. The real text will be formatted by the highlgihter. */ - QColor col; - if (darkValue > -1) - { - col = Qt::white; - col.setAlpha (90); - } - else - { - col = Qt::black; - col.setAlpha (70); - } -#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0)) - col = overlayColor (QColor (bgColorValue_, bgColorValue_, bgColorValue_), col); -#endif - painter.setPen (col); + painter.setPen (separatorColor_); } layout->draw (&painter, offset, selections, er); if (opt.flags() & QTextOption::ShowLineAndParagraphSeparators) @@ -1573,7 +1678,7 @@ } /* indentation and position lines should be drawn after selections */ - if (drawIndetLines) + if (drawIndetLines_) { QRegularExpressionMatch match; if (block.text().indexOf (QRegularExpression ("\\s+"), 0, &match) == 0) @@ -1587,11 +1692,7 @@ int yBottom = qRound (r.height() >= static_cast(2) * fm.lineSpacing() ? yTop + fm.height() : r.bottomLeft().y() - static_cast(1)); -#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0)) qreal tabWidth = fm.horizontalAdvance (textTab_); -#else - qreal tabWidth = fm.width (textTab_); -#endif if (rtl) { qreal leftMost = cursorRect (cur).left(); @@ -1622,7 +1723,7 @@ { painter.save(); QColor col; - if (darkValue > -1) + if (darkValue_ > -1) { col = QColor (65, 154, 255); col.setAlpha (90); @@ -1636,11 +1737,7 @@ QTextCursor cur = textCursor(); cur.setPosition (block.position()); QFontMetricsF fm = QFontMetricsF (document()->defaultFont()); -#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0)) qreal rulerSpace = fm.horizontalAdvance (' ') * static_cast(vLineDistance_); -#else - qreal rulerSpace = fm.width (' ') * static_cast(vLineDistance_); -#endif int yTop = qRound (r.topLeft().y()); int yBottom = qRound (r.height() >= static_cast(2) * fm.lineSpacing() ? yTop + fm.height() @@ -1672,30 +1769,31 @@ /************************************************ ***** End of the Workaround for the RTL bug ***** *************************************************/ + void TextEdit::highlightCurrentLine() { - /* keep yellow and green highlights - (related to searching and replacing) */ + /* keep yellow, green and blue highlights + (related to searching, replacing and selecting) */ QList es = extraSelections(); - if (!es.isEmpty() && !currentLine.cursor.isNull()) + if (!es.isEmpty() && !currentLine_.cursor.isNull()) es.removeFirst(); // line highlight always comes first when it exists - currentLine.format.setBackground (document()->defaultTextOption().flags() & QTextOption::ShowLineAndParagraphSeparators - ? Qt::transparent // workaround for a Qt bug (see TextEdit::paintEvent) - : lineHColor); - currentLine.format.setProperty (QTextFormat::FullWidthSelection, true); - currentLine.cursor = textCursor(); - currentLine.cursor.clearSelection(); - es.prepend (currentLine); + currentLine_.format.setBackground (document()->defaultTextOption().flags() & QTextOption::ShowLineAndParagraphSeparators + ? Qt::transparent // workaround for a Qt bug (see TextEdit::paintEvent) + : lineHColor_); + currentLine_.format.setProperty (QTextFormat::FullWidthSelection, true); + currentLine_.cursor = textCursor(); + currentLine_.cursor.clearSelection(); + es.prepend (currentLine_); setExtraSelections (es); } /*************************/ void TextEdit::lineNumberAreaPaintEvent (QPaintEvent *event) { - QPainter painter (lineNumberArea); + QPainter painter (lineNumberArea_); QColor currentBlockFg, currentLineBg, currentLineFg; - if (darkValue > -1) + if (darkValue_ > -1) { painter.fillRect (event->rect(), QColor (200, 200 , 200)); painter.setPen (Qt::black); @@ -1713,7 +1811,7 @@ } bool rtl (QApplication::layoutDirection() == Qt::RightToLeft); - int w = lineNumberArea->width(); + int w = lineNumberArea_->width(); int left = rtl ? 3 : 0; QTextBlock block = firstVisibleBlock(); @@ -1724,15 +1822,17 @@ int h = fontMetrics().height(); QFont bf = font(); bf.setBold (true); + QLocale l = locale(); + l.setNumberOptions (QLocale::OmitGroupSeparator); while (block.isValid() && top <= event->rect().bottom()) { if (block.isVisible() && bottom >= event->rect().top()) { - QString number = QString::number (blockNumber + 1); + QString number = l.toString (blockNumber + 1); if (blockNumber == curBlock) { - lastCurrentLine = QRect (0, top, 1, top + h); + lastCurrentLine_ = QRect (0, top, 1, top + h); painter.save(); int cur = cursorRect().center().y(); @@ -1779,45 +1879,65 @@ /*************************/ void TextEdit::onUpdateRequesting (const QRect& /*rect*/, int dy) { - if (updateTimerId) - { - killTimer (updateTimerId); - updateTimerId = 0; - if (Dy == 0 || dy != 0) // dy can be zero at the end of 50ms - Dy = dy; - } - else Dy = dy; - - updateTimerId = startTimer (UPDATE_INTERVAL); + /* here, we're interested only in the vertical text scrolling + (and, definitely, not in the blinking cursor updates) */ + if (dy == 0) return; + /* we ignore the rectangle because QPlainTextEdit::updateRequest + gives the whole rectangle when the text is scrolled */ + emit updateRect(); + /* because brackets may have been invisible before, + FPwin::matchBrackets() should be called here */ + if (!matchedBrackets_ && isVisible()) + emit updateBracketMatching(); } /*************************/ -// Bracket matching isn't only based on the signal "cursorPositionChanged()" -// because it isn't emitted when a selected text is removed while the cursor -// is at its start. This function emits an appropriate signal in such cases. void TextEdit::onSelectionChanged() { + /* Bracket matching isn't only based on the signal "cursorPositionChanged()" + because it isn't emitted when a selected text is removed while the cursor + is at its start. So, an appropriate signal should be emitted in such cases. */ QTextCursor cur = textCursor(); if (!cur.hasSelection()) { - if (cur.position() == prevPos && cur.position() < prevAnchor) + if (cur.position() == prevPos_ && cur.position() < prevAnchor_) emit updateBracketMatching(); - prevAnchor = prevPos = -1; + prevAnchor_ = prevPos_ = -1; + } + else + { + prevAnchor_ = cur.anchor(); + prevPos_ = cur.position(); } + + /* selection highlighting */ + if (!selectionHighlighting_) return; + if (highlightThisSelection_) + removeSelectionHighlights_ = false; // reset else { - prevAnchor = cur.anchor(); - prevPos = cur.position(); + removeSelectionHighlights_ = true; + highlightThisSelection_ = true; // reset + } + if (selectionTimerId_) + { + killTimer (selectionTimerId_); + selectionTimerId_ = 0; } + selectionTimerId_ = startTimer (UPDATE_INTERVAL); } /*************************/ void TextEdit::zooming (float range) { + /* forget the horizontal position of the text cursor */ + keepTxtCurHPos_ = false; + txtCurHPos_ = -1; + QFont f = document()->defaultFont(); if (range == 0.f) // means unzooming { setEditorFont (font_, false); if (font_.pointSizeF() < f.pointSizeF()) - zoomedOut (this); // ses the explanation below + emit zoomedOut (this); // see the explanation below } else { @@ -1836,23 +1956,17 @@ adjustScrollbars(); } /*************************/ -// Since the visible text rectangle is updated by a timer, if the text -// page is first shown for a very short time (when, for example, the -// active tab is changed quickly several times), "updateRect()" might +// If the text page is first shown for a very short time (when, for example, +// the active tab is changed quickly several times), "updateRect()" might // be emitted when the text page isn't visible, while "updateRequest()" -// might not be emitted when it becomes visible again. That will result in -// an incomplete syntax highlighting. Therefore, we restart "updateTimerId" -// and give a positive value to "Dy" whenever the text page is shown. +// might not be emitted when it becomes visible again. That will result +// in an incomplete syntax highlighting and, probably, bracket matching. void TextEdit::showEvent (QShowEvent *event) { QPlainTextEdit::showEvent (event); - if (updateTimerId) - { - killTimer (updateTimerId); - updateTimerId = 0; - } - Dy = 1; - updateTimerId = startTimer (UPDATE_INTERVAL); + emit updateRect(); + if (!matchedBrackets_) + emit updateBracketMatching(); } /*************************/ void TextEdit::sortLines (bool reverse) @@ -1871,7 +1985,10 @@ cursor.movePosition (QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); QStringList lines = cursor.selectedText().split (QChar (QChar::ParagraphSeparator)); - lines.sort(); + /* QStringList::sort() is not aware of the locale */ + std::sort (lines.begin(), lines.end(), [](const QString &a, const QString &b) { + return QString::localeAwareCompare (a, b) < 0; + }); int n = lines.size(); if (reverse) { @@ -1900,7 +2017,7 @@ QString TextEdit::getUrl (const int pos) const { - static const QRegularExpression urlPattern ("[A-Za-z0-9_]+://((?!"|>|<)[A-Za-z0-9_.+/\\?\\=~&%#\\-:\\(\\)\\[\\]])+(?findBlock (pos); @@ -1923,8 +2040,11 @@ void TextEdit::mouseMoveEvent (QMouseEvent *event) { /* prevent dragging if there is no real mouse movement */ - if (event->buttons() == Qt::LeftButton && event->globalPos() == selectionPressPoint_) + if (event->buttons() == Qt::LeftButton + && (event->globalPos() - selectionPressPoint_).manhattanLength() <= qApp->startDragDistance()) + { return; + } QPlainTextEdit::mouseMoveEvent (event); @@ -1943,6 +2063,10 @@ /*************************/ void TextEdit::mousePressEvent (QMouseEvent *event) { + /* forget the last cursor position */ + keepTxtCurHPos_ = false; + txtCurHPos_ = -1; + /* With a triple click, QPlainTextEdit selects the current block plus its newline, if any. But it is better to select the current block without selecting its newline and start and end @@ -2004,7 +2128,7 @@ QPlainTextEdit::mousePressEvent (event); if (highlighter_ - && (event->button() & Qt::LeftButton) + && event->button() == Qt::LeftButton && (qApp->keyboardModifiers() & Qt::ControlModifier)) { pressPoint_ = event->pos(); @@ -2014,19 +2138,21 @@ void TextEdit::mouseReleaseEvent (QMouseEvent *event) { QPlainTextEdit::mouseReleaseEvent (event); - - /* workaround for copying to the selection clipboard; - see TextEdit::copy()/cut() for an explanation */ - QTextCursor cursor = textCursor(); - if (cursor.hasSelection()) + if (event->button() == Qt::LeftButton) { - QClipboard *cl = QApplication::clipboard(); - if (cl->supportsSelection()) - cl->setText (cursor.selection().toPlainText(), QClipboard::Selection); + /* workaround for copying to the selection clipboard; + see TextEdit::copy()/cut() for an explanation */ + QTextCursor cursor = textCursor(); + if (cursor.hasSelection()) + { + QClipboard *cl = QApplication::clipboard(); + if (cl->supportsSelection()) + cl->setText (cursor.selection().toPlainText(), QClipboard::Selection); + } } + else return; if (!highlighter_ - || !(event->button() & Qt::LeftButton) || !(qApp->keyboardModifiers() & Qt::ControlModifier) /* another key may also be pressed (-> keyPressEvent) */ || viewport()->cursor().shape() != Qt::PointingHandCursor) @@ -2057,11 +2183,535 @@ { if (highlighter_ && ((event->type() == QEvent::WindowDeactivate && hasFocus()) // another window is activated - || event->type() == QEvent::FocusOut)) // another widget has been focused + || event->type() == QEvent::FocusOut)) // another widget has been focused { viewport()->setCursor (Qt::IBeamCursor); } return QPlainTextEdit::event (event); } +/************************************************************************ + ***** Qt's backward search has some bugs. Therefore, we do our own ***** + ***** backward search by using the following two static functions. ***** + ************************************************************************/ +static bool findBackwardInBlock (const QTextBlock &block, const QString &str, int offset, + QTextCursor &cursor, QTextDocument::FindFlags flags) +{ + Qt::CaseSensitivity cs = !(flags & QTextDocument::FindCaseSensitively) + ? Qt::CaseInsensitive : Qt::CaseSensitive; + + QString text = block.text(); + text.replace (QChar::Nbsp, QLatin1Char (' ')); + + /* WARNING: QString::lastIndexOf() returns -1 if the position, from which the + backward search is done, is the position of the block's last cursor. + The following workaround compensates for this illogical behavior. */ + if (offset > 0 && offset == text.length()) + -- offset; + + int idx = -1; + while (offset >= 0 && offset <= text.length()) + { + idx = text.lastIndexOf (str, offset, cs); + if (idx == -1) + return false; + if (flags & QTextDocument::FindWholeWords) + { + const int start = idx; + const int end = start + str.length(); + if ((start != 0 && text.at (start - 1).isLetterOrNumber()) + || (end != text.length() && text.at (end).isLetterOrNumber())) + { // if this is not a whole word, continue the backward search + offset = idx - 1; + idx = -1; + continue; + } + } + cursor.setPosition (block.position() + idx); + cursor.setPosition (cursor.position() + str.length(), QTextCursor::KeepAnchor); + return true; + } + return false; +} + +static bool findBackward (const QTextDocument *txtdoc, const QString &str, + QTextCursor &cursor, QTextDocument::FindFlags flags) +{ + if (!str.isEmpty() && !cursor.isNull()) + { + int pos = cursor.anchor() + - str.size(); // we don't want a match with the cursor inside it + if (pos >= 0) + { + QTextBlock block = txtdoc->findBlock (pos); + int blockOffset = pos - block.position(); + while (block.isValid()) + { + if (findBackwardInBlock (block, str, blockOffset, cursor, flags)) + return true; + block = block.previous(); + blockOffset = block.length() - 1; // newline is included in QTextBlock::length() + } + } + } + cursor = QTextCursor(); + return false; +} +/*************************/ +// This method extends the searchable strings to those with line breaks. +// It also corrects the behavior of Qt's backward search and can set an +// end limit to the forward search. +QTextCursor TextEdit::finding (const QString& str, const QTextCursor& start, QTextDocument::FindFlags flags, + bool isRegex, const int end) const +{ + /* let's be consistent first */ + if (str.isEmpty()) + return QTextCursor(); // null cursor + + QTextCursor res = start; + if (isRegex) // multiline matches aren't supported + { + QRegularExpression regexp (str, (flags & QTextDocument::FindCaseSensitively) + ? QRegularExpression::NoPatternOption + : QRegularExpression::CaseInsensitiveOption); + if (!regexp.isValid()) + return QTextCursor(); + QTextCursor cursor = start; + QRegularExpressionMatch match; + if (!(flags & QTextDocument::FindBackward)) + { + cursor.setPosition (qMax (cursor.anchor(), cursor.position())); // as with ordinary search + while (!cursor.atEnd()) + { + if (!cursor.atBlockEnd()) // otherwise, it'll be returned with ".*" + { + if (end > 0 && cursor.anchor() > end) + break; + int indx = cursor.block().text().indexOf (regexp, cursor.positionInBlock(), &match); + if (indx > -1) + { + if (match.capturedLength() == 0) // no empty match (with "\w*", for example) + { + cursor.setPosition (cursor.position() + 1); + continue; + } + if (end > 0 && indx + cursor.block().position() > end) + break; + res.setPosition (indx + cursor.block().position()); + res.setPosition (res.position() + match.capturedLength(), QTextCursor::KeepAnchor); + return res; + } + } + if (!cursor.movePosition (QTextCursor::NextBlock)) + break; + } + } + else // with a backward search, the block/doc start should also be checked + { + cursor.setPosition (cursor.anchor()); // as with ordinary search + while (true) + { + const int bp = cursor.block().position(); + int indx = cursor.block().text().lastIndexOf (regexp, cursor.position() - bp, &match); + if (indx > -1) + { + if (match.capturedLength() == 0 // no empty match + /* the match start should be before the search start */ + || bp + indx == start.anchor()) + { + if (cursor.atBlockStart()) + { + if (!cursor.movePosition (QTextCursor::PreviousBlock)) + break; + cursor.movePosition (QTextCursor::EndOfBlock); + } + else + cursor.setPosition (cursor.position() - 1); + continue; + } + res.setPosition (indx + bp); + res.setPosition (res.position() + match.capturedLength(), QTextCursor::KeepAnchor); + return res; + } + if (!cursor.movePosition (QTextCursor::PreviousBlock)) + break; + cursor.movePosition (QTextCursor::EndOfBlock); + } + } + return QTextCursor(); + } + else if (str.contains ('\n')) + { + QTextCursor cursor = start; + QTextCursor found; + QStringList sl = str.split ("\n"); + int i = 0; + Qt::CaseSensitivity cs = !(flags & QTextDocument::FindCaseSensitively) + ? Qt::CaseInsensitive : Qt::CaseSensitive; + QString subStr; + if (!(flags & QTextDocument::FindBackward)) + { + /* this loop searches for the consecutive + occurrences of newline separated strings */ + while (i < sl.count()) + { + if (i == 0) // the first string + { + subStr = sl.at (0); + /* when the first string is empty... */ + if (subStr.isEmpty()) + { + /* ... search anew from the next block */ + cursor.movePosition (QTextCursor::EndOfBlock); + if (end > 0 && cursor.anchor() > end) + return QTextCursor(); + res.setPosition (cursor.position()); + if (!cursor.movePosition (QTextCursor::NextBlock)) + return QTextCursor(); + ++i; + } + else + { + if ((found = document()->find (subStr, cursor, flags)).isNull()) + return QTextCursor(); + if (end > 0 && found.anchor() > end) + return QTextCursor(); + cursor.setPosition (found.position()); + /* if the match doesn't end the block... */ + while (!cursor.atBlockEnd()) + { + /* ... move the cursor to right and search until a match is found */ + cursor.movePosition (QTextCursor::EndOfBlock); + cursor.setPosition (cursor.position() - subStr.length()); + if ((found = document()->find (subStr, cursor, flags)).isNull()) + return QTextCursor(); + if (end > 0 && found.anchor() > end) + return QTextCursor(); + cursor.setPosition (found.position()); + } + + res.setPosition (found.anchor()); + if (!cursor.movePosition (QTextCursor::NextBlock)) + return QTextCursor(); + ++i; + } + } + else if (i != sl.count() - 1) // middle strings + { + /* when the next block's test isn't the next string... */ + if (QString::compare (cursor.block().text(), sl.at (i), cs) != 0) + { + /* ... reset the loop cautiously */ + cursor.setPosition (res.position()); + if (!cursor.movePosition (QTextCursor::NextBlock)) + return QTextCursor(); + i = 0; + continue; + } + + if (!cursor.movePosition (QTextCursor::NextBlock)) + return QTextCursor(); + ++i; + } + else // the last string (i == sl.count() - 1) + { + subStr = sl.at (i); + if (subStr.isEmpty()) break; + if (!(flags & QTextDocument::FindWholeWords)) + { + /* when the last string doesn't start the next block... */ + if (!cursor.block().text().startsWith (subStr, cs)) + { + /* ... reset the loop cautiously */ + cursor.setPosition (res.position()); + if (!cursor.movePosition (QTextCursor::NextBlock)) + return QTextCursor(); + i = 0; + continue; + } + cursor.setPosition (cursor.anchor() + subStr.count()); + break; + } + else + { + if ((found = document()->find (subStr, cursor, flags)).isNull() + || found.anchor() != cursor.position()) + { + cursor.setPosition (res.position()); + if (!cursor.movePosition (QTextCursor::NextBlock)) + return QTextCursor(); + i = 0; + continue; + } + cursor.setPosition (found.position()); + break; + } + } + } + res.setPosition (cursor.position(), QTextCursor::KeepAnchor); + } + else // backward search + { + cursor.setPosition (cursor.anchor()); + int endPos = cursor.position(); + while (i < sl.count()) + { + if (i == 0) // the last string + { + subStr = sl.at (sl.count() - 1); + if (subStr.isEmpty()) + { + cursor.movePosition (QTextCursor::StartOfBlock); + endPos = cursor.position(); + if (!cursor.movePosition (QTextCursor::PreviousBlock)) + return QTextCursor(); + cursor.movePosition (QTextCursor::EndOfBlock); + ++i; + } + else + { + if (!findBackward (document(), subStr, cursor, flags)) + return QTextCursor(); + /* if the match doesn't start the block... */ + while (cursor.anchor() > cursor.block().position()) + { + /* ... move the cursor to left and search backward until a match is found */ + cursor.setPosition (cursor.block().position() + subStr.count()); + if (!findBackward (document(), subStr, cursor, flags)) + return QTextCursor(); + } + + endPos = cursor.position(); + if (!cursor.movePosition (QTextCursor::PreviousBlock)) + return QTextCursor(); + cursor.movePosition (QTextCursor::EndOfBlock); + ++i; + } + } + else if (i != sl.count() - 1) // the middle strings + { + if (QString::compare (cursor.block().text(), sl.at (sl.count() - i - 1), cs) != 0) + { // reset the loop if the block text doesn't match + cursor.setPosition (endPos); + if (!cursor.movePosition (QTextCursor::PreviousBlock)) + return QTextCursor(); + cursor.movePosition (QTextCursor::EndOfBlock); + i = 0; + continue; + } + + if (!cursor.movePosition (QTextCursor::PreviousBlock)) + return QTextCursor(); + cursor.movePosition (QTextCursor::EndOfBlock); + ++i; + } + else // the first string + { + subStr = sl.at (0); + if (subStr.isEmpty()) break; + if (!(flags & QTextDocument::FindWholeWords)) + { + /* when the first string doesn't end the previous block... */ + if (!cursor.block().text().endsWith (subStr, cs)) + { + /* ... reset the loop */ + cursor.setPosition (endPos); + if (!cursor.movePosition (QTextCursor::PreviousBlock)) + return QTextCursor(); + cursor.movePosition (QTextCursor::EndOfBlock); + i = 0; + continue; + } + cursor.setPosition (cursor.anchor() - subStr.count()); + break; + } + else + { + found = cursor; // block end + if (!findBackward (document(), subStr, found, flags) + || found.position() != cursor.position()) + { + cursor.setPosition (endPos); + if (!cursor.movePosition (QTextCursor::PreviousBlock)) + return QTextCursor(); + cursor.movePosition (QTextCursor::EndOfBlock); + i = 0; + continue; + } + cursor.setPosition (found.anchor()); + break; + } + } + } + res.setPosition (cursor.anchor()); + res.setPosition (endPos, QTextCursor::KeepAnchor); + } + } + else // there's no line break + { + if (!(flags & QTextDocument::FindBackward)) + { + res = document()->find (str, start, flags); + if (end > 0 && res.anchor() > end) + return QTextCursor(); + } + else + findBackward (document(), str, res, flags); + } + + return res; +} +/************************************ + ***** End of search functions. ***** + ************************************/ + +void TextEdit::setSelectionHighlighting (bool enable) +{ + selectionHighlighting_ = enable; + highlightThisSelection_ = true; // reset + removeSelectionHighlights_ = true; // start without highlighting if "enable" is true + if (enable) + { + connect (document(), &QTextDocument::contentsChange, this, &TextEdit::onContentsChange); + connect (this, &TextEdit::updateRect, this, &TextEdit::selectionHlight); + connect (this, &TextEdit::resized, this, &TextEdit::selectionHlight); + } + else + { + disconnect (document(), &QTextDocument::contentsChange, this, &TextEdit::onContentsChange); + disconnect (this, &TextEdit::updateRect, this, &TextEdit::selectionHlight); + disconnect (this, &TextEdit::resized, this, &TextEdit::selectionHlight); + if (selectionTimerId_) + { + killTimer (selectionTimerId_); + selectionTimerId_ = 0; + } + /* remove all blue highlights */ + if (!blueSel_.isEmpty()) + { + QList es = extraSelections(); + int nRed = redSel_.count(); + int n = blueSel_.count(); + while (n > 0 && es.size() - nRed > 0) + { + es.removeAt (es.size() - 1 - nRed); + --n; + } + blueSel_.clear(); + setExtraSelections (es); + } + } +} +/*************************/ +// Set the blue selection highlights (before the red bracket highlights). +void TextEdit::selectionHlight() +{ + if (!selectionHighlighting_) return; + + QList es = extraSelections(); + QTextCursor selCursor = textCursor(); + const QString selTxt = selCursor.selection().toPlainText(); + int nRed = redSel_.count(); // bracket highlights (come last) + + /* remove all blue highlights */ + int n = blueSel_.count(); + while (n > 0 && es.size() - nRed > 0) + { + es.removeAt (es.size() - 1 - nRed); + --n; + } + + if (removeSelectionHighlights_ || selTxt.isEmpty()) + { + /* avoid the computations of QWidgetTextControl::setExtraSelections + as far as possible */ + if (!blueSel_.isEmpty()) + { + blueSel_.clear(); + setExtraSelections (es); + } + return; + } + + blueSel_.clear(); + + /* first put a start cursor at the top left edge... */ + QPoint Point (0, 0); + QTextCursor start = cursorForPosition (Point); + /* ... then move it backward by the search text length */ + int startPos = start.position() - selTxt.length(); + if (startPos >= 0) + start.setPosition (startPos); + else + start.setPosition (0); + /* get the visible text to check if the search string is inside it */ + Point = QPoint (geometry().width(), geometry().height()); + QTextCursor end = cursorForPosition (Point); + int endLimit = end.anchor(); + int endPos = end.position() + selTxt.length(); + end.movePosition (QTextCursor::End); + if (endPos <= end.position()) + end.setPosition (endPos); + QTextCursor visCur = start; + visCur.setPosition (end.position(), QTextCursor::KeepAnchor); + const QString str = visCur.selection().toPlainText(); // '\n' is included in this way + if (str.contains (selTxt)) // don't waste time if the selected text isn't visible + { + QTextDocument::FindFlags searchFlags = (QTextDocument::FindWholeWords | QTextDocument::FindCaseSensitively); + QColor color = hasDarkScheme() ? QColor (0, 77, 160) : QColor (130, 255, 255); // blue highlights + QTextCursor found; + + while (!(found = finding (selTxt, start, searchFlags, false, endLimit)).isNull()) + { + if (selCursor.anchor() <= selCursor.position() + ? (found.anchor() != selCursor.anchor() || found.position() != selCursor.position()) + : (found.anchor() != selCursor.position() || found.position() != selCursor.anchor())) + { + QTextEdit::ExtraSelection extra; + extra.format.setBackground (color); + extra.cursor = found; + blueSel_.append (extra); + es.insert (es.size() - nRed, extra); + } + start.setPosition (found.position()); + } + } + setExtraSelections (es); +} +/*************************/ +void TextEdit::onContentsChange (int /*position*/, int charsRemoved, int charsAdded) +{ + if (!selectionHighlighting_) return; + if (charsRemoved > 0 || charsAdded > 0) + { + /* wait until the document's layout manager is notified about the change; + otherwise, the end cursor might be out of range */ + QTimer::singleShot (0, this, &TextEdit::selectionHlight); + } +} +/*************************/ +bool TextEdit::toSoftTabs() +{ + bool res = false; + QString tab = QString (QChar (QChar::Tabulation)); + QTextCursor orig = textCursor(); + orig.setPosition (orig.anchor()); + setTextCursor (orig); + QTextCursor found; + QTextCursor start = orig; + start.beginEditBlock(); + start.setPosition (0); + while (!(found = finding (tab, start)).isNull()) + { + res = true; + start.setPosition (found.anchor()); + QString softTab = remainingSpaces (textTab_, start); + start.setPosition (found.position(), QTextCursor::KeepAnchor); + start.insertText (softTab); + start.setPosition (start.position()); + } + start.endEditBlock(); + return res; +} + } diff -Nru featherpad-0.12.1/featherpad/textedit.h featherpad-0.17.1/featherpad/textedit.h --- featherpad-0.12.1/featherpad/textedit.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/textedit.h 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2019 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -21,6 +21,7 @@ #define TEXTEDIT_H #include +#include #include #include #include @@ -41,7 +42,7 @@ void setTextCursor (const QTextCursor &cursor) { QPlainTextEdit::setTextCursor (cursor); - /* this is needed for formatVisibleText() to be called (for syntax highlighting) */ + /* this is needed for formatTextRect() to be called (for syntax highlighting) */ emit QPlainTextEdit::updateRequest (rect(), 1); } @@ -52,10 +53,10 @@ int lineNumberAreaWidth(); void showLineNumbers (bool show); - void removeGreenHighlights(); - void sortLines (bool reverse = false); + bool toSoftTabs(); + QString getUrl (const int pos) const; QFont getDefaultFont() const { @@ -70,25 +71,25 @@ } QTextEdit::ExtraSelection currentLineSelection() { - return currentLine; + return currentLine_; } void setAutoIndentation (bool indent) { - autoIndentation = indent; + autoIndentation_ = indent; } bool getAutoIndentation() const { - return autoIndentation; + return autoIndentation_; } void setAutoReplace (bool replace) { - autoReplace = replace; + autoReplace_ = replace; } bool getAutoReplace() const { - return autoReplace; + return autoReplace_; } void setDrawIndetLines (bool draw) { - drawIndetLines = draw; + drawIndetLines_ = draw; } void setVLineDistance (int distance) { @@ -100,20 +101,26 @@ } void setAutoBracket (bool autoB) { - autoBracket = autoB; + autoBracket_ = autoB; } bool hasDarkScheme() const { - return (darkValue > -1); + return (darkValue_ > -1); } int getDarkValue() const { - return darkValue; + return darkValue_; } - void setScrollJumpWorkaround (bool apply){ - scrollJumpWorkaround = apply; + QColor getTextPrintColor() const { + /* with syntax highlighting, the color of line/document ends + should be returned because the ordinary text is formatted */ + if (highlighter_) + return separatorColor_; + return (darkValue_ == -1 ? Qt::black : Qt::white); } + void setCurLineHighlight (int value); + void zooming (float range); qint64 getSize() const { @@ -186,6 +193,7 @@ void setGreenSel (QList sel) { greenSel_ = sel; } + QList getRedSel() const { return redSel_; } @@ -193,6 +201,10 @@ redSel_ = sel; } + QList getBlueSel() const { + return blueSel_; + } + bool isUneditable() const { return uneditable_; } @@ -233,6 +245,28 @@ matchedBrackets_ = true; } + void forgetTxtCurHPos() { + keepTxtCurHPos_ = false; + txtCurHPos_ = -1; + } + + bool getSelectionHighlighting() const { + return selectionHighlighting_; + } + void setSelectionHighlighting (bool enable); + + void skipSelectionHighlighting() { + highlightThisSelection_ = false; + } + + void setPastePaths (bool pastePaths) { + pastePaths_ = pastePaths; + } + + QTextCursor finding (const QString& str, const QTextCursor& start, + QTextDocument::FindFlags flags = QTextDocument::FindFlags(), + bool isRegex = false, const int end = 0) const; + signals: /* inform the main widget */ void fileDropped (const QString& localFile, @@ -240,13 +274,20 @@ int posInLine, // Only for connecting to FPwin::newTabFromName(). bool multiple); // Multiple files are dropped? void resized(); // needed by syntax highlighting - void updateRect (const QRect &rect, int dy); + void updateRect(); void zoomedOut (TextEdit *textEdit); // needed for reformatting text void updateBracketMatching(); public slots: void copy(); void cut(); + void undo(); + void redo(); + void paste(); + void selectAll(); + void insertPlainText (const QString &text); + void selectionHlight(); + void onContentsChange (int position, int charsRemoved, int charsAdded); protected: void keyPressEvent (QKeyEvent *event); @@ -265,22 +306,29 @@ /* we want to pass dropping of files to the main widget with a custom signal */ - bool canInsertFromMimeData (const QMimeData* source) const - { + bool canInsertFromMimeData (const QMimeData* source) const { return source->hasUrls() || QPlainTextEdit::canInsertFromMimeData (source); } - void insertFromMimeData (const QMimeData* source) - { + void insertFromMimeData (const QMimeData* source) { + keepTxtCurHPos_ = false; if (source->hasUrls()) { + txtCurHPos_ = -1; // Qt bug: cursorPositionChanged() isn't emitted with file dropping const QList urlList = source->urls(); bool multiple (urlList.count() > 1); for (const QUrl &url : urlList) - emit fileDropped (url.adjusted (QUrl::NormalizePathSegments) // KDE may give a double slash - .toLocalFile(), - 0, - 0, - multiple); + { + QString file; + QString scheme = url.scheme(); + if (scheme == "admin") // gvfs' "admin:///" + file = url.adjusted (QUrl::NormalizePathSegments).path(); + else if (scheme == "file" || scheme.isEmpty()) + file = url.adjusted (QUrl::NormalizePathSegments) // KDE may give a double slash + .toLocalFile(); + else + continue; + emit fileDropped (file, 0, 0, multiple); + } } else QPlainTextEdit::insertFromMimeData (source); @@ -289,7 +337,7 @@ private slots: void updateLineNumberAreaWidth (int newBlockCount); void highlightCurrentLine(); - void updateLineNumberArea (const QRect&, int); + void updateLineNumberArea (const QRect &rect, int dy); void onUpdateRequesting (const QRect&, int dy); void onSelectionChanged(); void scrollWithInertia(); @@ -299,28 +347,30 @@ QString remainingSpaces (const QString& spaceTab, const QTextCursor& cursor) const; QTextCursor backTabCursor(const QTextCursor& cursor, bool twoSpace) const; - int prevAnchor, prevPos; // used only for bracket matching - QWidget *lineNumberArea; - QTextEdit::ExtraSelection currentLine; - QRect lastCurrentLine; - int widestDigit; - bool autoIndentation; - bool autoReplace; - bool drawIndetLines; - bool autoBracket; - bool scrollJumpWorkaround; // for working around Qt5's scroll jump bug - int darkValue; - int bgColorValue_; // only used internally and as a workaround + int prevAnchor_, prevPos_; // used only for bracket matching + QWidget *lineNumberArea_; + QTextEdit::ExtraSelection currentLine_; + QRect lastCurrentLine_; + int widestDigit_; + bool autoIndentation_; + bool autoReplace_; + bool drawIndetLines_; + bool autoBracket_; + int darkValue_; + QColor separatorColor_; int vLineDistance_; QString dateFormat_; - QColor lineHColor; - int resizeTimerId, updateTimerId; // for not wasting CPU's time - int Dy; + QColor lineHColor_; + int resizeTimerId_, selectionTimerId_; // for not wasting CPU's time QPoint pressPoint_; // used internally for hyperlinks QPoint selectionPressPoint_; // used internally to delay dragging until mouse movement QFont font_; // used internally for keeping track of the unzoomed font QString textTab_; // text tab in terms of spaces QElapsedTimer tripleClickTimer_; + /* To keep text cursor's horizontal position with Up/Down keys + (also used in a workaround for a Qt regression): */ + bool keepTxtCurHPos_; + int txtCurHPos_; /******************************************** ***** All needed information on a page ***** ********************************************/ @@ -336,15 +386,21 @@ /* Highlighting order: (1) current line; (2) replacing; - (3) found matches; - (4) bracket matches. + (3) search matches; + (4) selection matches; + (5) bracket matches. */ QList greenSel_; // for replaced matches + QList blueSel_; // for selection highlighting QList redSel_; // for bracket matching + bool selectionHighlighting_; // should selections be highlighted? + bool highlightThisSelection_; // should this selection be highlighted? + bool removeSelectionHighlights_; // used only internally bool matchedBrackets_; // is bracket matching done (is FPwin::matchBrackets called)? bool uneditable_; // the doc should be made uneditable because of its contents QSyntaxHighlighter *highlighter_; // syntax highlighter bool saveCursor_; + bool pastePaths_; /****************************** ***** Inertial scrolling ***** ******************************/ diff -Nru featherpad-0.12.1/featherpad/vscrollbar.cpp featherpad-0.17.1/featherpad/vscrollbar.cpp --- featherpad-0.12.1/featherpad/vscrollbar.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/vscrollbar.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -19,7 +19,7 @@ #include "vscrollbar.h" #include -#if (QT_VERSION < QT_VERSION_CHECK(5,14,0)) +#if (QT_VERSION != QT_VERSION_CHECK(5,14,0)) #include #endif @@ -48,7 +48,7 @@ return QScrollBar::event (event); } /*************************/ -#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0)) +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) void HScrollBar::wheelEvent (QWheelEvent *event) { if (event->angleDelta().x() == 0) { diff -Nru featherpad-0.12.1/featherpad/vscrollbar.h featherpad-0.17.1/featherpad/vscrollbar.h --- featherpad-0.12.1/featherpad/vscrollbar.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/vscrollbar.h 2021-01-06 17:57:35.000000000 +0000 @@ -21,7 +21,7 @@ #define VSCROLLBAR_H #include -#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0)) +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) #include #endif @@ -42,7 +42,7 @@ int defaultWheelSpeed; }; -#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0)) +#if (QT_VERSION == QT_VERSION_CHECK(5,14,0)) /* A (temporary) workaround for Qt's horizontal scrollbar bug. */ class HScrollBar : public QScrollBar { diff -Nru featherpad-0.12.1/featherpad/warningbar.h featherpad-0.17.1/featherpad/warningbar.h --- featherpad-0.12.1/featherpad/warningbar.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/warningbar.h 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2019 + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2020 * * FeatherPad is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -22,11 +22,11 @@ #include #include +#include #include #include #include #include -#include #include #define DURATION 150 @@ -37,7 +37,8 @@ { Q_OBJECT public: - WarningBar (const QString& message, const int verticalOffset = 0, QWidget *parent = nullptr) : QWidget (parent) { + WarningBar (const QString& message, const int verticalOffset = 0, int timeout = 10, QWidget *parent = nullptr) + : QWidget (parent), timer_ (nullptr) { int anotherBar (false); if (parent) { // show only one warning bar at a time @@ -55,39 +56,25 @@ message_ = message; vOffset_ = verticalOffset; isClosing_ = false; + mousePressed_ = false; /* make it like a translucent layer */ setAutoFillBackground (true); QPalette p = palette(); p.setColor (foregroundRole(), Qt::white); - p.setColor (backgroundRole(), QColor (125, 0, 0, 200)); + p.setColor (backgroundRole(), timeout > 0 ? QColor (125, 0, 0, 200) : QColor (0, 70, 0, 210)); setPalette (p); grid_ = new QGridLayout; - grid_->setSpacing (5); - if (layoutDirection() == Qt::RightToLeft) - grid_->setContentsMargins (0, 0, 5 ,5); - else - grid_->setContentsMargins (5, 0, 0 ,5); // the top margin is added when setting the geometry + grid_->setContentsMargins (5, 0, 5 ,5); // the top margin is added when setting the geometry /* use a spacer to compress the label vertically */ QSpacerItem *spacer = new QSpacerItem (0, 0, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding); grid_->addItem (spacer, 0, 0); - /* add a close button */ - QToolButton *b = new QToolButton; - b->setAutoRaise (true); - b->setText (tr ("Close")); - - b->setToolButtonStyle (Qt::ToolButtonIconOnly); - b->setIconSize (QSize (16, 16)); - b->setIcon (QIcon (":icons/window-close.svg")); - b->setToolTip (tr ("Close")); - - connect (b, &QAbstractButton::clicked, this, &WarningBar::closeBar); /* add the label */ QLabel *warningLabel = new QLabel (message); + warningLabel->setAttribute (Qt::WA_TransparentForMouseEvents, true); // not needed warningLabel->setWordWrap (true); grid_->addWidget (warningLabel, 1, 0); - grid_->addWidget (b, 1, 1); setLayout (grid_); if (parent) @@ -109,6 +96,32 @@ } else show(); + /* auto-close */ + setTimeout (timeout); + } + + void setTimeout (int timeout) { // can be used to change the timeout + if (timeout <= 0) + { + if (timer_ != nullptr) + { + timer_->stop(); + delete timer_; + timer_ = nullptr; + } + } + else + { + if (timer_ == nullptr) + { + timer_ = new QTimer (this); + timer_->setSingleShot (true); + connect (timer_, &QTimer::timeout, this, [this]() { + if (!mousePressed_) closeBar(); + }); + } + timer_->start (timeout * 1000); + } } bool eventFilter (QObject *o, QEvent *e) { @@ -134,7 +147,7 @@ return isClosing_; } - public slots: +public slots: void closeBar() { if (animation_ && parentWidget()) { @@ -151,14 +164,30 @@ } else delete this; } + void closeBarOnScrolling (const QRect& /*rect*/, int dy) { + if (timer_ && dy != 0) closeBar(); + } + +protected: + void mousePressEvent (QMouseEvent *event) { + QWidget::mousePressEvent (event); + mousePressed_ = true; + } + void mouseReleaseEvent (QMouseEvent *event) { + QWidget::mouseReleaseEvent (event); + mousePressed_ = false; + if (timer_ != nullptr) + QTimer::singleShot (0, this, &WarningBar::closeBar); + } private: QString message_; int vOffset_; bool isClosing_; + bool mousePressed_; + QTimer *timer_; QGridLayout *grid_; QPointer animation_; - }; } diff -Nru featherpad-0.12.1/featherpad/x11.cpp featherpad-0.17.1/featherpad/x11.cpp --- featherpad-0.12.1/featherpad/x11.cpp 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/x11.cpp 2021-01-06 17:57:35.000000000 +0000 @@ -20,10 +20,8 @@ #include #include "x11.h" -#if defined Q_WS_X11 || defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_HURD #include #include -#endif namespace FeatherPad { @@ -37,7 +35,6 @@ { long res = -1; -#if defined Q_WS_X11 || defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_HURD Display *disp = QX11Info::display(); if (!disp) return res; @@ -62,7 +59,6 @@ res = *data; XFree (data); } -#endif return res; } @@ -72,7 +68,6 @@ { long res = -1; -#if defined Q_WS_X11 || defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_HURD Display *disp = QX11Info::display(); if (!disp) return res; @@ -95,7 +90,6 @@ res = (long)desktop[0]; XFree (desktop); } -#endif return res; } @@ -107,7 +101,6 @@ bool isWindowShaded (Window window) { -#if defined Q_WS_X11 || defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_HURD Display *disp = QX11Info::display(); if (!disp) return false; @@ -136,13 +129,11 @@ } } XFree (atoms); -#endif return false; } /*************************/ void unshadeWindow (Window window) { -#if defined Q_WS_X11 || defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_HURD Display *disp = QX11Info::display(); if (!disp) return; @@ -166,7 +157,6 @@ SubstructureRedirectMask | SubstructureNotifyMask, &xev); XFlush (disp); -#endif } } diff -Nru featherpad-0.12.1/featherpad/x11.h featherpad-0.17.1/featherpad/x11.h --- featherpad-0.12.1/featherpad/x11.h 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/featherpad/x11.h 2021-01-06 17:57:35.000000000 +0000 @@ -20,9 +20,15 @@ #ifndef X11_H #define X11_H -#if defined Q_WS_X11 || defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_HURD +/* +NOTE: This header should be included only if HAS_X11 is true, + which means that WITHOUT_X11 isn't used with compilation. + + Moreover, the following functions should be called only if + FeatherPad is running under X11. +*/ + #include -#endif namespace FeatherPad { diff -Nru featherpad-0.12.1/INSTALL featherpad-0.17.1/INSTALL --- featherpad-0.12.1/INSTALL 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/INSTALL 2021-01-06 17:57:35.000000000 +0000 @@ -2,7 +2,7 @@ * Compilation And Installation * ************************************ -First install build dependencies. In Debian-based systems, they are: +To compile FeatherPad from its source, first install build dependencies. In Debian-based systems, they are: * g++ >= 5 * libx11-dev and libxext-dev (for X11) diff -Nru featherpad-0.12.1/NEWS featherpad-0.17.1/NEWS --- featherpad-0.12.1/NEWS 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/NEWS 2021-01-06 17:57:35.000000000 +0000 @@ -1,5 +1,5 @@ Latest version: - 11 Jan 2020, V0.12.1 + 6 Jan 2021, V0.17.0 See "ChangeLog" for changes. diff -Nru featherpad-0.12.1/README.md featherpad-0.17.1/README.md --- featherpad-0.12.1/README.md 2020-01-11 04:33:17.000000000 +0000 +++ featherpad-0.17.1/README.md 2021-01-06 17:57:35.000000000 +0000 @@ -2,7 +2,7 @@ ## Overview -FeatherPad (by Pedram Pourang, a.k.a. Tsu Jan ) is a lightweight Qt5 plain-text editor for Linux. It is independent of any desktop environment and has: +FeatherPad (by Pedram Pourang, a.k.a. Tsu Jan ) is a lightweight Qt plain-text editor for Linux. It is independent of any desktop environment and has: * Drag-and-drop support, including tab detachment and attachment; * X11 virtual desktop awareness (using tabs on current desktop but opening a new window on another); @@ -10,6 +10,7 @@ * Instant highlighting of found matches when searching; * A docked window for text replacement; * Support for showing line numbers and jumping to a specific line; + * Optional selection highlighting; * Automatic detection of text encoding as far as possible and optional saving with encoding; * Syntax highlighting for common programming languages; * Ability to open URLs with appropriate applications; @@ -24,7 +25,7 @@ * macOS support (by [Pavel Shlyak](https://github.com/shlyakpavel)); and * Other features that can be found in its settings, on its menus or when it is actually used. -Please see INSTALL for instructions on compilation, installation and translation! (For translations, also see below.) +Please see [INSTALL](INSTALL) for instructions on compilation, installation and translation! FeatherPad was written in GTK+ at first, then ported to Qt with more features. Its homepage is . @@ -34,11 +35,3 @@ ![Tabs](screenshots/Tabs.png?raw=true "Tabs") ![Side-Pane](screenshots/Side-Pane.png?raw=true "Side-Pane") - -## Translations -FeatherPad is being translated using Weblate, a web tool designed to ease translating for both developers and translators. -If you would like to contribute to translation of FeatherPad, you need to register on the following server: - - -Translation status -