plsqlwks 0.2.2__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 (148) hide show
  1. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/PKG-INFO +201 -24
  2. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/README.md +198 -23
  3. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/doc/API.md +143 -4
  4. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/doc/ARCHITECTURE.md +51 -0
  5. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/doc/PLUGINS.md +29 -1
  6. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/doc/PLUGIN_CATALOG.md +247 -21
  7. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/__init__.py +1 -1
  8. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/config/loader.py +2 -0
  9. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/config/models.py +24 -0
  10. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/config/settings.py +30 -1
  11. plsqlwks-0.2.4/plsqlwks/db/ddl_remap.py +452 -0
  12. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/metadata.py +132 -9
  13. plsqlwks-0.2.4/plsqlwks/db/schema_compare.py +385 -0
  14. plsqlwks-0.2.4/plsqlwks/db/schema_diagram.py +118 -0
  15. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/session.py +7 -1
  16. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/table_export.py +259 -15
  17. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/table_export_catalog.py +313 -30
  18. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/plugins/__init__.py +10 -0
  19. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/plugins/api.py +56 -0
  20. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/__init__.py +5 -0
  21. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/app.py +70 -7
  22. plsqlwks-0.2.4/plsqlwks/ui/browser.py +220 -0
  23. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/catalog.py +255 -28
  24. plsqlwks-0.2.4/plsqlwks/ui/clipboard.py +547 -0
  25. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/commands.py +15 -10
  26. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/constants.py +27 -11
  27. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/dialogs.py +155 -38
  28. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/documents.py +24 -3
  29. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/editor_controller.py +62 -15
  30. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/input_controller.py +12 -2
  31. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/keys.py +16 -0
  32. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/plugin_host.py +36 -0
  33. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/renderer.py +13 -1
  34. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/result_controller.py +43 -30
  35. plsqlwks-0.2.4/plsqlwks/ui/schema_compare.py +375 -0
  36. plsqlwks-0.2.4/plsqlwks/ui/schema_diagram.py +254 -0
  37. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/state.py +5 -0
  38. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/table_export.py +19 -3
  39. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/viewport.py +6 -0
  40. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks.egg-info/SOURCES.txt +14 -0
  41. plsqlwks-0.2.4/plugins/er-diagram/install.plw +7 -0
  42. plsqlwks-0.2.4/plugins/er-diagram/payload/plugin.py +36 -0
  43. plsqlwks-0.2.4/plugins/er-diagram/payload/writer.py +252 -0
  44. plsqlwks-0.2.4/plugins/packages/er-diagram-0.1.3.plwgn +0 -0
  45. plsqlwks-0.2.4/plugins/packages/schema-compare-0.1.0.plwgn +0 -0
  46. plsqlwks-0.2.4/plugins/schema-compare/install.plw +7 -0
  47. plsqlwks-0.2.4/plugins/schema-compare/payload/plugin.py +22 -0
  48. plsqlwks-0.2.4/plugins/schema-compare/payload/writer.py +172 -0
  49. plsqlwks-0.2.4/plugins/table-ddl-export/payload/__init__.py +0 -0
  50. plsqlwks-0.2.4/plugins/xlsx-export/payload/__init__.py +0 -0
  51. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/pyproject.toml +3 -0
  52. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/tests/fixtures/ui_exports.txt +5 -0
  53. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/tools/putty_keys.ps1 +26 -5
  54. plsqlwks-0.2.2/plsqlwks/db/ddl_remap.py +0 -132
  55. plsqlwks-0.2.2/plsqlwks/ui/browser.py +0 -124
  56. plsqlwks-0.2.2/plsqlwks/ui/clipboard.py +0 -128
  57. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/doc/COMPATIBILITY.md +0 -0
  58. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/doc/QUICKSTART.html +0 -0
  59. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/doc/QUICKSTART.md +0 -0
  60. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/license.txt +0 -0
  61. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/__main__.py +0 -0
  62. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/cli.py +0 -0
  63. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/config/__init__.py +0 -0
  64. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/config/paths.py +0 -0
  65. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/config/session.py +0 -0
  66. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/__init__.py +0 -0
  67. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/dependencies.py +0 -0
  68. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/editing.py +0 -0
  69. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/execution.py +0 -0
  70. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/explain.py +0 -0
  71. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/health.py +0 -0
  72. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/identifiers.py +0 -0
  73. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/models.py +0 -0
  74. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/sql_analysis.py +0 -0
  75. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/timestamps.py +0 -0
  76. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/db/transactions.py +0 -0
  77. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/exporting.py +0 -0
  78. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/plugins/loader.py +0 -0
  79. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/plugins/management.py +0 -0
  80. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/sqlbinds.py +0 -0
  81. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/sqlsplit.py +0 -0
  82. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/application_controller.py +0 -0
  83. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/buffer.py +0 -0
  84. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/code_generation.py +0 -0
  85. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/command_dispatcher.py +0 -0
  86. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/completion.py +0 -0
  87. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/db_operations.py +0 -0
  88. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/db_session.py +0 -0
  89. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/db_worker.py +0 -0
  90. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/dependency_walker.py +0 -0
  91. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/display.py +0 -0
  92. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/errors.py +0 -0
  93. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/help.py +0 -0
  94. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/key_reader.py +0 -0
  95. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/menu.py +0 -0
  96. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/output_selection.py +0 -0
  97. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/ports.py +0 -0
  98. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/query_controller.py +0 -0
  99. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/result_export.py +0 -0
  100. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/result_presenter.py +0 -0
  101. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/results.py +0 -0
  102. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/sql.py +0 -0
  103. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/sqlplus.py +0 -0
  104. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/ui/syntax.py +0 -0
  105. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plsqlwks/workspace.py +0 -0
  106. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/csv-export/install.plw +0 -0
  107. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/csv-export/payload/__init__.py +0 -0
  108. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/csv-export/payload/plugin.py +0 -0
  109. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/csv-export/payload/support.py +0 -0
  110. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/csv-export/payload/writer.py +0 -0
  111. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/csv2oratab/install.plw +0 -0
  112. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/csv2oratab/payload/__init__.py +0 -0
  113. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/csv2oratab/payload/csv2oratab.py +0 -0
  114. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/csv2oratab/payload/plugin.py +0 -0
  115. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/dependencies-walker/install.plw +0 -0
  116. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/dependencies-walker/payload/__init__.py +0 -0
  117. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/dependencies-walker/payload/plugin.py +0 -0
  118. {plsqlwks-0.2.2/plugins/html-export → plsqlwks-0.2.4/plugins/er-diagram}/payload/__init__.py +0 -0
  119. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/html-export/install.plw +0 -0
  120. {plsqlwks-0.2.2/plugins/sqlplus → plsqlwks-0.2.4/plugins/html-export}/payload/__init__.py +0 -0
  121. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/html-export/payload/html_exporting.py +0 -0
  122. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/html-export/payload/plugin.py +0 -0
  123. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/html-export/payload/support.py +0 -0
  124. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/html-export/payload/writer.py +0 -0
  125. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/packages/csv-export-1.0.0.plwgn +0 -0
  126. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/packages/csv2oratab-0.1.0.plwgn +0 -0
  127. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/packages/dependencies-walker-0.1.0.plwgn +0 -0
  128. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/packages/html-export-1.0.0.plwgn +0 -0
  129. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/packages/sqlplus-0.1.0.plwgn +0 -0
  130. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/packages/table-ddl-export-0.1.1.plwgn +0 -0
  131. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/packages/xlsx-export-1.0.0.plwgn +0 -0
  132. {plsqlwks-0.2.2/plugins/table-ddl-export → plsqlwks-0.2.4/plugins/schema-compare}/payload/__init__.py +0 -0
  133. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/sqlplus/install.plw +0 -0
  134. {plsqlwks-0.2.2/plugins/xlsx-export → plsqlwks-0.2.4/plugins/sqlplus}/payload/__init__.py +0 -0
  135. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/sqlplus/payload/plugin.py +0 -0
  136. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/table-ddl-export/install.plw +0 -0
  137. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/table-ddl-export/payload/plugin.py +0 -0
  138. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/xlsx-export/install.plw +0 -0
  139. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/xlsx-export/payload/plugin.py +0 -0
  140. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/xlsx-export/payload/support.py +0 -0
  141. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/plugins/xlsx-export/payload/xlsx_exporting.py +0 -0
  142. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/pytest.ini +0 -0
  143. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/rchar.py +0 -0
  144. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/requirements.txt +0 -0
  145. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/setup.cfg +0 -0
  146. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/tests/conftest.py +0 -0
  147. {plsqlwks-0.2.2 → plsqlwks-0.2.4}/tests/fixtures/config_exports.txt +0 -0
  148. {plsqlwks-0.2.2 → 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.2
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
@@ -533,7 +535,11 @@ After a successful quit, plsqlwks records the open file-backed tabs, active tab,
533
535
  Worksheet and configuration saves replace their destination atomically while
534
536
  preserving an existing file's POSIX permission bits. A
535
537
  file-backed worksheet also detects when its file was changed or deleted outside
536
- plsqlwks and asks whether to overwrite it, save under another name, or cancel.
538
+ plsqlwks and asks whether to overwrite it, reload the disk version, save under
539
+ another name, or cancel. Reload is available while the file exists, including
540
+ when a change is detected just before saving. It replaces the editor text
541
+ without writing to disk; Undo can restore local edits. If reading fails, the
542
+ local buffer stays intact.
537
543
  Undo and redo update the unsaved-change marker by comparing the current content
538
544
  with the last successful save.
539
545
 
@@ -613,9 +619,11 @@ Use left Alt for application shortcuts; AltGr remains available for characters
613
619
  on international keyboards. Shortcut digits and symbols refer to the character
614
620
  on the active Windows layout: for example, Czech top-row digits need Shift,
615
621
  so Alt-1 is typed with Alt-Shift-1. Use the layout's `+` or `=` character for
616
- autocomplete refresh. `Ctrl-C`, `Ctrl-X`, and `Ctrl-V` operate on the
617
- application/host clipboard with the existing internal fallback. SSH does not
618
- make that the Windows clipboard. Use PuTTY's native paste (`Shift-Insert` or
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
626
+ PuTTY's native paste (`Shift-Insert` or
619
627
  right-click) to insert Windows clipboard text as bracketed paste, and PuTTY
620
628
  mouse selection to copy to Windows. Leave plsqlwks' Ctrl-letter shortcuts
621
629
  available to the server when customizing PuTTY clipboard settings.
@@ -680,6 +688,104 @@ Run `tools\windows_keys.cmd -SelfTest` to check the helper without enabling it.
680
688
  The original `powershell.exe -NoProfile -File .\tools\putty_keys.ps1` command
681
689
  also works from Command Prompt and continues to support PuTTY.
682
690
 
691
+ ### Windows Terminal and WSL clipboard shortcuts
692
+
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.
696
+
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.
718
+
719
+ ```ini
720
+ [clipboard]
721
+ copy_to_windows = yes
722
+ copy_to_linux = no
723
+ ctrl_v_source = windows
724
+ ctrl_shift_v_source = internal
725
+ ```
726
+
727
+ Paste sources are `windows`, `internal`, or `linux`. Windows paste reads Windows
728
+ exclusively: failure or empty contents causes no insertion and explicit
729
+ feedback. Internal paste performs no OS access and cancels a pending paste for
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,
733
+ then `clip.exe` on failure, and verifies contents by readback when a reader is
734
+ available. Copy-only Windows access is labelled unverified. Each Linux provider
735
+ is attempted when Linux copying is enabled. A Linux success does not conceal a
736
+ Windows failure.
737
+
738
+ If Windows Terminal consumes a shortcut, forward it to PLSQLWKS.
739
+ To configure explicit forwarding, open **Settings → Open JSON file** and add these
740
+ entries to `actions`, keeping the other actions:
741
+
742
+ ```json
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" },
749
+ { "command": { "action": "sendInput", "input": "\u0016" }, "id": "User.PlsqlwksPaste" },
750
+ { "command": { "action": "sendInput", "input": "\u001b[118;6u" }, "id": "User.PlsqlwksAlternatePaste" }
751
+ ```
752
+
753
+ Replace the existing copy/paste entries in `keybindings` with
754
+ the entries below, keeping the other keybindings:
755
+
756
+ ```json
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" },
763
+ { "id": "User.PlsqlwksPaste", "keys": "ctrl+v" },
764
+ { "id": "User.PlsqlwksAlternatePaste", "keys": "ctrl+shift+v" }
765
+ ```
766
+
767
+ This setting applies to every Windows Terminal profile and tab. Restart
768
+ plsqlwks after upgrading and reopen Windows Terminal if it retains old bindings.
769
+ The command menu offers equivalents when a terminal intercepts the shortcuts.
770
+ The optional `tools/putty_keys.ps1` helper also forwards these shortcuts when
771
+ enabled for the active Windows terminal window.
772
+
773
+ Keyboard navigation, resizing and dialogs remain available while clipboard
774
+ commands run. Windows paste waits behind pending external copies. If you change
775
+ the paste target's text, cursor, selection or active tab before it finishes, the
776
+ pending paste is cancelled; repeated external paste requests for that target
777
+ are ignored. Requests retain the settings in effect when submitted.
778
+
779
+ For native Windows Terminal paste, wait until application copy reports that the
780
+ Windows clipboard has been updated. Native paste reads the Windows clipboard
781
+ independently and receives no internal fallback. Its bracketed paste payload is
782
+ inserted directly without a second clipboard lookup.
783
+
784
+ Windows Terminal's **Copy on select** setting can overwrite the clipboard when
785
+ you select terminal text with the mouse. Turn it off if you want only explicit
786
+ copy commands to change the Windows clipboard.
787
+ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/terminal/customize-settings/actions#send-input).
788
+
683
789
  ## Keys
684
790
 
685
791
  ### Global
@@ -738,12 +844,16 @@ also works from Command Prompt and continues to support PuTTY.
738
844
  | `Ctrl-F` | Open literal Find/Replace with the `Find next` action |
739
845
  | `Alt-O` -> **Editor** -> **Replace text** | Open Find/Replace at the replacement field |
740
846
  | `Ctrl-G` | Go to line |
741
- | `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 |
742
849
  | `Ctrl-U` | Uppercase selected SQL code |
743
850
  | `Ctrl-L` | Lowercase selected SQL code |
744
- | `Ctrl-C` | Copy selected text |
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 |
745
854
  | `Ctrl-X` | Cut selected text |
746
855
  | `Ctrl-V` | Paste clipboard text, expanding each tab to two spaces |
856
+ | `Ctrl-Shift-V` | Paste the alternate source (internal by default) |
747
857
  | Terminal paste | Paste text as one edit, expanding each tab to two spaces |
748
858
  | `Ctrl-Z` / `Ctrl-Y` | Undo / redo |
749
859
  | `Ctrl+=` | Reconnect |
@@ -779,12 +889,13 @@ The dialog provides `Find next`, `Replace`, `Replace all`, and `Cancel` actions.
779
889
  and lowercase letters. `Replace` changes the selected matching occurrence, or
780
890
  the next match from the cursor, and then selects the following match. `Replace
781
891
  all` changes every match in the current buffer. Either replacement operation is
782
- recorded as one undoable edit. `Ctrl-N` and `Ctrl-P` repeat the last search with
783
- 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.
784
895
 
785
896
  Editor paste expands every tab character to two spaces and keeps multiline
786
- text in one undoable edit. This applies to `Ctrl-V` from either the system or
787
- internal clipboard and to native terminal paste while the editor is focused;
897
+ text in one undoable edit. This applies to all fixed and configured paste shortcuts and
898
+ to native terminal paste while the editor is focused;
788
899
  clipboard contents themselves are not changed. Native paste requires a
789
900
  terminal that supports the standard bracketed-paste protocol, with `Ctrl-V`
790
901
  remaining available as the fallback.
@@ -830,7 +941,9 @@ Read-only mode is a client-side guardrail that rejects statements which the SQL
830
941
  | `Home` / `End` | Move to the first/last result-grid column |
831
942
  | `Ctrl-Home` / `Ctrl-End` | Move to the first/last result-grid row |
832
943
  | `F8` | Toggle result grid / row-detail output |
833
- | `Ctrl-C` | Copy one result cell immediately, or choose header handling for a rectangular selection |
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 |
834
947
  | `F10` | View or edit a mapped text cell in a ROWID-backed result |
835
948
  | `Enter` | Edit the selected ROWID-backed result cell when available |
836
949
  | `INS` | Prepare a draft insert row for ROWID-backed results |
@@ -919,8 +1032,9 @@ move within a displayed line; Ctrl+Home/End move to the output boundaries.
919
1032
 
920
1033
  Copying preserves the stored text, whitespace, blank lines, and statement
921
1034
  headings, without screen wrapping or padding. The existing system clipboard
922
- providers are used when available, with the internal clipboard as a fallback
923
- (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
924
1038
  before performing a copy. Selection belongs to its file tab, survives appended
925
1039
  output and resizing, and resets when execution replaces the output.
926
1040
 
@@ -1098,9 +1212,39 @@ validate this opt-in mode with the applications in use.
1098
1212
 
1099
1213
  ### Schema Browser
1100
1214
 
1101
- 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.
1102
-
1103
- 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.
1104
1248
 
1105
1249
  | Key | Action |
1106
1250
  | --- | --- |
@@ -1109,9 +1253,10 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1109
1253
  | `Esc` | Clear a nonempty filter, or return to the editor when the filter is empty |
1110
1254
  | `Up` / `Down` | Move through browser entries |
1111
1255
  | `PageUp` / `PageDown` | Move through browser entries by page |
1112
- | `Enter` | Expand a group or choose an action for an object |
1113
- | `Space` | Expand/collapse a group when the filter is empty, or add a space to the active filter |
1114
- | `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 |
1115
1260
 
1116
1261
  ### Cell Viewer
1117
1262
 
@@ -1123,7 +1268,7 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1123
1268
  | `PageUp` / `PageDown` | Scroll cell text by page |
1124
1269
  | `Home` / `End` | Move to the first/last cell-viewer line |
1125
1270
  | `Ctrl-S` (editor) | Save the multiline edit |
1126
- | `Ctrl-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 |
1127
1272
  | `Enter` (editor) | Insert a newline |
1128
1273
  | `F10` / `Esc` / `Ctrl-Q` (editor) | Cancel the multiline edit |
1129
1274
 
@@ -1132,7 +1277,7 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1132
1277
  | Key | Action |
1133
1278
  | --- | --- |
1134
1279
  | Printable text | Type into prompts or filter picker options |
1135
- | `Ctrl-V` / terminal paste | Paste single-line text; tabs are preserved and multiline text is rejected |
1280
+ | `Ctrl-V` / `Ctrl-Shift-V` / terminal paste | Paste single-line text; tabs are preserved and multiline text is rejected |
1136
1281
  | `Backspace` | Delete before the prompt cursor or picker filter |
1137
1282
  | `Enter` | Accept the prompt or selected picker item |
1138
1283
  | `Esc` / `Ctrl-Q` | Cancel the prompt or picker |
@@ -1190,12 +1335,44 @@ for the exact manifest, source layout, validation, replacement, and trust rules.
1190
1335
 
1191
1336
  ### Table DDL Export
1192
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
+
1193
1366
  Install `plugins/packages/table-ddl-export-0.1.1.plwgn` with
1194
1367
  `plsqlwks plugin install` and restart. **Alt-O -> Database -> Export table DDL**
1195
1368
  lets you choose a schema, filter table names as you type, select tables, and
1196
- optionally remap them to another schema. It automatically includes related
1369
+ optionally remap them to another schema and prefix tables, indexes, constraints
1370
+ and triggers while updating static table references. It automatically includes related
1197
1371
  sequences and directly referencing packages, functions, procedures, and views, and follows
1198
- required source-schema tables and views recursively. Definitions, constraints, indexes,
1372
+ required source-schema tables, views, SQL types and program units recursively.
1373
+ Unreadable type or program definitions become named destination prerequisites.
1374
+ Types retain their names; prefixed copies in the source schema reuse existing types.
1375
+ Definitions, constraints, indexes,
1199
1376
  foreign keys and triggers are ordered by creation dependencies in a new
1200
1377
  unsaved SQL tab for review. Generation activates that tab and focuses its editor.
1201
1378
  See the [selection keys and remapping details](doc/PLUGIN_CATALOG.md#table-ddl-export).