plsqlwks 0.2.3__tar.gz → 0.2.5__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.5}/PKG-INFO +193 -54
  2. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/README.md +190 -53
  3. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/doc/API.md +121 -1
  4. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/doc/ARCHITECTURE.md +27 -0
  5. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/doc/PLUGINS.md +26 -0
  6. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/doc/PLUGIN_CATALOG.md +153 -0
  7. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/__init__.py +1 -1
  8. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/metadata.py +175 -8
  9. plsqlwks-0.2.5/plsqlwks/db/schema_compare.py +385 -0
  10. plsqlwks-0.2.5/plsqlwks/db/schema_diagram.py +118 -0
  11. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/session.py +50 -1
  12. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/table_export.py +42 -0
  13. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/plugins/__init__.py +10 -0
  14. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/plugins/api.py +56 -0
  15. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/__init__.py +8 -0
  16. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/app.py +46 -7
  17. plsqlwks-0.2.5/plsqlwks/ui/browser.py +225 -0
  18. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/catalog.py +337 -46
  19. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/clipboard.py +49 -15
  20. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/commands.py +18 -11
  21. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/constants.py +41 -11
  22. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/db_session.py +29 -0
  23. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/dialogs.py +73 -6
  24. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/editor_controller.py +28 -8
  25. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/input_controller.py +22 -2
  26. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/keys.py +20 -0
  27. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/plugin_host.py +36 -0
  28. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/ports.py +2 -0
  29. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/renderer.py +16 -2
  30. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/result_controller.py +27 -16
  31. plsqlwks-0.2.5/plsqlwks/ui/schema_compare.py +375 -0
  32. plsqlwks-0.2.5/plsqlwks/ui/schema_diagram.py +254 -0
  33. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/state.py +8 -0
  34. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/viewport.py +22 -2
  35. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks.egg-info/SOURCES.txt +14 -0
  36. plsqlwks-0.2.5/plugins/er-diagram/install.plw +7 -0
  37. plsqlwks-0.2.5/plugins/er-diagram/payload/plugin.py +36 -0
  38. plsqlwks-0.2.5/plugins/er-diagram/payload/writer.py +252 -0
  39. plsqlwks-0.2.5/plugins/packages/er-diagram-0.1.3.plwgn +0 -0
  40. plsqlwks-0.2.5/plugins/packages/schema-compare-0.1.0.plwgn +0 -0
  41. plsqlwks-0.2.5/plugins/schema-compare/install.plw +7 -0
  42. plsqlwks-0.2.5/plugins/schema-compare/payload/plugin.py +22 -0
  43. plsqlwks-0.2.5/plugins/schema-compare/payload/writer.py +172 -0
  44. plsqlwks-0.2.5/plugins/table-ddl-export/payload/__init__.py +0 -0
  45. plsqlwks-0.2.5/plugins/xlsx-export/payload/__init__.py +0 -0
  46. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/pyproject.toml +3 -0
  47. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/tests/fixtures/ui_exports.txt +8 -0
  48. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/tools/putty_keys.ps1 +43 -7
  49. plsqlwks-0.2.3/plsqlwks/ui/browser.py +0 -124
  50. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/doc/COMPATIBILITY.md +0 -0
  51. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/doc/QUICKSTART.html +0 -0
  52. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/doc/QUICKSTART.md +0 -0
  53. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/license.txt +0 -0
  54. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/__main__.py +0 -0
  55. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/cli.py +0 -0
  56. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/config/__init__.py +0 -0
  57. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/config/loader.py +0 -0
  58. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/config/models.py +0 -0
  59. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/config/paths.py +0 -0
  60. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/config/session.py +0 -0
  61. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/config/settings.py +0 -0
  62. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/__init__.py +0 -0
  63. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/ddl_remap.py +0 -0
  64. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/dependencies.py +0 -0
  65. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/editing.py +0 -0
  66. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/execution.py +0 -0
  67. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/explain.py +0 -0
  68. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/health.py +0 -0
  69. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/identifiers.py +0 -0
  70. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/models.py +0 -0
  71. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/sql_analysis.py +0 -0
  72. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/table_export_catalog.py +0 -0
  73. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/timestamps.py +0 -0
  74. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/db/transactions.py +0 -0
  75. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/exporting.py +0 -0
  76. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/plugins/loader.py +0 -0
  77. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/plugins/management.py +0 -0
  78. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/sqlbinds.py +0 -0
  79. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/sqlsplit.py +0 -0
  80. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/application_controller.py +0 -0
  81. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/buffer.py +0 -0
  82. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/code_generation.py +0 -0
  83. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/command_dispatcher.py +0 -0
  84. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/completion.py +0 -0
  85. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/db_operations.py +0 -0
  86. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/db_worker.py +0 -0
  87. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/dependency_walker.py +0 -0
  88. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/display.py +0 -0
  89. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/documents.py +0 -0
  90. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/errors.py +0 -0
  91. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/help.py +0 -0
  92. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/key_reader.py +0 -0
  93. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/menu.py +0 -0
  94. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/output_selection.py +0 -0
  95. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/query_controller.py +0 -0
  96. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/result_export.py +0 -0
  97. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/result_presenter.py +0 -0
  98. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/results.py +0 -0
  99. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/sql.py +0 -0
  100. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/sqlplus.py +0 -0
  101. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/syntax.py +0 -0
  102. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/ui/table_export.py +0 -0
  103. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plsqlwks/workspace.py +0 -0
  104. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/csv-export/install.plw +0 -0
  105. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/csv-export/payload/__init__.py +0 -0
  106. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/csv-export/payload/plugin.py +0 -0
  107. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/csv-export/payload/support.py +0 -0
  108. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/csv-export/payload/writer.py +0 -0
  109. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/csv2oratab/install.plw +0 -0
  110. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/csv2oratab/payload/__init__.py +0 -0
  111. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/csv2oratab/payload/csv2oratab.py +0 -0
  112. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/csv2oratab/payload/plugin.py +0 -0
  113. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/dependencies-walker/install.plw +0 -0
  114. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/dependencies-walker/payload/__init__.py +0 -0
  115. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/dependencies-walker/payload/plugin.py +0 -0
  116. {plsqlwks-0.2.3/plugins/html-export → plsqlwks-0.2.5/plugins/er-diagram}/payload/__init__.py +0 -0
  117. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/html-export/install.plw +0 -0
  118. {plsqlwks-0.2.3/plugins/sqlplus → plsqlwks-0.2.5/plugins/html-export}/payload/__init__.py +0 -0
  119. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/html-export/payload/html_exporting.py +0 -0
  120. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/html-export/payload/plugin.py +0 -0
  121. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/html-export/payload/support.py +0 -0
  122. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/html-export/payload/writer.py +0 -0
  123. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/packages/csv-export-1.0.0.plwgn +0 -0
  124. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/packages/csv2oratab-0.1.0.plwgn +0 -0
  125. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/packages/dependencies-walker-0.1.0.plwgn +0 -0
  126. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/packages/html-export-1.0.0.plwgn +0 -0
  127. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/packages/sqlplus-0.1.0.plwgn +0 -0
  128. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/packages/table-ddl-export-0.1.1.plwgn +0 -0
  129. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/packages/xlsx-export-1.0.0.plwgn +0 -0
  130. {plsqlwks-0.2.3/plugins/table-ddl-export → plsqlwks-0.2.5/plugins/schema-compare}/payload/__init__.py +0 -0
  131. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/sqlplus/install.plw +0 -0
  132. {plsqlwks-0.2.3/plugins/xlsx-export → plsqlwks-0.2.5/plugins/sqlplus}/payload/__init__.py +0 -0
  133. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/sqlplus/payload/plugin.py +0 -0
  134. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/table-ddl-export/install.plw +0 -0
  135. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/table-ddl-export/payload/plugin.py +0 -0
  136. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/xlsx-export/install.plw +0 -0
  137. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/xlsx-export/payload/plugin.py +0 -0
  138. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/xlsx-export/payload/support.py +0 -0
  139. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/plugins/xlsx-export/payload/xlsx_exporting.py +0 -0
  140. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/pytest.ini +0 -0
  141. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/rchar.py +0 -0
  142. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/requirements.txt +0 -0
  143. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/setup.cfg +0 -0
  144. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/tests/conftest.py +0 -0
  145. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/tests/fixtures/config_exports.txt +0 -0
  146. {plsqlwks-0.2.3 → plsqlwks-0.2.5}/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.5
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-Alt-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,33 @@ 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-Alt-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. `Ctrl-P` finds the
707
+ previous occurrence of the last search string, retaining case sensitivity and
708
+ wrapping at the start of the worksheet.
709
+ The copy shortcuts work for editor selections, result cells/ranges,
710
+ DBMS_OUTPUT selections and schema-browser object names. Paste works in the
711
+ worksheet, paste-enabled prompts and editable cell text dialogs.
712
+
713
+ Open **Alt-O → Preferences → Clipboard** to inspect the fixed shortcuts and
714
+ backend capabilities, configure legacy copy/cut destinations and choose the
715
+ sources for `Ctrl-V` and `Ctrl-Shift-V`. Save persists settings in your workspace
716
+ `config.ini`; Cancel discards changes. The new C/P shortcuts ignore these
717
+ settings. `Ctrl-X` and legacy copy commands retain configured destinations and
718
+ an internal copy; cut remains one immediate Undo edit. New workspaces without
719
+ Windows tools default legacy copy/paste to Linux.
715
720
 
716
721
  ```ini
717
722
  [clipboard]
@@ -724,20 +729,26 @@ ctrl_shift_v_source = internal
724
729
  Paste sources are `windows`, `internal`, or `linux`. Windows paste reads Windows
725
730
  exclusively: failure or empty contents causes no insertion and explicit
726
731
  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,
732
+ that target. The fixed copy shortcuts update only their selected clipboard;
733
+ legacy copy/cut updates internal text immediately and then attempts configured
734
+ external destinations in a background worker. Windows copy tries PowerShell,
729
735
  then `clip.exe` on failure, and verifies contents by readback when a reader is
730
736
  available. Copy-only Windows access is labelled unverified. Each Linux provider
731
737
  is attempted when Linux copying is enabled. A Linux success does not conceal a
732
738
  Windows failure.
733
739
 
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
740
+ If Windows Terminal consumes a shortcut, forward it to PLSQLWKS.
741
+ To configure explicit forwarding, open **Settings → Open JSON file** and add these
736
742
  entries to `actions`, keeping the other actions:
737
743
 
738
744
  ```json
739
- { "command": { "action": "sendInput", "input": "\u0003" }, "id": "User.PlsqlwksCopy" },
740
- { "command": { "action": "sendInput", "input": "\u001b[99;6u" }, "id": "User.PlsqlwksInternalCopy" },
745
+ { "command": { "action": "sendInput", "input": "\u0003" }, "id": "User.PlsqlwksInternalCopy" },
746
+ { "command": { "action": "sendInput", "input": "\u001b[112;7u" }, "id": "User.PlsqlwksInternalPaste" },
747
+ { "command": { "action": "sendInput", "input": "\u0010" }, "id": "User.PlsqlwksPreviousMatch" },
748
+ { "command": { "action": "sendInput", "input": "\u001b[99;6u" }, "id": "User.PlsqlwksSystemCopy" },
749
+ { "command": { "action": "sendInput", "input": "\u001b[112;6u" }, "id": "User.PlsqlwksSystemPaste" },
750
+ { "command": { "action": "sendInput", "input": "\u001b[99;4u" }, "id": "User.PlsqlwksWslCopy" },
751
+ { "command": { "action": "sendInput", "input": "\u001b[112;4u" }, "id": "User.PlsqlwksWslPaste" },
741
752
  { "command": { "action": "sendInput", "input": "\u0016" }, "id": "User.PlsqlwksPaste" },
742
753
  { "command": { "action": "sendInput", "input": "\u001b[118;6u" }, "id": "User.PlsqlwksAlternatePaste" }
743
754
  ```
@@ -746,8 +757,13 @@ Replace the existing copy/paste entries in `keybindings` with
746
757
  the entries below, keeping the other keybindings:
747
758
 
748
759
  ```json
749
- { "id": "User.PlsqlwksCopy", "keys": "ctrl+c" },
750
- { "id": "User.PlsqlwksInternalCopy", "keys": "ctrl+shift+c" },
760
+ { "id": "User.PlsqlwksInternalCopy", "keys": "ctrl+c" },
761
+ { "id": "User.PlsqlwksInternalPaste", "keys": "ctrl+alt+p" },
762
+ { "id": "User.PlsqlwksPreviousMatch", "keys": "ctrl+p" },
763
+ { "id": "User.PlsqlwksSystemCopy", "keys": "ctrl+shift+c" },
764
+ { "id": "User.PlsqlwksSystemPaste", "keys": "ctrl+shift+p" },
765
+ { "id": "User.PlsqlwksWslCopy", "keys": "alt+shift+c" },
766
+ { "id": "User.PlsqlwksWslPaste", "keys": "alt+shift+p" },
751
767
  { "id": "User.PlsqlwksPaste", "keys": "ctrl+v" },
752
768
  { "id": "User.PlsqlwksAlternatePaste", "keys": "ctrl+shift+v" }
753
769
  ```
@@ -755,7 +771,7 @@ the entries below, keeping the other keybindings:
755
771
  This setting applies to every Windows Terminal profile and tab. Restart
756
772
  plsqlwks after upgrading and reopen Windows Terminal if it retains old bindings.
757
773
  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
774
+ The optional `tools/putty_keys.ps1` helper also forwards these shortcuts when
759
775
  enabled for the active Windows terminal window.
760
776
 
761
777
  Keyboard navigation, resizing and dialogs remain available while clipboard
@@ -781,11 +797,14 @@ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/te
781
797
  | Key | Action |
782
798
  | --- | --- |
783
799
  | `Alt-O` | Open the top-left commands menu |
800
+ | `Alt-I` | Show connection information for the active tab |
784
801
  | `F1` | Help |
785
802
  | `F6` | Switch between DBMS_OUTPUT and normal results |
786
803
  | `F7` | Cycle fullscreen grid, fullscreen editor, and 2/3 editor + 1/3 grid |
787
804
  | `F8` | Toggle result grid / row-detail output |
788
805
  | `F9` | Show/focus/hide schema browser |
806
+ | `Shift-F9` | Toggle Schema Browser between normal and half-screen width |
807
+ | `Shift-Alt-F9` | Toggle Schema Browser between full-screen and its previous width |
789
808
  | `F12` | Choose autocommit or manual transaction mode |
790
809
  | `Ctrl-Up` / `Ctrl-Down` | Scroll the focused pane or visible DBMS_OUTPUT by one line |
791
810
  | `Ctrl-W` | Close current file tab |
@@ -796,6 +815,25 @@ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/te
796
815
  | `Ctrl-Alt-C` | Insert the active result-grid draft, or commit when no draft is active |
797
816
  | `Ctrl-Alt-R` | Roll back the current transaction |
798
817
 
818
+ ### Connection information
819
+
820
+ Press `Alt-I`, or choose **Alt-O → Database → Connection information**, from the
821
+ editor, results or schema browser. A centered dialog shows the connected user,
822
+ current schema, service, database and unique database name, container, instance,
823
+ server host, session SID, server timestamp with fractional seconds and timezone,
824
+ database/session time zones, Oracle version, driver version and Thin/Thick mode,
825
+ autocommit and read-only mode. The information is refreshed from the active tab's
826
+ existing session without changing worksheet results, transactions or unread
827
+ DBMS_OUTPUT. A busy active session uses the existing operation-running feedback;
828
+ a disconnected session shows `Not connected` without reconnecting.
829
+
830
+ The dialog keeps **[ OK ]** visible. Press Enter or Space to accept, or Esc/Ctrl-Q
831
+ to close. Use Up/Down, PageUp/PageDown or Home/End to scroll long details; resize
832
+ the terminal to change the layout. Requests cancelled or completed after switching
833
+ away from their tab do not open a late dialog. The Windows keyboard helper forwards
834
+ Alt-I; a Windows Terminal profile that consumes it can forward `\u001bi` with a
835
+ `sendInput` action bound to `alt+i`.
836
+
799
837
  ### Editor
800
838
 
801
839
  | Key | Action |
@@ -832,11 +870,13 @@ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/te
832
870
  | `Ctrl-F` | Open literal Find/Replace with the `Find next` action |
833
871
  | `Alt-O` -> **Editor** -> **Replace text** | Open Find/Replace at the replacement field |
834
872
  | `Ctrl-G` | Go to line |
835
- | `Ctrl-N` / `Ctrl-P` | Move to the next / previous search occurrence |
873
+ | `Ctrl-N` | Move to the next search occurrence |
874
+ | `Ctrl-P` / `Alt-O → Editor → Previous search match` | Move to the previous search occurrence |
836
875
  | `Ctrl-U` | Uppercase selected SQL code |
837
876
  | `Ctrl-L` | Lowercase selected SQL code |
838
- | `Ctrl-C` | Copy selected text |
839
- | `Ctrl-Shift-C` | Copy selected text internally only |
877
+ | `Ctrl-C` / `Ctrl-Alt-P` | Copy/paste internally |
878
+ | `Ctrl-Shift-C` / `Ctrl-Shift-P` | Copy/paste the System (Windows) clipboard |
879
+ | `Alt-Shift-C` / `Alt-Shift-P` | Copy/paste the WSL/Linux clipboard |
840
880
  | `Ctrl-X` | Cut selected text |
841
881
  | `Ctrl-V` | Paste clipboard text, expanding each tab to two spaces |
842
882
  | `Ctrl-Shift-V` | Paste the alternate source (internal by default) |
@@ -875,11 +915,12 @@ The dialog provides `Find next`, `Replace`, `Replace all`, and `Cancel` actions.
875
915
  and lowercase letters. `Replace` changes the selected matching occurrence, or
876
916
  the next match from the cursor, and then selects the following match. `Replace
877
917
  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.
918
+ recorded as one undoable edit. `Ctrl-N` repeats the last search forward and
919
+ `Ctrl-P` repeats it backward. Both retain the case setting and wrap around.
920
+ **Alt-O → Editor → Previous search match** provides the same backward search.
880
921
 
881
922
  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
923
+ text in one undoable edit. This applies to all fixed and configured paste shortcuts and
883
924
  to native terminal paste while the editor is focused;
884
925
  clipboard contents themselves are not changed. Native paste requires a
885
926
  terminal that supports the standard bracketed-paste protocol, with `Ctrl-V`
@@ -926,8 +967,9 @@ Read-only mode is a client-side guardrail that rejects statements which the SQL
926
967
  | `Home` / `End` | Move to the first/last result-grid column |
927
968
  | `Ctrl-Home` / `Ctrl-End` | Move to the first/last result-grid row |
928
969
  | `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 |
970
+ | `Ctrl-C` | Copy a cell/range internally; ranges offer header handling |
971
+ | `Ctrl-Shift-C` | Copy the same cell/range to System (Windows) |
972
+ | `Alt-Shift-C` | Copy the same cell/range to WSL/Linux |
931
973
  | `F10` | View or edit a mapped text cell in a ROWID-backed result |
932
974
  | `Enter` | Edit the selected ROWID-backed result cell when available |
933
975
  | `INS` | Prepare a draft insert row for ROWID-backed results |
@@ -1016,8 +1058,9 @@ move within a displayed line; Ctrl+Home/End move to the output boundaries.
1016
1058
 
1017
1059
  Copying preserves the stored text, whitespace, blank lines, and statement
1018
1060
  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
1061
+ backends are reused: Ctrl+C copies internally, Ctrl+Shift+C copies to Windows,
1062
+ and Alt+Shift+C copies to WSL/Linux. Fixed external shortcuts do not fall back
1063
+ to another clipboard. Ctrl+C still cancels a running operation
1021
1064
  before performing a copy. Selection belongs to its file tab, survives appended
1022
1065
  output and resizing, and resets when execution replaces the output.
1023
1066
 
@@ -1195,9 +1238,72 @@ validate this opt-in mode with the applications in use.
1195
1238
 
1196
1239
  ### Schema Browser
1197
1240
 
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`.
1241
+ Press `F9` to open or focus Schema Browser. While it is focused, `F9` closes it
1242
+ and returns to the SQL buffer. Press `Tab` to keep the browser open and focus
1243
+ the SQL buffer, so you can edit SQL beside the tree; press `F9` to return to it.
1244
+ Filters, selected objects, expanded branches and cached metadata are retained.
1245
+
1246
+ `Shift-F9` opens/focuses the browser and toggles its normal width with a left
1247
+ half-screen pane; the SQL buffer and results stay on the right. `Shift-Alt-F9`
1248
+ opens/focuses a full-screen browser with its filter header and status line, and
1249
+ pressing it again restores the previous normal or half-screen width. From a
1250
+ full-screen browser, Tab, returning to the editor with Esc, or loading/inserting
1251
+ SQL also restores that previous width. Shift-F9 switches a full-screen browser
1252
+ to half-screen. Closing it with F9 retains the side-by-side width for reopening.
1253
+ Browser sizes last for the current application session.
1254
+
1255
+ Opening/focusing the browser exits an incompatible F7 editor/grid fullscreen
1256
+ view, restoring the saved SQL/results split or the two-thirds-editor layout.
1257
+ F7 retains its existing editor/grid layout cycle. A terminal that consumes the
1258
+ new shortcuts can forward `\u001b[20;2~` for Shift-F9 and `\u001b[20;4~` for
1259
+ Shift-Alt-F9 with Windows Terminal `sendInput` actions. The Windows keyboard
1260
+ helper forwards both shortcuts while preserving AltGr combinations.
1261
+
1262
+ The `F9` schema browser groups tables, views, procedures, functions, package specifications, package bodies, types, type 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.
1263
+
1264
+ 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`.
1265
+
1266
+ Package specifications and bodies show their own compilation status immediately
1267
+ before the package name: `C` means compiled, `I` means invalid compilation and
1268
+ `?` means status unavailable. A compiled specification can have an invalid body.
1269
+ Press `Enter` on either part to load the specification, body or both, or copy
1270
+ the package name. The selected part is the default; unavailable parts are
1271
+ omitted. Each loading mode has its own tab, and loading both puts the
1272
+ specification before the body in one SQL buffer.
1273
+
1274
+ Press `Space` on either package part to expand its public procedures and
1275
+ functions, including while filtering. The browser loads signatures in the
1276
+ background and shares the cache between the two package sections. `P` marks a
1277
+ procedure and `F` a function; overloads have separate signature rows. Private
1278
+ body routines are excluded because a worksheet cannot call them.
1279
+ Press `Enter` on a routine to insert a default PL/SQL call block at the current
1280
+ cursor, replacing selected text as one undoable edit, and focus the editor.
1281
+ The block declares typed variables for every parameter, including parameters
1282
+ with defaults and OUT/IN OUT parameters, and a result variable for functions.
1283
+ Edit the input values before running it. Insertion does not execute or compile
1284
+ the call. Unsupported or incomplete signatures report a reason and leave the
1285
+ buffer unchanged.
1286
+
1287
+ Press `Space` on a standalone procedure or function to expand its callable
1288
+ signature with parameter directions, types and the function return type. Press
1289
+ `Enter` on the signature to insert the same owner-qualified call template as for
1290
+ package routines. The parent object's Enter menu still offers Load DDL and Copy
1291
+ object name. Signatures load asynchronously and are cached until refresh.
1292
+
1293
+ The **Types** group includes object and collection types; **Type bodies** lists
1294
+ their implementations separately. Enter offers Load DDL or Copy object name.
1295
+ Loading a type fetches its specification only; loading a type body fetches its
1296
+ body only, with owner-qualified DDL and a single slash terminator. Type attributes
1297
+ and methods do not expand into child rows.
1298
+
1299
+ Press `Space` on a table or view to expand or collapse its column subtree,
1300
+ including while filtering. Column names appear in database order and are loaded
1301
+ in the background on first expansion, then cached. Columns are informational
1302
+ leaf rows; object actions apply to their parent table or view. `Ctrl-F` opens an
1303
+ object-name filter prompt that accepts spaces. Filtering matches object names
1304
+ and shows all children beneath expanded matching objects. `Ctrl-R` refreshes
1305
+ objects and package statuses, clears cached columns and routines, and collapses
1306
+ object branches, retaining the filter and group expansion state.
1201
1307
 
1202
1308
  | Key | Action |
1203
1309
  | --- | --- |
@@ -1206,9 +1312,14 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1206
1312
  | `Esc` | Clear a nonempty filter, or return to the editor when the filter is empty |
1207
1313
  | `Up` / `Down` | Move through browser entries |
1208
1314
  | `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 |
1315
+ | `Tab` | Focus the SQL buffer, keeping the browser open |
1316
+ | `F9` | Close the browser and focus the SQL buffer |
1317
+ | `Shift-F9` | Toggle normal/half-screen width and focus the browser |
1318
+ | `Shift-Alt-F9` | Toggle full-screen/previous width and focus the browser |
1319
+ | `Enter` | Expand a group, choose an object action, or insert a routine call |
1320
+ | `Space` | Expand/collapse table/view columns, package routines or standalone signatures; on groups, expand/collapse with an empty filter or add a space to an active filter |
1321
+ | `Ctrl-F` | Edit the object-name filter, including spaces |
1322
+ | `Ctrl-R` | Refresh database objects/statuses and clear column/routine subtrees and caches |
1212
1323
 
1213
1324
  ### Cell Viewer
1214
1325
 
@@ -1220,7 +1331,7 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1220
1331
  | `PageUp` / `PageDown` | Scroll cell text by page |
1221
1332
  | `Home` / `End` | Move to the first/last cell-viewer line |
1222
1333
  | `Ctrl-S` (editor) | Save the multiline edit |
1223
- | `Ctrl-V` / `Ctrl-Shift-V` / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1334
+ | `Ctrl-Alt-P` / `Ctrl-Shift-P` / `Alt-Shift-P` / configured V keys / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1224
1335
  | `Enter` (editor) | Insert a newline |
1225
1336
  | `F10` / `Esc` / `Ctrl-Q` (editor) | Cancel the multiline edit |
1226
1337
 
@@ -1287,6 +1398,34 @@ for the exact manifest, source layout, validation, replacement, and trust rules.
1287
1398
 
1288
1399
  ### Table DDL Export
1289
1400
 
1401
+ ### Schema Compare
1402
+
1403
+ Install `plugins/packages/schema-compare-0.1.0.plwgn` and restart the updated
1404
+ host. **Alt-O -> Database -> Compare schema objects** chooses two schemas on
1405
+ the current connection and compares visible object names/types and logical
1406
+ definitions. Browse changed, one-sided, equal and unavailable objects; filter
1407
+ by name/type/status, open unified differences with Enter, and cycle original
1408
+ definitions with Tab. **Ctrl-E** exports all or filtered differences to CSV,
1409
+ HTML or XLSX, including summaries, line numbers and visibility notes. CSV/HTML
1410
+ need no extra; XLSX uses `plsqlwks[xlsx]`. The comparison preserves transactions,
1411
+ sequence state and the original editor/results. See the
1412
+ [catalog guide](doc/PLUGIN_CATALOG.md#schema-compare) for rules and limits.
1413
+
1414
+ ### E-R Diagram
1415
+
1416
+ Install `plugins/packages/er-diagram-0.1.3.plwgn` with `plsqlwks plugin install`
1417
+ and restart the updated host. **Alt-O -> Database -> Export E-R Diagram (SVG/PNG/PDF)**
1418
+ opens a **Bright / Dark** theme picker followed by an **SVG / PNG / PDF** format
1419
+ picker. Use arrow keys and Enter; defaults are Bright and SVG. Then filter and
1420
+ check current-schema tables and views and export their columns, keys and
1421
+ foreign-key relationships. Connectors show numbered foreign-key names matching
1422
+ the detailed relationship notes. Relative destinations use the results directory.
1423
+ SVG uses the standard library; PNG/PDF require the optional `er-diagram` extra
1424
+ and the Cairo library. See the catalog for installation instructions.
1425
+ See the [catalog guide](doc/PLUGIN_CATALOG.md#e-r-diagram) for controls and limits.
1426
+
1427
+ ### Table DDL Export
1428
+
1290
1429
  Install `plugins/packages/table-ddl-export-0.1.1.plwgn` with
1291
1430
  `plsqlwks plugin install` and restart. **Alt-O -> Database -> Export table DDL**
1292
1431
  lets you choose a schema, filter table names as you type, select tables, and