From da792807084f015ff001d7f9a09a8de11116dd6a Mon Sep 17 00:00:00 2001 From: Keyang556 <65295310+keyang556@users.noreply.github.com> Date: Sat, 16 May 2026 11:05:44 +0800 Subject: [PATCH 1/5] InputCompositionFix --- addon/appModules/notepad++/editWindow.py | 16 +++ tests/test_editWindow_inputComposition.py | 137 ++++++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 tests/test_editWindow_inputComposition.py diff --git a/addon/appModules/notepad++/editWindow.py b/addon/appModules/notepad++/editWindow.py index c5331fe..566ba99 100644 --- a/addon/appModules/notepad++/editWindow.py +++ b/addon/appModules/notepad++/editWindow.py @@ -12,6 +12,7 @@ except ImportError: from NVDAObjects.behaviors import EditableTextWithAutoSelectDetection as EditWindowBaseCls from NVDAObjects.behaviors import EditableTextWithSuggestions +from NVDAObjects.inputComposition import InputCompositionTextInfo from queueHandler import registerGeneratorObject import speech import textInfos @@ -25,6 +26,13 @@ addonHandler.initTranslation() +def _hasActiveInputComposition(obj): + """Return True when NVDA has current IME composition text for this object.""" + if getattr(obj, "isReading", False): + return bool(getattr(obj, "readingString", "")) + return bool(getattr(obj, "compositionString", "")) + + class EditWindow(EditWindowBaseCls, EditableTextWithSuggestions): """An edit window that implements all of the scripts on the edit field for Notepad++""" @@ -47,6 +55,14 @@ def initOverlayClass(self): # Nuke it. self.name = "" + def _get_TextInfo(self): + if _hasActiveInputComposition(self): + return InputCompositionTextInfo + superGetter = getattr(super(EditWindow, self), "_get_TextInfo", None) + if superGetter: + return superGetter() + return super(EditWindow, self).TextInfo + def script_goToMatchingBrace(self, gesture): gesture.send() info = self.makeTextInfo(textInfos.POSITION_CARET).copy() diff --git a/tests/test_editWindow_inputComposition.py b/tests/test_editWindow_inputComposition.py new file mode 100644 index 0000000..0764ee0 --- /dev/null +++ b/tests/test_editWindow_inputComposition.py @@ -0,0 +1,137 @@ +from __future__ import annotations + +import builtins +import importlib.util +import sys +import types +import unittest +from pathlib import Path + + +class _BaseScintilla: + TextInfo = "baseTextInfo" + + +class _BuiltinNppEdit(_BaseScintilla): + def _get_TextInfo(self): + if self.appModule.is64BitProcess and self.appModule.productVersion.startswith("8.95"): + return "npp83TextInfo" + return super().TextInfo + + +def _installNvdaStubs() -> None: + addonHandler = types.ModuleType("addonHandler") + + def initTranslation(): + builtins._ = lambda message: message + + addonHandler.initTranslation = initTranslation + sys.modules["addonHandler"] = addonHandler + + config = types.ModuleType("config") + config.conf = {"notepadPp": {}} + sys.modules["config"] = config + + nvdaObjects = types.ModuleType("NVDAObjects") + nvdaObjects.__path__ = [] + sys.modules["NVDAObjects"] = nvdaObjects + + behaviors = types.ModuleType("NVDAObjects.behaviors") + behaviors.EditableTextWithAutoSelectDetection = _BaseScintilla + behaviors.EditableTextWithSuggestions = type("EditableTextWithSuggestions", (), {}) + sys.modules["NVDAObjects.behaviors"] = behaviors + + inputComposition = types.ModuleType("NVDAObjects.inputComposition") + inputComposition.InputCompositionTextInfo = "compositionTextInfo" + sys.modules["NVDAObjects.inputComposition"] = inputComposition + + nvdaBuiltin = types.ModuleType("nvdaBuiltin") + nvdaBuiltin.__path__ = [] + sys.modules["nvdaBuiltin"] = nvdaBuiltin + + builtinAppModules = types.ModuleType("nvdaBuiltin.appModules") + builtinAppModules.__path__ = [] + sys.modules["nvdaBuiltin.appModules"] = builtinAppModules + + builtinNpp = types.ModuleType("nvdaBuiltin.appModules.notepadPlusPlus") + builtinNpp.NppEdit = _BuiltinNppEdit + sys.modules["nvdaBuiltin.appModules.notepadPlusPlus"] = builtinNpp + + queueHandler = types.ModuleType("queueHandler") + queueHandler.registerGeneratorObject = lambda generator: None + sys.modules["queueHandler"] = queueHandler + + speech = types.ModuleType("speech") + speech.speakMessage = lambda message: None + sys.modules["speech"] = speech + + textInfos = types.ModuleType("textInfos") + textInfos.POSITION_CARET = object() + textInfos.POSITION_SELECTION = object() + textInfos.UNIT_CHARACTER = object() + textInfos.UNIT_LINE = object() + sys.modules["textInfos"] = textInfos + + tones = types.ModuleType("tones") + tones.beep = lambda hz, length: None + sys.modules["tones"] = tones + + ui = types.ModuleType("ui") + ui.message = lambda message: None + sys.modules["ui"] = ui + + sys.modules["eventHandler"] = types.ModuleType("eventHandler") + sys.modules["scriptHandler"] = types.ModuleType("scriptHandler") + + +def _loadEditWindowModule(): + _installNvdaStubs() + modulePath = Path(__file__).parents[1] / "addon" / "appModules" / "notepad++" / "editWindow.py" + spec = importlib.util.spec_from_file_location("addon_editWindow", modulePath) + assert spec and spec.loader + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +class EditWindowInputCompositionTest(unittest.TestCase): + def test_composition_text_info_is_prioritized_over_npp83_text_info(self): + module = _loadEditWindowModule() + obj = module.EditWindow() + obj.appModule = types.SimpleNamespace(is64BitProcess=True, productVersion="8.95.0.0") + obj.compositionString = "\u70cf\u9f9c" + obj.isReading = False + + self.assertEqual(obj._get_TextInfo(), "compositionTextInfo") + + def test_reading_string_counts_as_active_input_composition(self): + module = _loadEditWindowModule() + obj = module.EditWindow() + obj.appModule = types.SimpleNamespace(is64BitProcess=True, productVersion="8.95.0.0") + obj.compositionString = "" + obj.readingString = "\u70cf\u9f9c" + obj.isReading = True + + self.assertEqual(obj._get_TextInfo(), "compositionTextInfo") + + def test_npp83_text_info_is_used_without_composition(self): + module = _loadEditWindowModule() + obj = module.EditWindow() + obj.appModule = types.SimpleNamespace(is64BitProcess=True, productVersion="8.95.0.0") + obj.compositionString = "" + obj.isReading = False + + self.assertEqual(obj._get_TextInfo(), "npp83TextInfo") + + def test_base_scintilla_text_info_is_kept_for_older_notepad_plus_plus(self): + module = _loadEditWindowModule() + obj = module.EditWindow() + obj.appModule = types.SimpleNamespace(is64BitProcess=True, productVersion="8.21.0.0") + obj.compositionString = "" + obj.isReading = False + + self.assertEqual(obj._get_TextInfo(), "baseTextInfo") + + +if __name__ == "__main__": + unittest.main() From d196f256baf6e31de70350935266d63aa8ddf480 Mon Sep 17 00:00:00 2001 From: Keyang556 <65295310+keyang556@users.noreply.github.com> Date: Sat, 16 May 2026 11:09:16 +0800 Subject: [PATCH 2/5] Delete test_editWindow_inputComposition.py --- tests/test_editWindow_inputComposition.py | 137 ---------------------- 1 file changed, 137 deletions(-) delete mode 100644 tests/test_editWindow_inputComposition.py diff --git a/tests/test_editWindow_inputComposition.py b/tests/test_editWindow_inputComposition.py deleted file mode 100644 index 0764ee0..0000000 --- a/tests/test_editWindow_inputComposition.py +++ /dev/null @@ -1,137 +0,0 @@ -from __future__ import annotations - -import builtins -import importlib.util -import sys -import types -import unittest -from pathlib import Path - - -class _BaseScintilla: - TextInfo = "baseTextInfo" - - -class _BuiltinNppEdit(_BaseScintilla): - def _get_TextInfo(self): - if self.appModule.is64BitProcess and self.appModule.productVersion.startswith("8.95"): - return "npp83TextInfo" - return super().TextInfo - - -def _installNvdaStubs() -> None: - addonHandler = types.ModuleType("addonHandler") - - def initTranslation(): - builtins._ = lambda message: message - - addonHandler.initTranslation = initTranslation - sys.modules["addonHandler"] = addonHandler - - config = types.ModuleType("config") - config.conf = {"notepadPp": {}} - sys.modules["config"] = config - - nvdaObjects = types.ModuleType("NVDAObjects") - nvdaObjects.__path__ = [] - sys.modules["NVDAObjects"] = nvdaObjects - - behaviors = types.ModuleType("NVDAObjects.behaviors") - behaviors.EditableTextWithAutoSelectDetection = _BaseScintilla - behaviors.EditableTextWithSuggestions = type("EditableTextWithSuggestions", (), {}) - sys.modules["NVDAObjects.behaviors"] = behaviors - - inputComposition = types.ModuleType("NVDAObjects.inputComposition") - inputComposition.InputCompositionTextInfo = "compositionTextInfo" - sys.modules["NVDAObjects.inputComposition"] = inputComposition - - nvdaBuiltin = types.ModuleType("nvdaBuiltin") - nvdaBuiltin.__path__ = [] - sys.modules["nvdaBuiltin"] = nvdaBuiltin - - builtinAppModules = types.ModuleType("nvdaBuiltin.appModules") - builtinAppModules.__path__ = [] - sys.modules["nvdaBuiltin.appModules"] = builtinAppModules - - builtinNpp = types.ModuleType("nvdaBuiltin.appModules.notepadPlusPlus") - builtinNpp.NppEdit = _BuiltinNppEdit - sys.modules["nvdaBuiltin.appModules.notepadPlusPlus"] = builtinNpp - - queueHandler = types.ModuleType("queueHandler") - queueHandler.registerGeneratorObject = lambda generator: None - sys.modules["queueHandler"] = queueHandler - - speech = types.ModuleType("speech") - speech.speakMessage = lambda message: None - sys.modules["speech"] = speech - - textInfos = types.ModuleType("textInfos") - textInfos.POSITION_CARET = object() - textInfos.POSITION_SELECTION = object() - textInfos.UNIT_CHARACTER = object() - textInfos.UNIT_LINE = object() - sys.modules["textInfos"] = textInfos - - tones = types.ModuleType("tones") - tones.beep = lambda hz, length: None - sys.modules["tones"] = tones - - ui = types.ModuleType("ui") - ui.message = lambda message: None - sys.modules["ui"] = ui - - sys.modules["eventHandler"] = types.ModuleType("eventHandler") - sys.modules["scriptHandler"] = types.ModuleType("scriptHandler") - - -def _loadEditWindowModule(): - _installNvdaStubs() - modulePath = Path(__file__).parents[1] / "addon" / "appModules" / "notepad++" / "editWindow.py" - spec = importlib.util.spec_from_file_location("addon_editWindow", modulePath) - assert spec and spec.loader - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - return module - - -class EditWindowInputCompositionTest(unittest.TestCase): - def test_composition_text_info_is_prioritized_over_npp83_text_info(self): - module = _loadEditWindowModule() - obj = module.EditWindow() - obj.appModule = types.SimpleNamespace(is64BitProcess=True, productVersion="8.95.0.0") - obj.compositionString = "\u70cf\u9f9c" - obj.isReading = False - - self.assertEqual(obj._get_TextInfo(), "compositionTextInfo") - - def test_reading_string_counts_as_active_input_composition(self): - module = _loadEditWindowModule() - obj = module.EditWindow() - obj.appModule = types.SimpleNamespace(is64BitProcess=True, productVersion="8.95.0.0") - obj.compositionString = "" - obj.readingString = "\u70cf\u9f9c" - obj.isReading = True - - self.assertEqual(obj._get_TextInfo(), "compositionTextInfo") - - def test_npp83_text_info_is_used_without_composition(self): - module = _loadEditWindowModule() - obj = module.EditWindow() - obj.appModule = types.SimpleNamespace(is64BitProcess=True, productVersion="8.95.0.0") - obj.compositionString = "" - obj.isReading = False - - self.assertEqual(obj._get_TextInfo(), "npp83TextInfo") - - def test_base_scintilla_text_info_is_kept_for_older_notepad_plus_plus(self): - module = _loadEditWindowModule() - obj = module.EditWindow() - obj.appModule = types.SimpleNamespace(is64BitProcess=True, productVersion="8.21.0.0") - obj.compositionString = "" - obj.isReading = False - - self.assertEqual(obj._get_TextInfo(), "baseTextInfo") - - -if __name__ == "__main__": - unittest.main() From cd7cf5723a1a9cb17f3bef6bcfe69237bc4e6f9f Mon Sep 17 00:00:00 2001 From: Keyang556 <65295310+keyang556@users.noreply.github.com> Date: Sun, 17 May 2026 09:51:38 +0800 Subject: [PATCH 3/5] delete supergeter --- addon/appModules/notepad++/editWindow.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/addon/appModules/notepad++/editWindow.py b/addon/appModules/notepad++/editWindow.py index 566ba99..a95bfe6 100644 --- a/addon/appModules/notepad++/editWindow.py +++ b/addon/appModules/notepad++/editWindow.py @@ -58,9 +58,6 @@ def initOverlayClass(self): def _get_TextInfo(self): if _hasActiveInputComposition(self): return InputCompositionTextInfo - superGetter = getattr(super(EditWindow, self), "_get_TextInfo", None) - if superGetter: - return superGetter() return super(EditWindow, self).TextInfo def script_goToMatchingBrace(self, gesture): From 1dd429a5120e0989ac3111ca5f8653e8e07b3db2 Mon Sep 17 00:00:00 2001 From: Keyang556 <65295310+keyang556@users.noreply.github.com> Date: Tue, 16 Jun 2026 15:07:28 +0800 Subject: [PATCH 4/5] zhtw --- addon/doc/zh_TW/readme.md | 75 ++++++++++++++++++++++ addon/locale/zh_TW/LC_MESSAGES/nvda.po | 86 ++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 addon/doc/zh_TW/readme.md create mode 100644 addon/locale/zh_TW/LC_MESSAGES/nvda.po diff --git a/addon/doc/zh_TW/readme.md b/addon/doc/zh_TW/readme.md new file mode 100644 index 0000000..3ff3145 --- /dev/null +++ b/addon/doc/zh_TW/readme.md @@ -0,0 +1,75 @@ +# NVDA 的 Notepad++ 增強附加元件 + +此附加元件改善 Notepad++ 的無障礙支援。Notepad++ 是 Windows 上的文字編輯器,具有許多功能,您可以在 [https://notepad-plus-plus.org][1] 了解更多資訊。 + +本附加元件最初由 Derek Riemer 和 Tuukka Ojala 撰寫,後續功能則由 Robert Hänggi 和 Andre9642 加入。 + +## 功能: + +### 支援書籤 + +Notepad++ 允許您在文字中設定書籤。書籤可讓您在任何時候快速回到編輯器中的某個位置。 + +若要設定書籤,請在要加入書籤的行按 Ctrl+F2。 + +之後若要回到書籤位置,可按 F2 跳至下一個書籤,或按 Shift+F2 跳至上一個書籤。您可以依需要設定任意數量的書籤。 + +### 最大行長度提示 + +Notepad++ 有一個可用於檢查行長度的尺規。不過,這項功能對視障使用者既不容易操作,也不夠直覺。因此,本附加元件提供行長度聲音提示器,只要某一行超過指定的字元數就會發出嗶聲。 + +若要啟用此功能,請先切換到 Notepad++,再開啟 NVDA 功能表,並在設定中選擇 Notepad++。勾選「啟用行長度提示器」核取方塊,並視需要變更最大字元數。 + +啟用後,當您在過長的行之間移動,或移到超過最大長度的字元時,會聽到嗶聲。您也可以按 NVDA+G,直接跳到目前行中超過最大行長度後的第一個字元。 + +### 跳至相符的括號 + +在 Notepad++ 中,您可以按 Ctrl+B 跳至程式碼中相符的括號。若要使用此功能,游標必須位於要比對的括號內側一個字元處。 + +執行此命令時,NVDA 會讀出跳轉後所在的行;如果該行只包含一個括號,NVDA 還會讀出括號上一行與下一行,方便您掌握上下文。 + +補充:此功能不只適用於大括號,其他成對符號如中括號、括號,以及中文常用的成對標點,也可用來跳到相符的另一半。 + +### 自動完成 + +Notepad++ 的自動完成功能預設並不具備良好的無障礙支援。自動完成有許多問題,包括會顯示在浮動視窗中。為了讓此功能更容易使用,本附加元件做了三件事: + +1. 當自動完成建議出現時,會播放提示音;建議消失時則會播放反向提示音。 +2. 按向下或向上方向鍵時,會讀出下一個或上一個建議文字。 +3. 建議出現時,會讀出建議的文字。 + +註:若已連接點字顯示器,所有文字也會以點字顯示。目前這項功能仍屬實驗性質,如有問題歡迎回報。 + +### 輸入法選字修正 + +使用注音等中文輸入法在 Notepad++ 中輸入時,組字或選字期間的文字有時不會依 NVDA 的一般輸入法流程正確呈現。本附加元件會在偵測到正在組字或選字時,改用 NVDA 的輸入組字文字資訊,讓候選字、組字內容與游標位置的朗讀更穩定。 + +### 增量搜尋 + +Notepad++ 很實用的功能之一是增量搜尋。增量搜尋是一種搜尋模式:您在編輯欄位輸入要搜尋的文字時,文件會即時捲動並顯示搜尋結果。隨著輸入,文件會捲動到最可能符合搜尋字串的文字行,並醒目提示相符文字。程式也會顯示偵測到的相符數量,並提供按鈕移至下一個或上一個相符項目。 + +輸入時,NVDA 會讀出 Notepad++ 偵測到搜尋結果的文字行。NVDA 也會讀出相符項目數量,但只在數量變更時讀出。 + +找到想要的文字行後,只要按 Esc,游標就會停在該文字行。 + +若要開啟此對話方塊,請從「搜尋」功能表選擇「增量搜尋」,或按 Alt+Ctrl+I。 + +### 讀出目前行資訊 + +在任何時候按 NVDA+Shift+\(反斜線)會讀出以下資訊: + +* 行號。 +* 欄號,也就是您在該行中的位置。 +* 選取範圍大小,包括水平選取的字元數,以及垂直選取的字元數;垂直選取會形成矩形選取。只有相關選取範圍存在時才會讀出此資訊。 + +### 支援上一個/下一個搜尋結果 + +預設情況下,按 Ctrl+F 會開啟「尋找」對話方塊。若在此輸入文字並按 Enter,視窗中的相符文字會被選取,文件也會移至下一個搜尋結果。 + +在 Notepad++ 中,您可以按 F3 或 Shift+F3,分別向前或向後重複搜尋。NVDA 會讀出目前行,以及該行中代表搜尋結果的選取內容。 + +## 非預設 Notepad++ 快捷鍵 + +本附加元件預期 Notepad++ 使用預設快捷鍵。若您已變更快捷鍵,請依需要在 NVDA 的「輸入手勢」對話方塊中調整此應用程式模組的按鍵指令,使其對應到您的 Notepad++ 指令。本附加元件的所有指令都位於「Notepad++」類別下。 + +[1]: https://notepad-plus-plus.org diff --git a/addon/locale/zh_TW/LC_MESSAGES/nvda.po b/addon/locale/zh_TW/LC_MESSAGES/nvda.po new file mode 100644 index 0000000..e0f8857 --- /dev/null +++ b/addon/locale/zh_TW/LC_MESSAGES/nvda.po @@ -0,0 +1,86 @@ +# Traditional Chinese translation for the NotepadPlusPlus NVDA add-on. +# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the NotepadPlusPlus package. +# +msgid "" +msgstr "" +"Project-Id-Version: NotepadPlusPlus 2026.06.1\n" +"Report-Msgid-Bugs-To: nvda-translations@groups.io\n" +"POT-Creation-Date: 2022-06-07 18:54+0800\n" +"PO-Revision-Date: 2026-06-16 00:00+0800\n" +"Last-Translator: \n" +"Language-Team: Chinese Traditional\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#. Translators: Title for the settings panel in NVDA's multi-category settings +#. Add-on summary, usually the user visible name of the addon. +#. Translators: Summary for this add-on to be shown on installation and add-on information. +#: addon\appModules\notepad++\addonSettingsPanel.py:16 buildVars.py:25 +msgid "Notepad++" +msgstr "Notepad++ 增強" + +#: addon\appModules\notepad++\addonSettingsPanel.py:22 +msgid "Enable &line length indicator" +msgstr "啟用行長度提示器(&L)" + +#. Translators: Setting for maximum line length used by line length indicator +#: addon\appModules\notepad++\addonSettingsPanel.py:28 +msgid "&Maximum line length:" +msgstr "最大行長度(&M):" + +#: addon\appModules\notepad++\addonSettingsPanel.py:36 +msgid "Show autocomplete &suggestions in braille" +msgstr "以點字顯示自動完成建議(&S)" + +#. Translators: when pressed, goes to the matching brace in Notepad++ +#: addon\appModules\notepad++\editWindow.py:80 +msgid "Goes to the brace that matches the one under the caret" +msgstr "跳至游標所在成對符號的另一半" + +#. Translators: Script to move to the next bookmark in Notepad++. +#: addon\appModules\notepad++\editWindow.py:87 +msgid "Goes to the next bookmark" +msgstr "跳至下一個書籤" + +#. Translators: Script to move to the next bookmark in Notepad++. +#: addon\appModules\notepad++\editWindow.py:94 +msgid "Goes to the previous bookmark" +msgstr "跳至上一個書籤" + +#. Translators: Script to move the cursor to the first character on the current line that exceeds the users maximum allowed line length. +#: addon\appModules\notepad++\editWindow.py:150 +msgid "Moves to the first character that is after the maximum line length" +msgstr "將游標移至超過最大行長度後的第一個字元" + +#. Translators: Script that announces information about the current line. +#: addon\appModules\notepad++\editWindow.py:157 +msgid "Speak the line info item on the status bar" +msgstr "讀出狀態列中的目前行資訊" + +#. Translators: Message shown when there are no more search results in this direction using the notepad++ find command. +#: addon\appModules\notepad++\editWindow.py:169 +msgid "No more search results in this direction" +msgstr "此方向沒有更多搜尋結果" + +#. Translators: when pressed, goes to the Next search result in Notepad++ +#: addon\appModules\notepad++\editWindow.py:172 +msgid "" +"Queries the next or previous search result and speaks the selection and " +"current line." +msgstr "查詢上一個或下一個搜尋結果,並讀出選取內容與目前行。" + +#. Add-on description +#. Translators: Long description to be shown for this add-on on add-on information from add-ons manager +#: buildVars.py:28 +msgid "" +"Notepad++ App Module.\n" +"This addon improves the accessibility of Notepad ++. To learn more, press " +"the add-on help button." +msgstr "" +"Notepad++ 應用程式模組。\n" +"此附加元件改善 Notepad++ 的無障礙支援。若要深入了解,請按附加元件說明按鈕。" From 8d59a58e74f9d824174df764e734e4bc06ea159f Mon Sep 17 00:00:00 2001 From: Keyang556 <65295310+keyang556@users.noreply.github.com> Date: Tue, 16 Jun 2026 15:12:59 +0800 Subject: [PATCH 5/5] Fix typos in Chinese readme for Notepad++ addon --- addon/doc/zh_TW/readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addon/doc/zh_TW/readme.md b/addon/doc/zh_TW/readme.md index 3ff3145..5a37d3e 100644 --- a/addon/doc/zh_TW/readme.md +++ b/addon/doc/zh_TW/readme.md @@ -52,7 +52,7 @@ Notepad++ 很實用的功能之一是增量搜尋。增量搜尋是一種搜尋 找到想要的文字行後,只要按 Esc,游標就會停在該文字行。 -若要開啟此對話方塊,請從「搜尋」功能表選擇「增量搜尋」,或按 Alt+Ctrl+I。 +若要開啟此對話框,請從「搜尋」功能表選擇「增量搜尋」,或按 Alt+Ctrl+I。 ### 讀出目前行資訊 @@ -64,12 +64,12 @@ Notepad++ 很實用的功能之一是增量搜尋。增量搜尋是一種搜尋 ### 支援上一個/下一個搜尋結果 -預設情況下,按 Ctrl+F 會開啟「尋找」對話方塊。若在此輸入文字並按 Enter,視窗中的相符文字會被選取,文件也會移至下一個搜尋結果。 +預設情況下,按 Ctrl+F 會開啟「尋找」對話框。若在此輸入文字並按 Enter,視窗中的相符文字會被選取,文件也會移至下一個搜尋結果。 在 Notepad++ 中,您可以按 F3 或 Shift+F3,分別向前或向後重複搜尋。NVDA 會讀出目前行,以及該行中代表搜尋結果的選取內容。 ## 非預設 Notepad++ 快捷鍵 -本附加元件預期 Notepad++ 使用預設快捷鍵。若您已變更快捷鍵,請依需要在 NVDA 的「輸入手勢」對話方塊中調整此應用程式模組的按鍵指令,使其對應到您的 Notepad++ 指令。本附加元件的所有指令都位於「Notepad++」類別下。 +本附加元件預期 Notepad++ 使用預設快捷鍵。若您已變更快捷鍵,請依需要在 NVDA 的「輸入手勢」對話框中調整此應用程式模組的按鍵指令,使其對應到您的 Notepad++ 指令。本附加元件的所有指令都位於「Notepad++」類別下。 [1]: https://notepad-plus-plus.org