plsqlwks 0.2.3__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/PKG-INFO +130 -54
  2. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/README.md +127 -53
  3. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/doc/API.md +121 -1
  4. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/doc/ARCHITECTURE.md +27 -0
  5. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/doc/PLUGINS.md +26 -0
  6. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/doc/PLUGIN_CATALOG.md +153 -0
  7. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/__init__.py +1 -1
  8. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/metadata.py +128 -7
  9. plsqlwks-0.2.4/plsqlwks/db/schema_compare.py +385 -0
  10. plsqlwks-0.2.4/plsqlwks/db/schema_diagram.py +118 -0
  11. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/session.py +7 -1
  12. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/table_export.py +42 -0
  13. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/plugins/__init__.py +10 -0
  14. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/plugins/api.py +56 -0
  15. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/__init__.py +3 -0
  16. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/app.py +43 -7
  17. plsqlwks-0.2.4/plsqlwks/ui/browser.py +220 -0
  18. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/catalog.py +242 -30
  19. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/clipboard.py +49 -15
  20. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/commands.py +13 -12
  21. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/constants.py +23 -11
  22. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/dialogs.py +14 -6
  23. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/editor_controller.py +28 -8
  24. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/input_controller.py +9 -3
  25. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/keys.py +8 -0
  26. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/plugin_host.py +36 -0
  27. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/renderer.py +6 -1
  28. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/result_controller.py +27 -16
  29. plsqlwks-0.2.4/plsqlwks/ui/schema_compare.py +375 -0
  30. plsqlwks-0.2.4/plsqlwks/ui/schema_diagram.py +254 -0
  31. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/state.py +5 -0
  32. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/viewport.py +6 -0
  33. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks.egg-info/SOURCES.txt +14 -0
  34. plsqlwks-0.2.4/plugins/er-diagram/install.plw +7 -0
  35. plsqlwks-0.2.4/plugins/er-diagram/payload/plugin.py +36 -0
  36. plsqlwks-0.2.4/plugins/er-diagram/payload/writer.py +252 -0
  37. plsqlwks-0.2.4/plugins/packages/er-diagram-0.1.3.plwgn +0 -0
  38. plsqlwks-0.2.4/plugins/packages/schema-compare-0.1.0.plwgn +0 -0
  39. plsqlwks-0.2.4/plugins/schema-compare/install.plw +7 -0
  40. plsqlwks-0.2.4/plugins/schema-compare/payload/plugin.py +22 -0
  41. plsqlwks-0.2.4/plugins/schema-compare/payload/writer.py +172 -0
  42. plsqlwks-0.2.4/plugins/table-ddl-export/payload/__init__.py +0 -0
  43. plsqlwks-0.2.4/plugins/xlsx-export/payload/__init__.py +0 -0
  44. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/pyproject.toml +3 -0
  45. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/tests/fixtures/ui_exports.txt +3 -0
  46. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/tools/putty_keys.ps1 +22 -7
  47. plsqlwks-0.2.3/plsqlwks/ui/browser.py +0 -124
  48. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/doc/COMPATIBILITY.md +0 -0
  49. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/doc/QUICKSTART.html +0 -0
  50. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/doc/QUICKSTART.md +0 -0
  51. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/license.txt +0 -0
  52. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/__main__.py +0 -0
  53. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/cli.py +0 -0
  54. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/config/__init__.py +0 -0
  55. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/config/loader.py +0 -0
  56. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/config/models.py +0 -0
  57. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/config/paths.py +0 -0
  58. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/config/session.py +0 -0
  59. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/config/settings.py +0 -0
  60. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/__init__.py +0 -0
  61. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/ddl_remap.py +0 -0
  62. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/dependencies.py +0 -0
  63. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/editing.py +0 -0
  64. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/execution.py +0 -0
  65. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/explain.py +0 -0
  66. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/health.py +0 -0
  67. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/identifiers.py +0 -0
  68. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/models.py +0 -0
  69. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/sql_analysis.py +0 -0
  70. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/table_export_catalog.py +0 -0
  71. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/timestamps.py +0 -0
  72. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/db/transactions.py +0 -0
  73. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/exporting.py +0 -0
  74. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/plugins/loader.py +0 -0
  75. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/plugins/management.py +0 -0
  76. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/sqlbinds.py +0 -0
  77. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/sqlsplit.py +0 -0
  78. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/application_controller.py +0 -0
  79. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/buffer.py +0 -0
  80. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/code_generation.py +0 -0
  81. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/command_dispatcher.py +0 -0
  82. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/completion.py +0 -0
  83. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/db_operations.py +0 -0
  84. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/db_session.py +0 -0
  85. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/db_worker.py +0 -0
  86. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/dependency_walker.py +0 -0
  87. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/display.py +0 -0
  88. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/documents.py +0 -0
  89. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/errors.py +0 -0
  90. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/help.py +0 -0
  91. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/key_reader.py +0 -0
  92. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/menu.py +0 -0
  93. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/output_selection.py +0 -0
  94. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/ports.py +0 -0
  95. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/query_controller.py +0 -0
  96. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/result_export.py +0 -0
  97. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/result_presenter.py +0 -0
  98. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/results.py +0 -0
  99. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/sql.py +0 -0
  100. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/sqlplus.py +0 -0
  101. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/syntax.py +0 -0
  102. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/ui/table_export.py +0 -0
  103. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plsqlwks/workspace.py +0 -0
  104. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/csv-export/install.plw +0 -0
  105. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/csv-export/payload/__init__.py +0 -0
  106. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/csv-export/payload/plugin.py +0 -0
  107. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/csv-export/payload/support.py +0 -0
  108. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/csv-export/payload/writer.py +0 -0
  109. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/csv2oratab/install.plw +0 -0
  110. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/csv2oratab/payload/__init__.py +0 -0
  111. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/csv2oratab/payload/csv2oratab.py +0 -0
  112. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/csv2oratab/payload/plugin.py +0 -0
  113. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/dependencies-walker/install.plw +0 -0
  114. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/dependencies-walker/payload/__init__.py +0 -0
  115. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/dependencies-walker/payload/plugin.py +0 -0
  116. {plsqlwks-0.2.3/plugins/html-export → plsqlwks-0.2.4/plugins/er-diagram}/payload/__init__.py +0 -0
  117. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/html-export/install.plw +0 -0
  118. {plsqlwks-0.2.3/plugins/sqlplus → plsqlwks-0.2.4/plugins/html-export}/payload/__init__.py +0 -0
  119. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/html-export/payload/html_exporting.py +0 -0
  120. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/html-export/payload/plugin.py +0 -0
  121. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/html-export/payload/support.py +0 -0
  122. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/html-export/payload/writer.py +0 -0
  123. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/packages/csv-export-1.0.0.plwgn +0 -0
  124. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/packages/csv2oratab-0.1.0.plwgn +0 -0
  125. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/packages/dependencies-walker-0.1.0.plwgn +0 -0
  126. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/packages/html-export-1.0.0.plwgn +0 -0
  127. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/packages/sqlplus-0.1.0.plwgn +0 -0
  128. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/packages/table-ddl-export-0.1.1.plwgn +0 -0
  129. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/packages/xlsx-export-1.0.0.plwgn +0 -0
  130. {plsqlwks-0.2.3/plugins/table-ddl-export → plsqlwks-0.2.4/plugins/schema-compare}/payload/__init__.py +0 -0
  131. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/sqlplus/install.plw +0 -0
  132. {plsqlwks-0.2.3/plugins/xlsx-export → plsqlwks-0.2.4/plugins/sqlplus}/payload/__init__.py +0 -0
  133. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/sqlplus/payload/plugin.py +0 -0
  134. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/table-ddl-export/install.plw +0 -0
  135. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/table-ddl-export/payload/plugin.py +0 -0
  136. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/xlsx-export/install.plw +0 -0
  137. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/xlsx-export/payload/plugin.py +0 -0
  138. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/xlsx-export/payload/support.py +0 -0
  139. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/plugins/xlsx-export/payload/xlsx_exporting.py +0 -0
  140. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/pytest.ini +0 -0
  141. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/rchar.py +0 -0
  142. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/requirements.txt +0 -0
  143. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/setup.cfg +0 -0
  144. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/tests/conftest.py +0 -0
  145. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/tests/fixtures/config_exports.txt +0 -0
  146. {plsqlwks-0.2.3 → plsqlwks-0.2.4}/tools/windows_keys.cmd +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plsqlwks
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: An ncurses SQL and PL/SQL workspace for Oracle databases.
5
5
  Author: unu2000
6
6
  License-Expression: LicenseRef-plsqlwks-Donationware
@@ -19,6 +19,8 @@ Requires-Python: >=3.10
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: license.txt
21
21
  Requires-Dist: oracledb>=2.0
22
+ Provides-Extra: er-diagram
23
+ Requires-Dist: CairoSVG>=2.9.1; extra == "er-diagram"
22
24
  Provides-Extra: csv2oratab
23
25
  Requires-Dist: cryptography>=42; extra == "csv2oratab"
24
26
  Provides-Extra: xlsx
@@ -617,10 +619,10 @@ Use left Alt for application shortcuts; AltGr remains available for characters
617
619
  on international keyboards. Shortcut digits and symbols refer to the character
618
620
  on the active Windows layout: for example, Czech top-row digits need Shift,
619
621
  so Alt-1 is typed with Alt-Shift-1. Use the layout's `+` or `=` character for
620
- autocomplete refresh. Clipboard preferences choose application copy targets
621
- and paste sources; on a Linux SSH host the ordinary shortcuts default to the
622
- Linux clipboard. Ctrl-Shift-C copies internally and Ctrl-Shift-V defaults to
623
- internal paste. SSH does not expose the Windows clipboard to the host. Use
622
+ autocomplete refresh. Ctrl-C/Ctrl-P copy/paste internally, Ctrl-Shift-C/Ctrl-Shift-P
623
+ use the Windows system clipboard, and Alt-Shift-C/Alt-Shift-P use the Linux
624
+ clipboard. Ctrl-V and Ctrl-Shift-V retain their configured paste sources;
625
+ Ctrl-Shift-V defaults to internal paste. SSH does not expose the Windows clipboard to the host. Use
624
626
  PuTTY's native paste (`Shift-Insert` or
625
627
  right-click) to insert Windows clipboard text as bracketed paste, and PuTTY
626
628
  mouse selection to copy to Windows. Leave plsqlwks' Ctrl-letter shortcuts
@@ -688,30 +690,31 @@ also works from Command Prompt and continues to support PuTTY.
688
690
 
689
691
  ### Windows Terminal and WSL clipboard shortcuts
690
692
 
691
- There are two main sources in WSL: plsqlwks' internal clipboard and the Windows
692
- clipboard. Linux desktop access uses Wayland/X11; WSLg can bridge Linux and
693
- Windows contents, so these are not necessarily three independent clipboards.
693
+ PLSQLWKS provides three clipboard methods: System (Windows), WSL/Linux
694
+ (Wayland/X11), and Internal. WSLg can bridge Windows and Linux contents, so the
695
+ two external methods may access shared contents.
694
696
 
695
- Open **Alt-O → Preferences → Clipboard** to choose external copy destinations
696
- and the source of each paste shortcut. Save persists the choices in your
697
- workspace's `config.ini`; Cancel discards changes. Internal copy is always
698
- enabled. Capabilities / latest failure shows available readers/writers and the
699
- latest backend error without displaying clipboard contents.
700
-
701
- | Shortcut | Default on WSL/Windows |
702
- | --- | --- |
703
- | `Ctrl-C` | Copy internally and to Windows |
704
- | `Ctrl-Shift-C` | Copy internally only |
705
- | `Ctrl-V` | Paste from Windows |
706
- | `Ctrl-Shift-V` | Paste internally |
707
-
708
- `Ctrl-X` cuts using the ordinary copy destinations and remains one immediate
709
- Undo edit. `Ctrl-C` interrupts a running database operation first. These copy
710
- shortcuts work for editor selections, result cells/ranges, DBMS_OUTPUT
711
- selections and schema-browser object names. Existing paste-enabled prompts and
712
- cell editors honor both paste-source preferences. New workspaces without
713
- Windows tools default ordinary copy/paste to Linux; explicit settings always
714
- win, even if the selected backend is unavailable.
697
+ | Clipboard | Copy | Paste |
698
+ | --- | --- | --- |
699
+ | System (Windows) | `Ctrl-Shift-C` | `Ctrl-Shift-P` |
700
+ | WSL/Linux | `Alt-Shift-C` | `Alt-Shift-P` |
701
+ | Internal | `Ctrl-C` | `Ctrl-P` |
702
+
703
+ Each fixed shortcut uses only its assigned target. Copying externally leaves
704
+ the internal clipboard unchanged. `Ctrl-C` interrupts a running database
705
+ operation first; otherwise it copies internally. `Ctrl-Alt-C` still commits or
706
+ applies the active insert draft, and `Ctrl-Alt-R` rolls back.
707
+ The copy shortcuts work for editor selections, result cells/ranges,
708
+ DBMS_OUTPUT selections and schema-browser object names. Paste works in the
709
+ worksheet, paste-enabled prompts and editable cell text dialogs.
710
+
711
+ Open **Alt-O → Preferences → Clipboard** to inspect the fixed shortcuts and
712
+ backend capabilities, configure legacy copy/cut destinations and choose the
713
+ sources for `Ctrl-V` and `Ctrl-Shift-V`. Save persists settings in your workspace
714
+ `config.ini`; Cancel discards changes. The new C/P shortcuts ignore these
715
+ settings. `Ctrl-X` and legacy copy commands retain configured destinations and
716
+ an internal copy; cut remains one immediate Undo edit. New workspaces without
717
+ Windows tools default legacy copy/paste to Linux.
715
718
 
716
719
  ```ini
717
720
  [clipboard]
@@ -724,20 +727,25 @@ ctrl_shift_v_source = internal
724
727
  Paste sources are `windows`, `internal`, or `linux`. Windows paste reads Windows
725
728
  exclusively: failure or empty contents causes no insertion and explicit
726
729
  feedback. Internal paste performs no OS access and cancels a pending paste for
727
- that target. Copy updates internal text immediately, then attempts every enabled
728
- external destination in a background worker. Windows copy tries PowerShell,
730
+ that target. The fixed copy shortcuts update only their selected clipboard;
731
+ legacy copy/cut updates internal text immediately and then attempts configured
732
+ external destinations in a background worker. Windows copy tries PowerShell,
729
733
  then `clip.exe` on failure, and verifies contents by readback when a reader is
730
734
  available. Copy-only Windows access is labelled unverified. Each Linux provider
731
735
  is attempted when Linux copying is enabled. A Linux success does not conceal a
732
736
  Windows failure.
733
737
 
734
- Windows Terminal normally consumes all four shortcuts for its own copy/paste.
735
- To let plsqlwks receive them, open **Settings → Open JSON file** and add these
738
+ If Windows Terminal consumes a shortcut, forward it to PLSQLWKS.
739
+ To configure explicit forwarding, open **Settings → Open JSON file** and add these
736
740
  entries to `actions`, keeping the other actions:
737
741
 
738
742
  ```json
739
- { "command": { "action": "sendInput", "input": "\u0003" }, "id": "User.PlsqlwksCopy" },
740
- { "command": { "action": "sendInput", "input": "\u001b[99;6u" }, "id": "User.PlsqlwksInternalCopy" },
743
+ { "command": { "action": "sendInput", "input": "\u0003" }, "id": "User.PlsqlwksInternalCopy" },
744
+ { "command": { "action": "sendInput", "input": "\u0010" }, "id": "User.PlsqlwksInternalPaste" },
745
+ { "command": { "action": "sendInput", "input": "\u001b[99;6u" }, "id": "User.PlsqlwksSystemCopy" },
746
+ { "command": { "action": "sendInput", "input": "\u001b[112;6u" }, "id": "User.PlsqlwksSystemPaste" },
747
+ { "command": { "action": "sendInput", "input": "\u001b[99;4u" }, "id": "User.PlsqlwksWslCopy" },
748
+ { "command": { "action": "sendInput", "input": "\u001b[112;4u" }, "id": "User.PlsqlwksWslPaste" },
741
749
  { "command": { "action": "sendInput", "input": "\u0016" }, "id": "User.PlsqlwksPaste" },
742
750
  { "command": { "action": "sendInput", "input": "\u001b[118;6u" }, "id": "User.PlsqlwksAlternatePaste" }
743
751
  ```
@@ -746,8 +754,12 @@ Replace the existing copy/paste entries in `keybindings` with
746
754
  the entries below, keeping the other keybindings:
747
755
 
748
756
  ```json
749
- { "id": "User.PlsqlwksCopy", "keys": "ctrl+c" },
750
- { "id": "User.PlsqlwksInternalCopy", "keys": "ctrl+shift+c" },
757
+ { "id": "User.PlsqlwksInternalCopy", "keys": "ctrl+c" },
758
+ { "id": "User.PlsqlwksInternalPaste", "keys": "ctrl+p" },
759
+ { "id": "User.PlsqlwksSystemCopy", "keys": "ctrl+shift+c" },
760
+ { "id": "User.PlsqlwksSystemPaste", "keys": "ctrl+shift+p" },
761
+ { "id": "User.PlsqlwksWslCopy", "keys": "alt+shift+c" },
762
+ { "id": "User.PlsqlwksWslPaste", "keys": "alt+shift+p" },
751
763
  { "id": "User.PlsqlwksPaste", "keys": "ctrl+v" },
752
764
  { "id": "User.PlsqlwksAlternatePaste", "keys": "ctrl+shift+v" }
753
765
  ```
@@ -755,7 +767,7 @@ the entries below, keeping the other keybindings:
755
767
  This setting applies to every Windows Terminal profile and tab. Restart
756
768
  plsqlwks after upgrading and reopen Windows Terminal if it retains old bindings.
757
769
  The command menu offers equivalents when a terminal intercepts the shortcuts.
758
- The optional `tools/putty_keys.ps1` helper also forwards all four shortcuts when
770
+ The optional `tools/putty_keys.ps1` helper also forwards these shortcuts when
759
771
  enabled for the active Windows terminal window.
760
772
 
761
773
  Keyboard navigation, resizing and dialogs remain available while clipboard
@@ -832,11 +844,13 @@ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/te
832
844
  | `Ctrl-F` | Open literal Find/Replace with the `Find next` action |
833
845
  | `Alt-O` -> **Editor** -> **Replace text** | Open Find/Replace at the replacement field |
834
846
  | `Ctrl-G` | Go to line |
835
- | `Ctrl-N` / `Ctrl-P` | Move to the next / previous search occurrence |
847
+ | `Ctrl-N` | Move to the next search occurrence |
848
+ | `Alt-O → Editor → Previous search match` | Move to the previous search occurrence |
836
849
  | `Ctrl-U` | Uppercase selected SQL code |
837
850
  | `Ctrl-L` | Lowercase selected SQL code |
838
- | `Ctrl-C` | Copy selected text |
839
- | `Ctrl-Shift-C` | Copy selected text internally only |
851
+ | `Ctrl-C` / `Ctrl-P` | Copy/paste internally |
852
+ | `Ctrl-Shift-C` / `Ctrl-Shift-P` | Copy/paste the System (Windows) clipboard |
853
+ | `Alt-Shift-C` / `Alt-Shift-P` | Copy/paste the WSL/Linux clipboard |
840
854
  | `Ctrl-X` | Cut selected text |
841
855
  | `Ctrl-V` | Paste clipboard text, expanding each tab to two spaces |
842
856
  | `Ctrl-Shift-V` | Paste the alternate source (internal by default) |
@@ -875,11 +889,12 @@ The dialog provides `Find next`, `Replace`, `Replace all`, and `Cancel` actions.
875
889
  and lowercase letters. `Replace` changes the selected matching occurrence, or
876
890
  the next match from the cursor, and then selects the following match. `Replace
877
891
  all` changes every match in the current buffer. Either replacement operation is
878
- recorded as one undoable edit. `Ctrl-N` and `Ctrl-P` repeat the last search with
879
- its case setting, forward or backward with wraparound.
892
+ recorded as one undoable edit. `Ctrl-N` repeats the last search forward;
893
+ **Alt-O → Editor → Previous search match** repeats it backward. Both retain the
894
+ case setting and wrap around.
880
895
 
881
896
  Editor paste expands every tab character to two spaces and keeps multiline
882
- text in one undoable edit. This applies to both configured paste shortcuts and
897
+ text in one undoable edit. This applies to all fixed and configured paste shortcuts and
883
898
  to native terminal paste while the editor is focused;
884
899
  clipboard contents themselves are not changed. Native paste requires a
885
900
  terminal that supports the standard bracketed-paste protocol, with `Ctrl-V`
@@ -926,8 +941,9 @@ Read-only mode is a client-side guardrail that rejects statements which the SQL
926
941
  | `Home` / `End` | Move to the first/last result-grid column |
927
942
  | `Ctrl-Home` / `Ctrl-End` | Move to the first/last result-grid row |
928
943
  | `F8` | Toggle result grid / row-detail output |
929
- | `Ctrl-C` | Copy one result cell immediately, or choose header handling for a rectangular selection |
930
- | `Ctrl-Shift-C` | Copy the same cell/range internally only |
944
+ | `Ctrl-C` | Copy a cell/range internally; ranges offer header handling |
945
+ | `Ctrl-Shift-C` | Copy the same cell/range to System (Windows) |
946
+ | `Alt-Shift-C` | Copy the same cell/range to WSL/Linux |
931
947
  | `F10` | View or edit a mapped text cell in a ROWID-backed result |
932
948
  | `Enter` | Edit the selected ROWID-backed result cell when available |
933
949
  | `INS` | Prepare a draft insert row for ROWID-backed results |
@@ -1016,8 +1032,9 @@ move within a displayed line; Ctrl+Home/End move to the output boundaries.
1016
1032
 
1017
1033
  Copying preserves the stored text, whitespace, blank lines, and statement
1018
1034
  headings, without screen wrapping or padding. The existing system clipboard
1019
- providers are used when available, with the internal clipboard as a fallback
1020
- (including remote PuTTY sessions). Ctrl+C still cancels a running operation
1035
+ backends are reused: Ctrl+C copies internally, Ctrl+Shift+C copies to Windows,
1036
+ and Alt+Shift+C copies to WSL/Linux. Fixed external shortcuts do not fall back
1037
+ to another clipboard. Ctrl+C still cancels a running operation
1021
1038
  before performing a copy. Selection belongs to its file tab, survives appended
1022
1039
  output and resizing, and resets when execution replaces the output.
1023
1040
 
@@ -1195,9 +1212,39 @@ validate this opt-in mode with the applications in use.
1195
1212
 
1196
1213
  ### Schema Browser
1197
1214
 
1198
- The `F9` schema browser groups tables, views, procedures, functions, packages, triggers, sequences, indexes, and private synonyms from the current schema. Type while the browser is focused to filter object names with a case-insensitive substring match; groups without matches are hidden and matching groups expand automatically without changing their saved expansion state. Exact quoted and mixed-case names are preserved when columns or definitions are loaded, with Oracle-safe quoting applied to metadata requests.
1199
-
1200
- Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load DDL`, or `Copy object name`. `Insert SELECT` adds a `select *` statement for the SQL-safe, unqualified object name to the current buffer and focuses the editor; it does not execute the query. `Copy object name` places that SQL-ready, unqualified identifier on the clipboard. For other object types, `Enter` offers `Load DDL` (the default) and `Copy object name`.
1215
+ The `F9` schema browser groups tables, views, procedures, functions, package specifications, package bodies, triggers, sequences, indexes, and private synonyms from the current schema. Type while the browser is focused to filter object names with a case-insensitive substring match; groups without matches are hidden and matching groups expand automatically without changing their saved expansion state. Exact quoted and mixed-case names are preserved when columns, routines or definitions are loaded, with Oracle-safe quoting applied to metadata requests.
1216
+
1217
+ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load DDL`, or `Copy object name`. `Insert SELECT` adds a `select *` statement for the SQL-safe, unqualified object name to the current buffer and focuses the editor; it does not execute the query. `Copy object name` places that SQL-ready, unqualified identifier on the clipboard. For standalone procedures, functions and other object types, `Enter` offers `Load DDL` (the default) and `Copy object name`.
1218
+
1219
+ Package specifications and bodies show their own compilation status immediately
1220
+ before the package name: `C` means compiled, `I` means invalid compilation and
1221
+ `?` means status unavailable. A compiled specification can have an invalid body.
1222
+ Press `Enter` on either part to load the specification, body or both, or copy
1223
+ the package name. The selected part is the default; unavailable parts are
1224
+ omitted. Each loading mode has its own tab, and loading both puts the
1225
+ specification before the body in one SQL buffer.
1226
+
1227
+ Press `Space` on either package part to expand its public procedures and
1228
+ functions, including while filtering. The browser loads signatures in the
1229
+ background and shares the cache between the two package sections. `P` marks a
1230
+ procedure and `F` a function; overloads have separate signature rows. Private
1231
+ body routines are excluded because a worksheet cannot call them.
1232
+ Press `Enter` on a routine to insert a default PL/SQL call block at the current
1233
+ cursor, replacing selected text as one undoable edit, and focus the editor.
1234
+ The block declares typed variables for every parameter, including parameters
1235
+ with defaults and OUT/IN OUT parameters, and a result variable for functions.
1236
+ Edit the input values before running it. Insertion does not execute or compile
1237
+ the call. Unsupported or incomplete signatures report a reason and leave the
1238
+ buffer unchanged.
1239
+
1240
+ Press `Space` on a table or view to expand or collapse its column subtree,
1241
+ including while filtering. Column names appear in database order and are loaded
1242
+ in the background on first expansion, then cached. Columns are informational
1243
+ leaf rows; object actions apply to their parent table or view. `Ctrl-F` opens an
1244
+ object-name filter prompt that accepts spaces. Filtering matches object names
1245
+ and shows all children beneath expanded matching objects. `Ctrl-R` refreshes
1246
+ objects and package statuses, clears cached columns and routines, and collapses
1247
+ object branches, retaining the filter and group expansion state.
1201
1248
 
1202
1249
  | Key | Action |
1203
1250
  | --- | --- |
@@ -1206,9 +1253,10 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1206
1253
  | `Esc` | Clear a nonempty filter, or return to the editor when the filter is empty |
1207
1254
  | `Up` / `Down` | Move through browser entries |
1208
1255
  | `PageUp` / `PageDown` | Move through browser entries by page |
1209
- | `Enter` | Expand a group or choose an action for an object |
1210
- | `Space` | Expand/collapse a group when the filter is empty, or add a space to the active filter |
1211
- | `Ctrl-R` | Refresh database objects |
1256
+ | `Enter` | Expand a group, choose an object action, or insert a package routine call |
1257
+ | `Space` | Expand/collapse table/view columns or package routines; on groups, expand/collapse with an empty filter or add a space to an active filter |
1258
+ | `Ctrl-F` | Edit the object-name filter, including spaces |
1259
+ | `Ctrl-R` | Refresh database objects/statuses and clear column/routine subtrees and caches |
1212
1260
 
1213
1261
  ### Cell Viewer
1214
1262
 
@@ -1220,7 +1268,7 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1220
1268
  | `PageUp` / `PageDown` | Scroll cell text by page |
1221
1269
  | `Home` / `End` | Move to the first/last cell-viewer line |
1222
1270
  | `Ctrl-S` (editor) | Save the multiline edit |
1223
- | `Ctrl-V` / `Ctrl-Shift-V` / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1271
+ | `Ctrl-P` / `Ctrl-Shift-P` / `Alt-Shift-P` / configured V keys / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1224
1272
  | `Enter` (editor) | Insert a newline |
1225
1273
  | `F10` / `Esc` / `Ctrl-Q` (editor) | Cancel the multiline edit |
1226
1274
 
@@ -1287,6 +1335,34 @@ for the exact manifest, source layout, validation, replacement, and trust rules.
1287
1335
 
1288
1336
  ### Table DDL Export
1289
1337
 
1338
+ ### Schema Compare
1339
+
1340
+ Install `plugins/packages/schema-compare-0.1.0.plwgn` and restart the updated
1341
+ host. **Alt-O -> Database -> Compare schema objects** chooses two schemas on
1342
+ the current connection and compares visible object names/types and logical
1343
+ definitions. Browse changed, one-sided, equal and unavailable objects; filter
1344
+ by name/type/status, open unified differences with Enter, and cycle original
1345
+ definitions with Tab. **Ctrl-E** exports all or filtered differences to CSV,
1346
+ HTML or XLSX, including summaries, line numbers and visibility notes. CSV/HTML
1347
+ need no extra; XLSX uses `plsqlwks[xlsx]`. The comparison preserves transactions,
1348
+ sequence state and the original editor/results. See the
1349
+ [catalog guide](doc/PLUGIN_CATALOG.md#schema-compare) for rules and limits.
1350
+
1351
+ ### E-R Diagram
1352
+
1353
+ Install `plugins/packages/er-diagram-0.1.3.plwgn` with `plsqlwks plugin install`
1354
+ and restart the updated host. **Alt-O -> Database -> Export E-R Diagram (SVG/PNG/PDF)**
1355
+ opens a **Bright / Dark** theme picker followed by an **SVG / PNG / PDF** format
1356
+ picker. Use arrow keys and Enter; defaults are Bright and SVG. Then filter and
1357
+ check current-schema tables and views and export their columns, keys and
1358
+ foreign-key relationships. Connectors show numbered foreign-key names matching
1359
+ the detailed relationship notes. Relative destinations use the results directory.
1360
+ SVG uses the standard library; PNG/PDF require the optional `er-diagram` extra
1361
+ and the Cairo library. See the catalog for installation instructions.
1362
+ See the [catalog guide](doc/PLUGIN_CATALOG.md#e-r-diagram) for controls and limits.
1363
+
1364
+ ### Table DDL Export
1365
+
1290
1366
  Install `plugins/packages/table-ddl-export-0.1.1.plwgn` with
1291
1367
  `plsqlwks plugin install` and restart. **Alt-O -> Database -> Export table DDL**
1292
1368
  lets you choose a schema, filter table names as you type, select tables, and
@@ -583,10 +583,10 @@ Use left Alt for application shortcuts; AltGr remains available for characters
583
583
  on international keyboards. Shortcut digits and symbols refer to the character
584
584
  on the active Windows layout: for example, Czech top-row digits need Shift,
585
585
  so Alt-1 is typed with Alt-Shift-1. Use the layout's `+` or `=` character for
586
- autocomplete refresh. Clipboard preferences choose application copy targets
587
- and paste sources; on a Linux SSH host the ordinary shortcuts default to the
588
- Linux clipboard. Ctrl-Shift-C copies internally and Ctrl-Shift-V defaults to
589
- internal paste. SSH does not expose the Windows clipboard to the host. Use
586
+ autocomplete refresh. Ctrl-C/Ctrl-P copy/paste internally, Ctrl-Shift-C/Ctrl-Shift-P
587
+ use the Windows system clipboard, and Alt-Shift-C/Alt-Shift-P use the Linux
588
+ clipboard. Ctrl-V and Ctrl-Shift-V retain their configured paste sources;
589
+ Ctrl-Shift-V defaults to internal paste. SSH does not expose the Windows clipboard to the host. Use
590
590
  PuTTY's native paste (`Shift-Insert` or
591
591
  right-click) to insert Windows clipboard text as bracketed paste, and PuTTY
592
592
  mouse selection to copy to Windows. Leave plsqlwks' Ctrl-letter shortcuts
@@ -654,30 +654,31 @@ also works from Command Prompt and continues to support PuTTY.
654
654
 
655
655
  ### Windows Terminal and WSL clipboard shortcuts
656
656
 
657
- There are two main sources in WSL: plsqlwks' internal clipboard and the Windows
658
- clipboard. Linux desktop access uses Wayland/X11; WSLg can bridge Linux and
659
- Windows contents, so these are not necessarily three independent clipboards.
657
+ PLSQLWKS provides three clipboard methods: System (Windows), WSL/Linux
658
+ (Wayland/X11), and Internal. WSLg can bridge Windows and Linux contents, so the
659
+ two external methods may access shared contents.
660
660
 
661
- Open **Alt-O → Preferences → Clipboard** to choose external copy destinations
662
- and the source of each paste shortcut. Save persists the choices in your
663
- workspace's `config.ini`; Cancel discards changes. Internal copy is always
664
- enabled. Capabilities / latest failure shows available readers/writers and the
665
- latest backend error without displaying clipboard contents.
666
-
667
- | Shortcut | Default on WSL/Windows |
668
- | --- | --- |
669
- | `Ctrl-C` | Copy internally and to Windows |
670
- | `Ctrl-Shift-C` | Copy internally only |
671
- | `Ctrl-V` | Paste from Windows |
672
- | `Ctrl-Shift-V` | Paste internally |
673
-
674
- `Ctrl-X` cuts using the ordinary copy destinations and remains one immediate
675
- Undo edit. `Ctrl-C` interrupts a running database operation first. These copy
676
- shortcuts work for editor selections, result cells/ranges, DBMS_OUTPUT
677
- selections and schema-browser object names. Existing paste-enabled prompts and
678
- cell editors honor both paste-source preferences. New workspaces without
679
- Windows tools default ordinary copy/paste to Linux; explicit settings always
680
- win, even if the selected backend is unavailable.
661
+ | Clipboard | Copy | Paste |
662
+ | --- | --- | --- |
663
+ | System (Windows) | `Ctrl-Shift-C` | `Ctrl-Shift-P` |
664
+ | WSL/Linux | `Alt-Shift-C` | `Alt-Shift-P` |
665
+ | Internal | `Ctrl-C` | `Ctrl-P` |
666
+
667
+ Each fixed shortcut uses only its assigned target. Copying externally leaves
668
+ the internal clipboard unchanged. `Ctrl-C` interrupts a running database
669
+ operation first; otherwise it copies internally. `Ctrl-Alt-C` still commits or
670
+ applies the active insert draft, and `Ctrl-Alt-R` rolls back.
671
+ The copy shortcuts work for editor selections, result cells/ranges,
672
+ DBMS_OUTPUT selections and schema-browser object names. Paste works in the
673
+ worksheet, paste-enabled prompts and editable cell text dialogs.
674
+
675
+ Open **Alt-O → Preferences → Clipboard** to inspect the fixed shortcuts and
676
+ backend capabilities, configure legacy copy/cut destinations and choose the
677
+ sources for `Ctrl-V` and `Ctrl-Shift-V`. Save persists settings in your workspace
678
+ `config.ini`; Cancel discards changes. The new C/P shortcuts ignore these
679
+ settings. `Ctrl-X` and legacy copy commands retain configured destinations and
680
+ an internal copy; cut remains one immediate Undo edit. New workspaces without
681
+ Windows tools default legacy copy/paste to Linux.
681
682
 
682
683
  ```ini
683
684
  [clipboard]
@@ -690,20 +691,25 @@ ctrl_shift_v_source = internal
690
691
  Paste sources are `windows`, `internal`, or `linux`. Windows paste reads Windows
691
692
  exclusively: failure or empty contents causes no insertion and explicit
692
693
  feedback. Internal paste performs no OS access and cancels a pending paste for
693
- that target. Copy updates internal text immediately, then attempts every enabled
694
- external destination in a background worker. Windows copy tries PowerShell,
694
+ that target. The fixed copy shortcuts update only their selected clipboard;
695
+ legacy copy/cut updates internal text immediately and then attempts configured
696
+ external destinations in a background worker. Windows copy tries PowerShell,
695
697
  then `clip.exe` on failure, and verifies contents by readback when a reader is
696
698
  available. Copy-only Windows access is labelled unverified. Each Linux provider
697
699
  is attempted when Linux copying is enabled. A Linux success does not conceal a
698
700
  Windows failure.
699
701
 
700
- Windows Terminal normally consumes all four shortcuts for its own copy/paste.
701
- To let plsqlwks receive them, open **Settings → Open JSON file** and add these
702
+ If Windows Terminal consumes a shortcut, forward it to PLSQLWKS.
703
+ To configure explicit forwarding, open **Settings → Open JSON file** and add these
702
704
  entries to `actions`, keeping the other actions:
703
705
 
704
706
  ```json
705
- { "command": { "action": "sendInput", "input": "\u0003" }, "id": "User.PlsqlwksCopy" },
706
- { "command": { "action": "sendInput", "input": "\u001b[99;6u" }, "id": "User.PlsqlwksInternalCopy" },
707
+ { "command": { "action": "sendInput", "input": "\u0003" }, "id": "User.PlsqlwksInternalCopy" },
708
+ { "command": { "action": "sendInput", "input": "\u0010" }, "id": "User.PlsqlwksInternalPaste" },
709
+ { "command": { "action": "sendInput", "input": "\u001b[99;6u" }, "id": "User.PlsqlwksSystemCopy" },
710
+ { "command": { "action": "sendInput", "input": "\u001b[112;6u" }, "id": "User.PlsqlwksSystemPaste" },
711
+ { "command": { "action": "sendInput", "input": "\u001b[99;4u" }, "id": "User.PlsqlwksWslCopy" },
712
+ { "command": { "action": "sendInput", "input": "\u001b[112;4u" }, "id": "User.PlsqlwksWslPaste" },
707
713
  { "command": { "action": "sendInput", "input": "\u0016" }, "id": "User.PlsqlwksPaste" },
708
714
  { "command": { "action": "sendInput", "input": "\u001b[118;6u" }, "id": "User.PlsqlwksAlternatePaste" }
709
715
  ```
@@ -712,8 +718,12 @@ Replace the existing copy/paste entries in `keybindings` with
712
718
  the entries below, keeping the other keybindings:
713
719
 
714
720
  ```json
715
- { "id": "User.PlsqlwksCopy", "keys": "ctrl+c" },
716
- { "id": "User.PlsqlwksInternalCopy", "keys": "ctrl+shift+c" },
721
+ { "id": "User.PlsqlwksInternalCopy", "keys": "ctrl+c" },
722
+ { "id": "User.PlsqlwksInternalPaste", "keys": "ctrl+p" },
723
+ { "id": "User.PlsqlwksSystemCopy", "keys": "ctrl+shift+c" },
724
+ { "id": "User.PlsqlwksSystemPaste", "keys": "ctrl+shift+p" },
725
+ { "id": "User.PlsqlwksWslCopy", "keys": "alt+shift+c" },
726
+ { "id": "User.PlsqlwksWslPaste", "keys": "alt+shift+p" },
717
727
  { "id": "User.PlsqlwksPaste", "keys": "ctrl+v" },
718
728
  { "id": "User.PlsqlwksAlternatePaste", "keys": "ctrl+shift+v" }
719
729
  ```
@@ -721,7 +731,7 @@ the entries below, keeping the other keybindings:
721
731
  This setting applies to every Windows Terminal profile and tab. Restart
722
732
  plsqlwks after upgrading and reopen Windows Terminal if it retains old bindings.
723
733
  The command menu offers equivalents when a terminal intercepts the shortcuts.
724
- The optional `tools/putty_keys.ps1` helper also forwards all four shortcuts when
734
+ The optional `tools/putty_keys.ps1` helper also forwards these shortcuts when
725
735
  enabled for the active Windows terminal window.
726
736
 
727
737
  Keyboard navigation, resizing and dialogs remain available while clipboard
@@ -798,11 +808,13 @@ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/te
798
808
  | `Ctrl-F` | Open literal Find/Replace with the `Find next` action |
799
809
  | `Alt-O` -> **Editor** -> **Replace text** | Open Find/Replace at the replacement field |
800
810
  | `Ctrl-G` | Go to line |
801
- | `Ctrl-N` / `Ctrl-P` | Move to the next / previous search occurrence |
811
+ | `Ctrl-N` | Move to the next search occurrence |
812
+ | `Alt-O → Editor → Previous search match` | Move to the previous search occurrence |
802
813
  | `Ctrl-U` | Uppercase selected SQL code |
803
814
  | `Ctrl-L` | Lowercase selected SQL code |
804
- | `Ctrl-C` | Copy selected text |
805
- | `Ctrl-Shift-C` | Copy selected text internally only |
815
+ | `Ctrl-C` / `Ctrl-P` | Copy/paste internally |
816
+ | `Ctrl-Shift-C` / `Ctrl-Shift-P` | Copy/paste the System (Windows) clipboard |
817
+ | `Alt-Shift-C` / `Alt-Shift-P` | Copy/paste the WSL/Linux clipboard |
806
818
  | `Ctrl-X` | Cut selected text |
807
819
  | `Ctrl-V` | Paste clipboard text, expanding each tab to two spaces |
808
820
  | `Ctrl-Shift-V` | Paste the alternate source (internal by default) |
@@ -841,11 +853,12 @@ The dialog provides `Find next`, `Replace`, `Replace all`, and `Cancel` actions.
841
853
  and lowercase letters. `Replace` changes the selected matching occurrence, or
842
854
  the next match from the cursor, and then selects the following match. `Replace
843
855
  all` changes every match in the current buffer. Either replacement operation is
844
- recorded as one undoable edit. `Ctrl-N` and `Ctrl-P` repeat the last search with
845
- its case setting, forward or backward with wraparound.
856
+ recorded as one undoable edit. `Ctrl-N` repeats the last search forward;
857
+ **Alt-O → Editor → Previous search match** repeats it backward. Both retain the
858
+ case setting and wrap around.
846
859
 
847
860
  Editor paste expands every tab character to two spaces and keeps multiline
848
- text in one undoable edit. This applies to both configured paste shortcuts and
861
+ text in one undoable edit. This applies to all fixed and configured paste shortcuts and
849
862
  to native terminal paste while the editor is focused;
850
863
  clipboard contents themselves are not changed. Native paste requires a
851
864
  terminal that supports the standard bracketed-paste protocol, with `Ctrl-V`
@@ -892,8 +905,9 @@ Read-only mode is a client-side guardrail that rejects statements which the SQL
892
905
  | `Home` / `End` | Move to the first/last result-grid column |
893
906
  | `Ctrl-Home` / `Ctrl-End` | Move to the first/last result-grid row |
894
907
  | `F8` | Toggle result grid / row-detail output |
895
- | `Ctrl-C` | Copy one result cell immediately, or choose header handling for a rectangular selection |
896
- | `Ctrl-Shift-C` | Copy the same cell/range internally only |
908
+ | `Ctrl-C` | Copy a cell/range internally; ranges offer header handling |
909
+ | `Ctrl-Shift-C` | Copy the same cell/range to System (Windows) |
910
+ | `Alt-Shift-C` | Copy the same cell/range to WSL/Linux |
897
911
  | `F10` | View or edit a mapped text cell in a ROWID-backed result |
898
912
  | `Enter` | Edit the selected ROWID-backed result cell when available |
899
913
  | `INS` | Prepare a draft insert row for ROWID-backed results |
@@ -982,8 +996,9 @@ move within a displayed line; Ctrl+Home/End move to the output boundaries.
982
996
 
983
997
  Copying preserves the stored text, whitespace, blank lines, and statement
984
998
  headings, without screen wrapping or padding. The existing system clipboard
985
- providers are used when available, with the internal clipboard as a fallback
986
- (including remote PuTTY sessions). Ctrl+C still cancels a running operation
999
+ backends are reused: Ctrl+C copies internally, Ctrl+Shift+C copies to Windows,
1000
+ and Alt+Shift+C copies to WSL/Linux. Fixed external shortcuts do not fall back
1001
+ to another clipboard. Ctrl+C still cancels a running operation
987
1002
  before performing a copy. Selection belongs to its file tab, survives appended
988
1003
  output and resizing, and resets when execution replaces the output.
989
1004
 
@@ -1161,9 +1176,39 @@ validate this opt-in mode with the applications in use.
1161
1176
 
1162
1177
  ### Schema Browser
1163
1178
 
1164
- The `F9` schema browser groups tables, views, procedures, functions, packages, triggers, sequences, indexes, and private synonyms from the current schema. Type while the browser is focused to filter object names with a case-insensitive substring match; groups without matches are hidden and matching groups expand automatically without changing their saved expansion state. Exact quoted and mixed-case names are preserved when columns or definitions are loaded, with Oracle-safe quoting applied to metadata requests.
1165
-
1166
- Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load DDL`, or `Copy object name`. `Insert SELECT` adds a `select *` statement for the SQL-safe, unqualified object name to the current buffer and focuses the editor; it does not execute the query. `Copy object name` places that SQL-ready, unqualified identifier on the clipboard. For other object types, `Enter` offers `Load DDL` (the default) and `Copy object name`.
1179
+ The `F9` schema browser groups tables, views, procedures, functions, package specifications, package bodies, triggers, sequences, indexes, and private synonyms from the current schema. Type while the browser is focused to filter object names with a case-insensitive substring match; groups without matches are hidden and matching groups expand automatically without changing their saved expansion state. Exact quoted and mixed-case names are preserved when columns, routines or definitions are loaded, with Oracle-safe quoting applied to metadata requests.
1180
+
1181
+ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load DDL`, or `Copy object name`. `Insert SELECT` adds a `select *` statement for the SQL-safe, unqualified object name to the current buffer and focuses the editor; it does not execute the query. `Copy object name` places that SQL-ready, unqualified identifier on the clipboard. For standalone procedures, functions and other object types, `Enter` offers `Load DDL` (the default) and `Copy object name`.
1182
+
1183
+ Package specifications and bodies show their own compilation status immediately
1184
+ before the package name: `C` means compiled, `I` means invalid compilation and
1185
+ `?` means status unavailable. A compiled specification can have an invalid body.
1186
+ Press `Enter` on either part to load the specification, body or both, or copy
1187
+ the package name. The selected part is the default; unavailable parts are
1188
+ omitted. Each loading mode has its own tab, and loading both puts the
1189
+ specification before the body in one SQL buffer.
1190
+
1191
+ Press `Space` on either package part to expand its public procedures and
1192
+ functions, including while filtering. The browser loads signatures in the
1193
+ background and shares the cache between the two package sections. `P` marks a
1194
+ procedure and `F` a function; overloads have separate signature rows. Private
1195
+ body routines are excluded because a worksheet cannot call them.
1196
+ Press `Enter` on a routine to insert a default PL/SQL call block at the current
1197
+ cursor, replacing selected text as one undoable edit, and focus the editor.
1198
+ The block declares typed variables for every parameter, including parameters
1199
+ with defaults and OUT/IN OUT parameters, and a result variable for functions.
1200
+ Edit the input values before running it. Insertion does not execute or compile
1201
+ the call. Unsupported or incomplete signatures report a reason and leave the
1202
+ buffer unchanged.
1203
+
1204
+ Press `Space` on a table or view to expand or collapse its column subtree,
1205
+ including while filtering. Column names appear in database order and are loaded
1206
+ in the background on first expansion, then cached. Columns are informational
1207
+ leaf rows; object actions apply to their parent table or view. `Ctrl-F` opens an
1208
+ object-name filter prompt that accepts spaces. Filtering matches object names
1209
+ and shows all children beneath expanded matching objects. `Ctrl-R` refreshes
1210
+ objects and package statuses, clears cached columns and routines, and collapses
1211
+ object branches, retaining the filter and group expansion state.
1167
1212
 
1168
1213
  | Key | Action |
1169
1214
  | --- | --- |
@@ -1172,9 +1217,10 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1172
1217
  | `Esc` | Clear a nonempty filter, or return to the editor when the filter is empty |
1173
1218
  | `Up` / `Down` | Move through browser entries |
1174
1219
  | `PageUp` / `PageDown` | Move through browser entries by page |
1175
- | `Enter` | Expand a group or choose an action for an object |
1176
- | `Space` | Expand/collapse a group when the filter is empty, or add a space to the active filter |
1177
- | `Ctrl-R` | Refresh database objects |
1220
+ | `Enter` | Expand a group, choose an object action, or insert a package routine call |
1221
+ | `Space` | Expand/collapse table/view columns or package routines; on groups, expand/collapse with an empty filter or add a space to an active filter |
1222
+ | `Ctrl-F` | Edit the object-name filter, including spaces |
1223
+ | `Ctrl-R` | Refresh database objects/statuses and clear column/routine subtrees and caches |
1178
1224
 
1179
1225
  ### Cell Viewer
1180
1226
 
@@ -1186,7 +1232,7 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1186
1232
  | `PageUp` / `PageDown` | Scroll cell text by page |
1187
1233
  | `Home` / `End` | Move to the first/last cell-viewer line |
1188
1234
  | `Ctrl-S` (editor) | Save the multiline edit |
1189
- | `Ctrl-V` / `Ctrl-Shift-V` / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1235
+ | `Ctrl-P` / `Ctrl-Shift-P` / `Alt-Shift-P` / configured V keys / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1190
1236
  | `Enter` (editor) | Insert a newline |
1191
1237
  | `F10` / `Esc` / `Ctrl-Q` (editor) | Cancel the multiline edit |
1192
1238
 
@@ -1253,6 +1299,34 @@ for the exact manifest, source layout, validation, replacement, and trust rules.
1253
1299
 
1254
1300
  ### Table DDL Export
1255
1301
 
1302
+ ### Schema Compare
1303
+
1304
+ Install `plugins/packages/schema-compare-0.1.0.plwgn` and restart the updated
1305
+ host. **Alt-O -> Database -> Compare schema objects** chooses two schemas on
1306
+ the current connection and compares visible object names/types and logical
1307
+ definitions. Browse changed, one-sided, equal and unavailable objects; filter
1308
+ by name/type/status, open unified differences with Enter, and cycle original
1309
+ definitions with Tab. **Ctrl-E** exports all or filtered differences to CSV,
1310
+ HTML or XLSX, including summaries, line numbers and visibility notes. CSV/HTML
1311
+ need no extra; XLSX uses `plsqlwks[xlsx]`. The comparison preserves transactions,
1312
+ sequence state and the original editor/results. See the
1313
+ [catalog guide](doc/PLUGIN_CATALOG.md#schema-compare) for rules and limits.
1314
+
1315
+ ### E-R Diagram
1316
+
1317
+ Install `plugins/packages/er-diagram-0.1.3.plwgn` with `plsqlwks plugin install`
1318
+ and restart the updated host. **Alt-O -> Database -> Export E-R Diagram (SVG/PNG/PDF)**
1319
+ opens a **Bright / Dark** theme picker followed by an **SVG / PNG / PDF** format
1320
+ picker. Use arrow keys and Enter; defaults are Bright and SVG. Then filter and
1321
+ check current-schema tables and views and export their columns, keys and
1322
+ foreign-key relationships. Connectors show numbered foreign-key names matching
1323
+ the detailed relationship notes. Relative destinations use the results directory.
1324
+ SVG uses the standard library; PNG/PDF require the optional `er-diagram` extra
1325
+ and the Cairo library. See the catalog for installation instructions.
1326
+ See the [catalog guide](doc/PLUGIN_CATALOG.md#e-r-diagram) for controls and limits.
1327
+
1328
+ ### Table DDL Export
1329
+
1256
1330
  Install `plugins/packages/table-ddl-export-0.1.1.plwgn` with
1257
1331
  `plsqlwks plugin install` and restart. **Alt-O -> Database -> Export table DDL**
1258
1332
  lets you choose a schema, filter table names as you type, select tables, and